LArSoft  v06_85_00
Liquid Argon Software toolkit - http://larsoft.org/
lar_content::PcaShowerParticleBuildingAlgorithm Class Reference

PcaShowerParticleBuildingAlgorithm class. More...

#include "PcaShowerParticleBuildingAlgorithm.h"

Inheritance diagram for lar_content::PcaShowerParticleBuildingAlgorithm:
lar_content::CustomParticleCreationAlgorithm

Classes

class  Factory
 Factory class for instantiating algorithm. More...
 

Public Member Functions

 PcaShowerParticleBuildingAlgorithm ()
 Default constructor. More...
 

Protected Member Functions

virtual pandora::StatusCode Run ()
 

Private Member Functions

void CreatePfo (const pandora::ParticleFlowObject *const pInputPfo, const pandora::ParticleFlowObject *&pOutputPfo) const
 Create specialised Pfo from an generic input Pfo. More...
 
pandora::StatusCode ReadSettings (const pandora::TiXmlHandle xmlHandle)
 

Private Attributes

unsigned int m_layerFitHalfWindow
 

Detailed Description

Constructor & Destructor Documentation

lar_content::PcaShowerParticleBuildingAlgorithm::PcaShowerParticleBuildingAlgorithm ( )

Member Function Documentation

void lar_content::PcaShowerParticleBuildingAlgorithm::CreatePfo ( const pandora::ParticleFlowObject *const  pInputPfo,
const pandora::ParticleFlowObject *&  pOutputPfo 
) const
privatevirtual

Create specialised Pfo from an generic input Pfo.

Parameters
pInputPfothe address of the input Pfo
pOutputPfothe address of the output Pfo

Implements lar_content::CustomParticleCreationAlgorithm.

Definition at line 33 of file PcaShowerParticleBuildingAlgorithm.cc.

References f, lar_content::LArShowerPCA::GetAxisLengths(), lar_content::LArShowerPCA::GetCentroid(), lar_content::LArShowerPCA::GetEigenValues(), lar_content::LArShowerPCA::GetPrimaryAxis(), lar_content::LArShowerPCA::GetPrimaryLength(), lar_content::LArPfoHelper::GetPrincipalComponents(), lar_content::LArShowerPCA::GetSecondaryAxis(), lar_content::LArShowerPCA::GetSecondaryLength(), lar_content::LArShowerPCA::GetTertiaryAxis(), lar_content::LArPfoHelper::GetVertex(), lar_content::LArPfoHelper::IsFinalState(), lar_content::LArPfoHelper::IsNeutrino(), lar_content::LArPfoHelper::IsNeutrinoFinalState(), lar_content::LArPfoHelper::IsShower(), lar_content::LArShowerPfoParameters::m_showerCentroid, lar_content::LArShowerPfoParameters::m_showerDirection, lar_content::LArShowerPfoParameters::m_showerEigenValues, lar_content::LArShowerPfoParameters::m_showerLength, lar_content::LArShowerPfoParameters::m_showerOpeningAngle, lar_content::LArShowerPfoParameters::m_showerSecondaryVector, lar_content::LArShowerPfoParameters::m_showerTertiaryVector, and lar_content::LArShowerPfoParameters::m_showerVertex.

34 {
35  try
36  {
37  // In cosmic mode, build showers from all daughter pfos, otherwise require that pfo is shower-like
39  {
40  if (!LArPfoHelper::IsShower(pInputPfo))
41  return;
42  }
43  else
44  {
45  if (LArPfoHelper::IsFinalState(pInputPfo))
46  return;
47 
48  if (LArPfoHelper::IsNeutrino(pInputPfo))
49  return;
50  }
51 
52  // Need an input vertex to provide a shower propagation direction
53  const Vertex *const pInputVertex = LArPfoHelper::GetVertex(pInputPfo);
54 
55  // Run the PCA analysis
56  const LArShowerPCA showerPCA(LArPfoHelper::GetPrincipalComponents(pInputPfo, pInputVertex));
57 
58  // Build a new pfo
59  LArShowerPfoFactory pfoFactory;
60  LArShowerPfoParameters pfoParameters;
61  pfoParameters.m_particleId = (LArPfoHelper::IsShower(pInputPfo) ? pInputPfo->GetParticleId() : E_MINUS);
62  pfoParameters.m_charge = PdgTable::GetParticleCharge(pfoParameters.m_particleId.Get());
63  pfoParameters.m_mass = PdgTable::GetParticleMass(pfoParameters.m_particleId.Get());
64  pfoParameters.m_energy = 0.f;
65  pfoParameters.m_momentum = pInputPfo->GetMomentum();
66  pfoParameters.m_propertiesToAdd = pInputPfo->GetPropertiesMap();
67  pfoParameters.m_showerVertex = pInputVertex->GetPosition();
68  pfoParameters.m_showerCentroid = showerPCA.GetCentroid();
69  pfoParameters.m_showerDirection = showerPCA.GetPrimaryAxis();
70  pfoParameters.m_showerSecondaryVector = showerPCA.GetSecondaryAxis();
71  pfoParameters.m_showerTertiaryVector = showerPCA.GetTertiaryAxis();
72  pfoParameters.m_showerEigenValues = showerPCA.GetEigenValues();
73  pfoParameters.m_showerLength = showerPCA.GetAxisLengths();
74  pfoParameters.m_showerOpeningAngle = (showerPCA.GetPrimaryLength() > 0.f ? std::atan(showerPCA.GetSecondaryLength() / showerPCA.GetPrimaryLength()) : 0.f);
75 
76  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::ParticleFlowObject::Create(*this, pfoParameters, pOutputPfo,
77  pfoFactory));
78 
79  const LArShowerPfo *const pLArPfo = dynamic_cast<const LArShowerPfo*>(pOutputPfo);
80 
81  if (!pLArPfo)
82  throw StatusCodeException(STATUS_CODE_FAILURE);
83 
84  // Build a new vertex - TODO: tune vertex position based on PCA results
85  const Vertex *pOutputVertex = nullptr;
86 
87  PandoraContentApi::Vertex::Parameters vtxParameters;
88  vtxParameters.m_position = pInputVertex->GetPosition();
89  vtxParameters.m_vertexLabel = pInputVertex->GetVertexLabel();
90  vtxParameters.m_vertexType = pInputVertex->GetVertexType();
91 
92  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Vertex::Create(*this, vtxParameters, pOutputVertex));
93  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::AddToPfo<Vertex>(*this, pOutputPfo, pOutputVertex));
94  }
95  catch (StatusCodeException &statusCodeException)
96  {
97  if (STATUS_CODE_FAILURE == statusCodeException.GetStatusCode())
98  throw statusCodeException;
99  }
100 }
static LArShowerPCA GetPrincipalComponents(const pandora::CartesianPointVector &pointVector, const pandora::CartesianVector &vertexPosition)
Perform PCA analysis on a set of 3D points and return results.
static const pandora::Vertex * GetVertex(const pandora::ParticleFlowObject *const pPfo)
Get the pfo vertex.
TFile f
Definition: plotHisto.C:6
static bool IsShower(const pandora::ParticleFlowObject *const pPfo)
Return shower flag based on Pfo Particle ID.
static bool IsNeutrino(const pandora::ParticleFlowObject *const pPfo)
Whether a pfo is a neutrino or (antineutrino)
static bool IsFinalState(const pandora::ParticleFlowObject *const pPfo)
Whether a pfo is a primary parent particle.
static bool IsNeutrinoFinalState(const pandora::ParticleFlowObject *const pPfo)
Whether a pfo is a final-state particle from a neutrino (or antineutrino) interaction.
StatusCode lar_content::PcaShowerParticleBuildingAlgorithm::ReadSettings ( const pandora::TiXmlHandle  xmlHandle)
privatevirtual

Reimplemented from lar_content::CustomParticleCreationAlgorithm.

Definition at line 104 of file PcaShowerParticleBuildingAlgorithm.cc.

References m_layerFitHalfWindow, and lar_content::CustomParticleCreationAlgorithm::ReadSettings().

105 {
106  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
107  "LayerFitHalfWindow", m_layerFitHalfWindow));
108 
110 }
virtual pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
StatusCode lar_content::CustomParticleCreationAlgorithm::Run ( )
protectedvirtualinherited

Definition at line 20 of file CustomParticleCreationAlgorithm.cc.

21 {
22  // Get input Pfo List
23  const PfoList *pPfoList(NULL);
24 
25  if (STATUS_CODE_SUCCESS != PandoraContentApi::GetList(*this, m_pfoListName, pPfoList))
26  {
27  if (PandoraContentApi::GetSettings(*this)->ShouldDisplayAlgorithmInfo())
28  std::cout << "CustomParticleCreationAlgorithm: cannot find pfo list " << m_pfoListName << std::endl;
29 
30  return STATUS_CODE_SUCCESS;
31  }
32 
33  // Get input Vertex List
34  const VertexList *pVertexList(NULL);
35 
36  if (STATUS_CODE_SUCCESS != PandoraContentApi::GetList(*this, m_vertexListName, pVertexList))
37  {
38  if (PandoraContentApi::GetSettings(*this)->ShouldDisplayAlgorithmInfo())
39  std::cout << "CustomParticleCreationAlgorithm: cannot find vertex list " << m_vertexListName << std::endl;
40 
41  return STATUS_CODE_SUCCESS;
42  }
43 
44  // Create temporary lists
45  const PfoList *pTempPfoList = NULL; std::string tempPfoListName;
46  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::CreateTemporaryListAndSetCurrent(*this, pTempPfoList,
47  tempPfoListName));
48 
49  const VertexList *pTempVertexList = NULL; std::string tempVertexListName;
50  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::CreateTemporaryListAndSetCurrent(*this, pTempVertexList,
51  tempVertexListName));
52 
53  // Loop over input Pfos
54  PfoList pfoList(pPfoList->begin(), pPfoList->end());
55  VertexList vertexList(pVertexList->begin(), pVertexList->end());
56 
57  for (PfoList::const_iterator iter = pfoList.begin(), iterEnd = pfoList.end(); iter != iterEnd; ++iter)
58  {
59  const ParticleFlowObject *const pInputPfo = *iter;
60 
61  if (pInputPfo->GetVertexList().empty())
62  continue;
63 
64  const Vertex *const pInputVertex = LArPfoHelper::GetVertex(pInputPfo);
65 
66  if (vertexList.end() == std::find(vertexList.begin(), vertexList.end(), pInputVertex))
67  throw StatusCodeException(STATUS_CODE_FAILURE);
68 
69  // Build a new pfo and vertex from the old pfo
70  const ParticleFlowObject *pOutputPfo(NULL);
71 
72  this->CreatePfo(pInputPfo, pOutputPfo);
73 
74  if (NULL == pOutputPfo)
75  continue;
76 
77  if (pOutputPfo->GetVertexList().empty())
78  throw StatusCodeException(STATUS_CODE_FAILURE);
79 
80  // Transfer clusters and hierarchy information to new pfo, and delete old pfo and vertex
81  ClusterList clusterList(pInputPfo->GetClusterList().begin(), pInputPfo->GetClusterList().end());
82  PfoList parentList(pInputPfo->GetParentPfoList().begin(), pInputPfo->GetParentPfoList().end());
83  PfoList daughterList(pInputPfo->GetDaughterPfoList().begin(), pInputPfo->GetDaughterPfoList().end());
84 
85  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Delete<Pfo>(*this, pInputPfo, m_pfoListName));
86  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Delete<Vertex>(*this, pInputVertex, m_vertexListName));
87 
88  for (ClusterList::const_iterator cIter = clusterList.begin(), cIterEnd = clusterList.end(); cIter != cIterEnd; ++cIter)
89  {
90  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::AddToPfo<Cluster>(*this, pOutputPfo, *cIter));
91  }
92 
93  for (PfoList::const_iterator pIter = parentList.begin(), pIterEnd = parentList.end(); pIter != pIterEnd; ++pIter)
94  {
95  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::SetPfoParentDaughterRelationship(*this, *pIter, pOutputPfo));
96  }
97 
98  for (PfoList::const_iterator dIter = daughterList.begin(), dIterEnd = daughterList.end(); dIter != dIterEnd; ++dIter)
99  {
100  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::SetPfoParentDaughterRelationship(*this, pOutputPfo, *dIter));
101  }
102  }
103 
104  if (!pTempPfoList->empty())
105  {
106  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::SaveList<Pfo>(*this, m_pfoListName));
107  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::ReplaceCurrentList<Pfo>(*this, m_pfoListName));
108  }
109 
110  if (!pTempVertexList->empty())
111  {
112  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::SaveList<Vertex>(*this, m_vertexListName));
113  PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::ReplaceCurrentList<Vertex>(*this, m_vertexListName));
114  }
115 
116  return STATUS_CODE_SUCCESS;
117 }
std::string m_vertexListName
The name of the input vertex list.
static const pandora::Vertex * GetVertex(const pandora::ParticleFlowObject *const pPfo)
Get the pfo vertex.
intermediate_table::const_iterator const_iterator
std::string m_pfoListName
The name of the input pfo list.
std::list< Vertex > VertexList
Definition: DCEL.h:178
virtual void CreatePfo(const pandora::ParticleFlowObject *const pInputPfo, const pandora::ParticleFlowObject *&pOutputPfo) const =0
Create specialised Pfo from an generic input Pfo.

Member Data Documentation

unsigned int lar_content::PcaShowerParticleBuildingAlgorithm::m_layerFitHalfWindow
private

Definition at line 43 of file PcaShowerParticleBuildingAlgorithm.h.

Referenced by ReadSettings().


The documentation for this class was generated from the following files: