@@ -83,6 +83,42 @@ constexpr bool isD0McTable()
8383 return isD0McCandidate<typename T::iterator>() || isD0McCandidate<typename T::filtered_iterator>();
8484}
8585
86+ /* *
87+ * returns true if the candidate is from a D+ table
88+ */
89+ template <typename T>
90+ constexpr bool isDplusCandidate ()
91+ {
92+ return std::is_same_v<std::decay_t <T>, o2::aod::CandidatesDplusData::iterator> || std::is_same_v<std::decay_t <T>, o2::aod::CandidatesDplusData::filtered_iterator> || std::is_same_v<std::decay_t <T>, o2::aod::CandidatesDplusMCD::iterator> || std::is_same_v<std::decay_t <T>, o2::aod::CandidatesDplusMCD::filtered_iterator>;
93+ }
94+
95+ /* *
96+ * returns true if the particle is from a D+ MC table
97+ */
98+ template <typename T>
99+ constexpr bool isDplusMcCandidate ()
100+ {
101+ return std::is_same_v<std::decay_t <T>, o2::aod::CandidatesDplusMCP::iterator> || std::is_same_v<std::decay_t <T>, o2::aod::CandidatesDplusMCP::filtered_iterator>;
102+ }
103+
104+ /* *
105+ * returns true if the table is a D+ table
106+ */
107+ template <typename T>
108+ constexpr bool isDplusTable ()
109+ {
110+ return isDplusCandidate<typename T::iterator>() || isDplusCandidate<typename T::filtered_iterator>();
111+ }
112+
113+ /* *
114+ * returns true if the table is a D+ MC table
115+ */
116+ template <typename T>
117+ constexpr bool isDplusMcTable ()
118+ {
119+ return isDplusMcCandidate<typename T::iterator>() || isDplusMcCandidate<typename T::filtered_iterator>();
120+ }
121+
86122/* *
87123 * returns true if the candidate is from a Lc table
88124 */
@@ -164,6 +200,8 @@ constexpr bool isHFCandidate()
164200{
165201 if constexpr (isD0Candidate<T>()) {
166202 return true ;
203+ } else if constexpr (isDplusCandidate<T>()) {
204+ return true ;
167205 } else if constexpr (isLcCandidate<T>()) {
168206 return true ;
169207 } else if constexpr (isBplusCandidate<T>()) {
@@ -182,6 +220,8 @@ constexpr bool isHFMcCandidate()
182220{
183221 if constexpr (isD0McCandidate<T>()) {
184222 return true ;
223+ } else if constexpr (isDplusMcCandidate<T>()) {
224+ return true ;
185225 } else if constexpr (isLcMcCandidate<T>()) {
186226 return true ;
187227 } else if constexpr (isBplusMcCandidate<T>()) {
@@ -199,6 +239,8 @@ constexpr bool isHFTable()
199239{
200240 if constexpr (isD0Candidate<typename T::iterator>() || isD0Candidate<typename T::filtered_iterator>()) {
201241 return true ;
242+ } else if constexpr (isDplusCandidate<typename T::iterator>() || isDplusCandidate<typename T::filtered_iterator>()) {
243+ return true ;
202244 } else if constexpr (isLcCandidate<typename T::iterator>() || isLcCandidate<typename T::filtered_iterator>()) {
203245 return true ;
204246 } else if constexpr (isBplusCandidate<typename T::iterator>() || isBplusCandidate<typename T::filtered_iterator>()) {
@@ -216,6 +258,8 @@ constexpr bool isHFMcTable()
216258{
217259 if constexpr (isD0McCandidate<typename T::iterator>() || isD0McCandidate<typename T::filtered_iterator>()) {
218260 return true ;
261+ } else if constexpr (isDplusMcCandidate<typename T::iterator>() || isDplusMcCandidate<typename T::filtered_iterator>()) {
262+ return true ;
219263 } else if constexpr (isLcMcCandidate<typename T::iterator>() || isLcMcCandidate<typename T::filtered_iterator>()) {
220264 return true ;
221265 } else if constexpr (isBplusMcCandidate<typename T::iterator>() || isBplusMcCandidate<typename T::filtered_iterator>()) {
@@ -238,6 +282,12 @@ constexpr bool isMatchedHFCandidate(T const& candidate)
238282 } else {
239283 return false ;
240284 }
285+ } else if constexpr (isDplusCandidate<T>()) {
286+ if (std::abs (candidate.flagMcMatchRec ()) == 1 << o2::aod::hf_cand_3prong::DecayType::DplusToPiKPi) {
287+ return true ;
288+ } else {
289+ return false ;
290+ }
241291 } else if constexpr (isLcCandidate<T>()) {
242292 if (std::abs (candidate.flagMcMatchRec ()) == 1 << o2::aod::hf_cand_3prong::DecayType::LcToPKPi) {
243293 return true ;
@@ -256,6 +306,12 @@ constexpr bool isMatchedHFCandidate(T const& candidate)
256306 } else {
257307 return false ;
258308 }
309+ } else if constexpr (isDplusMcCandidate<T>()) {
310+ if (std::abs (candidate.flagMcMatchGen ()) == 1 << o2::aod::hf_cand_3prong::DecayType::DplusToPiKPi) {
311+ return true ;
312+ } else {
313+ return false ;
314+ }
259315 } else if constexpr (isLcMcCandidate<T>()) {
260316 if (std::abs (candidate.flagMcMatchGen ()) == 1 << o2::aod::hf_cand_3prong::DecayType::LcToPKPi) {
261317 return true ;
@@ -289,6 +345,12 @@ bool isHFDaughterTrack(T& track, U& candidate, V const& /*tracks*/)
289345 } else {
290346 return false ;
291347 }
348+ } else if constexpr (isDplusCandidate<U>()) {
349+ if (candidate.prong0Id () == track.globalIndex () || candidate.prong1Id () == track.globalIndex () || candidate.prong2Id () == track.globalIndex ()) {
350+ return true ;
351+ } else {
352+ return false ;
353+ }
292354 } else if constexpr (isLcCandidate<U>()) {
293355 if (candidate.prong0Id () == track.globalIndex () || candidate.prong1Id () == track.globalIndex () || candidate.prong2Id () == track.globalIndex ()) {
294356 return true ;
@@ -340,11 +402,13 @@ auto matchedHFParticle(const T& candidate, const U& /*tracks*/, const V& /*parti
340402 * @param candidate HF candidate that is being checked
341403 * @param table the table to be sliced
342404 */
343- template <typename T, typename U, typename V, typename M, typename N>
344- auto slicedPerHFCandidate (T const & table, U const & candidate, V const & perD0Candidate, M const & perLcCandidate , N const & perBplusCandidate)
405+ template <typename T, typename U, typename V, typename M, typename N, typename O >
406+ auto slicedPerHFCandidate (T const & table, U const & candidate, V const & perD0Candidate, M const & perDplusCandidate , N const & perLcCandidate, O const & perBplusCandidate)
345407{
346408 if constexpr (isD0Candidate<U>()) {
347409 return table.sliceBy (perD0Candidate, candidate.globalIndex ());
410+ } else if constexpr (isDplusCandidate<U>()) {
411+ return table.sliceBy (perDplusCandidate, candidate.globalIndex ());
348412 } else if constexpr (isLcCandidate<U>()) {
349413 return table.sliceBy (perLcCandidate, candidate.globalIndex ());
350414 } else if constexpr (isBplusCandidate<U>()) {
@@ -360,11 +424,13 @@ auto slicedPerHFCandidate(T const& table, U const& candidate, V const& perD0Cand
360424 * @param candidate HF candidate that is being checked
361425 * @param table the table to be sliced
362426 */
363- template <typename T, typename U, typename V, typename M, typename N, typename O>
364- auto slicedPerHFCollision (T const & table, U const & /* candidates*/ , V const & collision, M const & D0CollisionPerCollision, N const & LcCollisionPerCollision , O const & BplusCollisionPerCollision)
427+ template <typename T, typename U, typename V, typename M, typename N, typename O, typename P >
428+ auto slicedPerHFCollision (T const & table, U const & /* candidates*/ , V const & collision, M const & D0CollisionPerCollision, N const & DplusCollisionPerCollision , O const & LcCollisionPerCollision, P const & BplusCollisionPerCollision)
365429{
366430 if constexpr (isD0Table<U>() || isD0McTable<U>()) {
367431 return table.sliceBy (D0CollisionPerCollision, collision.globalIndex ());
432+ } else if constexpr (isDplusTable<U>() || isDplusMcTable<U>()) {
433+ return table.sliceBy (DplusCollisionPerCollision, collision.globalIndex ());
368434 } else if constexpr (isLcTable<U>() || isLcMcTable<U>()) {
369435 return table.sliceBy (LcCollisionPerCollision, collision.globalIndex ());
370436 } else if constexpr (isBplusTable<U>() || isBplusMcTable<U>()) {
@@ -406,6 +472,8 @@ int getHFCandidatePDG(T const& /*candidate*/)
406472{
407473 if constexpr (isD0Candidate<T>() || isD0McCandidate<T>()) {
408474 return static_cast <int >(o2::constants::physics::Pdg::kD0 );
475+ } else if constexpr (isDplusCandidate<T>() || isDplusMcCandidate<T>()) {
476+ return static_cast <int >(o2::constants::physics::Pdg::kDPlus );
409477 } else if constexpr (isLcCandidate<T>() || isLcMcCandidate<T>()) {
410478 return static_cast <int >(o2::constants::physics::Pdg::kLambdaCPlus );
411479 } else if constexpr (isBplusCandidate<T>() || isBplusMcCandidate<T>()) {
@@ -423,6 +491,8 @@ int getHFTablePDG()
423491{
424492 if constexpr (isD0Table<T>() || isD0McTable<T>()) {
425493 return static_cast <int >(o2::constants::physics::Pdg::kD0 );
494+ } else if constexpr (isDplusTable<T>() || isDplusMcTable<T>()) {
495+ return static_cast <int >(o2::constants::physics::Pdg::kDPlus );
426496 } else if constexpr (isLcTable<T>() || isLcMcTable<T>()) {
427497 return static_cast <int >(o2::constants::physics::Pdg::kLambdaCPlus );
428498 } else if constexpr (isBplusTable<T>() || isBplusMcTable<T>()) {
@@ -442,6 +512,8 @@ float getHFCandidatePDGMass(T const& /*candidate*/)
442512{
443513 if constexpr (isD0Candidate<T>() || isD0McCandidate<T>()) {
444514 return static_cast <float >(o2::constants::physics::MassD0);
515+ } else if constexpr (isDplusCandidate<T>() || isDplusMcCandidate<T>()) {
516+ return static_cast <float >(o2::constants::physics::MassDPlus);
445517 } else if constexpr (isLcCandidate<T>() || isLcMcCandidate<T>()) {
446518 return static_cast <float >(o2::constants::physics::MassLambdaCPlus);
447519 } else if constexpr (isBplusCandidate<T>() || isBplusMcCandidate<T>()) {
@@ -460,6 +532,8 @@ float getHFTablePDGMass()
460532{
461533 if constexpr (isD0Table<T>() || isD0McTable<T>()) {
462534 return static_cast <float >(o2::constants::physics::MassD0);
535+ } else if constexpr (isDplusTable<T>() || isDplusMcTable<T>()) {
536+ return static_cast <float >(o2::constants::physics::MassDPlus);
463537 } else if constexpr (isLcTable<T>() || isLcMcTable<T>()) {
464538 return static_cast <float >(o2::constants::physics::MassLambdaCPlus);
465539 } else if constexpr (isBplusTable<T>() || isBplusMcTable<T>()) {
@@ -555,6 +629,72 @@ void fillD0CandidateTable(T const& candidate, U& D0ParTable, V& D0ParETable, M&
555629 }
556630}
557631
632+ template <bool isMc, typename T, typename U, typename V, typename M, typename N>
633+ void fillDplusCandidateTable (T const & candidate, U& DplusParTable, V& DplusParETable, M& DplusMlTable, N& DplusMCDTable)
634+ {
635+
636+ DplusParTable (
637+ candidate.chi2PCA (),
638+ candidate.nProngsContributorsPV (),
639+ candidate.cpa (),
640+ candidate.cpaXY (),
641+ candidate.decayLength (),
642+ candidate.decayLengthXY (),
643+ candidate.decayLengthNormalised (),
644+ candidate.decayLengthXYNormalised (),
645+ candidate.ptProng0 (),
646+ candidate.ptProng1 (),
647+ candidate.ptProng2 (),
648+ candidate.impactParameter0 (),
649+ candidate.impactParameter1 (),
650+ candidate.impactParameter2 (),
651+ candidate.impactParameterNormalised0 (),
652+ candidate.impactParameterNormalised1 (),
653+ candidate.impactParameterNormalised2 (),
654+ candidate.nSigTpcPi0 (),
655+ candidate.nSigTofPi0 (),
656+ candidate.nSigTpcTofPi0 (),
657+ candidate.nSigTpcKa1 (),
658+ candidate.nSigTofKa1 (),
659+ candidate.nSigTpcTofKa1 (),
660+ candidate.nSigTpcPi2 (),
661+ candidate.nSigTofPi2 (),
662+ candidate.nSigTpcTofPi2 ());
663+
664+ DplusParETable (
665+ candidate.xSecondaryVertex (),
666+ candidate.ySecondaryVertex (),
667+ candidate.zSecondaryVertex (),
668+ candidate.errorDecayLength (),
669+ candidate.errorDecayLengthXY (),
670+ candidate.rSecondaryVertex (),
671+ candidate.pProng0 (),
672+ candidate.pProng1 (),
673+ candidate.pProng2 (),
674+ candidate.pxProng0 (),
675+ candidate.pyProng0 (),
676+ candidate.pzProng0 (),
677+ candidate.pxProng1 (),
678+ candidate.pyProng1 (),
679+ candidate.pzProng1 (),
680+ candidate.pxProng2 (),
681+ candidate.pyProng2 (),
682+ candidate.pzProng2 (),
683+ candidate.errorImpactParameter0 (),
684+ candidate.errorImpactParameter1 (),
685+ candidate.errorImpactParameter2 (),
686+ candidate.ct ());
687+
688+ std::vector<float > mlScoresVector;
689+ auto mlScoresSpan = candidate.mlScores ();
690+ std::copy (mlScoresSpan.begin (), mlScoresSpan.end (), std::back_inserter (mlScoresVector));
691+ DplusMlTable (mlScoresVector);
692+
693+ if constexpr (isMc) {
694+ DplusMCDTable (candidate.flagMcMatchRec (), candidate.originMcRec (), candidate.isCandidateSwapped ());
695+ }
696+ }
697+
558698template <bool isMc, typename T, typename U, typename V, typename M, typename N>
559699void fillLcCandidateTable (T const & candidate, U& LcParTable, V& LcParETable, M& LcMlTable, N& LcMCDTable)
560700{
@@ -712,6 +852,9 @@ void fillHFCandidateTable(T const& candidate, int32_t collisionIndex, U& HFBaseT
712852 if constexpr (isD0Candidate<T>()) {
713853 fillD0CandidateTable<isMc>(candidate, HFParTable, HFParETable, HFMlTable, HFMCDTable);
714854 }
855+ if constexpr (isDplusCandidate<T>()) {
856+ fillDplusCandidateTable<isMc>(candidate, HFParTable, HFParETable, HFMlTable, HFMCDTable);
857+ }
715858 if constexpr (isLcCandidate<T>()) {
716859 fillLcCandidateTable<isMc>(candidate, HFParTable, HFParETable, HFMlTable, HFMCDTable);
717860 }
0 commit comments