14 #include <dqm/analysis/modules/DQMHistInjection.h>
15 #include <klm/dataobjects/KLMElementNumbers.h>
35 addParam(
"PVPrefix", m_pvPrefix,
"PV Prefix", std::string(
"DQM:INJ:"));
36 addParam(
"useEpics", m_useEpics,
"Whether to update EPICS PVs.",
false);
37 B2DEBUG(1,
"DQMHistInjection: Constructor done.");
40 DQMHistInjectionModule::~DQMHistInjectionModule()
44 if (ca_current_context()) ca_context_destroy();
49 void DQMHistInjectionModule::initialize()
54 m_cInjectionLERPXD =
new TCanvas(
"PXDINJ/c_InjectionLERPXD");
55 m_cInjectionLERPXDOcc =
new TCanvas(
"PXDINJ/c_InjectionLERPXDOcc");
56 m_cInjectionLERSVD =
new TCanvas(
"SVDInjection/c_InjectionLERSVD");
57 m_cInjectionLERSVDOcc =
new TCanvas(
"SVDInjection/c_InjectionLERSVDOcc");
58 m_cInjectionLERECL =
new TCanvas(
"ECLINJ/c_InjectionLERECL");
59 m_cBurstLERECL =
new TCanvas(
"ECLINJ/c_BurstInjectionLERECL");
60 m_cInjectionLERTOP =
new TCanvas(
"TOP/c_InjectionLERTOP");
61 m_cInjectionLERARICH =
new TCanvas(
"ARICH/c_InjectionLERARICH");
62 m_cInjectionLERKLM =
new TCanvas(
"KLM/c_InjectionLERKLM");
64 m_cInjectionHERPXD =
new TCanvas(
"PXDINJ/c_InjectionHERPXD");
65 m_cInjectionHERPXDOcc =
new TCanvas(
"PXDINJ/c_InjectionHERPXDOcc");
66 m_cInjectionHERSVD =
new TCanvas(
"SVDInjection/c_InjectionHERSVD");
67 m_cInjectionHERSVDOcc =
new TCanvas(
"SVDInjection/c_InjectionHERSVDOcc");
68 m_cInjectionHERECL =
new TCanvas(
"ECLINJ/c_InjectionHERECL");
69 m_cBurstHERECL =
new TCanvas(
"ECLINJ/c_BurstInjectionHERECL");
70 m_cInjectionHERTOP =
new TCanvas(
"TOP/c_InjectionHERTOP");
71 m_cInjectionHERARICH =
new TCanvas(
"ARICH/c_InjectionHERARICH");
72 m_cInjectionHERKLM =
new TCanvas(
"KLM/c_InjectionHERKLM");
74 m_hInjectionLERPXD =
new TH1F(
"HitInjectionLERPXD",
"PXD Hits after LER Injection;Time in #mus;Mean Hits/event", 4000, 0 , 20000);
75 m_hInjectionLERPXDOcc =
new TH1F(
"HitInjectionPXDLEROcc",
"PXD Occ after LER Injection;Time in #mus;Mean Occ in % per module", 4000,
77 m_hInjectionLERSVD =
new TH1F(
"HitInjectionLERSVD",
"SVD Hits after LER Injection;Time in #mus;Mean Hits/event", 4000, 0 , 20000);
78 m_hInjectionLERSVDOcc =
new TH1F(
"HitInjectionSVDLEROcc",
"SVD Occ after LER Injection;Time in #mus;Mean Occ in % per module", 4000,
80 m_hInjectionLERECL =
new TH1F(
"HitInjectionLERECL",
"ECL Hits after LER Injection;Time in #mus;Mean Hits/event", 4000, 0 , 20000);
81 m_hBurstLERECL =
new TH1F(
"BurstInjectionLERECL",
"ECL Bursts after LER Injection;Time in #mus;Suppressions/event (1 #mus bins)",
83 m_hInjectionLERTOP =
new TH1F(
"HitInjectionLERTOP",
"TOP Occ after LER Injection;Time in #mus;Mean Occ in % /event", 4000, 0 ,
85 m_hInjectionLERARICH =
new TH1F(
"HitInjectionLERARICH",
"ARICH Occ after LER Injection;Time in #mus;Mean Hits/event", 4000, 0 ,
87 m_hInjectionLERKLM =
new TH1F(
"HitInjectionLERKLM",
88 "KLM occupancy after LER Injection;Time [#mus];Digits occupancy in % / (5 #mus)", 4000, 0 ,
91 m_hInjectionHERPXD =
new TH1F(
"HitInjectionHERPXD",
"PXD Hits after HER Injection;Time in #mus;Mean Hits/event", 4000, 0 , 20000);
92 m_hInjectionHERPXDOcc =
new TH1F(
"HitInjectionPXDHEROcc",
"PXD Occ after HER Injection;Time in #mus;Mean Occ in % per modul", 4000,
94 m_hInjectionHERSVD =
new TH1F(
"HitInjectionHERSVD",
"SVD Hits after HER Injection;Time in #mus;Mean Hits/event", 4000, 0 , 20000);
95 m_hInjectionHERSVDOcc =
new TH1F(
"HitInjectionSVDHEROcc",
"SVD Occ after HER Injection;Time in #mus;Mean Occ in % per modul", 4000,
97 m_hInjectionHERECL =
new TH1F(
"HitInjectionHERECL",
"ECL Hits after HER Injection;Time in #mus;Mean Hits/event", 4000, 0 , 20000);
98 m_hBurstHERECL =
new TH1F(
"BurstInjectionHERECL",
"ECL Bursts after HER Injection;Time in #mus;Suppressions/event (1 #mus bins)",
100 m_hInjectionHERTOP =
new TH1F(
"HitInjectionHERTOP",
"TOP Occ after HER Injection;Time in #mus;Mean Occ in % /event", 4000, 0 ,
102 m_hInjectionHERARICH =
new TH1F(
"HitInjectionHERARICH",
"ARICH Occ after HER Injection;Time in #mus;Mean Hits/event", 4000, 0 ,
104 m_hInjectionHERKLM =
new TH1F(
"HitInjectionHERKLM",
105 "KLM occupancy after HER Injection;Time [#mus];Digits occupancy in % / (5 #mus)", 4000, 0 ,
110 if (!ca_current_context()) SEVCHK(ca_context_create(ca_disable_preemptive_callback),
"ca_context_create");
112 SEVCHK(ca_create_channel((m_pvPrefix +
"LER:Triggers").data(), NULL, NULL, 10, &m_nodes[0].mychid),
"ca_create_channel failure");
113 m_nodes[0].histo =
nullptr;
114 SEVCHK(ca_create_channel((m_pvPrefix +
"LER:PXD").data(), NULL, NULL, 10, &m_nodes[1].mychid),
"ca_create_channel failure");
115 m_nodes[1].histo = m_hInjectionLERPXD;
116 SEVCHK(ca_create_channel((m_pvPrefix +
"LER:ECL").data(), NULL, NULL, 10, &m_nodes[2].mychid),
"ca_create_channel failure");
117 m_nodes[2].histo = m_hInjectionLERECL;
118 SEVCHK(ca_create_channel((m_pvPrefix +
"HER:Triggers").data(), NULL, NULL, 10, &m_nodes[3].mychid),
"ca_create_channel failure");
119 m_nodes[3].histo =
nullptr;
120 SEVCHK(ca_create_channel((m_pvPrefix +
"HER:PXD").data(), NULL, NULL, 10, &m_nodes[4].mychid),
"ca_create_channel failure");
121 m_nodes[4].histo = m_hInjectionHERPXD;
122 SEVCHK(ca_create_channel((m_pvPrefix +
"HER:ECL").data(), NULL, NULL, 10, &m_nodes[5].mychid),
"ca_create_channel failure");
123 m_nodes[5].histo = m_hInjectionHERECL;
124 SEVCHK(ca_create_channel((m_pvPrefix +
"LER:TOP").data(), NULL, NULL, 10, &m_nodes[6].mychid),
"ca_create_channel failure");
125 m_nodes[6].histo = m_hInjectionLERTOP;
126 SEVCHK(ca_create_channel((m_pvPrefix +
"HER:TOP").data(), NULL, NULL, 10, &m_nodes[7].mychid),
"ca_create_channel failure");
127 m_nodes[7].histo = m_hInjectionHERTOP;
128 SEVCHK(ca_create_channel((m_pvPrefix +
"LER:SVD").data(), NULL, NULL, 10, &m_nodes[8].mychid),
"ca_create_channel failure");
129 m_nodes[8].histo = m_hInjectionLERSVD;
130 SEVCHK(ca_create_channel((m_pvPrefix +
"HER:SVD").data(), NULL, NULL, 10, &m_nodes[9].mychid),
"ca_create_channel failure");
131 m_nodes[9].histo = m_hInjectionHERSVD;
132 SEVCHK(ca_create_channel((m_pvPrefix +
"LER:ARICH").data(), NULL, NULL, 10, &m_nodes[10].mychid),
"ca_create_channel failure");
133 m_nodes[10].histo = m_hInjectionLERARICH;
134 SEVCHK(ca_create_channel((m_pvPrefix +
"HER:ARICH").data(), NULL, NULL, 10, &m_nodes[11].mychid),
"ca_create_channel failure");
135 m_nodes[11].histo = m_hInjectionHERARICH;
136 SEVCHK(ca_create_channel((m_pvPrefix +
"LER:KLM").data(), NULL, NULL, 10, &m_nodes[10].mychid),
"ca_create_channel failure");
137 m_nodes[12].histo = m_hInjectionLERKLM;
138 SEVCHK(ca_create_channel((m_pvPrefix +
"HER:KLM").data(), NULL, NULL, 10, &m_nodes[11].mychid),
"ca_create_channel failure");
139 m_nodes[13].histo = m_hInjectionHERKLM;
141 SEVCHK(ca_pend_io(5.0),
"ca_pend_io failure");
145 B2DEBUG(1,
"DQMHistInjection: initialized.");
149 void DQMHistInjectionModule::beginRun()
151 B2DEBUG(1,
"DQMHistInjection: beginRun called.");
164 void DQMHistInjectionModule::event()
166 TH1* Hits =
nullptr, *Triggers =
nullptr;
167 TString locationHits =
"";
168 TString locationTriggers =
"";
170 m_histogramDirectoryName =
"PXDINJ";
172 locationHits =
"PXDOccInjLER";
173 if (m_histogramDirectoryName !=
"") {
174 locationHits = m_histogramDirectoryName +
"/" + locationHits;
176 Hits = (TH1*)findHist(locationHits.Data());
177 locationTriggers =
"PXDEOccInjLER";
178 if (m_histogramDirectoryName !=
"") {
179 locationTriggers = m_histogramDirectoryName +
"/" + locationTriggers;
181 Triggers = (TH1*)findHist(locationTriggers.Data());
185 if (Hits && Triggers) {
186 m_hInjectionLERPXD->Divide(Hits, Triggers);
187 m_hInjectionLERPXDOcc->Divide(Hits, Triggers, 100, 768 * 250);
190 m_cInjectionLERPXD->Clear();
191 m_cInjectionLERPXD->cd(0);
192 m_hInjectionLERPXD->Draw(
"hist");
194 m_cInjectionLERPXDOcc->Clear();
195 m_cInjectionLERPXDOcc->cd(0);
196 m_hInjectionLERPXDOcc->Draw(
"hist");
198 locationHits =
"PXDOccInjHER";
199 if (m_histogramDirectoryName !=
"") {
200 locationHits = m_histogramDirectoryName +
"/" + locationHits;
202 Hits = (TH1*)findHist(locationHits.Data());
203 locationTriggers =
"PXDEOccInjHER";
204 if (m_histogramDirectoryName !=
"") {
205 locationTriggers = m_histogramDirectoryName +
"/" + locationTriggers;
207 Triggers = (TH1*)findHist(locationTriggers.Data());
211 if (Hits && Triggers) {
212 m_hInjectionHERPXD->Divide(Hits, Triggers);
213 m_hInjectionHERPXDOcc->Divide(Hits, Triggers, 100, 768 * 250);
216 m_cInjectionHERPXD->Clear();
217 m_cInjectionHERPXD->cd(0);
218 m_hInjectionHERPXD->Draw(
"hist");
220 m_cInjectionHERPXDOcc->Clear();
221 m_cInjectionHERPXDOcc->cd(0);
222 m_hInjectionHERPXDOcc->Draw(
"hist");
225 m_histogramDirectoryName =
"SVDInjection";
227 locationHits =
"SVDOccInjLER";
228 if (m_histogramDirectoryName !=
"") {
229 locationHits = m_histogramDirectoryName +
"/" + locationHits;
231 Hits = (TH1*)findHist(locationHits.Data());
232 locationTriggers =
"SVDTrgOccInjLER";
233 if (m_histogramDirectoryName !=
"") {
234 locationTriggers = m_histogramDirectoryName +
"/" + locationTriggers;
236 Triggers = (TH1*)findHist(locationTriggers.Data());
240 if (Hits && Triggers) {
241 m_hInjectionLERSVD->Divide(Hits, Triggers);
242 m_hInjectionLERSVDOcc->Divide(Hits, Triggers, 100, 768 * 7 * 2);
245 m_cInjectionLERSVD->Clear();
246 m_cInjectionLERSVD->cd(0);
247 m_hInjectionLERSVD->Draw(
"hist");
249 m_cInjectionLERSVDOcc->Clear();
250 m_cInjectionLERSVDOcc->cd(0);
251 m_hInjectionLERSVDOcc->Draw(
"hist");
253 locationHits =
"SVDOccInjHER";
254 if (m_histogramDirectoryName !=
"") {
255 locationHits = m_histogramDirectoryName +
"/" + locationHits;
257 Hits = (TH1*)findHist(locationHits.Data());
258 locationTriggers =
"SVDTrgOccInjHER";
259 if (m_histogramDirectoryName !=
"") {
260 locationTriggers = m_histogramDirectoryName +
"/" + locationTriggers;
262 Triggers = (TH1*)findHist(locationTriggers.Data());
266 if (Hits && Triggers) {
267 m_hInjectionHERSVD->Divide(Hits, Triggers);
268 m_hInjectionHERSVDOcc->Divide(Hits, Triggers, 100, 768 * 2 * 7);
271 m_cInjectionHERSVD->Clear();
272 m_cInjectionHERSVD->cd(0);
273 m_hInjectionHERSVD->Draw(
"hist");
275 m_cInjectionHERSVDOcc->Clear();
276 m_cInjectionHERSVDOcc->cd(0);
277 m_hInjectionHERSVDOcc->Draw(
"hist");
281 m_histogramDirectoryName =
"ECLINJ";
283 locationHits =
"ECLHitsInjLER";
284 if (m_histogramDirectoryName !=
"") {
285 locationHits = m_histogramDirectoryName +
"/" + locationHits;
287 Hits = (TH1*)findHist(locationHits.Data());
288 locationTriggers =
"ECLEHitsInjLER";
289 if (m_histogramDirectoryName !=
"") {
290 locationTriggers = m_histogramDirectoryName +
"/" + locationTriggers;
292 Triggers = (TH1*)findHist(locationTriggers.Data());
297 m_nodes[0].histo = Triggers;
300 if (Hits && Triggers) {
301 m_hInjectionLERECL->Divide(Hits, Triggers);
304 m_cInjectionLERECL->Clear();
305 m_cInjectionLERECL->cd(0);
306 m_hInjectionLERECL->Draw(
"hist");
308 locationHits =
"ECLHitsInjHER";
309 if (m_histogramDirectoryName !=
"") {
310 locationHits = m_histogramDirectoryName +
"/" + locationHits;
312 Hits = (TH1*)findHist(locationHits.Data());
313 locationTriggers =
"ECLEHitsInjHER";
314 if (m_histogramDirectoryName !=
"") {
315 locationTriggers = m_histogramDirectoryName +
"/" + locationTriggers;
317 Triggers = (TH1*)findHist(locationTriggers.Data());
322 m_nodes[3].histo = Triggers;
325 if (Hits && Triggers) {
326 m_hInjectionHERECL->Divide(Hits, Triggers);
329 m_cInjectionHERECL->Clear();
330 m_cInjectionHERECL->cd(0);
331 m_hInjectionHERECL->Draw(
"hist");
333 locationHits =
"ECLBurstsInjLER";
334 if (m_histogramDirectoryName !=
"") {
335 locationHits = m_histogramDirectoryName +
"/" + locationHits;
337 Hits = (TH1*)findHist(locationHits.Data());
338 locationTriggers =
"ECLEBurstsInjLER";
339 if (m_histogramDirectoryName !=
"") {
340 locationTriggers = m_histogramDirectoryName +
"/" + locationTriggers;
342 Triggers = (TH1*)findHist(locationTriggers.Data());
344 if (Hits && Triggers) {
345 m_hBurstLERECL->Divide(Hits, Triggers);
348 m_cBurstLERECL->Clear();
349 m_cBurstLERECL->cd(0);
350 m_hBurstLERECL->Draw(
"hist");
353 locationHits =
"ECLBurstsInjHER";
354 if (m_histogramDirectoryName !=
"") {
355 locationHits = m_histogramDirectoryName +
"/" + locationHits;
357 Hits = (TH1*)findHist(locationHits.Data());
358 locationTriggers =
"ECLEBurstsInjHER";
359 if (m_histogramDirectoryName !=
"") {
360 locationTriggers = m_histogramDirectoryName +
"/" + locationTriggers;
362 Triggers = (TH1*)findHist(locationTriggers.Data());
364 if (Hits && Triggers) {
365 m_hBurstHERECL->Divide(Hits, Triggers);
368 m_cBurstHERECL->Clear();
369 m_cBurstHERECL->cd(0);
370 m_hBurstHERECL->Draw(
"hist");
375 m_histogramDirectoryName =
"TOP";
377 locationHits =
"TOPOccInjLER";
378 if (m_histogramDirectoryName !=
"") {
379 locationHits = m_histogramDirectoryName +
"/" + locationHits;
381 Hits = (TH1*)findHist(locationHits.Data());
382 locationTriggers =
"TOPEOccInjLER";
383 if (m_histogramDirectoryName !=
"") {
384 locationTriggers = m_histogramDirectoryName +
"/" + locationTriggers;
386 Triggers = (TH1*)findHist(locationTriggers.Data());
388 if (Hits && Triggers) {
389 m_hInjectionLERTOP->Divide(Hits, Triggers, 100, 8192);
392 m_cInjectionLERTOP->Clear();
393 m_cInjectionLERTOP->cd(0);
394 m_hInjectionLERTOP->Draw(
"hist");
396 locationHits =
"TOPOccInjHER";
397 if (m_histogramDirectoryName !=
"") {
398 locationHits = m_histogramDirectoryName +
"/" + locationHits;
400 Hits = (TH1*)findHist(locationHits.Data());
401 locationTriggers =
"TOPEOccInjHER";
402 if (m_histogramDirectoryName !=
"") {
403 locationTriggers = m_histogramDirectoryName +
"/" + locationTriggers;
405 Triggers = (TH1*)findHist(locationTriggers.Data());
407 if (Hits && Triggers) {
408 m_hInjectionHERTOP->Divide(Hits, Triggers, 100, 8192);
411 m_cInjectionHERTOP->Clear();
412 m_cInjectionHERTOP->cd(0);
413 m_hInjectionHERTOP->Draw(
"hist");
418 m_histogramDirectoryName =
"ARICH";
420 locationHits =
"ARICHOccInjLER";
421 if (m_histogramDirectoryName !=
"") {
422 locationHits = m_histogramDirectoryName +
"/" + locationHits;
424 Hits = (TH1*)findHist(locationHits.Data());
425 locationTriggers =
"ARICHEOccInjLER";
426 if (m_histogramDirectoryName !=
"") {
427 locationTriggers = m_histogramDirectoryName +
"/" + locationTriggers;
429 Triggers = (TH1*)findHist(locationTriggers.Data());
431 if (Hits && Triggers) {
432 m_hInjectionLERARICH->Divide(Hits, Triggers);
435 m_cInjectionLERARICH->Clear();
436 m_cInjectionLERARICH->cd(0);
437 m_hInjectionLERARICH->Draw(
"hist");
439 locationHits =
"ARICHOccInjHER";
440 if (m_histogramDirectoryName !=
"") {
441 locationHits = m_histogramDirectoryName +
"/" + locationHits;
443 Hits = (TH1*)findHist(locationHits.Data());
444 locationTriggers =
"ARICHEOccInjHER";
445 if (m_histogramDirectoryName !=
"") {
446 locationTriggers = m_histogramDirectoryName +
"/" + locationTriggers;
448 Triggers = (TH1*)findHist(locationTriggers.Data());
450 if (Hits && Triggers) {
451 m_hInjectionHERARICH->Divide(Hits, Triggers);
454 m_cInjectionHERARICH->Clear();
455 m_cInjectionHERARICH->cd(0);
456 m_hInjectionHERARICH->Draw(
"hist");
459 m_histogramDirectoryName =
"KLM";
461 locationHits =
"KLMOccInjLER";
462 if (m_histogramDirectoryName !=
"") {
463 locationHits = m_histogramDirectoryName +
"/" + locationHits;
465 Hits = (TH1*)findHist(locationHits.Data());
466 locationTriggers =
"KLMTrigInjLER";
467 if (m_histogramDirectoryName !=
"") {
468 locationTriggers = m_histogramDirectoryName +
"/" + locationTriggers;
470 Triggers = (TH1*)findHist(locationTriggers.Data());
472 if (Hits && Triggers) {
473 m_hInjectionLERKLM->Divide(Hits, Triggers, 100, KLMElementNumbers::getTotalChannelNumber());
476 m_cInjectionLERKLM->Clear();
477 m_cInjectionLERKLM->cd(0);
478 m_hInjectionLERKLM->Draw(
"hist");
480 locationHits =
"KLMOccInjHER";
481 if (m_histogramDirectoryName !=
"") {
482 locationHits = m_histogramDirectoryName +
"/" + locationHits;
484 Hits = (TH1*)findHist(locationHits.Data());
485 locationTriggers =
"KLMTrigInjHER";
486 if (m_histogramDirectoryName !=
"") {
487 locationTriggers = m_histogramDirectoryName +
"/" + locationTriggers;
489 Triggers = (TH1*)findHist(locationTriggers.Data());
491 if (Hits && Triggers) {
492 m_hInjectionHERKLM->Divide(Hits, Triggers, 100, KLMElementNumbers::getTotalChannelNumber());
495 m_cInjectionHERKLM->Clear();
496 m_cInjectionHERKLM->cd(0);
497 m_hInjectionHERKLM->Draw(
"hist");
501 for (
auto& m : m_nodes) {
502 if (!m.mychid)
continue;
503 int length = m.data.size();
504 if (length !=
int(ca_element_count(m.mychid)) &&
int(ca_element_count(m.mychid)) > 0) {
506 m.data.resize(
int(ca_element_count(m.mychid)), 0.0);
507 length = m.data.size();
509 if (m.histo && m.histo->GetNcells() > 2 && length > 0 && length == int(ca_element_count(m.mychid))) {
512 if (m.histo->GetDimension() == 1) {
514 int nx = m.histo->GetNbinsX() + 1;
515 for (
int x = 1; x < nx && i < length ; x++) {
516 m.data[i++] = m.histo->GetBinContent(x);
519 }
else if (m.histo->GetDimension() == 2) {
521 int nx = m.histo->GetNbinsX() + 1;
522 int ny = m.histo->GetNbinsY() + 1;
523 for (
int y = 1; y < ny && i < length; y++) {
524 for (
int x = 1; x < nx && i < length ; x++) {
525 m.data[i++] = m.histo->GetBinContent(x, y);
529 SEVCHK(ca_array_put(DBR_DOUBLE, length, m.mychid, (
void*)m.data.data()),
"ca_put failure");
531 B2DEBUG(99,
"Inj " << ca_name(m.mychid) <<
" , " << m.histo <<
" , " << (m.histo ? m.histo->GetNcells() : 0) <<
" , " << length <<
534 ca_element_count(m.mychid));
537 SEVCHK(ca_pend_io(5.0),
"ca_pend_io failure");
542 void DQMHistInjectionModule::cleanPVs(
void)
546 for (
auto m : m_nodes) {
548 int length = int(ca_element_count(m.mychid));
550 m.data.resize(length, 0.0);
551 SEVCHK(ca_array_put(DBR_DOUBLE, length, m.mychid, (
void*)m.data.data()),
"ca_put failure");
553 B2DEBUG(99,
"clean: lenght " << ca_name(m.mychid));
556 B2DEBUG(99,
"clean: chid " << ca_name(m.mychid));
563 void DQMHistInjectionModule::terminate()
565 B2DEBUG(1,
"DQMHistInjection: terminate called");
568 for (
auto m : m_nodes) {
569 SEVCHK(ca_clear_channel(m.mychid),
"ca_clear_channel failure");
571 SEVCHK(ca_pend_io(5.0),
"ca_pend_io failure");
The base class for the histogram analysis module.
DQM Histogram Analysis for PXD Efficiency.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Abstract base class for different kinds of events.