CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
GeometryHelper.cc
Go to the documentation of this file.
2 
3 #include <utility>
4 
5 #include "TH1.h"
6 
15 
16 namespace ecaldqm {
17 
18  std::map<std::string, MeInfo> MeInfoMap::infos;
19 
20  void
22  {
23 
24  if( !me ) return;
25 
26  MeInfo info;
27  info.otype = otype;
28  info.btype = btype;
29  info.ism = ism;
30 
32 
33  }
34 
35  const MeInfo *
37  {
38  if( !me ) return NULL;
39 
40  std::map<std::string, MeInfo>::const_iterator it = MeInfoMap::infos.find( me->getFullname() );
41 
42  if( it == MeInfoMap::infos.end() ) return NULL;
43 
44  return &(it->second);
45  }
46 
48  bookME(DQMStore *dqmStore, const std::string &name, const std::string &title, const std::string &className, ObjectType otype, BinningType btype, int ism, double lowZ, double highZ, const char *option)
49  {
50  if( !dqmStore ) return NULL;
51 
52  if( className != "TH2F" && className != "TProfile2D" ) return NULL;
53 
54  Double_t xmin, ymin;
55  Double_t xmax, ymax;
56 
57  xmin = ymin = 0.;
58  xmax = ymax = 0.;
59 
60  switch(otype){
61  case kFullEE:
62  xmax = 200.;
63  ymax = 100.;
64  break;
65  case kEEp:
66  case kEEm:
67  xmax = 100.;
68  ymax = 100.;
69  break;
70  case kEEpFar:
71  case kEEmFar:
72  xmin = 50.;
73  xmax = 100.;
74  ymax = 100.;
75  break;
76  case kEEpNear:
77  case kEEmNear:
78  xmax = 50.;
79  ymax = 100.;
80  break;
81  case kSM:
82  xmin = Numbers::ix0EE(ism);
83  xmax = xmin + 50;
84  ymin = Numbers::iy0EE(ism);
85  ymax = ymin + 50;
86  break;
87  }
88 
89  Int_t nBinsX, nBinsY;
90 
91  switch(btype){
92  case kCrystal:
93  case kTriggerTower:
94  nBinsX = (Int_t)(xmax - xmin);
95  nBinsY = (Int_t)(ymax - ymin);
96  break;
97  case kSuperCrystal:
98  nBinsX = (Int_t)(xmax - xmin) / 5;
99  nBinsY = (Int_t)(ymax - ymin) / 5;
100  break;
101  default:
102  nBinsX = nBinsY = 0;
103  break;
104  }
105 
106  MonitorElement *me;
107 
108  if( className == "TH2F" )
109  me = dqmStore->book2D(name, title, nBinsX, xmin, xmax, nBinsY, ymin, ymax);
110  else
111  me = dqmStore->bookProfile2D(name, title, nBinsX, xmin, xmax, nBinsY, ymin, ymax, lowZ, highZ);
112 
113  MeInfoMap::set( me, otype, btype, ism );
114 
115  return me;
116  }
117 
118  void
119  fillME(MonitorElement *me, const EEDetId &id, double wz, double wprof)
120  {
121 
122  if( !me ) return;
123 
124  const MeInfo *info = MeInfoMap::get( me );
125 
126  if( !info ) return;
127 
128  if(info->btype == kCrystal){
129 
130  float x = id.ix() - 0.5;
131  float y = id.iy() - 0.5;
132  if( info->otype == kSM && id.zside() < 0 ) x = 100 - x;
133  if( info->otype == kFullEE && id.zside() > 0 ) x += 100;
134 
135  if( me->kind() == MonitorElement::DQM_KIND_TH2F ) me->Fill( x, y, wz );
136  else if( me->kind() == MonitorElement::DQM_KIND_TPROFILE2D ) me->Fill( x, y, wz, wprof );
137  return;
138 
139  }else if(info->btype == kSuperCrystal){
140 
141  EcalScDetId scid( Numbers::getEcalScDetId( id ) );
142  fillME( me, scid, wz, wprof );
143  return;
144 
145  }else if(info->btype == kTriggerTower){
146 
149  EcalTrigTowerDetId ttid( map->getTrigTowerDetId( teid.tccId(), teid.ttId() ) );
150  fillME( me, ttid, wz, wprof );
151  return;
152 
153  }
154 
155  }
156 
157  void
158  fillME(MonitorElement *me, const EcalScDetId &id, double wz, double wprof)
159  {
160 
161  if( !me ) return;
162 
163  const MeInfo *info = MeInfoMap::get( me );
164 
165  if( !info ) return;
166 
167  if(info->btype == kCrystal){
168 
170  std::pair<int,int> p = map->getDCCandSC( id );
171  std::vector<DetId> vcry = map->dccTowerConstituents( p.first, p.second );
172  for(unsigned u = 0; u < vcry.size(); u++){
173  EEDetId cid( vcry[u] );
174 
175  float x = cid.ix() - 0.5;
176  float y = cid.iy() - 0.5;
177  if( info->otype == kSM && cid.zside() < 0 ) x = 100 - x;
178  if( info->otype == kFullEE && cid.zside() > 0 ) x += 100;
179 
180  if( me->kind() == MonitorElement::DQM_KIND_TH2F ) me->Fill( x, y, wz );
181  else if( me->kind() == MonitorElement::DQM_KIND_TPROFILE2D ) me->Fill( x, y, wz, wprof );
182 
183  }
184  return;
185 
186  }else if(info->btype == kSuperCrystal){
187 
188  float x = id.ix() * 5 - 2.5;
189  float y = id.iy() * 5 - 2.5;
190  if( info->otype == kSM && id.zside() < 0 ) x = 100 - x;
191  if( info->otype == kFullEE && id.zside() > 0 ) x += 100;
192 
193  if( me->kind() == MonitorElement::DQM_KIND_TH2F ) me->Fill( x, y, wz );
194  else if( me->kind() == MonitorElement::DQM_KIND_TPROFILE2D ) me->Fill( x, y, wz, wprof );
195  return;
196 
197  }
198 
199  }
200 
201  void
202  fillME(MonitorElement *me, const EcalTrigTowerDetId &id, double wz, double wprof)
203  {
204 
205  if( !me ) return;
206 
207  const MeInfo *info = MeInfoMap::get( me );
208 
209  if( !info ) return;
210 
211  if(info->btype == kTriggerTower || info->btype == kCrystal){
212 
213  std::vector<DetId> vcry = *( Numbers::crystals( id ) );
214  for(unsigned u = 0; u < vcry.size(); u++){
215  EEDetId cid( vcry[u] );
216 
217  float x = cid.ix() - 0.5;
218  float y = cid.iy() - 0.5;
219  if( info->otype == kSM && cid.zside() < 0 ) x = 100 - x;
220  if( info->otype == kFullEE && cid.zside() > 0 ) x += 100;
221 
222  if( me->kind() == MonitorElement::DQM_KIND_TH2F ) me->Fill( x, y, wz );
223  else if( me->kind() == MonitorElement::DQM_KIND_TPROFILE2D ) me->Fill( x, y, wz, wprof );
224  }
225  return;
226 
227  }
228 
229  }
230 
231  int
233  {
234  if( !me ) return -1;
235  int kind = me->kind();
236  if( kind < MonitorElement::DQM_KIND_TH2F ||
238  kind == MonitorElement::DQM_KIND_TH3F ) return -1;
239 
240  const MeInfo *info = MeInfoMap::get( me );
241  if( !info ) return -1;
242 
243  int ix = id.ix();
244  int iy = id.iy();
245  int zside = id.zside();
246  int nx;
247  int ism = info->ism;
248 
249  if(info->otype == kSM){
250 
251  if(zside > 0){
252  ix -= Numbers::ix0EE(ism);
253  iy -= Numbers::iy0EE(ism);
254  }else{
255  ix = 101 - ix - Numbers::ix0EE(ism);
256  iy -= Numbers::iy0EE(ism);
257  }
258  nx = 50;
259 
260  }else{
261 
262  switch(info->otype){
263  case kFullEE:
264  if(zside > 0) ix += 100;
265  nx = 200;
266  break;
267  case kEEp:
268  if(zside < 0) return -1;
269  nx = 100;
270  break;
271  case kEEm:
272  if(zside > 0) return -1;
273  nx = 100;
274  break;
275  case kEEpFar:
276  if(zside < 0 || ix > 50) return -1;
277  nx = 50;
278  break;
279  case kEEpNear:
280  if(zside < 0 || ix < 51) return -1;
281  ix -= 50;
282  nx = 50;
283  break;
284  case kEEmFar:
285  if(zside > 0 || ix > 50) return -1;
286  nx = 50;
287  break;
288  case kEEmNear:
289  if(zside > 0 || ix < 51) return -1;
290  ix -= 50;
291  nx = 50;
292  break;
293  default:
294  return -1;
295  }
296 
297  }
298 
299  int scale = info->btype == kSuperCrystal ? 5 : 1;
300  ix = (ix - 1) / scale + 1;
301  iy = (iy - 1) / scale + 1;
302  nx = nx / scale;
303 
304  return iy * (nx + 2) + ix;
305  }
306 
307  int
309  {
310  if( !me ) return -1;
311  int kind = me->kind();
312  if( kind < MonitorElement::DQM_KIND_TH2F ||
314  kind == MonitorElement::DQM_KIND_TH3F ) return -1;
315 
316  const MeInfo *info = MeInfoMap::get( me );
317  if( !info ) return -1;
318 
319  if(info->btype != kSuperCrystal) return -1;
320 
321  int ix = id.ix();
322  int iy = id.iy();
323  int zside = id.zside();
324  int nx;
325  int ism = info->ism;
326 
327  if(info->otype == kSM){
328 
329  if(zside > 0){
330  ix -= Numbers::ix0EE(ism) / 5;
331  iy -= Numbers::iy0EE(ism) / 5;
332  }else{
333  ix = 21 - ix - Numbers::ix0EE(ism) / 5;
334  iy -= Numbers::iy0EE(ism) / 5;
335  }
336  nx = 10;
337 
338  }else{
339 
340  switch(info->otype){
341  case kFullEE:
342  if(zside > 0) ix += 20;
343  nx = 40;
344  break;
345  case kEEp:
346  if(zside < 0) return -1;
347  nx = 20;
348  break;
349  case kEEm:
350  if(zside > 0) return -1;
351  nx = 20;
352  break;
353  case kEEpFar:
354  if(zside < 0 || ix > 10) return -1;
355  nx = 10;
356  break;
357  case kEEpNear:
358  if(zside < 0 || ix < 11) return -1;
359  ix -= 10;
360  nx = 10;
361  break;
362  case kEEmFar:
363  if(zside > 0 || ix > 10) return -1;
364  nx = 10;
365  break;
366  case kEEmNear:
367  if(zside > 0 || ix < 11) return -1;
368  ix -= 10;
369  nx = 10;
370  break;
371  default:
372  return -1;
373  }
374 
375  }
376 
377  return iy * (nx + 2) + ix;
378 
379  }
380 
381  // the choices are either dynamic_casting or overloading. prefer overload in the interest of overhead reduction
382  double
384  {
385  if( !me ) return 0.;
386  if( me->kind() < MonitorElement::DQM_KIND_TH1F ) return 0.;
387 
388  return ((TH1 *)me->getRootObject())->GetBinContent( getBinME( me, id ) );
389  }
390 
391  double
393  {
394  if( !me ) return 0.;
395  if( me->kind() < MonitorElement::DQM_KIND_TH1F ) return 0.;
396 
397  return ((TH1 *)me->getRootObject())->GetBinContent( getBinME( me, id ) );
398  }
399 
400  double
402  {
403  if( !me ) return 0.;
404  if( me->kind() < MonitorElement::DQM_KIND_TH1F ) return 0.;
405 
406  const MeInfo *info = MeInfoMap::get( me );
407  if( !info || info->btype != kTriggerTower ) return 0.;
408 
409  std::vector<DetId> *crystals = Numbers::crystals( id );
410  if( !crystals->size() ) return 0.;
411 
412  return ((TH1 *)me->getRootObject())->GetBinContent( getBinME( me, EEDetId( crystals->at(0) ) ) );
413  }
414 
415  double
417  {
418  if( !me ) return 0.;
419  if( me->kind() < MonitorElement::DQM_KIND_TH1F ) return 0.;
420 
421  return ((TH1 *)me->getRootObject())->GetBinError( getBinME( me, id ) );
422  }
423 
424  double
426  {
427  if( !me ) return 0.;
428  if( me->kind() < MonitorElement::DQM_KIND_TH1F ) return 0.;
429 
430  return ((TH1 *)me->getRootObject())->GetBinError( getBinME( me, id ) );
431  }
432 
433  double
435  {
436  if( !me ) return 0.;
437  if( me->kind() < MonitorElement::DQM_KIND_TH1F ) return 0.;
438 
439  const MeInfo *info = MeInfoMap::get( me );
440  if( !info || info->btype != kTriggerTower ) return 0.;
441 
442  std::vector<DetId> *crystals = Numbers::crystals( id );
443  if( !crystals->size() ) return 0.;
444 
445  return ((TH1 *)me->getRootObject())->GetBinError( getBinME( me, EEDetId( crystals->at(0) ) ) );
446  }
447 
448  double
450  {
451  if( !me ) return 0.;
452  if( me->kind() != MonitorElement::DQM_KIND_TPROFILE2D ) return 0.;
453 
454  return ((TProfile2D *)me->getRootObject())->GetBinEntries( getBinME( me, id ) );
455  }
456 
457  double
459  {
460  if( !me ) return 0.;
461  if( me->kind() != MonitorElement::DQM_KIND_TPROFILE2D ) return 0.;
462 
463  return ((TProfile2D *)me->getRootObject())->GetBinEntries( getBinME( me, id ) );
464  }
465 
466  double
468  {
469  if( !me ) return 0.;
470  if( me->kind() != MonitorElement::DQM_KIND_TPROFILE2D ) return 0.;
471 
472  const MeInfo *info = MeInfoMap::get( me );
473  if( !info || info->btype != kTriggerTower ) return 0.;
474 
475  std::vector<DetId> *crystals = Numbers::crystals( id );
476  if( !crystals->size() ) return 0.;
477 
478 
479  return ((TProfile2D *)me->getRootObject())->GetBinEntries( getBinME( me, EEDetId( crystals->at(0) ) ) );
480  }
481 
482  void
484  {
485  if( !me ) return;
486  if( me->kind() < MonitorElement::DQM_KIND_TH1F ) return;
487 
488  const MeInfo *info = MeInfoMap::get( me );
489  if( !info ) return;
490 
491  if(info->btype == kCrystal){
492 
493  ((TH1 *)me->getRootObject())->SetBinContent( getBinME( me, id ), content );
494  return;
495 
496  }else if(info->btype == kSuperCrystal){
497 
498  EcalScDetId scid( Numbers::getEcalScDetId( id ) );
499  ((TH1 *)me->getRootObject())->SetBinContent( getBinME( me, id ), content );
500  return;
501 
502  }else if(info->btype == kTriggerTower){
503 
506  std::vector<DetId> vcry = map->ttConstituents( teid.tccId(), teid.ttId() );
507  for(unsigned u = 0; u < vcry.size(); u++)
508  ((TH1 *)me->getRootObject())->SetBinContent( getBinME( me, EEDetId(vcry[u]) ), content );
509  return;
510 
511  }
512  }
513 
514  void
516  {
517  if( !me ) return;
518  if( me->kind() < MonitorElement::DQM_KIND_TH1F ) return;
519 
520  const MeInfo *info = MeInfoMap::get( me );
521  if( !info ) return;
522 
523  if(info->btype == kCrystal){
524 
526  std::pair<int,int> p = map->getDCCandSC( id );
527  std::vector<DetId> vcry = map->dccTowerConstituents( p.first, p.second );
528  for(unsigned u = 0; u < vcry.size(); u++)
529  ((TH1 *)me->getRootObject())->SetBinContent( getBinME( me, EEDetId(vcry[u]) ), content );
530  return;
531 
532  }else if(info->btype == kSuperCrystal){
533 
534  ((TH1 *)me->getRootObject())->SetBinContent( getBinME( me, id ), content );
535  return;
536 
537  }
538  }
539 
540  void
542  {
543  if( !me ) return;
544  if( me->kind() < MonitorElement::DQM_KIND_TH1F ) return;
545 
546  const MeInfo *info = MeInfoMap::get( me );
547  if( !info ) return;
548 
549  if(info->btype == kCrystal || info->btype == kTriggerTower){
550 
551  std::vector<DetId> *crystals = Numbers::crystals( id );
552  for(unsigned u = 0; u < crystals->size(); u++)
553  ((TH1 *)me->getRootObject())->SetBinContent( getBinME( me, EEDetId(crystals->at(u)) ), content );
554  return;
555 
556  }
557  }
558 
559  void
560  setBinErrorME(MonitorElement *me, const EEDetId &id, double error)
561  {
562  if( !me ) return;
563  if( me->kind() < MonitorElement::DQM_KIND_TH1F ) return;
564 
565  const MeInfo *info = MeInfoMap::get( me );
566  if( !info ) return;
567 
568  if(info->btype == kCrystal){
569 
570  ((TH1 *)me->getRootObject())->SetBinError( getBinME( me, id ), error );
571  return;
572 
573  }else if(info->btype == kSuperCrystal){
574 
575  EcalScDetId scid( Numbers::getEcalScDetId( id ) );
576  ((TH1 *)me->getRootObject())->SetBinError( getBinME( me, id ), error );
577  return;
578 
579  }else if(info->btype == kTriggerTower){
580 
583  std::vector<DetId> vcry = map->ttConstituents( teid.tccId(), teid.ttId() );
584  for(unsigned u = 0; u < vcry.size(); u++)
585  ((TH1 *)me->getRootObject())->SetBinError( getBinME( me, EEDetId(vcry[u]) ), error );
586  return;
587 
588  }
589  }
590 
591  void
593  {
594  if( !me ) return;
595  if( me->kind() < MonitorElement::DQM_KIND_TH1F ) return;
596 
597  const MeInfo *info = MeInfoMap::get( me );
598  if( !info ) return;
599 
600  if(info->btype == kCrystal){
601 
603  std::pair<int,int> p = map->getDCCandSC( id );
604  std::vector<DetId> vcry = map->dccTowerConstituents( p.first, p.second );
605  for(unsigned u = 0; u < vcry.size(); u++)
606  ((TH1 *)me->getRootObject())->SetBinError( getBinME( me, EEDetId(vcry[u]) ), error );
607  return;
608 
609  }else if(info->btype == kSuperCrystal){
610 
611  ((TH1 *)me->getRootObject())->SetBinError( getBinME( me, id ), error );
612  return;
613 
614  }
615  }
616 
617  void
619  {
620  if( !me ) return;
621  if( me->kind() < MonitorElement::DQM_KIND_TH1F ) return;
622 
623  const MeInfo *info = MeInfoMap::get( me );
624  if( !info ) return;
625 
626  if(info->btype == kCrystal || info->btype == kTriggerTower){
627 
628  std::vector<DetId> *crystals = Numbers::crystals( id );
629  for(unsigned u = 0; u < crystals->size(); u++)
630  ((TH1 *)me->getRootObject())->SetBinError( getBinME( me, EEDetId(crystals->at(u)) ), error );
631  return;
632 
633  }
634  }
635 
636  void
638  {
639  if( !me ) return;
640  if( me->kind() != MonitorElement::DQM_KIND_TPROFILE2D ) return;
641 
642  const MeInfo *info = MeInfoMap::get( me );
643  if( !info ) return;
644 
645  if(info->btype == kCrystal){
646 
647  ((TProfile2D *)me->getRootObject())->SetBinEntries( getBinME( me, id ), entries );
648  return;
649 
650  }else if(info->btype == kSuperCrystal){
651 
652  EcalScDetId scid( Numbers::getEcalScDetId( id ) );
653  ((TProfile2D *)me->getRootObject())->SetBinError( getBinME( me, id ), entries );
654  return;
655 
656  }else if(info->btype == kTriggerTower){
657 
660  std::vector<DetId> vcry = map->ttConstituents( teid.tccId(), teid.ttId() );
661  for(unsigned u = 0; u < vcry.size(); u++)
662  ((TProfile2D *)me->getRootObject())->SetBinError( getBinME( me, EEDetId(vcry[u]) ), entries );
663  return;
664 
665  }
666 
667  }
668 
669  void
671  {
672  if( !me ) return;
673  if( me->kind() != MonitorElement::DQM_KIND_TPROFILE2D ) return;
674 
675  const MeInfo *info = MeInfoMap::get( me );
676  if( !info ) return;
677 
678  if(info->btype == kCrystal){
679 
681  std::pair<int,int> p = map->getDCCandSC( id );
682  std::vector<DetId> vcry = map->dccTowerConstituents( p.first, p.second );
683  for(unsigned u = 0; u < vcry.size(); u++)
684  ((TProfile2D *)me->getRootObject())->SetBinEntries( getBinME( me, EEDetId(vcry[u]) ), entries );
685  return;
686 
687  }else if(info->btype == kSuperCrystal){
688 
689  ((TProfile2D *)me->getRootObject())->SetBinError( getBinME( me, id ), entries );
690  return;
691 
692  }
693  }
694 
695  void
697  {
698  if( !me ) return;
699  if( me->kind() != MonitorElement::DQM_KIND_TPROFILE2D ) return;
700 
701  const MeInfo *info = MeInfoMap::get( me );
702  if( !info ) return;
703 
704  if(info->btype == kCrystal || info->btype == kTriggerTower){
705 
706  std::vector<DetId> *crystals = Numbers::crystals( id );
707  for(unsigned u = 0; u < crystals->size(); u++)
708  ((TProfile2D *)me->getRootObject())->SetBinError( getBinME( me, EEDetId(crystals->at(u)) ), entries );
709  return;
710 
711  }
712  }
713 
714 }
int ix() const
Definition: EEDetId.h:71
void fillME(MonitorElement *me, const EEDetId &id, double wz=1., double wprof=1.)
int getBinME(MonitorElement *me, const EEDetId &id)
Some &quot;id&quot; conversions.
#define NULL
Definition: scimark2.h:8
BinningType btype
EcalTrigTowerDetId getTrigTowerDetId(int TCCid, int iTT) const
Builds a EcalTrigTowerDetID from the TCCid &amp; TriggerTower index in TCC.
static int ix0EE(const unsigned ism)
Definition: Numbers.cc:773
static const EcalElectronicsMapping * getElectronicsMapping()
Definition: Numbers.cc:919
std::pair< int, int > getDCCandSC(EcalScDetId id) const
ObjectType otype
static int iy0EE(const unsigned ism)
Definition: Numbers.cc:812
dictionary map
Definition: Association.py:205
void Fill(long long x)
static std::vector< DetId > * crystals(const EcalTrigTowerDetId &id)
Definition: Numbers.cc:585
void setBinEntriesME(MonitorElement *me, const EEDetId &id, double entries)
int zside() const
Definition: EEDetId.h:65
void setBinContentME(MonitorElement *me, const EEDetId &id, double content)
EcalTriggerElectronicsId getTriggerElectronicsId(const DetId &id) const
Get the trigger electronics id for this det id.
int iy() const
Definition: EEDetId.h:77
#define end
Definition: vmac.h:38
Kind kind(void) const
Get the type of the monitor element.
const std::string getFullname(void) const
get full name of ME including Pathname
double getBinErrorME(MonitorElement *me, const EEDetId &id)
std::vector< DetId > ttConstituents(int tccId, int tt) const
Get the constituent detids for this dccId.
TObject * getRootObject(void) const
void setBinErrorME(MonitorElement *me, const EEDetId &id, double error)
MonitorElement * bookME(DQMStore *dqmStore, const std::string &name, const std::string &title, const std::string &className, ObjectType otype, BinningType btype=kCrystal, int ism=0, double lowZ=0., double highZ=0., const char *option="s")
static const MeInfo * get(MonitorElement *me)
double getBinContentME(MonitorElement *me, const EEDetId &id)
static void set(MonitorElement *me, ObjectType otype, BinningType btype, int ism)
static const EcalScDetId getEcalScDetId(const EEDetId &id)
Definition: Numbers.cc:679
Definition: DDAxes.h:10
double getBinEntriesME(MonitorElement *me, const EEDetId &id)
MonitorElement * book2D(const char *name, const char *title, int nchX, double lowX, double highX, int nchY, double lowY, double highY)
Book 2D histogram.
Definition: DQMStore.cc:845
int ism(int ieta, int iphi)
Definition: EcalPyUtils.cc:56
static std::map< std::string, MeInfo > infos
Ecal trigger electronics identification [32:20] Unused (so far) [19:13] TCC id [12:6] TT id [5:3] pse...
std::string className(const T &t)
Definition: ClassName.h:30
std::vector< DetId > dccTowerConstituents(int dccId, int tower) const
Get the constituent detids for this dccId.
MonitorElement * bookProfile2D(const char *name, const char *title, int nchX, double lowX, double highX, int nchY, double lowY, double highY, int nchZ, double lowZ, double highZ, const char *option="s")
Definition: DQMStore.cc:1175