diff --git a/Tools/PIDML/pidMl.h b/Tools/PIDML/pidMl.h index cb45360052c..5a303c956d4 100644 --- a/Tools/PIDML/pidMl.h +++ b/Tools/PIDML/pidMl.h @@ -17,11 +17,14 @@ #ifndef TOOLS_PIDML_PIDML_H_ #define TOOLS_PIDML_PIDML_H_ +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/PIDResponseTOF.h" #include "Common/DataModel/PIDResponseTPC.h" #include "Common/DataModel/TrackSelectionTables.h" +#include #include #include @@ -48,8 +51,22 @@ DECLARE_SOA_COLUMN(TofExpSignalDiffKa, tofExpSignalDiffKa, float); //! Differenc DECLARE_SOA_COLUMN(TpcExpSignalDiffKa, tpcExpSignalDiffKa, float); //! Difference between signal and expected for kaon DECLARE_SOA_COLUMN(TofExpSignalDiffPr, tofExpSignalDiffPr, float); //! Difference between signal and expected for proton DECLARE_SOA_COLUMN(TpcExpSignalDiffPr, tpcExpSignalDiffPr, float); //! Difference between signal and expected for proton +DECLARE_SOA_COLUMN(TpcNClsFound, tpcNClsFound, int16_t); //! Number of found TPC clusters +DECLARE_SOA_COLUMN(TpcNClsPID, tpcNClsPID, int16_t); //! Number of TPC clusters used for PID + +// event selection flags +DECLARE_SOA_COLUMN(EvSelNoSameBunchPileup, evSelNoSameBunchPileup, bool); +DECLARE_SOA_COLUMN(EvSelIsGoodZvtxFT0vsPV, evSelIsGoodZvtxFT0vsPV, bool); +DECLARE_SOA_COLUMN(EvSelIsGoodITSLayersAll, evSelIsGoodITSLayersAll, bool); +DECLARE_SOA_COLUMN(EvSelNoCollInRofStandard, evSelNoCollInRofStandard, bool); +DECLARE_SOA_COLUMN(EvSelNoHighMultCollInPrevRof, evSelNoHighMultCollInPrevRof, bool); +DECLARE_SOA_COLUMN(EvSelIsVertexITSTPC, evSelIsVertexITSTPC, bool); +DECLARE_SOA_COLUMN(EvSelNoCollInTimeRangeStandard, evSelNoCollInTimeRangeStandard, bool); +DECLARE_SOA_COLUMN(EvSelNoITSROFrameBorder, evSelNoITSROFrameBorder, bool); +DECLARE_SOA_COLUMN(EvSelNoTimeFrameBorder, evSelNoTimeFrameBorder, bool); } // namespace pidtracks DECLARE_SOA_TABLE(PidTracksDataMl, "AOD", "PIDTRACKSDATAML", //! Data tracks for prediction and domain adaptation + aod::track::CollisionId, aod::track::TPCSignal, aod::track::TRDSignal, aod::track::TRDPattern, aod::pidtofsignal::TOFSignal, @@ -69,12 +86,22 @@ DECLARE_SOA_TABLE(PidTracksDataMl, "AOD", "PIDTRACKSDATAML", //! Data tracks for aod::track::DcaXY, aod::track::DcaZ); DECLARE_SOA_TABLE(PidTracksData, "AOD", "PIDTRACKSDATA", //! Data tracks for comparative analysis + aod::track::CollisionId, aod::mult::MultFV0A, aod::mult::MultFV0C, pidtracks::MultFV0M, aod::mult::MultFT0A, aod::mult::MultFT0C, pidtracks::MultFT0M, - aod::mult::MultZNA, aod::mult::MultZNC, - aod::mult::MultTracklets, aod::mult::MultTPC, - aod::track::TPCSignal, - aod::track::TRDSignal, aod::track::TRDPattern, + aod::mult::MultZNA, aod::mult::MultZNC, aod::mult::MultTracklets, + aod::mult::MultTPC, aod::mult::MultNTracksPV, + aod::collision::PosZ, aod::evsel::OccupancyMedianTime, aod::cent::CentFT0C, + pidtracks::EvSelNoSameBunchPileup, + pidtracks::EvSelIsGoodZvtxFT0vsPV, + pidtracks::EvSelIsGoodITSLayersAll, + pidtracks::EvSelNoCollInRofStandard, + pidtracks::EvSelNoHighMultCollInPrevRof, + pidtracks::EvSelIsVertexITSTPC, + pidtracks::EvSelNoCollInTimeRangeStandard, + pidtracks::EvSelNoITSROFrameBorder, + pidtracks::EvSelNoTimeFrameBorder, + aod::track::TPCSignal, aod::track::TRDSignal, aod::track::TRDPattern, aod::track::TrackEtaEMCAL, aod::track::TrackPhiEMCAL, aod::pidtofsignal::TOFSignal, @@ -122,8 +149,25 @@ DECLARE_SOA_TABLE(PidTracksData, "AOD", "PIDTRACKSDATA", //! Data tracks for com pidtracks::TpcExpSignalDiffPr, pidtof::TOFNSigmaPr, pidtof::TOFExpSigmaPr, - pidtracks::TofExpSignalDiffPr); + pidtracks::TofExpSignalDiffPr, + aod::track::Snp, + aod::track::Tgl, + aod::track::SigmaY, + aod::track::SigmaZ, + aod::track::SigmaSnp, + aod::track::SigmaTgl, + aod::track::Sigma1Pt, + aod::track::TPCNClsFindable, + pidtracks::TpcNClsFound, + pidtracks::TpcNClsPID, + aod::track::TPCChi2NCl, + aod::track::TrackTime, + aod::track::Length, + aod::track::TOFChi2, + aod::track::ITSClusterMap, + aod::track::TRDChi2); DECLARE_SOA_TABLE(PidTracksMcMl, "AOD", "PIDTRACKSMCML", //! MC tracks for training + aod::track::CollisionId, aod::track::TPCSignal, aod::track::TRDSignal, aod::track::TRDPattern, aod::pidtofsignal::TOFSignal, @@ -145,12 +189,22 @@ DECLARE_SOA_TABLE(PidTracksMcMl, "AOD", "PIDTRACKSMCML", //! MC tracks for train aod::mcparticle::PdgCode, pidtracks::IsPhysicalPrimary); DECLARE_SOA_TABLE(PidTracksMc, "AOD", "PIDTRACKSMC", //! MC tracks for comparative analysis + aod::track::CollisionId, aod::mult::MultFV0A, aod::mult::MultFV0C, pidtracks::MultFV0M, aod::mult::MultFT0A, aod::mult::MultFT0C, pidtracks::MultFT0M, - aod::mult::MultZNA, aod::mult::MultZNC, - aod::mult::MultTracklets, aod::mult::MultTPC, - aod::track::TPCSignal, - aod::track::TRDSignal, aod::track::TRDPattern, + aod::mult::MultZNA, aod::mult::MultZNC, aod::mult::MultTracklets, + aod::mult::MultTPC, aod::mult::MultNTracksPV, + aod::collision::PosZ, aod::evsel::OccupancyMedianTime, aod::cent::CentFT0C, + pidtracks::EvSelNoSameBunchPileup, + pidtracks::EvSelIsGoodZvtxFT0vsPV, + pidtracks::EvSelIsGoodITSLayersAll, + pidtracks::EvSelNoCollInRofStandard, + pidtracks::EvSelNoHighMultCollInPrevRof, + pidtracks::EvSelIsVertexITSTPC, + pidtracks::EvSelNoCollInTimeRangeStandard, + pidtracks::EvSelNoITSROFrameBorder, + pidtracks::EvSelNoTimeFrameBorder, + aod::track::TPCSignal, aod::track::TRDSignal, aod::track::TRDPattern, aod::track::TrackEtaEMCAL, aod::track::TrackPhiEMCAL, aod::pidtofsignal::TOFSignal, @@ -199,6 +253,22 @@ DECLARE_SOA_TABLE(PidTracksMc, "AOD", "PIDTRACKSMC", //! MC tracks for comparati pidtof::TOFNSigmaPr, pidtof::TOFExpSigmaPr, pidtracks::TofExpSignalDiffPr, + aod::track::Snp, + aod::track::Tgl, + aod::track::SigmaY, + aod::track::SigmaZ, + aod::track::SigmaSnp, + aod::track::SigmaTgl, + aod::track::Sigma1Pt, + aod::track::TPCNClsFindable, + pidtracks::TpcNClsFound, + pidtracks::TpcNClsPID, + aod::track::TPCChi2NCl, + aod::track::TrackTime, + aod::track::Length, + aod::track::TOFChi2, + aod::track::ITSClusterMap, + aod::track::TRDChi2, aod::mcparticle::PdgCode, pidtracks::IsPhysicalPrimary); } // namespace o2::aod diff --git a/Tools/PIDML/pidMlProducer.cxx b/Tools/PIDML/pidMlProducer.cxx index 332a2a8209b..2d2968973a4 100644 --- a/Tools/PIDML/pidMlProducer.cxx +++ b/Tools/PIDML/pidMlProducer.cxx @@ -15,13 +15,15 @@ /// \author Maja Kabus /// \author Marek Mytkowski -#include "Tools/PIDML/pidMl.h" -#include "Tools/PIDML/pidUtils.h" -// +#include "Common/CCDB/EventSelectionParams.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/PIDResponseTOF.h" #include "Common/DataModel/PIDResponseTPC.h" #include "Common/DataModel/TrackSelectionTables.h" +#include "Tools/PIDML/pidMl.h" +#include "Tools/PIDML/pidUtils.h" #include #include @@ -41,6 +43,7 @@ #include #include #include +#include #include using namespace o2; @@ -58,18 +61,49 @@ struct PidMlProducer { Produces pidTracksTableMCML; Produces pidTracksTableMC; + // Basic event selection: sel8() + (zVertex < zVertexMax) + (centMin <= FT0C <= centMax) + struct : o2::framework::ConfigurableGroup { + std::string prefix = "confBasicEventSelection"; + + Configurable enableSel8{"enableSel8", true, "enable sel8 cut."}; + Configurable zVertexMax{"zVertexMax", 10., "Maximum Z Vertex value cm."}; + Configurable centMin{"centMin", 0.f, "Minimum centrality (FT0C)."}; + Configurable centMax{"centMax", 200.f, "Maximum centrality (FT0C)."}; + } confBasicEventSelection; + + // Strict event selection: criteria boolean flags (see their details) + TPC occupancy + struct : o2::framework::ConfigurableGroup { + std::string prefix = "confStrictEventSelection"; + Configurable enable{"enable", false, "Enable stricter event selection filtering"}; + + struct : o2::framework::ConfigurableGroup { + std::string prefix = "confStrictEventSelection.criteria"; + Configurable evIsGoodZvtxFT0vsPV{"evIsGoodZvtxFT0vsPV", true, "Require kIsGoodZvtxFT0vsPV selection on events"}; + Configurable evNoSameBunchPileup{"evNoSameBunchPileup", true, "Require kNoSameBunchPileup selection on events"}; + Configurable evIsVertexITSTPC{"evIsVertexITSTPC", true, "Require kIsVertexITSTPC selection on events"}; + Configurable isGoodITSLayersAll{"isGoodITSLayersAll", true, "Require kIsGoodITSLayersAll selection on events"}; + Configurable noITSROFrameBorder{"noITSROFrameBorder", true, "Require kNoITSROFrameBorder selection on events"}; + Configurable noTimeFrameBorder{"noTimeFrameBorder", true, "Require kNoTimeFrameBorder selection on events"}; + Configurable noCollInRofStandard{"noCollInRofStandard", true, "Require kNoCollInRofStandard selection on events"}; + Configurable noHighMultCollInPrevRof{"noHighMultCollInPrevRof", true, "Require kNoHighMultCollInPrevRof selection on events"}; + Configurable noCollInTimeRangeStandard{"noCollInTimeRangeStandard", true, "Require kNoCollInTimeRangeStandard selection on events"}; + Configurable tpcOccupancyMin{"tpcOccupancyMin", 0, "Minimum value for TPC occupancy selection"}; + Configurable tpcOccupancyMax{"tpcOccupancyMax", 500, "Maximum value for TPC occupancy selection"}; + } criteria; + } confStrictEventSelection; + Filter trackFilter = requireGlobalTrackInFilter(); // Data tracks - using BigTracksDataML = soa::Filtered>; - using BigTracksData = soa::Filtered>; + using BigTracksDataML = soa::Filtered>; + using BigTracksData = soa::Filtered>; // MC tracks - using BigTracksMCML = soa::Filtered>; - using BigTracksMC = soa::Filtered>; + using BigTracksMCML = soa::Filtered>; + using BigTracksMC = soa::Filtered>; - using MyCollisionML = aod::Collisions::iterator; - using MyCollision = soa::Join::iterator; + using MyCollisionML = soa::Join::iterator; + using MyCollision = soa::Join::iterator; static constexpr uint32_t NCharges = 2; @@ -230,10 +264,64 @@ struct PidMlProducer { return trdMissing(track) ? static_cast(0U) : track.trdPattern(); } - void processDataML(MyCollisionML const& /*collision*/, BigTracksDataML const& tracks) + // inspired by PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx + template + bool fillCollisionsCentRun3(CollisionType const& col) + { + // Basic Event Selection + { + const auto& basic_criteria = confBasicEventSelection; + + // Z Vertex filter + if (std::abs(col.posZ()) > basic_criteria.zVertexMax.value) + return false; + + // Selection 8 filters + if (basic_criteria.enableSel8.value && !col.sel8()) + return false; + + // Centrality filter + const auto cent = col.centFT0C(); + if ((cent < basic_criteria.centMin.value) || (cent > basic_criteria.centMax.value)) + return false; + } + + // Strict Event Selection + { + if (!confStrictEventSelection.enable) + return true; + + const auto& criteria = confStrictEventSelection.criteria; + + // TPC Occupancy filter + const auto occupancy = col.trackOccupancyInTimeRange(); + if (occupancy < criteria.tpcOccupancyMin.value || occupancy > criteria.tpcOccupancyMax.value) + return false; + + // Event Selection boolean filters + if ((!criteria.evNoSameBunchPileup.value || col.selection_bit(aod::evsel::kNoSameBunchPileup)) && + (!criteria.evIsGoodZvtxFT0vsPV.value || col.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) && + (!criteria.isGoodITSLayersAll.value || col.selection_bit(aod::evsel::kIsGoodITSLayersAll)) && + (!criteria.noCollInRofStandard.value || col.selection_bit(aod::evsel::kNoCollInRofStandard)) && + (!criteria.noHighMultCollInPrevRof.value || col.selection_bit(aod::evsel::kNoHighMultCollInPrevRof)) && + (!criteria.evIsVertexITSTPC.value || col.selection_bit(aod::evsel::kIsVertexITSTPC)) && + (!criteria.noCollInTimeRangeStandard.value || col.selection_bit(aod::evsel::kNoCollInTimeRangeStandard)) && + (!criteria.noITSROFrameBorder.value || col.selection_bit(aod::evsel::kNoITSROFrameBorder)) && + (!criteria.noTimeFrameBorder.value || col.selection_bit(aod::evsel::kNoTimeFrameBorder))) + return true; + + return false; + } + } + + void processDataML(MyCollisionML const& collision, BigTracksDataML const& tracks) { + if (!fillCollisionsCentRun3(collision)) { + return; + } + for (const auto& track : tracks) { - pidTracksTableDataML(track.tpcSignal(), getTRDSignal(track), getTRDPattern(track), + pidTracksTableDataML(track.collisionId(), track.tpcSignal(), getTRDSignal(track), getTRDPattern(track), getTOFSignal(track), getTOFBeta(track), track.p(), track.pt(), track.px(), track.py(), track.pz(), track.sign(), @@ -250,11 +338,25 @@ struct PidMlProducer { void processDataAll(MyCollision const& collision, BigTracksData const& tracks) { + if (!fillCollisionsCentRun3(collision)) { + return; + } + for (const auto& track : tracks) { - pidTracksTableData(collision.multFV0A(), collision.multFV0C(), collision.multFV0M(), + pidTracksTableData(track.collisionId(), collision.multFV0A(), collision.multFV0C(), collision.multFV0M(), collision.multFT0A(), collision.multFT0C(), collision.multFT0M(), - collision.multZNA(), collision.multZNC(), - collision.multTracklets(), collision.multTPC(), + collision.multZNA(), collision.multZNC(), collision.multTracklets(), + collision.multTPC(), collision.multNTracksPV(), + collision.posZ(), collision.trackOccupancyInTimeRange(), collision.centFT0C(), + collision.selection_bit(aod::evsel::kNoSameBunchPileup), + collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV), + collision.selection_bit(aod::evsel::kIsGoodITSLayersAll), + collision.selection_bit(aod::evsel::kNoCollInRofStandard), + collision.selection_bit(aod::evsel::kNoHighMultCollInPrevRof), + collision.selection_bit(aod::evsel::kIsVertexITSTPC), + collision.selection_bit(aod::evsel::kNoCollInTimeRangeStandard), + collision.selection_bit(aod::evsel::kNoITSROFrameBorder), + collision.selection_bit(aod::evsel::kNoTimeFrameBorder), track.tpcSignal(), getTRDSignal(track), getTRDPattern(track), track.trackEtaEmcal(), track.trackPhiEmcal(), getTOFSignal(track), getTOFBeta(track), @@ -274,15 +376,23 @@ struct PidMlProducer { track.tpcNSigmaKa(), track.tpcExpSigmaKa(), track.tpcExpSignalDiffKa(), track.tofNSigmaKa(), track.tofExpSigmaKa(), track.tofExpSignalDiffKa(), track.tpcNSigmaPr(), track.tpcExpSigmaPr(), track.tpcExpSignalDiffPr(), - track.tofNSigmaPr(), track.tofExpSigmaPr(), track.tofExpSignalDiffPr()); + track.tofNSigmaPr(), track.tofExpSigmaPr(), track.tofExpSignalDiffPr(), + track.snp(), track.tgl(), track.sigmaY(), track.sigmaZ(), track.sigmaSnp(), + track.sigmaTgl(), track.sigma1Pt(), track.tpcNClsFindable(), track.tpcNClsFound(), + track.tpcNClsPID(), track.tpcChi2NCl(), track.trackTime(), track.length(), + track.tofChi2(), track.itsClusterMap(), track.trdChi2()); fillHist(track); } } PROCESS_SWITCH(PidMlProducer, processDataAll, "Produce all real data", false); - void processMcMl(MyCollisionML const& /*collision*/, BigTracksMCML const& tracks, aod::McParticles const& /*mctracks*/) + void processMcMl(MyCollisionML const& collision, BigTracksMCML const& tracks, aod::McParticles const& /*mctracks*/) { + if (!fillCollisionsCentRun3(collision)) { + return; + } + for (const auto& track : tracks) { if (!track.has_mcParticle()) { continue; @@ -290,7 +400,7 @@ struct PidMlProducer { const auto mcParticle = track.mcParticle_as(); uint8_t isPrimary = static_cast(mcParticle.isPhysicalPrimary()); uint32_t pdgCode = mcParticle.pdgCode(); - pidTracksTableMCML(track.tpcSignal(), getTRDSignal(track), getTRDPattern(track), + pidTracksTableMCML(track.collisionId(), track.tpcSignal(), getTRDSignal(track), getTRDPattern(track), getTOFSignal(track), getTOFBeta(track), track.p(), track.pt(), track.px(), track.py(), track.pz(), track.sign(), @@ -309,6 +419,10 @@ struct PidMlProducer { void processMcAll(MyCollision const& collision, BigTracksMC const& tracks, aod::McParticles const& /*mctracks*/) { + if (!fillCollisionsCentRun3(collision)) { + return; + } + for (const auto& track : tracks) { if (!track.has_mcParticle()) { continue; @@ -316,10 +430,20 @@ struct PidMlProducer { const auto mcParticle = track.mcParticle_as(); uint8_t isPrimary = static_cast(mcParticle.isPhysicalPrimary()); uint32_t pdgCode = mcParticle.pdgCode(); - pidTracksTableMC(collision.multFV0A(), collision.multFV0C(), collision.multFV0M(), + pidTracksTableMC(track.collisionId(), collision.multFV0A(), collision.multFV0C(), collision.multFV0M(), collision.multFT0A(), collision.multFT0C(), collision.multFT0M(), - collision.multZNA(), collision.multZNC(), - collision.multTracklets(), collision.multTPC(), + collision.multZNA(), collision.multZNC(), collision.multTracklets(), + collision.multTPC(), collision.multNTracksPV(), + collision.posZ(), collision.trackOccupancyInTimeRange(), collision.centFT0C(), + collision.selection_bit(aod::evsel::kNoSameBunchPileup), + collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV), + collision.selection_bit(aod::evsel::kIsGoodITSLayersAll), + collision.selection_bit(aod::evsel::kNoCollInRofStandard), + collision.selection_bit(aod::evsel::kNoHighMultCollInPrevRof), + collision.selection_bit(aod::evsel::kIsVertexITSTPC), + collision.selection_bit(aod::evsel::kNoCollInTimeRangeStandard), + collision.selection_bit(aod::evsel::kNoITSROFrameBorder), + collision.selection_bit(aod::evsel::kNoTimeFrameBorder), track.tpcSignal(), getTRDSignal(track), getTRDPattern(track), track.trackEtaEmcal(), track.trackPhiEmcal(), getTOFSignal(track), getTOFBeta(track), @@ -340,6 +464,10 @@ struct PidMlProducer { track.tofNSigmaKa(), track.tofExpSigmaKa(), track.tofExpSignalDiffKa(), track.tpcNSigmaPr(), track.tpcExpSigmaPr(), track.tpcExpSignalDiffPr(), track.tofNSigmaPr(), track.tofExpSigmaPr(), track.tofExpSignalDiffPr(), + track.snp(), track.tgl(), track.sigmaY(), track.sigmaZ(), track.sigmaSnp(), + track.sigmaTgl(), track.sigma1Pt(), track.tpcNClsFindable(), track.tpcNClsFound(), + track.tpcNClsPID(), track.tpcChi2NCl(), track.trackTime(), track.length(), + track.tofChi2(), track.itsClusterMap(), track.trdChi2(), pdgCode, isPrimary);