46 std::shared_ptr<o2::base::GRPGeomRequest> gr,
47 bool isMC) : mDataRequest{dr}, mGGCCDBRequest(gr), mUseMC(isMC) {}
61 std::vector<o2::itsmft::ClusterPattern> mPatterns;
64 int NStaves[7] = {12, 16, 20, 24, 30, 42, 48};
69 int ChipToLayer(
int chip);
70 double ChipToPhi(
int chip);
71 bool searchBCfromMap(std::map<
long, std::set<int>>& BCperorbit,
long target_orbit,
int target_bc);
73 std::shared_ptr<o2::base::GRPGeomRequest> mGGCCDBRequest;
74 std::shared_ptr<DataRequest> mDataRequest;
79 int mTF_first_after_dump = 1;
81 int mStrobeFallBack = 594;
82 int mStrobe = mStrobeFallBack;
86 std::pair<double, double> TimeWindowZDC = std::make_pair(5., 11.);
87 std::pair<double, double> TimeWindowZNAr = std::make_pair(5.64507, 9.64507);
88 std::pair<double, double> TimeWindowZNCr = std::make_pair(4.21299, 8.21299);
89 std::pair<double, double> TimeWindowZNAl = std::make_pair(-11.3549, -8.35493);
90 std::pair<double, double> TimeWindowZNCl = std::make_pair(-12.787, -9.78701);
92 int targetClusterMinCol = 128;
93 int targetClusterMaxRow = 29;
95 int mDumpEveryTF = 10;
96 int mSkimmedOnlyAfterTF = 15000;
97 std::string mOutputChip =
"chipevents";
98 std::string mOutoutChipSkim =
"chipeventstarget";
106 TTree* ITSChipEvtTree;
107 TTree* ITSChipEvtTargetTree;
115 int Tnhit, Tnclus, Tnhit_no1pix, Tnclus_no1pix;
116 int Tnclus_s20, Tnclus_s100, Tnclus_s150;
117 int Tnclus_c20, Tnclus_c100, Tnclus_c128;
119 double Tnhit1, Tnhit10;
120 int Tmissingafter, Tmissingafter2;
121 int Tmincol, Tmaxcol;
137 LOGP(info,
"Initializing ITSBeamBackgroundStudy");
138 LOGP(info,
"Fetching ClusterDictionary");
140 mgr.setURL(
"http://alice-ccdb.cern.ch");
144 LOGP(info,
"Setting up trees and histograms. They will be dumped on file every {} TFs", mDumpEveryTF);
146 TimeWindowCut =
new TH1F(
"ZDC bkg region",
"ZNAr, ZNCr, -ZNAl, -ZNCl", 8, 0, 8);
147 TimeWindowCut->SetBinContent(1, TimeWindowZNAr.first);
148 TimeWindowCut->SetBinContent(2, TimeWindowZNAr.second);
149 TimeWindowCut->SetBinContent(3, TimeWindowZNCr.first);
150 TimeWindowCut->SetBinContent(4, TimeWindowZNCr.second);
151 TimeWindowCut->SetBinContent(5, -TimeWindowZNAl.first);
152 TimeWindowCut->SetBinContent(6, -TimeWindowZNAl.second);
153 TimeWindowCut->SetBinContent(7, -TimeWindowZNCl.first);
154 TimeWindowCut->SetBinContent(8, -TimeWindowZNCl.second);
155 ZNACall =
new TH1F(
"ZNACall",
"ZNACall", 40, -20, 20);
156 ZNCCall =
new TH1F(
"ZNCCall",
"ZNCCall", 40, -20, 20);
157 ZDCAtagBC =
new TH1F(
"ZDCA tagged BC",
"ZDCA tagged bc", 3564, 0, 3564);
158 ZDCCtagBC =
new TH1F(
"ZDCC tagged BC",
"ZDCC tagged bc", 3564, 0, 3564);
160 Counters =
new TH1I(
"Counters",
"Counters", 20, 1, 21);
161 Counters->GetXaxis()->SetBinLabel(1,
"TF");
162 Counters->GetXaxis()->SetBinLabel(2,
"ROF");
163 Counters->GetXaxis()->SetBinLabel(3,
"ZDCA evt");
164 Counters->GetXaxis()->SetBinLabel(4,
"ROF-ZDCA tagged");
165 Counters->GetXaxis()->SetBinLabel(5,
"ITStag any");
166 Counters->GetXaxis()->SetBinLabel(6,
"ITStag TO");
167 Counters->GetXaxis()->SetBinLabel(7,
"ITStag any + ZDC");
168 Counters->GetXaxis()->SetBinLabel(8,
"ITStag TO + ZDC");
169 Counters->GetXaxis()->SetBinLabel(9,
"ZDCC evt");
170 Counters->GetXaxis()->SetBinLabel(10,
"ROF-ZDCC tagged");
172 ITSChipEvtTree =
new TTree(
"chipevt",
"chipevt");
175 ITSChipEvtTree->Branch(
"TFprogress", &mTFn,
"TFprogress/I");
176 ITSChipEvtTree->Branch(
"orbit", &Torbit,
"orbit/L");
177 ITSChipEvtTree->Branch(
"bc", &Tbc,
"bc/I");
178 ITSChipEvtTree->Branch(
"chip", &Tchip,
"chip/I");
179 ITSChipEvtTree->Branch(
"phi", &Tphi,
"phi/D");
180 ITSChipEvtTree->Branch(
"zdctag", &TZDCtag,
"zdctag/I");
181 ITSChipEvtTree->Branch(
"nhit", &Tnhit,
"nhit/I");
182 ITSChipEvtTree->Branch(
"nhit_no1pix", &Tnhit_no1pix,
"nhit_no1pix/I");
183 ITSChipEvtTree->Branch(
"size1", &Tnhit1,
"size1/D");
184 ITSChipEvtTree->Branch(
"size10", &Tnhit10,
"size10/D");
185 ITSChipEvtTree->Branch(
"nclus", &Tnclus,
"nclus/I");
186 ITSChipEvtTree->Branch(
"nclus_no1pix", &Tnclus_no1pix,
"nclus_no1pix/I");
187 ITSChipEvtTree->Branch(
"nclus_target", &Tnclus_target,
"nclus_target/I");
188 ITSChipEvtTree->Branch(
"missingafter", &Tmissingafter,
"missingafter/I");
189 ITSChipEvtTree->Branch(
"missingafter2", &Tmissingafter2,
"missingafter2/I");
190 ITSChipEvtTree->Branch(
"mincol", &Tmincol,
"mincol/I");
191 ITSChipEvtTree->Branch(
"maxcol", &Tmaxcol,
"maxcol/I");
193 ITSChipEvtTargetTree = ITSChipEvtTree->CloneTree(0);
194 ITSChipEvtTargetTree->SetName(
"chipevttarget");
195 ITSChipEvtTargetTree->SetTitle(
"chipevttarget");
295 LOGP(fatal,
"ITSBeamBackgroundStudy does not support the per-layer (staggered) ITS clusters input yet");
298 LOGP(info,
"Processing RecoContainer");
301 LOGP(info,
"Retrieving ZDC data");
306 LOGP(info,
"sizeof ZDC RC: {}, {}, {}, {}", RecBC.size(), Energy.size(), TDCData.size(), Info2.size());
308 LOGP(info,
"Retrieving ITS clusters");
312 LOGP(info,
"sizeof ITS RC: {}, {}, {}", clusArr.size(), clusPatt.size(), rofRecVec.size());
315 if (rofRecVec.size() == 576 || rofRecVec.size() == 192) {
316 mStrobe = 3564 / (rofRecVec.size() / 32);
317 LOGP(info,
"Assuimg TF length = 32 orbits and setting strobe length to {} bc", mStrobe);
319 mStrobe = mStrobeFallBack;
320 LOGP(warning,
"Unforeseen number of ROFs in the loop. Using the strobe length fall back value {}", mStrobe);
323 std::map<long, std::set<int>> ZNArtag{};
324 std::map<long, std::set<int>> ZNCrtag{};
325 std::map<long, std::set<int>> ZNAltag{};
326 std::map<long, std::set<int>> ZNCltag{};
332 ev.
init(RecBC, Energy, TDCData, Info2);
334 int bkgcounterAr = 0, bkgcounterCr = 0;
335 int bkgcounterAl = 0, bkgcounterCl = 0;
343 int nhitA = ev.
NtdcV(itdcA);
344 for (int32_t ipos = 0; ipos < nhitA; ipos++) {
348 ZNACall->Fill(mytdc);
350 if (mytdc >= TimeWindowZNAr.first && mytdc <= TimeWindowZNAr.second) {
355 ZDCAtagBC->Fill(ev.
ir.
bc);
357 if (ZNArtag.find(zdcorbit) != ZNArtag.end()) {
358 bool double_count_bkg = ZNArtag[zdcorbit].insert((
int)ev.
ir.
bc).second;
359 if (double_count_bkg) {
360 LOGP(warning,
"Multiple ZDCAr counts in the same orbit/bc {}/{}", zdcorbit, ev.
ir.
bc);
363 std::set<int> zdcbcs{(int)ev.
ir.
bc};
364 ZNArtag[zdcorbit] = zdcbcs;
369 if (mytdc >= TimeWindowZNAl.first && mytdc <= TimeWindowZNAl.second) {
374 ZDCAtagBC->Fill(ev.
ir.
bc);
376 if (ZNAltag.find(zdcorbit) != ZNAltag.end()) {
377 bool double_count_bkg = ZNAltag[zdcorbit].insert((
int)ev.
ir.
bc).second;
378 if (double_count_bkg) {
379 LOGP(warning,
"Multiple ZDCAl counts in the same orbit/bc {}/{}", zdcorbit, ev.
ir.
bc);
382 std::set<int> zdcbcs{(int)ev.
ir.
bc};
383 ZNAltag[zdcorbit] = zdcbcs;
390 int nhitC = ev.
NtdcV(itdcC);
391 for (int32_t ipos = 0; ipos < nhitC; ipos++) {
395 ZNCCall->Fill(mytdc);
397 if (mytdc >= TimeWindowZNCr.first && mytdc <= TimeWindowZNCr.second) {
402 ZDCCtagBC->Fill(ev.
ir.
bc);
404 if (ZNCrtag.find(zdcorbit) != ZNCrtag.end()) {
405 bool double_count_bkg = ZNCrtag[zdcorbit].insert((
int)ev.
ir.
bc).second;
406 if (double_count_bkg) {
407 LOGP(warning,
"Multiple ZNCr counts in the same orbit/bc {}/{}", zdcorbit, ev.
ir.
bc);
410 std::set<int> zdcbcs{(int)ev.
ir.
bc};
411 ZNCrtag[zdcorbit] = zdcbcs;
416 if (mytdc >= TimeWindowZNCl.first && mytdc <= TimeWindowZNCl.second) {
421 ZDCCtagBC->Fill(ev.
ir.
bc);
423 if (ZNCltag.find(zdcorbit) != ZNCltag.end()) {
424 bool double_count_bkg = ZNCltag[zdcorbit].insert((
int)ev.
ir.
bc).second;
425 if (double_count_bkg) {
426 LOGP(warning,
"Multiple ZNCl counts in the same orbit/bc {}/{}", zdcorbit, ev.
ir.
bc);
429 std::set<int> zdcbcs{(int)ev.
ir.
bc};
430 ZNCltag[zdcorbit] = zdcbcs;
437 LOGP(info,
"Found background envents from ZNAright/left {}/{} -- from ZNCright/left {}/{}", bkgcounterAr, bkgcounterAl, bkgcounterCr, bkgcounterCl);
440 getClusterPatterns(clusArr, clusPatt, *mDict);
442 int inTFROFcounter = -1;
444 std::vector<bool> ChipSeenInThisROF(N_CHIP_IB,
false);
445 std::vector<bool> ChipSeenInLastROF(N_CHIP_IB,
false);
446 std::vector<bool> ChipSeenInLast2ROF(N_CHIP_IB,
false);
449 for (
auto it = rofRecVec.rbegin(); it != rofRecVec.rend(); ++it) {
457 ChipSeenInLast2ROF = ChipSeenInLastROF;
458 ChipSeenInLastROF = ChipSeenInThisROF;
459 std::fill(ChipSeenInThisROF.begin(), ChipSeenInThisROF.end(),
false);
461 auto clustersInRof = rofRec.getROFData(clusArr);
462 auto patternsInRof = rofRec.getROFData(mPatterns);
464 Tbc = (int)rofRec.getBCData().bc;
465 Torbit = (
long)rofRec.getBCData().orbit;
467 if (inTFROFcounter < 1) {
468 LOGP(info,
"First of TF: ITS orbit/bc {}/{}", Torbit, Tbc);
472 int eff_bc = Tbc + 60;
473 long eff_orbit = Torbit;
480 bool isZNArtagged = searchBCfromMap(ZNArtag, (
long)eff_orbit, eff_bc);
485 bool isZNAltagged = searchBCfromMap(ZNAltag, (
long)eff_orbit, eff_bc);
490 bool isZNCrtagged = searchBCfromMap(ZNCrtag, (
long)eff_orbit, eff_bc);
495 bool isZNCltagged = searchBCfromMap(ZNCltag, (
long)eff_orbit, eff_bc);
501 TZDCtag |= (isZNArtagged << 0);
502 TZDCtag |= (isZNAltagged << 1);
503 TZDCtag |= (isZNCrtagged << 2);
504 TZDCtag |= (isZNCltagged << 3);
507 LOGP(info,
"ZDC tag with mask {}: ZNAright = {} - ZNAleft = {} - ZNCright = {} - ZNCleft = {}",
508 TZDCtag, (TZDCtag >> 0) & 1, (TZDCtag >> 1) & 1, (TZDCtag >> 2) & 1, (TZDCtag >> 3) & 1);
512 std::set<int> AvailableChips{};
513 std::map<int, std::vector<int>> MAPsize{};
514 std::map<int, std::vector<int>> MAPcols{};
515 std::map<int, int> MAPntarget{};
516 std::map<int, int> MAPcoo_mincol{};
517 std::map<int, int> MAPcoo_maxcol{};
520 int ntarget_in_rof = 0;
521 for (
int iclus = 0; iclus < clustersInRof.size(); iclus++) {
523 const auto& compClus = clustersInRof[iclus];
525 auto chipid = compClus.getSensorID();
528 if (ChipToLayer(chipid) > 2) {
532 ChipSeenInThisROF[chipid] =
true;
534 int coo_col = (int)compClus.getCol();
535 int coo_row = (int)compClus.getRow();
537 auto patti = patternsInRof[iclus];
538 int npix = patti.getNPixels();
539 int colspan = patti.getColumnSpan();
540 int rowspan = patti.getRowSpan();
542 bool newchip = AvailableChips.insert(chipid).second;
544 MAPsize[chipid] = std::vector<int>{};
545 MAPcols[chipid] = std::vector<int>{};
546 MAPntarget[chipid] = 0;
547 MAPcoo_mincol[chipid] = coo_col;
548 MAPcoo_maxcol[chipid] = coo_col + colspan;
551 MAPsize[chipid].push_back(npix);
552 MAPcols[chipid].push_back(colspan);
553 if (colspan >= targetClusterMinCol && rowspan <= targetClusterMaxRow) {
555 MAPntarget[chipid] += 1;
558 MAPcoo_mincol[chipid] = TMath::Min(MAPcoo_mincol[chipid], coo_col);
559 MAPcoo_maxcol[chipid] = TMath::Max(MAPcoo_maxcol[chipid], coo_col + colspan);
563 if (ntarget_in_rof == 0 && mTFn > mSkimmedOnlyAfterTF + 2) {
568 for (
int ic : AvailableChips) {
572 if (inTFROFcounter < 1) {
574 }
else if (ChipSeenInLastROF[ic]) {
580 if (inTFROFcounter < 2) {
582 }
else if (ChipSeenInLast2ROF[ic]) {
588 Tphi = ChipToPhi(ic);
590 Tnclus = MAPsize[ic].size();
591 Tmincol = MAPcoo_mincol[ic];
592 Tmaxcol = MAPcoo_maxcol[ic];
594 std::sort(MAPsize[ic].begin(), MAPsize[ic].
end(), std::greater<>());
596 Tnhit = Tnclus_s20 = Tnclus_s100 = Tnclus_s150 = 0;
597 Tnhit1 = Tnhit10 = 0.;
598 Tnclus_c20 = Tnclus_c100 = Tnclus_c128 = 0;
599 Tnclus_target = MAPntarget[ic];
604 int nclus10 = 0, nclus1 = 0;
606 for (
int nh : MAPsize[ic]) {
625 Tnclus_s20 += (nh >= 20);
626 Tnclus_s100 += (nh >= 100);
627 Tnclus_s150 += (nh >= 150);
630 Tnhit10 = (nclus10 == 0) ? 0. : 1. * Tnhit10 / nclus10;
632 for (
int nc : MAPcols[ic]) {
633 Tnclus_c20 += (nc >= 20);
634 Tnclus_c100 += (nc >= 100);
635 Tnclus_c128 += (nc >= 128);
638 ITSChipEvtTree->Fill();
639 if (Tnclus_target > 0) {
640 ITSChipEvtTargetTree->Fill();