LCFIPlus  0.6.5
geometry.h
Go to the documentation of this file.
1 // geometry.h
2 
3 #ifndef geometry_h
4 #define geometry_h 1
5 
6 #include "lcfiplus.h"
7 #include "TVector3.h"
8 
9 #include "Math/SVector.h"
10 #include "Math/SMatrix.h"
11 
12 namespace lcfiplus {
13 
14 class PointBase;
15 class Point;
16 class Helix;
17 class VertexLine;
18 
19 class PointBase { // pure virtual point-base class
20  public:
21  virtual double LogLikelihood(const TVector3& p)const = 0;
22  virtual void LogLikelihoodDeriv(const TVector3& p,double* output)const = 0;
23  virtual ~PointBase() {}
24 
25  protected:
26  PointBase() {}
27 };
28 
29 class Point : public PointBase { // real 3D-point with error
30  public:
31  typedef ROOT::Math::SVector<double, 3> SVector3;
32  typedef ROOT::Math::SMatrix<double, 3,3,ROOT::Math::MatRepSym<double,3> > SMatrixSym3;
33 
34  double LogLikelihood(const TVector3& p)const;
35  void LogLikelihoodDeriv(const TVector3& p, double* output)const;
36 
37  Point() {}
38  Point(const SVector3& pos, const SMatrixSym3& err) {
39  _pos = pos;
40  _err = err;
41  }
42  Point(const Point& ref) {
43  _pos = ref._pos;
44  _err = ref._err;
45  }
46  Point(const Vertex* vtx);
47  ~Point() {}
48 
49  void SetPosErr(const SVector3& pos, const SMatrixSym3& err) {
50  _pos = pos;
51  _err = err;
52  }
53  double GetErr(int i, int j)const {
54  return _err(i,j);
55  }
56  TVector3 GetPos()const {
57  return TVector3(_pos(0), _pos(1), _pos(2));
58  }
59  private:
60  SVector3 _pos;
61  SMatrixSym3 _err;
62 };
63 
64 class Helix : public PointBase { // parametrized point for helix
65  public:
66  enum par { id0=0, iz0, iph, iom, itd, parN };
67 
68  typedef ROOT::Math::SVector<double, 5> SVector5;
69  typedef ROOT::Math::SVector<double, 3> SVector3;
70  typedef ROOT::Math::SMatrix<double, 5,5,ROOT::Math::MatRepSym<double,5> > SMatrixSym5;
71  typedef ROOT::Math::SMatrix<double, 5,3> SMatrix53; // used for helix-xyz conversion
72  typedef ROOT::Math::SMatrix<double, 3,5> SMatrix35; // used for helix-xyz conversion
73  typedef ROOT::Math::SMatrix<double, 3,3,ROOT::Math::MatRepSym<double,3> > SMatrixSym3; // used for xyz error
74  typedef ROOT::Math::SMatrix<double, 3,3> SMatrix3;
75 
77  public:
78  HelixLineDistance2Functor(const Helix* hel, const VertexLine* line): _hel(hel), _line(line) {}
79  double operator() (const double* t);
80 
81  private:
82  const Helix* _hel;
83  const VertexLine* _line;
84  };
85 
87  public:
88  HelixLineDistance2DerivFunctor(const Helix* hel, const VertexLine* line): _hel(hel), _line(line) {}
89  void operator() (const double* t, double* output);
90 
91  private:
92  const Helix* _hel;
93  const VertexLine* _line;
94  };
95 
97  public:
98  VarianceFunctor(const Helix* hel, const TVector3& p) : _hel(hel), _p(p) {}
99  double operator() (const double* t) {
100  return _hel->Variance(_p,*t);
101  }
102  private:
103  const Helix* _hel;
104  TVector3 _p;
105  };
106 
108  public:
109  VarianceDerivFunctor(const Helix* hel, const TVector3& p) : _hel(hel), _p(p) {}
110  double operator() (const double* t) {
111  return _hel->VarianceDeriv(_p,*t);
112  }
113  private:
114  const Helix* _hel;
115  TVector3 _p;
116  };
117 
118  virtual double LogLikelihood(const TVector3& p)const {// likelihood with t-minimization
119  double tmin;
120  return LogLikelihood(p, tmin);
121  }
122  double LogLikelihood(const TVector3& p, double& tmin)const;// full version
123  void LogLikelihoodDeriv(const TVector3& p, double* output)const;// compute space partial derivatives
124  double Variance(const TVector3& p, double t)const; // t-fixed version, internally used
125  double VarianceDeriv(const TVector3& p, double t)const; // t-fixed version, internally used
126  double VarianceDeriv2(const TVector3& p, double t)const; // t-fixed version, internally used
127  TVector3 GetPos(double t)const;
128  TVector3 GetPosDerivT(double t)const;
129  void GetPosErr(double t, SVector3& pos, SMatrixSym3& err)const;
130  void GetPosErr(double t, SVector3& pos, SMatrixSym3& err, SMatrix53& trackToXyz)const;
131  void GetPosErrDeriv(double t, SVector3& pos, SMatrixSym3& err)const;
132  void GetPosErrDeriv2(double t, SVector3& pos, SMatrixSym3& err)const;
133 
134  double LongitudinalDeviation(const Vertex* ip, const Vertex* sec);
135 
136  Helix() {}
137  Helix(const SVector5& hel, const SMatrixSym5& err, int charge) {
138  _hel = hel, _err = err;
139  _charge = charge;
140  }
141  Helix(const Track* trk);
142  Helix(const Helix& ref) {
143  _hel = ref._hel;
144  _err = ref._err;
145  _charge = ref._charge;
146  }
147  ~Helix() {}
148 
149  void GetCenter(double& x, double& y)const;
150  void FindZCross(double x, double y, double& zi, double& zp)const;
151  // obtain closest points in x-y plane and choose nearest z position - not the TRUE closest point
152  TVector3 ClosePoint(const Helix& hel)const;
153  TVector3 ClosePoint(const VertexLine& line, double* distance = 0)const;
154 
155  private:
156  SVector5 _hel;
157  SMatrixSym5 _err;
158  int _charge;
159 };
160 
161 class VertexLine : public PointBase { // line with error for IP-vertex line
162  typedef ROOT::Math::SVector<double, 3> SVector3;
163  typedef ROOT::Math::SMatrix<double, 3,3,ROOT::Math::MatRepSym<double,3> > SMatrixSym3; // used for xyz error
164 
165  friend TVector3 Helix::ClosePoint(const VertexLine& line, double* distance)const;
168 
169  class VarianceFunctor {
170  public:
171  VarianceFunctor(const VertexLine& line, const TVector3& p) : _line(line), _p(p) {}
172  double operator() (const double* t) {
173  return _line.Variance(_p,*t);
174  }
175  private:
176  const VertexLine& _line;
177  TVector3 _p;
178  };
179 
180  public:
181  virtual double LogLikelihood(const TVector3& p)const {// likelihood with t-minimization
182  double tmin;
183  return LogLikelihood(p, tmin);
184  }
185  double LogLikelihood(const TVector3& p, double& tmin)const;
186  void LogLikelihoodDeriv(const TVector3& p, double* output)const;
187  double Variance(const TVector3& p, double t)const; // t-fixed version, internally used
188 
190  VertexLine(const Vertex* ip, const Vertex* secvtx) {
191  _ip = ip;
192  _vertex = secvtx;
193  _origin = _vertex->getPos();
194  _unit = (_origin - _ip->getPos()).Unit();
195  }
196  VertexLine(const TVector3& origin, const TVector3& dir) {
197  _origin = origin;
198  _unit = dir.Unit();
199  _ip = 0;
200  _vertex = 0;
201  }
203 
204  void Set(const TVector3& origin, const TVector3& dir) {
205  _origin = origin;
206  _unit = dir.Unit();
207  }
208 
209  private:
210  // (x,y,z) = origin + t * unit
211  TVector3 _origin;
212  TVector3 _unit;
213 
214  const Vertex* _ip;
215  const Vertex* _vertex;
216  /*
217  double _dispersionNear;
218  double _dispersionFar;
219  */
220 };
221 
223  public:
224  static GeometryHandler* Instance();
225 
227  public:
228  PointFitFunctor(const vector<PointBase*>& points) : _points(points) {}
229  double operator() (const double* xx) {
230  TVector3 p(xx[0], xx[1], xx[2]);
231 
232  double ll = 0.;
233  for (unsigned int i=0; i<_points.size(); i++) {
234  ll += _points[i]->LogLikelihood(p);
235  }
236 
237  return -ll;
238  }
239  private:
240  const vector<PointBase*> _points;
241  };
242 
244  public:
245  PointFitDerivFunctor(const vector<PointBase*>& points) : _points(points) {}
246  void operator() (const double* xx, double* output) {
247  output[0] = 0;
248  output[1] = 0;
249  output[2] = 0;
250 
251  TVector3 p(xx[0], xx[1], xx[2]);
252 
253  double tmp[3];
254 
255  for (unsigned int i=0; i<_points.size(); i++) {
256  _points[i]->LogLikelihoodDeriv(p,tmp);
257  output[0] += tmp[0];
258  output[1] += tmp[1];
259  output[2] += tmp[2];
260  }
261  }
262  private:
263  const vector<PointBase*> _points;
264  };
265 
266  // obtain cross section of points with errors
267  double PointFit(const vector<PointBase*>& points, const TVector3& initial, Point* result = 0);
268  // initialization + PointFit()
269  double HelixPointFit(const vector<Helix*>& helices, Point* result = 0);
270 
271  private:
272  static GeometryHandler* _theInstance;
273  GeometryHandler();
274  ~GeometryHandler();
275 };
276 
277 
278 }
279 
280 #endif
ROOT::Math::SMatrix< double, 5, 5, ROOT::Math::MatRepSym< double, 5 > > SMatrixSym5
Definition: Driver.cc:963
ROOT::Math::SVector< double, 5 > SVector5
Definition: geometry.h:68
Definition: geometry.h:66
VertexLine()
Definition: geometry.h:189
~Helix()
Definition: geometry.h:147
double Variance(const TVector3 &p, double t) const
Helix(const SVector5 &hel, const SMatrixSym5 &err, int charge)
Definition: geometry.h:137
Definition: geometry.h:66
double GetErr(int i, int j) const
Definition: geometry.h:53
Definition: lcfiplus.h:771
par
Definition: geometry.h:66
Definition: geometry.h:222
double operator()(const double *t)
Definition: geometry.h:99
double LongitudinalDeviation(const Vertex *ip, const Vertex *sec)
ROOT::Math::SMatrix< double, 3, 3, ROOT::Math::MatRepSym< double, 3 > > SMatrixSym3
Definition: Driver.cc:962
ROOT::Math::SMatrix< double, 3, 5 > SMatrix35
Definition: geometry.h:72
void GetPosErr(double t, SVector3 &pos, SMatrixSym3 &err) const
Definition: geometry.h:66
Definition: lcfiplus.h:384
void LogLikelihoodDeriv(const TVector3 &p, double *output) const
ROOT::Math::SMatrix< double, 3, 3, ROOT::Math::MatRepSym< double, 3 > > SMatrixSym3
Definition: geometry.h:73
void operator()(const double *xx, double *output)
Definition: geometry.h:246
double operator()(const double *xx)
Definition: geometry.h:229
Definition: geometry.h:64
ROOT::Math::SMatrix< double, 5, 5, ROOT::Math::MatRepSym< double, 5 > > SMatrixSym5
Definition: geometry.h:70
static GeometryHandler * Instance()
TVector3 getPos() const
Definition: lcfiplus.h:817
Definition: geometry.h:66
Definition: geometry.h:107
double LogLikelihood(const TVector3 &p) const
void operator()(const double *t, double *output)
PointBase()
Definition: geometry.h:26
PointFitFunctor(const vector< PointBase * > &points)
Definition: geometry.h:228
ROOT::Math::SVector< double, 3 > SVector3
Definition: Driver.cc:958
double operator()(const double *t)
Definition: geometry.h:110
double Variance(const TVector3 &p, double t) const
double HelixPointFit(const vector< Helix * > &helices, Point *result=0)
void GetPosErrDeriv2(double t, SVector3 &pos, SMatrixSym3 &err) const
ROOT::Math::SVector< double, 3 > SVector3
Definition: geometry.h:69
VertexLine(const Vertex *ip, const Vertex *secvtx)
Definition: geometry.h:190
ROOT::Math::SMatrix< double, 5, 3 > SMatrix53
Definition: geometry.h:71
void Set(const TVector3 &origin, const TVector3 &dir)
Definition: geometry.h:204
Definition: geometry.h:29
TVector3 GetPos() const
Definition: geometry.h:56
virtual void LogLikelihoodDeriv(const TVector3 &p, double *output) const =0
Definition: geometry.h:96
void SetPosErr(const SVector3 &pos, const SMatrixSym3 &err)
Definition: geometry.h:49
Point(const SVector3 &pos, const SMatrixSym3 &err)
Definition: geometry.h:38
Definition: geometry.h:66
Helix(const Helix &ref)
Definition: geometry.h:142
void FindZCross(double x, double y, double &zi, double &zp) const
HelixLineDistance2DerivFunctor(const Helix *hel, const VertexLine *line)
Definition: geometry.h:88
void GetCenter(double &x, double &y) const
double VarianceDeriv2(const TVector3 &p, double t) const
Definition: geometry.h:161
TVector3 ClosePoint(const Helix &hel) const
Definition: geometry.h:19
void LogLikelihoodDeriv(const TVector3 &p, double *output) const
double PointFit(const vector< PointBase * > &points, const TVector3 &initial, Point *result=0)
virtual double LogLikelihood(const TVector3 &p) const =0
void GetPosErrDeriv(double t, SVector3 &pos, SMatrixSym3 &err) const
ROOT::Math::SMatrix< double, 3, 3 > SMatrix3
Definition: geometry.h:74
Helix()
Definition: geometry.h:136
double VarianceDeriv(const TVector3 &p, double t) const
TVector3 GetPosDerivT(double t) const
TVector3 GetPos(double t) const
~Point()
Definition: geometry.h:47
PointFitDerivFunctor(const vector< PointBase * > &points)
Definition: geometry.h:245
HelixLineDistance2Functor(const Helix *hel, const VertexLine *line)
Definition: geometry.h:78
void LogLikelihoodDeriv(const TVector3 &p, double *output) const
~VertexLine()
Definition: geometry.h:202
virtual double LogLikelihood(const TVector3 &p) const
Definition: geometry.h:118
Point(const Point &ref)
Definition: geometry.h:42
ROOT::Math::SMatrix< double, 3, 3, ROOT::Math::MatRepSym< double, 3 > > SMatrixSym3
Definition: geometry.h:32
ROOT::Math::SVector< double, 3 > SVector3
Definition: geometry.h:31
VarianceDerivFunctor(const Helix *hel, const TVector3 &p)
Definition: geometry.h:109
Point()
Definition: geometry.h:37
virtual ~PointBase()
Definition: geometry.h:23
VarianceFunctor(const Helix *hel, const TVector3 &p)
Definition: geometry.h:98
Definition: geometry.h:66
virtual double LogLikelihood(const TVector3 &p) const
Definition: geometry.h:181
VertexLine(const TVector3 &origin, const TVector3 &dir)
Definition: geometry.h:196