1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 ///////////////////////////////////////////////////////////////////////////////
20 // track parameters in "external" format //
22 // The track parameters are: //
23 // - local y coordinate //
24 // - local z coordinate //
25 // - sin of azimutal angle //
26 // - tan of dip angle //
28 // The parametrisation is given at the local x coordinate fX and the //
29 // azimuthal angle fAlpha. //
31 // The external parametrisation can be used to exchange track parameters //
32 // between different detectors. //
34 ///////////////////////////////////////////////////////////////////////////////
39 #include "AliExternalTrackParam.h"
40 #include "AliKalmanTrack.h"
41 #include "AliTrackReference.h"
44 ClassImp(AliExternalTrackParam)
46 const AliMagF *AliExternalTrackParam::fgkFieldMap=0;
47 Double_t AliExternalTrackParam::fgConvConst=0.;
50 //_____________________________________________________________________________
51 AliExternalTrackParam::AliExternalTrackParam() :
58 // default constructor
60 for (Int_t i = 0; i < 5; i++) fParam[i] = 0;
61 for (Int_t i = 0; i < 15; i++) fCovar[i] = 0;
64 //_____________________________________________________________________________
65 AliExternalTrackParam::AliExternalTrackParam(Double_t x, Double_t alpha,
66 const Double_t param[5],
67 const Double_t covar[15]) :
74 // create external track parameters from given arguments
76 for (Int_t i = 0; i < 5; i++) fParam[i] = param[i];
77 for (Int_t i = 0; i < 15; i++) fCovar[i] = covar[i];
80 //_____________________________________________________________________________
81 AliExternalTrackParam::AliExternalTrackParam(const AliKalmanTrack& track) :
82 fMass(track.GetMass()),
84 fAlpha(track.GetAlpha()),
89 track.GetExternalParameters(fX,fParam);
90 track.GetExternalCovariance(fCovar);
96 //_____________________________________________________________________________
97 const Double_t* AliExternalTrackParam::GetParameter() const
99 // get a pointer to the array of track parameters
104 //_____________________________________________________________________________
105 const Double_t* AliExternalTrackParam::GetCovariance() const
107 // get a pointer to the array of the track parameter covariance matrix
112 //_____________________________________________________________________________
113 AliExternalTrackParam* AliExternalTrackParam::CreateExternalParam() const
115 // copy this instance
117 return new AliExternalTrackParam(fX, fAlpha, fParam, fCovar);
120 //_____________________________________________________________________________
121 void AliExternalTrackParam::ResetCovariance(Double_t factor,
122 Bool_t clearOffDiagonal)
124 // reset the covariance matrix ("forget" track history)
127 for (Int_t i = 0; i < 5; i++) {
128 for (Int_t j = 0; j < i; j++) { // off diagonal elements
129 if (clearOffDiagonal) {
132 fCovar[k++] *= factor;
135 fCovar[k++] *= factor; // diagonal elements
140 //_____________________________________________________________________________
141 Bool_t AliExternalTrackParam::PropagateTo(Double_t xk, Double_t x0, Double_t rho)
144 // Propagate the track parameters to the given x coordinate assuming vacuum.
145 // If length is not NULL, the change of track length is added to it.
148 Double_t lcc=GetLocalConvConst();
149 Double_t cur = fParam[4]/lcc;
150 Double_t x1=fX, x2=xk, dx=x2-x1;
151 Double_t f1=fParam[2], f2=f1 + cur*dx;
152 if (TMath::Abs(f2) >= 0.98) {
153 // MI change - don't propagate highly inclined tracks
154 // covariance matrix distorted
158 // old position [SR, GSI, 17.02.2003]
159 Double_t oldX = fX, oldY = fParam[0], oldZ = fParam[1];
160 Double_t r1=sqrt(1.- f1*f1), r2=sqrt(1.- f2*f2);
161 fParam[0] += dx*(f1+f2)/(r1+r2);
162 fParam[1] += dx*(f1+f2)/(f1*r2 + f2*r1)*fParam[3];
164 // transform error matrix to the curvature
173 Double_t f02= dx/(r1*r1*r1);
174 Double_t f04=0.5*dx*dx/(r1*r1*r1);
175 Double_t f12= dx*fParam[3]*f1/(r1*r1*r1);
176 Double_t f14=0.5*dx*dx*fParam[3]*f1/(r1*r1*r1);
181 Double_t b00=f02*fCovar[3] + f04*fCovar[10], b01=f12*fCovar[3] + f14*fCovar[10] + f13*fCovar[6];
182 Double_t b02=f24*fCovar[10];
183 Double_t b10=f02*fCovar[4] + f04*fCovar[11], b11=f12*fCovar[4] + f14*fCovar[11] + f13*fCovar[7];
184 Double_t b12=f24*fCovar[11];
185 Double_t b20=f02*fCovar[5] + f04*fCovar[12], b21=f12*fCovar[5] + f14*fCovar[12] + f13*fCovar[8];
186 Double_t b22=f24*fCovar[12];
187 Double_t b40=f02*fCovar[12] + f04*fCovar[14], b41=f12*fCovar[12] + f14*fCovar[14] + f13*fCovar[13];
188 Double_t b42=f24*fCovar[14];
189 Double_t b30=f02*fCovar[8] + f04*fCovar[13], b31=f12*fCovar[8] + f14*fCovar[13] + f13*fCovar[9];
190 Double_t b32=f24*fCovar[13];
193 Double_t a00=f02*b20+f04*b40,a01=f02*b21+f04*b41,a02=f02*b22+f04*b42;
194 Double_t a11=f12*b21+f14*b41+f13*b31,a12=f12*b22+f14*b42+f13*b32;
195 Double_t a22=f24*b42;
197 //F*C*Ft = C + (b + bt + a)
198 fCovar[0] += b00 + b00 + a00;
199 fCovar[1] += b10 + b01 + a01;
200 fCovar[2] += b11 + b11 + a11;
201 fCovar[3] += b20 + b02 + a02;
202 fCovar[4] += b21 + b12 + a12;
203 fCovar[5] += b22 + b22 + a22;
213 //Change of the magnetic field *************
214 SaveLocalConvConst();
215 // transform back error matrix from curvature to the 1/pt
222 Double_t dist = TMath::Sqrt((fX-oldX)*(fX-oldX)+(fParam[0]-oldY)*(fParam[0]-oldY)+
223 (fParam[1]-oldZ)*(fParam[1]-oldZ));
224 if (!CorrectForMaterial(dist,x0,rho)) return 0;
226 // Integrated Time [SR, GSI, 17.02.2003]
227 // if (IsStartedTimeIntegral() && fX>oldX) {
228 // Double_t l2 = (fX-oldX)*(fX-oldX)+(fParam[0]-oldY)*(fParam[0]-oldY)+
229 // (fParam[1]-oldZ)*(fParam[1]-oldZ);
230 // AddTimeStep(TMath::Sqrt(l2));
237 Bool_t AliExternalTrackParam::PropagateToDCA(Double_t xd, Double_t yd, Double_t x0, Double_t rho){
239 // Propagate the track parameters to the nearest point of given xv yv coordinate
242 Double_t cs=TMath::Cos(a),sn=TMath::Sin(a);
244 Double_t xv= xd*cs + yd*sn;
245 Double_t yv=-xd*sn + yd*cs; // vertex position in local frame
247 Double_t c=fParam[4]/GetLocalConvConst(), snp=fParam[2];
249 Double_t x=fX, y=fParam[1];
250 Double_t tgfv=-(c*(x-xv)-snp)/(c*(y-yv) + TMath::Sqrt(1.-snp*snp));
251 Double_t fv=TMath::ATan(tgfv);
252 cs=TMath::Cos(fv); sn=TMath::Sin(fv);
254 yv=-xv*sn + yv*cs; xv=x;
256 return PropagateTo(xv,x0,rho);
260 //_____________________________________________________________________________
261 Bool_t AliExternalTrackParam::RotateTo(Double_t alp)
263 // Rotate the reference axis for the parametrisation to the given angle.
266 Double_t p0=fParam[0];
268 if (alp < -TMath::Pi()) alp += 2*TMath::Pi();
269 else if (alp >= TMath::Pi()) alp -= 2*TMath::Pi();
270 Double_t ca=TMath::Cos(alp-fAlpha), sa=TMath::Sin(alp-fAlpha);
271 Double_t sf=fParam[2], cf=TMath::Sqrt(1.- fParam[2]*fParam[2]);
272 // **** rotation **********************
276 fParam[0]= -x*sa + p0*ca;
277 fParam[2]= sf*ca - cf*sa;
278 Double_t rr=(ca+sf/cf*sa);
280 fCovar[0] *= (ca*ca);
292 //_____________________________________________________________________________
293 Bool_t AliExternalTrackParam::CorrectForMaterial(Double_t d, Double_t x0, Double_t rho)
296 // Take into account material effects assuming:
297 // x0 - mean rad length
298 // rho - mean density
301 // multiple scattering
304 AliError("Non-positive mass");
307 Double_t p2=(1.+ fParam[3]*fParam[3])/(fParam[4]*fParam[4]);
308 Double_t beta2=p2/(p2 + fMass*fMass);
309 Double_t theta2=14.1*14.1/(beta2*p2*1e6)*d/x0*rho;
311 fCovar[5] += theta2*(1.- fParam[2]*fParam[2])*(1. + fParam[3]*fParam[3]);
312 fCovar[9] += theta2*(1. + fParam[3]*fParam[3])*(1. + fParam[3]*fParam[3]);
313 fCovar[13] += theta2*fParam[3]*fParam[4]*(1. + fParam[3]*fParam[3]);
314 fCovar[14] += theta2*fParam[3]*fParam[4]*fParam[3]*fParam[4];
316 Double_t dE=0.153e-3/beta2*(log(5940*beta2/(1-beta2+1e-10)) - beta2)*d*rho;
317 fParam[4] *=(1.- TMath::Sqrt(p2+fMass*fMass)/p2*dE);
319 Double_t sigmade = 0.02*TMath::Sqrt(TMath::Abs(dE)); // energy loss fluctuation
320 Double_t sigmac2 = sigmade*sigmade*fParam[4]*fParam[4]*(p2+fMass*fMass)/(p2*p2);
321 fCovar[14] += sigmac2;
330 //_____________________________________________________________________________
331 Bool_t AliExternalTrackParam::GetProlongationAt(Double_t xk,
336 // Get the local y and z coordinates at the given x value
338 Double_t lcc=GetLocalConvConst();
339 Double_t cur = fParam[4]/lcc;
340 Double_t x1=fX, x2=xk, dx=x2-x1;
341 Double_t f1=fParam[2], f2=f1 + cur*dx;
343 if (TMath::Abs(f2) >= 0.98) {
344 // MI change - don't propagate highly inclined tracks
345 // covariance matrix distorted
348 Double_t r1=sqrt(1.- f1*f1), r2=sqrt(1.- f2*f2);
349 y = fParam[0] + dx*(f1+f2)/(r1+r2);
350 z = fParam[1] + dx*(f1+f2)/(f1*r2 + f2*r1)*fParam[3];
354 //_____________________________________________________________________________
355 Double_t AliExternalTrackParam::GetXAtVertex(Double_t /*x*/,
356 Double_t /*y*/) const
358 // Get the x coordinate at the given vertex (x,y)
360 // NOT IMPLEMENTED for this class
366 // //_____________________________________________________________________________
367 // Double_t AliExternalTrackParam::GetPredictedChi2(const AliCluster* /*cluster*/)
369 // // calculate the chi2 contribution of the given cluster
371 // // NOT IMPLEMENTED for this class
376 // //_____________________________________________________________________________
377 // Bool_t AliExternalTrackParam::Update(const AliCluster* /*cluster*/)
379 // // update the track parameters using the position and error
380 // // of the given cluster
382 // // NOT IMPLEMENTED for this class
388 //_____________________________________________________________________________
389 Double_t AliExternalTrackParam::SigmaPhi() const
391 // get the error of the azimuthal angle
393 return TMath::Sqrt(TMath::Abs(fCovar[5] / (1. - fParam[2]*fParam[2])));
396 //_____________________________________________________________________________
397 Double_t AliExternalTrackParam::SigmaTheta() const
399 // get the error of the polar angle
401 return TMath::Sqrt(TMath::Abs(fCovar[9])) / (1. + fParam[3]*fParam[3]);
404 //_____________________________________________________________________________
405 Double_t AliExternalTrackParam::SigmaPt() const
407 // get the error of the transversal component of the momentum
409 return TMath::Sqrt(fCovar[14]) / TMath::Abs(fParam[4]);
412 //_____________________________________________________________________________
413 TVector3 AliExternalTrackParam::Momentum() const
415 // get the momentum vector
417 Double_t phi = TMath::ASin(fParam[2]) + fAlpha;
418 Double_t pt = 1. / TMath::Abs(fParam[4]);
419 return TVector3(pt * TMath::Cos(phi),
420 pt * TMath::Sin(phi),
424 //_____________________________________________________________________________
425 TVector3 AliExternalTrackParam::Position() const
427 // get the current spatial position in global coordinates
429 return TVector3(fX * TMath::Cos(fAlpha) - fParam[0] * TMath::Sin(fAlpha),
430 fX * TMath::Sin(fAlpha) + fParam[0] * TMath::Cos(fAlpha),
435 //_____________________________________________________________________________
436 void AliExternalTrackParam::Print(Option_t* /*option*/) const
438 // print the parameters and the covariance matrix
440 printf("AliExternalTrackParam: x = %-12g alpha = %-12g\n", fX, fAlpha);
441 printf(" parameters: %12g %12g %12g %12g %12g\n",
442 fParam[0], fParam[1], fParam[2], fParam[3], fParam[4]);
443 printf(" covariance: %12g\n", fCovar[0]);
444 printf(" %12g %12g\n", fCovar[1], fCovar[2]);
445 printf(" %12g %12g %12g\n", fCovar[3], fCovar[4], fCovar[5]);
446 printf(" %12g %12g %12g %12g\n",
447 fCovar[6], fCovar[7], fCovar[8], fCovar[9]);
448 printf(" %12g %12g %12g %12g %12g\n",
449 fCovar[10], fCovar[11], fCovar[12], fCovar[13], fCovar[14]);