Pandora
Pandora source code navigator
Loading...
Searching...
No Matches
ParticleFlowObject.cc
Go to the documentation of this file.
1
9#include "Objects/Cluster.h"
12#include "Objects/Track.h"
13
14#include <algorithm>
15
16namespace pandora
17{
18
20 m_particleId(parameters.m_particleId.Get()),
21 m_charge(parameters.m_charge.Get()),
22 m_mass(parameters.m_mass.Get()),
23 m_energy(parameters.m_energy.Get()),
24 m_momentum(parameters.m_momentum.Get()),
25 m_trackList(parameters.m_trackList),
26 m_clusterList(parameters.m_clusterList),
27 m_vertexList(parameters.m_vertexList),
28 m_propertiesMap(parameters.m_propertiesToAdd)
29{
30 if (!parameters.m_propertiesToRemove.empty())
31 throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
32}
33
34//------------------------------------------------------------------------------------------------------------------------------------------
35
39
40//------------------------------------------------------------------------------------------------------------------------------------------
41
43{
44 if (!metadata.m_propertiesToAdd.empty() || !metadata.m_propertiesToRemove.empty())
45 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->UpdatePropertiesMap(metadata));
46
47 if (metadata.m_particleId.IsInitialized())
48 m_particleId = metadata.m_particleId.Get();
49
50 if (metadata.m_charge.IsInitialized())
51 m_charge = metadata.m_charge.Get();
52
53 if (metadata.m_mass.IsInitialized())
54 m_mass = metadata.m_mass.Get();
55
56 if (metadata.m_energy.IsInitialized())
57 m_energy = metadata.m_energy.Get();
58
59 if (metadata.m_momentum.IsInitialized())
60 m_momentum = metadata.m_momentum.Get();
61
62 return STATUS_CODE_SUCCESS;
63}
64
65//------------------------------------------------------------------------------------------------------------------------------------------
66
68{
69 TrackAddressList trackAddressList;
70
71 for (const Track *const pTrack : m_trackList)
72 {
73 trackAddressList.push_back(pTrack->GetParentAddress());
74 }
75
76 return trackAddressList;
77}
78
79//------------------------------------------------------------------------------------------------------------------------------------------
80
82{
83 ClusterAddressList clusterAddressList;
84
85 for (const Cluster *const pCluster : m_clusterList)
86 {
87 CaloHitAddressList caloHitAddressList;
88
89 OrderedCaloHitList orderedCaloHitList(pCluster->GetOrderedCaloHitList());
90 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, orderedCaloHitList.Add(pCluster->GetIsolatedCaloHitList()));
91
92 for (const OrderedCaloHitList::value_type &layerEntry : orderedCaloHitList)
93 {
94 for (const CaloHit *const pCaloHit : *layerEntry.second)
95 caloHitAddressList.push_back(pCaloHit->GetParentAddress());
96 }
97
98 clusterAddressList.push_back(caloHitAddressList);
99 }
100
101 return clusterAddressList;
102}
103
104//------------------------------------------------------------------------------------------------------------------------------------------
105
106template <>
108{
109 if (m_clusterList.end() != std::find(m_clusterList.begin(), m_clusterList.end(), pCluster))
110 return STATUS_CODE_ALREADY_PRESENT;
111
112 m_clusterList.push_back(pCluster);
113 return STATUS_CODE_SUCCESS;
114}
115
116template <>
118{
119 if (m_trackList.end() != std::find(m_trackList.begin(), m_trackList.end(), pTrack))
120 return STATUS_CODE_ALREADY_PRESENT;
121
122 m_trackList.push_back(pTrack);
123 return STATUS_CODE_SUCCESS;
124}
125
126template <>
128{
129 if (m_vertexList.end() != std::find(m_vertexList.begin(), m_vertexList.end(), pVertex))
130 return STATUS_CODE_ALREADY_PRESENT;
131
132 m_vertexList.push_back(pVertex);
133 return STATUS_CODE_SUCCESS;
134}
135
136//------------------------------------------------------------------------------------------------------------------------------------------
137
138template <>
140{
141 ClusterList::iterator iter = std::find(m_clusterList.begin(), m_clusterList.end(), pCluster);
142
143 if (m_clusterList.end() == iter)
144 return STATUS_CODE_NOT_FOUND;
145
146 m_clusterList.erase(iter);
147 return STATUS_CODE_SUCCESS;
148}
149
150template <>
152{
153 TrackList::iterator iter = std::find(m_trackList.begin(), m_trackList.end(), pTrack);
154
155 if (m_trackList.end() == iter)
156 return STATUS_CODE_NOT_FOUND;
157
158 m_trackList.erase(iter);
159 return STATUS_CODE_SUCCESS;
160}
161
162template <>
164{
165 VertexList::iterator iter = std::find(m_vertexList.begin(), m_vertexList.end(), pVertex);
166
167 if (m_vertexList.end() == iter)
168 return STATUS_CODE_NOT_FOUND;
169
170 m_vertexList.erase(iter);
171 return STATUS_CODE_SUCCESS;
172}
173
174//------------------------------------------------------------------------------------------------------------------------------------------
175
177{
178 if (!pPfo)
179 return STATUS_CODE_INVALID_PARAMETER;
180
181 if (m_parentPfoList.end() != std::find(m_parentPfoList.begin(), m_parentPfoList.end(), pPfo))
182 return STATUS_CODE_ALREADY_PRESENT;
183
184 m_parentPfoList.push_back(pPfo);
185 return STATUS_CODE_SUCCESS;
186}
187
188//------------------------------------------------------------------------------------------------------------------------------------------
189
191{
192 if (!pPfo)
193 return STATUS_CODE_INVALID_PARAMETER;
194
195 if (m_daughterPfoList.end() != std::find(m_daughterPfoList.begin(), m_daughterPfoList.end(), pPfo))
196 return STATUS_CODE_ALREADY_PRESENT;
197
198 m_daughterPfoList.push_back(pPfo);
199 return STATUS_CODE_SUCCESS;
200}
201
202//------------------------------------------------------------------------------------------------------------------------------------------
203
205{
206 PfoList::iterator iter = std::find(m_parentPfoList.begin(), m_parentPfoList.end(), pPfo);
207
208 if (m_parentPfoList.end() == iter)
209 return STATUS_CODE_NOT_FOUND;
210
211 m_parentPfoList.erase(iter);
212 return STATUS_CODE_SUCCESS;
213}
214
215//------------------------------------------------------------------------------------------------------------------------------------------
216
218{
219 PfoList::iterator iter = std::find(m_daughterPfoList.begin(), m_daughterPfoList.end(), pPfo);
220
221 if (m_daughterPfoList.end() == iter)
222 return STATUS_CODE_NOT_FOUND;
223
224 m_daughterPfoList.erase(iter);
225 return STATUS_CODE_SUCCESS;
226}
227
228//------------------------------------------------------------------------------------------------------------------------------------------
229
231{
232 for (const std::string &propertyName : metadata.m_propertiesToRemove)
233 {
234 if (metadata.m_propertiesToAdd.count(propertyName))
235 return STATUS_CODE_INVALID_PARAMETER;
236
237 if (!m_propertiesMap.count(propertyName))
238 return STATUS_CODE_NOT_FOUND;
239 }
240
241 for (const std::string &propertyName : metadata.m_propertiesToRemove)
242 m_propertiesMap.erase(propertyName);
243
244 for (const PropertiesMap::value_type &entryToAdd : metadata.m_propertiesToAdd)
245 m_propertiesMap[entryToAdd.first] = entryToAdd.second;
246
247 return STATUS_CODE_SUCCESS;
248}
249
250} // namespace pandora
Header file for the cluster class.
Header file for the ordered calo hit list class.
Header file for the particle flow object class.
#define PANDORA_THROW_RESULT_IF(StatusCode1, Operator, Command)
Definition StatusCodes.h:43
#define PANDORA_RETURN_RESULT_IF(StatusCode1, Operator, Command)
Definition StatusCodes.h:19
Header file for the track class.
CaloHit class.
Definition CaloHit.h:26
Cluster class.
Definition Cluster.h:31
Calo hit lists arranged by pseudo layer.
StatusCode Add(const OrderedCaloHitList &rhs)
Add the hits from a second ordered calo hit list to this list.
ParticleFlowObject class.
virtual ~ParticleFlowObject()
Destructor.
int m_charge
The particle flow object charge.
StatusCode RemoveDaughter(const ParticleFlowObject *const pPfo)
Remove a daughter pfo from the daughter pfo list.
StatusCode RemoveParent(const ParticleFlowObject *const pPfo)
Remove a parent pfo from the parent pfo list.
StatusCode UpdatePropertiesMap(const object_creation::ParticleFlowObject::Metadata &metadata)
Update the properties map.
ClusterList m_clusterList
The cluster list.
ParticleFlowObject(const object_creation::ParticleFlowObject::Parameters &parameters)
Constructor.
StatusCode AddDaughter(const ParticleFlowObject *const pPfo)
Add a daughter pfo to the daughter pfo list.
StatusCode RemoveFromPfo(const T *const pT)
Remove an object from the particle flow object.
StatusCode AlterMetadata(const object_creation::ParticleFlowObject::Metadata &metadata)
Alter particle flow object metadata parameters.
TrackAddressList GetTrackAddressList() const
Get track address list.
PfoList m_daughterPfoList
The list of daughter pfos.
float m_mass
The particle flow object mass.
TrackList m_trackList
The track list.
StatusCode AddToPfo(const T *const pT)
Add an object to the particle flow object.
float m_energy
The particle flow object energy.
CartesianVector m_momentum
The particle flow object momentum.
StatusCode AddParent(const ParticleFlowObject *const pPfo)
Add a parent pfo to the parent pfo list.
int m_particleId
The particle flow object id (PDG code)
VertexList m_vertexList
The vertex list.
PropertiesMap m_propertiesMap
The map from registered property name to floating point property value.
ClusterAddressList GetClusterAddressList() const
Get the cluster address list.
PfoList m_parentPfoList
The list of parent pfos.
StatusCodeException class.
Track class.
Definition Track.h:26
Vertex class.
Definition Vertex.h:26
std::vector< const void * > TrackAddressList
std::vector< CaloHitAddressList > ClusterAddressList
StatusCode
The StatusCode enum.
std::vector< const void * > CaloHitAddressList