LArSoft  v09_90_00
Liquid Argon Software toolkit - https://larsoft.org/
SlicingAlgorithm.cc
Go to the documentation of this file.
1 
9 #include "Api/PandoraApi.h"
10 
11 #include "Pandora/AlgorithmHeaders.h"
12 
14 
15 using namespace pandora;
16 
17 namespace lar_content
18 {
19 
20 SlicingAlgorithm::SlicingAlgorithm() :
21  m_pEventSlicingTool(nullptr)
22 {
23 }
24 
25 //------------------------------------------------------------------------------------------------------------------------------------------
26 
28 {
29  SliceList sliceList;
31  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::RunDaughterAlgorithm(*this, m_slicingListDeletionAlgorithm));
32 
33  if (sliceList.empty())
34  return STATUS_CODE_SUCCESS;
35 
36  std::string clusterListName;
37  const ClusterList *pClusterList(nullptr);
38  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::CreateTemporaryListAndSetCurrent(*this, pClusterList, clusterListName));
39 
40  std::string pfoListName;
41  const PfoList *pPfoList(nullptr);
42  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::CreateTemporaryListAndSetCurrent(*this, pPfoList, pfoListName));
43 
44  for (const Slice &slice : sliceList)
45  {
46  const Cluster *pClusterU(nullptr), *pClusterV(nullptr), *pClusterW(nullptr);
47  PandoraContentApi::Cluster::Parameters clusterParametersU, clusterParametersV, clusterParametersW;
48  clusterParametersU.m_caloHitList = slice.m_caloHitListU;
49  clusterParametersV.m_caloHitList = slice.m_caloHitListV;
50  clusterParametersW.m_caloHitList = slice.m_caloHitListW;
51  if (!clusterParametersU.m_caloHitList.empty())
52  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Cluster::Create(*this, clusterParametersU, pClusterU));
53  if (!clusterParametersV.m_caloHitList.empty())
54  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Cluster::Create(*this, clusterParametersV, pClusterV));
55  if (!clusterParametersW.m_caloHitList.empty())
56  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Cluster::Create(*this, clusterParametersW, pClusterW));
57 
58  if (!pClusterU && !pClusterV && !pClusterW)
59  throw StatusCodeException(STATUS_CODE_FAILURE);
60 
61  const Pfo *pSlicePfo(nullptr);
62  PandoraContentApi::ParticleFlowObject::Parameters pfoParameters;
63  if (pClusterU)
64  pfoParameters.m_clusterList.push_back(pClusterU);
65  if (pClusterV)
66  pfoParameters.m_clusterList.push_back(pClusterV);
67  if (pClusterW)
68  pfoParameters.m_clusterList.push_back(pClusterW);
69  pfoParameters.m_charge = 0;
70  pfoParameters.m_energy = 0.f;
71  pfoParameters.m_mass = 0.f;
72  pfoParameters.m_momentum = CartesianVector(0.f, 0.f, 0.f);
73  pfoParameters.m_particleId = 0;
74  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::ParticleFlowObject::Create(*this, pfoParameters, pSlicePfo));
75  }
76 
77  if (!pClusterList->empty())
78  {
79  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::SaveList<Cluster>(*this, m_sliceClusterListName));
80  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::ReplaceCurrentList<Cluster>(*this, m_sliceClusterListName));
81  }
82 
83  if (!pPfoList->empty())
84  {
85  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::SaveList<ParticleFlowObject>(*this, m_slicePfoListName));
86  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::ReplaceCurrentList<ParticleFlowObject>(*this, m_slicePfoListName));
87  }
88 
89  return STATUS_CODE_SUCCESS;
90 }
91 
92 //------------------------------------------------------------------------------------------------------------------------------------------
93 
94 StatusCode SlicingAlgorithm::ReadSettings(const TiXmlHandle xmlHandle)
95 {
96  AlgorithmTool *pAlgorithmTool(nullptr);
97  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ProcessAlgorithmTool(*this, xmlHandle, "SliceCreation", pAlgorithmTool));
98  m_pEventSlicingTool = dynamic_cast<EventSlicingBaseTool *>(pAlgorithmTool);
99 
100  if (!m_pEventSlicingTool)
101  return STATUS_CODE_INVALID_PARAMETER;
102 
103  PANDORA_RETURN_RESULT_IF(
104  STATUS_CODE_SUCCESS, !=, XmlHelper::ProcessAlgorithm(*this, xmlHandle, "SlicingListDeletion", m_slicingListDeletionAlgorithm));
105 
106  std::string caloHitListNameU, caloHitListNameV, caloHitListNameW;
107  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "InputCaloHitListNameU", caloHitListNameU));
108  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "InputCaloHitListNameV", caloHitListNameV));
109  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "InputCaloHitListNameW", caloHitListNameW));
110  m_caloHitListNames[TPC_VIEW_U] = caloHitListNameU;
111  m_caloHitListNames[TPC_VIEW_V] = caloHitListNameV;
112  m_caloHitListNames[TPC_VIEW_W] = caloHitListNameW;
113 
114  std::string clusterListNameU, clusterListNameV, clusterListNameW;
115  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "InputClusterListNameU", clusterListNameU));
116  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "InputClusterListNameV", clusterListNameV));
117  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "InputClusterListNameW", clusterListNameW));
118  m_clusterListNames[TPC_VIEW_U] = clusterListNameU;
119  m_clusterListNames[TPC_VIEW_V] = clusterListNameV;
120  m_clusterListNames[TPC_VIEW_W] = clusterListNameW;
121 
122  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "OutputClusterListName", m_sliceClusterListName));
123  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle, "OutputPfoListName", m_slicePfoListName));
124 
125  return STATUS_CODE_SUCCESS;
126 }
127 
128 } // namespace lar_content
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
HitTypeToNameMap m_caloHitListNames
The hit type to calo hit list name map.
std::vector< Slice > SliceList
Definition: LArSlice.h:29
EventSlicingBaseTool class.
virtual void RunSlicing(const pandora::Algorithm *const pAlgorithm, const HitTypeToNameMap &caloHitListNames, const HitTypeToNameMap &clusterListNames, SliceList &sliceList)=0
Run the slicing tool.
std::string m_slicingListDeletionAlgorithm
The name of the slicing list deletion algorithm.
TFile f
Definition: plotHisto.C:6
std::string m_sliceClusterListName
The name of the output slice cluster list.
HitTypeToNameMap m_clusterListNames
The hit type to cluster list name map.
Slice class.
Definition: LArSlice.h:21
std::string m_slicePfoListName
The name of the output slice pfo list.
Header file for the master algorithm class.
EventSlicingBaseTool * m_pEventSlicingTool
The address of the event slicing tool.