Belle II Software  release-05-01-25
Lpar.h
1 //-----------------------------------------------------------------------------
2 // $Id$
3 //-----------------------------------------------------------------------------
4 // Filename : Lpar.h
5 // Section : TRG CDC
6 // Owner : Yoshihito Iwasaki
7 // Email : yoshihito.iwasaki@kek.jp
8 //-----------------------------------------------------------------------------
9 // Description :
10 //-----------------------------------------------------------------------------
11 // $Log$
12 //-----------------------------------------------------------------------------
13 
14 #include <iosfwd>
15 #include <cmath>
16 
17 #include "CLHEP/Matrix/Vector.h"
18 #include "CLHEP/Matrix/Matrix.h"
19 #ifndef CLHEP_POINT3D_H
20 #include "CLHEP/Geometry/Point3D.h"
21 #endif
22 
23 #ifdef TRGCDC_SHORT_NAMES
24 #define TCLpar TRGCDCLpar
25 #endif
26 
27 namespace Belle2 {
33 // forward declarations
34 
36  class TRGCDCLpar {
37  // friend classes and functions
38 
39  public:
40  // constants, enums and typedefs
41 
43  TRGCDCLpar();
44 
46  virtual ~TRGCDCLpar();
47 
49  inline const TRGCDCLpar& operator=(const TRGCDCLpar&);
50 
52  inline void neg();
54  void circle(double x1, double y1, double x2, double y2,
55  double x3, double y3);
56 
58  double kappa() const { return m_kappa; }
60  double radius() const { return 0.5 / std::fabs(m_kappa);}
62  CLHEP::HepVector center() const;
64  double s(double x, double y) const;
66  inline double d(double x, double y) const;
68  inline double dr(double x, double y) const;
70  double s(double r, int dir = 0) const;
72  double phi(double r, int dir = 0) const;
74  inline int sd(double r, double x, double y,
75  double limit, double& s, double& d) const;
77  inline CLHEP::HepVector Hpar(const HepGeom::Point3D<double>& pivot) const;
78 
79  // static member functions
80 
82  friend class TRGCDCLpav;
84  friend std::ostream& operator<<(std::ostream& o, TRGCDCLpar&);
86  friend int intersect(const TRGCDCLpar&, const TRGCDCLpar&, CLHEP::HepVector&, CLHEP::HepVector&);
87 
88  protected:
89  // protected member functions
90 
91  // protected const member functions
92 
93  private:
95  class Cpar {
96  public:
98  explicit Cpar(const TRGCDCLpar&);
100  double xi() const { return 1 + 2 * m_cu * m_da; }
102  double sfi() const { return m_sfi; }
104  double cfi() const { return m_cfi; }
106  double da() const { return m_da; }
108  double cu() const { return m_cu; }
110  double fi() const { return m_fi; }
111  private:
113  double m_cu;
115  double m_fi;
117  double m_da;
119  double m_sfi;
121  double m_cfi;
122  };
123  friend class TRGCDCLpar::Cpar;
125  inline TRGCDCLpar(const TRGCDCLpar&);
126 
128  bool operator==(const TRGCDCLpar&) const;
130  bool operator!=(const TRGCDCLpar&) const;
131 
133  void scale(double s) { m_kappa /= s; m_gamma *= s; }
135  inline void rotate(double c, double s);
137  inline void move(double x, double y);
138 
140  double alpha() const { return m_alpha; }
142  double beta() const { return m_beta; }
144  double gamma() const { return m_gamma; }
146  inline double check() const;
148  CLHEP::HepMatrix dldc() const;
150  inline double d0(double x, double y) const;
152  double kr2g(double r) const { return m_kappa * r * r + m_gamma; }
154  double x(double r) const;
156  double y(double r) const;
158  void xhyh(double x, double y, double& xh, double& yh) const;
160  double xi2() const { return 1 + 4 * m_kappa * m_gamma; }
162  bool xy(double, double&, double&, int dir = 0) const;
164  inline double r_max() const;
166  double xc() const { return - m_alpha / 2 / m_kappa; }
168  double yc() const { return - m_beta / 2 / m_kappa; }
170  double da() const { return 2 * gamma() / (std::sqrt(xi2()) + 1); }
172  inline double arcfun(double xh, double yh) const;
173 
175  double m_alpha;
177  double m_beta;
179  double m_gamma;
181  double m_kappa;
182 
184  static const double BELLE_ALPHA;
185 
186  // static data members
187 
188  };
189 
190 // inline function definitions
191 
192 // inline TRGCDCLpar::TRGCDCLpar(double a, double b, double k, double g) {
193 // m_alpha = a; m_beta = b; m_kappa = k; m_gamma = g;
194 // }
195 
197  {
198  m_alpha = 0;
199  m_beta = 1;
200  m_gamma = 0;
201  m_kappa = 0;
202  }
203 
205  {
206  m_alpha = l.m_alpha;
207  m_beta = l.m_beta;
208  m_gamma = l.m_gamma;
209  m_kappa = l.m_kappa;
210  }
211 
213  {
214  if (this != &l) {
215  m_alpha = l.m_alpha;
216  m_beta = l.m_beta;
217  m_gamma = l.m_gamma;
218  m_kappa = l.m_kappa;
219  }
220  return *this;
221  }
222 
223  inline void TRGCDCLpar::rotate(double c, double s)
224  {
225  double aTRGCDCLpar = c * m_alpha + s * m_beta;
226  double betar = -s * m_alpha + c * m_beta;
227  m_alpha = aTRGCDCLpar;
228  m_beta = betar;
229  }
230 
231  inline void TRGCDCLpar::move(double x, double y)
232  {
233  m_gamma += m_kappa * (x * x + y * y) + m_alpha * x + m_beta * y;
234  m_alpha += 2 * m_kappa * x;
235  m_beta += 2 * m_kappa * y;
236  }
237 
238  inline double TRGCDCLpar::check() const
239  {
240  return m_alpha * m_alpha + m_beta * m_beta - 4 * m_kappa * m_gamma - 1;
241  }
242 
243  inline void TRGCDCLpar::neg()
244  {
245  m_alpha = -m_alpha;
246  m_beta = -m_beta;
247  m_gamma = -m_gamma;
248  m_kappa = -m_kappa;
249  }
250 
251  inline double TRGCDCLpar::d0(double x, double y) const
252  {
253  return m_alpha * x + m_beta * y + m_gamma + m_kappa * (x * x + y * y);
254  }
255 
256  inline double TRGCDCLpar::d(double x, double y) const
257  {
258  double dd = d0(x, y);
259  const double approx_limit = 0.2;
260  if (std::fabs(m_kappa * dd) > approx_limit) return -1;
261  return dd * (1 - m_kappa * dd);
262  }
263 
264  inline double TRGCDCLpar::dr(double x, double y) const
265  {
266  double dx = xc() - x;
267  double dy = yc() - y;
268  double r = 0.5 / std::fabs(m_kappa);
269  return std::fabs(std::sqrt(dx * dx + dy * dy) - r);
270  }
271 
272  inline double TRGCDCLpar::r_max() const
273  {
274  if (m_kappa == 0) return 100000000.0;
275  if (m_gamma == 0) return 1 / std::fabs(m_kappa);
276  return std::fabs(2 * m_gamma / (std::sqrt(1 + 4 * m_gamma * m_kappa) - 1));
277  }
278 
279  inline double TRGCDCLpar::arcfun(double xh, double yh) const
280  {
281  //
282  // Duet way of calculating Sperp.
283  //
284  double r2kap = 2.0 * m_kappa;
285  double xi = std::sqrt(xi2());
286  double xinv = 1.0 / xi;
287  double ar2kap = std::fabs(r2kap);
288  double cross = m_alpha * yh - m_beta * xh;
289  double a1 = ar2kap * cross * xinv;
290  double a2 = r2kap * (m_alpha * xh + m_beta * yh) * xinv + xi;
291  if (a1 >= 0 && a2 > 0 && a1 < 0.3) {
292  double arg2 = a1 * a1;
293  return cross * (1.0 + arg2 * (1. / 6. + arg2 * (3. / 40.))) * xinv;
294  } else {
295  double at2 = std::atan2(a1, a2);
296  if (at2 < 0) at2 += (2 * M_PI);
297  return at2 / ar2kap;
298  }
299  }
300 
301  inline int TRGCDCLpar::sd(double r, double x, double y,
302  double limit, double& s, double& d) const
303  {
304  if ((x * yc() - y * xc())*m_kappa < 0) return 0;
305  double dd = d0(x, y);
306  d = dd * (1 - m_kappa * dd);
307  double d_cross_limit = d * limit;
308  if (d_cross_limit < 0 || d_cross_limit > limit * limit) return 0;
309  double rc = std::sqrt(m_alpha * m_alpha + m_beta * m_beta) / (2 * m_kappa);
310  double rho = 1. / (-2 * m_kappa);
311  double cosPhi = (rc * rc + rho * rho - r * r) / (-2 * rc * rho);
312  cosPhi = cosPhi > 1.0 ? 1.0 : cosPhi;
313  cosPhi = cosPhi < -1.0 ? -1.0 : cosPhi;
314  double phi = std::acos(cosPhi);
315  s = std::fabs(rho) * phi;
316  if (0.0 == phi)return 0;
317  d *= r / (std::fabs(rc) * std::sin(phi));
318 //cnv if (abs(d) > abs(limit)) return 0;
319  if (fabs(d) > fabs(limit)) return 0;
320  d_cross_limit = d * limit;
321  if (d_cross_limit > limit * limit) return 0;
322  return 1;
323  }
324 
325  inline CLHEP::HepVector TRGCDCLpar::Hpar(const HepGeom::Point3D<double>& pivot) const
326  {
327  CLHEP::HepVector a(5);
328  double dd = d0(pivot.x(), pivot.y());
329  a(1) = dd * (m_kappa * dd - 1);
330  a(2) = (m_kappa > 0) ? std::atan2(yc() - pivot.y(), xc() - pivot.x()) + M_PI
331  : std::atan2(pivot.y() - yc(), pivot.x() - xc()) - M_PI;
332  a(3) = -2.0 * BELLE_ALPHA * m_kappa;
333  a(4) = 0;
334  a(5) = 0;
335  return a;
336  }
337 
339 } // namespace Belle2
340 
341 
Belle2::TRGCDCLpar::Cpar::Cpar
Cpar(const TRGCDCLpar &)
constructor of Cpar class
Definition: Lpar.cc:41
Belle2::TRGCDCLpar::dr
double dr(double x, double y) const
const member functions
Definition: Lpar.h:264
Belle2::TRGCDCLpar::move
void move(double x, double y)
private member functions
Definition: Lpar.h:231
Belle2::TRGCDCLpar::intersect
friend int intersect(const TRGCDCLpar &, const TRGCDCLpar &, CLHEP::HepVector &, CLHEP::HepVector &)
intersection
Definition: Lpar.cc:253
Belle2::TRGCDCLpar::xy
bool xy(double, double &, double &, int dir=0) const
private const member functions
Definition: Lpar.cc:162
Belle2::TRGCDCLpar::beta
double beta() const
private const member functions
Definition: Lpar.h:142
Belle2::TRGCDCLpar::center
CLHEP::HepVector center() const
const member functions
Definition: Lpar.cc:238
Belle2::TRGCDCLpar::Cpar::sfi
double sfi() const
returns parameter of Cpar class
Definition: Lpar.h:102
Belle2::TRGCDCLpar::y
double y(double r) const
private const member functions
Definition: Lpar.cc:186
Belle2::TRGCDCLpar::Hpar
CLHEP::HepVector Hpar(const HepGeom::Point3D< double > &pivot) const
const member functions
Definition: Lpar.h:325
Belle2::TRGCDCLpar::kr2g
double kr2g(double r) const
private const member functions
Definition: Lpar.h:152
Belle2::TRGCDCLpar::circle
void circle(double x1, double y1, double x2, double y2, double x3, double y3)
circle
Definition: Lpar.cc:82
Belle2::TRGCDCLpar::TRGCDCLpar
TRGCDCLpar()
Constructor.
Definition: Lpar.h:196
Belle2::TRGCDCLpar::Cpar::m_cfi
double m_cfi
parameter of Cpar class
Definition: Lpar.h:121
Belle2::TRGCDCLpar::Cpar::xi
double xi() const
returns parameter of Cpar class
Definition: Lpar.h:100
Belle2::TRGCDCLpar::~TRGCDCLpar
virtual ~TRGCDCLpar()
Destructor.
Definition: Lpar.cc:57
Belle2::TRGCDCLpar::check
double check() const
private const member functions
Definition: Lpar.h:238
Belle2::TRGCDCLpar::Cpar::cu
double cu() const
returns parameter of Cpar class
Definition: Lpar.h:108
Belle2::TRGCDCLpar::m_alpha
double m_alpha
data members
Definition: Lpar.h:175
Belle2::TRGCDCLpar::operator<<
friend std::ostream & operator<<(std::ostream &o, TRGCDCLpar &)
ostream operator
Definition: Lpar.cc:331
Belle2::TRGCDCLpar::alpha
double alpha() const
private const member functions
Definition: Lpar.h:140
Belle2::TRGCDCLpar::Cpar::m_cu
double m_cu
parameter of Cpar class
Definition: Lpar.h:113
Belle2::TRGCDCLpar
TRGCDCLpar class.
Definition: Lpar.h:36
Belle2::TRGCDCLpar::phi
double phi(double r, int dir=0) const
const member functions
Definition: Lpar.cc:193
Belle2::TRGCDCLpar::x
double x(double r) const
private const member functions
Definition: Lpar.cc:179
Belle2::TRGCDCLpar::radius
double radius() const
const member functions
Definition: Lpar.h:60
Belle2::TRGCDCLpar::neg
void neg()
member functions
Definition: Lpar.h:243
Belle2::TRGCDCLpar::r_max
double r_max() const
private const member functions
Definition: Lpar.h:272
Belle2::TRGCDCLpar::BELLE_ALPHA
static const double BELLE_ALPHA
belle alpha
Definition: Lpar.h:184
Belle2::TRGCDCLpar::m_gamma
double m_gamma
data members
Definition: Lpar.h:179
Belle2::TRGCDCLpar::Cpar::cfi
double cfi() const
returns parameter of Cpar class
Definition: Lpar.h:104
Belle2::TRGCDCLpar::d0
double d0(double x, double y) const
private const member functions
Definition: Lpar.h:251
Belle2::TRGCDCLpav
TRGCDCLpav class.
Definition: Lpav.h:32
Belle2::TRGCDCLpar::yc
double yc() const
private const member functions
Definition: Lpar.h:168
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::TRGCDCLpar::da
double da() const
private const member functions
Definition: Lpar.h:170
Belle2::TRGCDCLpar::gamma
double gamma() const
private const member functions
Definition: Lpar.h:144
Belle2::TRGCDCLpar::d
double d(double x, double y) const
const member functions
Definition: Lpar.h:256
Belle2::TRGCDCLpar::xc
double xc() const
private const member functions
Definition: Lpar.h:166
Belle2::TRGCDCLpar::kappa
double kappa() const
const member functions
Definition: Lpar.h:58
Belle2::TRGCDCLpar::Cpar::m_da
double m_da
parameter of Cpar class
Definition: Lpar.h:117
Belle2::TRGCDCLpar::Cpar::m_fi
double m_fi
parameter of Cpar class
Definition: Lpar.h:115
Belle2::TRGCDCLpar::xi2
double xi2() const
private const member functions
Definition: Lpar.h:160
Belle2::TRGCDCLpar::Cpar
Private class cpar.
Definition: Lpar.h:95
Belle2::TRGCDCLpar::sd
int sd(double r, double x, double y, double limit, double &s, double &d) const
const member functions
Definition: Lpar.h:301
Belle2::TRGCDCLpar::Cpar::m_sfi
double m_sfi
parameter of Cpar class
Definition: Lpar.h:119
Belle2::TRGCDCLpar::Cpar::fi
double fi() const
returns parameter of Cpar class
Definition: Lpar.h:110
Belle2::TRGCDCLpar::operator==
bool operator==(const TRGCDCLpar &) const
comparison operators
Belle2::TRGCDCLpar::m_kappa
double m_kappa
data members
Definition: Lpar.h:181
HepGeom::Point3D< double >
Belle2::TRGCDCLpar::dldc
CLHEP::HepMatrix dldc() const
private const member functions
Definition: Lpar.cc:135
Belle2::TRGCDCLpar::operator!=
bool operator!=(const TRGCDCLpar &) const
comparison operators
Belle2::TRGCDCLpar::Cpar::da
double da() const
returns parameter of Cpar class
Definition: Lpar.h:106
Belle2::TRGCDCLpar::operator=
const TRGCDCLpar & operator=(const TRGCDCLpar &)
assignment operator(s)
Definition: Lpar.h:212
Belle2::TRGCDCLpar::scale
void scale(double s)
private member functions
Definition: Lpar.h:133
Belle2::TRGCDCLpar::m_beta
double m_beta
data members
Definition: Lpar.h:177
Belle2::TRGCDCLpar::arcfun
double arcfun(double xh, double yh) const
private const member functions
Definition: Lpar.h:279
Belle2::TRGCDCLpar::rotate
void rotate(double c, double s)
private member functions
Definition: Lpar.h:223
Belle2::TRGCDCLpar::s
double s(double x, double y) const
const member functions
Definition: Lpar.cc:215
Belle2::TRGCDCLpar::xhyh
void xhyh(double x, double y, double &xh, double &yh) const
private const member functions
Definition: Lpar.cc:202