Pandora
Pandora source code navigator
Loading...
Searching...
No Matches
TrackManager.cc
Go to the documentation of this file.
1
10
11#include "Objects/Track.h"
12
15
16#include <algorithm>
17
18namespace pandora
19{
20
21TrackManager::TrackManager(const Pandora *const pPandora) :
22 InputObjectManager<Track>(pPandora)
23{
24 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->CreateInitialLists());
25}
26
27//------------------------------------------------------------------------------------------------------------------------------------------
28
30{
31 (void) this->EraseAllContent();
32}
33
34//------------------------------------------------------------------------------------------------------------------------------------------
35
38{
39 pTrack = nullptr;
40
41 try
42 {
43 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, factory.Create(parameters, pTrack));
44
45 NameToListMap::iterator inputIter = m_nameToListMap.find(m_inputListName);
46
47 if (!pTrack || (m_nameToListMap.end() == inputIter))
48 throw StatusCodeException(STATUS_CODE_FAILURE);
49
50 if (!m_uidToTrackMap.insert(UidToTrackMap::value_type(pTrack->GetParentAddress(), pTrack)).second)
51 throw StatusCodeException(STATUS_CODE_ALREADY_PRESENT);
52
53 inputIter->second->push_back(pTrack);
54 return STATUS_CODE_SUCCESS;
55 }
56 catch (StatusCodeException &statusCodeException)
57 {
58 std::cout << "Failed to create track: " << statusCodeException.ToString() << std::endl;
59 delete pTrack;
60 pTrack = nullptr;
61 return statusCodeException.GetStatusCode();
62 }
63}
64
65//------------------------------------------------------------------------------------------------------------------------------------------
66
67template <>
68bool TrackManager::IsAvailable(const Track *const pTrack) const
69{
70 return pTrack->IsAvailable();
71}
72
73template <>
74bool TrackManager::IsAvailable(const TrackList *const pTrackList) const
75{
76 bool isAvailable(true);
77
78 for (const Track *const pTrack : *pTrackList)
79 isAvailable &= this->IsAvailable(pTrack);
80
81 return isAvailable;
82}
83
84//------------------------------------------------------------------------------------------------------------------------------------------
85
86template <>
87void TrackManager::SetAvailability(const Track *const pTrack, bool isAvailable) const
88{
89 this->Modifiable(pTrack)->SetAvailability(isAvailable);
90}
91
92template <>
93void TrackManager::SetAvailability(const TrackList *const pTrackList, bool isAvailable) const
94{
95 for (const Track *const pTrack : *pTrackList)
96 this->SetAvailability(pTrack, isAvailable);
97}
98
99//------------------------------------------------------------------------------------------------------------------------------------------
100
109
110//------------------------------------------------------------------------------------------------------------------------------------------
111
113{
114 if (trackToPfoTargetsMap.empty())
115 return STATUS_CODE_SUCCESS;
116
117 NameToListMap::const_iterator inputIter = m_nameToListMap.find(m_inputListName);
118
119 if (m_nameToListMap.end() == inputIter)
120 return STATUS_CODE_FAILURE;
121
122 for (const Track *const pTrack : *inputIter->second)
123 {
124 UidToMCParticleWeightMap::const_iterator pfoTargetIter = trackToPfoTargetsMap.find(pTrack->GetParentAddress());
125
126 if (trackToPfoTargetsMap.end() == pfoTargetIter)
127 continue;
128
129 this->Modifiable(pTrack)->SetMCParticleWeightMap(pfoTargetIter->second);
130 }
131
132 return STATUS_CODE_SUCCESS;
133}
134
135//------------------------------------------------------------------------------------------------------------------------------------------
136
138{
139 NameToListMap::const_iterator inputIter = m_nameToListMap.find(m_inputListName);
140
141 if (m_nameToListMap.end() == inputIter)
142 return STATUS_CODE_FAILURE;
143
144 for (const Track *const pTrack : *inputIter->second)
145 this->Modifiable(pTrack)->RemoveMCParticles();
146
147 return STATUS_CODE_SUCCESS;
148}
149
150//------------------------------------------------------------------------------------------------------------------------------------------
151
153{
154 m_parentDaughterRelationMap.insert(TrackRelationMap::value_type(parentUid, daughterUid));
155
156 return STATUS_CODE_SUCCESS;
157}
158
159//------------------------------------------------------------------------------------------------------------------------------------------
160
161StatusCode TrackManager::SetTrackSiblingRelationship(const Uid firstSiblingUid, const Uid secondSiblingUid)
162{
163 m_siblingRelationMap.insert(TrackRelationMap::value_type(firstSiblingUid, secondSiblingUid));
164
165 return STATUS_CODE_SUCCESS;
166}
167
168//------------------------------------------------------------------------------------------------------------------------------------------
169
171{
172 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->AddParentDaughterAssociations());
173 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->AddSiblingAssociations());
174
175 return STATUS_CODE_SUCCESS;
176}
177
178//------------------------------------------------------------------------------------------------------------------------------------------
179
181{
182 if (m_parentDaughterRelationMap.empty())
183 return STATUS_CODE_SUCCESS;
184
185 const TrackList *pInputList(nullptr);
186 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->GetList(m_inputListName, pInputList));
187
188 for (const Track *const pParentTrack : *pInputList)
189 {
190 const auto range(m_parentDaughterRelationMap.equal_range(pParentTrack->GetParentAddress()));
191
192 TrackList daughterList;
193 for (TrackRelationMap::const_iterator relIter = range.first; relIter != range.second; ++relIter)
194 {
195 UidToTrackMap::const_iterator daughterIter = m_uidToTrackMap.find(relIter->second);
196
197 if ((m_uidToTrackMap.end() != daughterIter) && (daughterList.end() == std::find(daughterList.begin(), daughterList.end(), daughterIter->second)))
198 daughterList.push_back(daughterIter->second);
199 }
200 daughterList.sort(PointerLessThan<Track>());
201
202 for (const Track *const pDaughterTrack : daughterList)
203 {
204 const StatusCode firstStatusCode(this->Modifiable(pParentTrack)->AddDaughter(pDaughterTrack));
205 const StatusCode secondStatusCode(this->Modifiable(pDaughterTrack)->AddParent(pParentTrack));
206
207 if (firstStatusCode != secondStatusCode)
208 return STATUS_CODE_FAILURE;
209
210 if ((firstStatusCode != STATUS_CODE_SUCCESS) && (firstStatusCode != STATUS_CODE_ALREADY_PRESENT))
211 return firstStatusCode;
212 }
213 }
214
215 return STATUS_CODE_SUCCESS;
216}
217
218//------------------------------------------------------------------------------------------------------------------------------------------
219
221{
222 if (m_siblingRelationMap.empty())
223 return STATUS_CODE_SUCCESS;
224
225 const TrackList *pInputList(nullptr);
226 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->GetList(m_inputListName, pInputList));
227
228 for (const Track *const pTrack : *pInputList)
229 {
230 const auto range(m_siblingRelationMap.equal_range(pTrack->GetParentAddress()));
231
232 TrackList siblingList;
233 for (TrackRelationMap::const_iterator relIter = range.first; relIter != range.second; ++relIter)
234 {
235 UidToTrackMap::const_iterator siblingIter = m_uidToTrackMap.find(relIter->second);
236
237 if ((m_uidToTrackMap.end() != siblingIter) && (siblingList.end() == std::find(siblingList.begin(), siblingList.end(), siblingIter->second)))
238 siblingList.push_back(siblingIter->second);
239 }
240 siblingList.sort(PointerLessThan<Track>());
241
242 for (const Track *const pSiblingTrack : siblingList)
243 {
244 const StatusCode firstStatusCode(this->Modifiable(pTrack)->AddSibling(pSiblingTrack));
245 const StatusCode secondStatusCode(this->Modifiable(pSiblingTrack)->AddSibling(pTrack));
246
247 if (firstStatusCode != secondStatusCode)
248 return STATUS_CODE_FAILURE;
249
250 if ((firstStatusCode != STATUS_CODE_SUCCESS) && (firstStatusCode != STATUS_CODE_ALREADY_PRESENT))
251 return firstStatusCode;
252 }
253 }
254
255 return STATUS_CODE_SUCCESS;
256}
257
258//------------------------------------------------------------------------------------------------------------------------------------------
259
260StatusCode TrackManager::SetAssociatedCluster(const Track *const pTrack, const Cluster *const pCluster) const
261{
262 return this->Modifiable(pTrack)->SetAssociatedCluster(pCluster);
263}
264
265//------------------------------------------------------------------------------------------------------------------------------------------
266
267StatusCode TrackManager::RemoveAssociatedCluster(const Track *const pTrack, const Cluster *const pCluster) const
268{
269 return this->Modifiable(pTrack)->RemoveAssociatedCluster(pCluster);
270}
271
272//------------------------------------------------------------------------------------------------------------------------------------------
273
275{
276 NameToListMap::const_iterator inputIter = m_nameToListMap.find(m_inputListName);
277
278 if (m_nameToListMap.end() == inputIter)
279 return STATUS_CODE_FAILURE;
280
281 return this->RemoveClusterAssociations(*(inputIter->second));
282}
283
284//------------------------------------------------------------------------------------------------------------------------------------------
285
287{
288 NameToListMap::const_iterator listIter = m_nameToListMap.find(m_currentListName);
289
290 if (m_nameToListMap.end() == listIter)
291 return STATUS_CODE_FAILURE;
292
293 for (const Track *const pTrack : *listIter->second)
294 {
295 if (!pTrack->HasAssociatedCluster())
296 continue;
297
298 if (!danglingClusters.insert(TrackToClusterMap::value_type(pTrack, pTrack->GetAssociatedCluster())).second)
299 return STATUS_CODE_FAILURE;
300
301 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->RemoveAssociatedCluster(pTrack, pTrack->GetAssociatedCluster()));
302 }
303
304 return STATUS_CODE_SUCCESS;
305}
306
307//------------------------------------------------------------------------------------------------------------------------------------------
308
310{
311 for (const Track *const pTrack : trackList)
312 {
313 if (pTrack->HasAssociatedCluster())
314 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->RemoveAssociatedCluster(pTrack, pTrack->GetAssociatedCluster()));
315 }
316
317 return STATUS_CODE_SUCCESS;
318}
319
320//------------------------------------------------------------------------------------------------------------------------------------------
321
322StatusCode TrackManager::InitializeReclustering(const Algorithm *const pAlgorithm, const TrackList &trackList, const std::string &/*originalReclusterListName*/)
323{
324 std::string temporaryListName;
325 return this->CreateTemporaryListAndSetCurrent(pAlgorithm, trackList, temporaryListName);
326}
327
328} // namespace pandora
Header file for the object factory class.
Header file defining relevant internal typedefs, sort and string conversion functions.
#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.
Header file for the track manager class.
Algorithm class. Algorithm addresses are held only by the algorithm manager. They have a fully define...
Definition Algorithm.h:21
Cluster class.
Definition Cluster.h:31
InputObjectManager class.
virtual StatusCode CreateTemporaryListAndSetCurrent(const Algorithm *const pAlgorithm, const ObjectList &objectList, std::string &temporaryListName)
Change the current list to a specified temporary list.
virtual StatusCode CreateInitialLists()
Create initial lists.
virtual StatusCode EraseAllContent()
Erase all manager content.
const std::string m_inputListName
The name of the input list.
std::string m_currentListName
The name of the current list.
Definition Manager.h:181
virtual T * Modifiable(const T *const pT) const
Access a modifiable object, when provided with address to const object.
Definition Manager.cc:288
NameToListMap m_nameToListMap
The name to list map.
Definition Manager.h:178
virtual StatusCode GetList(const std::string &listName, const ObjectList *&pObjectList) const
Get a list.
Definition Manager.cc:34
ObjectFactory class responsible for extended pandora object creation.
virtual StatusCode Create(const Parameters &parameters, const Object *&pObject) const =0
Create an object with the given parameters.
Pandora class.
Definition Pandora.h:40
Enable ordering of pointers based on properties of target objects.
StatusCodeException class.
std::string ToString() const
Get status code as a string.
StatusCode GetStatusCode() const
Get status code.
Track class.
Definition Track.h:26
bool IsAvailable() const
Whether the track is available to be added to a particle flow object.
Definition Track.h:442
const void * GetParentAddress() const
Get the address of the parent track in the user framework.
Definition Track.h:414
StatusCode AssociateTracks() const
Apply track associations (parent-daughter and sibling) that have been registered with the track manag...
StatusCode RemoveClusterAssociations(const TrackList &trackList) const
Remove track to cluster associations from a specified list of tracks.
StatusCode SetTrackParentDaughterRelationship(const Uid parentUid, const Uid daughterUid)
Set a track parent-daughter relationship.
StatusCode RemoveAllMCParticleRelationships()
Remove all mc particle associations that have been registered with tracks.
StatusCode SetAssociatedCluster(const Track *const pTrack, const Cluster *const pCluster) const
Set the cluster associated with a track.
StatusCode RemoveAssociatedCluster(const Track *const pTrack, const Cluster *const pCluster) const
Remove the association of a track with a cluster.
TrackRelationMap m_parentDaughterRelationMap
The track parent-daughter relation map.
StatusCode AddParentDaughterAssociations() const
Add parent-daughter associations to tracks.
StatusCode EraseAllContent()
Erase all track manager content.
UidToTrackMap m_uidToTrackMap
The uid to track map.
StatusCode RemoveAllClusterAssociations() const
Remove all track to cluster associations.
StatusCode SetTrackSiblingRelationship(const Uid firstSiblingUid, const Uid secondSiblingUid)
Set a track sibling relationship.
StatusCode AddSiblingAssociations() const
Add sibling associations to tracks.
StatusCode RemoveCurrentClusterAssociations(TrackToClusterMap &danglingClusters) const
Remove track to cluster associations from all tracks in the current list.
TrackRelationMap m_siblingRelationMap
The track sibling relation map.
StatusCode Create(const object_creation::Track::Parameters &parameters, const Track *&pTrack, const ObjectFactory< object_creation::Track::Parameters, object_creation::Track::Object > &factory)
Create track.
StatusCode MatchTracksToMCPfoTargets(const UidToMCParticleWeightMap &trackToPfoTargetsMap)
Match tracks to their correct mc particles for particle flow.
void SetAvailability(const T *const pT, bool isAvailable) const
Set availability of a track, or a list of tracks, to be added to a particle flow object.
bool IsAvailable(const T *const pT) const
Is a track, or a list of tracks, available to add to a particle flow object.
TrackManager(const Pandora *const pPandora)
Constructor.
StatusCode InitializeReclustering(const Algorithm *const pAlgorithm, const TrackList &trackList, const std::string &originalReclusterListName)
Initialize reclustering operations, preparing lists and metadata accordingly.
~TrackManager()
Destructor.
const void * Uid
MANAGED_CONTAINER< const Track * > TrackList
std::unordered_map< const Track *, const Cluster * > TrackToClusterMap
StatusCode
The StatusCode enum.
std::unordered_map< Uid, MCParticleWeightMap > UidToMCParticleWeightMap