Skip to content

Commit 0f02029

Browse files
fgrosaalibuild
andauthored
[PWGHF] add D0 sign in MC truth info and reorganise MC matching code for resonances (AliceO2Group#8265)
Co-authored-by: ALICE Action Bot <[email protected]>
1 parent 87e17db commit 0f02029

File tree

2 files changed

+91
-37
lines changed

2 files changed

+91
-37
lines changed

PWGHF/D2H/DataModel/ReducedDataModel.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -805,6 +805,7 @@ DECLARE_SOA_COLUMN(FlagMcMatchRec, flagMcMatchRec, int8_t); // fla
805805
DECLARE_SOA_COLUMN(FlagMcMatchGen, flagMcMatchGen, int8_t); // flag for decay channel classification generator level
806806
DECLARE_SOA_COLUMN(DebugMcRec, debugMcRec, int8_t); // debug flag for mis-association at reconstruction level
807807
DECLARE_SOA_COLUMN(Origin, origin, int8_t); // Flag for origin of MC particle 1=promt, 2=FD
808+
DECLARE_SOA_COLUMN(SignD0, signD0, int8_t); // Sign of the D0 in the channels with D* -> D0 pi, needed in case of non-matched D*
808809

809810
DECLARE_SOA_DYNAMIC_COLUMN(Pt, pt, //!
810811
[](float pxProng0, float pxProng1, float pyProng0, float pyProng1) -> float { return RecoDecay::pt((1.f * pxProng0 + 1.f * pxProng1), (1.f * pyProng0 + 1.f * pyProng1)); });
@@ -859,6 +860,7 @@ DECLARE_SOA_TABLE(HfMcRecRedDV0s, "AOD", "HFMCRECREDDV0", //! Table with reconst
859860
hf_reso_cand_reduced::FlagMcMatchRec,
860861
hf_reso_cand_reduced::DebugMcRec,
861862
hf_reso_cand_reduced::Origin,
863+
hf_reso_cand_reduced::SignD0,
862864
hf_b0_mc::PtMother,
863865
o2::soa::Marker<1>);
864866

PWGHF/D2H/TableProducer/dataCreatorCharmResoReduced.cxx

Lines changed: 89 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,11 @@
1515
/// \author Luca Aglietta <[email protected]>, UniTO Turin
1616
/// \author Fabrizio Grosa <[email protected]>, CERN
1717

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

Comments
 (0)