CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
EcalDQMBinningService2.cc
Go to the documentation of this file.
3 
5 
8 
9 #include <algorithm>
10 
11 #include "TMath.h"
12 
13 using namespace ecaldqm;
14 
15 std::vector<EcalDQMBinningService::AxisSpecs>
17 {
18  std::vector<AxisSpecs> axes(0);
19  AxisSpecs xaxis, yaxis;
20 
21  if(!_isMap){
22 
23  switch(_btype){
24 // case kTriggerTower:
25 // case kSuperCrystal:
26 // xaxis.nbins = 2448;
27 // xaxis.low = 0.;
28 // xaxis.high = 2448.;
29 // xaxis.title = "iTT";
30 // break;
31  case kTCC:
32  xaxis.nbins = 36;
33  xaxis.low = 9.;
34  xaxis.high = 45.;
35  xaxis.title = "iTCC";
36  break;
37  case kDCC:
38  xaxis.nbins = 36;
39  xaxis.low = 9.;
40  xaxis.high = 45.;
41  break;
42  case kProjEta:
43  xaxis.nbins = nEBEtaBins;
44  xaxis.low = -etaBound_;
45  xaxis.high = etaBound_;
46  xaxis.title = "eta";
47  break;
48  case kProjPhi:
49  xaxis.nbins = nPhiBins;
50  xaxis.low = -TMath::Pi() / 18.;
51  xaxis.high = TMath::Pi() * 35./18.;
52  xaxis.title = "phi";
53  break;
54  default:
55  return axes;
56  }
57 
58  axes.push_back(xaxis);
59 
60  }
61  else{
62 
63  switch(_btype){
64  case kCrystal:
65  xaxis.nbins = 360;
66  yaxis.nbins = 170;
67  break;
68  case kSuperCrystal:
69  case kTriggerTower:
70  xaxis.nbins = 72;
71  yaxis.nbins = 34;
72  break;
73  default:
74  return axes;
75  }
76 
77  xaxis.low = 0.;
78  xaxis.high = 360.;
79  xaxis.title = "iphi";
80  yaxis.low = -85.;
81  yaxis.high = 85.;
82  yaxis.title = "ieta";
83 
84  axes.push_back(xaxis);
85  axes.push_back(yaxis);
86 
87  }
88 
89  return axes;
90 }
91 
92 std::vector<EcalDQMBinningService::AxisSpecs>
94 {
95  std::vector<AxisSpecs> axes(0);
96  AxisSpecs xaxis, yaxis;
97 
98  if(_btype != kCrystal || !_isMap) return axes;
99 
100  xaxis.nbins = 18;
101  xaxis.low = 0.;
102  xaxis.high = 18.;
103  xaxis.title = "channel";
104 
105  yaxis.nbins = 20;
106  yaxis.low = -10.;
107  yaxis.high = 10.;
108  yaxis.title = "pseudo-strip";
109 
110  axes.push_back(xaxis);
111  axes.push_back(yaxis);
112 
113  return axes;
114 }
115 
116 std::vector<EcalDQMBinningService::AxisSpecs>
117 EcalDQMBinningService::getBinningEE_(BinningType _btype, bool _isMap, int _zside) const
118 {
119  std::vector<AxisSpecs> axes(0);
120  AxisSpecs xaxis, yaxis;
121 
122  if(!_isMap){
123 
124  switch(_btype){
125 // case kTriggerTower:
126 // xaxis.nbins = _zside ? 720 : 1440;
127 // xaxis.low = 0.;
128 // xaxis.high = _zside ? 720. : 1440.;
129 // xaxis.title = "iTT";
130 // break;
131 // case kSuperCrystal:
132 // xaxis.nbins = _zside ? 312 : 624;
133 // xaxis.low = 0.;
134 // xaxis.high = _zside ? 312. : 624.;
135 // xaxis.title = "iSC";
136 // break;
137  case kTCC:
138  xaxis.nbins = _zside ? 36 : 72;
139  xaxis.low = 0.;
140  xaxis.high = _zside ? 36. : 72.;
141  xaxis.title = "iTCC";
142  break;
143  case kDCC:
144  xaxis.nbins = _zside ? 9 : 18;
145  xaxis.low = 0.;
146  xaxis.high = _zside ? 9. : 18.;
147  break;
148  case kProjEta:
149  if(!_zside) return axes;
150  xaxis.nbins = nEEEtaBins;
151  xaxis.low = _zside < 0 ? -3. : etaBound_;
152  xaxis.high = _zside < 0 ? -etaBound_ : 3.;
153  xaxis.title = "eta";
154  break;
155  case kProjPhi:
156  xaxis.nbins = nPhiBins;
157  xaxis.low = -TMath::Pi() / 18.;
158  xaxis.high = TMath::Pi() * 35./18.;
159  xaxis.title = "phi";
160  break;
161  default:
162  return axes;
163  }
164 
165  axes.push_back(xaxis);
166 
167  }else{
168 
169  switch(_btype){
170  case kCrystal:
171  case kTriggerTower:
172  xaxis.nbins = _zside ? 100 : 200;
173  yaxis.nbins = 100;
174  break;
175  case kSuperCrystal:
176  xaxis.nbins = _zside ? 20 : 40;
177  yaxis.nbins = 20;
178  break;
179  default:
180  return axes;
181  }
182 
183  xaxis.low = 0.;
184  xaxis.high = _zside ? 100. : 200.;
185  xaxis.title = "ix";
186  yaxis.low = 0.;
187  yaxis.high = 100.;
188  yaxis.title = "iy";
189 
190  axes.push_back(xaxis);
191  axes.push_back(yaxis);
192 
193  }
194 
195  return axes;
196 }
197 
198 std::vector<EcalDQMBinningService::AxisSpecs>
200 {
201  std::vector<AxisSpecs> axes(0);
202  AxisSpecs xaxis, yaxis;
203 
204  if(_btype != kCrystal || !_isMap) return axes;
205 
206  xaxis.nbins = 4;
207  xaxis.low = 0.;
208  xaxis.high = 4.;
209  xaxis.title = "channel";
210 
211  yaxis.nbins = 20;
212  yaxis.low = -10.;
213  yaxis.high = 10.;
214  yaxis.title = "pseudo-strip";
215 
216  axes.push_back(xaxis);
217  axes.push_back(yaxis);
218 
219  return axes;
220 }
221 
222 std::vector<EcalDQMBinningService::AxisSpecs>
223 EcalDQMBinningService::getBinningSM_(BinningType _btype, bool _isMap, unsigned _offset) const
224 {
225  const bool isBarrel(_offset >= kEBmLow && _offset <= kEBpHigh);
226 
227  std::vector<AxisSpecs> axes(0);
228  AxisSpecs xaxis, yaxis;
229 
230  if(!_isMap){
231 
232  switch(_btype){
233  case kCrystal:
234  xaxis.nbins = isBarrel ? 1700 : getElectronicsMap()->dccConstituents(_offset + 1).size();
235  xaxis.low = 0.;
236  xaxis.high = xaxis.nbins;
237  xaxis.title = "channel";
238  break;
239  case kTriggerTower:
240  xaxis.nbins = isBarrel ? 68 : 80;
241  xaxis.low = 0.;
242  xaxis.high = xaxis.nbins;
243  xaxis.title = "tower";
244  break;
245  case kSuperCrystal:
246  xaxis.nbins = isBarrel ? 68 : getNSuperCrystals(_offset + 1);
247  xaxis.low = 0.;
248  xaxis.high = xaxis.nbins;
249  xaxis.title = "tower";
250  break;
251  default:
252  return axes;
253  }
254 
255  axes.push_back(xaxis);
256 
257  }else{
258 
259  int nEEX(nEESMX);
260  if(_offset == kEEm02 || _offset == kEEm08 || _offset == kEEp02 || _offset == kEEp08) nEEX = nEESMXExt;
261 
262  switch(_btype){
263  case kCrystal:
264  xaxis.nbins = isBarrel ? nEBSMEta : nEEX;
265  yaxis.nbins = isBarrel ? nEBSMPhi : nEESMY;
266  break;
267  case kTriggerTower:
268  xaxis.nbins = isBarrel ? nEBSMEta / 5 : nEEX;
269  yaxis.nbins = isBarrel ? nEBSMPhi / 5 : nEESMY;
270  break;
271  case kSuperCrystal:
272  xaxis.nbins = isBarrel ? nEBSMEta / 5 : nEEX / 5;
273  yaxis.nbins = isBarrel ? nEBSMPhi / 5 : nEESMY / 5;
274  break;
275  default:
276  return axes;
277  }
278  xaxis.low = xlow(_offset);
279  xaxis.high = xaxis.low + (isBarrel ? nEBSMEta : nEEX);
280  xaxis.title = isBarrel ? (_offset < kEBpLow ? "-ieta" : "ieta") : "ix";
281  yaxis.low = ylow(_offset);
282  yaxis.high = yaxis.low + (isBarrel ? nEBSMPhi : nEESMY);
283  yaxis.title = isBarrel ? "iphi" : "iy";
284 
285  axes.push_back(xaxis);
286  axes.push_back(yaxis);
287 
288  }
289 
290  return axes;
291 }
292 
293 std::vector<EcalDQMBinningService::AxisSpecs>
294 EcalDQMBinningService::getBinningSMMEM_(BinningType _btype, bool _isMap, unsigned _idcc) const
295 {
296  std::vector<AxisSpecs> axes(0);
297  AxisSpecs xaxis, yaxis;
298 
299  if(dccNoMEM.find(_idcc) != dccNoMEM.end()) return axes;
300  if(_btype != kCrystal) return axes;
301 
302  xaxis.nbins = 10;
303  xaxis.low = _idcc >= kEBpLow ? 0. : -10.;
304  xaxis.high = _idcc >= kEBpLow ? 10. : 0.;
305  xaxis.title = "pseudo-strip";
306 
307  axes.push_back(xaxis);
308 
309  if(_isMap){
310  yaxis.nbins = 1;
311  yaxis.low = 0.;
312  yaxis.high = 5.;
313  yaxis.title = "channel";
314  axes.push_back(yaxis);
315  }
316 
317  return axes;
318 }
319 
320 std::vector<EcalDQMBinningService::AxisSpecs>
322 {
323  std::vector<AxisSpecs> axes(0);
324  AxisSpecs xaxis, yaxis;
325 
326  if(!_isMap){
327 
328  switch(_btype){
329  case kTCC:
330  xaxis.nbins = 108;
331  xaxis.low = 0.;
332  xaxis.high = 108.;
333  xaxis.title = "iTCC";
334  break;
335  case kDCC:
336  xaxis.nbins = 54;
337  xaxis.low = 0.;
338  xaxis.high = 54.;
339  break;
340  case kProjEta:
341  xaxis.nbins = nEBEtaBins + 2 * nEEEtaBins;
342  xaxis.edges = new double[xaxis.nbins + 1];
343  for(int i(0); i <= nEEEtaBins; i++)
344  xaxis.edges[i] = -3. + (3. - etaBound_) / nEEEtaBins * i;
345  for(int i(1); i <= nEBEtaBins; i++)
346  xaxis.edges[i + nEEEtaBins] = -etaBound_ + 2. * etaBound_ / nEBEtaBins * i;
347  for(int i(1); i <= nEEEtaBins; i++)
348  xaxis.edges[i + nEEEtaBins + nEBEtaBins] = etaBound_ + (3. - etaBound_) / nEEEtaBins * i;
349  xaxis.title = "eta";
350  break;
351  case kProjPhi:
352  xaxis.nbins = nPhiBins;
353  xaxis.low = -TMath::Pi() / 18.;
354  xaxis.high = TMath::Pi() * 35./18.;
355  xaxis.title = "phi";
356  break;
357  default:
358  return axes;
359  }
360 
361  axes.push_back(xaxis);
362  }
363  else{
364 
365  switch(_btype){
366  case kCrystal:
367  xaxis.nbins = 360;
368  yaxis.nbins = 270;
369  break;
370  case kSuperCrystal:
371  xaxis.nbins = 72;
372  yaxis.nbins = 54;
373  break;
374  default:
375  return axes;
376  }
377 
378  xaxis.low = 0.;
379  xaxis.high = 360.;
380  xaxis.title = "iphi/ix/ix+100";
381  yaxis.low = 0.;
382  yaxis.high = 270.;
383  yaxis.title = "ieta/iy";
384 
385  axes.push_back(xaxis);
386  axes.push_back(yaxis);
387 
388  }
389 
390  return axes;
391 }
392 
393 
394 const std::vector<int>*
396 {
397  std::vector<int>& binMap(binMaps_[kEB][_bkey]);
398 
399  switch(_bkey){
400  case kCrystal:
401  binMap.resize(EBDetId::kSizeForDenseIndexing); // EBDetId -> bin
402  for(int ix = 1; ix <= 360; ix++){
403  for(int iy = 1; iy <= 170; iy++){
404  uint32_t dIndex(EBDetId(iy < 86 ? iy - 86 : iy - 85, ix).hashedIndex());
405  binMap[dIndex] = 360 * (iy - 1) + ix ;
406  }
407  }
408  return &binMap;
409 
410  case kSuperCrystal:
411  binMap.resize(EcalTrigTowerDetId::kEBTotalTowers); // EcalTrigTowerDetId -> bin
412  for(int ix = 1; ix <= 72; ix++){
413  for(int iy = 1; iy <= 34; iy++){
414  int ieta(iy < 18 ? (iy - 18) * 5 : (iy - 17) * 5);
415  int iphi(ix * 5);
416  uint32_t dIndex(EBDetId(ieta, iphi).tower().hashedIndex());
417  binMap[dIndex] = 72 * (iy - 1) + ix;
418  }
419  }
420  return &binMap;
421 
422  case kDCC:
423  {
424  int nEBDCC(kEBpHigh - kEBmLow + 1);
425  binMap.resize(nEBDCC); // DCCId (shifted) -> bin
426  for(int ix = 1; ix <= nEBDCC; ix++)
427  binMap[ix - 1] = ix;
428  }
429  return &binMap;
430 
431  case kTCC:
432  {
433  int nEBTCC(kEBTCCHigh - kEBTCCLow + 1);
434  binMap.resize(nEBTCC); // TCCId (shifted) -> bin
435  for(int ix = 1; ix <= nEBTCC; ix++)
436  binMap[ix - 1] = ix;
437  }
438  return &binMap;
439 
440  case kProjEta:
441  {
442  float binEdges[nEBEtaBins + 1];
443  for(int i(0); i <= nEBEtaBins; i++)
444  binEdges[i] = -etaBound_ + 2. * etaBound_ / nEBEtaBins * i;
445  binMap.resize(170); // ieta -> bin
446  for(int ieta(-85); ieta <= 85; ieta++){
447  if(ieta == 0) continue;
448  EBDetId ebid(ieta, 1);
449  float eta(geometry_->getGeometry(ebid)->getPosition().eta());
450  float* pBin(std::upper_bound(binEdges, binEdges + nEBEtaBins + 1, eta));
451  uint32_t dIndex(ieta < 0 ? ieta + 85 : ieta + 84);
452  binMap[dIndex] = static_cast<int>(pBin - binEdges);
453  }
454  }
455  return &binMap;
456 
457  case kProjPhi:
458  {
459  float binEdges[nPhiBins + 1];
460  for(int i(0); i <= nPhiBins; i++)
461  binEdges[i] = TMath::Pi() * (-1./18. + 2. / nPhiBins * i);
462  binMap.resize(360); // iphi -> bin
463  for(int iphi(1); iphi <= 360; iphi++){
464  EBDetId ebid(1, iphi);
465  float phi(geometry_->getGeometry(ebid)->getPosition().phi());
466  if(phi < -TMath::Pi() * 1./18.) phi += 2. * TMath::Pi();
467  float* pBin(std::upper_bound(binEdges, binEdges + nPhiBins + 1, phi));
468  uint32_t dIndex(iphi - 1);
469  binMap[dIndex] = static_cast<int>(pBin - binEdges);
470  }
471  }
472  return &binMap;
473 
474  default:
475  return 0;
476  }
477 }
478 
479 const std::vector<int>*
481 {
482  if(_bkey != kCrystal) return 0;
483 
484  int nEBMEM((kEBpHigh - kEBmLow + 1) * 10);
485  std::vector<int>& binMap(binMaps_[kEBMEM][kCrystal]);
486 
487  binMap.resize(nEBMEM); // EcalPnDiodeDetId -> bin; original hashing (DCCId * 10 + PnId)
488  for(int ix = 1; ix <= 18; ix++){
489  for(int iy = 1; iy <= 20; iy++){
490  int idcc((iy < 11 ? kEBmLow : kEBpLow) + ix - 1);
491  int pnId(iy < 11 ? 11 - iy : iy - 10);
492  uint32_t dIndex((idcc - kEBmLow) * 10 + pnId - 1);
493  binMap[dIndex] = 18 * (iy - 1) + ix;
494  }
495  }
496  return &binMap;
497 }
498 
499 const std::vector<int>*
501 {
502  unsigned okey(0);
503  switch(_zside){
504  case -1: okey = kEEm; break;
505  case 0: okey = kEE; break;
506  case 1: okey = kEEp; break;
507  default: return 0;
508  }
509 
510  std::vector<int>& binMap(binMaps_[okey][_bkey]);
511 
512  int ixmax(_zside == 0 ? 200 : 100);
513  int zside(_zside);
514 
515  switch(_bkey){
516  case kCrystal: // EEDetId -> bin
517  binMap.resize(_zside == 0 ? EEDetId::kSizeForDenseIndexing : EEDetId::kEEhalf);
518  for(int ix = 1; ix <= ixmax; ix++){
519  if(_zside == 0) zside = (ix <= 100 ? -1 : 1);
520  int iix(_zside == 0 && ix > 100 ? ix - 100 : ix);
521  for(int iy = 1; iy <= 100; iy++){
522  if(!EEDetId::validDetId(iix, iy, zside)) continue;
523  uint32_t dIndex(EEDetId(iix, iy, zside).hashedIndex());
524  if(_zside == 1) dIndex -= EEDetId::kEEhalf;
525  binMap[dIndex] = ixmax * (iy - 1) + ix;
526  }
527  }
528  return &binMap;
529 
530  case kSuperCrystal: // EcalScDetId -> bin
531  binMap.resize(_zside == 0 ? EcalScDetId::kSizeForDenseIndexing : EcalScDetId::SC_PER_EE_CNT);
532  for(int ix = 1; ix <= ixmax / 5; ix++){
533  if(_zside == 0) zside = (ix <= 20 ? -1 : 1);
534  int iix(_zside == 0 && ix > 20 ? ix - 20 : ix);
535  for(int iy = 1; iy <= 20; iy++){
536  if(!EcalScDetId::validDetId(iix, iy, zside)) continue;
537  uint32_t dIndex(EcalScDetId(iix, iy, zside).hashedIndex());
538  if(_zside == 1) dIndex -= EcalScDetId::SC_PER_EE_CNT;
539  binMap[dIndex] = ixmax / 5 * (iy - 1) + ix;
540  }
541  }
542  return &binMap;
543 
544  case kDCC:
545  {
546  int nEEDCC(kEEmHigh - kEEmLow + kEEpHigh - kEEpLow + 2);
547  if(_zside != 0) nEEDCC /= 2;
548  binMap.resize(nEEDCC); // DCCId (shifted) -> bin
549  for(int ix = 1; ix <= nEEDCC; ix++)
550  binMap[ix - 1] = (ix + 5) % 9 + 1 + 9 * ((ix - 1) / 9);
551  }
552  return &binMap;
553 
554  case kTCC:
555  {
556  int nEETCC(kEEmTCCHigh - kEEmTCCLow + kEEpTCCHigh - kEEpTCCLow + 2);
557  if(_zside != 0) nEETCC /= 2;
558  binMap.resize(nEETCC); // TCCId (shifted) -> bin
559  for(int ix = 1; ix <= nEETCC; ix++)
560  binMap[ix - 1] = ix;
561  }
562  return &binMap;
563 
564  case kProjEta:
565  {
566  if(_zside == 0) return 0;
567 
568  float binEdges[nEEEtaBins + 1];
569  if(_zside < 0){
570  for(int i(0); i <= nEEEtaBins; i++)
571  binEdges[i] = -3. + (3. - etaBound_) / nEEEtaBins * i;
572  }
573  else{
574  for(int i(0); i <= nEEEtaBins; i++)
575  binEdges[i] = etaBound_ + (3. - etaBound_) / nEEEtaBins * i;
576  }
577  binMap.resize(EEDetId::kEEhalf / 2); // EEDetId (half) -> bin
578  // Only a quadrant is really necessary, but the hashed index cannot be resolved for quadrants
579  for(int ix = 1; ix <= 100; ix++){
580  for(int iy = 1; iy <= 50; iy++){
581  if(!EEDetId::validDetId(ix, iy, _zside)) continue;
582  EEDetId eeid(ix, iy, _zside);
583  float eta(geometry_->getGeometry(eeid)->getPosition().eta());
584  float* pBin(std::upper_bound(binEdges, binEdges + nEEEtaBins + 1, eta));
585  uint32_t dIndex(eeid.hashedIndex());
586  if(_zside == 1) dIndex -= EEDetId::kEEhalf;
587  binMap[dIndex] = static_cast<int>(pBin - binEdges);
588  }
589  }
590  }
591  return &binMap;
592 
593  case kProjPhi:
594  {
595  if(_zside != 0) return 0;
596 
597  float binEdges[nPhiBins + 1];
598  for(int i(0); i <= nPhiBins; i++)
599  binEdges[i] = TMath::Pi() * (-1./18. + 2. / nPhiBins * i);
600  binMap.resize(EEDetId::kEEhalf); // EEDetId(-) -> bin
601  for(int ix = 1; ix <= 100; ix++){
602  for(int iy = 1; iy <= 100; iy++){
603  if(!EEDetId::validDetId(ix, iy, -1)) continue;
604  EEDetId eeid(ix, iy, -1);
605  float phi(geometry_->getGeometry(eeid)->getPosition().phi());
606  if(phi < -TMath::Pi() * 1./18.) phi += 2. * TMath::Pi();
607  float* pBin(std::upper_bound(binEdges, binEdges + nPhiBins + 1, phi));
608  uint32_t dIndex(eeid.hashedIndex());
609  binMap[dIndex] = static_cast<int>(pBin - binEdges);
610  }
611  }
612  }
613  return &binMap;
614 
615  default:
616  return 0;
617  }
618 }
619 
620 const std::vector<int>*
622 {
623  if(_bkey != kCrystal) return 0;
624 
625  std::vector<int>& binMap(binMaps_[kEEMEM][kCrystal]);
626 
627  binMap.resize((kEEmHigh - kEEmLow + kEEpHigh - kEEpLow + 2) * 10); // EcalPnDiodeDetId -> bin (see above)
628  int memIx(1);
629  int iEEDCC(-1);
630  int offset(0);
631  for(int iSM(kEEmLow); iSM <= kEEpHigh; iSM++){
632  iEEDCC++;
633  if (dccNoMEM.find(iSM) != dccNoMEM.end()) {
634  for (int ich(0); ich < 10; ich++)
635  binMap[iEEDCC * 10 + ich] = 0;
636  continue;
637  }
638  if (iSM == kEBmLow) {
639  iSM = kEEpLow;
640  offset = 10;
641  memIx = 1;
642  }
643  for(int iy = 1 + offset; iy <= 10 + offset; iy++){
644  int pnId(iy < 11 ? 11 - iy : iy - 10);
645  uint32_t dIndex(iEEDCC * 10 + pnId - 1);
646  binMap[dIndex] = 4 * (iy - 1) + memIx;
647  }
648  memIx++;
649  }
650 
651  return &binMap;
652 }
653 
654 const std::vector<int>*
656 {
657  int totalBins(0);
658 
659  std::vector<int>& binMap(binMaps_[kSM][_bkey]);
660 
661  switch(_bkey){
662  case kCrystal:
664  for (int iDCC(0); iDCC < nDCC; iDCC++) {
665  if(iDCC >= kEBmLow && iDCC <= kEBpHigh){
666  for(int ix = 1; ix <= nEBSMEta; ix++){
667  for(int iy = 1; iy <= nEBSMPhi; iy++){
668  int ieta(ix + xlow(iDCC));
669  int iphi(iy + ylow(iDCC));
670  if (iDCC >= kEBpLow){
671  iphi -= 1;
672  iphi *= -1;
673  }
674  else
675  ieta *= -1;
676 
677  uint32_t dIndex(EBDetId(ieta, iphi).hashedIndex() + EEDetId::kEEhalf);
678  binMap[dIndex] = totalBins + nEBSMEta * (iy - 1) + ix;
679  }
680  }
681  totalBins += nEBSMBins;
682  }
683  else{
684  std::vector<DetId> crystals(getElectronicsMap()->dccConstituents(iDCC + 1));
685  int nEEX(nEESMX), nEEBins(nEESMBins);
686  if(iDCC == kEEm02 || iDCC == kEEm08 || iDCC == kEEp02 || iDCC == kEEp08){
687  nEEX = nEESMXExt;
688  nEEBins = nEESMBinsExt;
689  }
690  for(std::vector<DetId>::iterator idItr(crystals.begin()); idItr != crystals.end(); ++idItr){
691  EEDetId id(*idItr);
692  uint32_t dIndex(id.hashedIndex());
693  int ix(id.ix() - xlow(iDCC));
694  int iy(id.iy() - ylow(iDCC));
695  if (id.zside() > 0)
697 
698  binMap[dIndex] = totalBins + nEEX * (iy - 1) + ix;
699  }
700  totalBins += nEEBins;
701  }
702  }
703  return &binMap;
704 
705  case kSuperCrystal:
706  binMap.resize(EcalTrigTowerDetId::kEBTotalTowers + EcalScDetId::kSizeForDenseIndexing); // EcalTrigTowerDetId / EcalScDetId -> bin
707 
708  for(int iSM(0); iSM < nDCC; iSM++){
709  if(iSM >= kEBmLow && iSM <= kEBpHigh){
710  for(int ix = 1; ix <= nEBSMEta; ix += 5){
711  for(int iy = 1; iy <= nEBSMPhi; iy += 5){
712  int ieta(ix + xlow(iSM));
713  int iphi(iy + ylow(iSM));
714  if(iSM >= kEBpLow){
715  iphi -= 1;
716  iphi *= -1;
717  }
718  else
719  ieta *= -1;
720  uint32_t dIndex(EBDetId(ieta, iphi).tower().hashedIndex());
721  binMap[dIndex + EcalScDetId::SC_PER_EE_CNT] = totalBins + nEBSMEta / 5 * (iy - 1) / 5 + (ix - 1) / 5 + 1;
722  }
723  }
724  totalBins += nEBSMBins / 25;
725  }
726  else{
727  int nEEX(nEESMX), nEEBins(nEESMBins);
728  if(iSM == kEEm02 || iSM == kEEm08 || iSM == kEEp02 || iSM == kEEp08){
729  nEEX = nEESMXExt;
730  nEEBins = nEESMBinsExt;
731  }
732  for (int ix(1); ix <= nEEX / 5; ix++) {
733  for (int iy(1); iy <= nEESMY / 5; iy++) {
734  int sciz(1);
735  if (iSM <= kEEmHigh) sciz = -1;
736  int scix(ix + xlow(iSM) / 5);
737  int sciy(iy + ylow(iSM) / 5);
738  if(scix <= 0 || scix > 20 || sciy <= 0 || sciy > 20) continue;
739  if(!EcalScDetId::validDetId(scix, sciy, sciz)) continue;
740  uint32_t dIndex(EcalScDetId(scix, sciy, sciz).hashedIndex());
741  if(sciz > 0) dIndex += EcalTrigTowerDetId::kEBTotalTowers;
742  binMap[dIndex] = totalBins + nEEX / 5 * (iy - 1) + ix;
743  }
744  }
745  totalBins += nEEBins / 25;
746  }
747  }
748  return &binMap;
749 
750  case kTriggerTower:
751  binMap.resize(EcalTrigTowerDetId::kEBTotalTowers + EEDetId::kSizeForDenseIndexing); // EcalTrigTowerDetId / EEDetId -> bin
752 
753  for(int iSM(0); iSM < nDCC; iSM++){
754  if(iSM >= kEBmLow && iSM <= kEBpHigh){
755  for(int ix = 1; ix <= nEBSMEta; ix += 5){
756  for(int iy = 1; iy <= nEBSMPhi; iy += 5){
757  int ieta(ix + xlow(iSM));
758  int iphi(iy + ylow(iSM));
759  if(iSM >= kEBpLow){
760  iphi -= 1;
761  iphi *= -1;
762  }
763  else
764  ieta *= -1;
765  uint32_t dIndex(EBDetId(ieta, iphi).tower().hashedIndex());
766  binMap[dIndex + EEDetId::kEEhalf] = totalBins + nEBSMEta / 5 * (iy - 1) / 5 + (ix - 1) / 5 + 1;
767  }
768  }
769  totalBins += nEBSMBins / 25;
770  }
771  else{
772  int nEEX(nEESMX), nEEBins(nEESMBins);
773  if(iSM == kEEm02 || iSM == kEEm08 || iSM == kEEp02 || iSM == kEEp08){
774  nEEX = nEESMXExt;
775  nEEBins = nEESMBinsExt;
776  }
777 
778  int tccid[4];
779  tccid[0] = ((iSM % 9) * 2 + 17) % 18 + 1;
780  tccid[1] = tccid[0] % 18 + 1;
781  tccid[2] = tccid[0] + 18;
782  tccid[3] = tccid[1] + 18;
783  if(iSM >= int(kEEpLow))
784  for(int i(0); i < 4; i++) tccid[i] += kEEpTCCLow;
785  for(int it(0); it < 4; it++){
786  std::vector<DetId> crystals(getElectronicsMap()->tccConstituents(tccid[it]));
787  for(std::vector<DetId>::iterator idItr(crystals.begin()); idItr != crystals.end(); ++idItr){
788  EEDetId id(*idItr);
789  uint32_t dIndex(id.hashedIndex());
790  int ix(id.ix() - xlow(iSM));
791  int iy(id.iy() - ylow(iSM));
792  if (id.zside() > 0)
794 
795  binMap[dIndex] = totalBins + nEEX * (iy - 1) + ix;
796  }
797  }
798  totalBins += nEEBins;
799  }
800  }
801  return &binMap;
802 
803  default:
804  return 0;
805  }
806 }
807 
808 const std::vector<int>*
810 {
811  if(_bkey != kCrystal) return 0;
812 
813  int totalBins(0);
814 
815  std::vector<int>& binMap(binMaps_[kSMMEM][_bkey]);
816 
817  binMap.resize(nDCC * 10); // EcalPnDiodeDetId -> bin (see above)
818  for(int iSM(0); iSM < nDCC; iSM++){
819  if (dccNoMEM.find(iSM) != dccNoMEM.end()) {
820  for (int ich(0); ich < 10; ich++)
821  binMap[iSM * 10 + ich] = 0;
822  continue;
823  }
824  for(int ix = 1; ix <= 10; ix++){
825  int pnId(iSM <= kEBmHigh ? 11 - ix : ix);
826  uint32_t dIndex(iSM * 10 + pnId - 1);
827  binMap[dIndex] = totalBins + ix;
828  }
829 
830  totalBins += 10;
831  }
832 
833  return &binMap;
834 }
835 
836 const std::vector<int>*
838 {
839  std::vector<int>& binMap(binMaps_[kEcal][_bkey]);
840 
841  switch(_bkey){
842  case kCrystal:
843  binMap.resize(EBDetId::kSizeForDenseIndexing + EEDetId::kSizeForDenseIndexing); // DetId -> bin
844  for(int ix = 1; ix <= 360; ix++){
845  for(int iy = 101; iy <= 270; iy++){
846  uint32_t dIndex(EBDetId(iy < 186 ? iy - 186 : iy - 185, ix).hashedIndex() + EEDetId::kEEhalf);
847  binMap[dIndex] = 360 * (iy - 1) + ix ;
848  }
849  }
850  for(int ix = 1; ix <= 200; ix++){
851  int iix(ix > 100 ? ix - 100 : ix);
852  int zside(ix > 100 ? 1 : -1);
853  for(int iy = 1; iy <= 100; iy++){
854  if(!EEDetId::validDetId(iix, iy, zside)) continue;
855  uint32_t dIndex(EEDetId(iix, iy, zside).hashedIndex());
856  if(zside == 1) dIndex += EBDetId::kSizeForDenseIndexing;
857  binMap[dIndex] = 360 * (iy - 1) + ix;
858  }
859  }
860  return &binMap;
861 
862  case kSuperCrystal:
863  binMap.resize(EcalTrigTowerDetId::kEBTotalTowers + EcalScDetId::kSizeForDenseIndexing); // EcalTrigTowerDetId -> bin
864  for(int ix = 1; ix <= 72; ix++){
865  for(int iy = 21; iy <= 54; iy++){
866  int ieta(iy < 38 ? (iy - 38) * 5 : (iy - 37) * 5);
867  int iphi(ix * 5);
868  uint32_t dIndex(EBDetId(ieta, iphi).tower().hashedIndex() + EcalScDetId::SC_PER_EE_CNT);
869  binMap[dIndex] = 72 * (iy - 1) + ix;
870  }
871  }
872  for(int ix = 1; ix <= 40; ix++){
873  int iix((ix - 1) % 20 + 1);
874  int zside(ix > 20 ? 1 : -1);
875  for(int iy = 1; iy <= 20; iy++){
876  if(!EcalScDetId::validDetId(iix, iy, zside)) continue;
877  uint32_t dIndex(EcalScDetId(iix, iy, zside).hashedIndex());
878  if(zside == 1) dIndex += EcalTrigTowerDetId::kEBTotalTowers;
879  binMap[dIndex] = 72 * (iy - 1) + ix;
880  }
881  }
882  return &binMap;
883 
884  case kProjEta:
885  {
886  float binEdges[nEBEtaBins + 2 * nEEEtaBins + 1];
887  for(int i(0); i <= nEEEtaBins; i++)
888  binEdges[i] = -3. + (3. - etaBound_) / nEEEtaBins * i;
889  for(int i(1); i <= nEBEtaBins; i++)
890  binEdges[i + nEEEtaBins] = -etaBound_ + 2. * etaBound_ / nEBEtaBins * i;
891  for(int i(1); i <= nEEEtaBins; i++)
892  binEdges[i + nEEEtaBins + nEBEtaBins] = etaBound_ + (3. - etaBound_) / nEEEtaBins * i;
893 
894  float* lowEdge(binEdges);
895  binMap.resize(170 + EEDetId::kEEhalf); // EEDetId (half) -> bin
896  for(int ix = 1; ix <= 100; ix++){
897  for(int iy = 1; iy <= 50; iy++){
898  if(!EEDetId::validDetId(ix, iy, -1)) continue;
899  EEDetId eeid(ix, iy, -1);
900  float eta(geometry_->getGeometry(eeid)->getPosition().eta());
901  float* pBin(std::upper_bound(lowEdge, lowEdge + nEEEtaBins + 1, eta));
902  uint32_t dIndex(eeid.hashedIndex());
903  binMap[dIndex] = static_cast<int>(pBin - binEdges);
904  }
905  }
906  lowEdge += nEEEtaBins;
907  for(int ieta(-85); ieta <= 85; ieta++){
908  if(ieta == 0) continue;
909  EBDetId ebid(ieta, 1);
910  float eta(geometry_->getGeometry(ebid)->getPosition().eta());
911  float* pBin(std::upper_bound(lowEdge, lowEdge + nEBEtaBins + 1, eta));
912  uint32_t dIndex(ieta < 0 ? ieta + 85 : ieta + 84);
913  dIndex += EEDetId::kEEhalf / 2;
914  binMap[dIndex] = static_cast<int>(pBin - binEdges);
915  }
916  lowEdge += nEBEtaBins;
917  for(int ix = 1; ix <= 100; ix++){
918  for(int iy = 1; iy <= 50; iy++){
919  if(!EEDetId::validDetId(ix, iy, 1)) continue;
920  EEDetId eeid(ix, iy, 1);
921  float eta(geometry_->getGeometry(eeid)->getPosition().eta());
922  float* pBin(std::upper_bound(lowEdge, lowEdge + nEEEtaBins + 1, eta));
923  uint32_t dIndex(eeid.hashedIndex() - EEDetId::kEEhalf / 2 + 170);
924  binMap[dIndex] = static_cast<int>(pBin - binEdges);
925  }
926  }
927  }
928  return &binMap;
929 
930  case kProjPhi:
931  {
932  float binEdges[nPhiBins + 1];
933  for(int i(0); i <= nPhiBins; i++)
934  binEdges[i] = TMath::Pi() * (-1./18. + 2. / nPhiBins * i);
935  binMap.resize(360 + EEDetId::kEEhalf); // EEDetId(-) -> bin
936  for(int ix = 1; ix <= 100; ix++){
937  for(int iy = 1; iy <= 100; iy++){
938  if(!EEDetId::validDetId(ix, iy, -1)) continue;
939  EEDetId eeid(ix, iy, -1);
940  float phi(geometry_->getGeometry(eeid)->getPosition().phi());
941  if(phi < -TMath::Pi() * 1./18.) phi += 2. * TMath::Pi();
942  float* pBin(std::upper_bound(binEdges, binEdges + nPhiBins + 1, phi));
943  uint32_t dIndex(eeid.hashedIndex());
944  binMap[dIndex] = static_cast<int>(pBin - binEdges);
945  }
946  }
947  for(int iphi(1); iphi <= 360; iphi++){
948  EBDetId ebid(1, iphi);
949  float phi(geometry_->getGeometry(ebid)->getPosition().phi());
950  if(phi < -TMath::Pi() * 1./18.) phi += 2. * TMath::Pi();
951  float* pBin(std::upper_bound(binEdges, binEdges + nPhiBins + 1, phi));
952  uint32_t dIndex(iphi - 1 + EEDetId::kEEhalf);
953  binMap[dIndex] = static_cast<int>(pBin - binEdges);
954  }
955  }
956  return &binMap;
957 
958  case kTCC:
959  binMap.resize(nTCC);
960  for(int ix = 1; ix <= nTCC; ix++)
961  binMap[ix - 1] = ix;
962  return &binMap;
963 
964  case kDCC:
965  binMap.resize(nDCC);
966  for(int ix(kEEmLow); ix <= kEEpHigh; ix++)
967  binMap[ix] = ix + 1;
968  return &binMap;
969 
970  default:
971  return 0;
972  }
973 }
974 
975 void
976 EcalDQMBinningService::findBinsCrystal_(const DetId& _id, ObjectType _okey, const std::vector<int>& _binMap, std::vector<int>& _bins) const
977 {
978  using namespace std;
979 
980  bool fullRange(_okey == kSM || _okey == kEcal);
981 
982  switch(_id.subdetId()){
983  case EcalBarrel:
984  {
985  unsigned index(EBDetId(_id).denseIndex());
986  if(fullRange) index += EEDetId::kEEhalf;
987  if(index < _binMap.size()) _bins.push_back(_binMap[index]);
988  break;
989  }
990  case EcalEndcap:
991  if(isEcalScDetId(_id)){
992  pair<int, int> dccSc(getElectronicsMap()->getDCCandSC(EcalScDetId(_id)));
993  vector<DetId> detIds(getElectronicsMap()->dccTowerConstituents(dccSc.first, dccSc.second));
994  for(vector<DetId>::iterator idItr(detIds.begin()); idItr != detIds.end(); ++idItr) {
995  EEDetId eeid(*idItr);
996  unsigned index(eeid.denseIndex());
997  if(eeid.zside() > 0) {
998  if(fullRange) index += EBDetId::kSizeForDenseIndexing;
999  else if(_okey == kEEp) index -= EEDetId::kEEhalf;
1000  }
1001  if(index < _binMap.size()) _bins.push_back(_binMap[index]);
1002  }
1003  }
1004  else{
1005  EEDetId eeid(_id);
1006  unsigned index(eeid.denseIndex());
1007  if(eeid.zside() > 0) {
1008  if(fullRange) index += EBDetId::kSizeForDenseIndexing;
1009  else if(_okey == kEEp) index -= EEDetId::kEEhalf;
1010  }
1011  if(index < _binMap.size()) _bins.push_back(_binMap[index]);
1012  }
1013  break;
1014  case EcalTriggerTower:
1015  {
1016  EcalTrigTowerDetId ttid(_id);
1017  vector<DetId> detIds(getTrigTowerMap()->constituentsOf(ttid));
1018  for(vector<DetId>::iterator idItr(detIds.begin()); idItr != detIds.end(); ++idItr) {
1019  if(idItr->subdetId() == EcalBarrel) {
1020  unsigned index(EBDetId(*idItr).denseIndex());
1021  if(fullRange) index += EEDetId::kEEhalf;
1022  if(index < _binMap.size()) _bins.push_back(_binMap[index]);
1023  }
1024  else {
1025  EEDetId eeid(*idItr);
1026  unsigned index(eeid.denseIndex());
1027  if(eeid.zside() > 0) {
1028  if(fullRange) index += EBDetId::kSizeForDenseIndexing;
1029  else if(_okey == kEEp) index -= EEDetId::kEEhalf;
1030  }
1031  if (index < _binMap.size()) _bins.push_back(_binMap[index]);
1032  }
1033  }
1034  break;
1035  }
1036  case EcalLaserPnDiode:
1037  {
1038  EcalPnDiodeDetId pnid(_id);
1039  int iDCC(pnid.iDCCId() - 1);
1040  unsigned index(iDCC * 10 + pnid.iPnId());
1041  if(_okey == kEBMEM) index -= kEEmHigh * 10;
1042  else if(_okey == kEEMEM && iDCC >= kEEpLow) index -= (kEEpLow - kEBmLow) * 10;
1043  if(index < _binMap.size()) _bins.push_back(_binMap[index]);
1044  break;
1045  }
1046  default:
1047  break;
1048  }
1049 }
1050 
1051 void
1052 EcalDQMBinningService::findBinsTriggerTower_(const DetId& _id, ObjectType _okey, const std::vector<int>& _binMap, std::vector<int>& _bins) const
1053 {
1054  using namespace std;
1055 
1056  switch(_id.subdetId()){
1057  case EcalBarrel:
1058  {
1059  EcalTrigTowerDetId ttid(EBDetId(_id).tower());
1060  unsigned index(ttid.hashedIndex() + EEDetId::kEEhalf);
1061  if(index < _binMap.size()) _bins.push_back(_binMap[index]);
1062  break;
1063  }
1064  case EcalEndcap:
1065  if(!isEcalScDetId(_id)){
1066  vector<DetId> detIds(getTrigTowerMap()->constituentsOf(getTrigTowerMap()->towerOf(_id)));
1067  for(vector<DetId>::iterator idItr(detIds.begin()); idItr != detIds.end(); ++idItr){
1068  EEDetId eeid(*idItr);
1069  unsigned index(eeid.denseIndex());
1071  if(index < _binMap.size()) _bins.push_back(_binMap[index]);
1072  }
1073  break;
1074  }
1075  case EcalTriggerTower:
1076  {
1077  EcalTrigTowerDetId ttid(_id);
1078  if(ttid.subDet() == EcalBarrel){
1079  unsigned index(ttid.hashedIndex() + EEDetId::kEEhalf);
1080  if(index < _binMap.size()) _bins.push_back(_binMap[index]);
1081  }
1082  else{
1083  vector<DetId> detIds(getTrigTowerMap()->constituentsOf(ttid));
1084  for(vector<DetId>::iterator idItr(detIds.begin()); idItr != detIds.end(); ++idItr){
1085  EEDetId eeid(*idItr);
1086  unsigned index(eeid.denseIndex());
1088  if(index < _binMap.size()) _bins.push_back(_binMap[index]);
1089  }
1090  }
1091  break;
1092  }
1093  default:
1094  break;
1095  }
1096 
1097 }
1098 
1099 void
1100 EcalDQMBinningService::findBinsSuperCrystal_(const DetId& _id, ObjectType _okey, const std::vector<int>& _binMap, std::vector<int>& _bins) const
1101 {
1102  bool fullRange(_okey == kSM || _okey == kEcal);
1103 
1104  switch(_id.subdetId()){
1105  case EcalBarrel:
1106  {
1107  unsigned index(EBDetId(_id).tower().denseIndex());
1108  if(fullRange) index += EcalScDetId::SC_PER_EE_CNT;
1109  if(index < _binMap.size()) _bins.push_back(_binMap[index]);
1110  break;
1111  }
1112  case EcalEndcap:
1113  {
1114  int zside(0);
1115  unsigned index;
1116  if (isEcalScDetId(_id)) {
1117  EcalScDetId scid(_id);
1118  zside = scid.zside();
1119  index = scid.denseIndex();
1120  }
1121  else {
1122  EEDetId eeid(_id);
1123  zside = eeid.zside();
1124  index = eeid.sc().denseIndex();
1125  }
1126  if(zside > 0) {
1127  if(fullRange) index += EcalTrigTowerDetId::kEBTotalTowers;
1128  else if(_okey == kEEp) index -= EcalScDetId::SC_PER_EE_CNT;
1129  }
1130  if(index < _binMap.size()) _bins.push_back(_binMap[index]);
1131  break;
1132  }
1133  case EcalTriggerTower: // btype == kSuperCrystal && subdet == EcalTriggerTower => only happens for EB
1134  {
1135  EcalTrigTowerDetId ttid(_id);
1136  unsigned index(ttid.denseIndex());
1137  if(fullRange) index += EcalScDetId::SC_PER_EE_CNT;
1138  if(index < _binMap.size()) _bins.push_back(_binMap[index]);
1139  break;
1140  }
1141  default:
1142  break;
1143  }
1144 }
1145 void
1146 EcalDQMBinningService::findBinsDCC_(const DetId& _id, ObjectType _okey, const std::vector<int>& _binMap, std::vector<int>& _bins) const
1147 {
1148  unsigned index(dccId(_id) - 1);
1149  if(_okey == kEB) index -= kEBmLow;
1150  else if(_okey == kEE && index >= kEEpLow) index -= (kEBpHigh - kEEmHigh);
1151  else if(_okey == kEEp) index -= kEEpLow;
1152  if(index < _binMap.size()) _bins.push_back(_binMap[index]);
1153 }
1154 
1155 void
1156 EcalDQMBinningService::findBinsTCC_(const DetId& _id, ObjectType _okey, const std::vector<int>& _binMap, std::vector<int>& _bins) const
1157 {
1158  unsigned index(tccId(_id) - 1);
1159  if(_okey == kEB) index -= kEBTCCLow;
1160  else if(_okey == kEE && index >= kEEpLow) index -= (kEBTCCHigh - kEEmTCCHigh);
1161  else if(_okey == kEEp) index -= kEEpTCCLow;
1162  if(index < _binMap.size()) _bins.push_back(_binMap[index]);
1163 }
1164 
1165 void
1166 EcalDQMBinningService::findBinsProjEta_(const DetId& _id, ObjectType _okey, const std::vector<int>& _binMap, std::vector<int>& _bins) const
1167 {
1168  using namespace std;
1169 
1170  switch(_id.subdetId()){
1171  case EcalBarrel:
1172  {
1173  EBDetId ebid(_id);
1174  unsigned index(ebid.ieta() < 0 ? ebid.ieta() + 85 : ebid.ieta() + 84);
1175  if(_okey == kEcal) index += EEDetId::kEEhalf / 2;
1176  if(index < _binMap.size()) _bins.push_back(_binMap[index]);
1177  break;
1178  }
1179  case EcalEndcap:
1180  if(!isEcalScDetId(_id)){
1181  EEDetId eeid(_id);
1182  if(eeid.iquadrant() < 3)
1183  eeid = EEDetId(eeid.ix(), 101 - eeid.iy(), eeid.zside());
1184  unsigned index(eeid.denseIndex());
1185  if(_okey == kEEp) index -= EEDetId::kEEhalf;
1186  else if(_okey == kEcal && eeid.zside() > 0) index += 170 - EEDetId::kEEhalf / 2;
1187  if(index < _binMap.size()) _bins.push_back(_binMap[index]);
1188  break;
1189  }
1190  case EcalTriggerTower:
1191  {
1192  EcalTrigTowerDetId ttid(_id);
1193  vector<DetId> detIds(getTrigTowerMap()->constituentsOf(ttid));
1194  set<int> binset;
1195  if(ttid.subDet() == EcalBarrel){
1196  for(vector<DetId>::iterator idItr(detIds.begin()); idItr != detIds.end(); ++idItr){
1197  EBDetId ebid(*idItr);
1198  unsigned index(ebid.ieta() < 0 ? ebid.ieta() + 85 : ebid.ieta() + 84);
1199  if(_okey == kEcal) index += EEDetId::kEEhalf / 2;
1200  if(index < _binMap.size()) binset.insert(_binMap[index]);
1201  }
1202  }
1203  else{
1204  for(vector<DetId>::iterator idItr(detIds.begin()); idItr != detIds.end(); ++idItr){
1205  EEDetId eeid(*idItr);
1206  if(eeid.iquadrant() < 3)
1207  eeid = EEDetId(eeid.ix(), eeid.iy() <= 50 ? eeid.iy() : 101 - eeid.iy(), eeid.zside());
1208  unsigned index(eeid.denseIndex());
1209  if(_okey == kEEp) index -= EEDetId::kEEhalf;
1210  else if(_okey == kEcal && eeid.zside() > 0) index += 170 - EEDetId::kEEhalf / 2;
1211  if(index < _binMap.size()) binset.insert(_binMap[index]);
1212  }
1213  }
1214  for(set<int>::iterator binItr(binset.begin()); binItr != binset.end(); ++binItr)
1215  _bins.push_back(*binItr);
1216  break;
1217  }
1218  default:
1219  break;
1220  }
1221 }
1222 
1223 void
1224 EcalDQMBinningService::findBinsProjPhi_(const DetId& _id, ObjectType _okey, const std::vector<int>& _binMap, std::vector<int>& _bins) const
1225 {
1226  using namespace std;
1227 
1228  switch(_id.subdetId()){
1229  case EcalBarrel:
1230  {
1231  EBDetId ebid(_id);
1232  unsigned index(ebid.iphi() - 1);
1233  if(_okey == kEcal) index += EEDetId::kEEhalf;
1234  if(index < _binMap.size()) _bins.push_back(_binMap[index]);
1235  break;
1236  }
1237  case EcalEndcap:
1238  if(!isEcalScDetId(_id)){
1239  EEDetId eeid(_id);
1240  unsigned index(eeid.denseIndex());
1241  if(eeid.zside() > 0) index -= EEDetId::kEEhalf;
1242  if(index < _binMap.size()) _bins.push_back(_binMap[index]);
1243  break;
1244  }
1245  case EcalTriggerTower:
1246  {
1247  EcalTrigTowerDetId ttid(_id);
1248  vector<DetId> detIds(getTrigTowerMap()->constituentsOf(ttid));
1249  set<int> binset;
1250  if(ttid.subDet() == EcalBarrel){
1251  for(vector<DetId>::iterator idItr(detIds.begin()); idItr != detIds.end(); ++idItr){
1252  EBDetId ebid(*idItr);
1253  unsigned index(ebid.iphi() - 1);
1254  if(_okey == kEcal) index += EEDetId::kEEhalf;
1255  if(index < _binMap.size()) binset.insert(_binMap[index]);
1256  }
1257  }
1258  else{
1259  for(vector<DetId>::iterator idItr(detIds.begin()); idItr != detIds.end(); ++idItr){
1260  EEDetId eeid(*idItr);
1261  unsigned index(eeid.denseIndex());
1262  if(eeid.zside() > 0) index -= EEDetId::kEEhalf;
1263  if(index < _binMap.size()) binset.insert(_binMap[index]);
1264  }
1265  }
1266  for(set<int>::iterator binItr(binset.begin()); binItr != binset.end(); ++binItr)
1267  _bins.push_back(*binItr);
1268  break;
1269  }
1270  default:
1271  break;
1272  }
1273 }
const double Pi
static bool validDetId(int ix, int iy, int iz)
Definition: EcalScDetId.cc:64
std::vector< AxisSpecs > getBinningEBMEM_(BinningType, bool) const
const std::vector< int > * getBinMapSMMEM_(BinningType) const
int i
Definition: DBlmapReader.cc:9
std::vector< AxisSpecs > getBinningEcal_(BinningType, bool) const
static const int SC_PER_EE_CNT
Definition: EcalScDetId.h:144
const EcalElectronicsMapping * getElectronicsMap()
int ix() const
Definition: EEDetId.h:76
void findBinsDCC_(const DetId &, ObjectType, const std::vector< int > &, std::vector< int > &) const
std::vector< DetId > dccConstituents(int dccId) const
Get the constituent detids for this dccId.
const std::vector< int > * getBinMapEcal_(BinningType) const
int hashedIndex() const
get a compact index for arrays [TODO: NEEDS WORK]
int iquadrant() const
Definition: EEDetId.cc:264
unsigned dccId(const DetId &)
std::vector< AxisSpecs > getBinningSMMEM_(BinningType, bool, unsigned) const
T eta() const
void findBinsTCC_(const DetId &, ObjectType, const std::vector< int > &, std::vector< int > &) const
const std::vector< int > * getBinMapEE_(BinningType, int) const
uint32_t denseIndex() const
Definition: EcalScDetId.h:127
int iphi() const
get the crystal iphi
Definition: EBDetId.h:53
const std::vector< int > * getBinMapEEMEM_(BinningType) const
void findBinsProjPhi_(const DetId &, ObjectType, const std::vector< int > &, std::vector< int > &) const
void findBinsCrystal_(const DetId &, ObjectType, const std::vector< int > &, std::vector< int > &) const
int iPnId() const
get the PnId
int hashedIndex(int ieta, int iphi)
Definition: EcalPyUtils.cc:42
void findBinsSuperCrystal_(const DetId &, ObjectType, const std::vector< int > &, std::vector< int > &) const
std::vector< AxisSpecs > getBinningEE_(BinningType, bool, int) const
const std::vector< int > * getBinMapSM_(BinningType) const
int zside() const
Definition: EEDetId.h:70
std::vector< AxisSpecs > getBinningEB_(BinningType, bool) const
int iy() const
Definition: EEDetId.h:82
int ieta() const
get the crystal ieta
Definition: EBDetId.h:51
unsigned int offset(bool)
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:37
int iDCCId() const
get the DCCId
bool isEcalScDetId(const DetId &_id)
const std::set< unsigned > dccNoMEM
const std::vector< int > * getBinMapEB_(BinningType) const
Definition: DetId.h:18
int hashedIndex() const
Definition: EEDetId.h:182
unsigned getNSuperCrystals(unsigned)
static bool validDetId(int crystal_ix, int crystal_iy, int iz)
Definition: EEDetId.h:248
EcalScDetId sc() const
Definition: EEDetId.h:88
int zside() const
Definition: EcalScDetId.h:65
uint32_t denseIndex() const
const std::vector< int > * getBinMapEBMEM_(BinningType) const
const EcalTrigTowerConstituentsMap * getTrigTowerMap()
unsigned tccId(const DetId &)
uint32_t denseIndex() const
Definition: EEDetId.h:192
EcalSubdetector subDet() const
get the subDetector associated to the Trigger Tower
void findBinsTriggerTower_(const DetId &, ObjectType, const std::vector< int > &, std::vector< int > &) const
std::vector< AxisSpecs > getBinningSM_(BinningType, bool, unsigned) const
uint32_t denseIndex() const
Definition: EBDetId.h:88
void findBinsProjEta_(const DetId &, ObjectType, const std::vector< int > &, std::vector< int > &) const
std::vector< AxisSpecs > getBinningEEMEM_(BinningType, bool) const
Definition: DDAxes.h:10