1 #ifndef RECOTOOL_CBALGOCENTEROFMASSSMALL_CXX 2 #define RECOTOOL_CBALGOCENTEROFMASSSMALL_CXX 25 const ::cluster::ClusterParamsAlg &cluster2)
33 if ( (cluster1.GetHitVector().size() >
_maxHits) or (cluster2.GetHitVector().size() >
_maxHits) )
56 std::vector<util::PxHit> hits1;
57 hits1 = cluster1.GetHitVector();
58 Nhits1 = hits1.size();
59 poly1 = cluster1.GetParams().PolyObject;
60 start_w_1 = cluster1.GetParams().start_point.w;
61 start_t_1 = cluster1.GetParams().start_point.t;
62 end_w_1 = cluster1.GetParams().end_point.w;
63 end_t_1 = cluster1.GetParams().end_point.t;
66 std::vector<util::PxHit> hits2;
67 hits2 = cluster2.GetHitVector();
68 Nhits2 = hits2.size();
69 poly2 = cluster2.GetParams().PolyObject;
70 start_w_2 = cluster2.GetParams().start_point.w;
71 start_t_2 = cluster2.GetParams().start_point.t;
72 end_w_2 = cluster2.GetParams().end_point.w;
73 end_t_2 = cluster2.GetParams().end_point.t;
76 for (
auto&
hit: hits1){
77 COM_t_1 +=
hit.t *
hit.charge;
78 COM_w_1 +=
hit.w *
hit.charge;
85 for (
auto&
hit: hits2){
86 COM_t_2 +=
hit.t *
hit.charge;
87 COM_w_2 +=
hit.w *
hit.charge;
94 std::cout <<
"Cluster 1: " << std::endl;
95 std::cout <<
"N Hits: " << Nhits1 << std::endl;
96 std::cout <<
"COM: (w,t) -> (" << COM_w_1 <<
", " << COM_t_1 <<
")" << std::endl;
97 std::cout <<
"Cluster 2: " << std::endl;
98 std::cout <<
"N Hits: " << Nhits2 << std::endl;
99 std::cout <<
"COM: (w,t) -> (" << COM_w_2 <<
", " << COM_t_2 <<
")" << std::endl;
100 std::cout << std::endl;
104 std::pair<float,float> COM_1;
105 COM_1 = std::make_pair( COM_w_1, COM_t_1 );
106 std::pair<float,float> COM_2;
107 COM_2 = std::make_pair( COM_w_2, COM_t_2 );
111 ( ( poly1.
PointInside(COM_2) ) and _COMinPolyAlg ) ){
112 if (
_verbose) { std::cout <<
"Polygon Overlap -> Merge!" << std::endl << std::endl;}
117 double distCOMs = ( COM_w_1-COM_w_2 )*( COM_w_1-COM_w_2 ) +
118 ( COM_t_1-COM_t_2 )*( COM_t_1-COM_t_2 );
120 if (
_verbose) { std::cout <<
"COMs close to each other -> Merge!" << std::endl << std::endl;}
128 if (
_verbose) { std::cout <<
"COM close to start-end -> Merge!" << std::endl; }
143 double start_x,
double start_y,
144 double end_x,
double end_y )
const {
152 double distance_squared = -1;
155 double length_squared = pow((end_x - start_x), 2) + pow((end_y - start_y), 2);
158 if(length_squared < 0.1) {
160 std::cout << std::endl;
161 std::cout << Form(
" Provided very short line segment: (%g,%g) => (%g,%g)",
162 start_x,start_y,end_x,end_y) << std::endl;
163 std::cout <<
" Likely this means one of two clusters have start & end point identical." << std::endl;
164 std::cout <<
" Check the cluster output!" << std::endl;
165 std::cout << std::endl;
166 std::cout << Form(
" At this time, the algorithm uses a point (%g,%g)",start_x,start_y) << std::endl;
167 std::cout <<
" to represent this cluster's location." << std::endl;
168 std::cout << std::endl;
171 return (pow((point_x - start_x),2) + pow((point_y - start_y),2));
175 double t = ( (point_x - start_x)*(end_x - start_x) + (point_y - start_y)*(end_y - start_y) ) / length_squared;
177 if(t<0.0) distance_squared = pow((point_x - start_x), 2) + pow((point_y - start_y), 2);
179 else if (t>1.0) distance_squared = pow((point_x - end_x), 2) + pow(point_y - end_y, 2);
181 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);
183 return distance_squared;
Detector simulation of raw signals on wires.
Class def header for a class CBAlgoCenterOfMassSmall.
bool PointInside(const std::pair< float, float > &point) const