From 266ced85f81bec49f9aff3a8886bfdbbb63cea43 Mon Sep 17 00:00:00 2001 From: Anton Riedel Date: Wed, 1 Oct 2025 20:16:00 +0200 Subject: [PATCH 1/2] Feat: framework update --- PWGCF/Femto/Core/baseSelection.h | 6 +- PWGCF/Femto/Core/cascadeBuilder.h | 2 +- PWGCF/Femto/Core/closePairRejection.h | 21 +-- PWGCF/Femto/Core/collisionBuilder.h | 106 +++++++++---- PWGCF/Femto/Core/collisionHistManager.h | 92 +++++++---- PWGCF/Femto/Core/femtoUtils.h | 4 +- PWGCF/Femto/Core/kinkBuilder.h | 2 +- PWGCF/Femto/Core/pairBuilder.h | 70 ++++----- PWGCF/Femto/Core/pairHistManager.h | 9 +- PWGCF/Femto/Core/pairProcessHelpers.h | 12 +- PWGCF/Femto/Core/partitions.h | 125 +++++++-------- PWGCF/Femto/Core/trackBuilder.h | 87 ++++++++++- PWGCF/Femto/Core/trackHistManager.h | 4 +- PWGCF/Femto/Core/twoTrackResonanceBuilder.h | 33 ++-- PWGCF/Femto/Core/v0Builder.h | 106 ++++++++++++- PWGCF/Femto/DataModel/FemtoTables.h | 88 ++++++----- PWGCF/Femto/TableProducer/CMakeLists.txt | 5 + PWGCF/Femto/TableProducer/femtoProducer.cxx | 4 +- .../femtoProducerDerivedToDerived.cxx | 146 ++++++++++++++++++ PWGCF/Femto/Tasks/femtoCascadeQa.cxx | 13 +- PWGCF/Femto/Tasks/femtoKinkQa.cxx | 6 +- PWGCF/Femto/Tasks/femtoPairTrackCascade.cxx | 6 +- PWGCF/Femto/Tasks/femtoPairTrackKink.cxx | 4 +- PWGCF/Femto/Tasks/femtoPairTrackTrack.cxx | 2 +- .../Tasks/femtoPairTrackTwoTrackResonance.cxx | 8 +- PWGCF/Femto/Tasks/femtoPairTrackV0.cxx | 6 +- PWGCF/Femto/Tasks/femtoTrackQa.cxx | 11 +- .../Femto/Tasks/femtoTwotrackresonanceQa.cxx | 17 +- PWGCF/Femto/Tasks/femtoV0Qa.cxx | 27 ++-- 29 files changed, 718 insertions(+), 304 deletions(-) create mode 100644 PWGCF/Femto/TableProducer/femtoProducerDerivedToDerived.cxx diff --git a/PWGCF/Femto/Core/baseSelection.h b/PWGCF/Femto/Core/baseSelection.h index 2be9737422d..c2280dc21eb 100644 --- a/PWGCF/Femto/Core/baseSelection.h +++ b/PWGCF/Femto/Core/baseSelection.h @@ -279,12 +279,12 @@ class BaseSelection line << std::setw(bitWidth) << "-> loosest minimal selection, no bit saved"; } else { const uint64_t bitmask = uint64_t{1} << globalBitIndex++; - line << std::setw(bitWidth) << ("-> bitmask: " + std::to_string(bitmask)); + std::stringstream hexStream; + hexStream << "-> bitmask: 0x" << std::uppercase << std::hex << bitmask; + line << std::setw(bitWidth) << hexStream.str(); } - LOG(info) << line.str(); } - LOG(info) << ""; // blank line between observables } LOG(info) << "Printing done"; diff --git a/PWGCF/Femto/Core/cascadeBuilder.h b/PWGCF/Femto/Core/cascadeBuilder.h index 5f43ecf6ab9..6a3a6722879 100644 --- a/PWGCF/Femto/Core/cascadeBuilder.h +++ b/PWGCF/Femto/Core/cascadeBuilder.h @@ -101,7 +101,7 @@ struct ConfOmegaBits : o2::framework::ConfigurableGroup { o2::framework::Configurable phiMax{"phiMax", 1.f * o2::constants::math::TwoPI, "Maximum phi"}; \ o2::framework::Configurable massMin{"massMin", defaultMassMin, "Minimum invariant mass for Cascade"}; \ o2::framework::Configurable massMax{"massMax", defaultMassMax, "Maximum invariant mass for Cascade"}; \ - o2::framework::Configurable mask{"mask", 0, "Bitmask for cascade selection"}; + o2::framework::Configurable mask{"mask", 0x0, "Bitmask for cascade selection"}; struct ConfXiSelection : o2::framework::ConfigurableGroup { std::string prefix = std::string("XiSelection"); diff --git a/PWGCF/Femto/Core/closePairRejection.h b/PWGCF/Femto/Core/closePairRejection.h index 3c21f953ad1..791d07deead 100644 --- a/PWGCF/Femto/Core/closePairRejection.h +++ b/PWGCF/Femto/Core/closePairRejection.h @@ -109,20 +109,13 @@ class CloseTrackRejection CloseTrackRejection() = default; virtual ~CloseTrackRejection() = default; - void init(o2::framework::HistogramRegistry* registry, std::map>& specs, float detaMax, float dphistarMax, int chargeTrack1, int chargeTrack2) + void init(o2::framework::HistogramRegistry* registry, std::map>& specs, float detaMax, float dphistarMax, int chargeAbsTrack1, int chargeAbsTrack2) { mDetaMax = detaMax; mDphistarMax = dphistarMax; - if (mDetaMax < o2::constants::math::Epsilon || mDphistarMax < o2::constants::math::Epsilon) { - LOG(fatal) << "Either DetaMax or DphistarMax are 0 or negative. Either turn off CPR or specify reasonable values. Breaking ..."; - } - mChargeTrack1 = chargeTrack1; - mChargeTrack2 = chargeTrack2; - - if (utils::sign(mChargeTrack1) != utils::sign(mChargeTrack2)) { - LOG(warn) << "CPR is turned on for tracks with opposite charge. Is this intended?"; - } + mChargeAbsTrack1 = chargeAbsTrack1; + mChargeAbsTrack2 = chargeAbsTrack2; mHistogramRegistry = registry; @@ -150,8 +143,8 @@ class CloseTrackRejection mDeta = track1.eta() - track2.eta(); for (size_t i = 0; i < kTpcRadius.size(); i++) { - auto phistar1 = utils::dphistar(mMagField, kTpcRadius[i], mChargeTrack1, track1.pt(), track1.phi()); - auto phistar2 = utils::dphistar(mMagField, kTpcRadius[i], mChargeTrack2, track2.pt(), track2.phi()); + auto phistar1 = utils::dphistar(mMagField, kTpcRadius[i], mChargeAbsTrack1 * track1.signedPt(), track1.phi()); + auto phistar2 = utils::dphistar(mMagField, kTpcRadius[i], mChargeAbsTrack2 * track2.signedPt(), track2.phi()); if (phistar1 && phistar2) { // if the calculation for one phistar fails, keep the default value, which is 0 // this makes it more likelier for the pair to be rejected sind the averave will be biased towards lower values @@ -184,8 +177,8 @@ class CloseTrackRejection } private: - int mChargeTrack1 = 0; - int mChargeTrack2 = 0; + int mChargeAbsTrack1 = 0; + int mChargeAbsTrack2 = 0; float mMagField = 0.f; float mAverageDphistar = 0.f; float mDeta = 0.f; diff --git a/PWGCF/Femto/Core/collisionBuilder.h b/PWGCF/Femto/Core/collisionBuilder.h index 091dc6ec237..adcfd40b5ee 100644 --- a/PWGCF/Femto/Core/collisionBuilder.h +++ b/PWGCF/Femto/Core/collisionBuilder.h @@ -45,13 +45,13 @@ struct ConfCollisionFilters : o2::framework::ConfigurableGroup { o2::framework::Configurable vtxZMin{"vtxZMin", -10.f, "Minimum vertex Z position (cm)"}; o2::framework::Configurable vtxZMax{"vtxZMax", 10.f, "Maximum vertex Z position (cm)"}; o2::framework::Configurable multMin{"multMin", 0.f, "Minimum multiplicity"}; - o2::framework::Configurable multMax{"multMax", 999.f, "Maximum multiplicity"}; + o2::framework::Configurable multMax{"multMax", 5000.f, "Maximum multiplicity"}; o2::framework::Configurable centMin{"centMin", 0.f, "Minimum centrality (multiplicity percentile)"}; - o2::framework::Configurable centMax{"centMax", 999.f, "Maximum centrality (multiplicity percentile)"}; - o2::framework::Configurable spherMin{"spherMin", 0.f, "Minimum centrality (multiplicity percentile)"}; - o2::framework::Configurable spherMax{"spherMax", 2.f, "Maximum centrality (multiplicity percentile)"}; - o2::framework::Configurable magFieldMin{"magFieldMin", -1.f, "Minimum magnetic field strength (T)"}; - o2::framework::Configurable magFieldMax{"magFieldMax", 1.f, "Maximum magnetic field strength (T)"}; + o2::framework::Configurable centMax{"centMax", 100.f, "Maximum centrality (multiplicity percentile)"}; + o2::framework::Configurable sphericityMin{"sphericityMin", 0.f, "Minimum sphericity"}; + o2::framework::Configurable sphericityMax{"sphericityMax", 1.f, "Maximum sphericity"}; + o2::framework::Configurable magFieldMin{"magFieldMin", -5, "Minimum magnetic field strength (kG)"}; + o2::framework::Configurable magFieldMax{"magFieldMax", 5, "Maximum magnetic field strength (kG)"}; }; struct ConfCollisionBits : o2::framework::ConfigurableGroup { @@ -71,6 +71,8 @@ struct ConfCollisionBits : o2::framework::ConfigurableGroup { o2::framework::Configurable isGoodItsLayersAll{"isGoodItsLayersAll", 0, "numbers of inactive chips on all ITS layers are below maximum allowed values (-1: stored in bitmaks; 0 off; 1 on)"}; o2::framework::Configurable> occupancyMin{"occupancyMin", {}, "Minimum occpancy"}; o2::framework::Configurable> occupancyMax{"occupancyMax", {}, "Maximum occpancy"}; + o2::framework::Configurable> sphericityMin{"sphericityMin", {}, "Minimum sphericity"}; + o2::framework::Configurable> sphericityMax{"sphericityMax", {}, "Maximum sphericity"}; }; struct ConfCollisionTriggers : o2::framework::ConfigurableGroup { @@ -94,14 +96,12 @@ struct ConfCollisionSelection : o2::framework::ConfigurableGroup { o2::framework::Configurable vtxZMin{"vtxZMin", -10.f, "Minimum vertex Z position (cm)"}; o2::framework::Configurable vtxZMax{"vtxZMax", 10.f, "Maximum vertex Z position (cm)"}; o2::framework::Configurable multMin{"multMin", 0.f, "Minimum multiplicity"}; - o2::framework::Configurable multMax{"multMax", 999.f, "Maximum multiplicity"}; + o2::framework::Configurable multMax{"multMax", 5000.f, "Maximum multiplicity"}; o2::framework::Configurable centMin{"centMin", 0.f, "Minimum centrality (multiplicity percentile)"}; - o2::framework::Configurable centMax{"centMax", 999.f, "Maximum centrality (multiplicity percentile)"}; - o2::framework::Configurable spherMin{"spherMin", 0.f, "Minimum centrality (multiplicity percentile)"}; - o2::framework::Configurable spherMax{"spherMax", 2.f, "Maximum centrality (multiplicity percentile)"}; - o2::framework::Configurable magFieldMin{"magFieldMin", -1.f, "Minimum magnetic field strength (T)"}; - o2::framework::Configurable magFieldMax{"magFieldMax", 1.f, "Maximum magnetic field strength (T)"}; - o2::framework::Configurable collisionMask{"collisionMask", 0, "Bitmask for collision"}; + o2::framework::Configurable centMax{"centMax", 100.f, "Maximum centrality (multiplicity percentile)"}; + o2::framework::Configurable magFieldMin{"magFieldMin", -5, "Minimum magnetic field strength (kG)"}; + o2::framework::Configurable magFieldMax{"magFieldMax", 5, "Maximum magnetic field strength (kG)"}; + o2::framework::Configurable collisionMask{"collisionMask", 0x0, "Bitmask for collision"}; }; /// enum for all collision selections @@ -122,6 +122,8 @@ enum CollisionSels { kIsGoodItsLayersAll, ///< numbers of inactive chips on all ITS layers are below maximum allowed values kOccupancyMin, ///< Min. occupancy kOccupancyMax, ///< Max. occupancy + kSphericityMin, ///< Min. sphericity + kSphericityMax, ///< Max. sphericity kCollisionSelsMax }; @@ -142,7 +144,11 @@ const std::unordered_map colSelsToString = { {kIsGoodItsLayer0123, "Is good ITS layer 0-3"}, {kIsGoodItsLayersAll, "Is good ITS layer all"}, {kOccupancyMin, "Minimum Occupancy"}, - {kOccupancyMax, "Maximum Occupancy"}}; + {kOccupancyMax, "Maximum Occupancy"}, + {kSphericityMin, "Minimum Sphericity"}, + {kSphericityMax, "Maximum Sphericity"} + +}; class CollisionSelection : public BaseSelection { @@ -162,8 +168,8 @@ class CollisionSelection : public BaseSelectionaddSelection(config.sel8.value, kSel8); @@ -180,9 +186,11 @@ class CollisionSelection : public BaseSelectionaddSelection(config.isGoodItsLayersAll.value, kIsGoodItsLayersAll); this->addSelection(config.occupancyMin.value, kOccupancyMin, limits::kLowerLimit, true, true); this->addSelection(config.occupancyMax.value, kOccupancyMax, limits::kUpperLimit, true, true); + this->addSelection(config.sphericityMin.value, kSphericityMin, limits::kLowerLimit, true, true); + this->addSelection(config.sphericityMax.value, kSphericityMax, limits::kUpperLimit, true, true); }; - void setMagneticField(float MagField) + void setMagneticField(int MagField) { mMagField = MagField; } @@ -269,6 +277,8 @@ class CollisionSelection : public BaseSelectionevaluateObservable(kOccupancyMin, col.trackOccupancyInTimeRange()); this->evaluateObservable(kOccupancyMax, col.trackOccupancyInTimeRange()); + this->evaluateObservable(kSphericityMin, mSphericity); + this->evaluateObservable(kSphericityMax, mSphericity); this->assembleBitmask(); }; @@ -278,15 +288,15 @@ class CollisionSelection : public BaseSelection producedCollision; o2::framework::Produces producedCollisionMask; - o2::framework::Produces producedQns; o2::framework::Produces producedPositions; + o2::framework::Produces producedSphericities; o2::framework::Produces producedMultiplicityEstimators; o2::framework::Produces producedCentralityEstimators; + o2::framework::Produces producedQns; }; struct ConfCollisionTables : o2::framework::ConfigurableGroup { std::string prefix = std::string("CollisionTables"); o2::framework::Configurable produceCollisions{"produceCollisions", -1, "Produce Collisions (-1: auto; 0 off; 1 on)"}; o2::framework::Configurable produceCollisionMasks{"produceCollisionMasks", -1, "Produce Collision Masks (-1: auto; 0 off; 1 on)"}; - o2::framework::Configurable produceQns{"produceQns", -1, "Produce Qn (-1: auto; 0 off; 1 on)"}; o2::framework::Configurable producePositions{"producePositions", -1, "Produce Positions (-1: auto; 0 off; 1 on)"}; + o2::framework::Configurable produceSphericities{"produceSphericities", -1, "Produce Sphericity (-1: auto; 0 off; 1 on)"}; o2::framework::Configurable produceMults{"produceMults", -1, "Produce Multiplicities (-1: auto; 0 off; 1 on)"}; o2::framework::Configurable produceCents{"produceCents", -1, "Produce Centralities (-1: auto; 0 off; 1 on)"}; + o2::framework::Configurable produceQns{"produceQns", -1, "Produce Qn (-1: auto; 0 off; 1 on)"}; }; class CollisionBuilder @@ -334,11 +346,12 @@ class CollisionBuilder LOG(info) << "Initialize femto collision builder..."; mProducedCollisions = utils::enableTable("FCols_001", confTable.produceCollisions.value, initContext); mProducedCollisionMasks = utils::enableTable("FColMasks_001", confTable.produceCollisionMasks.value, initContext); - mProduceQns = utils::enableTable("FColQnBins_001", confTable.produceQns.value, initContext); mProducedPositions = utils::enableTable("FColPos_001", confTable.producePositions.value, initContext); + mProducedSphericities = utils::enableTable("FColSphericities_001", confTable.produceSphericities.value, initContext); mProducedMultiplicities = utils::enableTable("FColMults_001", confTable.produceMults.value, initContext); mProducedCentralities = utils::enableTable("FColCents_001", confTable.produceCents.value, initContext); - if (mProducedCollisions || mProducedCollisionMasks || mProducedPositions || mProducedMultiplicities || mProducedCentralities) { + mProduceQns = utils::enableTable("FColQnBins_001", confTable.produceQns.value, initContext); + if (mProducedCollisions || mProducedCollisionMasks || mProducedPositions || mProducedSphericities || mProducedMultiplicities || mProducedCentralities) { mFillAnyTable = true; mCollisionSelection.printSelections(colSelsName, colSelsToString); } else { @@ -348,7 +361,7 @@ class CollisionBuilder } template - void buildCollision(T1& bc, T2& col, T3& tracks, T4& ccdb, float magField) + void buildCollision(T1& bc, T2& col, T3& tracks, T4& ccdb, int magField) { if (mUseTrigger) { mZorro.initCCDB(ccdb.service, bc.runNumber(), bc.timestamp(), mTriggerNames); @@ -357,7 +370,6 @@ class CollisionBuilder mCollisionSelection.setSphericity(tracks); mCollisionSelection.setMultiplicity(col); mCollisionSelection.setCentrality(col); - mCollisionSelection.applySelections(col); } @@ -387,8 +399,7 @@ class CollisionBuilder collisionProducts.producedCollision(col.posZ(), col.multNTracksPV(), mCollisionSelection.getCentrality(), - mCollisionSelection.getSphericity(), - mCollisionSelection.getMagneticField()); + static_cast(mCollisionSelection.getMagneticField())); } if (mProducedCollisionMasks) { collisionProducts.producedCollisionMask(mCollisionSelection.getBitmask()); @@ -397,6 +408,9 @@ class CollisionBuilder collisionProducts.producedPositions(col.posX(), col.posY()); } + if (mProducedSphericities) { + collisionProducts.producedSphericities(mCollisionSelection.getSphericity()); + } if (mProducedMultiplicities) { collisionProducts.producedMultiplicityEstimators( col.multFT0A(), @@ -430,12 +444,36 @@ class CollisionBuilder bool mFillAnyTable = false; bool mProducedCollisions = false; bool mProducedCollisionMasks = false; - bool mProduceQns = false; bool mProducedPositions = false; + bool mProducedSphericities = false; bool mProducedMultiplicities = false; bool mProducedCentralities = false; + bool mProduceQns = false; }; -}; // namespace collisionbuilder -}; // namespace o2::analysis::femto + +struct CollisionBuilderDerivedToDerivedProducts : o2::framework::ProducesGroup { + o2::framework::Produces producedCollision; + o2::framework::Produces producedCollisionMask; +}; + +class CollisionBuilderDerivedToDerived +{ + public: + CollisionBuilderDerivedToDerived() = default; + virtual ~CollisionBuilderDerivedToDerived() = default; + + template + void processCollision(T1& col, T2& newCollisionTable) + { + newCollisionTable.producedCollision(col.posZ(), + col.mult(), + col.cent(), + col.magField()); + newCollisionTable.producedCollisionMask(col.collisionMask()); + } +}; + +} // namespace collisionbuilder +} // namespace o2::analysis::femto ; #endif // PWGCF_FEMTO_CORE_COLLISIONBUILDER_H_ diff --git a/PWGCF/Femto/Core/collisionHistManager.h b/PWGCF/Femto/Core/collisionHistManager.h index 35daec9fa3a..b08972c4202 100644 --- a/PWGCF/Femto/Core/collisionHistManager.h +++ b/PWGCF/Femto/Core/collisionHistManager.h @@ -39,12 +39,12 @@ enum ColHist { kMult, kCent, kMagField, - kSphericity, // qa kPosX, kPosY, kPos, kOccupancy, + kSphericity, // 2d kPoszVsMult, kPoszVsCent, @@ -62,11 +62,11 @@ constexpr std::array, kColHistLast> HistTable = { {kPosZ, o2::framework::kTH1F, "hPosZ", "Vertex Z; V_{Z} (cm); Entries"}, {kMult, o2::framework::kTH1F, "hMult", "Multiplicity; Multiplicity; Entries"}, {kCent, o2::framework::kTH1F, "hCent", "Centrality; Centrality (%); Entries"}, - {kMagField, o2::framework::kTH1F, "hMagField", "Magnetic Field; B (T); Entries"}, - {kSphericity, o2::framework::kTH1F, "hSphericity", "Sphericity; Sphericity; Entries"}, + {kMagField, o2::framework::kTH1F, "hMagField", "Magnetic Field; B (kG); Entries"}, {kPosX, o2::framework::kTH1F, "hPosX", "Vertex X; V_{X} (cm); Entries"}, {kPosY, o2::framework::kTH1F, "hPosY", "Vertex Z; V_{Y} (cm); Entries"}, {kPos, o2::framework::kTH1F, "hPos", "Primary vertex; V_{pos} (cm); Entries"}, + {kSphericity, o2::framework::kTH1F, "hSphericity", "Sphericity; Sphericity; Entries"}, {kOccupancy, o2::framework::kTH1F, "hOccupancy", "Occupancy; Occupancy; Entries"}, {kPoszVsMult, o2::framework::kTH2F, "hPoszVsMult", "Vertex Z vs Multiplicity; V_{Z} (cm); Multiplicity"}, {kPoszVsCent, o2::framework::kTH2F, "hPoszVsCent", "Vertex Z vs Centrality; V_{Z} (cm); Centrality (%)"}, @@ -75,29 +75,50 @@ constexpr std::array, kColHistLast> HistTable = { {kCentVsSphericity, o2::framework::kTH2F, "hCentVsSphericity", "Centrality vs Sphericity; Centrality (%); Sphericity"}, }}; -template -auto makeColHistSpecMap(const BinningStruct& binning) +template +auto makeColHistSpecMap(const T& confBinningAnalysis) { return std::map>{ - {kPosZ, {binning.vtZ}}, - {kMult, {binning.mult}}, - {kCent, {binning.cent}}, - {kSphericity, {binning.spher}}, - {kMagField, {binning.magField}}, - {kPoszVsMult, {binning.vtZ, binning.mult}}, - {kPoszVsCent, {binning.vtZ, binning.cent}}, - {kCentVsMult, {binning.cent, binning.mult}}, - {kMultVsSphericity, {binning.mult, binning.spher}}, - {kCentVsSphericity, {binning.cent, binning.spher}}}; + {kPosZ, {confBinningAnalysis.vtxZ}}, + {kMult, {confBinningAnalysis.mult}}, + {kCent, {confBinningAnalysis.cent}}, + {kMagField, {confBinningAnalysis.magField}}}; +} + +template +auto makeColQaHistSpecMap(const T1& confBinningAnalysis, const T2& confBinningQa) +{ + return std::map>{ + {kPosZ, {confBinningAnalysis.vtxZ}}, + {kMult, {confBinningAnalysis.mult}}, + {kCent, {confBinningAnalysis.cent}}, + {kMagField, {confBinningAnalysis.magField}}, + {kPosX, {confBinningQa.vtxXY}}, + {kPosY, {confBinningQa.vtxXY}}, + {kPos, {confBinningQa.vtx}}, + {kSphericity, {confBinningQa.sphericity}}, + {kOccupancy, {confBinningQa.occupancy}}, + {kPoszVsMult, {confBinningAnalysis.vtxZ, confBinningAnalysis.mult}}, + {kPoszVsCent, {confBinningAnalysis.vtxZ, confBinningAnalysis.cent}}, + {kCentVsMult, {confBinningAnalysis.cent, confBinningAnalysis.mult}}, + {kMultVsSphericity, {confBinningAnalysis.mult, confBinningQa.sphericity}}, + {kCentVsSphericity, {confBinningAnalysis.cent, confBinningQa.sphericity}}}; } struct ConfCollisionBinning : o2::framework::ConfigurableGroup { std::string prefix = std::string("CollisionBinning"); - o2::framework::ConfigurableAxis vtZ{"vtZ", {200, -10, 10}, "Vertex Z binning"}; + o2::framework::ConfigurableAxis vtxZ{"vtxZ", {200, -10, 10}, "Vertex Z binning"}; o2::framework::ConfigurableAxis mult{"mult", {200, 0, 200}, "Multiplicity binning"}; o2::framework::ConfigurableAxis cent{"cent", {100, 0.0f, 100.0f}, "Centrality (multiplicity percentile) binning"}; - o2::framework::ConfigurableAxis spher{"spher", {200, 0.0f, 2.0f}, "Sphericity binning"}; - o2::framework::ConfigurableAxis magField{"magField", {2, -1, 1}, "Magnetic field binning"}; + o2::framework::ConfigurableAxis magField{"magField", {11, -5.5, 5.5}, "Magnetic field binning"}; +}; + +struct ConfCollisionQaBinning : o2::framework::ConfigurableGroup { + std::string prefix = std::string("CollisionQaBinning"); + o2::framework::ConfigurableAxis vtx{"vtx", {120, 0.f, 12.f}, "Vertex position binning"}; + o2::framework::ConfigurableAxis vtxXY{"vtxXY", {100, -1.f, 1.f}, "Vertex X/Y binning"}; + o2::framework::ConfigurableAxis sphericity{"sphericity", {100, 0.f, 1.f}, "Spericity Binning"}; + o2::framework::ConfigurableAxis occupancy{"occupancy", {500, 0.f, 5000.f}, "Spericity Binning"}; }; template @@ -116,18 +137,22 @@ class CollisionHistManager mHistogramRegistry->add(analysisDir + GetHistNamev2(kPosZ, HistTable), GetHistDesc(kPosZ, HistTable), GetHistType(kPosZ, HistTable), {Specs[kPosZ]}); mHistogramRegistry->add(analysisDir + GetHistNamev2(kMult, HistTable), GetHistDesc(kMult, HistTable), GetHistType(kMult, HistTable), {Specs[kMult]}); mHistogramRegistry->add(analysisDir + GetHistNamev2(kCent, HistTable), GetHistDesc(kCent, HistTable), GetHistType(kCent, HistTable), {Specs[kCent]}); - mHistogramRegistry->add(analysisDir + GetHistNamev2(kSphericity, HistTable), GetHistDesc(kSphericity, HistTable), GetHistType(kSphericity, HistTable), {Specs[kSphericity]}); mHistogramRegistry->add(analysisDir + GetHistNamev2(kMagField, HistTable), GetHistDesc(kMagField, HistTable), GetHistType(kMagField, HistTable), {Specs[kMagField]}); - mHistogramRegistry->add(analysisDir + GetHistNamev2(kPoszVsMult, HistTable), GetHistDesc(kPoszVsMult, HistTable), GetHistType(kPoszVsMult, HistTable), {Specs[kPoszVsMult]}); - mHistogramRegistry->add(analysisDir + GetHistNamev2(kPoszVsCent, HistTable), GetHistDesc(kPoszVsCent, HistTable), GetHistType(kPoszVsCent, HistTable), {Specs[kPoszVsCent]}); - mHistogramRegistry->add(analysisDir + GetHistNamev2(kCentVsMult, HistTable), GetHistDesc(kCentVsMult, HistTable), GetHistType(kCentVsMult, HistTable), {Specs[kCentVsMult]}); - mHistogramRegistry->add(analysisDir + GetHistNamev2(kMultVsSphericity, HistTable), GetHistDesc(kMultVsSphericity, HistTable), GetHistType(kMultVsSphericity, HistTable), {Specs[kMultVsSphericity]}); - mHistogramRegistry->add(analysisDir + GetHistNamev2(kCentVsSphericity, HistTable), GetHistDesc(kCentVsSphericity, HistTable), GetHistType(kCentVsSphericity, HistTable), {Specs[kCentVsSphericity]}); } if constexpr (isFlagSet(mode, modes::Mode::kQa)) { std::string qaDir = std::string(ColQaDir); - // to be implemented + + mHistogramRegistry->add(qaDir + GetHistNamev2(kPosX, HistTable), GetHistDesc(kPosX, HistTable), GetHistType(kPosX, HistTable), {Specs[kPosX]}); + mHistogramRegistry->add(qaDir + GetHistNamev2(kPosY, HistTable), GetHistDesc(kPosY, HistTable), GetHistType(kPosY, HistTable), {Specs[kPosY]}); + mHistogramRegistry->add(qaDir + GetHistNamev2(kPos, HistTable), GetHistDesc(kPos, HistTable), GetHistType(kPos, HistTable), {Specs[kPos]}); + mHistogramRegistry->add(qaDir + GetHistNamev2(kSphericity, HistTable), GetHistDesc(kSphericity, HistTable), GetHistType(kSphericity, HistTable), {Specs[kSphericity]}); + mHistogramRegistry->add(qaDir + GetHistNamev2(kOccupancy, HistTable), GetHistDesc(kOccupancy, HistTable), GetHistType(kOccupancy, HistTable), {Specs[kOccupancy]}); + mHistogramRegistry->add(qaDir + GetHistNamev2(kPoszVsMult, HistTable), GetHistDesc(kPoszVsMult, HistTable), GetHistType(kPoszVsMult, HistTable), {Specs[kPoszVsMult]}); + mHistogramRegistry->add(qaDir + GetHistNamev2(kPoszVsCent, HistTable), GetHistDesc(kPoszVsCent, HistTable), GetHistType(kPoszVsCent, HistTable), {Specs[kPoszVsCent]}); + mHistogramRegistry->add(qaDir + GetHistNamev2(kCentVsMult, HistTable), GetHistDesc(kCentVsMult, HistTable), GetHistType(kCentVsMult, HistTable), {Specs[kCentVsMult]}); + mHistogramRegistry->add(qaDir + GetHistNamev2(kMultVsSphericity, HistTable), GetHistDesc(kMultVsSphericity, HistTable), GetHistType(kMultVsSphericity, HistTable), {Specs[kMultVsSphericity]}); + mHistogramRegistry->add(qaDir + GetHistNamev2(kCentVsSphericity, HistTable), GetHistDesc(kCentVsSphericity, HistTable), GetHistType(kCentVsSphericity, HistTable), {Specs[kCentVsSphericity]}); } } // namespace o2::analysis::femtounited @@ -138,17 +163,20 @@ class CollisionHistManager mHistogramRegistry->fill(HIST(ColAnalysisDir) + HIST(GetHistName(kPosZ, HistTable)), col.posZ()); mHistogramRegistry->fill(HIST(ColAnalysisDir) + HIST(GetHistName(kMult, HistTable)), col.mult()); mHistogramRegistry->fill(HIST(ColAnalysisDir) + HIST(GetHistName(kCent, HistTable)), col.cent()); - mHistogramRegistry->fill(HIST(ColAnalysisDir) + HIST(GetHistName(kSphericity, HistTable)), col.sphericity()); mHistogramRegistry->fill(HIST(ColAnalysisDir) + HIST(GetHistName(kMagField, HistTable)), col.magField()); - mHistogramRegistry->fill(HIST(ColAnalysisDir) + HIST(GetHistName(kPoszVsMult, HistTable)), col.posZ(), col.mult()); - mHistogramRegistry->fill(HIST(ColAnalysisDir) + HIST(GetHistName(kPoszVsCent, HistTable)), col.posZ(), col.cent()); - mHistogramRegistry->fill(HIST(ColAnalysisDir) + HIST(GetHistName(kCentVsMult, HistTable)), col.cent(), col.mult()); - mHistogramRegistry->fill(HIST(ColAnalysisDir) + HIST(GetHistName(kMultVsSphericity, HistTable)), col.mult(), col.sphericity()); - mHistogramRegistry->fill(HIST(ColAnalysisDir) + HIST(GetHistName(kCentVsSphericity, HistTable)), col.cent(), col.sphericity()); } if constexpr (isFlagSet(mode, modes::Mode::kQa)) { - // to be implemented + mHistogramRegistry->fill(HIST(ColQaDir) + HIST(GetHistName(kPosX, HistTable)), col.posX()); + mHistogramRegistry->fill(HIST(ColQaDir) + HIST(GetHistName(kPosY, HistTable)), col.posY()); + mHistogramRegistry->fill(HIST(ColQaDir) + HIST(GetHistName(kPos, HistTable)), std::hypot(col.posX(), col.posY(), col.posZ())); + mHistogramRegistry->fill(HIST(ColQaDir) + HIST(GetHistName(kSphericity, HistTable)), col.sphericity()); + mHistogramRegistry->fill(HIST(ColQaDir) + HIST(GetHistName(kOccupancy, HistTable)), col.trackOccupancyInTimeRange()); + mHistogramRegistry->fill(HIST(ColQaDir) + HIST(GetHistName(kPoszVsMult, HistTable)), col.posZ(), col.mult()); + mHistogramRegistry->fill(HIST(ColQaDir) + HIST(GetHistName(kPoszVsCent, HistTable)), col.posZ(), col.cent()); + mHistogramRegistry->fill(HIST(ColQaDir) + HIST(GetHistName(kCentVsMult, HistTable)), col.cent(), col.mult()); + mHistogramRegistry->fill(HIST(ColQaDir) + HIST(GetHistName(kMultVsSphericity, HistTable)), col.mult(), col.sphericity()); + mHistogramRegistry->fill(HIST(ColQaDir) + HIST(GetHistName(kCentVsSphericity, HistTable)), col.cent(), col.sphericity()); } } diff --git a/PWGCF/Femto/Core/femtoUtils.h b/PWGCF/Femto/Core/femtoUtils.h index fb082ae96fa..e13bcfdd379 100644 --- a/PWGCF/Femto/Core/femtoUtils.h +++ b/PWGCF/Femto/Core/femtoUtils.h @@ -167,9 +167,9 @@ float qn(T const& col) return qn; } -inline std::optional dphistar(float magfield, float radius, float sign, float pt, float phi) +inline std::optional dphistar(float magfield, float radius, float signedPt, float phi) { - float arg = 0.3f * sign * magfield * radius * 0.01f / (2.f * pt); + float arg = 0.3f * (0.1f * magfield) * (0.01 * radius) / (2.f * signedPt); if (std::fabs(arg) < 1.f) { return phi - std::asin(arg); } diff --git a/PWGCF/Femto/Core/kinkBuilder.h b/PWGCF/Femto/Core/kinkBuilder.h index 33a843dee0a..f9f3581da3f 100644 --- a/PWGCF/Femto/Core/kinkBuilder.h +++ b/PWGCF/Femto/Core/kinkBuilder.h @@ -92,7 +92,7 @@ struct ConfSigmaBits : o2::framework::ConfigurableGroup { o2::framework::Configurable phiMax{"phiMax", 1.f * o2::constants::math::TwoPI, "Maximum phi"}; \ o2::framework::Configurable massMin{"massMin", defaultMassMin, "Minimum invariant mass for Sigma"}; \ o2::framework::Configurable massMax{"massMax", defaultMassMax, "Maximum invariant mass for Sigma"}; \ - o2::framework::Configurable mask{"mask", 0, "Bitmask for kink selection"}; + o2::framework::Configurable mask{"mask", 0x0, "Bitmask for kink selection"}; // base selection for analysis task for sigmas template diff --git a/PWGCF/Femto/Core/pairBuilder.h b/PWGCF/Femto/Core/pairBuilder.h index 1af5a169e24..6ddca42069a 100644 --- a/PWGCF/Femto/Core/pairBuilder.h +++ b/PWGCF/Femto/Core/pairBuilder.h @@ -85,23 +85,23 @@ class PairTrackTrackBuilder mTrackHistManager1.init(registry, trackHistSpec1); mPairHistManagerSe.setMass(confTrackSelection1.pdgCode.value, confTrackSelection1.pdgCode.value); - mPairHistManagerSe.setCharge(confTrackSelection1.charge.value, confTrackSelection1.charge.value); - mCprSe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection1.charge.value, confTrackSelection1.charge.value, confCpr.on.value); + mPairHistManagerSe.setCharge(confTrackSelection1.chargeAbs.value, confTrackSelection1.chargeAbs.value); + mCprSe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection1.chargeAbs.value, confTrackSelection1.chargeAbs.value, confCpr.on.value); mPairHistManagerMe.setMass(confTrackSelection1.pdgCode.value, confTrackSelection1.pdgCode.value); - mPairHistManagerMe.setCharge(confTrackSelection1.charge.value, confTrackSelection1.charge.value); - mCprMe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection1.charge.value, confTrackSelection1.charge.value, confCpr.on.value); + mPairHistManagerMe.setCharge(confTrackSelection1.chargeAbs.value, confTrackSelection1.chargeAbs.value); + mCprMe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection1.chargeAbs.value, confTrackSelection1.chargeAbs.value, confCpr.on.value); } else { mTrackHistManager1.init(registry, trackHistSpec1); mTrackHistManager2.init(registry, trackHistSpec2); mPairHistManagerSe.setMass(confTrackSelection1.pdgCode.value, confTrackSelection2.pdgCode.value); - mPairHistManagerSe.setCharge(confTrackSelection1.charge.value, confTrackSelection2.charge.value); - mCprSe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection1.charge.value, confTrackSelection2.charge.value, confCpr.on.value); + mPairHistManagerSe.setCharge(confTrackSelection1.chargeAbs.value, confTrackSelection2.chargeAbs.value); + mCprSe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection1.chargeAbs.value, confTrackSelection2.chargeAbs.value, confCpr.on.value); mPairHistManagerMe.setMass(confTrackSelection1.pdgCode.value, confTrackSelection2.pdgCode.value); - mPairHistManagerMe.setCharge(confTrackSelection1.charge.value, confTrackSelection2.charge.value); - mCprMe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection1.charge.value, confTrackSelection2.charge.value, confCpr.on.value); + mPairHistManagerMe.setCharge(confTrackSelection1.chargeAbs.value, confTrackSelection2.chargeAbs.value); + mCprMe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection1.chargeAbs.value, confTrackSelection2.chargeAbs.value, confCpr.on.value); } // setup mixing @@ -125,7 +125,7 @@ class PairTrackTrackBuilder void processSameEvent(T1 const& col, T2& /*trackTable*/, T3& partition1, T4& partition2, T5& cache) { if (mSameSpecies) { - auto trackSlice1 = partition1->sliceByCached(o2::aod::femtobase::stored::collisionId, col.globalIndex(), cache); + auto trackSlice1 = partition1->sliceByCached(o2::aod::femtobase::stored::fColId, col.globalIndex(), cache); if (trackSlice1.size() == 0) { return; } @@ -133,8 +133,8 @@ class PairTrackTrackBuilder mCprSe.setMagField(col.magField()); pairprocesshelpers::processSameEvent(trackSlice1, mTrackHistManager1, mPairHistManagerSe, mCprSe, mRng, mMixIdenticalParticles); } else { - auto trackSlice1 = partition1->sliceByCached(o2::aod::femtobase::stored::collisionId, col.globalIndex(), cache); - auto trackSlice2 = partition2->sliceByCached(o2::aod::femtobase::stored::collisionId, col.globalIndex(), cache); + auto trackSlice1 = partition1->sliceByCached(o2::aod::femtobase::stored::fColId, col.globalIndex(), cache); + auto trackSlice2 = partition2->sliceByCached(o2::aod::femtobase::stored::fColId, col.globalIndex(), cache); if (trackSlice1.size() == 0 || trackSlice2.size() == 0) { return; } @@ -242,13 +242,13 @@ class PairTrackV0Builder mPairHistManagerSe.init(registry, pairHistSpec); mPairHistManagerSe.setMass(confTrackSelection.pdgCode.value, confV0Selection.pdgCode.value); - mPairHistManagerSe.setCharge(confTrackSelection.charge.value, 1); - mCprSe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection.charge.value, confCpr.on.value); + mPairHistManagerSe.setCharge(confTrackSelection.chargeAbs.value, 1); + mCprSe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection.chargeAbs.value, confCpr.on.value); mPairHistManagerMe.init(registry, pairHistSpec); mPairHistManagerMe.setMass(confTrackSelection.pdgCode.value, confV0Selection.pdgCode.value); - mPairHistManagerMe.setCharge(confTrackSelection.charge.value, 1); - mCprMe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection.charge.value, confCpr.on.value); + mPairHistManagerMe.setCharge(confTrackSelection.chargeAbs.value, 1); + mCprMe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection.chargeAbs.value, confCpr.on.value); // setup mixing mMixingPolicy = static_cast(confMixing.policy.value); @@ -258,8 +258,8 @@ class PairTrackV0Builder template void processSameEvent(T1 const& col, T2& trackTable, T3& trackPartition, T4& /*v0table*/, T5& v0Partition, T6& cache) { - auto trackSlice = trackPartition->sliceByCached(o2::aod::femtobase::stored::collisionId, col.globalIndex(), cache); - auto v0Slice = v0Partition->sliceByCached(o2::aod::femtobase::stored::collisionId, col.globalIndex(), cache); + auto trackSlice = trackPartition->sliceByCached(o2::aod::femtobase::stored::fColId, col.globalIndex(), cache); + auto v0Slice = v0Partition->sliceByCached(o2::aod::femtobase::stored::fColId, col.globalIndex(), cache); if (trackSlice.size() == 0 || v0Slice.size() == 0) { return; } @@ -346,13 +346,13 @@ class PairTrackTwoTrackResonanceBuilder mPairHistManagerSe.init(registry, pairHistSpec); mPairHistManagerSe.setMass(confTrackSelection.pdgCode.value, confResonanceSelection.pdgCode.value); - mPairHistManagerSe.setCharge(confTrackSelection.charge.value, 1); - mCprSe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection.charge.value, confCpr.on.value); + mPairHistManagerSe.setCharge(confTrackSelection.chargeAbs.value, 1); + mCprSe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection.chargeAbs.value, confCpr.on.value); mPairHistManagerMe.init(registry, pairHistSpec); mPairHistManagerMe.setMass(confTrackSelection.pdgCode.value, confResonanceSelection.pdgCode.value); - mPairHistManagerMe.setCharge(confTrackSelection.charge.value, 1); - mCprMe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection.charge.value, confCpr.on.value); + mPairHistManagerMe.setCharge(confTrackSelection.chargeAbs.value, 1); + mCprMe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection.chargeAbs.value, confCpr.on.value); // setup mixing mMixingPolicy = static_cast(confMixing.policy.value); @@ -362,8 +362,8 @@ class PairTrackTwoTrackResonanceBuilder template void processSameEvent(T1 const& col, T2& trackTable, T3& trackPartition, T4& /*resonanceTable*/, T5& resonancePartition, T6& cache) { - auto trackSlice = trackPartition->sliceByCached(o2::aod::femtobase::stored::collisionId, col.globalIndex(), cache); - auto v0Slice = resonancePartition->sliceByCached(o2::aod::femtobase::stored::collisionId, col.globalIndex(), cache); + auto trackSlice = trackPartition->sliceByCached(o2::aod::femtobase::stored::fColId, col.globalIndex(), cache); + auto v0Slice = resonancePartition->sliceByCached(o2::aod::femtobase::stored::fColId, col.globalIndex(), cache); if (trackSlice.size() == 0 || v0Slice.size() == 0) { return; } @@ -447,13 +447,13 @@ class PairTrackKinkBuilder mPairHistManagerSe.init(registry, pairHistSpec); mPairHistManagerSe.setMass(confTrackSelection.pdgCode.value, confKinkSelection.pdgCode.value); - mPairHistManagerSe.setCharge(confTrackSelection.charge.value, confKinkSelection.sign.value); - mCprSe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection.charge.value, confKinkSelection.sign.value, confCpr.on.value); + mPairHistManagerSe.setCharge(confTrackSelection.chargeAbs.value, confKinkSelection.sign.value); + mCprSe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection.chargeAbs.value, confKinkSelection.sign.value, confCpr.on.value); mPairHistManagerMe.init(registry, pairHistSpec); mPairHistManagerMe.setMass(confTrackSelection.pdgCode.value, confKinkSelection.pdgCode.value); - mPairHistManagerMe.setCharge(confTrackSelection.charge.value, confKinkSelection.sign.value); - mCprMe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection.charge.value, confKinkSelection.sign.value, confCpr.on.value); + mPairHistManagerMe.setCharge(confTrackSelection.chargeAbs.value, confKinkSelection.sign.value); + mCprMe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection.chargeAbs.value, confKinkSelection.sign.value, confCpr.on.value); // setup mixing mMixingPolicy = static_cast(confMixing.policy.value); @@ -463,8 +463,8 @@ class PairTrackKinkBuilder template void processSameEvent(T1 const& col, T2& trackTable, T3& trackPartition, T4& /*kinktable*/, T5& kinkPartition, T6& cache) { - auto trackSlice = trackPartition->sliceByCached(o2::aod::femtobase::stored::collisionId, col.globalIndex(), cache); - auto kinkSlice = kinkPartition->sliceByCached(o2::aod::femtobase::stored::collisionId, col.globalIndex(), cache); + auto trackSlice = trackPartition->sliceByCached(o2::aod::femtobase::stored::fColId, col.globalIndex(), cache); + auto kinkSlice = kinkPartition->sliceByCached(o2::aod::femtobase::stored::fColId, col.globalIndex(), cache); if (trackSlice.size() == 0 || kinkSlice.size() == 0) { return; } @@ -554,13 +554,13 @@ class PairTrackCascadeBuilder mPairHistManagerSe.init(registry, pairHistSpec); mPairHistManagerSe.setMass(confTrackSelection.pdgCode.value, confCascadeSelection.pdgCode.value); - mPairHistManagerSe.setCharge(confTrackSelection.charge.value, confCascadeSelection.sign.value); - mCprSe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection.charge.value, confCascadeSelection.sign.value, confCpr.on.value); + mPairHistManagerSe.setCharge(confTrackSelection.chargeAbs.value, confCascadeSelection.sign.value); + mCprSe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection.chargeAbs.value, confCascadeSelection.sign.value, confCpr.on.value); mPairHistManagerMe.init(registry, pairHistSpec); mPairHistManagerMe.setMass(confTrackSelection.pdgCode.value, confCascadeSelection.pdgCode.value); - mPairHistManagerMe.setCharge(confTrackSelection.charge.value, confCascadeSelection.sign.value); - mCprMe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection.charge.value, confCascadeSelection.sign.value, confCpr.on.value); + mPairHistManagerMe.setCharge(confTrackSelection.chargeAbs.value, confCascadeSelection.sign.value); + mCprMe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection.chargeAbs.value, confCascadeSelection.sign.value, confCpr.on.value); // setup mixing mMixingPolicy = static_cast(confMixing.policy.value); @@ -570,8 +570,8 @@ class PairTrackCascadeBuilder template void processSameEvent(T1 const& col, T2& trackTable, T3& trackPartition, T4& /*cascadeTable*/, T5& v0Partition, T6& cache) { - auto trackSlice = trackPartition->sliceByCached(o2::aod::femtobase::stored::collisionId, col.globalIndex(), cache); - auto v0Slice = v0Partition->sliceByCached(o2::aod::femtobase::stored::collisionId, col.globalIndex(), cache); + auto trackSlice = trackPartition->sliceByCached(o2::aod::femtobase::stored::fColId, col.globalIndex(), cache); + auto v0Slice = v0Partition->sliceByCached(o2::aod::femtobase::stored::fColId, col.globalIndex(), cache); if (trackSlice.size() == 0 || v0Slice.size() == 0) { return; } diff --git a/PWGCF/Femto/Core/pairHistManager.h b/PWGCF/Femto/Core/pairHistManager.h index 8b5856ad208..0e0862499f4 100644 --- a/PWGCF/Femto/Core/pairHistManager.h +++ b/PWGCF/Femto/Core/pairHistManager.h @@ -49,7 +49,7 @@ enum PairHist { kKstar, kKt, kMt, - // 2d qa + // 2d kPt1VsPt2, kPt1VsKstar, kPt2VsKstar, @@ -58,6 +58,7 @@ enum PairHist { kPt1VsMt, kPt2VsMt, kPairHistogramLast + // more dimensions }; enum MixingPoliciy { @@ -170,12 +171,12 @@ class PairHistManager mMass1 = o2::analysis::femto::utils::getMass(PdgParticle1); mMass2 = o2::analysis::femto::utils::getMass(PdgParticle2); } - void setCharge(int chargeParticle1, int chargeParticle2) + void setCharge(int chargeAbsParticle1, int chargeAbsParticle2) { // the pt stored is actually pt/z, so in case of particles with z > 1, we have to rescale the pt (this is so far only for He3 the case) // similarly, for neutral particles, no reason to rescale so we just set absolute charge to 1 - mAbsCharge1 = std::abs(chargeParticle1 == 0 ? 1 : chargeParticle1); - mAbsCharge2 = std::abs(chargeParticle2 == 0 ? 1 : chargeParticle2); + mAbsCharge1 = chargeAbsParticle1; + mAbsCharge2 = chargeAbsParticle2; } template diff --git a/PWGCF/Femto/Core/pairProcessHelpers.h b/PWGCF/Femto/Core/pairProcessHelpers.h index df96b056c16..f2f1debbd2a 100644 --- a/PWGCF/Femto/Core/pairProcessHelpers.h +++ b/PWGCF/Femto/Core/pairProcessHelpers.h @@ -181,8 +181,8 @@ void processMixedEvent(T1& Collisions, continue; } CprManager.setMagField(collision1.magField()); - auto sliceParticle1 = Partition->sliceByCached(o2::aod::femtobase::stored::collisionId, collision1.globalIndex(), cache); - auto sliceParticle2 = Partition->sliceByCached(o2::aod::femtobase::stored::collisionId, collision2.globalIndex(), cache); + auto sliceParticle1 = Partition->sliceByCached(o2::aod::femtobase::stored::fColId, collision1.globalIndex(), cache); + auto sliceParticle2 = Partition->sliceByCached(o2::aod::femtobase::stored::fColId, collision2.globalIndex(), cache); if (sliceParticle1.size() == 0 || sliceParticle2.size() == 0) { continue; } @@ -230,8 +230,8 @@ void processMixedEvent(T1& Collisions, continue; } CprManager.setMagField(collision1.magField()); - auto sliceParticle1 = Partition1->sliceByCached(o2::aod::femtobase::stored::collisionId, collision1.globalIndex(), cache); - auto sliceParticle2 = Partition2->sliceByCached(o2::aod::femtobase::stored::collisionId, collision2.globalIndex(), cache); + auto sliceParticle1 = Partition1->sliceByCached(o2::aod::femtobase::stored::fColId, collision1.globalIndex(), cache); + auto sliceParticle2 = Partition2->sliceByCached(o2::aod::femtobase::stored::fColId, collision2.globalIndex(), cache); if (sliceParticle1.size() == 0 || sliceParticle2.size() == 0) { continue; } @@ -281,8 +281,8 @@ void processMixedEvent(T1& Collisions, continue; } CprManager.setMagField(collision1.magField()); - auto sliceParticle1 = Partition1->sliceByCached(o2::aod::femtobase::stored::collisionId, collision1.globalIndex(), cache); - auto sliceParticle2 = Partition2->sliceByCached(o2::aod::femtobase::stored::collisionId, collision2.globalIndex(), cache); + auto sliceParticle1 = Partition1->sliceByCached(o2::aod::femtobase::stored::fColId, collision1.globalIndex(), cache); + auto sliceParticle2 = Partition2->sliceByCached(o2::aod::femtobase::stored::fColId, collision2.globalIndex(), cache); if (sliceParticle1.size() == 0 || sliceParticle2.size() == 0) { continue; } diff --git a/PWGCF/Femto/Core/partitions.h b/PWGCF/Femto/Core/partitions.h index 7cc40b5ffdf..f1d3775cfd0 100644 --- a/PWGCF/Femto/Core/partitions.h +++ b/PWGCF/Femto/Core/partitions.h @@ -17,25 +17,24 @@ #define PWGCF_FEMTO_CORE_PARTITIONS_H_ // collsion selection -#define MAKE_COLLISION_FILTER(selection) \ - (femtocollisions::posZ >= selection.vtxZMin && femtocollisions::posZ <= selection.vtxZMax) && \ - (femtocollisions::mult >= selection.multMin && femtocollisions::mult <= selection.multMax) && \ - (femtocollisions::cent >= selection.centMin && femtocollisions::cent <= selection.centMax) && \ - (femtocollisions::sphericity >= selection.spherMin && femtocollisions::sphericity <= selection.spherMax) && \ - (femtocollisions::magField >= selection.magFieldMin && femtocollisions::magField <= selection.magFieldMax) && \ +#define MAKE_COLLISION_FILTER(selection) \ + (femtocollisions::posZ >= selection.vtxZMin && femtocollisions::posZ <= selection.vtxZMax) && \ + (femtocollisions::mult >= selection.multMin && femtocollisions::mult <= selection.multMax) && \ + (femtocollisions::cent >= selection.centMin && femtocollisions::cent <= selection.centMax) && \ + (femtocollisions::magField >= static_cast(selection.magFieldMin) && femtocollisions::magField <= static_cast(selection.magFieldMax)) && \ ncheckbit(femtocollisions::collisionMask, selection.collisionMask) // standard track partition -#define MAKE_TRACK_PARTITION(selection) \ - ifnode(selection.charge.node() > 0, femtobase::stored::signedPt > 0.f, femtobase::stored::signedPt < 0.f) && \ - (nabs(selection.charge.node() * femtobase::stored::signedPt) > selection.ptMin) && \ - (nabs(selection.charge.node() * femtobase::stored::signedPt) < selection.ptMax) && \ - (femtobase::stored::eta > selection.etaMin) && \ - (femtobase::stored::eta < selection.etaMax) && \ - (femtobase::stored::phi > selection.phiMin) && \ - (femtobase::stored::phi < selection.phiMax) && \ - ifnode(nabs(selection.charge.node() * femtobase::stored::signedPt) * (nexp(femtobase::stored::eta) + nexp(-1.f * femtobase::stored::eta)) / (2.f) <= selection.pidThres, \ - ncheckbit(femtotracks::trackMask, selection.maskLowMomentum), \ +#define MAKE_TRACK_PARTITION(selection) \ + ifnode(selection.chargeSign.node() != 0, ifnode(selection.chargeSign.node() > 0, femtobase::stored::signedPt > 0.f, femtobase::stored::signedPt < 0.f), true) && \ + (nabs(selection.chargeAbs.node() * femtobase::stored::signedPt) > selection.ptMin) && \ + (nabs(selection.chargeAbs.node() * femtobase::stored::signedPt) < selection.ptMax) && \ + (femtobase::stored::eta > selection.etaMin) && \ + (femtobase::stored::eta < selection.etaMax) && \ + (femtobase::stored::phi > selection.phiMin) && \ + (femtobase::stored::phi < selection.phiMax) && \ + ifnode(nabs(selection.chargeAbs.node() * femtobase::stored::signedPt) * (nexp(femtobase::stored::eta) + nexp(-1.f * femtobase::stored::eta)) / (2.f) <= selection.pidThres, \ + ncheckbit(femtotracks::trackMask, selection.maskLowMomentum), \ ncheckbit(femtotracks::trackMask, selection.maskHighMomentum)) // partition for phis and rhos, i.e. resonance that are their own antiparticle @@ -56,34 +55,36 @@ ncheckbit(femtotwotrackresonances::mask, selection.negDauMaskBelowThres)) // partition for kstars, they have distinct antiparticle -#define MAKE_RESONANCE_1_PARTITON(selection) \ - ifnode(selection.sign.node() > 0, femtobase::stored::signedPt > 0.f, femtobase::stored::signedPt < 0.f) && \ - (nabs(femtobase::stored::signedPt) > selection.ptMin) && \ - (nabs(femtobase::stored::signedPt) < selection.ptMax) && \ - (femtobase::stored::eta > selection.etaMin) && \ - (femtobase::stored::eta < selection.etaMax) && \ - (femtobase::stored::phi > selection.phiMin) && \ - (femtobase::stored::phi < selection.phiMax) && \ - (femtobase::stored::mass > selection.massMin) && \ - (femtobase::stored::mass < selection.massMax) && \ - ifnode(ncheckbit(femtotwotrackresonances::mask, selection.posDauBitForThres), \ - ncheckbit(femtotwotrackresonances::mask, selection.posDauMaskAboveThres), \ - ncheckbit(femtotwotrackresonances::mask, selection.posDauMaskBelowThres)) && \ - ifnode(ncheckbit(femtotwotrackresonances::mask, selection.negDauBitForThres), \ - ncheckbit(femtotwotrackresonances::mask, selection.negDauMaskAboveThres), \ +#define MAKE_RESONANCE_1_PARTITON(selection) \ + ifnode(selection.sign.node() != 0, \ + ifnode(selection.sign.node() > 0, femtobase::stored::signedPt > 0.f, femtobase::stored::signedPt < 0.f), true) && \ + (nabs(femtobase::stored::signedPt) > selection.ptMin) && \ + (nabs(femtobase::stored::signedPt) < selection.ptMax) && \ + (femtobase::stored::eta > selection.etaMin) && \ + (femtobase::stored::eta < selection.etaMax) && \ + (femtobase::stored::phi > selection.phiMin) && \ + (femtobase::stored::phi < selection.phiMax) && \ + (femtobase::stored::mass > selection.massMin) && \ + (femtobase::stored::mass < selection.massMax) && \ + ifnode(ncheckbit(femtotwotrackresonances::mask, selection.posDauBitForThres), \ + ncheckbit(femtotwotrackresonances::mask, selection.posDauMaskAboveThres), \ + ncheckbit(femtotwotrackresonances::mask, selection.posDauMaskBelowThres)) && \ + ifnode(ncheckbit(femtotwotrackresonances::mask, selection.negDauBitForThres), \ + ncheckbit(femtotwotrackresonances::mask, selection.negDauMaskAboveThres), \ ncheckbit(femtotwotrackresonances::mask, selection.negDauMaskBelowThres)) // partition for lambdas -#define MAKE_LAMBDA_PARTITION(selection) \ - ifnode(selection.sign.node() > 0, femtobase::stored::signedPt > 0.f, femtobase::stored::signedPt < 0.f) && \ - (nabs(femtobase::stored::signedPt) > selection.ptMin) && \ - (nabs(femtobase::stored::signedPt) < selection.ptMax) && \ - (femtobase::stored::eta > selection.etaMin) && \ - (femtobase::stored::eta < selection.etaMax) && \ - (femtobase::stored::phi > selection.phiMin) && \ - (femtobase::stored::phi < selection.phiMax) && \ - (femtobase::stored::mass > selection.massMin) && \ - (femtobase::stored::mass < selection.massMax) && \ +#define MAKE_LAMBDA_PARTITION(selection) \ + ifnode(selection.sign.node() != 0, \ + ifnode(selection.sign.node() > 0, femtobase::stored::signedPt > 0.f, femtobase::stored::signedPt < 0.f), true) && \ + (nabs(femtobase::stored::signedPt) > selection.ptMin) && \ + (nabs(femtobase::stored::signedPt) < selection.ptMax) && \ + (femtobase::stored::eta > selection.etaMin) && \ + (femtobase::stored::eta < selection.etaMax) && \ + (femtobase::stored::phi > selection.phiMin) && \ + (femtobase::stored::phi < selection.phiMax) && \ + (femtobase::stored::mass > selection.massMin) && \ + (femtobase::stored::mass < selection.massMax) && \ ncheckbit(femtov0s::mask, selection.mask) // partition for k0shorts @@ -99,28 +100,30 @@ (femtobase::stored::mass < selection.massMax) && \ ncheckbit(femtov0s::mask, selection.mask) -#define MAKE_CASCADE_PARTITION(selection) \ - ifnode(selection.sign.node() > 0, femtobase::stored::signedPt > 0.f, femtobase::stored::signedPt < 0.f) && \ - (nabs(femtobase::stored::signedPt) > selection.ptMin) && \ - (nabs(femtobase::stored::signedPt) < selection.ptMax) && \ - (femtobase::stored::eta > selection.etaMin) && \ - (femtobase::stored::eta < selection.etaMax) && \ - (femtobase::stored::phi > selection.phiMin) && \ - (femtobase::stored::phi < selection.phiMax) && \ - (femtobase::stored::mass > selection.massMin) && \ - (femtobase::stored::mass < selection.massMax) && \ +#define MAKE_CASCADE_PARTITION(selection) \ + ifnode(selection.sign.node() != 0, \ + ifnode(selection.sign.node() > 0, femtobase::stored::signedPt > 0.f, femtobase::stored::signedPt < 0.f), true) && \ + (nabs(femtobase::stored::signedPt) > selection.ptMin) && \ + (nabs(femtobase::stored::signedPt) < selection.ptMax) && \ + (femtobase::stored::eta > selection.etaMin) && \ + (femtobase::stored::eta < selection.etaMax) && \ + (femtobase::stored::phi > selection.phiMin) && \ + (femtobase::stored::phi < selection.phiMax) && \ + (femtobase::stored::mass > selection.massMin) && \ + (femtobase::stored::mass < selection.massMax) && \ ncheckbit(femtocascades::mask, selection.mask) -#define MAKE_SIGMA_PARTITION(selection) \ - ifnode(selection.sign.node() > 0, femtobase::stored::signedPt > 0.f, femtobase::stored::signedPt < 0.f) && \ - (nabs(femtobase::stored::signedPt) > selection.ptMin) && \ - (nabs(femtobase::stored::signedPt) < selection.ptMax) && \ - (femtobase::stored::eta > selection.etaMin) && \ - (femtobase::stored::eta < selection.etaMax) && \ - (femtobase::stored::phi > selection.phiMin) && \ - (femtobase::stored::phi < selection.phiMax) && \ - (femtobase::stored::mass > selection.massMin) && \ - (femtobase::stored::mass < selection.massMax) && \ +#define MAKE_SIGMA_PARTITION(selection) \ + ifnode(selection.sign.node() != 0, \ + ifnode(selection.sign.node() > 0, femtobase::stored::signedPt > 0.f, femtobase::stored::signedPt < 0.f), true) && \ + (nabs(femtobase::stored::signedPt) > selection.ptMin) && \ + (nabs(femtobase::stored::signedPt) < selection.ptMax) && \ + (femtobase::stored::eta > selection.etaMin) && \ + (femtobase::stored::eta < selection.etaMax) && \ + (femtobase::stored::phi > selection.phiMin) && \ + (femtobase::stored::phi < selection.phiMax) && \ + (femtobase::stored::mass > selection.massMin) && \ + (femtobase::stored::mass < selection.massMax) && \ ncheckbit(femtokinks::mask, selection.mask) #endif // PWGCF_FEMTO_CORE_PARTITIONS_H_ diff --git a/PWGCF/Femto/Core/trackBuilder.h b/PWGCF/Femto/Core/trackBuilder.h index e179e520c29..826ccbbc9ca 100644 --- a/PWGCF/Femto/Core/trackBuilder.h +++ b/PWGCF/Femto/Core/trackBuilder.h @@ -118,7 +118,8 @@ struct ConfTrackSelection : public o2::framework::ConfigurableGroup { std::string prefix = Prefix; // Unique prefix based on the template argument // configuration parameters o2::framework::Configurable pdgCode{"pdgCode", 2212, "Track PDG code"}; - o2::framework::Configurable charge{"charge", 1, "Charge of the track (use +/-1 for positive/negative tracks, except He3 needs +/-2)"}; + o2::framework::Configurable chargeAbs{"chargeAbs", 1, "Absolute value of charge (e.g. 1 for most tracks, 2 for He3)"}; + o2::framework::Configurable chargeSign{"chargeSign", 1, "Track charge sign: +1 for positive, -1 for negative, 0 for both"}; // filters for kinematics o2::framework::Configurable ptMin{"ptMin", 0.2f, "Minimum pT (GeV/c)"}; o2::framework::Configurable ptMax{"ptMax", 6.f, "Maximum pT (GeV/c)"}; @@ -127,8 +128,8 @@ struct ConfTrackSelection : public o2::framework::ConfigurableGroup { o2::framework::Configurable phiMin{"phiMin", 0.f, "Minimum phi"}; o2::framework::Configurable phiMax{"phiMax", 1.f * o2::constants::math::TwoPI, "Maximum phi"}; // track selection masks - o2::framework::Configurable maskLowMomentum{"maskLowMomentum", 2u, "Bitmask for selections below momentum threshold"}; - o2::framework::Configurable maskHighMomentum{"maskHighMomentum", 1u, "Bitmask for selections above momentum threshold"}; + o2::framework::Configurable maskLowMomentum{"maskLowMomentum", 0x2u, "Bitmask for selections below momentum threshold"}; + o2::framework::Configurable maskHighMomentum{"maskHighMomentum", 0x1u, "Bitmask for selections above momentum threshold"}; // momentum threshold for PID usage o2::framework::Configurable pidThres{"pidThres", 1.2f, "Momentum threshold for using TPCTOF/TOF pid for tracks with large momentum (GeV/c)"}; }; @@ -615,7 +616,87 @@ class TrackBuilder bool mProduceHeliumPids = false; }; +struct TrackBuilderDerivedToDerivedProducts : o2::framework::ProducesGroup { + o2::framework::Produces producedTracks; + o2::framework::Produces producedTrackMasks; +}; + +struct ConfTrackTablesDerivedToDerived : o2::framework::ConfigurableGroup { + std::string prefix = std::string("TrackTables"); + o2::framework::Configurable limitTrack1{"limitTrack1", 1, "At least this many tracks of type 1 need to be in the collision"}; + o2::framework::Configurable limitTrack2{"limitTrack2", 0, "At least this many tracks of type 2 need to be in the collision"}; +}; + +class TrackBuilderDerivedToDerived +{ + public: + TrackBuilderDerivedToDerived() = default; + ~TrackBuilderDerivedToDerived() = default; + + template + void init(T& config) + { + mLimitTrack1 = config.limitTrack1.value; + mLimitTrack2 = config.limitTrack2.value; + } + + template + bool collisionHasTooFewTracks(T1& col, T2& /*trackTable*/, T3& partitionTrack1, T4& partitionTrack2, T5& cache) + { + auto trackSlice1 = partitionTrack1->sliceByCached(o2::aod::femtobase::stored::fColId, col.globalIndex(), cache); + auto trackSlice2 = partitionTrack2->sliceByCached(o2::aod::femtobase::stored::fColId, col.globalIndex(), cache); + if (trackSlice1.size() >= mLimitTrack1 && trackSlice2.size() >= mLimitTrack2) { + return false; + } + return true; + } + + template + void processTracks(T1& col, T2& /*trackTable*/, T3& partitionTrack1, T4& partitionTrack2, T5& indexMap, T6& cache, T7& newTrackTable, T8& newCollisionTable) + { + auto trackSlice1 = partitionTrack1->sliceByCached(o2::aod::femtobase::stored::fColId, col.globalIndex(), cache); + auto trackSlice2 = partitionTrack2->sliceByCached(o2::aod::femtobase::stored::fColId, col.globalIndex(), cache); + + for (auto const& track : trackSlice1) { + this->fillTrack(track, newTrackTable, newCollisionTable, indexMap); + } + for (auto const& track : trackSlice2) { + this->fillTrack(track, newTrackTable, newCollisionTable, indexMap); + } + } + + template + void fillTrack(T1 const& track, T2& trackProducts, T3& collisionProducts, T4& indexMap) + { + trackProducts.producedTracks(collisionProducts.producedCollision.lastIndex(), + track.signedPt(), + track.eta(), + track.phi()); + trackProducts.producedTrackMasks(track.trackMask()); + indexMap.emplace(track.globalIndex(), trackProducts.producedTracks.lastIndex()); + } + + template + int64_t getDaughterIndex(const T1& daughter, T2& trackProducts, T3& collisionProducts, T4& indexMap) + { + auto result = utils::getIndex(daughter.globalIndex(), indexMap); + if (result) { + return result.value(); + } else { + this->fillTrack(daughter, trackProducts, collisionProducts, indexMap); + int64_t idx = trackProducts.producedTracks.lastIndex(); + indexMap.emplace(daughter.globalIndex(), idx); + return idx; + } + } + + private: + int mLimitTrack1 = 0; + int mLimitTrack2 = 0; +}; + } // namespace trackbuilder +// } // namespace o2::analysis::femto #endif // PWGCF_FEMTO_CORE_TRACKBUILDER_H_ diff --git a/PWGCF/Femto/Core/trackHistManager.h b/PWGCF/Femto/Core/trackHistManager.h index f77bf9a029f..3d3bd8ac6bb 100644 --- a/PWGCF/Femto/Core/trackHistManager.h +++ b/PWGCF/Femto/Core/trackHistManager.h @@ -413,10 +413,10 @@ class TrackHistManager /// Destructor virtual ~TrackHistManager() = default; - void init(o2::framework::HistogramRegistry* registry, std::map> Specs, float charge = 1, int momentumTypeForPid = 0) + void init(o2::framework::HistogramRegistry* registry, std::map> Specs, int absCharge = 1, int momentumTypeForPid = 0) { mHistogramRegistry = registry; - mAbsCharge = std::fabs(charge); // stored absolute charge of the track to scale the momentum in case of Z!=1 (case only for He3) + mAbsCharge = absCharge; // stored absolute charge of the track to scale the momentum in case of Z!=1 (case only for He3) if constexpr (isFlagSet(mode, modes::Mode::kAnalysis)) { std::string analysisDir = std::string(prefix) + std::string(AnalysisDir); diff --git a/PWGCF/Femto/Core/twoTrackResonanceBuilder.h b/PWGCF/Femto/Core/twoTrackResonanceBuilder.h index e9bbeb0c245..69477f86666 100644 --- a/PWGCF/Femto/Core/twoTrackResonanceBuilder.h +++ b/PWGCF/Femto/Core/twoTrackResonanceBuilder.h @@ -127,22 +127,22 @@ struct ConfKstar0Bits : o2::framework::ConfigurableGroup { #undef TWOTRACKRESONANCE_KAONPID_BITS #undef TWOTRACKRESONANCE_PIONPID_BITS -#define TWOTRACKRESONANCE_DEFAULT_SELECTION(defaultPdgCode, defaultMassMin, defaultMassMax) \ - o2::framework::Configurable pdgCode{"pdgCode", defaultPdgCode, "Resonance PDG code"}; \ - o2::framework::Configurable ptMin{"ptMin", 0.f, "Minimum pT"}; \ - o2::framework::Configurable ptMax{"ptMax", 6.f, "Maximum pT"}; \ - o2::framework::Configurable etaMin{"etaMin", -0.9f, "Minimum eta"}; \ - o2::framework::Configurable etaMax{"etaMax", 0.9f, "Maximum eta"}; \ - o2::framework::Configurable phiMin{"phiMin", 0.f, "Minimum phi"}; \ - o2::framework::Configurable phiMax{"phiMax", 1.f * o2::constants::math::TwoPI, "Maximum phi"}; \ - o2::framework::Configurable massMin{"massMin", defaultMassMin, "Minimum invariant mass for Resonance"}; \ - o2::framework::Configurable massMax{"massMax", defaultMassMax, "Maximum invariant mass for Resonance"}; \ - o2::framework::Configurable posDauBitForThres{"posDauBitForThres", 32u, "Bit marking momentum threshold for positive daughter"}; \ - o2::framework::Configurable posDauMaskBelowThres{"posDauMaskBelowThres", 16u, "Bitmask for resonance selection"}; \ - o2::framework::Configurable posDauMaskAboveThres{"posDauMaskAboveThres", 8u, "Bitmask for resonance selection"}; \ - o2::framework::Configurable negDauBitForThres{"negDauBitForThres", 4u, "Bit marking resonance selection for negative daughter"}; \ - o2::framework::Configurable negDauMaskBelowThres{"negDauMaskBelowThres", 2u, "Bitmask for resonance selection"}; \ - o2::framework::Configurable negDauMaskAboveThres{"negDauMaskAboveThres", 1u, "Bitmask for resonance selection"}; +#define TWOTRACKRESONANCE_DEFAULT_SELECTION(defaultPdgCode, defaultMassMin, defaultMassMax) \ + o2::framework::Configurable pdgCode{"pdgCode", defaultPdgCode, "Resonance PDG code"}; \ + o2::framework::Configurable ptMin{"ptMin", 0.f, "Minimum pT"}; \ + o2::framework::Configurable ptMax{"ptMax", 6.f, "Maximum pT"}; \ + o2::framework::Configurable etaMin{"etaMin", -0.9f, "Minimum eta"}; \ + o2::framework::Configurable etaMax{"etaMax", 0.9f, "Maximum eta"}; \ + o2::framework::Configurable phiMin{"phiMin", 0.f, "Minimum phi"}; \ + o2::framework::Configurable phiMax{"phiMax", 1.f * o2::constants::math::TwoPI, "Maximum phi"}; \ + o2::framework::Configurable massMin{"massMin", defaultMassMin, "Minimum invariant mass for Resonance"}; \ + o2::framework::Configurable massMax{"massMax", defaultMassMax, "Maximum invariant mass for Resonance"}; \ + o2::framework::Configurable posDauBitForThres{"posDauBitForThres", 0x20u, "Bit marking momentum threshold for positive daughter"}; \ + o2::framework::Configurable posDauMaskBelowThres{"posDauMaskBelowThres", 0x10u, "Bitmask for positive daughter below threshold"}; \ + o2::framework::Configurable posDauMaskAboveThres{"posDauMaskAboveThres", 0x8u, "Bitmask for positive daughter above threshold"}; \ + o2::framework::Configurable negDauBitForThres{"negDauBitForThres", 0x4u, "Bit marking momentum threshold for negative daughter"}; \ + o2::framework::Configurable negDauMaskBelowThres{"negDauMaskBelowThres", 0x2u, "Bitmask for negative daughter below threshold"}; \ + o2::framework::Configurable negDauMaskAboveThres{"negDauMaskAboveThres", 0x1u, "Bitmask for negative daughter above threshold"}; struct ConfPhiSelection : o2::framework::ConfigurableGroup { std::string prefix = std::string("PhiSelection"); @@ -507,6 +507,7 @@ class TwoTrackResonanceBuilder if (!mFillAnyTable) { return; } + // combinations object ? for (auto const& positiveTrack : groupPositiveTracks) { for (auto const& negativeTrack : groupNegativeTracks) { this->fillResonance(collisionProducts, trackProducts, resonanceProducts, positiveTrack, negativeTrack, trackBuilder, indexMap); diff --git a/PWGCF/Femto/Core/v0Builder.h b/PWGCF/Femto/Core/v0Builder.h index 8f1faf319a2..305759070c2 100644 --- a/PWGCF/Femto/Core/v0Builder.h +++ b/PWGCF/Femto/Core/v0Builder.h @@ -110,7 +110,7 @@ template struct ConfLambdaSelection : o2::framework::ConfigurableGroup { std::string prefix = Prefix; V0_DEFAULT_SELECTIONS(1.0, 1.2, 3122) - o2::framework::Configurable sign{"sign", 1, "Sign of the Lambda (+1 for Lambda and -1 for Antilambda"}; + o2::framework::Configurable sign{"sign", 1, "Sign of the Lambda (+1: Lambda; -1: Antilambda; 0: both)"}; }; // base selection for analysis task for k0short @@ -123,9 +123,13 @@ struct ConfK0shortSelection : o2::framework::ConfigurableGroup { #undef V0_DEFAULT_SELECTIONS constexpr const char PrefixLambdaSelection1[] = "LambdaSelection1"; +constexpr const char PrefixLambdaSelection2[] = "LambdaSelection2"; using ConfLambdaSelection1 = ConfLambdaSelection; +using ConfLambdaSelection2 = ConfLambdaSelection; constexpr const char PrefixK0shortSelection1[] = "K0shortSelection1"; +constexpr const char PrefixK0shortSelection2[] = "K0shortSelection1"; using ConfK0shortSelection1 = ConfK0shortSelection; +using ConfK0shortSelection2 = ConfK0shortSelection; /// The different selections for v0s enum V0Seles { @@ -466,6 +470,106 @@ class V0Builder bool mProduceK0shortMasks = false; bool mProduceK0shortExtras = false; }; + +struct ConfV0TablesDerivedToDerived : o2::framework::ConfigurableGroup { + std::string prefix = std::string("V0Tables"); + o2::framework::Configurable limitLambda{"limitLambda", 1, "At least this many lambdas need to be in the collision"}; + o2::framework::Configurable limitK0short{"limitK0short", 0, "At least this many k0short need to be in the collision"}; +}; + +struct V0BuilderDerivedToDerivedProducts : o2::framework::ProducesGroup { + o2::framework::Produces producedLambdas; + o2::framework::Produces producedLambdaMasks; + o2::framework::Produces producedK0shorts; + o2::framework::Produces producedK0shortMasks; +}; + +class V0BuilderDerivedToDerived +{ + public: + V0BuilderDerivedToDerived() = default; + ~V0BuilderDerivedToDerived() = default; + + template + void init(T& config) + { + mLimitLambda = config.limitLambda.value; + mLimitK0short = config.limitK0short.value; + } + + template + bool collisionHasTooFewLambdas(T1& col, T2& /*lambdaTable*/, T3& partitionLambda, T4& cache) + { + auto lambdaSlice = partitionLambda->sliceByCached(o2::aod::femtobase::stored::fColId, col.globalIndex(), cache); + if (lambdaSlice.size() >= mLimitLambda) { + return false; + } + return true; + } + + template + bool collisionHasTooFewK0shorts(T1& col, T2& /*k0shortTable*/, T3& partitionK0short, T4& cache) + { + auto k0shortSlice = partitionK0short->sliceByCached(o2::aod::femtobase::stored::fColId, col.globalIndex(), cache); + if (k0shortSlice.size() >= mLimitK0short) { + return false; + } + return true; + } + + template + void processLambdas(T1& col, T2& /*lambdaTable*/, T3& /*oldTrackTable*/, T4& partitionLambda, T5& trackBuilder, T6& indexMap, T7& cache, T8& newLambdaTable, T9& newTrackTable, T10& newCollisionTable) + { + auto lambdaSlice = partitionLambda->sliceByCached(o2::aod::femtobase::stored::fColId, col.globalIndex(), cache); + + for (auto const& lambda : lambdaSlice) { + + auto posDaughter = lambda.template posDau_as(); + auto negDaughter = lambda.template negDau_as(); + + int posDaughterIndex = trackBuilder.getDaughterIndex(posDaughter, newTrackTable, newCollisionTable, indexMap); + int negDaughterIndex = trackBuilder.getDaughterIndex(negDaughter, newTrackTable, newCollisionTable, indexMap); + + newLambdaTable.producedLambdas(newCollisionTable.producedCollision.lastIndex(), + lambda.signedPt(), + lambda.eta(), + lambda.phi(), + lambda.mass(), + posDaughterIndex, + negDaughterIndex); + newLambdaTable.producedLambdaMasks(lambda.mask()); + } + } + + template + void processK0shorts(T1& col, T2& /*k0shortTable*/, T3& /*oldTrackTable*/, T4& partitionK0short, T5& trackBuilder, T6& indexMap, T7& cache, T8& newK0shortTable, T9& newTrackTable, T10& newCollisionTable) + { + auto k0shortSlice = partitionK0short->sliceByCached(o2::aod::femtobase::stored::fColId, col.globalIndex(), cache); + + for (auto const& k0short : k0shortSlice) { + + auto posDaughter = k0short.template posDau_as(); + auto negDaughter = k0short.template negDau_as(); + + int posDaughterIndex = trackBuilder.getDaughterIndex(posDaughter, newTrackTable, newCollisionTable, indexMap); + int negDaughterIndex = trackBuilder.getDaughterIndex(negDaughter, newTrackTable, newCollisionTable, indexMap); + + newK0shortTable.producedK0shorts(newCollisionTable.producedCollision.lastIndex(), + k0short.pt(), + k0short.eta(), + k0short.phi(), + k0short.mass(), + posDaughterIndex, + negDaughterIndex); + newK0shortTable.producedK0shortMasks(k0short.mask()); + } + } + + private: + int mLimitLambda = 0; + int mLimitK0short = 0; +}; + } // namespace v0builder } // namespace o2::analysis::femto #endif // PWGCF_FEMTO_CORE_V0BUILDER_H_ diff --git a/PWGCF/Femto/DataModel/FemtoTables.h b/PWGCF/Femto/DataModel/FemtoTables.h index 0756e3a91e1..2d288f13cbb 100644 --- a/PWGCF/Femto/DataModel/FemtoTables.h +++ b/PWGCF/Femto/DataModel/FemtoTables.h @@ -42,9 +42,9 @@ DECLARE_SOA_COLUMN(PosY, posY, float); //! y coordinate of vertex DECLARE_SOA_COLUMN(PosZ, posZ, float); //! z coordinate of vertex DECLARE_SOA_COLUMN(Mult, mult, float); //! Multiplicity estimator set by producer DECLARE_SOA_COLUMN(Cent, cent, float); //! Centrality (~= multiplicity percentile) estimator set by producer -DECLARE_SOA_COLUMN(MagField, magField, float); //! Magnetic field of the event +DECLARE_SOA_COLUMN(MagField, magField, int8_t); //! Magnetic field in kG (5 kG at normal configuration and 2kG in low B field configuration) DECLARE_SOA_COLUMN(Sphericity, sphericity, float); //! Sphericity of the event -DECLARE_SOA_COLUMN(Qn, qn, float); //! qn bins for dividing events +DECLARE_SOA_COLUMN(Qn, qn, float); //! qn bins for dividing eventsfemtab } // namespace femtocollisions // table for basic collision information @@ -53,14 +53,20 @@ DECLARE_SOA_TABLE_STAGED_VERSIONED(FCols_001, "FCOL", 1, //! femto collisions femtocollisions::PosZ, femtocollisions::Mult, femtocollisions::Cent, - femtocollisions::Sphericity, femtocollisions::MagField); using FCols = FCols_001; +using StoredFCols = StoredFCols_001; +using FCol = FCols::iterator; // needed so we can define the index column further down properly // table for collisions selections DECLARE_SOA_TABLE_STAGED_VERSIONED(FColMasks_001, "FCOLMASK", 1, //! track masks femtocollisions::CollisionMask); using FColMasks = FColMasks_001; +using StoredFColMasks = StoredFColMasks_001; + +DECLARE_SOA_TABLE_STAGED_VERSIONED(FColSphericities_001, "FCOLSPHERICITY", 1, //! sphericity + femtocollisions::Sphericity); +using FColSphericities = FColSphericities_001; // table for qn values DECLARE_SOA_TABLE_STAGED_VERSIONED(FColQns_001, "FCOLQN", 1, //! qn vector @@ -95,13 +101,13 @@ namespace femtobase namespace stored { // static columns -DECLARE_SOA_INDEX_COLUMN(Collision, collision); //! collision index -DECLARE_SOA_COLUMN(SignedPt, signedPt, float); //! signed pt -DECLARE_SOA_COLUMN(Pt, pt, float); //! pt -DECLARE_SOA_COLUMN(Eta, eta, float); //! eta -DECLARE_SOA_COLUMN(Phi, phi, float); //! phi -DECLARE_SOA_COLUMN(Mass, mass, float); //! mass of particle -DECLARE_SOA_COLUMN(MassAnti, massAnti, float); //! mass of antiparticle +DECLARE_SOA_INDEX_COLUMN(FCol, fCol); //! collision index of femto collision table +DECLARE_SOA_COLUMN(SignedPt, signedPt, float); //! signed pt +DECLARE_SOA_COLUMN(Pt, pt, float); //! pt +DECLARE_SOA_COLUMN(Eta, eta, float); //! eta +DECLARE_SOA_COLUMN(Phi, phi, float); //! phi +DECLARE_SOA_COLUMN(Mass, mass, float); //! mass of particle +DECLARE_SOA_COLUMN(MassAnti, massAnti, float); //! mass of antiparticle } // namespace stored namespace dynamic @@ -221,23 +227,25 @@ DECLARE_SOA_DYNAMIC_COLUMN(TpctofNSigmaHe, tpctofNSigmaHe, [](float tpc, float t // table for basic track information DECLARE_SOA_TABLE_STAGED_VERSIONED(FTracks_001, "FTRACK", 1, //! femto tracks o2::soa::Index<>, - femtobase::stored::CollisionId, + femtobase::stored::FColId, femtobase::stored::SignedPt, femtobase::stored::Eta, femtobase::stored::Phi, femtobase::dynamic::Sign, femtobase::dynamic::Pt, femtobase::dynamic::P, - femtobase::dynamic::Px, - femtobase::dynamic::Py, + femtobase::dynamic::Px, + femtobase::dynamic::Py, femtobase::dynamic::Pz, femtobase::dynamic::Theta); using FTracks = FTracks_001; +using StoredFTracks = StoredFTracks_001; // table for track selections and PID selections DECLARE_SOA_TABLE_STAGED_VERSIONED(FTrackMasks_001, "FTRACKMASK", 1, //! track masks femtotracks::TrackMask); using FTrackMasks = FTrackMasks_001; +using StoredFTrackMasks = StoredFTrackMasks_001; // table for track DCA DECLARE_SOA_TABLE_STAGED_VERSIONED(FTrackDcas_001, "FTRACKDCAS", 1, //! track dcas @@ -329,7 +337,7 @@ DECLARE_SOA_INDEX_COLUMN_FULL(NegDau, negDau, int32_t, FTracks, "_NegDau"); //! // table for phis DECLARE_SOA_TABLE_STAGED_VERSIONED(FPhis_001, "FPHI", 1, //! femto phis o2::soa::Index<>, - femtobase::stored::CollisionId, + femtobase::stored::FColId, femtobase::stored::Pt, femtobase::stored::Eta, femtobase::stored::Phi, @@ -337,8 +345,8 @@ DECLARE_SOA_TABLE_STAGED_VERSIONED(FPhis_001, "FPHI", 1, //! femto phis femtotwotrackresonances::PosDauId, femtotwotrackresonances::NegDauId, femtobase::dynamic::P, - femtobase::dynamic::Px, - femtobase::dynamic::Py, + femtobase::dynamic::Px, + femtobase::dynamic::Py, femtobase::dynamic::Pz, femtobase::dynamic::Theta); using FPhis = FPhis_001; @@ -349,7 +357,7 @@ using FPhiMasks = FPhiMasks_001; // table for kstars DECLARE_SOA_TABLE_STAGED_VERSIONED(FKstar0s_001, "FKSTAR0", 1, //! femto k0star o2::soa::Index<>, - femtobase::stored::CollisionId, + femtobase::stored::FColId, femtobase::stored::SignedPt, //! +1 for k0star and -1 for k0starbar femtobase::stored::Eta, femtobase::stored::Phi, @@ -359,8 +367,8 @@ DECLARE_SOA_TABLE_STAGED_VERSIONED(FKstar0s_001, "FKSTAR0", 1, //! femto k0star femtobase::dynamic::Sign, femtobase::dynamic::Pt, femtobase::dynamic::P, - femtobase::dynamic::Px, - femtobase::dynamic::Py, + femtobase::dynamic::Px, + femtobase::dynamic::Py, femtobase::dynamic::Pz, femtobase::dynamic::Theta); using FKstar0s = FKstar0s_001; @@ -370,7 +378,7 @@ using FKstar0Masks = FKstar0Masks_001; DECLARE_SOA_TABLE_STAGED_VERSIONED(FRho0s_001, "FRHO0", 1, //! femto rho0s o2::soa::Index<>, - femtobase::stored::CollisionId, + femtobase::stored::FColId, femtobase::stored::Pt, femtobase::stored::Eta, femtobase::stored::Phi, @@ -378,8 +386,8 @@ DECLARE_SOA_TABLE_STAGED_VERSIONED(FRho0s_001, "FRHO0", 1, //! femto rho0s femtotwotrackresonances::PosDauId, femtotwotrackresonances::NegDauId, femtobase::dynamic::P, - femtobase::dynamic::Px, - femtobase::dynamic::Py, + femtobase::dynamic::Px, + femtobase::dynamic::Py, femtobase::dynamic::Pz, femtobase::dynamic::Theta); using FRho0s = FRho0s_001; @@ -416,8 +424,8 @@ DECLARE_SOA_INDEX_COLUMN_FULL(NegDau, negDau, int32_t, FTracks, "_NegDau"); //! // table for basic lambda information DECLARE_SOA_TABLE_STAGED_VERSIONED(FLambdas_001, "FLAMBDA", 1, //! femto lambdas o2::soa::Index<>, - femtobase::stored::CollisionId, // use sign to differentiate between lambda (+1) and antilambda (-1) - femtobase::stored::SignedPt, + femtobase::stored::FColId, + femtobase::stored::SignedPt, // use sign to differentiate between lambda (+1) and antilambda (-1) femtobase::stored::Eta, femtobase::stored::Phi, femtobase::stored::Mass, // mass of the lambda/antilambda depending on the sign of the pt @@ -426,15 +434,17 @@ DECLARE_SOA_TABLE_STAGED_VERSIONED(FLambdas_001, "FLAMBDA", 1, //! femto lambdas femtobase::dynamic::Sign, femtobase::dynamic::Pt, femtobase::dynamic::P, - femtobase::dynamic::Px, - femtobase::dynamic::Py, + femtobase::dynamic::Px, + femtobase::dynamic::Py, femtobase::dynamic::Pz, femtobase::dynamic::Theta); using FLambdas = FLambdas_001; +using StoredFLambdas = StoredFLambdas_001; DECLARE_SOA_TABLE_STAGED_VERSIONED(FLambdaMasks_001, "FLAMBDAMASK", 1, //! lambda masks femtov0s::Mask); using FLambdaMasks = FLambdaMasks_001; +using StoredFLambdaMasks = StoredFLambdaMasks_001; DECLARE_SOA_TABLE_STAGED_VERSIONED(FLambdaExtras_001, "FLAMBDAEXTRA", 1, //! lambda extra information femtobase::stored::MassAnti, // put mass of antiparticle, i.e. antilambda mass for lambdas and vice versa @@ -452,7 +462,7 @@ using FLambdaExtras = FLambdaExtras_001; // table for basic k0short information DECLARE_SOA_TABLE_STAGED_VERSIONED(FK0shorts_001, "FK0SHORT", 1, //! femto k0shorts o2::soa::Index<>, - femtobase::stored::CollisionId, + femtobase::stored::FColId, femtobase::stored::Pt, femtobase::stored::Eta, femtobase::stored::Phi, @@ -460,15 +470,17 @@ DECLARE_SOA_TABLE_STAGED_VERSIONED(FK0shorts_001, "FK0SHORT", 1, //! femto k0sho femtov0s::PosDauId, femtov0s::NegDauId, femtobase::dynamic::P, - femtobase::dynamic::Px, - femtobase::dynamic::Py, + femtobase::dynamic::Px, + femtobase::dynamic::Py, femtobase::dynamic::Pz, femtobase::dynamic::Theta); using FK0shorts = FK0shorts_001; +using StoredFK0shorts = StoredFK0shorts_001; DECLARE_SOA_TABLE_STAGED_VERSIONED(FK0shortMasks_001, "FK0SHORTMASK", 1, //! k0short masks femtov0s::Mask); using FK0shortMasks = FK0shortMasks_001; +using StoredFK0shortMasks = StoredFK0shortMasks_001; DECLARE_SOA_TABLE_STAGED_VERSIONED(FK0shortExtras_001, "FK0SHORTEXTRA", 1, //! k0short extra information femtov0s::MassLambda, @@ -504,7 +516,7 @@ DECLARE_SOA_INDEX_COLUMN_FULL(ChaDau, chaDau, int32_t, FTracks, "_ChaDau"); //! // table for basic sigma minus information DECLARE_SOA_TABLE_STAGED_VERSIONED(FSigmas_001, "FSIGMA", 1, o2::soa::Index<>, - femtobase::stored::CollisionId, // use sign to differentiate between sigma minus (-1) and anti sigma minus (+1) + femtobase::stored::FColId, // use sign to differentiate between sigma minus (-1) and anti sigma minus (+1) femtobase::stored::SignedPt, femtobase::stored::Eta, femtobase::stored::Phi, @@ -513,8 +525,8 @@ DECLARE_SOA_TABLE_STAGED_VERSIONED(FSigmas_001, "FSIGMA", 1, femtobase::dynamic::Sign, femtobase::dynamic::Pt, femtobase::dynamic::P, - femtobase::dynamic::Px, - femtobase::dynamic::Py, + femtobase::dynamic::Px, + femtobase::dynamic::Py, femtobase::dynamic::Pz, femtobase::dynamic::Theta); using FSigmas = FSigmas_001; @@ -558,7 +570,7 @@ DECLARE_SOA_INDEX_COLUMN_FULL(Bachelor, bachelor, int32_t, FTracks, "_Bachelor") DECLARE_SOA_TABLE_STAGED_VERSIONED(FXis_001, "FXI", 1, //! femto xis o2::soa::Index<>, - femtobase::stored::CollisionId, + femtobase::stored::FColId, femtobase::stored::SignedPt, femtobase::stored::Eta, femtobase::stored::Phi, @@ -569,8 +581,8 @@ DECLARE_SOA_TABLE_STAGED_VERSIONED(FXis_001, "FXI", 1, //! femto xis femtobase::dynamic::Sign, femtobase::dynamic::Pt, femtobase::dynamic::P, - femtobase::dynamic::Px, - femtobase::dynamic::Py, + femtobase::dynamic::Px, + femtobase::dynamic::Py, femtobase::dynamic::Pz, femtobase::dynamic::Theta); using FXis = FXis_001; @@ -592,7 +604,7 @@ using FXiExtras = FXiExtras_001; DECLARE_SOA_TABLE_STAGED_VERSIONED(FOmegas_001, "FOMEGA", 1, //! femto omegas o2::soa::Index<>, - femtobase::stored::CollisionId, + femtobase::stored::FColId, femtobase::stored::SignedPt, femtobase::stored::Eta, femtobase::stored::Phi, @@ -603,8 +615,8 @@ DECLARE_SOA_TABLE_STAGED_VERSIONED(FOmegas_001, "FOMEGA", 1, //! femto omegas femtobase::dynamic::Sign, femtobase::dynamic::Pt, femtobase::dynamic::P, - femtobase::dynamic::Px, - femtobase::dynamic::Py, + femtobase::dynamic::Px, + femtobase::dynamic::Py, femtobase::dynamic::Pz, femtobase::dynamic::Theta); using FOmegas = FOmegas_001; diff --git a/PWGCF/Femto/TableProducer/CMakeLists.txt b/PWGCF/Femto/TableProducer/CMakeLists.txt index 81829ec83a1..fc9a5f82013 100644 --- a/PWGCF/Femto/TableProducer/CMakeLists.txt +++ b/PWGCF/Femto/TableProducer/CMakeLists.txt @@ -13,3 +13,8 @@ o2physics_add_dpl_workflow(femto-producer SOURCES femtoProducer.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::EventFilteringUtils COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(femto-producer-derived-to-derived + SOURCES ./femtoProducerDerivedToDerived.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore + COMPONENT_NAME Analysis) diff --git a/PWGCF/Femto/TableProducer/femtoProducer.cxx b/PWGCF/Femto/TableProducer/femtoProducer.cxx index 54b42aa8693..207309a5781 100644 --- a/PWGCF/Femto/TableProducer/femtoProducer.cxx +++ b/PWGCF/Femto/TableProducer/femtoProducer.cxx @@ -164,7 +164,7 @@ struct FemtoProducer { // data members int runNumber = -1; - float magField = 0.f; + int magField = 0.f; Service ccdb; /// Accessing the CCDB std::unordered_map indexMapTracks; // for mapping tracks to lambdas, cascades and resonances @@ -179,7 +179,7 @@ struct FemtoProducer { LOGF(fatal, "GRP object not found for timestamp %llu", timestamp); return; } - magField = 0.1 * grpo->getNominalL3Field(); // get magnetic field in tesla + magField = static_cast(grpo->getNominalL3Field()); // get magnetic field in kG runNumber = bc.runNumber(); }; diff --git a/PWGCF/Femto/TableProducer/femtoProducerDerivedToDerived.cxx b/PWGCF/Femto/TableProducer/femtoProducerDerivedToDerived.cxx new file mode 100644 index 00000000000..13893bf3f5a --- /dev/null +++ b/PWGCF/Femto/TableProducer/femtoProducerDerivedToDerived.cxx @@ -0,0 +1,146 @@ +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file femtoProducerDerivedToDerived.cxx +/// \brief Tasks that produces the femto tables from derived data +/// \author Anton Riedel, TU München, anton.riedel@tum.de + +#include "PWGCF/Femto/Core/cascadeBuilder.h" +#include "PWGCF/Femto/Core/collisionBuilder.h" +#include "PWGCF/Femto/Core/kinkBuilder.h" +#include "PWGCF/Femto/Core/modes.h" +#include "PWGCF/Femto/Core/partitions.h" +#include "PWGCF/Femto/Core/trackBuilder.h" +#include "PWGCF/Femto/Core/twoTrackResonanceBuilder.h" +#include "PWGCF/Femto/Core/v0Builder.h" + +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisHelpers.h" +#include "Framework/AnalysisTask.h" +#include "Framework/Configurable.h" +#include "Framework/Expressions.h" +#include "Framework/InitContext.h" +#include "Framework/runDataProcessing.h" + +#include +#include +#include + +using namespace o2::aod; +using namespace o2::soa; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::analysis::femto; + +struct FemtoProducerDerivedToDerived { + + // setup tables + using Collisions = Join; + using Collision = Collisions::iterator; + + using FilteredCollisions = o2::soa::Filtered; + using FilteredCollision = FilteredCollisions::iterator; + + using Tracks = o2::soa::Join; + using Lambdas = o2::soa::Join; + using K0shorts = o2::soa::Join; + + SliceCache cache; + + // collision builder + collisionbuilder::ConfCollisionSelection collisionSelection; + Filter collisionFilter = MAKE_COLLISION_FILTER(collisionSelection); + collisionbuilder::CollisionBuilderDerivedToDerivedProducts collisionBuilderProducts; + collisionbuilder::CollisionBuilderDerivedToDerived collisionBuilder; + + // track builder + trackbuilder::TrackBuilderDerivedToDerived trackBuilder; + trackbuilder::TrackBuilderDerivedToDerivedProducts trackBuilderProducts; + trackbuilder::ConfTrackTablesDerivedToDerived confTrackBuilder; + trackbuilder::ConfTrackSelection1 trackSelections1; + trackbuilder::ConfTrackSelection2 trackSelections2; + + Partition trackPartition1 = MAKE_TRACK_PARTITION(trackSelections1); + Partition trackPartition2 = MAKE_TRACK_PARTITION(trackSelections2); + Preslice perColTracks = femtobase::stored::fColId; + + // v0 builder + v0builder::V0BuilderDerivedToDerived v0Builder; + v0builder::V0BuilderDerivedToDerivedProducts v0BuilderProducts; + v0builder::ConfV0TablesDerivedToDerived confV0Builder; + + v0builder::ConfLambdaSelection1 lambdaSelection1; + Partition lambdaPartition = MAKE_LAMBDA_PARTITION(lambdaSelection1); + Preslice perColLambdas = femtobase::stored::fColId; + + v0builder::ConfK0shortSelection1 k0shortSelection1; + Partition k0shortPartition = MAKE_K0SHORT_PARTITION(k0shortSelection1); + Preslice perColK0shorts = femtobase::stored::fColId; + + std::unordered_map + indexMapTracks; // for mapping tracks to lambdas, cascades and resonances + + void init(InitContext& /*context*/) + { + trackBuilder.init(confTrackBuilder); + v0Builder.init(confV0Builder); + + if ((doprocessTracks + doprocessLambdas + doprocessK0shorts) > 1) { + LOG(fatal) << "Only one proccess function can be activated"; + } + } + + // proccess functions + void processTracks(FilteredCollision const& col, Tracks const& tracks) + { + if (trackBuilder.collisionHasTooFewTracks(col, tracks, trackPartition1, trackPartition2, cache)) { + return; + } + indexMapTracks.clear(); + collisionBuilder.processCollision(col, collisionBuilderProducts); + trackBuilder.processTracks(col, tracks, trackPartition1, trackPartition2, indexMapTracks, cache, trackBuilderProducts, collisionBuilderProducts); + } + PROCESS_SWITCH(FemtoProducerDerivedToDerived, processTracks, "Process tracks", true); + + void processLambdas(FilteredCollision const& col, Tracks const& tracks, Lambdas const& lambdas) + { + if (trackBuilder.collisionHasTooFewTracks(col, tracks, trackPartition1, trackPartition2, cache) && v0Builder.collisionHasTooFewLambdas(col, lambdas, lambdaPartition, cache)) { + return; + } + indexMapTracks.clear(); + if (trackBuilder.collisionHasTooFewTracks(col, tracks, trackPartition1, trackPartition2, cache)) { + collisionBuilder.processCollision(col, collisionBuilderProducts); + trackBuilder.processTracks(col, tracks, trackPartition1, trackPartition2, indexMapTracks, cache, trackBuilderProducts, collisionBuilderProducts); + v0Builder.processLambdas(col, lambdas, tracks, lambdaPartition, trackBuilder, indexMapTracks, cache, v0BuilderProducts, trackBuilderProducts, collisionBuilderProducts); + } + } + PROCESS_SWITCH(FemtoProducerDerivedToDerived, processLambdas, "Process lambdas and tracks", false); + + void processK0shorts(FilteredCollision const& col, Tracks const& tracks, K0shorts const& k0shorts) + { + if (trackBuilder.collisionHasTooFewTracks(col, tracks, trackPartition1, trackPartition2, cache) && v0Builder.collisionHasTooFewK0shorts(col, k0shorts, k0shortPartition, cache)) { + return; + } + indexMapTracks.clear(); + if (trackBuilder.collisionHasTooFewTracks(col, tracks, trackPartition1, trackPartition2, cache)) { + collisionBuilder.processCollision(col, collisionBuilderProducts); + trackBuilder.processTracks(col, tracks, trackPartition1, trackPartition2, indexMapTracks, cache, trackBuilderProducts, collisionBuilderProducts); + v0Builder.processK0shorts(col, k0shorts, tracks, k0shortPartition, trackBuilder, indexMapTracks, cache, v0BuilderProducts, trackBuilderProducts, collisionBuilderProducts); + } + } + PROCESS_SWITCH(FemtoProducerDerivedToDerived, processK0shorts, "Process k0short and tracks", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + WorkflowSpec workflow{adaptAnalysisTask(cfgc)}; + return workflow; +} diff --git a/PWGCF/Femto/Tasks/femtoCascadeQa.cxx b/PWGCF/Femto/Tasks/femtoCascadeQa.cxx index 4d1bd1953d7..984094e065e 100644 --- a/PWGCF/Femto/Tasks/femtoCascadeQa.cxx +++ b/PWGCF/Femto/Tasks/femtoCascadeQa.cxx @@ -46,7 +46,7 @@ using namespace o2::analysis::femto; struct FemtoCascadeQa { // setup tables - using Collisions = Join; + using Collisions = Join; using Collision = Collisions::iterator; using FilteredCollisions = o2::soa::Filtered; @@ -63,11 +63,12 @@ struct FemtoCascadeQa { Filter collisionFilter = MAKE_COLLISION_FILTER(collisionSelection); colhistmanager::CollisionHistManager colHistManager; colhistmanager::ConfCollisionBinning confCollisionBinning; + colhistmanager::ConfCollisionQaBinning confCollisionQaBinning; // setup for xis cascadebuilder::ConfXiSelection confXiSelection; Partition xiPartition = MAKE_CASCADE_PARTITION(confXiSelection); - Preslice preColXis = aod::femtobase::stored::collisionId; + Preslice preColXis = aod::femtobase::stored::fColId; cascadehistmanager::ConfXiBinning confXiBinning; cascadehistmanager::ConfXiQaBinning confXiQaBinning; @@ -83,7 +84,7 @@ struct FemtoCascadeQa { // setup for omegas cascadebuilder::ConfOmegaSelection confOmegaSelection; Partition omegaPartition = MAKE_CASCADE_PARTITION(confOmegaSelection); - Preslice preColOmegas = aod::femtobase::stored::collisionId; + Preslice preColOmegas = aod::femtobase::stored::fColId; cascadehistmanager::ConfOmegaBinning confOmegaBinning; cascadehistmanager::ConfOmegaQaBinning confOmegaQaBinning; @@ -109,7 +110,7 @@ struct FemtoCascadeQa { void init(InitContext&) { // create a map for histogram specs - auto colHistSpec = colhistmanager::makeColHistSpecMap(confCollisionBinning); + auto colHistSpec = colhistmanager::makeColQaHistSpecMap(confCollisionBinning, confCollisionQaBinning); colHistManager.init(&hRegistry, colHistSpec); auto bachelorHistSpec = trackhistmanager::makeTrackQaHistSpecMap(confBachelorBinning, confBachelorQaBinning); @@ -134,7 +135,7 @@ struct FemtoCascadeQa { void processXis(FilteredCollision const& col, Xis const& /*xis*/, Tracks const& tracks) { colHistManager.fill(col); - auto xiSlice = xiPartition->sliceByCached(femtobase::stored::collisionId, col.globalIndex(), cache); + auto xiSlice = xiPartition->sliceByCached(femtobase::stored::fColId, col.globalIndex(), cache); for (auto const& xi : xiSlice) { xiHistManager.fill(xi, tracks); } @@ -144,7 +145,7 @@ struct FemtoCascadeQa { void processOmegas(FilteredCollision const& col, Omegas const& /*omegas*/, Tracks const& tracks) { colHistManager.fill(col); - auto omegaSlice = omegaPartition->sliceByCached(femtobase::stored::collisionId, col.globalIndex(), cache); + auto omegaSlice = omegaPartition->sliceByCached(femtobase::stored::fColId, col.globalIndex(), cache); for (auto const& omega : omegaSlice) { omegaHistManager.fill(omega, tracks); } diff --git a/PWGCF/Femto/Tasks/femtoKinkQa.cxx b/PWGCF/Femto/Tasks/femtoKinkQa.cxx index a416ba5993f..febd696e3fe 100644 --- a/PWGCF/Femto/Tasks/femtoKinkQa.cxx +++ b/PWGCF/Femto/Tasks/femtoKinkQa.cxx @@ -55,7 +55,7 @@ struct FemtoKinkQa { colhistmanager::ConfCollisionBinning confCollisionBinning; // using Collisions = o2::soa::Join; - using Collisions = Join; + using Collisions = Join; using Collision = Collisions::iterator; using FilteredCollisions = o2::soa::Filtered; @@ -71,7 +71,7 @@ struct FemtoKinkQa { kinkbuilder::ConfSigmaSelection1 confSigmaSelection; Partition sigmaPartition = MAKE_SIGMA_PARTITION(confSigmaSelection); - Preslice perColSigmas = aod::femtobase::stored::collisionId; + Preslice perColSigmas = aod::femtobase::stored::fColId; kinkhistmanager::ConfSigmaBinning1 confSigmaBinning; kinkhistmanager::ConfSigmaQaBinning1 confSigmaQaBinning; @@ -103,7 +103,7 @@ struct FemtoKinkQa { void processSigma(FilteredCollision const& col, Sigmas const& /*sigmas*/, Tracks const& tracks) { colHistManager.fill(col); - auto sigmaSlice = sigmaPartition->sliceByCached(femtobase::stored::collisionId, col.globalIndex(), cache); + auto sigmaSlice = sigmaPartition->sliceByCached(femtobase::stored::fColId, col.globalIndex(), cache); for (auto const& sigma : sigmaSlice) { sigmaHistManager.fill(sigma, tracks); } diff --git a/PWGCF/Femto/Tasks/femtoPairTrackCascade.cxx b/PWGCF/Femto/Tasks/femtoPairTrackCascade.cxx index 7621d88fc65..8884a1edc01 100644 --- a/PWGCF/Femto/Tasks/femtoPairTrackCascade.cxx +++ b/PWGCF/Femto/Tasks/femtoPairTrackCascade.cxx @@ -67,7 +67,7 @@ struct FemtoPairTrackCascade { trackbuilder::ConfTrackSelection1 trackSelection; trackhistmanager::ConfTrackBinning1 confTrackBinning; Partition trackPartition = MAKE_TRACK_PARTITION(trackSelection); - Preslice perColTracks = aod::femtobase::stored::collisionId; + Preslice perColTracks = aod::femtobase::stored::fColId; // setup for daughters/bachelor trackhistmanager::ConfCascadePosDauBinning confPosDauBinning; @@ -78,13 +78,13 @@ struct FemtoPairTrackCascade { cascadebuilder::ConfXiSelection xiSelection; cascadehistmanager::ConfXiBinning confXiBinning; Partition xiPartition = MAKE_CASCADE_PARTITION(xiSelection); - Preslice perColXis = aod::femtobase::stored::collisionId; + Preslice perColXis = aod::femtobase::stored::fColId; // setup omegas cascadebuilder::ConfOmegaSelection omegaSelection; cascadehistmanager::ConfOmegaBinning confOmegaBinning; Partition omegaPartition = MAKE_CASCADE_PARTITION(omegaSelection); - Preslice perColOmegas = aod::femtobase::stored::collisionId; + Preslice perColOmegas = aod::femtobase::stored::fColId; // setup pairs pairhistmanager::ConfPairBinning confPairBinning; diff --git a/PWGCF/Femto/Tasks/femtoPairTrackKink.cxx b/PWGCF/Femto/Tasks/femtoPairTrackKink.cxx index b3945633f85..2c1448a6764 100644 --- a/PWGCF/Femto/Tasks/femtoPairTrackKink.cxx +++ b/PWGCF/Femto/Tasks/femtoPairTrackKink.cxx @@ -67,7 +67,7 @@ struct FemtoPairTrackKink { trackbuilder::ConfTrackSelection1 trackSelection; trackhistmanager::ConfTrackBinning1 confTrackBinning; Partition trackPartition = MAKE_TRACK_PARTITION(trackSelection); - Preslice perColTracks = aod::femtobase::stored::collisionId; + Preslice perColTracks = aod::femtobase::stored::fColId; // setup for daughters trackhistmanager::ConfKinkChaDauBinning confChaDauBinning; @@ -76,7 +76,7 @@ struct FemtoPairTrackKink { kinkbuilder::ConfSigmaSelection1 sigmaSelection; kinkhistmanager::ConfSigmaBinning1 confSigmaBinning; Partition sigmaPartition = MAKE_SIGMA_PARTITION(sigmaSelection); - Preslice perColSigmas = aod::femtobase::stored::collisionId; + Preslice perColSigmas = aod::femtobase::stored::fColId; // setup pairs pairhistmanager::ConfPairBinning confPairBinning; diff --git a/PWGCF/Femto/Tasks/femtoPairTrackTrack.cxx b/PWGCF/Femto/Tasks/femtoPairTrackTrack.cxx index b0d7f54baa3..511bd4f8c1c 100644 --- a/PWGCF/Femto/Tasks/femtoPairTrackTrack.cxx +++ b/PWGCF/Femto/Tasks/femtoPairTrackTrack.cxx @@ -66,7 +66,7 @@ struct FemtoPairTrackTrack { Partition trackPartition1 = MAKE_TRACK_PARTITION(trackSelections1); Partition trackPartition2 = MAKE_TRACK_PARTITION(trackSelections2); - Preslice perColReco = aod::femtobase::stored::collisionId; + Preslice perColReco = aod::femtobase::stored::fColId; // setup pairs pairhistmanager::ConfPairBinning confPairBinning; diff --git a/PWGCF/Femto/Tasks/femtoPairTrackTwoTrackResonance.cxx b/PWGCF/Femto/Tasks/femtoPairTrackTwoTrackResonance.cxx index f85cdfa03bb..a9b534c3488 100644 --- a/PWGCF/Femto/Tasks/femtoPairTrackTwoTrackResonance.cxx +++ b/PWGCF/Femto/Tasks/femtoPairTrackTwoTrackResonance.cxx @@ -68,7 +68,7 @@ struct FemtoPairTrackTwoTrackResonance { trackbuilder::ConfTrackSelection1 trackSelection; trackhistmanager::ConfTrackBinning1 confTrackBinning; Partition trackPartition = MAKE_TRACK_PARTITION(trackSelection); - Preslice perColTracks = aod::femtobase::stored::collisionId; + Preslice perColTracks = aod::femtobase::stored::fColId; // setup for daughters trackhistmanager::ConfResonancePosDauBinning confPosDauBinning; @@ -78,19 +78,19 @@ struct FemtoPairTrackTwoTrackResonance { twotrackresonancebuilder::ConfPhiSelection phiSelection; twotrackresonancehistmanager::ConfPhiBinning confPhiBinning; Partition phiPartition = MAKE_RESONANCE_0_PARTITON(phiSelection); - Preslice perColPhis = aod::femtobase::stored::collisionId; + Preslice perColPhis = aod::femtobase::stored::fColId; // setup kstar0 twotrackresonancebuilder::ConfKstar0Selection kstar0Selection; twotrackresonancehistmanager::ConfKstar0Binning confKstar0Binning; Partition kstar0Partition = MAKE_RESONANCE_1_PARTITON(kstar0Selection); - Preslice perColKstar0s = aod::femtobase::stored::collisionId; + Preslice perColKstar0s = aod::femtobase::stored::fColId; // rho0s twotrackresonancebuilder::ConfRho0Selection rho0Selection; twotrackresonancehistmanager::ConfRho0Binning confRho0Binning; Partition rho0Partition = MAKE_RESONANCE_0_PARTITON(rho0Selection); - Preslice perColRho0s = aod::femtobase::stored::collisionId; + Preslice perColRho0s = aod::femtobase::stored::fColId; // setup pairs pairhistmanager::ConfPairBinning confPairBinning; diff --git a/PWGCF/Femto/Tasks/femtoPairTrackV0.cxx b/PWGCF/Femto/Tasks/femtoPairTrackV0.cxx index e72c7f64ac2..6fc0e83060a 100644 --- a/PWGCF/Femto/Tasks/femtoPairTrackV0.cxx +++ b/PWGCF/Femto/Tasks/femtoPairTrackV0.cxx @@ -67,7 +67,7 @@ struct FemtoPairTrackV0 { trackbuilder::ConfTrackSelection1 trackSelection; trackhistmanager::ConfTrackBinning1 confTrackBinning; Partition trackPartition = MAKE_TRACK_PARTITION(trackSelection); - Preslice perColTracks = aod::femtobase::stored::collisionId; + Preslice perColTracks = aod::femtobase::stored::fColId; // setup for daughters trackhistmanager::ConfV0PosDauBinning confPosDauBinning; @@ -77,13 +77,13 @@ struct FemtoPairTrackV0 { v0builder::ConfLambdaSelection1 lambdaSelection; v0histmanager::ConfLambdaBinning1 confLambdaBinning; Partition lambdaPartition = MAKE_LAMBDA_PARTITION(lambdaSelection); - Preslice perColLambdas = aod::femtobase::stored::collisionId; + Preslice perColLambdas = aod::femtobase::stored::fColId; // setup k0shorts v0builder::ConfK0shortSelection1 k0shortSelection; v0histmanager::ConfK0shortBinning1 confK0shortBinning; Partition k0shortPartition = MAKE_K0SHORT_PARTITION(k0shortSelection); - Preslice perColk0shorts = aod::femtobase::stored::collisionId; + Preslice perColk0shorts = aod::femtobase::stored::fColId; // setup pairs pairhistmanager::ConfPairBinning confPairBinning; diff --git a/PWGCF/Femto/Tasks/femtoTrackQa.cxx b/PWGCF/Femto/Tasks/femtoTrackQa.cxx index 6398257a98d..f68141e9349 100644 --- a/PWGCF/Femto/Tasks/femtoTrackQa.cxx +++ b/PWGCF/Femto/Tasks/femtoTrackQa.cxx @@ -43,7 +43,7 @@ using namespace o2::analysis::femto; struct FemtoTrackQa { // setup tables - using Collisions = o2::soa::Join; + using Collisions = o2::soa::Join; using Collision = Collisions::iterator; using FilteredCollisions = o2::soa::Filtered; @@ -57,6 +57,7 @@ struct FemtoTrackQa { collisionbuilder::ConfCollisionSelection collisionSelection; Filter collisionFilter = MAKE_COLLISION_FILTER(collisionSelection); colhistmanager::ConfCollisionBinning confCollisionBinning; + colhistmanager::ConfCollisionQaBinning confCollisionQaBinning; colhistmanager::CollisionHistManager colHistManager; // setup tracks @@ -66,23 +67,23 @@ struct FemtoTrackQa { trackhistmanager::TrackHistManager trackHistManager; Partition trackPartition = MAKE_TRACK_PARTITION(trackSelections); - Preslice perColReco = aod::femtobase::stored::collisionId; + Preslice perColReco = aod::femtobase::stored::fColId; HistogramRegistry hRegistry{"FemtoTrackQA", {}, OutputObjHandlingPolicy::AnalysisObject}; void init(InitContext&) { // create a map for histogram specs - auto colHistSpec = colhistmanager::makeColHistSpecMap(confCollisionBinning); + auto colHistSpec = colhistmanager::makeColQaHistSpecMap(confCollisionBinning, confCollisionQaBinning); colHistManager.init(&hRegistry, colHistSpec); auto trackHistSpec = trackhistmanager::makeTrackQaHistSpecMap(confTrackBinning, confTrackQaBinning); - trackHistManager.init(&hRegistry, trackHistSpec, trackSelections.charge.value, confTrackQaBinning.momentumType.value); + trackHistManager.init(&hRegistry, trackHistSpec, trackSelections.chargeAbs.value, confTrackQaBinning.momentumType.value); }; void process(FilteredCollision const& col, Tracks const& /*tracks*/) { colHistManager.fill(col); - auto trackSlice = trackPartition->sliceByCached(femtobase::stored::collisionId, col.globalIndex(), cache); + auto trackSlice = trackPartition->sliceByCached(femtobase::stored::fColId, col.globalIndex(), cache); for (auto const& track : trackSlice) { trackHistManager.fill(track); } diff --git a/PWGCF/Femto/Tasks/femtoTwotrackresonanceQa.cxx b/PWGCF/Femto/Tasks/femtoTwotrackresonanceQa.cxx index 5e7b6192ae7..ef9121df21a 100644 --- a/PWGCF/Femto/Tasks/femtoTwotrackresonanceQa.cxx +++ b/PWGCF/Femto/Tasks/femtoTwotrackresonanceQa.cxx @@ -44,7 +44,7 @@ using namespace o2::analysis::femto; struct FemtoTwotrackresonanceQa { // setup tables - using Collisions = Join; + using Collisions = Join; using Collision = Collisions::iterator; using FilteredCollisions = o2::soa::Filtered; @@ -62,11 +62,12 @@ struct FemtoTwotrackresonanceQa { Filter collisionFilter = MAKE_COLLISION_FILTER(collisionSelection); colhistmanager::CollisionHistManager colHistManager; colhistmanager::ConfCollisionBinning confCollisionBinning; + colhistmanager::ConfCollisionQaBinning confCollisionQaBinning; // setup for phis twotrackresonancebuilder::ConfPhiSelection confPhiSelection; Partition phiPartition = MAKE_RESONANCE_0_PARTITON(confPhiSelection); - Preslice perColPhis = aod::femtobase::stored::collisionId; + Preslice perColPhis = aod::femtobase::stored::fColId; twotrackresonancehistmanager::ConfPhiBinning confPhiBinning; twotrackresonancehistmanager::TwoTrackResonanceHistManager< @@ -80,7 +81,7 @@ struct FemtoTwotrackresonanceQa { // setup for rho0s twotrackresonancebuilder::ConfRho0Selection confRho0Selection; Partition rho0Partition = MAKE_RESONANCE_0_PARTITON(confRho0Selection); - Preslice perColRhos = aod::femtobase::stored::collisionId; + Preslice perColRhos = aod::femtobase::stored::fColId; twotrackresonancehistmanager::ConfRho0Binning confRho0Binning; twotrackresonancehistmanager::TwoTrackResonanceHistManager< @@ -94,7 +95,7 @@ struct FemtoTwotrackresonanceQa { // setup for kstar0s twotrackresonancebuilder::ConfKstar0Selection confKstar0Selection; Partition kstar0Partition = MAKE_RESONANCE_1_PARTITON(confKstar0Selection); - Preslice perColKstars = aod::femtobase::stored::collisionId; + Preslice perColKstars = aod::femtobase::stored::fColId; twotrackresonancehistmanager::ConfKstar0Binning confKstar0Binning; twotrackresonancehistmanager::TwoTrackResonanceHistManager< @@ -116,7 +117,7 @@ struct FemtoTwotrackresonanceQa { void init(InitContext&) { // create a map for histogram specs - auto colHistSpec = colhistmanager::makeColHistSpecMap(confCollisionBinning); + auto colHistSpec = colhistmanager::makeColQaHistSpecMap(confCollisionBinning, confCollisionQaBinning); colHistManager.init(&hRegistry, colHistSpec); auto posDaughterHistSpec = trackhistmanager::makeTrackQaHistSpecMap(confPosDaughterBinning, confPosDaughterQaBinning); @@ -144,7 +145,7 @@ struct FemtoTwotrackresonanceQa { void processPhis(FilteredCollision const& col, Phis const& /*phis*/, Tracks const& tracks) { colHistManager.fill(col); - auto phiSlice = phiPartition->sliceByCached(femtobase::stored::collisionId, col.globalIndex(), cache); + auto phiSlice = phiPartition->sliceByCached(femtobase::stored::fColId, col.globalIndex(), cache); for (auto const& phi : phiSlice) { phiHistManager.fill(phi, tracks); } @@ -154,7 +155,7 @@ struct FemtoTwotrackresonanceQa { void processRho0s(FilteredCollision const& col, Rho0s const& /*rho0s*/, Tracks const& tracks) { colHistManager.fill(col); - auto rho0Slice = rho0Partition->sliceByCached(femtobase::stored::collisionId, col.globalIndex(), cache); + auto rho0Slice = rho0Partition->sliceByCached(femtobase::stored::fColId, col.globalIndex(), cache); for (auto const& rho0 : rho0Slice) { rho0HistManager.fill(rho0, tracks); } @@ -164,7 +165,7 @@ struct FemtoTwotrackresonanceQa { void processKstar0s(FilteredCollision const& col, Kstar0s const& /*kstar0s*/, Tracks const& tracks) { colHistManager.fill(col); - auto kstar0Slice = kstar0Partition->sliceByCached(femtobase::stored::collisionId, col.globalIndex(), cache); + auto kstar0Slice = kstar0Partition->sliceByCached(femtobase::stored::fColId, col.globalIndex(), cache); for (auto const& kstar0 : kstar0Slice) { kstar0HistManager.fill(kstar0, tracks); } diff --git a/PWGCF/Femto/Tasks/femtoV0Qa.cxx b/PWGCF/Femto/Tasks/femtoV0Qa.cxx index 089d2975e1d..2b290ee93b6 100644 --- a/PWGCF/Femto/Tasks/femtoV0Qa.cxx +++ b/PWGCF/Femto/Tasks/femtoV0Qa.cxx @@ -45,15 +45,7 @@ using namespace o2::analysis::femto; struct FemtoV0Qa { - // setup for collisions - collisionbuilder::ConfCollisionSelection collisionSelection; - Filter collisionFilter = MAKE_COLLISION_FILTER(collisionSelection); - - colhistmanager::CollisionHistManager colHistManager; - colhistmanager::ConfCollisionBinning confCollisionBinning; - - // using Collisions = o2::soa::Join; - using Collisions = o2::soa::Join; + using Collisions = o2::soa::Join; using Collision = Collisions::iterator; using FilteredCollisions = o2::soa::Filtered; @@ -65,11 +57,18 @@ struct FemtoV0Qa { SliceCache cache; + // setup for collisions + collisionbuilder::ConfCollisionSelection collisionSelection; + Filter collisionFilter = MAKE_COLLISION_FILTER(collisionSelection); + colhistmanager::CollisionHistManager colHistManager; + colhistmanager::ConfCollisionBinning confCollisionBinning; + colhistmanager::ConfCollisionQaBinning confCollisionQaBinning; + // setup for lambdas v0builder::ConfLambdaSelection1 confLambdaSelection; Partition lambdaPartition = MAKE_LAMBDA_PARTITION(confLambdaSelection); - Preslice perColLambdas = aod::femtobase::stored::collisionId; + Preslice perColLambdas = aod::femtobase::stored::fColId; v0histmanager::ConfLambdaBinning1 confLambdaBinning; v0histmanager::ConfLambdaQaBinning1 confLambdaQaBinning; @@ -85,7 +84,7 @@ struct FemtoV0Qa { v0builder::ConfK0shortSelection1 confK0shortSelection; Partition k0shortPartition = MAKE_K0SHORT_PARTITION(confK0shortSelection); - Preslice perColK0shorts = aod::femtobase::stored::collisionId; + Preslice perColK0shorts = aod::femtobase::stored::fColId; v0histmanager::ConfK0shortBinning1 confK0shortBinning; v0histmanager::ConfK0shortQaBinning1 confK0shortQaBinning; @@ -109,7 +108,7 @@ struct FemtoV0Qa { void init(InitContext&) { // create a map for histogram specs - auto colHistSpec = colhistmanager::makeColHistSpecMap(confCollisionBinning); + auto colHistSpec = colhistmanager::makeColQaHistSpecMap(confCollisionBinning, confCollisionQaBinning); colHistManager.init(&hRegistry, colHistSpec); auto posDaughterHistSpec = trackhistmanager::makeTrackQaHistSpecMap(confV0PosDaughterBinning, confV0PosDaughterQaBinning); @@ -133,7 +132,7 @@ struct FemtoV0Qa { void processK0short(FilteredCollision const& col, K0shorts const& /*k0shorts*/, Tracks const& tracks) { colHistManager.fill(col); - auto k0shortSlice = k0shortPartition->sliceByCached(femtobase::stored::collisionId, col.globalIndex(), cache); + auto k0shortSlice = k0shortPartition->sliceByCached(femtobase::stored::fColId, col.globalIndex(), cache); for (auto const& k0short : k0shortSlice) { k0shortHistManager.fill(k0short, tracks); } @@ -143,7 +142,7 @@ struct FemtoV0Qa { void processLambda(FilteredCollision const& col, Lambdas const& /*lambdas*/, Tracks const& tracks) { colHistManager.fill(col); - auto lambdaSlice = lambdaPartition->sliceByCached(femtobase::stored::collisionId, col.globalIndex(), cache); + auto lambdaSlice = lambdaPartition->sliceByCached(femtobase::stored::fColId, col.globalIndex(), cache); for (auto const& lambda : lambdaSlice) { lambdaHistManager.fill(lambda, tracks); } From a3f6328859f1857637ed7207c9f56c229d312a65 Mon Sep 17 00:00:00 2001 From: Anton Riedel Date: Wed, 1 Oct 2025 20:37:51 +0200 Subject: [PATCH 2/2] Feat: fix close pair rejection --- PWGCF/Femto/Core/closePairRejection.h | 34 +++++++++++---------------- PWGCF/Femto/Core/pairBuilder.h | 8 +++---- 2 files changed, 18 insertions(+), 24 deletions(-) diff --git a/PWGCF/Femto/Core/closePairRejection.h b/PWGCF/Femto/Core/closePairRejection.h index 791d07deead..147c55fa6a1 100644 --- a/PWGCF/Femto/Core/closePairRejection.h +++ b/PWGCF/Femto/Core/closePairRejection.h @@ -193,11 +193,11 @@ template class ClosePairRejectionTrackTrack { public: - void init(o2::framework::HistogramRegistry* registry, std::map>& specs, float detaMax, float dphistarMax, int chargeTrack1, int chargeTrack2, bool isActivated) + void init(o2::framework::HistogramRegistry* registry, std::map>& specs, float detaMax, float dphistarMax, int absChargeTrack1, int absChargeTrack2, bool isActivated) { mIsActivated = isActivated; if (mIsActivated) { - mCtr.init(registry, specs, detaMax, dphistarMax, chargeTrack1, chargeTrack2); + mCtr.init(registry, specs, detaMax, dphistarMax, absChargeTrack1, absChargeTrack2); } } @@ -220,15 +220,13 @@ template class ClosePairRejectionTrackV0 // can also be used for any particle type that has pos/neg daughters, like resonances { public: - void init(o2::framework::HistogramRegistry* registry, std::map>& specs, float detaMax, float dphistarMax, int chargeTrack, bool isActivated) + void init(o2::framework::HistogramRegistry* registry, std::map>& specs, float detaMax, float dphistarMax, int absChargeTrack, bool isActivated) { mIsActivated = isActivated; - mChargeTrack = chargeTrack; - // initialize CPR with charge of the track and the same charge for the daughter particle - // absolute charge of the daughter track will be 1, so we just pass the sign + // absolute charge of the daughter track will be 1, so we just pass 1 if (mIsActivated) { - mCtr.init(registry, specs, detaMax, dphistarMax, mChargeTrack, utils::sign(mChargeTrack)); + mCtr.init(registry, specs, detaMax, dphistarMax, absChargeTrack, 1); } } @@ -239,14 +237,12 @@ class ClosePairRejectionTrackV0 // can also be used for any particle type that h template void setPair(const T1& track, const T2& v0, const T3 /*trackTable*/) { - if (mChargeTrack > 0) { + if (track.signedPt() > 0) { auto daughter = v0.template posDau_as(); mCtr.compute(track, daughter); - } else if (mChargeTrack < 0) { + } else { auto daughter = v0.template negDau_as(); mCtr.compute(track, daughter); - } else { - LOG(fatal) << "CPR Track-V0: Sign of the track is 0!"; } } @@ -259,19 +255,19 @@ class ClosePairRejectionTrackV0 // can also be used for any particle type that h private: CloseTrackRejection mCtr; - int mChargeTrack = 0; bool mIsActivated = true; }; template -class ClosePairRejectionTrackCascade // can also be used for any particle type that has pos/neg daughters, like resonances +class ClosePairRejectionTrackCascade { public: - void init(o2::framework::HistogramRegistry* registry, std::map>& specs, float detaMax, float dphistarMax, int chargeTrack, int chargeCascade, bool isActivated) + void init(o2::framework::HistogramRegistry* registry, std::map>& specs, float detaMax, float dphistarMax, int absChargeTrack, bool isActivated) { mIsActivated = isActivated; if (mIsActivated) { - mCtr.init(registry, specs, detaMax, dphistarMax, chargeTrack, chargeCascade); + // charge of cascade is always 1 + mCtr.init(registry, specs, detaMax, dphistarMax, absChargeTrack, 1); } } @@ -302,14 +298,12 @@ template class ClosePairRejectionTrackKink { public: - void init(o2::framework::HistogramRegistry* registry, std::map>& specs, float detaMax, float dphistarMax, int chargeTrack, int signKinkCandidate, bool isActivated) + void init(o2::framework::HistogramRegistry* registry, std::map>& specs, float detaMax, float dphistarMax, int absChargeTrack, bool isActivated) { mIsActivated = isActivated; - // initialize CPR with charge of the track and the charged daughter particle - // For kinks, we compare the primary track with the charged daughter - // The charged daughter has absolute charge of 1, so we can pass the sign directly + // The charged daughter has absolute charge of 1, so we can pass 1 directly if (mIsActivated) { - mCtr.init(registry, specs, detaMax, dphistarMax, chargeTrack, signKinkCandidate); + mCtr.init(registry, specs, detaMax, dphistarMax, absChargeTrack, 1); } } diff --git a/PWGCF/Femto/Core/pairBuilder.h b/PWGCF/Femto/Core/pairBuilder.h index 6ddca42069a..8d2e9af0641 100644 --- a/PWGCF/Femto/Core/pairBuilder.h +++ b/PWGCF/Femto/Core/pairBuilder.h @@ -448,12 +448,12 @@ class PairTrackKinkBuilder mPairHistManagerSe.init(registry, pairHistSpec); mPairHistManagerSe.setMass(confTrackSelection.pdgCode.value, confKinkSelection.pdgCode.value); mPairHistManagerSe.setCharge(confTrackSelection.chargeAbs.value, confKinkSelection.sign.value); - mCprSe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection.chargeAbs.value, confKinkSelection.sign.value, confCpr.on.value); + mCprSe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection.chargeAbs.value, confCpr.on.value); mPairHistManagerMe.init(registry, pairHistSpec); mPairHistManagerMe.setMass(confTrackSelection.pdgCode.value, confKinkSelection.pdgCode.value); mPairHistManagerMe.setCharge(confTrackSelection.chargeAbs.value, confKinkSelection.sign.value); - mCprMe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection.chargeAbs.value, confKinkSelection.sign.value, confCpr.on.value); + mCprMe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection.chargeAbs.value, confCpr.on.value); // setup mixing mMixingPolicy = static_cast(confMixing.policy.value); @@ -555,12 +555,12 @@ class PairTrackCascadeBuilder mPairHistManagerSe.init(registry, pairHistSpec); mPairHistManagerSe.setMass(confTrackSelection.pdgCode.value, confCascadeSelection.pdgCode.value); mPairHistManagerSe.setCharge(confTrackSelection.chargeAbs.value, confCascadeSelection.sign.value); - mCprSe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection.chargeAbs.value, confCascadeSelection.sign.value, confCpr.on.value); + mCprSe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection.chargeAbs.value, confCpr.on.value); mPairHistManagerMe.init(registry, pairHistSpec); mPairHistManagerMe.setMass(confTrackSelection.pdgCode.value, confCascadeSelection.pdgCode.value); mPairHistManagerMe.setCharge(confTrackSelection.chargeAbs.value, confCascadeSelection.sign.value); - mCprMe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection.chargeAbs.value, confCascadeSelection.sign.value, confCpr.on.value); + mCprMe.init(registry, cprHistSpec, confCpr.detaMax.value, confCpr.dphistarMax.value, confTrackSelection.chargeAbs.value, confCpr.on.value); // setup mixing mMixingPolicy = static_cast(confMixing.policy.value);