9 #include "Pandora/AlgorithmHeaders.h" 18 CheatingClusterCreationAlgorithm::CheatingClusterCreationAlgorithm() :
19 m_collapseToPrimaryMCParticles(false)
31 return STATUS_CODE_SUCCESS;
42 const MCParticleList *pMCParticleList(
nullptr);
43 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetList(*
this,
m_mcParticleListName, pMCParticleList));
48 const CaloHitList *pCaloHitList(
nullptr);
49 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetCurrentList(*
this, pCaloHitList));
51 for (
const CaloHit *
const pCaloHit : *pCaloHitList)
55 if (!PandoraContentApi::IsAvailable(*
this, pCaloHit))
60 catch (
const StatusCodeException &)
71 const MCParticle *pMCParticle(MCParticleHelper::GetMainMCParticle(pCaloHit));
80 if (mcPrimaryMap.end() == primaryIter)
81 throw StatusCodeException(STATUS_CODE_NOT_FOUND);
83 pMCParticle = primaryIter->second;
86 mcParticleToHitListMap[pMCParticle].push_back(pCaloHit);
98 if (pMCParticle->GetParticleId() == particleId)
110 for (
const auto &mapEntry : mcParticleToHitListMap)
111 mcParticleVector.push_back(mapEntry.first);
114 for (
const MCParticle *
const pMCParticle : mcParticleVector)
116 const CaloHitList &caloHitList(mcParticleToHitListMap.at(pMCParticle));
118 if (caloHitList.empty())
121 const Cluster *pCluster(
nullptr);
122 PandoraContentApi::Cluster::Parameters parameters;
123 parameters.m_caloHitList = caloHitList;
124 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Cluster::Create(*
this, parameters, pCluster));
126 PandoraContentApi::Cluster::Metadata metadata;
128 switch (pMCParticle->GetParticleId())
135 metadata.m_particleId = pMCParticle->GetParticleId();
141 if (metadata.m_particleId.IsInitialized())
142 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Cluster::AlterMetadata(*
this, pCluster, metadata));
150 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
155 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle,
"MCParticleListName",
m_mcParticleListName));
158 PANDORA_RETURN_RESULT_IF_AND_IF(
159 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadVectorOfValues(xmlHandle,
"ParticleIdList",
m_particleIdList));
161 return STATUS_CODE_SUCCESS;
pandora::IntVector m_particleIdList
list of particle ids of MCPFOs to be selected
void GetMCParticleToHitListMap(MCParticleToHitListMap &mcParticleToHitListMap) const
Create map between each (primary) MC particle and associated calo hits.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
std::string m_mcParticleListName
The mc particle list name, required if want to collapse mc particle hierarchy.
void SimpleMCParticleCollection(const pandora::CaloHit *const pCaloHit, const LArMCParticleHelper::MCRelationMap &mcPrimaryMap, MCParticleToHitListMap &mcParticleToHitListMap) const
Simple mc particle collection, using main mc particle associated with each calo hit.
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...
bool SelectMCParticlesForClustering(const pandora::MCParticle *const pMCParticle) const
Check whether mc particle is of a type specified for inclusion in cheated clustering.
static bool SortByMomentum(const pandora::MCParticle *const pLhs, const pandora::MCParticle *const pRhs)
Sort mc particles by their momentum.
Header file for the cheating cluster creation algorithm class.
bool m_collapseToPrimaryMCParticles
Whether to collapse mc particle hierarchies to primary particles.
std::vector< art::Ptr< simb::MCParticle > > MCParticleVector
pandora::StatusCode Run()
std::unordered_map< const pandora::MCParticle *, pandora::CaloHitList > MCParticleToHitListMap
void CreateClusters(const MCParticleToHitListMap &mcParticleToHitListMap) const
Create clusters based on information in the mc particle to hit list map.
std::unordered_map< const pandora::MCParticle *, const pandora::MCParticle * > MCRelationMap