3#include "BmnEventHeader.h"
4#include "BmnStripDigit.h"
5#include "BmnTof1Digit.h"
6#include "BmnTrigDigit.h"
7#include "BmnTrigWaveDigit.h"
8#include "FairRootManager.h"
10#include <TClonesArray.h>
22 : FairTask(
"BmnEventSelector")
24 LOG(debug) <<
"Default Constructor of BmnEventSelector";
30 LOG(debug) <<
"Destructor of BmnEventSelector";
36 LOG(debug) <<
"SetParContainers of BmnEventSelector";
48T BmnEventSelector::ReadBranch(
const char* name)
50 auto branch = (T)ioman->GetObject(name);
52 LOG(fatal) << Form(
"BmnEventSelector: %s branch not found!!!\n", name);
56bool BmnEventSelector::FitRunDistr(std::string histName, std::vector<double>& fitPar,
float fitMin,
float fitMax)
59 LOG(info) << __func__ <<
": " << histName;
61 auto h2 =
static_cast<TH2*
>(fInputFile->Get(histName.c_str()));
63 fNoCalibrationData =
true;
64 LOG(error) <<
"No input histogram: " << histName;
67 auto runBin = h2->GetXaxis()->FindBin(fRunId);
68 auto h1 = h2->ProjectionY(Form(
"%s_fit", h2->GetName()), runBin, runBin);
69 if (!h1 || h1->GetEntries() == 0) {
70 fNoCalibrationData =
true;
71 LOG(error) <<
"No input histogram " << histName <<
" for run number " << fRunId;
73 h1->Fit(
"gaus",
"",
"", fitMin, fitMax);
74 auto f = (TF1*)h1->GetListOfFunctions()->FindObject(
"gaus");
76 fNoCalibrationData =
true;
77 LOG(error) <<
"ERROR fitting distribution for run number " << fRunId;
80 if (fFillCalibrationHists)
82 fitPar = {
f->GetParameter(0),
f->GetParameter(1),
f->GetParameter(2)};
89 LOG(debug) <<
"Initilization of BmnEventSelector";
91 if (fFillCalibrationHists) {
92 fOutputFile =
new TFile(fOutputFileName.c_str(),
"recreate");
93 fOutputList =
new TList;
97 fInputFile =
new TFile(fInputFileName.c_str());
98 if (fInputFile->IsOpen()) {
99 vector<double> fitPar;
100 if (FitRunDistr(
"h2runId_time_SingleBC1S", fitPar, 2000, 2500))
101 fSingleBC1hitTimeMean = fitPar.at(1);
102 LOG(info) <<
"fSingleBC1hitTimeMean=" << fSingleBC1hitTimeMean;
104 if (FitRunDistr(
"h2runId_shapeShifted_SingleBC1S", fitPar, 0, 100)) {
105 fBC1SpeakTimeMin = fitPar.at(1) - 2 * fitPar.at(2);
106 fBC1SpeakTimeMax = fitPar.at(1) + 2 * fitPar.at(2);
108 LOG(info) <<
"fBC1SpeakTimeMin=" << fBC1SpeakTimeMin <<
"\tfBC1SpeakTimeMax=" << fBC1SpeakTimeMax;
110 if (FitRunDistr(
"h2runId_time_SingleVCS_BC1S", fitPar, -10, 10)) {
111 fSingleVCS_BC1S_hitTimeMin = fitPar.at(1) - 10;
112 fSingleVCS_BC1S_hitTimeMax = fitPar.at(1) + 10;
114 LOG(info) <<
"fSingleVCS_BC1S_hitTimeMin=" << fSingleVCS_BC1S_hitTimeMin
115 <<
"\tfSingleVCS_BC1S_hitTimeMax=" << fSingleVCS_BC1S_hitTimeMax;
117 if (FitRunDistr(
"h2runId_shapeShiftedBC1S_SingleVCS", fitPar, 0, 80)) {
118 fVCSpeakTimeMin = fitPar.at(1) - 2 * fitPar.at(2);
119 fVCSpeakTimeMax = fitPar.at(1) + 2 * fitPar.at(2);
121 LOG(info) <<
"fVCSpeakTimeMin=" << fVCSpeakTimeMin <<
"\tfVCSpeakTimeMax=" << fVCSpeakTimeMax;
123 if (FitRunDistr(
"h2runId_time_SingleBC2AS_BC1S", fitPar, -20, 0)) {
124 fSingleBC2AS_BC1S_hitTimeMin = fitPar.at(1) - 2;
125 fSingleBC2AS_BC1S_hitTimeMax = fitPar.at(1) + 2;
127 LOG(info) <<
"fSingleBC2AS_BC1S_hitTimeMin=" << fSingleBC2AS_BC1S_hitTimeMin
128 <<
"\tfSingleBC2AS_BC1S_hitTimeMax=" << fSingleBC2AS_BC1S_hitTimeMax;
130 if (FitRunDistr(
"h2runId_shapeShiftedBC1S_SingleBC2AS", fitPar, 0, 80)) {
131 fBC2ASpeakTimeMin = fitPar.at(1) - 2 * fitPar.at(2);
132 fBC2ASpeakTimeMax = fitPar.at(1) + 2 * fitPar.at(2);
134 LOG(info) <<
"fBC2ASpeakTimeMin=" << fBC2ASpeakTimeMin <<
"\tfBC2ASpeakTimeMax=" << fBC2ASpeakTimeMax;
136 if (FitRunDistr(
"h2runId_peak_BC2AS", fitPar, 0., 1.e4))
137 fSingleBC2ASpeakMin = fitPar.at(1) - 3 * fitPar.at(2);
138 LOG(info) <<
"\tfSingleBC2ASpeakMin=" << fSingleBC2ASpeakMin;
140 if (FitRunDistr(
"h2runId_time_SingleFD_BC1S", fitPar, 100, 200)) {
141 fSingleFD_BC1S_hitTimeMin = fitPar.at(1) - 10;
142 fSingleFD_BC1S_hitTimeMax = fitPar.at(1) + 20;
144 LOG(info) <<
"fSingleFD_BC1S_hitTimeMin=" << fSingleFD_BC1S_hitTimeMin
145 <<
"\tfSingleFD_BC1S_hitTimeMax=" << fSingleFD_BC1S_hitTimeMax;
147 if (FitRunDistr(
"h2runId_shapeShiftedBC1S_SingleFD", fitPar, 150, 250)) {
148 fFDpeakTimeMin = fitPar.at(1) - 2 * fitPar.at(2);
149 fFDpeakTimeMax = fitPar.at(1) + 2 * fitPar.at(2);
151 LOG(info) <<
"fFDpeakTimeMin=" << fFDpeakTimeMin <<
"\tfFDpeakTimeMax=" << fFDpeakTimeMax;
153 if (FitRunDistr(
"h2runId_peak_FD_nc", fitPar, 4.e3, 7.e3))
154 fSingleFDpeakMin = fitPar.at(1) - 3 * fitPar.at(2);
155 LOG(info) <<
"\tfSingleFDpeakMin=" << fSingleFDpeakMin;
157 if (FitRunDistr(
"h2runId_shapeShiftedBC1S_BD", fitPar, -150, -50)) {
158 fBDtimeMin = fitPar.at(1) - 3 * fitPar.at(2);
159 fBDtimeMax = fitPar.at(1) + 3 * fitPar.at(2);
161 LOG(info) <<
"fBDtimeMin=" << fBDtimeMin <<
"\tfBDtimeMax=" << fBDtimeMax;
163 if (FitRunDistr(
"h2runId_shapeShiftedBC1S_TOF400digit", fitPar)) {
164 fTOF400digitTimeMin = fitPar.at(1) - 3 * fitPar.at(2);
165 fTOF400digitTimeMax = fitPar.at(1) + 3 * fitPar.at(2);
167 LOG(info) <<
"fTOF400digitTimeMin=" << fTOF400digitTimeMin <<
"\tfTOF400digitTimeMax=" << fTOF400digitTimeMax;
169 if (FitRunDistr(
"h2runId_shapeShiftedBC1S_TOF700digit", fitPar)) {
170 fTOF700digitTimeMin = fitPar.at(1) - 3 * fitPar.at(2);
171 fTOF700digitTimeMax = fitPar.at(1) + 3 * fitPar.at(2);
173 LOG(info) <<
"fTOF700digitTimeMin=" << fTOF700digitTimeMin <<
"\tfTOF700digitTimeMax=" << fTOF700digitTimeMax;
176 fNoCalibrationData =
true;
177 LOG(error) <<
"No input histogram file!!!";
180 ioman = FairRootManager::Instance();
182 LOG(fatal) <<
"Init" <<
"FairRootManager is not instantiated";
185 fEventHeader = ReadBranch<BmnEventHeader*>(
"BmnEventHeader.");
186 fArrTQDC_BC1S = ReadBranch<TClonesArray*>(
"TQDC_BC1S");
187 fArrTQDC_VCS = ReadBranch<TClonesArray*>(
"TQDC_VCS");
188 fArrTQDC_BC2AS = ReadBranch<TClonesArray*>(
"TQDC_BC2AS");
189 fArrTQDC_FD = ReadBranch<TClonesArray*>(
"TQDC_FD");
190 fArrBDdigits = ReadBranch<TClonesArray*>(
"BD");
191 fArrTOF400digits = ReadBranch<TClonesArray*>(
"TOF400");
192 fArrTOF700digits = ReadBranch<TClonesArray*>(
194 fArrSILICONdigits = ReadBranch<TClonesArray*>(
"SILICON");
195 fArrGEMdigits = ReadBranch<TClonesArray*>(
"GEM");
197 ioman->Register(
"BmnBC1hitInfo.",
"BC1hitInfo", &fBC1hitInfo, fWriteBC1hitInfo);
204 h2runId_eventClass = AddHist(
new TH2F(
"h2runId_eventClass",
"Event class;runId;Event class", 1, fRunId, fRunId + 1,
209 new TH2F(
"h2runId_time",
"TDC time;runId;TDC time (ns);N entries", 1, fRunId, fRunId + 1, 900, 0, 3600);
210 h2runId_time_SingleBC1S = AddHistClone(h2runId_time,
"_SingleBC1S");
211 h2runId_time_BC1S_k0 = AddHistClone(h2runId_time,
"_BC1S_k0");
212 h2runId_time_BC1S_k1 = AddHistClone(h2runId_time,
"_BC1S_k1");
213 h2runId_time_BC1S_kV0 = AddHistClone(h2runId_time,
"_BC1S_kV0");
214 h2runId_time_BC1S_kV1 = AddHistClone(h2runId_time,
"_BC1S_kV1");
215 h2runId_time_SingleVCS_BC1S = AddHistClone(h2runId_time,
"_SingleVCS_BC1S");
216 h2runId_time_SingleVCS_BC1S->GetYaxis()->SetLimits(-50, 50);
217 h2runId_time_SingleBC2AS_BC1S = AddHistClone(h2runId_time,
"_SingleBC2AS_BC1S");
218 h2runId_time_SingleBC2AS_BC1S->GetYaxis()->SetLimits(-20, 0);
219 h2runId_time_SingleFD_BC1S = AddHistClone(h2runId_time,
"_SingleFD_BC1S");
220 h2runId_time_SingleFD_BC1S->GetYaxis()->SetLimits(-50, 200);
222 new TH2F(
"h2runId_shape",
"TQDC shape;runId;Time (ns);TQDC signal", 1, fRunId, fRunId + 1, 500, -400, 3600);
223 h2runId_shapeShifted_SingleBC1S = AddHistClone(h2runId_shape,
"Shifted_SingleBC1S");
224 h2runId_shapeShiftedBC1S_SingleVCS = AddHistClone(h2runId_shape,
"ShiftedBC1S_SingleVCS");
225 h2runId_shapeShiftedBC1S_SingleBC2AS = AddHistClone(h2runId_shape,
"ShiftedBC1S_SingleBC2AS");
226 h2runId_shapeShiftedBC1S_SingleFD = AddHistClone(h2runId_shape,
"ShiftedBC1S_SingleFD");
227 h2runId_shapeShiftedBC1S_BD = AddHistClone(h2runId_shape,
"ShiftedBC1S_BD");
228 h2runId_shapeShiftedBC1S_BD->GetYaxis()->SetLimits(-450, 0);
230 AddHist(
new TH2F(
"h2runId_NdigitsBD",
"NdigitsBD;runId;NdigitsBD", 1, fRunId, fRunId + 1, 50, 0, 50));
232 AddHist(
new TH2F(
"h2runId_SumAmpBD",
"SumAmpBD;runId;SumAmpBD", 1, fRunId, fRunId + 1, 200, 0, 800));
233 h2runId_NdigitsBD_SingleBC1S = AddHistClone(h2runId_NdigitsBD,
"_SingleBC1S");
234 h2runId_SumAmpBD_SingleBC1S = AddHistClone(h2runId_SumAmpBD,
"_SingleBC1S");
235 h2runId_NdigitsBD_nc = AddHistClone(h2runId_NdigitsBD,
"_nc");
236 h2runId_SumAmpBD_nc = AddHistClone(h2runId_SumAmpBD,
"_nc");
237 auto h2runId_NdigitsTOF =
238 new TH2F(
"h2runId_NdigitsTOF",
"NdigitsTOF;runId;NdigitsTOF", 1, fRunId, fRunId + 1, 400, 0, 400);
239 h2runId_NdigitsTOF400 = AddHistClone(h2runId_NdigitsTOF,
"400");
240 h2runId_NdigitsTOF400_SingleBC1S = AddHistClone(h2runId_NdigitsTOF,
"400_SingleBC1S");
241 h2runId_NdigitsTOF400_nc = AddHistClone(h2runId_NdigitsTOF,
"400_nc");
242 h2runId_NdigitsTOF700 = AddHistClone(h2runId_NdigitsTOF,
"700");
243 h2runId_NdigitsTOF700_SingleBC1S = AddHistClone(h2runId_NdigitsTOF,
"700_SingleBC1S");
244 h2runId_NdigitsTOF700_nc = AddHistClone(h2runId_NdigitsTOF,
"700_nc");
245 auto h2runId_peak =
new TH2F(
"h2runId_peak",
"Peak;runId;Peak;N entries", 1, fRunId, fRunId + 1, 300, 0, 3e4);
246 h2runId_peak_SingleBC1S = AddHistClone(h2runId_peak,
"_SingleBC1S");
247 h2runId_peak_BC1S = AddHistClone(h2runId_peak,
"_BC1S");
248 h2runId_peak_SingleVCS = AddHistClone(h2runId_peak,
"_SingleVCS");
249 h2runId_peak_VCS = AddHistClone(h2runId_peak,
"_VCS");
250 h2runId_peak_SingleBC2AS = AddHistClone(h2runId_peak,
"_SingleBC2AS");
251 h2runId_peak_BC2AS = AddHistClone(h2runId_peak,
"_BC2AS");
252 h2runId_peak_SingleFD = AddHistClone(h2runId_peak,
"_SingleFD");
253 h2runId_peak_FD = AddHistClone(h2runId_peak,
"_FD");
254 h2runId_peak_FD_nc = AddHistClone(h2runId_peak,
"_FD_nc");
256 h2runId_shapeShiftedBC1S_TOF400digit =
257 AddHist(
new TH2F(
"h2runId_shapeShiftedBC1S_TOF400digit",
"TOF400 digit times;runId;Time (ns)", 1, fRunId,
258 fRunId + 1, 1000, -700, -600));
259 h2runId_shapeShiftedBC1S_TOF700digit =
260 AddHist(
new TH2F(
"h2runId_shapeShiftedBC1S_TOF700digit",
"TOF700 digit times;runId;Time (ns)", 1, fRunId,
261 fRunId + 1, 1000, -2300, -1800));
263 if (fFillPerformanceHists) {
264 vector<string> trigNames{
"BT",
"CCT1",
"CCT2",
"MBT"};
269 double(fRunMin), 0, 0, -2200, 0,
274 auto h5runId_trigger_eventClass_dt_n =
275 new THnSparseI(
"h5runId_trigger_eventClass_dt_n",
"Number of;runId;trigger;Event class;#Deltat (ns);N",
276 bins.size(), bins.data(), xmin.data(), xmax.data());
277 for (uint
i = 0;
i < trigNames.size();
i++)
278 h5runId_trigger_eventClass_dt_n->GetAxis(1)->SetBinLabel(
i + 1, trigNames.at(
i).c_str());
283 vector<int> rebin = {1, 1, 1, 1, int(xmax.at(4) / n)};
284 auto h5runId_trigger_eventClass_dt_nTOF =
285 static_cast<THnSparse*
>(h5runId_trigger_eventClass_dt_n->Clone())->Rebin(rebin.data());
286 h5runId_trigger_eventClass_dt_nTOF->SetName(
"h5runId_trigger_eventClass_dt_nTOF");
287 h5runId_trigger_eventClass_dt_nTOF->SetTitle(
"Number of TOF");
288 h5runId_trigger_eventClass_dt_nTOF->GetAxis(4)->SetLimits(0, n);
289 h5runId_trigger_eventClass_dt_nTOF400digits = AddHistClone(h5runId_trigger_eventClass_dt_nTOF,
"400digits");
290 h5runId_trigger_eventClass_dt_nTOF700digits = AddHistClone(h5runId_trigger_eventClass_dt_nTOF,
"700digits");
293 rebin = {1, 1, 1, 1, int(xmax.at(4) / n)};
294 auto h5runId_trigger_eventClass_dt_nSILICON =
295 static_cast<THnSparse*
>(h5runId_trigger_eventClass_dt_n->Clone())->Rebin(rebin.data());
296 h5runId_trigger_eventClass_dt_nSILICON->SetName(
"h5runId_trigger_eventClass_dt_nSILICON");
297 h5runId_trigger_eventClass_dt_nSILICON->SetTitle(
"Number of SILICON");
298 h5runId_trigger_eventClass_dt_nSILICON->GetAxis(4)->SetLimits(0, n);
299 h5runId_trigger_eventClass_dt_nSILICONdigits = AddHistClone(h5runId_trigger_eventClass_dt_nSILICON,
"digits");
301 h5runId_trigger_eventClass_dt_nGEMdigits = AddHistClone(h5runId_trigger_eventClass_dt_n,
"GEMdigits");
308 LOG(debug) <<
"Initilization of BmnEventSelector";
314 if (hitTimes.size() == 0)
317 float min =
fabs(hitTimes.at(0) - refTime);
318 for (uint
i = 1;
i < hitTimes.size();
i++) {
319 auto dt =
fabs(hitTimes.at(
i) - refTime);
328int BmnEventSelector::GetPeak(
BmnTrigWaveDigit* digit,
float timeMin,
float timeMax)
332 int binMin = timeMin / fNsPerChannel;
333 uint binMax = timeMax / fNsPerChannel;
336 return digit->
GetPeak(binMin, binMax);
340std::vector<float> BmnEventSelector::GetSumAmp(TClonesArray* array,
341 std::vector<double> hitTimes,
345 std::vector<float> sum(hitTimes.size(), 0.);
346 for (uint
i = 0;
i < hitTimes.size();
i++) {
347 for (
auto obj : *
array) {
348 auto digit =
static_cast<T
>(obj);
349 auto relTime = digit->
GetTime() - hitTimes.at(
i);
350 if (relTimeMin < relTime && relTime < relTimeMax)
351 sum.at(
i) += digit->GetAmp();
358std::vector<int> BmnEventSelector::GetNdigits(TClonesArray* array,
359 std::vector<double> hitTimes,
363 std::vector<int> n(hitTimes.size(), 0);
364 for (uint
i = 0;
i < hitTimes.size();
i++) {
365 for (
auto obj : *
array) {
366 auto relTime =
static_cast<T
>(obj)->GetTime() - hitTimes.at(
i);
367 if (relTimeMin < relTime && relTime < relTimeMax)
375 std::vector<double> hitTimes,
381 std::vector<int> ret(hitTimes.size(), -999);
386 for (uint
i = 0;
i < hitTimes.size();
i++) {
387 auto hitTime = hitTimes.at(
i);
388 auto hitTimeMin = hitTime + relHitTimeMin;
389 auto hitTimeMax = hitTime + relHitTimeMax;
390 if (hitTimeMin < 0 || hitTimeMax > tMax)
392 auto hitFound =
true;
393 for (uint j = 0; j < hitTimesDigit.size(); j++) {
394 auto hitTimeDigit = hitTimesDigit.at(j);
395 if (hitTimeMin <= hitTimeDigit && hitTimeDigit <= hitTimeMax) {
400 auto timeMin = hitTime + relTimeMin;
401 auto timeMax = hitTime + relTimeMax;
403 ret.at(
i) = GetPeak(digit, timeMin, timeMax);
417 if (!fTQDC_BC1S || !fTQDC_VCS || !fTQDC_FD)
421 fNhitsBC1S = fTimesBC1S.size();
422 if (fNhitsBC1S == 0) {
423 if (fFillCalibrationHists)
428 fNhitsVCS = fTimesVCS.size();
430 fNhitsBC2AS = fTimesBC2AS.size();
432 fNhitsFD = fTimesFD.size();
434 fBC1Speaks = GetPeaks(fTQDC_BC1S, fTimesBC1S, fBC1SpeakTimeMin, fBC1SpeakTimeMax);
435 fVCSpeaks = GetPeaks(fTQDC_VCS, fTimesBC1S, fVCSpeakTimeMin, fVCSpeakTimeMax, fSingleVCS_BC1S_hitTimeMin,
436 fSingleVCS_BC1S_hitTimeMax);
437 fBC2ASpeaks = GetPeaks(fTQDC_BC2AS, fTimesBC1S, fBC2ASpeakTimeMin, fBC2ASpeakTimeMax, fSingleBC2AS_BC1S_hitTimeMin,
438 fSingleBC2AS_BC1S_hitTimeMax);
439 fFDpeaks = GetPeaks(fTQDC_FD, fTimesBC1S, fFDpeakTimeMin, fFDpeakTimeMax, fSingleFD_BC1S_hitTimeMin,
440 fSingleFD_BC1S_hitTimeMax);
441 fNdigitsBD = GetNdigits<BmnTrigDigit*>(fArrBDdigits, fTimesBC1S, fBDtimeMin, fBDtimeMax);
442 fSumAmpBD = GetSumAmp<BmnTrigDigit*>(fArrBDdigits, fTimesBC1S, fBDtimeMin, fBDtimeMax);
443 fNdigitsTOF400 = GetNdigits<BmnTof1Digit*>(fArrTOF400digits, fTimesBC1S, fTOF400digitTimeMin, fTOF400digitTimeMax);
444 fNdigitsTOF700 = GetNdigits<BmnTof1Digit*>(fArrTOF700digits, fTimesBC1S, fTOF700digitTimeMin, fTOF700digitTimeMax);
452 for (
int i = 0;
i < fNhitsBC1S;
i++) {
454 if (fNoCalibrationData || fBC1Speaks.at(
i) < -998 || fVCSpeaks.at(
i) < -998 || fBC2ASpeaks.at(
i) < -998
455 || fFDpeaks.at(
i) < -998)
457 fBC1hitClasses.push_back(kUndef);
461 if (fFDpeaks.at(
i) < fSingleFDpeakMin)
463 if (fVCSpeaks.at(
i) > fSingleVCSpeakMin || fBC2ASpeaks.at(
i) < fSingleBC2ASpeakMin) {
469 fBC1hitClasses.push_back(status);
473 if (fCentralHitIndexBC1S < 0)
476 if (fBC1hitClasses.at(fCentralHitIndexBC1S) == k0
477 || fBC1hitClasses.at(fCentralHitIndexBC1S) == kV0)
479 const float DTmax = 300;
480 for (
int i = fCentralHitIndexBC1S - 1;
i >= 0 && fSingleBC1hitTimeMean - fTimesBC1S.at(
i) < DTmax;
i--) {
481 if (fBC1hitClasses.at(
i) == k1 || fBC1hitClasses.at(
i) == kV1) {
482 fCentralHitIndexBC1S =
i;
487 fCentralHitTimeBC1S = fTimesBC1S.at(fCentralHitIndexBC1S);
488 fRelTimesBC1S = fTimesBC1S;
489 for (
auto& t : fRelTimesBC1S)
490 t -= fCentralHitTimeBC1S;
494 if (fNhitsBC1S == 2) {
495 int c = fCentralHitIndexBC1S;
498 if (fBC1hitClasses.at(c) == k0 && fBC1hitClasses.at(nc) == k0)
500 if (fBC1hitClasses.at(c) == k0 && fBC1hitClasses.at(nc) == k1)
502 if (fBC1hitClasses.at(c) == k0 && fBC1hitClasses.at(nc) == kV0)
504 if (fBC1hitClasses.at(c) == k0 && fBC1hitClasses.at(nc) == kV1)
506 if (fBC1hitClasses.at(c) == k1 && fBC1hitClasses.at(nc) == k0)
508 if (fBC1hitClasses.at(c) == k1 && fBC1hitClasses.at(nc) == k1)
510 if (fBC1hitClasses.at(c) == k1 && fBC1hitClasses.at(nc) == kV0)
512 if (fBC1hitClasses.at(c) == k1 && fBC1hitClasses.at(nc) == kV1)
522void BmnEventSelector::FillHistograms()
525 bool isBT_AR = fTrigAR & BIT(kBT);
526 bool isMBT_AR = fTrigAR & BIT(kMBT);
527 bool isCCT1_AR = fTrigAR & BIT(kCCT1);
528 bool isCCT2_AR = fTrigAR & BIT(kCCT2);
529 vector<bool> trigAR = {isBT_AR, isCCT1_AR, isCCT2_AR, isMBT_AR};
532 for (
auto digit : *fArrSILICONdigits)
537 for (
auto digit : *fArrGEMdigits)
541 h2runId_eventClass->Fill(fRunId, fEventClass);
542 for (
int i = 0;
i < fNhitsBC1S;
i++) {
544 h2runId_time_BC1S_k0->Fill(fRunId, fTimesBC1S.at(
i));
546 h2runId_time_BC1S_k1->Fill(fRunId, fTimesBC1S.at(
i));
548 h2runId_time_BC1S_kV0->Fill(fRunId, fTimesBC1S.at(
i));
550 h2runId_time_BC1S_kV1->Fill(fRunId, fTimesBC1S.at(
i));
551 h2runId_peak_BC1S->Fill(fRunId, fBC1Speaks.at(
i));
552 h2runId_peak_VCS->Fill(fRunId, fVCSpeaks.at(
i));
553 h2runId_peak_BC2AS->Fill(fRunId, fBC2ASpeaks.at(
i));
554 h2runId_peak_FD->Fill(fRunId, fFDpeaks.at(
i));
555 h2runId_NdigitsBD->Fill(fRunId, fNdigitsBD.at(
i));
556 h2runId_SumAmpBD->Fill(fRunId, fSumAmpBD.at(
i));
557 h2runId_NdigitsTOF400->Fill(fRunId, fNdigitsTOF400.at(
i));
558 h2runId_NdigitsTOF700->Fill(fRunId, fNdigitsTOF700.at(
i));
559 if (
i != fCentralHitIndexBC1S) {
560 h2runId_peak_FD_nc->Fill(fRunId, fFDpeaks.at(
i));
561 h2runId_NdigitsBD_nc->Fill(fRunId, fNdigitsBD.at(
i));
562 h2runId_SumAmpBD_nc->Fill(fRunId, fSumAmpBD.at(
i));
563 h2runId_NdigitsTOF400_nc->Fill(fRunId, fNdigitsTOF400.at(
i));
564 h2runId_NdigitsTOF700_nc->Fill(fRunId, fNdigitsTOF700.at(
i));
568 if (fNhitsBC1S == 1) {
569 h2runId_time_SingleBC1S->Fill(fRunId, fTimesBC1S.at(0));
572 auto channelTime =
i * fNsPerChannel;
573 h2runId_shapeShifted_SingleBC1S->Fill(fRunId, channelTime - fTimesBC1S.at(0), pulseBC1S[
i]);
575 h2runId_peak_SingleBC1S->Fill(fRunId, fBC1Speaks.at(0));
577 for (
auto digit : *fArrBDdigits) {
578 auto time =
static_cast<BmnTrigDigit*
>(digit)->GetTime() - fTimesBC1S.at(0);
579 h2runId_shapeShiftedBC1S_BD->Fill(fRunId, time);
581 h2runId_NdigitsBD_SingleBC1S->Fill(fRunId, fNdigitsBD.at(0));
582 h2runId_SumAmpBD_SingleBC1S->Fill(fRunId, fSumAmpBD.at(0));
583 h2runId_NdigitsTOF400_SingleBC1S->Fill(fRunId, fNdigitsTOF400.at(0));
584 h2runId_NdigitsTOF700_SingleBC1S->Fill(fRunId, fNdigitsTOF700.at(0));
586 for (
auto digit : *fArrTOF400digits) {
587 auto time =
static_cast<BmnTof1Digit*
>(digit)->GetTime() - fTimesBC1S.at(0);
588 h2runId_shapeShiftedBC1S_TOF400digit->Fill(fRunId, time);
591 for (
auto digit : *fArrTOF700digits) {
592 auto time =
static_cast<BmnTof1Digit*
>(digit)->GetTime() - fTimesBC1S.at(0);
593 h2runId_shapeShiftedBC1S_TOF700digit->Fill(fRunId, time);
597 h2runId_time_SingleFD_BC1S->Fill(fRunId, fTimesFD.at(0) - fTimesBC1S.at(0));
598 h2runId_peak_SingleFD->Fill(fRunId, fFDpeaks.at(0));
601 auto channelTime =
i * fNsPerChannel;
602 h2runId_shapeShiftedBC1S_SingleFD->Fill(fRunId, channelTime - fTimesBC1S.at(0), pulseFD[
i]);
605 if (fNhitsBC2AS == 1) {
606 h2runId_time_SingleBC2AS_BC1S->Fill(fRunId, fTimesBC2AS.at(0) - fTimesBC1S.at(0));
607 h2runId_peak_SingleBC2AS->Fill(fRunId, fBC2ASpeaks.at(0));
610 auto channelTime =
i * fNsPerChannel;
611 h2runId_shapeShiftedBC1S_SingleBC2AS->Fill(fRunId, channelTime - fTimesBC1S.at(0), pulseBC2AS[
i]);
616 if (fNhitsBC1S == 2 && fNhitsVCS == 1) {
617 h2runId_time_SingleVCS_BC1S->Fill(fRunId, fTimesVCS.at(0) - fTimesBC1S.at(0));
618 h2runId_peak_SingleVCS->Fill(fRunId, fVCSpeaks.at(0));
620 auto closestBC1Stime = fTimesBC1S.at(closestBC1Sindex);
623 auto channelTime =
i * fNsPerChannel;
624 h2runId_shapeShiftedBC1S_SingleVCS->Fill(fRunId, channelTime - closestBC1Stime, pulseVCS[
i]);
628 if (fFillPerformanceHists) {
630 if (fNhitsBC1S > 1) {
631 float dtLeft = 1e10, dtRight = 1e10;
632 if (fCentralHitIndexBC1S > 0)
633 dtLeft = fRelTimesBC1S.at(fCentralHitIndexBC1S - 1);
634 if (fCentralHitIndexBC1S < fNhitsBC1S - 1)
635 dtRight = fRelTimesBC1S.at(fCentralHitIndexBC1S + 1);
636 if (
fabs(dtLeft) < dtRight)
642 vector<double> x = {fRunId + 0.5, 0., fEventClass + 0.5, dt, 0.};
643 for (uint
i = 0;
i < trigAR.size();
i++) {
646 x.at(4) = fNdigitsTOF400.at(fCentralHitIndexBC1S);
647 h5runId_trigger_eventClass_dt_nTOF400digits->Fill(x.data());
648 x.at(4) = fNdigitsTOF700.at(fCentralHitIndexBC1S);
649 h5runId_trigger_eventClass_dt_nTOF700digits->Fill(x.data());
650 x.at(4) = fNdigitsSILICON;
651 h5runId_trigger_eventClass_dt_nSILICONdigits->Fill(x.data());
652 x.at(4) = fNdigitsGEM;
653 h5runId_trigger_eventClass_dt_nGEMdigits->Fill(x.data());
666 fCentralHitIndexBC1S = -1;
668 fRelTimesBC1S.clear();
670 fBC1hitClasses.clear();
676 fNdigitsTOF400.clear();
677 fNdigitsTOF700.clear();
678 fNdigitsSILICON = -999;
683 fBC1hitInfo.fEventClass = fEventClass;
684 fBC1hitInfo.fCentralHitIndexBC1S = fCentralHitIndexBC1S;
685 fBC1hitInfo.fTimesBC1S = fTimesBC1S;
686 fBC1hitInfo.fRelTimesBC1S = fRelTimesBC1S;
687 fBC1hitInfo.fBC1hitClasses = fBC1hitClasses;
688 fBC1hitInfo.fBC1Speaks = fBC1Speaks;
689 fBC1hitInfo.fVCSpeaks = fVCSpeaks;
690 fBC1hitInfo.fBC2ASpeaks = fBC2ASpeaks;
691 fBC1hitInfo.fFDpeaks = fFDpeaks;
692 fBC1hitInfo.fNdigitsBD = fNdigitsBD;
693 fBC1hitInfo.fSumAmpBD = fSumAmpBD;
694 fBC1hitInfo.fNdigitsTOF400 = fNdigitsTOF400;
695 fBC1hitInfo.fNdigitsTOF700 = fNdigitsTOF700;
704 LOG(debug) <<
"Finish of BmnEventSelector";
705 if (fFillCalibrationHists) {
707 for (
auto h : *fOutputList) {
708 string className = h->ClassName();
709 if (className.find(
"THn") == 0) {
710 vector<int> axes = {0, 1, 2, 4};
711 static_cast<THnSparse*
>(h)->Projection(axes.size(), axes.data())->Write();
713 static_cast<THnSparse*
>(h)->Projection(axes.size(), axes.data())->Write();
717 for (
auto h : *fOutputList) {
718 string name = h->GetName();
719 string className = h->ClassName();
720 if (className.find(
"TH2") == 0 && name.find(
"h2runId") == 0) {
722 static_cast<TH2*
>(h)->ProjectionY()->Write();
725 fOutputFile->Close();
friend F32vec4 fabs(const F32vec4 &a)
friend F32vec4 min(const F32vec4 &a, const F32vec4 &b)
virtual InitStatus ReInit()
int GetClosestHitIndex(std::vector< double > hitTimes, float refTime)
virtual void Exec(Option_t *opt)
virtual void SetParContainers()
virtual InitStatus Init()
BmnEventClass::id Classify()
Short_t * GetShortValue() const
int GetPeak(UInt_t start=0, UInt_t stop=1e9) const
UInt_t GetNSamples() const
vector< Double_t > & TdcVector()
const std::map< int, std::string > names
@ array
array (ordered collection of values)