LArSoft  v09_90_00
Liquid Argon Software toolkit - https://larsoft.org/
CBAlgoOutOfConeSeparate.cxx
Go to the documentation of this file.
2 
3 #include <cmath>
4 
5 namespace cmtool {
6 
7  //----------------------------------------
9  //----------------------------------------
10  {
11 
12  SetDebug(false);
13  SetMaxAngleSep(20.);
14  SetMinLength(15.);
15  SetMinHits(20);
16  SetStartAngleFalloff(2800); // in cm^2
17  }
18 
19  //--------------------------------------------------------
20  bool CBAlgoOutOfConeSeparate::Bool(const ::cluster::ClusterParamsAlg& cluster1,
21  const ::cluster::ClusterParamsAlg& cluster2)
22  //--------------------------------------------------------
23  {
24 
25  double angle1 = cluster1.GetParams().angle_2d;
26  double angle2 = cluster2.GetParams().angle_2d;
27 
28  double w_start1 = cluster1.GetParams().start_point.w;
29  double t_start1 = cluster1.GetParams().start_point.t;
30  double w_start2 = cluster2.GetParams().start_point.w;
31  double t_start2 = cluster2.GetParams().start_point.t;
32 
33  double len1 = cluster1.GetParams().length;
34  double len2 = cluster2.GetParams().length;
35 
36  size_t hits1 = cluster1.GetHitVector().size();
37  size_t hits2 = cluster2.GetHitVector().size();
38 
39  double startseparation =
40  (w_start2 - w_start1) * (w_start2 - w_start1) + (t_start2 - t_start1) * (t_start2 - t_start1);
41  //convert sepration to be instead of just angle -> angle/distance^n (n=1 for now)
43  (_FallOff / startseparation)); //distance^2 of 400 cm^2 taken as "standard"
44  if (_MaxAngleFar > 90.) _MaxAngleFar = 90.;
45 
46  //if either cluster has less than _minHits don't even try...
47  if ((hits1 < _minHits) or (hits2 < _minHits) or (angle1 < -360) or (angle2 < -360))
48  return false;
49 
50  if (_debug) {
51  std::cout << "Cluster 1:" << std::endl;
52  std::cout << "\tStart: ( " << w_start1 << ", " << t_start1 << " )" << std::endl;
53  std::cout << "\tAngle: " << angle1 << std::endl;
54  std::cout << "\tLength: " << len1 << std::endl;
55  std::cout << "\tN Hits: " << hits1 << std::endl;
56 
57  std::cout << "Cluster 2:" << std::endl;
58  std::cout << "\tStart: ( " << w_start2 << ", " << t_start2 << " )" << std::endl;
59  std::cout << "\tAngle: " << angle2 << std::endl;
60  std::cout << "\tLength: " << len2 << std::endl;
61  std::cout << "\tN Hits: " << hits2 << std::endl;
62 
63  std::cout << "Start Point Separation: " << startseparation << std::endl;
64  }
65 
66  //cluster 1 needs to be long enough (i.e. good) and cluster 2 must have minimum number of hits
67  double angle;
68  double separation;
69 
70  if (startseparation == 0) //do not prohibit merging if start point identical
71  return false;
72 
73  //first calculate angle of line in 2D plane connectng the two start points
74  if ((t_start2 - t_start1) == 0)
75  angle = 0.;
76  else {
77  double slope = (t_start2 - t_start1) / (w_start2 - w_start1);
78  angle = atan(slope) * 180. / 3.14;
79  }
80 
81  separation = abs(angle - angle1);
82 
83  if (_debug) {
84  std::cout << "Angle S1--S2: " << angle << std::endl;
85  std::cout << "Angle1--S2: " << separation << std::endl;
86  }
87  if (((((separation > _MaxAngle) and (separation < 180 - _MaxAngle)) or
88  ((separation > 180 + _MaxAngle) and (separation < 360 - _MaxAngle))) or
89  (((separation > _MaxAngleFar) and (separation < 180 - _MaxAngleFar)) or
90  ((separation > 180 + _MaxAngleFar) and (separation < 360 - _MaxAngleFar)))) and
91  (hits2 > _minHits) and (len1 > _MinLen)) {
92  if (_verbose) { std::cout << "Separate! cluster 1 BIG" << std::endl << std::endl; }
93  return true;
94  }
95 
96  //now change direction of angle so that it points from cluster 2 (big) to cluster 1 (small)
97  angle += 180.;
98  angle = (int)(angle) % 360;
99 
100  separation = abs(angle - angle2);
101  //separation *= (400./startseparation); //distance^2 of 400 cm^2 taken as "standard"
102  if (_debug) {
103  std::cout << "Angle S2--S1: " << angle << std::endl;
104  std::cout << "Angle2--S1: " << separation << std::endl;
105  }
106  if (((((separation > _MaxAngle) and (separation < 180 - _MaxAngle)) or
107  ((separation > 180 + _MaxAngle) and (separation < 360 - _MaxAngle))) or
108  (((separation > _MaxAngleFar) and (separation < 180 - _MaxAngleFar)) or
109  ((separation > 180 + _MaxAngleFar) and (separation < 360 - _MaxAngleFar)))) and
110  (hits1 > _minHits) and (len2 > _MinLen)) {
111  if (_verbose) { std::cout << "Separate! cluster 2 BIG" << std::endl << std::endl; }
112  return true;
113  }
114 
115  return false;
116  }
117 
118 }
void SetMinLength(float len)
Set Minimum length for "big" cluster.
void SetStartAngleFalloff(float d)
Set Distance at which cone-acceptance angle starts falling off as 1/distance. Value should be distanc...
void SetDebug(bool on)
Set Debug Mode on or off.
constexpr auto abs(T v)
Returns the absolute value of the argument.
void SetMaxAngleSep(float angle)
Set Max Angle Separation for separation.
virtual bool Bool(const ::cluster::ClusterParamsAlg &cluster1, const ::cluster::ClusterParamsAlg &cluster2)
void SetMinHits(size_t n)
SetMinimum number of hits for small cluster.
void SetMaxAngleFar(float angle)
Set Max Angle Separation for separation for far away clusters.
bool _verbose
Boolean to choose verbose mode. Turned on if CMergeManager/CMatchManager&#39;s verbosity level is >= kPer...
Definition: CMAlgoBase.h:82
CBAlgoOutOfConeSeparate()
Default constructor.