From ec8659b5973d678047aff4d7b9d646390eb3d7d7 Mon Sep 17 00:00:00 2001 From: ayatsuji <13807650+asakuratou@user.noreply.gitee.com> Date: Mon, 27 Jul 2026 18:31:55 +0800 Subject: [PATCH 01/11] Add phi-map correction for track rotation --- PWGDQ/Core/VarManager.cxx | 126 +++++++++++++++++++++++++- PWGDQ/Core/VarManager.h | 4 +- PWGDQ/Tasks/tableReader_withAssoc.cxx | 14 +++ 3 files changed, 142 insertions(+), 2 deletions(-) diff --git a/PWGDQ/Core/VarManager.cxx b/PWGDQ/Core/VarManager.cxx index 69c29570f2e..cf98e8d799b 100644 --- a/PWGDQ/Core/VarManager.cxx +++ b/PWGDQ/Core/VarManager.cxx @@ -75,7 +75,8 @@ int VarManager::fgCalibrationType = 0; // 0 - no calibration, 1 - bool VarManager::fgUseInterpolatedCalibration = true; // use interpolated calibration histograms (default: true) int VarManager::fgEfficiencyType = 0; // type of efficiency to be applied, default is no efficiency TObject* VarManager::fgEfficiencyHist = nullptr; // histogram for efficiency - +TH3D* VarManager::fgPosiPhiMap = nullptr; +TH3D* VarManager::fgNegaPhiMap = nullptr; //__________________________________________________________________ VarManager::VarManager() : TObject() { @@ -453,6 +454,129 @@ void VarManager::FillEfficiency(float* values) } } +void VarManager::SetPhiMap(TH3D* hposi, TH3D* hnega) +{ + fgPosiPhiMap = hposi; + fgNegaPhiMap = hnega; +} + +double VarManager::SampleRotationPhi(double pt, double eta, int charge) +{ + // each type only alarm once + static bool warnedInvalidCharge = false; + static bool warnedMissingPositiveMap = false; + static bool warnedMissingNegativeMap = false; + static bool warnedOutOfRange = false; + static bool warnedEmptyPhi = false; + + TH3D* hMap = nullptr; + + if (charge > 0) { + hMap = fgPosiPhiMap; + + if (!hMap) { + if (!warnedMissingPositiveMap) { + LOGF(warn, + "Positive phi correction map is not available. " + "Falling back to uniform phi sampling."); + warnedMissingPositiveMap = true; + } + + return gRandom->Uniform( + 0., o2::constants::math::TwoPI); + } + } else if (charge < 0) { + hMap = fgNegaPhiMap; + + if (!hMap) { + if (!warnedMissingNegativeMap) { + LOGF(warn, + "Negative phi correction map is not available. " + "Falling back to uniform phi sampling."); + warnedMissingNegativeMap = true; + } + + return gRandom->Uniform( + 0., o2::constants::math::TwoPI); + } + } else { + if (!warnedInvalidCharge) { + LOGF(warn, + "Track with charge=0 passed to SampleRotationPhi. " + "Falling back to uniform phi sampling."); + warnedInvalidCharge = true; + } + + return gRandom->Uniform( + 0., o2::constants::math::TwoPI); + } + + // TH3 axes: X=pT, Y=phi, Z=eta + const int ptBin = hMap->GetXaxis()->FindBin(pt); + const int etaBin = hMap->GetZaxis()->FindBin(eta); + + if (ptBin < 1 || ptBin > hMap->GetNbinsX() || + etaBin < 1 || etaBin > hMap->GetNbinsZ()) { + if (!warnedOutOfRange) { + LOGF(warn, + "Track outside phi correction map: " + "pt=%f, eta=%f, charge=%d, ptBin=%d, etaBin=%d. " + "Map ranges: pt=[%f,%f], eta=[%f,%f]. " + "Falling back to uniform phi sampling.", + pt, + eta, + charge, + ptBin, + etaBin, + hMap->GetXaxis()->GetXmin(), + hMap->GetXaxis()->GetXmax(), + hMap->GetZaxis()->GetXmin(), + hMap->GetZaxis()->GetXmax()); + + warnedOutOfRange = true; + } + + return gRandom->Uniform( + 0., o2::constants::math::TwoPI); + } + + TH1D* hPhi = hMap->ProjectionY( + Form("hTRPhi_tmp_charge%d_ptbin%d_etabin%d", + charge, ptBin, etaBin), + ptBin, + ptBin, + etaBin, + etaBin); + + if (!hPhi || + hPhi->Integral(1, hPhi->GetNbinsX()) <= 0.) { + if (!warnedEmptyPhi) { + LOGF(warn, + "Empty phi distribution for " + "pt=%f, eta=%f, charge=%d, ptBin=%d, etaBin=%d. " + "Falling back to uniform phi sampling.", + pt, + eta, + charge, + ptBin, + etaBin); + + warnedEmptyPhi = true; + } + + delete hPhi; + + return gRandom->Uniform( + 0., o2::constants::math::TwoPI); + } + + const double phi = + RecoDecay::constrainAngle(hPhi->GetRandom()); + + delete hPhi; + return phi; +} + //__________________________________________________________________ std::tuple VarManager::BimodalityCoefficientUnbinned(const std::vector& data) { diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 60d9373e496..2505a87916f 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -1530,6 +1530,8 @@ class VarManager : public TObject static void SetEfficiencyObject(int type, TObject* obj); static void FillEfficiency(float* values = nullptr); + static void SetPhiMap(TH3D* h1, TH3D* h2); + static double SampleRotationPhi(double pT, int charge); static TObject* GetCalibrationObject(CalibObjects calib) { auto obj = fgCalibs.find(calib); @@ -3956,7 +3958,7 @@ void VarManager::FillPairRotation(T1 const& t1, T2 const& t2, float* values) m2 = o2::constants::physics::MassMuon; } - double dphi = gRandom->Uniform(0., o2::constants::math::TwoPI); + double dphi = SampleRotationPhi(t2.pt(),t2.eta(),t2.sign()); double rotationphi2 = RecoDecay::constrainAngle(t2.phi() + dphi); values[kCharge] = t1.sign() + t2.sign(); diff --git a/PWGDQ/Tasks/tableReader_withAssoc.cxx b/PWGDQ/Tasks/tableReader_withAssoc.cxx index aba3686f2e8..bede4af67ab 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc.cxx +++ b/PWGDQ/Tasks/tableReader_withAssoc.cxx @@ -1362,6 +1362,7 @@ struct AnalysisSameEventPairing { Configurable GrpLhcIfPath{"grplhcif", "GLO/Config/GRPLHCIF", "Path on the CCDB for the GRPLHCIF object"}; Configurable efficiencyPath{"effHistPath", "Users/z/zhxiong/efficiency", "Path on the CCDB for the efficiency histograms"}; Configurable flowPath{"flowPath", "Users/y/yiping/FlowResolution", "Path to the flow resolution object"}; + Configurable phiPath{"phiPath","Users/h/hxiaoyu/TrackPhi/LHC23","Path to load phi distribution for track rotation"}; } fConfigCCDB; struct : ConfigurableGroup { @@ -1381,6 +1382,7 @@ struct AnalysisSameEventPairing { Configurable useEfficiencyWeighting{"cfgUseEfficiencyWeighting", false, "Apply efficiency weighting to the pairs from CCDB"}; Configurable efficiencyType{"cfgEfficiencyType", 0, "Type of efficiency to apply from CCDB: 0 no efficiency, 1 pt-cent-costhetastar"}; Configurable useFlowReso{"cfgUseFlowReso", false, "Use remote flow information from CCDB"}; + Configurable usePhiDistribution{"cfgUsePhiDistribution",false,"Use phi distribution to correct track rotation"}; } fConfigOptions; struct : ConfigurableGroup { Configurable applyBDT{"applyBDT", false, "Flag to apply ML selections"}; @@ -1855,6 +1857,18 @@ struct AnalysisSameEventPairing { LOGF(fatal, "Flow resolution histograms not available in CCDB at timestamp=%llu", timestamp); } } + + if (fConfigOptions.usePhiDistribution) { + TString PathPhi = fConfigCCDB.phiPath.value; + TString ccdbPathPhiPosi = Form("%s/hPtPhiPositive",PathPhi.Data()); + TString ccdbPathPhiNega = Form("%s/hPtPhiNegative",PathPhi.Data()); + auto phiPosi = fCCDB->getForTimeStamp(ccdbPathPhiPosi.Data(), timestamp); + auto phiNega = fCCDB->getForTimeStamp(ccdbPathPhiNega.Data(), timestamp); + if (phiPosi == nullptr || phiNega == nullptr) { + LOGF(fatal, "Phi distribution histograms not available in CCDB at timestamp=%llu", timestamp); + } + VarManager::SetPhiMap(phiPosi, phiNega); + } } // Template function to run same event pairing (barrel-barrel, muon-muon, barrel-muon) From 4b3f0df1aa9eb0040eccbade310eb26905424a79 Mon Sep 17 00:00:00 2001 From: ayatsuji <13807650+asakuratou@user.noreply.gitee.com> Date: Mon, 27 Jul 2026 21:26:21 +0800 Subject: [PATCH 02/11] edit phi distribution --- PWGDQ/Core/VarManager.cxx | 135 ++++++++------------------ PWGDQ/Core/VarManager.h | 17 ++-- PWGDQ/Tasks/tableReader_withAssoc.cxx | 10 +- 3 files changed, 57 insertions(+), 105 deletions(-) diff --git a/PWGDQ/Core/VarManager.cxx b/PWGDQ/Core/VarManager.cxx index cf98e8d799b..f9752b597a5 100644 --- a/PWGDQ/Core/VarManager.cxx +++ b/PWGDQ/Core/VarManager.cxx @@ -33,6 +33,7 @@ #include #include +#include #include #include #include @@ -75,8 +76,9 @@ int VarManager::fgCalibrationType = 0; // 0 - no calibration, 1 - bool VarManager::fgUseInterpolatedCalibration = true; // use interpolated calibration histograms (default: true) int VarManager::fgEfficiencyType = 0; // type of efficiency to be applied, default is no efficiency TObject* VarManager::fgEfficiencyHist = nullptr; // histogram for efficiency -TH3D* VarManager::fgPosiPhiMap = nullptr; -TH3D* VarManager::fgNegaPhiMap = nullptr; +TObject* VarManager::fgPosiPhiMap = nullptr; +TObject* VarManager::fgNegaPhiMap = nullptr; +bool VarManager::fgUsePhiCorrection = false; //__________________________________________________________________ VarManager::VarManager() : TObject() { @@ -454,93 +456,40 @@ void VarManager::FillEfficiency(float* values) } } -void VarManager::SetPhiMap(TH3D* hposi, TH3D* hnega) +void VarManager::SetPhiMap(TObject* hposi, TObject* hnega, bool option) { fgPosiPhiMap = hposi; fgNegaPhiMap = hnega; + fgUsePhiCorrection = option; } double VarManager::SampleRotationPhi(double pt, double eta, int charge) { // each type only alarm once - static bool warnedInvalidCharge = false; - static bool warnedMissingPositiveMap = false; - static bool warnedMissingNegativeMap = false; - static bool warnedOutOfRange = false; static bool warnedEmptyPhi = false; - TH3D* hMap = nullptr; - - if (charge > 0) { - hMap = fgPosiPhiMap; - - if (!hMap) { - if (!warnedMissingPositiveMap) { - LOGF(warn, - "Positive phi correction map is not available. " - "Falling back to uniform phi sampling."); - warnedMissingPositiveMap = true; - } + if (!fgUsePhiCorrection) { + return gRandom->Uniform(0., o2::constants::math::TwoPI); + } else { - return gRandom->Uniform( - 0., o2::constants::math::TwoPI); + TH3D* hMap = nullptr; + if (charge > 0) { + hMap = dynamic_cast(fgPosiPhiMap); + } else { + hMap = dynamic_cast(fgNegaPhiMap); } - } else if (charge < 0) { - hMap = fgNegaPhiMap; if (!hMap) { - if (!warnedMissingNegativeMap) { - LOGF(warn, - "Negative phi correction map is not available. " - "Falling back to uniform phi sampling."); - warnedMissingNegativeMap = true; - } - - return gRandom->Uniform( - 0., o2::constants::math::TwoPI); - } - } else { - if (!warnedInvalidCharge) { - LOGF(warn, - "Track with charge=0 passed to SampleRotationPhi. " - "Falling back to uniform phi sampling."); - warnedInvalidCharge = true; - } - - return gRandom->Uniform( - 0., o2::constants::math::TwoPI); - } - - // TH3 axes: X=pT, Y=phi, Z=eta - const int ptBin = hMap->GetXaxis()->FindBin(pt); - const int etaBin = hMap->GetZaxis()->FindBin(eta); - - if (ptBin < 1 || ptBin > hMap->GetNbinsX() || - etaBin < 1 || etaBin > hMap->GetNbinsZ()) { - if (!warnedOutOfRange) { - LOGF(warn, - "Track outside phi correction map: " - "pt=%f, eta=%f, charge=%d, ptBin=%d, etaBin=%d. " - "Map ranges: pt=[%f,%f], eta=[%f,%f]. " - "Falling back to uniform phi sampling.", - pt, - eta, - charge, - ptBin, - etaBin, - hMap->GetXaxis()->GetXmin(), - hMap->GetXaxis()->GetXmax(), - hMap->GetZaxis()->GetXmin(), - hMap->GetZaxis()->GetXmax()); - - warnedOutOfRange = true; + LOGF(fatal, "Phi map is not a TH3D"); } + // TH3 axes: X=pT, Y=phi, Z=eta + int ptBin = hMap->GetXaxis()->FindBin(pt); + int etaBin = hMap->GetZaxis()->FindBin(eta); - return gRandom->Uniform( - 0., o2::constants::math::TwoPI); - } + ptBin = std::clamp(ptBin, 1, hMap->GetNbinsX()); + etaBin = std::clamp(etaBin, 1, hMap->GetNbinsZ()); - TH1D* hPhi = hMap->ProjectionY( + TH1D* hPhi = hMap->ProjectionY( Form("hTRPhi_tmp_charge%d_ptbin%d_etabin%d", charge, ptBin, etaBin), ptBin, @@ -548,33 +497,33 @@ double VarManager::SampleRotationPhi(double pt, double eta, int charge) etaBin, etaBin); - if (!hPhi || - hPhi->Integral(1, hPhi->GetNbinsX()) <= 0.) { - if (!warnedEmptyPhi) { - LOGF(warn, - "Empty phi distribution for " - "pt=%f, eta=%f, charge=%d, ptBin=%d, etaBin=%d. " - "Falling back to uniform phi sampling.", - pt, - eta, - charge, - ptBin, - etaBin); - - warnedEmptyPhi = true; - } + if (!hPhi || hPhi->Integral(1, hPhi->GetNbinsX()) <= 0.) { + if (!warnedEmptyPhi) { + LOGF(warn, + "Empty phi distribution for " + "pt=%f, eta=%f, charge=%d, ptBin=%d, etaBin=%d. " + "Falling back to uniform phi sampling.", + pt, + eta, + charge, + ptBin, + etaBin); + + warnedEmptyPhi = true; + } - delete hPhi; + delete hPhi; - return gRandom->Uniform( + return gRandom->Uniform( 0., o2::constants::math::TwoPI); - } + } - const double phi = + const double phi = RecoDecay::constrainAngle(hPhi->GetRandom()); - delete hPhi; - return phi; + delete hPhi; + return phi; + } } //__________________________________________________________________ diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 2505a87916f..12857ca9766 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -1530,8 +1530,8 @@ class VarManager : public TObject static void SetEfficiencyObject(int type, TObject* obj); static void FillEfficiency(float* values = nullptr); - static void SetPhiMap(TH3D* h1, TH3D* h2); - static double SampleRotationPhi(double pT, int charge); + static void SetPhiMap(TObject* h1, TObject* h2, bool option); + static double SampleRotationPhi(double pT, double eta, int charge); static TObject* GetCalibrationObject(CalibObjects calib) { auto obj = fgCalibs.find(calib); @@ -1608,14 +1608,18 @@ class VarManager : public TObject static o2::vertexing::FwdDCAFitterN<3> fgFitterThreeProngFwd; static o2::globaltracking::MatchGlobalFwd mMatching; - static std::map fgCalibs; // map of calibration histograms + static std::map fgCalibs; // map of calibration histograms static std::array fgRunTPCPostCalibration; // 0-electron, 1-pion, 2-kaon, 3-proton - static int fgCalibrationType; // 0 - no calibration, 1 - calibration vs (TPCncls,pIN,eta) typically for pp, 2 - calibration vs (eta,nPV,nLong,tLong) typically for PbPb - static bool fgUseInterpolatedCalibration; // use interpolated calibration histograms (default: true) + static int fgCalibrationType; // 0 - no calibration, 1 - calibration vs (TPCncls,pIN,eta) typically for pp, 2 - calibration vs (eta,nPV,nLong,tLong) typically for PbPb + static bool fgUseInterpolatedCalibration; // use interpolated calibration histograms (default: true) static int fgEfficiencyType; // type of efficiency correction to apply static TObject* fgEfficiencyHist; // histogram for efficiency correction + static TObject* fgPosiPhiMap; // phi map to correct track rotation + static TObject* fgNegaPhiMap; + static bool fgUsePhiCorrection; + VarManager& operator=(const VarManager& c); VarManager(const VarManager& c); }; @@ -3958,8 +3962,7 @@ void VarManager::FillPairRotation(T1 const& t1, T2 const& t2, float* values) m2 = o2::constants::physics::MassMuon; } - double dphi = SampleRotationPhi(t2.pt(),t2.eta(),t2.sign()); - double rotationphi2 = RecoDecay::constrainAngle(t2.phi() + dphi); + double rotationphi2 = SampleRotationPhi(t2.pt(), t2.eta(), t2.sign()); values[kCharge] = t1.sign() + t2.sign(); values[kCharge1] = t1.sign(); diff --git a/PWGDQ/Tasks/tableReader_withAssoc.cxx b/PWGDQ/Tasks/tableReader_withAssoc.cxx index bede4af67ab..7bc5d77d76f 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc.cxx +++ b/PWGDQ/Tasks/tableReader_withAssoc.cxx @@ -1362,7 +1362,7 @@ struct AnalysisSameEventPairing { Configurable GrpLhcIfPath{"grplhcif", "GLO/Config/GRPLHCIF", "Path on the CCDB for the GRPLHCIF object"}; Configurable efficiencyPath{"effHistPath", "Users/z/zhxiong/efficiency", "Path on the CCDB for the efficiency histograms"}; Configurable flowPath{"flowPath", "Users/y/yiping/FlowResolution", "Path to the flow resolution object"}; - Configurable phiPath{"phiPath","Users/h/hxiaoyu/TrackPhi/LHC23","Path to load phi distribution for track rotation"}; + Configurable phiPath{"phiPath", "Users/h/hxiaoyu/TrackPhi/LHC23", "Path to load phi distribution for track rotation"}; } fConfigCCDB; struct : ConfigurableGroup { @@ -1382,7 +1382,7 @@ struct AnalysisSameEventPairing { Configurable useEfficiencyWeighting{"cfgUseEfficiencyWeighting", false, "Apply efficiency weighting to the pairs from CCDB"}; Configurable efficiencyType{"cfgEfficiencyType", 0, "Type of efficiency to apply from CCDB: 0 no efficiency, 1 pt-cent-costhetastar"}; Configurable useFlowReso{"cfgUseFlowReso", false, "Use remote flow information from CCDB"}; - Configurable usePhiDistribution{"cfgUsePhiDistribution",false,"Use phi distribution to correct track rotation"}; + Configurable usePhiDistribution{"cfgUsePhiDistribution", false, "Use phi distribution to correct track rotation"}; } fConfigOptions; struct : ConfigurableGroup { Configurable applyBDT{"applyBDT", false, "Flag to apply ML selections"}; @@ -1860,14 +1860,14 @@ struct AnalysisSameEventPairing { if (fConfigOptions.usePhiDistribution) { TString PathPhi = fConfigCCDB.phiPath.value; - TString ccdbPathPhiPosi = Form("%s/hPtPhiPositive",PathPhi.Data()); - TString ccdbPathPhiNega = Form("%s/hPtPhiNegative",PathPhi.Data()); + TString ccdbPathPhiPosi = Form("%s/hPtPhiPositive", PathPhi.Data()); + TString ccdbPathPhiNega = Form("%s/hPtPhiNegative", PathPhi.Data()); auto phiPosi = fCCDB->getForTimeStamp(ccdbPathPhiPosi.Data(), timestamp); auto phiNega = fCCDB->getForTimeStamp(ccdbPathPhiNega.Data(), timestamp); if (phiPosi == nullptr || phiNega == nullptr) { LOGF(fatal, "Phi distribution histograms not available in CCDB at timestamp=%llu", timestamp); } - VarManager::SetPhiMap(phiPosi, phiNega); + VarManager::SetPhiMap(phiPosi, phiNega, fConfigOptions.usePhiDistribution.value); } } From c7d5ef149c83468373cab5b51ce7640c8d9238c9 Mon Sep 17 00:00:00 2001 From: ayatsuji <13807650+asakuratou@user.noreply.gitee.com> Date: Wed, 26 Aug 2026 16:33:28 +0800 Subject: [PATCH 03/11] Add EP-preserving track rotation --- PWGDQ/Core/VarManager.cxx | 73 +-------------------------- PWGDQ/Core/VarManager.h | 22 ++++++-- PWGDQ/Tasks/tableReader_withAssoc.cxx | 30 +++++------ 3 files changed, 32 insertions(+), 93 deletions(-) diff --git a/PWGDQ/Core/VarManager.cxx b/PWGDQ/Core/VarManager.cxx index f9752b597a5..9fd4cde7b78 100644 --- a/PWGDQ/Core/VarManager.cxx +++ b/PWGDQ/Core/VarManager.cxx @@ -76,9 +76,7 @@ int VarManager::fgCalibrationType = 0; // 0 - no calibration, 1 - bool VarManager::fgUseInterpolatedCalibration = true; // use interpolated calibration histograms (default: true) int VarManager::fgEfficiencyType = 0; // type of efficiency to be applied, default is no efficiency TObject* VarManager::fgEfficiencyHist = nullptr; // histogram for efficiency -TObject* VarManager::fgPosiPhiMap = nullptr; -TObject* VarManager::fgNegaPhiMap = nullptr; -bool VarManager::fgUsePhiCorrection = false; + //__________________________________________________________________ VarManager::VarManager() : TObject() { @@ -456,75 +454,6 @@ void VarManager::FillEfficiency(float* values) } } -void VarManager::SetPhiMap(TObject* hposi, TObject* hnega, bool option) -{ - fgPosiPhiMap = hposi; - fgNegaPhiMap = hnega; - fgUsePhiCorrection = option; -} - -double VarManager::SampleRotationPhi(double pt, double eta, int charge) -{ - // each type only alarm once - static bool warnedEmptyPhi = false; - - if (!fgUsePhiCorrection) { - return gRandom->Uniform(0., o2::constants::math::TwoPI); - } else { - - TH3D* hMap = nullptr; - if (charge > 0) { - hMap = dynamic_cast(fgPosiPhiMap); - } else { - hMap = dynamic_cast(fgNegaPhiMap); - } - - if (!hMap) { - LOGF(fatal, "Phi map is not a TH3D"); - } - // TH3 axes: X=pT, Y=phi, Z=eta - int ptBin = hMap->GetXaxis()->FindBin(pt); - int etaBin = hMap->GetZaxis()->FindBin(eta); - - ptBin = std::clamp(ptBin, 1, hMap->GetNbinsX()); - etaBin = std::clamp(etaBin, 1, hMap->GetNbinsZ()); - - TH1D* hPhi = hMap->ProjectionY( - Form("hTRPhi_tmp_charge%d_ptbin%d_etabin%d", - charge, ptBin, etaBin), - ptBin, - ptBin, - etaBin, - etaBin); - - if (!hPhi || hPhi->Integral(1, hPhi->GetNbinsX()) <= 0.) { - if (!warnedEmptyPhi) { - LOGF(warn, - "Empty phi distribution for " - "pt=%f, eta=%f, charge=%d, ptBin=%d, etaBin=%d. " - "Falling back to uniform phi sampling.", - pt, - eta, - charge, - ptBin, - etaBin); - - warnedEmptyPhi = true; - } - - delete hPhi; - - return gRandom->Uniform( - 0., o2::constants::math::TwoPI); - } - - const double phi = - RecoDecay::constrainAngle(hPhi->GetRandom()); - - delete hPhi; - return phi; - } -} //__________________________________________________________________ std::tuple VarManager::BimodalityCoefficientUnbinned(const std::vector& data) diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 12857ca9766..ca5100358a1 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -1428,7 +1428,7 @@ class VarManager : public TObject template static void FillPair(T1 const& t1, T2 const& t2, float* values = nullptr); template - static void FillPairRotation(T1 const& t1, T2 const& t2, float* values = nullptr); + static void FillPairRotation(T1 const& t1, T2 const& t2, int rotation, float* values = nullptr); template static void FillPairCollision(C const& collision, T1 const& t1, T2 const& t2, float* values = nullptr); template @@ -1530,8 +1530,6 @@ class VarManager : public TObject static void SetEfficiencyObject(int type, TObject* obj); static void FillEfficiency(float* values = nullptr); - static void SetPhiMap(TObject* h1, TObject* h2, bool option); - static double SampleRotationPhi(double pT, double eta, int charge); static TObject* GetCalibrationObject(CalibObjects calib) { auto obj = fgCalibs.find(calib); @@ -3932,7 +3930,7 @@ void VarManager::FillPair(T1 const& t1, T2 const& t2, float* values) // change_start: rotation pair template -void VarManager::FillPairRotation(T1 const& t1, T2 const& t2, float* values) +void VarManager::FillPairRotation(T1 const& t1, T2 const& t2, int rotation, float* values) { if (!values) { values = fgValues; @@ -3962,7 +3960,21 @@ void VarManager::FillPairRotation(T1 const& t1, T2 const& t2, float* values) m2 = o2::constants::physics::MassMuon; } - double rotationphi2 = SampleRotationPhi(t2.pt(), t2.eta(), t2.sign()); + double rotationphi2 = t2.phi(); + + if (rotation == 1) { + rotationphi2 = t2.phi() + o2::constants::math::PI; + } else if (rotation == 2) { + rotationphi2 = 2*values[kPsi2A] - t2.phi() ; + } else if (rotation == 3) { + rotationphi2 = 2*values[kPsi2A] - t2.phi() + o2::constants::math::PI; + } + + if (rotationphi2 >= o2::constants::math::TwoPI) { + rotationphi2 -= o2::constants::math::TwoPI; + } else if (rotationphi2 < 0) { + rotationphi2 += o2::constants::math::TwoPI; + } values[kCharge] = t1.sign() + t2.sign(); values[kCharge1] = t1.sign(); diff --git a/PWGDQ/Tasks/tableReader_withAssoc.cxx b/PWGDQ/Tasks/tableReader_withAssoc.cxx index 7bc5d77d76f..d0578b92fd9 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc.cxx +++ b/PWGDQ/Tasks/tableReader_withAssoc.cxx @@ -1362,7 +1362,6 @@ struct AnalysisSameEventPairing { Configurable GrpLhcIfPath{"grplhcif", "GLO/Config/GRPLHCIF", "Path on the CCDB for the GRPLHCIF object"}; Configurable efficiencyPath{"effHistPath", "Users/z/zhxiong/efficiency", "Path on the CCDB for the efficiency histograms"}; Configurable flowPath{"flowPath", "Users/y/yiping/FlowResolution", "Path to the flow resolution object"}; - Configurable phiPath{"phiPath", "Users/h/hxiaoyu/TrackPhi/LHC23", "Path to load phi distribution for track rotation"}; } fConfigCCDB; struct : ConfigurableGroup { @@ -1382,7 +1381,6 @@ struct AnalysisSameEventPairing { Configurable useEfficiencyWeighting{"cfgUseEfficiencyWeighting", false, "Apply efficiency weighting to the pairs from CCDB"}; Configurable efficiencyType{"cfgEfficiencyType", 0, "Type of efficiency to apply from CCDB: 0 no efficiency, 1 pt-cent-costhetastar"}; Configurable useFlowReso{"cfgUseFlowReso", false, "Use remote flow information from CCDB"}; - Configurable usePhiDistribution{"cfgUsePhiDistribution", false, "Use phi distribution to correct track rotation"}; } fConfigOptions; struct : ConfigurableGroup { Configurable applyBDT{"applyBDT", false, "Flag to apply ML selections"}; @@ -1857,18 +1855,6 @@ struct AnalysisSameEventPairing { LOGF(fatal, "Flow resolution histograms not available in CCDB at timestamp=%llu", timestamp); } } - - if (fConfigOptions.usePhiDistribution) { - TString PathPhi = fConfigCCDB.phiPath.value; - TString ccdbPathPhiPosi = Form("%s/hPtPhiPositive", PathPhi.Data()); - TString ccdbPathPhiNega = Form("%s/hPtPhiNegative", PathPhi.Data()); - auto phiPosi = fCCDB->getForTimeStamp(ccdbPathPhiPosi.Data(), timestamp); - auto phiNega = fCCDB->getForTimeStamp(ccdbPathPhiNega.Data(), timestamp); - if (phiPosi == nullptr || phiNega == nullptr) { - LOGF(fatal, "Phi distribution histograms not available in CCDB at timestamp=%llu", timestamp); - } - VarManager::SetPhiMap(phiPosi, phiNega, fConfigOptions.usePhiDistribution.value); - } } // Template function to run same event pairing (barrel-barrel, muon-muon, barrel-muon) @@ -2420,14 +2406,26 @@ struct AnalysisSameEventPairing { } } if (sign1 * sign2 < 0) { - for (int i = 0; i < fConfigNRotations.value; i++) { - VarManager::FillPairRotation(t1, t2); + if (fConfigNRotations.value == 1) { + VarManager::FillPairRotation(t1, t2, fConfigNRotations.value); if constexpr (TPairType == VarManager::kDecayToEE) { fHistMan->FillHistClass(Form("PairsBarrelTRPM_%s", fTrackCuts[icut].Data()), dqtablereader_helpers::varValues()); if (isAmbiExtra) { fHistMan->FillHistClass(Form("PairsBarrelTRPM_ambiguousextra_%s", fTrackCuts[icut].Data()), dqtablereader_helpers::varValues()); } } + } elif(fConfigNRotations.value == 3) { + for (int irot = 1; irot <= fConfigNRotations.value; irot++) { + VarManager::FillPairRotation(t1, t2, irot); + if constexpr (TPairType == VarManager::kDecayToEE) { + fHistMan->FillHistClass(Form("PairsBarrelTRPM_%s", fTrackCuts[icut].Data()), dqtablereader_helpers::varValues()); + if (isAmbiExtra) { + fHistMan->FillHistClass(Form("PairsBarrelTRPM_ambiguousextra_%s", fTrackCuts[icut].Data()), dqtablereader_helpers::varValues()); + } + } + } + } else { + LOGF(fatal, "Unsupported number of rotations: %d, only 1 and 3 are supported", fConfigNRotations.value); } } } From 73d4a778dcb5df7e3e410668be498d4b025e5244 Mon Sep 17 00:00:00 2001 From: ayatsuji <13807650+asakuratou@user.noreply.gitee.com> Date: Wed, 26 Aug 2026 18:40:32 +0800 Subject: [PATCH 04/11] Add EP-preserving track rotation --- PWGDQ/Tasks/tableReader_withAssoc.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGDQ/Tasks/tableReader_withAssoc.cxx b/PWGDQ/Tasks/tableReader_withAssoc.cxx index d0578b92fd9..4a66e1d39a4 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc.cxx +++ b/PWGDQ/Tasks/tableReader_withAssoc.cxx @@ -1352,7 +1352,7 @@ struct AnalysisSameEventPairing { // option for TR pair fill Configurable fConfigTRPairs{"cfgFillTRPairs", false, "If true, fill Track rotation pairs"}; - Configurable fConfigNRotations{"cfgNRotations", 20, "Number of rotations for track rotation method"}; + Configurable fConfigNRotations{"cfgNRotations", 3, "Number of rotations for event plane preserving track rotation method, only 1 or 3 are supported"}; struct : ConfigurableGroup { Configurable url{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; @@ -2414,7 +2414,7 @@ struct AnalysisSameEventPairing { fHistMan->FillHistClass(Form("PairsBarrelTRPM_ambiguousextra_%s", fTrackCuts[icut].Data()), dqtablereader_helpers::varValues()); } } - } elif(fConfigNRotations.value == 3) { + } else if(fConfigNRotations.value == 3) { for (int irot = 1; irot <= fConfigNRotations.value; irot++) { VarManager::FillPairRotation(t1, t2, irot); if constexpr (TPairType == VarManager::kDecayToEE) { From e85c101738eb6a5c51c1846e5f699a2fdb9bebe4 Mon Sep 17 00:00:00 2001 From: ayatsuji <13807650+asakuratou@user.noreply.gitee.com> Date: Wed, 26 Aug 2026 18:51:25 +0800 Subject: [PATCH 05/11] Add EP-preserving track rotation --- PWGDQ/Core/VarManager.cxx | 1 - PWGDQ/Core/VarManager.h | 4 ++-- PWGDQ/Tasks/tableReader_withAssoc.cxx | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/PWGDQ/Core/VarManager.cxx b/PWGDQ/Core/VarManager.cxx index 9fd4cde7b78..3ae70d65c9f 100644 --- a/PWGDQ/Core/VarManager.cxx +++ b/PWGDQ/Core/VarManager.cxx @@ -454,7 +454,6 @@ void VarManager::FillEfficiency(float* values) } } - //__________________________________________________________________ std::tuple VarManager::BimodalityCoefficientUnbinned(const std::vector& data) { diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index ca5100358a1..8b21bfc3de0 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -3965,9 +3965,9 @@ void VarManager::FillPairRotation(T1 const& t1, T2 const& t2, int rotation, floa if (rotation == 1) { rotationphi2 = t2.phi() + o2::constants::math::PI; } else if (rotation == 2) { - rotationphi2 = 2*values[kPsi2A] - t2.phi() ; + rotationphi2 = 2 * values[kPsi2A] - t2.phi(); } else if (rotation == 3) { - rotationphi2 = 2*values[kPsi2A] - t2.phi() + o2::constants::math::PI; + rotationphi2 = 2 * values[kPsi2A] - t2.phi() + o2::constants::math::PI; } if (rotationphi2 >= o2::constants::math::TwoPI) { diff --git a/PWGDQ/Tasks/tableReader_withAssoc.cxx b/PWGDQ/Tasks/tableReader_withAssoc.cxx index 4a66e1d39a4..4d168387a0a 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc.cxx +++ b/PWGDQ/Tasks/tableReader_withAssoc.cxx @@ -2414,7 +2414,7 @@ struct AnalysisSameEventPairing { fHistMan->FillHistClass(Form("PairsBarrelTRPM_ambiguousextra_%s", fTrackCuts[icut].Data()), dqtablereader_helpers::varValues()); } } - } else if(fConfigNRotations.value == 3) { + } else if (fConfigNRotations.value == 3) { for (int irot = 1; irot <= fConfigNRotations.value; irot++) { VarManager::FillPairRotation(t1, t2, irot); if constexpr (TPairType == VarManager::kDecayToEE) { From 99c6855399251fccd9a22296e731035ac83c125b Mon Sep 17 00:00:00 2001 From: ayatsuji <13807650+asakuratou@user.noreply.gitee.com> Date: Sun, 20 Sep 2026 19:11:21 +0800 Subject: [PATCH 06/11] add MEPM rotated legs --- PWGDQ/Core/VarManager.h | 47 +++++++++++++++++++++++++++ PWGDQ/Tasks/tableReader_withAssoc.cxx | 32 ++++++++++++++++-- 2 files changed, 77 insertions(+), 2 deletions(-) diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index b9ed57a3153..cae97a14877 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -1461,6 +1461,8 @@ class VarManager : public TObject static void FillPair(T1 const& t1, T2 const& t2, float* values = nullptr); template static void FillPairRotation(T1 const& t1, T2 const& t2, int rotation, float* values = nullptr); + template + static void FillPairRotation_ME(T const& t1, T const& t2, int rotation, float* values = nullptr); template static void FillPairCollision(C const& collision, T1 const& t1, T2 const& t2, float* values = nullptr); template @@ -4511,6 +4513,51 @@ void VarManager::FillPairME(T1 const& t1, T2 const& t2, float* values) } } +template +void VarManager::FillPairRotation_ME(T const& t1, T const& t2, int rotation, float* values) +{ + if (!values) { + values = fgValues; + } + + float m1 = o2::constants::physics::MassElectron; + double rotationphi2 = t2.phi; + + if (rotation == 1) { + rotationphi2 = t2.phi + o2::constants::math::PI; + } else if (rotation == 2) { + rotationphi2 = 2 * values[kPsi2A] - t2.phi; + } else if (rotation == 3) { + rotationphi2 = 2 * values[kPsi2A] - t2.phi + o2::constants::math::PI; + } + + if (rotationphi2 >= o2::constants::math::TwoPI) { + rotationphi2 -= o2::constants::math::TwoPI; + } else if (rotationphi2 < 0) { + rotationphi2 += o2::constants::math::TwoPI; + } + + ROOT::Math::PtEtaPhiMVector v1(t1.pt, t1.eta, t1.phi, m1); + ROOT::Math::PtEtaPhiMVector v2(t2.pt, t2.eta, rotationphi2, m1); + ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; + values[kMass] = v12.M(); + values[kPt] = v12.Pt(); + values[kEta] = v12.Eta(); + // values[kPhi] = v12.Phi(); + values[kPhi] = RecoDecay::constrainAngle(v12.Phi()); + values[kRap] = -v12.Rapidity(); + double Ptot1 = TMath::Sqrt(v1.Px() * v1.Px() + v1.Py() * v1.Py() + v1.Pz() * v1.Pz()); + double Ptot2 = TMath::Sqrt(v2.Px() * v2.Px() + v2.Py() * v2.Py() + v2.Pz() * v2.Pz()); + values[kDeltaPtotTracks] = Ptot1 - Ptot2; + + values[kPt1] = t1.pt; + values[kEta1] = t1.eta; + values[kPhi1] = t1.phi; + values[kPt2] = t2.pt; + values[kEta2] = t2.eta; + values[kPhi2] = rotationphi2; +} + template void VarManager::FillPairMEAcrossTFs(T const& t1, T const& t2, float* values) { diff --git a/PWGDQ/Tasks/tableReader_withAssoc.cxx b/PWGDQ/Tasks/tableReader_withAssoc.cxx index 393d949994b..9a509c5f615 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc.cxx +++ b/PWGDQ/Tasks/tableReader_withAssoc.cxx @@ -1610,13 +1610,14 @@ struct AnalysisSameEventPairing { if (fConfigTRPairs) { names.push_back(Form("PairsBarrelTRPM_%s", objArray->At(icut)->GetName())); names.push_back(Form("PairsBarrelTRPM_ambiguousextra_%s", objArray->At(icut)->GetName())); - histNames += Form("%s;%s;", names[6].Data(), names[7].Data()); + names.push_back(Form("PairsBarrelTR_MEPM_%s", objArray->At(icut)->GetName())); + histNames += Form("%s;%s;%s;", names[6].Data(), names[7].Data(), names[8].Data()); } if (fEnableBarrelMixingHistos) { names.push_back(Form("PairsBarrelMEPM_%s", objArray->At(icut)->GetName())); names.push_back(Form("PairsBarrelMEPP_%s", objArray->At(icut)->GetName())); names.push_back(Form("PairsBarrelMEMM_%s", objArray->At(icut)->GetName())); - histNames += Form("%s;%s;%s;", names[(fConfigTRPairs ? 8 : 6)].Data(), names[(fConfigTRPairs ? 9 : 7)].Data(), names[(fConfigTRPairs ? 10 : 8)].Data()); + histNames += Form("%s;%s;%s;", names[(fConfigTRPairs ? 9 : 6)].Data(), names[(fConfigTRPairs ? 10 : 7)].Data(), names[(fConfigTRPairs ? 11 : 8)].Data()); } fTrackHistNames[icut] = names; @@ -2519,6 +2520,20 @@ struct AnalysisSameEventPairing { fHistMan->FillHistClass(Form("PairsBarrelMEPM_%s", fTrackCuts[icut].Data()), dqtablereader_helpers::varValues()); } } + if (fConfigTRPairs) { + // mixing event track should be rotated, so second parameter + if (fConfigNRotations.value != 1 && fConfigNRotations.value != 3) { + LOGF(fatal, "Unsupported number of rotations: %d, only 1 and 3 are supported", fConfigNRotations.value); + } + for (int irot = 1; irot <= fConfigNRotations.value; ++irot) { + VarManager::FillPairRotation_ME(t2, t1, irot); + for (int icut = 0; icut < ncuts; icut++) { + if (mixedTwoTrackFilter & (static_cast(1) << icut)) { + fHistMan->FillHistClass(Form("PairsBarrelTR_MEPM_%s", fTrackCuts[icut].Data()), dqtablereader_helpers::varValues()); + } + } + } + } } // run ++ pairing for (auto const& t2 : poolEvent.tracks1) { @@ -2549,6 +2564,19 @@ struct AnalysisSameEventPairing { fHistMan->FillHistClass(Form("PairsBarrelMEPM_%s", fTrackCuts[icut].Data()), dqtablereader_helpers::varValues()); } } + if (fConfigTRPairs) { + if (fConfigNRotations.value != 1 && fConfigNRotations.value != 3) { + LOGF(fatal, "Unsupported number of rotations: %d, only 1 and 3 are supported", fConfigNRotations.value); + } + for (int irot = 1; irot <= fConfigNRotations.value; ++irot) { + VarManager::FillPairRotation_ME(t2, t1, irot); + for (int icut = 0; icut < ncuts; icut++) { + if (mixedTwoTrackFilter & (static_cast(1) << icut)) { + fHistMan->FillHistClass(Form("PairsBarrelTR_MEPM_%s", fTrackCuts[icut].Data()), dqtablereader_helpers::varValues()); + } + } + } + } } // run -- pairing for (auto const& t2 : poolEvent.tracks2) { From 3c4f361090ce91ab4a3975f4866bdb88c13b48f8 Mon Sep 17 00:00:00 2001 From: ayatsuji <13807650+asakuratou@user.noreply.gitee.com> Date: Sun, 20 Sep 2026 20:30:31 +0800 Subject: [PATCH 07/11] format --- PWGDQ/Tasks/tableReader_withAssoc.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/PWGDQ/Tasks/tableReader_withAssoc.h b/PWGDQ/Tasks/tableReader_withAssoc.h index a80944615e0..137380ad8b2 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc.h +++ b/PWGDQ/Tasks/tableReader_withAssoc.h @@ -2479,7 +2479,9 @@ struct AnalysisSameEventPairing { } } else { LOGF(fatal, "Unsupported number of rotations: %d, only 1 and 3 are supported", fConfigNRotations.value); - } else if (fConfigNRotations.value == 3) { + } + else if (fConfigNRotations.value == 3) + { for (int irot = 1; irot <= fConfigNRotations.value; irot++) { VarManager::FillPairRotation(t1, t2, irot); if constexpr (TPairType == VarManager::kDecayToEE) { @@ -2489,7 +2491,9 @@ struct AnalysisSameEventPairing { } } } - } else { + } + else + { LOGF(fatal, "Unsupported number of rotations: %d, only 1 and 3 are supported", fConfigNRotations.value); } } From 1cc3502c8c5f4520b2dbc7369dac19684d888cbd Mon Sep 17 00:00:00 2001 From: ayatsuji <13807650+asakuratou@user.noreply.gitee.com> Date: Sun, 20 Sep 2026 20:44:07 +0800 Subject: [PATCH 08/11] format --- PWGDQ/Tasks/tableReader_withAssoc.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/PWGDQ/Tasks/tableReader_withAssoc.h b/PWGDQ/Tasks/tableReader_withAssoc.h index 137380ad8b2..def7ee17401 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc.h +++ b/PWGDQ/Tasks/tableReader_withAssoc.h @@ -2479,8 +2479,7 @@ struct AnalysisSameEventPairing { } } else { LOGF(fatal, "Unsupported number of rotations: %d, only 1 and 3 are supported", fConfigNRotations.value); - } - else if (fConfigNRotations.value == 3) + } else if (fConfigNRotations.value == 3) { for (int irot = 1; irot <= fConfigNRotations.value; irot++) { VarManager::FillPairRotation(t1, t2, irot); @@ -2491,8 +2490,7 @@ struct AnalysisSameEventPairing { } } } - } - else + } else { LOGF(fatal, "Unsupported number of rotations: %d, only 1 and 3 are supported", fConfigNRotations.value); } From 2a7605a4ceaae560d960e5633abe8ae23167499f Mon Sep 17 00:00:00 2001 From: ayatsuji <13807650+asakuratou@user.noreply.gitee.com> Date: Sun, 20 Sep 2026 20:47:08 +0800 Subject: [PATCH 09/11] format --- PWGDQ/Tasks/tableReader_withAssoc.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/PWGDQ/Tasks/tableReader_withAssoc.h b/PWGDQ/Tasks/tableReader_withAssoc.h index def7ee17401..a80944615e0 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc.h +++ b/PWGDQ/Tasks/tableReader_withAssoc.h @@ -2479,8 +2479,7 @@ struct AnalysisSameEventPairing { } } else { LOGF(fatal, "Unsupported number of rotations: %d, only 1 and 3 are supported", fConfigNRotations.value); - } else if (fConfigNRotations.value == 3) - { + } else if (fConfigNRotations.value == 3) { for (int irot = 1; irot <= fConfigNRotations.value; irot++) { VarManager::FillPairRotation(t1, t2, irot); if constexpr (TPairType == VarManager::kDecayToEE) { @@ -2490,8 +2489,7 @@ struct AnalysisSameEventPairing { } } } - } else - { + } else { LOGF(fatal, "Unsupported number of rotations: %d, only 1 and 3 are supported", fConfigNRotations.value); } } From 20dee4c9e41aca4d66b898d48de22727fbca102a Mon Sep 17 00:00:00 2001 From: ayatsuji <13807650+asakuratou@user.noreply.gitee.com> Date: Sun, 20 Sep 2026 20:51:49 +0800 Subject: [PATCH 10/11] format --- PWGDQ/Tasks/tableReader_withAssoc.h | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/PWGDQ/Tasks/tableReader_withAssoc.h b/PWGDQ/Tasks/tableReader_withAssoc.h index a80944615e0..29fbce97408 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc.h +++ b/PWGDQ/Tasks/tableReader_withAssoc.h @@ -2479,18 +2479,6 @@ struct AnalysisSameEventPairing { } } else { LOGF(fatal, "Unsupported number of rotations: %d, only 1 and 3 are supported", fConfigNRotations.value); - } else if (fConfigNRotations.value == 3) { - for (int irot = 1; irot <= fConfigNRotations.value; irot++) { - VarManager::FillPairRotation(t1, t2, irot); - if constexpr (TPairType == VarManager::kDecayToEE) { - fHistMan->FillHistClass(Form("PairsBarrelTRPM_%s", fTrackCuts[icut].Data()), dqtablereader_helpers::varValues()); - if (isAmbiExtra) { - fHistMan->FillHistClass(Form("PairsBarrelTRPM_ambiguousextra_%s", fTrackCuts[icut].Data()), dqtablereader_helpers::varValues()); - } - } - } - } else { - LOGF(fatal, "Unsupported number of rotations: %d, only 1 and 3 are supported", fConfigNRotations.value); } } } From bc7e0e3582552f80538fdab17bab3aa92494ea9b Mon Sep 17 00:00:00 2001 From: ayatsuji <13807650+asakuratou@user.noreply.gitee.com> Date: Sun, 20 Sep 2026 21:15:45 +0800 Subject: [PATCH 11/11] format --- PWGDQ/Tasks/tableReader_withAssoc.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGDQ/Tasks/tableReader_withAssoc.h b/PWGDQ/Tasks/tableReader_withAssoc.h index 29fbce97408..927ce012626 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc.h +++ b/PWGDQ/Tasks/tableReader_withAssoc.h @@ -1377,8 +1377,8 @@ struct AnalysisSameEventPairing { o2::framework::Configurable fConfigAmbiguousMuonHistograms{"cfgAmbiguousMuonHistograms", true, "If true, fill ambiguous histograms"}; // option for TR pair fill - Configurable fConfigTRPairs{"cfgFillTRPairs", false, "If true, fill Track rotation pairs"}; - Configurable fConfigNRotations{"cfgNRotations", 3, "Number of rotations for event plane preserving track rotation method, only 1 or 3 are supported"}; + o2::framework::Configurable fConfigTRPairs{"cfgFillTRPairs", false, "If true, fill Track rotation pairs"}; + o2::framework::Configurable fConfigNRotations{"cfgNRotations", 3, "Number of rotations for event plane preserving track rotation method, only 1 or 3 are supported"}; struct : o2::framework::ConfigurableGroup { o2::framework::Configurable url{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"};