24 Double_t zIn = par->GetZ();
25 fField = FairRunAna::Instance()->GetField();
31 xIn[2] = par->GetTx();
32 xIn[3] = par->GetTy();
33 xIn[4] = par->GetQp();
34 vector<Double_t> xOut(5, 0.);
35 vector<Double_t> F1(25, 0.);
39 vector<Double_t> cIn(15, 0.0);
41 par->CovMatrix(cIn_tmp);
42 for (Int_t
i = 0;
i < 15; ++
i) {
45 vector<Double_t> cOut(15, 0.0);
53 Double_t cOut_tmp[15];
54 for (Int_t
i = 0;
i < 15; ++
i) {
55 cOut_tmp[
i] = cOut[
i];
57 par->SetCovMatrix(cOut_tmp);
61 F->assign(F1.begin(), F1.end());
68 vector<Double_t>& xOut,
70 vector<Double_t>& derivs)
72 const Double_t fC = 0.000299792458;
74 Double_t coef[4] = {0.0, 0.5, 0.5, 1.0};
76 Double_t Ax[4], Ay[4];
77 Double_t dAx_dtx[4], dAy_dtx[4], dAx_dty[4], dAy_dty[4];
80 Double_t h = zOut - zIn;
82 Double_t hCqp = h * fC * xIn[4];
85 Double_t x[4] = {xIn[0], xIn[1], xIn[2], xIn[3]};
87 for (UInt_t iStep = 0; iStep < 4; iStep++) {
89 for (UInt_t
i = 0;
i < 4;
i++) {
90 x[
i] = xIn[
i] + coef[iStep] * k[
i][iStep - 1];
94 Double_t Bx = fField->GetBx(x[0], x[1], zIn + coef[iStep] * h);
95 Double_t By = fField->GetBy(x[0], x[1], zIn + coef[iStep] * h);
96 Double_t Bz = fField->GetBz(x[0], x[1], zIn + coef[iStep] * h);
100 Double_t txtx = tx * tx;
101 Double_t tyty = ty * ty;
102 Double_t txty = tx * ty;
103 Double_t txtxtyty1 = 1.0 + txtx + tyty;
104 Double_t t1 = Sqrt(txtxtyty1);
105 Double_t t2 = 1.0 / txtxtyty1;
107 Ax[iStep] = (txty * Bx + ty * Bz - (1.0 + txtx) * By) * t1;
108 Ay[iStep] = (-txty * By - tx * Bz + (1.0 + tyty) * Bx) * t1;
110 dAx_dtx[iStep] = Ax[iStep] * tx * t2 + (ty * Bx - 2.0 * tx * By) * t1;
111 dAx_dty[iStep] = Ax[iStep] * ty * t2 + (tx * Bx + Bz) * t1;
112 dAy_dtx[iStep] = Ay[iStep] * tx * t2 + (-ty * By - Bz) * t1;
113 dAy_dty[iStep] = Ay[iStep] * ty * t2 + (-tx * By + 2.0 * ty * Bx) * t1;
115 k[0][iStep] = tx * h;
116 k[1][iStep] = ty * h;
117 k[2][iStep] = Ax[iStep] * hCqp;
118 k[3][iStep] = Ay[iStep] * hCqp;
122 for (UInt_t
i = 0;
i < 4;
i++) {
149 for (UInt_t iStep = 0; iStep < 4; iStep++) {
151 for (UInt_t
i = 0;
i < 4;
i++) {
153 x[
i] = x0[
i] + coef[iStep] * k[
i][iStep - 1];
158 k[0][iStep] = x[2] * h;
159 k[1][iStep] = x[3] * h;
161 k[3][iStep] = (dAy_dtx[iStep] * x[2] + dAy_dty[iStep] * x[3]) * hCqp;
164 derivs[2] =
CalcOut(x0[0], k[0]);
165 derivs[7] =
CalcOut(x0[1], k[1]);
167 derivs[17] =
CalcOut(x0[3], k[3]);
176 for (UInt_t iStep = 0; iStep < 4; iStep++) {
178 for (UInt_t
i = 0;
i < 4;
i++) {
180 x[
i] = x0[
i] + coef[iStep] * k[
i][iStep - 1];
185 k[0][iStep] = x[2] * h;
186 k[1][iStep] = x[3] * h;
187 k[2][iStep] = (dAx_dtx[iStep] * x[2] + dAx_dty[iStep] * x[3]) * hCqp;
191 derivs[3] =
CalcOut(x0[0], k[0]);
192 derivs[8] =
CalcOut(x0[1], k[1]);
193 derivs[13] =
CalcOut(x0[2], k[2]);
203 for (UInt_t iStep = 0; iStep < 4; iStep++) {
205 for (UInt_t
i = 0;
i < 4;
i++) {
206 x[
i] = x0[
i] + coef[iStep] * k[
i][iStep - 1];
210 k[0][iStep] = x[2] * h;
211 k[1][iStep] = x[3] * h;
212 k[2][iStep] = Ax[iStep] * hC + hCqp * (dAx_dtx[iStep] * x[2] + dAx_dty[iStep] * x[3]);
213 k[3][iStep] = Ay[iStep] * hC + hCqp * (dAy_dtx[iStep] * x[2] + dAy_dty[iStep] * x[3]);
216 derivs[4] =
CalcOut(x0[0], k[0]);
217 derivs[9] =
CalcOut(x0[1], k[1]);
218 derivs[14] =
CalcOut(x0[2], k[2]);
219 derivs[19] =
CalcOut(x0[3], k[3]);
229 Double_t A = cIn[2] + F[2] * cIn[9] + F[3] * cIn[10] + F[4] * cIn[11];
230 Double_t B = cIn[3] + F[2] * cIn[10] + F[3] * cIn[12] + F[4] * cIn[13];
231 Double_t C = cIn[4] + F[2] * cIn[11] + F[3] * cIn[13] + F[4] * cIn[14];
233 Double_t D = cIn[6] + F[7] * cIn[9] + F[8] * cIn[10] + F[9] * cIn[11];
234 Double_t E = cIn[7] + F[7] * cIn[10] + F[8] * cIn[12] + F[9] * cIn[13];
235 Double_t G = cIn[8] + F[7] * cIn[11] + F[8] * cIn[13] + F[9] * cIn[14];
237 Double_t H = cIn[9] + F[13] * cIn[10] + F[14] * cIn[11];
238 Double_t I = cIn[10] + F[13] * cIn[12] + F[14] * cIn[13];
239 Double_t J = cIn[11] + F[13] * cIn[13] + F[14] * cIn[14];
241 Double_t K = cIn[13] + F[17] * cIn[11] + F[19] * cIn[14];
243 cOut[0] = cIn[0] + F[2] * cIn[2] + F[3] * cIn[3] + F[4] * cIn[4] + A * F[2] + B * F[3] + C * F[4];
244 cOut[1] = cIn[1] + F[2] * cIn[6] + F[3] * cIn[7] + F[4] * cIn[8] + A * F[7] + B * F[8] + C * F[9];
245 cOut[2] = A + B * F[13] + C * F[14];
246 cOut[3] = B + A * F[17] + C * F[19];
249 cOut[5] = cIn[5] + F[7] * cIn[6] + F[8] * cIn[7] + F[9] * cIn[8] + D * F[7] + E * F[8] + G * F[9];
250 cOut[6] = D + E * F[13] + G * F[14];
251 cOut[7] = E + D * F[17] + G * F[19];
254 cOut[9] = H + I * F[13] + J * F[14];
255 cOut[10] = I + H * F[17] + J * F[19];
259 cIn[12] + F[17] * cIn[10] + F[19] * cIn[13] + (F[17] * cIn[9] + cIn[10] + F[19] * cIn[11]) * F[17] + K * F[19];
276 static const Double_t ONE = 1., TWO = 2.;
278 Double_t dxx = hit->GetDx() * hit->GetDx();
280 Double_t dyy = hit->GetDy() * hit->GetDy();
283 Double_t dx = hit->GetX() - par->GetX();
284 Double_t dy = hit->GetY() - par->GetY();
288 (dxx * dyy + dxx * cIn[5] + dyy * cIn[0] + cIn[0] * cIn[5] - dxy * dxy - TWO * dxy * cIn[1] - cIn[1] * cIn[1]);
293 / (dxx * dyy + dxx * cIn[5] + dyy * cIn[0] + cIn[0] * cIn[5] - dxy * dxy - TWO * dxy * cIn[1]
296 Double_t R00 = (dyy + cIn[5]) * t;
297 Double_t R01 = -(dxy + cIn[1]) * t;
298 Double_t R11 = (dxx + cIn[0]) * t;
301 Double_t K00 = cIn[0] * R00 + cIn[1] * R01;
302 Double_t K01 = cIn[0] * R01 + cIn[1] * R11;
303 Double_t K10 = cIn[1] * R00 + cIn[5] * R01;
304 Double_t K11 = cIn[1] * R01 + cIn[5] * R11;
305 Double_t K20 = cIn[2] * R00 + cIn[6] * R01;
306 Double_t K21 = cIn[2] * R01 + cIn[6] * R11;
307 Double_t K30 = cIn[3] * R00 + cIn[7] * R01;
308 Double_t K31 = cIn[3] * R01 + cIn[7] * R11;
309 Double_t K40 = cIn[4] * R00 + cIn[8] * R01;
310 Double_t K41 = cIn[4] * R01 + cIn[8] * R11;
313 Double_t xOut[5] = {par->GetX(), par->GetY(), par->GetTx(), par->GetTy(), par->GetQp()};
314 xOut[0] += K00 * dx + K01 * dy;
316 xOut[1] += K10 * dx + K11 * dy;
317 xOut[2] += K20 * dx + K21 * dy;
318 xOut[3] += K30 * dx + K31 * dy;
319 xOut[4] += K40 * dx + K41 * dy;
324 for (Int_t
i = 0;
i < 15; ++
i)
327 cOut[0] += -K00 * cIn[0] - K01 * cIn[1];
328 cOut[1] += -K00 * cIn[1] - K01 * cIn[5];
329 cOut[2] += -K00 * cIn[2] - K01 * cIn[6];
330 cOut[3] += -K00 * cIn[3] - K01 * cIn[7];
331 cOut[4] += -K00 * cIn[4] - K01 * cIn[8];
333 cOut[5] += -K11 * cIn[5] - K10 * cIn[1];
334 cOut[6] += -K11 * cIn[6] - K10 * cIn[2];
335 cOut[7] += -K11 * cIn[7] - K10 * cIn[3];
336 cOut[8] += -K11 * cIn[8] - K10 * cIn[4];
338 cOut[9] += -K20 * cIn[2] - K21 * cIn[6];
339 cOut[10] += -K20 * cIn[3] - K21 * cIn[7];
340 cOut[11] += -K20 * cIn[4] - K21 * cIn[8];
342 cOut[12] += -K30 * cIn[3] - K31 * cIn[7];
343 cOut[13] += -K30 * cIn[4] - K31 * cIn[8];
345 cOut[14] += -K40 * cIn[4] - K41 * cIn[8];
353 par->SetCovMatrix(cOut);
356 Double_t xmx = hit->GetX() - par->GetX();
357 Double_t ymy = hit->GetY() - par->GetY();
358 Double_t C0 = cOut[0];
359 Double_t C1 = cOut[1];
360 Double_t C5 = cOut[5];
362 Double_t norm = dxx * dyy - dxx * C5 - dyy * C0 + C0 * C5 - dxy * dxy + 2 * dxy * C1 - C1 * C1;
364 chiSq = ((xmx * (dyy - C5) - ymy * (dxy - C1)) * xmx + (-xmx * (dxy - C1) + ymy * (dxx - C0)) * ymy) / norm;
388 vector<Double_t> invPrevPredC;
389 for (Int_t
i = 0;
i < 15; ++
i) {
390 invPrevPredC.push_back(cov1[
i]);
395 vector<Double_t> Ft(prevNode->
GetF());
400 vector<Double_t> thisUpdC;
401 for (Int_t
i = 0;
i < 15; ++
i) {
402 thisUpdC.push_back(cov2[
i]);
405 vector<Double_t> A(25);
406 vector<Double_t> temp1(25);
410 vector<Double_t> thisUpdX;
417 vector<Double_t> prevSmoothedX;
424 vector<Double_t> prevPredX;
431 vector<Double_t> temp2(5), temp3(5);
432 Subtract(prevSmoothedX, prevPredX, temp2);
434 vector<Double_t> thisSmoothedX(5);
435 Add(thisUpdX, temp3, thisSmoothedX);
439 vector<Double_t> prevSmoothedC;
440 for (Int_t
i = 0;
i < 15; ++
i) {
441 prevSmoothedC.push_back(cov3[
i]);
446 vector<Double_t> prevPredC;
447 for (Int_t
i = 0;
i < 15; ++
i) {
448 prevPredC.push_back(cov4[
i]);
451 vector<Double_t> temp4(15);
452 Subtract(prevSmoothedC, prevPredC, temp4);
454 vector<Double_t> temp5(15);
456 vector<Double_t> thisSmoothedC(15);
457 Add(thisUpdC, temp5, thisSmoothedC);
461 par.SetX(thisSmoothedX[0]);
462 par.SetY(thisSmoothedX[1]);
463 par.SetTx(thisSmoothedX[2]);
464 par.SetTy(thisSmoothedX[3]);
465 par.SetQp(thisSmoothedX[4]);
468 for (Int_t
i = 0;
i < 15; ++
i) {
469 cov5[
i] = thisSmoothedC[
i];
471 par.SetCovMatrix(cov5);
502 Double_t zIn = par->GetZ();
503 Double_t dz = zOut - zIn;
505 Bool_t downstream = dz > 0;
517 Int_t nofSteps = Int_t(abs(dz) / 10);
529 for (Int_t iStep = 0; iStep < nofSteps + 1; iStep++) {
536 if (iStep != nofSteps)
537 z = (downstream) ? z + stepSize : z - stepSize;
542 vector<BmnMaterialInfo> inter;
548 for (UInt_t iMat = 0; iMat < inter.size(); iMat++) {
553 vector<Double_t>* Fnew = NULL;
555 Fnew =
new vector<Double_t>(25, 0.);
569 fMaterial->
Update(par, &mat, pdg, downstream);
575 Float_t x0 = par->GetX();
576 Float_t y0 = par->GetY();
577 Float_t
z0 = par->GetZ();
578 Float_t ty = par->GetTy();
579 Float_t tx = par->GetTx();
580 Float_t xOut = tx * (zOut -
z0) + x0;
581 Float_t yOut = ty * (zOut -
z0) + y0;
586 *length = Sqrt(Sq(xOut - x0) + Sq(yOut - y0) + Sq(zOut -
z0));