@@ -121,6 +121,7 @@ struct HfTaskFlowCharmHadrons {
121121 Configurable<bool > storeResoOccu{" storeResoOccu" , false , " Flag to store Occupancy in resolution ThnSparse" };
122122 Configurable<bool > storeEpCosSin{" storeEpCosSin" , false , " Flag to store cos and sin of EP angle in ThnSparse" };
123123 Configurable<bool > storeCandEta{" storeCandEta" , false , " Flag to store candidates eta" };
124+ Configurable<bool > storeCandSign{" storeCandSign" , false , " Flag to store candidates sign" };
124125 Configurable<int > occEstimator{" occEstimator" , 0 , " Occupancy estimation (0: None, 1: ITS, 2: FT0C)" };
125126 Configurable<bool > saveEpResoHisto{" saveEpResoHisto" , false , " Flag to save event plane resolution histogram" };
126127 Configurable<std::string> ccdbUrl{" ccdbUrl" , " http://alice-ccdb.cern.ch" , " url of the ccdb repository" };
@@ -144,6 +145,7 @@ struct HfTaskFlowCharmHadrons {
144145 using CandD0DataWMl = soa::Filtered<soa::Join<aod::HfCand2Prong, aod::HfSelD0, aod::HfMlD0>>;
145146 using CandD0Data = soa::Filtered<soa::Join<aod::HfCand2Prong, aod::HfSelD0>>;
146147 using CollsWithQvecs = soa::Join<aod::Collisions, aod::EvSels, aod::QvectorFT0Cs, aod::QvectorFT0As, aod::QvectorFT0Ms, aod::QvectorFV0As, aod::QvectorBPoss, aod::QvectorBNegs, aod::QvectorBTots, aod::CentFV0As, aod::CentFT0Ms, aod::CentFT0As, aod::CentFT0Cs>;
148+ using TracksWithExtra = soa::Join<aod::Tracks, aod::TracksExtra>;
147149
148150 Filter filterSelectDsCandidates = aod::hf_sel_candidate_ds::isSelDsToKKPi >= selectionFlag || aod::hf_sel_candidate_ds::isSelDsToPiKK >= selectionFlag;
149151 Filter filterSelectDplusCandidates = aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= selectionFlag;
@@ -191,6 +193,7 @@ struct HfTaskFlowCharmHadrons {
191193 ConfigurableAxis thnConfigAxisResoFT0cTPCtot{" thnConfigAxisResoFT0cTPCtot" , {160 , -8 , 8 }, " " };
192194 ConfigurableAxis thnConfigAxisResoFV0aTPCtot{" thnConfigAxisResoFV0aTPCtot" , {160 , -8 , 8 }, " " };
193195 ConfigurableAxis thnConfigAxisCandidateEta{" thnConfigAxisCandidateEta" , {100 , -5 , 5 }, " " };
196+ ConfigurableAxis thnConfigAxisSign{" thnConfigAxisSign" , {2 , -2.0 , 2.0 }, " " };
194197
195198 HistogramRegistry registry{" registry" , {}};
196199
@@ -212,6 +215,7 @@ struct HfTaskFlowCharmHadrons {
212215 const AxisSpec thnAxisOccupancyITS{thnConfigAxisOccupancyITS, " OccupancyITS" };
213216 const AxisSpec thnAxisOccupancyFT0C{thnConfigAxisOccupancyFT0C, " OccupancyFT0C" };
214217 const AxisSpec thnAxisCandEta{thnConfigAxisCandidateEta, " #eta" };
218+ const AxisSpec thnAxisSign{thnConfigAxisSign, " Sign" };
215219 const AxisSpec thnAxisNoSameBunchPileup{thnConfigAxisNoSameBunchPileup, " NoSameBunchPileup" };
216220 const AxisSpec thnAxisOccupancy{thnConfigAxisOccupancy, " Occupancy" };
217221 const AxisSpec thnAxisNoCollInTimeRangeNarrow{thnConfigAxisNoCollInTimeRangeNarrow, " NoCollInTimeRangeNarrow" };
@@ -232,6 +236,9 @@ struct HfTaskFlowCharmHadrons {
232236 if (storeCandEta) {
233237 axes.insert (axes.end (), {thnAxisCandEta});
234238 }
239+ if (storeCandSign) {
240+ axes.insert (axes.end (), {thnAxisSign});
241+ }
235242 if (occEstimator != 0 ) {
236243 if (occEstimator == 1 ) {
237244 axes.insert (axes.end (), {thnAxisOccupancyITS, thnAxisNoSameBunchPileup, thnAxisOccupancy,
@@ -403,6 +410,7 @@ struct HfTaskFlowCharmHadrons {
403410 // / \param mass is the invariant mass of the candidate
404411 // / \param pt is the transverse momentum of the candidate
405412 // / \param eta is the pseudorapidityof the candidate
413+ // / \param sign is the particle charge sign of the candidate
406414 // / \param cent is the centrality of the collision
407415 // / \param cosNPhi is the cosine of the n*phi angle
408416 // / \param sinNPhi is the sine of the n*phi angle
@@ -414,6 +422,7 @@ struct HfTaskFlowCharmHadrons {
414422 void fillThn (const float mass,
415423 const float pt,
416424 const float eta,
425+ const float sign,
417426 const float cent,
418427 const float cosNPhi,
419428 const float sinNPhi,
@@ -448,7 +457,9 @@ struct HfTaskFlowCharmHadrons {
448457 if (storeCandEta) {
449458 values.push_back (eta);
450459 }
451-
460+ if (storeCandSign) {
461+ values.push_back (sign);
462+ }
452463 if (occEstimator != 0 ) {
453464 auto evtSelFlags = getEventSelectionFlags (hfevselflag);
454465 values.push_back (occupancy);
@@ -492,9 +503,10 @@ struct HfTaskFlowCharmHadrons {
492503 // / Compute the scalar product
493504 // / \param collision is the collision with the Q vector information and event plane
494505 // / \param candidates are the selected candidates
495- template <DecayChannel Channel, typename T1>
506+ template <DecayChannel Channel, typename T1, typename Trk >
496507 void runFlowAnalysis (CollsWithQvecs::iterator const & collision,
497- T1 const & candidates)
508+ T1 const & candidates,
509+ Trk const & /* tracks*/ )
498510 {
499511 float cent = o2::hf_centrality::getCentralityColl (collision, centEstimator);
500512 if (cent < centralityMin || cent > centralityMax) {
@@ -516,6 +528,7 @@ struct HfTaskFlowCharmHadrons {
516528
517529 for (const auto & candidate : candidates) {
518530 float massCand = 0 .;
531+ float sign = 0 .;
519532 std::vector<float > outputMl = {-999 ., -999 .};
520533
521534 if constexpr (std::is_same_v<T1, CandDsData> || std::is_same_v<T1, CandDsDataWMl>) {
@@ -618,6 +631,13 @@ struct HfTaskFlowCharmHadrons {
618631 }
619632 }
620633
634+ if constexpr (std::is_same_v<T1, CandXic0Data> || std::is_same_v<T1, CandXic0DataWMl>) {
635+ sign = candidate.signDecay ();
636+ } else {
637+ auto trackprong0 = candidate.template prong0_as <Trk>();
638+ sign = trackprong0.sign ();
639+ }
640+
621641 float ptCand = 0 .;
622642 float phiCand = 0 .;
623643 float etaCand = 0 .;
@@ -674,130 +694,142 @@ struct HfTaskFlowCharmHadrons {
674694 }
675695 }
676696 if (fillSparse) {
677- fillThn (massCand, ptCand, etaCand, cent, cosNPhi, sinNPhi, cosDeltaPhi, scalprodCand, outputMl, occupancy, hfevflag);
697+ fillThn (massCand, ptCand, etaCand, sign, cent, cosNPhi, sinNPhi, cosDeltaPhi, scalprodCand, outputMl, occupancy, hfevflag);
678698 }
679699 }
680700 }
681701
682702 // Ds with ML
683703 void processDsMl (CollsWithQvecs::iterator const & collision,
684- CandDsDataWMl const &)
704+ CandDsDataWMl const &,
705+ TracksWithExtra const & tracks)
685706 {
686707 auto candsDsToKKPiWMl = selectedDsToKKPiWMl->sliceByCached (aod::hf_cand::collisionId, collision.globalIndex (), cache);
687708 auto candsDsToPiKKWMl = selectedDsToPiKKWMl->sliceByCached (aod::hf_cand::collisionId, collision.globalIndex (), cache);
688- runFlowAnalysis<DecayChannel::DsToKKPi>(collision, candsDsToKKPiWMl);
689- runFlowAnalysis<DecayChannel::DsToPiKK>(collision, candsDsToPiKKWMl);
709+ runFlowAnalysis<DecayChannel::DsToKKPi>(collision, candsDsToKKPiWMl, tracks );
710+ runFlowAnalysis<DecayChannel::DsToPiKK>(collision, candsDsToPiKKWMl, tracks );
690711 }
691712 PROCESS_SWITCH (HfTaskFlowCharmHadrons, processDsMl, " Process Ds candidates with ML" , false );
692713
693714 // Ds with rectangular cuts
694715 void processDs (CollsWithQvecs::iterator const & collision,
695- CandDsData const &)
716+ CandDsData const & /* candidatesDs*/ ,
717+ TracksWithExtra const & tracks)
696718 {
697719 auto candsDsToKKPi = selectedDsToKKPi->sliceByCached (aod::hf_cand::collisionId, collision.globalIndex (), cache);
698720 auto candsDsToPiKK = selectedDsToPiKK->sliceByCached (aod::hf_cand::collisionId, collision.globalIndex (), cache);
699- runFlowAnalysis<DecayChannel::DsToKKPi>(collision, candsDsToKKPi);
700- runFlowAnalysis<DecayChannel::DsToPiKK>(collision, candsDsToPiKK);
721+ runFlowAnalysis<DecayChannel::DsToKKPi>(collision, candsDsToKKPi, tracks );
722+ runFlowAnalysis<DecayChannel::DsToPiKK>(collision, candsDsToPiKK, tracks );
701723 }
702724 PROCESS_SWITCH (HfTaskFlowCharmHadrons, processDs, " Process Ds candidates" , false );
703725
704726 // Dplus with ML
705727 void processDplusMl (CollsWithQvecs::iterator const & collision,
706- CandDplusDataWMl const & candidatesDplus)
728+ CandDplusDataWMl const & candidatesDplus,
729+ TracksWithExtra const & tracks)
707730 {
708- runFlowAnalysis<DecayChannel::DplusToPiKPi>(collision, candidatesDplus);
731+ runFlowAnalysis<DecayChannel::DplusToPiKPi>(collision, candidatesDplus, tracks );
709732 }
710733 PROCESS_SWITCH (HfTaskFlowCharmHadrons, processDplusMl, " Process Dplus candidates with ML" , false );
711734
712735 // Dplus with rectangular cuts
713736 void processDplus (CollsWithQvecs::iterator const & collision,
714- CandDplusData const & candidatesDplus)
737+ CandDplusData const & candidatesDplus,
738+ TracksWithExtra const & tracks)
715739 {
716- runFlowAnalysis<DecayChannel::DplusToPiKPi>(collision, candidatesDplus);
740+ runFlowAnalysis<DecayChannel::DplusToPiKPi>(collision, candidatesDplus, tracks );
717741 }
718742 PROCESS_SWITCH (HfTaskFlowCharmHadrons, processDplus, " Process Dplus candidates" , true );
719743
720744 // D0 with ML
721745 void processD0Ml (CollsWithQvecs::iterator const & collision,
722- CandD0DataWMl const &)
746+ CandD0DataWMl const & /* candidatesD0*/ ,
747+ TracksWithExtra const & tracks)
723748 {
724749 auto candsD0ToPiKWMl = selectedD0ToPiKWMl->sliceByCached (aod::hf_cand::collisionId, collision.globalIndex (), cache);
725750 auto candsD0ToKPiWMl = selectedD0ToKPiWMl->sliceByCached (aod::hf_cand::collisionId, collision.globalIndex (), cache);
726- runFlowAnalysis<DecayChannel::D0ToPiK>(collision, candsD0ToPiKWMl);
727- runFlowAnalysis<DecayChannel::D0ToKPi>(collision, candsD0ToKPiWMl);
751+ runFlowAnalysis<DecayChannel::D0ToPiK>(collision, candsD0ToPiKWMl, tracks );
752+ runFlowAnalysis<DecayChannel::D0ToKPi>(collision, candsD0ToKPiWMl, tracks );
728753 }
729754 PROCESS_SWITCH (HfTaskFlowCharmHadrons, processD0Ml, " Process D0 candidates with ML" , false );
730755
731756 // D0 with rectangular cuts
732757 void processD0 (CollsWithQvecs::iterator const & collision,
733- CandD0Data const &)
758+ CandD0Data const &/* candidatesD0*/ ,
759+ TracksWithExtra const & tracks)
734760 {
735761 auto candsD0ToPiK = selectedD0ToPiK->sliceByCached (aod::hf_cand::collisionId, collision.globalIndex (), cache);
736762 auto candsD0ToKPi = selectedD0ToKPi->sliceByCached (aod::hf_cand::collisionId, collision.globalIndex (), cache);
737- runFlowAnalysis<DecayChannel::D0ToPiK>(collision, candsD0ToPiK);
738- runFlowAnalysis<DecayChannel::D0ToKPi>(collision, candsD0ToKPi);
763+ runFlowAnalysis<DecayChannel::D0ToPiK>(collision, candsD0ToPiK, tracks );
764+ runFlowAnalysis<DecayChannel::D0ToKPi>(collision, candsD0ToKPi, tracks );
739765 }
740766 PROCESS_SWITCH (HfTaskFlowCharmHadrons, processD0, " Process D0 candidates" , false );
741767
742768 // Lc with ML
743769 void processLcMl (CollsWithQvecs::iterator const & collision,
744- CandLcDataWMl const &)
770+ CandLcDataWMl const &/* candidatesLc*/ ,
771+ TracksWithExtra const & tracks)
745772 {
746773 auto candsLcToPKPiWMl = selectedLcToPKPiWMl->sliceByCached (aod::hf_cand::collisionId, collision.globalIndex (), cache);
747774 auto candsLcToPiKPWMl = selectedLcToPiKPWMl->sliceByCached (aod::hf_cand::collisionId, collision.globalIndex (), cache);
748- runFlowAnalysis<DecayChannel::LcToPKPi>(collision, candsLcToPKPiWMl);
749- runFlowAnalysis<DecayChannel::LcToPiKP>(collision, candsLcToPiKPWMl);
775+ runFlowAnalysis<DecayChannel::LcToPKPi>(collision, candsLcToPKPiWMl, tracks );
776+ runFlowAnalysis<DecayChannel::LcToPiKP>(collision, candsLcToPiKPWMl, tracks );
750777 }
751778 PROCESS_SWITCH (HfTaskFlowCharmHadrons, processLcMl, " Process Lc candidates with ML" , false );
752779
753780 // Lc with rectangular cuts
754781 void processLc (CollsWithQvecs::iterator const & collision,
755- CandLcData const &)
782+ CandLcData const &/* candidatesLc*/ ,
783+ TracksWithExtra const & tracks)
756784 {
757785 auto candsLcToPKPi = selectedLcToPKPi->sliceByCached (aod::hf_cand::collisionId, collision.globalIndex (), cache);
758786 auto candsLcToPiKP = selectedLcToPiKP->sliceByCached (aod::hf_cand::collisionId, collision.globalIndex (), cache);
759- runFlowAnalysis<DecayChannel::LcToPKPi>(collision, candsLcToPKPi);
760- runFlowAnalysis<DecayChannel::LcToPiKP>(collision, candsLcToPiKP);
787+ runFlowAnalysis<DecayChannel::LcToPKPi>(collision, candsLcToPKPi, tracks );
788+ runFlowAnalysis<DecayChannel::LcToPiKP>(collision, candsLcToPiKP, tracks );
761789 }
762790 PROCESS_SWITCH (HfTaskFlowCharmHadrons, processLc, " Process Lc candidates" , false );
763791
764792 // Xic with ML
765793 void processXicMl (CollsWithQvecs::iterator const & collision,
766- CandXicDataWMl const &)
794+ CandXicDataWMl const &/* candidatesXic*/ ,
795+ TracksWithExtra const & tracks)
767796 {
768797 auto candsXicToPKPiWMl = selectedXicToPKPiWMl->sliceByCached (aod::hf_cand::collisionId, collision.globalIndex (), cache);
769798 auto candsXicToPiKPWMl = selectedXicToPiKPWMl->sliceByCached (aod::hf_cand::collisionId, collision.globalIndex (), cache);
770- runFlowAnalysis<DecayChannel::XicToPKPi>(collision, candsXicToPKPiWMl);
771- runFlowAnalysis<DecayChannel::XicToPiKP>(collision, candsXicToPiKPWMl);
799+ runFlowAnalysis<DecayChannel::XicToPKPi>(collision, candsXicToPKPiWMl, tracks );
800+ runFlowAnalysis<DecayChannel::XicToPiKP>(collision, candsXicToPiKPWMl, tracks );
772801 }
773802 PROCESS_SWITCH (HfTaskFlowCharmHadrons, processXicMl, " Process Xic candidates with ML" , false );
774803
775804 // Xic with rectangular cuts
776805 void processXic (CollsWithQvecs::iterator const & collision,
777- CandXicData const &)
806+ CandXicData const &/* candidatesXic*/ ,
807+ TracksWithExtra const & tracks)
778808 {
779809 auto candsXicToPKPi = selectedXicToPKPi->sliceByCached (aod::hf_cand::collisionId, collision.globalIndex (), cache);
780810 auto candsXicToPiKP = selectedXicToPiKP->sliceByCached (aod::hf_cand::collisionId, collision.globalIndex (), cache);
781- runFlowAnalysis<DecayChannel::XicToPKPi>(collision, candsXicToPKPi);
782- runFlowAnalysis<DecayChannel::XicToPiKP>(collision, candsXicToPiKP);
811+ runFlowAnalysis<DecayChannel::XicToPKPi>(collision, candsXicToPKPi, tracks );
812+ runFlowAnalysis<DecayChannel::XicToPiKP>(collision, candsXicToPiKP, tracks );
783813 }
784814 PROCESS_SWITCH (HfTaskFlowCharmHadrons, processXic, " Process Xic candidates" , false );
785815
786816 // Xic0 with ML
787817 void processXic0Ml (CollsWithQvecs::iterator const & collision,
788- CandXic0DataWMl const &)
818+ CandXic0DataWMl const &/* candidatesXic0*/ ,
819+ TracksWithExtra const & tracks)
789820 {
790821 auto candsXic0WMl = selectedXic0WMl->sliceByCached (aod::hf_cand::collisionId, collision.globalIndex (), cache);
791- runFlowAnalysis<DecayChannel::Xic0ToXiPi>(collision, candsXic0WMl);
822+ runFlowAnalysis<DecayChannel::Xic0ToXiPi>(collision, candsXic0WMl, tracks );
792823 }
793824 PROCESS_SWITCH (HfTaskFlowCharmHadrons, processXic0Ml, " Process Xic0 candidates with ML" , false );
794825
795826 // Xic0
796827 void processXic0 (CollsWithQvecs::iterator const & collision,
797- CandXic0Data const &)
828+ CandXic0Data const &/* candidatesXic0*/ ,
829+ TracksWithExtra const & tracks)
798830 {
799831 auto candsXic0 = selectedXic0->sliceByCached (aod::hf_cand::collisionId, collision.globalIndex (), cache);
800- runFlowAnalysis<DecayChannel::Xic0ToXiPi>(collision, candsXic0);
832+ runFlowAnalysis<DecayChannel::Xic0ToXiPi>(collision, candsXic0, tracks );
801833 }
802834 PROCESS_SWITCH (HfTaskFlowCharmHadrons, processXic0, " Process Xic0 candidates" , false );
803835
0 commit comments