PandaRoot
PndCATrackParamVector.h
Go to the documentation of this file.
1 //-*- Mode: C++ -*-
2 // $Id: PndCATrackParamVector.h,v 1.3 2011/01/31 17:18:32 fisyak Exp $
3 // ************************************************************************
4 // This file is property of and copyright by the ALICE HLT Project *
5 // ALICE Experiment at CERN, All rights reserved. *
6 // See cxx source for full Copyright notice *
7 // *
8 //*************************************************************************
9 
10 #ifndef PNDCATRACKPARAMVECTOR_H
11 #define PNDCATRACKPARAMVECTOR_H
12 
13 #include "PndCADef.h"
14 #include "PndCAVector.h"
15 #include "PndCAMath.h"
16 #include "PndCAParam.h"
18 #include "PndCAStation.h"
19 #include "PndCAHits.h"
20 
21 // class PndCAParam;
22 
24 // class PndCAParam;
25 // class PndCAHit;
26 class PndCAHitV;
27 class PndCATarget;
28 
37  // friend std::istream &operator>>( std::istream &, PndCATrackParamVector & );
38  // friend std::ostream &operator<<( std::ostream &, const PndCATrackParamVector & );
39  public:
40  PndCATrackParamVector() : fX(Vc::Zero), fSignCosPhi(Vc::Zero), fChi2(Vc::Zero), fNDF(Vc::Zero), fISec(Vc::Zero)
41  {
42  for (int i = 0; i < 5; ++i)
43  fP[i].setZero();
44  for (int i = 0; i < 15; ++i)
45  fC[i].setZero();
46  }
47 
48  void Reset()
49  {
50  fX.setZero();
51  fSignCosPhi = float_v(1.f);
52  fChi2.setZero();
53  fNDF.setZero();
54  // fISec.setZero();
55  {
56  for (int i = 0; i < 5; ++i)
57  fP[i].setZero();
58  for (int i = 0; i < 15; ++i)
59  fC[i].setZero();
60  }
61  }
62  void InitCovMatrix(float_v d2QMom = 0.f);
63  void InitByTarget(const PndCATarget &target);
64  void InitByHit(const PndCAHitV &hit, const PndCAParam &param, const float_v &dQMom);
65 
66  void InitDirection(float_v r0, float_v r1, float_v r2) // initialize direction parameters according to a given tangent vector
67  {
68  const float_v r = sqrt(r0 * r0 + r1 * r1);
69  SetSinPhi(r1 / r);
70  SetSignCosPhi(1.f); // r0/abs(r0) );
71  SetDzDs(r2 / r);
72  }
73 
75  float_v fBethe;
76  float_v fE;
77  float_v fTheta2;
78  float_v fEP2;
79  float_v fSigmadE2;
80  float_v fK22;
81  float_v fK33;
82  float_v fK43;
83  float_v fK44;
84  };
85 
86  float_v X() const { return fX; }
87  float_v Y() const { return fP[0]; }
88  float_v Z() const { return fP[1]; }
89  float_v SinPhi() const { return fP[2]; }
90  float_v DzDs() const { return fP[3]; }
91  float_v QPt() const { return fP[4]; }
92 
93  float_v Angle() const { return fAlpha; }
94  int_v ISec() const { return fISec; }
95 
96  float_v X0() const { return X(); }
97  float_v X1() const { return Y(); }
98  float_v X2() const { return Z(); }
99  float_v Tx1() const { return SinPhi() / (SignCosPhi() * sqrt(1 - SinPhi() * SinPhi())); } // CHECKME
100  float_v Tx2() const { return DzDs() / (SignCosPhi() * sqrt(1 - SinPhi() * SinPhi())); } // dx2/dx0 = dz/dx
101  float_v QMomentum() const { return QPt(); } // used for triplets comparison
102 
107  float_v SignCosPhi() const { return fSignCosPhi; }
108  float_v Chi2() const { return fChi2; }
109  int_v NDF() const { return fNDF; }
110 
111  float_v Err2Y() const { return fC[0]; }
112  float_v Err2Z() const { return fC[2]; }
113  float_v Err2SinPhi() const { return fC[5]; }
114  float_v Err2DzDs() const { return fC[9]; }
115  float_v Err2QPt() const { return fC[14]; }
116 
117  float_v GetX() const { return fX; }
118  float_v GetY() const { return fP[0]; }
119  float_v GetZ() const { return fP[1]; }
120  float_v GetSinPhi() const { return fP[2]; }
121  float_v GetDzDs() const { return fP[3]; }
122  float_v GetQPt() const { return fP[4]; }
123  float_v GetSignCosPhi() const { return fSignCosPhi; }
124  float_v GetChi2() const { return fChi2; }
125  int_v GetNDF() const { return fNDF; }
126 
127  float_v GetKappa(const float_v &Bz) const { return fP[4] * Bz; }
128  float_v GetCosPhiPositive() const { return CAMath::Sqrt(float_v(Vc::One) - SinPhi() * SinPhi()); }
129  float_v GetCosPhi() const { return fSignCosPhi * CAMath::Sqrt(float_v(Vc::One) - SinPhi() * SinPhi()); }
130 
131  float_v Err2X1() const { return fC[0]; }
132  float_v Err2X2() const { return fC[2]; }
133  // float_v GetErr2SinPhi() const { return fC[5]; }
134  // float_v GetErr2DzDs() const { return fC[9]; }
135  float_v Err2QMomentum() const { return fC[14]; }
136 
137  const float_v &Par(int i) const { return fP[i]; }
138  const float_v &Cov(int i) const { return fC[i]; }
139 
140  private:
141  friend class PndCATrackParam;
142  const float_v *Par() const { return fP; }
143  const float_v *Cov() const { return fC; }
144  float_v *Par() { return fP; }
145  float_v *Cov() { return fC; }
146 
147  public:
148  void SetTrackParam(const PndCATrackParamVector &param, const float_m &m = float_m(true))
149  {
150  for (int i = 0; i < 5; i++)
151  fP[i](m) = param.Par()[i];
152  for (int i = 0; i < 15; i++)
153  fC[i](m) = param.Cov()[i];
154  fX(m) = param.X();
155  fSignCosPhi(m) = param.SignCosPhi();
156  fChi2(m) = param.GetChi2();
157  fNDF(static_cast<int_m>(m)) = param.GetNDF();
158  fISec(m) = param.fISec;
159  }
160 
161  void SetTrackParam(const PndCATrackParamVector &p, int k, int m)
162  {
163  fX[k] = p.fX[m];
164  fSignCosPhi = float_v(1.f);
165  for (int i = 0; i < 5; i++)
166  fP[i][k] = p.Par()[i][m];
167  for (int i = 0; i < 15; i++)
168  fC[i][k] = p.Cov()[i][m];
169  fChi2[k] = p.fChi2[m];
170  fNDF[k] = p.fNDF[m];
171  fAlpha[k] = p.fAlpha[m];
172  fISec[k] = p.fISec[m];
173  }
174 
175  void SetPar(int i, const float_v &v) { fP[i] = v; }
176  void SetPar(int i, const float_v &v, const float_m &m) { fP[i](m) = v; }
177  void SetCov(int i, const float_v &v) { fC[i] = v; }
178  void SetCov(int i, const float_v &v, const float_m &m) { fC[i](m) = v; }
179 
180  void SetX(const float_v &v) { fX = v; }
181  void SetY(const float_v &v) { fP[0] = v; }
182  void SetZ(const float_v &v) { fP[1] = v; }
183  void SetX(const float_v &v, const float_m &m) { fX(m) = v; }
184  void SetY(const float_v &v, const float_m &m) { fP[0](m) = v; }
185  void SetZ(const float_v &v, const float_m &m) { fP[1](m) = v; }
186  void SetSinPhi(const float_v &v) { fP[2] = v; }
187  void SetSinPhi(const float_v &v, const float_m &m) { fP[2](m) = v; }
188  void SetDzDs(const float_v &v) { fP[3] = v; }
189  void SetDzDs(const float_v &v, const float_m &m) { fP[3](m) = v; }
190  void SetQPt(const float_v &v) { fP[4] = v; }
191  void SetQMomentum(const float_v &v) { SetQPt(v); }
192  void SetQPt(const float_v &v, const float_m &m) { fP[4](m) = v; }
193  void SetSignCosPhi(const float_v &v) { fSignCosPhi = v; }
194  void SetSignCosPhi(const float_v &v, const float_m &m) { fSignCosPhi(m) = v; }
195  void SetChi2(const float_v &v) { fChi2 = v; }
196  void SetChi2(const float_v &v, const float_m &m) { fChi2(m) = v; }
197  void SetNDF(int v) { fNDF = v; }
198  void SetNDF(const int_v &v) { fNDF = v; }
199  void SetNDF(const int_v &v, const int_m &m) { fNDF(m) = v; }
200 
201  void SetAngle(const float_v &v) { fAlpha = v; }
202  void SetAngle(const float_v &v, const float_m &m) { fAlpha(m) = v; }
203 
204  void SetISec(const int_v &v) { fISec = v; }
205  void SetISec(const int_v &v, const int_m &m) { fISec(m) = v; }
206 
207  void SetErr2Y(float_v v) { fC[0] = v; }
208  void SetErr2Z(float_v v) { fC[2] = v; }
209  void SetErr2QPt(float_v v) { fC[14] = v; }
210 
211  float_v GetDist2(const PndCATrackParamVector &t) const;
212  float_v GetDistXZ2(const PndCATrackParamVector &t) const;
213 
214  float_v GetS(const float_v &x, const float_v &y, const float_v &Bz) const;
215 
216  void GetDCAPoint(const float_v &x, const float_v &y, const float_v &z, float_v *px, float_v *py, float_v *pz, const float_v &Bz) const;
217 
218  float_m Transport0(const int_v &ista, const PndCAParam &param, const float_m &mask = float_m(true));
219  float_m Transport0(const PndCAHitV &hit, const PndCAParam &param, const float_m &mask = float_m(true));
220  float_m Transport0(const PndCAHit &hit, const PndCAParam &p, const float_m &mask = float_m(true));
221 
222  float_m TransportToXWithMaterial(const float_v &x, const float_v &XOverX0, const float_v &XThimesRho, const float_v &Bz, const float maxSinPhi = .999f);
223 
224  float_m TransportToX(const float_v &x, const float_v &Bz, const float maxSinPhi = .999f, const float_m &mask = float_m(true));
225 
226  float_m TransportToX(const float_v &x, PndCATrackLinearisationVector &t0, const float_v &Bz, const float maxSinPhi = .999f, float_v *DL = 0, const float_m &mask = float_m(true));
227 
228  float_m Transport0ToX(const float_v &x, const float_v &Bz, const float_m &mask);
229 
230  float_m TransportToX(const float_v &x, const float_v &sinPhi0, const float_v &Bz, const float_v maxSinPhi = .999f, const float_m &mask = float_m(true));
231 
232  float_m TransportToXWithMaterial(const float_v &x, PndCATrackLinearisationVector &t0, PndCATrackFitParam &par, const float_v &XOverX0, const float_v &XThimesRho,
233  const float_v &Bz, const float maxSinPhi = .999f, const float_m &mask = float_m(true));
234 
235  float_m TransportToXWithMaterial(const float_v &x, PndCATrackFitParam &par, const float_v &XOverX0, const float_v &XThimesRho, const float_v &Bz, const float maxSinPhi = .999f);
236 
237  float_m Rotate(const float_v &alpha, PndCATrackLinearisationVector &t0, const float maxSinPhi = .999f, const float_m &mask = float_m(true));
238  float_m Rotate(const float_v &alpha, const float maxSinPhi = .999f, const float_m &mask = float_m(true));
239  void RotateXY(float_v alpha, float_v &x, float_v &y, float_v &sin, const float_m &mask = float_m(true)) const;
240 
241  float_m FilterWithMaterial(const float_v &y, const float_v &z, float_v err2Y, float_v errYZ, float_v err2Z, float maxSinPhi = 0.999f, const float_m &mask = float_m(true),
242  const int_v &hitNDF = int_v(2), const float_v &chi2Cut = 10e10f); // filters 2-D measurement
243 
244  float_m FilterWithMaterial(const float_v &y, const float_v &z, const PndCAStripInfo &info, float_v err2, float maxSinPhi = 0.999f, const float_m &mask = float_m(true),
245  const float_v &chi2Cut = 10e10f); // filters 1-D measurement
246 
247  static float_v ApproximateBetheBloch(const float_v &beta2);
248  static float_v BetheBlochGeant(const float_v &bg, const float_v &kp0 = 2.33f, const float_v &kp1 = 0.20f, const float_v &kp2 = 3.00f, const float_v &kp3 = 173e-9f,
249  const float_v &kp4 = 0.49848f);
250  static float_v BetheBlochSolid(const float_v &bg);
251  static float_v BetheBlochGas(const float_v &bg);
252 
253  void CalculateFitParameters(PndCATrackFitParam &par, const float_v &mass = 0.13957f);
254  float_m CorrectForMeanMaterial(const float_v &xOverX0, const float_v &xTimesRho, const PndCATrackFitParam &par, const float_m &_mask);
255 
256  // float_m FilterDelta( const float_m &mask, const float_v &dy, const float_v &dz,
257  // float_v err2Y, float_v err2Z, const float maxSinPhi = .999f );
258  // float_m Filter( const float_m &mask, const float_v &y, const float_v &z,
259  // float_v err2Y, float_v err2Z, const float maxSinPhi = .999f );
260 
261  float_m
262  FilterVtx(const float_v &xV, const float_v &yV, const PndCAX1X2MeasurementInfo &info, float_v &extrDx, float_v &extrDy, float_v J[], const float_m &active = float_m(true));
263  float_m TransportJ0ToX0(const float_v &x0, const float_v &cBz, float_v &extrDy, float_v &extrDz, float_v J[], const float_m &active = float_m(true));
264 
265  float_m Transport(const int_v &ista, const PndCAParam &param, const float_m &mask = float_m(true));
266  float_m Transport(const PndCAHitV &hit, const PndCAParam &p, const float_m &mask = float_m(true));
267  float_m Filter(const PndCAHitV &hit, const PndCAParam &param, const float_m &mask = float_m(true), const float_v &chi2Cut = 10e10f);
268 
269  float_m Transport(const PndCAHit &hit, const PndCAParam &p, const float_m &mask = float_m(true));
270  float_m Filter(const PndCAHit &hit, const PndCAParam &param, const float_m &mask = float_m(true), const float_v &chi2Cut = 10e10f);
271 
272  float_m Accept(const PndCAHit &hit, const PndCAParam &param, const float_m &mask = float_m(true), const float_v &chi2Cut = 10e10f) const;
273  float_m AcceptWithMaterial(const float_v &y, const float_v &z, float_v err2Y, float_v errYZ, float_v err2Z, float maxSinPhi = 0.999f, const float_m &mask = float_m(true),
274  const int_v &hitNDF = int_v(2), const float_v &chi2Cut = 10e10f) const; // filters 2-D measurement
275 
276  float_m AcceptWithMaterial(const float_v &y, const float_v &z, const PndCAStripInfo &info, float_v err2, float maxSinPhi = 0.999f, const float_m &mask = float_m(true),
277  const float_v &chi2Cut = 10e10f) const; // filters 1-D measurement
278 
279  float_m AddTarget(const PndCATarget &target, const float_m &mask = float_m(true));
280 
281  public:
282  float_v fX; // x position
283  float_v fSignCosPhi; // sign of cosPhi
284  float_v fP[5]; // 'active' track parameters: Y, Z, SinPhi, DzDs, q/Pt
285  float_v fC[15]; // the covariance matrix for Y,Z,SinPhi,..
286  float_v fChi2; // the chi^2 value
287  int_v fNDF; // the Number of Degrees of Freedom
288 
289  float_v fAlpha; // coor system
290  int_v fISec;
291 };
292 
293 //#include "debug.h"
294 
295 inline float_m PndCATrackParamVector::TransportToX(const float_v &x, const float_v &sinPhi0, const float_v &Bz, const float_v maxSinPhi, const float_m &_mask)
296 {
297  //* Transport the track parameters to X=x, using linearization at phi0 with 0 curvature,
298  //* and the field value Bz
299  //* maxSinPhi is the max. allowed value for |t0.SinPhi()|
300  //* linearisation of trajectory t0 is also transported to X=x,
301  //* returns 1 if OK
302  //*
303 
304  // debugKF() << "Start TransportToX(" << x << ", " << _mask << ")\n" << *this << std::endl;
305 
306  const float_v &ey = sinPhi0;
307  const float_v &dx = x - X();
308  const float_v &exi = float_v(Vc::One) * CAMath::RSqrt(float_v(Vc::One) - ey * ey); // RSqrt
309 
310  const float_v &dxBz = dx * Bz;
311  const float_v &dS = dx * exi;
312  const float_v &h2 = dS * exi * exi;
313  const float_v &h4 = .5f * h2 * dxBz;
315  // const float_v &sinPhi = SinPhi() * (float_v( Vc::One ) - 0.5f * dxBz * QPt() *dxBz * QPt()/ ( float_v( Vc::One ) - SinPhi()*SinPhi() )) + dxBz * QPt();
316  const float_v &sinPhi = SinPhi() + dxBz * QPt();
318 
319  float_m mask = _mask && CAMath::Abs(exi) <= 1.e4f;
320  mask &= ((CAMath::Abs(sinPhi) <= maxSinPhi) || (maxSinPhi <= 0.f));
321 
322  fX(mask) += dx;
323  fP[0](mask) += dS * ey + h2 * (SinPhi() - ey) + h4 * QPt();
324  fP[1](mask) += dS * DzDs();
325  fP[2](mask) = sinPhi;
326 
327  // const float_v c00 = fC[0];
328  // const float_v c11 = fC[2];
329  const float_v c20 = fC[3];
330  // const float_v c21 = fC[4];
331  const float_v c22 = fC[5];
332  // const float_v c30 = fC[6];
333  const float_v c31 = fC[7];
334  // const float_v c32 = fC[8];
335  const float_v c33 = fC[9];
336  const float_v c40 = fC[10];
337  // const float_v c41 = fC[11];
338  const float_v c42 = fC[12];
339  // const float_v c43 = fC[13];
340  const float_v c44 = fC[14];
341 
342  const float_v two(2.f);
343 
344  fC[0](mask) += h2 * h2 * c22 + h4 * h4 * c44 + two * (h2 * c20 + h4 * (c40 + h2 * c42));
345 
346  // fC[1] ( mask ) += h2 * c21 + h4 * c41 + dS * ( c30 + h2 * c32 + h4 * c43 );
347  fC[2](mask) += dS * (two * c31 + dS * c33);
348 
349  fC[3](mask) += h2 * c22 + h4 * c42 + dxBz * (c40 + h2 * c42 + h4 * c44);
350  // fC[4] ( mask ) += dS * c32 + dxBz * ( c41 + dS * c43 );
351  const float_v &dxBz_c44 = dxBz * c44;
352  fC[12](mask) += dxBz_c44;
353  fC[5](mask) += dxBz * (two * c42 + dxBz_c44);
354 
355  // fC[6] ( mask ) += h2 * c32 + h4 * c43;
356  fC[7](mask) += dS * c33;
357  // fC[8] ( mask ) += dxBz * c43;
358  // fC[9] ( mask ) = c33;
359 
360  fC[10](mask) += h2 * c42 + h4 * c44;
361  // fC[11]( mask ) += dS * c43;
362  // fC[13]( mask ) = c43;
363  // fC[14]( mask ) = c44;
364 
365  // debugKF() << mask << "\n" << *this << std::endl;
366  return mask;
367 }
368 
369 inline float_m PndCATrackParamVector::Rotate(const float_v &alpha, const float maxSinPhi, const float_m &mask)
370 {
371  // Rotate the coordinate system in XY on the angle alpha
372  if ((CAMath::Abs(alpha) < 1e-6f || !mask).isFull())
373  return mask;
374 
375  const float_v cA = CAMath::Cos(alpha);
376  const float_v sA = CAMath::Sin(alpha);
377  const float_v x0 = X(), y0 = Y(), sP = SinPhi(), cP = GetCosPhi();
378  const float_v cosPhi = cP * cA + sP * sA;
379  const float_v sinPhi = -cP * sA + sP * cA;
380 
381  float_m ReturnMask(mask);
382  ReturnMask &= (!(CAMath::Abs(sinPhi) > maxSinPhi || CAMath::Abs(cosPhi) < 1.e-4f || CAMath::Abs(cP) < 1.e-4f));
383 
384  float_v tmp = alpha * 0.15915494f; // 1/(2.f*3.1415f);
385  ReturnMask &= abs(tmp - round(tmp)) < 0.167f; // allow turn by 60 degree only TODO scalar
386 
387  // float J[5][5] = { { j0, 0, 0, 0, 0 }, // Y
388  // { 0, 1, 0, 0, 0 }, // Z
389  // { 0, 0, j2, 0, 0 }, // SinPhi
390  // { 0, 0, 0, 1, 0 }, // DzDs
391  // { 0, 0, 0, 0, 1 } }; // Kappa
392 
393  const float_v j0 = cP / cosPhi;
394  const float_v j2 = cosPhi / cP;
395  const float_v d = SinPhi() - sP;
396 
397  SetX(x0 * cA + y0 * sA, ReturnMask);
398  SetY(-x0 * sA + y0 * cA, ReturnMask);
399 
400  SetSinPhi(sinPhi + j2 * d, ReturnMask);
401 
402  fC[0](ReturnMask) *= j0 * j0;
403  fC[1](ReturnMask) *= j0;
404  fC[3](ReturnMask) *= j0;
405  fC[6](ReturnMask) *= j0;
406  fC[10](ReturnMask) *= j0;
407 
408  fC[3](ReturnMask) *= j2;
409  fC[4](ReturnMask) *= j2;
410  fC[5](ReturnMask) *= j2 * j2;
411  fC[8](ReturnMask) *= j2;
412  fC[12](ReturnMask) *= j2;
413 
414  fAlpha(ReturnMask) += alpha;
415 
416  return ReturnMask;
417 }
418 
419 inline void PndCATrackParamVector::RotateXY(float_v alpha, float_v &x, float_v &y, float_v &sin, const float_m &mask) const
420 {
421  //* Rotate the coordinate system in XY on the angle alpha
422  if ((abs(alpha) < 1e-6f || !mask).isFull())
423  return;
424 
425  const float_v cA = CAMath::Cos(alpha);
426  const float_v sA = CAMath::Sin(alpha);
427 
428  x(mask) = (X() * cA + Y() * sA);
429  y(mask) = (-X() * sA + Y() * cA);
430  sin(mask) = -GetCosPhi() * sA + SinPhi() * cA;
431 }
432 
433 inline float_m
434 PndCATrackParamVector::FilterVtx(const float_v &yV, const float_v &zV, const PndCAX1X2MeasurementInfo &info, float_v &extrDy, float_v &extrDz, float_v J[], const float_m &active)
435 {
436  float_v zeta0, zeta1, S00, S10, S11, si;
437  float_v F00, F10, F20, F30, F40, F01, F11, F21, F31, F41;
438  float_v K00, K10, K20, K30, K40, K01, K11, K21, K31, K41;
439  float_v &c00 = fC[0];
440  float_v &c10 = fC[1];
441  float_v &c11 = fC[2];
442  float_v &c20 = fC[3];
443  float_v &c21 = fC[4];
444  float_v &c22 = fC[5];
445  float_v &c30 = fC[6];
446  float_v &c31 = fC[7];
447  float_v &c32 = fC[8];
448  float_v &c33 = fC[9];
449  float_v &c40 = fC[10];
450  float_v &c41 = fC[11];
451  float_v &c42 = fC[12];
452  float_v &c43 = fC[13];
453  float_v &c44 = fC[14];
454 
455  zeta0 = Y() + extrDy - yV;
456  zeta1 = Z() + extrDz - zV;
457 
458  // H = 1 0 J[0] J[1] J[2]
459  // 0 1 J[3] J[4] J[5]
460 
461  // F = CH'
462  F00 = c00;
463  F01 = c10;
464  F10 = c10;
465  F11 = c11;
466  F20 = J[0] * c22;
467  F21 = J[3] * c22;
468  F30 = J[1] * c33;
469  F31 = J[4] * c33;
470  F40 = J[2] * c44;
471  F41 = J[5] * c44;
472 
473  S00 = info.C00() + F00 + J[0] * F20 + J[1] * F30 + J[2] * F40;
474  S10 = info.C10() + F10 + J[3] * F20 + J[4] * F30 + J[5] * F40;
475  S11 = info.C11() + F11 + J[3] * F21 + J[4] * F31 + J[5] * F41;
476 
477  si = 1.f / (S00 * S11 - S10 * S10);
478  float_v S00tmp = S00;
479  S00 = si * S11;
480  S10 = -si * S10;
481  S11 = si * S00tmp;
482 
483  fChi2(active) += zeta0 * zeta0 * S00 + 2.f * zeta0 * zeta1 * S10 + zeta1 * zeta1 * S11;
484 
485  K00 = F00 * S00 + F01 * S10;
486  K01 = F00 * S10 + F01 * S11;
487  K10 = F10 * S00 + F11 * S10;
488  K11 = F10 * S10 + F11 * S11;
489  K20 = F20 * S00 + F21 * S10;
490  K21 = F20 * S10 + F21 * S11;
491  K30 = F30 * S00 + F31 * S10;
492  K31 = F30 * S10 + F31 * S11;
493  K40 = F40 * S00 + F41 * S10;
494  K41 = F40 * S10 + F41 * S11;
495 
496  fP[0](active) -= K00 * zeta0 + K01 * zeta1;
497  fP[1](active) -= K10 * zeta0 + K11 * zeta1;
498  fP[2](active) -= K20 * zeta0 + K21 * zeta1;
499  fP[3](active) -= K30 * zeta0 + K31 * zeta1;
500  fP[4](active) -= K40 * zeta0 + K41 * zeta1;
501 
502  c00(active) -= (K00 * F00 + K01 * F01);
503  c10(active) -= (K10 * F00 + K11 * F01);
504  c11(active) -= (K10 * F10 + K11 * F11);
505  c20(active) = -(K20 * F00 + K21 * F01);
506  c21(active) = -(K20 * F10 + K21 * F11);
507  c22(active) -= (K20 * F20 + K21 * F21);
508  c30(active) = -(K30 * F00 + K31 * F01);
509  c31(active) = -(K30 * F10 + K31 * F11);
510  c32(active) = -(K30 * F20 + K31 * F21);
511  c33(active) -= (K30 * F30 + K31 * F31);
512  c40(active) = -(K40 * F00 + K41 * F01);
513  c41(active) = -(K40 * F10 + K41 * F11);
514  c42(active) = -(K40 * F20 + K41 * F21);
515  c43(active) = -(K40 * F30 + K41 * F31);
516  c44(active) -= (K40 * F40 + K41 * F41);
517 
518  return active;
519 }
520 
521 inline float_m PndCATrackParamVector::TransportJ0ToX0(const float_v &x, const float_v &cBz, float_v &extrDy, float_v &extrDz, float_v J[], const float_m &active)
522 {
523  const float_v &ey = SinPhi();
524  const float_v &dx = x - X();
525  const float_v &exi = CAMath::RSqrt(float_v(Vc::One) - ey * ey); // RSqrt
526 
527  const float_v &dxBz = dx * cBz;
528  const float_v &dS = dx * exi;
529  const float_v &h2 = dS * exi * exi;
530  const float_v &h4 = .5f * h2 * dxBz;
531 
532  float_m mask = active && CAMath::Abs(exi) <= 1.e4f;
533 
534  extrDy(mask) = dS * ey;
535  extrDz(mask) = dS * DzDs();
536  J[0](mask) = dS;
537  J[1](mask) = 0;
538  J[2](mask) = h4;
539  J[3](mask) = dS;
540  J[4](mask) = dS;
541  J[5](mask) = 0;
542  return mask;
543 }
544 
546 
547 // std::istream &operator>>( std::istream &in, PndCATrackParamVector &ot );
548 // std::ostream &operator<<( std::ostream &out, const PndCATrackParamVector &ot );
549 
550 inline float_m PndCATrackParamVector::Transport0(const int_v &ista, const PndCAParam &param, const float_m &mask)
551 {
552  float_m active = mask;
553  // PndCATrackLinearisationVector tE( *this );
554  // active &= TransportToX( param.GetR( ista, active ), tE, param.cBz(), 0.999f, nullptr, active );
555  active &= Transport0ToX(param.GetR(ista, active), param.cBz(), active);
556  return active;
557 }
558 
559 inline float_m PndCATrackParamVector::Transport0(const PndCAHit &hit, const PndCAParam &param, const float_m &mask)
560 {
561  if (((CAMath::Abs(-fAlpha + hit.Angle()) < 1e-6f && CAMath::Abs(-fX + hit.X0()) < 2e-4f) || !mask).isFull())
562  return mask;
563  float_m active = mask;
564  // PndCATrackLinearisationVector tR( *this );
565  active &= Rotate(-fAlpha + hit.Angle(), .999f, active);
566  // active &= Rotate( -fAlpha + hit.Angle(), tR, .999f, active );
567  // active &= TransportToX( hit.X0(), tR, param.cBz(), 0.999f, nullptr, active );
568  active &= Transport0ToX(hit.X0(), param.cBz(), active);
569  return active;
570 }
571 
572 #endif
float_m FilterVtx(const float_v &xV, const float_v &yV, const PndCAX1X2MeasurementInfo &info, float_v &extrDx, float_v &extrDy, float_v J[], const float_m &active=float_m(true))
void InitByTarget(const PndCATarget &target)
const float_v & C00() const
const float * Cov() const
float_m TransportJ0ToX0(const float_v &x0, const float_v &cBz, float_v &extrDy, float_v &extrDz, float_v J[], const float_m &active=float_m(true))
void SetChi2(const float_v &v, const float_m &m)
float_m Rotate(const float_v &alpha, PndCATrackLinearisationVector &t0, const float maxSinPhi=.999f, const float_m &mask=float_m(true))
float_m TransportToX(const float_v &x, const float_v &Bz, const float maxSinPhi=.999f, const float_m &mask=float_m(true))
void CalculateFitParameters(PndCATrackFitParam &par, const float_v &mass=0.13957f)
float_m Transport0ToX(const float_v &x, const float_v &Bz, const float_m &mask)
float_m FilterWithMaterial(const float_v &y, const float_v &z, float_v err2Y, float_v errYZ, float_v err2Z, float maxSinPhi=0.999f, const float_m &mask=float_m(true), const int_v &hitNDF=int_v(2), const float_v &chi2Cut=10e10f)
void SetSinPhi(const float_v &v, const float_m &m)
__m128 m
Definition: P4_F32vec4.h:26
void SetAngle(const float_v &v)
void SetSignCosPhi(const float_v &v)
float_m Accept(const PndCAHit &hit, const PndCAParam &param, const float_m &mask=float_m(true), const float_v &chi2Cut=10e10f) const
void SetSinPhi(const float_v &v)
friend F32vec4 sqrt(const F32vec4 &a)
Definition: P4_F32vec4.h:28
static T Sqrt(const T &x)
Definition: PndCAMath.h:45
void SetChi2(const float_v &v)
float Angle() const
Definition: PndCAHits.h:52
friend F32vec4 sin(const F32vec4 &a)
Definition: P4_F32vec4.h:118
static T Sin(const T &x)
Definition: PndCAMath.h:71
float GetR(short iSt) const
Definition: PndCAParam.h:66
float_v GetDist2(const PndCATrackParamVector &t) const
const float * Par() const
static float_v BetheBlochGeant(const float_v &bg, const float_v &kp0=2.33f, const float_v &kp1=0.20f, const float_v &kp2=3.00f, const float_v &kp3=173e-9f, const float_v &kp4=0.49848f)
static T Cos(const T &x)
Definition: PndCAMath.h:76
__m128 v
Definition: P4_F32vec4.h:3
void SetNDF(const int_v &v)
float cBz() const
Definition: PndCAParam.h:48
unsigned int i
Definition: P4_F32vec4.h:21
static float_v BetheBlochSolid(const float_v &bg)
void SetISec(const int_v &v)
void SetAngle(const float_v &v, const float_m &m)
static T Abs(const T &x)
Definition: PndCAMath.h:56
float_m Filter(const PndCAHitV &hit, const PndCAParam &param, const float_m &mask=float_m(true), const float_v &chi2Cut=10e10f)
void SetTrackParam(const PndCATrackParamVector &param, const float_m &m=float_m(true))
void SetSignCosPhi(const float_v &v, const float_m &m)
float_m Transport0(const int_v &ista, const PndCAParam &param, const float_m &mask=float_m(true))
static float_v ApproximateBetheBloch(const float_v &beta2)
float_v GetDistXZ2(const PndCATrackParamVector &t) const
static T RSqrt(const T &x)
Definition: PndCAMath.h:50
float_v GetKappa(const float_v &Bz) const
float_m TransportToXWithMaterial(const float_v &x, const float_v &XOverX0, const float_v &XThimesRho, const float_v &Bz, const float maxSinPhi=.999f)
void InitCovMatrix(float_v d2QMom=0.f)
float_m AddTarget(const PndCATarget &target, const float_m &mask=float_m(true))
void SetQPt(const float_v &v)
void SetCov(int i, const float_v &v)
void RotateXY(float_v alpha, float_v &x, float_v &y, float_v &sin, const float_m &mask=float_m(true)) const
void SetX(const float_v &v, const float_m &m)
void SetY(const float_v &v, const float_m &m)
void InitDirection(float_v r0, float_v r1, float_v r2)
void SetY(const float_v &v)
void SetQMomentum(const float_v &v)
void SetCov(int i, const float_v &v, const float_m &m)
float_m CorrectForMeanMaterial(const float_v &xOverX0, const float_v &xTimesRho, const PndCATrackFitParam &par, const float_m &_mask)
const float_v & C11() const
void GetDCAPoint(const float_v &x, const float_v &y, const float_v &z, float_v *px, float_v *py, float_v *pz, const float_v &Bz) const
void SetX(const float_v &v)
float_m AcceptWithMaterial(const float_v &y, const float_v &z, float_v err2Y, float_v errYZ, float_v err2Z, float maxSinPhi=0.999f, const float_m &mask=float_m(true), const int_v &hitNDF=int_v(2), const float_v &chi2Cut=10e10f) const
void SetDzDs(const float_v &v)
float f
Definition: P4_F32vec4.h:20
void SetNDF(const int_v &v, const int_m &m)
void SetPar(int i, const float_v &v)
float_m Transport(const int_v &ista, const PndCAParam &param, const float_m &mask=float_m(true))
void InitByHit(const PndCAHitV &hit, const PndCAParam &param, const float_v &dQMom)
void SetTrackParam(const PndCATrackParamVector &p, int k, int m)
const float_v & C10() const
void SetISec(const int_v &v, const int_m &m)
double alpha
Definition: f_Init.h:7
void SetQPt(const float_v &v, const float_m &m)
PndCATrackParamVector TrackParamVector
const float_v & Cov(int i) const
void SetZ(const float_v &v, const float_m &m)
void SetDzDs(const float_v &v, const float_m &m)
double pz[39]
Definition: pipisigmas.h:13
float_v GetS(const float_v &x, const float_v &y, const float_v &Bz) const
float X0() const
Definition: PndCAHits.h:35
float_v GetCosPhiPositive() const
static float_v BetheBlochGas(const float_v &bg)
const float_v & Par(int i) const
void SetPar(int i, const float_v &v, const float_m &m)
void SetZ(const float_v &v)