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