Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Run3-hcx377 Backport the changes made to the HcalTopolog class and additional hcalRecoNumbering constants from #46357, #46369, #46374 #46381

Merged
merged 1 commit into from
Oct 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 18 additions & 5 deletions Geometry/CaloTopology/interface/HcalTopology.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,6 @@
class HcalTopology : public CaloSubdetectorTopology {
public:
HcalTopology(const HcalDDDRecConstants* hcons, const bool mergePosition = false);
HcalTopology(HcalTopologyMode::Mode mode,
int maxDepthHB,
int maxDepthHE,
HcalTopologyMode::TriggerMode tmode = HcalTopologyMode::TriggerMode_2009);

HcalTopologyMode::Mode mode() const { return mode_; }
HcalTopologyMode::TriggerMode triggerMode() const { return triggerMode_; }
Expand All @@ -48,6 +44,7 @@ class HcalTopology : public CaloSubdetectorTopology {
DetId denseId2detId(unsigned int /*denseid*/) const override;
/// return a count of valid cells (for dense indexing use)
unsigned int ncells() const override;
unsigned int ncells(int subdet) const;
/// return a version which identifies the given topology
int topoVersion() const override;

Expand Down Expand Up @@ -171,14 +168,24 @@ class HcalTopology : public CaloSubdetectorTopology {
HcalDetId idBack(const HcalDetId& id) const { return hcons_->idBack(id); }

private:
bool phase1() const { return ((mode_ == HcalTopologyMode::LHC) || (mode_ == HcalTopologyMode::H2HE)); }
bool phase1A() const {
return ((mode_ == HcalTopologyMode::LHC) || (mode_ == HcalTopologyMode::Run2A) || (mode_ == HcalTopologyMode::H2) ||
(mode_ == HcalTopologyMode::H2HE));
}
bool phase1B() const {
return ((mode_ == HcalTopologyMode::Run2B) || (mode_ == HcalTopologyMode::Run2C) ||
(mode_ == HcalTopologyMode::Run3) || (mode_ == HcalTopologyMode::SLHC));
}
bool phase2() const { return ((mode_ == HcalTopologyMode::Run4)); }
/** Get the neighbors of the given cell with higher absolute ieta */
int incAIEta(const HcalDetId& id, HcalDetId neighbors[2]) const;
/** Get the neighbors of the given cell with lower absolute ieta */
int decAIEta(const HcalDetId& id, HcalDetId neighbors[2]) const;

/** Is this a valid cell id, ignoring the exclusion list */
bool validDetIdPreLS1(const HcalDetId& id) const;
bool validRaw(const HcalDetId& id) const;
bool validRaw(const HcalDetId& id, const bool debug = false) const;
unsigned int detId2denseIdPreLS1(const DetId& id) const;
bool isExcluded(const HcalDetId& id) const;

Expand Down Expand Up @@ -227,14 +234,20 @@ class HcalTopology : public CaloSubdetectorTopology {
static constexpr int kHBhalf = 1296, kHEhalf = 1296, kHOhalf = 1080, kHFhalf = 864, kHThalf = 2088, kZDChalf = 11,
kCASTORhalf = 224, kCALIBhalf = 693, kHThalfPhase1 = 2520,
kHcalhalf = kHBhalf + kHEhalf + kHOhalf + kHFhalf;
static constexpr int kHBhalfPostLS2 = 4536, kHEhalfPostLS2 = 3384, kHFhalfPostLS2 = 1728;
static constexpr int kHcalhalfPostLS2 = kHBhalfPostLS2 + kHEhalfPostLS2 + kHOhalf + kHFhalfPostLS2;
static constexpr int kSizeForDenseIndexingPreLS1 = 2 * kHcalhalf;
static constexpr int kSizeForDenseIndexingPostLS2 = 2 * kHcalhalfPostLS2;
static constexpr int kHBSizePreLS1 = 2 * kHBhalf;
static constexpr int kHESizePreLS1 = 2 * kHEhalf;
static constexpr int kHOSizePreLS1 = 2 * kHOhalf;
static constexpr int kHFSizePreLS1 = 2 * kHFhalf;
static constexpr int kHTSizePreLS1 = 2 * kHThalf;
static constexpr int kHTSizePhase1 = 2 * kHThalfPhase1;
static constexpr int kCALIBSizePreLS1 = 2 * kCALIBhalf;
static constexpr int kHBSizePostLS2 = 2 * kHBhalfPostLS2;
static constexpr int kHESizePostLS2 = 2 * kHEhalfPostLS2;
static constexpr int kHFSizePostLS2 = 2 * kHFhalfPostLS2;
static constexpr int minMaxDepth_ = 4;
static constexpr unsigned int minPhi_ = 1, maxPhi_ = 72;
static constexpr unsigned int kOffCalibHB_ = 0;
Expand Down
200 changes: 82 additions & 118 deletions Geometry/CaloTopology/src/HcalTopology.cc
Original file line number Diff line number Diff line change
Expand Up @@ -64,15 +64,15 @@ HcalTopology::HcalTopology(const HcalDDDRecConstants* hcons, const bool mergePos
} else {
nEtaHE_ = (lastHERing_ - firstHERing_ + 1);
}
if (mode_ == HcalTopologyMode::LHC) {
if (phase1()) {
topoVersion_ = 0; //DL
HBSize_ = kHBSizePreLS1; // qie-per-fiber * fiber/rm * rm/rbx * rbx/barrel * barrel/hcal
HESize_ = kHESizePreLS1; // qie-per-fiber * fiber/rm * rm/rbx * rbx/endcap * endcap/hcal
HOSize_ = kHOSizePreLS1; // ieta * iphi * 2
HFSize_ = kHFSizePreLS1; // ieta * iphi * depth * 2
CALIBSize_ = kCALIBSizePreLS1;
numberOfShapes_ = 87;
} else if (mode_ == HcalTopologyMode::SLHC) { // need to know more eventually
} else { // need to know more eventually
topoVersion_ = 10;
HBSize_ = nEtaHB_ * IPHI_MAX * maxDepthHB_ * 2;
HESize_ = nEtaHE_ * maxPhiHE_ * maxDepthHE_ * 2;
Expand Down Expand Up @@ -155,75 +155,12 @@ HcalTopology::HcalTopology(const HcalDDDRecConstants* hcons, const bool mergePos
<< " " << maxDepthHB_ << ":" << maxDepthHE_ << " " << nEtaHB_ << ":" << nEtaHE_ << " "
<< etaHE2HF_ << ":" << etaHF2HE_ << " " << maxPhiHE_;
#endif
}

HcalTopology::HcalTopology(HcalTopologyMode::Mode mode,
int maxDepthHB,
int maxDepthHE,
HcalTopologyMode::TriggerMode tmode)
: hcons_(nullptr),
mergePosition_(false),
excludeHB_(false),
excludeHE_(false),
excludeHO_(false),
excludeHF_(false),
mode_(mode),
triggerMode_(tmode),
firstHBRing_(1),
lastHBRing_(16),
firstHERing_(16),
lastHERing_(29),
firstHFRing_(29),
lastHFRing_(41),
firstHORing_(1),
lastHORing_(15),
firstHEDoublePhiRing_((mode == HcalTopologyMode::H2 || mode == HcalTopologyMode::H2HE) ? (22) : (21)),
firstHEQuadPhiRing_(999),
firstHFQuadPhiRing_(40),
firstHETripleDepthRing_((mode == HcalTopologyMode::H2 || mode == HcalTopologyMode::H2HE) ? (24) : (27)),
singlePhiBins_(IPHI_MAX),
doublePhiBins_(36),
maxDepthHB_(maxDepthHB),
maxDepthHE_(maxDepthHE),
maxDepthHF_(2),
etaHE2HF_(30),
etaHF2HE_(29),
maxPhiHE_(IPHI_MAX),
HBSize_(kHBSizePreLS1),
HESize_(kHESizePreLS1),
HOSize_(kHOSizePreLS1),
HFSize_(kHFSizePreLS1),
HTSize_(kHTSizePreLS1),
CALIBSize_(kCALIBSizePreLS1),
numberOfShapes_(
((mode == HcalTopologyMode::SLHC) || (mode_ == HcalTopologyMode::Run3) || (mode_ == HcalTopologyMode::Run4))
? 500
: 87) {
if (mode_ == HcalTopologyMode::LHC) {
topoVersion_ = 0; //DL
HBSize_ = kHBSizePreLS1; // qie-per-fiber * fiber/rm * rm/rbx * rbx/barrel * barrel/hcal
HESize_ = kHESizePreLS1; // qie-per-fiber * fiber/rm * rm/rbx * rbx/endcap * endcap/hcal
HOSize_ = kHOSizePreLS1; // ieta * iphi * 2
HFSize_ = kHFSizePreLS1; // phi * eta * depth * pm
} else if ((mode_ == HcalTopologyMode::SLHC) || (mode_ == HcalTopologyMode::Run3) ||
(mode_ == HcalTopologyMode::Run4)) { // need to know more eventually
HBSize_ = maxDepthHB * 16 * IPHI_MAX * 2;
HESize_ = maxDepthHE * (29 - 16 + 1) * maxPhiHE_ * 2;
HOSize_ = 15 * IPHI_MAX * 2; // ieta * iphi * 2
HFSize_ = IPHI_MAX * 13 * maxDepthHF_ * 2; // phi * eta * depth * pm
CALIBSize_ = kOffCalibHFX_;
topoVersion_ = 10;
}
nEtaHB_ = (lastHBRing_ - firstHBRing_ + 1);
nEtaHE_ = (lastHERing_ - firstHERing_ + 1);
if (triggerMode_ == HcalTopologyMode::TriggerMode_2009) {
HTSize_ = kHTSizePreLS1;
} else {
HTSize_ = kHTSizePhase1;
}

edm::LogWarning("HCalGeom") << "This is an incomplete constructor of HcalTopology - be warned that many "
<< "functionalities will not be there - revert from this - get from EventSetup";
// Now redfine some of the sizes
#ifdef EDM_ML_DEBUG
edm::LogVerbatim("HCalGeom") << "Redefined sizes could be for HB:" << ncells(HcalBarrel)
<< " HE:" << ncells(HcalEndcap) << " HF: " << ncells(HcalForward);
#endif
}

bool HcalTopology::valid(const DetId& id) const {
Expand All @@ -233,7 +170,7 @@ bool HcalTopology::valid(const DetId& id) const {

bool HcalTopology::validHcal(const HcalDetId& id) const {
// check the raw rules
return validRaw(id) && !isExcluded(id);
return validRaw(id, false) && !isExcluded(id);
}

bool HcalTopology::validDetId(HcalSubdetector subdet, int ieta, int iphi, int depth) const {
Expand Down Expand Up @@ -504,7 +441,7 @@ int HcalTopology::exclude(HcalSubdetector subdet, int ieta1, int ieta2, int iphi
for (int iphi = iphi_l; iphi <= iphi_h; iphi++)
for (int depth = depth_l; depth <= depth_h; depth++) {
HcalDetId id(subdet, ieta, iphi, depth);
if (validRaw(id)) { // use 'validRaw' to include check validity in "uncut" detector
if (validRaw(id, false)) { // use 'validRaw' to include check validity in "uncut" detector
exclude(id);
n++;
}
Expand Down Expand Up @@ -557,7 +494,12 @@ bool HcalTopology::validDetIdPreLS1(const HcalDetId& id) const {
}

/** Is this a valid cell id? */
bool HcalTopology::validRaw(const HcalDetId& id) const {
bool HcalTopology::validRaw(const HcalDetId& id,
#ifdef EDM_ML_DEBUG
const bool debug) const {
#else
const bool) const {
#endif
bool ok = true;
int ieta = id.ieta();
int aieta = id.ietaAbs();
Expand All @@ -571,18 +513,23 @@ bool HcalTopology::validRaw(const HcalDetId& id) const {

if (ok) {
if (subdet == HcalBarrel) {
if ((mode_ == HcalTopologyMode::SLHC) || (mode_ == HcalTopologyMode::H2HE) || (mode_ == HcalTopologyMode::Run3) ||
(mode_ == HcalTopologyMode::Run4)) {
if ((aieta > lastHBRing()) || (depth > hcons_->getMaxDepth(0, aieta, iphi, zside)) ||
(depth < hcons_->getMinDepth(0, aieta, iphi, zside)))
if (phase1()) {
if (aieta > lastHBRing() || depth > 2 || (aieta <= 14 && depth > 1))
ok = false;
} else {
if (aieta > lastHBRing() || depth > 2 || (aieta <= 14 && depth > 1))
if ((aieta > lastHBRing()) || (depth > hcons_->getMaxDepth(0, aieta, iphi, zside)) ||
(depth < hcons_->getMinDepth(0, aieta, iphi, zside)))
ok = false;
}
} else if (subdet == HcalEndcap) {
if ((mode_ == HcalTopologyMode::SLHC) || (mode_ == HcalTopologyMode::H2HE) || (mode_ == HcalTopologyMode::Run3) ||
(mode_ == HcalTopologyMode::Run4)) {
if (phase1A()) {
if (depth > hcons_->getMaxDepth(1, aieta, iphi, zside) || aieta < firstHERing() || aieta > lastHERing() ||
(aieta == firstHERing() && depth != hcons_->getDepthEta16(2, iphi, zside)) ||
(aieta == 17 && depth != 1 && mode_ != HcalTopologyMode::H2) || // special case at H2
(((aieta >= 17 && aieta < firstHETripleDepthRing()) || aieta == lastHERing()) && depth > 2) ||
(aieta >= firstHEDoublePhiRing() && (iphi % 2) == 0))
ok = false;
} else {
if ((depth > hcons_->getMaxDepth(1, aieta, iphi, zside)) ||
(depth < hcons_->getMinDepth(1, aieta, iphi, zside)) || (aieta < firstHERing()) || (aieta > lastHERing())) {
ok = false;
Expand All @@ -604,13 +551,6 @@ bool HcalTopology::validRaw(const HcalDetId& id) const {
}
}
}
} else {
if (depth > hcons_->getMaxDepth(1, aieta, iphi, zside) || aieta < firstHERing() || aieta > lastHERing() ||
(aieta == firstHERing() && depth != hcons_->getDepthEta16(2, iphi, zside)) ||
(aieta == 17 && depth != 1 && mode_ != HcalTopologyMode::H2) || // special case at H2
(((aieta >= 17 && aieta < firstHETripleDepthRing()) || aieta == lastHERing()) && depth > 2) ||
(aieta >= firstHEDoublePhiRing() && (iphi % 2) == 0))
ok = false;
}
} else if (subdet == HcalOuter) {
if (aieta > lastHORing() || iphi > IPHI_MAX || depth != 4)
Expand All @@ -627,6 +567,16 @@ bool HcalTopology::validRaw(const HcalDetId& id) const {
ok = false;
}
}
#ifdef EDM_ML_DEBUG
if (debug)
edm::LogVerbatim("HCalGeom") << "HcalValdRaw ID: " << subdet << ":" << aieta << ":" << depth << ":" << iphi << ":"
<< zside << " Mode " << mode_ << ":" << phase1() << ":" << phase1A() << ":"
<< phase1B() << ":" << phase2() << " Limits HB " << lastHBRing() << " HE "
<< firstHERing() << ":" << lastHERing() << ":" << firstHEDoublePhiRing() << ":"
<< firstHEQuadPhiRing() << " Depth " << hcons_->getMaxDepth(0, aieta, iphi, zside)
<< ":" << hcons_->getMinDepth(0, aieta, iphi, zside) << ":"
<< hcons_->getDepthEta16(2, iphi, zside) << " OK " << ok;
#endif
return ok;
}

Expand Down Expand Up @@ -823,33 +773,24 @@ int HcalTopology::decAIEta(const HcalDetId& id, HcalDetId neighbors[2]) const {
void HcalTopology::depthBinInformation(
HcalSubdetector subdet, int etaRing, int iphi, int zside, int& nDepthBins, int& startingBin) const {
if (subdet == HcalBarrel) {
if ((mode_ == HcalTopologyMode::SLHC) || (mode_ == HcalTopologyMode::H2HE) || (mode_ == HcalTopologyMode::Run3) ||
(mode_ == HcalTopologyMode::Run4)) {
startingBin = hcons_->getMinDepth(0, etaRing, iphi, zside);
if (etaRing == lastHBRing()) {
nDepthBins = hcons_->getDepthEta16(1, iphi, zside) - startingBin + 1;
} else {
nDepthBins = hcons_->getMaxDepth(0, etaRing, iphi, zside) - startingBin + 1;
}
} else {
if (phase1() || (mode_ == HcalTopologyMode::H2)) {
if (etaRing <= 14) {
nDepthBins = 1;
startingBin = 1;
} else {
nDepthBins = 2;
startingBin = 1;
}
}
} else if (subdet == HcalEndcap) {
if ((mode_ == HcalTopologyMode::SLHC) || (mode_ == HcalTopologyMode::H2HE) || (mode_ == HcalTopologyMode::Run3) ||
(mode_ == HcalTopologyMode::Run4)) {
if (etaRing == firstHERing()) {
startingBin = hcons_->getDepthEta16(2, iphi, zside);
} else {
startingBin = hcons_->getMinDepth(0, etaRing, iphi, zside);
if (etaRing == lastHBRing()) {
nDepthBins = hcons_->getDepthEta16(1, iphi, zside) - startingBin + 1;
} else {
startingBin = hcons_->getMinDepth(1, etaRing, iphi, zside);
nDepthBins = hcons_->getMaxDepth(0, etaRing, iphi, zside) - startingBin + 1;
}
nDepthBins = hcons_->getMaxDepth(1, etaRing, iphi, zside) - startingBin + 1;
} else {
}
} else if (subdet == HcalEndcap) {
if (phase1A()) {
if (etaRing == firstHERing()) {
nDepthBins = 1;
startingBin = 3;
Expand All @@ -863,6 +804,13 @@ void HcalTopology::depthBinInformation(
nDepthBins = (etaRing >= firstHETripleDepthRing()) ? 3 : 2;
startingBin = 1;
}
} else {
if (etaRing == firstHERing()) {
startingBin = hcons_->getDepthEta16(2, iphi, zside);
} else {
startingBin = hcons_->getMinDepth(1, etaRing, iphi, zside);
}
nDepthBins = hcons_->getMaxDepth(1, etaRing, iphi, zside) - startingBin + 1;
}
} else if (subdet == HcalForward) {
nDepthBins = maxDepthHF_;
Expand Down Expand Up @@ -895,18 +843,20 @@ bool HcalTopology::incrementDepth(HcalDetId& detId) const {
depth = 4;
} else if (subdet == HcalBarrel && etaRing == lastHBRing()) {
// overlap
subdet = HcalEndcap;
if ((mode_ == HcalTopologyMode::SLHC) || (mode_ == HcalTopologyMode::H2HE) || (mode_ == HcalTopologyMode::Run3) ||
(mode_ == HcalTopologyMode::Run4))
depth = hcons_->getDepthEta16(2, iphi, zside);
} else if ((subdet == HcalEndcap) && (etaRing == lastHERing() - 1) && (mode_ != HcalTopologyMode::SLHC) &&
(mode_ != HcalTopologyMode::Run3) && (mode_ != HcalTopologyMode::Run4)) {
if (phase2()) { // No more chance
detId = HcalDetId();
return false;
} else {
subdet = HcalEndcap;
if (phase1B())
depth = hcons_->getDepthEta16(2, iphi, zside);
}
} else if ((subdet == HcalEndcap) && (etaRing == lastHERing() - 1) && !phase1B()) {
// guard ring HF29 is behind HE 28
subdet = HcalForward;
(ieta > 0) ? ++ieta : --ieta;
depth = 1;
} else if ((subdet == HcalEndcap) && (etaRing == lastHERing()) && (mode_ != HcalTopologyMode::SLHC) &&
(mode_ != HcalTopologyMode::Run3) && (mode_ != HcalTopologyMode::Run4)) {
} else if ((subdet == HcalEndcap) && (etaRing == lastHERing()) && !phase1B()) {
// split cells go to bigger granularity. Ring 29 -> 28
(ieta > 0) ? --ieta : ++ieta;
} else {
Expand Down Expand Up @@ -940,8 +890,7 @@ bool HcalTopology::decrementDepth(HcalDetId& detId) const {
}
}
} else if ((subdet == HcalEndcap) && (etaRing == lastHERing()) && (depth == hcons_->getDepthEta29(iphi, zside, 0)) &&
(mode_ != HcalTopologyMode::SLHC) && (mode_ != HcalTopologyMode::Run3) &&
(mode_ != HcalTopologyMode::Run4)) {
!phase1B()) {
(ieta > 0) ? --ieta : ++ieta;
} else if (depth <= 0) {
if (subdet == HcalForward && etaRing == firstHFRing()) {
Expand Down Expand Up @@ -1134,17 +1083,18 @@ double HcalTopology::etaMax(HcalSubdetector subdet) const {
}
return eta;
}

std::pair<double, double> HcalTopology::etaRange(HcalSubdetector subdet, int keta) const {
int ieta = (keta > 0) ? keta : -keta;
if (subdet == HcalForward) {
if (ieta >= firstHFRing_) {
unsigned int ii = (unsigned int)(ieta - firstHFRing_);
unsigned int ii = static_cast<unsigned int>(ieta - firstHFRing_);
if (ii + 1 < etaTableHF.size())
return std::pair<double, double>(etaTableHF[ii], etaTableHF[ii + 1]);
}
} else {
int ietal = (mode_ == HcalTopologyMode::LHC && ieta == lastHERing_ - 1) ? (ieta + 1) : ieta;
if ((ietal < (int)(etaTable.size())) && (ieta > 0))
int ietal = (phase1() && ieta == lastHERing_ - 1) ? (ieta + 1) : ieta;
if ((ietal < static_cast<int>(etaTable.size())) && (ieta > 0))
return std::pair<double, double>(etaTable[ieta - 1], etaTable[ietal]);
}
return std::pair<double, double>(0, 0);
Expand Down Expand Up @@ -1702,4 +1652,18 @@ DetId HcalTopology::denseId2detId(unsigned int denseid) const {

unsigned int HcalTopology::ncells() const { return HBSize_ + HESize_ + HOSize_ + HFSize_; }

unsigned int HcalTopology::ncells(int subdet) const {
unsigned int ncell(0);
for (int eta = -maxEta_; eta <= maxEta_; eta++) {
for (unsigned int phi = 1; phi <= maxPhi_; phi++) {
for (int depth = 1; depth <= 7; depth++) {
HcalDetId cell((HcalSubdetector)subdet, eta, phi, depth);
if (validRaw(cell, true))
++ncell;
}
}
}
return ncell;
}

int HcalTopology::topoVersion() const { return topoVersion_; }
Loading