From eb7681a7ab215d40455904217c7c29c5a168ed74 Mon Sep 17 00:00:00 2001 From: Prottay Das Date: Mon, 10 Aug 2026 18:42:27 +0200 Subject: [PATCH 1/3] reduced no. of columns in DD table --- PWGLF/DataModel/LFCKSSpinalignmentTables.h | 16 ++++++++-------- .../Resonances/cksspinalignment.cxx | 18 +++++++++--------- PWGLF/Tasks/Resonances/cksspinalignder.cxx | 10 +++++----- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/PWGLF/DataModel/LFCKSSpinalignmentTables.h b/PWGLF/DataModel/LFCKSSpinalignmentTables.h index 0571c108b4e..0d2c0605af6 100644 --- a/PWGLF/DataModel/LFCKSSpinalignmentTables.h +++ b/PWGLF/DataModel/LFCKSSpinalignmentTables.h @@ -29,17 +29,17 @@ namespace kshortpionevent DECLARE_SOA_COLUMN(Cent, cent, float); DECLARE_SOA_COLUMN(Posz, posz, float); DECLARE_SOA_COLUMN(PsiFT0C, psiFT0C, float); -DECLARE_SOA_COLUMN(PsiFT0A, psiFT0A, float); -DECLARE_SOA_COLUMN(PsiTPC, psiTPC, float); +// DECLARE_SOA_COLUMN(PsiFT0A, psiFT0A, float); +// DECLARE_SOA_COLUMN(PsiTPC, psiTPC, float); } // namespace kshortpionevent DECLARE_SOA_TABLE(KShortpionEvents, "AOD", "KSHORTPIONEVENT", o2::soa::Index<>, kshortpionevent::Cent, kshortpionevent::Posz, - kshortpionevent::PsiFT0C, - kshortpionevent::PsiFT0A, - kshortpionevent::PsiTPC); + kshortpionevent::PsiFT0C); +// kshortpionevent::PsiFT0A, +// kshortpionevent::PsiTPC); using KShortpionEvent = KShortpionEvents::iterator; @@ -54,7 +54,7 @@ DECLARE_SOA_COLUMN(V0Cospa, v0Cospa, float); DECLARE_SOA_COLUMN(V0Radius, v0Radius, float); DECLARE_SOA_COLUMN(DcaPositive, dcaPositive, float); DECLARE_SOA_COLUMN(DcaNegative, dcaNegative, float); -DECLARE_SOA_COLUMN(DcaBetweenDaughter, dcaBetweenDaughter, float); +// DECLARE_SOA_COLUMN(DcaBetweenDaughter, dcaBetweenDaughter, float); // DECLARE_SOA_COLUMN(V0Lifetime, v0Lifetime, float); DECLARE_SOA_COLUMN(KShortPx, kShortPx, float); @@ -73,8 +73,8 @@ DECLARE_SOA_TABLE(KShortTracks, "AOD", "KSHORTTRACK", kshorttrack::V0Radius, kshorttrack::DcaPositive, kshorttrack::DcaNegative, - kshorttrack::DcaBetweenDaughter, - // kshorttrack::V0Lifetime, + // kshorttrack::DcaBetweenDaughter, + // kshorttrack::V0Lifetime, kshorttrack::KShortPx, kshorttrack::KShortPy, kshorttrack::KShortPz, diff --git a/PWGLF/TableProducer/Resonances/cksspinalignment.cxx b/PWGLF/TableProducer/Resonances/cksspinalignment.cxx index 653528909e2..d1b3cec8122 100644 --- a/PWGLF/TableProducer/Resonances/cksspinalignment.cxx +++ b/PWGLF/TableProducer/Resonances/cksspinalignment.cxx @@ -361,8 +361,8 @@ struct cksspinalignment { const int occupancy = collision.trackOccupancyInTimeRange(); const float psiFT0C = collision.psiFT0C(); - const float psiFT0A = collision.psiFT0A(); - const float psiTPC = collision.psiTPC(); + // const float psiFT0A = collision.psiFT0A(); + // const float psiTPC = collision.psiTPC(); histos.fill(HIST("hEvtSelInfo"), 0.5); @@ -462,8 +462,8 @@ struct cksspinalignment { static_cast(v0.v0radius()), static_cast(std::abs(v0.dcapostopv())), static_cast(std::abs(v0.dcanegtopv())), - static_cast(std::abs(v0.dcaV0daughters())), - // lifetime, + // static_cast(std::abs(v0.dcaV0daughters())), + // lifetime, posId, negId}); @@ -483,9 +483,9 @@ struct cksspinalignment { kshortpionEvent(centrality, vz, - psiFT0C, - psiFT0A, - psiTPC); + psiFT0C); + // psiFT0A, + // psiTPC); const int64_t indexEvent = kshortpionEvent.lastIndex(); @@ -495,8 +495,8 @@ struct cksspinalignment { k0s.radius, k0s.dcaPositive, k0s.dcaNegative, - k0s.dcaBetweenDaughters, - // k0s.lifetime, + // k0s.dcaBetweenDaughters, + // k0s.lifetime, k0s.px, k0s.py, k0s.pz, diff --git a/PWGLF/Tasks/Resonances/cksspinalignder.cxx b/PWGLF/Tasks/Resonances/cksspinalignder.cxx index c846369135f..0570217b7e0 100644 --- a/PWGLF/Tasks/Resonances/cksspinalignder.cxx +++ b/PWGLF/Tasks/Resonances/cksspinalignder.cxx @@ -57,7 +57,7 @@ struct cksspinalignder { Configurable radiusMin{"radiusMin", 1.2f, "Minimum V0 radius"}; Configurable radiusMax{"radiusMax", 100.0f, "Maximum V0 radius"}; Configurable dcaPion{"dcaPion", 0.1f, "Minimum V0 daughter DCA to PV"}; - Configurable dcaDaughters{"dcaDaughters", 1.0f, "Maximum DCA between V0 daughters"}; + // Configurable dcaDaughters{"dcaDaughters", 1.0f, "Maximum DCA between V0 daughters"}; Configurable k0sPtMin{"k0sPtMin", 0.0f, "Minimum K0s pT"}; Configurable k0sPtMax{"k0sPtMax", 10.0f, "Maximum K0s pT"}; Configurable k0sEtaMax{"k0sEtaMax", 0.8f, "Maximum K0s eta"}; @@ -193,11 +193,11 @@ struct cksspinalignder { candidate.v0Radius() > radiusMax.value) { return false; } - + /* if (candidate.dcaBetweenDaughter() > dcaDaughters.value) { return false; } - + */ if (candidate.dcaPositive() < dcaPion.value || candidate.dcaNegative() < dcaPion.value) { return false; @@ -230,9 +230,9 @@ struct cksspinalignder { case 0: return collision.psiFT0C(); case 1: - return collision.psiFT0A(); + return collision.psiFT0C(); case 2: - return collision.psiTPC(); + return collision.psiFT0C(); default: LOGF(warn, "epChoice=%d is invalid. Using FT0C.", epChoice.value); return collision.psiFT0C(); From b477a14d4984ebd5bb6121894409c34fc96d1f42 Mon Sep 17 00:00:00 2001 From: Prottay Das Date: Mon, 10 Aug 2026 18:51:04 +0200 Subject: [PATCH 2/3] updated --- PWGLF/TableProducer/Resonances/cksspinalignment.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGLF/TableProducer/Resonances/cksspinalignment.cxx b/PWGLF/TableProducer/Resonances/cksspinalignment.cxx index d1b3cec8122..9bcb1063ee4 100644 --- a/PWGLF/TableProducer/Resonances/cksspinalignment.cxx +++ b/PWGLF/TableProducer/Resonances/cksspinalignment.cxx @@ -222,8 +222,8 @@ struct cksspinalignment { float radius; float dcaPositive; float dcaNegative; - float dcaBetweenDaughters; - // float lifetime; + // float dcaBetweenDaughters; + // float lifetime; int64_t positiveIndex; int64_t negativeIndex; }; From cc4615921451cf4c7ef0cf13294c3b3ba6201708 Mon Sep 17 00:00:00 2001 From: Prottay Das Date: Mon, 17 Aug 2026 18:27:31 +0200 Subject: [PATCH 3/3] added option to equalise width of Q distributions vs centrality and a possible downscale factor for pions --- PWGLF/TableProducer/Common/spvector.cxx | 82 +++++++++++++++++++ .../Resonances/cksspinalignment.cxx | 26 ++++++ 2 files changed, 108 insertions(+) diff --git a/PWGLF/TableProducer/Common/spvector.cxx b/PWGLF/TableProducer/Common/spvector.cxx index b5924c13127..85806454c4e 100644 --- a/PWGLF/TableProducer/Common/spvector.cxx +++ b/PWGLF/TableProducer/Common/spvector.cxx @@ -247,6 +247,22 @@ struct spvector { Configurable confRecentereVzTimeSp3{"confRecentereVzTimeSp3", "Users/p/prottay/My/Object/Testingwithsparse/NewPbPbpass4_17092024/recenter", "TH3F path for (Vz,time) recentering, cycle 3"}; Configurable confRecentereVzTimeSp4{"confRecentereVzTimeSp4", "Users/p/prottay/My/Object/Testingwithsparse/NewPbPbpass4_17092024/recenter", "TH3F path for (Vz,time) recentering, cycle 4"}; Configurable confRecentereVzTimeSp5{"confRecentereVzTimeSp5", "Users/p/prottay/My/Object/Testingwithsparse/NewPbPbpass4_17092024/recenter", "TH3F path for (Vz,time) recentering, cycle 5"}; + + Configurable useWidthEqualization{ + "useWidthEqualization", + false, + "Apply Q-vector width equalization"}; + + Configurable confWidthSigma{ + "confWidthSigma", + "Users/p/prottay/My/Object/ZDC/widthEq", + "TH2F path for Q-vector width equalization"}; + + Configurable confWidthMean{ + "confWidthMean", + "Users/p/prottay/My/Object/ZDC/widthEq", + "TH2F path for Q-vector mean equalization"}; + } confignewpro; struct : ConfigurableGroup { @@ -503,6 +519,59 @@ struct spvector { std::array hrecenterecentvySpA{}; std::array hrecenterecentvzSpA{}; std::array hrecenterevztimeSpA{}; + TH2F* hWidthMean = nullptr; + TH2F* hWidthSigma = nullptr; + + bool CorrectWidthEqualization(TH2F* hMean, + TH2F* hWidth, + auto centrality, + auto& qxZDCA, + auto& qyZDCA, + auto& qxZDCC, + auto& qyZDCC) + { + + if (!hMean || !hWidth) { + return false; + } + + const double meanQxA = hMean->GetBinContent( + hMean->FindBin(centrality + 0.00001, 0.5)); + + const double meanQyA = hMean->GetBinContent( + hMean->FindBin(centrality + 0.00001, 1.5)); + + const double meanQxC = hMean->GetBinContent( + hMean->FindBin(centrality + 0.00001, 2.5)); + + const double meanQyC = hMean->GetBinContent( + hMean->FindBin(centrality + 0.00001, 3.5)); + + const double sigmaQxA = hWidth->GetBinContent( + hWidth->FindBin(centrality + 0.00001, 0.5)); + + const double sigmaQyA = hWidth->GetBinContent( + hWidth->FindBin(centrality + 0.00001, 1.5)); + + const double sigmaQxC = hWidth->GetBinContent( + hWidth->FindBin(centrality + 0.00001, 2.5)); + + const double sigmaQyC = hWidth->GetBinContent( + hWidth->FindBin(centrality + 0.00001, 3.5)); + + if (sigmaQxA <= 0.0 || sigmaQyA <= 0.0 || + sigmaQxC <= 0.0 || sigmaQyC <= 0.0) { + return false; + } + + qxZDCA = (qxZDCA - meanQxA) / sigmaQxA; + qyZDCA = (qyZDCA - meanQyA) / sigmaQyA; + + qxZDCC = (qxZDCC - meanQxC) / sigmaQxC; + qyZDCC = (qyZDCC - meanQyC) / sigmaQyC; + + return true; + } bool CorrectfineCent(TH2F* hrecenterecentSp, auto centrality, @@ -1404,6 +1473,19 @@ struct spvector { LOGF(fatal, "Cannot apply fine (cent,Vz) recentering, stage 6"); } } + + // -------------------- Width equalization -------------------- + if (confignewpro.useWidthEqualization) { + if (currentRunNumber != lastRunNumber) { + + hWidthMean = ccdb->getForTimeStamp(confignewpro.confWidthMean.value, bc.timestamp()); + hWidthSigma = ccdb->getForTimeStamp(confignewpro.confWidthSigma.value, bc.timestamp()); + } + + if (!CorrectWidthEqualization(hWidthMean, hWidthSigma, centrality, qxZDCA, qyZDCA, qxZDCC, qyZDCC)) { + LOGF(fatal, "Cannot apply Q-vector width equalization"); + } + } } histos.fill(HIST("hpQxZDCAvstime"), timeMin, qxZDCA); diff --git a/PWGLF/TableProducer/Resonances/cksspinalignment.cxx b/PWGLF/TableProducer/Resonances/cksspinalignment.cxx index 9bcb1063ee4..c52483f28fe 100644 --- a/PWGLF/TableProducer/Resonances/cksspinalignment.cxx +++ b/PWGLF/TableProducer/Resonances/cksspinalignment.cxx @@ -120,6 +120,8 @@ struct cksspinalignment { Configurable cfgK0sMassMin{"cfgK0sMassMin", 0.45f, "Minimum K0s invariant mass"}; Configurable cfgK0sMassMax{"cfgK0sMassMax", 0.55f, "Maximum K0s invariant mass"}; + Configurable cfgKeepFraction{"cfgKeepFraction", 0.4f, "Fraction of events to keep"}; + HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; RCTFlagsChecker rctChecker; @@ -136,6 +138,26 @@ struct cksspinalignment { histos.add("hNStoredPions", "hNStoredPions;N_{#pi};Events", kTH1F, {{500, 0.0f, 500.0f}}); } + bool keepEvent(uint64_t eventIndex) const + { /* + if (cfgKeepFraction >= 1.0f) { + return true; + } + */ + // SplitMix64 pseudo-random hash + uint64_t x = eventIndex + 0x9e3779b97f4a7c15ULL; + x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9ULL; + x = (x ^ (x >> 27)) * 0x94d049bb133111ebULL; + x = x ^ (x >> 31); + + // Convert hash to uniform random number in [0,1) + const double u = + static_cast(x >> 11) * + (1.0 / 9007199254740992.0); + + return u < cfgKeepFraction.value; + } + template bool selectionTrack(const T& candidate) { @@ -386,6 +408,10 @@ struct cksspinalignment { return; } + if (!keepEvent(static_cast(collision.globalIndex()))) { + return; + } + histos.fill(HIST("hEvtSelInfo"), 2.5); histos.fill(HIST("hCent"), centrality);