]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliESDComparisonMI.C
Compatibility changes due to recent changes in the underlying classes.
[u/mrichter/AliRoot.git] / STEER / AliESDComparisonMI.C
index cda53c1364a1937d034139f1e783013c3b551e3c..c17d21d87735bd3d71cf6e8515134ebee7a287a3 100644 (file)
 //
 //
 
-/*
+/* 
 marian.ivanov@cern.ch
 Usage:
-
 
 .L $ALICE_ROOT/STEER/AliGenInfo.C+
 //be sure you created genTracks file before
 .L $ALICE_ROOT/STEER/AliESDComparisonMI.C+
-
 //
-ESDCmpTr *t2 = new ESDCmpTr("genTracks.root","cmpESDTracks.root","galice.root",-1,1,0);
+ESDCmpTr *t2 = new ESDCmpTr("genTracks.root","cmpESDTracks.root","galice.root",-1,0,0);
 t2->Exec();
 
 //
@@ -41,13 +40,14 @@ t2->Exec();
 TCut cprim("cprim","TMath::Sqrt(MC.fVDist[0]**2+MC.fVDist[1]**2)<0.01&&abs(MC.fVDist[2])<0.01")
 //TCut cprim("cprim","TMath::Sqrt(MC.fVDist[0]**2+MC.fVDist[1]**2)<0.5&&abs(MC.fVDist[2])<0.5")
 //TCut citsin("citsin","TMath::Sqrt(MC.fVDist[0]**2+MC.fVDist[1]**2)<3.9");
-TCut citsin("citsin","TMath::Sqrt(MC.fVDist[0]**2+MC.fVDist[1]**2)<15");
-
+TCut citsin("citsin","TMath::Sqrt(MC.fVDist[0]**2+MC.fVDist[1]**2)<5");
 TCut csec("csec","TMath::Sqrt(MC.fVDist[0]**2+MC.fVDist[1]**2)>0.5");
 
 
 TCut crec("crec","fReconstructed==1");
 TCut cteta1("cteta1","abs(MC.fParticle.Theta()/3.1415-0.5)<0.25");
+TCut cteta05("cteta05","abs(MC.fParticle.Theta()/3.1415-0.5)<0.1");
+
 TCut cpos1("cpos1","abs(MC.fParticle.fVz/sqrt(MC.fParticle.fVx*MC.fParticle.fVx+MC.fParticle.fVy*MC.fParticle.fVy))<1");
 TCut csens("csens","abs(sqrt(fVDist[0]**2+fVDist[1]**2)-170)<50");
 TCut cmuon("cmuon","abs(MC.fParticle.fPdgCode==-13)");
@@ -66,19 +66,20 @@ comp.fTree->SetAlias("direction","MC.fParticle.fVx*MC.fParticle.fPx+MC.fParticle
 comp.fTree->SetAlias("decaydir","MC.fTRdecay.fX*MC.fTRdecay.fPx+MC.fTRdecay.fY*MC.fTRdecay.fPy");
 comp.fTree->SetAlias("theta","MC.fTrackRef.Theta()");
 comp.fTree->SetAlias("primdca","sqrt(RC.fITStrack.fD[0]**2+RC.fITStrack.fD[1]**2)");
-
+comp.fTree->SetAlias("trdchi2","fTRDtrack.fChi2/fTRDtrack.fN");
 comp.fTree->SetAlias("trdchi2","fTRDtrack.fChi2/fTRDtrack.fN");
 
+
 TH1F his("his","his",100,0,20);
 TH1F hpools("hpools","hpools",100,-7,7);
 TH1F hfake("hfake","hfake",1000,0,150);
 TProfile profp0("profp0","profp0",20,-0.4,0.9)
 
-comp.DrawLogXY("fTPCinP0[3]","fTPCDelta[4]/fTPCinP1[3]","fReconstructed==1"+cprim,"1",4,0.2,1.5,-0.06,0.06)
+comp.DrawXY("fTPCinP0[3]","fTPCDelta[4]/fTPCinP1[3]","fReconstructed==1"+cprim,"1",4,0.2,1.5,-0.06,0.06)
 comp.fRes->Draw();
 comp.fMean->Draw();  
 
-comp.DrawLogXY("fITSinP0[3]","fITSDelta[4]/fITSinP1[3]","fReconstructed==1&&fITSOn"+cprim,"1",4,0.2,1.5,-0.06,0.06)
+comp.DrawXY("fITSinP0[3]","fITSDelta[4]/fITSinP1[3]","fReconstructed==1&&fITSOn"+cprim,"1",4,0.2,1.5,-0.06,0.06)
 comp.fRes->Draw();
 
 comp.Eff("fTPCinP0[3]","fRowsWithDigits>120"+cteta1+cpos1+cprim,"fTPCOn",20,0.2,1.5)
@@ -94,27 +95,38 @@ comp.fTree->Draw("fESDTrack.fITSsignal/fESDTrack.fTPCsignal","fITSOn&&fTPCOn&&fE
 TH1F his("his","his",100,0,20);
 TH1F hpools("hpools","hpools",100,-7,7);
 
-TH2F * hdedx0 = new TH2F("dEdx0","dEdx0",100, 0,2,200,0,550); hdedx0->SetMarkerColor(2);
-TH2F * hdedx1 = new TH2F("dEdx1","dEdx1",100, 0,2,200,0,550); hdedx1->SetMarkerColor(3);
-TH2F * hdedx2 = new TH2F("dEdx2","dEdx2",100, 0,2,200,0,550); hdedx2->SetMarkerColor(4);
-TH2F * hdedx3 = new TH2F("dEdx3","dEdx3",100, 0,2,200,0,550); hdedx3->SetMarkerColor(6);
+TH2F * hdedx0 = new TH2F("dEdx0","dEdx0",100, 0,2,200,0,550); hdedx0->SetMarkerColor(1);
+TH2F * hdedx1 = new TH2F("dEdx1","dEdx1",100, 0,2,200,0,550); hdedx1->SetMarkerColor(4);
+TH2F * hdedx2 = new TH2F("dEdx2","dEdx2",100, 0,2,200,0,550); hdedx2->SetMarkerColor(3);
+TH2F * hdedx3 = new TH2F("dEdx3","dEdx3",100, 0,2,200,0,550); hdedx3->SetMarkerColor(2);
 
-comp.fTree->Draw("fESDTrack.fITSsignal:MC.fParticle.P()>>dEdx0","fITSOn&&MC.fParticle.P()<2&&abs(fPdg)==211&&fITStrack.fN==6"+cprim) 
-comp.fTree->Draw("fESDTrack.fITSsignal:MC.fParticle.P()>>dEdx1","fITSOn&&MC.fParticle.P()<2&&abs(fPdg)==2212&&fITStrack.fN==6"+cprim) 
-comp.fTree->Draw("fESDTrack.fITSsignal:MC.fParticle.P()>>dEdx2","fITSOn&&MC.fParticle.P()<2&&abs(fPdg)==321&&fITStrack.fN==6"+cprim) 
-comp.fTree->Draw("fESDTrack.fITSsignal:MC.fParticle.P()>>dEdx3","fITSOn&&MC.fParticle.P()<2&&abs(fPdg)==11&&fITStrack.fN==6"+cprim) 
+comp.fTree->Draw("fESDTrack.fITSsignal:MC.fParticle.P()>>dEdx0","fITSOn&&abs(fPdg)==211&&fITStrack.fN==6"+cprim) 
+comp.fTree->Draw("fESDTrack.fITSsignal:MC.fParticle.P()>>dEdx1","fITSOn&&abs(fPdg)==2212&&fITStrack.fN==6"+cprim) 
+comp.fTree->Draw("fESDTrack.fITSsignal:MC.fParticle.P()>>dEdx2","fITSOn&&abs(fPdg)==321&&fITStrack.fN==6"+cprim) 
+comp.fTree->Draw("fESDTrack.fITSsignal:MC.fParticle.P()>>dEdx3","fITSOn&&abs(fPdg)==11&&fITStrack.fN==6"+cprim) 
 
 
-comp.fTree->Draw("fESDTrack.fTRDsignal:MC.fParticle.P()>>dEdx0","fTRDOn&&MC.fParticle.P()<2&&abs(fPdg)==211&&fTRDtrack.fN>40&&abs(fESDTrack.fTRDLabel)==abs(fESDTrack.fTPCLabel)") 
-comp.fTree->Draw("fESDTrack.fTRDsignal:MC.fParticle.P()>>dEdx1","fTRDOn&&MC.fParticle.P()<2&&abs(fPdg)==2212&&fTRDtrack.fN>40&&abs(fESDTrack.fTRDLabel)==abs(fESDTrack.fTPCLabel)") 
-comp.fTree->Draw("fESDTrack.fTRDsignal:MC.fParticle.P()>>dEdx2","fTRDOn&&MC.fParticle.P()<2&&abs(fPdg)==321&&fTRDtrack.fN>40&&abs(fESDTrack.fTRDLabel)==abs(fESDTrack.fTPCLabel)") 
-comp.fTree->Draw("fESDTrack.fTRDsignal:MC.fParticle.P()>>dEdx3","fTRDOn&&MC.fParticle.P()<2&&abs(fPdg)==11&&fTRDtrack.fN>40&&abs(fESDTrack.fTRDLabel)==abs(fESDTrack.fTPCLabel)") 
+comp.fTree->Draw("fESDTrack.fTRDsignal:MC.fParticle.P()>>dEdx0","fTRDOn&&abs(fPdg)==211&&fTRDtrack.fN>40&&fStatus[2]>1") 
+comp.fTree->Draw("fESDTrack.fTRDsignal:MC.fParticle.P()>>dEdx1","fTRDOn&&abs(fPdg)==2212&&fTRDtrack.fN>40&&fStatus[2]>1") 
+comp.fTree->Draw("fESDTrack.fTRDsignal:MC.fParticle.P()>>dEdx2","fTRDOn&&abs(fPdg)==321&&fTRDtrack.fN>40&&fStatus[2]>1") 
+comp.fTree->Draw("fESDTrack.fTRDsignal:MC.fParticle.P()>>dEdx3","fTRDOn&&abs(fPdg)==11&&fTRDtrack.fN>40&&fStatus[2]>1") 
 
+comp.fTree->Draw("fESDTrack.fTPCsignal:fTPCinP0[4]>>dEdx0","fTPCOn&&abs(fPdg)==211&&fESDTrack.fTPCncls>180&&fESDTrack.fTPCsignal>10"+cteta1); 
+comp.fTree->Draw("fESDTrack.fTPCsignal:fTPCinP0[4]>>dEdx1","fTPCOn&&abs(fPdg)==2212&&fESDTrack.fTPCncls>180&&fESDTrack.fTPCsignal>10"+cteta1); 
+comp.fTree->Draw("fESDTrack.fTPCsignal:fTPCinP0[4]>>dEdx2","fTPCOn&&abs(fPdg)==321&&fESDTrack.fTPCncls>180&&fESDTrack.fTPCsignal>10"+cteta1); 
+comp.fTree->Draw("fESDTrack.fTPCsignal:fTPCinP0[4]>>dEdx3","fTPCOn&&abs(fPdg)==11&&fESDTrack.fTPCncls>180&&fESDTrack.fTPCsignal>10"+cteta1); 
 
-hdedx1->Draw(); hdedx0->Draw("same"); hdedx2->Draw("same"); hdedx3->Draw("same");
+hdedx3->SetXTitle("P(GeV/c)");
+hdedx3->SetYTitle("dEdx(unit)");
+hdedx3->Draw(); hdedx1->Draw("same"); hdedx2->Draw("same"); hdedx0->Draw("same");
 
 comp.DrawXY("fITSinP0[3]","fITSPools[4]","fReconstructed==1&&fPdg==-211&&fITSOn"+cprim,"1",4,0.2,1.0,-8,8)
 
+TProfile prof("prof","prof",10,0.5,5);
+
+
+
+
 */
 
 
@@ -166,7 +178,7 @@ comp.DrawXY("fITSinP0[3]","fITSPools[4]","fReconstructed==1&&fPdg==-211&&fITSOn"
 #include "AliESDVertex.h"
 #include "AliExternalTrackParam.h"
 #include "AliESDkink.h"
-#include "AliESDV0MI.h"
+#include "AliESDv0.h"
 
 #endif
 #include "AliGenInfo.h"
@@ -175,6 +187,37 @@ comp.DrawXY("fITSinP0[3]","fITSPools[4]","fReconstructed==1&&fPdg==-211&&fITSOn"
 
 
 
+
+void MakeAliases(AliESDComparisonDraw&comp)
+{
+  //
+  // aliases definition
+  //
+  comp.fTree->SetAlias("radius","TMath::Sqrt(MC.fVDist[0]**2+MC.fVDist[1]**2)");
+  comp.fTree->SetAlias("direction","MC.fParticle.fVx*MC.fParticle.fPx+MC.fParticle.fVy*MC.fParticle.fPy");
+  comp.fTree->SetAlias("decaydir","MC.fTRdecay.fX*MC.fTRdecay.fPx+MC.fTRdecay.fY*MC.fTRdecay.fPy");
+  comp.fTree->SetAlias("theta","MC.fTrackRef.Theta()");
+  comp.fTree->SetAlias("primdca","sqrt(RC.fITStrack.fD[0]**2+RC.fITStrack.fD[1]**2)");
+  comp.fTree->SetAlias("trdchi2","fTRDtrack.fChi2/fTRDtrack.fN");
+  comp.fTree->SetAlias("trdchi2","fTRDtrack.fChi2/fTRDtrack.fN");
+  
+  comp.fTree->SetAlias("trddedx","(RC.fESDTrack.fTRDsignals[0]+RC.fESDTrack.fTRDsignals[1]+RC.fESDTrack.fTRDsignals[2]+RC.fESDTrack.fTRDsignals[3]+RC.fESDTrack.fTRDsignals[4]+RC.fESDTrack.fTRDsignals[5])/6.");
+  
+  comp.fTree->SetAlias("dtofmc2","fESDTrack.fTrackTime[2]-(10^12*MC.fTOFReferences[0].fTime)");
+  comp.fTree->SetAlias("dtofrc2","(fESDTrack.fTrackTime[2]-fESDTrack.fTOFsignal)");
+
+  comp.fTree->SetAlias("psum","fESDTrack.fTOFr[4]+fESDTrack.fTOFr[3]+fESDTrack.fTOFr[2]+fESDTrack.fTOFr[1]+fESDTrack.fTOFr[0]");
+  comp.fTree->SetAlias("P0","fESDTrack.fTOFr[0]/psum");
+  comp.fTree->SetAlias("P1","fESDTrack.fTOFr[1]/psum");
+  comp.fTree->SetAlias("P2","fESDTrack.fTOFr[2]/psum");
+  comp.fTree->SetAlias("P3","fESDTrack.fTOFr[3]/psum");
+  comp.fTree->SetAlias("P4","fESDTrack.fTOFr[4]/psum");
+  comp.fTree->SetAlias("MaxP","max(max(max(P0,P1),max(P2,P3)),P4)");
+}
+
+
+
+
 void  AliESDRecInfo::UpdatePoints(AliESDtrack*track)
 {
   //
@@ -235,12 +278,36 @@ void  AliESDRecInfo::UpdatePoints(AliESDtrack*track)
     fTPCPoints[0]=i;
   }
   //
+  // Density at the last 30 padrows
+  //
+  // 
+  nall  = 0;
+  ngood = 0;
+  for (Int_t i=159;i>0;i--){
+    if (iclusters[i]==-1) continue; //dead zone
+    nall++;
+    if (iclusters[i]>0)   ngood++;
+    if (nall>20) break;
+  }
+  fTPCPoints[4] = Float_t(ngood)/Float_t(nall);
+  //
   if ((track->GetStatus()&AliESDtrack::kITSrefit)>0) fTPCPoints[0]=-1;
+  //
+  //
+  // check TRDPoints
+  /*
+  nclusters=track->GetTRDclusters(iclusters);
+  for (Int_t i=nclusters;i>0;i--){
+    
+  }
+  */
+
+
 }
 
 //
 //
-void AliESDRecInfo::Update(AliMCInfo* info,AliTPCParam * par, Bool_t reconstructed)
+void AliESDRecInfo::Update(AliMCInfo* info,AliTPCParam * /*par*/, Bool_t reconstructed, AliESD *event)
 {
   //
   //
@@ -311,9 +378,23 @@ void AliESDRecInfo::Update(AliMCInfo* info,AliTPCParam * par, Bool_t reconstruct
       fStatus[1] =2;
     }
     else{
-      fStatus[1]=1;
+      if ((fESDTrack.GetStatus()&AliESDtrack::kTPCin)>0)
+       fStatus[1]=1;
+    }      
+  }
+  //
+  if ((fESDTrack.GetStatus()&AliESDtrack::kITSout)>0){
+    fStatus[0] =2;
+  }
+  else{
+    if ((fESDTrack.GetStatus()&AliESDtrack::kITSrefit)>0){
+      fStatus[0] =1;
+    }
+    else{
+      fStatus[0]=0;
     }      
   }
+
   //
   //
   if ((fESDTrack.GetStatus()&AliESDtrack::kTRDrefit)>0){
@@ -344,18 +425,21 @@ void AliESDRecInfo::Update(AliMCInfo* info,AliTPCParam * par, Bool_t reconstruct
     Int_t toflabel[3];
     fESDTrack.GetTOFLabel(toflabel);
     Bool_t toffake=kTRUE;
+    Bool_t tofdaughter=kFALSE;
     for (Int_t i=0;i<3;i++){
-      if (toflabel[i]<0) continue;
+      if (toflabel[i]<0) continue;      
       if (toflabel[i]== TMath::Abs(fESDTrack.GetLabel()))  toffake=kFALSE;     
+      if (toflabel[i]==info->fParticle.GetDaughter(0) || (toflabel[i]==info->fParticle.GetDaughter(1))) tofdaughter=kTRUE;  // decay product of original particle
       fStatus[3]=1;
     }
-    if (toffake) fStatus[3] =2;
+    if (toffake) fStatus[3] =3;       //total fake
+    if (tofdaughter) fStatus[3]=2;    //fake because of decay
   }else{
     fStatus[3]=0;
   }
 
 
-  if (fStatus[1]>0 &&info->fNTPCRef>0){
+  if (fStatus[1]>0 &&info->fNTPCRef>0&&TMath::Abs(fTPCinP0[3])>0.0001){
     //TPC
     fESDTrack.GetInnerXYZ(fTPCinR1);
     fTPCinR1[3] = TMath::Sqrt(fTPCinR1[0]*fTPCinR1[0]+fTPCinR1[1]*fTPCinR1[1]);
@@ -365,14 +449,14 @@ void AliESDRecInfo::Update(AliMCInfo* info,AliTPCParam * par, Bool_t reconstruct
     fTPCinP1[4] = TMath::Sqrt(fTPCinP1[3]*fTPCinP1[3]+fTPCinP1[2]*fTPCinP1[2]);
     //
     //
-    if (fTPCinP1[3]>0.0000001){
+    if (fTPCinP1[3]>0.000000000000001){
       fTPCAngle1[0] = TMath::ATan2(fTPCinP1[1],fTPCinP1[0]);
       fTPCAngle1[1] = TMath::ATan(fTPCinP1[2]/fTPCinP1[3]);  
     }    
-    Double_t cov[15], param[5],x;
+    Double_t cov[15], param[5],x, alpha;
     fESDTrack.GetInnerExternalCovariance(cov);
-    fESDTrack.GetInnerExternalParameters(x,param);
-    //    if (x<50) return 
+    fESDTrack.GetInnerExternalParameters(alpha, x,param);
+    if (x<50) return ;
     //
     fTPCDelta[0] = (fTPCinR0[4]-fTPCinR1[4])*fTPCinR1[3];  //delta rfi
     fTPCPools[0] = fTPCDelta[0]/TMath::Sqrt(cov[0]);
@@ -385,16 +469,16 @@ void AliESDRecInfo::Update(AliMCInfo* info,AliTPCParam * par, Bool_t reconstruct
     fTPCDelta[4] = (fTPCinP0[3]-fTPCinP1[3]);
     Double_t sign = (param[4]>0)? 1.:-1; 
     fSign =sign;
-    fTPCPools[4] = sign*(1./fTPCinP0[3]-1./fTPCinP1[3])/TMath::Sqrt(cov[14]);    
+    fTPCPools[4] = sign*(1./fTPCinP0[3]-1./fTPCinP1[3])/TMath::Sqrt(TMath::Abs(cov[14]));
   }
   if (fITSOn){
     // ITS 
     Double_t param[5],x;
-    //fESDTrack.GetExternalParameters(x,param);   
-    fESDTrack.GetConstrainedExternalParameters(x,param);   
+    fESDTrack.GetExternalParameters(x,param);   
+    //    fESDTrack.GetConstrainedExternalParameters(x,param);   
     Double_t cov[15];
     fESDTrack.GetExternalCovariance(cov);
-    fESDTrack.GetConstrainedExternalCovariance(cov);
+    //fESDTrack.GetConstrainedExternalCovariance(cov);
     if (TMath::Abs(param[4])<0.0000000001) return;
 
     fESDTrack.GetXYZ(fITSinR1);
@@ -437,12 +521,27 @@ void  AliESDRecV0Info::Update(Float_t vertex[3])
     //
     Double_t xd[3],pd[3],signd;
     Double_t xm[3],pm[3],signm;
-    for (Int_t i=0;i<3;i++){
-      xd[i] = fT2.fTPCinR1[i];
-      pd[i] = fT2.fTPCinP1[i];
-      xm[i] = fT1.fTPCinR1[i];
-      pm[i] = fT1.fTPCinP1[i];
+    //
+    //
+    if (fT1.fITSOn&&fT2.fITSOn){
+      for (Int_t i=0;i<3;i++){
+       xd[i] = fT2.fITSinR1[i];
+       pd[i] = fT2.fITSinP1[i];
+       xm[i] = fT1.fITSinR1[i];
+       pm[i] = fT1.fITSinP1[i];
+      }
+    }
+    else{
+      
+      for (Int_t i=0;i<3;i++){
+       xd[i] = fT2.fTPCinR1[i];
+       pd[i] = fT2.fTPCinP1[i];
+       xm[i] = fT1.fTPCinR1[i];
+       pm[i] = fT1.fTPCinP1[i];
+      }
     }
+    //
+    //
     signd =  fT2.fSign<0 ? -1:1;
     signm =  fT1.fSign<0 ? -1:1;
 
@@ -461,10 +560,12 @@ void  AliESDRecV0Info::Update(Float_t vertex[3])
     Double_t delta1=10000,delta2=10000;  
 
     if (points==1){
-      fMinR = TMath::Sqrt(radius[0]);
+      fRs[0] = TMath::Sqrt(radius[0]);
+      fRs[1] = TMath::Sqrt(radius[0]);
     }
     if (points==2){
-      fMinR =TMath::Min(TMath::Sqrt(radius[0]),TMath::Sqrt(radius[1]));
+      fRs[0] =TMath::Min(TMath::Sqrt(radius[0]),TMath::Sqrt(radius[1]));
+      fRs[1] =TMath::Max(TMath::Sqrt(radius[0]),TMath::Sqrt(radius[1]));
     }
     
     if (points>0){
@@ -478,16 +579,19 @@ void  AliESDRecV0Info::Update(Float_t vertex[3])
       dhelix1.LinearDCA(mhelix,phase[1][0],phase[1][1],radius[1],delta2);
     }
     if (points==1){
-      fMinR = TMath::Sqrt(radius[0]);
+      fRs[0] = TMath::Sqrt(radius[0]);
+      fRs[1] = TMath::Sqrt(radius[0]);
       fDistMinR = delta1;
     }
     if (points==2){
       if (radius[0]<radius[1]){
-       fMinR = TMath::Sqrt(radius[0]);
+       fRs[0] = TMath::Sqrt(radius[0]);
+       fRs[1] = TMath::Sqrt(radius[1]);
        fDistMinR = delta1;
       }
       else{
-       fMinR = TMath::Sqrt(radius[1]);
+       fRs[0] = TMath::Sqrt(radius[1]);
+       fRs[1] = TMath::Sqrt(radius[0]);
        fDistMinR = delta2;
       }
     }
@@ -508,6 +612,8 @@ void  AliESDRecV0Info::Update(Float_t vertex[3])
     }
     
     distance2 = TMath::Min(delta1,delta2);
+    if (distance2>100) fDist2 =100;
+    return;
     if (delta1<delta2){
       //get V0 info
       dhelix1.Evaluate(phase[0][0],fXr);
@@ -529,14 +635,12 @@ void  AliESDRecV0Info::Update(Float_t vertex[3])
     if (fDist2<10.5){
       Double_t x,alpha,param[5],cov[15];
       //
-      fT1.fESDTrack.GetInnerExternalParameters(x,param);
+      fT1.fESDTrack.GetInnerExternalParameters(alpha,x,param);
       fT1.fESDTrack.GetInnerExternalCovariance(cov);
-      alpha = fT1.fESDTrack.GetInnerAlpha();
       AliExternalTrackParam paramm(x,alpha,param,cov);
       //
-      fT2.fESDTrack.GetInnerExternalParameters(x,param);
+      fT2.fESDTrack.GetInnerExternalParameters(alpha,x,param);
       fT2.fESDTrack.GetInnerExternalCovariance(cov);
-      alpha = fT2.fESDTrack.GetInnerAlpha();
       AliExternalTrackParam paramd(x,alpha,param,cov);
     }    
     //            
@@ -662,14 +766,12 @@ void  AliESDRecKinkInfo::Update()
     if (fDist2<10.5){
       Double_t x,alpha,param[5],cov[15];
       //
-      fT1.fESDTrack.GetInnerExternalParameters(x,param);
+      fT1.fESDTrack.GetInnerExternalParameters(alpha,x,param);
       fT1.fESDTrack.GetInnerExternalCovariance(cov);
-      alpha = fT1.fESDTrack.GetInnerAlpha();
       AliExternalTrackParam paramm(x,alpha,param,cov);
       //
-      fT2.fESDTrack.GetInnerExternalParameters(x,param);
+      fT2.fESDTrack.GetInnerExternalParameters(alpha,x,param);
       fT2.fESDTrack.GetInnerExternalCovariance(cov);
-      alpha = fT2.fESDTrack.GetInnerAlpha();
       AliExternalTrackParam paramd(x,alpha,param,cov);
       /*
       AliESDkink kink;
@@ -737,7 +839,7 @@ ESDCmpTr::ESDCmpTr(const char* fnGenTracks,
     cerr<<"restricted number of events availaible"<<endl;
   }
   AliMagF * magf = gAlice->Field();
-  AliTracker::SetFieldMap(magf);
+  AliTracker::SetFieldMap(magf,0);
 
 }
 
@@ -853,6 +955,7 @@ Int_t ESDCmpTr::Exec()
    
   fNextTreeGenEntryToRead = 0;
   fNextKinkToRead = 0;
+  fNextV0ToRead   =0;
   cerr<<"fFirstEventNr, fNEvents: "<<fFirstEventNr<<" "<<fNEvents<<endl;
   for (Int_t eventNr = fFirstEventNr; eventNr < fFirstEventNr+fNEvents;
        eventNr++) {
@@ -860,14 +963,14 @@ Int_t ESDCmpTr::Exec()
     SetIO(fEventNr);
     fNParticles = gAlice->GetEvent(fEventNr);    
 
-    fIndexRecTracks = new Int_t[fNParticles*20];  //write at maximum 4 tracks corresponding to particle
-    fIndexRecKinks  = new Int_t[fNParticles*20];  //write at maximum 20 tracks corresponding to particle
-    fIndexRecV0  = new Int_t[fNParticles*20];  //write at maximum 20 tracks corresponding to particle
+    fIndexRecTracks = new Short_t[fNParticles*20];  //write at maximum 4 tracks corresponding to particle
+    fIndexRecKinks  = new Short_t[fNParticles*20];  //write at maximum 20 tracks corresponding to particle
+    fIndexRecV0  = new Short_t[fNParticles*20];  //write at maximum 20 tracks corresponding to particle
 
-    fFakeRecTracks = new Int_t[fNParticles];
-    fMultiRecTracks = new Int_t[fNParticles];
-    fMultiRecKinks = new Int_t[fNParticles];
-    fMultiRecV0 = new Int_t[fNParticles];
+    fFakeRecTracks = new Short_t[fNParticles];
+    fMultiRecTracks = new Short_t[fNParticles];
+    fMultiRecKinks = new Short_t[fNParticles];
+    fMultiRecV0 = new Short_t[fNParticles];
 
     for (Int_t i = 0; i<fNParticles; i++) {
       for (Int_t j=0;j<20;j++){
@@ -978,9 +1081,9 @@ void ESDCmpTr::CreateTreeCmp()
   fRecInfo = new AliESDRecInfo;
   AliESDtrack * esdTrack = new AliESDtrack;
   //  AliITStrackMI * itsTrack = new AliITStrackMI;  
-  fTreeCmp->Branch("MC","AliMCInfo",&fMCInfo);
-  fTreeCmp->Branch("RC","AliESDRecInfo",&fRecInfo);
-  fTreeCmp->Branch("fESDTrack","AliESDtrack",&esdTrack);
+  fTreeCmp->Branch("MC","AliMCInfo",&fMCInfo,256000);
+  fTreeCmp->Branch("RC","AliESDRecInfo",&fRecInfo,256000);
+  //  fTreeCmp->Branch("fESDTrack","AliESDtrack",&esdTrack);
   //  fTreeCmp->Branch("ITS","AliITStrackMI",&itsTrack);
   delete esdTrack;
   //
@@ -988,15 +1091,15 @@ void ESDCmpTr::CreateTreeCmp()
   fTreeCmpKinks    = new TTree("ESDcmpKinks","ESDcmpKinks"); 
   fGenKinkInfo     = new AliGenKinkInfo;
   fRecKinkInfo     = new AliESDRecKinkInfo;
-  fTreeCmpKinks->Branch("MC.","AliGenKinkInfo",&fGenKinkInfo);
-  fTreeCmpKinks->Branch("RC.","AliESDRecKinkInfo",&fRecKinkInfo);
+  fTreeCmpKinks->Branch("MC.","AliGenKinkInfo",&fGenKinkInfo,256000);
+  fTreeCmpKinks->Branch("RC.","AliESDRecKinkInfo",&fRecKinkInfo,256000);
   //
   //
   fTreeCmpV0       = new TTree("ESDcmpV0","ESDcmpV0"); 
   fGenV0Info     = new AliGenV0Info;
   fRecV0Info     = new AliESDRecV0Info;
-  fTreeCmpV0->Branch("MC.","AliGenV0Info",   &fGenV0Info);
-  fTreeCmpV0->Branch("RC.","AliESDRecV0Info",&fRecV0Info);
+  fTreeCmpV0->Branch("MC.","AliGenV0Info",   &fGenV0Info,256000);
+  fTreeCmpV0->Branch("RC.","AliESDRecV0Info",&fRecV0Info,256000);
   //
   fTreeCmp->AutoSave(); 
   fTreeCmpKinks->AutoSave(); 
@@ -1025,7 +1128,7 @@ TVector3 ESDCmpTr::TR2Local(AliTrackReference *trackRef,
   Float_t x[3] = { trackRef->X(),trackRef->Y(),trackRef->Z()};
   Int_t index[4];
   paramTPC->Transform0to1(x,index);
-  paramTPC->Transform1to2(x,index);
+  paramTPC->Transform1to2Ideal(x,index);
   return TVector3(x);
 }
 ////////////////////////////////////////////////////////////////////////
@@ -1041,9 +1144,9 @@ Int_t ESDCmpTr::TreeTLoop()
   //  
   Int_t nEntries = (Int_t)fEvent->GetNumberOfTracks();  
   Int_t nKinks = (Int_t) fEvent->GetNumberOfKinks();
-  Int_t nV0MIs = (Int_t) fEvent->GetNumberOfV0MIs();
-  fSignedKinks = new Int_t[nKinks];
-  fSignedV0    = new Int_t[nV0MIs];
+  Int_t nV0MIs = (Int_t) fEvent->GetNumberOfV0s();
+  fSignedKinks = new Short_t[nKinks];
+  fSignedV0    = new Short_t[nV0MIs];
   //
   // load kinks to the memory
   for (Int_t i=0; i<nKinks;i++){
@@ -1053,7 +1156,7 @@ Int_t ESDCmpTr::TreeTLoop()
   }
   //
   for (Int_t i=0; i<nV0MIs;i++){
-    AliESDV0MI * v0MI =fEvent->GetV0MI(i);
+    AliESDv0 * v0MI =fEvent->GetV0(i);
     fSignedV0[i]=0;
     if (v0MI->fStatus<0) continue;
   }
@@ -1088,7 +1191,6 @@ Int_t ESDCmpTr::TreeTLoop()
     //
     Int_t label0 = TMath::Abs(kink->fLab[0]);
     Int_t label1 = TMath::Abs(kink->fLab[1]);
-
     Int_t absLabel = TMath::Min(label0,label1);
     if (absLabel < fNParticles) {
       if (fMultiRecKinks[absLabel]>0){
@@ -1102,23 +1204,26 @@ Int_t ESDCmpTr::TreeTLoop()
   }  
   // --sort reconstructed V0
   //
-  AliESDV0MI * v0MI=0;
+  AliESDv0 * v0MI=0;
   for (Int_t iEntry=0; iEntry<nV0MIs;iEntry++){
-    v0MI = fEvent->GetV0MI(iEntry);
+    v0MI = fEvent->GetV0(iEntry);
     if (!v0MI) continue;
     //
-    Int_t label0 = TMath::Abs(v0MI->fLab[0]);
-    Int_t label1 = TMath::Abs(v0MI->fLab[1]);
-
-    Int_t absLabel = TMath::Min(label0,label1);
-    if (absLabel < fNParticles) {
-      if (fMultiRecV0[absLabel]>0){
-       if (fMultiRecV0[absLabel]<20)
-         fIndexRecV0[absLabel*20+fMultiRecV0[absLabel]] =  iEntry;     
+    //    Int_t label0 = TMath::Abs(v0MI->fLab[0]);
+    //Int_t label1 = TMath::Abs(v0MI->fLab[1]);
+    //
+    for (Int_t i=0;i<2;i++){
+      // Int_t absLabel = TMath::Min(label0,label1);
+      Int_t absLabel =  TMath::Abs(v0MI->fLab[i]);
+      if (absLabel < fNParticles) {
+       if (fMultiRecV0[absLabel]>0){
+         if (fMultiRecV0[absLabel]<20)
+           fIndexRecV0[absLabel*20+fMultiRecV0[absLabel]] =  iEntry;   
+       }
+       else      
+         fIndexRecV0[absLabel*20] =  iEntry;
+       fMultiRecV0[absLabel]++;
       }
-      else      
-       fIndexRecV0[absLabel*20] =  iEntry;
-      fMultiRecV0[absLabel]++;
     }
   }  
 
@@ -1146,6 +1251,7 @@ Int_t ESDCmpTr::TreeGenLoop(Int_t eventNr)
   TBranch * branch = fTreeCmp->GetBranch("RC");
   branch->SetAddress(&fRecInfo); // set all pointers
   fRecArray = new TObjArray(fNParticles);
+  AliESDtrack dummytrack;  //
 
   while (entry < nParticlesTR) {
     fTreeGenTracks->GetEntry(entry);
@@ -1216,9 +1322,17 @@ Int_t ESDCmpTr::TreeGenLoop(Int_t eventNr)
        }
       }        
       //
-      fRecInfo->fESDTrack =*track; 
+      if (track) {
+       new (&(fRecInfo->fESDTrack)) AliESDtrack(*track);
+      }else{
+       fRecInfo->fESDTrack = dummytrack;
+      }
+      
       if (track->GetITStrack())
        fRecInfo->fITStrack = *((AliITStrackMI*)track->GetITStrack());
+      else{
+       fRecInfo->fITStrack = *track;
+      }
       if (track->GetTRDtrack()){
        fRecInfo->fTRDtrack = *((AliTRDtrack*)track->GetTRDtrack());
       }
@@ -1229,10 +1343,11 @@ Int_t ESDCmpTr::TreeGenLoop(Int_t eventNr)
       fRecInfo->fFake     = fFakeRecTracks[fMCInfo->fLabel];
       fRecInfo->fMultiple = fMultiRecTracks[fMCInfo->fLabel];
       //
-      fRecInfo->Update(fMCInfo,fParamTPC,kTRUE);          
+      fRecInfo->Update(fMCInfo,fParamTPC,kTRUE, fEvent);          
     }
     else{
-      fRecInfo->Update(fMCInfo,fParamTPC,kFALSE);
+      fRecInfo->fESDTrack = dummytrack;
+      fRecInfo->Update(fMCInfo,fParamTPC,kFALSE, fEvent);
     }
     fRecArray->AddAt(new AliESDRecInfo(*fRecInfo),fMCInfo->fLabel);
     fTreeCmp->Fill();
@@ -1300,19 +1415,48 @@ Int_t ESDCmpTr::BuildKinkInfo0(Int_t eventNr)
     if (fMultiRecKinks[label]>0){
 
       //      for (Int_t j=0;j<TMath::Min(fMultiRecKinks[label],100);j++){
-      for (Int_t j=TMath::Min(fMultiRecKinks[label],20)-1;j>=0;j--){
+      for (Int_t j=TMath::Min(fMultiRecKinks[label],Short_t(20))-1;j>=0;j--){
        Int_t index = fIndexRecKinks[label*20+j];
        //AliESDkink *kink2  = (AliESDkink*)fKinks->At(index);
        AliESDkink *kink2  = (AliESDkink*)fEvent->GetKink(index);
        if (TMath::Abs(kink2->fLab[0])==label &&TMath::Abs(kink2->fLab[1])==label2) {
-         kink =kink2;
          fRecKinkInfo->fKinkMultiple++;
          fSignedKinks[index]=1;
+         Int_t c0=0;
+         if (kink){
+           //      if (kink->fTRDOn) c0++;
+           //if (kink->fITSOn) c0++;
+           if (kink->GetStatus(2)>0) c0++;
+           if (kink->GetStatus(0)>0) c0++;
+         }
+         Int_t c2=0;
+         //      if (kink2->fTRDOn) c2++;
+         //if (kink2->fITSOn) c2++;
+         if (kink2->GetStatus(2)>0) c2++;
+         if (kink2->GetStatus(0)>0) c2++;
+
+         if (c2<c0) continue;
+         kink =kink2;
        }
        if (TMath::Abs(kink2->fLab[1])==label &&TMath::Abs(kink2->fLab[0])==label2) {
-         kink =kink2;
          fRecKinkInfo->fKinkMultiple++;
          fSignedKinks[index]=1;
+         Int_t c0=0;
+         if (kink){
+           //if (kink->fTRDOn) c0++;
+           //if (kink->fITSOn) c0++;
+           if (kink->GetStatus(2)>0) c0++;
+           if (kink->GetStatus(0)>0) c0++;
+
+         }
+         Int_t c2=0;
+         //      if (kink2->fTRDOn) c2++;
+         //if (kink2->fITSOn) c2++;
+         if (kink2->GetStatus(2)>0) c2++;
+         if (kink2->GetStatus(0)>0) c2++;
+
+         if (c2<c0) continue;
+         kink =kink2;
        }
       }
     }
@@ -1352,10 +1496,37 @@ Int_t ESDCmpTr::BuildKinkInfo0(Int_t eventNr)
   return 0;
 }
 
+
+
+void   ESDCmpTr::MakePoints(AliESDtrack * track, AliPointsMI &points)
+{
+  //
+  // make points in global coordinate frame
+  //
+  return;
+  /*
+  UInt_t itscl[10];
+  Int_t nits = track->GetITSclusters(itscl);
+  Int_t tpccl[1000];
+  Int_t ntpc = track->GetTPcclusters(tpccl);
+  UInt_t trdcl[1000];
+  Int_t ntrd = track->GetTRDclusters(trdcl);
+  //
+  AliLoader *itsloader = fLoader->GetLoader("ITSLoader");
+  AliLoader *tpcloader = fLoader->GetLoader("TPCLoader");
+  AliLoader *trdloader = fLoader->GetLoader("TRDLoader");
+  //
+  AliITStrackerMI itstracker(); 
+  */
+}
+
+
 ////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////
 
+
+
 Int_t ESDCmpTr::BuildV0Info(Int_t eventNr)
 {
 //
@@ -1403,41 +1574,41 @@ Int_t ESDCmpTr::BuildV0Info(Int_t eventNr)
        //
        // TPC V0 Info
        Double_t x,alpha, param[5],cov[15];
-       fRecV0Info->fT1.fESDTrack.GetInnerExternalParameters(x,param);
-       fRecV0Info->fT1.fESDTrack.GetInnerExternalCovariance(cov);
-       alpha = fRecV0Info->fT1.fESDTrack.GetInnerAlpha();
-       AliExternalTrackParam paramP(x,alpha,param,cov);
-       //
-       fRecV0Info->fT2.fESDTrack.GetInnerExternalParameters(x,param);
-       fRecV0Info->fT2.fESDTrack.GetInnerExternalCovariance(cov);
-       alpha = fRecV0Info->fT2.fESDTrack.GetInnerAlpha();
-       AliExternalTrackParam paramM(x,alpha,param,cov);
-       //
-       fRecV0Info->fV0tpc.SetM(paramM);
-       fRecV0Info->fV0tpc.SetP(paramP);
-       Double_t pid1[5],pid2[5];
-       fRecV0Info->fT1.fESDTrack.GetESDpid(pid1);
-       fRecV0Info->fT1.fESDTrack.GetESDpid(pid2);
-       //
-       fRecV0Info->fV0tpc.UpdatePID(pid1,pid2);
-       fRecV0Info->fV0tpc.Update(vertex);
-       //
-       //
-       fRecV0Info->fT1.fESDTrack.GetExternalParameters(x,param);
-       fRecV0Info->fT1.fESDTrack.GetExternalCovariance(cov);
-       alpha = fRecV0Info->fT1.fESDTrack.GetAlpha();
-       new (&paramP) AliExternalTrackParam(x,alpha,param,cov);
-       //
-       fRecV0Info->fT2.fESDTrack.GetExternalParameters(x,param);
-       fRecV0Info->fT2.fESDTrack.GetExternalCovariance(cov);
-       alpha = fRecV0Info->fT2.fESDTrack.GetAlpha();
-       new (&paramM) AliExternalTrackParam(x,alpha,param,cov);
-       //
-       fRecV0Info->fV0its.SetM(paramM);
-       fRecV0Info->fV0its.SetP(paramP);
-       fRecV0Info->fV0its.UpdatePID(pid1,pid2);
-       fRecV0Info->fV0its.Update(vertex);
-
+       if ( fRecV0Info->fT1.fESDTrack.GetInnerParam() && fRecV0Info->fT2.fESDTrack.GetInnerParam()){
+         fRecV0Info->fT1.fESDTrack.GetInnerExternalParameters(alpha,x,param);
+         fRecV0Info->fT1.fESDTrack.GetInnerExternalCovariance(cov);
+         AliExternalTrackParam paramP(x,alpha,param,cov);
+         //
+         fRecV0Info->fT2.fESDTrack.GetInnerExternalParameters(alpha,x,param);
+         fRecV0Info->fT2.fESDTrack.GetInnerExternalCovariance(cov);
+         AliExternalTrackParam paramM(x,alpha,param,cov);
+         //
+         fRecV0Info->fV0tpc.SetM(paramM);
+         fRecV0Info->fV0tpc.SetP(paramP);
+         Double_t pid1[5],pid2[5];
+         fRecV0Info->fT1.fESDTrack.GetESDpid(pid1);
+         fRecV0Info->fT1.fESDTrack.GetESDpid(pid2);
+         //
+         fRecV0Info->fV0tpc.UpdatePID(pid1,pid2);
+         fRecV0Info->fV0tpc.Update(vertex);
+       
+         //
+         //
+         fRecV0Info->fT1.fESDTrack.GetExternalParameters(x,param);
+         fRecV0Info->fT1.fESDTrack.GetExternalCovariance(cov);
+         alpha = fRecV0Info->fT1.fESDTrack.GetAlpha();
+         new (&paramP) AliExternalTrackParam(x,alpha,param,cov);
+         //
+         fRecV0Info->fT2.fESDTrack.GetExternalParameters(x,param);
+         fRecV0Info->fT2.fESDTrack.GetExternalCovariance(cov);
+         alpha = fRecV0Info->fT2.fESDTrack.GetAlpha();
+         new (&paramM) AliExternalTrackParam(x,alpha,param,cov);
+         //
+         fRecV0Info->fV0its.SetM(paramM);
+         fRecV0Info->fV0its.SetP(paramP);
+         fRecV0Info->fV0its.UpdatePID(pid1,pid2);
+         fRecV0Info->fV0its.Update(vertex);
+       }
       }
       if (TMath::Abs(fGenV0Info->fMCm.fPdg)==11 &&TMath::Abs(fGenV0Info->fMCd.fPdg)==11){
        if (fRecV0Info->fDist2>10){
@@ -1453,17 +1624,18 @@ Int_t ESDCmpTr::BuildV0Info(Int_t eventNr)
  
     Int_t label =  TMath::Min(fGenV0Info->fMCm.fLabel,fGenV0Info->fMCd.fLabel);
     Int_t label2 = TMath::Max(fGenV0Info->fMCm.fLabel,fGenV0Info->fMCd.fLabel);    
-    AliESDV0MI *v0MI=0;
+    AliESDv0 *v0MI=0;
     fRecV0Info->fRecStatus   =0;
     fRecV0Info->fMultiple    = fMultiRecV0[label];
     fRecV0Info->fV0Multiple=0;
     //
-    if (fMultiRecV0[label]>0){
+    if (fMultiRecV0[label]>0 || fMultiRecV0[label2]>0){
 
       //      for (Int_t j=0;j<TMath::Min(fMultiRecV0s[label],100);j++){
-      for (Int_t j=TMath::Min(fMultiRecV0[label],20)-1;j>=0;j--){
+      for (Int_t j=TMath::Min(fMultiRecV0[label],Short_t(20))-1;j>=0;j--){
        Int_t index = fIndexRecV0[label*20+j];
-       AliESDV0MI *v0MI2  = fEvent->GetV0MI(index);
+       if (index<0) continue;
+       AliESDv0 *v0MI2  = fEvent->GetV0(index);
        if (TMath::Abs(v0MI2->fLab[0])==label &&TMath::Abs(v0MI2->fLab[1])==label2) {
          v0MI =v0MI2;
          fRecV0Info->fV0Multiple++;
@@ -1486,10 +1658,10 @@ Int_t ESDCmpTr::BuildV0Info(Int_t eventNr)
   //
   // write fake v0s
 
-  Int_t nV0MIs = fEvent->GetNumberOfV0MIs();
+  Int_t nV0MIs = fEvent->GetNumberOfV0s();
   for (Int_t i=0;i<nV0MIs;i++){
     if (fSignedV0[i]==0){
-      AliESDV0MI *v0MI  = fEvent->GetV0MI(i);
+      AliESDv0 *v0MI  = fEvent->GetV0(i);
       if (!v0MI) continue;
       //
       fRecV0Info->fV0rec = *v0MI;
@@ -1503,6 +1675,7 @@ Int_t ESDCmpTr::BuildV0Info(Int_t eventNr)
        fRecV0Info->fT2 = (*fRecInfo2);
        fRecV0Info->fRecStatus =-1;
       }
+      fRecV0Info->Update(vertex);
       fTreeCmpV0->Fill();
     }
   }
@@ -1510,7 +1683,6 @@ Int_t ESDCmpTr::BuildV0Info(Int_t eventNr)
 
 
   fTreeCmpV0->AutoSave();
-  fRecArray->Delete();
   printf("Time spended in BuilV0Info Loop\n");
   timer.Print();
   if (fDebug > 2) cerr<<"end of BuildV0Info Loop"<<endl;