9 #include "Pandora/AlgorithmHeaders.h"
21 NeutrinoPropertiesAlgorithm::NeutrinoPropertiesAlgorithm() : m_includeIsolatedHits(
false)
29 const PfoList *pPfoList(
nullptr);
30 PANDORA_THROW_RESULT_IF_AND_IF(
31 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_INITIALIZED, !=, PandoraContentApi::GetList(*
this,
m_neutrinoPfoListName, pPfoList));
33 if (!pPfoList || pPfoList->empty())
35 if (PandoraContentApi::GetSettings(*this)->ShouldDisplayAlgorithmInfo())
38 return STATUS_CODE_SUCCESS;
42 const ParticleFlowObject *
const pNeutrinoPfo((1 == pPfoList->size()) ? *(pPfoList->begin()) :
nullptr);
45 return STATUS_CODE_FAILURE;
48 if (pNeutrinoPfo->GetDaughterPfoList().empty())
50 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Delete(*
this, pNeutrinoPfo,
m_neutrinoPfoListName));
57 return STATUS_CODE_SUCCESS;
64 unsigned int nPrimaryTwoDHits(0);
65 const ParticleFlowObject *pPrimaryDaughter(
nullptr);
67 PfoVector daughterPfoVector(pNeutrinoPfo->GetDaughterPfoList().begin(), pNeutrinoPfo->GetDaughterPfoList().end());
70 for (
const ParticleFlowObject *
const pDaughterPfo : daughterPfoVector)
74 if (!pPrimaryDaughter || (nTwoDHits > nPrimaryTwoDHits))
76 nPrimaryTwoDHits = nTwoDHits;
77 pPrimaryDaughter = pDaughterPfo;
81 if (!pPrimaryDaughter)
82 throw StatusCodeException(STATUS_CODE_FAILURE);
84 PandoraContentApi::ParticleFlowObject::Metadata metadata;
86 if (E_MINUS ==
std::abs(pPrimaryDaughter->GetParticleId()))
88 metadata.m_particleId = NU_E;
90 else if (MU_MINUS ==
std::abs(pPrimaryDaughter->GetParticleId()))
92 metadata.m_particleId = NU_MU;
95 if (metadata.m_particleId.IsInitialized())
97 metadata.m_charge = PdgTable::GetParticleCharge(metadata.m_particleId.Get());
98 metadata.m_mass = PdgTable::GetParticleMass(metadata.m_particleId.Get());
99 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::ParticleFlowObject::AlterMetadata(*
this, pNeutrinoPfo, metadata));
107 unsigned int nTwoDHits(0);
109 for (
const Cluster *
const pCluster : pPfo->GetClusterList())
113 if ((TPC_VIEW_U == hitType) || (TPC_VIEW_V == hitType) || (TPC_VIEW_W == hitType))
115 nTwoDHits += pCluster->GetNCaloHits();
118 nTwoDHits += pCluster->GetNIsolatedCaloHits();
122 for (
const ParticleFlowObject *
const pDaughterPfo : pPfo->GetDaughterPfoList())
134 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle,
"NeutrinoPfoListName",
m_neutrinoPfoListName));
136 PANDORA_RETURN_RESULT_IF_AND_IF(
137 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
"IncludeIsolatedHits",
m_includeIsolatedHits));
139 return STATUS_CODE_SUCCESS;
static bool SortByNHits(const pandora::ParticleFlowObject *const pLhs, const pandora::ParticleFlowObject *const pRhs)
Sort pfos by number of constituent hits.
Header file for the pfo helper class.
bool m_includeIsolatedHits
Whether to include isolated hits when counting 2d hits in pfo chain.
void SetNeutrinoId(const pandora::ParticleFlowObject *const pNeutrinoPfo) const
identifying the primary daughter of a neutrino pfo and set the particle id accordingly ...
static pandora::HitType GetClusterHitType(const pandora::Cluster *const pCluster)
Get the hit type associated with a two dimensional cluster.
std::string m_neutrinoPfoListName
The name of the output neutrino pfo list.
Header file for the cluster helper class.
unsigned int GetNTwoDHitsInPfoChain(const pandora::ParticleFlowObject *const pPfo) const
Get the number of two dimensional hits (TPC_VIEW_U, V or W) contained in clusters in a pfo and all it...
Header file for the neutrino properties algorithm class.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
static bool IsNeutrino(const pandora::ParticleFlowObject *const pPfo)
Whether a pfo is a neutrino or (antineutrino)
required by fuzzyCluster table::sbnd_g4_services gaushitTruthMatch pandora
pandora::StatusCode Run()
BEGIN_PROLOG could also be cout