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");
290 LOGP(info,
"Processing RecoContainer");
293 LOGP(info,
"Retrieving ZDC data");
298 LOGP(info,
"sizeof ZDC RC: {}, {}, {}, {}", RecBC.size(), Energy.size(), TDCData.size(), Info2.size());
300 LOGP(info,
"Retrieving ITS clusters");
304 LOGP(info,
"sizeof ITS RC: {}, {}, {}", clusArr.size(), clusPatt.size(), rofRecVec.size());
307 if (rofRecVec.size() == 576 || rofRecVec.size() == 192) {
308 mStrobe = 3564 / (rofRecVec.size() / 32);
309 LOGP(info,
"Assuimg TF length = 32 orbits and setting strobe length to {} bc", mStrobe);
311 mStrobe = mStrobeFallBack;
312 LOGP(warning,
"Unforeseen number of ROFs in the loop. Using the strobe length fall back value {}", mStrobe);
315 std::map<long, std::set<int>> ZNArtag{};
316 std::map<long, std::set<int>> ZNCrtag{};
317 std::map<long, std::set<int>> ZNAltag{};
318 std::map<long, std::set<int>> ZNCltag{};
324 ev.
init(RecBC, Energy, TDCData, Info2);
326 int bkgcounterAr = 0, bkgcounterCr = 0;
327 int bkgcounterAl = 0, bkgcounterCl = 0;
335 int nhitA = ev.
NtdcV(itdcA);
336 for (int32_t ipos = 0; ipos < nhitA; ipos++) {
340 ZNACall->Fill(mytdc);
342 if (mytdc >= TimeWindowZNAr.first && mytdc <= TimeWindowZNAr.second) {
347 ZDCAtagBC->Fill(ev.
ir.
bc);
349 if (ZNArtag.find(zdcorbit) != ZNArtag.end()) {
350 bool double_count_bkg = ZNArtag[zdcorbit].insert((
int)ev.
ir.
bc).second;
351 if (double_count_bkg) {
352 LOGP(warning,
"Multiple ZDCAr counts in the same orbit/bc {}/{}", zdcorbit, ev.
ir.
bc);
355 std::set<int> zdcbcs{(
int)ev.
ir.
bc};
356 ZNArtag[zdcorbit] = zdcbcs;
361 if (mytdc >= TimeWindowZNAl.first && mytdc <= TimeWindowZNAl.second) {
366 ZDCAtagBC->Fill(ev.
ir.
bc);
368 if (ZNAltag.find(zdcorbit) != ZNAltag.end()) {
369 bool double_count_bkg = ZNAltag[zdcorbit].insert((
int)ev.
ir.
bc).second;
370 if (double_count_bkg) {
371 LOGP(warning,
"Multiple ZDCAl counts in the same orbit/bc {}/{}", zdcorbit, ev.
ir.
bc);
374 std::set<int> zdcbcs{(
int)ev.
ir.
bc};
375 ZNAltag[zdcorbit] = zdcbcs;
382 int nhitC = ev.
NtdcV(itdcC);
383 for (int32_t ipos = 0; ipos < nhitC; ipos++) {
387 ZNCCall->Fill(mytdc);
389 if (mytdc >= TimeWindowZNCr.first && mytdc <= TimeWindowZNCr.second) {
394 ZDCCtagBC->Fill(ev.
ir.
bc);
396 if (ZNCrtag.find(zdcorbit) != ZNCrtag.end()) {
397 bool double_count_bkg = ZNCrtag[zdcorbit].insert((
int)ev.
ir.
bc).second;
398 if (double_count_bkg) {
399 LOGP(warning,
"Multiple ZNCr counts in the same orbit/bc {}/{}", zdcorbit, ev.
ir.
bc);
402 std::set<int> zdcbcs{(
int)ev.
ir.
bc};
403 ZNCrtag[zdcorbit] = zdcbcs;
408 if (mytdc >= TimeWindowZNCl.first && mytdc <= TimeWindowZNCl.second) {
413 ZDCCtagBC->Fill(ev.
ir.
bc);
415 if (ZNCltag.find(zdcorbit) != ZNCltag.end()) {
416 bool double_count_bkg = ZNCltag[zdcorbit].insert((
int)ev.
ir.
bc).second;
417 if (double_count_bkg) {
418 LOGP(warning,
"Multiple ZNCl counts in the same orbit/bc {}/{}", zdcorbit, ev.
ir.
bc);
421 std::set<int> zdcbcs{(
int)ev.
ir.
bc};
422 ZNCltag[zdcorbit] = zdcbcs;
429 LOGP(info,
"Found background envents from ZNAright/left {}/{} -- from ZNCright/left {}/{}", bkgcounterAr, bkgcounterAl, bkgcounterCr, bkgcounterCl);
432 getClusterPatterns(clusArr, clusPatt, *mDict);
434 int inTFROFcounter = -1;
436 std::vector<bool> ChipSeenInThisROF(N_CHIP_IB,
false);
437 std::vector<bool> ChipSeenInLastROF(N_CHIP_IB,
false);
438 std::vector<bool> ChipSeenInLast2ROF(N_CHIP_IB,
false);
441 for (
auto it = rofRecVec.rbegin(); it != rofRecVec.rend(); ++it) {
449 ChipSeenInLast2ROF = ChipSeenInLastROF;
450 ChipSeenInLastROF = ChipSeenInThisROF;
451 std::fill(ChipSeenInThisROF.begin(), ChipSeenInThisROF.end(),
false);
453 auto clustersInRof = rofRec.getROFData(clusArr);
454 auto patternsInRof = rofRec.getROFData(mPatterns);
456 Tbc = (
int)rofRec.getBCData().bc;
457 Torbit = (
long)rofRec.getBCData().orbit;
459 if (inTFROFcounter < 1) {
460 LOGP(info,
"First of TF: ITS orbit/bc {}/{}", Torbit, Tbc);
464 int eff_bc = Tbc + 60;
465 long eff_orbit = Torbit;
472 bool isZNArtagged = searchBCfromMap(ZNArtag, (
long)eff_orbit, eff_bc);
477 bool isZNAltagged = searchBCfromMap(ZNAltag, (
long)eff_orbit, eff_bc);
482 bool isZNCrtagged = searchBCfromMap(ZNCrtag, (
long)eff_orbit, eff_bc);
487 bool isZNCltagged = searchBCfromMap(ZNCltag, (
long)eff_orbit, eff_bc);
493 TZDCtag |= (isZNArtagged << 0);
494 TZDCtag |= (isZNAltagged << 1);
495 TZDCtag |= (isZNCrtagged << 2);
496 TZDCtag |= (isZNCltagged << 3);
499 LOGP(info,
"ZDC tag with mask {}: ZNAright = {} - ZNAleft = {} - ZNCright = {} - ZNCleft = {}",
500 TZDCtag, (TZDCtag >> 0) & 1, (TZDCtag >> 1) & 1, (TZDCtag >> 2) & 1, (TZDCtag >> 3) & 1);
504 std::set<int> AvailableChips{};
505 std::map<int, std::vector<int>> MAPsize{};
506 std::map<int, std::vector<int>> MAPcols{};
507 std::map<int, int> MAPntarget{};
508 std::map<int, int> MAPcoo_mincol{};
509 std::map<int, int> MAPcoo_maxcol{};
512 int ntarget_in_rof = 0;
513 for (
int iclus = 0; iclus < clustersInRof.size(); iclus++) {
515 const auto& compClus = clustersInRof[iclus];
517 auto chipid = compClus.getSensorID();
520 if (ChipToLayer(chipid) > 2) {
524 ChipSeenInThisROF[chipid] =
true;
526 int coo_col = (
int)compClus.getCol();
527 int coo_row = (
int)compClus.getRow();
529 auto patti = patternsInRof[iclus];
530 int npix = patti.getNPixels();
531 int colspan = patti.getColumnSpan();
532 int rowspan = patti.getRowSpan();
534 bool newchip = AvailableChips.insert(chipid).second;
536 MAPsize[chipid] = std::vector<int>{};
537 MAPcols[chipid] = std::vector<int>{};
538 MAPntarget[chipid] = 0;
539 MAPcoo_mincol[chipid] = coo_col;
540 MAPcoo_maxcol[chipid] = coo_col + colspan;
543 MAPsize[chipid].push_back(npix);
544 MAPcols[chipid].push_back(colspan);
545 if (colspan >= targetClusterMinCol && rowspan <= targetClusterMaxRow) {
547 MAPntarget[chipid] += 1;
550 MAPcoo_mincol[chipid] = TMath::Min(MAPcoo_mincol[chipid], coo_col);
551 MAPcoo_maxcol[chipid] = TMath::Max(MAPcoo_maxcol[chipid], coo_col + colspan);
555 if (ntarget_in_rof == 0 && mTFn > mSkimmedOnlyAfterTF + 2) {
560 for (
int ic : AvailableChips) {
564 if (inTFROFcounter < 1) {
566 }
else if (ChipSeenInLastROF[ic]) {
572 if (inTFROFcounter < 2) {
574 }
else if (ChipSeenInLast2ROF[ic]) {
580 Tphi = ChipToPhi(ic);
582 Tnclus = MAPsize[ic].size();
583 Tmincol = MAPcoo_mincol[ic];
584 Tmaxcol = MAPcoo_maxcol[ic];
586 std::sort(MAPsize[ic].begin(), MAPsize[ic].
end(), std::greater<>());
588 Tnhit = Tnclus_s20 = Tnclus_s100 = Tnclus_s150 = 0;
589 Tnhit1 = Tnhit10 = 0.;
590 Tnclus_c20 = Tnclus_c100 = Tnclus_c128 = 0;
591 Tnclus_target = MAPntarget[ic];
596 int nclus10 = 0, nclus1 = 0;
598 for (
int nh : MAPsize[ic]) {
617 Tnclus_s20 += (nh >= 20);
618 Tnclus_s100 += (nh >= 100);
619 Tnclus_s150 += (nh >= 150);
622 Tnhit10 = (nclus10 == 0) ? 0. : 1. * Tnhit10 / nclus10;
624 for (
int nc : MAPcols[ic]) {
625 Tnclus_c20 += (nc >= 20);
626 Tnclus_c100 += (nc >= 100);
627 Tnclus_c128 += (nc >= 128);
630 ITSChipEvtTree->Fill();
631 if (Tnclus_target > 0) {
632 ITSChipEvtTargetTree->Fill();