CMS 3D CMS Logo

CaloTowerConstituentsMap.cc
Go to the documentation of this file.
7 
8 #include <memory>
9 
10 //#define EDM_ML_DEBUG
11 
13  delete m_reverseItems.load();
14  m_reverseItems = nullptr;
15 }
17  : m_hcaltopo(hcaltopo),
18  m_cttopo(cttopo),
19  standardHB_(false),
20  standardHE_(false),
21  standardHF_(false),
22  standardHO_(false),
23  standardEB_(false),
24  m_reverseItems(nullptr) {}
25 
27  CaloTowerDetId tid; // null to start with
28 
30  if (i != m_items.end())
31  tid = i->tower;
32 
33  //use hcaltopo when dealing with hcal detids
34  if (tid.null()) {
35  if (id.det() == DetId::Hcal) {
36  HcalDetId hid(id);
37  if ((hid.subdet() == HcalBarrel && standardHB_) || (hid.subdet() == HcalEndcap && standardHE_) ||
38  (hid.subdet() == HcalOuter && standardHO_) || (hid.subdet() == HcalForward && standardHF_)) {
39  tid = CaloTowerDetId(m_cttopo->convertHcaltoCT(hid.ietaAbs(), hid.subdet()) * hid.zside(), hid.iphi());
40  }
41  } else if (id.det() == DetId::Ecal) {
42  EcalSubdetector esd = (EcalSubdetector)id.subdetId();
43  if (esd == EcalBarrel && standardEB_) {
44  EBDetId ebid(id);
45  tid = CaloTowerDetId(ebid.tower_ieta(), ebid.tower_iphi());
46  }
47  }
48  }
49 
50  return tid;
51 }
52 
54  if (m_items.find(cell) != m_items.end()) {
55  throw cms::Exception("CaloTowers") << "Cell with id " << std::hex << cell.rawId() << std::dec
56  << " is already mapped to a CaloTower " << m_items.find(cell)->tower
57  << std::endl;
58  }
59  m_items.emplace_back(MapItem(cell, tower));
60 }
61 
63  m_items.sort();
64 
65  // for (auto const & it : m_items)
66  // std::cout << std::hex << it.cell.rawId() << " " << it.tower.rawId() << std::dec << std::endl;
67 }
68 
69 std::vector<DetId> CaloTowerConstituentsMap::constituentsOf(const CaloTowerDetId& id) const {
70 #ifdef EDM_ML_DEBUG
71  std::cout << "Get constituent of " << std::hex << id.rawId() << std::dec << " ID " << id << " ieta " << id.ieta()
72  << std::endl;
73 #endif
74  std::vector<DetId> items;
75  if (id.ieta() == 0)
76  return items;
77 
78  // build reverse map if needed
79  if (!m_reverseItems.load(std::memory_order_acquire)) {
80  std::unique_ptr<std::multimap<CaloTowerDetId, DetId>> ptr{new std::multimap<CaloTowerDetId, DetId>};
81  for (auto m_item : m_items)
82  ptr->insert(std::pair<CaloTowerDetId, DetId>(m_item.tower, m_item.cell));
83  std::multimap<CaloTowerDetId, DetId>* expected = nullptr;
84  if (m_reverseItems.compare_exchange_strong(expected, ptr.get(), std::memory_order_acq_rel)) {
85  ptr.release();
86  }
87  }
88 
90  std::multimap<CaloTowerDetId, DetId>::const_iterator j;
91  auto range = (*m_reverseItems.load(std::memory_order_acquire)).equal_range(id);
92  for (j = range.first; j != range.second; j++)
93  items.emplace_back(j->second);
94 
95  // dealing with topo dependency...
96  //use cttopo when dealing with calotower detids
97  int nd, sd;
98  int hcal_ieta = m_cttopo->convertCTtoHcal(id.ietaAbs());
99 
100  if (standardHB_) {
101  if (id.ietaAbs() <= m_cttopo->lastHBRing()) {
102  m_hcaltopo->depthBinInformation(HcalBarrel, hcal_ieta, id.iphi(), id.zside(), nd, sd);
103  for (int i = 0; i < nd; i++) {
105  HcalDetId hid =
106  m_hcaltopo->mergedDepthDetId(HcalDetId(HcalBarrel, hcal_ieta * id.zside(), id.iphi(), i + sd));
107  if (std::find(items.begin(), items.end(), hid) == items.end()) {
108  items.emplace_back(hid);
109 #ifdef EDM_ML_DEBUG
110  std::cout << id << " Depth " << i << ":" << i + sd << " " << hid << "\n";
111 #endif
112  }
113  } else {
114  HcalDetId hid(HcalBarrel, hcal_ieta * id.zside(), id.iphi(), i + sd);
115  items.emplace_back(hid);
116 #ifdef EDM_ML_DEBUG
117  std::cout << id << " Depth " << i << ":" << i + sd << " " << hid << "\n";
118 #endif
119  }
120  }
121  }
122  }
123  if (standardHO_) {
124  if (id.ietaAbs() <= m_cttopo->lastHORing()) {
125  m_hcaltopo->depthBinInformation(HcalOuter, hcal_ieta, id.iphi(), id.zside(), nd, sd);
126  for (int i = 0; i < nd; i++) {
127  HcalDetId hid(HcalOuter, hcal_ieta * id.zside(), id.iphi(), i + sd);
128  items.emplace_back(hid);
129 #ifdef EDM_ML_DEBUG
130  std::cout << id << " Depth " << i << ":" << i + sd << " " << hid << "\n";
131 #endif
132  }
133  }
134  }
135  if (standardHE_) {
136  if (id.ietaAbs() >= m_cttopo->firstHERing() && id.ietaAbs() <= m_cttopo->lastHERing()) {
137  m_hcaltopo->depthBinInformation(HcalEndcap, hcal_ieta, id.iphi(), id.zside(), nd, sd);
138  for (int i = 0; i < nd; i++) {
140  HcalDetId hid =
141  m_hcaltopo->mergedDepthDetId(HcalDetId(HcalEndcap, hcal_ieta * id.zside(), id.iphi(), i + sd));
142  if (std::find(items.begin(), items.end(), hid) == items.end()) {
143  items.emplace_back(hid);
144 #ifdef EDM_ML_DEBUG
145  std::cout << id << " Depth " << i << ":" << i + sd << " " << hid << "\n";
146 #endif
147  }
148  } else {
149  HcalDetId hid(HcalEndcap, hcal_ieta * id.zside(), id.iphi(), i + sd);
150  items.emplace_back(hid);
151 #ifdef EDM_ML_DEBUG
152  std::cout << id << " Depth " << i << ":" << i + sd << " " << hid << "\n";
153 #endif
154  }
155  }
156  }
157  }
158  if (standardHF_) {
159  if (id.ietaAbs() >= m_cttopo->firstHFRing() && id.ietaAbs() <= m_cttopo->lastHFRing()) {
160  m_hcaltopo->depthBinInformation(HcalForward, hcal_ieta, id.iphi(), id.zside(), nd, sd);
161  for (int i = 0; i < nd; i++) {
162  HcalDetId hid(HcalForward, hcal_ieta * id.zside(), id.iphi(), i + sd);
163  items.emplace_back(hid);
164 #ifdef EDM_ML_DEBUG
165  std::cout << id << " Depth " << i << ":" << i + sd << " " << hid << "\n";
166 #endif
167  }
168  // special handling for first HF tower
169  if (id.ietaAbs() == m_cttopo->firstHFRing()) {
170  int hcal_ieta2 = hcal_ieta - 1;
171  m_hcaltopo->depthBinInformation(HcalForward, hcal_ieta2, id.iphi(), id.zside(), nd, sd);
172  for (int i = 0; i < nd; i++) {
173  HcalDetId hid(HcalForward, hcal_ieta2 * id.zside(), id.iphi(), i + sd);
174  items.emplace_back(hid);
175 #ifdef EDM_ML_DEBUG
176  std::cout << id << " Depth " << i << ":" << i + sd << " " << hid << "\n";
177 #endif
178  }
179  }
180  }
181  }
182  if (standardEB_ && hcal_ieta <= EBDetId::MAX_IETA / 5) {
183  HcalDetId hid(HcalBarrel, hcal_ieta * id.zside(), id.iphi(), 1); // for the limits
184  int etaMin, etaMax;
185  if (hid.zside() == -1) {
186  etaMin = hid.crystal_ieta_high();
187  etaMax = hid.crystal_ieta_low();
188  } else {
189  etaMin = hid.crystal_ieta_low();
190  etaMax = hid.crystal_ieta_high();
191  }
192  for (int ie = etaMin; ie <= etaMax; ie++)
193  for (int ip = hid.crystal_iphi_low(); ip <= hid.crystal_iphi_high(); ip++)
194  items.emplace_back(EBDetId(ie, ip));
195  }
196  return items;
197 }
198 
CaloTowerConstituentsMap::useStandardEB
void useStandardEB(bool use=true)
add standard (hardcoded) EB items?
Definition: CaloTowerConstituentsMap.cc:203
HcalDetId::crystal_ieta_high
constexpr int crystal_ieta_high() const
get the largest crystal_ieta of the crystal in front of this tower (HB and HE tower 17 only)
Definition: HcalDetId.h:259
FastTimerService_cff.range
range
Definition: FastTimerService_cff.py:34
ALCARECOTkAlBeamHalo_cff.etaMin
etaMin
GeV.
Definition: ALCARECOTkAlBeamHalo_cff.py:32
mps_fire.i
i
Definition: mps_fire.py:355
edm::SortedCollection::const_iterator
std::vector< T >::const_iterator const_iterator
Definition: SortedCollection.h:80
CaloTowerConstituentsMap::sort
void sort()
done adding to the association
Definition: CaloTowerConstituentsMap.cc:62
funct::false
false
Definition: Factorize.h:34
CaloTowerTopology::firstHFRing
int firstHFRing() const
Definition: CaloTowerTopology.h:40
CaloTowerConstituentsMap::constituentsOf
std::vector< DetId > constituentsOf(const CaloTowerDetId &id) const
Get the constituent detids for this tower id ( not yet implemented )
Definition: CaloTowerConstituentsMap.cc:69
HcalDetId::iphi
constexpr int iphi() const
get the cell iphi
Definition: HcalDetId.h:157
CaloTowerConstituentsMap::useStandardHB
void useStandardHB(bool use=true)
add standard (hardcoded) HB items?
Definition: CaloTowerConstituentsMap.cc:199
CaloTowerConstituentsMap::assign
void assign(const DetId &cell, const CaloTowerDetId &tower)
set the association between a DetId and a tower
Definition: CaloTowerConstituentsMap.cc:53
ecaldqm::zside
int zside(DetId const &)
Definition: EcalDQMCommonUtils.cc:189
CaloTowerConstituentsMap::useStandardHO
void useStandardHO(bool use=true)
add standard (hardcoded) HO items?
Definition: CaloTowerConstituentsMap.cc:201
CaloTowerConstituentsMap.h
EBDetId
Definition: EBDetId.h:17
HcalDetId::crystal_iphi_low
constexpr int crystal_iphi_low() const
get the smallest crystal_iphi of the crystal in front of this tower (HB and HE tower 17 only)
Definition: HcalDetId.h:261
gather_cfg.cout
cout
Definition: gather_cfg.py:144
HcalTopology
Definition: HcalTopology.h:26
EBDetId.h
DetId::Hcal
Definition: DetId.h:28
hgcalTowerProducer_cfi.tower
tower
Definition: hgcalTowerProducer_cfi.py:3
CaloTowerTopology
Definition: CaloTowerTopology.h:13
CaloTowerConstituentsMap::useStandardHE
void useStandardHE(bool use=true)
add standard (hardcoded) HE items?
Definition: CaloTowerConstituentsMap.cc:200
CaloTowerTopology::lastHORing
int lastHORing() const
Definition: CaloTowerTopology.h:43
CaloTowerConstituentsMap::MapItem
Definition: CaloTowerConstituentsMap.h:57
DetId::null
constexpr bool null() const
is this a null id ?
Definition: DetId.h:59
EcalSubdetector
EcalSubdetector
Definition: EcalSubdetector.h:10
HcalTopology::mergedDepthDetId
HcalDetId mergedDepthDetId(const HcalDetId &id) const
Definition: HcalTopology.h:166
CaloTowerTopology::firstHERing
int firstHERing() const
Definition: CaloTowerTopology.h:38
HcalBarrel
Definition: HcalAssistant.h:33
spr::find
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
HcalTopology::getMergePositionFlag
bool getMergePositionFlag() const
Definition: HcalTopology.h:167
EcalBarrel
Definition: EcalSubdetector.h:10
mps_monitormerge.items
list items
Definition: mps_monitormerge.py:29
CaloTowerConstituentsMap::m_hcaltopo
const HcalTopology * m_hcaltopo
Definition: CaloTowerConstituentsMap.h:48
CaloTowerConstituentsMap::standardHO_
bool standardHO_
Definition: CaloTowerConstituentsMap.h:54
LEDCalibrationChannels.iphi
iphi
Definition: LEDCalibrationChannels.py:64
DetId
Definition: DetId.h:17
CaloTowerTopology::convertHcaltoCT
int convertHcaltoCT(int hcal_ieta, HcalSubdetector subdet) const
Definition: CaloTowerTopology.cc:79
EBDetId::tower_ieta
int tower_ieta() const
get the HCAL/trigger ieta of this crystal
Definition: EBDetId.h:53
CaloTowerTopology::lastHFRing
int lastHFRing() const
Definition: CaloTowerTopology.h:41
CaloTowerConstituentsMap::m_cttopo
const CaloTowerTopology * m_cttopo
Definition: CaloTowerConstituentsMap.h:49
HcalOuter
Definition: HcalAssistant.h:35
CaloTowerConstituentsMap::standardHF_
bool standardHF_
Definition: CaloTowerConstituentsMap.h:53
CaloTowerTopology.h
CaloTowerConstituentsMap::useStandardHF
void useStandardHF(bool use=true)
add standard (hardcoded) HF items?
Definition: CaloTowerConstituentsMap.cc:202
CaloTowerConstituentsMap::standardHB_
bool standardHB_
Definition: CaloTowerConstituentsMap.h:51
CaloTowerConstituentsMap::standardEB_
bool standardEB_
Definition: CaloTowerConstituentsMap.h:55
EBDetId::tower_iphi
int tower_iphi() const
get the HCAL/trigger iphi of this crystal
Definition: EBDetId.cc:100
CaloTowerConstituentsMap::standardHE_
bool standardHE_
Definition: CaloTowerConstituentsMap.h:52
LEDCalibrationChannels.ieta
ieta
Definition: LEDCalibrationChannels.py:63
HcalDetId.h
HcalDetId::subdet
constexpr HcalSubdetector subdet() const
get the subdetector
Definition: HcalDetId.h:138
HcalDetId
Definition: HcalDetId.h:12
CaloTowerTopology::lastHERing
int lastHERing() const
Definition: CaloTowerTopology.h:39
HcalTopology::depthBinInformation
void depthBinInformation(HcalSubdetector subdet, int etaRing, int iphi, int zside, int &nDepthBins, int &startingBin) const
finds the number of depth bins and which is the number to start with
Definition: HcalTopology.cc:816
CaloTowerConstituentsMap::towerOf
CaloTowerDetId towerOf(const DetId &id) const
Get the tower id for this det id (or null if not known)
Definition: CaloTowerConstituentsMap.cc:26
HcalDetId::crystal_ieta_low
constexpr int crystal_ieta_low() const
get the smallest crystal_ieta of the crystal in front of this tower (HB and HE tower 17 only)
Definition: HcalDetId.h:257
DetId::Ecal
Definition: DetId.h:27
HcalForward
Definition: HcalAssistant.h:36
CaloTowerTopology::lastHBRing
int lastHBRing() const
Definition: CaloTowerTopology.h:37
HcalTopology.h
CaloTowerTopology::convertCTtoHcal
int convertCTtoHcal(int ct_ieta) const
Definition: CaloTowerTopology.cc:67
DetId::rawId
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
HcalEndcap
Definition: HcalAssistant.h:34
Exception
Definition: hltDiff.cc:246
ALCARECOTkAlBeamHalo_cff.etaMax
etaMax
Definition: ALCARECOTkAlBeamHalo_cff.py:33
CaloTowerConstituentsMap::m_reverseItems
std::atomic< std::multimap< CaloTowerDetId, DetId > * > m_reverseItems
Definition: CaloTowerConstituentsMap.h:66
CaloTowerConstituentsMap::m_items
edm::SortedCollection< MapItem > m_items
Definition: CaloTowerConstituentsMap.h:65
Exception.h
sd
double sd
Definition: CascadeWrapper.h:113
HcalDetId::crystal_iphi_high
constexpr int crystal_iphi_high() const
get the largest crystal_iphi of the crystal in front of this tower (HB and HE tower 17 only)
Definition: HcalDetId.h:267
HcalDetId::ietaAbs
constexpr int ietaAbs() const
get the absolute value of the cell ieta
Definition: HcalDetId.h:148
dqmiolumiharvest.j
j
Definition: dqmiolumiharvest.py:66
HcalDetId::zside
constexpr int zside() const
get the z-side of the cell (1/-1)
Definition: HcalDetId.h:141
TauDecayModes.dec
dec
Definition: TauDecayModes.py:143
CaloTowerConstituentsMap::~CaloTowerConstituentsMap
~CaloTowerConstituentsMap()
Definition: CaloTowerConstituentsMap.cc:12
EBDetId::MAX_IETA
static const int MAX_IETA
Definition: EBDetId.h:136
CaloTowerConstituentsMap::CaloTowerConstituentsMap
CaloTowerConstituentsMap()=delete
CaloTowerDetId
Definition: CaloTowerDetId.h:12