Line data Source code
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 : // this class is used for a simple
17 : // track fitting using the polynom
18 : // bending in both directions are allowed
19 : //-----------------------------------------------------------------
20 :
21 :
22 : #include "AliTPCpolyTrack.h"
23 : #include "TMath.h"
24 :
25 16 : ClassImp(AliTPCpolyTrack)
26 :
27 :
28 : AliTPCpolyTrack::AliTPCpolyTrack()
29 0 : :TObject(),
30 0 : fA(0),
31 0 : fB(0),
32 0 : fC(0),
33 0 : fD(0),
34 0 : fE(0),
35 0 : fF(0),
36 0 : fMaxX(0),
37 0 : fMinX(0),
38 0 : fSumW(0),
39 0 : fSumX(0),
40 0 : fSumX2(0),
41 0 : fSumX3(0),
42 0 : fSumX4(0),
43 0 : fSumY(0),
44 0 : fSumYX(0),
45 0 : fSumYX2(0),
46 0 : fSumZ(0),
47 0 : fSumZX(0),
48 0 : fSumZX2(0),
49 0 : fNPoints(0)
50 0 : {
51 0 : Reset();
52 : //
53 0 : for(Int_t i=0;i<200;i++){
54 0 : fX[i]=0.;
55 0 : fY[i]=0.;
56 0 : fSY[i]=0.;
57 0 : fZ[i]=0.;
58 0 : fSZ[i]=0.;
59 : }
60 0 : }
61 :
62 : void AliTPCpolyTrack::Reset()
63 : {
64 : //
65 : // reset track
66 0 : fSumX = fSumX2= fSumX3=fSumX4 = fSumY=fSumYX=fSumYX2=fSumZ=fSumZX=fSumZX2=fSumW =0;
67 0 : fNPoints = 0;
68 0 : }
69 :
70 : void AliTPCpolyTrack::AddPoint(Double_t x, Double_t y, Double_t z,Double_t sy, Double_t sz)
71 : {
72 : //
73 : //
74 0 : if (fNPoints==0){
75 0 : fMaxX = x;
76 0 : fMinX = x;
77 0 : }else{
78 0 : if (x>fMaxX) fMaxX=x;
79 0 : if (x<fMinX) fMinX=x;
80 : }
81 :
82 0 : Double_t x2 = x*x;
83 0 : Double_t w = 2./(sy+sz);
84 0 : fSumW += w;
85 : //
86 0 : fSumX += x*w;
87 0 : fSumX2 += x2*w;
88 0 : fSumX3 += x2*x*w;
89 0 : fSumX4 += x2*x2*w;
90 : //
91 0 : fSumY +=y*w;
92 0 : fSumYX +=y*x*w;
93 0 : fSumYX2 +=y*x2*w;
94 : //
95 0 : fSumZ +=z*w;
96 0 : fSumZX +=z*x*w;
97 0 : fSumZX2 +=z*x2*w;
98 : //
99 0 : fX[fNPoints] = x;
100 0 : fY[fNPoints] = y;
101 0 : fZ[fNPoints] = z;
102 0 : fSY[fNPoints] = sy;
103 0 : fSZ[fNPoints] = sz;
104 :
105 0 : fNPoints++;
106 :
107 0 : }
108 :
109 : void AliTPCpolyTrack::UpdateParameters()
110 : {
111 : //
112 : //
113 : //Update fit parameters
114 0 : if (fNPoints>4){
115 0 : Fit2(fA,fB,fC);
116 : // Fit2(fSumZ,fSumZX,fSumZX2,fSumX,fSumX2,fSumX3,fSumX4,fNPoints,fD,fE,fF);
117 0 : Fit1(fD,fE,fF);
118 0 : }
119 : else
120 : {
121 0 : Fit1(fA,fB,fC);
122 0 : Fit1(fD,fE,fF);
123 : }
124 0 : }
125 :
126 : void AliTPCpolyTrack::UpdateParameters(Int_t ny, Int_t nz)
127 : {
128 : //
129 : //
130 : //Update fit parameters
131 0 : if (ny>1){
132 0 : Fit2(fA,fB,fC);
133 0 : }
134 : else{
135 0 : Fit1(fA,fB,fC);
136 : }
137 0 : if (nz>1){
138 0 : Fit2(fD,fE,fF);
139 0 : }
140 : else{
141 0 : Fit1(fD,fE,fF);
142 : }
143 0 : }
144 :
145 :
146 :
147 : void AliTPCpolyTrack::Fit2(
148 : Double_t &a, Double_t &b, Double_t &c)
149 : {
150 : //fit of second order
151 : Double_t det =
152 0 : fSumW* (fSumX2*fSumX4-fSumX3*fSumX3) -
153 0 : fSumX* (fSumX*fSumX4-fSumX3*fSumX2)+
154 0 : fSumX2* (fSumX*fSumX3-fSumX2*fSumX2);
155 :
156 0 : if (TMath::Abs(det)> 0.000000000000001) {
157 0 : a =
158 0 : (fSumY * (fSumX2*fSumX4-fSumX3*fSumX3)-
159 0 : fSumX *(fSumYX*fSumX4-fSumYX2*fSumX3)+
160 0 : fSumX2*(fSumYX*fSumX3-fSumYX2*fSumX2))/det;
161 0 : b=
162 0 : (fSumW*(fSumYX*fSumX4-fSumX3*fSumYX2)-
163 0 : fSumY*(fSumX*fSumX4-fSumX3*fSumX2)+
164 0 : fSumX2*(fSumX*fSumYX2-fSumYX*fSumX2))/det;
165 0 : c=
166 0 : (fSumW*(fSumX2*fSumYX2-fSumYX*fSumX3)-
167 0 : fSumX*(fSumX*fSumYX2-fSumYX*fSumX2)+
168 0 : fSumY*(fSumX*fSumX3-fSumX2*fSumX2))/det;
169 0 : }
170 0 : }
171 :
172 : void AliTPCpolyTrack::Fit1( Double_t &a, Double_t &b, Double_t &c)
173 : {
174 : //
175 : //
176 : //
177 0 : Double_t det = fSumW*fSumX2-fSumX*fSumX;
178 0 : if (TMath::Abs(det)> 0.000000000000001) {
179 0 : b = (fSumW*fSumYX-fSumX*fSumY)/det;
180 0 : a = (fSumX2*fSumY-fSumX*fSumYX)/det;
181 0 : c = 0;
182 0 : }else{
183 0 : a =fSumYX/fSumX;
184 0 : b =0;
185 0 : c =0;
186 : }
187 :
188 0 : }
189 :
190 : void AliTPCpolyTrack::Refit(AliTPCpolyTrack &track, Double_t deltay, Double_t deltaz)
191 : {
192 : //
193 : // refit with cut on distortion
194 : //
195 0 : track.Reset();
196 : //first refit to temporary
197 0 : AliTPCpolyTrack track0;
198 0 : track0.Reset();
199 0 : for (Int_t i=0;i<fNPoints;i++){
200 0 : Double_t y,z;
201 0 : GetFitPoint(fX[i],y,z);
202 0 : if ( (TMath::Abs(y-fY[i])<deltay)&&(TMath::Abs(z-fZ[i])<deltaz)){
203 0 : track0.AddPoint(fX[i],y,z);
204 0 : }
205 0 : }
206 0 : if (track0.GetN()>2)
207 0 : track0.UpdateParameters();
208 : else
209 0 : return;
210 : //
211 0 : for (Int_t i=0;i<fNPoints;i++){
212 0 : Double_t y,z;
213 0 : track0.GetFitPoint(fX[i],y,z);
214 0 : if ( (TMath::Abs(y-fY[i])<deltay)&&(TMath::Abs(z-fZ[i])<deltaz)){
215 0 : track.AddPoint(fX[i],y,z);
216 0 : }
217 0 : }
218 0 : if (track.GetN()>2)
219 0 : track.UpdateParameters();
220 :
221 0 : }
222 :
223 : void AliTPCpolyTrack::Refit(AliTPCpolyTrack &track, Double_t deltay, Double_t deltaz, Int_t nfirst, Int_t ny, Int_t nz)
224 : {
225 : //
226 : // refit with cut on distortion
227 : //
228 0 : track.Reset();
229 : //first refit to temporary
230 0 : AliTPCpolyTrack track0;
231 0 : track0.Reset();
232 0 : for (Int_t i=0;i<fNPoints;i++){
233 0 : Double_t y,z;
234 0 : GetFitPoint(fX[i],y,z);
235 0 : if ( (TMath::Abs(y-fY[i])<deltay)&&(TMath::Abs(z-fZ[i])<deltaz)){
236 0 : track0.AddPoint(fX[i],y,z);
237 0 : }
238 0 : }
239 0 : if (track0.GetN()>2){
240 0 : if (track0.GetN()>nfirst)
241 0 : track0.UpdateParameters(ny,nz);
242 : else
243 0 : track0.UpdateParameters(1,1);
244 : }
245 : else
246 0 : return;
247 : //
248 0 : for (Int_t i=0;i<fNPoints;i++){
249 0 : Double_t y,z;
250 0 : track0.GetFitPoint(fX[i],y,z);
251 0 : if ( (TMath::Abs(y-fY[i])<deltay)&&(TMath::Abs(z-fZ[i])<deltaz)){
252 0 : track.AddPoint(fX[i],y,z);
253 0 : }
254 0 : }
255 0 : if (track.GetN()>2)
256 0 : track.UpdateParameters(ny,nz);
257 :
258 0 : }
259 :
|