All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
CBAlgoMergeTinyWithBig.cxx
Go to the documentation of this file.
2 
3 #include <cmath>
4 
5 namespace cmtool {
6 
7  //-------------------------------------------------------
9  //-------------------------------------------------------
10  {
11  SetMinHitsBig(50);
12  SetMaxHitsBig(99999);
13  SetMinHitsSmall(0);
14  SetMaxHitsSmall(15);
16 
17  SetDebug(false);
18  }
19 
20  //-----------------------------
22  //-----------------------------
23  {
24 
25  }
26 
27  //----------------------------------------------------------------
28  bool CBAlgoMergeTinyWithBig::Bool(const ::cluster::ClusterParamsAlg &cluster1,
29  const ::cluster::ClusterParamsAlg &cluster2)
30  //----------------------------------------------------------------
31  {
32 
33  if(_debug)
34  std::cout<<"MergeTinyWithBig. One cluster has "
35  <<cluster1.GetNHits()<<" hits, the other has "
36  <<cluster2.GetNHits()<<" hits."<<std::endl;
37 
38 
39  bool is_1_small = false;
40  bool is_2_small = false;
41  bool is_1_big = false;
42  bool is_2_big = false;
43 
44  //if the first cluster counts as "small"
45  if(cluster1.GetNHits() > _min_hits_small &&
46  cluster1.GetNHits() < _max_hits_small)
47  is_1_small = true;
48  //if the second cluster counts as "small"
49  if(cluster2.GetNHits() > _min_hits_small &&
50  cluster2.GetNHits() < _max_hits_small)
51  is_2_small = true;
52  if(cluster1.GetNHits() > _min_hits_big &&
53  cluster1.GetNHits() < _max_hits_big)
54  is_1_big = true;
55  if(cluster2.GetNHits() > _min_hits_big &&
56  cluster2.GetNHits() < _max_hits_big)
57  is_2_big = true;
58 
59  if(_debug)
60  std::cout<<"is_1_small, is_1_big, is_2_small, is_2_big are: "
61  <<is_1_small<<", "<<is_1_big<<", "
62  <<is_2_small<<", "<<is_2_big<<std::endl;
63 
64  //if neither of the clusters is small don't merge
65  if(!is_1_small && !is_2_small)
66  return false;
67  //if neither of the clusters is big, don't merge
68  if(!is_1_big && !is_2_big)
69  return false;
70  //if both are small, don't merge
71  if(is_1_small && is_2_small)
72  return false;
73  //if both are big, don't merge
74  if(is_1_big && is_2_big)
75  return false;
76 
77  if(_debug)
78  std::cout<<"Looks like one of them is big, and one is small."<<std::endl;
79  //god this code is ugly
80 
81  //now we know which one of them is big & the other is small.
82 
83  //loop over the points on the first polygon and calculate
84  //distance to each point on the second polygon
85  //if any two points are close enough to each other,
86  //merge the two clusters
87 
88  unsigned int npoints1 = cluster1.GetParams().PolyObject.Size();
89  unsigned int npoints2 = cluster2.GetParams().PolyObject.Size();
90  //loop over points on first polygon
91  for(unsigned int i = 0; i < npoints1; ++i){
92  float pt1w = cluster1.GetParams().PolyObject.Point(i).first;
93  float pt1t = cluster1.GetParams().PolyObject.Point(i).second;
94  //loop over points on second polygon
95  for(unsigned int j = 0; j < npoints2; ++j){
96  float pt2w = cluster2.GetParams().PolyObject.Point(j).first;
97  float pt2t = cluster2.GetParams().PolyObject.Point(j).second;
98  double distsqrd = pow(pt2w-pt1w,2)+pow(pt2t-pt1t,2);
99 
100  if(_debug){
101  std::cout<<"two polygon points dist2 is "<<distsqrd<<std::endl;
102  }
103  if(distsqrd<_dist_sqrd_cut)
104  return true;
105  }
106 
107  }
108 
109  return false;
110 
111  }
112 
113  //------------------------------
115  //------------------------------
116  {
117 
118  }
119 
120 }
virtual void Reset()
Function to reset the algorithm instance ... maybe implemented via child class.
CBAlgoMergeTinyWithBig()
Default constructor.
BEGIN_PROLOG could also be cout
Class def header for a class CBAlgoMergeTinyWithBig.
virtual bool Bool(const ::cluster::ClusterParamsAlg &cluster1, const ::cluster::ClusterParamsAlg &cluster2)