From 0f1bacf39e58f8ab161feffee79036f094adaf3b Mon Sep 17 00:00:00 2001 From: ypwangg Date: Fri, 3 Jul 2026 19:04:29 +0800 Subject: [PATCH 1/6] add A2 in MC --- PWGDQ/Core/VarManager.h | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index d652252ebe8..2e3c02b345d 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -822,6 +822,14 @@ class VarManager : public TObject kCos2DeltaPhiPP_TPC, kCos2DeltaPhiPP_FT0A, kCos2DeltaPhiPP_FT0C, + kDeltaPhiRP_Random, + kDeltaPhiRP_MC, + kCos2DeltaPhiRP_Random, + kCos2DeltaPhiRP_MC, + kDeltaPhiPP_Random, + kDeltaPhiPP_MC, + kCos2DeltaPhiPP_Random, + kCos2DeltaPhiPP_MC, kNullA2, kInfA2, kSel1, // if track1 is used in TPC Q vector calculation @@ -4632,6 +4640,23 @@ void VarManager::FillPairMC(T1 const& t1, T2 const& t2, float* values) ROOT::Math::XYZVector zaxisTrue = ROOT::Math::XYZVector(TMath::Cos(values[kMCEventPlaneAngle]), TMath::Sin(values[kMCEventPlaneAngle]), 0).Unit(); values[kMCCosThetaStar] = v_CM.Dot(zaxisTrue); } + + if (fgUsedVars[kCos2DeltaPhiRP_Random] || fgUsedVars[kCos2DeltaPhiPP_Random] || fgUsedVars[kCos2DeltaPhiRP_MC] || fgUsedVars[kCos2DeltaPhiPP_MC]) { + ROOT::Math::Boost boostv12{v12.BoostToCM()}; + ROOT::Math::PtEtaPhiMVector v_daughter = boostv12(t1.sign() > 0 ? v1 : v2); + + // reaction plane + float phi = v_daughter.Phi() > T1Math::Pi() ? v_daughter.Phi() - 2. * TMath::Pi() : v_daughter.Phi(); + values[kDeltaPhiRP_Random] = phi - values[kRandomPsi2]; + values[kDeltaPhiRP_Random] = values[kDeltaPhiRP_Random] > TMath::Pi() ? 2. * TMath::Pi() - values[kDeltaPhiRP_Random] : values[kDeltaPhiRP_Random]; + values[kDeltaPhiRP_MC] = phi - values[kMCEventPlaneAngle]; + values[kDeltaPhiRP_MC] = values[kDeltaPhiRP_MC] > TMath::Pi() ? 2. * TMath::Pi() - values[kDeltaPhiRP_MC] : values[kDeltaPhiRP_MC]; + // fold delta phi into [-pi/2, pi/2] + values[kDeltaPhiRP_Random] = values[kDeltaPhiRP_Random] > TMath::Pi() / 2. ? TMath::Pi() - values[kDeltaPhiRP_Random] : values[kDeltaPhiRP_Random]; + values[kDeltaPhiRP_MC] = values[kDeltaPhiRP_MC] > TMath::Pi() / 2. ? TMath::Pi() - values[kDeltaPhiRP_MC] : values[kDeltaPhiRP_MC]; + values[kCos2DeltaPhiRP_Random] = TMath::Cos(2. * (phi - values[kRandomPsi2])); + values[kCos2DeltaPhiRP_MC] = TMath::Cos(2. * (phi - values[kMCEventPlaneAngle])); + } } template From ab4fa439ccd85b1b083465e2f2f4f3b3dd88f28f Mon Sep 17 00:00:00 2001 From: ypwangg Date: Fri, 3 Jul 2026 19:35:58 +0800 Subject: [PATCH 2/6] fix bug --- PWGDQ/Core/VarManager.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 2e3c02b345d..1a3ae35142e 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -4646,7 +4646,7 @@ void VarManager::FillPairMC(T1 const& t1, T2 const& t2, float* values) ROOT::Math::PtEtaPhiMVector v_daughter = boostv12(t1.sign() > 0 ? v1 : v2); // reaction plane - float phi = v_daughter.Phi() > T1Math::Pi() ? v_daughter.Phi() - 2. * TMath::Pi() : v_daughter.Phi(); + float phi = v_daughter.Phi() > TMath::Pi() ? v_daughter.Phi() - 2. * TMath::Pi() : v_daughter.Phi(); values[kDeltaPhiRP_Random] = phi - values[kRandomPsi2]; values[kDeltaPhiRP_Random] = values[kDeltaPhiRP_Random] > TMath::Pi() ? 2. * TMath::Pi() - values[kDeltaPhiRP_Random] : values[kDeltaPhiRP_Random]; values[kDeltaPhiRP_MC] = phi - values[kMCEventPlaneAngle]; From 6617cfdf8159fd23fdae37ae484f2b43db7a1383 Mon Sep 17 00:00:00 2001 From: ypwangg Date: Fri, 3 Jul 2026 19:51:51 +0800 Subject: [PATCH 3/6] fix bug in VM daughter direction --- PWGDQ/Core/VarManager.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 1a3ae35142e..2743463dc94 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -4643,7 +4643,7 @@ void VarManager::FillPairMC(T1 const& t1, T2 const& t2, float* values) if (fgUsedVars[kCos2DeltaPhiRP_Random] || fgUsedVars[kCos2DeltaPhiPP_Random] || fgUsedVars[kCos2DeltaPhiRP_MC] || fgUsedVars[kCos2DeltaPhiPP_MC]) { ROOT::Math::Boost boostv12{v12.BoostToCM()}; - ROOT::Math::PtEtaPhiMVector v_daughter = boostv12(t1.sign() > 0 ? v1 : v2); + ROOT::Math::PtEtaPhiMVector v_daughter = boostv12(t1.pdgCode() > 0 ? v1 : v2); // reaction plane float phi = v_daughter.Phi() > TMath::Pi() ? v_daughter.Phi() - 2. * TMath::Pi() : v_daughter.Phi(); From 4d53d5f90087b0bb56baada8bc6204f037fb6d33 Mon Sep 17 00:00:00 2001 From: ypwangg Date: Mon, 13 Jul 2026 14:57:52 +0800 Subject: [PATCH 4/6] mix event for coherent jpsi A2 --- PWGDQ/Core/VarManager.h | 97 ++++++++++++++++++++ PWGDQ/Tasks/tableReader_withAssoc_direct.cxx | 4 +- 2 files changed, 99 insertions(+), 2 deletions(-) diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 2743463dc94..6390c8fa038 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -482,6 +482,14 @@ class VarManager : public TObject kQ2X0A2, kQ2Y0A1, kQ2Y0A2, + kQ2X0B1, + kQ2X0B2, + kQ2Y0B1, + kQ2Y0B2, + kQ2X0C1, + kQ2X0C2, + kQ2Y0C1, + kQ2Y0C2, kU2Q2Ev1, kU2Q2Ev2, kCos2DeltaPhiEv1, @@ -2898,6 +2906,16 @@ void VarManager::FillTwoMixEvents(T1 const& ev1, T1 const& ev2, T2 const& /*trac values[kQ2X0A2] = ev2.q2x0a(); values[kQ2Y0A1] = ev1.q2y0a(); values[kQ2Y0A2] = ev2.q2y0a(); + + values[kQ2X0B1] = ev1.q2x0b(); + values[kQ2X0B2] = ev2.q2x0b(); + values[kQ2Y0B1] = ev1.q2y0b(); + values[kQ2Y0B2] = ev2.q2y0b(); + + values[kQ2X0C1] = ev1.q2x0c(); + values[kQ2X0C2] = ev2.q2x0c(); + values[kQ2Y0C1] = ev1.q2y0c(); + values[kQ2Y0C2] = ev2.q2y0c(); } if constexpr ((fillMap & CollisionQvect) > 0) { // Tobe used for the calculation of u1q1 and u2q2 @@ -2905,6 +2923,16 @@ void VarManager::FillTwoMixEvents(T1 const& ev1, T1 const& ev2, T2 const& /*trac values[kQ2X0A2] = (ev2.qvecBPosRe() * ev2.nTrkBPos() + ev2.qvecBNegRe() * ev2.nTrkBNeg()) / (ev2.nTrkBPos() + ev2.nTrkBNeg()); values[kQ2Y0A1] = (ev1.qvecBPosIm() * ev1.nTrkBPos() + ev1.qvecBNegIm() * ev1.nTrkBNeg()) / (ev1.nTrkBPos() + ev1.nTrkBNeg()); values[kQ2Y0A2] = (ev2.qvecBPosIm() * ev2.nTrkBPos() + ev2.qvecBNegIm() * ev2.nTrkBNeg()) / (ev2.nTrkBPos() + ev2.nTrkBNeg()); + + values[kQ2X0B1] = ev1.qvecFT0ARe(); + values[kQ2X0B2] = ev2.qvecFT0ARe(); + values[kQ2Y0B1] = ev1.qvecFT0AIm(); + values[kQ2Y0B2] = ev2.qvecFT0AIm(); + + values[kQ2X0C1] = ev1.qvecFT0CRe(); + values[kQ2X0C2] = ev2.qvecFT0CRe(); + values[kQ2Y0C1] = ev1.qvecFT0CIm(); + values[kQ2Y0C2] = ev2.qvecFT0CIm(); } } @@ -4377,6 +4405,10 @@ void VarManager::FillPairME(T1 const& t1, T2 const& t2, float* values) // Compute the scalar product UQ for two muon from different event using Q-vector from A, for second and third harmonic float Psi2A1 = getEventPlane(2, values[kQ2X0A1], values[kQ2Y0A1]); float Psi2A2 = getEventPlane(2, values[kQ2X0A2], values[kQ2Y0A2]); + float Psi2B1 = getEventPlane(2, values[kQ2X0B1], values[kQ2Y0B1]); + float Psi2B2 = getEventPlane(2, values[kQ2X0B2], values[kQ2Y0B2]); + float Psi2C1 = getEventPlane(2, values[kQ2X0C1], values[kQ2Y0C1]); + float Psi2C2 = getEventPlane(2, values[kQ2X0C2], values[kQ2Y0C2]); values[kCos2DeltaPhi] = TMath::Cos(2 * (v12.Phi() - Psi2A1)); // WARNING: using the first event EP values[kCos2DeltaPhiEv1] = TMath::Cos(2 * (v1.Phi() - Psi2A1)); values[kCos2DeltaPhiEv2] = TMath::Cos(2 * (v2.Phi() - Psi2A2)); @@ -4407,6 +4439,39 @@ void VarManager::FillPairME(T1 const& t1, T2 const& t2, float* values) values[kV24ME] = (std::isnan(V22ME) || std::isinf(V22ME) || std::isnan(V24ME) || std::isinf(V24ME)) ? 0. : V24ME; values[kWV24ME] = (std::isnan(V22ME) || std::isinf(V22ME) || std::isnan(V24ME) || std::isinf(V24ME)) ? 0. : 1.0; + // coherent Jpsi A2 + bool useCoherentJpsiA2 = fgUsedVars[kA2EP_RP_TPC] || fgUsedVars[kA2EP_RP_FT0A] || fgUsedVars[kA2EP_RP_FT0C]; + if (useCoherentJpsiA2) { + ROOT::Math::Boost boostv12{v12.BoostToCM()}; + ROOT::Math::PtEtaPhiMVector v_daughter = boostv12(t1.sign() > 0 ? v1 : v2); + float Psi2A = t1.sign() > 0 ? Psi2A1 : Psi2A2; + float Psi2B = t1.sign() > 0 ? Psi2B1 : Psi2B2; + float Psi2C = t1.sign() > 0 ? Psi2C1 : Psi2C2; + + // reaction plane + float phi = v_daughter.Phi() > TMath::Pi() ? 2. * TMath::Pi() - v_daughter.Phi() : v_daughter.Phi(); + values[kDeltaPhiRP_TPC] = phi > Psi2A ? phi - Psi2A : Psi2A - phi; + values[kDeltaPhiRP_TPC] = values[kDeltaPhiRP_TPC] > TMath::Pi() ? 2. * TMath::Pi() - values[kDeltaPhiRP_TPC] : values[kDeltaPhiRP_TPC]; + values[kDeltaPhiRP_FT0A] = phi > Psi2B ? phi - Psi2B : Psi2B - phi; + values[kDeltaPhiRP_FT0A] = values[kDeltaPhiRP_FT0A] > TMath::Pi() ? 2. * TMath::Pi() - values[kDeltaPhiRP_FT0A] : values[kDeltaPhiRP_FT0A]; + values[kDeltaPhiRP_FT0C] = phi > Psi2C ? phi - Psi2C : Psi2C - phi; + values[kDeltaPhiRP_FT0C] = values[kDeltaPhiRP_FT0C] > TMath::Pi() ? 2. * TMath::Pi() - values[kDeltaPhiRP_FT0C] : values[kDeltaPhiRP_FT0C]; + // fold delta phi to [0, pi/2] + values[kDeltaPhiRP_TPC] = values[kDeltaPhiRP_TPC] > TMath::Pi() / 2. ? TMath::Pi() - values[kDeltaPhiRP_TPC] : values[kDeltaPhiRP_TPC]; + values[kDeltaPhiRP_FT0A] = values[kDeltaPhiRP_FT0A] > TMath::Pi() / 2. ? TMath::Pi() - values[kDeltaPhiRP_FT0A] : values[kDeltaPhiRP_FT0A]; + values[kDeltaPhiRP_FT0C] = values[kDeltaPhiRP_FT0C] > TMath::Pi() / 2. ? TMath::Pi() - values[kDeltaPhiRP_FT0C] : values[kDeltaPhiRP_FT0C]; + values[kCos2DeltaPhiRP_TPC] = TMath::Cos(2. * (phi - Psi2A)); + values[kCos2DeltaPhiRP_FT0A] = TMath::Cos(2. * (phi - Psi2B)); + values[kCos2DeltaPhiRP_FT0C] = TMath::Cos(2. * (phi - Psi2C)); + + float A2RP_TPC = values[kCos2DeltaPhiRP_TPC] / values[kR2EP]; + float A2RP_FT0A = values[kCos2DeltaPhiRP_FT0A] / values[kR2EP]; + float A2RP_FT0C = values[kCos2DeltaPhiRP_FT0C] / values[kR2EP]; + values[kA2EP_RP_TPC] = std::isnan(A2RP_TPC) || std::isinf(A2RP_TPC) ? -999. : A2RP_TPC; + values[kA2EP_RP_FT0A] = std::isnan(A2RP_FT0A) || std::isinf(A2RP_FT0A) ? -999. : A2RP_FT0A; + values[kA2EP_RP_FT0C] = std::isnan(A2RP_FT0C) || std::isinf(A2RP_FT0C) ? -999. : A2RP_FT0C; + } + if constexpr ((fillMap & ReducedEventQvectorExtra) > 0) { std::complex Q21(values[kQ2X0A] * values[kS11A], values[kQ2Y0A] * values[kS11A]); std::complex Q42(values[kQ42XA], values[kQ42YA]); @@ -4458,6 +4523,38 @@ void VarManager::FillPairMEAcrossTFs(T const& t1, T const& t2, float* values) values[kEta] = v12.Eta(); values[kPhi] = v12.Phi() > 0 ? v12.Phi() : v12.Phi() + 2. * M_PI; values[kRap] = -v12.Rapidity(); + + bool useCoherentJpsiA2 = fgUsedVars[kA2EP_RP_TPC] || fgUsedVars[kA2EP_RP_FT0A] || fgUsedVars[kA2EP_RP_FT0C]; + if (useCoherentJpsiA2) { + ROOT::Math::Boost boostv12{v12.BoostToCM()}; + ROOT::Math::PtEtaPhiMVector v_daughter = boostv12(v1); + float Psi2A = values[kPsi2A]; + float Psi2B = values[kPsi2B]; + float Psi2C = values[kPsi2C]; + + // reaction plane + float phi = v_daughter.Phi() > TMath::Pi() ? 2. * TMath::Pi() - v_daughter.Phi() : v_daughter.Phi(); + values[kDeltaPhiRP_TPC] = phi > Psi2A ? phi - Psi2A : Psi2A - phi; + values[kDeltaPhiRP_TPC] = values[kDeltaPhiRP_TPC] > TMath::Pi() ? 2. * TMath::Pi() - values[kDeltaPhiRP_TPC] : values[kDeltaPhiRP_TPC]; + values[kDeltaPhiRP_FT0A] = phi > Psi2B ? phi - Psi2B : Psi2B - phi; + values[kDeltaPhiRP_FT0A] = values[kDeltaPhiRP_FT0A] > TMath::Pi() ? 2. * TMath::Pi() - values[kDeltaPhiRP_FT0A] : values[kDeltaPhiRP_FT0A]; + values[kDeltaPhiRP_FT0C] = phi > Psi2C ? phi - Psi2C : Psi2C - phi; + values[kDeltaPhiRP_FT0C] = values[kDeltaPhiRP_FT0C] > TMath::Pi() ? 2. * TMath::Pi() - values[kDeltaPhiRP_FT0C] : values[kDeltaPhiRP_FT0C]; + // fold delta phi to [0, pi/2] + values[kDeltaPhiRP_TPC] = values[kDeltaPhiRP_TPC] > TMath::Pi() / 2. ? TMath::Pi() - values[kDeltaPhiRP_TPC] : values[kDeltaPhiRP_TPC]; + values[kDeltaPhiRP_FT0A] = values[kDeltaPhiRP_FT0A] > TMath::Pi() / 2. ? TMath::Pi() - values[kDeltaPhiRP_FT0A] : values[kDeltaPhiRP_FT0A]; + values[kDeltaPhiRP_FT0C] = values[kDeltaPhiRP_FT0C] > TMath::Pi() / 2. ? TMath::Pi() - values[kDeltaPhiRP_FT0C] : values[kDeltaPhiRP_FT0C]; + values[kCos2DeltaPhiRP_TPC] = TMath::Cos(2. * (phi - Psi2A)); + values[kCos2DeltaPhiRP_FT0A] = TMath::Cos(2. * (phi - Psi2B)); + values[kCos2DeltaPhiRP_FT0C] = TMath::Cos(2. * (phi - Psi2C)); + + float A2RP_TPC = values[kCos2DeltaPhiRP_TPC] / values[kR2EP]; + float A2RP_FT0A = values[kCos2DeltaPhiRP_FT0A] / values[kR2EP]; + float A2RP_FT0C = values[kCos2DeltaPhiRP_FT0C] / values[kR2EP]; + values[kA2EP_RP_TPC] = std::isnan(A2RP_TPC) || std::isinf(A2RP_TPC) ? -999. : A2RP_TPC; + values[kA2EP_RP_FT0A] = std::isnan(A2RP_FT0A) || std::isinf(A2RP_FT0A) ? -999. : A2RP_FT0A; + values[kA2EP_RP_FT0C] = std::isnan(A2RP_FT0C) || std::isinf(A2RP_FT0C) ? -999. : A2RP_FT0C; + } } template diff --git a/PWGDQ/Tasks/tableReader_withAssoc_direct.cxx b/PWGDQ/Tasks/tableReader_withAssoc_direct.cxx index cca9d775d3f..b905c93dd72 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc_direct.cxx +++ b/PWGDQ/Tasks/tableReader_withAssoc_direct.cxx @@ -1691,7 +1691,7 @@ struct AnalysisSameEventPairing { constexpr bool eventHasQvector = ((TEventFillMap & VarManager::ObjTypes::CollisionQvectCentr) > 0); constexpr bool trackHasCov = ((TTrackFillMap & VarManager::ObjTypes::TrackCov) > 0); - constexpr bool fillFlowReso = eventHasQvector; + // constexpr bool fillFlowReso = eventHasQvector; for (auto& event : events) { if (!event.isEventSelected_bit(0)) @@ -1708,7 +1708,7 @@ struct AnalysisSameEventPairing { if (groupedAssocs.size() == 0) continue; - if (fillFlowReso) { + if (fConfigOptions.useFlowReso) { if (ResoFlowSP == nullptr || ResoFlowEP == nullptr) { LOGF(fatal, "Flow resolution histograms are not available, cannot fill flow variables!"); } From c19f3c39392044acd4b8af507b27fc8b3a058b36 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Mon, 13 Jul 2026 06:59:48 +0000 Subject: [PATCH 5/6] Please consider the following formatting changes --- PWGDQ/Core/VarManager.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 6390c8fa038..04dc00534cd 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -4447,7 +4447,7 @@ void VarManager::FillPairME(T1 const& t1, T2 const& t2, float* values) float Psi2A = t1.sign() > 0 ? Psi2A1 : Psi2A2; float Psi2B = t1.sign() > 0 ? Psi2B1 : Psi2B2; float Psi2C = t1.sign() > 0 ? Psi2C1 : Psi2C2; - + // reaction plane float phi = v_daughter.Phi() > TMath::Pi() ? 2. * TMath::Pi() - v_daughter.Phi() : v_daughter.Phi(); values[kDeltaPhiRP_TPC] = phi > Psi2A ? phi - Psi2A : Psi2A - phi; From c203e07909bf1daac1f385e91e58f0cd866064d7 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Mon, 13 Jul 2026 07:11:13 +0000 Subject: [PATCH 6/6] Please consider the following formatting changes --- PWGDQ/Core/VarManager.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 13a51ca1563..f8587e99162 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -4453,7 +4453,7 @@ void VarManager::FillPairMEAcrossTFs(T const& t1, T const& t2, float* values) values[kCos2ThetaStarFT0C] = values[kCosThetaStarFT0C] * values[kCosThetaStarFT0C]; } } - + bool useCoherentJpsiA2 = fgUsedVars[kA2EP_RP_TPC] || fgUsedVars[kA2EP_RP_FT0A] || fgUsedVars[kA2EP_RP_FT0C]; if (useCoherentJpsiA2) { ROOT::Math::Boost boostv12{v12.BoostToCM()};