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