Pandora
Pandora source code navigator
Loading...
Searching...
No Matches
NeutrinoPropertiesAlgorithm.cc
Go to the documentation of this file.
1
10
13
15
16using namespace pandora;
17
18namespace lar_content
19{
20
22{
23}
24
25//------------------------------------------------------------------------------------------------------------------------------------------
26
28{
29 const PfoList *pPfoList(nullptr);
31 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_INITIALIZED, !=, PandoraContentApi::GetList(*this, m_neutrinoPfoListName, pPfoList));
32
33 if (!pPfoList || pPfoList->empty())
34 {
36 std::cout << "NeutrinoPropertiesAlgorithm: unable to find pfo list " << m_neutrinoPfoListName << std::endl;
37
38 return STATUS_CODE_SUCCESS;
39 }
40
41 // ATTN Enforces that only one pfo, of neutrino-type, be in the specified input list
42 const ParticleFlowObject *const pNeutrinoPfo((1 == pPfoList->size()) ? *(pPfoList->begin()) : nullptr);
43
44 if (!pNeutrinoPfo || !LArPfoHelper::IsNeutrino(pNeutrinoPfo))
45 return STATUS_CODE_FAILURE;
46
47 // ATTN At this (maybe unconventional) stage, remove any lone, placeholder neutrinos, with no daughter particles
48 if (pNeutrinoPfo->GetDaughterPfoList().empty())
49 {
50 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Delete(*this, pNeutrinoPfo, m_neutrinoPfoListName));
51 }
52 else
53 {
54 this->SetNeutrinoId(pNeutrinoPfo);
55 }
56
57 return STATUS_CODE_SUCCESS;
58}
59
60//------------------------------------------------------------------------------------------------------------------------------------------
61
63{
64 unsigned int nPrimaryTwoDHits(0);
65 const ParticleFlowObject *pPrimaryDaughter(nullptr);
66
67 PfoVector daughterPfoVector(pNeutrinoPfo->GetDaughterPfoList().begin(), pNeutrinoPfo->GetDaughterPfoList().end());
68 std::sort(daughterPfoVector.begin(), daughterPfoVector.end(), LArPfoHelper::SortByNHits);
69
70 for (const ParticleFlowObject *const pDaughterPfo : daughterPfoVector)
71 {
72 const unsigned int nTwoDHits(this->GetNTwoDHitsInPfoChain(pDaughterPfo));
73
74 if (!pPrimaryDaughter || (nTwoDHits > nPrimaryTwoDHits))
75 {
76 nPrimaryTwoDHits = nTwoDHits;
77 pPrimaryDaughter = pDaughterPfo;
78 }
79 }
80
81 if (!pPrimaryDaughter)
82 throw StatusCodeException(STATUS_CODE_FAILURE);
83
84 PandoraContentApi::ParticleFlowObject::Metadata metadata;
85
86 if (E_MINUS == std::abs(pPrimaryDaughter->GetParticleId()))
87 {
88 metadata.m_particleId = NU_E;
89 }
90 else if (MU_MINUS == std::abs(pPrimaryDaughter->GetParticleId()))
91 {
92 metadata.m_particleId = NU_MU;
93 }
94
95 if (metadata.m_particleId.IsInitialized())
96 {
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));
100 }
101}
102
103//------------------------------------------------------------------------------------------------------------------------------------------
104
106{
107 unsigned int nTwoDHits(0);
108
109 for (const Cluster *const pCluster : pPfo->GetClusterList())
110 {
111 const HitType hitType(LArClusterHelper::GetClusterHitType(pCluster));
112
113 if ((TPC_VIEW_U == hitType) || (TPC_VIEW_V == hitType) || (TPC_VIEW_W == hitType))
114 {
115 nTwoDHits += pCluster->GetNCaloHits();
116
118 nTwoDHits += pCluster->GetNIsolatedCaloHits();
119 }
120 }
121
122 for (const ParticleFlowObject *const pDaughterPfo : pPfo->GetDaughterPfoList())
123 {
124 nTwoDHits += this->GetNTwoDHitsInPfoChain(pDaughterPfo);
125 }
126
127 return nTwoDHits;
128}
129
130//------------------------------------------------------------------------------------------------------------------------------------------
131
133{
134 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "NeutrinoPfoListName", m_neutrinoPfoListName));
135
137 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "IncludeIsolatedHits", m_includeIsolatedHits));
138
139 return STATUS_CODE_SUCCESS;
140}
141
142} // namespace lar_content
Grouping of header files for many classes of use in particle flow algorithms.
Header file for the cluster helper class.
Header file for the pfo helper class.
Header file for the neutrino properties algorithm class.
#define PANDORA_THROW_RESULT_IF_AND_IF(StatusCode1, StatusCode2, Operator, Command)
Definition StatusCodes.h:55
#define PANDORA_THROW_RESULT_IF(StatusCode1, Operator, Command)
Definition StatusCodes.h:43
#define PANDORA_RETURN_RESULT_IF_AND_IF(StatusCode1, StatusCode2, Operator, Command)
Definition StatusCodes.h:31
#define PANDORA_RETURN_RESULT_IF(StatusCode1, Operator, Command)
Definition StatusCodes.h:19
static pandora::StatusCode Delete(const pandora::Algorithm &algorithm, const T *const pT)
Delete an object from the current list.
static pandora::StatusCode GetList(const pandora::Algorithm &algorithm, const std::string &listName, const T *&pT)
Get a named list.
static const pandora::PandoraSettings * GetSettings(const pandora::Algorithm &algorithm)
Get the pandora settings instance.
static pandora::HitType GetClusterHitType(const pandora::Cluster *const pCluster)
Get the hit type associated with a two dimensional cluster.
static bool IsNeutrino(const pandora::ParticleFlowObject *const pPfo)
Whether a pfo is a neutrino or (antineutrino)
static bool SortByNHits(const pandora::ParticleFlowObject *const pLhs, const pandora::ParticleFlowObject *const pRhs)
Sort pfos by number of constituent hits.
bool m_includeIsolatedHits
Whether to include isolated hits when counting 2d hits in pfo chain.
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...
void SetNeutrinoId(const pandora::ParticleFlowObject *const pNeutrinoPfo) const
identifying the primary daughter of a neutrino pfo and set the particle id accordingly
std::string m_neutrinoPfoListName
The name of the output neutrino pfo list.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
Read the algorithm settings.
pandora::StatusCode Run()
Run the algorithm.
Cluster class.
Definition Cluster.h:31
bool ShouldDisplayAlgorithmInfo() const
Whether to display algorithm information during processing.
ParticleFlowObject class.
const PfoList & GetDaughterPfoList() const
Get the daughter pfo list.
const ClusterList & GetClusterList() const
Get the cluster list.
StatusCode AlterMetadata(const object_creation::ParticleFlowObject::Metadata &metadata)
Alter particle flow object metadata parameters.
int GetParticleId() const
Get the particle flow object id (PDG code)
static float GetParticleMass(const int pdgCode)
Get the mass of a particle type.
Definition PdgTable.h:205
static int GetParticleCharge(const int pdgCode)
Get the charge of a particle type.
Definition PdgTable.h:227
StatusCodeException class.
static StatusCode ReadValue(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, T &t)
Read a value from an xml element.
Definition XmlHelper.h:136
HitType
Calorimeter hit type enum.
std::vector< const ParticleFlowObject * > PfoVector
StatusCode
The StatusCode enum.
MANAGED_CONTAINER< const ParticleFlowObject * > PfoList