23 #ifndef PNDFTSCATRACKPARAM_H 24 #define PNDFTSCATRACKPARAM_H 47 : x(v.
X()[i]), y(v.
Y()[i]), tx(v.Tx()[i]), ty(v.Ty()[i]), qp(v.
QP()[i]), z(v.
Z()[i]), C00(v.
Cov(0)[i]), C10(v.
Cov(1)[i]), C11(v.
Cov(2)[i]), C20(v.
Cov(3)[i]), C21(v.
Cov(4)[i]),
48 C22(v.
Cov(5)[i]), C30(v.
Cov(6)[i]), C31(v.
Cov(7)[i]), C32(v.
Cov(8)[i]), C33(v.
Cov(9)[i]), C40(v.
Cov(10)[i]), C41(v.
Cov(11)[i]), C42(v.
Cov(12)[i]), C43(v.
Cov(13)[i]),
49 C44(v.
Cov(14)[i]), chi2(v.
Chi2()[i]), ndf(v.
NDF()[i]), fAlpha(v.
Angle()[i])
53 float X0()
const {
return z; }
54 float X1()
const {
return x; }
55 float X2()
const {
return y; }
56 float Tx1()
const {
return tx; }
57 float Tx2()
const {
return ty; }
59 float X()
const {
return x; }
60 float Y()
const {
return y; }
61 float Z()
const {
return z; }
62 float Tx()
const {
return tx; }
63 float Ty()
const {
return ty; }
64 float QP()
const {
return qp; }
66 float Chi2()
const {
return chi2; }
67 int NDF()
const {
return ndf; }
70 float Angle()
const {
return fAlpha; }
72 float Err2X1()
const {
return Err2X(); }
74 float Err2Tx1()
const {
return Err2Tx(); }
75 float Err2Tx2()
const {
return Err2Ty(); }
77 float Err2X()
const {
return C00; }
78 float Err2Y()
const {
return C11; }
79 float Err2Tx()
const {
return C22; }
80 float Err2Ty()
const {
return C33; }
81 float Err2QP()
const {
return C44; }
84 float *
Par() {
return &x; }
85 float *
Cov() {
return &C00; }
87 float Par(
int i)
const 100 float Cov(
int i)
const 123 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);
183 x = y = tx = ty = qp = z = C00 = C10 = C11 = C20 = C21 = C22 = C30 = C31 = C32 = C33 = C40 = C41 = C42 = C43 = C44 = 0.f;
188 bool TransportToX0Line(
float x0);
190 bool IsValid()
const {
return chi2 != -1; }
193 bool Rotate(
float) {
return 1; };
196 float x, y, tx, ty, qp, z, C00, C10, C11, C20, C21, C22, C30, C31, C32, C33, C40, C41, C42, C43, C44;
204 inline bool PndFTSCATrackParam::TransportToX0Line(
float x0_out)
206 float dz = (x0_out - z);
212 const float dzC32_in = dz * C32;
215 C10 += dz * (C21 + C30);
217 const float C20_in = C20;
220 C00 += dz * (C20 + C20_in);
222 const float C31_in = C31;
225 C11 += dz * (C31 + C31_in);
244 for (
int j = 0; j < 5; ++j)
245 fP[j] = v.
Par()[j][
i];
246 for (
int j = 0; j < 15; ++j)
247 fC[j] = v.
Cov()[j][
i];
250 float X0()
const {
return fX; }
251 float X1()
const {
return Y(); }
252 float X2()
const {
return Z(); }
254 float X()
const {
return fX; }
255 float Y()
const {
return fP[0]; }
256 float Z()
const {
return fP[1]; }
258 float DzDs()
const {
return fP[3]; }
259 float QPt()
const {
return fP[4]; }
264 float Chi2()
const {
return fChi2; }
265 int NDF()
const {
return fNDF; }
270 float Err2Y()
const {
return fC[0]; }
271 float Err2Z()
const {
return fC[2]; }
276 float Angle()
const {
return fAlpha; }
278 float Kappa(
float Bz)
const {
return fP[4] * Bz; }
283 const float *
Par()
const {
return fP; }
284 const float *
Cov()
const {
return fC; }
286 bool GetXYZPxPyPzQ(
float &x,
float &y,
float &z,
float &px,
float &py,
float &
pz,
int &q,
float cov[21])
const;
290 void GetDCAPoint(
float x,
float y,
float z,
float &px,
float &py,
float &pz,
float Bz)
const;
292 bool TransportToX0(
float x,
float Bz,
float maxSinPhi = .999);
306 for (
int i = 0; i < 5; i++)
308 for (
int i = 0; i < 15; i++)
313 float S(
float x,
float y,
float Bz)
const;
333 const float ex =
CosPhi();
334 const float ey =
SinPhi();
335 const float k =
QPt() * Bz;
336 const float dx = x -
X();
338 const float ey1 = k * dx + ey;
349 const float dx2 = dx * dx;
350 const float ss = ey + ey1;
351 const float cc = ex + ex1;
356 const float cci = 1.f / cc;
357 const float exi = 1.f / ex;
358 const float ex1i = 1.f / ex1;
360 const float tg = ss * cci;
362 const float dy = dx * tg;
367 float dSin = dl * k * 0.5;
373 const float dz = dS *
DzDs();
381 const float h2 = dx * (1.f + ey * ey1 + ex * ex1) * exi * ex1i * cci;
382 const float h4 = dx2 * (cc + ss * ey1 * ex1i) * cci * cci * Bz;
383 const float dxBz = dx * Bz;
391 const float c00 = fC[0];
392 const float c10 = fC[1];
393 const float c11 = fC[2];
394 const float c20 = fC[3];
395 const float c21 = fC[4];
396 const float c22 = fC[5];
397 const float c30 = fC[6];
398 const float c31 = fC[7];
399 const float c32 = fC[8];
400 const float c33 = fC[9];
401 const float c40 = fC[10];
402 const float c41 = fC[11];
403 const float c42 = fC[12];
404 const float c43 = fC[13];
405 const float c44 = fC[14];
407 fC[0] = (c00 + h2 * h2 * c22 + h4 * h4 * c44 + 2.f * (h2 * c20 + h4 * c40 + h2 * h4 * c42));
409 fC[1] = c10 + h2 * c21 + h4 * c41 + dS * (c30 + h2 * c32 + h4 * c43);
410 fC[2] = c11 + 2.f * dS * c31 + dS * dS * c33;
412 fC[3] = c20 + h2 * c22 + h4 * c42 + dxBz * (c40 + h2 * c42 + h4 * c44);
413 fC[4] = c21 + dS * c32 + dxBz * (c41 + dS * c43);
414 fC[5] = c22 + 2.f * dxBz * c42 + dxBz * dxBz * c44;
416 fC[6] = c30 + h2 * c32 + h4 * c43;
417 fC[7] = c31 + dS * c33;
418 fC[8] = c32 + dxBz * c43;
421 fC[10] = c40 + h2 * c42 + h4 * c44;
422 fC[11] = c41 + dS * c43;
423 fC[12] = c42 + dxBz * c44;
427 fC[0] = (fC[0] + h2 * h2 * fC[5] + h4 * h4 * fC[14] + 2 * (h2 * fC[3] + h4 * fC[10] + h2 * h4 * fC[12]));
429 fC[1] = fC[1] + h2 * fC[4] + h4 * fC[11] + dS * (fC[6] + h2 * fC[8] + h4 * fC[13]);
430 fC[2] = fC[2] + 2 * dS * fC[7] + dS * dS * fC[9];
432 fC[3] = fC[3] + h2 * fC[5] + h4 * fC[12] + dxBz * (fC[10] + h2 * fC[12] + h4 * fC[14]);
433 fC[4] = fC[4] + dS * fC[8] + dxBz * (fC[11] + dS * fC[13]);
434 fC[5] = fC[5] + 2 * dxBz * fC[12] + dxBz * dxBz * fC[14];
436 fC[6] = fC[6] + h2 * fC[8] + h4 * fC[13];
437 fC[7] = fC[7] + dS * fC[9];
438 fC[8] = fC[8] + dxBz * fC[13];
441 fC[10] = fC[10] + h2 * fC[12] + h4 * fC[14];
442 fC[11] = fC[11] + dS * fC[13];
443 fC[12] = fC[12] + dxBz * fC[14];
static T ASin(const T &x)
basic_istream< char, char_traits< char > > istream
bool GetXYZPxPyPzQ(float &x, float &y, float &z, float &px, float &py, float &pz, int &q, float cov[21]) const
float Kappa(float Bz) const
bool Transport(const FTSCAHit &hit, const PndFTSCAParam ¶m)
bool Rotate(float alpha, float maxSinPhi=.999)
friend F32vec4 sqrt(const F32vec4 &a)
float Err2QMomentum() const
static T Sqrt(const T &x)
friend std::istream & operator>>(std::istream &, PndFTSCATrackParam &)
friend std::ostream & operator<<(std::ostream &, const PndFTSCATrackParam &)
PndFTSCATrackParam(const TrackParamVector &v, int i)
void GetDCAPoint(float x, float y, float z, float &px, float &py, float &pz, float Bz) const
float_m Transport(const int_v &ista, const PndFTSCAParam ¶m, const float_m &mask=float_m(true))
const float * Par() const
const float * Cov() const
PndFTSCATrackParam TrackParam
bool TransportToX0(float x, float Bz, float maxSinPhi=.999)
basic_ostream< char, char_traits< char > > ostream
const float_v & Cov(int i) const
void ConvertTrackParamToVector(PndFTSCATrackParam t0[float_v::Size], int nTracksV)
const float_v & Par(int i) const
float_m Filter(const FTSCAHitV &hit, const PndFTSCAParam ¶m, const float_m &mask=float_m(true), const float_v &chi2Cut=10e10f)