CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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 
void useStandardHE(bool use=true)
add standard (hardcoded) HE items?
constexpr int ietaAbs() const
get the absolute value of the cell ieta
Definition: HcalDetId.h:148
int convertHcaltoCT(int hcal_ieta, HcalSubdetector subdet) const
constexpr int zside() const
get the z-side of the cell (1/-1)
Definition: HcalDetId.h:141
constexpr bool null() const
is this a null id ?
Definition: DetId.h:59
int tower_ieta() const
get the HCAL/trigger ieta of this crystal
Definition: EBDetId.h:53
int tower_iphi() const
get the HCAL/trigger iphi of this crystal
Definition: EBDetId.cc:100
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
std::vector< T >::const_iterator const_iterator
void useStandardEB(bool use=true)
add standard (hardcoded) EB items?
const CaloTowerTopology * m_cttopo
tuple etaMin
Definition: Puppi_cff.py:45
int zside(DetId const &)
void sort()
done adding to the association
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
bool getMergePositionFlag() const
Definition: HcalTopology.h:167
int firstHERing() const
void useStandardHB(bool use=true)
add standard (hardcoded) HB items?
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
std::vector< DetId > constituentsOf(const CaloTowerDetId &id) const
Get the constituent detids for this tower id ( not yet implemented )
HcalDetId mergedDepthDetId(const HcalDetId &id) const
Definition: HcalTopology.h:166
const uint16_t range(const Frame &aFrame)
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
constexpr HcalSubdetector subdet() const
get the subdetector
Definition: HcalDetId.h:138
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
int lastHFRing() const
CaloTowerDetId towerOf(const DetId &id) const
Get the tower id for this det id (or null if not known)
constexpr int iphi() const
get the cell iphi
Definition: HcalDetId.h:157
if(conf_.getParameter< bool >("UseStripCablingDB"))
void assign(const DetId &cell, const CaloTowerDetId &tower)
set the association between a DetId and a tower
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
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
Definition: DetId.h:17
void useStandardHO(bool use=true)
add standard (hardcoded) HO items?
double sd
static const int MAX_IETA
Definition: EBDetId.h:136
int lastHERing() const
int convertCTtoHcal(int ct_ieta) const
int lastHORing() const
tuple cout
Definition: gather_cfg.py:144
int lastHBRing() const
int firstHFRing() const
tuple etaMax
Definition: Puppi_cff.py:46
EcalSubdetector
void useStandardHF(bool use=true)
add standard (hardcoded) HF items?
std::atomic< std::multimap< CaloTowerDetId, DetId > * > m_reverseItems
edm::SortedCollection< MapItem > m_items