]> git.uio.no Git - u/mrichter/AliRoot.git/blame - ITS/AliITSTrackV1.cxx
Several pointers were set to zero in the default constructors to avoid memory managem...
[u/mrichter/AliRoot.git] / ITS / AliITSTrackV1.cxx
CommitLineData
aecdf013 1// ITS Track Class
2//Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
3// It contain all the usefull information for the track and the method to calculate, modify or extract them
4// The track is mainly caracterized by the state vector of elements (fX0, fX1, fX2, fX3, fX4) and the
5// corresponding covariance matrix of elements (C00, C10, ..... C44) that is triangular
6//
7#include <iostream.h>
8#include <TMath.h>
9#include <TVector.h>
10#include <TObjArray.h>
11#include "AliRun.h"
12#include "AliITSRad.h"
13#include "AliITSTrackV1.h"
14#include "AliGenerator.h"
a3894645 15#include "AliMagF.h"
aecdf013 16
17
18ClassImp(AliITSTrackV1)
19
20AliITSTrackV1::AliITSTrackV1() {
21//Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
22// default constructor
23
24 fC00=fC10=fC11=fC20=fC21=fC22=fC30=fC31=fC32=fC33=fC40=fC41=fC42=fC43=fC44=0.;
25 flistCluster = new TObjArray;
26 fNumClustInTrack =0;
27 fChi2=-1;
28 flabel =0;
29 fVertex.ResizeTo(3);
30 fErrorVertex.ResizeTo(3);
31 fLayer = -1;
32 fClusterInTrack = new TMatrix(6,9);
b7a35fb7 33 Int_t i,j;
34 //for(i=0; i<6; i++) (*fClusterInTrack)(i,6)=(*fClusterInTrack)(i,7)=
35 // (*fClusterInTrack)(i,8)=-1.;
36 for(i=0; i<6; i++){
37 for(j=4; j<9; j++) (*fClusterInTrack)(i,j)=-1.; //modificata angela
38 }
70a9314b 39 frtrack=0.;
40 fnoclust=0;
aecdf013 41 fd2.ResizeTo(6);
42 ftgl2.ResizeTo(6);
a3894645 43 fdtgl.ResizeTo(6);
44
45//////////////////////////////////////// gets magnetic field factor ////////////////////////////////
46
47 AliMagF * fieldPointer = gAlice->Field();
48 fFieldFactor = (Double_t)fieldPointer->Factor();
49 //cout<< " field factor = "<<fFieldFactor<<"\n"; getchar();
50
51/////////////////////////////////////////////////////////////////////////////////////////////////////////
52
aecdf013 53}
54
55
56
57AliITSTrackV1::AliITSTrackV1(const AliITSTrackV1 &cobj) {
58//Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
59// copy constructor
60
61 fClusterInTrack = new TMatrix(6,9);
b7a35fb7 62 Int_t i,j;
63 //for(i=0; i<6; i++) (*fClusterInTrack)(i,6)=(*fClusterInTrack)(i,7)=
64 // (*fClusterInTrack)(i,8)=-1.;
65 for(i=0; i<6; i++){
66 for(j=4; j<9; j++) (*fClusterInTrack)(i,j)=-1.; //modificata angela
67 }
aecdf013 68 flistCluster = new TObjArray;
69 fVertex.ResizeTo(3);
70 fErrorVertex.ResizeTo(3);
71 fVertex = cobj.fVertex;
72 fErrorVertex = cobj.fErrorVertex;
73 flabel = cobj.flabel;
74 fLayer=cobj.fLayer;
75 fTPCtrack = cobj.fTPCtrack;
76 fNumClustInTrack = cobj.fNumClustInTrack;
77 fChi2= cobj.fChi2;
78 fX0=cobj.fX0; fX1=cobj.fX1; fX2=cobj.fX2; fX3=cobj.fX3; fX4=cobj.fX4;
79 frtrack=cobj.frtrack;
80 fDv=cobj.fDv;
81 fZv=cobj.fZv;
82 fsigmaDv=cobj.fsigmaDv;
83 fsigmaZv=cobj.fsigmaZv;
84 fd2.ResizeTo(6);
85 ftgl2.ResizeTo(6);
86 fdtgl.ResizeTo(6);
87 fd2=cobj.fd2;
88 ftgl2=cobj.ftgl2;
89 fdtgl=cobj.fdtgl;
70a9314b 90 fnoclust=cobj.fnoclust;
aecdf013 91
92 fC00=cobj.fC00; fC10=cobj.fC10; fC11=cobj.fC11; fC20=cobj.fC20; fC21=cobj.fC21;
93 fC22=cobj.fC22; fC30=cobj.fC30; fC31=cobj.fC31; fC32=cobj.fC32; fC33=cobj.fC33;
94 fC40=cobj.fC40; fC41=cobj.fC41; fC42=cobj.fC42; fC43=cobj.fC43; fC44=cobj.fC44;
95
96 *fClusterInTrack = *cobj.fClusterInTrack;
a3894645 97
98 fFieldFactor=cobj.fFieldFactor;
aecdf013 99
100 for(i=0; i<cobj.flistCluster->GetSize(); i++)
101 flistCluster->AddLast(cobj.flistCluster->At(i));
102
103}
104
105AliITSTrackV1::AliITSTrackV1(AliTPCtrack &obj)
106{
107//Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
108// special constructor to convert a TPC track into an ITS track
109
a3894645 110//////////////////////////////////////// gets magnetic field factor ////////////////////////////////
111
112 AliMagF * fieldPointer = gAlice->Field();
113 fFieldFactor = (Double_t)fieldPointer->Factor();
114 //cout<< " field factor = "<<fFieldFactor<<"\n"; getchar();
115
116/////////////////////////////////////////////////////////////////////////////////////////////////////////
117
118
aecdf013 119 fTPCtrack = &obj;
120 fVertex.ResizeTo(3);
121 fErrorVertex.ResizeTo(3);
122
123 fd2.ResizeTo(6);
124 ftgl2.ResizeTo(6);
125 fdtgl.ResizeTo(6);
126 AliGenerator *gener = gAlice->Generator();
127 Float_t vxg,vyg,vzg;
128 gener->GetOrigin(vxg,vyg,vzg);
129
130
131 fVertex(0)=(Double_t)vxg;
132 fVertex(1)=(Double_t)vyg;
133 fVertex(2)=(Double_t)vzg;
134
135 fLayer = 7;
136 //fmCovariance = new TMatrix(5,5);
137 fClusterInTrack = new TMatrix(6,9);
138
b7a35fb7 139 Int_t i,j;
140 //for(i=0; i<6; i++) (*fClusterInTrack)(i,6)=(*fClusterInTrack)(i,7)=
141 // (*fClusterInTrack)(i,8)=-1.;
142 for(i=0; i<6; i++){
143 for(j=4; j<9; j++) (*fClusterInTrack)(i,j)=-1.; //modificata angela
144 }
aecdf013 145 flistCluster = new TObjArray;
70a9314b 146 fNumClustInTrack = 0;
147 fnoclust=0;
aecdf013 148 LmTPC();
149
150}
151
152
153AliITSTrackV1::~AliITSTrackV1() {
154//Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
155//destructor
156
e73fe7f3 157 if(flistCluster) {
158 flistCluster->Delete();
159 delete flistCluster;
160 }
aecdf013 161 if(fClusterInTrack) delete fClusterInTrack;
162
163}
164
165void AliITSTrackV1::PutCElements(Double_t C00, Double_t C10, Double_t C11, Double_t C20, Double_t C21,
166Double_t C22, Double_t C30, Double_t C31, Double_t C32, Double_t C33, Double_t C40,
167Double_t C41, Double_t C42, Double_t C43, Double_t C44){
168//Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
169// puts elements of covariance matrix
170
171 fC00=C00; fC10=C10; fC11=C11; fC20=C20; fC21=C21; fC22=C22; fC30=C30; fC31=C31; fC32=C32; fC33=C33;
172 fC40=C40; fC41=C41; fC42=C42; fC43=C43; fC44=C44;
173}
174
175void AliITSTrackV1::GetCElements(Double_t &C00, Double_t &C10, Double_t &C11, Double_t &C20, Double_t &C21,
176Double_t &C22, Double_t &C30, Double_t &C31, Double_t &C32, Double_t &C33, Double_t &C40,
177Double_t &C41, Double_t &C42, Double_t &C43, Double_t &C44) const {
178//Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
179// gets elements of covariance matrix
180
181
182 C00=fC00; C10=fC10; C11=fC11; C20=fC20; C21=fC21; C22=fC22; C30=fC30; C31=fC31; C32=fC32; C33=fC33;
183 C40=fC40; C41=fC41; C42=fC42; C43=fC43; C44=fC44;
184
185}
186
187void AliITSTrackV1::GetXElements(Double_t &X0, Double_t &X1, Double_t &X2, Double_t &X3, Double_t &X4) const {
188//Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
189// gets the elements of the state vector
190 X0=fX0; X1=fX1; X2=fX2; X3=fX3; X4=fX4;
191}
192
193void AliITSTrackV1::PutXElements(Double_t X0, Double_t X1, Double_t X2, Double_t X3, Double_t X4){
194//Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
195// puts the elements of the state vector
196 fX0=X0; fX1=X1; fX2=X2; fX3=X3; fX4=X4;
197}
198
199void AliITSTrackV1::LmTPC() {
200//Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
201// Transform the TPC state vector from TPC-local to master and build a new state vector ITS-type
202// The covariance matrix is also modified accordingly
203
204
205 Double_t alpha = fTPCtrack->GetAlpha();
206
207 //printf("LmTPC: alpha %f\n",alpha);
208
209 Double_t yTPC = fTPCtrack->GetY();
210 Double_t zTPC = fTPCtrack->GetZ();
211 Double_t cTPC = fTPCtrack->GetC();
212 Double_t etaTPC = fTPCtrack->GetEta();
213 Double_t tglTPC = fTPCtrack->GetTgl();
214
215
216 Double_t xm, ym, zm;
217 Double_t sina = TMath::Sin(alpha);
218 Double_t cosa = TMath::Cos(alpha);
219 Double_t xl= fTPCtrack->GetX();
220 xm = xl * cosa - yTPC*sina;
221 ym = xl * sina + yTPC*cosa;
222 zm = zTPC;
223 //cout<<" xl e alpha = "<<xl<<" "<<alpha<<"\n"; getchar();
224
225 Double_t x0m,y0m;
226
227 ///////////////////////////////////// determine yo //////////////////////////////////////////////////
228
229 Double_t vxl=fVertex(0)*cosa+fVertex(1)*sina;
230 Double_t vyl= -fVertex(0)*sina+fVertex(1)*cosa;
231 Double_t xo,yo, signy;
232 Double_t r = 1./cTPC;
233 xo = etaTPC / cTPC;
70a9314b 234 //fxoTPC=xo;
aecdf013 235 Double_t yo1, yo2, diffsq1, diffsq2;
236 yo1 = yTPC + TMath::Sqrt(r*r - (xl-xo)*(xl-xo));
237 yo2 = yTPC - TMath::Sqrt(r*r - (xl-xo)*(xl-xo));
238 diffsq1=TMath::Abs((yo1-vyl)*(yo1-vyl)+(xo-vxl)*(xo-vxl)-r*r);
239 diffsq2=TMath::Abs((yo2-vyl)*(yo2- vyl)+(xo-vxl)*(xo-vxl)-r*r);
240 if(diffsq1<diffsq2) {yo=yo1; signy=1.;} else {yo=yo2; signy=-1.;};
241
242 ////////////////////////////////////////////////////////////////////////////////////////////////////
243
244 x0m = xo * cosa - yo * sina;
245 y0m = xo * sina + yo * cosa;
246
247 frtrack=TMath::Sqrt(xm*xm+ym*ym);
70a9314b 248 /*
aecdf013 249 Double_t pigre=TMath::Pi();
250 Double_t phi=0.0;
251 if(ym == 0. || xm == 0.) {
252 if(ym == 0. && xm == 0.) {cout << " Error in AliITSTrackV1::LmTPC x=0 and y=0 \n"; getchar();}
253 if(ym ==0. && xm>0.) phi=0.;
254 if(ym==0. && xm<0.) phi=pigre;
255 if(xm==0 && ym>0.) phi=pigre/2.;
256 if(xm==0 && ym<0.) phi=1.5*pigre;
257 }
258 else {
259 if (xm>0. && ym>0.) phi=TMath::ATan(ym/xm);
260 if (xm<0. && ym>0.) phi=pigre+TMath::ATan(ym/xm);
261 if (xm<0. && ym<0.) phi=pigre+TMath::ATan(ym/xm);
262 if (xm>0. && ym<0.) phi=(2*pigre)+TMath::ATan(ym/xm);
263 };
70a9314b 264 if(phi<0. || phi>(2*pigre)) {cout<<"attention error on phi in AliITSTrackV1:LmTPC \n"; getchar();}
265 */
266
267 Double_t phi=TMath::ATan2(ym,xm); if(phi<0) phi=2.*TMath::Pi()+phi; //nuova def phi
aecdf013 268
269 fX0=phi;
270 fX1=zm;
271 fX3=tglTPC;
272 fX4=cTPC;
273
274
275 Double_t dd=TMath::Sqrt((x0m-fVertex(0))*(x0m-fVertex(0))+(y0m-fVertex(1))*(y0m-fVertex(1)));
276 Double_t signdd;
277 if (r>0) signdd=1.; else signdd=-1.;
278 fX2=signdd*dd-r;
279 //cout<<" fvertex = "<<fVertex(0)<<" "<<fVertex(1)<<" "<<fVertex(2)<<"\n";
280
281 Double_t cov[15];
282 fTPCtrack->GetCovariance(cov);
283
284 Double_t dfidy, dDdy, dDdC, dDdeta;
285
286 dfidy=(xm*cosa+ym*sina)/(frtrack*frtrack);
287 dDdy=signdd*((y0m-fVertex(1))*cosa-(x0m-fVertex(0))*sina)/dd;
288 Double_t dyodr=signy*(r+(xl-xo)*etaTPC)/TMath::Sqrt(r*r-(xl-xo)*(xl-xo));
289 Double_t dyomdr=sina*etaTPC+cosa*dyodr;
290 Double_t dxomdr=cosa*etaTPC-sina*dyodr;
291 Double_t ddddR=((x0m-fVertex(0))*dxomdr+(y0m-fVertex(1))*dyomdr)/dd;
292 dDdC=-r*r*(signdd*ddddR-1.);
293 Double_t dyoldxol=signy*(xl-xo)/TMath::Sqrt(r*r-(xl-xo)*(xl-xo));
294 Double_t dxomdeta=r*(cosa-sina*dyoldxol);
295 Double_t dyomdeta=r*(sina+cosa*dyoldxol);
296 dDdeta=signdd*((x0m-fVertex(0))*dxomdeta+(y0m-fVertex(1))*dyomdeta)/dd;
297
298 Double_t f00=dfidy;
299 Double_t f20=dDdy;
300 Double_t f22=dDdC;
301 Double_t f23=dDdeta;
302
303 Double_t t00=cov[0]*f00;
304 Double_t t02=cov[0]*f20+cov[6]*f22+cov[3]*f23;
305 Double_t t20=cov[6]*f00;
306 Double_t t22=cov[6]*f20+cov[9]*f22+cov[8]*f23;
307
308 fC00=f00*t00;
309 fC10=cov[1]*f00;
310 fC11=cov[2];
311 fC20=f20*t00+f22*t20+f23*cov[3]*f00;
312 fC21=f20*cov[1]+f22*cov[7]+f23*cov[4];
313 fC22=f20*t02+f22*t22+f23*(cov[3]*f20+cov[8]*f22+cov[5]*f23);
314 fC30=cov[10]*f00;
315 fC31=cov[11];
316 fC32=cov[10]*f20+cov[13]*f22+cov[12]*f23;
317 fC33=cov[14];
318 fC40=t20;
319 fC41=cov[7];
320 fC42=t22;
321 fC43=cov[13];
322 fC44=cov[9];
323
324 //cout<<" C32 e C44 = "<<fC32<<" "<<fC44<<"\n"; getchar();
325
326}
327
328
329AliITSTrackV1 &AliITSTrackV1::operator=(AliITSTrackV1 obj) {
330//Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
331// assignement operator
332
e73fe7f3 333 if (flistCluster) {
334 flistCluster->Delete();
335 delete flistCluster;
336 }
aecdf013 337 delete fClusterInTrack;
338 fClusterInTrack = new TMatrix(6,9);
339 flistCluster = new TObjArray;
340 flabel = obj.flabel;
341 fTPCtrack = obj.fTPCtrack;
342 fNumClustInTrack = obj.fNumClustInTrack;
343 fChi2= obj.fChi2;
344 fVertex=obj.fVertex;
345 fErrorVertex=obj.fErrorVertex;
346 fX0=obj.fX0; fX1=obj.fX1; fX2=obj.fX2; fX3=obj.fX3; fX4=obj.fX4;
347 fLayer=obj.fLayer;
348 frtrack=obj.frtrack;
349 fDv=obj.fDv;
350 fZv=obj.fZv;
351 fsigmaDv=obj.fsigmaDv;
352 fsigmaZv=obj.fsigmaZv;
353 fd2=obj.fd2;
354 ftgl2=obj.ftgl2;
70a9314b 355 fdtgl=obj.fdtgl;
356 fnoclust=obj.fnoclust;
aecdf013 357
358 fC00=obj.fC00; fC10=obj.fC10; fC11=obj.fC11; fC20=obj.fC20; fC21=obj.fC21;
359 fC22=obj.fC22; fC30=obj.fC30; fC31=obj.fC31; fC32=obj.fC32; fC33=obj.fC33;
360 fC40=obj.fC40; fC41=obj.fC41; fC42=obj.fC42; fC43=obj.fC43; fC44=obj.fC44;
361
362
363 *fClusterInTrack = *obj.fClusterInTrack;
364 Int_t i;
365 for(i=0; i<obj.flistCluster->GetSize(); i++) flistCluster->AddLast(obj.flistCluster->At(i));
366
367 return *this;
368
369}
370
371void AliITSTrackV1::PutCluster(Int_t layerc, TVector vecclust) {
372//Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
373// put information for clusters
374
375 (*fClusterInTrack)(layerc,0) = vecclust(0);
376 (*fClusterInTrack)(layerc,1) = vecclust(1);
377 (*fClusterInTrack)(layerc,2) = vecclust(2);
378 (*fClusterInTrack)(layerc,3) = vecclust(3);
379 (*fClusterInTrack)(layerc,4) = vecclust(4);
380 (*fClusterInTrack)(layerc,5) = vecclust(5);
381 (*fClusterInTrack)(layerc,6) = vecclust(6);
382 (*fClusterInTrack)(layerc,7) = vecclust(7);
383 (*fClusterInTrack)(layerc,8) = vecclust(8);
384
385}
386
387
388void AliITSTrackV1::GetClusters() {
389//Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
390// prints the clusters belonging to the current track
391
392 TMatrix a(*fClusterInTrack);
393 TMatrix b(6,3);
394 Int_t i;
395 for(i=0;i<6; i++){
396 b(i,0)=a(i,6); b(i,1)=a(i,7); b(i,2)=a(i,8);
397 }
398 a.Print();
399 // b.Print();
400
401}
402
403
404TVector AliITSTrackV1::GetLabTrack(Int_t lay) {
405//Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
406// gets the label of the track
407
408 TVector vecLabel(3);
409 vecLabel(0)=( (Float_t) (*fClusterInTrack)(lay,6) );
410 vecLabel(1)=( (Float_t) (*fClusterInTrack)(lay,7) );
411 vecLabel(2)=( (Float_t) (*fClusterInTrack)(lay,8) );
412 return vecLabel;
413}
414
415void AliITSTrackV1::Search(TVector VecTotLabref, Long_t &labref, Int_t &freq){
416//Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
417// define label
418
419 Int_t vecfreq[18];
420
421 Int_t i,j;
422 for(i=0; i<18; i++) vecfreq[i]=0;
423
424 for(i=0; i<18; i++) {
425 for(j=0; j<18; j++) {
426 // if(VecTotLabref(i) == 0.) VecTotLabref(i)=-3.; //commentato il 5-3-2001
427 if( (VecTotLabref(i)>=0.) && (VecTotLabref(i)==VecTotLabref(j)) ) vecfreq[i]++;
428 }
429 }
430 Int_t imax=-1000;
431 Long_t labdefault= (Long_t)1000000.;
432 freq=0;
433 for(i=0; i<18; i++) {
434 if(vecfreq[i]>freq) {freq=vecfreq[i]; imax=i;}
435 }
436 if(imax<0) labref=labdefault; else labref=(Long_t) VecTotLabref(imax);
437}
438
439
440void AliITSTrackV1::Propagation(Double_t rk) {
441//Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
442//Propagation of track
443 Double_t duepi=2.*TMath::Pi();
444 Double_t rkm1=frtrack;
445//cout<<" rk e rkm1 dentro Propagation "<<rk<<" "<<rkm1<<"\n";
446
447 //
448 Double_t aAk=ArgA(rk), aAkm1=ArgA(rkm1);
449 Double_t ak=Arga(rk), akm1=Arga(rkm1);
450 fX0+=TMath::ASin(aAk)-TMath::ASin(aAkm1);
451
452 if(fX0>duepi) fX0-=duepi;
453 if(fX0<0.) fX0+=duepi;
454
455 Double_t tgl=fX3;
456 Double_t c=fX4;
457 Double_t d=fX2;
458 Double_t cy=c/2;
459 fX1+=tgl/cy*(TMath::ASin(ak)-TMath::ASin(akm1));
460 frtrack=rk;
461
462
463 Double_t bk=ArgB(rk), bkm1=ArgB(rkm1);
464 Double_t ck=ArgC(rk), ckm1=ArgC(rkm1);
465
466 Double_t f02=ck/TMath::Sqrt(1.-aAk*aAk) - ckm1/TMath::Sqrt(1.-aAkm1*aAkm1);
467 Double_t f04=bk/TMath::Sqrt(1.-aAk*aAk) - bkm1/TMath::Sqrt(1.-aAkm1*aAkm1);
468 Double_t f12=tgl*d*(1./rk - 1./rkm1);
469 Double_t f13=rk - rkm1;
470
471
472 Double_t c00=fC00;
473 Double_t c10=fC10;
474 Double_t c11=fC11;
475 Double_t c20=fC20;
476 Double_t c21=fC21;
477 Double_t c22=fC22;
478 Double_t c30=fC30;
479 Double_t c31=fC31;
480 Double_t c32=fC32;
481 Double_t c33=fC33;
482 Double_t c40=fC40;
483 Double_t c41=fC41;
484 Double_t c42=fC42;
485 Double_t c43=fC43;
486 Double_t c44=fC44;
487
488 Double_t r10=c10+c21*f02+c41*f04;
489 Double_t r20=c20+c22*f02+c42*f04;
490 Double_t r30=c30+c32*f02+c43*f04;
491 Double_t r40=c40+c42*f02+c44*f04;
492 Double_t r21=c21+c22*f12+c32*f13;
493 Double_t r31=c31+c32*f12+c33*f13;
494 Double_t r41=c41+c42*f12+c43*f13;
495
496 fC00=c00+c20*f02+c40*f04+f02*r20+f04*r40;
497 fC10=r10+f12*r20+f13*r30;
498 fC11=c11+c21*f12+c31*f13+f12*r21+f13*r31;
499 fC20=r20;
500 fC21=r21;
501 fC30=r30;
502 fC31=r31;
503 fC40=r40;
504 fC41=r41;
505
506}
507
508void AliITSTrackV1::AddEL(AliITSRad *rl, Double_t signdE, Bool_t flagtot, Double_t mass) {
509//Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
510// add energy loss
511
512 TVector s(6);
513 s(0)=0.0026+0.00283; s(1)=0.018; s(2)=0.0094; s(3)=0.0095; s(4)=0.0091; s(5)=0.0087;
514 //s(0)=0.0026+0.00283*2.; s(1)=0.018*2.; s(2)=0.0094; s(3)=0.0095; s(4)=0.0091; s(5)=0.0087;
515 //0.00277 is added in the first layer to take into account the energy loss in the beam pipe
516
517 //for(int k=0; k<6; k++) cout<<s(k)<<" "; cout<<"\n";
518 Int_t k;
70a9314b 519 //for(k=0; k<6; k++) s(k)=s(k)*1.6; //forint
520 for(k=0; k<6; k++) s(k)=s(k)*1.7; //forint
aecdf013 521
522 Double_t phi=fX0;
523
524 if(phi<0.174 ) s(5)=s(5)+0.012;
a3894645 525 if(phi>6.1 ) s(5)=s(5)+0.012; // to take into account rail
526 if(phi>2.96 && phi<3.31 ) s(5)=s(5)+0.012;
aecdf013 527
70a9314b 528 /*
aecdf013 529 Double_t tgl=fX3;
530 Double_t theta=((TMath::Pi())/2.)-TMath::ATan(tgl);
531 //phi*=180./TMath::Pi();
532 //theta*=180./TMath::Pi();
533 //Double_t rad90=(TMath::Pi())/2.;
534 Double_t rad40=(TMath::Pi())*40./180.;
535 Double_t rad100=(TMath::Pi())*100/180;
536 Double_t rad360=(TMath::Pi())*2.;
537 Int_t imax=rl->Getimax();
538 Int_t jmax=rl->Getjmax();
539 Int_t i=(Int_t) ( (theta-rad40)/rad100*imax);
540 Int_t j=(Int_t) ( phi/rad360*jmax );
541 //Int_t i=(Int_t)( ((theta-((TMath::Pi())/4.))/((TMath::Pi())/2.))*imax );
542 //Int_t j=(Int_t)( (phi/((TMath::Pi())*2.))*jmax );
543 if(i<0) i=0;
544 if(i>=imax) i=imax-1;
545 if(j<0) j=0;
546 if(j>=jmax) j=jmax-1;
70a9314b 547
aecdf013 548 s(0) = 0.0028/TMath::Sin(theta)+( rl->GetRadMatrix1() )(i,j); // 0.0028 takes into account the beam pipe
549 s(1) = ( rl->GetRadMatrix2() )(i,j);
550 s(2) = ( rl->GetRadMatrix3() )(i,j);
551 s(3) = ( rl->GetRadMatrix4() )(i,j);
552 s(4) = ( rl->GetRadMatrix5() )(i,j);
553 s(5) = ( rl->GetRadMatrix6() )(i,j);
554
555
556 */
557
558 //for(int k=0; k<6; k++) cout<<s(k)<<" "; getchar();
559
560 //if(phi>60) {cout<<" phi = "<<phi<<"\n"; getchar();}
561 //if(theta<45 || theta>135) {cout<<" theta = "<<theta<<"\n"; getchar();}
562 //cout<<" dentro AddEl: phi, theta = "<<phi<<" "<<theta<<"\n"; getchar();
563
70a9314b 564 Double_t cl=1.+fX3*fX3; // cl=1/(cosl)**2 = 1 + (tgl)**2
aecdf013 565 Double_t sqcl=TMath::Sqrt(cl);
566 Double_t pt=GetPt();
567
568 Double_t p2=pt*pt*cl;
569 Double_t e=TMath::Sqrt(p2+mass*mass);
570 Double_t beta2=p2/(p2+mass*mass);
571
572 Double_t dE;
573 if(flagtot) {
574 Double_t stot=s(0)+s(1)+s(2)+s(3)+s(4)+s(5);
575 dE=0.153/beta2*(log(5940*beta2/(1-beta2)) - beta2)*stot*21.82*sqcl;
576 } else {
577 dE=0.153/beta2*(log(5940*beta2/(1-beta2)) - beta2)*s(fLayer-1)*21.82*sqcl;
578 }
579 dE=signdE*dE/1000.;
580
581 e+=dE;
582 Double_t p=TMath::Sqrt(e*e-mass*mass);
583 Double_t sign=1.;
584 if(fX4 < 0.) sign=-1.;
585 pt=sign*p/sqcl;
a3894645 586 Double_t cc=(0.299792458*0.2*fFieldFactor)/(pt*100.);
aecdf013 587 fX4=cc;
588
589}
590
591void AliITSTrackV1::Correct(Double_t rk) {
592//Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
593// correct track to take into account real geometry detector
594
595 Double_t duepi=2.*TMath::Pi();
596 Double_t rkm1=frtrack;
597 Double_t aAk=ArgA(rk), aAkm1=ArgA(rkm1);
598 Double_t ak=Arga(rk), akm1=Arga(rkm1);
599
600 fX0+=TMath::ASin(aAk)-TMath::ASin(aAkm1);
601 if(fX0>duepi) fX0-=duepi;
602 if(fX0<0.) fX0+=duepi;
603
604 Double_t tgl=fX3;
605 Double_t c=fX4;
606 Double_t cy=c/2;
607 fX1+=tgl/cy*(TMath::ASin(ak)-TMath::ASin(akm1));
608 frtrack=rk;
609
610}
611
70a9314b 612void AliITSTrackV1::AddMS(AliITSRad *rl, Double_t mass) {
aecdf013 613//Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
614////////// Modification of the covariance matrix to take into account multiple scattering ///////////
615
616 TVector s(6);
617
618 s(0)=0.0026+0.00283; s(1)=0.018; s(2)=0.0094; s(3)=0.0095; s(4)=0.0091; s(5)=0.0087;
619 // s(0)=0.0026+0.00283*2.; s(1)=0.018*2.; s(2)=0.0094; s(3)=0.0095; s(4)=0.0091; s(5)=0.0087;
620//0.00277 is added in the first layer to take into account the energy loss in the beam pipe
621
622 Int_t k;
70a9314b 623 //for(k=0; k<6; k++) s(k)=s(k)*1.6; // forint
624 for(k=0; k<6; k++) s(k)=s(k)*1.7; // forint
aecdf013 625
626 Double_t phi=fX0;
627 if(phi<0.174 ) s(5)=s(5)+0.012; //aggiunta provvisoria
628 if(phi>6.1 ) s(5)=s(5)+0.012; //aggiunta provvisoria
629 if(phi>2.96 && phi< 3.31) s(5)=s(5)+0.012; //aggiunta provvisoria
70a9314b 630
aecdf013 631
632 Double_t tgl=fX3;
70a9314b 633 /*
aecdf013 634 Double_t theta=((TMath::Pi())/2.)-TMath::ATan(tgl);
635 Double_t rad40=(TMath::Pi())*40./180.; // rivedere
636 Double_t rad100=(TMath::Pi())*100/180;
637 Double_t rad360=(TMath::Pi())*2.;
638 Int_t imax=rl->Getimax();
639 Int_t jmax=rl->Getjmax();
640 Int_t i=(Int_t) ( (theta-rad40)/rad100*imax);
641 Int_t j=(Int_t) ( phi/rad360*jmax);
642
643 if(i<0) i=0;
644 if(i>=imax) i=imax-1;
645 if(j<0) j=0;
646 if(j>=jmax) j=jmax-1;
70a9314b 647
aecdf013 648 s(0) = 0.0028/TMath::Sin(theta)+( rl->GetRadMatrix1() )(i,j); // 0.0028 takes into account the beam pipe
649 s(1) = ( rl->GetRadMatrix2() )(i,j);
650 s(2) = ( rl->GetRadMatrix3() )(i,j);
651 s(3) = ( rl->GetRadMatrix4() )(i,j);
652 s(4) = ( rl->GetRadMatrix5() )(i,j);
653 s(5) = ( rl->GetRadMatrix6() )(i,j);
654 */
70a9314b 655 //Double_t mass=0.1396;
aecdf013 656 Int_t layer=(Int_t)GetLayer();
657
658 Double_t cosl=TMath::Cos(TMath::ATan(tgl));
659 Double_t d=fX2;
660 Double_t c=fX4;
661 Double_t cy=c/2.;
662 Double_t q20=1./(cosl*cosl);
663 Double_t q30=c*tgl;
664
665 Double_t q40=cy*(frtrack*frtrack-d*d)/(1.+ 2.*cy*d);
666 Double_t dd=d+cy*d*d-cy*frtrack*frtrack;
667 Double_t dprova=frtrack*frtrack - dd*dd;
668 Double_t q41=0.;
669 if(dprova>0.) q41=-1./cosl*TMath::Sqrt(dprova)/(1.+ 2.*cy*d);
670
671 Double_t p2=(GetPt()*GetPt())/(cosl*cosl);
672 Double_t beta2=p2/(p2+mass*mass);
673 Double_t theta2=14.1*14.1/(beta2*p2*1.e6)*(s(layer-1)/cosl);
674
675 fC22+=theta2*(q40*q40+q41*q41);
676 fC32+=theta2*q20*q40;
677 fC33+=theta2*q20*q20;
678 fC42+=theta2*q30*q40;
679 fC43+=theta2*q30*q20;
680 fC44+=theta2*q30*q30;
681
682}
683void AliITSTrackV1::PrimaryTrack(AliITSRad *rl) {
684//Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
685// calculation of part of covariance matrix for vertex constraint
686
687 Double_t rlayer[6];
688
689 rlayer[0]=4.; rlayer[1]=7.; rlayer[2]=14.9; rlayer[3]=23.8;
690 rlayer[4]=39.1; rlayer[5]=43.6;
691
692 Double_t cy=fX4/2.;
693 Double_t tgl=(fX1-fZv)*cy/TMath::ASin(cy*frtrack);
694 Double_t frtrack=1.;
695 fX0=0.;
696 fX1=frtrack*tgl;
697 fX2=fDv;
698 fX3=tgl;
699
700 fC00=fC10=fC11=fC20=fC21=fC22=fC30=fC31=fC32=fC33=fC40=fC41=fC42=fC43=0.;
701
702 AddEL(rl,1.,1);
703 fLayer=0;
704 Int_t i;
705 for (i=0; i<6; i++) {
706 Propagation(rlayer[i]);
707 fLayer++;
708 fd2(i)=fC22;
709 ftgl2(i)=fC33;
710 fdtgl(i)=fC32;
711 AddMS(rl);
712 AddEL(rl,-1,0);
713 }
714}
715
716
717Int_t AliITSTrackV1::DoNotCross(Double_t rk) const{
718//Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
719// determine if the track cross a layer
720
721 Double_t c=fX4;
722 Double_t d=fX2;
723 Double_t cy=c/2.;
724 return (TMath::Abs((cy*rk+(1.+cy*d)*d/rk)/(1.+2.*cy*d))>=1.)?1:0;
725}
726
727
728Double_t AliITSTrackV1::ArgA(Double_t rk) const {
729//Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
730// quantity usefull in Propagation
731 Double_t c=fX4;
732 Double_t d=fX2;
733 Double_t cy=c/2.;
734 Double_t arg=(cy*rk + (1 + cy*d)*d/rk)/(1.+ 2.*cy*d);
735 if (TMath::Abs(arg) < 1.) return arg;
736 //cout<<"class AliITSTrack: ArgA out of range !\n";/* getchar();*/
737 return (arg>0) ? 0.99999999999 : -0.9999999999;
738}
739
740Double_t AliITSTrackV1::Arga(Double_t rk) const {
741//Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
742// quantity usefull in Propagation
743 Double_t c=fX4;
744 Double_t d=fX2;
745 Double_t cy=c/2.;
746 Double_t arg=(rk*rk - d*d)/(1.+ 2.*cy*d);
747 if (arg<0.) {/*cout<<"class AliITSTrack: Arga out of range !\n";*/ arg=0.;}
748 return cy*TMath::Sqrt(arg);
749}
750
751Double_t AliITSTrackV1::ArgB(Double_t rk) const {
752//Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
753// quantity usefull in Propagation
754 Double_t c=fX4;
755 Double_t d=fX2;
756 Double_t cy=c/2.;
757 return (rk*rk - d*d)/(rk*(1.+ 2.*cy*d)*(1.+ 2.*cy*d));
758}
759
760Double_t AliITSTrackV1::ArgC(Double_t rk) const {
761//Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
762// quantity usefull in Propagation
763 Double_t c=fX4;
764 Double_t d=fX2;
765 Double_t cy=c/2.;
766 return (1./rk - 2.*cy*ArgA(rk)/(1.+ 2.*cy*d));
767}
768
769
70a9314b 770Double_t AliITSTrackV1::GetPredChi2(Double_t m[2], Double_t sigma[2] ) const {
771//Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
772// This function calculates a predicted chi2 increment.
773/*
774 Double_t r00=c->GetSigmaY2(), r01=0., r11=c->GetSigmaZ2();
775 r00+=fC00; r01+=fC10; r11+=fC11;
776
777 Double_t det=r00*r11 - r01*r01;
778 if (TMath::Abs(det) < 1.e-10) {
779 Int_t n=GetNumberOfClusters();
780 if (n>4) cerr<<n<<" AliKalmanTrack warning: Singular matrix !\n";
781 return 1e10;
782 }
783 Double_t tmp=r00; r00=r11; r11=tmp; r01=-r01;
784
785 Double_t dy=c->GetY() - fP0, dz=c->GetZ() - fP1;
786
787 return (dy*r00*dy + 2*r01*dy*dz + dz*r11*dz)/det;
788 */
789
790
791 Double_t r00=sigma[0], r01=0., r11=sigma[1];
792 r00+=fC00; r01+=fC10; r11+=fC11;
793 Double_t det=r00*r11-r01*r01;
794 if(TMath::Abs(det) < 1.e-15) {cout<<" Problems on matrix in GetPredChi2 "<<det<<"\n";
795 return 1e10;}
796 Double_t tmp=r00; r00=r11; r11=tmp; r01=-r01;
797 Double_t dphi=m[0]-fX0;
798 Double_t dz=m[1]-fX1;
799 Double_t chi2 = (dphi*r00*dphi +2.*r01*dphi*dz + dz*r11*dz)/det;
800 return chi2;
801
802
803
aecdf013 804
70a9314b 805}