30 unsigned int nHitsOfSpecifiedType(0);
32 for (
const CaloHit *
const pCaloHit : caloHitList)
34 if (hitType == pCaloHit->GetHitType())
35 ++nHitsOfSpecifiedType;
38 return nHitsOfSpecifiedType;
48 if (mcParticleToGoodHitsMap.empty())
52 std::vector<LArMCParticleHelper::MCParticleCaloHitListPair> mcParticleToGoodHitsVect;
53 std::copy(mcParticleToGoodHitsMap.begin(), mcParticleToGoodHitsMap.end(), std::back_inserter(mcParticleToGoodHitsVect));
56 std::sort(mcParticleToGoodHitsVect.begin(), mcParticleToGoodHitsVect.end(),
59 const bool isANuFinalState(LArMCParticleHelper::IsBeamNeutrinoFinalState(a.first)),
60 isBNuFinalState(LArMCParticleHelper::IsBeamNeutrinoFinalState(b.first));
62 if (isANuFinalState != isBNuFinalState)
63 return isANuFinalState;
65 const bool isABeamParticle(LArMCParticleHelper::IsBeamParticle(a.first)),
66 isBBeamParticle(LArMCParticleHelper::IsBeamParticle(b.first));
68 if (isABeamParticle != isBBeamParticle)
69 return isABeamParticle;
72 if (a.second.size() != b.second.size())
73 return (a.second.size() > b.second.size());
76 return LArMCParticleHelper::SortByMomentum(a.first, b.first);
80 orderedMCParticleVector.push_back(mcParticleCaloHitPair.first);
84 const unsigned int nMCParticles(orderedMCParticleVector.size());
85 if (std::distance(orderedMCParticleVector.begin(), std::unique(orderedMCParticleVector.begin(), orderedMCParticleVector.end())) != nMCParticles)
94 std::vector<LArMCParticleHelper::PfoCaloHitListPair> pfoToReconstructable2DHitsVect;
95 std::copy(pfoToReconstructable2DHitsMap.begin(), pfoToReconstructable2DHitsMap.end(), std::back_inserter(pfoToReconstructable2DHitsVect));
98 std::sort(pfoToReconstructable2DHitsVect.begin(), pfoToReconstructable2DHitsVect.end(),
101 const bool isANuFinalState(LArPfoHelper::IsNeutrinoFinalState(a.first)), isBNuFinalState(LArPfoHelper::IsNeutrinoFinalState(b.first));
103 if (isANuFinalState != isBNuFinalState)
104 return isANuFinalState;
106 if (a.second.size() != b.second.size())
107 return (a.second.size() > b.second.size());
110 return LArPfoHelper::SortByNHits(a.first, b.first);
114 orderedPfoVector.push_back(pfoCaloHitPair.first);
117 const unsigned int nPfos(orderedPfoVector.size());
118 if (std::distance(orderedPfoVector.begin(), std::unique(orderedPfoVector.begin(), orderedPfoVector.end())) != nPfos)
127 if (selectedMCParticleToGoodHitsMap.empty())
129 std::cout <<
"No MCParticles supplied." << std::endl;
133 LArFormattingHelper::Table table({
"ID",
"NUANCE",
"TYPE",
"",
"E",
"dist",
"",
"nGoodHits",
"U",
"V",
"W"});
135 unsigned int usedParticleCount(0);
136 for (
unsigned int id = 0;
id < orderedMCParticleVector.size(); ++id)
138 const MCParticle *
const pMCParticle(orderedMCParticleVector.at(
id));
140 LArMCParticleHelper::MCContributionMap::const_iterator it = selectedMCParticleToGoodHitsMap.find(pMCParticle);
141 if (selectedMCParticleToGoodHitsMap.end() == it)
145 table.AddElement(
id + 1);
149 table.AddElement(pMCParticle->
GetEnergy());
152 table.AddElement(it->second.size());
161 if (usedParticleCount != selectedMCParticleToGoodHitsMap.size())
171 if (pfoToReconstructable2DHitsMap.empty())
173 std::cout <<
"No Pfos supplied." << std::endl;
179 for (
unsigned int id = 0;
id < orderedPfoVector.size(); ++id)
183 LArMCParticleHelper::PfoContributionMap::const_iterator it = pfoToReconstructable2DHitsMap.find(pPfo);
184 if (pfoToReconstructable2DHitsMap.end() == it)
188 table.AddElement(
id + 1);
192 table.AddElement(it->second.size());
206 if (orderedPfoVector.empty())
208 std::cout <<
"No Pfos supplied." << std::endl;
212 if (orderedMCParticleVector.empty())
214 std::cout <<
"No MCParticles supplied." << std::endl;
219 unsigned int maxMatches(0);
220 for (
const auto &entry : mcParticleToPfoHitSharingMap)
221 maxMatches = std::max(
static_cast<unsigned int>(entry.second.size()), maxMatches);
223 const bool showOthersColumn(maxMatches > nMatches);
224 const unsigned int nMatchesToShow(std::min(maxMatches, nMatches));
227 std::vector<std::string> tableHeaders({
"MCParticle",
""});
228 for (
unsigned int i = 0; i < nMatchesToShow; ++i)
230 tableHeaders.push_back(
"");
231 tableHeaders.push_back(
"Pfo");
232 tableHeaders.push_back(
"nSharedHits");
235 if (showOthersColumn)
237 tableHeaders.push_back(
"");
238 tableHeaders.push_back(
"");
239 tableHeaders.push_back(
"nOtherPfos");
240 tableHeaders.push_back(
"nSharedHits");
246 for (
unsigned int mcParticleId = 0; mcParticleId < orderedMCParticleVector.size(); ++mcParticleId)
248 const MCParticle *
const pMCParticle(orderedMCParticleVector.at(mcParticleId));
249 LArMCParticleHelper::MCParticleToPfoHitSharingMap::const_iterator it = mcParticleToPfoHitSharingMap.find(pMCParticle);
252 if (it != mcParticleToPfoHitSharingMap.end())
253 pfoToSharedHitsVector = it->second;
264 unsigned int nPfosShown(0);
265 unsigned int nOtherHits(0);
266 for (
const auto &pfoNSharedHitsPair : pfoToSharedHitsVector)
268 for (
unsigned int pfoId = 0; pfoId < orderedPfoVector.size(); ++pfoId)
270 if (pfoNSharedHitsPair.first != orderedPfoVector.at(pfoId))
273 if (nPfosShown < nMatchesToShow)
284 nOtherHits += pfoNSharedHitsPair.second.size();
291 for (
unsigned int i = 0; i < nMatchesToShow - nPfosShown; ++i)
298 if (!showOthersColumn)
303 table.
AddElement(pfoToSharedHitsVector.size() - nPfosShown);
Header file for the calo hit class.
Header file for the lar monitoring helper helper class.
Header file for the pfo helper class.
Header file for the mc particle class.
Header file for the mc particle helper class.
Header file for the particle flow object class.
void AddElement(const T &value, const Style style=REGULAR, const Color color=DEFAULT)
Add an element to the table into the next (non-separator) column.
void Print() const
Print the table.
Color
Style code enumeration.
static bool IsBeamParticle(const pandora::MCParticle *const pMCParticle)
Returns true if passed a primary beam MCParticle.
std::unordered_map< const pandora::ParticleFlowObject *, pandora::CaloHitList > PfoContributionMap
std::vector< MCContributionMap > MCContributionMapVector
std::vector< PfoCaloHitListPair > PfoToSharedHitsVector
std::unordered_map< const pandora::MCParticle *, pandora::CaloHitList > MCContributionMap
static unsigned int GetNuanceCode(const pandora::MCParticle *const pMCParticle)
Get the nuance code of an MCParticle.
std::pair< const pandora::ParticleFlowObject *, pandora::CaloHitList > PfoCaloHitListPair
std::map< const pandora::MCParticle *, PfoToSharedHitsVector > MCParticleToPfoHitSharingMap
std::pair< const pandora::MCParticle *, pandora::CaloHitList > MCParticleCaloHitListPair
static bool IsBeamNeutrinoFinalState(const pandora::MCParticle *const pMCParticle)
Returns true if passed a primary neutrino final state MCParticle.
static unsigned int CountHitsByType(const pandora::HitType hitType, const pandora::CaloHitList &caloHitList)
Count the number of calo hits, in a provided list, of a specified type.
static void PrintMatchingTable(const pandora::PfoVector &orderedPfoVector, const pandora::MCParticleVector &orderedMCParticleVector, const LArMCParticleHelper::MCParticleToPfoHitSharingMap &mcParticleToPfoHitSharingMap, const unsigned int nMatches)
Print the shared good hits between all Pfos and MCParticles.
static void PrintPfoTable(const LArMCParticleHelper::PfoContributionMap &pfoToReconstructable2DHitsMap, const pandora::PfoVector &orderedPfoVector)
Print details of input Pfos to the terminal in a table.
static void GetOrderedMCParticleVector(const LArMCParticleHelper::MCContributionMapVector &selectedMCParticleToGoodHitsMaps, pandora::MCParticleVector &orderedMCParticleVector)
Order input MCParticles by their number of hits.
static void GetOrderedPfoVector(const LArMCParticleHelper::PfoContributionMap &pfoToReconstructable2DHitsMap, pandora::PfoVector &orderedPfoVector)
Order input Pfos by their number of hits.
static void PrintMCParticleTable(const LArMCParticleHelper::MCContributionMap &selectedMCParticleToGoodHitsMaps, const pandora::MCParticleVector &orderedMCParticleVector)
Print details of selected MCParticles to the terminal in a table.
static bool IsNeutrinoFinalState(const pandora::ParticleFlowObject *const pPfo)
Whether a pfo is a final-state particle from a neutrino (or antineutrino) interaction.
float GetEnergy() const
Get energy of mc particle, units GeV.
const CartesianVector & GetEndpoint() const
Get the endpoint of the mc particle, units mm.
const CartesianVector & GetVertex() const
Get the production vertex of the mc particle, units mm.
int GetParticleId() const
Get the PDG code of the mc particle.
ParticleFlowObject class.
int GetParticleId() const
Get the particle flow object id (PDG code)
static std::string GetParticleName(const int pdgCode)
Get the name of a particle type as a string.
StatusCodeException class.
HitType
Calorimeter hit type enum.
std::vector< const ParticleFlowObject * > PfoVector
MANAGED_CONTAINER< const CaloHit * > CaloHitList
std::vector< const MCParticle * > MCParticleVector