]> git.uio.no Git - u/mrichter/AliRoot.git/blob - ITS/AliITStracking.cxx
3c2873d9cb7b1e578f2fdeb5a0b041aaa925af66
[u/mrichter/AliRoot.git] / ITS / AliITStracking.cxx
1 #include <TMath.h> 
2 #include <TList.h> 
3 #include <TTree.h> 
4 #include <TVector.h>
5 #include <TMatrix.h>
6 #include <TObjectTable.h>
7
8 #include "AliITStracking.h"
9 #include "AliRun.h"
10 #include "AliITS.h"
11 #include "AliITSgeom.h"
12 #include "AliITSRecPoint.h"
13 #include "AliITStrack.h"
14
15 ClassImp(AliITStracking)
16  
17
18 AliITStracking::AliITStracking(TList *trackITSlist, AliITStrack *reference, 
19                 AliITS *aliITS, TObjArray *rpoints, Double_t Ptref, Int_t **vettid, Bool_t flagvert) {                                                                           
20 ///////////////////////   This function perform the tracking in ITS detectors /////////////////////
21 ///////////////////////     reference is a pointer to the final best track    ///////////////////// 
22 //Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
23 // The authors  thank   Mariana Bondila to have help them to resolve some problems.  July-2000                                                      
24
25   
26   Rlayer[0]=4.; Rlayer[1]=7.;  Rlayer[2]=14.9;  Rlayer[3]=23.8;  Rlayer[4]=39.1;  Rlayer[5]=43.6;
27      
28   for(Int_t index =0; index<trackITSlist->GetSize(); index++) {
29     AliITStrack *trackITS = (AliITStrack *) trackITSlist->At(index);
30     if((*trackITS).GetLayer()==7) reference->SetChi2(10.223e140);
31     //cout <<" Layer inizio = "<<(*trackITS).GetLayer()<<"\n";
32     // cout<<"fvtrack =" <<"\n";
33     // cout << (*trackITS)(0) << " "<<(*trackITS)(1)<<" "<<(*trackITS)(2)<<" "<<(*trackITS)(3)<<" "<<(*trackITS)(4)<<"\n";
34     // cout<< " rtrack = "<<(*trackITS).Getrtrack()<<"\n";
35     // getchar();    
36     Double_t Chi2Now, Chi2Ref;
37     if((*trackITS).GetLayer()==1 ) {
38       Chi2Now = trackITS->GetChi2();
39       Float_t NumClustNow = trackITS->GetNumClust();
40       if(trackITS->GetNumClust()) Chi2Now /= (Double_t )trackITS->GetNumClust();
41       Chi2Ref = reference->GetChi2();
42       Float_t NumClustRef = reference->GetNumClust();   
43       if(reference->GetNumClust()) Chi2Ref /= (Double_t )reference->GetNumClust();
44       //cout<<" Chi2Now and Chi2Ref = "<<Chi2Now<<" "<<Chi2Ref<<"\n";
45                 if( NumClustNow > NumClustRef ) {*reference = *trackITS;} 
46       if((NumClustNow == NumClustRef )&& (Chi2Now < Chi2Ref))  {*reference = *trackITS;}
47       continue; 
48     }
49
50     Float_t NumClustNow = trackITS->GetNumClust();
51     if(NumClustNow) { 
52       Chi2Now = trackITS->GetChi2();
53       Chi2Now/=NumClustNow;
54       //cout<<" Chi2Now =  "<<Chi2Now<<"\n"; 
55
56     // if(Ptref > 0.6 && Chi2Now > 20.) continue; 
57     if(Ptref > 0.6 && Chi2Now > 30.) continue;    
58     if((Ptref <= 0.6 && Ptref>0.2)&& Chi2Now > 15.) continue;        
59      // if(Chi2Now>5.) continue; 
60       //if(Chi2Now>15.) continue;     
61      // if(Ptref <= 0.2 && Chi2Now > 10.) continue;  
62      if(Ptref <= 0.2 && Chi2Now > 8.) continue;                                                                  
63     }
64                  
65     Int_t layerInit = (*trackITS).GetLayer();
66     Int_t layernew = layerInit - 2;  // -1 for new layer, -1 for matrix index 
67                                           
68     Int_t NLadder[]= {20, 40, 14, 22, 34, 38}; 
69          Int_t NDetector[]= {4,  4,   5,  8, 23, 26}; 
70                                                 
71     TList listoftrack;           
72     Int_t ladp, ladm, detp,detm,ladinters,detinters;    
73     Int_t layerfin=layerInit-1;
74     Double_t Rfin=Rlayer[layerfin-1];
75     // cout<<"Prima di intersection \n";
76     Int_t  outinters=NewIntersection(*trackITS, Rfin, layerfin, ladinters, detinters);
77                  
78    // cout<<" outinters = "<<outinters<<"\n";
79    //  cout<<" Layer ladder detector intersection ="<<layerfin<<" "<<ladinters<<" "<<detinters<<"\n";
80    //  cout << " phiinters zinters = "<<(*trackITS)(0) << " "<<(*trackITS)(1)<<"\n"; getchar();
81                          
82     if(outinters==-1) continue;
83          
84     Int_t flaghit=0;   
85                         
86     if(outinters==0){   
87       TVector Touclad(9), Toucdet(9);    
88       Int_t lycur=layerfin;                                            
89       ladp=ladinters+1;
90       ladm=ladinters-1;
91       if(ladm <= 0) ladm=NLadder[layerfin-1];  
92       if(ladp > NLadder[layerfin-1]) ladp=1;            
93       detp=detinters+1;
94       detm=detinters-1;
95       Int_t idetot=1;
96       Touclad(0)=ladinters; Touclad(1)=ladm; Touclad(2)=ladp;
97       Touclad(3)=ladinters; Touclad(4)=ladm; Touclad(5)=ladp;
98       Touclad(6)=ladinters; Touclad(7)=ladm; Touclad(8)=ladp;
99       Toucdet(0)=detinters; Toucdet(1)=detinters; Toucdet(2)=detinters;
100       if(detm > 0 && detp <= NDetector[layerfin-1]) {
101         idetot=9;
102         Toucdet(3)=detm; Toucdet(4)=detm; Toucdet(5)=detm;         
103         Toucdet(6)=detp; Toucdet(7)=detp; Toucdet(8)=detp;
104       }
105          
106       if(detm > 0 && detp > NDetector[layerfin-1]) {
107         idetot=6;
108         Toucdet(3)=detm; Toucdet(4)=detm; Toucdet(5)=detm;
109       }
110          
111       if(detm <= 0 && detp <= NDetector[layerfin-1]) {
112         idetot=6;
113         Toucdet(3)=detp; Toucdet(4)=detp; Toucdet(5)=detp;
114       } 
115         
116       for (Int_t iriv=0; iriv<idetot; iriv++) {  //for on detectors
117         AliITSgeom *g1 = aliITS->GetITSgeom();  
118         TVector CTF(9);
119         g1->GetCenterThetaPhi(layerInit-1,(Int_t)Touclad(iriv),(Int_t)Toucdet(iriv),CTF);
120
121         // cout<<" layer, ladder, det, xo, yo, zo = "<<layerInit-1<<" "<<(Int_t)Touclad(iriv)<<
122         // " "<<(Int_t)Toucdet(iriv)<<" "<<CTF(0)<<" "<<CTF(1)<<" "<<CTF(2)<< " "<<CTF(6)<<"\n"; getchar(); 
123
124         ////////////////////////////////////////////////////////////////////////////////////////////////
125
126         /*** Rec points sorted by module *****/
127         /**************************************/
128
129         Int_t index;
130         AliITSRecPoint *recp;
131         AliITSgeom *geom = aliITS->GetITSgeom();
132         index = geom->GetModuleIndex(lycur,Touclad(iriv),Toucdet(iriv));
133         Int_t lay,lad,det;
134         geom->GetModuleId(index,lay,lad,det);
135         aliITS->ResetRecPoints();
136         gAlice->TreeR()->GetEvent(index+1); //first entry in TreeR is empty
137
138         Int_t npoints=rpoints->GetEntries();
139         Int_t *indlist=new Int_t[npoints+1];
140         Int_t counter=0;
141         Int_t ind;
142         for (ind=0; ind<=npoints; ind++) {
143           indlist[ind]=-1;
144                if (*(vettid[index]+ind)==0) {
145               indlist[counter]=ind;
146                    counter++;
147               }
148         }
149
150         ind=-1;
151         for(;;) { 
152           ind++;
153           if(indlist[ind] < 0) recp=0;
154                else recp = (AliITSRecPoint*)rpoints->UncheckedAt(indlist[ind]);
155
156           if((!recp)  )  break; 
157           TVector cluster(3),vecclust(9);
158           vecclust(6)=vecclust(7)=vecclust(8)=-1.;
159           Double_t sigma[2];                  
160           // set veclust in global
161           Float_t global[3], local[3];
162           local[0]=recp->GetX();
163           local[1]=0.;
164           local[2]= recp->GetZ();
165           AliITSgeom *g1 = aliITS->GetITSgeom();
166           Int_t play = lycur;
167           Int_t plad = TMath::Nint(Touclad(iriv));   
168           Int_t pdet = TMath::Nint(Toucdet(iriv));              
169           g1->LtoG(play,plad,pdet,local,global); 
170         
171           vecclust(0)=global[0];
172           vecclust(1)=global[1];
173           vecclust(2)=global[2];                                     
174           vecclust(3) = (float)recp->fTracks[0]; 
175           vecclust(4) = (float)indlist[ind];
176           vecclust(5) = (float)index;
177           vecclust(6) = (float)recp->fTracks[0];
178           vecclust(7) = (float)recp->fTracks[1];
179           vecclust(8) = (float)recp->fTracks[2];
180         
181           sigma[0] = (Double_t)  recp->GetSigmaX2();  
182                          sigma[1] = (Double_t) recp->GetSigmaZ2(); 
183                          
184          //now we are in r,phi,z in global
185           cluster(0) = TMath::Sqrt(vecclust(0)*vecclust(0)+vecclust(1)*vecclust(1));//r hit
186           cluster(1) = PhiDef(vecclust(0),vecclust(1));    // phi hit
187           cluster(2) = vecclust(2);                   // z hit  
188                         // cout<<" cluster(1) prima = "<<cluster(1)<<"\n";    
189           //cluster(1)= cluster(1)-trackITS->Getalphaprov();  //provvisorio;
190                          //if(cluster(1)<0.) cluster(1)+=2.*TMath::Pi(); //provvisorio
191                          //cout<<" cluster(1) dopo = "<<cluster(1)<< " alphaprov = "<<trackITS->Getalphaprov()<<"\n";                    
192           Float_t sigmatotphi, sigmatotz;
193                                   
194           //Float_t epsphi=3.2, epsz=3.; 
195                          Float_t epsphi=3.2, epsz=3.0;              
196           //if(Ptref<0.2) {epsphi=3.; epsz=3.;}
197                                   
198           Double_t Rtrack=(*trackITS).Getrtrack();
199           Double_t sigmaphi=sigma[0]/(Rtrack*Rtrack);
200           sigmatotphi=epsphi*TMath::Sqrt(sigmaphi + (*trackITS).GetSigmaphi());          
201           sigmatotz=epsz*TMath::Sqrt(sigma[1] + (*trackITS).GetSigmaZ());
202   //cout<<"cluster e sigmatotphi e track = "<<cluster(0)<<" "<<cluster(1)<<" "<<sigmatotphi<<" "<<vecclust(3)<<"\n";
203   //if(vecclust(3)==481) getchar();     
204                if(cluster(1)<6. && (*trackITS).Getphi()>6.) cluster(1)=cluster(1)+(2.*TMath::Pi());
205                if(cluster(1)>6. && (*trackITS).Getphi()<6.) cluster(1)=cluster(1)-(2.*TMath::Pi());                               
206           if(TMath::Abs(cluster(1)-(*trackITS).Getphi()) > sigmatotphi) continue;
207                         // cout<<" supero sigmaphi \n";      
208           AliITStrack *newTrack = new AliITStrack((*trackITS));
209           (*newTrack).SetLayer((*trackITS).GetLayer()-1); 
210  
211                if (TMath::Abs(Rtrack-cluster(0))/Rtrack>1e-6) 
212                                                (*newTrack).Correct(Double_t(cluster(0)));       
213                         //cout<<" cluster(2) e (*newTrack).GetZ() = "<<cluster(2)<<" "<<        (*newTrack).GetZ()<<"\n";                                                                               
214           if(TMath::Abs(cluster(2)-(*newTrack).GetZ()) > sigmatotz){ 
215              delete newTrack;
216              continue;}
217        
218           if(iriv == 0) flaghit=1;
219         
220      (*newTrack).AddMS();  // add the multiple scattering matrix to the covariance matrix  
221           (*newTrack).AddEL(1.,0);
222           Double_t sigmanew[2];
223           sigmanew[0]= sigmaphi;
224           sigmanew[1]=sigma[1];
225           //cout<<" Chiamo Kalman \n"; getchar();
226           if(flagvert)   
227             KalmanFilterVert(newTrack,cluster,sigmanew);  
228           else                                                    
229             KalmanFilter(newTrack,cluster,sigmanew);
230                   
231          
232           (*newTrack).PutCluster(layernew, vecclust);
233            newTrack->AddClustInTrack();            
234                                                                         
235            listoftrack.AddLast(newTrack);
236
237         }   // end of for(;;) on rec points 
238
239         delete [] indlist;
240   
241       }  // end of for on detectors
242     }//end if(outinters==0) 
243     
244     if(flaghit==0 || outinters==-2) {
245       AliITStrack *newTrack = new AliITStrack(*trackITS);        
246       (*newTrack).SetLayer((*trackITS).GetLayer()-1); 
247       (*newTrack).AddMS();  // add the multiple scattering matrix to the covariance matrix  
248       (*newTrack).AddEL(1.,0);                
249                                                   
250       listoftrack.AddLast(newTrack);      
251     }   
252                 
253
254     //gObjectTable->Print();   // stampa memoria
255     
256     AliITStracking(&listoftrack, reference, aliITS, rpoints,Ptref,vettid,flagvert);          
257     listoftrack.Delete();
258   } // end of for on tracks
259   
260   //gObjectTable->Print();   // stampa memoria
261
262 }   
263
264
265 Int_t AliITStracking::NewIntersection(AliITStrack &track, Double_t rk,Int_t layer, Int_t &ladder, Int_t &detector) { 
266 //Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
267 // Found the intersection and the detector 
268
269   if(track.DoNotCross(rk)){ /*cout<< " Do not cross \n";*/ return -1;} 
270   track.Propagation(rk);
271   Double_t zinters=track.GetZ();
272   Double_t phinters=track.Getphi();
273   //phinters = phinters+track.Getalphaprov(); //provvisorio
274   //if(phinters>2.*3.14) phinters=phinters-2.*3.14; //provvisorio
275   //cout<<"zinters = "<<zinters<<"  phinters = "<<phinters<<"\n";
276
277   //////////////////////////////////      limits for Geometry 5      /////////////////////////////
278   
279   Int_t NLadder[]= {20, 40, 14, 22, 34, 38};
280   Int_t NDetector[]= {4,  4,   5,  8, 23, 26}; 
281
282   Float_t Detx[]= {0.64, 0.64, 3.509, 3.509, 3.65, 3.65 };
283   Float_t Detz[]= {4.19, 4.19, 3.75 , 3.75 , 2   , 2    };
284   ////////////////////////////////////////////////////////////////////////////////////////////////  
285   
286   TVector det(9);
287   TVector ListDet(2);
288   TVector DistZCenter(2);  
289   AliITSgeom *g1 = ((AliITS*)gAlice->GetDetector("ITS"))->GetITSgeom();
290   Int_t iz=0; 
291   Double_t epsz=1.2;
292   Double_t epszpixel=0.05;
293
294   for(Int_t iD = 1; iD<= NDetector[layer-1]; iD++) {
295     g1->GetCenterThetaPhi(layer,1,iD,det);
296     Double_t zmin=det(2)-Detz[layer-1];
297     if(iD==1) zmin=det(2)-(Detz[layer-1])*epsz;         
298     Double_t zmax=det(2)+Detz[layer-1];
299     if(iD==NDetector[layer-1]) zmax=det(2)+(Detz[layer-1])*epsz;
300     if(layer == 3 || layer==2) zmin=zmin-epszpixel; zmax=zmax+epszpixel;
301     //cout<<"zmin zinters zmax det(2)= "<<zmin<<" "<<zinters<<" "<<zmax<<" "<<det(2)<<"\n";     
302     if(zinters > zmin && zinters <= zmax) { 
303       if(iz>1) {cout<< " Errore su iz in NewIntersection \n"; getchar();}
304       else {
305         ListDet(iz)= iD; DistZCenter(iz)=TMath::Abs(zinters-det(2)); iz++;
306       }
307     }                         
308   }
309   
310   if(iz==0) {/* cout<< " No detector along Z \n";*/ return -2;}
311   detector=Int_t (ListDet(0));
312   if(iz>1 && (DistZCenter(0)>DistZCenter(1)))   detector=Int_t (ListDet(1));
313   
314   AliITSgeom *g2 = ((AliITS*)gAlice->GetDetector("ITS"))->GetITSgeom(); 
315   Float_t global[3];
316   Float_t local[3];
317   TVector ListLad(2);
318   TVector DistphiCenter(2);
319   Int_t ip=0;
320   Double_t pigre=TMath::Pi();
321      
322   for(Int_t iLd = 1; iLd<= NLadder[layer-1]; iLd++) {
323           g1->GetCenterThetaPhi(layer,iLd,detector,det);
324   Double_t phidet=PhiDef(Double_t(det(0)),Double_t(det(1)));
325
326   
327   // cout<<" layer phidet e det(6) = "<< layer<<" "<<phidet<<" "<<det(6)<<"\n"; getchar();
328   Double_t xmin,ymin,xmax,ymax; 
329   Double_t phiconfr;  
330   local[1]=local[2]=0.;  
331   local[0]= -(Detx[layer-1]);
332   if(layer==1)    local[0]= (Detx[layer-1]);  //take into account different reference system
333   g2->LtoG(layer,iLd,detector,local,global);
334   xmax=global[0]; ymax=global[1];
335   local[0]= (Detx[layer-1]);
336   if(layer==1)    local[0]= -(Detx[layer-1]);  //take into account different reference system  
337   g2->LtoG(layer,iLd,detector,local,global);
338   xmin=global[0]; ymin=global[1];
339   Double_t phimin=PhiDef(xmin,ymin);
340   Double_t phimax=PhiDef(xmax,ymax);
341   //cout<<" xmin ymin = "<<xmin<<" "<<ymin<<"\n";
342   // cout<<" xmax ymax = "<<xmax<<" "<<ymax<<"\n";  
343   // cout<<" iLd phimin phimax ="<<iLd<<" "<<phimin<<" "<<phimax<<"\n"; getchar();
344   if(phimin>phimax ){
345     if(phimin <5.5) {cout<<" Error in NewIntersection for phi \n"; getchar();}
346     phimin=phimin-(2.*pigre);
347     if(phinters>(1.5*pigre)) phiconfr=phinters-(2.*pigre);
348     if(phidet>(1.5*pigre)) phidet=phidet-(2.*pigre);
349   }
350     else phiconfr=phinters;
351   if(phiconfr>phimin && phiconfr<= phimax) {
352     if(ip>1) {
353       cout<< " Errore su ip in NewIntersection \n"; getchar();
354     }
355       else  {
356         ListLad(ip)= iLd; DistphiCenter(ip)=TMath::Abs(phiconfr-phidet); ip++;
357       }  
358     }
359   }
360   if(ip==0) { cout<< " No detector along phi \n"; getchar();}
361   ladder=Int_t (ListLad(0));
362   if(ip>1 && (DistphiCenter(0)>DistphiCenter(1)))   ladder=Int_t (ListLad(1));       
363
364   return 0;
365 }
366
367
368 Double_t AliITStracking::PhiDef(Double_t x, Double_t y){
369   Double_t pigre= TMath::Pi();
370   Double_t phi;
371   if(y == 0. || x == 0.) {
372     if(y == 0. && x == 0.) {
373       cout << "  Error in AliITStracking::PhiDef x=0 and y=0 \n"; getchar();
374     }
375     if(y==0. && x>0.) phi=0.;
376     if(y==0. && x<0.) phi=pigre;
377     if(x==0 && y>0.) phi=pigre/2.;
378     if(x==0 && y<0.) phi=1.5*pigre;   
379   }
380     else {
381       if (x>0. && y>0.) phi=TMath::ATan(y/x);
382       if (x<0. && y>0.) phi=pigre+TMath::ATan(y/x);
383       if (x<0. && y<0.) phi=pigre+TMath::ATan(y/x); 
384       if (x>0. && y<0.) phi=(2.*pigre)+TMath::ATan(y/x);     
385     }
386   if(phi<0. || phi>(2*pigre)) {
387     cout<<" Error on phi in  AliITStracking::PhiDef \n"; getchar();
388   }  
389   return phi;
390 }
391
392
393 void AliITStracking::KalmanFilter(AliITStrack *newTrack,TVector &cluster,Double_t sigma[2]){ 
394 //Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
395 // Kalman filter without vertex constraint
396
397   TMatrix H(2,5); H.UnitMatrix(); 
398   TMatrix Ht(TMatrix::kTransposed, H);
399
400
401   ////////////////////////////// Evaluation of the measurement vector /////////////////////////////////////  
402
403   TVector m(2);
404   Double_t rk,phik,zk;
405   rk=cluster(0);   phik=cluster(1);  zk=cluster(2);
406   m(0)=phik;    m(1)=zk;
407   // cout<<" r and m = "<<rk<<" "<<m(0)<<" "<<m(1)<<"\n";       
408   ///////////////////////////////////// Evaluation of the error matrix V  ///////////////////////////////          
409
410   TMatrix V(2,2);
411   V(0,1)=0.; V(1,0)=0.;  
412   V(0,0)=sigma[0];
413   V(1,1)=sigma[1];  
414   ///////////////////////////////////////////////////////////////////////////////////////////
415   
416   TMatrix C=newTrack->GetCMatrix();
417   TMatrix tmp(H,TMatrix::kMult,C);
418   TMatrix R(tmp,TMatrix::kMult,Ht); R+=V;
419   
420   R.Invert();
421   // cout<<" R prima = \n";
422   // R.Print(); getchar();
423   
424   TMatrix K(C,TMatrix::kMult,Ht); K*=R;
425   
426   TVector  x=newTrack->GetVector();
427   
428   TVector savex=x;
429   x*=H; x-=m;
430   x*=-1.; x*=K; x+=savex;  
431   TMatrix saveC=C;
432   C.Mult(K,tmp); C-=saveC; C*=-1;  
433   newTrack->GetVector()=x;
434   newTrack->GetCMatrix()=C;   
435   
436   TVector res= newTrack->GetVector(); 
437   //cout<<" res = "<<res(0)<<" "<<res(1)<<" "<<res(2)<<" "<<res(3)<<" "<<res(4)<<"\n"; 
438   res*=H; res-=m;  res*=-1.;  
439   TMatrix Cn=newTrack->GetCMatrix();
440   TMatrix tmpn(H,TMatrix::kMult,Cn);
441   TMatrix Rn(tmpn,TMatrix::kMult,Ht);  Rn-=V; Rn*=-1.;  
442   
443   Rn.Invert();   
444   TVector r=res;    res*=Rn;
445   //cout<<" R dopo = \n";
446   //Rn.Print(); getchar();
447   Double_t chi2= r*res; 
448   //cout<<"chi2 ="<<chi2<<"\n";  getchar();
449          
450   newTrack->SetChi2(newTrack->GetChi2()+chi2);
451    
452
453
454
455 void AliITStracking::KalmanFilterVert(AliITStrack *newTrack,TVector &cluster,Double_t sigma[2]){
456 //Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it 
457 // Kalman filter with vertex constraint
458   TMatrix H(4,5); H.UnitMatrix(); 
459   TMatrix Ht(TMatrix::kTransposed, H);
460
461   ////////////////////////////// Evaluation of the measurement vector /////////////////////////////////////  
462
463   TVector m(4);
464   Double_t rk,phik,zk;
465   rk=cluster(0);   phik=cluster(1);  zk=cluster(2);
466   m(0)=phik;    m(1)=zk;
467  
468   Double_t CC=(*newTrack).GetC();
469   Double_t Zv=(*newTrack).GetZv(); 
470   Double_t Dv=(*newTrack).GetDv();
471   // cout<<" Dv e Zv = "<<Dv<<" "<<Zv<<"\n";
472   Double_t Cy=CC/2.;
473   Double_t tgl= (zk-Zv)*Cy/TMath::ASin(Cy*rk);
474   m(2)=Dv;    m(3)=tgl;
475   // cout<<" m = \n";
476   // cout<<m(0)<<" "<<m(1)<<" "<<m(2)<<" "<<m(3)<<"\n";      
477   ///////////////////////////////////// Evaluation of the error matrix V  ///////////////////////////////          
478
479   TMatrix V(4,4);
480   V(0,1)=0.; V(1,0)=0.;  
481   Int_t Layer=newTrack->GetLayer();
482   V(0,0)=sigma[0];
483   V(1,1)=sigma[1];
484   V(1,3)=sigma[1]/rk;    V(3,1)=V(1,3);
485   Double_t sigmaDv=newTrack->GetsigmaDv();
486   V(2,2)=sigmaDv*sigmaDv  + newTrack->Getd2(Layer-1);
487   V(2,3)=newTrack->Getdtgl(Layer-1);  V(3,2)=V(2,3);
488   Double_t sigmaZv=newTrack->GetsigmaZv();  
489   V(3,3)=(sigma[1]+sigmaZv*sigmaZv)/(rk*rk) + newTrack->Gettgl2(Layer-1);
490   ///////////////////////////////////////////////////////////////////////////////////////////
491  
492   //cout<<" d2 tgl2 dtgl = "<<newTrack->Getd2(Layer-1)<<" "<<newTrack->Gettgl2(Layer-1)<<" "<<newTrack->Getdtgl(Layer-1)<<"\n";
493   // cout<<" V = \n";
494   // V.Print();  getchar();
495   
496   TMatrix C=newTrack->GetCMatrix();
497   TMatrix tmp(H,TMatrix::kMult,C);
498   TMatrix R(tmp,TMatrix::kMult,Ht); R+=V;
499   
500   R.Invert();  
501   TMatrix K(C,TMatrix::kMult,Ht); K*=R;  
502   TVector  x=newTrack->GetVector();  
503   TVector savex=x;
504   x*=H; x-=m;
505   x*=-1; x*=K; x+=savex;  
506   TMatrix saveC=C;
507   C.Mult(K,tmp); C-=saveC; C*=-1;  
508   newTrack->GetVector()=x;
509   newTrack->GetCMatrix()=C;     
510   TVector res= newTrack->GetVector(); 
511   //cout<<" res = "<<res(0)<<" "<<res(1)<<" "<<res(2)<<" "<<res(3)<<" "<<res(4)<<"\n"; 
512   res*=H; res-=m;   res*=-1.;  
513   TMatrix Cn=newTrack->GetCMatrix();
514   TMatrix tmpn(H,TMatrix::kMult,Cn);
515   TMatrix Rn(tmpn,TMatrix::kMult,Ht);   Rn-=V; Rn*=-1.;
516   
517   Rn.Invert();   
518   TVector r=res;    res*=Rn;
519   Double_t chi2= r*res; 
520          
521   newTrack->SetChi2(newTrack->GetChi2()+chi2);
522    
523
524