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