StreamingAlgorithm.cc
Go to the documentation of this file.
1 /**
2  * @file larpandoradlcontent/LArTwoDReco/StreamingAlgorithm.cc
3  *
4  * @brief Implementation of the deep learning track shower cluster streaming algorithm.
5  *
6  * $Log: $
7  */
8 
9 #include "Pandora/AlgorithmHeaders.h"
10 
12 
15 
17 
18 #include <algorithm>
19 #include <numeric>
20 
21 using namespace pandora;
22 
23 namespace lar_content
24 {
25 
26 StreamingAlgorithm::StreamingAlgorithm() : m_listType{"cluster"}
27 {
28 }
29 
30 //------------------------------------------------------------------------------------------------------------------------------------------
31 
33 {
34 }
35 
36 //------------------------------------------------------------------------------------------------------------------------------------------
37 
39 {
40  unsigned int i{0};
41  for (std::string listName : m_inputListNames)
42  {
43  std::string algStreamName{"Algorithms" + listName};
44  const ClusterList *pClusterList{nullptr};
45  // Set the input list as current
46  PandoraContentApi::ReplaceCurrentList<Cluster>(*this, listName);
47  StatusCode code{PandoraContentApi::GetCurrentList(*this, pClusterList)};
48  if (code == STATUS_CODE_SUCCESS)
49  {
50  for (const auto &alg : m_streamAlgorithmMap.at(algStreamName))
51  { // ATTN - The algorithms replace the current list as they go
52  PandoraContentApi::GetCurrentList(*this, pClusterList);
53  if (!pClusterList->empty())
54  {
55  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::RunDaughterAlgorithm(*this, alg));
56  }
57  }
58  // Save the current list to the target output list
59  if (!m_outputListName.empty())
60  PandoraContentApi::SaveList<Cluster>(*this, m_outputListName);
61  else
62  PandoraContentApi::SaveList<Cluster>(*this, m_outputListNames.at(i));
63  }
64  else if (code != STATUS_CODE_NOT_INITIALIZED)
65  {
66  return code;
67  }
68  ++i;
69  }
70 
71  // If we have a single output list specified, set that list as the current list
72  if (!m_outputListName.empty())
73  PandoraContentApi::ReplaceCurrentList<Cluster>(*this, m_outputListName);
74 
75  return STATUS_CODE_SUCCESS;
76 }
77 
78 //------------------------------------------------------------------------------------------------------------------------------------------
79 
80 StatusCode StreamingAlgorithm::ReadSettings(const TiXmlHandle xmlHandle)
81 {
82  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "ListType", m_listType));
83  std::transform(m_listType.begin(), m_listType.end(), m_listType.begin(), ::tolower);
84  if (m_listType != "cluster")
85  {
86  std::cout << "StreamingAlgorithm::ReadSettings - Error: Only Cluster list type is supported at this time" << std::endl;
87  return STATUS_CODE_INVALID_PARAMETER;
88  }
89 
90  PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadVectorOfValues(xmlHandle, "InputListNames", m_inputListNames));
91  if (m_inputListNames.empty())
92  {
93  std::cout << "StreamingAlgorithm::ReadSettings - Error: No input lists found" << std::endl;
94  return STATUS_CODE_NOT_FOUND;
95  }
96 
97  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "OutputListName", m_outputListName));
98  PANDORA_RETURN_RESULT_IF_AND_IF(
99  STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadVectorOfValues(xmlHandle, "OutputListNames", m_outputListNames));
100  if ((m_outputListName.empty() && m_outputListNames.empty()) || (!m_outputListName.empty() && !m_outputListNames.empty()))
101  {
102  std::cout << "StreamingAlgorithm::ReadSettings - Error: You must provide either a single output list name OR a list of output list names"
103  << std::endl;
104  return STATUS_CODE_NOT_FOUND;
105  }
106  if (!m_outputListNames.empty() && m_inputListNames.size() != m_outputListNames.size())
107  {
108  std::cout << "StreamingAlgorithm::ReadSettings - Error: When providing a list of output lists, there should be a one-to-one "
109  << "correspondence with the list of input lists" << std::endl;
110  return STATUS_CODE_INVALID_PARAMETER;
111  }
112 
113  for (std::string listName : m_inputListNames)
114  {
115  std::string algStreamName{"Algorithms" + listName};
116  if (m_streamAlgorithmMap.find(algStreamName) != m_streamAlgorithmMap.end())
117  {
118  std::cout << "StreamingAlgorithm::ReadSettings - Error: Duplicate stream name found" << std::endl;
119  return STATUS_CODE_INVALID_PARAMETER;
120  }
121  PANDORA_RETURN_RESULT_IF(
122  STATUS_CODE_SUCCESS, !=, XmlHelper::ProcessAlgorithmList(*this, xmlHandle, algStreamName, m_streamAlgorithmMap[algStreamName]));
123  if (m_streamAlgorithmMap.at(algStreamName).empty())
124  {
125  std::cout << "StreamingAlgorithm::ReadSettings - Error: Found no algorithms for \'" << algStreamName << "\'" << std::endl;
126  return STATUS_CODE_NOT_FOUND;
127  }
128  }
129 
130  return STATUS_CODE_SUCCESS;
131 }
132 
133 } // namespace lar_content
pandora::StringVector m_inputListNames
The names of the input lists.
std::string string
Definition: nybbler.cc:12
Header file for the lar calo hit class.
pandora::StringVector m_outputListNames
Names of the output lists if not combining into a single list at the end.
Header file for the lar monitoring helper helper class.
Header file for the lar monte carlo particle helper helper class.
CodeOutputInterface * code
StreamAlgorithmMap m_streamAlgorithmMap
A map from individual streams to the algorithms that stream should run.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
std::string m_listType
The type of the input lists (currently only Cluster is supported)
QTextStream & endl(QTextStream &s)
std::string m_outputListName
The name of the output list.