From e7c6bb0e4d326d390684dcec7aea2ca8510de06a Mon Sep 17 00:00:00 2001 From: Wu ChunTai Date: Fri, 8 Mar 2024 13:49:32 +0800 Subject: [PATCH 01/36] version 2: taskFlowCharmHadrons --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 103 ++++++++++++++++++----- 1 file changed, 83 insertions(+), 20 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index 7c88c2d1229..e811220ebd5 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -32,7 +32,8 @@ using namespace o2::framework::expressions; enum DecayChannel { DplusToPiKPi = 0, DsToKKPi, - DsToPiKK }; + DsToPiKK, + D0ToPiK }; enum centralityEstimator { V0A = 0, T0M, @@ -52,6 +53,7 @@ struct HfTaskFlowCharmHadrons { Configurable qvecDetector{"qvecDetector", 0, "Detector for Q vector estimation (FV0A: 0, FT0M: 1, FT0A: 2, FT0C: 3, TPC Pos: 4, TPC Neg: 5)"}; Configurable centDetector{"centDetector", 0, "Detector for centrality estimation (V0A: 0, T0M: 1, T0A: 2, T0C: 3"}; Configurable selectionFlag{"selectionFlag", 1, "Selection Flag for hadron (e.g. 1 for skimming, 3 for topo. and kine., 7 for PID)"}; + Configurable prongNum{"prongNum", 3, "Number of candidate's prong (For D0, set selectionFlag = 1 and prongNum = 2)"}; Configurable storeMl{"storeMl", false, "Flag to store ML scores"}; Configurable saveEpResoHisto{"saveEpResoHisto", false, "Flag to save event plane resolution histogram"}; Configurable> classMl{"classMl", {0, 2}, "Indexes of BDT scores to be stored. Two indexes max."}; @@ -64,15 +66,19 @@ struct HfTaskFlowCharmHadrons { ConfigurableAxis thnConfigAxisScalarProd{"thnConfigAxisScalarProd", {100, 0., 1.}, ""}; ConfigurableAxis thnConfigAxisMlOne{"thnConfigAxisMlOne", {1000, 0., 1.}, ""}; ConfigurableAxis thnConfigAxisMlTwo{"thnConfigAxisMlTwo", {1000, 0., 1.}, ""}; + ConfigurableAxis thnConfigAxisSelFlag{"thnConfigAxisSelFlag", {10, -1, 9}, ""}; using CandDsDatawMl = soa::Filtered>; using CandDsData = soa::Filtered>; using CandDplusDatawMl = soa::Filtered>; using CandDplusData = soa::Filtered>; + using CandD0DatawMl = soa::Filtered>; + using CandD0Data = soa::Filtered>; using CollsWithQvecs = soa::Join; Filter filterSelectDsCandidates = aod::hf_sel_candidate_ds::isSelDsToKKPi >= selectionFlag || aod::hf_sel_candidate_ds::isSelDsToPiKK >= selectionFlag; Filter filterSelectDplusCandidates = aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= selectionFlag; + Filter filterSelectD0Candidates = aod::hf_sel_candidate_d0::isSelD0 >= selectionFlag || aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlag; Partition selectedDsToKKPi = aod::hf_sel_candidate_ds::isSelDsToKKPi >= selectionFlag; Partition selectedDsToPiKK = aod::hf_sel_candidate_ds::isSelDsToPiKK >= selectionFlag; @@ -94,11 +100,12 @@ struct HfTaskFlowCharmHadrons { const AxisSpec thnAxisScalarProd{thnConfigAxisScalarProd, "SP"}; const AxisSpec thnAxisMlOne{thnConfigAxisMlOne, "Bkg score"}; const AxisSpec thnAxisMlTwo{thnConfigAxisMlTwo, "FD score"}; + const AxisSpec thnAxisSelFlag{thnConfigAxisSelFlag, "Selection Flag"}; if (storeMl) { - registry.add("hSparseFlowCharm", "THn for SP", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisCent, thnAxisCosNPhi, thnAxisCosDeltaPhi, thnAxisScalarProd, thnAxisMlOne, thnAxisMlTwo}); + registry.add("hSparseFlowCharm", "THn for SP", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisCent, thnAxisCosNPhi, thnAxisCosDeltaPhi, thnAxisScalarProd, thnAxisMlOne, thnAxisMlTwo, thnAxisSelFlag}); } else { - registry.add("hSparseFlowCharm", "THn for SP", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisCent, thnAxisCosNPhi, thnAxisCosDeltaPhi, thnAxisScalarProd}); + registry.add("hSparseFlowCharm", "THn for SP", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisCent, thnAxisCosNPhi, thnAxisCosDeltaPhi, thnAxisScalarProd, thnAxisSelFlag}); } registry.add("spReso/hSpResoFT0cFT0a", "hSpResoFT0cFT0a; centrality; Q_{FT0c} #bullet Q_{FT0a}", {HistType::kTH2F, {thnAxisCent, thnAxisScalarProd}}); registry.add("spReso/hSpResoFT0cFV0a", "hSpResoFT0cFV0a; centrality; Q_{FT0c} #bullet Q_{FV0a}", {HistType::kTH2F, {thnAxisCent, thnAxisScalarProd}}); @@ -135,11 +142,13 @@ struct HfTaskFlowCharmHadrons { /// \param cand is the candidate /// \param tracksQx is the X component of the Q vector for the tracks /// \param tracksQy is the Y component of the Q vector for the tracks - template + /// \param DecayChannel +template void getQvecDtracks(const T1& cand, std::vector& tracksQx, std::vector& tracksQy, - float& ampl) + float& ampl + ) { // TODO: add possibility to consider different weights for the tracks, at the moment only pT is considered; float pXtrack0 = cand.pxProng0(); @@ -150,17 +159,20 @@ struct HfTaskFlowCharmHadrons { float pYtrack1 = cand.pyProng1(); float pTtrack1 = cand.ptProng1(); float phiTrack1 = std::atan2(pYtrack1, pXtrack1); - float pXtrack2 = cand.pxProng2(); - float pYtrack2 = cand.pyProng2(); - float pTtrack2 = cand.ptProng2(); - float phiTrack2 = std::atan2(pYtrack2, pXtrack2); tracksQx.push_back(cos(harmonic * phiTrack0) * pTtrack0 / ampl); tracksQy.push_back(sin(harmonic * phiTrack0) * pTtrack0 / ampl); tracksQx.push_back(cos(harmonic * phiTrack1) * pTtrack1 / ampl); tracksQy.push_back(sin(harmonic * phiTrack1) * pTtrack1 / ampl); - tracksQx.push_back(cos(harmonic * phiTrack2) * pTtrack2 / ampl); - tracksQy.push_back(sin(harmonic * phiTrack2) * pTtrack2 / ampl); + + if constexpr (DecayChannel != DecayChannel::D0ToPiK){ + float pXtrack2 = cand.pxProng2(); + float pYtrack2 = cand.pyProng2(); + float pTtrack2 = cand.ptProng2(); + float phiTrack2 = std::atan2(pYtrack2, pXtrack2); + tracksQx.push_back(cos(harmonic * phiTrack2) * pTtrack2 / ampl); + tracksQy.push_back(sin(harmonic * phiTrack2) * pTtrack2 / ampl); + } } /// Compute the delta psi in the range [0, pi/harmonic] @@ -188,18 +200,20 @@ struct HfTaskFlowCharmHadrons { /// \param sp is the scalar product /// \param evtPlReso is the event plane resolution /// \param outputMl are the ML scores + /// \param selectionFlag for D0, only 0 or1 void fillThn(float& mass, float& pt, float& cent, float& cosNPhi, float& cosDeltaPhi, float& sp, - std::vector& outputMl) + std::vector& outputMl, + int selectionFlag) { if (storeMl) { - registry.fill(HIST("hSparseFlowCharm"), mass, pt, cent, cosNPhi, cosDeltaPhi, sp, outputMl[0], outputMl[1]); + registry.fill(HIST("hSparseFlowCharm"), mass, pt, cent, cosNPhi, cosDeltaPhi, sp, outputMl[0], outputMl[1], selectionFlag); } else { - registry.fill(HIST("hSparseFlowCharm"), mass, pt, cent, cosNPhi, cosDeltaPhi, sp); + registry.fill(HIST("hSparseFlowCharm"), mass, pt, cent, cosNPhi, cosDeltaPhi, sp, selectionFlag); } } @@ -320,13 +334,22 @@ struct HfTaskFlowCharmHadrons { // If TPC is used for the SP estimation, the tracks of the hadron candidate must be removed from the TPC Q vector to avoid double counting if (qvecDetector == qvecEstimator::TPCNeg || qvecDetector == qvecEstimator::TPCPos) { - float ampl = amplQVec - 3.; + float ampl = amplQVec - float(prongNum); std::vector tracksQx = {}; std::vector tracksQy = {}; - getQvecDtracks(candidate, tracksQx, tracksQy, ampl); - for (unsigned int itrack = 0; itrack < 3; itrack++) { - xQVec -= tracksQx[itrack]; - yQVec -= tracksQy[itrack]; + + if constexpr (DecayChannel == DecayChannel::D0ToPiK){ + getQvecDtracks(candidate, tracksQx, tracksQy, ampl); + for (unsigned int itrack = 0; itrack < 2; itrack++) { + xQVec -= tracksQx[itrack]; + yQVec -= tracksQy[itrack]; + } + } else { + getQvecDtracks(candidate, tracksQx, tracksQy, ampl); + for (unsigned int itrack = 0; itrack < 3; itrack++) { + xQVec -= tracksQx[itrack]; + yQVec -= tracksQy[itrack]; + } } } @@ -335,7 +358,31 @@ struct HfTaskFlowCharmHadrons { float scalprodCand = cosNPhi * xQVec + sinNPhi * yQVec; float cosDeltaPhi = std::cos(harmonic * (phiCand - evtPl)); - fillThn(massCand, ptCand, cent, cosNPhi, cosDeltaPhi, scalprodCand, outputMl); + if constexpr (std::is_same::value || std::is_same::value) { + std::vector outputMlD0 = {-999., -999.}; + std::vector outputMlD0bar = {-999., -999.}; + + if (candidate.isSelD0() >= selectionFlag) { + massCand = hfHelper.invMassD0ToPiK(candidate); + if constexpr (std::is_same::value) { + for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) + outputMlD0[iclass] = candidate.mlProbD0()[classMl->at(iclass)]; + } + fillThn(massCand, ptCand, cent, cosNPhi, cosDeltaPhi, scalprodCand, outputMlD0, 0); + } + if (candidate.isSelD0bar() >= selectionFlag) { + massCand = hfHelper.invMassD0barToKPi(candidate); + if constexpr (std::is_same::value) { + for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) + outputMlD0bar[iclass] = candidate.mlProbD0bar()[classMl->at(iclass)]; + } + fillThn(massCand, ptCand, cent, cosNPhi, cosDeltaPhi, scalprodCand, outputMlD0bar, 1); + } + } //TODO: Whether to put all the mass calculations here + + if constexpr (DecayChannel != DecayChannel::D0ToPiK) { + fillThn(massCand, ptCand, cent, cosNPhi, cosDeltaPhi, scalprodCand, outputMl, selectionFlag); + } } } @@ -373,6 +420,22 @@ struct HfTaskFlowCharmHadrons { } PROCESS_SWITCH(HfTaskFlowCharmHadrons, processDplus, "Process Dplus candidates", true); + // D0 with ML + void processD0Ml(CollsWithQvecs::iterator const& collision, + CandD0DatawMl const& candidatesD0) + { + runFlowAnalysis(collision, candidatesD0); + } + PROCESS_SWITCH(HfTaskFlowCharmHadrons, processD0Ml, "Process D0 candidates with ML", false); + + // D0 with rectangular cuts + void processD0(CollsWithQvecs::iterator const& collision, + CandD0Data const& candidatesD0) + { + runFlowAnalysis(collision, candidatesD0); + } + PROCESS_SWITCH(HfTaskFlowCharmHadrons, processD0, "Process D0 candidates", false); + // Resolution void processResolution(CollsWithQvecs::iterator const& collision) { From fd3c13c9dd778f79d7c25dd4181f2c9ae86dd5df Mon Sep 17 00:00:00 2001 From: Libeiyu Date: Mon, 11 Mar 2024 16:06:49 +0800 Subject: [PATCH 02/36] No selection flag in Thn --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index e811220ebd5..e32132be6cb 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -100,12 +100,11 @@ struct HfTaskFlowCharmHadrons { const AxisSpec thnAxisScalarProd{thnConfigAxisScalarProd, "SP"}; const AxisSpec thnAxisMlOne{thnConfigAxisMlOne, "Bkg score"}; const AxisSpec thnAxisMlTwo{thnConfigAxisMlTwo, "FD score"}; - const AxisSpec thnAxisSelFlag{thnConfigAxisSelFlag, "Selection Flag"}; if (storeMl) { - registry.add("hSparseFlowCharm", "THn for SP", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisCent, thnAxisCosNPhi, thnAxisCosDeltaPhi, thnAxisScalarProd, thnAxisMlOne, thnAxisMlTwo, thnAxisSelFlag}); + registry.add("hSparseFlowCharm", "THn for SP", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisCent, thnAxisCosNPhi, thnAxisCosDeltaPhi, thnAxisScalarProd, thnAxisMlOne, thnAxisMlTwo}); } else { - registry.add("hSparseFlowCharm", "THn for SP", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisCent, thnAxisCosNPhi, thnAxisCosDeltaPhi, thnAxisScalarProd, thnAxisSelFlag}); + registry.add("hSparseFlowCharm", "THn for SP", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisCent, thnAxisCosNPhi, thnAxisCosDeltaPhi, thnAxisScalarProd}); } registry.add("spReso/hSpResoFT0cFT0a", "hSpResoFT0cFT0a; centrality; Q_{FT0c} #bullet Q_{FT0a}", {HistType::kTH2F, {thnAxisCent, thnAxisScalarProd}}); registry.add("spReso/hSpResoFT0cFV0a", "hSpResoFT0cFV0a; centrality; Q_{FT0c} #bullet Q_{FV0a}", {HistType::kTH2F, {thnAxisCent, thnAxisScalarProd}}); @@ -211,9 +210,9 @@ template int selectionFlag) { if (storeMl) { - registry.fill(HIST("hSparseFlowCharm"), mass, pt, cent, cosNPhi, cosDeltaPhi, sp, outputMl[0], outputMl[1], selectionFlag); + registry.fill(HIST("hSparseFlowCharm"), mass, pt, cent, cosNPhi, cosDeltaPhi, sp, outputMl[0], outputMl[1]); } else { - registry.fill(HIST("hSparseFlowCharm"), mass, pt, cent, cosNPhi, cosDeltaPhi, sp, selectionFlag); + registry.fill(HIST("hSparseFlowCharm"), mass, pt, cent, cosNPhi, cosDeltaPhi, sp); } } @@ -368,7 +367,7 @@ template for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) outputMlD0[iclass] = candidate.mlProbD0()[classMl->at(iclass)]; } - fillThn(massCand, ptCand, cent, cosNPhi, cosDeltaPhi, scalprodCand, outputMlD0, 0); + fillThn(massCand, ptCand, cent, cosNPhi, cosDeltaPhi, scalprodCand, outputMlD0); } if (candidate.isSelD0bar() >= selectionFlag) { massCand = hfHelper.invMassD0barToKPi(candidate); @@ -376,12 +375,12 @@ template for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) outputMlD0bar[iclass] = candidate.mlProbD0bar()[classMl->at(iclass)]; } - fillThn(massCand, ptCand, cent, cosNPhi, cosDeltaPhi, scalprodCand, outputMlD0bar, 1); + fillThn(massCand, ptCand, cent, cosNPhi, cosDeltaPhi, scalprodCand, outputMlD0bar); } } //TODO: Whether to put all the mass calculations here if constexpr (DecayChannel != DecayChannel::D0ToPiK) { - fillThn(massCand, ptCand, cent, cosNPhi, cosDeltaPhi, scalprodCand, outputMl, selectionFlag); + fillThn(massCand, ptCand, cent, cosNPhi, cosDeltaPhi, scalprodCand, outputMl); } } } From 65681d5098f10754033abcd563831f7622f35ab5 Mon Sep 17 00:00:00 2001 From: Libeiyu Date: Mon, 11 Mar 2024 16:13:04 +0800 Subject: [PATCH 03/36] No selection Flag --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index e32132be6cb..4b91c1bbaf0 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -206,8 +206,7 @@ template float& cosNPhi, float& cosDeltaPhi, float& sp, - std::vector& outputMl, - int selectionFlag) + std::vector& outputMl) { if (storeMl) { registry.fill(HIST("hSparseFlowCharm"), mass, pt, cent, cosNPhi, cosDeltaPhi, sp, outputMl[0], outputMl[1]); From 3f356f810e4788fd65ccecc25415db310a107e26 Mon Sep 17 00:00:00 2001 From: Libeiyu Date: Mon, 11 Mar 2024 17:05:02 +0800 Subject: [PATCH 04/36] Add D0 to taskFlowCharmHadrons, , including Ml --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index 4b91c1bbaf0..67bb97d676f 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -51,7 +51,7 @@ struct HfTaskFlowCharmHadrons { Configurable zVtxMax{"zVtxMax", 10., "Max vertex coordinate z"}; Configurable harmonic{"harmonic", 2, "harmonic number"}; Configurable qvecDetector{"qvecDetector", 0, "Detector for Q vector estimation (FV0A: 0, FT0M: 1, FT0A: 2, FT0C: 3, TPC Pos: 4, TPC Neg: 5)"}; - Configurable centDetector{"centDetector", 0, "Detector for centrality estimation (V0A: 0, T0M: 1, T0A: 2, T0C: 3"}; + Configurable centDetector{"centDetector", 0, "Detector for centrality estimation (V0A: 0, T0M: 1, T0A: 2, T0C: 3)"}; Configurable selectionFlag{"selectionFlag", 1, "Selection Flag for hadron (e.g. 1 for skimming, 3 for topo. and kine., 7 for PID)"}; Configurable prongNum{"prongNum", 3, "Number of candidate's prong (For D0, set selectionFlag = 1 and prongNum = 2)"}; Configurable storeMl{"storeMl", false, "Flag to store ML scores"}; @@ -66,7 +66,6 @@ struct HfTaskFlowCharmHadrons { ConfigurableAxis thnConfigAxisScalarProd{"thnConfigAxisScalarProd", {100, 0., 1.}, ""}; ConfigurableAxis thnConfigAxisMlOne{"thnConfigAxisMlOne", {1000, 0., 1.}, ""}; ConfigurableAxis thnConfigAxisMlTwo{"thnConfigAxisMlTwo", {1000, 0., 1.}, ""}; - ConfigurableAxis thnConfigAxisSelFlag{"thnConfigAxisSelFlag", {10, -1, 9}, ""}; using CandDsDatawMl = soa::Filtered>; using CandDsData = soa::Filtered>; @@ -142,7 +141,7 @@ struct HfTaskFlowCharmHadrons { /// \param tracksQx is the X component of the Q vector for the tracks /// \param tracksQy is the Y component of the Q vector for the tracks /// \param DecayChannel -template + template void getQvecDtracks(const T1& cand, std::vector& tracksQx, std::vector& tracksQy, @@ -363,8 +362,10 @@ template if (candidate.isSelD0() >= selectionFlag) { massCand = hfHelper.invMassD0ToPiK(candidate); if constexpr (std::is_same::value) { - for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) + std::cout << "Here is CandD0DatawMl" << std::endl; + for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { outputMlD0[iclass] = candidate.mlProbD0()[classMl->at(iclass)]; + std::cout << "Here is iclass " << iclass << "\t Here is outputMl " << outputMlD0[iclass] << std::endl; } } fillThn(massCand, ptCand, cent, cosNPhi, cosDeltaPhi, scalprodCand, outputMlD0); } From 03317339db4306a5be60b0918ea75e03cf03d48c Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Mon, 11 Mar 2024 09:26:18 +0000 Subject: [PATCH 05/36] Please consider the following formatting changes --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 32 ++++++++++++------------ 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index 67bb97d676f..d9abe88289c 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -145,8 +145,7 @@ struct HfTaskFlowCharmHadrons { void getQvecDtracks(const T1& cand, std::vector& tracksQx, std::vector& tracksQy, - float& ampl - ) + float& ampl) { // TODO: add possibility to consider different weights for the tracks, at the moment only pT is considered; float pXtrack0 = cand.pxProng0(); @@ -163,7 +162,7 @@ struct HfTaskFlowCharmHadrons { tracksQx.push_back(cos(harmonic * phiTrack1) * pTtrack1 / ampl); tracksQy.push_back(sin(harmonic * phiTrack1) * pTtrack1 / ampl); - if constexpr (DecayChannel != DecayChannel::D0ToPiK){ + if constexpr (DecayChannel != DecayChannel::D0ToPiK) { float pXtrack2 = cand.pxProng2(); float pYtrack2 = cand.pyProng2(); float pTtrack2 = cand.ptProng2(); @@ -335,18 +334,18 @@ struct HfTaskFlowCharmHadrons { std::vector tracksQx = {}; std::vector tracksQy = {}; - if constexpr (DecayChannel == DecayChannel::D0ToPiK){ + if constexpr (DecayChannel == DecayChannel::D0ToPiK) { getQvecDtracks(candidate, tracksQx, tracksQy, ampl); - for (unsigned int itrack = 0; itrack < 2; itrack++) { - xQVec -= tracksQx[itrack]; - yQVec -= tracksQy[itrack]; - } - } else { + for (unsigned int itrack = 0; itrack < 2; itrack++) { + xQVec -= tracksQx[itrack]; + yQVec -= tracksQy[itrack]; + } + } else { getQvecDtracks(candidate, tracksQx, tracksQy, ampl); for (unsigned int itrack = 0; itrack < 3; itrack++) { - xQVec -= tracksQx[itrack]; - yQVec -= tracksQy[itrack]; - } + xQVec -= tracksQx[itrack]; + yQVec -= tracksQy[itrack]; + } } } @@ -365,7 +364,8 @@ struct HfTaskFlowCharmHadrons { std::cout << "Here is CandD0DatawMl" << std::endl; for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { outputMlD0[iclass] = candidate.mlProbD0()[classMl->at(iclass)]; - std::cout << "Here is iclass " << iclass << "\t Here is outputMl " << outputMlD0[iclass] << std::endl; } + std::cout << "Here is iclass " << iclass << "\t Here is outputMl " << outputMlD0[iclass] << std::endl; + } } fillThn(massCand, ptCand, cent, cosNPhi, cosDeltaPhi, scalprodCand, outputMlD0); } @@ -377,7 +377,7 @@ struct HfTaskFlowCharmHadrons { } fillThn(massCand, ptCand, cent, cosNPhi, cosDeltaPhi, scalprodCand, outputMlD0bar); } - } //TODO: Whether to put all the mass calculations here + } // TODO: Whether to put all the mass calculations here if constexpr (DecayChannel != DecayChannel::D0ToPiK) { fillThn(massCand, ptCand, cent, cosNPhi, cosDeltaPhi, scalprodCand, outputMl); @@ -421,7 +421,7 @@ struct HfTaskFlowCharmHadrons { // D0 with ML void processD0Ml(CollsWithQvecs::iterator const& collision, - CandD0DatawMl const& candidatesD0) + CandD0DatawMl const& candidatesD0) { runFlowAnalysis(collision, candidatesD0); } @@ -429,7 +429,7 @@ struct HfTaskFlowCharmHadrons { // D0 with rectangular cuts void processD0(CollsWithQvecs::iterator const& collision, - CandD0Data const& candidatesD0) + CandD0Data const& candidatesD0) { runFlowAnalysis(collision, candidatesD0); } From 062754a4f86a1890f67bb5cce03a85e7cb264c5d Mon Sep 17 00:00:00 2001 From: Libeiyu Date: Mon, 11 Mar 2024 18:20:58 +0800 Subject: [PATCH 06/36] # --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index d9abe88289c..1c235d983f9 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -330,7 +330,7 @@ struct HfTaskFlowCharmHadrons { // If TPC is used for the SP estimation, the tracks of the hadron candidate must be removed from the TPC Q vector to avoid double counting if (qvecDetector == qvecEstimator::TPCNeg || qvecDetector == qvecEstimator::TPCPos) { - float ampl = amplQVec - float(prongNum); + float ampl = amplQVec - static_cast(prongNum); std::vector tracksQx = {}; std::vector tracksQy = {}; @@ -361,11 +361,8 @@ struct HfTaskFlowCharmHadrons { if (candidate.isSelD0() >= selectionFlag) { massCand = hfHelper.invMassD0ToPiK(candidate); if constexpr (std::is_same::value) { - std::cout << "Here is CandD0DatawMl" << std::endl; - for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { + for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) outputMlD0[iclass] = candidate.mlProbD0()[classMl->at(iclass)]; - std::cout << "Here is iclass " << iclass << "\t Here is outputMl " << outputMlD0[iclass] << std::endl; - } } fillThn(massCand, ptCand, cent, cosNPhi, cosDeltaPhi, scalprodCand, outputMlD0); } From 2e36d663964dd355cf0a58799bc7eedce8b198ce Mon Sep 17 00:00:00 2001 From: Libeiyu Date: Mon, 11 Mar 2024 18:25:37 +0800 Subject: [PATCH 07/36] # --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index 1c235d983f9..d9abe88289c 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -330,7 +330,7 @@ struct HfTaskFlowCharmHadrons { // If TPC is used for the SP estimation, the tracks of the hadron candidate must be removed from the TPC Q vector to avoid double counting if (qvecDetector == qvecEstimator::TPCNeg || qvecDetector == qvecEstimator::TPCPos) { - float ampl = amplQVec - static_cast(prongNum); + float ampl = amplQVec - float(prongNum); std::vector tracksQx = {}; std::vector tracksQy = {}; @@ -361,8 +361,11 @@ struct HfTaskFlowCharmHadrons { if (candidate.isSelD0() >= selectionFlag) { massCand = hfHelper.invMassD0ToPiK(candidate); if constexpr (std::is_same::value) { - for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) + std::cout << "Here is CandD0DatawMl" << std::endl; + for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { outputMlD0[iclass] = candidate.mlProbD0()[classMl->at(iclass)]; + std::cout << "Here is iclass " << iclass << "\t Here is outputMl " << outputMlD0[iclass] << std::endl; + } } fillThn(massCand, ptCand, cent, cosNPhi, cosDeltaPhi, scalprodCand, outputMlD0); } From b8c6c80e16c6cfa80e6f1520d5678cb6d23b07d9 Mon Sep 17 00:00:00 2001 From: Libeiyu Date: Mon, 11 Mar 2024 18:46:14 +0800 Subject: [PATCH 08/36] correct float type --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index d9abe88289c..459eec58786 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -330,7 +330,7 @@ struct HfTaskFlowCharmHadrons { // If TPC is used for the SP estimation, the tracks of the hadron candidate must be removed from the TPC Q vector to avoid double counting if (qvecDetector == qvecEstimator::TPCNeg || qvecDetector == qvecEstimator::TPCPos) { - float ampl = amplQVec - float(prongNum); + float ampl = amplQVec - static_cast(prongNum); std::vector tracksQx = {}; std::vector tracksQy = {}; @@ -360,12 +360,9 @@ struct HfTaskFlowCharmHadrons { if (candidate.isSelD0() >= selectionFlag) { massCand = hfHelper.invMassD0ToPiK(candidate); - if constexpr (std::is_same::value) { - std::cout << "Here is CandD0DatawMl" << std::endl; - for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { + if constexpr (std::is_same::value) { + for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) outputMlD0[iclass] = candidate.mlProbD0()[classMl->at(iclass)]; - std::cout << "Here is iclass " << iclass << "\t Here is outputMl " << outputMlD0[iclass] << std::endl; - } } fillThn(massCand, ptCand, cent, cosNPhi, cosDeltaPhi, scalprodCand, outputMlD0); } From 07c6b712a8aa71bb242e06e072503efe658079a8 Mon Sep 17 00:00:00 2001 From: Libeiyu Date: Mon, 11 Mar 2024 18:48:42 +0800 Subject: [PATCH 09/36] correct float type --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index 459eec58786..64f65fb5957 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -360,7 +360,7 @@ struct HfTaskFlowCharmHadrons { if (candidate.isSelD0() >= selectionFlag) { massCand = hfHelper.invMassD0ToPiK(candidate); - if constexpr (std::is_same::value) { + if constexpr (std::is_same::value) { for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) outputMlD0[iclass] = candidate.mlProbD0()[classMl->at(iclass)]; } From 4aab46cdbce0638158e97ce18d04821720e04bac Mon Sep 17 00:00:00 2001 From: Libeiyu Date: Mon, 11 Mar 2024 19:02:14 +0800 Subject: [PATCH 10/36] prongNum >> nProngs --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index 64f65fb5957..99b111be64d 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -53,7 +53,7 @@ struct HfTaskFlowCharmHadrons { Configurable qvecDetector{"qvecDetector", 0, "Detector for Q vector estimation (FV0A: 0, FT0M: 1, FT0A: 2, FT0C: 3, TPC Pos: 4, TPC Neg: 5)"}; Configurable centDetector{"centDetector", 0, "Detector for centrality estimation (V0A: 0, T0M: 1, T0A: 2, T0C: 3)"}; Configurable selectionFlag{"selectionFlag", 1, "Selection Flag for hadron (e.g. 1 for skimming, 3 for topo. and kine., 7 for PID)"}; - Configurable prongNum{"prongNum", 3, "Number of candidate's prong (For D0, set selectionFlag = 1 and prongNum = 2)"}; + Configurable nProngs{"nProngs", 3, "Number of candidate's prong (For D0, set selectionFlag = 1 and nProngs = 2)"}; Configurable storeMl{"storeMl", false, "Flag to store ML scores"}; Configurable saveEpResoHisto{"saveEpResoHisto", false, "Flag to save event plane resolution histogram"}; Configurable> classMl{"classMl", {0, 2}, "Indexes of BDT scores to be stored. Two indexes max."}; @@ -140,8 +140,8 @@ struct HfTaskFlowCharmHadrons { /// \param cand is the candidate /// \param tracksQx is the X component of the Q vector for the tracks /// \param tracksQy is the Y component of the Q vector for the tracks - /// \param DecayChannel - template + /// \param DeChannel is the decay channel + template void getQvecDtracks(const T1& cand, std::vector& tracksQx, std::vector& tracksQy, @@ -157,18 +157,18 @@ struct HfTaskFlowCharmHadrons { float pTtrack1 = cand.ptProng1(); float phiTrack1 = std::atan2(pYtrack1, pXtrack1); - tracksQx.push_back(cos(harmonic * phiTrack0) * pTtrack0 / ampl); - tracksQy.push_back(sin(harmonic * phiTrack0) * pTtrack0 / ampl); - tracksQx.push_back(cos(harmonic * phiTrack1) * pTtrack1 / ampl); - tracksQy.push_back(sin(harmonic * phiTrack1) * pTtrack1 / ampl); + tracksQx.push_back(std::cos(harmonic * phiTrack0) * pTtrack0 / ampl); + tracksQy.push_back(std::sin(harmonic * phiTrack0) * pTtrack0 / ampl); + tracksQx.push_back(std::cos(harmonic * phiTrack1) * pTtrack1 / ampl); + tracksQy.push_back(std::sin(harmonic * phiTrack1) * pTtrack1 / ampl); - if constexpr (DecayChannel != DecayChannel::D0ToPiK) { + if constexpr (DeChannel != DecayChannel::D0ToPiK) { float pXtrack2 = cand.pxProng2(); float pYtrack2 = cand.pyProng2(); float pTtrack2 = cand.ptProng2(); float phiTrack2 = std::atan2(pYtrack2, pXtrack2); - tracksQx.push_back(cos(harmonic * phiTrack2) * pTtrack2 / ampl); - tracksQy.push_back(sin(harmonic * phiTrack2) * pTtrack2 / ampl); + tracksQx.push_back(std::cos(harmonic * phiTrack2) * pTtrack2 / ampl); + tracksQy.push_back(std::sin(harmonic * phiTrack2) * pTtrack2 / ampl); } } @@ -330,7 +330,7 @@ struct HfTaskFlowCharmHadrons { // If TPC is used for the SP estimation, the tracks of the hadron candidate must be removed from the TPC Q vector to avoid double counting if (qvecDetector == qvecEstimator::TPCNeg || qvecDetector == qvecEstimator::TPCPos) { - float ampl = amplQVec - static_cast(prongNum); + float ampl = amplQVec - static_cast(nProngs); std::vector tracksQx = {}; std::vector tracksQy = {}; From d5ca18690a90f8c7539b8d33833527b5aa4e588f Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Mon, 11 Mar 2024 11:05:14 +0000 Subject: [PATCH 11/36] Please consider the following formatting changes --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index 99b111be64d..33d1ba4bb25 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -360,7 +360,7 @@ struct HfTaskFlowCharmHadrons { if (candidate.isSelD0() >= selectionFlag) { massCand = hfHelper.invMassD0ToPiK(candidate); - if constexpr (std::is_same::value) { + if constexpr (std::is_same::value) { for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) outputMlD0[iclass] = candidate.mlProbD0()[classMl->at(iclass)]; } From 1cce9b05ff3f8b4f2f80d7f8a37a77709885508a Mon Sep 17 00:00:00 2001 From: Libeiyu Date: Mon, 11 Mar 2024 19:11:26 +0800 Subject: [PATCH 12/36] using rabs instead of spaces --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index 33d1ba4bb25..107de3a9a9f 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -374,7 +374,7 @@ struct HfTaskFlowCharmHadrons { } fillThn(massCand, ptCand, cent, cosNPhi, cosDeltaPhi, scalprodCand, outputMlD0bar); } - } // TODO: Whether to put all the mass calculations here + } // TODO: whether to put all the mass calculations here if constexpr (DecayChannel != DecayChannel::D0ToPiK) { fillThn(massCand, ptCand, cent, cosNPhi, cosDeltaPhi, scalprodCand, outputMl); From c65115e8040faf10014585613120af88f630c116 Mon Sep 17 00:00:00 2001 From: Libeiyu <48704924+Libeiyu@users.noreply.github.com> Date: Tue, 12 Mar 2024 20:12:27 +0800 Subject: [PATCH 13/36] Update PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx Call getQvecDtracks without if Co-authored-by: Fabrizio --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index 107de3a9a9f..1092107a823 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -334,18 +334,11 @@ struct HfTaskFlowCharmHadrons { std::vector tracksQx = {}; std::vector tracksQy = {}; - if constexpr (DecayChannel == DecayChannel::D0ToPiK) { - getQvecDtracks(candidate, tracksQx, tracksQy, ampl); - for (unsigned int itrack = 0; itrack < 2; itrack++) { - xQVec -= tracksQx[itrack]; - yQVec -= tracksQy[itrack]; - } - } else { - getQvecDtracks(candidate, tracksQx, tracksQy, ampl); - for (unsigned int itrack = 0; itrack < 3; itrack++) { - xQVec -= tracksQx[itrack]; - yQVec -= tracksQy[itrack]; - } + getQvecDtracks(candidate, tracksQx, tracksQy, ampl); + for (auto iTrack{0u}; iTrack < tracksQx.size(); ++iTrack) { + xQVec -= tracksQx[iTrack]; + yQVec -= tracksQy[iTrack]; + } } } From fb388f6daa691a8321a697561d607c6d096440c6 Mon Sep 17 00:00:00 2001 From: Libeiyu <48704924+Libeiyu@users.noreply.github.com> Date: Tue, 12 Mar 2024 20:32:39 +0800 Subject: [PATCH 14/36] Update PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New name for decaychannel Co-authored-by: Vít Kučera --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index 1092107a823..2026cc5f3a6 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -141,7 +141,7 @@ struct HfTaskFlowCharmHadrons { /// \param tracksQx is the X component of the Q vector for the tracks /// \param tracksQy is the Y component of the Q vector for the tracks /// \param DeChannel is the decay channel - template + template void getQvecDtracks(const T1& cand, std::vector& tracksQx, std::vector& tracksQy, From f7c0aee4435d041d9dc0cbf127707636a0bb1118 Mon Sep 17 00:00:00 2001 From: Libeiyu <48704924+Libeiyu@users.noreply.github.com> Date: Tue, 12 Mar 2024 20:37:25 +0800 Subject: [PATCH 15/36] Update taskFlowCharmHadrons.cxx New name for p*Track --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index 2026cc5f3a6..a12670b12b4 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -148,14 +148,14 @@ struct HfTaskFlowCharmHadrons { float& ampl) { // TODO: add possibility to consider different weights for the tracks, at the moment only pT is considered; - float pXtrack0 = cand.pxProng0(); - float pYtrack0 = cand.pyProng0(); - float pTtrack0 = cand.ptProng0(); - float phiTrack0 = std::atan2(pYtrack0, pXtrack0); - float pXtrack1 = cand.pxProng1(); - float pYtrack1 = cand.pyProng1(); - float pTtrack1 = cand.ptProng1(); - float phiTrack1 = std::atan2(pYtrack1, pXtrack1); + float pXTrack0 = cand.pxProng0(); + float pYTrack0 = cand.pyProng0(); + float pTTrack0 = cand.ptProng0(); + float phiTrack0 = std::atan2(pYTrack0, pXTrack0); + float pXTrack1 = cand.pxProng1(); + float pYTrack1 = cand.pyProng1(); + float pTTrack1 = cand.ptProng1(); + float phiTrack1 = std::atan2(pYTrack1, pXTrack1); tracksQx.push_back(std::cos(harmonic * phiTrack0) * pTtrack0 / ampl); tracksQy.push_back(std::sin(harmonic * phiTrack0) * pTtrack0 / ampl); @@ -163,10 +163,10 @@ struct HfTaskFlowCharmHadrons { tracksQy.push_back(std::sin(harmonic * phiTrack1) * pTtrack1 / ampl); if constexpr (DeChannel != DecayChannel::D0ToPiK) { - float pXtrack2 = cand.pxProng2(); - float pYtrack2 = cand.pyProng2(); - float pTtrack2 = cand.ptProng2(); - float phiTrack2 = std::atan2(pYtrack2, pXtrack2); + float pXTrack2 = cand.pxProng2(); + float pYTrack2 = cand.pyProng2(); + float pTTrack2 = cand.ptProng2(); + float phiTrack2 = std::atan2(pYTrack2, pXTrack2); tracksQx.push_back(std::cos(harmonic * phiTrack2) * pTtrack2 / ampl); tracksQy.push_back(std::sin(harmonic * phiTrack2) * pTtrack2 / ampl); } From 7a295ec92517da1917a6c7bc4b1bb12d46807de3 Mon Sep 17 00:00:00 2001 From: Libeiyu <48704924+Libeiyu@users.noreply.github.com> Date: Tue, 12 Mar 2024 20:40:37 +0800 Subject: [PATCH 16/36] Update taskFlowCharmHadrons.cxx --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index a12670b12b4..581056c059a 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -150,11 +150,11 @@ struct HfTaskFlowCharmHadrons { // TODO: add possibility to consider different weights for the tracks, at the moment only pT is considered; float pXTrack0 = cand.pxProng0(); float pYTrack0 = cand.pyProng0(); - float pTTrack0 = cand.ptProng0(); + float pTtrack0 = cand.ptProng0(); float phiTrack0 = std::atan2(pYTrack0, pXTrack0); float pXTrack1 = cand.pxProng1(); float pYTrack1 = cand.pyProng1(); - float pTTrack1 = cand.ptProng1(); + float pTtrack1 = cand.ptProng1(); float phiTrack1 = std::atan2(pYTrack1, pXTrack1); tracksQx.push_back(std::cos(harmonic * phiTrack0) * pTtrack0 / ampl); @@ -165,7 +165,7 @@ struct HfTaskFlowCharmHadrons { if constexpr (DeChannel != DecayChannel::D0ToPiK) { float pXTrack2 = cand.pxProng2(); float pYTrack2 = cand.pyProng2(); - float pTTrack2 = cand.ptProng2(); + float pTtrack2 = cand.ptProng2(); float phiTrack2 = std::atan2(pYTrack2, pXTrack2); tracksQx.push_back(std::cos(harmonic * phiTrack2) * pTtrack2 / ampl); tracksQy.push_back(std::sin(harmonic * phiTrack2) * pTtrack2 / ampl); From a3fbbae9718f80d326fa6fdbb463b4d09bc483d9 Mon Sep 17 00:00:00 2001 From: Libeiyu <48704924+Libeiyu@users.noreply.github.com> Date: Tue, 12 Mar 2024 20:42:12 +0800 Subject: [PATCH 17/36] Update taskFlowCharmHadrons.cxx --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index 581056c059a..c799489a8cb 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -150,25 +150,25 @@ struct HfTaskFlowCharmHadrons { // TODO: add possibility to consider different weights for the tracks, at the moment only pT is considered; float pXTrack0 = cand.pxProng0(); float pYTrack0 = cand.pyProng0(); - float pTtrack0 = cand.ptProng0(); + float pTTrack0 = cand.ptProng0(); float phiTrack0 = std::atan2(pYTrack0, pXTrack0); float pXTrack1 = cand.pxProng1(); float pYTrack1 = cand.pyProng1(); - float pTtrack1 = cand.ptProng1(); + float pTTrack1 = cand.ptProng1(); float phiTrack1 = std::atan2(pYTrack1, pXTrack1); - tracksQx.push_back(std::cos(harmonic * phiTrack0) * pTtrack0 / ampl); - tracksQy.push_back(std::sin(harmonic * phiTrack0) * pTtrack0 / ampl); - tracksQx.push_back(std::cos(harmonic * phiTrack1) * pTtrack1 / ampl); - tracksQy.push_back(std::sin(harmonic * phiTrack1) * pTtrack1 / ampl); + tracksQx.push_back(std::cos(harmonic * phiTrack0) * pTTrack0 / ampl); + tracksQy.push_back(std::sin(harmonic * phiTrack0) * pTTrack0 / ampl); + tracksQx.push_back(std::cos(harmonic * phiTrack1) * pTTrack1 / ampl); + tracksQy.push_back(std::sin(harmonic * phiTrack1) * pTTrack1 / ampl); if constexpr (DeChannel != DecayChannel::D0ToPiK) { float pXTrack2 = cand.pxProng2(); float pYTrack2 = cand.pyProng2(); - float pTtrack2 = cand.ptProng2(); + float pTTrack2 = cand.ptProng2(); float phiTrack2 = std::atan2(pYTrack2, pXTrack2); - tracksQx.push_back(std::cos(harmonic * phiTrack2) * pTtrack2 / ampl); - tracksQy.push_back(std::sin(harmonic * phiTrack2) * pTtrack2 / ampl); + tracksQx.push_back(std::cos(harmonic * phiTrack2) * pTTrack2 / ampl); + tracksQy.push_back(std::sin(harmonic * phiTrack2) * pTTrack2 / ampl); } } From f1ff955f1639da4dc815e13ed0fc53328eb2ae7f Mon Sep 17 00:00:00 2001 From: Libeiyu <48704924+Libeiyu@users.noreply.github.com> Date: Tue, 12 Mar 2024 21:25:13 +0800 Subject: [PATCH 18/36] Update taskFlowCharmHadrons.cxx --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 1 - 1 file changed, 1 deletion(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index c799489a8cb..455b5168c32 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -339,7 +339,6 @@ struct HfTaskFlowCharmHadrons { xQVec -= tracksQx[iTrack]; yQVec -= tracksQy[iTrack]; } - } } float cosNPhi = std::cos(harmonic * phiCand); From 49a37cecb4182e7159061c8e38ac67916008cf18 Mon Sep 17 00:00:00 2001 From: Libeiyu Date: Tue, 12 Mar 2024 21:42:23 +0800 Subject: [PATCH 19/36] DecayChannel channel >> int channel --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index 455b5168c32..2e03c698a60 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -141,7 +141,7 @@ struct HfTaskFlowCharmHadrons { /// \param tracksQx is the X component of the Q vector for the tracks /// \param tracksQy is the Y component of the Q vector for the tracks /// \param DeChannel is the decay channel - template + template void getQvecDtracks(const T1& cand, std::vector& tracksQx, std::vector& tracksQy, @@ -162,7 +162,7 @@ struct HfTaskFlowCharmHadrons { tracksQx.push_back(std::cos(harmonic * phiTrack1) * pTTrack1 / ampl); tracksQy.push_back(std::sin(harmonic * phiTrack1) * pTTrack1 / ampl); - if constexpr (DeChannel != DecayChannel::D0ToPiK) { + if constexpr (channel != DecayChannel::D0ToPiK) { float pXTrack2 = cand.pxProng2(); float pYTrack2 = cand.pyProng2(); float pTTrack2 = cand.ptProng2(); From d5836406c0b911c1742ca3602c9c18449bd84ebe Mon Sep 17 00:00:00 2001 From: Libeiyu Date: Tue, 12 Mar 2024 22:05:54 +0800 Subject: [PATCH 20/36] Add enum CentralityEstimator and fix to QVecEstimator --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 35 +++++++++++------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index 2e03c698a60..7a65de71df5 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -24,23 +24,20 @@ #include "PWGHF/Core/HfHelper.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" +#include "PWGHF/DataModel/CandidateReconstructionTables.h" using namespace o2; using namespace o2::aod; using namespace o2::framework; using namespace o2::framework::expressions; +using namespace o2::aod::hf_collision_centrality; enum DecayChannel { DplusToPiKPi = 0, DsToKKPi, DsToPiKK, D0ToPiK }; -enum centralityEstimator { V0A = 0, - T0M, - T0A, - T0C }; - -enum qvecEstimator { FV0A = 0, +enum QvecEstimator { FV0A = 0, FT0M, FT0A, FT0C, @@ -51,7 +48,7 @@ struct HfTaskFlowCharmHadrons { Configurable zVtxMax{"zVtxMax", 10., "Max vertex coordinate z"}; Configurable harmonic{"harmonic", 2, "harmonic number"}; Configurable qvecDetector{"qvecDetector", 0, "Detector for Q vector estimation (FV0A: 0, FT0M: 1, FT0A: 2, FT0C: 3, TPC Pos: 4, TPC Neg: 5)"}; - Configurable centDetector{"centDetector", 0, "Detector for centrality estimation (V0A: 0, T0M: 1, T0A: 2, T0C: 3)"}; + Configurable centEstimator{"centEstimator", 4, "Centrality estimation (FT0A: 1, FT0C: 2, FT0M: 3, FV0A: 4)"}; Configurable selectionFlag{"selectionFlag", 1, "Selection Flag for hadron (e.g. 1 for skimming, 3 for topo. and kine., 7 for PID)"}; Configurable nProngs{"nProngs", 3, "Number of candidate's prong (For D0, set selectionFlag = 1 and nProngs = 2)"}; Configurable storeMl{"storeMl", false, "Flag to store ML scores"}; @@ -218,17 +215,17 @@ struct HfTaskFlowCharmHadrons { float getCentrality(CollsWithQvecs::iterator const& collision) { float cent = -999.; - switch (centDetector) { - case centralityEstimator::V0A: + switch (centEstimator) { + case CentralityEstimator::FV0A: cent = collision.centFV0A(); break; - case centralityEstimator::T0M: + case CentralityEstimator::FT0M: cent = collision.centFT0M(); break; - case centralityEstimator::T0A: + case CentralityEstimator::FT0A: cent = collision.centFT0A(); break; - case centralityEstimator::T0C: + case CentralityEstimator::FT0C: cent = collision.centFT0C(); break; default: @@ -247,27 +244,27 @@ struct HfTaskFlowCharmHadrons { float yQVec = -999.; float amplQVec = -999.; switch (qvecDetector) { - case qvecEstimator::FV0A: + case QvecEstimator::FV0A: xQVec = collision.qvecFV0ARe(); yQVec = collision.qvecFV0AIm(); break; - case qvecEstimator::FT0M: + case QvecEstimator::FT0M: xQVec = collision.qvecFT0MRe(); yQVec = collision.qvecFT0MIm(); break; - case qvecEstimator::FT0A: + case QvecEstimator::FT0A: xQVec = collision.qvecFT0ARe(); yQVec = collision.qvecFT0AIm(); break; - case qvecEstimator::FT0C: + case QvecEstimator::FT0C: xQVec = collision.qvecFT0CRe(); yQVec = collision.qvecFT0CIm(); - case qvecEstimator::TPCPos: + case QvecEstimator::TPCPos: xQVec = collision.qvecBPosRe(); yQVec = collision.qvecBPosIm(); amplQVec = collision.nTrkBPos(); break; - case qvecEstimator::TPCNeg: + case QvecEstimator::TPCNeg: xQVec = collision.qvecBNegRe(); yQVec = collision.qvecBNegIm(); amplQVec = collision.nTrkBNeg(); @@ -329,7 +326,7 @@ struct HfTaskFlowCharmHadrons { float phiCand = candidate.phi(); // If TPC is used for the SP estimation, the tracks of the hadron candidate must be removed from the TPC Q vector to avoid double counting - if (qvecDetector == qvecEstimator::TPCNeg || qvecDetector == qvecEstimator::TPCPos) { + if (qvecDetector == QvecEstimator::TPCNeg || qvecDetector == QvecEstimator::TPCPos) { float ampl = amplQVec - static_cast(nProngs); std::vector tracksQx = {}; std::vector tracksQy = {}; From 0aeb9f2fe7de21d1a34db2ca264e1162241a4612 Mon Sep 17 00:00:00 2001 From: Libeiyu <48704924+Libeiyu@users.noreply.github.com> Date: Tue, 12 Mar 2024 22:18:01 +0800 Subject: [PATCH 21/36] Update taskFlowCharmHadrons.cxx Fix the param in fillThn --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index 7a65de71df5..0b0638c62c0 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -137,7 +137,7 @@ struct HfTaskFlowCharmHadrons { /// \param cand is the candidate /// \param tracksQx is the X component of the Q vector for the tracks /// \param tracksQy is the Y component of the Q vector for the tracks - /// \param DeChannel is the decay channel + /// \param channel is the decay channel template void getQvecDtracks(const T1& cand, std::vector& tracksQx, @@ -192,9 +192,7 @@ struct HfTaskFlowCharmHadrons { /// \param cosNPhi is the cosine of the n*phi angle /// \param cosDeltaPhi is the cosine of the n*(phi - evtPl) angle /// \param sp is the scalar product - /// \param evtPlReso is the event plane resolution /// \param outputMl are the ML scores - /// \param selectionFlag for D0, only 0 or1 void fillThn(float& mass, float& pt, float& cent, From 4cd3441788463d8e1a722fe0eb141ad517f18ab6 Mon Sep 17 00:00:00 2001 From: Libeiyu <48704924+Libeiyu@users.noreply.github.com> Date: Tue, 12 Mar 2024 22:32:40 +0800 Subject: [PATCH 22/36] Update taskFlowCharmHadrons.cxx --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 1 - 1 file changed, 1 deletion(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index 0b0638c62c0..7cd9488305c 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -24,7 +24,6 @@ #include "PWGHF/Core/HfHelper.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" -#include "PWGHF/DataModel/CandidateReconstructionTables.h" using namespace o2; using namespace o2::aod; From 94163b770894c02e1dd3b5289e11c83e95da398e Mon Sep 17 00:00:00 2001 From: Libeiyu Date: Tue, 19 Mar 2024 14:54:28 +0800 Subject: [PATCH 23/36] The two mass hypotheses handled similarly for all particle species --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 72 ++++++++++++++---------- 1 file changed, 42 insertions(+), 30 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index 7cd9488305c..6bf81e59153 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -34,7 +34,8 @@ using namespace o2::aod::hf_collision_centrality; enum DecayChannel { DplusToPiKPi = 0, DsToKKPi, DsToPiKK, - D0ToPiK }; + D0ToPiK, + D0ToKPi }; enum QvecEstimator { FV0A = 0, FT0M, @@ -49,7 +50,7 @@ struct HfTaskFlowCharmHadrons { Configurable qvecDetector{"qvecDetector", 0, "Detector for Q vector estimation (FV0A: 0, FT0M: 1, FT0A: 2, FT0C: 3, TPC Pos: 4, TPC Neg: 5)"}; Configurable centEstimator{"centEstimator", 4, "Centrality estimation (FT0A: 1, FT0C: 2, FT0M: 3, FV0A: 4)"}; Configurable selectionFlag{"selectionFlag", 1, "Selection Flag for hadron (e.g. 1 for skimming, 3 for topo. and kine., 7 for PID)"}; - Configurable nProngs{"nProngs", 3, "Number of candidate's prong (For D0, set selectionFlag = 1 and nProngs = 2)"}; + //Configurable nProngs{"nProngs", 3, "Number of candidate's prong (Set selectionFlag = 1 and nProngs = 2 for D0, and nProngs = 3 for Lc)"}; Configurable storeMl{"storeMl", false, "Flag to store ML scores"}; Configurable saveEpResoHisto{"saveEpResoHisto", false, "Flag to save event plane resolution histogram"}; Configurable> classMl{"classMl", {0, 2}, "Indexes of BDT scores to be stored. Two indexes max."}; @@ -67,6 +68,8 @@ struct HfTaskFlowCharmHadrons { using CandDsData = soa::Filtered>; using CandDplusDatawMl = soa::Filtered>; using CandDplusData = soa::Filtered>; + using CandLcData = soa::Filtered>; + using CandLcDatawMl = soa::Filtered>; // For LcToPKPI. TODO: LctoK0sP using CandD0DatawMl = soa::Filtered>; using CandD0Data = soa::Filtered>; using CollsWithQvecs = soa::Join; @@ -74,11 +77,20 @@ struct HfTaskFlowCharmHadrons { Filter filterSelectDsCandidates = aod::hf_sel_candidate_ds::isSelDsToKKPi >= selectionFlag || aod::hf_sel_candidate_ds::isSelDsToPiKK >= selectionFlag; Filter filterSelectDplusCandidates = aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= selectionFlag; Filter filterSelectD0Candidates = aod::hf_sel_candidate_d0::isSelD0 >= selectionFlag || aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlag; + Filter filterSelectLcCandidates = aod::hf_sel_candidate_lc::isSelLcToPKPi >= selectionFlag || aod::hf_sel_candidate_lc::isSelLcToPiKP >= selectionFlag; Partition selectedDsToKKPi = aod::hf_sel_candidate_ds::isSelDsToKKPi >= selectionFlag; Partition selectedDsToPiKK = aod::hf_sel_candidate_ds::isSelDsToPiKK >= selectionFlag; Partition selectedDsToKKPiwMl = aod::hf_sel_candidate_ds::isSelDsToKKPi >= selectionFlag; Partition selectedDsToPiKKwMl = aod::hf_sel_candidate_ds::isSelDsToPiKK >= selectionFlag; + Partition selectedD0ToPiK = aod::hf_sel_candidate_d0::isSelD0 >= selectionFlag; + Partition selectedD0ToKPi = aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlag; + Partition selectedD0ToPiKwMl = aod::hf_sel_candidate_d0::isSelD0 >= selectionFlag; + Partition selectedD0ToKPiwMl = aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlag; + Partition selectedLcToPKPi = aod::hf_sel_candidate_lc::isSelLcToPKPi >= selectionFlag; + Partition selectedLcToPiKP = aod::hf_sel_candidate_lc::isSelLcToPiKP >= selectionFlag; + Partition selectedLcToPKPiwMl = aod::hf_sel_candidate_lc::isSelLcToPKPi >= selectionFlag; + Partition selectedLcToPiKPwMl = aod::hf_sel_candidate_lc::isSelLcToPiKP >= selectionFlag; HfHelper hfHelper; EventPlaneHelper epHelper; @@ -158,7 +170,7 @@ struct HfTaskFlowCharmHadrons { tracksQx.push_back(std::cos(harmonic * phiTrack1) * pTTrack1 / ampl); tracksQy.push_back(std::sin(harmonic * phiTrack1) * pTTrack1 / ampl); - if constexpr (channel != DecayChannel::D0ToPiK) { + if constexpr (channel != DecayChannel::D0ToPiK && channel != DecayChannel::D0ToKPi) { float pXTrack2 = cand.pxProng2(); float pYTrack2 = cand.pyProng2(); float pTTrack2 = cand.ptProng2(); @@ -288,6 +300,7 @@ struct HfTaskFlowCharmHadrons { float amplQVec = qVecs[2]; float evtPl = epHelper.GetEventPlane(xQVec, yQVec, harmonic); float cent = getCentrality(collision); + int nProngs = 3; for (const auto& candidate : candidates) { float massCand = 0.; @@ -318,7 +331,28 @@ struct HfTaskFlowCharmHadrons { for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) outputMl[iclass] = candidate.mlProbDplusToPiKPi()[classMl->at(iclass)]; } + } else if constexpr (std::is_same::value || std::is_same::value) { + nProngs = 2; + switch (DecayChannel) { + case DecayChannel::D0ToPiK: + massCand = hfHelper.invMassD0ToPiK(candidate); + if constexpr (std::is_same::value) { + for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) + outputMl[iclass] = candidate.mlProbD0()[classMl->at(iclass)]; + } + break; + case DecayChannel::D0ToKPi: + massCand = hfHelper.invMassD0barToKPi(candidate); + if constexpr (std::is_same::value) { + for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) + outputMl[iclass] = candidate.mlProbD0bar()[classMl->at(iclass)]; + } + break; + default: + break; + } } + float ptCand = candidate.pt(); float phiCand = candidate.phi(); @@ -340,31 +374,7 @@ struct HfTaskFlowCharmHadrons { float scalprodCand = cosNPhi * xQVec + sinNPhi * yQVec; float cosDeltaPhi = std::cos(harmonic * (phiCand - evtPl)); - if constexpr (std::is_same::value || std::is_same::value) { - std::vector outputMlD0 = {-999., -999.}; - std::vector outputMlD0bar = {-999., -999.}; - - if (candidate.isSelD0() >= selectionFlag) { - massCand = hfHelper.invMassD0ToPiK(candidate); - if constexpr (std::is_same::value) { - for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) - outputMlD0[iclass] = candidate.mlProbD0()[classMl->at(iclass)]; - } - fillThn(massCand, ptCand, cent, cosNPhi, cosDeltaPhi, scalprodCand, outputMlD0); - } - if (candidate.isSelD0bar() >= selectionFlag) { - massCand = hfHelper.invMassD0barToKPi(candidate); - if constexpr (std::is_same::value) { - for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) - outputMlD0bar[iclass] = candidate.mlProbD0bar()[classMl->at(iclass)]; - } - fillThn(massCand, ptCand, cent, cosNPhi, cosDeltaPhi, scalprodCand, outputMlD0bar); - } - } // TODO: whether to put all the mass calculations here - - if constexpr (DecayChannel != DecayChannel::D0ToPiK) { - fillThn(massCand, ptCand, cent, cosNPhi, cosDeltaPhi, scalprodCand, outputMl); - } + fillThn(massCand, ptCand, cent, cosNPhi, cosDeltaPhi, scalprodCand, outputMl); } } @@ -406,7 +416,8 @@ struct HfTaskFlowCharmHadrons { void processD0Ml(CollsWithQvecs::iterator const& collision, CandD0DatawMl const& candidatesD0) { - runFlowAnalysis(collision, candidatesD0); + runFlowAnalysis>(collision, selectedD0ToPiKwMl); + runFlowAnalysis>(collision, selectedD0ToKPiwMl); } PROCESS_SWITCH(HfTaskFlowCharmHadrons, processD0Ml, "Process D0 candidates with ML", false); @@ -414,7 +425,8 @@ struct HfTaskFlowCharmHadrons { void processD0(CollsWithQvecs::iterator const& collision, CandD0Data const& candidatesD0) { - runFlowAnalysis(collision, candidatesD0); + runFlowAnalysis>(collision, selectedD0ToPiK); + runFlowAnalysis>(collision, selectedD0ToKPi); } PROCESS_SWITCH(HfTaskFlowCharmHadrons, processD0, "Process D0 candidates", false); From 55aed3e782be47bd8486672c0d58edc8c863f26e Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Tue, 19 Mar 2024 06:55:14 +0000 Subject: [PATCH 24/36] Please consider the following formatting changes --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index 6bf81e59153..c976c8b2e1d 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -50,7 +50,7 @@ struct HfTaskFlowCharmHadrons { Configurable qvecDetector{"qvecDetector", 0, "Detector for Q vector estimation (FV0A: 0, FT0M: 1, FT0A: 2, FT0C: 3, TPC Pos: 4, TPC Neg: 5)"}; Configurable centEstimator{"centEstimator", 4, "Centrality estimation (FT0A: 1, FT0C: 2, FT0M: 3, FV0A: 4)"}; Configurable selectionFlag{"selectionFlag", 1, "Selection Flag for hadron (e.g. 1 for skimming, 3 for topo. and kine., 7 for PID)"}; - //Configurable nProngs{"nProngs", 3, "Number of candidate's prong (Set selectionFlag = 1 and nProngs = 2 for D0, and nProngs = 3 for Lc)"}; + // Configurable nProngs{"nProngs", 3, "Number of candidate's prong (Set selectionFlag = 1 and nProngs = 2 for D0, and nProngs = 3 for Lc)"}; Configurable storeMl{"storeMl", false, "Flag to store ML scores"}; Configurable saveEpResoHisto{"saveEpResoHisto", false, "Flag to save event plane resolution histogram"}; Configurable> classMl{"classMl", {0, 2}, "Indexes of BDT scores to be stored. Two indexes max."}; From 695765e5775cee84c88145b534669eb9b8d2d884 Mon Sep 17 00:00:00 2001 From: Libeiyu Date: Tue, 19 Mar 2024 16:36:24 +0800 Subject: [PATCH 25/36] wML >> WML --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 55 +++++++++++++----------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index c976c8b2e1d..5732dc93107 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -50,7 +50,10 @@ struct HfTaskFlowCharmHadrons { Configurable qvecDetector{"qvecDetector", 0, "Detector for Q vector estimation (FV0A: 0, FT0M: 1, FT0A: 2, FT0C: 3, TPC Pos: 4, TPC Neg: 5)"}; Configurable centEstimator{"centEstimator", 4, "Centrality estimation (FT0A: 1, FT0C: 2, FT0M: 3, FV0A: 4)"}; Configurable selectionFlag{"selectionFlag", 1, "Selection Flag for hadron (e.g. 1 for skimming, 3 for topo. and kine., 7 for PID)"}; +<<<<<<< HEAD // Configurable nProngs{"nProngs", 3, "Number of candidate's prong (Set selectionFlag = 1 and nProngs = 2 for D0, and nProngs = 3 for Lc)"}; +======= +>>>>>>> 201b5f63 (wML >> WML) Configurable storeMl{"storeMl", false, "Flag to store ML scores"}; Configurable saveEpResoHisto{"saveEpResoHisto", false, "Flag to save event plane resolution histogram"}; Configurable> classMl{"classMl", {0, 2}, "Indexes of BDT scores to be stored. Two indexes max."}; @@ -64,13 +67,13 @@ struct HfTaskFlowCharmHadrons { ConfigurableAxis thnConfigAxisMlOne{"thnConfigAxisMlOne", {1000, 0., 1.}, ""}; ConfigurableAxis thnConfigAxisMlTwo{"thnConfigAxisMlTwo", {1000, 0., 1.}, ""}; - using CandDsDatawMl = soa::Filtered>; + using CandDsDataWMl = soa::Filtered>; using CandDsData = soa::Filtered>; - using CandDplusDatawMl = soa::Filtered>; + using CandDplusDataWMl = soa::Filtered>; using CandDplusData = soa::Filtered>; using CandLcData = soa::Filtered>; - using CandLcDatawMl = soa::Filtered>; // For LcToPKPI. TODO: LctoK0sP - using CandD0DatawMl = soa::Filtered>; + using CandLcDataWMl = soa::Filtered>; // For LcToPKPI. TODO: LctoK0sP + using CandD0DataWMl = soa::Filtered>; using CandD0Data = soa::Filtered>; using CollsWithQvecs = soa::Join; @@ -81,16 +84,16 @@ struct HfTaskFlowCharmHadrons { Partition selectedDsToKKPi = aod::hf_sel_candidate_ds::isSelDsToKKPi >= selectionFlag; Partition selectedDsToPiKK = aod::hf_sel_candidate_ds::isSelDsToPiKK >= selectionFlag; - Partition selectedDsToKKPiwMl = aod::hf_sel_candidate_ds::isSelDsToKKPi >= selectionFlag; - Partition selectedDsToPiKKwMl = aod::hf_sel_candidate_ds::isSelDsToPiKK >= selectionFlag; + Partition selectedDsToKKPiWMl = aod::hf_sel_candidate_ds::isSelDsToKKPi >= selectionFlag; + Partition selectedDsToPiKKWMl = aod::hf_sel_candidate_ds::isSelDsToPiKK >= selectionFlag; Partition selectedD0ToPiK = aod::hf_sel_candidate_d0::isSelD0 >= selectionFlag; Partition selectedD0ToKPi = aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlag; - Partition selectedD0ToPiKwMl = aod::hf_sel_candidate_d0::isSelD0 >= selectionFlag; - Partition selectedD0ToKPiwMl = aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlag; + Partition selectedD0ToPiKWMl = aod::hf_sel_candidate_d0::isSelD0 >= selectionFlag; + Partition selectedD0ToKPiWMl = aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlag; Partition selectedLcToPKPi = aod::hf_sel_candidate_lc::isSelLcToPKPi >= selectionFlag; Partition selectedLcToPiKP = aod::hf_sel_candidate_lc::isSelLcToPiKP >= selectionFlag; - Partition selectedLcToPKPiwMl = aod::hf_sel_candidate_lc::isSelLcToPKPi >= selectionFlag; - Partition selectedLcToPiKPwMl = aod::hf_sel_candidate_lc::isSelLcToPiKP >= selectionFlag; + Partition selectedLcToPKPiWMl = aod::hf_sel_candidate_lc::isSelLcToPKPi >= selectionFlag; + Partition selectedLcToPiKPWMl = aod::hf_sel_candidate_lc::isSelLcToPiKP >= selectionFlag; HfHelper hfHelper; EventPlaneHelper epHelper; @@ -306,18 +309,18 @@ struct HfTaskFlowCharmHadrons { float massCand = 0.; std::vector outputMl = {-999., -999.}; - if constexpr (std::is_same>::value || std::is_same>::value) { + if constexpr (std::is_same>::value || std::is_same>::value) { switch (DecayChannel) { case DecayChannel::DsToKKPi: massCand = hfHelper.invMassDsToKKPi(candidate); - if constexpr (std::is_same>::value) { + if constexpr (std::is_same>::value) { for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) outputMl[iclass] = candidate.mlProbDsToKKPi()[classMl->at(iclass)]; } break; case DecayChannel::DsToPiKK: massCand = hfHelper.invMassDsToPiKK(candidate); - if constexpr (std::is_same>::value) { + if constexpr (std::is_same>::value) { for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) outputMl[iclass] = candidate.mlProbDsToPiKK()[classMl->at(iclass)]; } @@ -325,25 +328,25 @@ struct HfTaskFlowCharmHadrons { default: break; } - } else if constexpr (std::is_same::value || std::is_same::value) { + } else if constexpr (std::is_same::value || std::is_same::value) { massCand = hfHelper.invMassDplusToPiKPi(candidate); - if constexpr (std::is_same::value) { + if constexpr (std::is_same::value) { for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) outputMl[iclass] = candidate.mlProbDplusToPiKPi()[classMl->at(iclass)]; } - } else if constexpr (std::is_same::value || std::is_same::value) { + } else if constexpr (std::is_same::value || std::is_same::value) { nProngs = 2; switch (DecayChannel) { case DecayChannel::D0ToPiK: massCand = hfHelper.invMassD0ToPiK(candidate); - if constexpr (std::is_same::value) { + if constexpr (std::is_same::value) { for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) outputMl[iclass] = candidate.mlProbD0()[classMl->at(iclass)]; } break; case DecayChannel::D0ToKPi: massCand = hfHelper.invMassD0barToKPi(candidate); - if constexpr (std::is_same::value) { + if constexpr (std::is_same::value) { for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) outputMl[iclass] = candidate.mlProbD0bar()[classMl->at(iclass)]; } @@ -380,10 +383,10 @@ struct HfTaskFlowCharmHadrons { // Ds with ML void processDsMl(CollsWithQvecs::iterator const& collision, - CandDsDatawMl const& candidatesDs) + CandDsDataWMl const& candidatesDs) { - runFlowAnalysis>(collision, selectedDsToKKPiwMl); - runFlowAnalysis>(collision, selectedDsToPiKKwMl); + runFlowAnalysis>(collision, selectedDsToKKPiWMl); + runFlowAnalysis>(collision, selectedDsToPiKKWMl); } PROCESS_SWITCH(HfTaskFlowCharmHadrons, processDsMl, "Process Ds candidates with ML", false); @@ -398,9 +401,9 @@ struct HfTaskFlowCharmHadrons { // Dplus with ML void processDplusMl(CollsWithQvecs::iterator const& collision, - CandDplusDatawMl const& candidatesDplus) + CandDplusDataWMl const& candidatesDplus) { - runFlowAnalysis(collision, candidatesDplus); + runFlowAnalysis(collision, candidatesDplus); } PROCESS_SWITCH(HfTaskFlowCharmHadrons, processDplusMl, "Process Dplus candidates with ML", false); @@ -414,10 +417,10 @@ struct HfTaskFlowCharmHadrons { // D0 with ML void processD0Ml(CollsWithQvecs::iterator const& collision, - CandD0DatawMl const& candidatesD0) + CandD0DataWMl const& candidatesD0) { - runFlowAnalysis>(collision, selectedD0ToPiKwMl); - runFlowAnalysis>(collision, selectedD0ToKPiwMl); + runFlowAnalysis>(collision, selectedD0ToPiKWMl); + runFlowAnalysis>(collision, selectedD0ToKPiWMl); } PROCESS_SWITCH(HfTaskFlowCharmHadrons, processD0Ml, "Process D0 candidates with ML", false); From ae3608f2d4f2a0805d827b0492b994a1d60d9822 Mon Sep 17 00:00:00 2001 From: Libeiyu Date: Tue, 19 Mar 2024 16:52:52 +0800 Subject: [PATCH 26/36] no nProngs --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 4 ---- 1 file changed, 4 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index 5732dc93107..e76131b084c 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -50,10 +50,6 @@ struct HfTaskFlowCharmHadrons { Configurable qvecDetector{"qvecDetector", 0, "Detector for Q vector estimation (FV0A: 0, FT0M: 1, FT0A: 2, FT0C: 3, TPC Pos: 4, TPC Neg: 5)"}; Configurable centEstimator{"centEstimator", 4, "Centrality estimation (FT0A: 1, FT0C: 2, FT0M: 3, FV0A: 4)"}; Configurable selectionFlag{"selectionFlag", 1, "Selection Flag for hadron (e.g. 1 for skimming, 3 for topo. and kine., 7 for PID)"}; -<<<<<<< HEAD - // Configurable nProngs{"nProngs", 3, "Number of candidate's prong (Set selectionFlag = 1 and nProngs = 2 for D0, and nProngs = 3 for Lc)"}; -======= ->>>>>>> 201b5f63 (wML >> WML) Configurable storeMl{"storeMl", false, "Flag to store ML scores"}; Configurable saveEpResoHisto{"saveEpResoHisto", false, "Flag to save event plane resolution histogram"}; Configurable> classMl{"classMl", {0, 2}, "Indexes of BDT scores to be stored. Two indexes max."}; From c487e484c211db4841dc364e1c05248762463eb0 Mon Sep 17 00:00:00 2001 From: Libeiyu <48704924+Libeiyu@users.noreply.github.com> Date: Wed, 20 Mar 2024 14:17:01 +0800 Subject: [PATCH 27/36] Update PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx Co-authored-by: Fabrizio --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index e76131b084c..80d029e6e30 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -48,7 +48,7 @@ struct HfTaskFlowCharmHadrons { Configurable zVtxMax{"zVtxMax", 10., "Max vertex coordinate z"}; Configurable harmonic{"harmonic", 2, "harmonic number"}; Configurable qvecDetector{"qvecDetector", 0, "Detector for Q vector estimation (FV0A: 0, FT0M: 1, FT0A: 2, FT0C: 3, TPC Pos: 4, TPC Neg: 5)"}; - Configurable centEstimator{"centEstimator", 4, "Centrality estimation (FT0A: 1, FT0C: 2, FT0M: 3, FV0A: 4)"}; + Configurable centEstimator{"centEstimator", 2, "Centrality estimation (FT0A: 1, FT0C: 2, FT0M: 3, FV0A: 4)"}; Configurable selectionFlag{"selectionFlag", 1, "Selection Flag for hadron (e.g. 1 for skimming, 3 for topo. and kine., 7 for PID)"}; Configurable storeMl{"storeMl", false, "Flag to store ML scores"}; Configurable saveEpResoHisto{"saveEpResoHisto", false, "Flag to save event plane resolution histogram"}; From c3f1b50b7f5a29b3a79fa38a8f11942c535ac3c8 Mon Sep 17 00:00:00 2001 From: Libeiyu <48704924+Libeiyu@users.noreply.github.com> Date: Wed, 20 Mar 2024 14:18:18 +0800 Subject: [PATCH 28/36] Update PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx Co-authored-by: Fabrizio --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 4 ---- 1 file changed, 4 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index 80d029e6e30..438f254b246 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -86,10 +86,6 @@ struct HfTaskFlowCharmHadrons { Partition selectedD0ToKPi = aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlag; Partition selectedD0ToPiKWMl = aod::hf_sel_candidate_d0::isSelD0 >= selectionFlag; Partition selectedD0ToKPiWMl = aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlag; - Partition selectedLcToPKPi = aod::hf_sel_candidate_lc::isSelLcToPKPi >= selectionFlag; - Partition selectedLcToPiKP = aod::hf_sel_candidate_lc::isSelLcToPiKP >= selectionFlag; - Partition selectedLcToPKPiWMl = aod::hf_sel_candidate_lc::isSelLcToPKPi >= selectionFlag; - Partition selectedLcToPiKPWMl = aod::hf_sel_candidate_lc::isSelLcToPiKP >= selectionFlag; HfHelper hfHelper; EventPlaneHelper epHelper; From aa2a9fb35c38a9ba8a52819b1cdf63545ea0752c Mon Sep 17 00:00:00 2001 From: Libeiyu Date: Wed, 20 Mar 2024 14:33:26 +0800 Subject: [PATCH 29/36] No Lc+ --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 3 --- 1 file changed, 3 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index 438f254b246..4a7761aa87d 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -67,8 +67,6 @@ struct HfTaskFlowCharmHadrons { using CandDsData = soa::Filtered>; using CandDplusDataWMl = soa::Filtered>; using CandDplusData = soa::Filtered>; - using CandLcData = soa::Filtered>; - using CandLcDataWMl = soa::Filtered>; // For LcToPKPI. TODO: LctoK0sP using CandD0DataWMl = soa::Filtered>; using CandD0Data = soa::Filtered>; using CollsWithQvecs = soa::Join; @@ -76,7 +74,6 @@ struct HfTaskFlowCharmHadrons { Filter filterSelectDsCandidates = aod::hf_sel_candidate_ds::isSelDsToKKPi >= selectionFlag || aod::hf_sel_candidate_ds::isSelDsToPiKK >= selectionFlag; Filter filterSelectDplusCandidates = aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= selectionFlag; Filter filterSelectD0Candidates = aod::hf_sel_candidate_d0::isSelD0 >= selectionFlag || aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlag; - Filter filterSelectLcCandidates = aod::hf_sel_candidate_lc::isSelLcToPKPi >= selectionFlag || aod::hf_sel_candidate_lc::isSelLcToPiKP >= selectionFlag; Partition selectedDsToKKPi = aod::hf_sel_candidate_ds::isSelDsToKKPi >= selectionFlag; Partition selectedDsToPiKK = aod::hf_sel_candidate_ds::isSelDsToPiKK >= selectionFlag; From 11c8764ceee1261d4257b424f0e62dd678c2483e Mon Sep 17 00:00:00 2001 From: Libeiyu Date: Thu, 21 Mar 2024 12:44:22 +0800 Subject: [PATCH 30/36] int >> DecayChannel --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index 4a7761aa87d..088a143085f 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -47,7 +47,7 @@ enum QvecEstimator { FV0A = 0, struct HfTaskFlowCharmHadrons { Configurable zVtxMax{"zVtxMax", 10., "Max vertex coordinate z"}; Configurable harmonic{"harmonic", 2, "harmonic number"}; - Configurable qvecDetector{"qvecDetector", 0, "Detector for Q vector estimation (FV0A: 0, FT0M: 1, FT0A: 2, FT0C: 3, TPC Pos: 4, TPC Neg: 5)"}; + Configurable qvecDetector{"qvecDetector", 3, "Detector for Q vector estimation (FV0A: 0, FT0M: 1, FT0A: 2, FT0C: 3, TPC Pos: 4, TPC Neg: 5)"}; Configurable centEstimator{"centEstimator", 2, "Centrality estimation (FT0A: 1, FT0C: 2, FT0M: 3, FV0A: 4)"}; Configurable selectionFlag{"selectionFlag", 1, "Selection Flag for hadron (e.g. 1 for skimming, 3 for topo. and kine., 7 for PID)"}; Configurable storeMl{"storeMl", false, "Flag to store ML scores"}; @@ -141,7 +141,7 @@ struct HfTaskFlowCharmHadrons { /// \param tracksQx is the X component of the Q vector for the tracks /// \param tracksQy is the Y component of the Q vector for the tracks /// \param channel is the decay channel - template + template void getQvecDtracks(const T1& cand, std::vector& tracksQx, std::vector& tracksQy, @@ -282,7 +282,7 @@ struct HfTaskFlowCharmHadrons { /// Compute the scalar product /// \param collision is the collision with the Q vector information and event plane /// \param candidates are the selected candidates - template + template void runFlowAnalysis(CollsWithQvecs::iterator const& collision, T1 const& candidates) { @@ -299,7 +299,7 @@ struct HfTaskFlowCharmHadrons { std::vector outputMl = {-999., -999.}; if constexpr (std::is_same>::value || std::is_same>::value) { - switch (DecayChannel) { + switch (Channel) { case DecayChannel::DsToKKPi: massCand = hfHelper.invMassDsToKKPi(candidate); if constexpr (std::is_same>::value) { @@ -325,7 +325,7 @@ struct HfTaskFlowCharmHadrons { } } else if constexpr (std::is_same::value || std::is_same::value) { nProngs = 2; - switch (DecayChannel) { + switch (Channel) { case DecayChannel::D0ToPiK: massCand = hfHelper.invMassD0ToPiK(candidate); if constexpr (std::is_same::value) { @@ -354,7 +354,7 @@ struct HfTaskFlowCharmHadrons { std::vector tracksQx = {}; std::vector tracksQy = {}; - getQvecDtracks(candidate, tracksQx, tracksQy, ampl); + getQvecDtracks(candidate, tracksQx, tracksQy, ampl); for (auto iTrack{0u}; iTrack < tracksQx.size(); ++iTrack) { xQVec -= tracksQx[iTrack]; yQVec -= tracksQy[iTrack]; From 19d0eb6c32fe3908e49baf9f068377e58fa4a979 Mon Sep 17 00:00:00 2001 From: Libeiyu Date: Thu, 21 Mar 2024 18:00:39 +0800 Subject: [PATCH 31/36] Channel >> channel --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index 088a143085f..5713bef8ab8 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -282,7 +282,7 @@ struct HfTaskFlowCharmHadrons { /// Compute the scalar product /// \param collision is the collision with the Q vector information and event plane /// \param candidates are the selected candidates - template + template void runFlowAnalysis(CollsWithQvecs::iterator const& collision, T1 const& candidates) { @@ -299,7 +299,7 @@ struct HfTaskFlowCharmHadrons { std::vector outputMl = {-999., -999.}; if constexpr (std::is_same>::value || std::is_same>::value) { - switch (Channel) { + switch (channel) { case DecayChannel::DsToKKPi: massCand = hfHelper.invMassDsToKKPi(candidate); if constexpr (std::is_same>::value) { @@ -325,7 +325,7 @@ struct HfTaskFlowCharmHadrons { } } else if constexpr (std::is_same::value || std::is_same::value) { nProngs = 2; - switch (Channel) { + switch (channel) { case DecayChannel::D0ToPiK: massCand = hfHelper.invMassD0ToPiK(candidate); if constexpr (std::is_same::value) { @@ -354,7 +354,7 @@ struct HfTaskFlowCharmHadrons { std::vector tracksQx = {}; std::vector tracksQy = {}; - getQvecDtracks(candidate, tracksQx, tracksQy, ampl); + getQvecDtracks(candidate, tracksQx, tracksQy, ampl); for (auto iTrack{0u}; iTrack < tracksQx.size(); ++iTrack) { xQVec -= tracksQx[iTrack]; yQVec -= tracksQy[iTrack]; From d14c6704427fec483b75c9a589ac25d2042d8cd4 Mon Sep 17 00:00:00 2001 From: Libeiyu Date: Fri, 22 Mar 2024 13:38:24 +0800 Subject: [PATCH 32/36] Add author --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 1 + 1 file changed, 1 insertion(+) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index 5713bef8ab8..a3ce46999db 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -13,6 +13,7 @@ /// \brief Analysis task for charm hadron flow /// /// \author S. Politanò, INFN Torino, Italy +/// \author Wu Chuntai, CUG, China #include "Framework/AnalysisTask.h" #include "Framework/HistogramRegistry.h" From 3ebab66dbf38054b4b9f707f360e7f7b83948482 Mon Sep 17 00:00:00 2001 From: Libeiyu Date: Mon, 22 Apr 2024 13:35:17 +0800 Subject: [PATCH 33/36] Add Lc+ in taskFlowCharmHadrons --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 52 +++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index 3ef84eedf78..b817d6b438d 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -36,7 +36,9 @@ enum DecayChannel { DplusToPiKPi = 0, DsToKKPi, DsToPiKK, D0ToPiK, - D0ToKPi }; + D0ToKPi, + LcToPKPi, + LcToPiKP }; enum QvecEstimator { FV0A = 0, FT0M, @@ -68,6 +70,8 @@ struct HfTaskFlowCharmHadrons { using CandDsData = soa::Filtered>; using CandDplusDataWMl = soa::Filtered>; using CandDplusData = soa::Filtered>; + using CandLcData = soa::Filtered>; + using CandLcDataWMl = soa::Filtered>; using CandD0DataWMl = soa::Filtered>; using CandD0Data = soa::Filtered>; using CollsWithQvecs = soa::Join; @@ -75,6 +79,7 @@ struct HfTaskFlowCharmHadrons { Filter filterSelectDsCandidates = aod::hf_sel_candidate_ds::isSelDsToKKPi >= selectionFlag || aod::hf_sel_candidate_ds::isSelDsToPiKK >= selectionFlag; Filter filterSelectDplusCandidates = aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= selectionFlag; Filter filterSelectD0Candidates = aod::hf_sel_candidate_d0::isSelD0 >= selectionFlag || aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlag; + Filter filterSelectLcCandidates = aod::hf_sel_candidate_lc::isSelLcToPKPi >= selectionFlag || aod::hf_sel_candidate_lc::isSelLcToPiKP >= selectionFlag; Partition selectedDsToKKPi = aod::hf_sel_candidate_ds::isSelDsToKKPi >= selectionFlag; Partition selectedDsToPiKK = aod::hf_sel_candidate_ds::isSelDsToPiKK >= selectionFlag; @@ -84,6 +89,10 @@ struct HfTaskFlowCharmHadrons { Partition selectedD0ToKPi = aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlag; Partition selectedD0ToPiKWMl = aod::hf_sel_candidate_d0::isSelD0 >= selectionFlag; Partition selectedD0ToKPiWMl = aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlag; + Partition selectedLcToPKPi = aod::hf_sel_candidate_lc::isSelLcToPKPi >= selectionFlag; + Partition selectedLcToPiKP = aod::hf_sel_candidate_lc::isSelLcToPiKP >= selectionFlag; + Partition selectedLcToPKPiWMl = aod::hf_sel_candidate_lc::isSelLcToPKPi >= selectionFlag; + Partition selectedLcToPiKPWMl = aod::hf_sel_candidate_lc::isSelLcToPiKP >= selectionFlag; SliceCache cache; HfHelper hfHelper; @@ -346,6 +355,25 @@ struct HfTaskFlowCharmHadrons { default: break; } + } else if constexpr (std::is_same || std::is_same) { + switch (channel) { + case DecayChannel::LcToPKPi: + massCand = hfHelper.invMassLcToPKPi(candidate); + if constexpr (std::is_same) { + for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) + outputMl[iclass] = candidate.mlProbLcToPKPi()[classMl->at(iclass)]; + } + break; + case DecayChannel::LcToPiKP: + massCand = hfHelper.invMassLcToPiKP(candidate); + if constexpr (std::is_same::value) { + for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) + outputMl[iclass] = candidate.mlProbLcToPiKP()[classMl->at(iclass)]; + } + break; + default: + break; + } } float ptCand = candidate.pt(); @@ -433,6 +461,28 @@ struct HfTaskFlowCharmHadrons { } PROCESS_SWITCH(HfTaskFlowCharmHadrons, processD0, "Process D0 candidates", false); + // Lc with ML + void processLcMl(CollsWithQvecs::iterator const& collision, + CandLcDataWMl const&) + { + auto candsLcToPKPiWMl = selectedLcToPKPiWMl->sliceByCached(aod::hf_cand::collisionId, collision.globalIndex(), cache); + auto candsLcToPiKPWMl = selectedLcToPiKPWMl->sliceByCached(aod::hf_cand::collisionId, collision.globalIndex(), cache); + runFlowAnalysis(collision, candsLcToPKPiWMl); + runFlowAnalysis(collision, candsLcToPiKPWMl); + } + PROCESS_SWITCH(HfTaskFlowCharmHadrons, processLcMl, "Process Lc candidates with ML", false); + + // Lc with rectangular cuts + void processLc(CollsWithQvecs::iterator const& collision, + CandLcData const&) + { + auto candsLcToPKPi = selectedLcToPKPi->sliceByCached(aod::hf_cand::collisionId, collision.globalIndex(), cache); + auto candsLcToPiKP = selectedLcToPiKP->sliceByCached(aod::hf_cand::collisionId, collision.globalIndex(), cache); + runFlowAnalysis(collision, candsLcToPKPi); + runFlowAnalysis(collision, candsLcToPiKP); + } + PROCESS_SWITCH(HfTaskFlowCharmHadrons, processLc, "Process Lc candidates", false); + // Resolution void processResolution(CollsWithQvecs::iterator const& collision) { From 65f944b7aab9f06b0ea8e8e290b0eec24e393cfd Mon Sep 17 00:00:00 2001 From: Libeiyu Date: Mon, 22 Apr 2024 21:43:36 +0800 Subject: [PATCH 34/36] Add Lc+ --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index b817d6b438d..499b0d70946 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -71,7 +71,7 @@ struct HfTaskFlowCharmHadrons { using CandDplusDataWMl = soa::Filtered>; using CandDplusData = soa::Filtered>; using CandLcData = soa::Filtered>; - using CandLcDataWMl = soa::Filtered>; + using CandLcDataWMl = soa::Filtered>; using CandD0DataWMl = soa::Filtered>; using CandD0Data = soa::Filtered>; using CollsWithQvecs = soa::Join; @@ -355,18 +355,18 @@ struct HfTaskFlowCharmHadrons { default: break; } - } else if constexpr (std::is_same || std::is_same) { + } else if constexpr (std::is_same_v || std::is_same_v) { switch (channel) { case DecayChannel::LcToPKPi: massCand = hfHelper.invMassLcToPKPi(candidate); - if constexpr (std::is_same) { + if constexpr (std::is_same_v) { for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) outputMl[iclass] = candidate.mlProbLcToPKPi()[classMl->at(iclass)]; } break; case DecayChannel::LcToPiKP: massCand = hfHelper.invMassLcToPiKP(candidate); - if constexpr (std::is_same::value) { + if constexpr (std::is_same_v) { for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) outputMl[iclass] = candidate.mlProbLcToPiKP()[classMl->at(iclass)]; } From 5c533dc189a2d36abc7a086402f24a04e574c30f Mon Sep 17 00:00:00 2001 From: Libeiyu Date: Mon, 22 Apr 2024 21:56:39 +0800 Subject: [PATCH 35/36] add Lc+ --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 1 - 1 file changed, 1 deletion(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index 499b0d70946..43af86d69d4 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -271,7 +271,6 @@ struct HfTaskFlowCharmHadrons { case QvecEstimator::FT0C: xQVec = collision.qvecFT0CRe(); yQVec = collision.qvecFT0CIm(); - break; case QvecEstimator::TPCPos: xQVec = collision.qvecBPosRe(); yQVec = collision.qvecBPosIm(); From d1adf9df5c0e50e8e06ae27fbed513b59920ef6e Mon Sep 17 00:00:00 2001 From: Libeiyu Date: Tue, 23 Apr 2024 11:36:34 +0800 Subject: [PATCH 36/36] add 'break' --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 1 + 1 file changed, 1 insertion(+) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index 43af86d69d4..499b0d70946 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -271,6 +271,7 @@ struct HfTaskFlowCharmHadrons { case QvecEstimator::FT0C: xQVec = collision.qvecFT0CRe(); yQVec = collision.qvecFT0CIm(); + break; case QvecEstimator::TPCPos: xQVec = collision.qvecBPosRe(); yQVec = collision.qvecBPosIm();