Pandora
Pandora source code navigator
Loading...
Searching...
No Matches
CheatingPfoCreationAlgorithm.cc
Go to the documentation of this file.
1
10
12
14
15using namespace pandora;
16
17namespace lar_content
18{
19
21 m_collapseToPrimaryMCParticles(false),
22 m_useOnlyAvailableClusters(true),
23 m_addVertices(true),
24 m_replaceCurrentVertexList(false),
25 m_minGoodHitTypes(0),
26 m_nHitsForGoodHitType(10)
27{
28}
29
30//------------------------------------------------------------------------------------------------------------------------------------------
31
33{
35
37 {
38 const MCParticleList *pMCParticleList(nullptr);
39 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetList(*this, m_mcParticleListName, pMCParticleList));
40
41 LArMCParticleHelper::GetMCPrimaryMap(pMCParticleList, mcPrimaryMap);
42 }
43
44 MCParticleToClusterListMap mcParticleToClusterListMap;
45
46 for (const std::string &clusterListName : m_inputClusterListNames)
47 {
48 const ClusterList *pClusterList(nullptr);
49
50 if (STATUS_CODE_SUCCESS != PandoraContentApi::GetList(*this, clusterListName, pClusterList))
51 {
53 std::cout << "CheatingPfoCreationAlgorithm - Could not access cluster list with name " << clusterListName << std::endl;
54
55 continue;
56 }
57
58 this->GetMCParticleToClusterListMap(pClusterList, mcPrimaryMap, mcParticleToClusterListMap);
59 }
60
61 this->CreatePfos(mcParticleToClusterListMap);
62 return STATUS_CODE_SUCCESS;
63}
64
65//------------------------------------------------------------------------------------------------------------------------------------------
66
68 const LArMCParticleHelper::MCRelationMap &mcPrimaryMap, MCParticleToClusterListMap &mcParticleToClusterListMap) const
69{
70 for (const Cluster *const pCluster : *pClusterList)
71 {
72 try
73 {
75 continue;
76
77 const MCParticle *pMCParticle(MCParticleHelper::GetMainMCParticle(pCluster));
78
80 {
81 LArMCParticleHelper::MCRelationMap::const_iterator primaryIter = mcPrimaryMap.find(pMCParticle);
82
83 if (mcPrimaryMap.end() == primaryIter)
84 throw StatusCodeException(STATUS_CODE_NOT_FOUND);
85
86 pMCParticle = primaryIter->second;
87 }
88
89 if (!m_particleIdList.empty() && !m_particleIdList.count(pMCParticle->GetParticleId()))
90 continue;
91
92 mcParticleToClusterListMap[pMCParticle].push_back(pCluster);
93 }
94 catch (const StatusCodeException &)
95 {
96 }
97 }
98}
99
100//------------------------------------------------------------------------------------------------------------------------------------------
101
102void CheatingPfoCreationAlgorithm::CreatePfos(const MCParticleToClusterListMap &mcParticleToClusterListMap) const
103{
104 if (mcParticleToClusterListMap.empty())
105 return;
106
107 const PfoList *pPfoList(nullptr);
108 std::string pfoListName;
109 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::CreateTemporaryListAndSetCurrent(*this, pPfoList, pfoListName));
110
111 const VertexList *pVertexList(nullptr);
112 std::string vertexListName;
113 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::CreateTemporaryListAndSetCurrent(*this, pVertexList, vertexListName));
114
115 MCParticleVector mcParticleVector;
116 for (const auto &mapEntry : mcParticleToClusterListMap)
117 mcParticleVector.push_back(mapEntry.first);
118 std::sort(mcParticleVector.begin(), mcParticleVector.end(), LArMCParticleHelper::SortByMomentum);
119
120 for (const MCParticle *const pMCParticle : mcParticleVector)
121 {
122 const ClusterList &clusterList(mcParticleToClusterListMap.at(pMCParticle));
123
124 if (clusterList.empty())
125 continue;
126
128 continue;
129
130 try
131 {
132 PandoraContentApi::ParticleFlowObject::Parameters pfoParameters;
133 pfoParameters.m_particleId = (this->IsShower(pMCParticle) ? E_MINUS : MU_MINUS);
134 pfoParameters.m_charge = PdgTable::GetParticleCharge(pfoParameters.m_particleId.Get());
135 pfoParameters.m_mass = PdgTable::GetParticleMass(pfoParameters.m_particleId.Get());
136 pfoParameters.m_energy = pMCParticle->GetEnergy();
137 pfoParameters.m_momentum = pMCParticle->GetMomentum();
138 pfoParameters.m_clusterList.insert(pfoParameters.m_clusterList.end(), clusterList.begin(), clusterList.end());
139
140 const ParticleFlowObject *pPfo(nullptr);
141 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::ParticleFlowObject::Create(*this, pfoParameters, pPfo));
142
143 if (m_addVertices)
144 {
145 PandoraContentApi::Vertex::Parameters parameters;
146 parameters.m_position = pMCParticle->GetVertex();
147 parameters.m_vertexLabel = VERTEX_START;
148 parameters.m_vertexType = VERTEX_3D;
149
150 const Vertex *pVertex(nullptr);
151 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Vertex::Create(*this, parameters, pVertex));
152 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::AddToPfo<Vertex>(*this, pPfo, pVertex));
153 }
154 }
155 catch (const StatusCodeException &)
156 {
157 std::cout << "CheatingPfoCreationAlgorithm: Could not create PFO for MCParticle with pdg code " << pMCParticle->GetParticleId()
158 << std::endl;
159 }
160 }
161
162 if (!pPfoList->empty())
163 {
166 }
167
168 if (!pVertexList->empty())
169 {
171
174 }
175}
176
177//------------------------------------------------------------------------------------------------------------------------------------------
178
179unsigned int CheatingPfoCreationAlgorithm::GetNHitTypesAboveThreshold(const ClusterList &clusterList, const unsigned int nHitsThreshold) const
180{
181 HitTypeMap hitTypeMap;
182
183 for (const Cluster *const pCluster : clusterList)
184 {
185 hitTypeMap[LArClusterHelper::GetClusterHitType(pCluster)] += pCluster->GetNCaloHits();
186 }
187
188 unsigned int nGoodViews(0);
189
190 for (const HitTypeMap::value_type &mapEntry : hitTypeMap)
191 {
192 if (mapEntry.second > nHitsThreshold)
193 ++nGoodViews;
194 }
195
196 return nGoodViews;
197}
198
199//------------------------------------------------------------------------------------------------------------------------------------------
200
201bool CheatingPfoCreationAlgorithm::IsTrack(const MCParticle *const pMCParticle) const
202{
203 const int pdg(pMCParticle->GetParticleId());
204
205 return ((MU_MINUS == std::abs(pdg)) || (PI_PLUS == std::abs(pdg)) || (PROTON == std::abs(pdg)) || (K_PLUS == std::abs(pdg)));
206}
207
208//------------------------------------------------------------------------------------------------------------------------------------------
209
210bool CheatingPfoCreationAlgorithm::IsShower(const MCParticle *const pMCParticle) const
211{
212 const int pdg(pMCParticle->GetParticleId());
213
214 return ((E_MINUS == std::abs(pdg)) || (PHOTON == std::abs(pdg)));
215}
216
217//------------------------------------------------------------------------------------------------------------------------------------------
218
220{
221 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadVectorOfValues(xmlHandle, "InputClusterListNames", m_inputClusterListNames));
222
223 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "OutputPfoListName", m_outputPfoListName));
224
225 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
226 XmlHelper::ReadValue(xmlHandle, "CollapseToPrimaryMCParticles", m_collapseToPrimaryMCParticles));
227
229 {
230 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "MCParticleListName", m_mcParticleListName));
231 }
232
233 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
234 XmlHelper::ReadValue(xmlHandle, "UseOnlyAvailableClusters", m_useOnlyAvailableClusters));
235
236 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "AddVertices", m_addVertices));
237
238 if (m_addVertices)
239 {
240 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "OutputVertexListName", m_outputVertexListName));
241
242 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
243 XmlHelper::ReadValue(xmlHandle, "ReplaceCurrentVertexList", m_replaceCurrentVertexList));
244 }
245
246 IntVector particleIdVector;
248 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadVectorOfValues(xmlHandle, "ParticleIdList", particleIdVector));
249
250 m_particleIdList.insert(particleIdVector.begin(), particleIdVector.end());
251
252 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MinGoodHitTypes", m_minGoodHitTypes));
253
255 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "NHitsForGoodHitType", m_nHitsForGoodHitType));
256
257 return STATUS_CODE_SUCCESS;
258}
259
260} // 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.
Header file for the cluster helper 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 ReplaceCurrentList(const pandora::Algorithm &algorithm, const std::string &newListName)
Replace the current list with a pre-saved list; use this new list as a permanent replacement for the ...
static pandora::StatusCode CreateTemporaryListAndSetCurrent(const pandora::Algorithm &algorithm, const T *&pT, std::string &temporaryListName)
Create a temporary list and set it to be the current list, enabling object creation.
static pandora::StatusCode GetList(const pandora::Algorithm &algorithm, const std::string &listName, const T *&pT)
Get a named list.
static const pandora::PandoraSettings * GetSettings(const pandora::Algorithm &algorithm)
Get the pandora settings instance.
std::unordered_map< const pandora::MCParticle *, pandora::ClusterList > MCParticleToClusterListMap
pandora::StatusCode Run()
Run the algorithm.
bool m_useOnlyAvailableClusters
Whether to consider unavailable clusters when identifying cheated pfos.
void CreatePfos(const MCParticleToClusterListMap &mcParticleToClusterListMap) const
Create pfos corresponding to the details in a provided mc particle to cluster list map.
bool IsShower(const pandora::MCParticle *const pMCParticle) const
Determine whether an input MCParticle is a shower-like particle.
std::string m_outputPfoListName
The output pfo list name.
bool m_replaceCurrentVertexList
Whether to replace current vertex list.
bool m_addVertices
Whether to add the start vertex to the cheated pfo.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
Read the algorithm settings.
unsigned int GetNHitTypesAboveThreshold(const pandora::ClusterList &clusterList, const unsigned int nHitsThreshold) const
Get the number of hit types containing more than a specified number of hits.
bool m_collapseToPrimaryMCParticles
Whether to collapse mc particle hierarchies to primary particles.
void GetMCParticleToClusterListMap(const pandora::ClusterList *const pClusterList, const LArMCParticleHelper::MCRelationMap &mcPrimaryMap, MCParticleToClusterListMap &mcParticleToClusterListMap) const
Get a map relating mc particles to a list of daughter clusters.
bool IsTrack(const pandora::MCParticle *const pMCParticle) const
Determine whether an input MCParticle is a track-like particle.
unsigned int m_nHitsForGoodHitType
The min number of hits of a particular hit type in order to declare the hit type is good.
pandora::StringVector m_inputClusterListNames
The names of the input cluster lists.
ParticleIdList m_particleIdList
The list of particle ids to consider for pfo creation; will consider all ids if empty.
unsigned int m_minGoodHitTypes
The min number of good hit types in the clusters collected for a given mc particle.
std::map< pandora::HitType, unsigned int > HitTypeMap
std::string m_mcParticleListName
The mc particle list name.
std::string m_outputVertexListName
The output vertex list name.
static pandora::HitType GetClusterHitType(const pandora::Cluster *const pCluster)
Get the hit type associated with a two dimensional cluster.
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.
Cluster class.
Definition Cluster.h:31
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
bool ShouldDisplayAlgorithmInfo() const
Whether to display algorithm information during processing.
ParticleFlowObject class.
static float GetParticleMass(const int pdgCode)
Get the mass of a particle type.
Definition PdgTable.h:205
static int GetParticleCharge(const int pdgCode)
Get the charge of a particle type.
Definition PdgTable.h:227
StatusCodeException class.
Vertex class.
Definition Vertex.h:26
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 Cluster * > ClusterList
std::vector< int > IntVector
std::vector< const MCParticle * > MCParticleVector
MANAGED_CONTAINER< const Vertex * > VertexList
StatusCode
The StatusCode enum.
MANAGED_CONTAINER< const ParticleFlowObject * > PfoList