]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/QA/tasks/AliAnalysisTaskHLT.cxx
changes for Vertex and Tracks classes
[u/mrichter/AliRoot.git] / HLT / QA / tasks / AliAnalysisTaskHLT.cxx
index 271425b22fa1d1bd3c4d04f1b70c8fb772144b14..b3b1fe32ebbd023429135e8cfa58eb6e074021b6 100644 (file)
@@ -16,7 +16,6 @@
 //* provided "as is" without express or implied warranty.                  *
 //**************************************************************************
 
-
 /** @file  AliAnalysisTaskHLT.cxx  
     @author Kalliopi Kanaki, Hege Erdal
     @date 
 class AliAnalysisTask;
 class AliAnalysisManager;
 
+#include "AliAnalysisTaskHLT.h"
+#include "AliHLTGlobalTriggerDecision.h"
 #include "TH1F.h"
 #include "TH2F.h"
-#include "TF1.h"
-#include "TCanvas.h"
-#include "TLegend.h"
-#include "TStyle.h"
 #include "TString.h"
 #include "AliESDEvent.h"
 #include "AliESDtrackCuts.h"
 #include "AliESDInputHandler.h"
 #include "AliTracker.h" 
+#include "AliCentrality.h"
 
-#include "AliAnalysisTaskHLT.h"
+#include "TText.h"
+#include "TTimeStamp.h"
+
+#include <iostream>
 
 ClassImp(AliAnalysisTaskHLT)
 
-//======================================================================================================
+//===============================================================//
 
 AliAnalysisTaskHLT::AliAnalysisTaskHLT()
 :
 AliAnalysisTaskSE()
-  ,fESDOfftrackCuts(0)
-  ,fESDHLTtrackCuts(0)
+  ,fUseHLTTrigger(kFALSE)
+  //,fESDOfftrackCuts(0)
+  //,fESDHLTtrackCuts(0)
   ,fOutputList(0)
-  ,fHistTrigger(0)
-  ,fHistHLTTrigger(0)  
+  //,fHistTrigger(0)
   ,fChargeOff(0)  
   ,fMomentumOff(0)
-  ,fMomentumOffTpc(0)
-  ,fMomentumOffTpcIts(0)       
   ,fDCArOff(0)         
   ,fDCAzOff(0)         
   ,fNclusterOff(0)
-  ,fNclusterOffwCut(0)         
-  ,fdEdxOff(0)         
-  ,fdEdxVSPOff(0)      
+  ,fNITSclusterOff(0)
   ,fPhiOff(0)          
-  ,fThetaOff(0)        
+  ,fEtaOff(0)
   ,fMultOff(0)         
-  ,fXYvertexOff(0)     
   ,fXvertexOff(0)          
   ,fYvertexOff(0)          
   ,fZvertexOff(0)
-  ,fEtaOff(0)
-  ,fEtaMomentumcutOff(0)
-  ,fNclusVSphiOff(0)
-  ,fNclusVSthetaOff(0)
-  ,fStatusOff(0)
-  ,fStatusOff_Ocl(0)
+  ,fSPDXvertexOff(0)       
+  ,fSPDYvertexOff(0)       
+  ,fSPDZvertexOff(0)
   ,fEventSpecieOff(0)
+  ,fV0cent(0)  
   
   ,fChargeHLT(0)
   ,fMomentumHLT(0)
-  ,fMomentumHLTTpc(0)
-  ,fMomentumHLTTpcIts(0)
   ,fDCArHLT(0)  
   ,fDCAzHLT(0)  
-  ,fDCArHLTSG(0)  
-  ,fDCAzHLTSG(0)  
   ,fNclusterHLT(0)
-  ,fNclusterHLTwCut(0)
-  ,fdEdxHLT(0)    
-  ,fdEdxVSPHLT(0)
+  ,fNITSclusterHLT(0)
   ,fPhiHLT(0)     
-  ,fThetaHLT(0)  
+  ,fEtaHLT(0)
+  
+  ,fChargeHLTcut(0)
+  ,fMomentumHLTcut(0)
+  ,fDCArHLTcut(0)  
+  ,fDCAzHLTcut(0)  
+  ,fNclusterHLTcut(0)
+  ,fNITSclusterHLTcut(0)
+  ,fPhiHLTcut(0)     
+  ,fEtaHLTcut(0)
+  
   ,fMultHLT(0)  
-  ,fXYvertexHLT(0)
   ,fXvertexHLT(0)
   ,fYvertexHLT(0)
   ,fZvertexHLT(0)
-  ,fEtaHLT(0)
-  ,fEtaMomentumcutHLT(0)
-  ,fNclusVSphiHLT(0)       
-  ,fNclusVSthetaHLT(0)
-  ,fStatusHLT(0)
-  ,fStatusHLT_Ocl(0)
+  ,fSPDXvertexHLT(0)    
+  ,fSPDYvertexHLT(0)    
+  ,fSPDZvertexHLT(0)
   ,fEventSpecieHLT(0)
-  ,fTrgClsArray(0)
   
-  //     ,fDCArOff_trig(0)
-  //     ,fNclusterOff_trig(0)
-  //     
-  //     ,fDCAHLT_trig(0)
-  //     ,fNclusterHLT_trig(0)
-
+  ,fBeamType()
+  ,fTextBox(0)
+  ,fCuts(0)
+  ,fSwitch(kTRUE)
+  ,fCentrality()
+  ,fEta(0)
+  ,fPt(0)
+  ,fDCAr(0)
+  ,fDCAz(0)
+  ,fVertexZ(0)
 {
-
   // Constructor
   // Define input and output slots here
   // Input slot #0 works with a TChain
   // DefineInput(0, TChain::Class());
   // Output slot #0 writes into a TH1 container
-
-  // DefineOutput(1, TList::Class());
 }
  
-AliAnalysisTaskHLT::AliAnalysisTaskHLT(const char *name)
+AliAnalysisTaskHLT::AliAnalysisTaskHLT(const char *name, float eta, float pt, float DCAr, float DCAz, float vertexZ)
   :
-  AliAnalysisTaskSE(name)    
-  ,fESDOfftrackCuts(0)
-  ,fESDHLTtrackCuts(0)
+  AliAnalysisTaskSE(name) 
+  ,fUseHLTTrigger(kFALSE)   
+  //,fESDOfftrackCuts(0)
+  //,fESDHLTtrackCuts(0)
   ,fOutputList(0)
-  ,fHistTrigger(0)
-  ,fHistHLTTrigger(0)  
+  //,fHistTrigger(0)
   ,fChargeOff(0)  
   ,fMomentumOff(0)
-  ,fMomentumOffTpc(0)
-  ,fMomentumOffTpcIts(0)       
   ,fDCArOff(0) 
   ,fDCAzOff(0) 
   ,fNclusterOff(0)
-  ,fNclusterOffwCut(0) 
-  ,fdEdxOff(0)         
-  ,fdEdxVSPOff(0)      
+  ,fNITSclusterOff(0)
   ,fPhiOff(0)          
-  ,fThetaOff(0)        
+  ,fEtaOff(0)
   ,fMultOff(0)         
-  ,fXYvertexOff(0)     
   ,fXvertexOff(0)          
   ,fYvertexOff(0)          
   ,fZvertexOff(0)
-  ,fEtaOff(0)
-  ,fEtaMomentumcutOff(0)
-  ,fNclusVSphiOff(0)
-  ,fNclusVSthetaOff(0)
-  ,fStatusOff(0)
-  ,fStatusOff_Ocl(0)
   ,fEventSpecieOff(0)
-
+  ,fV0cent(0)  
+  ,fNcontOff(0)
+  
   ,fChargeHLT(0)      
   ,fMomentumHLT(0)
-  ,fMomentumHLTTpc(0)
-  ,fMomentumHLTTpcIts(0)
-  ,fDCArHLTSG(0)  
-  ,fDCAzHLTSG(0)  
   ,fNclusterHLT(0)
-  ,fNclusterHLTwCut(0)
-  ,fdEdxHLT(0)    
-  ,fdEdxVSPHLT(0)
+  ,fNITSclusterHLT(0)
   ,fPhiHLT(0)     
-  ,fThetaHLT(0)  
+  ,fEtaHLT(0)
+  
+  ,fChargeHLTcut(0)      
+  ,fMomentumHLTcut(0)
+  ,fDCArHLTcut(0)  
+  ,fDCAzHLTcut(0)  
+  ,fNclusterHLTcut(0)
+  ,fNITSclusterHLTcut(0)
+  ,fPhiHLTcut(0)     
+  ,fEtaHLTcut(0)
+  
   ,fMultHLT(0)  
-  ,fXYvertexHLT(0)
   ,fXvertexHLT(0)
   ,fYvertexHLT(0)
   ,fZvertexHLT(0)
-  ,fEtaHLT(0)
-  ,fEtaMomentumcutHLT(0)
-  ,fNclusVSphiHLT(0)       
-  ,fNclusVSthetaHLT(0)
-  ,fStatusHLT(0)
-  ,fStatusHLT_Ocl(0)    
   ,fEventSpecieHLT(0)
-  ,fTrgClsArray(0)
-  //     ,fDCArOff_trig(0)
-  //     ,fNclusterOff_trig(0)
-  //     
-  //     ,fDCAHLT_trig(0)
-  //     ,fNclusterHLT_trig(0)
-
-{
+  ,fNcontHLT(0)
+  
+  ,fBeamType()
+  ,fTextBox(0)
+  ,fCuts(0)
+  ,fSwitch(kTRUE)
+  ,fCentrality()
+  ,fEta(eta)
+  ,fPt(pt)
+  ,fDCAr(DCAr)
+  ,fDCAz(DCAz)
+  ,fVertexZ(vertexZ)
+{ 
   // Constructor
   // Define input and output slots here
   // Input slot #0 works with a TChain
@@ -200,23 +186,14 @@ AliAnalysisTaskHLT::AliAnalysisTaskHLT(const char *name)
   DefineOutput(1, TList::Class());
 }
 
-// const Float_t AliAnalysisTaskHLT::fgkEtaMin = -0.12;  
-// const Float_t AliAnalysisTaskHLT::fgkEtaMax =  0.12;  
-// const Float_t AliAnalysisTaskHLT::fgkPhiMin[5]   = {3.83972, 4.18879, 4.53786, 4.88692, 5.23599};  
-// const Float_t AliAnalysisTaskHLT::fgkPhiMax[5]   = {4.18879, 4.53786, 4.88692, 5.23599, 5.58505};  
-// const Float_t AliAnalysisTaskHLT::fgkNormX[5]    = {-0.642788, -0.34202, 0, 0.34202, 0.642788};  
-// const Float_t AliAnalysisTaskHLT::fgkNormY[5]    = {-0.766044, -0.939693, -1, -0.939693, -0.766044};  
-// const Float_t AliAnalysisTaskHLT::fgkInitPosX[5] = {-295.682, -157.329, 0, 157.329, 295.682};  
-// const Float_t AliAnalysisTaskHLT::fgkInitPosY[5] = {-352.38, -432.259, -460, -432.259, -352.38};
-
-//----------------------------------------------------------------------------------------------------
+//------------------------------------------------------------------------//
 
 void AliAnalysisTaskHLT::UserCreateOutputObjects(){
   // Create histograms
 
   OpenFile(1);
-
   fOutputList = new TList();
+  fOutputList->SetOwner();
   fOutputList->SetName(GetName());
 
   /*
@@ -242,689 +219,357 @@ void AliAnalysisTaskHLT::UserCreateOutputObjects(){
   (fHistTrigger->GetXaxis())->SetBinLabel(8,"onlTrkThruCE"); 
   */
 
-  fHistTrigger = new TH1F("fHistTrigger", "CTP trigger counter",21 , 0, 21);
-  fHistTrigger->GetXaxis()->SetTitle("");  
-  fHistTrigger->GetYaxis()->SetTitle("#Events"); 
-
-  fHistHLTTrigger = new TH1F("fHistHLTTrigger", "HLT CTP trigger counter", 21, 0, 21); 
-  fHistHLTTrigger->GetXaxis()->SetTitle("");
-  fHistHLTTrigger->GetYaxis()->SetTitle("#Events");
+  //fHistTrigger = new TH1F("fHistTrigger", "CTP trigger counter", 24, 0, 24);
+  //fHistTrigger->GetXaxis()->SetTitle("");  
+  //fHistTrigger->GetYaxis()->SetTitle("#Events"); 
+
+  //=========== event properties =================//
+
+  if(fBeamType.Contains("Pb")){
+     fMultOff  = new TH1F("fMult_off", "",200,0,2000);
+     fMultHLT  = new TH1F("fMult_hlt", "TPC track multiplicity",200,0,2000); fMultHLT->SetXTitle("TPC track multiplicity");  
+     fNcontOff = new TH1F("fNcont_off","",200,0,2000);
+     fNcontHLT = new TH1F("fNcont_hlt","# of contributors",200,0,2000); fNcontHLT->SetXTitle("# of contributors");  
+     fV0cent   = new TH1F("fV0cent",   "V0 centrality",    100,0, 100); fV0cent->SetXTitle("V0 centrality");
+  } 
+  else {
+     fMultOff = new TH1F("fMult_off","",200,0,200);
+     fMultHLT = new TH1F("fMult_hlt","TPC track multiplicity",200,0,200); fMultHLT->SetXTitle("TPC track multiplicity");     
+     fNcontOff = new TH1F("fNcont_off","",200,0,200);
+     fNcontHLT = new TH1F("fNcont_hlt","# of contributors",200,0,200); fNcontHLT->SetXTitle("# of contributors");
+  }
+   
+  fXvertexOff = new TH1F("fXvertex_off","",200,-0.5,0.5);
+  fXvertexHLT = new TH1F("fXvertex_hlt","X primary vertex",200,-0.5,0.5); fXvertexHLT->SetXTitle("x (cm)");
+  fYvertexOff = new TH1F("fYvertex_off","",200,-0.5,0.5);
+  fYvertexHLT = new TH1F("fYvertex_hlt","Y primary vertex",200,-0.5,0.5); fYvertexHLT->SetXTitle("y (cm)");
+  fZvertexOff = new TH1F("fZvertex_off","",100,-20,20);
+  fZvertexHLT = new TH1F("fZvertex_hlt","Z primary vertex",100,-20,20); fZvertexHLT->SetXTitle("z (cm)");
 
-  fChargeOff = new TH1F("fCharge_off", "Charge distribution (Offline)", 12, -3, 3);  
-  fChargeHLT = new TH1F("fCharge_hlt", "Charge distribution (HLT)", 12, -3, 3);  
-  
-  fMomentumOff = new TH1F("fMomentum_off", "momentum (offline)",1000, 0., 100);
-  fMomentumHLT = new TH1F("fMomentum_hlt", "momentum (HLT)",    1000, 0., 100);
+  fSPDXvertexOff = new TH1F("fSPDXvertex_off","",200,-0.5,0.5);
+  fSPDXvertexHLT = new TH1F("fSPDXvertex_hlt","X SPD primary vertex",200,-0.5,0.5); fSPDXvertexHLT->SetXTitle("x (cm)");
+  fSPDYvertexOff = new TH1F("fSPDYvertex_off","",200,-0.5,0.5);
+  fSPDYvertexHLT = new TH1F("fSPDYvertex_hlt","Y SPD primary vertex",200,-0.5,0.5); fSPDYvertexHLT->SetXTitle("y (cm)");
+  fSPDZvertexOff = new TH1F("fSPDZvertex_off","",100,-20,20);
+  fSPDZvertexHLT = new TH1F("fSPDZvertex_hlt","Z SPD primary vertex",100,-20,20); fSPDZvertexHLT->SetXTitle("z (cm)");
+    
+  fEventSpecieOff = new TH1F("fEventSpecie_off","",18, 0, 18);
+  fEventSpecieHLT = new TH1F("fEventSpecie_hlt","event species",18, 0, 18);
 
-  fMomentumOffTpc = new TH1F("fMomentumTpc_off","Momentum for kTPCin (offline)",100,-3,3);
-  fMomentumHLTTpc = new TH1F("fMomentumTpc_hlt","Momentum for kTPCin (HLT)",    100,-3,3);
+  //============== track properties =================//
 
-  fMomentumOffTpcIts = new TH1F("fMomentumTpcIts_off","Momentum for kTPCin && kITSin (offline)",100,-3,3);
-  fMomentumHLTTpcIts = new TH1F("fMomentumTpcIts_hlt","Momentum for kTPCin && kITSin (HLT)",    100,-3,3);
+  fChargeOff = new TH1F("fCharge_off", "", 3, -1.5, 1.5);  
+  fChargeHLT = new TH1F("fCharge_hlt", "charge distribution", 3, -1.5, 1.5); fChargeHLT->SetXTitle("polarity");
+  
+  fMomentumOff = new TH1F("fMomentum_off", "", 100, 0, 10);
+  fMomentumHLT = new TH1F("fMomentum_hlt", "transverse momentum", 100, 0, 10); fMomentumHLT->SetXTitle("p_{T} (GeV/c)");
  
-  fDCArOff   = new TH1F("fDCA_off",  "DCAr to beam line (offline)",200, -100, 100);
-  fDCArHLT   = new TH1F("fDCA_hlt",  "DCAr to beam line (HLT)",    200, -100, 100);
-  fDCArHLTSG = new TH1F("fDCA_hltSG","DCAr to beam line (HLT)",    200, -100, 100);
+  fDCArOff = new TH1F("fDCAr_off", "", 200, -15, 15);
+  fDCArHLT = new TH1F("fDCAr_hlt", "DCAr", 200, -15, 15); fDCArHLT->SetXTitle("DCAr (cm)");
 
-  fDCAzOff   = new TH1F("fDCAz_off",  "DCAz to beam line (offline)",200, -20, 20);
-  fDCAzHLT   = new TH1F("fDCAz_hlt",  "DCAz to beam line (HLT)",    200, -20, 20);
-  fDCAzHLTSG = new TH1F("fDCAz_hltSG","DCAz to beam line (HLT)",    200, -20, 20);
-  fNclusterOff = new TH1F("fNcluster_off","clusters per track (offline)", 200, 0, 200);
-  fNclusterHLT = new TH1F("fNcluster_hlt","clusters per track (HLT)",     200, 0, 200);
+  fDCAzOff = new TH1F("fDCAz_off", "", 200, -15, 15);
+  fDCAzHLT = new TH1F("fDCAz_hlt", "DCAz", 200, -15, 15); fDCAzHLT->SetXTitle("DCAz (cm)");
  
-  fNclusterOffwCut = new TH1F("fNcluster_wcut_off","clusters per track with cuts (offline)", 200, 0, 200);
-  fNclusterHLTwCut = new TH1F("fNcluster_wcut_hlt","clusters per track with cuts (HLT)",     200, 0, 200);
-  fdEdxOff = new TH1F("fdEdx_off","energy loss (offline)",             500, 0, 500);
-  fdEdxHLT = new TH1F("fdEdx_hlt","energy loss (HLT) - not filled yet",500, 0, 500);
+  fNclusterOff = new TH1F("fNcluster_off","", 200, 0, 200);
+  fNclusterHLT = new TH1F("fNcluster_hlt","TPC clusters/track", 200, 0, 200); fNclusterHLT->SetXTitle("TPC clusters/track");
+
+  fNITSclusterOff = new TH1F("fNITScluster_off","", 10, 0, 10);
+  fNITSclusterHLT = new TH1F("fNITScluster_hlt","ITS clusters/track", 10, 0, 10); fNITSclusterHLT->SetXTitle("ITS clusters/track");
  
-  fdEdxVSPOff = new TH2F("fdEdx_vs_P_off","dE/dx vs. momentum (offline)",             300, 0., 3., 500, 0., 500.);
-  fdEdxVSPHLT = new TH2F("fdEdx_vs_P_hlt","dE/dx vs. momentum (HLT) - not filled yet",300, 0., 3., 500, 0., 500.);
+  fPhiOff = new TH1F("fPhi_off","",90,0,360);
+  fPhiHLT = new TH1F("fPhi_hlt","azimuthal angle",90,0,360); fPhiHLT->SetXTitle("#phi (deg)");
 
-  fPhiOff = new TH1F("fPhi_off","azimuthal angle distribution (offline)",90,0,360);
-  fPhiHLT = new TH1F("fPhi_hlt","azimuthal angle distribution (HLT)",    90,0,360);
+  fEtaOff = new TH1F("fEta_off","",100,-2,2);
+  fEtaHLT = new TH1F("fEta_hlt","pseudorapidity",100,-2,2); fEtaHLT->SetXTitle("#eta");
   
-  fThetaOff = new TH1F("fTheta_off","polar angle distribution (offline)",180,0,180);
-  fThetaHLT = new TH1F("fTheta_hlt","polar angle distribution (HLT)",    180,0,180);
+  fChargeHLTcut      = new TH1F("fCharge_hltcut",     "",  3, -1.5, 1.5);  fChargeHLTcut->SetXTitle("polarity");   
+  fMomentumHLTcut    = new TH1F("fMomentum_hltcut",   "",100,    0,  10);  fMomentumHLTcut ->SetXTitle("p_{T} (GeV/c)");  
+  fDCArHLTcut        = new TH1F("fDCAr_hltcut",       "",200,  -15,  15);  fDCArHLTcut->SetXTitle("DCAr (cm)");       
+  fDCAzHLTcut        = new TH1F("fDCAz_hltcut",       "",200,  -15,  15);  fDCAzHLTcut->SetXTitle("DCAz (cm)");      
+  fNclusterHLTcut    = new TH1F("fNcluster_hltcut",   "",200,    0, 200);  fNclusterHLTcut->SetXTitle("TPC clusters/track");   
+  fNITSclusterHLTcut = new TH1F("fNITScluster_hltcut","", 10,    0,  10);  fNITSclusterHLTcut->SetXTitle("ITS clusters/track");
+  fPhiHLTcut         = new TH1F("fPhi_hltcut",        "", 90,    0, 360);  fPhiHLTcut->SetXTitle("#phi (deg)");    
+  fEtaHLTcut         = new TH1F("fEta_hltcut",        "",100,   -2,   2);  fEtaHLTcut->SetXTitle("#eta");           
+
+  //--------------------------------------------------//
   
-  fMultOff = new TH1F("fMult_off","track multiplicity (offline)",150,0,15000);
-  fMultHLT = new TH1F("fMult_hlt","track multiplicity (HLT)",    150,0,15000);
-  fXYvertexOff = new TH2F("fXYvertex_off","XY primary vertex (offline)",100,-5,5,100,-5,5);
-  fXYvertexHLT = new TH2F("fXYvertex_hlt","XY primary vertex (HLT)",    100,-5,5,100,-5,5);
+  fTextBox = new TText(); 
+  fCuts = new TText(); 
+  fCuts->SetName("cuts");
+  TString s = Form("|#eta|<%2g, p_{T}>%2g, |DCAr|<%2g, |DCAz|<%2g, |vertexZ|<%2g", TMath::Abs(fEta), TMath::Abs(fPt), TMath::Abs(fDCAr), TMath::Abs(fDCAz),TMath::Abs(fVertexZ));
+  fCuts->SetTitle(s);  
   
-  fXvertexOff = new TH1F("fXvertex_off","X primary vertex (offline)",500,-5,5);
-  fXvertexHLT = new TH1F("fXvertex_hlt","X primary vertex (HLT)",    500,-5,5);
-  fYvertexOff = new TH1F("fYvertex_off","Y primary vertex (offline)",500,-5,5);
-  fYvertexHLT = new TH1F("fYvertex_hlt","Y primary vertex (HLT)",    500,-5,5);
-  fZvertexOff = new TH1F("fZvertex_off","Z primary vertex (offline)",250,-30,30);
-  fZvertexHLT = new TH1F("fZvertex_hlt","Z primary vertex (HLT)",    250,-30,30);
+  //fOutputList->Add(fHistTrigger);
+  fOutputList->Add(fChargeOff);          fOutputList->Add(fChargeHLT);       fOutputList->Add(fChargeHLTcut);  
+  fOutputList->Add(fMomentumOff);        fOutputList->Add(fMomentumHLT);     fOutputList->Add(fMomentumHLTcut); 
+  fOutputList->Add(fDCArOff);            fOutputList->Add(fDCArHLT);         fOutputList->Add(fDCArHLTcut);     
+  fOutputList->Add(fDCAzOff);            fOutputList->Add(fDCAzHLT);         fOutputList->Add(fDCAzHLTcut);     
+  fOutputList->Add(fNclusterOff);        fOutputList->Add(fNclusterHLT);     fOutputList->Add(fNclusterHLTcut);         
+  fOutputList->Add(fNITSclusterOff);     fOutputList->Add(fNITSclusterHLT);  fOutputList->Add(fNITSclusterHLTcut);  
+  fOutputList->Add(fPhiOff);             fOutputList->Add(fPhiHLT);          fOutputList->Add(fPhiHLTcut);
+  fOutputList->Add(fEtaOff);             fOutputList->Add(fEtaHLT);          fOutputList->Add(fEtaHLTcut);
   
-  fEtaOff = new TH1F("fEta_off","pseudorapidity (offline)",100,-2,2);
-  fEtaHLT = new TH1F("fEta_hlt","pseudorapidity (HLT)",    100,-2,2);
-  fEtaMomentumcutOff = new TH1F("fEtaMomentumcut_off","pseudorapidity DCAcut (offline)",100,-2,2);
-  fEtaMomentumcutHLT = new TH1F("fEtaMomentumcut_hlt","pseudorapidity DCAcut (HLT)",    100,-2,2);
-
-  fNclusVSphiOff = new TH2F("fNclus_vs_phi_off","clusters per track vs. #phi (offline)",360,0,360,160,0,160);
-  fNclusVSphiHLT = new TH2F("fNclus_vs_phi_hlt","clusters per track vs. #phi (HLT)",    360,0,360,160,0,160);
-  
-  fNclusVSthetaOff = new TH2F("fNclus_vs_theta_off","clusters per track vs. #theta (offline)",180,0,180,160,0,160);
-  fNclusVSthetaHLT = new TH2F("fNclus_vs_theta_hlt","clusters per track vs. #theta (HLT)",    180,0,180,160,0,160);
-
-  fStatusOff = new TH1F("fStatus_off", "Status for different detectors (offline)",12, 0, 12);
-  fStatusHLT = new TH1F("fStatus_hlt", "Status for different detectors (HLT)",    12, 0, 12);
+  fOutputList->Add(fMultOff);            fOutputList->Add(fMultHLT);    
+  fOutputList->Add(fXvertexOff);         fOutputList->Add(fXvertexHLT);  
+  fOutputList->Add(fYvertexOff);         fOutputList->Add(fYvertexHLT);  
+  fOutputList->Add(fZvertexOff);         fOutputList->Add(fZvertexHLT);    
+  fOutputList->Add(fSPDXvertexOff);      fOutputList->Add(fSPDXvertexHLT);  
+  fOutputList->Add(fSPDYvertexOff);      fOutputList->Add(fSPDYvertexHLT);  
+  fOutputList->Add(fSPDZvertexOff);      fOutputList->Add(fSPDZvertexHLT);    
+  fOutputList->Add(fEventSpecieOff);     fOutputList->Add(fEventSpecieHLT);  
+  fOutputList->Add(fNcontOff);           fOutputList->Add(fNcontHLT);  
   
-  fStatusOff_Ocl = new TH1F("fStatus_Ocl_off", "Status for different detectors when #TPCcl=0 (offline)",12, 0, 12);
-  fStatusHLT_Ocl = new TH1F("fStatus_Ocl_hlt", "Status for different detectors when #TPCcl=0 (HLT)",    12, 0, 12);
-
-  fEventSpecieOff = new TH1F("fEventSpecie_off","Eventspecie for Offline",18, 0, 18);
-  fEventSpecieHLT = new TH1F("fEventSpecie_hlt","Eventspecie for HLT",18, 0, 18);
-
-
-  //---------------------- add histograms to the output TList ------------------//
-
-  fOutputList->Add(fHistTrigger);
-  fOutputList->Add(fHistHLTTrigger);
-
-  fOutputList->Add(fChargeOff);
-  fOutputList->Add(fMomentumOff);
-  fOutputList->Add(fMomentumOffTpc);
-  fOutputList->Add(fMomentumOffTpcIts);
-  fOutputList->Add(fDCArOff);    
-  fOutputList->Add(fDCAzOff);    
-  fOutputList->Add(fNclusterOff);
-  fOutputList->Add(fNclusterOffwCut);
-  fOutputList->Add(fdEdxOff);    
-  fOutputList->Add(fdEdxVSPOff);
-  fOutputList->Add(fPhiOff);     
-  fOutputList->Add(fThetaOff);    
-  fOutputList->Add(fMultOff);
-  fOutputList->Add(fXYvertexOff); 
-  fOutputList->Add(fXvertexOff);  
-  fOutputList->Add(fYvertexOff);  
-  fOutputList->Add(fZvertexOff);  
-  fOutputList->Add(fEtaOff);  
-  fOutputList->Add(fEtaMomentumcutOff);
-  fOutputList->Add(fNclusVSphiOff);  
-  fOutputList->Add(fNclusVSthetaOff);
-  fOutputList->Add(fStatusOff);
-  fOutputList->Add(fStatusOff_Ocl);
-  fOutputList->Add(fEventSpecieOff);
-
-  fOutputList->Add(fChargeHLT);  
-  fOutputList->Add(fMomentumHLT); 
-  fOutputList->Add(fMomentumHLTTpc);  
-  fOutputList->Add(fMomentumHLTTpcIts);
-  fOutputList->Add(fDCArHLT);    
-  fOutputList->Add(fDCAzHLT);    
-  fOutputList->Add(fDCArHLTSG);          
-  fOutputList->Add(fDCAzHLTSG);          
-  fOutputList->Add(fNclusterHLT); 
-  fOutputList->Add(fNclusterHLTwCut); 
-  fOutputList->Add(fdEdxHLT);    
-  fOutputList->Add(fdEdxVSPHLT);
-  fOutputList->Add(fPhiHLT);     
-  fOutputList->Add(fThetaHLT);    
-  fOutputList->Add(fMultHLT);   
-  fOutputList->Add(fXYvertexHLT); 
-  fOutputList->Add(fXvertexHLT);  
-  fOutputList->Add(fYvertexHLT);  
-  fOutputList->Add(fZvertexHLT);    
-  fOutputList->Add(fEtaHLT);  
-  fOutputList->Add(fEtaMomentumcutHLT);    
-  fOutputList->Add(fNclusVSphiHLT);  
-  fOutputList->Add(fNclusVSthetaHLT);
-  fOutputList->Add(fStatusHLT);
-  fOutputList->Add(fStatusHLT_Ocl);
-  fOutputList->Add(fEventSpecieHLT);
-
-  SetupESDtrackCuts();
-}
-
-void AliAnalysisTaskHLT::NotifyRun(){
-  // This will not work if the active trigger classes change from run to run.
-  // Then one has to know all trigger classes before processing the data.
-
-  AliESDEvent *esdOFF = dynamic_cast<AliESDEvent*>(InputEvent());
-  TString trgClasses = esdOFF->GetESDRun()->GetActiveTriggerClasses(); 
+  fOutputList->Add(fTextBox);
+  fOutputList->Add(fCuts);
+  if(fBeamType.Contains("Pb")) fOutputList->Add(fV0cent);
  
-  fTrgClsArray = trgClasses.Tokenize(" ");
-     
-  for(Int_t i=0; i<fTrgClsArray->GetEntries(); i++){ 
-    TString str = ((TObjString *)fTrgClsArray->At(i))->GetString(); 
-    (fHistTrigger->GetXaxis())->SetBinLabel(i+1, str.Data()); 
-    (fHistHLTTrigger->GetXaxis())->SetBinLabel(i+1, str.Data()); 
-  }   
-  esdOFF = NULL;
-
-  TString Statusnames[12]={"kTPCin",
-                          "kITSin",
-                          "kTPCout",
-                          "kITSout",
-                          "kITSrefit",
-                          "kTPCrefit",
-                          "kTRDin",
-                          "kTRDout",
-                          "kTRDrefit",
-                          "kTOFin",
-                          "kTOFout",
-                          "kTOFrefit"};
-
-  for(int iii=0;iii<12;iii++){
-    (fStatusHLT->GetXaxis())->SetBinLabel(iii+1,Statusnames[iii]);
-    (fStatusOff->GetXaxis())->SetBinLabel(iii+1,Statusnames[iii]);
-    (fStatusHLT_Ocl->GetXaxis())->SetBinLabel(iii+1,Statusnames[iii]);
-    (fStatusOff_Ocl->GetXaxis())->SetBinLabel(iii+1,Statusnames[iii]);
-  }
-
+  //SetupESDtrackCuts();
+  PostData(1, fOutputList);
 }
 
 void AliAnalysisTaskHLT::UserExec(Option_t *){
   // see header file of AliAnalysisTask for documentation
 
-  AliESDEvent *esdOFF = dynamic_cast<AliESDEvent*>(InputEvent());
-  
+  AliESDEvent *esdOFF = dynamic_cast<AliESDEvent*>(InputEvent());  
   if(!esdOFF){
-        Printf("ERROR: fESD not available");
-    return;
+     printf("Error:UserExec OFF esd not available\n");
+     return;
   }
-  
+  if(esdOFF->GetEventSpecie()==16) return; // skip calibration events, HLT doesn't set this flag yet
+
   AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*>(fInputHandler);
+  if(!esdH){
+     printf("The ESD input handler is empty\n");
+     return;
+  }
+  
   AliESDEvent *esdHLT = NULL;   
-  if(esdH) esdHLT = esdH->GetHLTEvent();
-    
+  if(esdH) esdHLT = esdH->GetHLTEvent();   
   if(!esdHLT){
-    Printf("ERROR: HLTesd not available");
-    return;
+     printf("Error:UserExec HLT esd not available\n");
+     return;
   }
-
-  
-  //Fill CTP Trigger stuff
-  //fHistTrigger->Fill(esdOFF->GetTriggerMask());
  
-
-  for(Int_t i=0; i<fTrgClsArray->GetEntries(); i++){
-    if((esdOFF->GetFiredTriggerClasses()).Contains(((TObjString *)fTrgClsArray->At(i))->GetString()))// && esdOFF->GetEventSpecie()==16)  
-      fHistTrigger->Fill(i);
-    if((esdHLT->GetFiredTriggerClasses()).Contains(((TObjString *)fTrgClsArray->At(i))->GetString()))// && esdOFF->GetEventSpecie()==16)  
-      fHistHLTTrigger->Fill(i);
+  if(fSwitch==kTRUE){  
+     TTimeStamp *timestamp = new TTimeStamp(esdHLT->GetTimeStamp());
+     fTextBox->SetName("text");
+     TString s = Form("Run %d, Date %d", esdHLT->GetRunNumber(), timestamp->GetDate());
+     printf("You are analyzing run %d from date %d\n\n", esdHLT->GetRunNumber(), timestamp->GetDate());
+     fTextBox->SetTitle(s);
+     fSwitch=kFALSE;
   }
 
-
-  Double_t DCAcut = 7.0;
-  Double_t Momcut= 0.3;
-
-  char Titlename[100];
-  sprintf(Titlename,"pseudorapidity (HLT), DCA cut = %f,\n Momentum cut = %f, TPC clusters > 70" , DCAcut, Momcut);
-  fEtaMomentumcutHLT->SetTitle(Titlename);
-  sprintf(Titlename,"pseudorapidity (offline), DCA cut = %f, Momentum cut = %f, TPC clusters > 70", DCAcut, Momcut);
-  fEtaMomentumcutOff->SetTitle(Titlename);
-
-  Double_t bfield = esdOFF->GetMagneticField();
+  //Double_t bfield = esdOFF->GetMagneticField();
  
-  UInt_t Statusnames[12]={AliESDtrack::kTPCin,
-                         AliESDtrack::kITSin,
-                         AliESDtrack::kTPCout,
-                         AliESDtrack::kITSout,
-                         AliESDtrack::kITSrefit,
-                         AliESDtrack::kTPCrefit,
-                         AliESDtrack::kTRDin,
-                         AliESDtrack::kTRDout,
-                         AliESDtrack::kTRDrefit,
-                         AliESDtrack::kTOFin,
-                         AliESDtrack::kTOFout,
-                         AliESDtrack::kTOFrefit};
+//   UInt_t Statusnames[12]={AliESDtrack::kTPCin,
+//                       AliESDtrack::kITSin,
+//                       AliESDtrack::kTPCout,
+//                       AliESDtrack::kITSout,
+//                       AliESDtrack::kITSrefit,
+//                       AliESDtrack::kTPCrefit,
+//                       AliESDtrack::kTRDin,
+//                       AliESDtrack::kTRDout,
+//                       AliESDtrack::kTRDrefit,
+//                       AliESDtrack::kTOFin,
+//                       AliESDtrack::kTOFout,
+//                       AliESDtrack::kTOFrefit};
   
 
 
   //---------------- HLT ESD tree -----------------------//
 
-  Int_t nr_tracksHLT=0;         
-  Double_t vertexHLT[3];
-
-  const AliESDVertex *vertHLT=esdHLT->GetPrimaryVertexTracks();
+  Int_t nr_tracksHLT = 0;       
+  const AliESDVertex *vertHLT = esdHLT->GetPrimaryVertexTracks();
 
-  vertexHLT[0] = vertHLT->GetX();
-  vertexHLT[1] = vertHLT->GetY();
-  vertexHLT[2] = vertHLT->GetZ();
-  AliVertex *primVertexHLT = new AliVertex(vertexHLT, 0., 0);
-
-  Bool_t testVertexHLT=kTRUE;
-  Int_t nr_contributorsHLT= vertHLT->GetNContributors();
-
-  if(nr_contributorsHLT<1) {
-    // SPD vertex
-    vertHLT = esdHLT->GetPrimaryVertexSPD();
-    if(nr_contributorsHLT<1) {
-      // NO GOOD VERTEX, SKIP EVENT 
-      testVertexHLT=kFALSE;
-    }
-  }
-  if(testVertexHLT){
-    fXYvertexHLT->Fill(vertHLT->GetX(), vertHLT->GetY() );
+  if(vertHLT->GetStatus()==kTRUE){
     fXvertexHLT->Fill( vertHLT->GetX() );
     fYvertexHLT->Fill( vertHLT->GetY() );
     fZvertexHLT->Fill( vertHLT->GetZ() );
+    
+    fSPDXvertexHLT->Fill(esdHLT->GetPrimaryVertexSPD()->GetX());
+    fSPDYvertexHLT->Fill(esdHLT->GetPrimaryVertexSPD()->GetY());
+    fSPDZvertexHLT->Fill(esdHLT->GetPrimaryVertexSPD()->GetZ());
+    
+    fNcontHLT->Fill(vertHLT->GetNContributors());
   }
-  //At the moment no constrains on vertex before filling histograms
-  //Should be changed. 
-  if(1){
-   //if( vertHLT && vertHLT->GetNContributors() >= 5 && (TMath::Abs(vertHLT->GetZ())<5.5) ){
 
-    fEventSpecieHLT->Fill(esdHLT->GetEventSpecie());
+  fEventSpecieHLT->Fill(esdHLT->GetEventSpecie());
 
-    for(Int_t i=0; i<esdHLT->GetNumberOfTracks(); i++){ 
+  for(Int_t i=0; i<esdHLT->GetNumberOfTracks(); i++){ 
   
-      AliESDtrack *esdtrackHLT = esdHLT->GetTrack(i); 
-      if(!esdtrackHLT){
-       continue;
-      }
-
-      //Fill which status flags that are set for an event
-      for(int jjj=0;jjj<12;jjj++){
-       if(esdtrackHLT->GetStatus()&Statusnames[jjj]) {
-         fStatusHLT->Fill(jjj);
-         if(esdtrackHLT->GetTPCNcls()==0) fStatusHLT_Ocl->Fill(jjj);
-       }
-      } 
-
-      //reject laser events -> Use offline info (HLT do not set this flag)
-      if((esdOFF->GetEventSpecie()==16)) continue;
-
-      //This condition is mostly affecting Offline->will cut away tracks that are counted twice 
-      //With both kITSin and kTPCin flags set.
-      if(!(esdtrackHLT->GetStatus()&AliESDtrack::kTPCin)) continue;
-
-      //ESD-cut 
-      //At the moment not included!
-      //if(!fESDHLTtrackCuts->AcceptTrack(esdtrackHLT)) continue;                    
-
-      //Calculating DCA "old" fashion
-      Float_t dca[2];
-      esdtrackHLT->GetDZ(esdHLT->GetPrimaryVertex()->GetXv(), esdHLT->GetPrimaryVertex()->GetYv(), esdHLT->GetPrimaryVertex()->GetZv(), bfield, dca);
-
-      // plotting the DCA calculated by Sergey 
-      Float_t DCAr, DCAz = -99;
-      esdtrackHLT->GetImpactParametersTPC(DCAr, DCAz);
-      fDCArHLTSG->Fill(DCAr);
-      fDCAzHLTSG->Fill(DCAz);
-
-      fDCArHLT->Fill(dca[0]);  
-      fDCAzHLT->Fill(dca[1]);
-      
-      fChargeHLT->Fill(esdtrackHLT->Charge());
-
-      if((esdtrackHLT->GetStatus()&AliESDtrack::kTPCin) || (esdtrackHLT->GetStatus()&AliESDtrack::kTPCin && esdtrackHLT->GetStatus()&AliESDtrack::kTPCout))
-       fNclusterHLT->Fill(esdtrackHLT->GetTPCNcls());
-
-      nr_tracksHLT++;
-      
-      if((esdtrackHLT->GetStatus()&AliESDtrack::kTPCin) || (esdtrackHLT->GetStatus()&AliESDtrack::kTPCin && esdtrackHLT->GetStatus()&AliESDtrack::kTPCout)){
-       fNclusVSphiHLT->Fill(esdtrackHLT->Phi()*TMath::RadToDeg(), esdtrackHLT->GetTPCNcls());
-       fNclusVSthetaHLT->Fill(esdtrackHLT->Theta()*TMath::RadToDeg(), esdtrackHLT->GetTPCNcls());
-      }
-
-      if(esdtrackHLT->GetStatus()&AliESDtrack::kTPCin) fMomentumHLTTpc->Fill(esdtrackHLT->Pt());
-      if(esdtrackHLT->GetStatus()&AliESDtrack::kTPCin && esdtrackHLT->GetStatus()&AliESDtrack::kITSin)  fMomentumHLTTpcIts->Fill(esdtrackHLT->Pt());   
-
-      fEtaHLT->Fill(esdtrackHLT->Eta()); 
-      fdEdxHLT->Fill( esdtrackHLT->GetTPCsignal() );
-      fdEdxVSPHLT->Fill( TMath::Abs(esdtrackHLT->Pt()), esdtrackHLT->GetTPCsignal() );         
-
-      fPhiHLT->Fill(esdtrackHLT->Phi()*TMath::RadToDeg());
-      fThetaHLT->Fill(esdtrackHLT->Theta()*TMath::RadToDeg());
-      fMomentumHLT->Fill( TMath::Abs(esdtrackHLT->Pt()) );  
-     
-      if(esdtrackHLT->GetStatus()&AliESDtrack::kTPCin) 
-       fMomentumHLTTpc->Fill(esdtrackHLT->Pt());
-      if(esdtrackHLT->GetStatus()&AliESDtrack::kTPCin && esdtrackHLT->GetStatus()&AliESDtrack::kITSin)  
-       fMomentumHLTTpcIts->Fill(esdtrackHLT->Pt());  
-
-      if(TMath::Abs(esdtrackHLT->Pt()) <Momcut) continue; 
-      fEtaMomentumcutHLT->Fill(esdtrackHLT->Eta());
-      if((esdtrackHLT->GetStatus()&AliESDtrack::kTPCin) || (esdtrackHLT->GetStatus()&AliESDtrack::kTPCin && esdtrackHLT->GetStatus()&AliESDtrack::kTPCout))
-       fNclusterHLTwCut->Fill(esdtrackHLT->GetTPCNcls());
-      
-      if(esdHLT->IsHLTTriggerFired()){
-                  
-      }// end if for triggered hlt events       
-    } // end of loop over hlt tracks
-  }  
-
-  if(nr_tracksHLT>0)
-    fMultHLT->Fill(nr_tracksHLT);
+    AliESDtrack *esdtrackHLT = esdHLT->GetTrack(i); 
+    if(!esdtrackHLT) continue;
+
+    //Fill which status flags that are set for an event
+    //for(int jjj=0;jjj<12;jjj++){
+    //  if(esdtrackHLT->GetStatus()&Statusnames[jjj]) fStatusHLT->Fill(jjj);
+    //} 
+
+    if(!(esdtrackHLT->GetStatus()&AliESDtrack::kTPCin)) continue; // only interested in tracks with kTPCin flag
+    if(esdtrackHLT->GetTPCNcls()<=0) continue; 
+    nr_tracksHLT++;
+   
+    Double_t x[3]; 
+    esdtrackHLT->GetXYZ(x);
+    Double_t b[3]; 
+    AliTracker::GetBxByBz(x,b);
+    Bool_t isOK = esdtrackHLT->RelateToVertexTPCBxByBz(vertHLT, b, kVeryBig);
+
+    Float_t dca[2]={0,0}; Float_t cov[3]={0,0,0}; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z
+    if(isOK){
+       const AliExternalTrackParam *track = esdtrackHLT->GetTPCInnerParam();
+       if(!track) return;    
+       esdtrackHLT->GetImpactParametersTPC(dca,cov);
+       fDCArHLT->Fill(dca[0]);
+       fDCAzHLT->Fill(dca[1]);
+    }
+//     Float_t dca[2];
+//     if(vertHLT->GetStatus()==kTRUE){
+//        esdtrackHLT->GetDZ(esdHLT->GetPrimaryVertex()->GetX(), esdHLT->GetPrimaryVertex()->GetY(), esdHLT->GetPrimaryVertex()->GetZ(), bfield, dca);
+//        fDCArHLT->Fill(dca[0]);  
+//        fDCAzHLT->Fill(dca[1]);
+//     }
+    
+    fChargeHLT->Fill(esdtrackHLT->Charge());
+    fNclusterHLT->Fill(esdtrackHLT->GetTPCNcls());
+    fNITSclusterHLT->Fill(esdtrackHLT->GetNcls(0));
+    fEtaHLT->Fill(esdtrackHLT->Eta()); 
+    fPhiHLT->Fill(esdtrackHLT->Phi()*TMath::RadToDeg());
+    fMomentumHLT->Fill(TMath::Abs(esdtrackHLT->Pt()));  
+    
+    if( TMath::Abs(esdtrackHLT->Eta())<TMath::Abs(fEta) && 
+        TMath::Abs(esdtrackHLT->Pt())>TMath::Abs(fPt) && 
+        TMath::Abs(dca[0])<TMath::Abs(fDCAr) && 
+        TMath::Abs(dca[1])<TMath::Abs(fDCAz) &&
+        TMath::Abs(vertHLT->GetZ())<TMath::Abs(fVertexZ) )
+    {       
+       fChargeHLTcut->Fill(esdtrackHLT->Charge());
+       fNclusterHLTcut->Fill(esdtrackHLT->GetTPCNcls());
+       fDCArHLTcut->Fill(dca[0]);  
+       fDCAzHLTcut->Fill(dca[1]);
+       fNITSclusterHLTcut->Fill(esdtrackHLT->GetNcls(0));
+       fEtaHLTcut->Fill(esdtrackHLT->Eta()); 
+       fPhiHLTcut->Fill(esdtrackHLT->Phi()*TMath::RadToDeg());
+       fMomentumHLTcut->Fill(TMath::Abs(esdtrackHLT->Pt()));  
+    }    
+  } // end of loop over hlt tracks
+
+  if(nr_tracksHLT>0) fMultHLT->Fill(nr_tracksHLT);
 
   //----------------- OFFLINE ESD tree ----------------//
   
-  Int_t nr_tracksOff=0;
-  Double_t vertexOFF[3];
-
-  const AliESDVertex *vertOff=esdOFF->GetPrimaryVertexTracks();
-
-  vertexOFF[0] = vertOff->GetX();
-  vertexOFF[1] = vertOff->GetY();
-  vertexOFF[2] = vertOff->GetZ();
-  AliVertex *primVertexOFF = new AliVertex(vertexOFF, 0., 0);
-  Bool_t testVertex=kTRUE;
-
-  //Int_t nr_contributorsOff= vertHLT->GetNContributors();
-
-  if(vertOff->GetNContributors()<1) {
-    // SPD vertex
-    vertOff = esdOFF->GetPrimaryVertexSPD();
-    if(vertOff->GetNContributors()<1) {
-      // NO GOOD VERTEX, SKIP EVENT 
-      testVertex=kFALSE;
-    }
+  Int_t nr_tracksOff = 0;
+  const AliESDVertex *vertOFF = esdOFF->GetPrimaryVertexTracks();
+   
+  if(fBeamType.Contains("Pb")){
+     fCentrality = esdOFF->GetCentrality(); 
+     // this information is only available from the offline ESD for 2010 PbPb data, the V0 info was not stored in the HLTesd (17.04.11, Kelly)
+     if(!fCentrality){
+        printf("Centrality pointer is empty\n");
+        return;
+     }
+     else fV0cent->Fill(fCentrality->GetCentralityPercentile("V0M"));
   }
   
-  if(testVertex){
-    fXYvertexOff->Fill(vertOff->GetX(), vertOff->GetY() );
-    fXvertexOff->Fill( vertOff->GetX() );
-    fYvertexOff->Fill( vertOff->GetY() );
-    fZvertexOff->Fill( vertOff->GetZ() );
-  }
-
-  //At the moment no constrains on vertex before filling histograms
-  //Should be changed. 
-  if(1){
-    fEventSpecieOff->Fill(esdOFF->GetEventSpecie());
-
-    for(Int_t i=0; i<esdOFF->GetNumberOfTracks(); i++){ 
-     
-      AliESDtrack *esdtrackOFF = esdOFF->GetTrack(i); 
-      if (!esdtrackOFF) continue;
-
-
-      //Fill histograms with which flags are set
-      for(int jjj=0;jjj<12;jjj++){
-       if(esdtrackOFF->GetStatus()&Statusnames[jjj]) {
-         fStatusOff->Fill(jjj);
-         if(esdtrackOFF->GetTPCNcls()==0) fStatusOff_Ocl->Fill(jjj);
-       }
-      } 
-
-      // reject laser events
-      if((esdOFF->GetEventSpecie()==16)) continue;  
-
-      //This condition is mostly affecting Offline->will cut away tracks that are counted twice 
-      //With both kITSin and kTPCin flags set.
-      if(!(esdtrackOFF->GetStatus()&AliESDtrack::kTPCin))continue; 
-
-      // -- ESD cuts
-      //Not included at the moment
-      //if(!fESDOfftrackCuts->AcceptTrack(esdtrackOFF) ) continue;
-      nr_tracksOff++;
-
-      //Filling of DCA for Offline
-
-      Double_t x[3]; 
-      esdtrackOFF->GetXYZ(x);
-      Double_t b[3]; 
-      AliTracker::GetBxByBz(x,b);
-      Bool_t isOK = esdtrackOFF->RelateToVertexTPCBxByBz(vertOff, b, kVeryBig);
-      if(!isOK) return;
-      
-      const AliExternalTrackParam *track = esdtrackOFF->GetTPCInnerParam();
-      if(!track) return;
-      
-      Float_t dca[2], cov[3]; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z
-      esdtrackOFF->GetImpactParametersTPC(dca,cov);
-
-      fDCArOff->Fill(dca[0]);
-      fDCAzOff->Fill(dca[1]);
-      fChargeOff->Fill(esdtrackOFF->Charge());
-
-      if((esdtrackOFF->GetStatus()&AliESDtrack::kTPCin) || (esdtrackOFF->GetStatus()&AliESDtrack::kTPCin && esdtrackOFF->GetStatus()&AliESDtrack::kTPCout))
-       fNclusterOff->Fill(esdtrackOFF->GetTPCNcls()); 
-
-      if(esdtrackOFF->GetTPCNcls()>0) fNclusVSphiOff->Fill(esdtrackOFF->Phi()*TMath::RadToDeg(), esdtrackOFF->GetTPCNcls());
-      if(esdtrackOFF->GetTPCNcls()>0) fNclusVSthetaOff->Fill(esdtrackOFF->Theta()*TMath::RadToDeg(), esdtrackOFF->GetTPCNcls());
-
-      if(esdtrackOFF->GetStatus()&AliESDtrack::kTPCin) fMomentumOffTpc->Fill(esdtrackOFF->Pt());
-      if(esdtrackOFF->GetStatus()&AliESDtrack::kTPCin && esdtrackOFF->GetStatus()&AliESDtrack::kITSin)  fMomentumOffTpcIts->Fill(esdtrackOFF->Pt());   
-
-      fEtaOff->Fill(esdtrackOFF->Eta());         
-      fdEdxOff->Fill( esdtrackOFF->GetTPCsignal() );
-      fdEdxVSPOff->Fill( TMath::Abs(esdtrackOFF->Pt()), esdtrackOFF->GetTPCsignal() );         
-      
-      fPhiOff->Fill(esdtrackOFF->Phi()*TMath::RadToDeg());
-      fThetaOff->Fill(esdtrackOFF->Theta()*TMath::RadToDeg());
-      fMomentumOff->Fill( TMath::Abs(esdtrackOFF->Pt()) ); 
-
-      if(esdtrackOFF->GetStatus()&AliESDtrack::kTPCin) 
-       fMomentumOffTpc->Fill(esdtrackOFF->Pt());
-      if(esdtrackOFF->GetStatus()&AliESDtrack::kTPCin && esdtrackOFF->GetStatus()&AliESDtrack::kITSin)
-       fMomentumOffTpcIts->Fill(esdtrackOFF->Pt());  
-
-      if(TMath::Abs(esdtrackOFF->Pt()) < Momcut) continue;
-      fEtaMomentumcutOff->Fill(esdtrackOFF->Eta()); 
-      if(esdtrackOFF->GetTPCNcls()>0) 
-       fNclusterOffwCut->Fill(esdtrackOFF->GetTPCNcls()); 
-           
-         
-      if(esdHLT->IsHLTTriggerFired()){
-           
-      } // end if for triggered offl events
-
-    } // end of loop over offl tracks
+  if(vertOFF->GetStatus()==kTRUE){
+     fXvertexOff->Fill( vertOFF->GetX() );
+     fYvertexOff->Fill( vertOFF->GetY() );
+     fZvertexOff->Fill( vertOFF->GetZ() );
   
+     fSPDXvertexOff->Fill(esdOFF->GetPrimaryVertexSPD()->GetX());
+     fSPDYvertexOff->Fill(esdOFF->GetPrimaryVertexSPD()->GetY());
+     fSPDZvertexOff->Fill(esdOFF->GetPrimaryVertexSPD()->GetZ());
+   
+     fNcontOff->Fill(vertOFF->GetNContributors());
   }
-  if(nr_tracksOff>0)
-    fMultOff->Fill(nr_tracksOff);
-
-  //   if(esdHLT->IsHLTTriggerFired()){
-  // 
-  //      for(Int_t i=0; i<esdOFF->GetNumberOfTracks(); i++){ 
-  //         
-  //    AliESDtrack *esdTrk = esdOFF->GetTrack(i);      
-  //          Double_t dz[2] = {-999., -999.};  
-  //          Double_t covar[3] = {0};
-  //          esdTrk->PropagateToDCA(vtx, bfield, 250., dz, covar);
-  //          fHistOfflDZTrig->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1]));
-  //       
-  //          fHistOfflDZ->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1]));
-  //       
-  //          /*
-  //          Double_t pnt[3] = {0., 0., 0.};
-  //          Double_t norm[3] = {0., 0., 1.};
-  //          if(esdTrk->Intersect(pnt, norm, bfield)){
-  //              if(TMath::Sqrt(pnt[0]*pnt[0]+pnt[1]*pnt[1]) < 250) {
-  //                fNtracksThruZ0++;
-  //                fNtracksThruZ0Trig++;
-  //                fHistTrigger->Fill(6., 1);
-  //                fHistTrigger->Fill(7., 1);
-  //              }
-  //          }
-  //          */
-  // 
-  //          fHistOfflTrkDCATrig->Fill(TMath::Abs(esdTrk->GetD(0., 0., bfield)));
-  //          fDCAOff->Fill(TMath::Abs(esdTrk->GetD(0., 0., bfield))); 
-  // 
-  //          if(esdTrk->GetTPCNcls()>0){
-  //       fHistOfflTrkNclsTrig->Fill(esdTrk->GetTPCNcls()); 
-  //       fHistOfflTrkNcls->Fill(esdTrk->GetTPCNcls());
-  //          }
-  // 
-  //          fHistOfflTrkPTrig->Fill(TMath::Abs(esdTrk->P()));
-  //          fHistOfflTrkP->Fill(TMath::Abs(esdTrk->P()));
-  //          fHistOffldEdx->Fill( esdTrk->GetTPCsignal());
-  //          fHistOffldEdxVsP->Fill(TMath::Abs(esdTrk->P()), esdTrk->GetTPCsignal());
-  //      }
-  
-  delete primVertexOFF;
-  delete primVertexHLT;
+
+  fEventSpecieOff->Fill(esdOFF->GetEventSpecie());
+
+  for(Int_t i=0; i<esdOFF->GetNumberOfTracks(); i++){ 
+   
+    AliESDtrack *esdtrackOFF = esdOFF->GetTrack(i); 
+    if (!esdtrackOFF) continue;
+
+    if(!(esdtrackOFF->GetStatus()&AliESDtrack::kTPCin)) continue; 
+    if(esdtrackOFF->GetTPCNcls()<=0) continue; 
+    nr_tracksOff++;
+   
+    Double_t x[3]; 
+    esdtrackOFF->GetXYZ(x);
+    Double_t b[3]; 
+    AliTracker::GetBxByBz(x,b);
+    Bool_t isOK = esdtrackOFF->RelateToVertexTPCBxByBz(vertOFF, b, kVeryBig);
+    if(isOK){
+       const AliExternalTrackParam *track = esdtrackOFF->GetTPCInnerParam();
+       if(!track) return;    
+       Float_t dca[2]={0,0}; Float_t cov[3]={0,0,0}; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z
+       esdtrackOFF->GetImpactParametersTPC(dca,cov);
+       fDCArOff->Fill(dca[0]);
+       fDCAzOff->Fill(dca[1]);
+    }
+//     // calculate the offline DCAs the same way like for HLT. The above way is calculating the DCA for the TPC inner barrel surface (Kelly, 17.04.11)
+//     Float_t dca[2];
+//     if(vertOFF->GetStatus()==kTRUE){
+//        esdtrackOFF->GetDZ(esdOFF->GetPrimaryVertex()->GetX(), esdOFF->GetPrimaryVertex()->GetY(), esdOFF->GetPrimaryVertex()->GetZ(), bfield, dca);
+//    }
+    
+    fChargeOff->Fill(esdtrackOFF->Charge());
+    fNclusterOff->Fill(esdtrackOFF->GetTPCNcls()); 
+    fNITSclusterOff->Fill(esdtrackOFF->GetNcls(0)); 
+    fEtaOff->Fill(esdtrackOFF->Eta());         
+    fPhiOff->Fill(esdtrackOFF->Phi()*TMath::RadToDeg());
+    fMomentumOff->Fill( TMath::Abs(esdtrackOFF->Pt()) ); 
+
+  } // end of loop over offline tracks
   
-  // Post output data.
+  if(nr_tracksOff>0) fMultOff->Fill(nr_tracksOff);
+   
   PostData(1, fOutputList);
 }
 
 void AliAnalysisTaskHLT::Terminate(Option_t *){
-  // see header file of AliAnalysisTask for documentation
-// 
-//   // Draw result to the screen
-//   // Called once at the end of the query
+// see header file of AliAnalysisTask for documentation
+}
+
+// void AliAnalysisTaskHLT::SetupESDtrackCuts(){ // not called
+//   // Setup ESD cuts
+//   // NB! Work in progress!
 // 
-//   Bool_t print_png=kFALSE;
-//   if(print_png){
+//   Bool_t selPrimaries = kTRUE;
+//   
+//   fESDOfftrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2009(selPrimaries);
+//   //To make Offline cuts = HLT cuts
+//   fESDOfftrackCuts->SetRequireITSRefit(kFALSE); 
+//   fESDOfftrackCuts->SetEtaRange(-0.9,+0.9);
 //   
-//     //Drawing histograms
-//     Int_t maxbin =0;
-//     TCanvas *c1 = new TCanvas("c1","Info pr track, Offline vs Online",10,10,1210,810);
-//      
-//     c1->Divide(3,2);
-//      
-//     c1->cd(1);
-//     maxbin =fEtaOff->GetBinContent(fEtaOff->GetMaximumBin());
-//     if(maxbin < fEtaHLT->GetBinContent(fEtaHLT->GetMaximumBin()))
-//       maxbin=fEtaHLT->GetBinContent(fEtaHLT->GetMaximumBin());
-//     fEtaOff->SetMaximum(maxbin+20);
-//     fEtaOff->SetTitle("Pseudorapidity (without momentum cut)");
-//     fEtaOff->SetLineColor(2);
-//     fEtaOff->DrawCopy("");
-//     fEtaHLT->DrawCopy("sameS");
-//  
-//     TLegend *legend = new TLegend(0.70,0.60,0.90,0.75);
-//     legend->AddEntry(fEtaOff, "Offline", "LP");
-//     legend->AddEntry(fEtaHLT,"HLT","LP");
-//     legend->SetFillColor(10);
-//     legend->SetBorderSize(0);
-//     legend->Draw("");
-// 
-//     c1->cd(2);
-//     maxbin =fEtaMomentumcutOff->GetBinContent(fEtaMomentumcutOff->GetMaximumBin());
-//     if(maxbin < fEtaMomentumcutHLT->GetBinContent(fEtaMomentumcutHLT->GetMaximumBin()))
-//       maxbin=fEtaMomentumcutHLT->GetBinContent(fEtaMomentumcutHLT->GetMaximumBin());
-//     fEtaMomentumcutOff->SetMaximum(maxbin+20);
-//     fEtaMomentumcutOff->SetTitle("Pseudorapidity");
-//     fEtaMomentumcutOff->SetLineColor(2);
-//     fEtaMomentumcutOff->DrawCopy("");
-//     fEtaMomentumcutHLT->DrawCopy("sames");
-// 
-//     c1->cd(3);
-//     maxbin =fNclusterOff->GetBinContent(fNclusterOff->GetMaximumBin());
-//     if(maxbin < fNclusterHLT->GetBinContent(fNclusterHLT->GetMaximumBin()))
-//       maxbin=fNclusterHLT->GetBinContent(fNclusterHLT->GetMaximumBin());
-//     fNclusterOff->SetMaximum(maxbin+20);
-//     fNclusterOff->SetLineColor(2);
-//     fNclusterOff->SetTitle("Nr clusters per track");
-//     fNclusterOff->DrawCopy("");
-//     fNclusterHLT->DrawCopy("sames");
 // 
-//     c1->cd(4);
-//     maxbin =fPhiOff->GetBinContent(fPhiOff->GetMaximumBin());
-//     if(maxbin < fPhiHLT->GetBinContent(fPhiHLT->GetMaximumBin()))
-//       maxbin=fPhiHLT->GetBinContent(fPhiHLT->GetMaximumBin());
-//     fPhiOff->SetMinimum(0);
-//     fPhiOff->SetMaximum(maxbin+20);
-//     fPhiOff->SetLineColor(2);
-//     fPhiOff->SetTitle("Azimuthal angle distribution");
-//     fPhiOff->DrawCopy("");
-//     fPhiHLT->DrawCopy("sames");
+//   //HLT
+//   //NB! Need to understand this a bit more! Which cuts should we keep?
+//   fESDHLTtrackCuts = new AliESDtrackCuts;
 // 
-//     c1->cd(5);
-//     maxbin =fThetaOff->GetBinContent(fThetaOff->GetMaximumBin());
-//     if(maxbin < fThetaHLT->GetBinContent(fThetaHLT->GetMaximumBin()))
-//       maxbin=fThetaHLT->GetBinContent(fThetaHLT->GetMaximumBin());
-//     fThetaOff->SetMaximum(maxbin+20);
-//     fThetaOff->SetLineColor(2);
-//     fThetaOff->SetTitle("Polar angle distribution");
-//     fThetaOff->DrawCopy("");
-//     fThetaHLT->DrawCopy("sames");
+//   // TPC  
+//   fESDHLTtrackCuts->SetRequireTPCStandAlone(kTRUE); // to get chi2 and ncls of kTPCin
+//   fESDHLTtrackCuts->SetMinNClustersTPC(70);
+//   fESDHLTtrackCuts->SetMaxChi2PerClusterTPC(4);
+//   fESDHLTtrackCuts->SetAcceptKinkDaughters(kFALSE);
 // 
-//     c1->cd(6);
-//     maxbin =fMomentumOff->GetBinContent(fMomentumOff->GetMaximumBin());
-//     if(maxbin < fMomentumHLT->GetBinContent(fMomentumHLT->GetMaximumBin()))
-//       maxbin=fMomentumHLT->GetBinContent(fMomentumHLT->GetMaximumBin());
-//     fMomentumOff->SetMaximum(maxbin+200);
-//     fMomentumOff->GetXaxis()->SetRangeUser(0,5);
-//     fMomentumOff->SetLineColor(2);
-//     fMomentumOff->SetTitle("Momentum");
-//     fMomentumOff->DrawCopy("");
-//     fMomentumHLT->DrawCopy("sames");
+//   fESDHLTtrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
+//                                  AliESDtrackCuts::kAny);
 // 
-//     TCanvas *c2= new TCanvas("c2", "Info pr event, Offline vs Online", 10 , 10,1210, 810);
-//     TLegend *legend2 = new TLegend(0.70,0.60,0.90,0.75);
-//     c2->Divide(3,2);
-//     c2->cd(1);
-//     fXvertexOff->SetTitle("Primary Vertex Distribution in X");
-//     fXvertexOff->SetLineColor(2);
-//     fXvertexOff->GetXaxis()->SetRangeUser(-0.5,0.5);
-//     legend2->AddEntry(fXvertexOff,"Offline","LP");
-//     fXvertexOff->DrawCopy("");
-//     fXvertexHLT->DrawCopy("sames");
-//     legend2->AddEntry(fXvertexHLT,"HLT","LP");
-//     legend2->SetFillColor(10);
-//     legend2->SetBorderSize(0);
-//     legend2->Draw();
-//     c2->cd(2);
-//     fYvertexOff->SetTitle("Primary Vertex Distribution in Y");
-//     fYvertexOff->SetLineColor(2);
-//     fYvertexOff->GetXaxis()->SetRangeUser(-0.5,0.5);
-//     fYvertexOff->DrawCopy("");
-//     fYvertexHLT->DrawCopy("sames");
-//     c2->cd(3);
-//     fZvertexOff->SetTitle("Primary Vertex Distribution in Z");
-//     fZvertexOff->SetLineColor(2);
-//     fZvertexOff->DrawCopy("");
-//     fZvertexHLT->DrawCopy("sames");
+//   if(selPrimaries) { // 7*(0.0050+0.0060/pt^0.9)
+//     fESDHLTtrackCuts->SetMaxDCAToVertexXYPtDep("0.0350+0.0420/pt^0.9");
+//   }
 //   
-//     c2->cd(4);
-//     fMultHLT->SetTitle("Track Multiplicity, NumberTracks>0");
-//     fMultHLT->DrawCopy("");
-//     fMultOff->SetLineColor(2);
-//     fMultOff->DrawCopy("sames");
+//   fESDHLTtrackCuts->SetMaxDCAToVertexZ(1.e6);
+//   fESDHLTtrackCuts->SetDCAToVertex2D(kFALSE);
+//   fESDHLTtrackCuts->SetRequireSigmaToVertex(kFALSE);
+//   fESDHLTtrackCuts->SetEtaRange(-0.9,+0.9);
 // 
-//     string filename="Info_pr_track";
-//     char plotname[100];
-//     sprintf(plotname,"%s.png",filename.c_str());
-//     //  c1->Print("Info_pr_track.png","png");
-//     c1->Print(plotname,"png");
-//  
-//     filename="Info_pr_Event";
-//     sprintf(plotname,"%s.png",filename.c_str());
-//     c2->Print(plotname,"png");
-//   }
-
-}
-
-void AliAnalysisTaskHLT::SetupESDtrackCuts() {
-  // Setup ESD cuts
-  // NB! Work in progress!
-
-  Bool_t selPrimaries = kTRUE;
-  
-  fESDOfftrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2009(selPrimaries);
-  //To make Offline cuts = HLT cuts
-  fESDOfftrackCuts->SetRequireITSRefit(kFALSE); 
-  fESDOfftrackCuts->SetEtaRange(-0.9,+0.9);
-  
-
-  //HLT
-  //NB! Need to understand this a bit more! Which cuts should we keep?
-  fESDHLTtrackCuts = new AliESDtrackCuts;
-
-  // TPC  
-  fESDHLTtrackCuts->SetRequireTPCStandAlone(kTRUE); // to get chi2 and ncls of kTPCin
-  fESDHLTtrackCuts->SetMinNClustersTPC(70);
-  fESDHLTtrackCuts->SetMaxChi2PerClusterTPC(4);
-  fESDHLTtrackCuts->SetAcceptKinkDaughters(kFALSE);
-
-  fESDHLTtrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
-                                    AliESDtrackCuts::kAny);
-
-  if(selPrimaries) { // 7*(0.0050+0.0060/pt^0.9)
-    fESDHLTtrackCuts->SetMaxDCAToVertexXYPtDep("0.0350+0.0420/pt^0.9");
-  }
-  
-  fESDHLTtrackCuts->SetMaxDCAToVertexZ(1.e6);
-  fESDHLTtrackCuts->SetDCAToVertex2D(kFALSE);
-  fESDHLTtrackCuts->SetRequireSigmaToVertex(kFALSE);
-  fESDHLTtrackCuts->SetEtaRange(-0.9,+0.9);
-
-  return;
-}
+//   return;
+// }