26 m_selectedListName(
"Selected")
43 pMCParticle =
nullptr;
57 inputIter->second->push_back(pMCParticle);
58 return STATUS_CODE_SUCCESS;
62 std::cout <<
"Failed to create mc particle: " << statusCodeException.
ToString() << std::endl;
64 pMCParticle =
nullptr;
87 return STATUS_CODE_SUCCESS;
97 return STATUS_CODE_FAILURE;
99 for (
const MCParticle *
const pMCParticle : *inputIter->second)
103 if (pMCParticle->IsRootParticle())
107 return STATUS_CODE_SUCCESS;
118 return STATUS_CODE_FAILURE;
124 ObjectList *
const pObjectList(selectedIter->second);
134 for (
const MCParticle *
const pMCParticle : *inputIter->second)
136 const bool isPfoTarget(pMCParticle->IsPfoTarget());
138 if (!isPfoTarget && shouldCollapseMCParticlesToPfoTarget)
143 if (isPfoTarget || !shouldCollapseMCParticlesToPfoTarget)
145 selectedMCPfoList.push_back(pMCParticle);
153 return STATUS_CODE_SUCCESS;
167 if (!mcPfoSet.count(pMCParticle) &&
171 !((particleId == PROTON || particleId ==
NEUTRON) && (pMCParticle->
GetEnergy() < selectionEnergyCutOffProtonsNeutrons)))
174 mcPfoSet.insert(pMCParticle);
184 return STATUS_CODE_SUCCESS;
192 return STATUS_CODE_SUCCESS;
209 return STATUS_CODE_SUCCESS;
217 return STATUS_CODE_SUCCESS;
222 for (
const MCParticle *
const pParentMCParticle : *pInputList)
227 for (MCParticleRelationMap::const_iterator relIter = range.first; relIter != range.second; ++relIter)
231 if ((
m_uidToMCParticleMap.end() != daughterIter) && (daughterList.end() == std::find(daughterList.begin(), daughterList.end(), daughterIter->second)))
232 daughterList.push_back(daughterIter->second);
236 for (
const MCParticle *
const pDaughterMCParticle : daughterList)
238 const StatusCode firstStatusCode(this->
Modifiable(pParentMCParticle)->AddDaughter(pDaughterMCParticle));
239 const StatusCode secondStatusCode(this->
Modifiable(pDaughterMCParticle)->AddParent(pParentMCParticle));
241 if (firstStatusCode != secondStatusCode)
242 return STATUS_CODE_FAILURE;
244 if ((firstStatusCode != STATUS_CODE_SUCCESS) && (firstStatusCode != STATUS_CODE_ALREADY_PRESENT))
245 return firstStatusCode;
249 return STATUS_CODE_SUCCESS;
259 return STATUS_CODE_FAILURE;
261 for (
const MCParticle *
const pMCParticle : *inputIter->second)
269 return STATUS_CODE_SUCCESS;
278 for (
const MCParticle *
const pParentMCParticle : parentList)
286 for (
const MCParticle *
const pDaughterMCParticle : daughterList)
292 return this->
Modifiable(pMCParticle)->RemovePfoTarget();
301 ObjectRelationMap::iterator iter = objectRelationMap.find(objectUid);
303 if (objectRelationMap.end() != iter)
307 if (useSingleMCParticleAssociation && (mcParticleWeight < uidToWeightMap.begin()->second))
308 return STATUS_CODE_SUCCESS;
310 if (useSingleMCParticleAssociation)
311 uidToWeightMap.clear();
313 uidToWeightMap[mcParticleUid] += mcParticleWeight;
319 if (!uidToWeightMap.insert(UidToWeightMap::value_type(mcParticleUid, mcParticleWeight)).second)
320 return STATUS_CODE_FAILURE;
322 if (!objectRelationMap.insert(ObjectRelationMap::value_type(objectUid, uidToWeightMap)).second)
323 return STATUS_CODE_FAILURE;
326 return STATUS_CODE_SUCCESS;
334 return STATUS_CODE_SUCCESS;
338 for (
const ObjectRelationMap::value_type &relationEntry : objectRelationMap)
342 for (
const UidToWeightMap::value_type &weightEntry : relationEntry.second)
344 UidToMCParticleMap::const_iterator mcParticleIter =
m_uidToMCParticleMap.find(weightEntry.first);
347 mcParticleSet.insert(mcParticleIter->second);
350 if (mcParticleSet.empty())
353 MCParticleList mcParticleList(mcParticleSet.begin(), mcParticleSet.end());
357 for (
const MCParticle *
const pMCParticle : mcParticleList)
359 const float mcParticleWeight(relationEntry.second.at(pMCParticle->GetUid()));
360 const MCParticle *
const pTargetMCParticle(!collapseToPfoTarget ? pMCParticle : pMCParticle->m_pPfoTarget);
362 if (!pTargetMCParticle)
365 mcParticleWeightMap[pTargetMCParticle] += mcParticleWeight;
369 return STATUS_CODE_SUCCESS;
Header file for the mc particle manager class.
Header file for the mc particle class.
Header file for the object factory class.
Header file for the pandora class.
Header file defining relevant internal typedefs, sort and string conversion functions.
Header file for the pandora settings class.
#define PANDORA_THROW_RESULT_IF(StatusCode1, Operator, Command)
#define PANDORA_RETURN_RESULT_IF(StatusCode1, Operator, Command)
float GetMagnitude() const
Get the magnitude.
StatusCode SetPfoTargetInTree(const MCParticle *const pMCParticle, const MCParticle *const pPfoTarget, bool onlyDaughters=false) const
Set pfo target for a mc tree.
StatusCode RemoveMCParticleRelationships(const MCParticle *const pMCParticle) const
Remove all parent/daughter particle links from a mc particle and from its (previously) linked particl...
StatusCode SetMCParentDaughterRelationship(const Uid parentUid, const Uid daughterUid)
Set mc particle relationship.
StatusCode Create(const object_creation::MCParticle::Parameters ¶meters, const MCParticle *&pMCParticle, const ObjectFactory< object_creation::MCParticle::Parameters, object_creation::MCParticle::Object > &factory)
Create a mc particle.
StatusCode RemoveAllMCParticleRelationships()
Remove all mc particle associations that have been registered with the mc manager.
std::unordered_map< Uid, float > UidToWeightMap
StatusCode CreateUidToPfoTargetsMap(UidToMCParticleWeightMap &uidToMCParticleWeightMap, const ObjectRelationMap &objectRelationMap) const
Create a map relating an object (calo hit or track) uid to mc pfo targets.
MCParticleRelationMap m_parentDaughterRelationMap
The mc particle parent-daughter relation map.
ObjectRelationMap m_caloHitToMCParticleMap
The calo hit to mc particle relation map.
StatusCode SelectPfoTargets()
Select pfo targets.
MCManager(const Pandora *const pPandora)
Constructor.
std::unordered_map< Uid, UidToWeightMap > ObjectRelationMap
StatusCode ApplyPfoSelectionRules(const MCParticle *const mcRootParticle, MCParticleSet &mcPfoSet) const
Apply mc pfo selection rules.
StatusCode IdentifyPfoTargets()
Identify pfo targets.
StatusCode AddMCParticleRelationships() const
Apply mc particle associations (parent-daughter) that have been registered with the mc manager.
UidToMCParticleMap m_uidToMCParticleMap
The uid to mc particle map.
StatusCode EraseAllContent()
Erase all mc manager content.
const std::string m_selectedListName
The name of the selected list.
StatusCode SetUidToMCParticleRelationship(const Uid objectUid, const Uid mcParticleUid, const float mcParticleWeight, ObjectRelationMap &objectRelationMap) const
Set an object (e.g. calo hit or track) to mc particle relationship.
ObjectRelationMap m_trackToMCParticleMap
The track to mc particle relation map.
Uid GetUid() const
Get the mc particle unique identifier.
float GetEnergy() const
Get energy of mc particle, units GeV.
const MCParticleList & GetDaughterList() const
Get list of daughters of mc particle.
const CartesianVector & GetMomentum() const
Get momentum of mc particle, units GeV.
bool IsPfoTargetSet() const
Whether the pfo target been set.
float GetInnerRadius() const
Get inner radius of mc particle, units mm.
float GetOuterRadius() const
Get outer radius of mc particle, units mm.
const MCParticleList & GetParentList() const
Get list of parents of mc particle.
int GetParticleId() const
Get the PDG code of the mc particle.
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.
const Pandora *const m_pPandora
The associated pandora 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.
const PandoraSettings * GetSettings() const
Get the pandora settings instance.
float GetMCPfoSelectionLowEnergyNeutronProtonCutOff() const
Get the low energy cut-off for selection of protons/neutrons as mc pfos.
bool ShouldCollapseMCParticlesToPfoTarget() const
Whether to collapse mc particle decay chains down to just the pfo target.
bool UseSingleMCParticleAssociation() const
Whether to allow only single mc particle association to objects (largest weight)
float GetMCPfoSelectionMomentum() const
Get the momentum magnitude used to select the pfo target from a mc particle decay chain,...
float GetMCPfoSelectionRadius() const
Get the radius used to select the pfo target from a mc particle decay chain, units mm.
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.
std::unordered_set< const MCParticle * > MCParticleSet
MANAGED_CONTAINER< const MCParticle * > MCParticleList
std::unordered_map< const MCParticle *, float > MCParticleWeightMap
StatusCode
The StatusCode enum.
std::unordered_map< Uid, MCParticleWeightMap > UidToMCParticleWeightMap