@@ -43,10 +43,12 @@ using namespace o2::hf_evsel;
4343
4444enum DecayChannel { DplusToPiKPi = 0 ,
4545 D0ToPiK,
46- D0ToKPi };
46+ D0ToKPi,
47+ DstarToD0Pi };
4748
4849struct HfTaskDirectedFlowCharmHadrons {
4950 Configurable<int > centEstimator{" centEstimator" , 2 , " Centrality estimation (FT0A: 1, FT0C: 2, FT0M: 3, FV0A: 4)" };
51+ Configurable<bool > selectionFlagDstar{" selectionFlagDstar" , false , " Selection Flag for Dstar" };
5052 Configurable<int > selectionFlag{" selectionFlag" , 1 , " Selection Flag for hadron (e.g. 1 for skimming, 3 for topo. and kine., 7 for PID)" };
5153 Configurable<float > centralityMin{" centralityMin" , 0 ., " Minimum centrality accepted in SP computation" };
5254 Configurable<float > centralityMax{" centralityMax" , 100 ., " Maximum centrality accepted in SP computation" };
@@ -69,11 +71,14 @@ struct HfTaskDirectedFlowCharmHadrons {
6971 using CandDplusData = soa::Filtered<soa::Join<aod::HfCand3Prong, aod::HfSelDplusToPiKPi>>;
7072 using CandD0DataWMl = soa::Filtered<soa::Join<aod::HfCand2Prong, aod::HfSelD0, aod::HfMlD0>>;
7173 using CandD0Data = soa::Filtered<soa::Join<aod::HfCand2Prong, aod::HfSelD0>>;
74+ using CandDstarDataWMl = soa::Filtered<soa::Join<aod::HfCandDstars, aod::HfSelDstarToD0Pi, aod::HfMlDstarToD0Pi>>;
75+ using CandDstarData = soa::Filtered<soa::Join<aod::HfCandDstars, aod::HfSelDstarToD0Pi>>;
7276 using CollsWithQvecs = soa::Join<aod::Collisions, aod::EvSels, aod::CentFV0As, aod::CentFT0Ms, aod::CentFT0As, aod::CentFT0Cs, aod::SPCalibrationTables>;
7377 using TracksWithExtra = soa::Join<aod::Tracks, aod::TracksExtra>;
7478
7579 Filter filterSelectDplusCandidates = aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= selectionFlag;
7680 Filter filterSelectD0Candidates = aod::hf_sel_candidate_d0::isSelD0 >= selectionFlag || aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlag;
81+ Filter filterSelectDstarCandidates = aod::hf_sel_candidate_dstar::isSelDstarToD0Pi == selectionFlagDstar;
7782
7883 Partition<CandD0Data> selectedD0ToPiK = aod::hf_sel_candidate_d0::isSelD0 >= selectionFlag;
7984 Partition<CandD0Data> selectedD0ToKPi = aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlag;
@@ -92,7 +97,7 @@ struct HfTaskDirectedFlowCharmHadrons {
9297 {
9398
9499 // / check process functions
95- std::array<int , 4 > processes = {doprocessDplusStd, doprocessDplusMl, doprocessD0Std, doprocessD0Ml};
100+ std::array<int , 6 > processes = {doprocessDplusStd, doprocessDplusMl, doprocessD0Std, doprocessD0Ml, doprocessDstarStd, doprocessDstarMl };
96101 const int nProcesses = std::accumulate (processes.begin (), processes.end (), 0 );
97102 if (nProcesses > 1 ) {
98103 LOGP (fatal, " Only one process function should be enabled at a time, please check your configuration" );
@@ -203,6 +208,7 @@ struct HfTaskDirectedFlowCharmHadrons {
203208 for (const auto & candidate : candidates) {
204209 double massCand = 0 .;
205210 double rapCand = 0 .;
211+ double signDstarCand = 0.0 ;
206212 std::vector<double > outputMl = {-999 ., -999 .};
207213 if constexpr (std::is_same_v<T1, CandDplusData> || std::is_same_v<T1, CandDplusDataWMl>) {
208214 massCand = hfHelper.invMassDplusToPiKPi (candidate);
@@ -230,6 +236,19 @@ struct HfTaskDirectedFlowCharmHadrons {
230236 default :
231237 break ;
232238 }
239+ } else if constexpr (std::is_same_v<T1, CandDstarData> || std::is_same_v<T1, CandDstarDataWMl>) {
240+ signDstarCand = candidate.signSoftPi ();
241+ if (candidate.signSoftPi () > 0 ) {
242+ massCand = std::abs (candidate.invMassDstar () - candidate.invMassD0 ());
243+ rapCand = candidate.y (candidate.invMassDstar ());
244+ } else if (candidate.signSoftPi () < 0 ) {
245+ massCand = std::abs (candidate.invMassAntiDstar () - candidate.invMassD0Bar ());
246+ rapCand = candidate.y (candidate.invMassAntiDstar ());
247+ }
248+ if constexpr (std::is_same_v<T1, CandDstarDataWMl>) {
249+ for (unsigned int iclass = 0 ; iclass < classMl->size (); iclass++)
250+ outputMl[iclass] = candidate.mlProbDstarToD0Pi ()[classMl->at (iclass)];
251+ }
233252 }
234253
235254 auto trackprong0 = candidate.template prong0_as <Trk>();
@@ -244,6 +263,9 @@ struct HfTaskDirectedFlowCharmHadrons {
244263 if (userap)
245264 etaCand = rapCand;
246265
266+ if (selectionFlagDstar)
267+ sign = signDstarCand;
268+
247269 auto ux = cosNPhi; // real part of candidate q vector
248270 auto uy = sinNPhi; // imaginary part of candidate q vector
249271 auto uxQxp = ux * qxZDCA;
@@ -322,6 +344,24 @@ struct HfTaskDirectedFlowCharmHadrons {
322344 }
323345 PROCESS_SWITCH (HfTaskDirectedFlowCharmHadrons, processDplusStd, " Process Dplus candidates with rectangular cuts" , true );
324346
347+ // Dstar with ML
348+ void processDstarMl (CollsWithQvecs::iterator const & collision,
349+ CandDstarDataWMl const & candidatesDstar,
350+ TracksWithExtra const & tracks)
351+ {
352+ runFlowAnalysis<DecayChannel::DstarToD0Pi>(collision, candidatesDstar, tracks);
353+ }
354+ PROCESS_SWITCH (HfTaskDirectedFlowCharmHadrons, processDstarMl, " Process Dstar candidates with ML" , false );
355+
356+ // Dstar with rectangular cuts
357+ void processDstarStd (CollsWithQvecs::iterator const & collision,
358+ CandDstarData const & candidatesDstar,
359+ TracksWithExtra const & tracks)
360+ {
361+ runFlowAnalysis<DecayChannel::DstarToD0Pi>(collision, candidatesDstar, tracks);
362+ }
363+ PROCESS_SWITCH (HfTaskDirectedFlowCharmHadrons, processDstarStd, " Process Dstar candidates with rectangular cuts" , true );
364+
325365}; // End struct HfTaskDirectedFlowCharmHadrons
326366
327367WorkflowSpec defineDataProcessing (ConfigContext const & cfgc)
0 commit comments