12 #ifndef PNDFTSCATRACKPARAM_H
13 #define PNDFTSCATRACKPARAM_H
37 :
x( v.
X()[i] ),
y( v.
Y()[i] ), tx( v.Tx()[i] ), ty( v.Ty()[i] ), qp( v.
QP()[i] ),
z( v.
Z()[i] ),
58 float X0()
const {
return z; }
59 float X1()
const {
return x; }
60 float X2()
const {
return y; }
61 float Tx1()
const {
return tx; }
62 float Tx2()
const {
return ty; }
64 float X()
const {
return x; }
65 float Y()
const {
return y; }
66 float Z()
const {
return z; }
67 float Tx()
const {
return tx; }
68 float Ty()
const {
return ty; }
69 float QP()
const {
return qp; }
71 float Chi2()
const {
return chi2; }
72 int NDF()
const {
return ndf; }
77 float Err2X1()
const {
return Err2X(); }
79 float Err2Tx1()
const {
return Err2Tx(); }
80 float Err2Tx2()
const {
return Err2Ty(); }
82 float Err2X()
const {
return C00; }
83 float Err2Y()
const {
return C11; }
84 float Err2Tx()
const {
return C22; }
85 float Err2Ty()
const {
return C33; }
86 float Err2QP()
const {
return C44; }
89 float*
Par() {
return &
x; }
90 float*
Cov() {
return &C00; }
92 float Par(
int i )
const {
100 assert(0);
return -1;
103 float Cov(
int i )
const {
121 assert(0);
return -1;
124 void SetCov(
int i,
float v ) {
126 case 0: C00 =
v;
break;
127 case 1: C10 =
v;
break;
128 case 2: C11 =
v;
break;
129 case 3: C20 =
v;
break;
130 case 4: C21 =
v;
break;
131 case 5: C22 =
v;
break;
132 case 6: C30 =
v;
break;
133 case 7: C31 =
v;
break;
134 case 8: C32 =
v;
break;
135 case 9: C33 =
v;
break;
136 case 10: C40 =
v;
break;
137 case 11: C41 =
v;
break;
138 case 12: C42 =
v;
break;
139 case 13: C43 =
v;
break;
140 case 14: C44 =
v;
break;
144 void SetX(
float v ) {
x =
v; }
145 void SetY(
float v ) {
y =
v; }
146 void SetZ(
float v ) {
z =
v; }
148 void SetTX(
float v ) { tx =
v; }
149 void SetTY(
float v ) { ty =
v; }
150 void SetQP(
float v ) { qp =
v; }
152 void SetChi2(
float v ) { chi2 =
v; }
153 void SetNDF(
int v ) { ndf =
v; }
160 return TransportToX0Line( x_ );
167 const float_m &mask = v.
Transport( hit, param );
176 const float_m &mask = v.
Filter( hit, param );
186 C40= C41= C42= C43= C44=0.f;
190 bool TransportToX0Line(
float x0 );
192 bool IsValid()
const {
return chi2 != -1; }
195 bool Rotate(
float ){
return 1; };
200 float x,
y,tx,ty,qp,
z,
205 C40, C41, C42, C43, C44;
213 inline bool PndFTSCATrackParam::TransportToX0Line(
float x0_out )
215 float dz = (x0_out -
z);
221 const float dzC32_in = dz * C32;
224 C10 += dz * ( C21 + C30 );
226 const float C20_in = C20;
229 C00 += dz * ( C20 + C20_in );
231 const float C31_in = C31;
234 C11 += dz * ( C31 + C31_in );
259 for (
int j = 0; j < 5; ++j )
fP[j] = v.
Par()[j][
i];
260 for (
int j = 0; j < 15; ++j )
fC[j] = v.
Cov()[j][
i];
263 float X0()
const {
return fX; }
264 float X1()
const {
return Y(); }
265 float X2()
const {
return Z(); }
267 float X()
const {
return fX; }
268 float Y()
const {
return fP[0]; }
269 float Z()
const {
return fP[1]; }
291 float Kappa(
float Bz )
const {
return fP[4]*Bz; }
296 const float *
Par()
const {
return fP; }
297 const float *
Cov()
const {
return fC; }
299 bool GetXYZPxPyPzQ(
float&
x,
float&
y,
float&
z,
float& px,
float& py,
float&
pz,
int& q,
float cov[21] )
const;
304 float &px,
float &py,
float &
pz,
float Bz )
const;
309 bool Rotate(
float alpha,
float maxSinPhi = .999 );
320 for(
int i=0; i < 5; i++)
fP[i] = 0;
321 for(
int i=0; i < 15; i++)
fC[i] = 0;
325 float S(
float x,
float y,
float Bz )
const;
345 const float ex =
CosPhi();
346 const float ey =
SinPhi();
347 const float k =
QPt() * Bz;
348 const float dx = x -
X();
350 const float ey1 = k * dx + ey;
357 if ( ex < 0 ) ex1 = -ex1;
359 const float dx2 = dx *
dx;
360 const float ss = ey + ey1;
361 const float cc = ex + ex1;
365 const float cci = 1.f / cc;
366 const float exi = 1.f / ex;
367 const float ex1i = 1.f / ex1;
369 const float tg = ss * cci;
371 const float dy = dx * tg;
374 if ( cc < 0 ) dl = -dl;
375 float dSin = dl * k * 0.5;
376 if ( dSin > 1.
f ) dSin = 1.f;
377 if ( dSin < -1.
f ) dSin = -1.f;
379 const float dz = dS *
DzDs();
388 const float h2 = dx * ( 1.f + ey * ey1 + ex * ex1 ) * exi * ex1i * cci;
389 const float h4 = dx2 * ( cc + ss * ey1 * ex1i ) * cci * cci * Bz;
390 const float dxBz = dx * Bz;
398 const float c00 =
fC[0];
399 const float c10 =
fC[1];
400 const float c11 =
fC[2];
401 const float c20 =
fC[3];
402 const float c21 =
fC[4];
403 const float c22 =
fC[5];
404 const float c30 =
fC[6];
405 const float c31 =
fC[7];
406 const float c32 =
fC[8];
407 const float c33 =
fC[9];
408 const float c40 =
fC[10];
409 const float c41 =
fC[11];
410 const float c42 =
fC[12];
411 const float c43 =
fC[13];
412 const float c44 =
fC[14];
414 fC[0] = ( c00 + h2 * h2 * c22 + h4 * h4 * c44
415 + 2.f * ( h2 * c20 + h4 * c40 + h2 * h4 * c42 ) );
417 fC[1] = c10 + h2 * c21 + h4 * c41 + dS * ( c30 + h2 * c32 + h4 * c43 );
418 fC[2] = c11 + 2.f * dS * c31 + dS * dS * c33;
420 fC[3] = c20 + h2 * c22 + h4 * c42 + dxBz * ( c40 + h2 * c42 + h4 * c44 );
421 fC[4] = c21 + dS * c32 + dxBz * ( c41 + dS * c43 );
422 fC[5] = c22 + 2.f * dxBz * c42 + dxBz * dxBz * c44;
424 fC[6] = c30 + h2 * c32 + h4 * c43;
425 fC[7] = c31 + dS * c33;
426 fC[8] = c32 + dxBz * c43;
429 fC[10] = c40 + h2 * c42 + h4 * c44;
430 fC[11] = c41 + dS * c43;
431 fC[12] = c42 + dxBz * c44;
435 fC[0] = ( fC[0] + h2 * h2 * fC[5] + h4 * h4 * fC[14]
436 + 2 * ( h2 * fC[3] + h4 * fC[10] + h2 * h4 * fC[12] ) );
438 fC[1] = fC[1] + h2 * fC[4] + h4 * fC[11] + dS * ( fC[6] + h2 * fC[8] + h4 * fC[13] );
439 fC[2] = fC[2] + 2 * dS * fC[7] + dS * dS * fC[9];
441 fC[3] = fC[3] + h2 * fC[5] + h4 * fC[12] + dxBz * ( fC[10] + h2 * fC[12] + h4 * fC[14] );
442 fC[4] = fC[4] + dS * fC[8] + dxBz * ( fC[11] + dS * fC[13] );
443 fC[5] = fC[5] + 2 * dxBz * fC[12] + dxBz * dxBz * fC[14];
445 fC[6] = fC[6] + h2 * fC[8] + h4 * fC[13];
446 fC[7] = fC[7] + dS * fC[9];
447 fC[8] = fC[8] + dxBz * fC[13];
450 fC[10] = fC[10] + h2 * fC[12] + h4 * fC[14];
451 fC[11] = fC[11] + dS * fC[13];
452 fC[12] = fC[12] + dxBz * fC[14];
static T ASin(const T &x)
const float_v & Cov(int i) const
bool Transport(const FTSCAHit &hit, const PndFTSCAParam ¶m)
void GetDCAPoint(float x, float y, float z, float &px, float &py, float &pz, float Bz) const
bool Rotate(float alpha, float maxSinPhi=.999)
friend F32vec4 sqrt(const F32vec4 &a)
static T Sqrt(const T &x)
PndCATrackParam TrackParam
const float * Par() const
std::ostream & operator<<(std::ostream &o, const PndEventInfo &a)
friend std::istream & operator>>(std::istream &, PndFTSCATrackParam &)
friend std::ostream & operator<<(std::ostream &, const PndFTSCATrackParam &)
PndFTSCATrackParam(const TrackParamVector &v, int i)
const float * Cov() const
float_m Transport(const int_v &ista, const PndFTSCAParam ¶m, const float_m &mask=float_m(true))
bool GetXYZPxPyPzQ(float &x, float &y, float &z, float &px, float &py, float &pz, int &q, float cov[21]) const
bool TransportToX0(float x, float Bz, float maxSinPhi=.999)
float Err2QMomentum() const
TBuffer & operator>>(TBuffer &buf, PndAnaPidSelector *&obj)
const float_v & Par(int i) const
float S(float x, float y, float Bz) const
void ConvertTrackParamToVector(PndFTSCATrackParam t0[float_v::Size], int nTracksV)
float Kappa(float Bz) const
float_m Filter(const FTSCAHitV &hit, const PndFTSCAParam ¶m, const float_m &mask=float_m(true), const float_v &chi2Cut=10e10f)