59 TDirectory* oldDir = gDirectory;
70 m_BoolEvtMonitor =
new TH1D(
"BoolEvtMonitor",
"Event synchronization", 2, -0.5, 1.5);
78 m_window_vs_slot =
new TH2F(
"window_vs_slot",
"Asic windows", 16, 0.5, 16.5, 512, 0, 512);
87 m_eventT0 =
new TH1F(
"eventT0",
"Event T0; event T0 [ns]; events per bin", nbinsT0, -rangeT0 / 2, rangeT0 / 2);
94 m_time =
new TH1F(
"goodHitTimes",
"Time distribution of good hits", 1000, -20, 80);
95 m_time->SetXTitle(
"time [ns]");
96 m_time->SetYTitle(
"hits per bin");
98 m_timeBG =
new TH1F(
"goodHitTimesBG",
"Time distribution of good hits (background)", 1000, -20, 80);
100 m_timeBG->SetYTitle(
"hits per bin");
102 m_signalHits =
new TProfile(
"signalHits",
"Number of good hits per track in [0, 50] ns", 16, 0.5, 16.5, 0, 1000);
108 m_backgroundHits =
new TProfile(
"backgroundHits",
"Number of good hits pet track in [-50, 0] ns", 16, 0.5, 16.5, 0, 1000);
114 m_trackHits =
new TH2F(
"trackHits",
"Number of events w/ and w/o track in the slot", 16, 0.5, 16.5, 2, 0, 2);
118 int nbinsHits = 1000;
119 double xmaxHits = 10000;
120 m_goodHitsPerEventAll =
new TH1F(
"goodHitsPerEventAll",
"Number of good hits per event", nbinsHits, 0, xmaxHits);
124 m_badHitsPerEventAll =
new TH1F(
"badHitsPerEventAll",
"Number of junk hits per event", nbinsHits, 0, xmaxHits);
129 double xminTDC = -100;
130 double xmaxTDC = 700;
131 m_goodTDCAll =
new TH1F(
"goodTDCAll",
"Raw time distribution of good hits", nbinsTDC, xminTDC, xmaxTDC);
135 m_badTDCAll =
new TH1F(
"badTDCAll",
"Raw time distribution of junk hits", nbinsTDC, xminTDC, xmaxTDC);
139 m_TOPOccAfterInjLER =
new TH1F(
"TOPOccInjLER",
"TOPOccInjLER/Time;Time in #mus;Nhits/Time (#mus bins)", 4000, 0, 20000);
140 m_TOPOccAfterInjHER =
new TH1F(
"TOPOccInjHER",
"TOPOccInjHER/Time;Time in #mus;Nhits/Time (#mus bins)", 4000, 0, 20000);
141 m_TOPEOccAfterInjLER =
new TH1F(
"TOPEOccInjLER",
"TOPEOccInjLER/Time;Time in #mus;Triggers/Time (#mus bins)", 4000, 0, 20000);
142 m_TOPEOccAfterInjHER =
new TH1F(
"TOPEOccInjHER",
"TOPEOccInjHER/Time;Time in #mus;Triggers/Time (#mus bins)", 4000, 0, 20000);
145 "LER: average Nhits; "
146 "time since injection [msec]; time within beam cycle [syst. clk]; Nhits average",
147 160, 0, 80, 256, 0, 1280, 0, 100000);
149 "HER: average Nhits; "
150 "time since injection [msec]; time within beam cycle [syst. clk]; Nhits average",
151 160, 0, 80, 256, 0, 1280, 0, 100000);
153 "LER: average Nhits (Nhits>1000); "
154 "time since injection [msec]; time within beam cycle [syst. clk]; Nhits average",
155 160, 0, 80, 256, 0, 1280, 0, 100000);
157 "HER: average Nhits (Nhits>1000); "
158 "time since injection [msec]; time within beam cycle [syst. clk]; Nhits average",
159 160, 0, 80, 256, 0, 1280, 0, 100000);
161 "LER: event distribution; "
162 "time since injection [msec]; time within beam cycle [syst. clk]; events per bin",
163 160, 0, 80, 256, 0, 1280);
165 "HER: event distribution; "
166 "time since injection [msec]; time within beam cycle [syst. clk]; events per bin",
167 160, 0, 80, 256, 0, 1280);
169 "LER: event distribution (Nhits>1000); "
170 "time since injection [msec]; time within beam cycle [syst. clk]; events per bin",
171 160, 0, 80, 256, 0, 1280);
173 "HER: event distribution (Nhits>1000); "
174 "time since injection [msec]; time within beam cycle [syst. clk]; events per bin",
175 160, 0, 80, 256, 0, 1280);
183 name = str(format(
"window_vs_asic_%1%") % (module));
184 title = str(format(
"Asic windows for slot #%1%") % (module));
185 h2 =
new TH2F(name.c_str(), title.c_str(), 64, 0, 64, 512, 0, 512);
186 h2->SetStats(kFALSE);
187 h2->SetXTitle(
"ASIC number");
188 h2->SetYTitle(
"window number w.r.t reference window");
192 name = str(format(
"good_hits_xy_%1%") % (module));
193 title = str(format(
"Distribution of good hits for slot #%1%") % (module));
194 h2 =
new TH2F(name.c_str(), title.c_str(), 64, 0.5, 64.5, 8, 0.5, 8.5);
195 h2->SetStats(kFALSE);
196 h2->GetXaxis()->SetTitle(
"pixel column");
197 h2->GetYaxis()->SetTitle(
"pixel row");
201 name = str(format(
"bad_hits_xy_%1%") % (module));
202 title = str(format(
"Distribution of junk hits for slot #%1%") % (module));
203 h2 =
new TH2F(name.c_str(), title.c_str(), 64, 0.5, 64.5, 8, 0.5, 8.5);
204 h2->SetStats(kFALSE);
205 h2->GetXaxis()->SetTitle(
"pixel column");
206 h2->GetYaxis()->SetTitle(
"pixel row");
210 name = str(format(
"good_hits_asics_%1%") % (module));
211 title = str(format(
"Distribution of good hits for slot #%1%") % (module));
212 h2 =
new TH2F(name.c_str(), title.c_str(), 64, 0, 64, 8, 0, 8);
213 h2->SetStats(kFALSE);
214 h2->GetXaxis()->SetTitle(
"ASIC number");
215 h2->GetYaxis()->SetTitle(
"ASIC channel");
219 name = str(format(
"bad_hits_asics_%1%") % (module));
220 title = str(format(
"Distribution of junk hits for slot #%1%") % (module));
221 h2 =
new TH2F(name.c_str(), title.c_str(), 64, 0, 64, 8, 0, 8);
222 h2->SetStats(kFALSE);
223 h2->GetXaxis()->SetTitle(
"ASIC number");
224 h2->GetYaxis()->SetTitle(
"ASIC channel");
228 name = str(format(
"good_TDC_%1%") % (module));
229 title = str(format(
"Raw time distribution of good hits for slot #%1%") % (module));
230 h1 =
new TH1F(name.c_str(), title.c_str(), nbinsTDC, xminTDC, xmaxTDC);
231 h1->GetXaxis()->SetTitle(
"raw time [samples]");
232 h1->GetYaxis()->SetTitle(
"hits per sample");
235 name = str(format(
"bad_TDC_%1%") % (module));
236 title = str(format(
"Raw time distribution of junk hits for slot #%1%") % (module));
237 h1 =
new TH1F(name.c_str(), title.c_str(), nbinsTDC, xminTDC, xmaxTDC);
238 h1->GetXaxis()->SetTitle(
"raw time [samples]");
239 h1->GetYaxis()->SetTitle(
"hits per sample");
242 name = str(format(
"good_timing_%1%") % (module));
243 title = str(format(
"Time distribution of good hits for slot #%1%") % (module));
244 h1 =
new TH1F(name.c_str(), title.c_str(), 200, -20, 80);
245 h1->GetXaxis()->SetTitle(
"time [ns]");
246 h1->GetYaxis()->SetTitle(
"hits per time bin");
249 name = str(format(
"good_timing_%1%BG") % (module));
250 title = str(format(
"Time distribution of good hits (background) for slot #%1%") % (module));
251 h1 =
new TH1F(name.c_str(), title.c_str(), 200, -20, 80);
252 h1->GetXaxis()->SetTitle(
"time [ns]");
253 h1->GetYaxis()->SetTitle(
"hits per time bin");
256 name = str(format(
"good_channel_hits_%1%") % (module));
257 title = str(format(
"Distribution of good hits for slot #%1%") % (module));
258 int numPixels = geo->getModule(i + 1).getPMTArray().getNumPixels();
259 h1 =
new TH1F(name.c_str(), title.c_str(), numPixels, 0, numPixels);
260 h1->GetXaxis()->SetTitle(
"channel number");
261 h1->GetYaxis()->SetTitle(
"hits per channel");
265 name = str(format(
"bad_channel_hits_%1%") % (module));
266 title = str(format(
"Distribution of junk hits for slot #%1%") % (module));
267 h1 =
new TH1F(name.c_str(), title.c_str(), numPixels, 0, numPixels);
268 h1->GetXaxis()->SetTitle(
"channel number");
269 h1->GetYaxis()->SetTitle(
"hits per channel");
273 name = str(format(
"pulseHeights_%1%") % (module));
274 title = str(format(
"Average pulse heights for slot #%1%") % (module));
275 auto* prof =
new TProfile(name.c_str(), title.c_str(), 32, 0.5, 32.5, 0, 2000);
276 prof->GetXaxis()->SetTitle(
"PMT number");
277 prof->GetYaxis()->SetTitle(
"pulse height [ADC counts]");
278 prof->SetMarkerStyle(20);
283 m_skipProcFlag =
new TH2F(
"skipProcFlag",
"Skip processing flag; slot number; flag value", 64, 0.5, 16.5, 2, -0.5, 1.5);
288 m_injVetoFlag =
new TH2F(
"injVetoFlag",
"Injection veto flag; slot number; flag value", 64, 0.5, 16.5, 2, -0.5, 1.5);
293 m_injVetoFlagDiff =
new TH1F(
"injVetoFlagDiff",
"Injection veto flags check; ; fraction of events", 2, -0.5, 1.5);
301 m_PSBypassMode =
new TH2F(
"PSBypassMode",
"PS-bypass mode; slot number; mode", 64, 0.5, 16.5, 8, -0.5, 7.5);
380 bool recBunchValid =
false;
381 bool cosmics =
false;
383 recBunchValid =
m_recBunch->isReconstructed();
393 double offset =
m_recBunch->getCurrentOffset() - t0;
402 for (
const auto& digit :
m_digits) {
403 int x = digit.getFirstWindow() !=
m_digits[0]->getFirstWindow() ? 1 : 0 ;
412 for (
const auto& track :
m_tracks) {
413 const auto* fitResult = track.getTrackFitResultWithClosestMass(
Const::pion);
414 if (not fitResult)
continue;
416 if (slot == 0)
continue;
417 numTracks[slot - 1]++;
418 trackMomenta[slot - 1] = std::max(trackMomenta[slot - 1], fitResult->getMomentum().R());
423 if (recBunchValid or cosmics) {
424 for (
size_t i = 0; i < numTracks.size(); i++) {
425 bool hit = numTracks[i] > 0;
433 for (
size_t i = 0; i < selectedSlots.size(); i++) {
434 selectedSlots[i] = (recBunchValid or cosmics) and numTracks[i] == 1 and trackMomenta[i] >
m_momentumCut;
446 for (
const auto& digit :
m_digits) {
447 int slot = digit.getModuleID();
449 B2ERROR(
"Invalid slot ID found in TOPDigits: ID = " << slot);
452 int asic_no = digit.getChannel() / 8;
453 int asic_ch = digit.getChannel() % 8;
458 if (digit.getHitQuality() != TOPDigit::c_Junk) {
459 m_goodHitsXY[slot - 1]->Fill(digit.getPixelCol(), digit.getPixelRow());
461 m_goodTDC[slot - 1]->Fill(digit.getRawTime());
464 m_pulseHeights[slot - 1]->Fill(digit.getPMTNumber(), digit.getPulseHeight());
466 if (digit.hasStatus(TOPDigit::c_EventT0Subtracted)) {
467 double time = digit.getTime();
468 if (cosmics) time += 10;
469 if (numTracks[slot - 1] > 0) {
476 if (selectedSlots[slot - 1] and abs(time) < 50) {
477 if (time > 0) numSignalHits[slot - 1]++;
478 else numBackgroundHits[slot - 1]++;
482 m_badHitsXY[slot - 1]->Fill(digit.getPixelCol(), digit.getPixelRow());
484 m_badTDC[slot - 1]->Fill(digit.getRawTime());
496 if (selectedSlots[slot - 1]) {
505 B2DEBUG(29,
"TTD FTSW : " << hex << it.GetTTUtime(0) <<
" " << it.GetTTCtime(0) <<
" EvtNr " << it.GetEveNo(0) <<
" Type " <<
506 (it.GetTTCtimeTRGType(0) & 0xF) <<
" TimeSincePrev " << it.GetTimeSincePrevTrigger(0) <<
" TimeSinceInj " <<
507 it.GetTimeSinceLastInjection(0) <<
" IsHER " << it.GetIsHER(0) <<
" Bunch " << it.GetBunchNumber(0));
508 auto time_clk = it.GetTimeSinceLastInjection(0);
509 if (time_clk != 0x7FFFFFFF) {
510 unsigned int nentries =
m_digits.getEntries();
511 double time_us = time_clk / 127.0;
512 double time_ms = time_us / 1000;
513 double time_1280 = time_clk % 1280;
514 if (it.GetIsHER(0)) {
519 if (nHits_good > 1000) {
528 if (nHits_good > 1000) {
541 auto scrodID = dbg.getScrodID();
542 const auto* femap = feMapper.getMap(scrodID);
544 B2ERROR(
"No front-end map available for scrodID " << scrodID);
547 auto slot = femap->getModuleID();
548 auto bs = femap->getBoardstackNumber();
549 double x = slot + bs / 4. - 0.5;