From 9f934c1d7aecbdad273ec5cc43a8ece74b0161f1 Mon Sep 17 00:00:00 2001 From: Arvind Khuntia Date: Sat, 25 Oct 2025 10:23:45 +0200 Subject: [PATCH 1/4] [PWGJE] New histograms for MC and additional ev. sel. --- PWGJE/Tasks/nucleiInJets.cxx | 114 +++++++++++++++++++++++++++++++---- 1 file changed, 103 insertions(+), 11 deletions(-) diff --git a/PWGJE/Tasks/nucleiInJets.cxx b/PWGJE/Tasks/nucleiInJets.cxx index e60839c00f0..20d0125c86c 100644 --- a/PWGJE/Tasks/nucleiInJets.cxx +++ b/PWGJE/Tasks/nucleiInJets.cxx @@ -115,6 +115,8 @@ struct nucleiInJets { Configurable isWithLeadingJet{"isWithLeadingJet", true, "Events with leading jet"}; Configurable useLfTpcPid{"useLfTpcPid", true, "Events with custom TPC parameters"}; Configurable centralityType{"centralityType", 0, "0: FT0M, 1: FT0C, 2: FV0A"}; + Configurable> cfgOccupancyRange{"cfgOccupancyRange", {0, 1000}, "Occupancy selection"}; + Configurable useOccupancy{"useOccupancy", true, "Events with custom occupancy selection"}; Configurable cfgtrkMinPt{"cfgtrkMinPt", 0.15, "set track min pT"}; Configurable cfgtrkMaxEta{"cfgtrkMaxEta", 0.8, "set track max Eta"}; @@ -171,6 +173,9 @@ struct nucleiInJets { Configurable applySkim{"applySkim", false, "Apply skimming"}; Configurable cfgSkim{"cfgSkim", "fHighFt0Mult", "Configurable for skimming"}; + Configurable sel8Coll{"sel8Coll", true, "sel8Coll for collisions"}; + Configurable selNoSameBunchPileup{"selNoSameBunchPileup", false, "selNoSameBunchPileup for collisions"}; + Configurable selIsGoodZvtxFT0vsPV{"selIsGoodZvtxFT0vsPV", false, "selIsGoodZvtxFT0vsPV for collisions"}; // using EventTable = soa::Join; using EventTable = aod::JetCollisions; @@ -235,10 +240,13 @@ struct nucleiInJets { jetHist.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(4, "Sel8+|Vz|<10"); jetHist.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(5, "nJets>0"); - jetHist.add("hNEventsInc", "hNEventsInc", {HistType::kTH1D, {{4, 0.f, 4.f}}}); + jetHist.add("hNEventsInc", "hNEventsInc", {HistType::kTH1D, {{6, 0.f, 6.f}}}); jetHist.get(HIST("hNEventsInc"))->GetXaxis()->SetBinLabel(1, "All"); jetHist.get(HIST("hNEventsInc"))->GetXaxis()->SetBinLabel(2, "Sel8"); jetHist.get(HIST("hNEventsInc"))->GetXaxis()->SetBinLabel(3, "|Vz|<10"); + jetHist.get(HIST("hNEventsInc"))->GetXaxis()->SetBinLabel(4, "noSameBunchPileup"); + jetHist.get(HIST("hNEventsInc"))->GetXaxis()->SetBinLabel(5, "isGoodZvtxFT0vsPV"); + jetHist.get(HIST("hNEventsInc"))->GetXaxis()->SetBinLabel(6, "OccupancySel"); jetHist.add("hNEventsIncVsCent", "hNEventsIncVsCent", {HistType::kTH2D, {{vzAxis}, {CentAxis}}}); @@ -490,6 +498,9 @@ struct nucleiInJets { jetHist.get(HIST("recInc/eventStat"))->GetXaxis()->SetBinLabel(1, "All"); jetHist.get(HIST("recInc/eventStat"))->GetXaxis()->SetBinLabel(2, "Sel8"); jetHist.get(HIST("recInc/eventStat"))->GetXaxis()->SetBinLabel(3, "|Vz|<10"); + jetHist.get(HIST("recInc/eventStat"))->GetXaxis()->SetBinLabel(4, "noSameBunchPileup"); + jetHist.get(HIST("recInc/eventStat"))->GetXaxis()->SetBinLabel(5, "isGoodZvtxFT0vsPV"); + jetHist.get(HIST("recInc/eventStat"))->GetXaxis()->SetBinLabel(6, "OccupancySel"); jetHist.add("recInc/vertexZ", "vertexZ (inclusive)", HistType::kTH2F, {{vzAxis}, {CentAxis}}); jetHist.add("recInc/pt/PtParticleTypeTPC", "Pt vs ParticleType vs Centrality (TPC)", HistType::kTH3F, {{100, 0.f, 10.f}, {14, -7, 7}, {100, 0, 100}}); @@ -499,6 +510,10 @@ struct nucleiInJets { jetHist.add("recInc/eff/tpcTrack3D", "Pt vs ParticleType vs Centrality (tpc)", HistType::kTH3F, {{100, 0.f, 10.f}, {14, -7, 7}, {100, 0, 100}}); jetHist.add("recInc/eff/tpcTofTrack3D", "Pt vs ParticleType vs Centrality (tpc-tof)", HistType::kTH3F, {{100, 0.f, 10.f}, {14, -7, 7}, {100, 0, 100}}); + + jetHist.add("recInc/dcaxy/rec/tpcPtVsDcaxy3D", "pT(p) vs ParticleType (p) vs Dcaxy", HistType::kTHnSparseF, {{100, 0.f, 10.f}, {14, -7, 7}, {100, 0, 100}, dcaxyAxis, {4, 0, 4}}); // pt, parttype, cent, dcaxy, partOrigin + jetHist.add("recInc/dcaxy/rec/tpcPtVsDcaxy3DPIDselected", "pT(p) vs ParticleType (p) vs Dcaxy", HistType::kTHnSparseF, {{100, 0.f, 10.f}, {14, -7, 7}, {100, 0, 100}, dcaxyAxis, {4, 0, 4}}); // pt, parttype, cent, dcaxy, partOrigin + // inside jet jetHist.add("tracks/mc/proton/h3PtVsProtonNSigmaTPCVsPtJet_jet", "pT(p) vs NSigmaTPC (p) vs jet pT; #it{p}_{T} (GeV/#it{c}; NSigmaTPC; p^{jet}_{T}", HistType::kTH3F, {{PtAxis}, {200, -10, 10}, {PtJetAxis}}); jetHist.add("tracks/mc/antiProton/h3PtVsantiProtonNSigmaTPCVsPtJet_jet", "pT(#bar{p}) vs NSigmaTPC (#bar{p}) vs jet pT; #it{p}_{T} (GeV/#it{c}; NSigmaTPC; p^{jet}_{T}", HistType::kTH3F, {{PtAxis}, {200, -10, 10}, {PtJetAxis}}); @@ -660,7 +675,7 @@ struct nucleiInJets { } template - bool isTrackSelected(const TrackType track) + bool isTrackSelectedWithoutDcaxy(const TrackType track) { // standard track selection if (track.pt() < cfgtrkMinPt) @@ -675,10 +690,6 @@ struct nucleiInJets { } if (std::fabs(track.eta()) > cfgtrkMaxEta) return false; - if (std::fabs(track.dcaXY()) > cfgMaxDCArToPVcut && !useDcaxyPtDepCut) - return false; - if (std::fabs(track.dcaXY()) > dcaXYPtDepCut(track.pt()) && useDcaxyPtDepCut) - return false; if (std::fabs(track.dcaZ()) > cfgMaxDCAzToPVcut) return false; if (track.tpcNClsFindable() < cfgnFindableTPCClusters) @@ -694,6 +705,29 @@ struct nucleiInJets { return true; } + template + bool isTrackSelected(const TrackType track) + { + if (!isTrackSelectedWithoutDcaxy(track)) + return false; + if (std::fabs(track.dcaXY()) > cfgMaxDCArToPVcut && !useDcaxyPtDepCut) + return false; + if (std::fabs(track.dcaXY()) > dcaXYPtDepCut(track.pt()) && useDcaxyPtDepCut) + return false; + + return true; + } + + template + bool isOccupancyAccepted(const coll& collision) + { + auto occupancy{collision.trackOccupancyInTimeRange()}; + if (occupancy < cfgOccupancyRange->at(0) || occupancy > cfgOccupancyRange->at(1)) + return false; + else + return true; + } + int nEvents = 0; template void fillTrackInfo(const TracksType& trk, const JetType& jets, std::vector& leadingJetPtEtaPhi) @@ -1345,13 +1379,28 @@ struct nucleiInJets { { jetHist.fill(HIST("hNEventsInc"), 0.5); - if (!jetderiveddatautilities::selectCollision(coll, jetderiveddatautilities::initialiseEventSelectionBits("sel8"))) - return; + bool isSel8 = jetderiveddatautilities::selectCollision(coll, jetderiveddatautilities::initialiseEventSelectionBits("sel8")); + bool isSelNoSameBunchPileup = jetderiveddatautilities::selectCollision(coll, jetderiveddatautilities::initialiseEventSelectionBits("selNoSameBunchPileup")); + bool isSelIsGoodZvtxFT0vsPV = jetderiveddatautilities::selectCollision(coll, jetderiveddatautilities::initialiseEventSelectionBits("selIsGoodZvtxFT0vsPV")); + if (sel8Coll && !isSel8) + return; jetHist.fill(HIST("hNEventsInc"), 1.5); + if (std::abs(coll.posZ()) > 10) // bad vertex return; jetHist.fill(HIST("hNEventsInc"), 2.5); + if (selNoSameBunchPileup && !isSelNoSameBunchPileup) + return; + jetHist.fill(HIST("hNEventsInc"), 3.5); + if (selIsGoodZvtxFT0vsPV && !isSelIsGoodZvtxFT0vsPV) + return; + jetHist.fill(HIST("hNEventsInc"), 4.5); + + if (useOccupancy && !isOccupancyAccepted(coll)) + return; + jetHist.fill(HIST("hNEventsInc"), 5.5); + float centrality = -999; switch (centralityType) { case 0: // FT0M @@ -1963,12 +2012,31 @@ struct nucleiInJets { void processRecInc(EventTableMC::iterator const& coll, TrackCandidatesIncMC const& tracks, aod::JetParticles const& particleTracks, aod::JMcCollisions const&) { jetHist.fill(HIST("recInc/eventStat"), 0.5); - if (!jetderiveddatautilities::selectCollision(coll, jetderiveddatautilities::initialiseEventSelectionBits("sel8"))) + + bool isSel8 = jetderiveddatautilities::selectCollision(coll, jetderiveddatautilities::initialiseEventSelectionBits("sel8")); + bool isSelNoSameBunchPileup = jetderiveddatautilities::selectCollision(coll, jetderiveddatautilities::initialiseEventSelectionBits("selNoSameBunchPileup")); + bool isSelIsGoodZvtxFT0vsPV = jetderiveddatautilities::selectCollision(coll, jetderiveddatautilities::initialiseEventSelectionBits("selIsGoodZvtxFT0vsPV")); + + if (sel8Coll && !isSel8) return; jetHist.fill(HIST("recInc/eventStat"), 1.5); + if (std::abs(coll.posZ()) > 10) // bad vertex return; jetHist.fill(HIST("recInc/eventStat"), 2.5); + if (selNoSameBunchPileup && !isSelNoSameBunchPileup) + return; + jetHist.fill(HIST("recInc/eventStat"), 3.5); + if (selIsGoodZvtxFT0vsPV && !isSelIsGoodZvtxFT0vsPV) + return; + jetHist.fill(HIST("recInc/eventStat"), 4.5); + + if (useOccupancy && !isOccupancyAccepted(coll)) + return; + jetHist.fill(HIST("recInc/eventStat"), 5.5); + + // if (!jetderiveddatautilities::selectCollision(coll, jetderiveddatautilities::initialiseEventSelectionBits("sel8"))) + // return; float centrality = -999; switch (centralityType) { @@ -1987,7 +2055,7 @@ struct nucleiInJets { jetHist.fill(HIST("recInc/vertexZ"), coll.posZ(), centrality); for (const auto& track : tracks) { - if (!isTrackSelected(track)) { + if (!isTrackSelectedWithoutDcaxy(track)) { continue; } if (!track.has_mcParticle()) @@ -1996,7 +2064,31 @@ struct nucleiInJets { continue; auto mcTrack = track.mcParticle_as(); - if (!mcTrack.isPhysicalPrimary()) + + // require mc getProcess to get Decay and Material secondaries + int particleOriginType = 0; + auto isMcPrimary = false; + auto isMcTransport = false; // auto isMcSecondaryFromMaterial = false; auto isMcSecondaryFromWeakDecay = false; + if (mcTrack.isPhysicalPrimary()) { + isMcPrimary = true; + particleOriginType = 1; + } else if (mcTrack.getGenStatusCode() == -1) { + isMcTransport = true; + particleOriginType = 2; + } + + // Fill DCAxy histograms + jetHist.fill(HIST("recInc/dcaxy/rec/tpcPtVsDcaxy3D"), mcTrack.pt(), mapPDGToValue(mcTrack.pdgCode()), centrality, track.dcaXY(), particleOriginType); + if (std::abs(track.tpcNSigmaPr()) < cfgnTPCPIDPr) + jetHist.fill(HIST("recInc/dcaxy/rec/tpcPtVsDcaxy3DPIDselected"), mcTrack.pt(), mapPDGToValue(mcTrack.pdgCode()), centrality, track.dcaXY(), particleOriginType); + + if (!isMcPrimary) + continue; + + // DCAxy selection for rest of the analysis + if (std::fabs(track.dcaXY()) > cfgMaxDCArToPVcut && !useDcaxyPtDepCut) + continue; + if (std::fabs(track.dcaXY()) > dcaXYPtDepCut(track.pt()) && useDcaxyPtDepCut) continue; auto mass = TDatabasePDG::Instance()->GetParticle(abs(mcTrack.pdgCode()))->Mass(); From 9b6031e60286e7f971a4b8c2eeefead46a41291a Mon Sep 17 00:00:00 2001 From: Arvind Khuntia Date: Mon, 27 Oct 2025 17:18:43 +0100 Subject: [PATCH 2/4] [PWGMM] Only add non-zero ctp mask --- PWGMM/Lumi/Tasks/LumiFDDFT0.cxx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/PWGMM/Lumi/Tasks/LumiFDDFT0.cxx b/PWGMM/Lumi/Tasks/LumiFDDFT0.cxx index 50bef7a255b..36af7fb2e0e 100644 --- a/PWGMM/Lumi/Tasks/LumiFDDFT0.cxx +++ b/PWGMM/Lumi/Tasks/LumiFDDFT0.cxx @@ -352,6 +352,9 @@ struct LumiFDDFT0 { for (const auto& bc : bcs) { if (!bc.timestamp()) continue; + if (bc.inputMask() == 0) // No trigger inputs active + continue; + if (useRelTimeStamp) { Long64_t relTS = bc.timestamp() - fttimestamp; rowEventInfoCTP(relTS, bc.globalBC(), bc.inputMask()); From bed2f0a6b2222f54124d74a16cd57615ecc7e9c1 Mon Sep 17 00:00:00 2001 From: Arvind Khuntia Date: Mon, 27 Oct 2025 17:23:55 +0100 Subject: [PATCH 3/4] update to master --- PWGJE/Tasks/nucleiInJets.cxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PWGJE/Tasks/nucleiInJets.cxx b/PWGJE/Tasks/nucleiInJets.cxx index 20d0125c86c..374722e86e8 100644 --- a/PWGJE/Tasks/nucleiInJets.cxx +++ b/PWGJE/Tasks/nucleiInJets.cxx @@ -2068,12 +2068,12 @@ struct nucleiInJets { // require mc getProcess to get Decay and Material secondaries int particleOriginType = 0; auto isMcPrimary = false; - auto isMcTransport = false; // auto isMcSecondaryFromMaterial = false; auto isMcSecondaryFromWeakDecay = false; + // auto isMcTransport = false; // auto isMcSecondaryFromMaterial = false; auto isMcSecondaryFromWeakDecay = false; if (mcTrack.isPhysicalPrimary()) { isMcPrimary = true; particleOriginType = 1; } else if (mcTrack.getGenStatusCode() == -1) { - isMcTransport = true; + // isMcTransport = true; particleOriginType = 2; } @@ -2094,7 +2094,7 @@ struct nucleiInJets { auto mass = TDatabasePDG::Instance()->GetParticle(abs(mcTrack.pdgCode()))->Mass(); auto rapidity = RecoDecay::y(std::array{track.px(), track.py(), track.pz()}, mass); - if (rapidity > cfgtrkMaxRap) + if (std::abs(rapidity) > cfgtrkMaxRap) continue; // Proton if (std::abs(mcTrack.pdgCode()) == 2212) { // Proton @@ -2198,4 +2198,4 @@ struct nucleiInJets { WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc, TaskName{"nuclei-in-jets"})}; -}; +}; \ No newline at end of file From 3aa17e831321de4320ea0c25d4aa6d706161ba4a Mon Sep 17 00:00:00 2001 From: Arvind Khuntia Date: Mon, 27 Oct 2025 17:24:57 +0100 Subject: [PATCH 4/4] update to master --- PWGJE/Tasks/nucleiInJets.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGJE/Tasks/nucleiInJets.cxx b/PWGJE/Tasks/nucleiInJets.cxx index 374722e86e8..4afacbe3919 100644 --- a/PWGJE/Tasks/nucleiInJets.cxx +++ b/PWGJE/Tasks/nucleiInJets.cxx @@ -2198,4 +2198,4 @@ struct nucleiInJets { WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc, TaskName{"nuclei-in-jets"})}; -}; \ No newline at end of file +};