From 396f8e417dc46b79a3c04446f7178439317c138a Mon Sep 17 00:00:00 2001 From: Adam Matyja Date: Mon, 2 Nov 2026 16:30:21 +0100 Subject: [PATCH 1/3] Mimic data selection in MC --- .../tauThreeProngEventTableProducer.cxx | 113 ++++++++++++++++-- 1 file changed, 102 insertions(+), 11 deletions(-) diff --git a/PWGUD/TableProducer/tauThreeProngEventTableProducer.cxx b/PWGUD/TableProducer/tauThreeProngEventTableProducer.cxx index 0a5f76df134..85276d108c7 100644 --- a/PWGUD/TableProducer/tauThreeProngEventTableProducer.cxx +++ b/PWGUD/TableProducer/tauThreeProngEventTableProducer.cxx @@ -67,7 +67,10 @@ enum MyRecoProblem { TOO_MANY_DAUGHTERS = 2, // more than 6 daughters from 2 taus TWO_TRACKS = 3, // more than 1 associated track to MC particle (tau daughter) NO_TRACK = 4, // No associated track to MC particle (tau daughter) - MIXED_TRACKS = 5 // 4 (or 6) tracks reconstructed but from 2 collisions + MIXED_TRACKS = 5, // 4 (or 6) tracks reconstructed but from 2 collisions + BAD_GAP = 6, // rapidity gap out of range 0-2 + GAP_NE_2 = 7, // rapidity gap != 2 + FIT_VETO = 8 // FIT not empty (with thresholds) }; enum MyParticle { @@ -185,7 +188,7 @@ struct TauThreeProngEventTableProducer { // Configurable maxNsigmaPrVetocut{"maxNsigmaPrVetocut", 3., "max Nsigma for Proton veto cut"}; // Configurable maxNsigmaKaVetocut{"maxNsigmaKaVetocut", 3., "max Nsigma for Kaon veto cut"}; // Configurable minPtEtrkcut{"minPtEtrkcut", 0.25, "min Pt for El track cut"}; - Configurable minTrkPtcut{"minTrkPtcut", 0.1, "min Pt for each charged track cut, default=100MeV/c"}; + Configurable minTrkPtcut{"minTrkPtcut", 0.10, "min Pt for each charged track cut, default=100MeV/c"}; Configurable nPVtrackscut{"nPVtrackscut", 4, "number of PV contributors, default=4"}; Configurable mFITvetoFlag{"mFITvetoFlag", true, "To apply FIT veto"}; Configurable mFITvetoWindow{"mFITvetoWindow", 2, "FIT veto window"}; @@ -219,7 +222,7 @@ struct TauThreeProngEventTableProducer { ////using FullSGUDCollisions = soa::Join; ////using FullSGUDCollision = FullSGUDCollisions::iterator; using FullMCUDTracks = soa::Join; - using FullMCSGUDCollisions = soa::Join; + using FullMCSGUDCollisions = soa::Join; // using FullMCSGUDCollision = FullMCSGUDCollisions::iterator; // init @@ -1136,6 +1139,11 @@ struct TauThreeProngEventTableProducer { if (verbose) LOGF(info, " UDMcCollision size %d, Collisions size %d, UDtracks %d, UDMcParticles %d", mcCollisions.size(), collisions.size(), tracks.size(), mcParticles.size()); + // temporary variables needed for reconstruction + int gapSide = -10; + int truegapSide = -10; + bool isFITveto = false; + // temporary variables // float tmpRapidity = -999.; float trueTauRapidity[2] = {-999., -999.}; @@ -1388,7 +1396,9 @@ struct TauThreeProngEventTableProducer { float trueDaugZ[6] = {-998., -998., -998., -998., -998., -998.}; int trueDaugPdgCode[6] = {-999, -999, -999, -999, -999, -999}; - MyRecoProblem problem = NO_PROBLEM; + int8_t problemBits[8] = {-99, -99, -99, -99, -99, -99, -99, -99}; + uint8_t problemBitsFlag = 0; + // MyRecoProblem problem = NO_PROBLEM; registrySkim.get(HIST("skim/problemMC"))->Fill(NO_PROBLEM); // tau tau event type @@ -1445,7 +1455,8 @@ struct TauThreeProngEventTableProducer { // LOGF(info, "Truth collision has more than 1 reco collision. Skipping this event."); // histos.get(HIST("Truth/hTroubles"))->Fill(1); // problem = true; - problem = MANY_RECO; + problemBits[MANY_RECO - 1] = true; + // problem = MANY_RECO; registrySkim.get(HIST("skim/problemMC"))->Fill(MANY_RECO); // continue; } else { @@ -1453,12 +1464,80 @@ struct TauThreeProngEventTableProducer { LOGF(info, "---- Truth collision has 1 reco collision. Record event."); } + // To fill bcFlags and problemFlags + const int offset = 1; + // grab reco-level collision for (const auto& collFromMcColl : collFromMcColls) { if (verbose) { LOGF(info, "---- ###### Collision %d #########", collFromMcColl.index()); LOGF(info, "---- Coll GID %d, Vertex (%f,%f,%f)", collFromMcColl.globalIndex(), collFromMcColl.posX(), collFromMcColl.posY(), collFromMcColl.posZ()); } + + // + // part neede to mimic reconstruction selection criteria + // + gapSide = collFromMcColl.gapSide(); + // registrySkim.get(HIST("skim/gapSide"))->Fill(gapSide); + if (gapSide < o2::aod::sgselector::SingleGapA || gapSide > o2::aod::sgselector::DoubleGap) { // if (gapSide < 0 || gapSide > 2) + problemBits[BAD_GAP - 1] = true; + } + // return; + // registrySkim.get(HIST("skim/efficiency"))->Fill(1., 1.); + + truegapSide = sgSelector.trueGap(collFromMcColl, cutFV0, cutFT0A, cutFT0C, cutZDC); + gapSide = truegapSide; + // registrySkim.get(HIST("skim/trueGapSide"))->Fill(gapSide); + if (gapSide != mGapSide) { + problemBits[GAP_NE_2 - 1] = true; + } + // return; + // registrySkim.get(HIST("skim/efficiency"))->Fill(2., 1.); + + // n PV contributors + // if (PVContributors.size() != nPVtrackscut) // 4 or 6 + // return; + // if (nEtaIn15 != nPVtrackscut) // 4 or 6 + // return; + // registrySkim.get(HIST("skim/efficiency"))->Fill(4., 1.); + // + // if (npT100 != nPVtrackscut) // 4 or 6 + // return; + // registrySkim.get(HIST("skim/efficiency"))->Fill(5., 1.); + // + // registrySkim.get(HIST("skim/nTof"))->Fill(nTofTrk); + // if (nTofTrk < nTofTrkMinCut) + // return; + // registrySkim.get(HIST("skim/efficiency"))->Fill(6., 1.); + + // + // FIT informaton + // + auto bitMin = 16 - mFITvetoWindow; // default is +- 2 bc (2 bit) + auto bitMax = 16 + mFITvetoWindow; + isFITveto = false; + // check FIT information + for (auto bit = bitMin; bit <= bitMax; bit++) { + if (TESTBIT(collFromMcColl.bbFT0Apf(), bit)) + isFITveto = true; + if (TESTBIT(collFromMcColl.bbFT0Cpf(), bit)) + isFITveto = true; + if (useFV0ForVeto && TESTBIT(collFromMcColl.bbFV0Apf(), bit)) + isFITveto = true; + if (useFDDAForVeto && TESTBIT(collFromMcColl.bbFDDApf(), bit)) + isFITveto = true; + if (useFDDCForVeto && TESTBIT(collFromMcColl.bbFDDCpf(), bit)) + isFITveto = true; + } // end of loop over FIT bits + if (mFITvetoFlag && isFITveto) { + problemBits[FIT_VETO - 1] = true; + } + // return; + // registrySkim.get(HIST("skim/efficiency"))->Fill(7., 1.); + + // MyRecoProblem problem = NO_PROBLEM; + registrySkim.get(HIST("skim/problemMC"))->Fill(NO_PROBLEM); + // auto const& collFromMcColl = collFromMcColls.iteratorAt(0); // grab tracks from the reco-level collision to get info to match measured data tables (processDataSG function) auto const& trksFromColl = tracks.sliceBy(trackPerCollision, collFromMcColl.globalIndex()); @@ -1498,7 +1577,7 @@ struct TauThreeProngEventTableProducer { bcSels[6] = collFromMcColl.zVtxFT0vPV(); bcSels[7] = collFromMcColl.vtxITSTPC(); - const int offset = 1; + // const int offset = 1; bcSelBits = bcSels[0]; // initialization for (int ibit = 1; ibit < nBitsMax; ibit++) { bcSelBits = (bcSelBits << offset); // shift by 1 position towards left @@ -1556,7 +1635,9 @@ struct TauThreeProngEventTableProducer { LOGF(info, "------ Truth collision has more than 6 charged daughters from 2 taus. Breaking the daughter loop."); // histos.get(HIST("Truth/hTroubles"))->Fill(3); // problem = true; - problem = TOO_MANY_DAUGHTERS; + + problemBits[TOO_MANY_DAUGHTERS - 1] = true; + // problem = TOO_MANY_DAUGHTERS; registrySkim.get(HIST("skim/problemMC"))->Fill(TOO_MANY_DAUGHTERS); break; @@ -1602,7 +1683,9 @@ struct TauThreeProngEventTableProducer { if (counter > 1) { if (verbose) LOGF(info, "------ Daughter has more than 1 associated track. Ntracks = %d. Skipping this daughter.", counter); - problem = TWO_TRACKS; + + problemBits[TWO_TRACKS - 1] = true; + // problem = TWO_TRACKS; registrySkim.get(HIST("skim/problemMC"))->Fill(TWO_TRACKS); continue; } @@ -1610,7 +1693,8 @@ struct TauThreeProngEventTableProducer { // what if no track is associated to mc particle??? if (verbose) LOGF(info, "----- Daughter has no associated track. Ntracks = %d. Skipping this daughter.", tracksFromDaughter.size()); - problem = NO_TRACK; + problemBits[NO_TRACK - 1] = true; + // problem = NO_TRACK; registrySkim.get(HIST("skim/problemMC"))->Fill(NO_TRACK); continue; } @@ -1659,6 +1743,13 @@ struct TauThreeProngEventTableProducer { } // end of loop over MC particles } // end of loop over collisions associated to MC collision + // set up problem bits + problemBitsFlag = problemBits[0]; // initialization + for (int ibit = 1; ibit < nBitsMax; ibit++) { + problemBitsFlag = (problemBitsFlag << offset); // shift by 1 position towards left + problemBitsFlag += problemBits[ibit]; // add next bit to the pool + } + // decide the channel and set the variable. trueChannel = trueChannel + countPi0 * 10 + zerothTau * 100; @@ -1695,7 +1786,7 @@ struct TauThreeProngEventTableProducer { mccoll.posZ(), // trueTauX, trueTauY, trueTauZ, trueDaugX, trueDaugY, trueDaugZ, - trueDaugPdgCode, problem); + trueDaugPdgCode, problemBitsFlag); } else if (nChargedDaughtersTau[0] + nChargedDaughtersTau[1] == sixTracks) { // 6 trueTauSixTracks(runNumber, bc, // is it necessary @@ -1727,7 +1818,7 @@ struct TauThreeProngEventTableProducer { mccoll.posZ(), // trueTauX, trueTauY, trueTauZ, trueDaugX, trueDaugY, trueDaugZ, - trueDaugPdgCode, problem); + trueDaugPdgCode, problemBitsFlag); } // end of saving the output } else { // get only the truth information. The reco-level info is left on default From 8dc48af0de9e0a7b5c0b77a3308954f6cff82e77 Mon Sep 17 00:00:00 2001 From: Adam Matyja Date: Mon, 2 Nov 2026 16:36:25 +0100 Subject: [PATCH 2/3] Remove copy paste error --- PWGUD/TableProducer/tauThreeProngEventTableProducer.cxx | 3 --- 1 file changed, 3 deletions(-) diff --git a/PWGUD/TableProducer/tauThreeProngEventTableProducer.cxx b/PWGUD/TableProducer/tauThreeProngEventTableProducer.cxx index 85276d108c7..510e229b397 100644 --- a/PWGUD/TableProducer/tauThreeProngEventTableProducer.cxx +++ b/PWGUD/TableProducer/tauThreeProngEventTableProducer.cxx @@ -1535,9 +1535,6 @@ struct TauThreeProngEventTableProducer { // return; // registrySkim.get(HIST("skim/efficiency"))->Fill(7., 1.); - // MyRecoProblem problem = NO_PROBLEM; - registrySkim.get(HIST("skim/problemMC"))->Fill(NO_PROBLEM); - // auto const& collFromMcColl = collFromMcColls.iteratorAt(0); // grab tracks from the reco-level collision to get info to match measured data tables (processDataSG function) auto const& trksFromColl = tracks.sliceBy(trackPerCollision, collFromMcColl.globalIndex()); From 44a83c70c3eb6b88fb1d8ed6197714dd592f9667 Mon Sep 17 00:00:00 2001 From: Adam Matyja Date: Mon, 2 Nov 2026 16:43:40 +0100 Subject: [PATCH 3/3] Change bit field problem in MC to positive --- PWGUD/DataModel/TauThreeProngEventTables.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGUD/DataModel/TauThreeProngEventTables.h b/PWGUD/DataModel/TauThreeProngEventTables.h index ca00bd0be6f..95c8fff2a69 100644 --- a/PWGUD/DataModel/TauThreeProngEventTables.h +++ b/PWGUD/DataModel/TauThreeProngEventTables.h @@ -138,7 +138,7 @@ DECLARE_SOA_COLUMN(True6DaugPx, true6DaugPx, float[6]); DECLARE_SOA_COLUMN(True6DaugPy, true6DaugPy, float[6]); DECLARE_SOA_COLUMN(True6DaugPz, true6DaugPz, float[6]); DECLARE_SOA_COLUMN(True6DaugPdgCode, true6DaugPdgCode, int[6]); -DECLARE_SOA_COLUMN(Problem, problem, int8_t); +DECLARE_SOA_COLUMN(Problem, problem, uint8_t); DECLARE_SOA_COLUMN(IsRec, isRec, int8_t); } // namespace tautree