Belle II Software development
TOPDQMModule.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8
9#include <top/modules/TOPDQM/TOPDQMModule.h>
10#include <top/geometry/TOPGeometryPar.h>
11#include <tracking/dataobjects/ExtHit.h>
12#include <framework/gearbox/Unit.h>
13#include <framework/gearbox/Const.h>
14#include <framework/logging/Logger.h>
15#include "TDirectory.h"
16#include <boost/format.hpp>
17#include <algorithm>
18#include <cmath>
19
20using namespace std;
21using boost::format;
22
23namespace Belle2 {
29 using namespace TOP;
30
31 //-----------------------------------------------------------------
33 //-----------------------------------------------------------------
34
35 REG_MODULE(TOPDQM);
36
37 //-----------------------------------------------------------------
38 // Implementation
39 //-----------------------------------------------------------------
40
42 {
43 // set module description (e.g. insert text)
44 setDescription("TOP DQM histogrammer");
46
47 // Add parameters
48 addParam("histogramDirectoryName", m_histogramDirectoryName,
49 "histogram directory in ROOT file", string("TOP"));
50 addParam("momentumCut", m_momentumCut,
51 "momentum cut used to histogram number of photons per track", 0.5);
52 }
53
54
56 {
57 }
58
60 {
61 // Create a separate histogram directory and cd into it.
62
63 TDirectory* oldDir = gDirectory;
64 oldDir->mkdir(m_histogramDirectoryName.c_str())->cd();
65
66 // Variables needed for booking
67
68 const auto* geo = TOPGeometryPar::Instance()->getGeometry();
69 m_numModules = geo->getNumModules();
70 m_bunchTimeSep = geo->getNominalTDC().getSyncTimeBase() / 24;
71
72 // Histograms
73
74 m_BoolEvtMonitor = new TH1D("BoolEvtMonitor", "Event synchronization", 2, -0.5, 1.5);
75 m_BoolEvtMonitor->GetYaxis()->SetTitle("number of digits");
76 m_BoolEvtMonitor->GetXaxis()->SetBinLabel(1, "synchronized");
77 m_BoolEvtMonitor->GetXaxis()->SetBinLabel(2, "de-synchronized");
78 m_BoolEvtMonitor->GetXaxis()->SetLabelSize(0.05);
79 m_BoolEvtMonitor->GetXaxis()->SetAlphanumeric();
80 m_BoolEvtMonitor->SetMinimum(0);
81
82 m_window_vs_slot = new TH2F("window_vs_slot", "Asic windows", 16, 0.5, 16.5, 512, 0, 512);
83 m_window_vs_slot->SetXTitle("slot number");
84 m_window_vs_slot->SetYTitle("window number w.r.t reference window");
85 m_window_vs_slot->SetStats(kFALSE);
86 m_window_vs_slot->SetMinimum(0);
87 m_window_vs_slot->GetXaxis()->SetNdivisions(16);
88
89 int nbinsT0 = 75;
90 double rangeT0 = nbinsT0 * m_bunchTimeSep;
91 m_eventT0 = new TH1F("eventT0", "Event T0; event T0 [ns]; events per bin", nbinsT0, -rangeT0 / 2, rangeT0 / 2);
92
93 m_bunchOffset = new TH1F("bunchOffset", "Bunch offset", 100, -m_bunchTimeSep / 2, m_bunchTimeSep / 2);
94 m_bunchOffset->SetXTitle("offset [ns]");
95 m_bunchOffset->SetYTitle("events per bin");
96 m_bunchOffset->SetMinimum(0);
97
98 m_time = new TH1F("goodHitTimes", "Time distribution of good hits", 1000, -20, 80);
99 m_time->SetXTitle("time [ns]");
100 m_time->SetYTitle("hits per bin");
101
102 m_timeBG = new TH1F("goodHitTimesBG", "Time distribution of good hits (background)", 1000, -20, 80);
103 m_timeBG->SetXTitle("time [ns]");
104 m_timeBG->SetYTitle("hits per bin");
105
106 m_signalHits = new TProfile("signalHits", "Number of good hits per track in [0, 50] ns", 16, 0.5, 16.5, 0, 1000);
107 m_signalHits->SetXTitle("slot number");
108 m_signalHits->SetYTitle("hits per track");
109 m_signalHits->SetMinimum(0);
110 m_signalHits->GetXaxis()->SetNdivisions(16);
111
112 m_backgroundHits = new TProfile("backgroundHits", "Number of good hits pet track in [-50, 0] ns", 16, 0.5, 16.5, 0, 1000);
113 m_backgroundHits->SetXTitle("slot number");
114 m_backgroundHits->SetYTitle("hits per track");
115 m_backgroundHits->SetMinimum(0);
116 m_backgroundHits->GetXaxis()->SetNdivisions(16);
117
118 m_trackHits = new TH2F("trackHits", "Number of events w/ and w/o track in the slot", 16, 0.5, 16.5, 2, 0, 2);
119 m_trackHits->SetXTitle("slot number");
120 m_trackHits->SetYTitle("numTracks > 0");
121
122 int nbinsHits = 1000;
123 double xmaxHits = 10000;
124 m_goodHitsPerEventAll = new TH1F("goodHitsPerEventAll", "Number of good hits per event", nbinsHits, 0, xmaxHits);
125 m_goodHitsPerEventAll->GetXaxis()->SetTitle("hits per event");
126 m_goodHitsPerEventAll->GetYaxis()->SetTitle("entries per bin");
127
128 m_badHitsPerEventAll = new TH1F("badHitsPerEventAll", "Number of junk hits per event", nbinsHits, 0, xmaxHits);
129 m_badHitsPerEventAll->GetXaxis()->SetTitle("hits per event");
130 m_badHitsPerEventAll->GetYaxis()->SetTitle("entries per bin");
131
132 int nbinsTDC = 400;
133 double xminTDC = -100;
134 double xmaxTDC = 700;
135 m_goodTDCAll = new TH1F("goodTDCAll", "Raw time distribution of good hits", nbinsTDC, xminTDC, xmaxTDC);
136 m_goodTDCAll->SetXTitle("raw time [samples]");
137 m_goodTDCAll->SetYTitle("hits per sample");
138
139 m_badTDCAll = new TH1F("badTDCAll", "Raw time distribution of junk hits", nbinsTDC, xminTDC, xmaxTDC);
140 m_badTDCAll->SetXTitle("raw time [samples]");
141 m_badTDCAll->SetYTitle("hits per sample");
142
143 m_TOPOccAfterInjLER = new TH1F("TOPOccInjLER", "TOPOccInjLER/Time;Time in #mus;Nhits/Time (#mus bins)", 4000, 0, 20000);
144 m_TOPOccAfterInjHER = new TH1F("TOPOccInjHER", "TOPOccInjHER/Time;Time in #mus;Nhits/Time (#mus bins)", 4000, 0, 20000);
145 m_TOPEOccAfterInjLER = new TH1F("TOPEOccInjLER", "TOPEOccInjLER/Time;Time in #mus;Triggers/Time (#mus bins)", 4000, 0, 20000);
146 m_TOPEOccAfterInjHER = new TH1F("TOPEOccInjHER", "TOPEOccInjHER/Time;Time in #mus;Triggers/Time (#mus bins)", 4000, 0, 20000);
147
148 for (int i = 0; i < m_numModules; i++) {
149 int module = i + 1;
150 string name, title;
151 TH1F* h1 = 0;
152 TH2F* h2 = 0;
153
154 name = str(format("window_vs_asic_%1%") % (module));
155 title = str(format("Asic windows for slot #%1%") % (module));
156 h2 = new TH2F(name.c_str(), title.c_str(), 64, 0, 64, 512, 0, 512);
157 h2->SetStats(kFALSE);
158 h2->SetXTitle("ASIC number");
159 h2->SetYTitle("window number w.r.t reference window");
160 h2->SetMinimum(0);
161 m_window_vs_asic.push_back(h2);
162
163 name = str(format("good_hits_xy_%1%") % (module));
164 title = str(format("Distribution of good hits for slot #%1%") % (module));
165 h2 = new TH2F(name.c_str(), title.c_str(), 64, 0.5, 64.5, 8, 0.5, 8.5);
166 h2->SetStats(kFALSE);
167 h2->GetXaxis()->SetTitle("pixel column");
168 h2->GetYaxis()->SetTitle("pixel row");
169 h2->SetMinimum(0);
170 m_goodHitsXY.push_back(h2);
171
172 name = str(format("bad_hits_xy_%1%") % (module));
173 title = str(format("Distribution of junk hits for slot #%1%") % (module));
174 h2 = new TH2F(name.c_str(), title.c_str(), 64, 0.5, 64.5, 8, 0.5, 8.5);
175 h2->SetStats(kFALSE);
176 h2->GetXaxis()->SetTitle("pixel column");
177 h2->GetYaxis()->SetTitle("pixel row");
178 h2->SetMinimum(0);
179 m_badHitsXY.push_back(h2);
180
181 name = str(format("good_hits_asics_%1%") % (module));
182 title = str(format("Distribution of good hits for slot #%1%") % (module));
183 h2 = new TH2F(name.c_str(), title.c_str(), 64, 0, 64, 8, 0, 8);
184 h2->SetStats(kFALSE);
185 h2->GetXaxis()->SetTitle("ASIC number");
186 h2->GetYaxis()->SetTitle("ASIC channel");
187 h2->SetMinimum(0);
188 m_goodHitsAsics.push_back(h2);
189
190 name = str(format("bad_hits_asics_%1%") % (module));
191 title = str(format("Distribution of junk hits for slot #%1%") % (module));
192 h2 = new TH2F(name.c_str(), title.c_str(), 64, 0, 64, 8, 0, 8);
193 h2->SetStats(kFALSE);
194 h2->GetXaxis()->SetTitle("ASIC number");
195 h2->GetYaxis()->SetTitle("ASIC channel");
196 h2->SetMinimum(0);
197 m_badHitsAsics.push_back(h2);
198
199 name = str(format("good_TDC_%1%") % (module));
200 title = str(format("Raw time distribution of good hits for slot #%1%") % (module));
201 h1 = new TH1F(name.c_str(), title.c_str(), nbinsTDC, xminTDC, xmaxTDC);
202 h1->GetXaxis()->SetTitle("raw time [samples]");
203 h1->GetYaxis()->SetTitle("hits per sample");
204 m_goodTDC.push_back(h1);
205
206 name = str(format("bad_TDC_%1%") % (module));
207 title = str(format("Raw time distribution of junk hits for slot #%1%") % (module));
208 h1 = new TH1F(name.c_str(), title.c_str(), nbinsTDC, xminTDC, xmaxTDC);
209 h1->GetXaxis()->SetTitle("raw time [samples]");
210 h1->GetYaxis()->SetTitle("hits per sample");
211 m_badTDC.push_back(h1);
212
213 name = str(format("good_timing_%1%") % (module));
214 title = str(format("Time distribution of good hits for slot #%1%") % (module));
215 h1 = new TH1F(name.c_str(), title.c_str(), 200, -20, 80);
216 h1->GetXaxis()->SetTitle("time [ns]");
217 h1->GetYaxis()->SetTitle("hits per time bin");
218 m_goodTiming.push_back(h1);
219
220 name = str(format("good_timing_%1%BG") % (module));
221 title = str(format("Time distribution of good hits (background) for slot #%1%") % (module));
222 h1 = new TH1F(name.c_str(), title.c_str(), 200, -20, 80);
223 h1->GetXaxis()->SetTitle("time [ns]");
224 h1->GetYaxis()->SetTitle("hits per time bin");
225 m_goodTimingBG.push_back(h1);
226
227 name = str(format("good_channel_hits_%1%") % (module));
228 title = str(format("Distribution of good hits for slot #%1%") % (module));
229 int numPixels = geo->getModule(i + 1).getPMTArray().getNumPixels();
230 h1 = new TH1F(name.c_str(), title.c_str(), numPixels, 0, numPixels);
231 h1->GetXaxis()->SetTitle("channel number");
232 h1->GetYaxis()->SetTitle("hits per channel");
233 h1->SetMinimum(0);
234 m_goodChannelHits.push_back(h1);
235
236 name = str(format("bad_channel_hits_%1%") % (module));
237 title = str(format("Distribution of junk hits for slot #%1%") % (module));
238 h1 = new TH1F(name.c_str(), title.c_str(), numPixels, 0, numPixels);
239 h1->GetXaxis()->SetTitle("channel number");
240 h1->GetYaxis()->SetTitle("hits per channel");
241 h1->SetMinimum(0);
242 m_badChannelHits.push_back(h1);
243
244 name = str(format("pulseHeights_%1%") % (module));
245 title = str(format("Average pulse heights for slot #%1%") % (module));
246 auto* prof = new TProfile(name.c_str(), title.c_str(), 32, 0.5, 32.5, 0, 2000);
247 prof->GetXaxis()->SetTitle("PMT number");
248 prof->GetYaxis()->SetTitle("pulse height [ADC counts]");
249 prof->SetMarkerStyle(20);
250 prof->SetMinimum(0);
251 m_pulseHeights.push_back(prof);
252 }
253
254 // cd back to root directory
255 oldDir->cd();
256 }
257
259 {
260 // Register histograms (calls back defineHisto)
261
262 REG_HISTOGRAM;
263
264 // register dataobjects
265
266 m_rawFTSW.isOptional();
267 m_digits.isRequired();
268 m_recBunch.isOptional();
269 m_timeZeros.isOptional();
270 m_tracks.isOptional();
271
272 }
273
275 {
276 m_BoolEvtMonitor->Reset();
277 m_window_vs_slot->Reset();
278 m_eventT0->Reset();
279 m_bunchOffset->Reset();
280 m_time->Reset();
281 m_timeBG->Reset();
282 m_signalHits->Reset();
283 m_backgroundHits->Reset();
284 m_trackHits->Reset();
285 m_goodTDCAll->Reset();
286 m_badTDCAll->Reset();
287 m_goodHitsPerEventAll->Reset();
288 m_badHitsPerEventAll->Reset();
289 m_TOPOccAfterInjLER->Reset();
290 m_TOPOccAfterInjHER->Reset();
291 m_TOPEOccAfterInjLER->Reset();
292 m_TOPEOccAfterInjHER->Reset();
293
294 for (int i = 0; i < m_numModules; i++) {
295 m_window_vs_asic[i]->Reset();
296 m_goodHitsXY[i]->Reset();
297 m_badHitsXY[i]->Reset();
298 m_goodHitsAsics[i]->Reset();
299 m_badHitsAsics[i]->Reset();
300 m_goodTDC[i]->Reset();
301 m_badTDC[i]->Reset();
302 m_goodTiming[i]->Reset();
303 m_goodTimingBG[i]->Reset();
304 m_goodChannelHits[i]->Reset();
305 m_badChannelHits[i]->Reset();
306 m_pulseHeights[i]->Reset();
307 }
308 }
309
311 {
312
313 // check if event time is reconstructed; distinguish collision data and cosmics
314
315 bool recBunchValid = false;
316 bool cosmics = false;
317 if (m_recBunch.isValid()) { // collision data
318 recBunchValid = m_recBunch->isReconstructed(); // event time is reconstructed
319 } else if (m_timeZeros.getEntries() == 1) { // cosmics w/ reconstructed event time
320 cosmics = true;
321 m_eventT0->Fill(m_timeZeros[0]->getTime());
322 }
323
324 // fill bunch offset
325
326 if (recBunchValid) {
327 double t0 = m_commonT0->isRoughlyCalibrated() ? m_commonT0->getT0() : 0;
328 double offset = m_recBunch->getCurrentOffset() - t0;
329 offset -= m_bunchTimeSep * lround(offset / m_bunchTimeSep); // wrap around
330 m_bunchOffset->Fill(offset);
331 m_eventT0->Fill(m_recBunch->getTime());
332 }
333
334 // fill event desynchronization
335
336 if (m_digits.getEntries() > 0) {
337 for (const auto& digit : m_digits) {
338 int x = digit.getFirstWindow() != m_digits[0]->getFirstWindow() ? 1 : 0 ;
339 m_BoolEvtMonitor->Fill(x);
340 }
341 }
342
343 // count tracks in the modules and store the momenta
344
345 std::vector<int> numTracks(m_numModules, 0);
346 std::vector<double> trackMomenta(m_numModules, 0);
347 for (const auto& track : m_tracks) {
348 const auto* fitResult = track.getTrackFitResultWithClosestMass(Const::pion);
349 if (not fitResult) continue;
350 int slot = getModuleID(track);
351 if (slot == 0) continue;
352 numTracks[slot - 1]++;
353 trackMomenta[slot - 1] = std::max(trackMomenta[slot - 1], fitResult->getMomentum().R());
354 }
355
356 // count events w/ and w/o track in the slot
357
358 if (recBunchValid or cosmics) {
359 for (size_t i = 0; i < numTracks.size(); i++) {
360 bool hit = numTracks[i] > 0;
361 m_trackHits->Fill(i + 1, hit);
362 }
363 }
364
365 // select modules for counting hits in signal and background time windows
366
367 std::vector<bool> selectedSlots(m_numModules, false);
368 for (size_t i = 0; i < selectedSlots.size(); i++) {
369 selectedSlots[i] = (recBunchValid or cosmics) and numTracks[i] == 1 and trackMomenta[i] > m_momentumCut;
370 }
371
372 // prepare counters
373
374 int nHits_good = 0;
375 int nHits_bad = 0;
376 std::vector<int> numSignalHits(m_numModules, 0);
377 std::vector<int> numBackgroundHits(m_numModules, 0);
378
379 // loop over digits, fill histograms and increment counters
380
381 for (const auto& digit : m_digits) {
382 int slot = digit.getModuleID();
383 if (slot < 1 or slot > m_numModules) {
384 B2ERROR("Invalid slot ID found in TOPDigits: ID = " << slot);
385 continue;
386 }
387 int asic_no = digit.getChannel() / 8;
388 int asic_ch = digit.getChannel() % 8;
389
390 m_window_vs_slot->Fill(digit.getModuleID(), digit.getRawTime() / 64 + 220);
391 m_window_vs_asic[slot - 1]->Fill(asic_no, digit.getRawTime() / 64 + 220);
392
393 if (digit.getHitQuality() != TOPDigit::c_Junk) { // good hits
394 m_goodHitsXY[slot - 1]->Fill(digit.getPixelCol(), digit.getPixelRow());
395 m_goodHitsAsics[slot - 1]->Fill(asic_no, asic_ch);
396 m_goodTDC[slot - 1]->Fill(digit.getRawTime());
397 m_goodTDCAll->Fill(digit.getRawTime());
398 m_goodChannelHits[slot - 1]->Fill(digit.getChannel());
399 m_pulseHeights[slot - 1]->Fill(digit.getPMTNumber(), digit.getPulseHeight());
400 nHits_good++;
401 if (digit.hasStatus(TOPDigit::c_EventT0Subtracted)) {
402 double time = digit.getTime();
403 if (cosmics) time += 10; // move for 10 ns in order to get the complete signal at positive times
404 if (numTracks[slot - 1] > 0) {
405 m_goodTiming[slot - 1]->Fill(time);
406 m_time->Fill(time);
407 } else {
408 m_goodTimingBG[slot - 1]->Fill(time);
409 m_timeBG->Fill(time);
410 }
411 if (selectedSlots[slot - 1] and abs(time) < 50) {
412 if (time > 0) numSignalHits[slot - 1]++;
413 else numBackgroundHits[slot - 1]++;
414 }
415 }
416 } else { // bad hits: FE not valid, pedestal jump, too short or too wide pulses
417 m_badHitsXY[slot - 1]->Fill(digit.getPixelCol(), digit.getPixelRow());
418 m_badHitsAsics[slot - 1]->Fill(asic_no, asic_ch);
419 m_badTDC[slot - 1]->Fill(digit.getRawTime());
420 m_badTDCAll->Fill(digit.getRawTime());
421 m_badChannelHits[slot - 1]->Fill(digit.getChannel());
422 nHits_bad++;
423 }
424 }
425
426 // histogram counters
427
428 m_goodHitsPerEventAll->Fill(nHits_good);
429 m_badHitsPerEventAll->Fill(nHits_bad);
430 for (int slot = 1; slot <= m_numModules; slot++) {
431 if (selectedSlots[slot - 1]) {
432 m_signalHits->Fill(slot, numSignalHits[slot - 1]);
433 m_backgroundHits->Fill(slot, numBackgroundHits[slot - 1]);
434 }
435 }
436
437 // fill injection histograms
438
439 for (auto& it : m_rawFTSW) {
440 B2DEBUG(29, "TTD FTSW : " << hex << it.GetTTUtime(0) << " " << it.GetTTCtime(0) << " EvtNr " << it.GetEveNo(0) << " Type " <<
441 (it.GetTTCtimeTRGType(0) & 0xF) << " TimeSincePrev " << it.GetTimeSincePrevTrigger(0) << " TimeSinceInj " <<
442 it.GetTimeSinceLastInjection(0) << " IsHER " << it.GetIsHER(0) << " Bunch " << it.GetBunchNumber(0));
443 auto difference = it.GetTimeSinceLastInjection(0);
444 if (difference != 0x7FFFFFFF) {
445 unsigned int nentries = m_digits.getEntries();
446 float diff2 = difference / 127.; // 127MHz clock ticks to us, inexact rounding
447 if (it.GetIsHER(0)) {
448 m_TOPOccAfterInjHER->Fill(diff2, nentries);
449 m_TOPEOccAfterInjHER->Fill(diff2);
450 } else {
451 m_TOPOccAfterInjLER->Fill(diff2, nentries);
452 m_TOPEOccAfterInjLER->Fill(diff2);
453 }
454 }
455 }
456
457 }
458
459
460 int TOPDQMModule::getModuleID(const Track& track) const
461 {
462 Const::EDetector myDetID = Const::EDetector::TOP;
463 int pdgCode = std::abs(Const::pion.getPDGCode());
464
465 RelationVector<ExtHit> extHits = track.getRelationsWith<ExtHit>();
466 for (const auto& extHit : extHits) {
467 if (std::abs(extHit.getPdgCode()) != pdgCode) continue;
468 if (extHit.getDetectorID() != myDetID) continue;
469 if (extHit.getCopyID() < 1 or extHit.getCopyID() > m_numModules) continue;
470 return extHit.getCopyID();
471 }
472
473 return 0;
474 }
475
476
478} // end Belle2 namespace
479
EDetector
Enum for identifying the detector components (detector and subdetector).
Definition: Const.h:42
static const ChargedStable pion
charged pion particle
Definition: Const.h:661
Store one Ext hit as a ROOT object.
Definition: ExtHit.h:31
int getCopyID() const
Get detector-element ID of sensitive element within detector.
Definition: ExtHit.h:125
HistoModule.h is supposed to be used instead of Module.h for the modules with histogram definitions t...
Definition: HistoModule.h:29
void setDescription(const std::string &description)
Sets the description of the module.
Definition: Module.cc:214
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
Definition: Module.cc:208
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
Definition: Module.h:80
Class for type safe access to objects that are referred to in relations.
std::vector< TH2F * > m_window_vs_asic
Histograms window w.r.t reference vs.
Definition: TOPDQMModule.h:114
std::vector< TH1F * > m_badChannelHits
Histograms for bad channel hits.
Definition: TOPDQMModule.h:124
int m_numModules
number of TOP modules
Definition: TOPDQMModule.h:128
std::vector< TH2F * > m_goodHitsXY
Histograms (2D) for good hits in pixels.
Definition: TOPDQMModule.h:115
std::vector< TH2F * > m_goodHitsAsics
Histograms (2D) for good hits in asic channels.
Definition: TOPDQMModule.h:117
StoreObjPtr< TOPRecBunch > m_recBunch
reconstructed bunch and event T0
Definition: TOPDQMModule.h:134
DBObjPtr< TOPCalCommonT0 > m_commonT0
common T0 calibration constants
Definition: TOPDQMModule.h:139
double m_momentumCut
momentum cut
Definition: TOPDQMModule.h:91
std::vector< TH2F * > m_badHitsXY
Histograms (2D) for bad hits in pixels.
Definition: TOPDQMModule.h:116
TH1F * m_bunchOffset
reconstructed bunch: current offset
Definition: TOPDQMModule.h:97
TProfile * m_backgroundHits
number of hits in the background time window vs.
Definition: TOPDQMModule.h:101
std::vector< TH1F * > m_badTDC
Histograms for TDC distribution of bad hits.
Definition: TOPDQMModule.h:120
std::vector< TH1F * > m_goodChannelHits
Histograms for good channel hits.
Definition: TOPDQMModule.h:123
TH1F * m_eventT0
reconstructed event T0
Definition: TOPDQMModule.h:96
StoreArray< RawFTSW > m_rawFTSW
Input array for DAQ Status.
Definition: TOPDQMModule.h:132
TH2F * m_window_vs_slot
Histogram window w.r.t reference vs.
Definition: TOPDQMModule.h:95
std::vector< TH1F * > m_goodTDC
Histograms for TDC distribution of good hits.
Definition: TOPDQMModule.h:119
std::vector< TH1F * > m_goodTimingBG
Histograms for timing distribution of good hits (background)
Definition: TOPDQMModule.h:122
TH1F * m_timeBG
time distribution of good hits (background)
Definition: TOPDQMModule.h:99
TH1F * m_TOPEOccAfterInjHER
Histogram for Nr Entries (=Triggrs) for normalization after HER injection.
Definition: TOPDQMModule.h:112
std::string m_histogramDirectoryName
histogram directory in ROOT file
Definition: TOPDQMModule.h:90
StoreArray< Track > m_tracks
collection of tracks
Definition: TOPDQMModule.h:136
TH1F * m_badHitsPerEventAll
Number of bad hits per event (all slots)
Definition: TOPDQMModule.h:105
TH1F * m_TOPEOccAfterInjLER
Histogram for Nr Entries (=Triggrs) for normalization after LER injection.
Definition: TOPDQMModule.h:111
std::vector< TH1F * > m_goodTiming
Histograms for timing distribution of good hits.
Definition: TOPDQMModule.h:121
TH1F * m_time
time distribution of good hits
Definition: TOPDQMModule.h:98
TH1F * m_goodTDCAll
TDC distribution of good hits (all slots)
Definition: TOPDQMModule.h:106
TH1F * m_TOPOccAfterInjLER
Histogram Ndigits after LER injection.
Definition: TOPDQMModule.h:109
StoreArray< TOPDigit > m_digits
collection of digits
Definition: TOPDQMModule.h:133
std::vector< TProfile * > m_pulseHeights
Pulse heights of good hits.
Definition: TOPDQMModule.h:125
StoreArray< TOPTimeZero > m_timeZeros
reconstructed event T0 in case of cosmics
Definition: TOPDQMModule.h:135
TProfile * m_signalHits
number of hits in the signal time window vs.
Definition: TOPDQMModule.h:100
TH2F * m_trackHits
counting events w/ and w/o track in the slot vs.
Definition: TOPDQMModule.h:102
double m_bunchTimeSep
bunch separation time
Definition: TOPDQMModule.h:129
TH1D * m_BoolEvtMonitor
Event desynchronization monitoring.
Definition: TOPDQMModule.h:94
std::vector< TH2F * > m_badHitsAsics
Histograms (2D) for bad hits in asic channels.
Definition: TOPDQMModule.h:118
TH1F * m_TOPOccAfterInjHER
Histogram Ndigits after HER injection.
Definition: TOPDQMModule.h:110
TH1F * m_badTDCAll
TDC distribution of bad hits (all slots)
Definition: TOPDQMModule.h:107
TH1F * m_goodHitsPerEventAll
Number of good hits per event (all slots)
Definition: TOPDQMModule.h:104
const TOPGeometry * getGeometry() const
Returns pointer to geometry object using basf2 units.
static TOPGeometryPar * Instance()
Static method to obtain the pointer to its instance.
Class that bundles various TrackFitResults.
Definition: Track.h:25
void addParam(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
Definition: Module.h:560
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:650
TOPDQMModule()
Constructor.
Definition: TOPDQMModule.cc:41
virtual void initialize() override
Initialize the Module.
virtual void event() override
Event processor.
virtual ~TOPDQMModule()
Destructor.
Definition: TOPDQMModule.cc:55
virtual void beginRun() override
Called when entering a new run.
int getModuleID(const Track &track) const
Returns slot ID of the module that is hit by the track.
virtual void defineHisto() override
Histogram definitions such as TH1(), TH2(), TNtuple(), TTree()....
Definition: TOPDQMModule.cc:59
Abstract base class for different kinds of events.
STL namespace.