Pandora
Pandora source code navigator
Loading...
Searching...
No Matches
CheatingNeutrinoCreationAlgorithm.cc
Go to the documentation of this file.
1
10
13
15
16using namespace pandora;
17
18namespace lar_content
19{
20
21CheatingNeutrinoCreationAlgorithm::CheatingNeutrinoCreationAlgorithm() : m_collapseToPrimaryMCParticles(false), m_vertexTolerance(0.5f)
22{
23}
24
25//------------------------------------------------------------------------------------------------------------------------------------------
26
28{
29 MCParticleVector mcNeutrinoVector;
30 this->GetMCNeutrinoVector(mcNeutrinoVector);
31
32 for (const MCParticle *const pMCNeutrino : mcNeutrinoVector)
33 {
34 const ParticleFlowObject *pNeutrinoPfo(nullptr);
35 this->CreateAndSaveNeutrinoPfo(pMCNeutrino, pNeutrinoPfo);
36
37 if (!pNeutrinoPfo)
38 return STATUS_CODE_FAILURE;
39
40 this->AddNeutrinoVertex(pMCNeutrino, pNeutrinoPfo);
41
42 MCParticleToPfoMap mcParticleToPfoMap;
43 this->GetMCParticleToDaughterPfoMap(mcParticleToPfoMap);
44 this->CreatePfoHierarchy(pMCNeutrino, pNeutrinoPfo, mcParticleToPfoMap);
45 }
46
47 return STATUS_CODE_SUCCESS;
48}
49
50//------------------------------------------------------------------------------------------------------------------------------------------
51
53{
54 const MCParticleList *pMCParticleList(nullptr);
55 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetList(*this, m_mcParticleListName, pMCParticleList));
56
57 MCParticleVector allMCNeutrinoVector;
58 LArMCParticleHelper::GetTrueNeutrinos(pMCParticleList, allMCNeutrinoVector);
59
60 for (const MCParticle *const pMCNeutrino : allMCNeutrinoVector)
61 {
62 if (LArMCParticleHelper::IsNeutrino(pMCNeutrino) && (MC_3D == pMCNeutrino->GetMCParticleType()))
63 mcNeutrinoVector.push_back(pMCNeutrino);
64 }
65}
66
67//------------------------------------------------------------------------------------------------------------------------------------------
68
69void CheatingNeutrinoCreationAlgorithm::CreateAndSaveNeutrinoPfo(const MCParticle *const pMCNeutrino, const ParticleFlowObject *&pNeutrinoPfo) const
70{
71 pNeutrinoPfo = nullptr;
72
73 PandoraContentApi::ParticleFlowObject::Parameters pfoParameters;
74 pfoParameters.m_particleId = pMCNeutrino->GetParticleId();
75 pfoParameters.m_charge = PdgTable::GetParticleCharge(pfoParameters.m_particleId.Get());
76 pfoParameters.m_mass = PdgTable::GetParticleMass(pfoParameters.m_particleId.Get());
77 pfoParameters.m_energy = pMCNeutrino->GetEnergy();
78 pfoParameters.m_momentum = pMCNeutrino->GetMomentum();
79
80 std::string neutrinoPfoListName;
81 const PfoList *pNeutrinoPfoList(nullptr);
82 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::CreateTemporaryListAndSetCurrent(*this, pNeutrinoPfoList, neutrinoPfoListName));
83 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::ParticleFlowObject::Create(*this, pfoParameters, pNeutrinoPfo));
84
85 if (!pNeutrinoPfoList || pNeutrinoPfoList->empty())
86 throw StatusCodeException(STATUS_CODE_FAILURE);
87
90}
91
92//------------------------------------------------------------------------------------------------------------------------------------------
93
94void CheatingNeutrinoCreationAlgorithm::AddNeutrinoVertex(const MCParticle *const pMCNeutrino, const ParticleFlowObject *const pNeutrinoPfo) const
95{
96 const VertexList *pVertexList(nullptr);
97 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetCurrentList(*this, pVertexList));
98
99 const Vertex *pNeutrinoVertex(nullptr);
100 float closestVertexDistance(std::numeric_limits<float>::max());
101
102 for (const Vertex *const pVertex : *pVertexList)
103 {
104 const float distance((pVertex->GetPosition() - pMCNeutrino->GetEndpoint()).GetMagnitude());
105
106 if (distance < closestVertexDistance)
107 {
108 pNeutrinoVertex = pVertex;
109 closestVertexDistance = distance;
110 }
111 }
112
113 if (!pNeutrinoVertex || (VERTEX_3D != pNeutrinoVertex->GetVertexType()) ||
114 ((pNeutrinoVertex->GetPosition() - pMCNeutrino->GetEndpoint()).GetMagnitude() > m_vertexTolerance))
115 throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
116
117 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::AddToPfo(*this, pNeutrinoPfo, pNeutrinoVertex));
118}
119
120//------------------------------------------------------------------------------------------------------------------------------------------
121
123{
125
127 {
128 const MCParticleList *pMCParticleList(nullptr);
129 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetList(*this, m_mcParticleListName, pMCParticleList));
130
131 LArMCParticleHelper::GetMCPrimaryMap(pMCParticleList, mcPrimaryMap);
132 }
133
134 for (const std::string &daughterPfoListName : m_daughterPfoListNames)
135 {
136 const PfoList *pDaughterPfoList(nullptr);
137
138 if (STATUS_CODE_SUCCESS != PandoraContentApi::GetList(*this, daughterPfoListName, pDaughterPfoList))
139 {
141 std::cout << "CheatingNeutrinoCreationAlgorithm: pfo list " << daughterPfoListName << " unavailable." << std::endl;
142
143 continue;
144 }
145
146 for (const ParticleFlowObject *const pDaughterPfo : *pDaughterPfoList)
147 {
148 const MCParticle *pMCParticle(LArMCParticleHelper::GetMainMCParticle(pDaughterPfo));
149
151 {
152 LArMCParticleHelper::MCRelationMap::const_iterator primaryIter = mcPrimaryMap.find(pMCParticle);
153
154 if (mcPrimaryMap.end() == primaryIter)
155 throw StatusCodeException(STATUS_CODE_NOT_FOUND);
156
157 pMCParticle = primaryIter->second;
158 }
159
160 if (!mcParticleToPfoMap.insert(MCParticleToPfoMap::value_type(pMCParticle, pDaughterPfo)).second)
161 throw StatusCodeException(STATUS_CODE_OUT_OF_RANGE);
162 }
163 }
164}
165
166//------------------------------------------------------------------------------------------------------------------------------------------
167
169 const ParticleFlowObject *const pParentPfo, const MCParticleToPfoMap &mcParticleToPfoMap) const
170{
171 for (const MCParticle *const pDaughterMCParticle : pParentMCParticle->GetDaughterList())
172 {
173 MCParticleToPfoMap::const_iterator mapIter = mcParticleToPfoMap.find(pDaughterMCParticle);
174
175 if (mcParticleToPfoMap.end() == mapIter)
176 {
177 this->CreatePfoHierarchy(pDaughterMCParticle, pParentPfo, mcParticleToPfoMap);
178 continue;
179 }
180
181 const ParticleFlowObject *const pDaughterPfo(mapIter->second);
182 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::SetPfoParentDaughterRelationship(*this, pParentPfo, pDaughterPfo));
183 this->CreatePfoHierarchy(pDaughterMCParticle, pDaughterPfo, mcParticleToPfoMap);
184 }
185}
186
187//------------------------------------------------------------------------------------------------------------------------------------------
188
190{
191 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
192 XmlHelper::ReadValue(xmlHandle, "CollapseToPrimaryMCParticles", m_collapseToPrimaryMCParticles));
193
194 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "MCParticleListName", m_mcParticleListName));
195
196 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "NeutrinoPfoListName", m_neutrinoPfoListName));
197
198 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "VertexListName", m_vertexListName));
199
200 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadVectorOfValues(xmlHandle, "DaughterPfoListNames", m_daughterPfoListNames));
201
202 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "VertexTolerance", m_vertexTolerance));
203
204 return STATUS_CODE_SUCCESS;
205}
206
207} // namespace lar_content
Grouping of header files for many classes of use in particle flow algorithms.
Header file for the cheating neutrino creation algorithm class.
Header file for the lar monte carlo particle helper helper class.
Header file for the pfo helper class.
#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 ReplaceCurrentList(const pandora::Algorithm &algorithm, const std::string &newListName)
Replace the current list with a pre-saved list; use this new list as a permanent replacement for the ...
static pandora::StatusCode AddToPfo(const pandora::Algorithm &algorithm, const pandora::ParticleFlowObject *const pPfo, const T *const pT)
Add a cluster to a particle flow object.
static pandora::StatusCode CreateTemporaryListAndSetCurrent(const pandora::Algorithm &algorithm, const T *&pT, std::string &temporaryListName)
Create a temporary list and set it to be the current list, enabling object creation.
static pandora::StatusCode GetCurrentList(const pandora::Algorithm &algorithm, const T *&pT)
Get the current list.
static pandora::StatusCode SetPfoParentDaughterRelationship(const pandora::Algorithm &algorithm, const pandora::ParticleFlowObject *const pParentPfo, const pandora::ParticleFlowObject *const pDaughterPfo)
Set parent-daughter particle flow object relationship.
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.
pandora::StringVector m_daughterPfoListNames
The list of daughter pfo list names.
std::string m_mcParticleListName
The name of the three d mc particle list name.
void GetMCParticleToDaughterPfoMap(MCParticleToPfoMap &mcParticleToPfoMap) const
Extract candidate daughter pfos from external lists and populate a map from main mc particle (or prim...
void CreatePfoHierarchy(const pandora::MCParticle *const pParentMCParticle, const pandora::ParticleFlowObject *const pParentPfo, const MCParticleToPfoMap &mcParticleToPfoMap) const
Use information from mc particles and the mc particle to pfo map to fully-reconstruct the daughter pf...
void AddNeutrinoVertex(const pandora::MCParticle *const pMCNeutrino, const pandora::ParticleFlowObject *const pNeutrinoPfo) const
Extract reconstructed vertex from external list, check its position agrees with mc neutrino,...
void GetMCNeutrinoVector(pandora::MCParticleVector &mcNeutrinoVector) const
Get the mc neutrino vector.
std::string m_vertexListName
The name of the neutrino vertex list.
std::string m_neutrinoPfoListName
The name of the neutrino pfo list.
bool m_collapseToPrimaryMCParticles
Whether to collapse mc particle hierarchies to primary particles.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
Read the algorithm settings.
void CreateAndSaveNeutrinoPfo(const pandora::MCParticle *const pMCNeutrino, const pandora::ParticleFlowObject *&pNeutrinoPfo) const
Create and save a neutrino pfo with properties dictated by the mc neutrino.
float m_vertexTolerance
Tolerance, 3d displacement, allowed between reco neutrino vertex and mc neutrino endpoint.
std::unordered_map< const pandora::MCParticle *, const pandora::ParticleFlowObject * > MCParticleToPfoMap
static bool IsNeutrino(const pandora::MCParticle *const pMCParticle)
Whether a mc particle is a neutrino or antineutrino.
std::unordered_map< const pandora::MCParticle *, const pandora::MCParticle * > MCRelationMap
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.
static const pandora::MCParticle * GetMainMCParticle(const pandora::ParticleFlowObject *const pPfo)
Find the mc particle making the largest contribution to 2D clusters in a specified pfo.
static void GetTrueNeutrinos(const pandora::MCParticleList *const pMCParticleList, pandora::MCParticleVector &trueNeutrinos)
Get neutrino MC particles from an input MC particle list.
MCParticle class.
Definition MCParticle.h:26
float GetEnergy() const
Get energy of mc particle, units GeV.
Definition MCParticle.h:243
const MCParticleList & GetDaughterList() const
Get list of daughters of mc particle.
Definition MCParticle.h:306
const CartesianVector & GetMomentum() const
Get momentum of mc particle, units GeV.
Definition MCParticle.h:250
const CartesianVector & GetEndpoint() const
Get the endpoint of the mc particle, units mm.
Definition MCParticle.h:264
int GetParticleId() const
Get the PDG code of the mc particle.
Definition MCParticle.h:285
bool ShouldDisplayAlgorithmInfo() const
Whether to display algorithm information during processing.
ParticleFlowObject class.
int m_particleId
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.
Vertex class.
Definition Vertex.h:26
VertexType GetVertexType() const
Get the vertex type.
Definition Vertex.h:124
const CartesianVector & GetPosition() const
Get the vertex position.
Definition Vertex.h:103
static StatusCode ReadVectorOfValues(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, std::vector< T > &vector)
Read a vector of values from a (space separated) list in an xml element.
Definition XmlHelper.h:229
static StatusCode ReadValue(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, T &t)
Read a value from an xml element.
Definition XmlHelper.h:136
MANAGED_CONTAINER< const MCParticle * > MCParticleList
std::vector< const MCParticle * > MCParticleVector
MANAGED_CONTAINER< const Vertex * > VertexList
StatusCode
The StatusCode enum.
MANAGED_CONTAINER< const ParticleFlowObject * > PfoList