LArSoft  v09_90_00
Liquid Argon Software toolkit - https://larsoft.org/
CMManagerBase.cxx
Go to the documentation of this file.
3 
4 #include "TStopwatch.h"
5 #include "TString.h" // Form()
6 
7 #include <cstddef>
8 #include <iostream>
9 #include <set>
10 #include <string>
11 #include <utility>
12 #include <vector>
13 
14 namespace cmtool {
15 
17  {
18  _fout = 0;
20  _priority_algo = nullptr;
21  _min_nhits = 0;
22  _merge_till_converge = false;
23  Reset();
24  _time_report = false;
25  }
26 
28  {
29  _planes.clear();
30  _in_clusters.clear();
32  }
33 
35  const std::vector<std::vector<util::PxHit>>& clusters)
36  {
37 
38  TStopwatch localWatch;
39 
40  // Reset
41  this->Reset();
42 
43  // Clear & fill cluster info
44 
45  _in_clusters.clear();
46 
47  _in_clusters.reserve(clusters.size());
48 
50  tmp_alg.SetMinNHits(_min_nhits);
51  tmp_alg.SetVerbose(false);
52 
53  for (auto const& c : clusters) {
54 
55  _in_clusters.push_back(tmp_alg);
56  (*_in_clusters.rbegin()).Initialize();
57 
58  if ((*_in_clusters.rbegin()).SetHits(c) < 3) continue;
59  (*_in_clusters.rbegin()).DisableFANN();
60  (*_in_clusters.rbegin()).FillParams(gser, false, false, false, false, false, false);
61  (*_in_clusters.rbegin()).FillPolygon(gser);
62  }
63 
64  if (_time_report) {
65  std::cout << Form(" CMManagerBase Time Report: SetClusters (CPAN computation) = %g [s]",
66  localWatch.RealTime())
67  << " ... details below." << std::endl;
68 
69  for (auto const& c : _in_clusters)
70 
71  c.TimeReport(std::cout);
72  }
73  }
74 
75  void CMManagerBase::SetClusters(const std::vector<cluster::ClusterParamsAlg>& clusters)
76  {
77  TStopwatch localWatch;
78 
79  localWatch.Start();
80 
81  _in_clusters = clusters;
82 
83  if (_time_report)
84  std::cout << Form(" CMManagerBase Time Report: SetClusters (copy) = %g [s]",
85  localWatch.RealTime())
86  << std::endl;
87  }
88 
90  {
91 
92  if (!(_in_clusters.size())) return;
93 
94  TStopwatch localWatch;
95 
96  localWatch.Start();
97 
98  EventBegin();
99 
100  if (_time_report)
101  std::cout << Form(" CMManagerBase Time Report: EventBegin = %g [s]", localWatch.RealTime())
102  << std::endl;
103 
104  bool keep_going = true;
105 
106  while (keep_going) {
107 
108  localWatch.Start();
109 
110  IterationBegin();
111 
112  if (_time_report)
113  std::cout << Form(" CMManagerBase Time Report: IterationBegin = %g [s]",
114  localWatch.RealTime())
115  << std::endl;
116 
117  localWatch.Start();
118 
119  keep_going = IterationProcess(gser);
120 
121  if (_time_report)
122  std::cout << Form(" CMManagerBase Time Report: IterationProcess = %g [s]",
123  localWatch.RealTime())
124  << std::endl;
125  localWatch.Start();
126 
127  IterationEnd();
128 
129  if (_time_report)
130  std::cout << Form(" CMManagerBase Time Report: IterationEnd = %g [s]",
131  localWatch.RealTime())
132  << std::endl;
133 
134  if (!_merge_till_converge) {
135 
136  if (_debug_mode <= kPerIteration)
137 
138  std::cout
139  << "\033[93m Iterative approach = OFF ... exiting from iteration loop. \033[00m"
140  << std::endl;
141 
142  break;
143  }
144  }
145 
146  localWatch.Start();
147 
148  EventEnd();
149 
150  if (_time_report)
151  std::cout << Form(" CMManagerBase Time Report: EventEnd = %g [s]", localWatch.RealTime())
152  << std::endl;
153  }
154 
155  void CMManagerBase::ComputePriority(const std::vector<cluster::ClusterParamsAlg>& clusters)
156  {
157 
158  TStopwatch localWatch;
159  localWatch.Start();
160 
161  _priority.clear();
162  _planes.clear();
163 
164  if (!clusters.size()) return;
165 
166  // Priority is computed cluster-by-cluster. In case of two clusters having the same priority
167  // value the one with lower cluster index gets the priority. Also, clusters with priority < 0
168  // are not logged (assumed not to be used)
169 
170  for (size_t i = 0; i < clusters.size(); ++i) {
171 
172  size_t c_index = clusters.size() - i - 1;
173 
174  float priority = clusters.at(c_index).GetNHits();
175 
176  if (_priority_algo) { priority = _priority_algo->Priority(clusters.at(c_index)); }
177 
178  if (priority > 0) {
179 
180  _priority.insert(std::make_pair(priority, c_index));
181 
182  if (_planes.find(clusters.at(c_index).Plane()) == _planes.end())
183 
184  _planes.insert(clusters.at(c_index).Plane());
185  }
186  }
187 
188  if (_time_report)
189  std::cout << Form(" CMManagerBase Time Report: ComputePriority = %g [s]",
190  localWatch.RealTime())
191  << std::endl;
192  }
193 
194 }
Somewhat verbose (cout per merging iteration)
Definition: CMManagerBase.h:48
bool _time_report
Timing verbosity flag.
bool _merge_till_converge
Iteration loop switch.
TFile * _fout
Output analysis plot TFile.
void Initialize()
Definition: errprop.cc:100
void ComputePriority(const std::vector< cluster::ClusterParamsAlg > &clusters)
Function to compute priority.
auto vector(Vector const &v)
Returns a manipulator which will print the specified array.
Definition: DumpUtils.h:289
Class def header for a class CPriorityAlgoBase.
virtual void EventBegin()
FMWK function called @ beginning of Process()
std::multimap< float, size_t > _priority
Priority record.
virtual void Reset()
Function to reset the algorithm instance called within CMergeManager/CMatchManager&#39;s Reset() ...
Definition: CMAlgoBase.h:40
virtual bool IterationProcess(util::GeometryUtilities const &gser)=0
FMWK function called @ iterative loop inside Process()
virtual void IterationEnd()
FMWK function called @ end of iterative loop inside Process()
CMMSGLevel_t _debug_mode
Debug mode switch.
virtual void IterationBegin()
FMWK function called @ beginning of iterative loop inside Process()
void SetClusters(util::GeometryUtilities const &gser, const std::vector< std::vector< util::PxHit >> &clusters)
A simple method to add a cluster.
void SetMinNHits(size_t nhit)
virtual float Priority(const cluster::ClusterParamsAlg &cluster)
unsigned int _min_nhits
Minimum number of hits: the limit set for ClusterParamsAlg.
void Process(util::GeometryUtilities const &gser)
A method to execute the main action, to be called per event.
std::vector< cluster::ClusterParamsAlg > _in_clusters
Input clusters.
::cmtool::CPriorityAlgoBase * _priority_algo
Priority algorithm.
std::set< UChar_t > _planes
A holder for # of unique planes in the clusters, computed in ComputePriority() function.
Class def header for a class CMManagerBase.
void SetVerbose(bool yes=true)
virtual void EventEnd()
FMWK function called @ end of Process()
CMManagerBase()
Default constructor.
void Reset()
Method to reset itself.