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