1515// / \author Luca Aglietta <[email protected] >, UniTO Turin1616// / \author Fabrizio Grosa <[email protected] >, CERN1717
18+ #include < algorithm>
1819#include < cmath>
1920#include < map>
21+ #include < string>
22+ #include < vector>
2023
2124#include " DetectorsBase/Propagator.h"
2225#include " CommonConstants/PhysicsConstants.h"
@@ -78,6 +81,7 @@ enum DecayTypeMc : uint8_t {
7881 Ds2StarToDplusK0s,
7982 Ds1ToDStarK0ToDPlusPi0K0s,
8083 Ds1ToDStarK0ToD0PiK0sPart,
84+ Ds1ToDStarK0ToD0NoPiK0sPart,
8185 Ds1ToDStarK0ToD0PiK0sOneMu
8286};
8387
@@ -515,58 +519,106 @@ struct HfDataCreatorCharmResoReduced {
515519 int8_t origin{0 };
516520 std::vector<int > idxBhadMothers{};
517521 float motherPt{-1 .f };
522+ int indexRecReso{-1 }, indexRecDstar{-1 }, indexRecDplus{-1 }, indexRecD0{-1 }, indexRecK0{-1 };
523+ int indexRecDstarToMu{-1 }, indexRecD0ToMu{-1 }, indexRecK0ToMu{-1 }, indexRecResoToMu{-1 }, indexRecResoPartReco{-1 };
518524
519525 if constexpr (decChannel == DecayChannel::DstarV0) {
520526 // Ds1 → D* K0 → (D0 π+) K0s → ((K-π+) π+)(π+π-)
521- auto indexRecReso = RecoDecay::getMatchedMCRec<false , true >(particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ], vecDaughtersReso[2 ], vecDaughtersReso[3 ], vecDaughtersReso[4 ]}, Pdg::kDS1 , std::array{+kPiPlus , -kKPlus , +kPiPlus , +kPiPlus , -kPiPlus }, true , &sign, 3 );
522- if (indexRecReso > -1 ) {
523- // D* → π- K+ π-
524- auto indexRecDstar = RecoDecay::getMatchedMCRec (particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ], vecDaughtersReso[2 ]}, Pdg::kDStar , std::array{-kKPlus , +kPiPlus , +kPiPlus }, true , &signDStar, 2 );
525- auto indexRecD0 = RecoDecay::getMatchedMCRec (particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ]}, Pdg::kD0 , std::array{+kPiPlus , -kKPlus }, true , &signD0, 1 );
526- auto indexRecK0 = RecoDecay::getMatchedMCRec<false , true >(particlesMc, std::array{vecDaughtersReso[3 ], vecDaughtersReso[4 ]}, kK0 , std::array{+kPiPlus , -kPiPlus }, true , &signV0, 2 );
527- if (indexRecDstar > -1 && indexRecD0 > -1 && indexRecK0 > -1 ) {
527+ indexRecD0 = RecoDecay::getMatchedMCRec (particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ]}, Pdg::kD0 , std::array{+kPiPlus , -kKPlus }, true , &signD0, 1 );
528+ indexRecK0 = RecoDecay::getMatchedMCRec<false , true >(particlesMc, std::array{vecDaughtersReso[3 ], vecDaughtersReso[4 ]}, kK0 , std::array{+kPiPlus , -kPiPlus }, true , &signV0, 2 );
529+ if (indexRecD0 > -1 ) {
530+ indexRecDstar = RecoDecay::getMatchedMCRec (particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ], vecDaughtersReso[2 ]}, Pdg::kDStar , std::array{-kKPlus , +kPiPlus , +kPiPlus }, true , &signDStar, 2 );
531+ }
532+ if (indexRecD0 > -1 && indexRecDstar > -1 && indexRecK0 > -1 ) {
533+ indexRecReso = RecoDecay::getMatchedMCRec<false , true >(particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ], vecDaughtersReso[2 ], vecDaughtersReso[3 ], vecDaughtersReso[4 ]}, Pdg::kDS1 , std::array{+kPiPlus , -kKPlus , +kPiPlus , +kPiPlus , -kPiPlus }, true , &sign, 3 );
534+ if (indexRecReso > -1 ) {
528535 flag = sign * BIT (DecayTypeMc::Ds1ToDStarK0ToD0PiK0s);
529536 }
530- } else if (RecoDecay::getMatchedMCRec<false , true , true >(particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ], vecDaughtersReso[2 ], vecDaughtersReso[3 ], vecDaughtersReso[4 ]}, Pdg::kDS1 , std::array{+kPiPlus , -kKPlus , +kPiPlus , +kPiPlus , -kPiPlus }, true , &sign, 3 ) > -1 ) { // Verify partly reconstructed decay Ds1 -> D* K0s -> D+ π0 K0s
531- auto indexRecDstar = RecoDecay::getMatchedMCRec<false , false , true >(particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ], vecDaughtersReso[2 ]}, Pdg::kDStar , std::array{-kKPlus , +kPiPlus , +kPiPlus }, true , &signDStar, 2 );
532- auto indexRecK0 = RecoDecay::getMatchedMCRec<false , true >(particlesMc, std::array{vecDaughtersReso[3 ], vecDaughtersReso[4 ]}, kK0 , std::array{+kPiPlus , -kPiPlus }, true , &signV0, 2 );
533- if (indexRecDstar > -1 && indexRecK0 > -1 ) {
534- if (RecoDecay::getMatchedMCRec (particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ], vecDaughtersReso[2 ]}, Pdg::kDPlus , std::array{+kPiPlus , -kKPlus , +kPiPlus }, true , &signDPlus, 2 ) > -1 ) {
535- flag = sign * BIT (DecayTypeMc::Ds1ToDStarK0ToDPlusPi0K0s);
536- } else if (RecoDecay::getMatchedMCRec<false , false , true >(particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ]}, Pdg::kD0 , std::array{+kPiPlus , -kKPlus }, true , &signD0, 2 ) > -1 ) {
537- flag = sign * BIT (DecayTypeMc::Ds1ToDStarK0ToD0PiK0sPart);
537+ }
538+
539+ // Ds1+ not matched: we check if it is partially reco
540+ if (indexRecReso < 0 ) {
541+ indexRecResoPartReco = RecoDecay::getMatchedMCRec<false , true , true >(particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ], vecDaughtersReso[2 ], vecDaughtersReso[3 ], vecDaughtersReso[4 ]}, Pdg::kDS1 , std::array{+kPiPlus , -kKPlus , +kPiPlus , +kPiPlus , -kPiPlus }, true , &sign, 3 );
542+ indexRecDplus = RecoDecay::getMatchedMCRec (particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ], vecDaughtersReso[2 ]}, Pdg::kDPlus , std::array{+kPiPlus , -kKPlus , +kPiPlus }, true , &signDPlus, 2 );
543+ if (indexRecResoPartReco > -1 ) { // we look for decays of D* or D0 with more daughters
544+ if (indexRecDstar < 0 && indexRecK0 > -1 ) {
545+ auto indexRecDstarPartReco = RecoDecay::getMatchedMCRec<false , false , true >(particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ], vecDaughtersReso[2 ]}, Pdg::kDStar , std::array{-kKPlus , +kPiPlus , +kPiPlus }, true , &signDStar, 3 );
546+ if (indexRecDstarPartReco > -1 ) {
547+ if (indexRecDplus > -1 ) { // Ds1 -> D* K0s -> D+ π0 K0s
548+ flag = sign * BIT (DecayTypeMc::Ds1ToDStarK0ToDPlusPi0K0s);
549+ } else {
550+ auto indexRecDzeroPartReco = RecoDecay::getMatchedMCRec<false , false , true >(particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ]}, Pdg::kD0 , std::array{+kPiPlus , -kKPlus }, true , &signD0, 2 );
551+ if (indexRecDzeroPartReco > -1 ) { // Ds1 -> D* K0s -> D0 π+ K0s -> K- π+ π0 π+ K0s
552+ flag = sign * BIT (DecayTypeMc::Ds1ToDStarK0ToD0PiK0sPart);
553+ }
554+ }
555+ }
556+ }
557+ } else { // we look for D* not matched, but all the other ones yes, we check if we only lost the soft pion
558+ if (indexRecD0 > -1 && indexRecK0 > -1 && indexRecDstar < 0 ) {
559+ indexRecResoPartReco = RecoDecay::getMatchedMCRec<false , true , true >(particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ], vecDaughtersReso[3 ], vecDaughtersReso[4 ]}, Pdg::kDS1 , std::array{+kPiPlus , -kKPlus , +kPiPlus , -kPiPlus }, true , &sign, 3 );
560+ if (indexRecResoPartReco > -1 ) {
561+ flag = sign * BIT (DecayTypeMc::Ds1ToDStarK0ToD0NoPiK0sPart);
562+ }
563+ }
564+ }
565+
566+ // Check if one pion decayed to a muon
567+ if (indexRecD0 < 0 ) {
568+ indexRecD0ToMu = RecoDecay::getMatchedMCRec<false , false , true >(particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ]}, Pdg::kD0 , std::array{+kMuonPlus , -kKPlus }, true , &signD0, 2 );
569+ }
570+ if (indexRecK0 < 0 ) {
571+ indexRecK0ToMu = RecoDecay::getMatchedMCRec<false , true , true >(particlesMc, std::array{vecDaughtersReso[3 ], vecDaughtersReso[4 ]}, kK0 , std::array{+kMuonPlus , -kPiPlus }, true , &signV0, 3 );
572+ }
573+ if (indexRecDstar < 0 ) {
574+ indexRecDstarToMu = RecoDecay::getMatchedMCRec<false , false , true >(particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ], vecDaughtersReso[2 ]}, Pdg::kDStar , std::array{-kKPlus , +kPiPlus , +kMuonPlus }, true , &signDStar, 3 );
575+ }
576+
577+ if (indexRecD0ToMu + indexRecK0ToMu + indexRecDstarToMu > -3 ) {
578+ indexRecResoToMu = RecoDecay::getMatchedMCRec<false , true , true >(particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ], vecDaughtersReso[2 ], vecDaughtersReso[3 ], vecDaughtersReso[4 ]}, Pdg::kDS1 , std::array{+kPiPlus , -kKPlus , +kPiPlus , +kMuonPlus , -kPiPlus }, true , &sign, 4 );
579+ if (indexRecResoToMu > -1 ) {
580+ indexRecResoPartReco = -1 ;
581+ flag = sign * BIT (DecayTypeMc::Ds1ToDStarK0ToD0PiK0sOneMu);
582+ } else {
583+ indexRecResoToMu = RecoDecay::getMatchedMCRec<false , true , true >(particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ], vecDaughtersReso[2 ], vecDaughtersReso[3 ], vecDaughtersReso[4 ]}, Pdg::kDS1 , std::array{+kPiPlus , -kKPlus , +kPiPlus , +kPiPlus , -kMuonPlus }, true , &sign, 4 );
584+ if (indexRecResoToMu > -1 ) {
585+ indexRecResoPartReco = -1 ;
586+ flag = sign * BIT (DecayTypeMc::Ds1ToDStarK0ToD0PiK0sOneMu);
587+ }
538588 }
539589 }
540- } else if (RecoDecay::getMatchedMCRec<false , true , true >(particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ], vecDaughtersReso[2 ], vecDaughtersReso[3 ], vecDaughtersReso[4 ]}, Pdg::kDS1 , std::array{+kPiPlus , -kKPlus , +kPiPlus , +kMuonPlus , -kPiPlus }, true , &sign, 4 ) > -1 ||
541- RecoDecay::getMatchedMCRec<false , true , true >(particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ], vecDaughtersReso[2 ], vecDaughtersReso[3 ], vecDaughtersReso[4 ]}, Pdg::kDS1 , std::array{+kPiPlus , -kKPlus , +kPiPlus , +kPiPlus , -kMuonPlus }, true , &sign, 4 ) > -1 ) { // Verify if one of the pions decayed in a muon
542- flag = sign * BIT (DecayTypeMc::Ds1ToDStarK0ToD0PiK0sOneMu);
543590 }
591+
544592 if (flag != 0 ) {
545- auto particleReso = particlesMc.iteratorAt (indexRecReso);
593+ int indexParticle{-1 };
594+ if (indexRecReso > -1 ) {
595+ indexParticle = indexRecReso;
596+ } else if (indexRecResoPartReco > -1 ) {
597+ indexParticle = indexRecResoPartReco;
598+ } else if (indexRecResoToMu > -1 ) {
599+ indexParticle = indexRecResoToMu;
600+ }
601+ auto particleReso = particlesMc.iteratorAt (indexParticle);
546602 origin = RecoDecay::getCharmHadronOrigin (particlesMc, particleReso, false , &idxBhadMothers);
603+ motherPt = particleReso.pt ();
547604 }
548605 } else if constexpr (decChannel == DecayChannel::DplusV0) {
549606 // Ds2Star → D+ K0 → (π+K-π+) K0s → (π+K-π+)(π+π-)
550- auto indexRecReso = RecoDecay::getMatchedMCRec<false , true >(particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ], vecDaughtersReso[2 ], vecDaughtersReso[3 ], vecDaughtersReso[4 ]}, Pdg::kDS2Star , std::array{+kPiPlus , -kKPlus , +kPiPlus , +kPiPlus , -kPiPlus }, true , &sign, 3 );
607+ indexRecReso = RecoDecay::getMatchedMCRec<false , true >(particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ], vecDaughtersReso[2 ], vecDaughtersReso[3 ], vecDaughtersReso[4 ]}, Pdg::kDS2Star , std::array{+kPiPlus , -kKPlus , +kPiPlus , +kPiPlus , -kPiPlus }, true , &sign, 3 );
551608 if (indexRecReso > -1 ) {
552609 // D+ → π+ K- π+
553- auto indexRecDplus = RecoDecay::getMatchedMCRec (particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ], vecDaughtersReso[2 ]}, Pdg::kDPlus , std::array{+kPiPlus , -kKPlus , +kPiPlus }, true , &signDPlus, 2 );
554- auto indexRecK0 = RecoDecay::getMatchedMCRec<false , true >(particlesMc, std::array{vecDaughtersReso[3 ], vecDaughtersReso[4 ]}, kK0 , std::array{+kPiPlus , -kPiPlus }, true , &signV0, 2 );
610+ indexRecDplus = RecoDecay::getMatchedMCRec (particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ], vecDaughtersReso[2 ]}, Pdg::kDPlus , std::array{+kPiPlus , -kKPlus , +kPiPlus }, true , &signDPlus, 2 );
611+ indexRecK0 = RecoDecay::getMatchedMCRec<false , true >(particlesMc, std::array{vecDaughtersReso[3 ], vecDaughtersReso[4 ]}, kK0 , std::array{+kPiPlus , -kPiPlus }, true , &signV0, 2 );
555612 if (indexRecDplus > -1 && indexRecK0 > -1 ) {
556613 flag = sign * BIT (DecayTypeMc::Ds2StarToDplusK0s);
557614 }
558- auto indexMother = RecoDecay::getMother (particlesMc, vecDaughtersReso.back ().template mcParticle_as <PParticles>(), Pdg::kDS2Star , true );
559- if (indexMother >= 0 ) {
560- auto particleMother = particlesMc.rawIteratorAt (indexMother);
561- motherPt = particleMother.pt ();
562- }
563615 } else { // Verify partly reconstructed decay Ds1 -> D* K0s -> D+ π0 K0s
564616 indexRecReso = RecoDecay::getMatchedMCRec<false , true , true >(particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ], vecDaughtersReso[2 ], vecDaughtersReso[3 ], vecDaughtersReso[4 ]}, Pdg::kDS1 , std::array{+kPiPlus , -kKPlus , +kPiPlus , +kPiPlus , -kPiPlus }, true , &sign, 3 );
565617 if (indexRecReso > -1 ) {
566- auto indexRecDstar = RecoDecay::getMatchedMCRec<false , false , true >(particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ], vecDaughtersReso[2 ]}, Pdg::kDStar , std::array{-kKPlus , +kPiPlus , +kPiPlus }, true , &signDStar, 2 );
567- auto indexRecK0 = RecoDecay::getMatchedMCRec<false , true >(particlesMc, std::array{vecDaughtersReso[3 ], vecDaughtersReso[4 ]}, kK0 , std::array{+kPiPlus , -kPiPlus }, true , &signV0, 2 );
618+ indexRecDstar = RecoDecay::getMatchedMCRec<false , false , true >(particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ], vecDaughtersReso[2 ]}, Pdg::kDStar , std::array{-kKPlus , +kPiPlus , +kPiPlus }, true , &signDStar, 2 );
619+ indexRecK0 = RecoDecay::getMatchedMCRec<false , true >(particlesMc, std::array{vecDaughtersReso[3 ], vecDaughtersReso[4 ]}, kK0 , std::array{+kPiPlus , -kPiPlus }, true , &signV0, 2 );
568620 if (indexRecDstar > -1 && indexRecK0 > -1 ) {
569- auto indexRecDplus = RecoDecay::getMatchedMCRec (particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ], vecDaughtersReso[2 ]}, Pdg::kDPlus , std::array{+kPiPlus , -kKPlus , +kPiPlus }, true , &sign, 2 );
621+ indexRecDplus = RecoDecay::getMatchedMCRec (particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ], vecDaughtersReso[2 ]}, Pdg::kDPlus , std::array{+kPiPlus , -kKPlus , +kPiPlus }, true , &sign, 2 );
570622 if (indexRecDplus > -1 ) {
571623 flag = sign * BIT (DecayTypeMc::Ds1ToDStarK0ToDPlusPi0K0s);
572624 }
@@ -576,34 +628,34 @@ struct HfDataCreatorCharmResoReduced {
576628 if (flag != 0 ) {
577629 auto particleReso = particlesMc.iteratorAt (indexRecReso);
578630 origin = RecoDecay::getCharmHadronOrigin (particlesMc, particleReso, false , &idxBhadMothers);
631+ motherPt = particleReso.pt ();
579632 }
580633 }
581634 if (flag != 0 ) {
582635 registry.fill (HIST (" hMCRecCounter" ), flag);
583636 registry.fill (HIST (" hMCRecOrigin" ), origin);
584637 } else {
585- if (RecoDecay::getMatchedMCRec< false , true >(particlesMc, std::array{vecDaughtersReso[ 3 ], vecDaughtersReso[ 4 ]}, kK0 , std::array{+ kPiPlus , - kPiPlus }, true , &signV0, 2 ) > -1 ) {
638+ if (indexRecK0 > -1 ) {
586639 SETBIT (debug, PartialMatchMc::K0Matched);
587640 }
588- auto indexRecD0 = RecoDecay::getMatchedMCRec (particlesMc, std::array{vecDaughtersReso[0 ], vecDaughtersReso[1 ]}, Pdg::kD0 , std::array{+kPiPlus , -kKPlus }, true , &signD0, 1 );
589641 if (indexRecD0 > -1 ) {
590642 SETBIT (debug, PartialMatchMc::D0Matched);
591643 }
592- if (RecoDecay::getMatchedMCRec< false , false , true >(particlesMc, std::array{vecDaughtersReso[ 0 ], vecDaughtersReso[ 1 ], vecDaughtersReso[ 2 ]}, Pdg:: kDStar , std::array{- kKPlus , + kPiPlus , + kPiPlus }, true , &signDStar, 2 ) > -1 ) {
644+ if (indexRecDstar > -1 ) {
593645 SETBIT (debug, PartialMatchMc::DStarMatched);
594646 }
595- if (RecoDecay::getMatchedMCRec (particlesMc, std::array{vecDaughtersReso[ 0 ], vecDaughtersReso[ 1 ], vecDaughtersReso[ 2 ]}, Pdg:: kDPlus , std::array{+ kPiPlus , - kKPlus , + kPiPlus }, true , &signDPlus, 2 ) > -1 ) {
647+ if (indexRecDplus > -1 ) {
596648 SETBIT (debug, PartialMatchMc::DPlusMatched);
597649 }
598- if (RecoDecay::getMatchedMCRec< false , true , true >(particlesMc, std::array{vecDaughtersReso[ 3 ], vecDaughtersReso[ 4 ]}, kK0 , std::array{+ kMuonPlus , - kPiPlus }, true , &signV0, 3 ) > -1 ) {
650+ if (indexRecK0ToMu > -1 ) {
599651 SETBIT (debug, PartialMatchMc::K0MuMatched);
600652 }
601- if (RecoDecay::getMatchedMCRec< false , false , true >(particlesMc, std::array{vecDaughtersReso[ 0 ], vecDaughtersReso[ 1 ], vecDaughtersReso[ 2 ]}, Pdg:: kDStar , std::array{- kKPlus , + kPiPlus , + kMuonPlus }, true , &signDStar, 3 ) > -1 ) {
653+ if (indexRecDstarToMu > -1 ) {
602654 SETBIT (debug, PartialMatchMc::DStarMuMatched);
603655 }
604656 registry.fill (HIST (" hMCRecDebug" ), debug);
605657 }
606- rowHfDV0McRecReduced (indexHfCandCharm, indexCandV0, flag, debug, origin, motherPt);
658+ rowHfDV0McRecReduced (indexHfCandCharm, indexCandV0, flag, debug, origin, signD0, motherPt);
607659 }
608660
609661 template <bool withMl, bool doMc, uint8_t DecayChannel, typename Coll, typename CCands, typename Tr, typename PParticles, typename BBach>
0 commit comments