]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Source file of the ITS Kalman tracking
authorbarbera <barbera@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 27 Nov 2000 13:14:29 +0000 (13:14 +0000)
committerbarbera <barbera@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 27 Nov 2000 13:14:29 +0000 (13:14 +0000)
ITS/AliITSiotrack.cxx [new file with mode: 0644]
ITS/AliITSiotrack.h [new file with mode: 0644]
ITS/AliITStrack.cxx [new file with mode: 0644]
ITS/AliITStrack.cxx.bck [new file with mode: 0644]
ITS/AliITStrack.h [new file with mode: 0644]
ITS/AliITStracking.cxx [new file with mode: 0644]
ITS/AliITStracking.h [new file with mode: 0644]

diff --git a/ITS/AliITSiotrack.cxx b/ITS/AliITSiotrack.cxx
new file mode 100644 (file)
index 0000000..1b7a799
--- /dev/null
@@ -0,0 +1,94 @@
+////////////////////////////////////////////////
+//  Reconstructed point class for set:ITS     //
+////////////////////////////////////////////////
+
+#include <TMatrix.h>
+
+#include "AliITSiotrack.h"
+
+ClassImp(AliITSiotrack)
+
+AliITSiotrack::AliITSiotrack() {
+
+  // default creator
+  fLab=-3; 
+  fX=fZ=fY=0.; 
+  fPx=fPy=fPz=0.;
+  for (Int_t i=0;i<6;i++) {fIdModules[i]=fIdPoints[i]=-1; fIdPoints[i]=-1;}
+  fStateVPhi=0.; fStateVZ=0.; fStateVD=0.; fStateVTgl=0.; fStateVC=0.;
+  fRadius=0.; fCharge=0; 
+  fC00=fC10=fC11=fC20=fC21=fC22=fC30=fC31=fC32=fC33=fC40=fC41=fC42=fC43=fC44=0.;
+      
+}
+   
+
+void AliITSiotrack::SetCovMatrix(TMatrix *cov) {
+
+  fC00=(*cov)(0,0);
+  fC10=(*cov)(1,0);
+  fC11=(*cov)(1,1);
+  fC20=(*cov)(2,0);
+  fC21=(*cov)(2,1);
+  fC22=(*cov)(2,2);
+  fC30=(*cov)(3,0);
+  fC31=(*cov)(3,1);
+  fC32=(*cov)(3,2);
+  fC33=(*cov)(3,3);
+  fC40=(*cov)(4,0);
+  fC41=(*cov)(4,1);
+  fC42=(*cov)(4,2);
+  fC43=(*cov)(4,3);
+  fC44=(*cov)(4,4);
+
+}
+
+
+Double_t * AliITSiotrack::GetCovMatrix() {
+
+  Double_t covar[25];
+
+  covar[0]=fC00;
+  covar[1]=fC10;
+  covar[2]=fC20;
+  covar[3]=fC30;
+  covar[4]=fC40;
+  covar[5]=fC10;
+  covar[6]=fC11;
+  covar[7]=fC21;
+  covar[8]=fC31;
+  covar[9]=fC41;
+  covar[10]=fC20;
+  covar[11]=fC21;
+  covar[12]=fC22;
+  covar[13]=fC32;
+  covar[14]=fC42;
+  covar[15]=fC30;
+  covar[16]=fC31;
+  covar[17]=fC32;
+  covar[18]=fC33;
+  covar[19]=fC43;
+  covar[20]=fC40;
+  covar[21]=fC41;
+  covar[22]=fC42;
+  covar[23]=fC43;
+  covar[24]=fC44;
+  
+  return covar;
+  
+}
+/*
+Double_t * AliITSiotrack::GetStateVector() {
+  
+  Double_t statev[5];
+  
+  statev[0]=fStateVPhi;
+  statev[1]=fStateVZ;
+  statev[2]=fStateVD;
+  statev[3]=fStateVTgl;
+  statev[4]=fStateVC;
+  
+  return statev;
+
+} */
+
+
diff --git a/ITS/AliITSiotrack.h b/ITS/AliITSiotrack.h
new file mode 100644 (file)
index 0000000..d868a31
--- /dev/null
@@ -0,0 +1,92 @@
+#ifndef ALIITSIOTRACK_H
+#define ALIITSIOTRACK_H 
+
+////////////////////////////////////////////////////
+//  Reconstructed space point class for set:ITS   //
+////////////////////////////////////////////////////
+
+#include <TObject.h>
+
+class AliITSiotrack : public TObject {
+
+
+ public:
+
+  AliITSiotrack();                        // constructor
+  virtual ~AliITSiotrack() {};            // distructor
+  Int_t   GetLabel() const {return fLab;} // get track label
+  Int_t   GetIdPoint(Int_t i) const {return fIdPoints[i];}   // get the identification number for the point
+  Int_t   GetIdModule(Int_t i) const {return fIdModules[i];} // get the module number for the point
+  //Double_t * GetStateVector();            // get the state vector (5 elements)
+  Double_t * GetCovMatrix();              // get the covariance matrix as 15 elements array
+  Double_t GetStatePhi() const {return fStateVPhi;}  // gets the Phi angle of the state vector
+  Double_t GetStateZ() const {return fStateVZ;}      // gets the Z cohordinate of the state vector
+  Double_t GetStateD() const {return fStateVD;}      // gets the radial impact parameter of the state vector
+  Double_t GetStateC() const {return fStateVC;}      // gets the curvature C of the state vector
+  Double_t GetStateTgl() const {return fStateVTgl;}  // gets the dip angle tangent of the state vector
+  Double_t GetRadius() const {return fRadius;}       // gets the radius corresponding to the state vector
+  Int_t     GetCharge() const {return fCharge;}      // gets the particle charge
+  Float_t GetX() const {return fX;}     // gets the x cohordinate of the found vertex
+  Float_t GetZ() const {return fZ;}     // gets the z cohordinate of the found vertex
+  Float_t GetY() const {return fY;}     // gets the y cohordinate of the found vertex
+  Float_t GetPx() const {return fPx;}   // gets the x momentum component at the found vertex 
+  Float_t GetPy() const {return fPy;}   // gets the y momentum component at the found vertex 
+  Float_t GetPz()const {return fPz;}    // gets the z momentum component at the found vertex 
+  void SetCovMatrix(TMatrix *cov);      // sets the covariance matrix
+  void SetLabel(Int_t lab) {fLab=lab;}  // sets the track label
+  void SetIdPoint(Int_t i,Int_t pnt) {fIdPoints[i]=pnt;}   // set the identification number for the point
+  void SetIdModule(Int_t i,Int_t mod) {fIdModules[i]=mod;} // set the module number for the point
+   
+  void SetStatePhi(Double_t phi) {fStateVPhi=phi;}   // sets the Phi angle of the state vector 
+  void SetStateZ(Double_t z) {fStateVZ=z;}           // sets the Z cohordinate of the state vector
+  void SetStateD(Double_t d) {fStateVD=d;}           // sets the radial impact parameter of the state vector 
+  void SetStateTgl(Double_t tgl) {fStateVTgl=tgl;}   // sets the dip angle tangent of the state vector
+  void SetStateC(Double_t c) {fStateVC=c;}           // sets the curvature C of the state vector
+  void SetRadius(Double_t r) {fRadius= r;}           // sets the radius corresponding to the state vector
+  void SetCharge(Int_t charge) {fCharge=charge;}     // sets the particle charge
+
+  void SetX(Float_t x){fX=x;}        // sets the x cohordinate of the found vertex
+  void SetZ(Float_t z){fZ=z;}        // sets the z cohordinate of the found vertex
+  void SetY(Float_t y){fY=y;}        // sets the y cohordinate of the found vertex
+  void SetPx(Float_t px) {fPx=px;}   // sets the x momentum component at the found vertex 
+  void SetPy(Float_t py) {fPy=py;}   // sets the y momentum component at the found vertex
+  void SetPz(Float_t pz) {fPz=pz;}   // sets the z momentum component at the found vertex
+
+ private:
+    
+  Int_t     fLab;       // label of reconstructed track
+  Float_t   fX ;        // x cohordinate of the found vertex
+  Float_t   fY ;        // y cohordinate of the found vertex
+  Float_t   fZ ;        // z cohordinate of the found vertex
+  Float_t   fPx;        // x component of track momentum at the found vertex
+  Float_t   fPy;        // y component of track momentum at the found vertex
+  Float_t   fPz;        // z component of track momentum at the found vertex
+   
+  //
+  Int_t     fIdPoints[6];   // points assigned to the track (entry # in fRecPoints is given by module #)
+  Int_t     fIdModules[6];  // module # corresponding to each point belonging to the track
+
+  Double_t  fStateVPhi;          // 
+  Double_t  fStateVZ;            //  state vector components
+  Double_t  fStateVD;            //
+  Double_t  fStateVTgl;          //
+  Double_t  fStateVC;            //
+        
+  Double_t  fRadius;             //  distance of the point from the origin
+  Int_t     fCharge;             //  particle charge  
+
+//  Covariance matrix   
+  Double_t  fC00;
+  Double_t  fC10, fC11;
+  Double_t  fC20, fC21, fC22;
+  Double_t  fC30, fC31, fC32, fC33;
+  Double_t  fC40, fC41, fC42, fC43, fC44;
+        
+  ClassDef(AliITSiotrack,1)  // AliITSiotrack class
+};
+
+#endif
+
+
+
diff --git a/ITS/AliITStrack.cxx b/ITS/AliITStrack.cxx
new file mode 100644 (file)
index 0000000..5c9702d
--- /dev/null
@@ -0,0 +1,626 @@
+#include <iostream.h>
+#include <TMath.h>
+#include <TVector.h>
+#include <TMatrix.h>
+#include <TObjArray.h>
+
+#include "AliITS.h"
+#include "AliRun.h"
+#include "AliITStrack.h"
+
+
+ClassImp(AliITStrack)
+
+AliITStrack::AliITStrack() {
+//Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it 
+// default constructor   
+  fvTrack.ResizeTo(5);
+  fmCovariance = new TMatrix(5,5);
+  flistCluster = new TObjArray; 
+  fNumClustInTrack =0;
+  fChi2=-1;
+  flabel =0; 
+  fVertex.ResizeTo(3); 
+  fErrorVertex.ResizeTo(3);
+  fLayer = -1; 
+  ClusterInTrack = new TMatrix(6,9);
+  for(Int_t i=0; i<6; i++) (*ClusterInTrack)(i,6)=(*ClusterInTrack)(i,7)=
+                           (*ClusterInTrack)(i,8)=-1.;
+  rtrack=0.; 
+  //alphaprov=-50.; //provvisorio 
+  d2.ResizeTo(6);
+  tgl2.ResizeTo(6); 
+  dtgl.ResizeTo(6);   
+}
+
+
+AliITStrack::AliITStrack(const AliITStrack &cobj) {
+//Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it    
+
+  fvTrack.ResizeTo(5); 
+  fmCovariance = new TMatrix(5,5);
+  ClusterInTrack = new TMatrix(6,9);
+  for(Int_t i=0; i<6; i++) (*ClusterInTrack)(i,6)=(*ClusterInTrack)(i,7)=
+                           (*ClusterInTrack)(i,8)=-1.;
+  flistCluster = new TObjArray; 
+  fVertex.ResizeTo(3); 
+  fErrorVertex.ResizeTo(3);
+  fVertex = cobj.fVertex;
+  fErrorVertex = cobj.fErrorVertex;
+  flabel = cobj.flabel;
+  fLayer=cobj.fLayer;
+  fTPCtrack = cobj.fTPCtrack;
+  fNumClustInTrack = cobj.fNumClustInTrack; 
+  fChi2= cobj.fChi2;
+  fvTrack = cobj.fvTrack;
+  rtrack=cobj.rtrack;
+  Dv=cobj.Dv;
+  Zv=cobj.Zv;
+  sigmaDv=cobj.sigmaDv;
+  sigmaZv=cobj.sigmaZv;
+  d2.ResizeTo(6);
+  tgl2.ResizeTo(6); 
+  dtgl.ResizeTo(6); 
+  d2=cobj.d2;
+  tgl2=cobj.tgl2;
+  dtgl=cobj.dtgl;
+  //alphaprov=cobj.alphaprov;  //provvisorio    
+  *fmCovariance = *cobj.fmCovariance;
+  *ClusterInTrack = *cobj.ClusterInTrack;
+  for(Int_t i=0; i<cobj.flistCluster->GetSize(); i++) 
+    flistCluster->AddLast(cobj.flistCluster->At(i));
+}
+
+AliITStrack::AliITStrack(AliTPCtrack &obj)
+{ 
+//Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it 
+
+  fTPCtrack = &obj;
+  fvTrack.ResizeTo(5); 
+  fVertex.ResizeTo(3); 
+  fErrorVertex.ResizeTo(3);
+
+  d2.ResizeTo(6);
+  tgl2.ResizeTo(6); 
+  dtgl.ResizeTo(6); 
+  AliGenerator *gener = gAlice->Generator();
+  Float_t Vxg,Vyg,Vzg;
+  gener->GetOrigin(Vxg,Vyg,Vzg);
+  
+  fVertex(0)=(Double_t)Vxg;
+  fVertex(1)=(Double_t)Vyg; 
+  fVertex(2)=(Double_t)Vzg;    
+  
+  fLayer = 7;
+  fmCovariance = new TMatrix(5,5);
+  ClusterInTrack = new TMatrix(6,9);
+  for(Int_t i=0; i<6; i++) (*ClusterInTrack)(i,6)=(*ClusterInTrack)(i,7)=
+                           (*ClusterInTrack)(i,8)=-1.;
+  flistCluster = new TObjArray; 
+  fNumClustInTrack = 0; 
+  LmTPC(); 
+
+}
+
+AliITStrack::~AliITStrack() { 
+
+  //destructor
+
+  if(fmCovariance) delete fmCovariance; 
+  if(flistCluster) delete flistCluster; 
+  if(ClusterInTrack) delete ClusterInTrack;
+
+}     
+
+
+
+void AliITStrack::LmTPC() {
+
+// Transform the TPC state vector from TPC-local to master and build a new state vector ITS-type
+// The covariance matrix is also modified accordingly
+//Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it      
+
+  
+  TVector tpctrack(5); 
+  Double_t Alpha = fTPCtrack->GetAlpha(); 
+  //printf("LmTPC: Alpha %f\n",Alpha); 
+
+  tpctrack(0) = fTPCtrack->GetY();
+  tpctrack(1) = fTPCtrack->GetZ();
+  tpctrack(2) = fTPCtrack->GetC();
+  tpctrack(3) = fTPCtrack->GetEta();
+  tpctrack(4) = fTPCtrack->GetTgl();
+  //cout<< " tpctracks = "<<tpctrack(0)<<" "<<tpctrack(1)<<" "<<tpctrack(2)<<" "<<tpctrack(3)<<" "<<tpctrack(4)<<
+  //"\n ";
+
+  Double_t xm, ym, zm;
+  Double_t sina = TMath::Sin(Alpha);
+  Double_t cosa = TMath::Cos(Alpha);
+  Double_t xl= fTPCtrack->GetX();
+  xm = xl * cosa - tpctrack(0)*sina;
+  ym = xl * sina + tpctrack(0)*cosa;
+  zm = tpctrack(1);  
+  //cout<<" xl e alpha = "<<xl<<" "<<Alpha<<"\n"; getchar(); 
+
+  Double_t x0m,y0m;
+
+  ///////////////////////////////////// determine yo //////////////////////////////////////////////////
+  Double_t Vxl=fVertex(0)*cosa+fVertex(1)*sina;
+  Double_t Vyl= -fVertex(0)*sina+fVertex(1)*cosa;
+  Double_t Xo,Yo, signy;
+  Double_t R = 1./tpctrack(2);
+  Xo =  tpctrack(3) / tpctrack(2);
+  xoTPC=Xo;
+  Double_t Yo1, Yo2, diffsq1, diffsq2;  
+  Yo1 = tpctrack(0) +  TMath::Sqrt(R*R - (xl-Xo)*(xl-Xo)); 
+  Yo2 = tpctrack(0) -  TMath::Sqrt(R*R - (xl-Xo)*(xl-Xo));   
+  diffsq1=TMath::Abs((Yo1-Vyl)*(Yo1-Vyl)+(Xo-Vxl)*(Xo-Vxl)-R*R);
+  diffsq2=TMath::Abs((Yo2-Vyl)*(Yo2- Vyl)+(Xo-Vxl)*(Xo-Vxl)-R*R);
+  if(diffsq1<diffsq2) {Yo=Yo1; signy=1.;} else {Yo=Yo2; signy=-1.;};
+  ////////////////////////////////////////////////////////////////////////////////////////////////////
+
+  x0m = Xo * cosa - Yo * sina;
+  y0m = Xo * sina + Yo * cosa;  
+
+  rtrack=TMath::Sqrt(xm*xm+ym*ym);
+  Double_t pigre=TMath::Pi();
+  Double_t phi;
+  if(ym == 0. || xm == 0.) {
+    if(ym == 0. && xm == 0.) {cout << "  Error in AliITStrack::LmTPC x=0 and y=0 \n"; getchar();}
+    if(ym ==0. && xm>0.) phi=0.;
+    if(ym==0. && xm<0.) phi=pigre;
+    if(xm==0 && ym>0.) phi=pigre/2.;
+    if(xm==0 && ym<0.) phi=1.5*pigre;   
+  }
+  else {
+    if (xm>0. && ym>0.) phi=TMath::ATan(ym/xm);
+    if (xm<0. && ym>0.) phi=pigre+TMath::ATan(ym/xm);
+    if (xm<0. && ym<0.) phi=pigre+TMath::ATan(ym/xm); 
+    if (xm>0. && ym<0.) phi=(2*pigre)+TMath::ATan(ym/xm);     
+  };
+  if(phi<0. || phi>(2*pigre)) {cout<<"attention error on phi in  AliITStrack:LmTPC \n"; getchar();}  
+
+  fvTrack(0)= phi;
+  fvTrack(1)=zm;
+  fvTrack(3)=tpctrack(4);
+  fvTrack(4)=tpctrack(2);
+  /*
+  //provvisorio
+   alphaprov=pigre-PhiDef(x0m,y0m)-PhiDef(fVertex(0),fVertex(1));
+  if(alphaprov<0.) alphaprov=alphaprov+2.*pigre;
+  //cout<<" PhiDef(x0m,y0m) ="<<PhiDef(x0m,y0m)<<"\n";
+  //cout<<" PhiDef(fVertex(0),fVertex(1)) = "<<PhiDef(fVertex(0),fVertex(1))<<"\n";
+  //cout<<"alphaprov = "<<alphaprov<<"\n"; getchar();
+  //cout<<" fvTrack(0) prima = "<<fvTrack(0)<<"\n";
+  fvTrack(0)-=alphaprov;
+  if(fvTrack(0)<0.) fvTrack(0)+= 2.*pigre;
+  //cout<<" fvTrack(0) dopo = "<<fvTrack(0)<<"  alphaprov = "<<alphaprov<<"\n"; 
+  cout<<" fvertex = "<<fVertex(0)<<" "<<fVertex(1)<<" "<<fVertex(2)<<"\n";   
+  fVertex(0)=0.;
+  fVertex(1)=0.;
+/////////////////////////////////////////////////////////////////////////////////////////////////// 
+*/ 
+  
+  Double_t dd=TMath::Sqrt((x0m-fVertex(0))*(x0m-fVertex(0))+(y0m-fVertex(1))*(y0m-fVertex(1)));
+  Double_t signdd;
+  if (R>0) signdd=1.; else signdd=-1.;
+  fvTrack(2)=signdd*dd-R;
+  //cout<<" fvertex = "<<fVertex(0)<<" "<<fVertex(1)<<" "<<fVertex(2)<<"\n";
+  //cout<<" fvTrack(2) ="<<fvTrack(2)<<"\n"; getchar();
+  
+  TMatrix localM(5,5);    
+  Double_t cov[15];
+  fTPCtrack->GetCovariance(cov);
+  localM(0,0)=cov[0];
+  localM(1,1)=cov[2];
+  localM(2,2)=cov[5];
+  localM(3,3)=cov[9];
+  localM(4,4)=cov[14];
+  localM(1,0)=localM(0,1)=cov[1];
+  localM(2,0)=localM(0,2)=cov[3];
+  localM(2,1)=localM(1,2)=cov[4];
+  localM(3,0)=localM(0,3)=cov[6];
+  localM(3,1)=localM(1,3)=cov[7];
+  localM(3,2)=localM(2,3)=cov[8];
+  localM(4,0)=localM(0,4)=cov[10];
+  localM(4,1)=localM(1,4)=cov[11];
+  localM(4,2)=localM(2,4)=cov[12];
+  localM(4,3)=localM(3,4)=cov[13];
+
+  TMatrix F(5,5);
+  
+  Double_t  dfidy, dDdy, dDdC, dDdeta;
+
+  dfidy=(xm*cosa+ym*sina)/(rtrack*rtrack);
+  dDdy=signdd*((y0m-fVertex(1))*cosa-(x0m-fVertex(0))*sina)/dd;
+  Double_t dyodr=signy*(R+(xl-Xo)*tpctrack(3))/TMath::Sqrt(R*R-(xl-Xo)*(xl-Xo));
+  Double_t dyomdr=sina*tpctrack(3)+cosa*dyodr;
+  Double_t dxomdr=cosa*tpctrack(3)-sina*dyodr;
+  Double_t ddddR=((x0m-fVertex(0))*dxomdr+(y0m-fVertex(1))*dyomdr)/dd;
+  dDdC=-R*R*(signdd*ddddR-1.);
+  Double_t dyoldxol=signy*(xl-Xo)/TMath::Sqrt(R*R-(xl-Xo)*(xl-Xo));
+  Double_t dxomdeta=R*(cosa-sina*dyoldxol);
+  Double_t dyomdeta=R*(sina+cosa*dyoldxol);
+  dDdeta=signdd*((x0m-fVertex(0))*dxomdeta+(y0m-fVertex(1))*dyomdeta)/dd;
+  F(0,0)=dfidy;
+  F(0,1)=F(0,2)=F(0,3)=F(0,4)=0.;
+  F(1,1)=1.;
+  F(1,0)=F(1,2)=F(1,3)=F(1,4)=0.;
+  F(2,0)=dDdy;    
+  F(2,2)=dDdC;    
+  F(2,3)=dDdeta;  
+  F(2,1)=F(2,4)=0.;
+  F(3,0)=F(3,1)=F(3,2)=F(3,3)=0.;
+  F(3,4)=1.;
+  F(4,0)=F(4,1)=F(4,3)=F(4,4)=0.;
+  F(4,2)=1.;
+// cout<<" Matrice F \n";  
+// F.Print(); getchar();
+  TMatrix Ft(TMatrix::kTransposed,F);
+  TMatrix temp(localM);
+  temp*=Ft;
+  TMatrix B(F);
+  B*=temp;                            // B=F*localM*Ft 
+// cout<<" Matrice C\n";  
+// B.Print(); getchar();
+  *fmCovariance = B;   
+}
+
+
+AliITStrack &AliITStrack::operator=(AliITStrack obj) {
+//Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it  
+
+  delete fmCovariance;
+  delete flistCluster;
+  delete ClusterInTrack;
+  fmCovariance = new TMatrix(5,5);
+  ClusterInTrack = new TMatrix(6,9);
+  flistCluster = new TObjArray; 
+  flabel = obj.flabel;
+  fTPCtrack = obj.fTPCtrack;
+  fvTrack.ResizeTo(5); 
+  fNumClustInTrack = obj.fNumClustInTrack; 
+  fChi2= obj.fChi2;
+  fVertex=obj.fVertex;
+  fErrorVertex=obj.fErrorVertex;
+  fvTrack = obj.fvTrack; 
+  fLayer=obj.fLayer;
+  rtrack=obj.rtrack;
+  Dv=obj.Dv;
+  Zv=obj.Zv;
+  sigmaDv=obj.sigmaDv;
+  sigmaZv=obj.sigmaZv;
+  d2=obj.d2;
+  tgl2=obj.tgl2; 
+  dtgl=obj.dtgl; 
+  //alphaprov=obj.alphaprov; //proviisorio   
+    
+  *fmCovariance = *obj.fmCovariance;
+  *ClusterInTrack = *obj.ClusterInTrack;
+  for(Int_t i=0; i<obj.flistCluster->GetSize(); i++) flistCluster->AddLast(obj.flistCluster->At(i));
+
+  return *this;
+  
+}
+
+void AliITStrack::PutCluster(Int_t layerc, TVector vecclust) {
+//Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it  
+  
+  (*ClusterInTrack)(layerc,0) = vecclust(0);
+  (*ClusterInTrack)(layerc,1) = vecclust(1);
+  (*ClusterInTrack)(layerc,2) = vecclust(2);
+  (*ClusterInTrack)(layerc,3) = vecclust(3);
+  (*ClusterInTrack)(layerc,4) = vecclust(4);  
+  (*ClusterInTrack)(layerc,5) = vecclust(5);
+  (*ClusterInTrack)(layerc,6) = vecclust(6);
+  (*ClusterInTrack)(layerc,7) = vecclust(7);
+  (*ClusterInTrack)(layerc,8) = vecclust(8);
+
+}
+
+
+void AliITStrack::GetClusters() {
+
+  TMatrix A(*ClusterInTrack);
+  TMatrix B(6,3);
+  for(Int_t i=0;i<6; i++){
+   B(i,0)=A(i,6); B(i,1)=A(i,7); B(i,2)=A(i,8); 
+  }
+  A.Print();
+ // B.Print(); 
+}
+
+
+TVector AliITStrack::GetLabTrack(Int_t lay) {
+  TVector VecLabel(3);
+  VecLabel(0)=( (Float_t) (*ClusterInTrack)(lay,6) );
+  VecLabel(1)=( (Float_t) (*ClusterInTrack)(lay,7) );
+  VecLabel(2)=( (Float_t) (*ClusterInTrack)(lay,8) );
+  return VecLabel;
+}
+
+void AliITStrack::Search(TVector VecTotLabref, Long_t &labref, Int_t &freq){
+//Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it  
+// define label
+
+  Int_t vecfreq[18];
+
+  for(Int_t i=0; i<18; i++) vecfreq[i]=0;
+  
+  for(Int_t i=0; i<18; i++) {
+    for(Int_t j=0; j<18; j++) {
+      if(VecTotLabref(i) == 0.) VecTotLabref(i)=-3.;  
+      if( (VecTotLabref(i)>=0.) && (VecTotLabref(i)==VecTotLabref(j)) ) vecfreq[i]++;    
+    }  
+  }
+  Int_t imax=-1000;
+  Long_t  labdefault= (Long_t)1000000.;
+  freq=0;
+  for(Int_t i=0; i<18; i++) {
+    if(vecfreq[i]>freq) {freq=vecfreq[i]; imax=i;}  
+  }
+  if(imax<0) labref=labdefault; else labref=(Long_t) VecTotLabref(imax);
+} 
+
+
+void AliITStrack::Propagation(Double_t rk) {
+//Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it  
+//Propagation of track 
+  Double_t duepi=2.*TMath::Pi();
+  Double_t rkm1=rtrack;
+//cout<<" rk e rkm1 dentro Propagation   "<<rk<<" "<<rkm1<<"\n";
+  
+  //
+  Double_t Ak=argA(rk), Akm1=argA(rkm1);
+  Double_t ak=arga(rk), akm1=arga(rkm1);
+  fvTrack(0)+=TMath::ASin(Ak)-TMath::ASin(Akm1);
+  if(fvTrack(0)>duepi) fvTrack(0)-=duepi;
+  if(fvTrack(0)<0.) fvTrack(0)+=duepi;
+       
+  Double_t tgl=fvTrack(3);
+  Double_t C=fvTrack(4);
+  Double_t D=fvTrack(2);
+  Double_t Cy=C/2;
+  fvTrack(1)+=tgl/Cy*(TMath::ASin(ak)-TMath::ASin(akm1));
+  rtrack=rk;
+//cout<<"fvTrack(0) fvTrack(1) e rtrack dentro Propagation = "<<fvTrack(0)<<" "<<fvTrack(1)<<" "<<rtrack<<"\n";
+//getchar();
+       
+  Double_t Bk=argB(rk), Bkm1=argB(rkm1);       
+  Double_t Ck=argC(rk), Ckm1=argC(rkm1);
+  TMatrix F(5,5);
+  F(0,2)=Ck/TMath::Sqrt(1.-Ak*Ak) - Ckm1/TMath::Sqrt(1.-Akm1*Akm1);
+  F(0,4)=Bk/TMath::Sqrt(1.-Ak*Ak) - Bkm1/TMath::Sqrt(1.-Akm1*Akm1);    
+  F(1,2)=tgl*D*(1./rk - 1./rkm1);
+  F(1,3) = rk - rkm1;
+  F(0,0)=F(1,1)=F(2,2)=F(3,3)=F(4,4)=1.;       
+       
+  TMatrix Ft(TMatrix::kTransposed,F);
+  TMatrix temp(*fmCovariance);
+//cout<<" C Matrix prima propagation =\n";
+//temp.Print(); getchar();         
+  temp*=Ft;
+  TMatrix B(F);
+  B*=temp;
+//cout<<" C Matrix dopo propagation =\n";                            // B=F*C*Ft 
+//B.Print(); getchar();
+  *fmCovariance = B;    
+       
+}
+void AliITStrack::AddEL(Double_t signdE, Bool_t flagtot, Double_t mass=0.1396) {
+//Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it  
+//  add energy loss
+
+  TVector s(6);  
+  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;
+//0.00277 is added in the first layer to take into account the energy loss in the beam pipe 
+    
+  Double_t cl=1.+fvTrack(3)*fvTrack(3);  // cl=1/(cosl)**2 = 1 + (tgl)**2 
+  Double_t sqcl=TMath::Sqrt(cl);
+  Double_t pt=GetPt();
+     
+  Double_t p2=pt*pt*cl;
+  Double_t E=TMath::Sqrt(p2+mass*mass);
+  Double_t beta2=p2/(p2+mass*mass);
+  
+  Double_t dE;
+  if(flagtot) {
+    Double_t stot=s(0)+s(1)+s(2)+s(3)+s(4)+s(5);
+    dE=0.153/beta2*(log(5940*beta2/(1-beta2)) - beta2)*stot*21.82*sqcl;
+  } else {
+    dE=0.153/beta2*(log(5940*beta2/(1-beta2)) - beta2)*s(fLayer-1)*21.82*sqcl;
+  }   
+  dE=signdE*dE/1000.; 
+         
+  E+=dE;
+  Double_t p=TMath::Sqrt(E*E-mass*mass);   
+  Double_t sign=1.;
+  if((fvTrack)(4) < 0.) sign=-1.; 
+  pt=sign*p/sqcl;  
+  Double_t CC=(0.3*0.2)/(pt*100.);
+  fvTrack(4)=CC; 
+               
+}
+
+void  AliITStrack::Correct(Double_t rk) {
+//Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it  
+// correct track to take into account real geometry detector
+
+  Double_t duepi=2.*TMath::Pi();
+  Double_t rkm1=rtrack;
+  Double_t Ak=argA(rk), Akm1=argA(rkm1);
+  Double_t ak=arga(rk), akm1=arga(rkm1);
+
+  fvTrack(0)+=TMath::ASin(Ak)-TMath::ASin(Akm1);
+  if(fvTrack(0)>duepi) fvTrack(0)-=duepi;
+  if(fvTrack(0)<0.) fvTrack(0)+=duepi;
+       
+  Double_t tgl=fvTrack(3);
+  Double_t C=fvTrack(4);
+  Double_t Cy=C/2;
+  fvTrack(1)+=tgl/Cy*(TMath::ASin(ak)-TMath::ASin(akm1));
+  rtrack=rk;
+               
+}
+
+void AliITStrack::AddMS() {
+       
+//////////   Modification of the covariance matrix to take into account multiple scattering  ///////////
+//Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it     
+   
+  TVector s(6);
+
+  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;
+//0.00277 is added in the first layer to take into account the energy loss in the beam pipe     
+  Double_t mass=0.1396;
+  Int_t layer=(Int_t)GetLayer();
+  
+  Double_t tgl=fvTrack(3);
+  Double_t cosl=TMath::Cos(TMath::ATan(tgl));  
+  Double_t D=fvTrack(2);
+  Double_t C=fvTrack(4);
+  Double_t Cy=C/2.;
+  Double_t Q20=1./(cosl*cosl);  
+  Double_t Q30=C*tgl;
+   
+  Double_t Q40=Cy*(rtrack*rtrack-D*D)/(1.+ 2.*Cy*D);
+  Double_t dd=D+Cy*D*D-Cy*rtrack*rtrack;
+  Double_t Q41=-1./cosl*TMath::Sqrt(rtrack*rtrack - dd*dd)/(1.+ 2.*Cy*D);
+  
+  /*
+  Double_t xk=rtrack*TMath::Cos(fvTrack(0));
+  Double_t yk=rtrack*TMath::Sin(fvTrack(0));  
+  Double_t rvertex=TMath::Sqrt((xk-fVertex(0))*(xk-fVertex(0)) + (yk-fVertex(1))*(yk-fVertex(1)));
+  Double_t Q40=Cy*(rvertex*rvertex-D*D)/(1.+ 2.*Cy*D);
+  Double_t dd=D+Cy*D*D-Cy*rvertex*rvertex;
+  Double_t Q41=-1./cosl*TMath::Sqrt(rvertex*rvertex - dd*dd)/(1.+ 2.*Cy*D); 
+  */
+   
+  TMatrix J(5,2);      
+  J(0,0)=0.; J(0,1)=0.;
+  J(1,0)=0.; J(1,1)=0.;
+  J(2,0)=Q40;    
+  J(2,1)=Q41;          
+  J(3,0)=Q20;  J(3,1)=0.;
+  J(4,0)=Q30;   J(4,1)=0.;
+                       
+  Double_t p2=(GetPt()*GetPt())/(cosl*cosl);
+  Double_t beta2=p2/(p2+mass*mass);
+  Double_t theta2=14.1*14.1/(beta2*p2*1.e6)*(s(layer-1)/cosl); 
+       
+  TMatrix Jt(TMatrix::kTransposed,J);  
+  TMatrix Q(J,TMatrix::kMult,Jt);
+  Q*=theta2;   
+                   
+  (*fmCovariance)+=Q;
+  
+}
+
+void AliITStrack::PrimaryTrack() {
+//Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it  
+// calculation of part of covariance matrix for vertex  constraint
+
+  Double_t Rlayer[6];
+       
+  Rlayer[0]=4.; Rlayer[1]=7.;  Rlayer[2]=14.9;  Rlayer[3]=23.8;  
+  Rlayer[4]=39.1;  Rlayer[5]=43.6;
+       
+  Double_t Cy=fvTrack(4)/2.;   
+  Double_t tgl=(fvTrack(1)-Zv)*Cy/TMath::ASin(Cy*rtrack);
+  Double_t rtrack=1.;  
+  fvTrack(0)=0.;
+  fvTrack(1)=rtrack*tgl; 
+  fvTrack(2)=Dv;
+  fvTrack(3)=tgl; 
+       
+  TMatrix  newC(5,5);
+  newC(4,4)=(*fmCovariance)(4,4);
+  (*fmCovariance)=newC;
+  AddEL(1.,1);
+  fLayer=0;
+  for (Int_t i=0; i<6; i++) {
+    Propagation(Rlayer[i]);
+    fLayer++;
+    d2(i)=(*fmCovariance)(2,2);
+    tgl2(i)=(*fmCovariance)(3,3);
+    dtgl(i)=(*fmCovariance)(2,3); 
+    AddMS();    
+    AddEL(-1,0);          
+  }            
+}      
+  
+Int_t AliITStrack::DoNotCross(Double_t rk) const{
+  Double_t C=fvTrack(4);
+  Double_t D=fvTrack(2);
+  Double_t Cy=C/2.;
+  return (TMath::Abs((Cy*rk+(1.+Cy*D)*D/rk)/(1.+2.*Cy*D))>=1.)?1:0;
+}
+  
+
+Double_t AliITStrack::argA(Double_t rk) const {
+  Double_t C=fvTrack(4);
+  Double_t D=fvTrack(2);
+  Double_t Cy=C/2.;
+  Double_t arg=(Cy*rk + (1 + Cy*D)*D/rk)/(1.+ 2.*Cy*D);                
+  if (TMath::Abs(arg) < 1.) return arg;
+  //cout<<"class AliITSTrack: argA out of range !\n";/* getchar();*/
+  return (arg>0) ? 1. : -1.;
+}
+   
+Double_t AliITStrack::arga(Double_t rk) const {
+  Double_t C=fvTrack(4);
+  Double_t D=fvTrack(2);
+  Double_t Cy=C/2.;
+  Double_t arg=(rk*rk - D*D)/(1.+ 2.*Cy*D);            
+  if (arg<0.) {/*cout<<"class AliITSTrack: arga out of range !\n";*/ arg=0.;} 
+  return Cy*TMath::Sqrt(arg);
+}
+       
+Double_t AliITStrack::argB(Double_t rk) const {
+  Double_t C=fvTrack(4);
+  Double_t D=fvTrack(2);
+  Double_t Cy=C/2.;       
+  return (rk*rk - D*D)/(rk*(1.+ 2.*Cy*D)*(1.+ 2.*Cy*D));
+}
+   
+Double_t AliITStrack::argC(Double_t rk) const {
+  Double_t C=fvTrack(4);
+  Double_t D=fvTrack(2);
+  Double_t Cy=C/2.;            
+  return  (1./rk - 2.*Cy*argA(rk)/(1.+ 2.*Cy*D));
+}
+/*
+Double_t AliITStrack::PhiDef(Double_t x, Double_t y){
+  Double_t pigre= TMath::Pi();
+  Double_t phi;
+  if(y == 0. || x == 0.) {
+    if(y == 0. && x == 0.) {
+      cout << "  Error in AliITStracking::PhiDef x=0 and y=0 \n"; getchar();
+    }
+    if(y==0. && x>0.) phi=0.;
+    if(y==0. && x<0.) phi=pigre;
+    if(x==0 && y>0.) phi=pigre/2.;
+    if(x==0 && y<0.) phi=1.5*pigre;   
+  }
+    else {
+      if (x>0. && y>0.) phi=TMath::ATan(y/x);
+      if (x<0. && y>0.) phi=pigre+TMath::ATan(y/x);
+      if (x<0. && y<0.) phi=pigre+TMath::ATan(y/x); 
+      if (x>0. && y<0.) phi=(2.*pigre)+TMath::ATan(y/x);     
+    }
+  if(phi<0. || phi>(2*pigre)) {
+    cout<<" Error on phi in  AliITStracking::PhiDef \n"; getchar();
+  }  
+  return phi;
+}
+*/
diff --git a/ITS/AliITStrack.cxx.bck b/ITS/AliITStrack.cxx.bck
new file mode 100644 (file)
index 0000000..1e2a955
--- /dev/null
@@ -0,0 +1,625 @@
+#include <TMath.h>
+#include <TVector.h>
+#include <TMatrix.h>
+#include <TObjArray.h>
+
+#include "AliITS.h"
+#include "AliRun.h"
+#include "AliITStrack.h"
+
+
+ClassImp(AliITStrack)
+
+AliITStrack::AliITStrack() {
+//Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it 
+// default constructor   
+  fvTrack.ResizeTo(5);
+  fmCovariance = new TMatrix(5,5);
+  flistCluster = new TObjArray; 
+  fNumClustInTrack =0;
+  fChi2=-1;
+  flabel =0; 
+  fVertex.ResizeTo(3); 
+  fErrorVertex.ResizeTo(3);
+  fLayer = -1; 
+  ClusterInTrack = new TMatrix(6,9);
+  for(Int_t i=0; i<6; i++) (*ClusterInTrack)(i,6)=(*ClusterInTrack)(i,7)=
+                           (*ClusterInTrack)(i,8)=-1.;
+  rtrack=0.; 
+  //alphaprov=-50.; //provvisorio 
+  d2.ResizeTo(6);
+  tgl2.ResizeTo(6); 
+  dtgl.ResizeTo(6);   
+}
+
+
+AliITStrack::AliITStrack(const AliITStrack &cobj) {
+//Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it    
+
+  fvTrack.ResizeTo(5); 
+  fmCovariance = new TMatrix(5,5);
+  ClusterInTrack = new TMatrix(6,9);
+  for(Int_t i=0; i<6; i++) (*ClusterInTrack)(i,6)=(*ClusterInTrack)(i,7)=
+                           (*ClusterInTrack)(i,8)=-1.;
+  flistCluster = new TObjArray; 
+  fVertex.ResizeTo(3); 
+  fErrorVertex.ResizeTo(3);
+  fVertex = cobj.fVertex;
+  fErrorVertex = cobj.fErrorVertex;
+  flabel = cobj.flabel;
+  fLayer=cobj.fLayer;
+  fTPCtrack = cobj.fTPCtrack;
+  fNumClustInTrack = cobj.fNumClustInTrack; 
+  fChi2= cobj.fChi2;
+  fvTrack = cobj.fvTrack;
+  rtrack=cobj.rtrack;
+  Dv=cobj.Dv;
+  Zv=cobj.Zv;
+  sigmaDv=cobj.sigmaDv;
+  sigmaZv=cobj.sigmaZv;
+  d2.ResizeTo(6);
+  tgl2.ResizeTo(6); 
+  dtgl.ResizeTo(6); 
+  d2=cobj.d2;
+  tgl2=cobj.tgl2;
+  dtgl=cobj.dtgl;
+  //alphaprov=cobj.alphaprov;  //provvisorio    
+  *fmCovariance = *cobj.fmCovariance;
+  *ClusterInTrack = *cobj.ClusterInTrack;
+  for(Int_t i=0; i<cobj.flistCluster->GetSize(); i++) 
+    flistCluster->AddLast(cobj.flistCluster->At(i));
+}
+
+AliITStrack::AliITStrack(AliTPCtrack &obj)
+{ 
+//Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it 
+
+  fTPCtrack = &obj;
+  fvTrack.ResizeTo(5); 
+  fVertex.ResizeTo(3); 
+  fErrorVertex.ResizeTo(3);
+
+  d2.ResizeTo(6);
+  tgl2.ResizeTo(6); 
+  dtgl.ResizeTo(6); 
+  AliGenerator *gener = gAlice->Generator();
+  Float_t Vxg,Vyg,Vzg;
+  gener->GetOrigin(Vxg,Vyg,Vzg);
+  
+  fVertex(0)=(Double_t)Vxg;
+  fVertex(1)=(Double_t)Vyg; 
+  fVertex(2)=(Double_t)Vzg;    
+  
+  fLayer = 7;
+  fmCovariance = new TMatrix(5,5);
+  ClusterInTrack = new TMatrix(6,9);
+  for(Int_t i=0; i<6; i++) (*ClusterInTrack)(i,6)=(*ClusterInTrack)(i,7)=
+                           (*ClusterInTrack)(i,8)=-1.;
+  flistCluster = new TObjArray; 
+  fNumClustInTrack = 0; 
+  LmTPC(); 
+
+}
+
+AliITStrack::~AliITStrack() { 
+
+  //destructor
+
+  if(fmCovariance) delete fmCovariance; 
+  if(flistCluster) delete flistCluster; 
+  if(ClusterInTrack) delete ClusterInTrack;
+
+}     
+
+
+
+void AliITStrack::LmTPC() {
+
+// Transform the TPC state vector from TPC-local to master and build a new state vector ITS-type
+// The covariance matrix is also modified accordingly
+//Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it      
+
+  
+  TVector tpctrack(5); 
+  Double_t Alpha = fTPCtrack->GetAlpha(); 
+  //printf("LmTPC: Alpha %f\n",Alpha); 
+
+  tpctrack(0) = fTPCtrack->GetY();
+  tpctrack(1) = fTPCtrack->GetZ();
+  tpctrack(2) = fTPCtrack->GetC();
+  tpctrack(3) = fTPCtrack->GetEta();
+  tpctrack(4) = fTPCtrack->GetTgl();
+  //cout<< " tpctracks = "<<tpctrack(0)<<" "<<tpctrack(1)<<" "<<tpctrack(2)<<" "<<tpctrack(3)<<" "<<tpctrack(4)<<
+  //"\n ";
+
+  Double_t xm, ym, zm;
+  Double_t sina = TMath::Sin(Alpha);
+  Double_t cosa = TMath::Cos(Alpha);
+  Double_t xl= fTPCtrack->GetX();
+  xm = xl * cosa - tpctrack(0)*sina;
+  ym = xl * sina + tpctrack(0)*cosa;
+  zm = tpctrack(1);  
+  //cout<<" xl e alpha = "<<xl<<" "<<Alpha<<"\n"; getchar(); 
+
+  Double_t x0m,y0m;
+
+  ///////////////////////////////////// determine yo //////////////////////////////////////////////////
+  Double_t Vxl=fVertex(0)*cosa+fVertex(1)*sina;
+  Double_t Vyl= -fVertex(0)*sina+fVertex(1)*cosa;
+  Double_t Xo,Yo, signy;
+  Double_t R = 1./tpctrack(2);
+  Xo =  tpctrack(3) / tpctrack(2);
+  xoTPC=Xo;
+  Double_t Yo1, Yo2, diffsq1, diffsq2;  
+  Yo1 = tpctrack(0) +  TMath::Sqrt(R*R - (xl-Xo)*(xl-Xo)); 
+  Yo2 = tpctrack(0) -  TMath::Sqrt(R*R - (xl-Xo)*(xl-Xo));   
+  diffsq1=TMath::Abs((Yo1-Vyl)*(Yo1-Vyl)+(Xo-Vxl)*(Xo-Vxl)-R*R);
+  diffsq2=TMath::Abs((Yo2-Vyl)*(Yo2- Vyl)+(Xo-Vxl)*(Xo-Vxl)-R*R);
+  if(diffsq1<diffsq2) {Yo=Yo1; signy=1.;} else {Yo=Yo2; signy=-1.;};
+  ////////////////////////////////////////////////////////////////////////////////////////////////////
+
+  x0m = Xo * cosa - Yo * sina;
+  y0m = Xo * sina + Yo * cosa;  
+
+  rtrack=TMath::Sqrt(xm*xm+ym*ym);
+  Double_t pigre=TMath::Pi();
+  Double_t phi;
+  if(ym == 0. || xm == 0.) {
+    if(ym == 0. && xm == 0.) {cout << "  Error in AliITStrack::LmTPC x=0 and y=0 \n"; getchar();}
+    if(ym ==0. && xm>0.) phi=0.;
+    if(ym==0. && xm<0.) phi=pigre;
+    if(xm==0 && ym>0.) phi=pigre/2.;
+    if(xm==0 && ym<0.) phi=1.5*pigre;   
+  }
+  else {
+    if (xm>0. && ym>0.) phi=TMath::ATan(ym/xm);
+    if (xm<0. && ym>0.) phi=pigre+TMath::ATan(ym/xm);
+    if (xm<0. && ym<0.) phi=pigre+TMath::ATan(ym/xm); 
+    if (xm>0. && ym<0.) phi=(2*pigre)+TMath::ATan(ym/xm);     
+  };
+  if(phi<0. || phi>(2*pigre)) {cout<<"attention error on phi in  AliITStrack:LmTPC \n"; getchar();}  
+
+  fvTrack(0)= phi;
+  fvTrack(1)=zm;
+  fvTrack(3)=tpctrack(4);
+  fvTrack(4)=tpctrack(2);
+  /*
+  //provvisorio
+   alphaprov=pigre-PhiDef(x0m,y0m)-PhiDef(fVertex(0),fVertex(1));
+  if(alphaprov<0.) alphaprov=alphaprov+2.*pigre;
+  //cout<<" PhiDef(x0m,y0m) ="<<PhiDef(x0m,y0m)<<"\n";
+  //cout<<" PhiDef(fVertex(0),fVertex(1)) = "<<PhiDef(fVertex(0),fVertex(1))<<"\n";
+  //cout<<"alphaprov = "<<alphaprov<<"\n"; getchar();
+  //cout<<" fvTrack(0) prima = "<<fvTrack(0)<<"\n";
+  fvTrack(0)-=alphaprov;
+  if(fvTrack(0)<0.) fvTrack(0)+= 2.*pigre;
+  //cout<<" fvTrack(0) dopo = "<<fvTrack(0)<<"  alphaprov = "<<alphaprov<<"\n"; 
+  cout<<" fvertex = "<<fVertex(0)<<" "<<fVertex(1)<<" "<<fVertex(2)<<"\n";   
+  fVertex(0)=0.;
+  fVertex(1)=0.;
+/////////////////////////////////////////////////////////////////////////////////////////////////// 
+*/ 
+  
+  Double_t dd=TMath::Sqrt((x0m-fVertex(0))*(x0m-fVertex(0))+(y0m-fVertex(1))*(y0m-fVertex(1)));
+  Double_t signdd;
+  if (R>0) signdd=1.; else signdd=-1.;
+  fvTrack(2)=signdd*dd-R;
+  //cout<<" fvertex = "<<fVertex(0)<<" "<<fVertex(1)<<" "<<fVertex(2)<<"\n";
+  //cout<<" fvTrack(2) ="<<fvTrack(2)<<"\n"; getchar();
+  
+  TMatrix localM(5,5);    
+  Double_t cov[15];
+  fTPCtrack->GetCovariance(cov);
+  localM(0,0)=cov[0];
+  localM(1,1)=cov[2];
+  localM(2,2)=cov[5];
+  localM(3,3)=cov[9];
+  localM(4,4)=cov[14];
+  localM(1,0)=localM(0,1)=cov[1];
+  localM(2,0)=localM(0,2)=cov[3];
+  localM(2,1)=localM(1,2)=cov[4];
+  localM(3,0)=localM(0,3)=cov[6];
+  localM(3,1)=localM(1,3)=cov[7];
+  localM(3,2)=localM(2,3)=cov[8];
+  localM(4,0)=localM(0,4)=cov[10];
+  localM(4,1)=localM(1,4)=cov[11];
+  localM(4,2)=localM(2,4)=cov[12];
+  localM(4,3)=localM(3,4)=cov[13];
+
+  TMatrix F(5,5);
+  
+  Double_t  dfidy, dDdy, dDdC, dDdeta;
+
+  dfidy=(xm*cosa+ym*sina)/(rtrack*rtrack);
+  dDdy=signdd*((y0m-fVertex(1))*cosa-(x0m-fVertex(0))*sina)/dd;
+  Double_t dyodr=signy*(R+(xl-Xo)*tpctrack(3))/TMath::Sqrt(R*R-(xl-Xo)*(xl-Xo));
+  Double_t dyomdr=sina*tpctrack(3)+cosa*dyodr;
+  Double_t dxomdr=cosa*tpctrack(3)-sina*dyodr;
+  Double_t ddddR=((x0m-fVertex(0))*dxomdr+(y0m-fVertex(1))*dyomdr)/dd;
+  dDdC=-R*R*(signdd*ddddR-1.);
+  Double_t dyoldxol=signy*(xl-Xo)/TMath::Sqrt(R*R-(xl-Xo)*(xl-Xo));
+  Double_t dxomdeta=R*(cosa-sina*dyoldxol);
+  Double_t dyomdeta=R*(sina+cosa*dyoldxol);
+  dDdeta=signdd*((x0m-fVertex(0))*dxomdeta+(y0m-fVertex(1))*dyomdeta)/dd;
+  F(0,0)=dfidy;
+  F(0,1)=F(0,2)=F(0,3)=F(0,4)=0.;
+  F(1,1)=1.;
+  F(1,0)=F(1,2)=F(1,3)=F(1,4)=0.;
+  F(2,0)=dDdy;    
+  F(2,2)=dDdC;    
+  F(2,3)=dDdeta;  
+  F(2,1)=F(2,4)=0.;
+  F(3,0)=F(3,1)=F(3,2)=F(3,3)=0.;
+  F(3,4)=1.;
+  F(4,0)=F(4,1)=F(4,3)=F(4,4)=0.;
+  F(4,2)=1.;
+// cout<<" Matrice F \n";  
+// F.Print(); getchar();
+  TMatrix Ft(TMatrix::kTransposed,F);
+  TMatrix temp(localM);
+  temp*=Ft;
+  TMatrix B(F);
+  B*=temp;                            // B=F*localM*Ft 
+// cout<<" Matrice C\n";  
+// B.Print(); getchar();
+  *fmCovariance = B;   
+}
+
+
+AliITStrack &AliITStrack::operator=(AliITStrack obj) {
+//Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it  
+
+  delete fmCovariance;
+  delete flistCluster;
+  delete ClusterInTrack;
+  fmCovariance = new TMatrix(5,5);
+  ClusterInTrack = new TMatrix(6,9);
+  flistCluster = new TObjArray; 
+  flabel = obj.flabel;
+  fTPCtrack = obj.fTPCtrack;
+  fvTrack.ResizeTo(5); 
+  fNumClustInTrack = obj.fNumClustInTrack; 
+  fChi2= obj.fChi2;
+  fVertex=obj.fVertex;
+  fErrorVertex=obj.fErrorVertex;
+  fvTrack = obj.fvTrack; 
+  fLayer=obj.fLayer;
+  rtrack=obj.rtrack;
+  Dv=obj.Dv;
+  Zv=obj.Zv;
+  sigmaDv=obj.sigmaDv;
+  sigmaZv=obj.sigmaZv;
+  d2=obj.d2;
+  tgl2=obj.tgl2; 
+  dtgl=obj.dtgl; 
+  //alphaprov=obj.alphaprov; //proviisorio   
+    
+  *fmCovariance = *obj.fmCovariance;
+  *ClusterInTrack = *obj.ClusterInTrack;
+  for(Int_t i=0; i<obj.flistCluster->GetSize(); i++) flistCluster->AddLast(obj.flistCluster->At(i));
+
+  return *this;
+  
+}
+
+void AliITStrack::PutCluster(Int_t layerc, TVector vecclust) {
+//Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it  
+  
+  (*ClusterInTrack)(layerc,0) = vecclust(0);
+  (*ClusterInTrack)(layerc,1) = vecclust(1);
+  (*ClusterInTrack)(layerc,2) = vecclust(2);
+  (*ClusterInTrack)(layerc,3) = vecclust(3);
+  (*ClusterInTrack)(layerc,4) = vecclust(4);  
+  (*ClusterInTrack)(layerc,5) = vecclust(5);
+  (*ClusterInTrack)(layerc,6) = vecclust(6);
+  (*ClusterInTrack)(layerc,7) = vecclust(7);
+  (*ClusterInTrack)(layerc,8) = vecclust(8);
+
+}
+
+
+void AliITStrack::GetClusters() {
+
+  TMatrix A(*ClusterInTrack);
+  TMatrix B(6,3);
+  for(Int_t i=0;i<6; i++){
+   B(i,0)=A(i,6); B(i,1)=A(i,7); B(i,2)=A(i,8); 
+  }
+  A.Print();
+ // B.Print(); 
+}
+
+
+TVector AliITStrack::GetLabTrack(Int_t lay) {
+  TVector VecLabel(3);
+  VecLabel(0)=( (Float_t) (*ClusterInTrack)(lay,6) );
+  VecLabel(1)=( (Float_t) (*ClusterInTrack)(lay,7) );
+  VecLabel(2)=( (Float_t) (*ClusterInTrack)(lay,8) );
+  return VecLabel;
+}
+
+void AliITStrack::Search(TVector VecTotLabref, Long_t &labref, Int_t &freq){
+//Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it  
+// define label
+
+  Int_t vecfreq[18];
+
+  for(Int_t i=0; i<18; i++) vecfreq[i]=0;
+  
+  for(Int_t i=0; i<18; i++) {
+    for(Int_t j=0; j<18; j++) {
+      if(VecTotLabref(i) == 0.) VecTotLabref(i)=-3.;  
+      if( (VecTotLabref(i)>=0.) && (VecTotLabref(i)==VecTotLabref(j)) ) vecfreq[i]++;    
+    }  
+  }
+  Int_t imax=-1000;
+  Long_t  labdefault= (Long_t)1000000.;
+  freq=0;
+  for(Int_t i=0; i<18; i++) {
+    if(vecfreq[i]>freq) {freq=vecfreq[i]; imax=i;}  
+  }
+  if(imax<0) labref=labdefault; else labref=(Long_t) VecTotLabref(imax);
+} 
+
+
+void AliITStrack::Propagation(Double_t rk) {
+//Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it  
+//Propagation of track 
+  Double_t duepi=2.*TMath::Pi();
+  Double_t rkm1=rtrack;
+//cout<<" rk e rkm1 dentro Propagation   "<<rk<<" "<<rkm1<<"\n";
+  
+  //
+  Double_t Ak=argA(rk), Akm1=argA(rkm1);
+  Double_t ak=arga(rk), akm1=arga(rkm1);
+  fvTrack(0)+=TMath::ASin(Ak)-TMath::ASin(Akm1);
+  if(fvTrack(0)>duepi) fvTrack(0)-=duepi;
+  if(fvTrack(0)<0.) fvTrack(0)+=duepi;
+       
+  Double_t tgl=fvTrack(3);
+  Double_t C=fvTrack(4);
+  Double_t D=fvTrack(2);
+  Double_t Cy=C/2;
+  fvTrack(1)+=tgl/Cy*(TMath::ASin(ak)-TMath::ASin(akm1));
+  rtrack=rk;
+//cout<<"fvTrack(0) fvTrack(1) e rtrack dentro Propagation = "<<fvTrack(0)<<" "<<fvTrack(1)<<" "<<rtrack<<"\n";
+//getchar();
+       
+  Double_t Bk=argB(rk), Bkm1=argB(rkm1);       
+  Double_t Ck=argC(rk), Ckm1=argC(rkm1);
+  TMatrix F(5,5);
+  F(0,2)=Ck/TMath::Sqrt(1.-Ak*Ak) - Ckm1/TMath::Sqrt(1.-Akm1*Akm1);
+  F(0,4)=Bk/TMath::Sqrt(1.-Ak*Ak) - Bkm1/TMath::Sqrt(1.-Akm1*Akm1);    
+  F(1,2)=tgl*D*(1./rk - 1./rkm1);
+  F(1,3) = rk - rkm1;
+  F(0,0)=F(1,1)=F(2,2)=F(3,3)=F(4,4)=1.;       
+       
+  TMatrix Ft(TMatrix::kTransposed,F);
+  TMatrix temp(*fmCovariance);
+//cout<<" C Matrix prima propagation =\n";
+//temp.Print(); getchar();         
+  temp*=Ft;
+  TMatrix B(F);
+  B*=temp;
+//cout<<" C Matrix dopo propagation =\n";                            // B=F*C*Ft 
+//B.Print(); getchar();
+  *fmCovariance = B;    
+       
+}
+void AliITStrack::AddEL(Double_t signdE, Bool_t flagtot, Double_t mass=0.1396) {
+//Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it  
+//  add energy loss
+
+  TVector s(6);  
+  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;
+//0.00277 is added in the first layer to take into account the energy loss in the beam pipe 
+    
+  Double_t cl=1.+fvTrack(3)*fvTrack(3);  // cl=1/(cosl)**2 = 1 + (tgl)**2 
+  Double_t sqcl=TMath::Sqrt(cl);
+  Double_t pt=GetPt();
+     
+  Double_t p2=pt*pt*cl;
+  Double_t E=TMath::Sqrt(p2+mass*mass);
+  Double_t beta2=p2/(p2+mass*mass);
+  
+  Double_t dE;
+  if(flagtot) {
+    Double_t stot=s(0)+s(1)+s(2)+s(3)+s(4)+s(5);
+    dE=0.153/beta2*(log(5940*beta2/(1-beta2)) - beta2)*stot*21.82*sqcl;
+  } else {
+    dE=0.153/beta2*(log(5940*beta2/(1-beta2)) - beta2)*s(fLayer-1)*21.82*sqcl;
+  }   
+  dE=signdE*dE/1000.; 
+         
+  E+=dE;
+  Double_t p=TMath::Sqrt(E*E-mass*mass);   
+  Double_t sign=1.;
+  if((fvTrack)(4) < 0.) sign=-1.; 
+  pt=sign*p/sqcl;  
+  Double_t CC=(0.3*0.2)/(pt*100.);
+  fvTrack(4)=CC; 
+               
+}
+
+void  AliITStrack::Correct(Double_t rk) {
+//Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it  
+// correct track to take into account real geometry detector
+
+  Double_t duepi=2.*TMath::Pi();
+  Double_t rkm1=rtrack;
+  Double_t Ak=argA(rk), Akm1=argA(rkm1);
+  Double_t ak=arga(rk), akm1=arga(rkm1);
+
+  fvTrack(0)+=TMath::ASin(Ak)-TMath::ASin(Akm1);
+  if(fvTrack(0)>duepi) fvTrack(0)-=duepi;
+  if(fvTrack(0)<0.) fvTrack(0)+=duepi;
+       
+  Double_t tgl=fvTrack(3);
+  Double_t C=fvTrack(4);
+  Double_t Cy=C/2;
+  fvTrack(1)+=tgl/Cy*(TMath::ASin(ak)-TMath::ASin(akm1));
+  rtrack=rk;
+               
+}
+
+void AliITStrack::AddMS() {
+       
+//////////   Modification of the covariance matrix to take into account multiple scattering  ///////////
+//Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it     
+   
+  TVector s(6);
+
+  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;
+//0.00277 is added in the first layer to take into account the energy loss in the beam pipe     
+  Double_t mass=0.1396;
+  Int_t layer=(Int_t)GetLayer();
+  
+  Double_t tgl=fvTrack(3);
+  Double_t cosl=TMath::Cos(TMath::ATan(tgl));  
+  Double_t D=fvTrack(2);
+  Double_t C=fvTrack(4);
+  Double_t Cy=C/2.;
+  Double_t Q20=1./(cosl*cosl);  
+  Double_t Q30=C*tgl;
+   
+  Double_t Q40=Cy*(rtrack*rtrack-D*D)/(1.+ 2.*Cy*D);
+  Double_t dd=D+Cy*D*D-Cy*rtrack*rtrack;
+  Double_t Q41=-1./cosl*TMath::Sqrt(rtrack*rtrack - dd*dd)/(1.+ 2.*Cy*D);
+  
+  /*
+  Double_t xk=rtrack*TMath::Cos(fvTrack(0));
+  Double_t yk=rtrack*TMath::Sin(fvTrack(0));  
+  Double_t rvertex=TMath::Sqrt((xk-fVertex(0))*(xk-fVertex(0)) + (yk-fVertex(1))*(yk-fVertex(1)));
+  Double_t Q40=Cy*(rvertex*rvertex-D*D)/(1.+ 2.*Cy*D);
+  Double_t dd=D+Cy*D*D-Cy*rvertex*rvertex;
+  Double_t Q41=-1./cosl*TMath::Sqrt(rvertex*rvertex - dd*dd)/(1.+ 2.*Cy*D); 
+  */
+   
+  TMatrix J(5,2);      
+  J(0,0)=0.; J(0,1)=0.;
+  J(1,0)=0.; J(1,1)=0.;
+  J(2,0)=Q40;    
+  J(2,1)=Q41;          
+  J(3,0)=Q20;  J(3,1)=0.;
+  J(4,0)=Q30;   J(4,1)=0.;
+                       
+  Double_t p2=(GetPt()*GetPt())/(cosl*cosl);
+  Double_t beta2=p2/(p2+mass*mass);
+  Double_t theta2=14.1*14.1/(beta2*p2*1.e6)*(s(layer-1)/cosl); 
+       
+  TMatrix Jt(TMatrix::kTransposed,J);  
+  TMatrix Q(J,TMatrix::kMult,Jt);
+  Q*=theta2;   
+                   
+  (*fmCovariance)+=Q;
+  
+}
+
+void AliITStrack::PrimaryTrack() {
+//Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it  
+// calculation of part of covariance matrix for vertex  constraint
+
+  Double_t Rlayer[6];
+       
+  Rlayer[0]=4.; Rlayer[1]=7.;  Rlayer[2]=14.9;  Rlayer[3]=23.8;  
+  Rlayer[4]=39.1;  Rlayer[5]=43.6;
+       
+  Double_t Cy=fvTrack(4)/2.;   
+  Double_t tgl=(fvTrack(1)-Zv)*Cy/TMath::ASin(Cy*rtrack);
+  Double_t rtrack=1.;  
+  fvTrack(0)=0.;
+  fvTrack(1)=rtrack*tgl; 
+  fvTrack(2)=Dv;
+  fvTrack(3)=tgl; 
+       
+  TMatrix  newC(5,5);
+  newC(4,4)=(*fmCovariance)(4,4);
+  (*fmCovariance)=newC;
+  AddEL(1.,1);
+  fLayer=0;
+  for (Int_t i=0; i<6; i++) {
+    Propagation(Rlayer[i]);
+    fLayer++;
+    d2(i)=(*fmCovariance)(2,2);
+    tgl2(i)=(*fmCovariance)(3,3);
+    dtgl(i)=(*fmCovariance)(2,3); 
+    AddMS();    
+    AddEL(-1,0);          
+  }            
+}      
+  
+Int_t AliITStrack::DoNotCross(Double_t rk) const{
+  Double_t C=fvTrack(4);
+  Double_t D=fvTrack(2);
+  Double_t Cy=C/2.;
+  return (TMath::Abs((Cy*rk+(1.+Cy*D)*D/rk)/(1.+2.*Cy*D))>=1.)?1:0;
+}
+  
+
+Double_t AliITStrack::argA(Double_t rk) const {
+  Double_t C=fvTrack(4);
+  Double_t D=fvTrack(2);
+  Double_t Cy=C/2.;
+  Double_t arg=(Cy*rk + (1 + Cy*D)*D/rk)/(1.+ 2.*Cy*D);                
+  if (TMath::Abs(arg) < 1.) return arg;
+  //cout<<"class AliITSTrack: argA out of range !\n";/* getchar();*/
+  return (arg>0) ? 1. : -1.;
+}
+   
+Double_t AliITStrack::arga(Double_t rk) const {
+  Double_t C=fvTrack(4);
+  Double_t D=fvTrack(2);
+  Double_t Cy=C/2.;
+  Double_t arg=(rk*rk - D*D)/(1.+ 2.*Cy*D);            
+  if (arg<0.) {/*cout<<"class AliITSTrack: arga out of range !\n";*/ arg=0.;} 
+  return Cy*TMath::Sqrt(arg);
+}
+       
+Double_t AliITStrack::argB(Double_t rk) const {
+  Double_t C=fvTrack(4);
+  Double_t D=fvTrack(2);
+  Double_t Cy=C/2.;       
+  return (rk*rk - D*D)/(rk*(1.+ 2.*Cy*D)*(1.+ 2.*Cy*D));
+}
+   
+Double_t AliITStrack::argC(Double_t rk) const {
+  Double_t C=fvTrack(4);
+  Double_t D=fvTrack(2);
+  Double_t Cy=C/2.;            
+  return  (1./rk - 2.*Cy*argA(rk)/(1.+ 2.*Cy*D));
+}
+/*
+Double_t AliITStrack::PhiDef(Double_t x, Double_t y){
+  Double_t pigre= TMath::Pi();
+  Double_t phi;
+  if(y == 0. || x == 0.) {
+    if(y == 0. && x == 0.) {
+      cout << "  Error in AliITStracking::PhiDef x=0 and y=0 \n"; getchar();
+    }
+    if(y==0. && x>0.) phi=0.;
+    if(y==0. && x<0.) phi=pigre;
+    if(x==0 && y>0.) phi=pigre/2.;
+    if(x==0 && y<0.) phi=1.5*pigre;   
+  }
+    else {
+      if (x>0. && y>0.) phi=TMath::ATan(y/x);
+      if (x<0. && y>0.) phi=pigre+TMath::ATan(y/x);
+      if (x<0. && y<0.) phi=pigre+TMath::ATan(y/x); 
+      if (x>0. && y<0.) phi=(2.*pigre)+TMath::ATan(y/x);     
+    }
+  if(phi<0. || phi>(2*pigre)) {
+    cout<<" Error on phi in  AliITStracking::PhiDef \n"; getchar();
+  }  
+  return phi;
+}
+*/
diff --git a/ITS/AliITStrack.h b/ITS/AliITStrack.h
new file mode 100644 (file)
index 0000000..d0df63b
--- /dev/null
@@ -0,0 +1,134 @@
+#ifndef ALIITSTRACK_H
+#define ALIITSTRACK_H
+
+#include <TObject.h>
+#include <TMatrix.h>
+#include <TVector.h>
+
+#include "../TPC/AliTPCtrack.h"
+
+class TObjArray;
+//   ITS Track Class
+//Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
+//
+class AliITStrack : public TObject { 
+
+public:
+
+  AliITStrack() ;
+  AliITStrack(AliTPCtrack &obj);
+  AliITStrack(const AliITStrack &cobj);
+  AliITStrack &operator=(AliITStrack obj);
+  ~AliITStrack();
+  Float_t &operator()(Int_t i) const {  return fvTrack(i);}
+  Float_t &operator()(Int_t r, Int_t c) const {return (*fmCovariance)(r,c);}
+  Int_t GetNumClust() { return fNumClustInTrack;}
+  void AddClustInTrack() { fNumClustInTrack++;}
+  TObjArray *GetListOfCluster() { return flistCluster;}
+  void SetChi2(Double_t chi2) { fChi2 = chi2;}
+  Double_t GetChi2() { return fChi2;}
+  Double_t GetZ() const {return fvTrack(1);}
+  Double_t GetTgl() const {return fvTrack(3);}   
+  Double_t Getrtrack() const{return rtrack;}
+  Double_t Getphi()  const{return fvTrack(0);}
+  Double_t GetC() const {return fvTrack(4);}
+  Double_t GetD() const{return fvTrack(2);} 
+  Double_t GetPt() const {return 0.3*0.2/(fvTrack(4)*100.);}            
+  void SetVertex(TVector &vert) { for(Int_t i=0;i<3;i++) fVertex(i) = vert(i);}
+  void SetErrorVertex(TVector &evert) {for(Int_t i=0;i<3;i++) fErrorVertex(i) = evert(i);}
+
+  void LmTPC(); // trasform state vector and covariance matrix from local TPC to master
+  TVector GetVertex() { return fVertex;}
+  TVector GetErrorVertex() { return fErrorVertex;}
+  Long_t  GetLabel() { return flabel;}
+  void SetLabel(Long_t label) { flabel = label;}
+  Int_t  GetLayer() { return fLayer;}
+  TMatrix &GetCMatrix() { return *fmCovariance;}
+  TVector &GetVector() { return fvTrack;}
+  void SetLayer(Int_t layer) { fLayer = layer;}
+  AliTPCtrack *GetTPCtrack() { return fTPCtrack;}
+
+  void PutCluster(Int_t layerc, TVector vecclust);
+  TVector GetLabTrack(Int_t lay);
+  void Search(TVector VecTotLabref, Long_t &labref, Int_t &freq); 
+  Float_t GetZclusterTrack(Int_t lay) {return ((Float_t) (*ClusterInTrack)(lay,2));}  
+  void GetClusters();
+  Int_t GetLabTPC() {return (*fTPCtrack).GetLabel();}
+  Int_t GetIdPoint(Int_t lay) {return ((Int_t) (*ClusterInTrack)(lay,4));}
+  Int_t GetIdModule(Int_t lay) {return ((Int_t) (*ClusterInTrack)(lay,5));}
+      
+
+  Int_t DoNotCross(Double_t rk) const;
+  Double_t argA(Double_t rk) const;
+  Double_t arga(Double_t rk) const;
+  Double_t argB(Double_t rk) const;
+  Double_t argC(Double_t rk) const;             
+  void  Propagation(Double_t rk) ;
+
+  Double_t GetSigmaphi() const{return ((Double_t)(*fmCovariance)(0,0));}
+  Double_t GetSigmaZ() const{return ((Double_t)(*fmCovariance)(1,1));}
+  void AddEL(Double_t signdE,  Bool_t flagtot, Double_t mass=0.1396); 
+  void AddMS();
+  void Correct(Double_t rk); 
+  void SetDv(Double_t x) {Dv=x;}
+  void SetZv(Double_t x) {Zv=x;}
+  Double_t GetDv() {return Dv;}
+  Double_t GetZv() {return Zv;}
+  void SetsigmaDv( Double_t x) {sigmaDv=x;}
+  void SetsigmaZv( Double_t x) {sigmaZv=x;} 
+  Double_t GetsigmaDv() {return sigmaDv;}
+  Double_t GetsigmaZv() {return sigmaZv;} 
+  void PrimaryTrack();
+  void Setd2(TVector &x) {for(Int_t i=0; i<6; i++){d2(i)=x(i);}}
+  void Settgl2(TVector &x) {for(Int_t i=0; i<6; i++){tgl2(i)=x(i);}}
+  void Setdtgl(TVector &x) {for(Int_t i=0; i<6; i++){dtgl(i)=x(i);}} 
+  TVector Getd2() { return d2;}
+  TVector Gettgl2() { return tgl2;}
+  TVector Getdtgl() { return dtgl;}
+  Double_t Getd2(Int_t i){return (Double_t)d2(i);}  
+  Double_t Gettgl2(Int_t i){return (Double_t)tgl2(i);}
+  Double_t Getdtgl(Int_t i){return (Double_t)dtgl(i);}
+  Double_t GetxoTPC() {return xoTPC;} 
+ // Double_t PhiDef(Double_t x, Double_t y); 
+ // Double_t  Getalphaprov(){return alphaprov;}  //provvirio                   
+//////////////////////////////////////////////////////////////////////////////////////// 
+
+ private:  
+   
+  AliTPCtrack     *fTPCtrack;           // reference to TPC track
+   
+  TVector         fvTrack;              // state vector: |phi/z/D/tgl/C 
+  Double_t        rtrack;               // radius of courrent layer     
+  TMatrix         *fmCovariance;        // Covariance Matrix
+      
+  Double_t        fChi2;                // fChi^2 of track         
+  TObjArray       *flistCluster;        // list of clusters of the track
+  Int_t           fNumClustInTrack;     // total number of clusters
+  Long_t          flabel;               // label of the track
+  TVector         fVertex;              // vertex coordinates of the track
+  TVector         fErrorVertex;         // error on the vertex coordinates
+  Int_t           fLayer;               // current Layer of the track
+  TMatrix        *ClusterInTrack;       // matrix of clusters belonging to the  track
+                                        // row index = layer-1; 
+                                        // cols index = master coordinates of the clusters
+  
+  
+  Double_t          Dv;                 // radial impact parameter for vertex  constraint
+  Double_t          Zv;                 // longitudinal impact parameter for vertex constraint
+  Double_t          sigmaDv;            // sigma for Dv extraction
+  Double_t          sigmaZv;            // sigma for Zv extraction
+  TVector           d2;                 // C(2,2)  per primary track
+  TVector           tgl2;               // C(3,3)   per primary track
+  TVector           dtgl;               // C(2,3)     per primary track
+
+  Double_t          xoTPC;
+                  
+  //Double_t alphaprov;  //provviosorio                   
+
+  ClassDef(AliITStrack, 1)
+   
+};
+
+#endif
+
diff --git a/ITS/AliITStracking.cxx b/ITS/AliITStracking.cxx
new file mode 100644 (file)
index 0000000..3c2873d
--- /dev/null
@@ -0,0 +1,524 @@
+#include <TMath.h> 
+#include <TList.h> 
+#include <TTree.h> 
+#include <TVector.h>
+#include <TMatrix.h>
+#include <TObjectTable.h>
+
+#include "AliITStracking.h"
+#include "AliRun.h"
+#include "AliITS.h"
+#include "AliITSgeom.h"
+#include "AliITSRecPoint.h"
+#include "AliITStrack.h"
+
+ClassImp(AliITStracking)
+
+AliITStracking::AliITStracking(TList *trackITSlist, AliITStrack *reference, 
+                AliITS *aliITS, TObjArray *rpoints, Double_t Ptref, Int_t **vettid, Bool_t flagvert) {                                                                          
+///////////////////////   This function perform the tracking in ITS detectors /////////////////////
+///////////////////////     reference is a pointer to the final best track    ///////////////////// 
+//Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
+// The authors  thank   Mariana Bondila to have help them to resolve some problems.  July-2000                                                      
+
+  
+  Rlayer[0]=4.; Rlayer[1]=7.;  Rlayer[2]=14.9;  Rlayer[3]=23.8;  Rlayer[4]=39.1;  Rlayer[5]=43.6;
+     
+  for(Int_t index =0; index<trackITSlist->GetSize(); index++) {
+    AliITStrack *trackITS = (AliITStrack *) trackITSlist->At(index);
+    if((*trackITS).GetLayer()==7) reference->SetChi2(10.223e140);
+    //cout <<" Layer inizio = "<<(*trackITS).GetLayer()<<"\n";
+    // cout<<"fvtrack =" <<"\n";
+    // cout << (*trackITS)(0) << " "<<(*trackITS)(1)<<" "<<(*trackITS)(2)<<" "<<(*trackITS)(3)<<" "<<(*trackITS)(4)<<"\n";
+    // cout<< " rtrack = "<<(*trackITS).Getrtrack()<<"\n";
+    // getchar();    
+    Double_t Chi2Now, Chi2Ref;
+    if((*trackITS).GetLayer()==1 ) {
+      Chi2Now = trackITS->GetChi2();
+      Float_t NumClustNow = trackITS->GetNumClust();
+      if(trackITS->GetNumClust()) Chi2Now /= (Double_t )trackITS->GetNumClust();
+      Chi2Ref = reference->GetChi2();
+      Float_t NumClustRef = reference->GetNumClust();  
+      if(reference->GetNumClust()) Chi2Ref /= (Double_t )reference->GetNumClust();
+      //cout<<" Chi2Now and Chi2Ref = "<<Chi2Now<<" "<<Chi2Ref<<"\n";
+               if( NumClustNow > NumClustRef ) {*reference = *trackITS;} 
+      if((NumClustNow == NumClustRef )&& (Chi2Now < Chi2Ref))  {*reference = *trackITS;}
+      continue;        
+    }
+
+    Float_t NumClustNow = trackITS->GetNumClust();
+    if(NumClustNow) { 
+      Chi2Now = trackITS->GetChi2();
+      Chi2Now/=NumClustNow;
+      //cout<<" Chi2Now =  "<<Chi2Now<<"\n"; 
+
+    // if(Ptref > 0.6 && Chi2Now > 20.) continue; 
+    if(Ptref > 0.6 && Chi2Now > 30.) continue;           
+    if((Ptref <= 0.6 && Ptref>0.2)&& Chi2Now > 15.) continue;        
+     // if(Chi2Now>5.) continue; 
+      //if(Chi2Now>15.) continue;     
+     // if(Ptref <= 0.2 && Chi2Now > 10.) continue;  
+     if(Ptref <= 0.2 && Chi2Now > 8.) continue;                                                                 
+    }
+                
+    Int_t layerInit = (*trackITS).GetLayer();
+    Int_t layernew = layerInit - 2;  // -1 for new layer, -1 for matrix index 
+                                         
+    Int_t NLadder[]= {20, 40, 14, 22, 34, 38}; 
+        Int_t NDetector[]= {4,  4,   5,  8, 23, 26}; 
+                                               
+    TList listoftrack;          
+    Int_t ladp, ladm, detp,detm,ladinters,detinters;   
+    Int_t layerfin=layerInit-1;
+    Double_t Rfin=Rlayer[layerfin-1];
+    // cout<<"Prima di intersection \n";
+    Int_t  outinters=NewIntersection(*trackITS, Rfin, layerfin, ladinters, detinters);
+                
+   // cout<<" outinters = "<<outinters<<"\n";
+   //  cout<<" Layer ladder detector intersection ="<<layerfin<<" "<<ladinters<<" "<<detinters<<"\n";
+   //  cout << " phiinters zinters = "<<(*trackITS)(0) << " "<<(*trackITS)(1)<<"\n"; getchar();
+                        
+    if(outinters==-1) continue;
+        
+    Int_t flaghit=0;   
+                       
+    if(outinters==0){   
+      TVector Touclad(9), Toucdet(9);   
+      Int_t lycur=layerfin;                                            
+      ladp=ladinters+1;
+      ladm=ladinters-1;
+      if(ladm <= 0) ladm=NLadder[layerfin-1];  
+      if(ladp > NLadder[layerfin-1]) ladp=1;           
+      detp=detinters+1;
+      detm=detinters-1;
+      Int_t idetot=1;
+      Touclad(0)=ladinters; Touclad(1)=ladm; Touclad(2)=ladp;
+      Touclad(3)=ladinters; Touclad(4)=ladm; Touclad(5)=ladp;
+      Touclad(6)=ladinters; Touclad(7)=ladm; Touclad(8)=ladp;
+      Toucdet(0)=detinters; Toucdet(1)=detinters; Toucdet(2)=detinters;
+      if(detm > 0 && detp <= NDetector[layerfin-1]) {
+        idetot=9;
+        Toucdet(3)=detm; Toucdet(4)=detm; Toucdet(5)=detm;        
+        Toucdet(6)=detp; Toucdet(7)=detp; Toucdet(8)=detp;
+      }
+        
+      if(detm > 0 && detp > NDetector[layerfin-1]) {
+        idetot=6;
+        Toucdet(3)=detm; Toucdet(4)=detm; Toucdet(5)=detm;
+      }
+        
+      if(detm <= 0 && detp <= NDetector[layerfin-1]) {
+        idetot=6;
+        Toucdet(3)=detp; Toucdet(4)=detp; Toucdet(5)=detp;
+      } 
+       
+      for (Int_t iriv=0; iriv<idetot; iriv++) {  //for on detectors
+        AliITSgeom *g1 = aliITS->GetITSgeom();  
+        TVector CTF(9);
+        g1->GetCenterThetaPhi(layerInit-1,(Int_t)Touclad(iriv),(Int_t)Toucdet(iriv),CTF);
+
+        // cout<<" layer, ladder, det, xo, yo, zo = "<<layerInit-1<<" "<<(Int_t)Touclad(iriv)<<
+        // " "<<(Int_t)Toucdet(iriv)<<" "<<CTF(0)<<" "<<CTF(1)<<" "<<CTF(2)<< " "<<CTF(6)<<"\n"; getchar(); 
+
+        ////////////////////////////////////////////////////////////////////////////////////////////////
+
+        /*** Rec points sorted by module *****/
+        /**************************************/
+
+        Int_t index;
+        AliITSRecPoint *recp;
+        AliITSgeom *geom = aliITS->GetITSgeom();
+        index = geom->GetModuleIndex(lycur,Touclad(iriv),Toucdet(iriv));
+        Int_t lay,lad,det;
+        geom->GetModuleId(index,lay,lad,det);
+        aliITS->ResetRecPoints();
+        gAlice->TreeR()->GetEvent(index+1); //first entry in TreeR is empty
+
+        Int_t npoints=rpoints->GetEntries();
+        Int_t *indlist=new Int_t[npoints+1];
+        Int_t counter=0;
+        Int_t ind;
+        for (ind=0; ind<=npoints; ind++) {
+          indlist[ind]=-1;
+              if (*(vettid[index]+ind)==0) {
+              indlist[counter]=ind;
+                  counter++;
+             }
+        }
+
+        ind=-1;
+        for(;;) { 
+          ind++;
+          if(indlist[ind] < 0) recp=0;
+              else recp = (AliITSRecPoint*)rpoints->UncheckedAt(indlist[ind]);
+
+         if((!recp)  )  break; 
+         TVector cluster(3),vecclust(9);
+         vecclust(6)=vecclust(7)=vecclust(8)=-1.;
+         Double_t sigma[2];                  
+         // set veclust in global
+         Float_t global[3], local[3];
+         local[0]=recp->GetX();
+         local[1]=0.;
+         local[2]= recp->GetZ();
+          AliITSgeom *g1 = aliITS->GetITSgeom();
+          Int_t play = lycur;
+          Int_t plad = TMath::Nint(Touclad(iriv));   
+          Int_t pdet = TMath::Nint(Toucdet(iriv));             
+          g1->LtoG(play,plad,pdet,local,global); 
+       
+          vecclust(0)=global[0];
+          vecclust(1)=global[1];
+          vecclust(2)=global[2];                                    
+          vecclust(3) = (float)recp->fTracks[0]; 
+          vecclust(4) = (float)indlist[ind];
+          vecclust(5) = (float)index;
+          vecclust(6) = (float)recp->fTracks[0];
+          vecclust(7) = (float)recp->fTracks[1];
+          vecclust(8) = (float)recp->fTracks[2];
+        
+          sigma[0] = (Double_t)  recp->GetSigmaX2();  
+                        sigma[1] = (Double_t) recp->GetSigmaZ2(); 
+                        
+         //now we are in r,phi,z in global
+          cluster(0) = TMath::Sqrt(vecclust(0)*vecclust(0)+vecclust(1)*vecclust(1));//r hit
+          cluster(1) = PhiDef(vecclust(0),vecclust(1));    // phi hit
+          cluster(2) = vecclust(2);                   // z hit 
+                       // cout<<" cluster(1) prima = "<<cluster(1)<<"\n";    
+          //cluster(1)= cluster(1)-trackITS->Getalphaprov();  //provvisorio;
+                        //if(cluster(1)<0.) cluster(1)+=2.*TMath::Pi(); //provvisorio
+                        //cout<<" cluster(1) dopo = "<<cluster(1)<< " alphaprov = "<<trackITS->Getalphaprov()<<"\n";                    
+          Float_t sigmatotphi, sigmatotz;
+                                 
+          //Float_t epsphi=3.2, epsz=3.; 
+                        Float_t epsphi=3.2, epsz=3.0;              
+          //if(Ptref<0.2) {epsphi=3.; epsz=3.;}
+                                 
+          Double_t Rtrack=(*trackITS).Getrtrack();
+          Double_t sigmaphi=sigma[0]/(Rtrack*Rtrack);
+          sigmatotphi=epsphi*TMath::Sqrt(sigmaphi + (*trackITS).GetSigmaphi());                 
+          sigmatotz=epsz*TMath::Sqrt(sigma[1] + (*trackITS).GetSigmaZ());
+  //cout<<"cluster e sigmatotphi e track = "<<cluster(0)<<" "<<cluster(1)<<" "<<sigmatotphi<<" "<<vecclust(3)<<"\n";
+  //if(vecclust(3)==481) getchar();    
+              if(cluster(1)<6. && (*trackITS).Getphi()>6.) cluster(1)=cluster(1)+(2.*TMath::Pi());
+              if(cluster(1)>6. && (*trackITS).Getphi()<6.) cluster(1)=cluster(1)-(2.*TMath::Pi());                               
+          if(TMath::Abs(cluster(1)-(*trackITS).Getphi()) > sigmatotphi) continue;
+                       // cout<<" supero sigmaphi \n";      
+          AliITStrack *newTrack = new AliITStrack((*trackITS));
+          (*newTrack).SetLayer((*trackITS).GetLayer()-1); 
+              if (TMath::Abs(Rtrack-cluster(0))/Rtrack>1e-6) 
+                                               (*newTrack).Correct(Double_t(cluster(0)));      
+                       //cout<<" cluster(2) e (*newTrack).GetZ() = "<<cluster(2)<<" "<<        (*newTrack).GetZ()<<"\n";                                                                               
+          if(TMath::Abs(cluster(2)-(*newTrack).GetZ()) > sigmatotz){ 
+             delete newTrack;
+             continue;}
+       
+          if(iriv == 0) flaghit=1;
+       
+     (*newTrack).AddMS();  // add the multiple scattering matrix to the covariance matrix  
+         (*newTrack).AddEL(1.,0);
+         Double_t sigmanew[2];
+         sigmanew[0]= sigmaphi;
+         sigmanew[1]=sigma[1];
+         //cout<<" Chiamo Kalman \n"; getchar();
+         if(flagvert)   
+           KalmanFilterVert(newTrack,cluster,sigmanew);  
+         else                                                    
+           KalmanFilter(newTrack,cluster,sigmanew);
+                 
+         
+          (*newTrack).PutCluster(layernew, vecclust);
+           newTrack->AddClustInTrack();            
+                                                                       
+          listoftrack.AddLast(newTrack);
+
+        }   // end of for(;;) on rec points 
+
+        delete [] indlist;
+  
+      }  // end of for on detectors
+    }//end if(outinters==0) 
+    
+    if(flaghit==0 || outinters==-2) {
+      AliITStrack *newTrack = new AliITStrack(*trackITS);       
+      (*newTrack).SetLayer((*trackITS).GetLayer()-1); 
+      (*newTrack).AddMS();  // add the multiple scattering matrix to the covariance matrix  
+      (*newTrack).AddEL(1.,0);               
+                                                 
+      listoftrack.AddLast(newTrack);     
+    }  
+               
+
+    //gObjectTable->Print();   // stampa memoria
+    
+    AliITStracking(&listoftrack, reference, aliITS, rpoints,Ptref,vettid,flagvert);          
+    listoftrack.Delete();
+  } // end of for on tracks
+  
+  //gObjectTable->Print();   // stampa memoria
+
+}   
+
+
+Int_t AliITStracking::NewIntersection(AliITStrack &track, Double_t rk,Int_t layer, Int_t &ladder, Int_t &detector) { 
+//Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
+// Found the intersection and the detector 
+
+  if(track.DoNotCross(rk)){ /*cout<< " Do not cross \n";*/ return -1;} 
+  track.Propagation(rk);
+  Double_t zinters=track.GetZ();
+  Double_t phinters=track.Getphi();
+  //phinters = phinters+track.Getalphaprov(); //provvisorio
+  //if(phinters>2.*3.14) phinters=phinters-2.*3.14; //provvisorio
+  //cout<<"zinters = "<<zinters<<"  phinters = "<<phinters<<"\n";
+
+  //////////////////////////////////      limits for Geometry 5      /////////////////////////////
+  
+  Int_t NLadder[]= {20, 40, 14, 22, 34, 38};
+  Int_t NDetector[]= {4,  4,   5,  8, 23, 26}; 
+
+  Float_t Detx[]= {0.64, 0.64, 3.509, 3.509, 3.65, 3.65 };
+  Float_t Detz[]= {4.19, 4.19, 3.75 , 3.75 , 2   , 2    };
+  ////////////////////////////////////////////////////////////////////////////////////////////////  
+  
+  TVector det(9);
+  TVector ListDet(2);
+  TVector DistZCenter(2);  
+  AliITSgeom *g1 = ((AliITS*)gAlice->GetDetector("ITS"))->GetITSgeom();
+  Int_t iz=0; 
+  Double_t epsz=1.2;
+  Double_t epszpixel=0.05;
+
+  for(Int_t iD = 1; iD<= NDetector[layer-1]; iD++) {
+    g1->GetCenterThetaPhi(layer,1,iD,det);
+    Double_t zmin=det(2)-Detz[layer-1];
+    if(iD==1) zmin=det(2)-(Detz[layer-1])*epsz;                
+    Double_t zmax=det(2)+Detz[layer-1];
+    if(iD==NDetector[layer-1]) zmax=det(2)+(Detz[layer-1])*epsz;
+    if(layer == 3 || layer==2) zmin=zmin-epszpixel; zmax=zmax+epszpixel;
+    //cout<<"zmin zinters zmax det(2)= "<<zmin<<" "<<zinters<<" "<<zmax<<" "<<det(2)<<"\n";    
+    if(zinters > zmin && zinters <= zmax) { 
+      if(iz>1) {cout<< " Errore su iz in NewIntersection \n"; getchar();}
+      else {
+        ListDet(iz)= iD; DistZCenter(iz)=TMath::Abs(zinters-det(2)); iz++;
+      }
+    }                        
+  }
+  
+  if(iz==0) {/* cout<< " No detector along Z \n";*/ return -2;}
+  detector=Int_t (ListDet(0));
+  if(iz>1 && (DistZCenter(0)>DistZCenter(1)))   detector=Int_t (ListDet(1));
+  
+  AliITSgeom *g2 = ((AliITS*)gAlice->GetDetector("ITS"))->GetITSgeom(); 
+  Float_t global[3];
+  Float_t local[3];
+  TVector ListLad(2);
+  TVector DistphiCenter(2);
+  Int_t ip=0;
+  Double_t pigre=TMath::Pi();
+     
+  for(Int_t iLd = 1; iLd<= NLadder[layer-1]; iLd++) {
+          g1->GetCenterThetaPhi(layer,iLd,detector,det);
+  Double_t phidet=PhiDef(Double_t(det(0)),Double_t(det(1)));
+
+  
+  // cout<<" layer phidet e det(6) = "<< layer<<" "<<phidet<<" "<<det(6)<<"\n"; getchar();
+  Double_t xmin,ymin,xmax,ymax;        
+  Double_t phiconfr;  
+  local[1]=local[2]=0.;  
+  local[0]= -(Detx[layer-1]);
+  if(layer==1)    local[0]= (Detx[layer-1]);  //take into account different reference system
+  g2->LtoG(layer,iLd,detector,local,global);
+  xmax=global[0]; ymax=global[1];
+  local[0]= (Detx[layer-1]);
+  if(layer==1)    local[0]= -(Detx[layer-1]);  //take into account different reference system  
+  g2->LtoG(layer,iLd,detector,local,global);
+  xmin=global[0]; ymin=global[1];
+  Double_t phimin=PhiDef(xmin,ymin);
+  Double_t phimax=PhiDef(xmax,ymax);
+  //cout<<" xmin ymin = "<<xmin<<" "<<ymin<<"\n";
+  // cout<<" xmax ymax = "<<xmax<<" "<<ymax<<"\n";  
+  // cout<<" iLd phimin phimax ="<<iLd<<" "<<phimin<<" "<<phimax<<"\n"; getchar();
+  if(phimin>phimax ){
+    if(phimin <5.5) {cout<<" Error in NewIntersection for phi \n"; getchar();}
+    phimin=phimin-(2.*pigre);
+    if(phinters>(1.5*pigre)) phiconfr=phinters-(2.*pigre);
+    if(phidet>(1.5*pigre)) phidet=phidet-(2.*pigre);
+  }
+    else phiconfr=phinters;
+  if(phiconfr>phimin && phiconfr<= phimax) {
+    if(ip>1) {
+      cout<< " Errore su ip in NewIntersection \n"; getchar();
+    }
+      else  {
+        ListLad(ip)= iLd; DistphiCenter(ip)=TMath::Abs(phiconfr-phidet); ip++;
+      }  
+    }
+  }
+  if(ip==0) { cout<< " No detector along phi \n"; getchar();}
+  ladder=Int_t (ListLad(0));
+  if(ip>1 && (DistphiCenter(0)>DistphiCenter(1)))   ladder=Int_t (ListLad(1));       
+
+  return 0;
+}
+
+
+Double_t AliITStracking::PhiDef(Double_t x, Double_t y){
+  Double_t pigre= TMath::Pi();
+  Double_t phi;
+  if(y == 0. || x == 0.) {
+    if(y == 0. && x == 0.) {
+      cout << "  Error in AliITStracking::PhiDef x=0 and y=0 \n"; getchar();
+    }
+    if(y==0. && x>0.) phi=0.;
+    if(y==0. && x<0.) phi=pigre;
+    if(x==0 && y>0.) phi=pigre/2.;
+    if(x==0 && y<0.) phi=1.5*pigre;   
+  }
+    else {
+      if (x>0. && y>0.) phi=TMath::ATan(y/x);
+      if (x<0. && y>0.) phi=pigre+TMath::ATan(y/x);
+      if (x<0. && y<0.) phi=pigre+TMath::ATan(y/x); 
+      if (x>0. && y<0.) phi=(2.*pigre)+TMath::ATan(y/x);     
+    }
+  if(phi<0. || phi>(2*pigre)) {
+    cout<<" Error on phi in  AliITStracking::PhiDef \n"; getchar();
+  }  
+  return phi;
+}
+
+
+void AliITStracking::KalmanFilter(AliITStrack *newTrack,TVector &cluster,Double_t sigma[2]){ 
+//Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
+// Kalman filter without vertex constraint
+
+  TMatrix H(2,5); H.UnitMatrix(); 
+  TMatrix Ht(TMatrix::kTransposed, H);
+
+
+  ////////////////////////////// Evaluation of the measurement vector /////////////////////////////////////  
+
+  TVector m(2);
+  Double_t rk,phik,zk;
+  rk=cluster(0);   phik=cluster(1);  zk=cluster(2);
+  m(0)=phik;    m(1)=zk;
+  // cout<<" r and m = "<<rk<<" "<<m(0)<<" "<<m(1)<<"\n";       
+  ///////////////////////////////////// Evaluation of the error matrix V  ///////////////////////////////          
+
+  TMatrix V(2,2);
+  V(0,1)=0.; V(1,0)=0.;  
+  V(0,0)=sigma[0];
+  V(1,1)=sigma[1];  
+  ///////////////////////////////////////////////////////////////////////////////////////////
+  
+  TMatrix C=newTrack->GetCMatrix();
+  TMatrix tmp(H,TMatrix::kMult,C);
+  TMatrix R(tmp,TMatrix::kMult,Ht); R+=V;
+  
+  R.Invert();
+  // cout<<" R prima = \n";
+  // R.Print(); getchar();
+  
+  TMatrix K(C,TMatrix::kMult,Ht); K*=R;
+  
+  TVector  x=newTrack->GetVector();
+  
+  TVector savex=x;
+  x*=H; x-=m;
+  x*=-1.; x*=K; x+=savex;  
+  TMatrix saveC=C;
+  C.Mult(K,tmp); C-=saveC; C*=-1;  
+  newTrack->GetVector()=x;
+  newTrack->GetCMatrix()=C;   
+  
+  TVector res= newTrack->GetVector(); 
+  //cout<<" res = "<<res(0)<<" "<<res(1)<<" "<<res(2)<<" "<<res(3)<<" "<<res(4)<<"\n"; 
+  res*=H; res-=m;  res*=-1.;  
+  TMatrix Cn=newTrack->GetCMatrix();
+  TMatrix tmpn(H,TMatrix::kMult,Cn);
+  TMatrix Rn(tmpn,TMatrix::kMult,Ht);  Rn-=V; Rn*=-1.;  
+  
+  Rn.Invert();  
+  TVector r=res;    res*=Rn;
+  //cout<<" R dopo = \n";
+  //Rn.Print(); getchar();
+  Double_t chi2= r*res;        
+  //cout<<"chi2 ="<<chi2<<"\n";  getchar();
+        
+  newTrack->SetChi2(newTrack->GetChi2()+chi2);
+   
+} 
+
+
+void AliITStracking::KalmanFilterVert(AliITStrack *newTrack,TVector &cluster,Double_t sigma[2]){
+//Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it 
+// Kalman filter with vertex constraint
+  TMatrix H(4,5); H.UnitMatrix(); 
+  TMatrix Ht(TMatrix::kTransposed, H);
+
+  ////////////////////////////// Evaluation of the measurement vector /////////////////////////////////////  
+
+  TVector m(4);
+  Double_t rk,phik,zk;
+  rk=cluster(0);   phik=cluster(1);  zk=cluster(2);
+  m(0)=phik;    m(1)=zk;
+  Double_t CC=(*newTrack).GetC();
+  Double_t Zv=(*newTrack).GetZv(); 
+  Double_t Dv=(*newTrack).GetDv();
+  // cout<<" Dv e Zv = "<<Dv<<" "<<Zv<<"\n";
+  Double_t Cy=CC/2.;
+  Double_t tgl= (zk-Zv)*Cy/TMath::ASin(Cy*rk);
+  m(2)=Dv;    m(3)=tgl;
+  // cout<<" m = \n";
+  // cout<<m(0)<<" "<<m(1)<<" "<<m(2)<<" "<<m(3)<<"\n";      
+  ///////////////////////////////////// Evaluation of the error matrix V  ///////////////////////////////          
+
+  TMatrix V(4,4);
+  V(0,1)=0.; V(1,0)=0.;  
+  Int_t Layer=newTrack->GetLayer();
+  V(0,0)=sigma[0];
+  V(1,1)=sigma[1];
+  V(1,3)=sigma[1]/rk;    V(3,1)=V(1,3);
+  Double_t sigmaDv=newTrack->GetsigmaDv();
+  V(2,2)=sigmaDv*sigmaDv  + newTrack->Getd2(Layer-1);
+  V(2,3)=newTrack->Getdtgl(Layer-1);  V(3,2)=V(2,3);
+  Double_t sigmaZv=newTrack->GetsigmaZv();  
+  V(3,3)=(sigma[1]+sigmaZv*sigmaZv)/(rk*rk) + newTrack->Gettgl2(Layer-1);
+  ///////////////////////////////////////////////////////////////////////////////////////////
+  //cout<<" d2 tgl2 dtgl = "<<newTrack->Getd2(Layer-1)<<" "<<newTrack->Gettgl2(Layer-1)<<" "<<newTrack->Getdtgl(Layer-1)<<"\n";
+  // cout<<" V = \n";
+  // V.Print();  getchar();
+  
+  TMatrix C=newTrack->GetCMatrix();
+  TMatrix tmp(H,TMatrix::kMult,C);
+  TMatrix R(tmp,TMatrix::kMult,Ht); R+=V;
+  
+  R.Invert();  
+  TMatrix K(C,TMatrix::kMult,Ht); K*=R;  
+  TVector  x=newTrack->GetVector();  
+  TVector savex=x;
+  x*=H; x-=m;
+  x*=-1; x*=K; x+=savex;  
+  TMatrix saveC=C;
+  C.Mult(K,tmp); C-=saveC; C*=-1;  
+  newTrack->GetVector()=x;
+  newTrack->GetCMatrix()=C;     
+  TVector res= newTrack->GetVector(); 
+  //cout<<" res = "<<res(0)<<" "<<res(1)<<" "<<res(2)<<" "<<res(3)<<" "<<res(4)<<"\n"; 
+  res*=H; res-=m;   res*=-1.;  
+  TMatrix Cn=newTrack->GetCMatrix();
+  TMatrix tmpn(H,TMatrix::kMult,Cn);
+  TMatrix Rn(tmpn,TMatrix::kMult,Ht);   Rn-=V; Rn*=-1.;
+  
+  Rn.Invert();  
+  TVector r=res;    res*=Rn;
+  Double_t chi2= r*res;        
+        
+  newTrack->SetChi2(newTrack->GetChi2()+chi2);
+   
+} 
+
diff --git a/ITS/AliITStracking.h b/ITS/AliITStracking.h
new file mode 100644 (file)
index 0000000..54f6dfe
--- /dev/null
@@ -0,0 +1,36 @@
+#ifndef ALIITSTRACKING_H
+#define ALIITSTRACKING_H
+
+#include <TObject.h>
+#include <TList.h>
+
+class TObjArray;
+class TVector;
+class TMatrix;
+class AliITStrack;
+class AliITS;
+
+
+class AliITStracking : public TObject {
+
+//Origin  A. Badala' and G.S. Pappalardo:  e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
+   
+  Double_t  Rlayer[6];
+       
+public:
+  
+  AliITStracking() {;}
+
+  AliITStracking(TList *trackITSlist,AliITStrack *reference,AliITS *obj,TObjArray *fpoints,
+                 Double_t Ptref, Int_t **vettid, Bool_t flagvert );
+
+  Int_t NewIntersection(AliITStrack &track, Double_t rk,Int_t layer, Int_t &ladder, Int_t &detector );
+  Double_t PhiDef(Double_t x, Double_t y);
+
+  void KalmanFilter(AliITStrack *newtrack, TVector &cluster, Double_t sigma[2]);  
+  void KalmanFilterVert(AliITStrack *newtrack, TVector &cluster, Double_t sigma[2]);  
+                      
+  ClassDef(AliITStracking,1)
+};
+
+#endif