CMManagerBase.cxx
Go to the documentation of this file.
1 #include "CMManagerBase.h"
3 
4 #include "TStopwatch.h"
5 #include "TString.h"
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 
27  void
29  {
30  _planes.clear();
31  _in_clusters.clear();
33  }
34 
35  void
37  const std::vector<std::vector<util::PxHit>>& clusters)
38  {
39 
40  TStopwatch localWatch;
41 
42  // Reset
43  this->Reset();
44 
45  // Clear & fill cluster info
46 
47  _in_clusters.clear();
48 
49  _in_clusters.reserve(clusters.size());
50 
51  ::cluster::ClusterParamsAlg tmp_alg;
52  tmp_alg.SetMinNHits(_min_nhits);
53  tmp_alg.SetVerbose(false);
54 
55  for (auto const& c : clusters) {
56 
57  _in_clusters.push_back(tmp_alg);
58  (*_in_clusters.rbegin()).Initialize();
59 
60  if ((*_in_clusters.rbegin()).SetHits(c) < 3) continue;
61  (*_in_clusters.rbegin()).DisableFANN();
62  (*_in_clusters.rbegin()).FillParams(gser, false, false, false, false, false, false);
63  (*_in_clusters.rbegin()).FillPolygon(gser);
64  }
65 
66  if (_time_report) {
67  std::cout << Form(" CMManagerBase Time Report: SetClusters (CPAN computation) = %g [s]",
68  localWatch.RealTime())
69  << " ... details below." << std::endl;
70 
71  for (auto const& c : _in_clusters)
72 
73  c.TimeReport(std::cout);
74  }
75  }
76 
77  void
78  CMManagerBase::SetClusters(const std::vector<cluster::ClusterParamsAlg>& clusters)
79  {
80  TStopwatch localWatch;
81 
82  localWatch.Start();
83 
84  _in_clusters = clusters;
85 
86  if (_time_report)
87  std::cout << Form(" CMManagerBase Time Report: SetClusters (copy) = %g [s]",
88  localWatch.RealTime())
89  << std::endl;
90  }
91 
92  void
94  {
95 
96  if (!(_in_clusters.size())) return;
97 
98  TStopwatch localWatch;
99 
100  localWatch.Start();
101 
102  EventBegin();
103 
104  if (_time_report)
105  std::cout << Form(" CMManagerBase Time Report: EventBegin = %g [s]", localWatch.RealTime())
106  << std::endl;
107 
108  bool keep_going = true;
109 
110  while (keep_going) {
111 
112  localWatch.Start();
113 
114  IterationBegin();
115 
116  if (_time_report)
117  std::cout << Form(" CMManagerBase Time Report: IterationBegin = %g [s]",
118  localWatch.RealTime())
119  << std::endl;
120 
121  localWatch.Start();
122 
123  keep_going = IterationProcess(gser);
124 
125  if (_time_report)
126  std::cout << Form(" CMManagerBase Time Report: IterationProcess = %g [s]",
127  localWatch.RealTime())
128  << std::endl;
129  localWatch.Start();
130 
131  IterationEnd();
132 
133  if (_time_report)
134  std::cout << Form(" CMManagerBase Time Report: IterationEnd = %g [s]",
135  localWatch.RealTime())
136  << std::endl;
137 
138  if (!_merge_till_converge) {
139 
140  if (_debug_mode <= kPerIteration)
141 
142  std::cout
143  << "\033[93m Iterative approach = OFF ... exiting from iteration loop. \033[00m"
144  << std::endl;
145 
146  break;
147  }
148  }
149 
150  localWatch.Start();
151 
152  EventEnd();
153 
154  if (_time_report)
155  std::cout << Form(" CMManagerBase Time Report: EventEnd = %g [s]", localWatch.RealTime())
156  << std::endl;
157  }
158 
159  void
160  CMManagerBase::ComputePriority(const std::vector<cluster::ClusterParamsAlg>& clusters)
161  {
162 
163  TStopwatch localWatch;
164  localWatch.Start();
165 
166  _priority.clear();
167  _planes.clear();
168 
169  if (!clusters.size()) return;
170 
171  // Priority is computed cluster-by-cluster. In case of two clusters having the same priority
172  // value the one with lower cluster index gets the priority. Also, clusters with priority < 0
173  // are not logged (assumed not to be used)
174 
175  for (size_t i = 0; i < clusters.size(); ++i) {
176 
177  size_t c_index = clusters.size() - i - 1;
178 
179  float priority = clusters.at(c_index).GetNHits();
180 
181  if (_priority_algo) { priority = _priority_algo->Priority(clusters.at(c_index)); }
182 
183  if (priority > 0) {
184 
185  _priority.insert(std::make_pair(priority, c_index));
186 
187  if (_planes.find(clusters.at(c_index).Plane()) == _planes.end())
188 
189  _planes.insert(clusters.at(c_index).Plane());
190  }
191  }
192 
193  if (_time_report)
194  std::cout << Form(" CMManagerBase Time Report: ComputePriority = %g [s]",
195  localWatch.RealTime())
196  << std::endl;
197  }
198 
199 }
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.
struct vector vector
void ComputePriority(const std::vector< cluster::ClusterParamsAlg > &clusters)
Function to compute priority.
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:41
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()
void Initialize(void)
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.
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.
virtual void EventEnd()
FMWK function called @ end of Process()
QTextStream & endl(QTextStream &s)
CMManagerBase()
Default constructor.
void Reset()
Method to reset itself.