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