LArSoft  v09_90_00
Liquid Argon Software toolkit - https://larsoft.org/
CheatingNeutrinoDaughterVerticesAlgorithm.cc
Go to the documentation of this file.
1 
9 #include "Pandora/AlgorithmHeaders.h"
10 
12 
14 
15 using namespace pandora;
16 
17 namespace lar_content
18 {
19 
20 CheatingNeutrinoDaughterVerticesAlgorithm::CheatingNeutrinoDaughterVerticesAlgorithm() :
21  m_collapseToPrimaryMCParticles(false)
22 {
23 }
24 
25 //------------------------------------------------------------------------------------------------------------------------------------------
26 
28 {
29  const PfoList *pPfoList(nullptr);
30  PANDORA_THROW_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_INITIALIZED, !=, PandoraContentApi::GetList(*this, m_neutrinoListName, pPfoList));
31 
32  if (!pPfoList)
33  {
34  if (PandoraContentApi::GetSettings(*this)->ShouldDisplayAlgorithmInfo())
35  std::cout << "CheatingNeutrinoDaughterVerticesAlgorithm: pfo list unavailable." << std::endl;
36 
37  return STATUS_CODE_SUCCESS;
38  }
39 
41  this->GetMCPrimaryMap(mcPrimaryMap);
42 
43  PfoList neutrinoPfos;
44  LArPfoHelper::GetRecoNeutrinos(pPfoList, neutrinoPfos);
45 
46  this->ProcessRecoNeutrinos(neutrinoPfos, mcPrimaryMap);
47 
48  return STATUS_CODE_SUCCESS;
49 }
50 
51 //------------------------------------------------------------------------------------------------------------------------------------------
52 
54 {
56  {
57  const MCParticleList *pMCParticleList(nullptr);
58  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetList(*this, m_mcParticleListName, pMCParticleList));
59 
60  LArMCParticleHelper::GetMCPrimaryMap(pMCParticleList, mcPrimaryMap);
61  }
62 }
63 
64 //------------------------------------------------------------------------------------------------------------------------------------------
65 
67 {
68  for (const ParticleFlowObject *const pNeutrinoPfo : neutrinoPfos)
69  {
70  PfoList daughterPfos;
71  LArPfoHelper::GetAllDownstreamPfos(pNeutrinoPfo, daughterPfos);
72 
73  PfoList::iterator neutrinoIter(std::find(daughterPfos.begin(), daughterPfos.end(), pNeutrinoPfo));
74 
75  if (daughterPfos.end() != neutrinoIter)
76  daughterPfos.erase(neutrinoIter);
77 
78  for (const ParticleFlowObject *const pDaughterPfo : daughterPfos)
79  {
80  try
81  {
82  this->ProcessDaughterPfo(pDaughterPfo, mcPrimaryMap);
83  }
84  catch (const StatusCodeException &)
85  {
86  }
87  }
88  }
89 }
90 
91 //------------------------------------------------------------------------------------------------------------------------------------------
92 
94  const ParticleFlowObject *const pDaughterPfo, const LArMCParticleHelper::MCRelationMap &mcPrimaryMap) const
95 {
96  const MCParticle *pMCParticle(LArMCParticleHelper::GetMainMCParticle(pDaughterPfo));
97 
99  {
100  LArMCParticleHelper::MCRelationMap::const_iterator primaryIter = mcPrimaryMap.find(pMCParticle);
101 
102  if (mcPrimaryMap.end() == primaryIter)
103  throw StatusCodeException(STATUS_CODE_NOT_FOUND);
104 
105  pMCParticle = primaryIter->second;
106  }
107 
108  const VertexList *pVertexList(nullptr);
109  std::string vertexListName;
110  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::CreateTemporaryListAndSetCurrent(*this, pVertexList, vertexListName));
111 
112  PandoraContentApi::Vertex::Parameters parameters;
113  parameters.m_position = pMCParticle->GetVertex();
114  parameters.m_vertexLabel = VERTEX_INTERACTION;
115  parameters.m_vertexType = VERTEX_3D;
116 
117  const Vertex *pVertex(nullptr);
118  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Vertex::Create(*this, parameters, pVertex));
119 
120  if (!pVertexList->empty())
121  {
122  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::SaveList<Vertex>(*this, m_vertexListName));
123  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::AddToPfo<Vertex>(*this, pDaughterPfo, pVertex));
124  }
125 }
126 
127 //------------------------------------------------------------------------------------------------------------------------------------------
128 
129 StatusCode CheatingNeutrinoDaughterVerticesAlgorithm::ReadSettings(const TiXmlHandle xmlHandle)
130 {
131  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
132  XmlHelper::ReadValue(xmlHandle, "CollapseToPrimaryMCParticles", m_collapseToPrimaryMCParticles));
133 
135  {
136  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "MCParticleListName", m_mcParticleListName));
137  }
138 
139  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "NeutrinoPfoListName", m_neutrinoListName));
140 
141  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "OutputVertexListName", m_vertexListName));
142 
143  return STATUS_CODE_SUCCESS;
144 }
145 
146 } // namespace lar_content
std::string m_mcParticleListName
The mc particle list name, required if want to collapse mc particle hierarchy.
intermediate_table::iterator iterator
Header file for the pfo helper class.
std::string m_vertexListName
The name of the output cosmic-ray vertex list.
static void GetRecoNeutrinos(const pandora::PfoList *const pPfoList, pandora::PfoList &recoNeutrinos)
Get neutrino pfos from an input pfo list.
intermediate_table::const_iterator const_iterator
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...
void GetMCPrimaryMap(LArMCParticleHelper::MCRelationMap &mcPrimaryMap) const
Get the mapping from mc particle to primary, only required if collapsed mc particle hierarchy specifi...
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
Header file for the cheating neutrino daughter vertices algorithm class.
void ProcessRecoNeutrinos(const pandora::PfoList &neutrinoPfos, const LArMCParticleHelper::MCRelationMap &mcPrimaryMap) const
Process the list of reconstructed neutrinos.
void ProcessDaughterPfo(const pandora::ParticleFlowObject *const pDaughterPfo, const LArMCParticleHelper::MCRelationMap &mcPrimaryMap) const
Process a daughter pfo.
bool m_collapseToPrimaryMCParticles
Whether to collapse mc particle hierarchies to primary particles.
static void GetAllDownstreamPfos(const pandora::PfoList &inputPfoList, pandora::PfoList &outputPfoList)
Get a flat list of all pfos, recursively, of all daughters associated with those pfos in an input lis...
boost::graph_traits< ModuleGraph >::vertex_descriptor Vertex
Definition: ModuleGraph.h:25
std::unordered_map< const pandora::MCParticle *, const pandora::MCParticle * > MCRelationMap
std::list< Vertex > VertexList
Definition: DCEL.h:169