From 0c035f8ff44d37e5910ba831a5fded5e7ac8cb28 Mon Sep 17 00:00:00 2001 From: Oleksii Lubynets Date: Thu, 18 Jun 2026 11:40:53 +0200 Subject: [PATCH 1/3] read irSource from ccdb --- DPG/Tasks/TPC/tpcSkimsTableCreator.cxx | 10 +++++---- DPG/Tasks/TPC/utilsTpcSkimsTableCreator.h | 26 +++++++++++++++++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/DPG/Tasks/TPC/tpcSkimsTableCreator.cxx b/DPG/Tasks/TPC/tpcSkimsTableCreator.cxx index 7bc4d190d6e..8abf9c1c540 100644 --- a/DPG/Tasks/TPC/tpcSkimsTableCreator.cxx +++ b/DPG/Tasks/TPC/tpcSkimsTableCreator.cxx @@ -88,7 +88,6 @@ struct TreeWriterTpcV0 { Configurable nClNorm{"nClNorm", 152., "Number of cluster normalization. Run 2: 159, Run 3 152"}; Configurable applyEvSel{"applyEvSel", 2, "Flag to apply rapidity cut: 0 -> no event selection, 1 -> Run 2 event selection, 2 -> Run 3 event selection"}; Configurable trackSelection{"trackSelection", 0, "Track selection: 0 -> No Cut, 1 -> kGlobalTrack, 2 -> kGlobalTrackWoPtEta, 3 -> kGlobalTrackWoDCA, 4 -> kQualityTracks, 5 -> kInAcceptanceTracks"}; - Configurable irSource{"irSource", "T0VTX", "Estimator of the interaction rate (Recommended: pp --> T0VTX, Pb-Pb --> ZNC hadronic)"}; /// Configurables downsampling Configurable dwnSmplFactorPi{"dwnSmplFactorPi", 1., "downsampling factor for pions, default fraction to keep is 1."}; Configurable dwnSmplFactorPr{"dwnSmplFactorPr", 1., "downsampling factor for protons, default fraction to keep is 1."}; @@ -108,6 +107,7 @@ struct TreeWriterTpcV0 { Configurable checkZdc{"checkZdc", false, "set ZDC flag for PbPb"}; Configurable treatLimitedAcceptanceAsBad{"treatLimitedAcceptanceAsBad", false, "reject all events where the detectors relevant for the specified Runlist are flagged as LimitedAcceptance"}; Configurable requireGoodRct{"requireGoodRct", false, "require good detector flag in run condtion table"}; + Configurable ccdbPathGrpLhcIf{"ccdbPathGrpLhcIf", "GLO/Config/GRPLHCIF", "Path on the CCDB for the GRPLHCIF object"}; // an arbitrary value of N sigma TOF assigned by TOF task to tracks which are not matched to TOF hits constexpr static float NSigmaTofUnmatched{o2::aod::v0data::kNoTOFValue}; @@ -434,8 +434,9 @@ struct TreeWriterTpcV0 { const auto v0s = myV0s.sliceBy(perCollisionV0s, static_cast(collision.globalIndex())); const auto cascs = myCascs.sliceBy(perCollisionCascs, static_cast(collision.globalIndex())); const auto bc = collision.bc_as(); + const std::string irSource = evaluateIrSource(ccdb, ccdbPathGrpLhcIf, bc.timestamp()); const int runnumber = bc.runNumber(); - const auto hadronicRate = mRateFetcher.fetch(ccdb.service, bc.timestamp(), runnumber, irSource) * OneToKilo; + const auto hadronicRate = !irSource.empty() ? mRateFetcher.fetch(ccdb.service, bc.timestamp(), runnumber, irSource) * OneToKilo : 0.; const int bcGlobalIndex = bc.globalIndex(); int bcTimeFrameId{}, bcBcInTimeFrame{}; if constexpr (ModeId == ModeWithdEdxTrkQA || ModeId == ModeStandard) { @@ -591,7 +592,6 @@ struct TreeWriterTpcTof { Configurable nClNorm{"nClNorm", 152., "Number of cluster normalization. Run 2: 159, Run 3 152"}; Configurable applyEvSel{"applyEvSel", 2, "Flag to apply rapidity cut: 0 -> no event selection, 1 -> Run 2 event selection, 2 -> Run 3 event selection"}; Configurable trackSelection{"trackSelection", 1, "Track selection: 0 -> No Cut, 1 -> kGlobalTrack, 2 -> kGlobalTrackWoPtEta, 3 -> kGlobalTrackWoDCA, 4 -> kQualityTracks, 5 -> kInAcceptanceTracks"}; - Configurable irSource{"irSource", "T0VTX", "Estimator of the interaction rate (Recommended: pp --> T0VTX, Pb-Pb --> ZNC hadronic)"}; /// Triton Configurable maxMomTPCOnlyTr{"maxMomTPCOnlyTr", 1.5, "Maximum momentum for TPC only cut triton"}; Configurable maxMomHardCutOnlyTr{"maxMomHardCutOnlyTr", 50, "Maximum TPC inner momentum for triton"}; @@ -637,6 +637,7 @@ struct TreeWriterTpcTof { Configurable checkZdc{"checkZdc", false, "set ZDC flag for PbPb"}; Configurable treatLimitedAcceptanceAsBad{"treatLimitedAcceptanceAsBad", false, "reject all events where the detectors relevant for the specified Runlist are flagged as LimitedAcceptance"}; Configurable requireGoodRct{"requireGoodRct", false, "require good detector flag in run condtion table"}; + Configurable ccdbPathGrpLhcIf{"ccdbPathGrpLhcIf", "GLO/Config/GRPLHCIF", "Path on the CCDB for the GRPLHCIF object"}; struct TofTrack { bool isApplyHardCutOnly; @@ -822,8 +823,9 @@ struct TreeWriterTpcTof { } const auto bc = collision.bc_as(); + const std::string irSource = evaluateIrSource(ccdb, ccdbPathGrpLhcIf, bc.timestamp()); const int runnumber = bc.runNumber(); - const auto hadronicRate = mRateFetcher.fetch(ccdb.service, bc.timestamp(), runnumber, irSource) * OneToKilo; + const auto hadronicRate = !irSource.empty() ? mRateFetcher.fetch(ccdb.service, bc.timestamp(), runnumber, irSource) * OneToKilo : 0.; const int bcGlobalIndex = bc.globalIndex(); int bcTimeFrameId{}, bcBcInTimeFrame{}; if constexpr (ModeId == ModeStandard || ModeId == ModeWithdEdxTrkQA) { diff --git a/DPG/Tasks/TPC/utilsTpcSkimsTableCreator.h b/DPG/Tasks/TPC/utilsTpcSkimsTableCreator.h index b8550e094d7..178562bc8db 100644 --- a/DPG/Tasks/TPC/utilsTpcSkimsTableCreator.h +++ b/DPG/Tasks/TPC/utilsTpcSkimsTableCreator.h @@ -22,13 +22,19 @@ #include "tpcSkimsTableCreator.h" +#include "Common/Core/CollisionTypeHelper.h" #include "Common/DataModel/OccupancyTables.h" +#include +#include #include +#include +#include #include #include +#include namespace o2::dpg_tpcskimstablecreator { @@ -112,6 +118,26 @@ double tpcSignalGeneric(const TrkType& track) } } +/// Determine inteaction rate source from CCDB +std::string evaluateIrSource(const o2::framework::Service& ccdb, const std::string& ccdbPathGrpLhcIf, const uint64_t timestamp) +{ + std::string irSource{}; + o2::parameters::GRPLHCIFData* genRunParams = ccdb->template getForTimeStamp(ccdbPathGrpLhcIf, timestamp); + if (genRunParams != nullptr) { + o2::common::core::CollisionSystemType::collType collSys = CollisionSystemType::getCollisionTypeFromGrp(genRunParams); + if (collSys == CollisionSystemType::kCollSyspp) { + irSource = "T0VTX"; + } else { + irSource = "ZNC hadronic"; + } + LOG(info) << "irSource determined from General Run Parameters: " << irSource; + } else { + LOG(info) << "No General Run Parameters object found. irSource will remain undefined"; + } + + return irSource; +} + struct OccupancyValues { float tmoPrimUnfm80{UndefValueFloat}; float tmoFV0AUnfm80{UndefValueFloat}; From 9c5ba2839b4fea90b5a419b8ef8c5fe6a0dc9841 Mon Sep 17 00:00:00 2001 From: Oleksii Lubynets Date: Fri, 19 Jun 2026 11:38:15 +0200 Subject: [PATCH 2/3] call evaluateIrSource() only once --- DPG/Tasks/TPC/tpcSkimsTableCreator.cxx | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/DPG/Tasks/TPC/tpcSkimsTableCreator.cxx b/DPG/Tasks/TPC/tpcSkimsTableCreator.cxx index 8abf9c1c540..b46b3a220c0 100644 --- a/DPG/Tasks/TPC/tpcSkimsTableCreator.cxx +++ b/DPG/Tasks/TPC/tpcSkimsTableCreator.cxx @@ -107,6 +107,7 @@ struct TreeWriterTpcV0 { Configurable checkZdc{"checkZdc", false, "set ZDC flag for PbPb"}; Configurable treatLimitedAcceptanceAsBad{"treatLimitedAcceptanceAsBad", false, "reject all events where the detectors relevant for the specified Runlist are flagged as LimitedAcceptance"}; Configurable requireGoodRct{"requireGoodRct", false, "require good detector flag in run condtion table"}; + // Configurable for the path of CCDB General Run Parameters LHC Interface information Configurable ccdbPathGrpLhcIf{"ccdbPathGrpLhcIf", "GLO/Config/GRPLHCIF", "Path on the CCDB for the GRPLHCIF object"}; // an arbitrary value of N sigma TOF assigned by TOF task to tracks which are not matched to TOF hits @@ -422,6 +423,8 @@ struct TreeWriterTpcV0 { aod::pidits::ITSNSigmaEl, aod::pidits::ITSNSigmaPi, aod::pidits::ITSNSigmaKa, aod::pidits::ITSNSigmaPr>(myTracks); + std::string irSource{}; + bool isFirstCollision{true}; for (const auto& collision : collisions) { if (!isEventSelected(collision, applyEvSel)) { continue; @@ -434,7 +437,10 @@ struct TreeWriterTpcV0 { const auto v0s = myV0s.sliceBy(perCollisionV0s, static_cast(collision.globalIndex())); const auto cascs = myCascs.sliceBy(perCollisionCascs, static_cast(collision.globalIndex())); const auto bc = collision.bc_as(); - const std::string irSource = evaluateIrSource(ccdb, ccdbPathGrpLhcIf, bc.timestamp()); + if (isFirstCollision) { + irSource = evaluateIrSource(ccdb, ccdbPathGrpLhcIf, bc.timestamp()); + } + isFirstCollision = false; const int runnumber = bc.runNumber(); const auto hadronicRate = !irSource.empty() ? mRateFetcher.fetch(ccdb.service, bc.timestamp(), runnumber, irSource) * OneToKilo : 0.; const int bcGlobalIndex = bc.globalIndex(); @@ -637,6 +643,7 @@ struct TreeWriterTpcTof { Configurable checkZdc{"checkZdc", false, "set ZDC flag for PbPb"}; Configurable treatLimitedAcceptanceAsBad{"treatLimitedAcceptanceAsBad", false, "reject all events where the detectors relevant for the specified Runlist are flagged as LimitedAcceptance"}; Configurable requireGoodRct{"requireGoodRct", false, "require good detector flag in run condtion table"}; + // Configurable for the path of CCDB General Run Parameters LHC Interface information Configurable ccdbPathGrpLhcIf{"ccdbPathGrpLhcIf", "GLO/Config/GRPLHCIF", "Path on the CCDB for the GRPLHCIF object"}; struct TofTrack { @@ -804,6 +811,8 @@ struct TreeWriterTpcTof { labelTrack2TrackQA.at(trackId) = trackQA.globalIndex(); } } + std::string irSource{}; + bool isFirstCollision{true}; for (const auto& collision : collisions) { const auto tracks = myTracks.sliceBy(perCollisionTracksType, collision.globalIndex()); if (!isEventSelected(collision, applyEvSel)) { @@ -823,7 +832,10 @@ struct TreeWriterTpcTof { } const auto bc = collision.bc_as(); - const std::string irSource = evaluateIrSource(ccdb, ccdbPathGrpLhcIf, bc.timestamp()); + if (isFirstCollision) { + irSource = evaluateIrSource(ccdb, ccdbPathGrpLhcIf, bc.timestamp()); + } + isFirstCollision = false; const int runnumber = bc.runNumber(); const auto hadronicRate = !irSource.empty() ? mRateFetcher.fetch(ccdb.service, bc.timestamp(), runnumber, irSource) * OneToKilo : 0.; const int bcGlobalIndex = bc.globalIndex(); From b72b72b49fed4f70d08fe09bc045b3351aaa3cfa Mon Sep 17 00:00:00 2001 From: Oleksii Lubynets Date: Fri, 19 Jun 2026 11:56:42 +0200 Subject: [PATCH 3/3] fix nclPID definition --- DPG/Tasks/TPC/tpcSkimsTableCreator.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DPG/Tasks/TPC/tpcSkimsTableCreator.cxx b/DPG/Tasks/TPC/tpcSkimsTableCreator.cxx index b46b3a220c0..4c49acf1652 100644 --- a/DPG/Tasks/TPC/tpcSkimsTableCreator.cxx +++ b/DPG/Tasks/TPC/tpcSkimsTableCreator.cxx @@ -264,7 +264,7 @@ struct TreeWriterTpcV0 { void fillSkimmedV0Table(V0Casc const& v0casc, T const& track, aod::TracksQA const& trackQA, const bool existTrkQA, C const& collision, const float nSigmaTPC, const float nSigmaTOF, const float nSigmaITS, const float dEdxExp, const o2::track::PID::ID id, const int runnumber, const double dwnSmplFactor, const float hadronicRate, const int bcGlobalIndex, const int bcTimeFrameId, const int bcBcInTimeFrame, const OccupancyValues& occValues, const bool isGoodRctEvent) { const double ncl = track.tpcNClsFound(); - const double nclPID = track.tpcNClsFindableMinusPID(); + const double nclPID = track.tpcNClsPID(); const double p = track.tpcInnerParam(); const double mass = o2::track::pid_constants::sMasses[id]; const double bg = p / mass; @@ -706,7 +706,7 @@ struct TreeWriterTpcTof { void fillSkimmedTpcTofTable(T const& track, aod::TracksQA const& trackQA, const bool existTrkQA, C const& collision, const float nSigmaTPC, const float nSigmaTOF, const float nSigmaITS, const float dEdxExp, const o2::track::PID::ID id, const int runnumber, const double dwnSmplFactor, const double hadronicRate, const int bcGlobalIndex, const int bcTimeFrameId, const int bcBcInTimeFrame, const OccupancyValues& occValues, const bool isGoodRctEvent) { const double ncl = track.tpcNClsFound(); - const double nclPID = track.tpcNClsFindableMinusPID(); + const double nclPID = track.tpcNClsPID(); const double p = track.tpcInnerParam(); const double mass = o2::track::pid_constants::sMasses[id]; const double bg = p / mass;