31 #include "AliExternalTrackParam.h"
33 #include <TGeoGlobalMagField.h>
34 #include <TGeoManager.h>
36 #include <TDatabasePDG.h>
38 #include <Riostream.h>
60 const Double_t x[3] = {0.,0.,fgkSimpleBPosition};
61 Double_t b[3] = {0.,0.,0.};
62 TGeoGlobalMagField::Instance()->Field(x,b);
63 cout<<Form(
"Field = %e %e %e",b[0],b[1],b[2])<<endl;
64 fgSimpleBValue = b[2];
65 fgFieldON = (TMath::Abs(fgSimpleBValue) > 1.e-10) ? kTRUE : kFALSE;
111 cout<<
"Sagitta"<<endl;
115 cout<<Form(
"q param = %f %f %f chi2 = %e ",q0, q1,q2,chi2)<<endl;
116 cout<<Form(
"pt from 2nd order parameter %f ",0.01/q2/2.*0.3*
fgSimpleBValue/10.)<<endl;
119 Double_t maxDist = 0.;
122 Double_t sagitta = 0.;
124 Double_t distTot = 0.;
126 for (
int i=0; i<nVal-1; i++) {
127 distTot += TMath::Sqrt((xVal[i]-xVal[i+1]) * (xVal[i]-xVal[i+1]) + (yVal[i]-yVal[i+1]) * (yVal[i]-yVal[i+1]));
129 for (
int j = i+1; j<nVal; j++) {
130 Double_t dist = (xVal[i]-xVal[j]) * (xVal[i]-xVal[j]) + (yVal[i]-yVal[j]) * (yVal[i]-yVal[j]);
139 cout<<Form(
"distMAx = %f distTot =%f i1 = %d i2 =%d",TMath::Sqrt(maxDist),distTot,i1,i2)<<endl;
141 distL2 = 1.e-2*TMath::Sqrt((xVal[i1]-xVal[i2]) * (xVal[i1]-xVal[i2]) + (yVal[i1]-yVal[i2]) * (yVal[i1]-yVal[i2]) );
143 Double_t p1 = (yVal[i1]-yVal[i2]) / (xVal[i1]-xVal[i2]);
144 Double_t p0 = yVal[i2] - xVal[i2] * p1;
145 cout<<Form(
"p param = %f %f ",p0, p1)<<endl;
146 q2 = TMath::Sign(q2,q1*q2*(-(p0 + p1 * (xVal[i1]+xVal[i2])/2.))*(
fgSimpleBValue));
149 Double_t y12 = q0+q1*xVal[i1]+q2*xVal[i1]*xVal[i1];
150 Double_t y22 = q0+q1*xVal[i2]+q2*xVal[i2]*xVal[i2];
151 cout<<Form(
"x1, y1 %f %f ",xVal[i1], y12)<<endl;
152 cout<<Form(
"x2, y2 %f %f ",xVal[i2], y22)<<endl;
158 Double_t maxSagitta = 0.;
159 for (
int i=0; i<20; i++) {
160 Double_t step =TMath::Abs(xVal[i1]-xVal[i2])/20.;
161 Double_t xmiddle = xVal[i1] + i*step;
163 Double_t y1 = p0 + p1 * xmiddle;
164 Double_t p1perp = -1./p1;
165 Double_t p0perp = p0 + xmiddle *(p1-p1perp);
168 Double_t xmax = (p1perp - q1 + TMath::Sqrt(p1perp*p1perp - 2*p1perp*q1 + q1*q1 + 4*p0perp*q2 - 4*q0*q2))/(2*q2);
169 Double_t xmax2 = -(q1 -p1perp + TMath::Sqrt(p1perp*p1perp - 2*p1perp*q1 + q1*q1 + 4*p0perp*q2 - 4*q0*q2))/(2*q2);
172 if (TMath::Abs(xmax2-xmiddle) < TMath::Abs(xmax-xmiddle)) xmax = xmax2;
175 Double_t y2 = q0 + q1 * xmax + q2 * xmax * xmax;
177 sagitta = 1e-2*TMath::Sqrt((xmiddle-xmax) * (xmiddle-xmax) + (y1-y2) * (y1-y2) );
183 if(TMath::Abs(sagitta)>TMath::Abs(maxSagitta)) maxSagitta = sagitta;
186 cout<<Form(
" Max sagitta = %e => pt = %f",maxSagitta, 0.3*0.5*distL2*distL2/8./maxSagitta)<<endl;
231 Double_t meanx =0, meany=0.;
233 for (Int_t i = 0; i< nVal; i++) {
234 meanx =(meanx*i+xVal[i])/(i+1);
235 meany =(meany*i+yVal[i])/(i+1);
237 Double_t cov_xy = 0., var_x=0., var_y=0.;
238 for (Int_t i = 0; i< nVal; i++) {
239 var_x += (xVal[i] -meanx) * (xVal[i] -meanx);
240 var_y += (yVal[i] -meany) * (yVal[i] -meany);
241 cov_xy += (xVal[i] -meanx) * (yVal[i] -meany);
243 if(var_x<1.e-6)
return 0.;
245 p0 = meany - p1 * meanx;
249 for (Int_t i = 0; i< nVal; i++) {
250 yest = xVal[i]*p1+p0;
251 chi2 += (yest-yVal[i]) * (yest-yVal[i]);
267 TMatrixD xtrans(3,nVal);
269 for (
int i=0; i<nVal; i++) {
273 x(i,2) = xVal[i]*xVal[i];
275 xtrans(1,i) = xVal[i];
276 xtrans(2,i) = xVal[i]*xVal[i];
278 TMatrixD tmp(xtrans,TMatrixD::kMult,x);
281 TMatrixD tmp2(xtrans,TMatrixD::kMult,y);
282 TMatrixD b(tmp,TMatrixD::kMult,tmp2);
289 TMatrixD tmp3(x,TMatrixD::kMult,b);
290 TMatrixD tmp4(y,TMatrixD::kMinus,tmp3);
291 TMatrixD
chi2(tmp4,TMatrixD::kTransposeMult,tmp4);
302 Double_t sumxi2 =0., sumxi =0., sumxiyi =0., sumyi =0.,sumyi2 =0., sumxi3 =0., sumyi3 =0.;
303 Double_t sumxi2yi=0., sumxiyi2=0.;
305 for (
int i=0; i<nVal; i++) {
308 ri = TMath::Sqrt(xi*xi + yi*yi);
319 sumxi2yi += xi*xi*yi;
320 sumxiyi2 += xi*yi*yi;
323 Double_t A = nVal * sumxi2 - sumxi*sumxi;
324 Double_t B = nVal * sumxiyi - sumxi*sumyi;
325 Double_t C = nVal * sumyi2 - sumyi*sumyi;
326 Double_t D = 0.5*(nVal*sumxiyi2 -sumxi*sumyi2 +nVal*sumxi3 -sumxi*sumxi2);
327 Double_t E = 0.5*(nVal*sumxi2yi -sumyi*sumxi2 +nVal*sumyi3 -sumyi*sumyi2);
329 Double_t aM = (D*C-B*E) / (A*C-B*B);
330 Double_t bM = (A*E-B*D) / (A*C-B*B);
335 for (
int i=0; i<nVal; i++) {
339 rM += TMath::Sqrt( (xi-aM)*(xi-aM) + (yi-bM)*(yi-bM) );
340 rK += ((xi-aM)*(xi-aM) + (yi-bM)*(yi-bM) );
343 rK = TMath::Sqrt(rK/nVal);
345 cout<<Form(
"aM %f bM %f rM %f rK %f => pt = %f or %f ",aM,bM,rM,rK,rM*0.3*0.5, rK*0.3*0.5)<<endl;
356 if (trackParam->
GetZ() == zEnd)
return;
359 Double_t
dZ = zEnd - trackParam->
GetZ();
363 trackParam->
SetZ(zEnd);
372 if (trackParam->
GetZ() == zEnd)
return;
376 cout<<
"W-AliMUONTrackExtrap::LinearExtrapToZCov: Covariance matrix does not exist"<<endl;
383 Double_t
dZ = zEnd - trackParam->
GetZ();
386 trackParam->
SetZ(zEnd);
395 TMatrixD tmp(trackParam->
GetCovariances(),TMatrixD::kMultTranspose,jacob);
396 TMatrixD tmp2(jacob,TMatrixD::kMult,tmp);
423 if (trackParam->
GetZ() == zEnd)
return kTRUE;
424 Double_t forwardBackward;
425 if (zEnd < trackParam->GetZ()) forwardBackward = 1.0;
426 else forwardBackward = -1.0;
427 Double_t v3[7], v3New[7];
428 Int_t i3, stepNumber;
440 while (((-forwardBackward * (v3[2] - zEnd)) <= 0.0) && (stepNumber <
fgkMaxStepNumber)) {
445 if ((-forwardBackward * (v3New[2] - zEnd)) > 0.0)
break;
447 for (i3 = 0; i3 < 7; i3++) {
455 Double_t dZ12 = v3New[2] - v3[2];
456 if (TMath::Abs(dZ12) > 0) {
457 Double_t dZ1i = zEnd - v3[2];
458 Double_t dZi2 = v3New[2] - zEnd;
459 Double_t xPrime = (v3New[0] - v3[0]) / dZ12;
460 Double_t xSecond = ((v3New[3] / v3New[5]) - (v3[3] / v3[5])) / dZ12;
461 Double_t yPrime = (v3New[1] - v3[1]) / dZ12;
462 Double_t ySecond = ((v3New[4] / v3New[5]) - (v3[4] / v3[5])) / dZ12;
463 v3[0] = v3[0] + xPrime * dZ1i - 0.5 * xSecond * dZ1i * dZi2;
464 v3[1] = v3[1] + yPrime * dZ1i - 0.5 * ySecond * dZ1i * dZi2;
466 Double_t xPrimeI = xPrime - 0.5 * xSecond * (dZi2 - dZ1i);
467 Double_t yPrimeI = yPrime - 0.5 * ySecond * (dZi2 - dZ1i);
469 v3[5] = 1.0 / TMath::Sqrt(1.0 + xPrimeI * xPrimeI + yPrimeI * yPrimeI);
470 v3[3] = xPrimeI * v3[5];
471 v3[4] = yPrimeI * v3[5];
473 cout<<
"W-AliMFTTrackExtrap::ExtrapToZHelix: Extrap. to Z not reached, Z = "<<zEnd<<endl;
485 if (trackParam->
GetZ() == zEnd)
return kTRUE;
486 Double_t forwardBackward;
487 if (zEnd < trackParam->GetZ()) forwardBackward = 1.0;
488 else forwardBackward = -1.0;
492 Double_t v3[7], v3New[7];
494 Int_t stepNumber = 0;
497 Double_t residue = zEnd - trackParam->
GetZ();
498 Bool_t uturn = kFALSE;
499 Bool_t trackingFailed = kFALSE;
500 Bool_t tooManyStep = kFALSE;
503 dZ = zEnd - trackParam->
GetZ();
511 cout<<
"W-AliMFTTrackExtrap::ExtrapToZRungekutta: Too many trials: "<<stepNumber<<endl;
516 step = TMath::Abs(step);
518 trackingFailed = kTRUE;
521 residue = zEnd - v3New[2];
522 step *= dZ/(v3New[2]-trackParam->
GetZ());
525 if (trackingFailed)
break;
526 else if (v3New[5]*v3[5] < 0) {
527 cout<<
"W-AliMFTTrackExtrap::ExtrapToZRungekutta: The track turned around"<<endl;
570 v3[0] = trackParam->
GetX();
571 v3[1] = trackParam->
GetY();
572 v3[2] = trackParam->
GetZ();
573 Double_t slopeX = trackParam->
GetSlopeX() ;
574 Double_t slopeY = trackParam->
GetSlopeY() ;
575 Double_t slope2 = TMath::Sqrt(1.+slopeX*slopeX +slopeY*slopeY);
577 v3[6] = pt*slope2/TMath::Sqrt(slopeX*slopeX +slopeY*slopeY);
579 v3[5] = -forwardBackward / slope2;
580 v3[3] = slopeX / slope2;
581 v3[4] = slopeY / slope2;
602 trackParam->
SetX(v3[0]);
603 trackParam->
SetY(v3[1]);
604 trackParam->
SetZ(v3[2]);
605 Double_t pt = v3[6]*TMath::Sqrt(1. - v3[5]*v3[5]);
625 if (trackParam->
GetZ() == zEnd)
return kTRUE;
634 cout<<
"W-AliMFTTrackExtrap::ExtrapToZCov: Covariance matrix does not exist"<<endl;
642 Double_t zBegin = trackParamSave.
GetZ();
649 if (!
ExtrapToZ(trackParam,zEnd))
return kFALSE;
655 Bool_t extrapStatus = kTRUE;
658 TMatrixD dParam(5,1);
659 Double_t direction[5] = {-1.,-1.,1.,1.,-1.};
660 for (Int_t i=0; i<5; i++) {
662 if (kParamCov(i,i) <= 0.)
continue;
665 for (Int_t j=0; j<5; j++) {
667 dParam(j,0) = TMath::Sqrt(kParamCov(i,i));
668 dParam(j,0) *= TMath::Sign(1.,direction[j]*paramSave(j,0));
669 }
else dParam(j,0) = 0.;
674 trackParamSave.
SetZ(zBegin);
677 cout<<
"W-AliMFTTrackExtrap::ExtrapToZCov: Bad covariance matrix"<<endl;
678 extrapStatus = kFALSE;
682 TMatrixD jacobji(trackParamSave.
GetParameters(),TMatrixD::kMinus,extrapParam);
684 jacobji *= 1. / dParam(i,0);
685 jacob.SetSub(0,i,jacobji);
691 cout<<
"Initial Cov MAtrix "<<endl;
693 TMatrixD tmp(kParamCov,TMatrixD::kMultTranspose,jacob);
694 TMatrixD tmp2(jacob,TMatrixD::kMult,tmp);
695 cout<<
"Extrapolated Cov MAtrix "<<endl;
752 Double_t xVtx, Double_t yVtx, Double_t zVtx,
753 Double_t errXVtx, Double_t errYVtx,
754 Double_t absZBeg, Double_t pathLength, Double_t f0, Double_t f1, Double_t f2)
854 Double_t &pathLength, Double_t &f0, Double_t &f1, Double_t &f2,
855 Double_t &meanRho, Double_t &totalELoss, Double_t &sigmaELoss2)
877 cout<<
"E-AliMFTTrackExtrap::GetAbsorberCorrectionParam: no TGeo"<<endl;
882 pathLength = TMath::Sqrt((trackXYZOut[0] - trackXYZIn[0])*(trackXYZOut[0] - trackXYZIn[0])+
883 (trackXYZOut[1] - trackXYZIn[1])*(trackXYZOut[1] - trackXYZIn[1])+
884 (trackXYZOut[2] - trackXYZIn[2])*(trackXYZOut[2] - trackXYZIn[2]));
885 if (pathLength < TGeoShape::Tolerance())
return kFALSE;
887 b[0] = (trackXYZOut[0] - trackXYZIn[0]) / pathLength;
888 b[1] = (trackXYZOut[1] - trackXYZIn[1]) / pathLength;
889 b[2] = (trackXYZOut[2] - trackXYZIn[2]) / pathLength;
890 TGeoNode *currentnode = gGeoManager->InitTrack(trackXYZIn, b);
892 cout<<
"E-AliMFTTrackExtrap::GetAbsorberCorrectionParam: start point out of geometry"<<endl;
899 Double_t atomicA = 0.;
900 Double_t atomicZ = 0.;
901 Double_t atomicZoverA = 0.;
902 Double_t localPathLength = 0;
903 Double_t remainingPathLength = pathLength;
904 Double_t sigmaELoss = 0.;
905 Double_t zB = trackXYZIn[2];
906 Double_t zE, dzB, dzE;
909 TGeoMaterial *material = currentnode->GetVolume()->GetMedium()->GetMaterial();
910 rho = material->GetDensity();
911 x0 = material->GetRadLen();
912 atomicA = material->GetA();
913 atomicZ = material->GetZ();
914 if(material->IsMixture()){
915 TGeoMixture * mixture = (TGeoMixture*)material;
918 for (Int_t iel=0;iel<mixture->GetNelements();iel++){
919 sum += mixture->GetWmixt()[iel];
920 atomicZoverA += mixture->GetZmixt()[iel]*mixture->GetWmixt()[iel]/mixture->GetAmixt()[iel];
924 else atomicZoverA = atomicZ/atomicA;
927 gGeoManager->FindNextBoundary(remainingPathLength);
928 localPathLength = gGeoManager->GetStep() + 1.e-6;
930 if (localPathLength >= remainingPathLength) localPathLength = remainingPathLength;
932 currentnode = gGeoManager->Step();
934 cout<<
"E-AliMFTTrackExtrap::GetAbsorberCorrectionParam: navigation failed"<<endl;
935 f0 = f1 = f2 = meanRho = totalELoss = sigmaELoss2 = 0.;
938 if (!gGeoManager->IsEntering()) {
940 gGeoManager->SetStep(0.001);
941 currentnode = gGeoManager->Step();
942 if (!gGeoManager->IsEntering() || !currentnode) {
943 cout<<
"E-AliMFTTrackExtrap::GetAbsorberCorrectionParam: navigation failed"<<endl;
944 f0 = f1 = f2 = meanRho = totalELoss = sigmaELoss2 = 0.;
947 localPathLength += 0.001;
952 zE = b[2] * localPathLength + zB;
953 dzB = zB - trackXYZIn[2];
954 dzE = zE - trackXYZIn[2];
955 f0 += localPathLength / x0;
956 f1 += (dzE*dzE - dzB*dzB) / b[2] / b[2] / x0 / 2.;
957 f2 += (dzE*dzE*dzE - dzB*dzB*dzB) / b[2] / b[2] / b[2] / x0 / 3.;
958 meanRho += localPathLength * rho;
959 totalELoss +=
BetheBloch(pTotal, localPathLength, rho, atomicZ, atomicZoverA);
964 remainingPathLength -= localPathLength;
965 }
while (remainingPathLength > TGeoShape::Tolerance());
967 meanRho /= pathLength;
968 sigmaELoss2 = sigmaELoss*sigmaELoss;
1007 Double_t slope2 = slopeX*slopeX+slopeY*slopeY;
1011 Double_t inverseTotalMomentum2 = inversePt*inversePt / (1. + 1./slope2 );
1013 Double_t signedPathLength = dZ * TMath::Sqrt(1.0 + slope2);
1014 Double_t pathLengthOverX0 = (x0 > 0.) ? TMath::Abs(signedPathLength * x0 /dZ) : TMath::Abs(signedPathLength);
1018 Double_t theta02 = 0.0136 / velo * (1 + 0.038 * TMath::Log(pathLengthOverX0));
1019 theta02 *= theta02 * inverseTotalMomentum2 * pathLengthOverX0;
1021 Double_t varCoor = (x0 > 0.) ? signedPathLength * signedPathLength * theta02 / 3. : 0.;
1022 Double_t varSlop = theta02;
1023 Double_t covCorrSlope = (x0 > 0.) ? signedPathLength * theta02/ 2. : 0.;
1025 cout<<Form(
"theta02=%e inverseTotalMomentum2=%e signedPathLength=%e pathLengthOverX0=%e ",theta02,inverseTotalMomentum2,signedPathLength,pathLengthOverX0 )<<endl;
1027 cout<<Form(
"dz=%e x0=%e varCoor=%e varSlop=%e covCorrSlope=%e ",dZ,x0,varCoor,varSlop,covCorrSlope )<<endl;
1030 cout<<
"Covariance avant MCS"<<endl;
1031 newParamCov.Print();
1033 newParamCov(0,0) += varCoor; newParamCov(0,2) += covCorrSlope;
1034 newParamCov(2,0) += covCorrSlope; newParamCov(2,2) += varSlop;
1036 newParamCov(1,1) += varCoor; newParamCov(1,3) += covCorrSlope;
1037 newParamCov(3,1) += covCorrSlope; newParamCov(3,3) += varSlop;
1039 cout<<
"Covariance apres MCS"<<endl;
1040 newParamCov.Print();
1064 Double_t xVtx, Double_t yVtx, Double_t zVtx,
1065 Double_t errXVtx, Double_t errYVtx,
1066 Bool_t correctForMCS, Bool_t correctForEnergyLoss)
1180 Double_t xVtx, Double_t yVtx, Double_t zVtx,
1181 Double_t errXVtx, Double_t errYVtx)
1185 ExtrapToVertex(trackParam, xVtx, yVtx, zVtx, errXVtx, errYVtx, kTRUE, kTRUE);
1190 Double_t xVtx, Double_t yVtx, Double_t zVtx,
1191 Double_t errXVtx, Double_t errYVtx)
1195 ExtrapToVertex(trackParam, xVtx, yVtx, zVtx, errXVtx, errYVtx, kTRUE, kFALSE);
1211 ExtrapToVertex(trackParam, 0., 0., zVtx, 0., 0., kFALSE, kFALSE);
1219 if (trackParam->
GetZ() == zVtx)
return 0.;
1223 cout<<
"E-AliMFTTrackExtrap::TotalMomentumEnergyLoss: no TGeo"<<endl;
1228 Double_t trackXYZOut[3];
1229 trackXYZOut[0] = trackParam->
GetX();
1230 trackXYZOut[1] = trackParam->
GetY();
1231 trackXYZOut[2] = trackParam->
GetZ();
1232 Double_t trackXYZIn[3];
1233 trackXYZIn[0] = xVtx;
1234 trackXYZIn[1] = yVtx;
1235 trackXYZIn[2] = zVtx;
1236 Double_t pTot = trackParam->
P();
1237 Double_t pathLength, f0, f1, f2, meanRho, totalELoss, sigmaELoss2;
1241 Double_t muMass = TDatabasePDG::Instance()->GetParticle(
"mu-")->Mass();
1242 Double_t e = TMath::Sqrt(pTot*pTot + muMass*muMass);
1243 Double_t eCorr = e + totalELoss;
1244 Double_t pTotCorr = TMath::Sqrt(eCorr*eCorr - muMass*muMass);
1246 return pTotCorr - pTot;
1254 Double_t muMass = TDatabasePDG::Instance()->GetParticle(
"mu-")->Mass();
1258 if (atomicZ < 13) i = (12. * atomicZ + 7.) * 1.e-9;
1259 else i = (9.76 * atomicZ + 58.8 * TMath::Power(atomicZ,-0.19)) * 1.e-9;
1261 return pathLength * rho * AliExternalTrackParam::BetheBlochGeant(pTotal/muMass, rho, 0.20, 3.00, i, atomicZoverA);
1269 Double_t muMass = TDatabasePDG::Instance()->GetParticle(
"mu-")->Mass();
1271 Double_t k = 0.307075e-3;
1272 Double_t p2=pTotal*pTotal;
1273 Double_t beta2=p2/(p2 + muMass*muMass);
1275 Double_t fwhm = 2. * k * rho * pathLength * atomicZoverA / beta2;
1276 Double_t sigma = fwhm / TMath::Sqrt(8.*log(2.));
1290 Double_t qPTot = TMath::Sqrt(1. + param(1,0)*param(1,0) + param(3,0)*param(3,0)) /
1291 TMath::Sqrt(1. + param(3,0)*param(3,0)) / param(4,0);
1294 TMatrixD jacob(5,5);
1296 jacob(4,1) = qPTot * param(1,0) / (1. + param(1,0)*param(1,0) + param(3,0)*param(3,0));
1297 jacob(4,3) = - qPTot * param(1,0) * param(1,0) * param(3,0) /
1298 (1. + param(3,0)*param(3,0)) / (1. + param(1,0)*param(1,0) + param(3,0)*param(3,0));
1299 jacob(4,4) = - qPTot / param(4,0);
1302 TMatrixD tmp(cov,TMatrixD::kMultTranspose,jacob);
1303 cov.Mult(jacob,tmp);
1313 Double_t qPTot = TMath::Sqrt(1. + param(1,0)*param(1,0) + param(3,0)*param(3,0)) /
1314 TMath::Sqrt(1. + param(3,0)*param(3,0)) / param(4,0);
1317 TMatrixD jacob(5,5);
1319 jacob(4,1) = param(4,0) * param(1,0) / (1. + param(1,0)*param(1,0) + param(3,0)*param(3,0));
1320 jacob(4,3) = - param(4,0) * param(1,0) * param(1,0) * param(3,0) /
1321 (1. + param(3,0)*param(3,0)) / (1. + param(1,0)*param(1,0) + param(3,0)*param(3,0));
1322 jacob(4,4) = - param(4,0) / qPTot;
1325 TMatrixD tmp(covP,TMatrixD::kMultTranspose,jacob);
1326 covP.Mult(jacob,tmp);
1356 Double_t xyz[3], h[4], hxp[3];
1357 Double_t h2xy, hp, rho, tet;
1358 Double_t sint, sintt, tsint, cos1t;
1359 Double_t f1, f2, f3, f4, f5, f6;
1361 const Int_t kix = 0;
1362 const Int_t kiy = 1;
1363 const Int_t kiz = 2;
1364 const Int_t kipx = 3;
1365 const Int_t kipy = 4;
1366 const Int_t kipz = 5;
1367 const Int_t kipp = 6;
1370 const Double_t kec = 2.9979251e-4;
1376 vout[kipp] = vect[kipp];
1377 if (TMath::Abs(charge) < 0.00001) {
1378 for (Int_t i = 0; i < 3; i++) {
1379 vout[i] = vect[i] + step * vect[i+3];
1380 vout[i+3] = vect[i+3];
1384 xyz[0] = vect[kix] + 0.5 * step * vect[kipx];
1385 xyz[1] = vect[kiy] + 0.5 * step * vect[kipy];
1386 xyz[2] = vect[kiz] + 0.5 * step * vect[kipz];
1389 TGeoGlobalMagField::Instance()->Field(xyz,h);
1390 h2xy = h[0]*h[0] + h[1]*h[1];
1391 h[3] = h[2]*h[2]+ h2xy;
1393 if (h[3] < 1.e-12) {
1394 for (Int_t i = 0; i < 3; i++) {
1395 vout[i] = vect[i] + step * vect[i+3];
1396 vout[i+3] = vect[i+3];
1400 if (h2xy < 1.e-12*h[3]) {
1404 h[3] = TMath::Sqrt(h[3]);
1410 hxp[0] = h[1]*vect[kipz] - h[2]*vect[kipy];
1411 hxp[1] = h[2]*vect[kipx] - h[0]*vect[kipz];
1412 hxp[2] = h[0]*vect[kipy] - h[1]*vect[kipx];
1414 hp = h[0]*vect[kipx] + h[1]*vect[kipy] + h[2]*vect[kipz];
1416 rho = -charge*h[3]/vect[kipp];
1419 if (TMath::Abs(tet) > 0.15) {
1420 sint = TMath::Sin(tet);
1422 tsint = (tet-sint)/tet;
1423 cos1t = 2.*(TMath::Sin(0.5*tet))*(TMath::Sin(0.5*tet))/tet;
1425 tsint = tet*tet/36.;
1426 sintt = (1. - tsint);
1433 f3 = step * tsint * hp;
1436 f6 = tet * cos1t * hp;
1438 vout[kix] = vect[kix] + f1*vect[kipx] + f2*hxp[0] + f3*h[0];
1439 vout[kiy] = vect[kiy] + f1*vect[kipy] + f2*hxp[1] + f3*h[1];
1440 vout[kiz] = vect[kiz] + f1*vect[kipz] + f2*hxp[2] + f3*h[2];
1442 vout[kipx] = vect[kipx] + f4*vect[kipx] + f5*hxp[0] + f6*h[0];
1443 vout[kipy] = vect[kipy] + f4*vect[kipy] + f5*hxp[1] + f6*h[1];
1444 vout[kipz] = vect[kipz] + f4*vect[kipz] + f5*hxp[2] + f6*h[2];
1471 Double_t h4, hp, rho, tet;
1472 Double_t sint, sintt, tsint, cos1t;
1473 Double_t f1, f2, f3, f4, f5, f6;
1475 const Int_t kix = 0;
1476 const Int_t kiy = 1;
1477 const Int_t kiz = 2;
1478 const Int_t kipx = 3;
1479 const Int_t kipy = 4;
1480 const Int_t kipz = 5;
1481 const Int_t kipp = 6;
1483 const Double_t kec = 2.9979251e-4;
1490 vout[kipp] = vect[kipp];
1493 hxp[0] = - vect[kipy];
1494 hxp[1] = + vect[kipx];
1498 rho = -h4/vect[kipp];
1500 if (TMath::Abs(tet) > 0.15) {
1501 sint = TMath::Sin(tet);
1503 tsint = (tet-sint)/tet;
1504 cos1t = 2.* TMath::Sin(0.5*tet) * TMath::Sin(0.5*tet)/tet;
1506 tsint = tet*tet/36.;
1507 sintt = (1. - tsint);
1514 f3 = step * tsint * hp;
1517 f6 = tet * cos1t * hp;
1519 vout[kix] = vect[kix] + f1*vect[kipx] + f2*hxp[0];
1520 vout[kiy] = vect[kiy] + f1*vect[kipy] + f2*hxp[1];
1521 vout[kiz] = vect[kiz] + f1*vect[kipz] + f3;
1523 vout[kipx] = vect[kipx] + f4*vect[kipx] + f5*hxp[0];
1524 vout[kipy] = vect[kipy] + f4*vect[kipy] + f5*hxp[1];
1525 vout[kipz] = vect[kipz] + f4*vect[kipz] + f6;
1557 Double_t h2, h4,
f[4];
1558 Double_t xyzt[3] = {FLT_MAX, FLT_MAX, FLT_MAX};
1559 Double_t a, b, c, ph,ph2;
1560 Double_t secxs[4],secys[4],seczs[4],hxp[3];
1561 Double_t g1, g2, g3, g4, g5, g6, ang2, dxt, dyt, dzt;
1562 Double_t est, at, bt, ct, cba;
1563 Double_t f1, f2, f3, f4, rho, tet, hnorm, hp, rho1, sint, cost;
1573 Double_t maxit = 1992;
1574 Double_t maxcut = 11;
1576 const Double_t kdlt = 1e-4;
1577 const Double_t kdlt32 = kdlt/32.;
1578 const Double_t kthird = 1./3.;
1579 const Double_t khalf = 0.5;
1580 const Double_t kec = 2.9979251e-4;
1582 const Double_t kpisqua = 9.86960440109;
1583 const Int_t kix = 0;
1584 const Int_t kiy = 1;
1585 const Int_t kiz = 2;
1586 const Int_t kipx = 3;
1587 const Int_t kipy = 4;
1588 const Int_t kipz = 5;
1597 for(Int_t j = 0; j < 7; j++)
1600 Double_t pinv = kec * charge / vect[6];
1608 if (TMath::Abs(h) > TMath::Abs(rest)) h = rest;
1610 TGeoGlobalMagField::Instance()->Field(vout,f);
1626 secxs[0] = (b * f[2] - c * f[1]) * ph2;
1627 secys[0] = (c * f[0] - a * f[2]) * ph2;
1628 seczs[0] = (a * f[1] - b * f[0]) * ph2;
1629 ang2 = (secxs[0]*secxs[0] + secys[0]*secys[0] + seczs[0]*seczs[0]);
1630 if (ang2 > kpisqua)
break;
1632 dxt = h2 * a + h4 * secxs[0];
1633 dyt = h2 * b + h4 * secys[0];
1634 dzt = h2 * c + h4 * seczs[0];
1642 est = TMath::Abs(dxt) + TMath::Abs(dyt) + TMath::Abs(dzt);
1644 if (ncut++ > maxcut)
break;
1654 TGeoGlobalMagField::Instance()->Field(xyzt,f);
1660 secxs[1] = (bt * f[2] - ct * f[1]) * ph2;
1661 secys[1] = (ct * f[0] - at * f[2]) * ph2;
1662 seczs[1] = (at * f[1] - bt * f[0]) * ph2;
1666 secxs[2] = (bt * f[2] - ct * f[1]) * ph2;
1667 secys[2] = (ct * f[0] - at * f[2]) * ph2;
1668 seczs[2] = (at * f[1] - bt * f[0]) * ph2;
1669 dxt = h * (a + secxs[2]);
1670 dyt = h * (b + secys[2]);
1671 dzt = h * (c + seczs[2]);
1675 at = a + 2.*secxs[2];
1676 bt = b + 2.*secys[2];
1677 ct = c + 2.*seczs[2];
1679 est = TMath::Abs(dxt)+TMath::Abs(dyt)+TMath::Abs(dzt);
1680 if (est > 2.*TMath::Abs(h)) {
1681 if (ncut++ > maxcut)
break;
1691 TGeoGlobalMagField::Instance()->Field(xyzt,f);
1693 z = z + (c + (seczs[0] + seczs[1] + seczs[2]) * kthird) * h;
1694 y = y + (b + (secys[0] + secys[1] + secys[2]) * kthird) * h;
1695 x = x + (a + (secxs[0] + secxs[1] + secxs[2]) * kthird) * h;
1697 secxs[3] = (bt*f[2] - ct*f[1])* ph2;
1698 secys[3] = (ct*f[0] - at*f[2])* ph2;
1699 seczs[3] = (at*f[1] - bt*f[0])* ph2;
1700 a = a+(secxs[0]+secxs[3]+2. * (secxs[1]+secxs[2])) * kthird;
1701 b = b+(secys[0]+secys[3]+2. * (secys[1]+secys[2])) * kthird;
1702 c = c+(seczs[0]+seczs[3]+2. * (seczs[1]+seczs[2])) * kthird;
1704 est = TMath::Abs(secxs[0]+secxs[3] - (secxs[1]+secxs[2]))
1705 + TMath::Abs(secys[0]+secys[3] - (secys[1]+secys[2]))
1706 + TMath::Abs(seczs[0]+seczs[3] - (seczs[1]+seczs[2]));
1708 if (est > kdlt && TMath::Abs(h) > 1.e-4) {
1709 if (ncut++ > maxcut)
break;
1716 if (iter++ > maxit)
break;
1721 cba = 1./ TMath::Sqrt(a*a + b*b + c*c);
1729 if (step < 0.) rest = -rest;
1730 if (rest < 1.e-5*TMath::Abs(step))
return kTRUE;
1735 cout<<
"W-AliMFTTrackExtrap::ExtrapOneStepRungekutta: Ruge-Kutta failed: switch to helix"<<endl;
1740 f4 = TMath::Sqrt(f1*f1+f2*f2+f3*f3);
1742 cout<<
"E-AliMFTTrackExtrap::ExtrapOneStepRungekutta: magnetic field at (";
1743 cout<<xyzt[0]<<
", "<<xyzt[1]<<
", "<<xyzt[2]<<
") = "<<f4<<
": giving up"<<endl;
1754 hxp[0] = f2*vect[kipz] - f3*vect[kipy];
1755 hxp[1] = f3*vect[kipx] - f1*vect[kipz];
1756 hxp[2] = f1*vect[kipy] - f2*vect[kipx];
1758 hp = f1*vect[kipx] + f2*vect[kipy] + f3*vect[kipz];
1761 sint = TMath::Sin(tet);
1762 cost = 2.*TMath::Sin(khalf*tet)*TMath::Sin(khalf*tet);
1766 g3 = (tet-sint) * hp*rho1;
1771 vout[kix] = vect[kix] + g1*vect[kipx] + g2*hxp[0] + g3*f1;
1772 vout[kiy] = vect[kiy] + g1*vect[kipy] + g2*hxp[1] + g3*f2;
1773 vout[kiz] = vect[kiz] + g1*vect[kipz] + g2*hxp[2] + g3*f3;
1775 vout[kipx] = vect[kipx] + g4*vect[kipx] + g5*hxp[0] + g6*f1;
1776 vout[kipy] = vect[kipy] + g4*vect[kipy] + g5*hxp[1] + g6*f2;
1777 vout[kipz] = vect[kipz] + g4*vect[kipz] + g5*hxp[2] + g6*f3;
Double_t GetSlopeY() const
return Y slope
const TMatrixD & GetParameters() const
return track parameters
Bool_t CovariancesExist() const
return kTRUE if the covariance matrix exist, kFALSE if not
void SetZ(Double_t z)
set Z coordinate (cm)
TFile f("CalibObjects.root")
const TMatrixD & GetCovariances() const
void SetInverseTransverseMomentum(Double_t val)
set Inverse Momentum
void AddParameters(const TMatrixD ¶meters)
add track parameters
void SetCovariances(const TMatrixD &covariances)
void SetX(Double_t val)
set X coordinate (cm)
Double_t GetInverseTransverseMomentum() const
return Inverse Momentum
Double_t GetSlopeX() const
return X slope
Double_t GetZ() const
return Z coordinate (cm)
void SetSlopeY(Double_t val)
set Y slope
Double_t P() const
return total momentum
void SetY(Double_t val)
set Y coordinate (cm)
void UpdatePropagator(const TMatrixD &propagator)
Constants for the Muon Forward Tracker.
Double_t GetX() const
return X coordinate (cm)
Class holding the parameter of a MFT Standalone Track.
Double_t GetY() const
return Y coordinate (cm)
void SetParameters(const TMatrixD ¶meters)
set track parameters
void SetSlopeX(Double_t val)
set X slope