From cde7c65f8efeb5c330dc84690073f1370573a22c Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Thu, 9 Apr 2026 11:48:52 +0200 Subject: [PATCH] PWGEM/Dilepton: add option for vn{EP} --- PWGEM/Dilepton/Core/Dilepton.h | 77 +++++++++++++++++++++----- PWGEM/Dilepton/Utils/EventHistograms.h | 64 ++++++++++++++++++++- PWGEM/Dilepton/Utils/PairUtilities.h | 6 +- 3 files changed, 129 insertions(+), 18 deletions(-) diff --git a/PWGEM/Dilepton/Core/Dilepton.h b/PWGEM/Dilepton/Core/Dilepton.h index b5ba7dad68e..d9c4c3cf9b0 100644 --- a/PWGEM/Dilepton/Core/Dilepton.h +++ b/PWGEM/Dilepton/Core/Dilepton.h @@ -114,9 +114,10 @@ struct Dilepton { o2::framework::Configurable spresoPath{"spresoPath", "Users/d/dsekihat/PWGEM/dilepton/Qvector/resolution/LHC23zzh/pass3/test", "Path to SP resolution file"}; o2::framework::Configurable spresoHistName{"spresoHistName", "h1_R2_FT0M_BPos_BNeg", "histogram name of SP resolution file"}; - o2::framework::Configurable cfgAnalysisType{"cfgAnalysisType", static_cast(o2::aod::pwgem::dilepton::utils::pairutil::DileptonAnalysisType::kQC), "kQC:0, kUPC:1, kFlowV2:2, kFlowV3:3, kPolarization:4, kHFll:5, kBootstrapv2:6"}; + o2::framework::Configurable cfgAnalysisType{"cfgAnalysisType", static_cast(o2::aod::pwgem::dilepton::utils::pairutil::DileptonAnalysisType::kQC), "kQC:0, kUPC:1, kFlowV2SP:2, kFlowV3SP:3, kPolarization:4, kHFll:5, kBootstrapv2:6, kFlowV2EP:7, kFlowV3EP:8"}; o2::framework::Configurable cfgEP2Estimator_for_Mix{"cfgEP2Estimator_for_Mix", 3, "FT0M:0, FT0A:1, FT0C:2, BTot:3, BPos:4, BNeg:5, FV0A:6"}; o2::framework::Configurable cfgQvecEstimator{"cfgQvecEstimator", 2, "FT0M:0, FT0A:1, FT0C:2, BTot:3, BPos:4, BNeg:5, FV0A:6"}; + o2::framework::Configurable cfgEPEstimator{"cfgEPEstimator", 2, "FT0M:0, FT0A:1, FT0C:2, BTot:3, BPos:4, BNeg:5, FV0A:6"}; o2::framework::Configurable cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"}; o2::framework::Configurable cfgOccupancyEstimator{"cfgOccupancyEstimator", 0, "FT0C:0, Track:1"}; o2::framework::Configurable cfgDoMix{"cfgDoMix", true, "flag for event mixing"}; @@ -619,7 +620,7 @@ struct Dilepton { } else if (cfgAnalysisType == static_cast(o2::aod::pwgem::dilepton::utils::pairutil::DileptonAnalysisType::kUPC)) { const o2::framework::AxisSpec axis_aco{10, 0, 1.f, "#alpha = 1 - #frac{|#varphi_{l^{+}} - #varphi_{l^{-}}|}{#pi}"}; const o2::framework::AxisSpec axis_asym_pt{10, 0, 1.f, "A = #frac{|p_{T,l^{+}} - p_{T,l^{-}}|}{|p_{T,l^{+}} + p_{T,l^{-}}|}"}; - const o2::framework::AxisSpec axis_dphi_e_ee{18, 0, M_PI, "#Delta#varphi = #varphi_{l} - #varphi_{ll} (rad.)"}; + const o2::framework::AxisSpec axis_dphi_l_ll{18, 0, M_PI, "#Delta#varphi = #varphi_{l} - #varphi_{ll} (rad.)"}; std::string frameName = "CS"; if (cfgPolarizationFrame == 0) { @@ -630,14 +631,14 @@ struct Dilepton { LOG(fatal) << "set 0 or 1 to cfgPolarizationFrame!"; } const o2::framework::AxisSpec axis_cos_theta{ConfPolarizationCosThetaBins, Form("cos(#theta^{%s})", frameName.data())}; - fRegistry.add("Pair/same/uls/hs", "dilepton", o2::framework::kTHnSparseD, {axis_mass, axis_pt, axis_dca, axis_y, axis_aco, axis_asym_pt, axis_dphi_e_ee, axis_cos_theta}, true); + fRegistry.add("Pair/same/uls/hs", "dilepton", o2::framework::kTHnSparseD, {axis_mass, axis_pt, axis_dca, axis_y, axis_aco, axis_asym_pt, axis_dphi_l_ll, axis_cos_theta}, true); fRegistry.addClone("Pair/same/uls/", "Pair/same/lspp/"); fRegistry.addClone("Pair/same/uls/", "Pair/same/lsmm/"); fRegistry.addClone("Pair/same/", "Pair/mix/"); - } else if (cfgAnalysisType == static_cast(o2::aod::pwgem::dilepton::utils::pairutil::DileptonAnalysisType::kFlowV2) || cfgAnalysisType == static_cast(o2::aod::pwgem::dilepton::utils::pairutil::DileptonAnalysisType::kFlowV3)) { - if (cfgAnalysisType == static_cast(o2::aod::pwgem::dilepton::utils::pairutil::DileptonAnalysisType::kFlowV2)) { + } else if (cfgAnalysisType == static_cast(o2::aod::pwgem::dilepton::utils::pairutil::DileptonAnalysisType::kFlowV2SP) || cfgAnalysisType == static_cast(o2::aod::pwgem::dilepton::utils::pairutil::DileptonAnalysisType::kFlowV3SP)) { + if (cfgAnalysisType == static_cast(o2::aod::pwgem::dilepton::utils::pairutil::DileptonAnalysisType::kFlowV2SP)) { nmod = 2; - } else if (cfgAnalysisType == static_cast(o2::aod::pwgem::dilepton::utils::pairutil::DileptonAnalysisType::kFlowV3)) { + } else if (cfgAnalysisType == static_cast(o2::aod::pwgem::dilepton::utils::pairutil::DileptonAnalysisType::kFlowV3SP)) { nmod = 3; } @@ -670,9 +671,9 @@ struct Dilepton { fRegistry.addClone("Pair/same/uls/", "Pair/same/lsmm/"); fRegistry.addClone("Pair/same/", "Pair/mix/"); } else if (cfgAnalysisType == static_cast(o2::aod::pwgem::dilepton::utils::pairutil::DileptonAnalysisType::kHFll)) { - const o2::framework::AxisSpec axis_dphi_ee{36, -M_PI / 2., 3. / 2. * M_PI, "#Delta#varphi = #varphi_{l1} - #varphi_{l2} (rad.)"}; // for kHFll - const o2::framework::AxisSpec axis_deta_ee{40, -2., 2., "#Delta#eta = #eta_{l1} - #eta_{l2}"}; - fRegistry.add("Pair/same/uls/hs", "dilepton", o2::framework::kTHnSparseD, {axis_mass, axis_pt, axis_dca, axis_y, axis_dphi_ee, axis_deta_ee}, true); + const o2::framework::AxisSpec axis_dphi_ll{36, -M_PI / 2., 3. / 2. * M_PI, "#Delta#varphi = #varphi_{l1} - #varphi_{l2} (rad.)"}; // for kHFll + const o2::framework::AxisSpec axis_deta_ll{40, -2., 2., "#Delta#eta = #eta_{l1} - #eta_{l2}"}; + fRegistry.add("Pair/same/uls/hs", "dilepton", o2::framework::kTHnSparseD, {axis_mass, axis_pt, axis_dca, axis_y, axis_dphi_ll, axis_deta_ll}, true); fRegistry.addClone("Pair/same/uls/", "Pair/same/lspp/"); fRegistry.addClone("Pair/same/uls/", "Pair/same/lsmm/"); fRegistry.addClone("Pair/same/", "Pair/mix/"); @@ -687,6 +688,23 @@ struct Dilepton { fRegistry.addClone("Pair/mix/uls/", "Pair/mix/lspp/"); fRegistry.addClone("Pair/mix/uls/", "Pair/mix/lsmm/"); o2::aod::pwgem::dilepton::utils::eventhistogram::addEventHistogramsBootstrap(&fRegistry, cfgNumBootstrapSamples); + } else if (cfgAnalysisType == static_cast(o2::aod::pwgem::dilepton::utils::pairutil::DileptonAnalysisType::kFlowV2EP) || cfgAnalysisType == static_cast(o2::aod::pwgem::dilepton::utils::pairutil::DileptonAnalysisType::kFlowV3EP)) { + if (cfgAnalysisType == static_cast(o2::aod::pwgem::dilepton::utils::pairutil::DileptonAnalysisType::kFlowV2EP)) { + nmod = 2; + } else if (cfgAnalysisType == static_cast(o2::aod::pwgem::dilepton::utils::pairutil::DileptonAnalysisType::kFlowV3EP)) { + nmod = 3; + } + + // similar to Eq.1 in PRL 126, 162001 (2021) + const o2::framework::AxisSpec axis_ep{4, 0, 2 * M_PI / nmod, Form("#varphi_{ll} #minus #Psi_{%d}^{%s}", nmod, qvec_det_names[cfgQvecEstimator].data())}; + + fRegistry.add("Pair/same/uls/hs", "dilepton", o2::framework::kTHnSparseD, {axis_mass, axis_pt, axis_dca, axis_y, axis_ep}, true); + fRegistry.addClone("Pair/same/uls/", "Pair/same/lspp/"); + fRegistry.addClone("Pair/same/uls/", "Pair/same/lsmm/"); + + fRegistry.add("Pair/mix/uls/hs", "dilepton", o2::framework::kTHnSparseD, {axis_mass, axis_pt, axis_dca, axis_y}, true); + fRegistry.addClone("Pair/mix/uls/", "Pair/mix/lspp/"); + fRegistry.addClone("Pair/mix/uls/", "Pair/mix/lsmm/"); } else { // same as kQC to avoid seg. fault fRegistry.add("Pair/same/uls/hs", "dilepton", o2::framework::kTHnSparseD, {axis_mass, axis_pt, axis_dca, axis_y}, true); fRegistry.addClone("Pair/same/uls/", "Pair/same/lspp/"); @@ -984,8 +1002,8 @@ struct Dilepton { o2::math_utils::bringToPMPi(dphi); float aco = 1.f - std::fabs(dphi) / M_PI; float asym = std::fabs(v1.Pt() - v2.Pt()) / (v1.Pt() + v2.Pt()); - float dphi_e_ee = v1.Phi() - v12.Phi(); - o2::math_utils::bringToPMPi(dphi_e_ee); + float dphi_l_ll = v1.Phi() - v12.Phi(); + o2::math_utils::bringToPMPi(dphi_l_ll); float cos_thetaPol = 999, phiPol = 999.f; auto arrM = std::array{static_cast(v12.Px()), static_cast(v12.Py()), static_cast(v12.Pz()), static_cast(v12.M())}; @@ -1000,13 +1018,13 @@ struct Dilepton { o2::math_utils::bringToPMPi(phiPol); if (t1.sign() * t2.sign() < 0) { // ULS - fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("uls/hs"), v12.M(), v12.Pt(), pair_dca, v12.Rapidity(), aco, asym, std::fabs(dphi_e_ee), cos_thetaPol, weight); + fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("uls/hs"), v12.M(), v12.Pt(), pair_dca, v12.Rapidity(), aco, asym, std::fabs(dphi_l_ll), cos_thetaPol, weight); } else if (t1.sign() > 0 && t2.sign() > 0) { // LS++ - fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("lspp/hs"), v12.M(), v12.Pt(), pair_dca, v12.Rapidity(), aco, asym, std::fabs(dphi_e_ee), cos_thetaPol, weight); + fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("lspp/hs"), v12.M(), v12.Pt(), pair_dca, v12.Rapidity(), aco, asym, std::fabs(dphi_l_ll), cos_thetaPol, weight); } else if (t1.sign() < 0 && t2.sign() < 0) { // LS-- - fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("lsmm/hs"), v12.M(), v12.Pt(), pair_dca, v12.Rapidity(), aco, asym, std::fabs(dphi_e_ee), cos_thetaPol, weight); + fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("lsmm/hs"), v12.M(), v12.Pt(), pair_dca, v12.Rapidity(), aco, asym, std::fabs(dphi_l_ll), cos_thetaPol, weight); } - } else if (cfgAnalysisType == static_cast(o2::aod::pwgem::dilepton::utils::pairutil::DileptonAnalysisType::kFlowV2) || cfgAnalysisType == static_cast(o2::aod::pwgem::dilepton::utils::pairutil::DileptonAnalysisType::kFlowV3)) { + } else if (cfgAnalysisType == static_cast(o2::aod::pwgem::dilepton::utils::pairutil::DileptonAnalysisType::kFlowV2SP) || cfgAnalysisType == static_cast(o2::aod::pwgem::dilepton::utils::pairutil::DileptonAnalysisType::kFlowV3SP)) { std::array q2ft0m = {collision.q2xft0m(), collision.q2yft0m()}; std::array q2ft0a = {collision.q2xft0a(), collision.q2yft0a()}; std::array q2ft0c = {collision.q2xft0c(), collision.q2yft0c()}; @@ -1129,6 +1147,35 @@ struct Dilepton { fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("lsmm/hs"), v12.M(), v12.Pt(), pair_dca, v12.Rapidity(), weight); } } + } else if (cfgAnalysisType == static_cast(o2::aod::pwgem::dilepton::utils::pairutil::DileptonAnalysisType::kFlowV2EP) || cfgAnalysisType == static_cast(o2::aod::pwgem::dilepton::utils::pairutil::DileptonAnalysisType::kFlowV3EP)) { + if constexpr (ev_id == 0) { + std::vector> eventplanes = { + {0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f}, // 0th harmonics + {0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f}, // 1st harmonics + {collision.ep2ft0m(), collision.ep2ft0a(), collision.ep2ft0c(), collision.ep2btot(), collision.ep2bpos(), collision.ep2bneg(), collision.ep2fv0a()}, // 2nd harmonics + {collision.ep3ft0m(), collision.ep3ft0a(), collision.ep3ft0c(), collision.ep3btot(), collision.ep3bpos(), collision.ep3bneg(), collision.ep3fv0a()}, // 3rd harmonics + }; + + float ep = RecoDecay::constrainAngle(eventplanes[nmod][cfgEPEstimator], -o2::constants::math::PI / nmod, static_cast(nmod)); + float phi_ll = RecoDecay::constrainAngle(v12.Phi(), -o2::constants::math::PI / nmod, 1U); + float dphi_ll_ep = std::fabs(RecoDecay::constrainAngle(phi_ll - ep, 0.f, static_cast(nmod))); + + if (t1.sign() * t2.sign() < 0) { // ULS + fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("uls/hs"), v12.M(), v12.Pt(), pair_dca, v12.Rapidity(), dphi_ll_ep, weight); + } else if (t1.sign() > 0 && t2.sign() > 0) { // LS++ + fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("lspp/hs"), v12.M(), v12.Pt(), pair_dca, v12.Rapidity(), dphi_ll_ep, weight); + } else if (t1.sign() < 0 && t2.sign() < 0) { // LS-- + fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("lsmm/hs"), v12.M(), v12.Pt(), pair_dca, v12.Rapidity(), dphi_ll_ep, weight); + } + } else if constexpr (ev_id == 1) { + if (t1.sign() * t2.sign() < 0) { // ULS + fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("uls/hs"), v12.M(), v12.Pt(), pair_dca, v12.Rapidity(), weight); + } else if (t1.sign() > 0 && t2.sign() > 0) { // LS++ + fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("lspp/hs"), v12.M(), v12.Pt(), pair_dca, v12.Rapidity(), weight); + } else if (t1.sign() < 0 && t2.sign() < 0) { // LS-- + fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("lsmm/hs"), v12.M(), v12.Pt(), pair_dca, v12.Rapidity(), weight); + } + } } else { // same as kQC to avoid seg. fault if (t1.sign() * t2.sign() < 0) { // ULS fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("uls/hs"), v12.M(), v12.Pt(), pair_dca, v12.Rapidity(), weight); diff --git a/PWGEM/Dilepton/Utils/EventHistograms.h b/PWGEM/Dilepton/Utils/EventHistograms.h index fc4061610eb..154441cd5ba 100644 --- a/PWGEM/Dilepton/Utils/EventHistograms.h +++ b/PWGEM/Dilepton/Utils/EventHistograms.h @@ -32,6 +32,7 @@ namespace o2::aod::pwgem::dilepton::utils::eventhistogram { const int nbin_ev = 21; +static constexpr std::string_view event_types[2] = {"before/", "after/"}; template void addEventHistograms(o2::framework::HistogramRegistry* fRegistry) { @@ -110,6 +111,22 @@ void addEventHistograms(o2::framework::HistogramRegistry* fRegistry) fRegistry->add("Event/before/hPrfQ2FV0AQ2BNeg_CentFT0C", "Q_{2}^{FV0A} #upoint Q_{2}^{BNeg};centrality FT0C (%);Q_{2}^{FV0A} #upoint Q_{2}^{BNeg}", o2::framework::kTProfile, {{100, 0, 100}}, false); fRegistry->add("Event/before/hPrfQ2FV0AQ2BTot_CentFT0C", "Q_{2}^{FV0A} #upoint Q_{2}^{BTot};centrality FT0C (%);Q_{2}^{FV0A} #upoint Q_{2}^{BTot}", o2::framework::kTProfile, {{100, 0, 100}}, false); fRegistry->add("Event/before/hPrfQ2FV0AQ2FT0C_CentFT0C", "Q_{2}^{FV0A} #upoint Q_{2}^{FT0C};centrality FT0C (%);Q_{2}^{FV0A} #upoint Q_{2}^{FT0C}", o2::framework::kTProfile, {{100, 0, 100}}, false); // this is necessary for dimuons + + fRegistry->add("Event/before/hPrfCos2_Psi2FT0M_Psi2BPos_CentFT0C", "cos(2(#Psi_{2}^{FT0M} - #Psi_{2}^{BPos}));centrality FT0C (%);cos(2(#Psi_{2}^{FT0M} - #Psi_{2}^{BPos}))", o2::framework::kTProfile, {{100, 0, 100}}, false); + fRegistry->add("Event/before/hPrfCos2_Psi2FT0M_Psi2BNeg_CentFT0C", "cos(2(#Psi_{2}^{FT0M} - #Psi_{2}^{BNeg}));centrality FT0C (%);cos(2(#Psi_{2}^{FT0M} - #Psi_{2}^{BNeg}))", o2::framework::kTProfile, {{100, 0, 100}}, false); + fRegistry->add("Event/before/hPrfCos2_Psi2BPos_Psi2BNeg_CentFT0C", "cos(2(#Psi_{2}^{BPos} - #Psi_{2}^{BNeg}));centrality FT0C (%);cos(2(#Psi_{2}^{BPos} - #Psi_{2}^{BNeg}))", o2::framework::kTProfile, {{100, 0, 100}}, false); // this is common for FT0M, FT0A, FT0C, FV0A resolution. + fRegistry->add("Event/before/hPrfCos2_Psi2FT0C_Psi2BPos_CentFT0C", "cos(2(#Psi_{2}^{FT0C} - #Psi_{2}^{BPos}));centrality FT0C (%);cos(2(#Psi_{2}^{FT0C} - #Psi_{2}^{BPos}))", o2::framework::kTProfile, {{100, 0, 100}}, false); + fRegistry->add("Event/before/hPrfCos2_Psi2FT0C_Psi2BNeg_CentFT0C", "cos(2(#Psi_{2}^{FT0C} - #Psi_{2}^{BNeg}));centrality FT0C (%);cos(2(#Psi_{2}^{FT0C} - #Psi_{2}^{BNeg}))", o2::framework::kTProfile, {{100, 0, 100}}, false); + fRegistry->add("Event/before/hPrfCos2_Psi2FT0C_Psi2BTot_CentFT0C", "cos(2(#Psi_{2}^{FT0C} - #Psi_{2}^{BTot}));centrality FT0C (%);cos(2(#Psi_{2}^{FT0C} - #Psi_{2}^{BTot}))", o2::framework::kTProfile, {{100, 0, 100}}, false); + fRegistry->add("Event/before/hPrfCos2_Psi2FT0A_Psi2BPos_CentFT0C", "cos(2(#Psi_{2}^{FT0A} - #Psi_{2}^{BPos}));centrality FT0C (%);cos(2(#Psi_{2}^{FT0A} - #Psi_{2}^{BPos}))", o2::framework::kTProfile, {{100, 0, 100}}, false); + fRegistry->add("Event/before/hPrfCos2_Psi2FT0A_Psi2BNeg_CentFT0C", "cos(2(#Psi_{2}^{FT0A} - #Psi_{2}^{BNeg}));centrality FT0C (%);cos(2(#Psi_{2}^{FT0A} - #Psi_{2}^{BNeg}))", o2::framework::kTProfile, {{100, 0, 100}}, false); + fRegistry->add("Event/before/hPrfCos2_Psi2FT0A_Psi2BTot_CentFT0C", "cos(2(#Psi_{2}^{FT0A} - #Psi_{2}^{BTot}));centrality FT0C (%);cos(2(#Psi_{2}^{FT0A} - #Psi_{2}^{BTot}))", o2::framework::kTProfile, {{100, 0, 100}}, false); + fRegistry->add("Event/before/hPrfCos2_Psi2FT0A_Psi2FT0C_CentFT0C", "cos(2(#Psi_{2}^{FT0A} - #Psi_{2}^{FT0C}));centrality FT0C (%);cos(2(#Psi_{2}^{FT0A} - #Psi_{2}^{FT0C}))", o2::framework::kTProfile, {{100, 0, 100}}, false); // this is necessary for dimuons + fRegistry->add("Event/before/hPrfCos2_Psi2FV0A_Psi2BPos_CentFT0C", "cos(2(#Psi_{2}^{FV0A} - #Psi_{2}^{BPos}));centrality FT0C (%);cos(2(#Psi_{2}^{FV0A} - #Psi_{2}^{BPos}))", o2::framework::kTProfile, {{100, 0, 100}}, false); + fRegistry->add("Event/before/hPrfCos2_Psi2FV0A_Psi2BNeg_CentFT0C", "cos(2(#Psi_{2}^{FV0A} - #Psi_{2}^{BNeg}));centrality FT0C (%);cos(2(#Psi_{2}^{FV0A} - #Psi_{2}^{BNeg}))", o2::framework::kTProfile, {{100, 0, 100}}, false); + fRegistry->add("Event/before/hPrfCos2_Psi2FV0A_Psi2BTot_CentFT0C", "cos(2(#Psi_{2}^{FV0A} - #Psi_{2}^{BTot}));centrality FT0C (%);cos(2(#Psi_{2}^{FV0A} - #Psi_{2}^{BTot}))", o2::framework::kTProfile, {{100, 0, 100}}, false); + fRegistry->add("Event/before/hPrfCos2_Psi2FV0A_Psi2FT0C_CentFT0C", "cos(2(#Psi_{2}^{FV0A} - #Psi_{2}^{FT0C}));centrality FT0C (%);cos(2(#Psi_{2}^{FV0A} - #Psi_{2}^{FT0C}))", o2::framework::kTProfile, {{100, 0, 100}}, false); // this is necessary for dimuons + } else if constexpr (nmod == 3) { fRegistry->add("Event/before/hQ3xFT0M_CentFT0C", "hQ3xFT0M_CentFT0C;centrality FT0C (%);Q_{3,x}^{FT0M}", o2::framework::kTH2D, {{100, 0, 100}, {200, -10, +10}}, false); fRegistry->add("Event/before/hQ3yFT0M_CentFT0C", "hQ3yFT0M_CentFT0C;centrality FT0C (%);Q_{3,y}^{FT0M}", o2::framework::kTH2D, {{100, 0, 100}, {200, -10, +10}}, false); @@ -148,6 +165,21 @@ void addEventHistograms(o2::framework::HistogramRegistry* fRegistry) fRegistry->add("Event/before/hPrfQ3FV0AQ3BNeg_CentFT0C", "Q_{3}^{FV0A} #upoint Q_{3}^{BNeg};centrality FT0C (%);Q_{3}^{FV0A} #upoint Q_{3}^{BNeg}", o2::framework::kTProfile, {{100, 0, 100}}, false); fRegistry->add("Event/before/hPrfQ3FV0AQ3BTot_CentFT0C", "Q_{3}^{FV0A} #upoint Q_{3}^{BTot};centrality FT0C (%);Q_{3}^{FV0A} #upoint Q_{3}^{BTot}", o2::framework::kTProfile, {{100, 0, 100}}, false); fRegistry->add("Event/before/hPrfQ3FV0AQ3FT0C_CentFT0C", "Q_{3}^{FV0A} #upoint Q_{3}^{FT0C};centrality FT0C (%);Q_{3}^{FV0A} #upoint Q_{3}^{FT0C}", o2::framework::kTProfile, {{100, 0, 100}}, false); // this is necessary for dimuons + + fRegistry->add("Event/before/hPrfCos3_Psi3FT0M_Psi3BPos_CentFT0C", "cos(3(#Psi_{3}^{FT0M} - #Psi_{3}^{BPos}));centrality FT0C (%);cos(3(#Psi_{3}^{FT0M} - #Psi_{3}^{BPos}))", o2::framework::kTProfile, {{100, 0, 100}}, false); + fRegistry->add("Event/before/hPrfCos3_Psi3FT0M_Psi3BNeg_CentFT0C", "cos(3(#Psi_{3}^{FT0M} - #Psi_{3}^{BNeg}));centrality FT0C (%);cos(3(#Psi_{3}^{FT0M} - #Psi_{3}^{BNeg}))", o2::framework::kTProfile, {{100, 0, 100}}, false); + fRegistry->add("Event/before/hPrfCos3_Psi3BPos_Psi3BNeg_CentFT0C", "cos(3(#Psi_{3}^{BPos} - #Psi_{3}^{BNeg}));centrality FT0C (%);cos(3(#Psi_{3}^{BPos} - #Psi_{3}^{BNeg}))", o2::framework::kTProfile, {{100, 0, 100}}, false); // this is common for FT0M, FT0A, FT0C, FV0A resolution. + fRegistry->add("Event/before/hPrfCos3_Psi3FT0C_Psi3BPos_CentFT0C", "cos(3(#Psi_{3}^{FT0C} - #Psi_{3}^{BPos}));centrality FT0C (%);cos(3(#Psi_{3}^{FT0C} - #Psi_{3}^{BPos}))", o2::framework::kTProfile, {{100, 0, 100}}, false); + fRegistry->add("Event/before/hPrfCos3_Psi3FT0C_Psi3BNeg_CentFT0C", "cos(3(#Psi_{3}^{FT0C} - #Psi_{3}^{BNeg}));centrality FT0C (%);cos(3(#Psi_{3}^{FT0C} - #Psi_{3}^{BNeg}))", o2::framework::kTProfile, {{100, 0, 100}}, false); + fRegistry->add("Event/before/hPrfCos3_Psi3FT0C_Psi3BTot_CentFT0C", "cos(3(#Psi_{3}^{FT0C} - #Psi_{3}^{BTot}));centrality FT0C (%);cos(3(#Psi_{3}^{FT0C} - #Psi_{3}^{BTot}))", o2::framework::kTProfile, {{100, 0, 100}}, false); + fRegistry->add("Event/before/hPrfCos3_Psi3FT0A_Psi3BPos_CentFT0C", "cos(3(#Psi_{3}^{FT0A} - #Psi_{3}^{BPos}));centrality FT0C (%);cos(3(#Psi_{3}^{FT0A} - #Psi_{3}^{BPos}))", o2::framework::kTProfile, {{100, 0, 100}}, false); + fRegistry->add("Event/before/hPrfCos3_Psi3FT0A_Psi3BNeg_CentFT0C", "cos(3(#Psi_{3}^{FT0A} - #Psi_{3}^{BNeg}));centrality FT0C (%);cos(3(#Psi_{3}^{FT0A} - #Psi_{3}^{BNeg}))", o2::framework::kTProfile, {{100, 0, 100}}, false); + fRegistry->add("Event/before/hPrfCos3_Psi3FT0A_Psi3BTot_CentFT0C", "cos(3(#Psi_{3}^{FT0A} - #Psi_{3}^{BTot}));centrality FT0C (%);cos(3(#Psi_{3}^{FT0A} - #Psi_{3}^{BTot}))", o2::framework::kTProfile, {{100, 0, 100}}, false); + fRegistry->add("Event/before/hPrfCos3_Psi3FT0A_Psi3FT0C_CentFT0C", "cos(3(#Psi_{3}^{FT0A} - #Psi_{3}^{FT0C}));centrality FT0C (%);cos(3(#Psi_{3}^{FT0A} - #Psi_{3}^{FT0C}))", o2::framework::kTProfile, {{100, 0, 100}}, false); // this is necessary for dimuons + fRegistry->add("Event/before/hPrfCos3_Psi3FV0A_Psi3BPos_CentFT0C", "cos(3(#Psi_{3}^{FV0A} - #Psi_{3}^{BPos}));centrality FT0C (%);cos(3(#Psi_{3}^{FV0A} - #Psi_{3}^{BPos}))", o2::framework::kTProfile, {{100, 0, 100}}, false); + fRegistry->add("Event/before/hPrfCos3_Psi3FV0A_Psi3BNeg_CentFT0C", "cos(3(#Psi_{3}^{FV0A} - #Psi_{3}^{BNeg}));centrality FT0C (%);cos(3(#Psi_{3}^{FV0A} - #Psi_{3}^{BNeg}))", o2::framework::kTProfile, {{100, 0, 100}}, false); + fRegistry->add("Event/before/hPrfCos3_Psi3FV0A_Psi3BTot_CentFT0C", "cos(3(#Psi_{3}^{FV0A} - #Psi_{3}^{BTot}));centrality FT0C (%);cos(3(#Psi_{3}^{FV0A} - #Psi_{3}^{BTot}))", o2::framework::kTProfile, {{100, 0, 100}}, false); + fRegistry->add("Event/before/hPrfCos3_Psi3FV0A_Psi3FT0C_CentFT0C", "cos(3(#Psi_{3}^{FV0A} - #Psi_{3}^{FT0C}));centrality FT0C (%);cos(3(#Psi_{3}^{FV0A} - #Psi_{3}^{FT0C}))", o2::framework::kTProfile, {{100, 0, 100}}, false); // this is necessary for dimuons } fRegistry->addClone("Event/before/", "Event/after/"); } @@ -174,7 +206,6 @@ void addEventHistogramsBootstrap(o2::framework::HistogramRegistry* fRegistry, in template void fillEventInfo(o2::framework::HistogramRegistry* fRegistry, TCollision const& collision, const float /*weight*/ = 1.f) { - static constexpr std::string_view event_types[2] = {"before/", "after/"}; fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hCollisionCounter"), 1.0); if (collision.selection_bit(o2::aod::emevsel::kIsTriggerTVX)) { fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hCollisionCounter"), 2.0); @@ -290,6 +321,22 @@ void fillEventInfo(o2::framework::HistogramRegistry* fRegistry, TCollision const fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfQ2FV0AQ2BNeg_CentFT0C"), collision.centFT0C(), RecoDecay::dotProd(q2fv0a, q2bneg)); fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfQ2FV0AQ2BTot_CentFT0C"), collision.centFT0C(), RecoDecay::dotProd(q2fv0a, q2btot)); fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfQ2FV0AQ2FT0C_CentFT0C"), collision.centFT0C(), RecoDecay::dotProd(q2fv0a, q2ft0c)); + + fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfCos2_Psi2FT0M_Psi2BPos_CentFT0C"), collision.centFT0C(), std::cos(2.f * (collision.ep2ft0m() - collision.ep2bpos()))); + fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfCos2_Psi2FT0M_Psi2BNeg_CentFT0C"), collision.centFT0C(), std::cos(2.f * (collision.ep2ft0m() - collision.ep2bneg()))); + fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfCos2_Psi2BPos_Psi2BNeg_CentFT0C"), collision.centFT0C(), std::cos(2.f * (collision.ep2bpos() - collision.ep2bneg()))); + fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfCos2_Psi2FT0C_Psi2BPos_CentFT0C"), collision.centFT0C(), std::cos(2.f * (collision.ep2ft0c() - collision.ep2bpos()))); + fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfCos2_Psi2FT0C_Psi2BNeg_CentFT0C"), collision.centFT0C(), std::cos(2.f * (collision.ep2ft0c() - collision.ep2bneg()))); + fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfCos2_Psi2FT0C_Psi2BTot_CentFT0C"), collision.centFT0C(), std::cos(2.f * (collision.ep2ft0c() - collision.ep2btot()))); + fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfCos2_Psi2FT0A_Psi2BPos_CentFT0C"), collision.centFT0C(), std::cos(2.f * (collision.ep2ft0a() - collision.ep2bpos()))); + fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfCos2_Psi2FT0A_Psi2BNeg_CentFT0C"), collision.centFT0C(), std::cos(2.f * (collision.ep2ft0a() - collision.ep2bneg()))); + fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfCos2_Psi2FT0A_Psi2BTot_CentFT0C"), collision.centFT0C(), std::cos(2.f * (collision.ep2ft0a() - collision.ep2btot()))); + fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfCos2_Psi2FT0A_Psi2FT0C_CentFT0C"), collision.centFT0C(), std::cos(2.f * (collision.ep2ft0a() - collision.ep2ft0c()))); + fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfCos2_Psi2FV0A_Psi2BPos_CentFT0C"), collision.centFT0C(), std::cos(2.f * (collision.ep2fv0a() - collision.ep2bpos()))); + fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfCos2_Psi2FV0A_Psi2BNeg_CentFT0C"), collision.centFT0C(), std::cos(2.f * (collision.ep2fv0a() - collision.ep2bneg()))); + fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfCos2_Psi2FV0A_Psi2BTot_CentFT0C"), collision.centFT0C(), std::cos(2.f * (collision.ep2fv0a() - collision.ep2btot()))); + fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfCos2_Psi2FV0A_Psi2FT0C_CentFT0C"), collision.centFT0C(), std::cos(2.f * (collision.ep2fv0a() - collision.ep2ft0c()))); + } else if constexpr (nmod == 3) { std::array q3ft0m = {collision.q3xft0m(), collision.q3yft0m()}; std::array q3ft0a = {collision.q3xft0a(), collision.q3yft0a()}; @@ -336,6 +383,21 @@ void fillEventInfo(o2::framework::HistogramRegistry* fRegistry, TCollision const fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfQ3FV0AQ3BPos_CentFT0C"), collision.centFT0C(), RecoDecay::dotProd(q3fv0a, q3bpos)); fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfQ3FV0AQ3BNeg_CentFT0C"), collision.centFT0C(), RecoDecay::dotProd(q3fv0a, q3bneg)); fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfQ3FV0AQ3BTot_CentFT0C"), collision.centFT0C(), RecoDecay::dotProd(q3fv0a, q3btot)); + + fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfCos3_Psi3FT0M_Psi3BPos_CentFT0C"), collision.centFT0C(), std::cos(3.f * (collision.ep3ft0m() - collision.ep3bpos()))); + fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfCos3_Psi3FT0M_Psi3BNeg_CentFT0C"), collision.centFT0C(), std::cos(3.f * (collision.ep3ft0m() - collision.ep3bneg()))); + fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfCos3_Psi3BPos_Psi3BNeg_CentFT0C"), collision.centFT0C(), std::cos(3.f * (collision.ep3bpos() - collision.ep3bneg()))); + fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfCos3_Psi3FT0C_Psi3BPos_CentFT0C"), collision.centFT0C(), std::cos(3.f * (collision.ep3ft0c() - collision.ep3bpos()))); + fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfCos3_Psi3FT0C_Psi3BNeg_CentFT0C"), collision.centFT0C(), std::cos(3.f * (collision.ep3ft0c() - collision.ep3bneg()))); + fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfCos3_Psi3FT0C_Psi3BTot_CentFT0C"), collision.centFT0C(), std::cos(3.f * (collision.ep3ft0c() - collision.ep3btot()))); + fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfCos3_Psi3FT0A_Psi3BPos_CentFT0C"), collision.centFT0C(), std::cos(3.f * (collision.ep3ft0a() - collision.ep3bpos()))); + fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfCos3_Psi3FT0A_Psi3BNeg_CentFT0C"), collision.centFT0C(), std::cos(3.f * (collision.ep3ft0a() - collision.ep3bneg()))); + fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfCos3_Psi3FT0A_Psi3BTot_CentFT0C"), collision.centFT0C(), std::cos(3.f * (collision.ep3ft0a() - collision.ep3btot()))); + fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfCos3_Psi3FT0A_Psi3FT0C_CentFT0C"), collision.centFT0C(), std::cos(3.f * (collision.ep3ft0a() - collision.ep3ft0c()))); + fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfCos3_Psi3FV0A_Psi3BPos_CentFT0C"), collision.centFT0C(), std::cos(3.f * (collision.ep3fv0a() - collision.ep3bpos()))); + fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfCos3_Psi3FV0A_Psi3BNeg_CentFT0C"), collision.centFT0C(), std::cos(3.f * (collision.ep3fv0a() - collision.ep3bneg()))); + fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfCos3_Psi3FV0A_Psi3BTot_CentFT0C"), collision.centFT0C(), std::cos(3.f * (collision.ep3fv0a() - collision.ep3btot()))); + fRegistry->fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hPrfCos3_Psi3FV0A_Psi3FT0C_CentFT0C"), collision.centFT0C(), std::cos(3.f * (collision.ep3fv0a() - collision.ep3ft0c()))); } } template diff --git a/PWGEM/Dilepton/Utils/PairUtilities.h b/PWGEM/Dilepton/Utils/PairUtilities.h index 693045306eb..f250ef8aa98 100644 --- a/PWGEM/Dilepton/Utils/PairUtilities.h +++ b/PWGEM/Dilepton/Utils/PairUtilities.h @@ -45,11 +45,13 @@ enum class DileptonPairType : int { enum class DileptonAnalysisType : int { kQC = 0, kUPC = 1, - kFlowV2 = 2, - kFlowV3 = 3, + kFlowV2SP = 2, + kFlowV3SP = 3, kPolarization = 4, kHFll = 5, kBootstrapv2 = 6, + kFlowV2EP = 7, + kFlowV3EP = 8, }; enum class DileptonHadronAnalysisType : int {