Belle II Software  release-08-01-10
CircleCenterXY.h
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 
9 #pragma once
10 
11 #include <tracking/trackFindingVXD/filterMap/filterFramework/SelectionVariable.h>
12 #include <framework/geometry/B2Vector3.h>
13 #include <framework/core/FrameworkExceptions.h>
14 
15 #define CIRCLECENTERXY_NAME CircleCenterXY
16 
17 namespace Belle2 {
26  template <typename PointType >
27  class CIRCLECENTERXY_NAME : public SelectionVariable< PointType, 3, B2Vector3<double> > {
28  public:
30  BELLE2_DEFINE_EXCEPTION(Straight_Line, "The hits are on a straight Line (or indistinguishably near to being on it).");
31 
34 
36  static B2Vector3<double> value(const PointType& a, const PointType& b, const PointType& c)
37  {
38  // calculates the intersection point using Cramer's rule.
39  // x_1+s*n_1==x_2+t*n_2 --> n_1 *s - n_2 *t == x_2 - x_1 --> http://en.wikipedia.org/wiki/Cramer%27s_rule
40  double inX = b.X() - c.X(); // x value of the normal vector of the inner segment (b-c)
41  double inY = b.Y() - c.Y(); // y value of the normal vector of the inner segment (b-c)
42  double outX = a.X() - b.X(); // x value of the normal vector of the outer segment (a-b)
43  double outY = a.Y() - b.Y(); // y value of the normal vector of the outer segment (a-b)
44 
45  //searching solution for Ax = b, aij are the matrix elements of A, bi are elements of b
46  double a11 = inY;
47  double a12 = -inX;
48  double a21 = -outY;
49  double a22 = outX;
50  double b1 = b.X() + outX * 0.5 - (c.X() + inX * 0.5);
51  double b2 = b.Y() + outY * 0.5 - (c.Y() + inY * 0.5);
52 
53  if (a11 * a22 == a12 * a21) { throw Straight_Line(); }
54 
55  double s = (b1 * a22 - b2 * a21) / (a11 * a22 - a12 * a21); //the determinant is zero if the three hits are on a line in (x,y).
56 
57  return B2Vector3<double>(c.X() + inX * 0.5 + s * inY, c.Y() + inY * 0.5 - s * inX, 0.);
58  }
59 
60 
61 
62  };
63 
65 }
calculates the center of the circle for 3 hits in the XY plane and returns a B2Vector3 with the resul...
static B2Vector3< double > value(const PointType &a, const PointType &b, const PointType &c)
calculates an estimation of circleCenter position, result is returned as the x and y value of the B2V...
PUT_NAME_FUNCTION(CIRCLECENTERXY_NAME)
is replaced by "static const std:string name(void)" frunction which returns name of the Class
BELLE2_DEFINE_EXCEPTION(Straight_Line, "The hits are on a straight Line (or indistinguishably near to being on it).")
this exception is thrown by the CircleFit and occurs when the track is too straight.
Base class of the selection variable objects used for pair filtering.
Abstract base class for different kinds of events.