9 #include "Pandora/AlgorithmHeaders.h" 18 CheatingClusterCreationAlgorithm::CheatingClusterCreationAlgorithm() : m_collapseToPrimaryMCParticles(false)
30 return STATUS_CODE_SUCCESS;
41 const MCParticleList *pMCParticleList(
nullptr);
42 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetList(*
this,
m_mcParticleListName, pMCParticleList));
47 const CaloHitList *pCaloHitList(
nullptr);
48 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetCurrentList(*
this, pCaloHitList));
50 for (
const CaloHit *
const pCaloHit : *pCaloHitList)
54 if (!PandoraContentApi::IsAvailable(*
this, pCaloHit))
59 catch (
const StatusCodeException &)
70 const MCParticle *pMCParticle(MCParticleHelper::GetMainMCParticle(pCaloHit));
79 if (mcPrimaryMap.end() == primaryIter)
80 throw StatusCodeException(STATUS_CODE_NOT_FOUND);
82 pMCParticle = primaryIter->second;
85 mcParticleToHitListMap[pMCParticle].push_back(pCaloHit);
97 if (pMCParticle->GetParticleId() == particleId)
109 for (
const auto &mapEntry : mcParticleToHitListMap)
110 mcParticleVector.push_back(mapEntry.first);
113 for (
const MCParticle *
const pMCParticle : mcParticleVector)
115 const CaloHitList &caloHitList(mcParticleToHitListMap.at(pMCParticle));
117 if (caloHitList.empty())
120 const Cluster *pCluster(
nullptr);
121 PandoraContentApi::Cluster::Parameters parameters;
122 parameters.m_caloHitList = caloHitList;
123 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Cluster::Create(*
this, parameters, pCluster));
125 PandoraContentApi::Cluster::Metadata
metadata;
127 switch (pMCParticle->GetParticleId())
134 metadata.m_particleId = pMCParticle->GetParticleId();
140 if (metadata.m_particleId.IsInitialized())
141 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Cluster::AlterMetadata(*
this, pCluster, metadata));
149 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
154 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle,
"MCParticleListName",
m_mcParticleListName));
157 PANDORA_RETURN_RESULT_IF_AND_IF(
158 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadVectorOfValues(xmlHandle,
"ParticleIdList",
m_particleIdList));
160 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.
std::vector< art::Ptr< simb::MCParticle > > MCParticleVector
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.
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