CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
EBTriggerTowerTask.cc
Go to the documentation of this file.
1 /*
2  * \file EBTriggerTowerTask.cc
3  *
4  * \author G. Della Ricca
5  * \author E. Di Marco
6  *
7 */
8 
11 
14 
16 
19 
20 const int EBTriggerTowerTask::nTTEta = 17;
21 const int EBTriggerTowerTask::nTTPhi = 4;
22 const int EBTriggerTowerTask::nSM = 36;
23 
25 
26  init_ = false;
27 
29 
30  prefixME_ = ps.getUntrackedParameter<std::string>("prefixME", "");
31 
32  enableCleanup_ = ps.getUntrackedParameter<bool>("enableCleanup", false);
33 
34  mergeRuns_ = ps.getUntrackedParameter<bool>("mergeRuns", false);
35 
39  meEtBxReal_ = 0;
41  meTCCTimingCalo_ = 0;
42  meTCCTimingMuon_ = 0;
45 
53 
54  realCollection_ = consumes<EcalTrigPrimDigiCollection>(ps.getParameter<edm::InputTag>("EcalTrigPrimDigiCollectionReal"));
55  emulCollection_ = consumes<EcalTrigPrimDigiCollection>(ps.getParameter<edm::InputTag>("EcalTrigPrimDigiCollectionEmul"));
56  EBDigiCollection_ = consumes<EBDigiCollection>(ps.getParameter<edm::InputTag>("EBDigiCollection"));
57  HLTResultsCollection_ = consumes<edm::TriggerResults>(ps.getParameter<edm::InputTag>("HLTResultsCollection"));
58 
59  HLTCaloHLTBit_ = ps.getUntrackedParameter<std::string>("HLTCaloHLTBit", "");
60  HLTMuonHLTBit_ = ps.getUntrackedParameter<std::string>("HLTMuonHLTBit", "");
61 
62  outputFile_ = ps.getUntrackedParameter<std::string>("OutputRootFile", "");
63 
64  LogDebug("EBTriggerTowerTask") << "REAL digis: " << realCollection_;
65  LogDebug("EBTriggerTowerTask") << "EMULATED digis: " << emulCollection_;
66 
67 }
68 
70 
71 }
72 
74 
75  array.reserve( nSM );
76  array.resize( nSM, static_cast<MonitorElement*>(0) );
77 
78 }
79 
81 
82  ievt_ = 0;
83 
84  if ( dqmStore_ ) {
85  dqmStore_->setCurrentFolder(prefixME_ + "/EBTriggerTowerTask");
86  dqmStore_->rmdir(prefixME_ + "/EBTriggerTowerTask");
87  }
88 
89 }
90 
92 
93  Numbers::initGeometry(c, false);
94 
95  if ( ! mergeRuns_ ) this->reset();
96 
97 }
98 
100 
101 }
102 
104 
108  if ( meEtBxReal_ ) meEtBxReal_->Reset();
114 
115  for (int i = 0; i < 36; i++) {
116 
117  if ( meEtMapReal_[i] ) meEtMapReal_[i]->Reset();
118  if ( meVetoReal_[i] ) meVetoReal_[i]->Reset();
119  if ( meEtMapEmul_[i] ) meEtMapEmul_[i]->Reset();
120  if ( meVetoEmul_[i] ) meVetoEmul_[i]->Reset();
121  if ( meEmulError_[i] ) meEmulError_[i]->Reset();
122  if ( meEmulMatch_[i] ) meEmulMatch_[i]->Reset();
123  if ( meVetoEmulError_[i] ) meVetoEmulError_[i]->Reset();
124 
125  }
126 
127 }
128 
130 
131  init_ = true;
132 
133  if ( dqmStore_ ) {
134  setup( "Real Digis",
135  (prefixME_ + "/EBTriggerTowerTask").c_str(), false );
136 
137  setup( "Emulated Digis",
138  (prefixME_ + "/EBTriggerTowerTask/Emulated").c_str(), true);
139  }
140  else {
141  edm::LogError("EBTriggerTowerTask") << "Bad DQMStore, cannot book MonitorElements.";
142  }
143 }
144 
146  std::string const &folder,
147  bool emulated ) {
148 
149  array1* meEtMap = &meEtMapReal_;
150 
151  if ( emulated ) {
152  meEtMap = &meEtMapEmul_;
153  }
154 
155  dqmStore_->setCurrentFolder(folder);
156 
158 
159  if (!emulated) {
160  name = "EBTTT Et spectrum " + nameext;
161  meEtSpectrumReal_ = dqmStore_->book1D(name, name, 256, 0., 256.);
162  meEtSpectrumReal_->setAxisTitle("energy (ADC)", 1);
163 
164  name = "EBTTT TP matching index";
165  meEmulMatchIndex1D_ = dqmStore_->book1D(name, name, 7, -1., 6.);
166  meEmulMatchIndex1D_->setAxisTitle("TP data matching emulator", 1);
167 
168  name = "EBTTT max TP matching index";
169  meEmulMatchMaxIndex1D_ = dqmStore_->book1D(name, name, 7, -1., 6.);
170  meEmulMatchMaxIndex1D_->setAxisTitle("Max TP data matching emulator", 1);
171 
172  double xbins[51];
173  for ( int i=0; i<=11; i++ ) xbins[i] = i-1; // begin of orbit
174  // abort gap in presence of calibration: [3381-3500]
175  // abort gap in absence of calibration: [3444-3500]
176  // using the wider abort gap always, start finer binning at bx=3371
177  for ( int i=12; i<=22; i++) xbins[i] = 3371+i-12;
178  // use 29 bins for the abort gap
179  for ( int i=23; i<=50; i++) xbins[i] = 3382+(i-23)*6;
180 
181  name = "EBTTT Et vs bx " + nameext;
182  meEtBxReal_ = dqmStore_->bookProfile(name, name, 50, xbins, 256, 0, 256);
183  meEtBxReal_->setAxisTitle("bunch crossing", 1);
184  meEtBxReal_->setAxisTitle("energy (ADC)", 2);
185 
186  name = "EBTTT TP occupancy vs bx " + nameext;
187  meOccupancyBxReal_ = dqmStore_->bookProfile(name, name, 50, xbins, 2448, 0, 2448);
188  meOccupancyBxReal_->setAxisTitle("bunch crossing", 1);
189  meOccupancyBxReal_->setAxisTitle("TP number", 2);
190 
191  if ( HLTCaloHLTBit_ != "" ) {
192  name = "EBTTT TCC timing calo triggers " + nameext;
193  meTCCTimingCalo_ = dqmStore_->book2D(name, name, 36, 37, 73, 7, -1., 6.);
194  meTCCTimingCalo_->setAxisTitle("nTCC", 1);
195  meTCCTimingCalo_->setAxisTitle("TP data matching emulator", 2);
196  }
197 
198  if ( HLTMuonHLTBit_ != "" ) {
199  name = "EBTTT TCC timing muon triggers " + nameext;
200  meTCCTimingMuon_ = dqmStore_->book2D(name, name, 36, 37, 73, 7, -1., 6.);
201  meTCCTimingMuon_->setAxisTitle("nTCC", 1);
202  meTCCTimingMuon_->setAxisTitle("TP data matching emulator", 2);
203  }
204 
205  } else {
206  name = "EBTTT Et spectrum " + nameext;
207  meEtSpectrumEmul_ = dqmStore_->book1D(name, name, 256, 0., 256.);
208  meEtSpectrumEmul_->setAxisTitle("energy (ADC)", 1);
209 
210  name = "EBTTT Et spectrum " + nameext + " max";
211  meEtSpectrumEmulMax_ = dqmStore_->book1D(name, name, 256, 0., 256.);
212  meEtSpectrumEmulMax_->setAxisTitle("energy (ADC)", 1);
213  }
214 
215  for (int i = 0; i < 36; i++) {
216 
217  name = "EBTTT Et map " + nameext + " " + Numbers::sEB(i+1);
218  (*meEtMap)[i] = dqmStore_->bookProfile2D(name, name, nTTEta, 0, nTTEta, nTTPhi, 0, nTTPhi, 256, 0, 256.);
219  (*meEtMap)[i]->setAxisTitle("ieta'", 1);
220  (*meEtMap)[i]->setAxisTitle("iphi'", 2);
221  dqmStore_->tag((*meEtMap)[i], i+1);
222 
223  if (!emulated) {
224 
225  name = "EBTTT EmulError " + Numbers::sEB(i+1);
226  meEmulError_[i] = dqmStore_->book2D(name, name, nTTEta, 0., nTTEta, nTTPhi, 0., nTTPhi );
227  meEmulError_[i]->setAxisTitle("ieta'", 1);
228  meEmulError_[i]->setAxisTitle("iphi'", 2);
229  dqmStore_->tag(meEmulError_[i], i+1);
230 
231  name = "EBTTT EmulMatch " + Numbers::sEB(i+1);
232  meEmulMatch_[i] = dqmStore_->book3D(name, name, nTTEta, 0., nTTEta, nTTPhi, 0., nTTPhi, 6, 0., 6.);
233  meEmulMatch_[i]->setAxisTitle("ieta'", 1);
234  meEmulMatch_[i]->setAxisTitle("iphi'", 2);
235  meEmulMatch_[i]->setAxisTitle("TP timing", 3);
236  dqmStore_->tag(meEmulMatch_[i], i+1);
237 
238  name ="EBTTT EmulFineGrainVetoError " + Numbers::sEB(i+1);
239  meVetoEmulError_[i] = dqmStore_->book2D(name, name, nTTEta, 0., nTTEta, nTTPhi, 0., nTTPhi);
240  meVetoEmulError_[i]->setAxisTitle("ieta'", 1);
241  meVetoEmulError_[i]->setAxisTitle("iphi'", 2);
242  dqmStore_->tag(meVetoEmulError_[i], i+1);
243 
244  }
245  }
246 
247 }
248 
250 
251  if ( ! init_ ) return;
252 
253  if ( dqmStore_ ) {
254 
255  if ( !outputFile_.empty() ) dqmStore_->save( outputFile_.c_str() );
256 
257  dqmStore_->rmdir( prefixME_ + "/EBTriggerTowerTask" );
258 
259  }
260 
261  init_ = false;
262 
263 }
264 
266 
267  edm::LogInfo("EBTriggerTowerTask") << "analyzed " << ievt_ << " events";
268 
269  if ( enableCleanup_ ) this->cleanup();
270 
271 }
272 
274 
275  if ( ! init_ ) this->setup();
276 
277  ievt_++;
278 
280 
281  if ( e.getByToken(realCollection_, realDigis) ) {
282 
283  int nebtpd = realDigis->size();
284  LogDebug("EBTriggerTowerTask") << "event " << ievt_ <<" trigger primitive digi collection size: " << nebtpd;
285 
286  processDigis( e,
287  realDigis,
288  meEtMapReal_,
289  meVetoReal_);
290 
291  } else {
292  edm::LogWarning("EBTriggerTowerTask") << "realCollection not available";
293  }
294 
296 
297  if ( e.getByToken(emulCollection_, emulDigis) ) {
298 
300 
301  if ( e.getByToken(HLTResultsCollection_, hltResults) ) {
302 
303  processDigis( e,
304  emulDigis,
305  meEtMapEmul_,
306  meVetoEmul_,
307  realDigis,
308  hltResults);
309 
310  } else {
311  edm::LogWarning("EBTriggerTowerTask") << "HLTResultsCollection not available";
312  }
313 
314  } else {
315  edm::LogInfo("EBTriggerTowerTask") << "emulCollection not available";
316  }
317 
318 }
319 
320 void
322  array1& meEtMap,
323  array1& meVeto,
326 
327  int bx = e.bunchCrossing();
328  int nTP = 0;
329 
330  // map<EcalTrigTowerDetId, int> crystalsInTower;
331  int readoutCrystalsInTower[108][68];
332  for (int itcc = 0; itcc < 108; itcc++) {
333  for (int itt = 0; itt < 68; itt++) readoutCrystalsInTower[itcc][itt] = 0;
334  }
335 
336  if ( compDigis.isValid() ) {
337 
338  edm::Handle<EBDigiCollection> crystalDigis;
339 
340  if ( e.getByToken(EBDigiCollection_, crystalDigis) ) {
341 
342  for ( EBDigiCollection::const_iterator cDigiItr = crystalDigis->begin(); cDigiItr != crystalDigis->end(); ++cDigiItr ) {
343 
344  EBDetId id = cDigiItr->id();
345  EcalTrigTowerDetId towid = id.tower();
346 
347  int itcc = Numbers::iTCC( towid );
348  int itt = Numbers::iTT( towid );
349 
350  readoutCrystalsInTower[itcc-1][itt-1]++;
351 
352  }
353 
354  } else {
355  edm::LogWarning("EBTriggerTowerTask") << "EBDigiCollection not available";
356  }
357 
358  }
359 
360  bool caloTrg = false;
361  bool muonTrg = false;
362 
363  if ( hltResults.isValid() ) {
364 
365  int ntrigs = hltResults->size();
366  if ( ntrigs!=0 ) {
367 
368  const edm::TriggerNames & triggerNames = e.triggerNames(*hltResults);
369 
370  for ( int itrig = 0; itrig != ntrigs; ++itrig ) {
371  std::string trigName = triggerNames.triggerName(itrig);
372  bool accept = hltResults->accept(itrig);
373 
374  if ( trigName == HLTCaloHLTBit_ ) caloTrg = accept;
375 
376  if ( trigName == HLTMuonHLTBit_ ) muonTrg = accept;
377 
378  }
379 
380  } else {
381  edm::LogWarning("EBTriggerTowerTask") << " zero size trigger names in input TriggerResults";
382  }
383 
384  }
385 
386  for ( EcalTrigPrimDigiCollection::const_iterator tpdigiItr = digis->begin(); tpdigiItr != digis->end(); ++tpdigiItr ) {
387 
388  if ( Numbers::subDet( tpdigiItr->id() ) != EcalBarrel ) continue;
389 
390  int ismt = Numbers::iSM( tpdigiItr->id() );
391 
392  int iet = std::abs(tpdigiItr->id().ieta());
393  int ipt = tpdigiItr->id().iphi();
394 
395  // phi_tower: change the range from global to SM-local
396  // phi==0 is in the middle of a SM
397  ipt = ipt + 2;
398  if ( ipt > 72 ) ipt = ipt - 72;
399  ipt = (ipt-1)%4 + 1;
400 
401  // phi_tower: SM-local phi runs opposite to global in EB+
402  if ( tpdigiItr->id().zside() > 0 ) ipt = 5 - ipt;
403 
404  float xiet = iet-0.5;
405  float xipt = ipt-0.5;
406 
407  int itt = Numbers::iTT( tpdigiItr->id() );
408  int itcc = Numbers::iTCC( tpdigiItr->id() );
409 
410  float xvalEt = tpdigiItr->compressedEt();
411  float xvalVeto = 0.5 + tpdigiItr->fineGrain();
412 
413  bool good = true;
414  bool goodVeto = true;
415 
416  int compDigiInterest = -1;
417 
418  bool matchSample[6];
419  for (int j=0; j<6; j++) matchSample[j]=false;
420 
421  if ( compDigis.isValid() ) {
422 
423  if ( meEtSpectrumEmul_ ) meEtSpectrumEmul_->Fill( xvalEt );
424 
425  float maxEt = 0;
426  int maxTPIndex = -1;
427  for (int j=0; j<5; j++) {
428  float EtTP = (*tpdigiItr)[j].compressedEt();
429  if ( EtTP > maxEt ) {
430  maxEt = EtTP;
431  maxTPIndex = j+1;
432  }
433  }
434 
436  if ( meEmulMatchMaxIndex1D_ && maxEt > 0 ) meEmulMatchMaxIndex1D_->Fill( maxTPIndex );
437 
438  EcalTrigPrimDigiCollection::const_iterator compDigiItr = compDigis->find( tpdigiItr->id().rawId() );
439  if ( compDigiItr != compDigis->end() ) {
440  int compDigiEt = compDigiItr->compressedEt();
441  compDigiInterest = (compDigiItr->ttFlag() & 0x3);
442 
443  if ( compDigiEt > 0 ) nTP++;
444  if ( meEtSpectrumReal_ ) meEtSpectrumReal_->Fill( compDigiEt );
445  if ( meEtBxReal_ && compDigiEt > 0 ) meEtBxReal_->Fill( bx, compDigiEt );
446 
447  // compare the 5 TPs with different time-windows
448  // sample 0 means no match, 1-5: sample of the TP that matches
449  matchSample[0]=false;
450  bool matchedAny=false;
451 
452  for (int j=0; j<5; j++) {
453  if ((*tpdigiItr)[j].compressedEt() == compDigiEt ) {
454  matchSample[j+1]=true;
455  matchedAny=true;
456  } else {
457  matchSample[j+1]=false;
458  }
459  }
460 
461  if (!matchedAny) matchSample[0]=true;
462 
463  // check if the tower has been readout completely and if it is medium or high interest
464  if (readoutCrystalsInTower[itcc-1][itt-1] == 25 &&
465  (compDigiInterest == 1 || compDigiInterest == 3) && compDigiEt > 0) {
466 
467  if ( tpdigiItr->compressedEt() != compDigiEt ) {
468  good = false;
469  }
470  if ( tpdigiItr->fineGrain() != compDigiItr->fineGrain() ) {
471  goodVeto = false;
472  }
473 
474  for (int j=0; j<6; j++) {
475  if (matchSample[j]) {
476 
477  int index = ( j==0 ) ? -1 : j;
478 
479  meEmulMatchIndex1D_->Fill(index+0.5);
480 
481  meEmulMatch_[ismt-1]->Fill(xiet, xipt, j+0.5);
482  if ( meTCCTimingCalo_ && caloTrg ) meTCCTimingCalo_->Fill( itcc, index+0.5 );
483  if ( meTCCTimingMuon_ && muonTrg ) meTCCTimingMuon_->Fill( itcc, index+0.5 );
484 
485  }
486  }
487 
488  } // check readout
489 
490  } else {
491  good = false;
492  goodVeto = false;
493  }
494 
495  if (!good ) {
496  if ( meEmulError_[ismt-1] ) meEmulError_[ismt-1]->Fill(xiet, xipt);
497  }
498  if (!goodVeto) {
499  if ( meVetoEmulError_[ismt-1] ) meVetoEmulError_[ismt-1]->Fill(xiet, xipt);
500  }
501 
502  } // compDigis.isValid
503 
504  if ( meEtMap[ismt-1] ) meEtMap[ismt-1]->Fill(xiet, xipt, xvalEt);
505  if ( meVeto[ismt-1] ) meVeto[ismt-1]->Fill(xiet, xipt, xvalVeto);
506 
507  } // loop on TP
508 
509  if ( meOccupancyBxReal_ ) meOccupancyBxReal_->Fill( bx, nTP );
510 
511 }
512 
#define LogDebug(id)
T getParameter(std::string const &) const
void setup(void)
Setup.
T getUntrackedParameter(std::string const &, T const &) const
int i
Definition: DBlmapReader.cc:9
virtual edm::TriggerNames const & triggerNames(edm::TriggerResults const &triggerResults) const
Definition: Event.cc:204
EBTriggerTowerTask(const edm::ParameterSet &ps)
Constructor.
static const int nTTPhi
number of trigger towers in phi
void beginJob(void)
BeginJob.
boost::transform_iterator< IterHelp, boost::counting_iterator< int > > const_iterator
const double xbins[]
MonitorElement * book1D(const char *name, const char *title, int nchX, double lowX, double highX)
Book 1D histogram.
Definition: DQMStore.cc:872
void rmdir(const std::string &fullpath)
Definition: DQMStore.cc:2730
edm::EDGetTokenT< EBDigiCollection > EBDigiCollection_
to find the input collection of crystal digis
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:434
MonitorElement * book3D(const char *name, const char *title, int nchX, double lowX, double highX, int nchY, double lowY, double highY, int nchZ, double lowZ, double highZ)
Book 3D histogram.
Definition: DQMStore.cc:1134
Some &quot;id&quot; conversions.
static std::string sEB(const unsigned ism)
Definition: Numbers.cc:91
void endRun(const edm::Run &r, const edm::EventSetup &c)
EndRun.
std::vector< EcalTriggerPrimitiveDigi >::const_iterator const_iterator
int bunchCrossing() const
Definition: EventBase.h:62
MonitorElement * meEtSpectrumReal_
ET spectrums for the whole EB.
edm::EDGetTokenT< EcalTrigPrimDigiCollection > realCollection_
to find the input collection of real digis
void analyze(const edm::Event &e, const edm::EventSetup &c)
Analyze.
edm::EDGetTokenT< EcalTrigPrimDigiCollection > emulCollection_
to find the input collection of emulated digis
bool accept(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
Definition: TopDQMHelpers.h:26
static const int nTTEta
number of trigger towers in eta
void processDigis(const edm::Event &e, const edm::Handle< EcalTrigPrimDigiCollection > &digis, array1 &meEtMap, array1 &meVeto, const edm::Handle< EcalTrigPrimDigiCollection > &compDigis=edm::Handle< EcalTrigPrimDigiCollection >(), const edm::Handle< edm::TriggerResults > &hltResults=edm::Handle< edm::TriggerResults >())
process a collection of digis, either real or emulated
bool enableCleanup_
remove MEs
void Fill(long long x)
void tag(MonitorElement *me, unsigned int myTag)
Definition: DQMStore.cc:1509
static const int nSM
number of supermodules
static unsigned iTCC(const unsigned ism, const EcalSubdetector subdet, const unsigned i1, const unsigned i2)
Definition: Numbers.cc:531
std::string outputFile_
debug output root file. if empty, no output file created.
bool mergeRuns_
merge MEs across runs
MonitorElement * meEmulMatchMaxIndex1D_
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
int j
Definition: DBlmapReader.cc:9
void reset(void)
Reset.
void save(const std::string &filename, const std::string &path="", const std::string &pattern="", const std::string &rewrite="", const uint32_t run=0, SaveReferenceTag ref=SaveWithReference, int minStatus=dqm::qstatus::STATUS_OK, const std::string &fileupdate="RECREATE")
Definition: DQMStore.cc:2296
MonitorElement * bookProfile(const char *name, const char *title, int nchX, double lowX, double highX, int nchY, double lowY, double highY, const char *option="s")
Definition: DQMStore.cc:1186
std::vector< MonitorElement * > array1
1D array
array1 meVetoReal_
fine grain veto vs iphi vs ieta, for each SM
MonitorElement * meEtBxReal_
number and ET average of TP vs bx
bool isValid() const
Definition: HandleBase.h:76
array1 meEtMapEmul_
Emulated Et vs ix vs iy, for each SM.
virtual ~EBTriggerTowerTask()
Destructor.
edm::EDGetTokenT< edm::TriggerResults > HLTResultsCollection_
to find the input collection of HLT bits
int ievt_
local event counter
array1 meEtMapReal_
Et vs ix vs iy, for each SM.
static void initGeometry(const edm::EventSetup &setup, bool verbose=false)
Definition: Numbers.cc:47
std::string const & triggerName(unsigned int index) const
Definition: TriggerNames.cc:27
void cleanup(void)
Cleanup.
void beginRun(const edm::Run &r, const edm::EventSetup &c)
BeginRun.
MonitorElement * meTCCTimingMuon_
void reserveArray(array1 &array)
reserve an array to hold one histogram per supermodule
std::string prefixME_
path to MEs
DQMStore * dqmStore_
DQM back-end interface.
static unsigned iSM(const unsigned ism, const EcalSubdetector subdet)
Definition: Numbers.cc:243
MonitorElement * meEmulMatchIndex1D_
1D emulator match 1D
static EcalSubdetector subDet(const EBDetId &id)
Definition: Numbers.cc:142
array1 meVetoEmul_
Emulated fine grain veto vs iphi vs ieta, for each SM.
void endJob(void)
EndJob.
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:1000
MonitorElement * meOccupancyBxReal_
MonitorElement * meEtSpectrumEmulMax_
void setAxisTitle(const std::string &title, int axis=1)
set x-, y- or z-axis title (axis=1, 2, 3 respectively)
void Reset(void)
reset ME (ie. contents, errors, etc)
MonitorElement * meTCCTimingCalo_
TCC timing.
MonitorElement * meEtSpectrumEmul_
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:584
static unsigned iTT(const unsigned ism, const EcalSubdetector subdet, const unsigned i1, const unsigned i2)
Definition: Numbers.cc:482
Definition: Run.h:41
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:1330