]>
Commit | Line | Data |
---|---|---|
51ad6848 | 1 | /************************************************************************** |
2 | * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * | |
3 | * * | |
4 | * Author: The ALICE Off-line Project. * | |
5 | * Contributors are mentioned in the code where appropriate. * | |
6 | * * | |
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 | **************************************************************************/ | |
15 | ||
16 | /* $Id$ */ | |
17 | ||
18 | /////////////////////////////////////////////////////////////////////////////// | |
19 | // // | |
20 | // base class for track parameters // | |
21 | // // | |
22 | // The idea of having a separate class for the track parametrisation and // | |
23 | // not including it in the track classes itself is to not duplicate code. // | |
24 | // Track classes which use the same parametrisation can include a track // | |
25 | // parameters object for their common parametrisation. The code, e.g. for // | |
26 | // the propagation, does not need to be duplicated. // | |
27 | // // | |
28 | // The AliTrackParam and its derived classes // | |
29 | // - know the current track parameters and their covariance matrix as well // | |
30 | // as the local x coordinate and azimuthal angle alpha of the current // | |
31 | // parametrisation // | |
32 | // - can rotate their local coordinate system // | |
33 | // - can create a parametrisation in external format from itself // | |
34 | // - can propagate through material or vacuum // | |
35 | // - can calculate a chi^2 for a cluster // | |
36 | // - can update the parameters using the position and covariance of a // | |
37 | // cluster // | |
38 | // // | |
39 | // In addition some methods to get quantities useful for analysis, like // | |
40 | // the momentum, are implemented. // | |
41 | // // | |
42 | /////////////////////////////////////////////////////////////////////////////// | |
43 | ||
44 | ||
45 | #include "AliTrackParam.h" | |
46 | #include "AliExternalTrackParam.h" | |
47 | #include "AliRunLoader.h" | |
48 | #include "AliRun.h" | |
49 | #include "AliMagF.h" | |
50 | ||
51 | ||
52 | Double_t FastMath::fgFastAsin[20000]; | |
53 | ||
54 | FastMath::FastMath() | |
55 | { | |
56 | for (Int_t i=0;i<10000;i++){ | |
57 | fgFastAsin[2*i] = TMath::ASin(i/10000.); | |
58 | fgFastAsin[2*i+1] = (TMath::ASin((i+1)/10000.)-fgFastAsin[2*i]); | |
59 | } | |
60 | } | |
61 | ||
62 | Double_t FastMath::FastAsin(Double_t x) | |
63 | { | |
64 | if (x>0){ | |
65 | Int_t index = int(x*10000); | |
66 | return fgFastAsin[2*index]+(x*10000.-index)*fgFastAsin[2*index+1]; | |
67 | } | |
68 | x*=-1; | |
69 | Int_t index = int(x*10000); | |
70 | return -(fgFastAsin[2*index]+(x*10000.-index)*fgFastAsin[2*index+1]); | |
71 | } | |
72 | ||
73 | FastMath gFastMath; | |
74 | ||
75 | ||
76 | ||
77 | ClassImp(AliTrackParam) | |
78 | ||
79 | ||
80 | ||
81 | ||
82 | //_____________________________________________________________________________ | |
83 | Bool_t AliTrackParam::RotateAndPropagateTo(Double_t alpha, Double_t x, | |
84 | Double_t* length) | |
85 | { | |
86 | // Rotate the reference axis for the parametrisation to the given angle and | |
87 | // propagate the track parameters to the given x coordinate assuming vacuum. | |
88 | // If length is not NULL, the change of track length is added to it. | |
89 | ||
90 | if (!RotateTo(alpha)) return kFALSE; | |
91 | if (!PropagateTo(x, length)) return kFALSE; | |
92 | return kTRUE; | |
93 | } | |
94 | ||
95 | //_____________________________________________________________________________ | |
96 | Double_t AliTrackParam::GetDsdx() const | |
97 | { | |
98 | // get the change of track length s per step in x: ds/dx | |
99 | ||
100 | TVector3 x(TMath::Cos(Alpha()), TMath::Sin(Alpha()), 0); | |
101 | TVector3 p = Momentum(); | |
102 | Double_t xp = x*p; | |
103 | if (xp == 0) return 1.E6; | |
104 | return p.Mag() / xp; | |
105 | } | |
106 | ||
107 | ||
108 | //_____________________________________________________________________________ | |
109 | Double_t AliTrackParam::Phi() const | |
110 | { | |
111 | // get the azimuthal angre | |
112 | ||
113 | return Momentum().Phi(); | |
114 | } | |
115 | ||
116 | //_____________________________________________________________________________ | |
117 | Double_t AliTrackParam::SigmaPhi() const | |
118 | { | |
119 | // get the error of the azimuthal angle | |
120 | ||
121 | AliExternalTrackParam* param = CreateExternalParam(); | |
122 | Double_t result = param->SigmaPhi(); | |
123 | delete param; | |
124 | return result; | |
125 | } | |
126 | ||
127 | //_____________________________________________________________________________ | |
128 | Double_t AliTrackParam::Theta() const | |
129 | { | |
130 | // the the polar angle | |
131 | ||
132 | return Momentum().Theta(); | |
133 | } | |
134 | ||
135 | //_____________________________________________________________________________ | |
136 | Double_t AliTrackParam::SigmaTheta() const | |
137 | { | |
138 | // get the error of the polar angle | |
139 | ||
140 | AliExternalTrackParam* param = CreateExternalParam(); | |
141 | Double_t result = param->SigmaTheta(); | |
142 | delete param; | |
143 | return result; | |
144 | } | |
145 | ||
146 | //_____________________________________________________________________________ | |
147 | Double_t AliTrackParam::Eta() const | |
148 | { | |
149 | // get the pseudorapidity | |
150 | ||
151 | return Momentum().Eta(); | |
152 | } | |
153 | ||
154 | //_____________________________________________________________________________ | |
155 | Double_t AliTrackParam::Px() const | |
156 | { | |
157 | // get the x component of the momentum | |
158 | ||
159 | return Momentum().Px(); | |
160 | } | |
161 | ||
162 | //_____________________________________________________________________________ | |
163 | Double_t AliTrackParam::Py() const | |
164 | { | |
165 | // get the y component of the momentum | |
166 | ||
167 | return Momentum().Py(); | |
168 | } | |
169 | ||
170 | //_____________________________________________________________________________ | |
171 | Double_t AliTrackParam::Pz() const | |
172 | { | |
173 | // get the z component of the momentum | |
174 | ||
175 | return Momentum().Pz(); | |
176 | } | |
177 | ||
178 | //_____________________________________________________________________________ | |
179 | Double_t AliTrackParam::Pt() const | |
180 | { | |
181 | // get the transversal component of the momentum | |
182 | ||
183 | return Momentum().Pt(); | |
184 | } | |
185 | ||
186 | //_____________________________________________________________________________ | |
187 | Double_t AliTrackParam::SigmaPt() const | |
188 | { | |
189 | // get the error of the transversal component of the momentum | |
190 | ||
191 | AliExternalTrackParam* param = CreateExternalParam(); | |
192 | Double_t result = param->SigmaPt(); | |
193 | delete param; | |
194 | return result; | |
195 | } | |
196 | ||
197 | //_____________________________________________________________________________ | |
198 | Double_t AliTrackParam::P() const | |
199 | { | |
200 | // get the absolute momentum | |
201 | ||
202 | return Momentum().Mag(); | |
203 | } | |
204 | ||
205 | //_____________________________________________________________________________ | |
206 | TVector3 AliTrackParam::Momentum() const | |
207 | { | |
208 | // get the momentum vector | |
209 | ||
210 | AliExternalTrackParam* param = CreateExternalParam(); | |
211 | TVector3 result = param->Momentum(); | |
212 | delete param; | |
213 | return result; | |
214 | } | |
215 | ||
216 | //_____________________________________________________________________________ | |
217 | TVector3 AliTrackParam::Position() const | |
218 | { | |
219 | // get the current spatial position in global coordinates | |
220 | ||
221 | Double_t sinAlpha = TMath::Sin(Alpha()); | |
222 | Double_t cosAlpha = TMath::Cos(Alpha()); | |
223 | return TVector3(X()*cosAlpha - Y()*sinAlpha, | |
224 | X()*sinAlpha + Y()*cosAlpha, | |
225 | Z()); | |
226 | } | |
227 | ||
228 | //_____________________________________________________________________________ | |
229 | TVector3 AliTrackParam::PositionAt(Double_t x) const | |
230 | { | |
231 | // get the spatial position at x in global coordinates | |
232 | ||
233 | Double_t y; | |
234 | Double_t z; | |
235 | if (!GetProlongationAt(x, y, z)) return TVector3(0,0,0); | |
236 | Double_t sinAlpha = TMath::Sin(Alpha()); | |
237 | Double_t cosAlpha = TMath::Cos(Alpha()); | |
238 | return TVector3(x*cosAlpha - y*sinAlpha, x*sinAlpha + y*cosAlpha, z); | |
239 | } | |
240 |