#include <HcalTrigTowerGeometry.h>
Public Member Functions | |
std::vector< HcalDetId > | detIds (const HcalTrigTowerDetId &) const |
int | firstHFRingInTower (int ietaTower) const |
since the towers are irregular in eta in HF | |
int | firstHFTower () const |
HcalTrigTowerGeometry () | |
int | hfTowerEtaSize (int ieta) const |
int | nPhiBins (int ieta) const |
an interface for CaloSubdetectorGeometry | |
int | nTowers () const |
void | setupHF (bool useShortFibers, bool useQuadRings) |
void | towerEtaBounds (int ieta, double &eta1, double &eta2) const |
where this tower begins and ends in eta | |
std::vector< HcalTrigTowerDetId > | towerIds (const HcalDetId &cellId) const |
the mapping to and from DetIds | |
Private Attributes | |
HcalTopology | theTopology |
bool | useHFQuadPhiRings_ |
bool | useShortFibers_ |
Definition at line 10 of file HcalTrigTowerGeometry.h.
HcalTrigTowerGeometry::HcalTrigTowerGeometry | ( | ) |
Definition at line 9 of file HcalTrigTowerGeometry.cc.
References useHFQuadPhiRings_, and useShortFibers_.
{ useShortFibers_=true; useHFQuadPhiRings_=true; }
std::vector< HcalDetId > HcalTrigTowerGeometry::detIds | ( | const HcalTrigTowerDetId & | hcalTrigTowerDetId | ) | const |
Definition at line 67 of file HcalTrigTowerGeometry.cc.
References abs, HcalTopology::depthBinInformation(), HcalTopology::firstHEDoublePhiRing(), HcalTopology::firstHERing(), HcalTopology::firstHFRing(), firstHFRingInTower(), HcalBarrel, HcalEndcap, HcalForward, HcalOuter, hfTowerEtaSize(), HcalTrigTowerDetId::ieta(), HcalTrigTowerDetId::iphi(), HcalTopology::lastHBRing(), HcalTopology::lastHERing(), HcalTopology::lastHORing(), nPhiBins(), python::entryComment::results, and theTopology.
{ // Written, tested by E. Berry (Princeton) std::vector<HcalDetId> results; int tower_ieta = hcalTrigTowerDetId.ieta(); int tower_iphi = hcalTrigTowerDetId.iphi(); int cell_ieta = tower_ieta; int cell_iphi = tower_iphi; int min_depth, n_depths; // HB if (abs(cell_ieta) <= theTopology.lastHBRing()){ theTopology.depthBinInformation(HcalBarrel, abs(tower_ieta), n_depths, min_depth); for (int cell_depth = min_depth; cell_depth <= min_depth + n_depths - 1; cell_depth++) results.push_back(HcalDetId(HcalBarrel,cell_ieta,cell_iphi,cell_depth)); } // HO if (abs(cell_ieta) <= theTopology.lastHORing()){ theTopology.depthBinInformation(HcalOuter , abs(tower_ieta), n_depths, min_depth); for (int ho_depth = min_depth; ho_depth <= min_depth + n_depths - 1; ho_depth++) results.push_back(HcalDetId(HcalOuter, cell_ieta,cell_iphi,ho_depth)); } // HE if (abs(cell_ieta) >= theTopology.firstHERing() && abs(cell_ieta) < theTopology.lastHERing()){ theTopology.depthBinInformation(HcalEndcap, abs(tower_ieta), n_depths, min_depth); // Special for double-phi cells if (abs(cell_ieta) >= theTopology.firstHEDoublePhiRing()) if (tower_iphi%2 == 0) cell_iphi = tower_iphi - 1; for (int cell_depth = min_depth; cell_depth <= min_depth + n_depths - 1; cell_depth++) results.push_back(HcalDetId(HcalEndcap, cell_ieta, cell_iphi, cell_depth)); // Special for split-eta cells if (abs(tower_ieta) == 28){ theTopology.depthBinInformation(HcalEndcap, abs(tower_ieta)+1, n_depths, min_depth); for (int cell_depth = min_depth; cell_depth <= min_depth + n_depths - 1; cell_depth++){ if (tower_ieta < 0) results.push_back(HcalDetId(HcalEndcap, tower_ieta - 1, cell_iphi, cell_depth)); if (tower_ieta > 0) results.push_back(HcalDetId(HcalEndcap, tower_ieta + 1, cell_iphi, cell_depth)); } } } // HF if (abs(cell_ieta) >= theTopology.firstHFRing()){ int HfTowerPhiSize = 72 / nPhiBins(tower_ieta); int HfTowerEtaSize = hfTowerEtaSize(tower_ieta); int FirstHFRingInTower = firstHFRingInTower(abs(tower_ieta)); for (int iHFTowerPhiSegment = 0; iHFTowerPhiSegment < HfTowerPhiSize; iHFTowerPhiSegment++){ cell_iphi = (tower_iphi / HfTowerPhiSize) * HfTowerPhiSize; // Find the minimum phi segment cell_iphi -= 2; // The first trigger tower starts at HCAL iphi = 71, not HCAL iphi = 1 cell_iphi += iHFTowerPhiSegment; // Get all of the HCAL iphi values in this trigger tower cell_iphi += 72; // Don't want to take the mod of a negative number cell_iphi = cell_iphi % 72; // There are, at most, 72 cells. cell_iphi += 1; // There is no cell at iphi = 0 if (cell_iphi%2 == 0) continue; // These cells don't exist. for (int iHFTowerEtaSegment = 0; iHFTowerEtaSegment < HfTowerEtaSize; iHFTowerEtaSegment++){ cell_ieta = FirstHFRingInTower + iHFTowerEtaSegment; if (cell_ieta >= 40 && cell_iphi%4 == 1) continue; // These cells don't exist. theTopology.depthBinInformation(HcalForward, cell_ieta, n_depths, min_depth); // Negative tower_ieta -> negative cell_ieta if (tower_ieta < 0) cell_ieta *= -1; for (int cell_depth = min_depth; cell_depth <= min_depth + n_depths - 1; cell_depth++) results.push_back(HcalDetId(HcalForward, cell_ieta, cell_iphi, cell_depth)); } } } return results; }
int HcalTrigTowerGeometry::firstHFRingInTower | ( | int | ietaTower | ) | const |
since the towers are irregular in eta in HF
Definition at line 169 of file HcalTrigTowerGeometry.cc.
References abs, HcalTopology::firstHFRing(), firstHFTower(), hfTowerEtaSize(), query::result, and theTopology.
Referenced by detIds(), towerEtaBounds(), and towerIds().
{ // count up to the correct HF ring int inputTower = abs(ietaTower); int result = theTopology.firstHFRing(); for(int iTower = firstHFTower(); iTower != inputTower; ++iTower) { result += hfTowerEtaSize(iTower); } // negative in, negative out. if(ietaTower < 0) result *= -1; return result; }
int HcalTrigTowerGeometry::firstHFTower | ( | ) | const [inline] |
Definition at line 29 of file HcalTrigTowerGeometry.h.
Referenced by firstHFRingInTower(), hfTowerEtaSize(), CaloTPGTranscoderULUT::loadHCALCompress(), CaloTPGTranscoderULUT::loadHCALUncompress(), L1CaloHcalScaleConfigOnlineProd::newObject(), nPhiBins(), HcalTriggerPrimitiveAlgo::run(), towerEtaBounds(), and towerIds().
{return 29;}
int HcalTrigTowerGeometry::hfTowerEtaSize | ( | int | ieta | ) | const |
the number of HF eta rings in this trigger tower ieta starts at firstHFTower()
Definition at line 161 of file HcalTrigTowerGeometry.cc.
References abs, firstHFTower(), and nTowers().
Referenced by detIds(), firstHFRingInTower(), and towerEtaBounds().
{ int ietaAbs = abs(ieta); assert(ietaAbs >= firstHFTower() && ietaAbs <= nTowers()); // the first three come from rings 29-31, 32-34, 35-37. The last has 4 rings: 38-41 return (ietaAbs == nTowers()) ? 4 : 3; }
int HcalTrigTowerGeometry::nPhiBins | ( | int | ieta | ) | const [inline] |
an interface for CaloSubdetectorGeometry
the number of phi bins in this eta ring
Definition at line 25 of file HcalTrigTowerGeometry.h.
References abs, and firstHFTower().
Referenced by detIds().
{ return (abs(ieta) < firstHFTower()) ? 72 : 18; }
int HcalTrigTowerGeometry::nTowers | ( | ) | const [inline] |
Definition at line 30 of file HcalTrigTowerGeometry.h.
Referenced by hfTowerEtaSize(), and CaloTPGTranscoderULUT::printDecompression().
{return 32;}
void HcalTrigTowerGeometry::setupHF | ( | bool | useShortFibers, |
bool | useQuadRings | ||
) |
Definition at line 14 of file HcalTrigTowerGeometry.cc.
References useHFQuadPhiRings_, and useShortFibers_.
{ useShortFibers_=useShortFibers; useHFQuadPhiRings_=useQuadRings; }
void HcalTrigTowerGeometry::towerEtaBounds | ( | int | ieta, |
double & | eta1, | ||
double & | eta2 | ||
) | const |
where this tower begins and ends in eta
Definition at line 183 of file HcalTrigTowerGeometry.cc.
References abs, HcalTopology::firstHFRing(), firstHFRingInTower(), firstHFTower(), hfTowerEtaSize(), HcalTopology::lastHERing(), theHBHEEtaBounds, theHFEtaBounds, theTopology, and tmp.
Referenced by CaloTPGTranscoderULUT::loadHCALUncompress(), and L1CaloHcalScaleConfigOnlineProd::newObject().
{ int ietaAbs = abs(ieta); if(ietaAbs < firstHFTower()) { eta1 = theHBHEEtaBounds[ietaAbs-1]; eta2 = theHBHEEtaBounds[ietaAbs]; // the last tower is split, so get tower 29, too if(ietaAbs == theTopology.lastHERing()-1) { eta2 = theHBHEEtaBounds[ietaAbs+1]; } } else { // count from 0 int hfIndex = firstHFRingInTower(ietaAbs) - theTopology.firstHFRing(); eta1 = theHFEtaBounds[hfIndex]; eta2 = theHFEtaBounds[hfIndex + hfTowerEtaSize(ieta)]; } // get the signs and order right if(ieta < 0) { double tmp = eta1; eta1 = -eta2; eta2 = -tmp; } }
std::vector< HcalTrigTowerDetId > HcalTrigTowerGeometry::towerIds | ( | const HcalDetId & | cellId | ) | const |
the mapping to and from DetIds
Definition at line 20 of file HcalTrigTowerGeometry.cc.
References HcalDetId::depth(), HcalTopology::firstHEDoublePhiRing(), HcalTopology::firstHFQuadPhiRing(), firstHFRingInTower(), firstHFTower(), HcalForward, HcalDetId::ieta(), HcalDetId::ietaAbs(), HcalDetId::iphi(), HcalTopology::lastHERing(), python::entryComment::results, HcalDetId::subdet(), theTopology, useHFQuadPhiRings_, useShortFibers_, and HcalDetId::zside().
Referenced by HcalTriggerPrimitiveAlgo::addSignal(), and HcalTriggerPrimitiveAlgo::runFEFormatError().
{ std::vector<HcalTrigTowerDetId> results; if(cellId.subdet() == HcalForward) { // short fibers don't count if(cellId.depth() == 1 || useShortFibers_) { // first do eta int hfRing = cellId.ietaAbs(); int ieta = firstHFTower(); // find the tower that contains this ring while(hfRing >= firstHFRingInTower(ieta+1)) { ++ieta; } ieta *= cellId.zside(); // now for phi // HF towers are quad, 18 in phi. // go two cells per trigger tower. int iphi = (((cellId.iphi()+1)/4) * 4 + 1)%72; // 71+1 --> 1, 3+5 --> 5 if (useHFQuadPhiRings_ || cellId.ietaAbs() < theTopology.firstHFQuadPhiRing()) results.push_back( HcalTrigTowerDetId(ieta, iphi) ); } } else { // the first twenty rings are one-to-one if(cellId.ietaAbs() < theTopology.firstHEDoublePhiRing()) { results.push_back( HcalTrigTowerDetId(cellId.ieta(), cellId.iphi()) ); } else { // the remaining rings are two-to-one in phi int iphi1 = cellId.iphi(); int ieta = cellId.ieta(); // the last eta ring in HE is split. Recombine. if(ieta == theTopology.lastHERing()) --ieta; if(ieta == -theTopology.lastHERing()) ++ieta; results.push_back( HcalTrigTowerDetId(ieta, iphi1) ); results.push_back( HcalTrigTowerDetId(ieta, iphi1+1) ); } } return results; }
Definition at line 43 of file HcalTrigTowerGeometry.h.
Referenced by detIds(), firstHFRingInTower(), towerEtaBounds(), and towerIds().
bool HcalTrigTowerGeometry::useHFQuadPhiRings_ [private] |
Definition at line 45 of file HcalTrigTowerGeometry.h.
Referenced by HcalTrigTowerGeometry(), setupHF(), and towerIds().
bool HcalTrigTowerGeometry::useShortFibers_ [private] |
Definition at line 44 of file HcalTrigTowerGeometry.h.
Referenced by HcalTrigTowerGeometry(), setupHF(), and towerIds().