MCParticleMonitoringAlgorithm.cc
Go to the documentation of this file.
1 /**
2  * @file larpandoracontent/LArMonitoring/MCParticleMonitoringAlgorithm.cc
3  *
4  * @brief Implementation of the mc particle monitoring algorithm.
5  *
6  * $Log: $
7  */
8 
9 #include "Pandora/AlgorithmHeaders.h"
10 
15 
17 
20 
21 using namespace pandora;
22 
23 namespace lar_content
24 {
25 
26 MCParticleMonitoringAlgorithm::MCParticleMonitoringAlgorithm() : m_useTrueNeutrinosOnly(false), m_minHitsForDisplay(1)
27 {
28 }
29 
30 //------------------------------------------------------------------------------------------------------------------------------------------
31 
33 {
34  std::cout << "---MC-PARTICLE-MONITORING-----------------------------------------------------------------------" << std::endl;
35  const MCParticleList *pMCParticleList = nullptr;
36  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetList(*this, m_mcParticleListName, pMCParticleList));
37 
38  const CaloHitList *pCaloHitList = nullptr;
39  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetList(*this, m_caloHitListName, pCaloHitList));
40 
42  parameters.m_minHitSharingFraction = 0.f;
43 
44  LArMCParticleHelper::MCContributionMap nuMCParticlesToGoodHitsMap;
45  LArMCParticleHelper::MCContributionMap beamMCParticlesToGoodHitsMap;
46  LArMCParticleHelper::MCContributionMap crMCParticlesToGoodHitsMap;
48  pMCParticleList, pCaloHitList, parameters, LArMCParticleHelper::IsBeamNeutrinoFinalState, nuMCParticlesToGoodHitsMap);
49 
51  {
53  pMCParticleList, pCaloHitList, parameters, LArMCParticleHelper::IsBeamParticle, beamMCParticlesToGoodHitsMap);
55  pMCParticleList, pCaloHitList, parameters, LArMCParticleHelper::IsCosmicRay, crMCParticlesToGoodHitsMap);
56  }
57 
58  if (!nuMCParticlesToGoodHitsMap.empty())
59  {
60  std::cout << std::endl << "BeamNeutrinos: " << std::endl;
61  this->PrintPrimaryMCParticles(nuMCParticlesToGoodHitsMap);
62  }
63 
64  if (!beamMCParticlesToGoodHitsMap.empty())
65  {
66  std::cout << std::endl << "BeamParticles: " << std::endl;
67  this->PrintPrimaryMCParticles(beamMCParticlesToGoodHitsMap);
68  }
69 
70  if (!crMCParticlesToGoodHitsMap.empty())
71  {
72  std::cout << std::endl << "CosmicRays: " << std::endl;
73  this->PrintPrimaryMCParticles(crMCParticlesToGoodHitsMap);
74  }
75 
76  std::cout << "------------------------------------------------------------------------------------------------" << std::endl;
77 
78  return STATUS_CODE_SUCCESS;
79 }
80 
81 //------------------------------------------------------------------------------------------------------------------------------------------
82 
84 {
85  MCParticleVector mcPrimaryVector;
86  LArMonitoringHelper::GetOrderedMCParticleVector({mcContributionMap}, mcPrimaryVector);
87 
88  unsigned int index(0);
89 
90  for (const MCParticle *const pMCPrimary : mcPrimaryVector)
91  {
92  const CaloHitList &caloHitList(mcContributionMap.at(pMCPrimary));
93 
94  if (caloHitList.size() >= m_minHitsForDisplay)
95  {
96  std::cout << std::endl
97  << "--Primary " << index << ", MCPDG " << pMCPrimary->GetParticleId() << ", Energy " << pMCPrimary->GetEnergy()
98  << ", Dist. " << (pMCPrimary->GetEndpoint() - pMCPrimary->GetVertex()).GetMagnitude() << ", nMCHits "
99  << caloHitList.size() << " (" << LArMonitoringHelper::CountHitsByType(TPC_VIEW_U, caloHitList) << ", "
100  << LArMonitoringHelper::CountHitsByType(TPC_VIEW_V, caloHitList) << ", "
101  << LArMonitoringHelper::CountHitsByType(TPC_VIEW_W, caloHitList) << ")" << std::endl;
102 
103  LArMCParticleHelper::MCRelationMap mcToPrimaryMCMap;
104  LArMCParticleHelper::CaloHitToMCMap caloHitToPrimaryMCMap;
105  LArMCParticleHelper::MCContributionMap mcToTrueHitListMap;
106  LArMCParticleHelper::GetMCParticleToCaloHitMatches(&caloHitList, mcToPrimaryMCMap, caloHitToPrimaryMCMap, mcToTrueHitListMap);
107  this->PrintMCParticle(pMCPrimary, mcToTrueHitListMap, 1);
108  }
109 
110  ++index;
111  }
112 }
113 
114 //------------------------------------------------------------------------------------------------------------------------------------------
115 
117  const MCParticle *const pMCParticle, const LArMCParticleHelper::MCContributionMap &mcToTrueHitListMap, const int depth) const
118 {
119  const CaloHitList &caloHitList(mcToTrueHitListMap.count(pMCParticle) ? mcToTrueHitListMap.at(pMCParticle) : CaloHitList());
120 
121  if (caloHitList.size() >= m_minHitsForDisplay)
122  {
123  if (depth > 1)
124  {
125  for (int iDepth = 1; iDepth < depth - 1; ++iDepth)
126  std::cout << " ";
127  std::cout << "\\_ ";
128  }
129 
130  std::cout << "MCPDG " << pMCParticle->GetParticleId() << ", Energy " << pMCParticle->GetEnergy() << ", Dist. "
131  << (pMCParticle->GetEndpoint() - pMCParticle->GetVertex()).GetMagnitude() << ", nMCHits " << caloHitList.size() << " ("
132  << LArMonitoringHelper::CountHitsByType(TPC_VIEW_U, caloHitList) << ", "
133  << LArMonitoringHelper::CountHitsByType(TPC_VIEW_V, caloHitList) << ", "
134  << LArMonitoringHelper::CountHitsByType(TPC_VIEW_W, caloHitList) << ")" << std::endl;
135  }
136 
137  for (const MCParticle *const pDaughterParticle : pMCParticle->GetDaughterList())
138  this->PrintMCParticle(pDaughterParticle, mcToTrueHitListMap, depth + 1);
139 }
140 
141 //------------------------------------------------------------------------------------------------------------------------------------------
142 
143 StatusCode MCParticleMonitoringAlgorithm::ReadSettings(const TiXmlHandle xmlHandle)
144 {
145  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "CaloHitListName", m_caloHitListName));
146  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "MCParticleListName", m_mcParticleListName));
147 
148  PANDORA_RETURN_RESULT_IF_AND_IF(
149  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "UseTrueNeutrinosOnly", m_useTrueNeutrinosOnly));
150 
151  PANDORA_RETURN_RESULT_IF_AND_IF(
152  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MinHitsForDisplay", m_minHitsForDisplay));
153 
154  return STATUS_CODE_SUCCESS;
155 }
156 
157 } // namespace lar_content
Header file for the pfo helper class.
std::unordered_map< const pandora::MCParticle *, pandora::CaloHitList > MCContributionMap
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.
std::unordered_map< const pandora::CaloHit *, const pandora::MCParticle * > CaloHitToMCMap
std::vector< art::Ptr< simb::MCParticle > > MCParticleVector
Header file for the lar monitoring helper helper class.
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 target, 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.
Header file for the cluster helper class.
static void GetMCParticleToCaloHitMatches(const pandora::CaloHitList *const pCaloHitList, const MCRelationMap &mcToTargetMCMap, CaloHitToMCMap &hitToMCMap, MCContributionMap &mcToTrueHitListMap)
Match calo hits to their parent particles.
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::string m_mcParticleListName
Name of input MC particle list.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
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.
std::unordered_map< const pandora::MCParticle *, const pandora::MCParticle * > MCRelationMap
QTextStream & endl(QTextStream &s)