CheatingClusterCreationAlgorithm.cc
Go to the documentation of this file.
1 /**
2  * @file larpandoracontent/LArCheating/CheatingClusterCreationAlgorithm.cc
3  *
4  * @brief Implementation of the cheating cluster creation algorithm class.
5  *
6  * $Log: $
7  */
8 
9 #include "Pandora/AlgorithmHeaders.h"
10 
12 
13 using namespace pandora;
14 
15 namespace lar_content
16 {
17 
18 CheatingClusterCreationAlgorithm::CheatingClusterCreationAlgorithm() : m_collapseToPrimaryMCParticles(false)
19 {
20 }
21 
22 //------------------------------------------------------------------------------------------------------------------------------------------
23 
25 {
26  MCParticleToHitListMap mcParticleToHitListMap;
27  this->GetMCParticleToHitListMap(mcParticleToHitListMap);
28  this->CreateClusters(mcParticleToHitListMap);
29 
30  return STATUS_CODE_SUCCESS;
31 }
32 
33 //------------------------------------------------------------------------------------------------------------------------------------------
34 
36 {
38 
40  {
41  const MCParticleList *pMCParticleList(nullptr);
42  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetList(*this, m_mcParticleListName, pMCParticleList));
43 
44  LArMCParticleHelper::GetMCPrimaryMap(pMCParticleList, mcPrimaryMap);
45  }
46 
47  const CaloHitList *pCaloHitList(nullptr);
48  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetCurrentList(*this, pCaloHitList));
49 
50  for (const CaloHit *const pCaloHit : *pCaloHitList)
51  {
52  try
53  {
54  if (!PandoraContentApi::IsAvailable(*this, pCaloHit))
55  continue;
56 
57  this->SimpleMCParticleCollection(pCaloHit, mcPrimaryMap, mcParticleToHitListMap);
58  }
59  catch (const StatusCodeException &)
60  {
61  }
62  }
63 }
64 
65 //------------------------------------------------------------------------------------------------------------------------------------------
66 
68  const LArMCParticleHelper::MCRelationMap &mcPrimaryMap, MCParticleToHitListMap &mcParticleToHitListMap) const
69 {
70  const MCParticle *pMCParticle(MCParticleHelper::GetMainMCParticle(pCaloHit));
71 
72  if (!this->SelectMCParticlesForClustering(pMCParticle))
73  return;
74 
76  {
77  LArMCParticleHelper::MCRelationMap::const_iterator primaryIter = mcPrimaryMap.find(pMCParticle);
78 
79  if (mcPrimaryMap.end() == primaryIter)
80  throw StatusCodeException(STATUS_CODE_NOT_FOUND);
81 
82  pMCParticle = primaryIter->second;
83  }
84 
85  mcParticleToHitListMap[pMCParticle].push_back(pCaloHit);
86 }
87 
88 //------------------------------------------------------------------------------------------------------------------------------------------
89 
90 bool CheatingClusterCreationAlgorithm::SelectMCParticlesForClustering(const MCParticle *const pMCParticle) const
91 {
92  if (m_particleIdList.empty())
93  return true;
94 
95  for (const int particleId : m_particleIdList)
96  {
97  if (pMCParticle->GetParticleId() == particleId)
98  return true;
99  }
100 
101  return false;
102 }
103 
104 //------------------------------------------------------------------------------------------------------------------------------------------
105 
107 {
108  MCParticleVector mcParticleVector;
109  for (const auto &mapEntry : mcParticleToHitListMap)
110  mcParticleVector.push_back(mapEntry.first);
111  std::sort(mcParticleVector.begin(), mcParticleVector.end(), LArMCParticleHelper::SortByMomentum);
112 
113  for (const MCParticle *const pMCParticle : mcParticleVector)
114  {
115  const CaloHitList &caloHitList(mcParticleToHitListMap.at(pMCParticle));
116 
117  if (caloHitList.empty())
118  continue;
119 
120  const Cluster *pCluster(nullptr);
121  PandoraContentApi::Cluster::Parameters parameters;
122  parameters.m_caloHitList = caloHitList;
123  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Cluster::Create(*this, parameters, pCluster));
124 
125  PandoraContentApi::Cluster::Metadata metadata;
126 
127  switch (pMCParticle->GetParticleId())
128  {
129  case PHOTON:
130  case E_PLUS:
131  case E_MINUS:
132  case MU_PLUS:
133  case MU_MINUS:
134  metadata.m_particleId = pMCParticle->GetParticleId();
135  break;
136  default:
137  break;
138  }
139 
140  if (metadata.m_particleId.IsInitialized())
141  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Cluster::AlterMetadata(*this, pCluster, metadata));
142  }
143 }
144 
145 //------------------------------------------------------------------------------------------------------------------------------------------
146 
147 StatusCode CheatingClusterCreationAlgorithm::ReadSettings(const TiXmlHandle xmlHandle)
148 {
149  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
150  XmlHelper::ReadValue(xmlHandle, "CollapseToPrimaryMCParticles", m_collapseToPrimaryMCParticles));
151 
153  {
154  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "MCParticleListName", m_mcParticleListName));
155  }
156 
157  PANDORA_RETURN_RESULT_IF_AND_IF(
158  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadVectorOfValues(xmlHandle, "ParticleIdList", m_particleIdList));
159 
160  return STATUS_CODE_SUCCESS;
161 }
162 
163 } // namespace lar_content
pandora::IntVector m_particleIdList
list of particle ids of MCPFOs to be selected
void GetMCParticleToHitListMap(MCParticleToHitListMap &mcParticleToHitListMap) const
Create map between each (primary) MC particle and associated calo hits.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
std::string m_mcParticleListName
The mc particle list name, required if want to collapse mc particle hierarchy.
intermediate_table::const_iterator const_iterator
void SimpleMCParticleCollection(const pandora::CaloHit *const pCaloHit, const LArMCParticleHelper::MCRelationMap &mcPrimaryMap, MCParticleToHitListMap &mcParticleToHitListMap) const
Simple mc particle collection, using main mc particle associated with each calo hit.
std::vector< art::Ptr< simb::MCParticle > > MCParticleVector
static void GetMCPrimaryMap(const pandora::MCParticleList *const pMCParticleList, MCRelationMap &mcPrimaryMap)
Get mapping from individual mc particles (in a provided list) and their primary parent mc particles...
bool SelectMCParticlesForClustering(const pandora::MCParticle *const pMCParticle) const
Check whether mc particle is of a type specified for inclusion in cheated clustering.
static bool SortByMomentum(const pandora::MCParticle *const pLhs, const pandora::MCParticle *const pRhs)
Sort mc particles by their momentum.
Header file for the cheating cluster creation algorithm class.
bool m_collapseToPrimaryMCParticles
Whether to collapse mc particle hierarchies to primary particles.
std::unordered_map< const pandora::MCParticle *, pandora::CaloHitList > MCParticleToHitListMap
void CreateClusters(const MCParticleToHitListMap &mcParticleToHitListMap) const
Create clusters based on information in the mc particle to hit list map.
std::unordered_map< const pandora::MCParticle *, const pandora::MCParticle * > MCRelationMap