LArSoft  v07_13_02
Liquid Argon Software toolkit - http://larsoft.org/
MCParticleMonitoringAlgorithm.cc
Go to the documentation of this file.
1 
9 #include "Pandora/AlgorithmHeaders.h"
10 
15 
17 
20 
21 using namespace pandora;
22 
23 namespace lar_content
24 {
25 
26 MCParticleMonitoringAlgorithm::MCParticleMonitoringAlgorithm() :
27  m_useTrueNeutrinosOnly(false),
28  m_minHitsForDisplay(1)
29 {
30 }
31 
32 //------------------------------------------------------------------------------------------------------------------------------------------
33 
35 {
36  std::cout << "---MC-PARTICLE-MONITORING-----------------------------------------------------------------------" << std::endl;
37  const MCParticleList *pMCParticleList = nullptr;
38  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetList(*this, m_mcParticleListName, pMCParticleList));
39 
40  const CaloHitList *pCaloHitList = nullptr;
41  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetList(*this, m_caloHitListName, pCaloHitList));
42 
44  parameters.m_minHitSharingFraction = 0.f;
45 
46  LArMCParticleHelper::MCContributionMap nuMCParticlesToGoodHitsMap;
47  LArMCParticleHelper::MCContributionMap beamMCParticlesToGoodHitsMap;
48  LArMCParticleHelper::MCContributionMap crMCParticlesToGoodHitsMap;
49  LArMCParticleHelper::SelectReconstructableMCParticles(pMCParticleList, pCaloHitList, parameters, LArMCParticleHelper::IsBeamNeutrinoFinalState, nuMCParticlesToGoodHitsMap);
50 
52  {
53  LArMCParticleHelper::SelectReconstructableMCParticles(pMCParticleList, pCaloHitList, parameters, LArMCParticleHelper::IsBeamParticle, beamMCParticlesToGoodHitsMap);
54  LArMCParticleHelper::SelectReconstructableMCParticles(pMCParticleList, pCaloHitList, parameters, LArMCParticleHelper::IsCosmicRay, crMCParticlesToGoodHitsMap);
55  }
56 
57  if (!nuMCParticlesToGoodHitsMap.empty())
58  {
59  std::cout << std::endl << "BeamNeutrinos: " << std::endl;
60  this->PrintPrimaryMCParticles(nuMCParticlesToGoodHitsMap);
61  }
62 
63  if (!beamMCParticlesToGoodHitsMap.empty())
64  {
65  std::cout << std::endl << "BeamParticles: " << std::endl;
66  this->PrintPrimaryMCParticles(beamMCParticlesToGoodHitsMap);
67  }
68 
69  if (!crMCParticlesToGoodHitsMap.empty())
70  {
71  std::cout << std::endl << "CosmicRays: " << std::endl;
72  this->PrintPrimaryMCParticles(crMCParticlesToGoodHitsMap);
73  }
74 
75  std::cout << "------------------------------------------------------------------------------------------------" << std::endl;
76 
77  return STATUS_CODE_SUCCESS;
78 }
79 
80 //------------------------------------------------------------------------------------------------------------------------------------------
81 
83 {
84  MCParticleVector mcPrimaryVector;
85  LArMonitoringHelper::GetOrderedMCParticleVector({mcContributionMap}, mcPrimaryVector);
86 
87  unsigned int index(0);
88 
89  for (const MCParticle *const pMCPrimary : mcPrimaryVector)
90  {
91  const CaloHitList &caloHitList(mcContributionMap.at(pMCPrimary));
92 
93  if (caloHitList.size() >= m_minHitsForDisplay)
94  {
95  std::cout << std::endl << "--Primary " << index << ", MCPDG " << pMCPrimary->GetParticleId() << ", Energy " << pMCPrimary->GetEnergy()
96  << ", Dist. " << (pMCPrimary->GetEndpoint() - pMCPrimary->GetVertex()).GetMagnitude() << ", nMCHits " << caloHitList.size()
97  << " (" << LArMonitoringHelper::CountHitsByType(TPC_VIEW_U, caloHitList)
98  << ", " << LArMonitoringHelper::CountHitsByType(TPC_VIEW_V, caloHitList)
99  << ", " << LArMonitoringHelper::CountHitsByType(TPC_VIEW_W, caloHitList) << ")" << std::endl;
100 
101  LArMCParticleHelper::MCRelationMap mcToPrimaryMCMap;
102  LArMCParticleHelper::CaloHitToMCMap caloHitToPrimaryMCMap;
103  LArMCParticleHelper::MCContributionMap mcToTrueHitListMap;
104  LArMCParticleHelper::GetMCParticleToCaloHitMatches(&caloHitList, mcToPrimaryMCMap, caloHitToPrimaryMCMap, mcToTrueHitListMap);
105  this->PrintMCParticle(pMCPrimary, mcToTrueHitListMap, 1);
106  }
107 
108  ++index;
109  }
110 }
111 
112 //------------------------------------------------------------------------------------------------------------------------------------------
113 
114 void MCParticleMonitoringAlgorithm::PrintMCParticle(const MCParticle *const pMCParticle, const LArMCParticleHelper::MCContributionMap &mcToTrueHitListMap,
115  const int depth) const
116 {
117  const CaloHitList &caloHitList(mcToTrueHitListMap.count(pMCParticle) ? mcToTrueHitListMap.at(pMCParticle) : CaloHitList());
118 
119  if (caloHitList.size() >= m_minHitsForDisplay)
120  {
121  if (depth > 1)
122  {
123  for (int iDepth = 1; iDepth < depth - 1; ++iDepth) std::cout << " ";
124  std::cout << "\\_ ";
125  }
126 
127  std::cout << "MCPDG " << pMCParticle->GetParticleId() << ", Energy " << pMCParticle->GetEnergy()
128  << ", Dist. " << (pMCParticle->GetEndpoint() - pMCParticle->GetVertex()).GetMagnitude() << ", nMCHits " << caloHitList.size()
129  << " (" << LArMonitoringHelper::CountHitsByType(TPC_VIEW_U, caloHitList)
130  << ", " << LArMonitoringHelper::CountHitsByType(TPC_VIEW_V, caloHitList)
131  << ", " << LArMonitoringHelper::CountHitsByType(TPC_VIEW_W, caloHitList) << ")" << std::endl;
132  }
133 
134  for (const MCParticle *const pDaughterParticle : pMCParticle->GetDaughterList())
135  this->PrintMCParticle(pDaughterParticle, mcToTrueHitListMap, depth + 1);
136 }
137 
138 //------------------------------------------------------------------------------------------------------------------------------------------
139 
140 StatusCode MCParticleMonitoringAlgorithm::ReadSettings(const TiXmlHandle xmlHandle)
141 {
142  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "CaloHitListName", m_caloHitListName));
143  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "MCParticleListName", m_mcParticleListName));
144 
145  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
146  "UseTrueNeutrinosOnly", m_useTrueNeutrinosOnly));
147 
148  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
149  "MinHitsForDisplay", m_minHitsForDisplay));
150 
151  return STATUS_CODE_SUCCESS;
152 }
153 
154 } // namespace lar_content
Header file for the pfo helper class.
Header file for the mc particle monitoring algorithm.
Header file for the lar pfo class.
bool m_useTrueNeutrinosOnly
Whether to consider only mc particles that were neutrino induced.
Header file for the lar monitoring helper helper class.
std::vector< art::Ptr< simb::MCParticle > > MCParticleVector
unsigned int m_minHitsForDisplay
Min hits associated with mc particle to warrant display to terminal.
Header file for the geometry helper class.
static void GetOrderedMCParticleVector(const LArMCParticleHelper::MCContributionMapVector &selectedMCParticleToGoodHitsMaps, pandora::MCParticleVector &orderedMCParticleVector)
Order input MCParticles by their number of hits.
static bool IsCosmicRay(const pandora::MCParticle *const pMCParticle)
Return true if passed a primary cosmic ray MCParticle.
static void SelectReconstructableMCParticles(const pandora::MCParticleList *pMCParticleList, const pandora::CaloHitList *pCaloHitList, const PrimaryParameters &parameters, std::function< bool(const pandora::MCParticle *const)> fCriteria, MCContributionMap &selectedMCParticlesToHitsMap)
Select primary, reconstructable mc particles that match given criteria.
void PrintMCParticle(const pandora::MCParticle *const pMCParticle, const LArMCParticleHelper::MCContributionMap &mcToTrueHitListMap, const int depth) const
Print information for a given mc particle to screen.
std::unordered_map< const pandora::MCParticle *, pandora::CaloHitList > MCContributionMap
Header file for the cluster helper class.
static bool IsBeamParticle(const pandora::MCParticle *const pMCParticle)
Returns true if passed a primary beam MCParticle.
std::string m_caloHitListName
Name of input calo hit list.
void PrintPrimaryMCParticles(const LArMCParticleHelper::MCContributionMap &mcContributionMap) const
Extract details of each mc primary in a given mc contribution map.
float m_minHitSharingFraction
the minimum Hit sharing fraction
Header file for the lar mc particle class.
std::unordered_map< const pandora::CaloHit *, const pandora::MCParticle * > CaloHitToMCMap
static void GetMCParticleToCaloHitMatches(const pandora::CaloHitList *const pCaloHitList, const MCRelationMap &mcToPrimaryMCMap, CaloHitToMCMap &hitToMCMap, MCContributionMap &mcToTrueHitListMap)
Match calo hits to their parent particles.
std::string m_mcParticleListName
Name of input MC particle list.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
std::unordered_map< const pandora::MCParticle *, const pandora::MCParticle * > MCRelationMap
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.