Pandora
Pandora source code navigator
Loading...
Searching...
No Matches
CheatingClusterCreationAlgorithm.cc
Go to the documentation of this file.
1
10
12
13using namespace pandora;
14
15namespace lar_content
16{
17
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
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
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
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
Grouping of header files for many classes of use in particle flow algorithms.
Header file for the cheating cluster creation algorithm class.
#define PANDORA_THROW_RESULT_IF(StatusCode1, Operator, Command)
Definition StatusCodes.h:43
#define PANDORA_RETURN_RESULT_IF_AND_IF(StatusCode1, StatusCode2, Operator, Command)
Definition StatusCodes.h:31
#define PANDORA_RETURN_RESULT_IF(StatusCode1, Operator, Command)
Definition StatusCodes.h:19
static bool IsAvailable(const pandora::Algorithm &algorithm, const T *const pT)
Is object, or a list of objects, available as a building block.
static pandora::StatusCode GetCurrentList(const pandora::Algorithm &algorithm, const T *&pT)
Get the current list.
static pandora::StatusCode GetList(const pandora::Algorithm &algorithm, const std::string &listName, const T *&pT)
Get a named list.
bool m_collapseToPrimaryMCParticles
Whether to collapse mc particle hierarchies to primary particles.
void GetMCParticleToHitListMap(MCParticleToHitListMap &mcParticleToHitListMap) const
Create map between each (primary) MC particle and associated calo hits.
std::unordered_map< const pandora::MCParticle *, pandora::CaloHitList > MCParticleToHitListMap
std::string m_mcParticleListName
The mc particle list name, required if want to collapse mc particle hierarchy.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
Read the algorithm settings.
pandora::IntVector m_particleIdList
list of particle ids of MCPFOs to be selected
void CreateClusters(const MCParticleToHitListMap &mcParticleToHitListMap) const
Create clusters based on information in the mc particle to hit list map.
bool SelectMCParticlesForClustering(const pandora::MCParticle *const pMCParticle) const
Check whether mc particle is of a type specified for inclusion in cheated clustering.
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.
static bool SortByMomentum(const pandora::MCParticle *const pLhs, const pandora::MCParticle *const pRhs)
Sort mc particles by their momentum.
std::unordered_map< const pandora::MCParticle *, const pandora::MCParticle * > MCRelationMap
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.
CaloHit class.
Definition CaloHit.h:26
Cluster class.
Definition Cluster.h:31
StatusCode AlterMetadata(const object_creation::Cluster::Metadata &metadata)
Alter the metadata information stored in a cluster.
Definition Cluster.cc:275
static const MCParticle * GetMainMCParticle(const T *const pT)
Find the mc particle making the largest contribution to a specified calo hit, track or cluster.
MCParticle class.
Definition MCParticle.h:26
int GetParticleId() const
Get the PDG code of the mc particle.
Definition MCParticle.h:285
StatusCodeException class.
static StatusCode ReadVectorOfValues(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, std::vector< T > &vector)
Read a vector of values from a (space separated) list in an xml element.
Definition XmlHelper.h:229
static StatusCode ReadValue(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, T &t)
Read a value from an xml element.
Definition XmlHelper.h:136
MANAGED_CONTAINER< const MCParticle * > MCParticleList
MANAGED_CONTAINER< const CaloHit * > CaloHitList
std::vector< const MCParticle * > MCParticleVector
StatusCode
The StatusCode enum.