51 std::shared_ptr<o2::base::GRPGeomRequest> gr,
52 bool isMC) : mDataRequest{dr}, mGGCCDBRequest(gr), mUseMC(isMC) {}
67 std::vector<o2::itsmft::ClusterPattern> mPatterns;
75 double ChipToPhi(
int chip);
76 bool searchBCfromMap(std::map<
long, std::set<int>>& BCperorbit,
long target_orbit,
int target_bc);
78 std::shared_ptr<o2::base::GRPGeomRequest> mGGCCDBRequest;
79 std::shared_ptr<DataRequest> mDataRequest;
84 int mTF_first_after_dump = 1;
86 int mStrobeFallBack = 594;
87 int mStrobe = mStrobeFallBack;
91 std::pair<double, double> TimeWindowZDC = std::make_pair(5., 11.);
92 std::pair<double, double> TimeWindowZNAr = std::make_pair(5.64507, 9.64507);
93 std::pair<double, double> TimeWindowZNCr = std::make_pair(4.21299, 8.21299);
94 std::pair<double, double> TimeWindowZNAl = std::make_pair(-11.3549, -8.35493);
95 std::pair<double, double> TimeWindowZNCl = std::make_pair(-12.787, -9.78701);
97 int targetClusterMinCol = 128;
98 int targetClusterMaxRow = 29;
103 std::string mOutputChip =
"chipevents";
104 std::string mOutoutChipSkim =
"chipeventstarget";
112 TTree* ITSChipEvtTree;
113 TTree* ITSChipEvtTargetTree;
122 std::vector<float> TclusterPhi, TclusterR, TclusterZ;
123 std::vector<int> TclusterSize, TclusterColSpan, TclusterRowSpan;
125 int Tnhit, Tnclus, Tnhit_no1pix, Tnclus_no1pix;
126 int Tnclus_s20, Tnclus_s100, Tnclus_s150;
127 int Tnclus_c20, Tnclus_c100, Tnclus_c128;
129 double Tnhit1, Tnhit10;
130 int Tmissingafter, Tmissingafter2;
131 int Tmincol, Tmaxcol;
318 LOGP(fatal,
"ITSBeamBackgroundStudy does not support the per-layer (staggered) ITS clusters input yet");
321 LOGP(info,
"Processing RecoContainer");
324 LOGP(info,
"Retrieving ZDC data");
329 LOGP(info,
"sizeof ZDC RC: {}, {}, {}, {}", RecBC.size(), Energy.size(), TDCData.size(), Info2.size());
331 LOGP(info,
"Retrieving ITS clusters");
335 LOGP(info,
"sizeof ITS RC: {}, {}, {}", clusArr.size(), clusPatt.size(), rofRecVec.size());
338 if (rofRecVec.size() == 576 || rofRecVec.size() == 192) {
339 mStrobe = 3564 / (rofRecVec.size() / 32);
340 LOGP(info,
"Assuimg TF length = 32 orbits and setting strobe length to {} bc", mStrobe);
342 mStrobe = mStrobeFallBack;
343 LOGP(warning,
"Unforeseen number of ROFs in the loop. Using the strobe length fall back value {}", mStrobe);
346 std::map<long, std::set<int>> ZNArtag{};
347 std::map<long, std::set<int>> ZNCrtag{};
348 std::map<long, std::set<int>> ZNAltag{};
349 std::map<long, std::set<int>> ZNCltag{};
355 ev.
init(RecBC, Energy, TDCData, Info2);
357 int bkgcounterAr = 0, bkgcounterCr = 0;
358 int bkgcounterAl = 0, bkgcounterCl = 0;
366 int nhitA = ev.
NtdcV(itdcA);
367 for (int32_t ipos = 0; ipos < nhitA; ipos++) {
371 ZNACall->Fill(mytdc);
373 if (mytdc >= TimeWindowZNAr.first && mytdc <= TimeWindowZNAr.second) {
378 ZDCAtagBC->Fill(ev.
ir.
bc);
380 if (ZNArtag.find(zdcorbit) != ZNArtag.end()) {
381 bool double_count_bkg = ZNArtag[zdcorbit].insert((
int)ev.
ir.
bc).second;
382 if (double_count_bkg) {
383 LOGP(warning,
"Multiple ZDCAr counts in the same orbit/bc {}/{}", zdcorbit, ev.
ir.
bc);
386 std::set<int> zdcbcs{(int)ev.
ir.
bc};
387 ZNArtag[zdcorbit] = zdcbcs;
392 if (mytdc >= TimeWindowZNAl.first && mytdc <= TimeWindowZNAl.second) {
397 ZDCAtagBC->Fill(ev.
ir.
bc);
399 if (ZNAltag.find(zdcorbit) != ZNAltag.end()) {
400 bool double_count_bkg = ZNAltag[zdcorbit].insert((
int)ev.
ir.
bc).second;
401 if (double_count_bkg) {
402 LOGP(warning,
"Multiple ZDCAl counts in the same orbit/bc {}/{}", zdcorbit, ev.
ir.
bc);
405 std::set<int> zdcbcs{(int)ev.
ir.
bc};
406 ZNAltag[zdcorbit] = zdcbcs;
413 int nhitC = ev.
NtdcV(itdcC);
414 for (int32_t ipos = 0; ipos < nhitC; ipos++) {
418 ZNCCall->Fill(mytdc);
420 if (mytdc >= TimeWindowZNCr.first && mytdc <= TimeWindowZNCr.second) {
425 ZDCCtagBC->Fill(ev.
ir.
bc);
427 if (ZNCrtag.find(zdcorbit) != ZNCrtag.end()) {
428 bool double_count_bkg = ZNCrtag[zdcorbit].insert((
int)ev.
ir.
bc).second;
429 if (double_count_bkg) {
430 LOGP(warning,
"Multiple ZNCr counts in the same orbit/bc {}/{}", zdcorbit, ev.
ir.
bc);
433 std::set<int> zdcbcs{(int)ev.
ir.
bc};
434 ZNCrtag[zdcorbit] = zdcbcs;
439 if (mytdc >= TimeWindowZNCl.first && mytdc <= TimeWindowZNCl.second) {
444 ZDCCtagBC->Fill(ev.
ir.
bc);
446 if (ZNCltag.find(zdcorbit) != ZNCltag.end()) {
447 bool double_count_bkg = ZNCltag[zdcorbit].insert((
int)ev.
ir.
bc).second;
448 if (double_count_bkg) {
449 LOGP(warning,
"Multiple ZNCl counts in the same orbit/bc {}/{}", zdcorbit, ev.
ir.
bc);
452 std::set<int> zdcbcs{(int)ev.
ir.
bc};
453 ZNCltag[zdcorbit] = zdcbcs;
460 LOGP(info,
"Found background envents from ZNAright/left {}/{} -- from ZNCright/left {}/{}", bkgcounterAr, bkgcounterAl, bkgcounterCr, bkgcounterCl);
463 getClusterPatterns(clusArr, clusPatt, *mDict);
465 int inTFROFcounter = -1;
467 std::vector<bool> ChipSeenInThisROF(N_CHIP_IB,
false);
468 std::vector<bool> ChipSeenInLastROF(N_CHIP_IB,
false);
469 std::vector<bool> ChipSeenInLast2ROF(N_CHIP_IB,
false);
472 for (
auto it = rofRecVec.rbegin(); it != rofRecVec.rend(); ++it) {
480 ChipSeenInLast2ROF = ChipSeenInLastROF;
481 ChipSeenInLastROF = ChipSeenInThisROF;
482 std::fill(ChipSeenInThisROF.begin(), ChipSeenInThisROF.end(),
false);
484 auto clustersInRof = rofRec.getROFData(clusArr);
485 auto patternsInRof = rofRec.getROFData(mPatterns);
487 Tbc = (int)rofRec.getBCData().bc;
488 Torbit = (
long)rofRec.getBCData().orbit;
490 if (inTFROFcounter < 1) {
491 LOGP(info,
"First of TF: ITS orbit/bc {}/{}", Torbit, Tbc);
495 int eff_bc = Tbc + 60;
496 long eff_orbit = Torbit;
503 bool isZNArtagged = searchBCfromMap(ZNArtag, (
long)eff_orbit, eff_bc);
508 bool isZNAltagged = searchBCfromMap(ZNAltag, (
long)eff_orbit, eff_bc);
513 bool isZNCrtagged = searchBCfromMap(ZNCrtag, (
long)eff_orbit, eff_bc);
518 bool isZNCltagged = searchBCfromMap(ZNCltag, (
long)eff_orbit, eff_bc);
524 TZDCtag |= (isZNArtagged << 0);
525 TZDCtag |= (isZNAltagged << 1);
526 TZDCtag |= (isZNCrtagged << 2);
527 TZDCtag |= (isZNCltagged << 3);
530 LOGP(info,
"ZDC tag with mask {}: ZNAright = {} - ZNAleft = {} - ZNCright = {} - ZNCleft = {}",
531 TZDCtag, (TZDCtag >> 0) & 1, (TZDCtag >> 1) & 1, (TZDCtag >> 2) & 1, (TZDCtag >> 3) & 1);
535 std::set<int> AvailableChips{};
536 std::map<int, std::vector<int>> MAPsize{};
537 std::map<int, std::vector<int>> MAPcols{};
538 std::map<int, std::vector<int>> MAProws{};
539 std::map<int, std::vector<o2::math_utils::Point3D<float>>> MAPcoordinates{};
540 std::map<int, int> MAPntarget{};
541 std::map<int, int> MAPcoo_mincol{};
542 std::map<int, int> MAPcoo_maxcol{};
545 int ntarget_in_rof = 0;
546 for (
int iclus = 0; iclus < clustersInRof.size(); iclus++) {
548 const auto& compClus = clustersInRof[iclus];
550 auto chipid = compClus.getSensorID();
557 ChipSeenInThisROF[chipid] =
true;
559 int coo_col = (int)compClus.getCol();
560 int coo_row = (int)compClus.getRow();
562 const auto& patti = patternsInRof[iclus];
563 int npix = patti.getNPixels();
564 int colspan = patti.getColumnSpan();
565 int rowspan = patti.getRowSpan();
567 bool newchip = AvailableChips.insert(chipid).second;
569 MAPsize[chipid] = std::vector<int>{};
570 MAPcols[chipid] = std::vector<int>{};
571 MAPntarget[chipid] = 0;
572 MAPcoo_mincol[chipid] = coo_col;
573 MAPcoo_maxcol[chipid] = coo_col + colspan;
576 MAPsize[chipid].push_back(npix);
577 MAPcols[chipid].push_back(colspan);
578 if (mSaveClusterParameters) {
579 MAProws[chipid].push_back(rowspan);
582 const auto pattID = compClus.getPatternID();
587 MAPcoordinates[chipid].push_back(mGeom->
getMatrixL2G(chipid)(local));
589 if (colspan >= targetClusterMinCol && rowspan <= targetClusterMaxRow) {
591 MAPntarget[chipid] += 1;
594 MAPcoo_mincol[chipid] = TMath::Min(MAPcoo_mincol[chipid], coo_col);
595 MAPcoo_maxcol[chipid] = TMath::Max(MAPcoo_maxcol[chipid], coo_col + colspan);
599 if (ntarget_in_rof == 0 &&
static_cast<int64_t
>(mTFn) >
static_cast<int64_t
>(mSkimmedOnlyAfterTF) + 2) {
604 for (
int ic : AvailableChips) {
608 if (inTFROFcounter < 1) {
610 }
else if (ChipSeenInLastROF[ic]) {
616 if (inTFROFcounter < 2) {
618 }
else if (ChipSeenInLast2ROF[ic]) {
624 Tphi = ChipToPhi(ic);
626 Tnclus = MAPsize[ic].size();
627 if (mSaveClusterParameters) {
628 TclusterSize = MAPsize[ic];
629 TclusterColSpan = MAPcols[ic];
630 TclusterRowSpan = MAProws[ic];
634 for (
const auto& global : MAPcoordinates[ic]) {
635 TclusterPhi.push_back(std::atan2(global.Y(), global.X()));
636 TclusterR.push_back(std::hypot(global.X(), global.Y()));
637 TclusterZ.push_back(global.Z());
640 Tmincol = MAPcoo_mincol[ic];
641 Tmaxcol = MAPcoo_maxcol[ic];
643 std::sort(MAPsize[ic].begin(), MAPsize[ic].
end(), std::greater<>());
645 Tnhit = Tnclus_s20 = Tnclus_s100 = Tnclus_s150 = 0;
646 Tnhit1 = Tnhit10 = 0.;
647 Tnclus_c20 = Tnclus_c100 = Tnclus_c128 = 0;
648 Tnclus_target = MAPntarget[ic];
653 int nclus10 = 0, nclus1 = 0;
655 for (
int nh : MAPsize[ic]) {
674 Tnclus_s20 += (nh >= 20);
675 Tnclus_s100 += (nh >= 100);
676 Tnclus_s150 += (nh >= 150);
679 Tnhit10 = (nclus10 == 0) ? 0. : 1. * Tnhit10 / nclus10;
681 for (
int nc : MAPcols[ic]) {
682 Tnclus_c20 += (nc >= 20);
683 Tnclus_c100 += (nc >= 100);
684 Tnclus_c128 += (nc >= 128);
687 ITSChipEvtTree->Fill();
688 if (Tnclus_target > 0) {
689 ITSChipEvtTargetTree->Fill();