Public Member Functions | Protected Attributes | List of all members
cmtool::CBAlgoCenterOfMassSmall Class Reference

#include <CBAlgoCenterOfMassSmall.h>

Inheritance diagram for cmtool::CBAlgoCenterOfMassSmall:
cmtool::CBoolAlgoBase cmtool::CMAlgoBase

Public Member Functions

 CBAlgoCenterOfMassSmall ()
 Default constructor. More...
 
virtual ~CBAlgoCenterOfMassSmall ()
 Default destructor. More...
 
virtual bool Bool (const ::cluster::ClusterParamsAlg &cluster1, const ::cluster::ClusterParamsAlg &cluster2)
 
virtual void Reset ()
 Function to reset the algorithm instance ... maybe implemented via child class. More...
 
virtual void Report ()
 Function to report what's going on per merging iteration. More...
 
void SetDebug (bool on)
 Function to set Debug mode of output. More...
 
void SetMaxHitsSmallClus (size_t n)
 Function to set Max hits for small clsuters. More...
 
void SetMaxDistance (double d)
 Function to set Max Distance for COM to be from start-end. More...
 
void SetMaxCOMDistance (double d)
 Function to set Max Distance between COMs. More...
 
void UseCOMInPoly (bool on)
 Use COM in Poly algo to decide merging. More...
 
void UseCOMClose (bool on)
 Use COM in Poly algo to decide merging. More...
 
void UseCOMNearClus (bool on)
 Use COM in Poly algo to decide merging. More...
 
void SetLengthReach (double frac)
 Set Length Reach: How for out the cone extends as percent of cluster length. More...
 
double ShortestDistanceSquared (double point_x, double point_y, double start_x, double start_y, double end_x, double end_y) const
 
- Public Member Functions inherited from cmtool::CBoolAlgoBase
 CBoolAlgoBase ()
 Default constructor. More...
 
virtual ~CBoolAlgoBase ()
 Default destructor. More...
 
- Public Member Functions inherited from cmtool::CMAlgoBase
 CMAlgoBase ()
 
virtual ~CMAlgoBase ()=default
 
virtual void EventBegin (const std::vector< cluster::ClusterParamsAlg > &)
 
virtual void EventEnd ()
 
virtual void IterationBegin (const std::vector< cluster::ClusterParamsAlg > &)
 
virtual void IterationEnd ()
 
void SetAnaFile (TFile *fout)
 Setter function for an output plot TFile pointer. More...
 
virtual void SetVerbose (bool doit=true)
 Setter function for verbosity. More...
 

Protected Attributes

bool _debug
 
size_t _maxHits
 
double _MaxDist
 
double _MaxCOMDistSquared
 
double _lengthReach
 
bool _COMinPolyAlg
 How four out - as percent of cluster length - cone will extend from start point. More...
 
bool _COMsClose
 
bool _COMNearClus
 
- Protected Attributes inherited from cmtool::CMAlgoBase
TFile * _fout
 TFile pointer to an output file. More...
 
bool _verbose
 Boolean to choose verbose mode. Turned on if CMergeManager/CMatchManager's verbosity level is >= kPerMerging. More...
 

Detailed Description

Designed mainly for small clusters (< 10 hits): Find Cluster's center of mass weighing by Q Then see if COM is in polygon/cone of a big cluster If so -> merge

Definition at line 28 of file CBAlgoCenterOfMassSmall.h.

Constructor & Destructor Documentation

cmtool::CBAlgoCenterOfMassSmall::CBAlgoCenterOfMassSmall ( )

Default constructor.

Definition at line 8 of file CBAlgoCenterOfMassSmall.cxx.

8  : CBoolAlgoBase()
9  //----------------------------------------
10  {
11 
12  SetDebug(false);
14  SetMaxDistance(20.);
15  SetMaxCOMDistance(25.);
16  UseCOMInPoly(true);
17  UseCOMClose(true);
18  UseCOMNearClus(true);
19 
20  }
void SetMaxCOMDistance(double d)
Function to set Max Distance between COMs.
CBoolAlgoBase()
Default constructor.
Definition: CBoolAlgoBase.h:32
void UseCOMClose(bool on)
Use COM in Poly algo to decide merging.
void SetMaxDistance(double d)
Function to set Max Distance for COM to be from start-end.
void UseCOMInPoly(bool on)
Use COM in Poly algo to decide merging.
void SetDebug(bool on)
Function to set Debug mode of output.
void UseCOMNearClus(bool on)
Use COM in Poly algo to decide merging.
void SetMaxHitsSmallClus(size_t n)
Function to set Max hits for small clsuters.
virtual cmtool::CBAlgoCenterOfMassSmall::~CBAlgoCenterOfMassSmall ( )
inlinevirtual

Default destructor.

Definition at line 36 of file CBAlgoCenterOfMassSmall.h.

36 {};

Member Function Documentation

bool cmtool::CBAlgoCenterOfMassSmall::Bool ( const ::cluster::ClusterParamsAlg cluster1,
const ::cluster::ClusterParamsAlg cluster2 
)
virtual

Core function: given the ClusterParamsAlg input, return whether a cluster should be merged or not.

Reimplemented from cmtool::CBoolAlgoBase.

Definition at line 23 of file CBAlgoCenterOfMassSmall.cxx.

26  {
27 
28  int Nhits1 = 0;
29  int Nhits2 = 0;
30 
31  //Both clusters should have less hits than some threshold
32  if ( (cluster1.GetHitVector().size() > _maxHits) or (cluster2.GetHitVector().size() > _maxHits) )
33  return false;
34 
35  //Define COM values on w & t
36  double COM_t_1 = 0;
37  double COM_w_1 = 0;
38  double Q_1 = 0;
39  double start_w_1;
40  double start_t_1;
41  double end_w_1;
42  double end_t_1;
43  Polygon2D poly1;
44  double COM_t_2 = 0;
45  double COM_w_2 = 0;
46  double Q_2 = 0;
47  double start_w_2;
48  double start_t_2;
49  double end_w_2;
50  double end_t_2;
51  Polygon2D poly2;
52 
53  //Get Hit vector for cluster 1
54  //std::vector<util::PxHit> hits1;
55  std::vector<util::PxHit> hits1;
56  hits1 = cluster1.GetHitVector();
57  Nhits1 = hits1.size();
58  poly1 = cluster1.GetParams().PolyObject;
59  start_w_1 = cluster1.GetParams().start_point.w;
60  start_t_1 = cluster1.GetParams().start_point.t;
61  end_w_1 = cluster1.GetParams().end_point.w;
62  end_t_1 = cluster1.GetParams().end_point.t;
63  //Get Hit vector for cluster 2
64  //std::vector<util::PxHit> hits2;
65  std::vector<util::PxHit> hits2;
66  hits2 = cluster2.GetHitVector();
67  Nhits2 = hits2.size();
68  poly2 = cluster2.GetParams().PolyObject;
69  start_w_2 = cluster2.GetParams().start_point.w;
70  start_t_2 = cluster2.GetParams().start_point.t;
71  end_w_2 = cluster2.GetParams().end_point.w;
72  end_t_2 = cluster2.GetParams().end_point.t;
73 
74  //Find COM for cluster 1
75  for (auto& hit: hits1){
76  COM_t_1 += hit.t * hit.charge;
77  COM_w_1 += hit.w * hit.charge;
78  Q_1 += hit.charge;
79  }
80  COM_t_1 /= Q_1;
81  COM_w_1 /= Q_1;
82 
83  //Find COM for cluster 2
84  for (auto& hit: hits2){
85  COM_t_2 += hit.t * hit.charge;
86  COM_w_2 += hit.w * hit.charge;
87  Q_2 += hit.charge;
88  }
89  COM_t_2 /= Q_2;
90  COM_w_2 /= Q_2;
91 
92  if (_debug) {
93  std::cout << "Cluster 1: " << std::endl;
94  std::cout << "N Hits: " << Nhits1 << std::endl;
95  std::cout << "COM: (w,t) -> (" << COM_w_1 << ", " << COM_t_1 << ")" << std::endl;
96  std::cout << "Cluster 2: " << std::endl;
97  std::cout << "N Hits: " << Nhits2 << std::endl;
98  std::cout << "COM: (w,t) -> (" << COM_w_2 << ", " << COM_t_2 << ")" << std::endl;
99  std::cout << std::endl;
100  }
101 
102  //Get COM
103  std::pair<float,float> COM_1;
104  COM_1 = std::make_pair( COM_w_1, COM_t_1 );
105  std::pair<float,float> COM_2;
106  COM_2 = std::make_pair( COM_w_2, COM_t_2 );
107 
108  //look for polygon overlap
109  if ( ( ( poly2.PointInside(COM_1) ) and _COMinPolyAlg ) or
110  ( ( poly1.PointInside(COM_2) ) and _COMinPolyAlg ) ){
111  if (_verbose) { std::cout << "Polygon Overlap -> Merge!" << std::endl << std::endl;}
112  return true;
113  }
114 
115  //look for COM of 1 close to COM of 2
116  double distCOMs = ( COM_w_1-COM_w_2 )*( COM_w_1-COM_w_2 ) +
117  ( COM_t_1-COM_t_2 )*( COM_t_1-COM_t_2 );
118  if ( _COMsClose and ( distCOMs < _MaxCOMDistSquared ) ){
119  if (_verbose) { std::cout << "COMs close to each other -> Merge!" << std::endl << std::endl;}
120  return true;
121  }
122 
123  //look for COM close to start-end of other cluster
124  if ( _COMNearClus and
125  ( ( ShortestDistanceSquared( COM_w_1, COM_t_1, start_w_2, start_t_2, end_w_2, end_t_2 ) < _MaxDist ) or
126  ( ShortestDistanceSquared( COM_w_2, COM_t_2, start_w_1, start_t_1, end_w_1, end_t_1 ) < _MaxDist ) ) ) {
127  if (_verbose) { std::cout << "COM close to start-end -> Merge!" << std::endl; }
128  return true;
129  }
130 
131  return false;
132  }
bool _COMinPolyAlg
How four out - as percent of cluster length - cone will extend from start point.
double ShortestDistanceSquared(double point_x, double point_y, double start_x, double start_y, double end_x, double end_y) const
Detector simulation of raw signals on wires.
bool PointInside(const std::pair< float, float > &point) const
Definition: Polygon2D.cxx:252
bool _verbose
Boolean to choose verbose mode. Turned on if CMergeManager/CMatchManager&#39;s verbosity level is >= kPer...
Definition: CMAlgoBase.h:102
QTextStream & endl(QTextStream &s)
void cmtool::CBAlgoCenterOfMassSmall::Report ( )
virtual

Function to report what's going on per merging iteration.

Reimplemented from cmtool::CMAlgoBase.

Definition at line 135 of file CBAlgoCenterOfMassSmall.cxx.

137  {
138 
139  }
virtual void cmtool::CBAlgoCenterOfMassSmall::Reset ( void  )
inlinevirtual

Function to reset the algorithm instance ... maybe implemented via child class.

Reimplemented from cmtool::CMAlgoBase.

Definition at line 46 of file CBAlgoCenterOfMassSmall.h.

46 {}
void cmtool::CBAlgoCenterOfMassSmall::SetDebug ( bool  on)
inline

Function to set Debug mode of output.

Definition at line 52 of file CBAlgoCenterOfMassSmall.h.

void cmtool::CBAlgoCenterOfMassSmall::SetLengthReach ( double  frac)
inline

Set Length Reach: How for out the cone extends as percent of cluster length.

Definition at line 73 of file CBAlgoCenterOfMassSmall.h.

void cmtool::CBAlgoCenterOfMassSmall::SetMaxCOMDistance ( double  d)
inline

Function to set Max Distance between COMs.

Definition at line 61 of file CBAlgoCenterOfMassSmall.h.

void cmtool::CBAlgoCenterOfMassSmall::SetMaxDistance ( double  d)
inline

Function to set Max Distance for COM to be from start-end.

Definition at line 58 of file CBAlgoCenterOfMassSmall.h.

void cmtool::CBAlgoCenterOfMassSmall::SetMaxHitsSmallClus ( size_t  n)
inline

Function to set Max hits for small clsuters.

Definition at line 55 of file CBAlgoCenterOfMassSmall.h.

55 { _maxHits = n; }
std::void_t< T > n
double cmtool::CBAlgoCenterOfMassSmall::ShortestDistanceSquared ( double  point_x,
double  point_y,
double  start_x,
double  start_y,
double  end_x,
double  end_y 
) const

Definition at line 141 of file CBAlgoCenterOfMassSmall.cxx.

143  {
144 
145  //This code finds the shortest distance between a point and a line segment.
146  //code based off sample from
147  //http://stackoverflow.com/questions/849211/shortest-distance-between-a-point-and-a-line-segment
148  //note to self: rewrite this with TVector2 and compare time differences...
149  //TVector2 code might be more understandable
150 
151  double distance_squared = -1;
152 
153  // Line segment: from ("V") = (start_x, start_y) to ("W")=(end_x, end_y)
154  double length_squared = pow((end_x - start_x), 2) + pow((end_y - start_y), 2);
155 
156  // Treat the case start & end point overlaps
157  if(length_squared < 0.1) {
158  if(_verbose){
159  std::cout << std::endl;
160  std::cout << Form(" Provided very short line segment: (%g,%g) => (%g,%g)",
161  start_x,start_y,end_x,end_y) << std::endl;
162  std::cout << " Likely this means one of two clusters have start & end point identical." << std::endl;
163  std::cout << " Check the cluster output!" << std::endl;
164  std::cout << std::endl;
165  std::cout << Form(" At this time, the algorithm uses a point (%g,%g)",start_x,start_y) << std::endl;
166  std::cout << " to represent this cluster's location." << std::endl;
167  std::cout << std::endl;
168  }
169 
170  return (pow((point_x - start_x),2) + pow((point_y - start_y),2));
171  }
172 
173  //Find shortest distance between point ("P")=(point_x,point_y) to this line segment
174  double t = ( (point_x - start_x)*(end_x - start_x) + (point_y - start_y)*(end_y - start_y) ) / length_squared;
175 
176  if(t<0.0) distance_squared = pow((point_x - start_x), 2) + pow((point_y - start_y), 2);
177 
178  else if (t>1.0) distance_squared = pow((point_x - end_x), 2) + pow(point_y - end_y, 2);
179 
180  else distance_squared = pow((point_x - (start_x + t*(end_x - start_x))), 2) + pow((point_y - (start_y + t*(end_y - start_y))),2);
181 
182  return distance_squared;
183 
184  }//end ShortestDistanceSquared function
constexpr T pow(T x)
Definition: pow.h:72
bool _verbose
Boolean to choose verbose mode. Turned on if CMergeManager/CMatchManager&#39;s verbosity level is >= kPer...
Definition: CMAlgoBase.h:102
QTextStream & endl(QTextStream &s)
void cmtool::CBAlgoCenterOfMassSmall::UseCOMClose ( bool  on)
inline

Use COM in Poly algo to decide merging.

Definition at line 67 of file CBAlgoCenterOfMassSmall.h.

void cmtool::CBAlgoCenterOfMassSmall::UseCOMInPoly ( bool  on)
inline

Use COM in Poly algo to decide merging.

Definition at line 64 of file CBAlgoCenterOfMassSmall.h.

64 { _COMinPolyAlg = on; }
bool _COMinPolyAlg
How four out - as percent of cluster length - cone will extend from start point.
void cmtool::CBAlgoCenterOfMassSmall::UseCOMNearClus ( bool  on)
inline

Use COM in Poly algo to decide merging.

Definition at line 70 of file CBAlgoCenterOfMassSmall.h.

Member Data Documentation

bool cmtool::CBAlgoCenterOfMassSmall::_COMinPolyAlg
protected

How four out - as percent of cluster length - cone will extend from start point.

Definition at line 87 of file CBAlgoCenterOfMassSmall.h.

bool cmtool::CBAlgoCenterOfMassSmall::_COMNearClus
protected

Definition at line 89 of file CBAlgoCenterOfMassSmall.h.

bool cmtool::CBAlgoCenterOfMassSmall::_COMsClose
protected

Definition at line 88 of file CBAlgoCenterOfMassSmall.h.

bool cmtool::CBAlgoCenterOfMassSmall::_debug
protected

Definition at line 82 of file CBAlgoCenterOfMassSmall.h.

double cmtool::CBAlgoCenterOfMassSmall::_lengthReach
protected

Definition at line 86 of file CBAlgoCenterOfMassSmall.h.

double cmtool::CBAlgoCenterOfMassSmall::_MaxCOMDistSquared
protected

Definition at line 85 of file CBAlgoCenterOfMassSmall.h.

double cmtool::CBAlgoCenterOfMassSmall::_MaxDist
protected

Definition at line 84 of file CBAlgoCenterOfMassSmall.h.

size_t cmtool::CBAlgoCenterOfMassSmall::_maxHits
protected

Definition at line 83 of file CBAlgoCenterOfMassSmall.h.


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