53 inputIter->second->push_back(pTrack);
54 return STATUS_CODE_SUCCESS;
58 std::cout <<
"Failed to create track: " << statusCodeException.
ToString() << std::endl;
76 bool isAvailable(
true);
78 for (
const Track *
const pTrack : *pTrackList)
89 this->
Modifiable(pTrack)->SetAvailability(isAvailable);
95 for (
const Track *
const pTrack : *pTrackList)
114 if (trackToPfoTargetsMap.empty())
115 return STATUS_CODE_SUCCESS;
120 return STATUS_CODE_FAILURE;
122 for (
const Track *
const pTrack : *inputIter->second)
124 UidToMCParticleWeightMap::const_iterator pfoTargetIter = trackToPfoTargetsMap.find(pTrack->GetParentAddress());
126 if (trackToPfoTargetsMap.end() == pfoTargetIter)
129 this->
Modifiable(pTrack)->SetMCParticleWeightMap(pfoTargetIter->second);
132 return STATUS_CODE_SUCCESS;
142 return STATUS_CODE_FAILURE;
144 for (
const Track *
const pTrack : *inputIter->second)
145 this->
Modifiable(pTrack)->RemoveMCParticles();
147 return STATUS_CODE_SUCCESS;
156 return STATUS_CODE_SUCCESS;
165 return STATUS_CODE_SUCCESS;
175 return STATUS_CODE_SUCCESS;
183 return STATUS_CODE_SUCCESS;
188 for (
const Track *
const pParentTrack : *pInputList)
193 for (TrackRelationMap::const_iterator relIter = range.first; relIter != range.second; ++relIter)
195 UidToTrackMap::const_iterator daughterIter =
m_uidToTrackMap.find(relIter->second);
197 if ((
m_uidToTrackMap.end() != daughterIter) && (daughterList.end() == std::find(daughterList.begin(), daughterList.end(), daughterIter->second)))
198 daughterList.push_back(daughterIter->second);
202 for (
const Track *
const pDaughterTrack : daughterList)
207 if (firstStatusCode != secondStatusCode)
208 return STATUS_CODE_FAILURE;
210 if ((firstStatusCode != STATUS_CODE_SUCCESS) && (firstStatusCode != STATUS_CODE_ALREADY_PRESENT))
211 return firstStatusCode;
215 return STATUS_CODE_SUCCESS;
223 return STATUS_CODE_SUCCESS;
228 for (
const Track *
const pTrack : *pInputList)
233 for (TrackRelationMap::const_iterator relIter = range.first; relIter != range.second; ++relIter)
235 UidToTrackMap::const_iterator siblingIter =
m_uidToTrackMap.find(relIter->second);
237 if ((
m_uidToTrackMap.end() != siblingIter) && (siblingList.end() == std::find(siblingList.begin(), siblingList.end(), siblingIter->second)))
238 siblingList.push_back(siblingIter->second);
242 for (
const Track *
const pSiblingTrack : siblingList)
247 if (firstStatusCode != secondStatusCode)
248 return STATUS_CODE_FAILURE;
250 if ((firstStatusCode != STATUS_CODE_SUCCESS) && (firstStatusCode != STATUS_CODE_ALREADY_PRESENT))
251 return firstStatusCode;
255 return STATUS_CODE_SUCCESS;
262 return this->
Modifiable(pTrack)->SetAssociatedCluster(pCluster);
269 return this->
Modifiable(pTrack)->RemoveAssociatedCluster(pCluster);
279 return STATUS_CODE_FAILURE;
291 return STATUS_CODE_FAILURE;
293 for (
const Track *
const pTrack : *listIter->second)
295 if (!pTrack->HasAssociatedCluster())
298 if (!danglingClusters.insert(TrackToClusterMap::value_type(pTrack, pTrack->GetAssociatedCluster())).second)
299 return STATUS_CODE_FAILURE;
304 return STATUS_CODE_SUCCESS;
311 for (
const Track *
const pTrack : trackList)
313 if (pTrack->HasAssociatedCluster())
317 return STATUS_CODE_SUCCESS;
324 std::string temporaryListName;
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)
#define PANDORA_RETURN_RESULT_IF(StatusCode1, Operator, Command)
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...
std::string m_currentListName
The name of the current list.
virtual T * Modifiable(const T *const pT) const
Access a modifiable object, when provided with address to const object.
NameToListMap m_nameToListMap
The name to list map.
virtual StatusCode GetList(const std::string &listName, const ObjectList *&pObjectList) const
Get a list.
ObjectFactory class responsible for extended pandora object creation.
virtual StatusCode Create(const Parameters ¶meters, const Object *&pObject) const =0
Create an object with the given parameters.
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.
bool IsAvailable() const
Whether the track is available to be added to a particle flow object.
const void * GetParentAddress() const
Get the address of the parent track in the user framework.
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 ¶meters, 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.
MANAGED_CONTAINER< const Track * > TrackList
std::unordered_map< const Track *, const Cluster * > TrackToClusterMap
StatusCode
The StatusCode enum.
std::unordered_map< Uid, MCParticleWeightMap > UidToMCParticleWeightMap