]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG2/SPECTRA/AliProtonAnalysis.cxx
Returning the 2D histograms from the CF containers
[u/mrichter/AliRoot.git] / PWG2 / SPECTRA / AliProtonAnalysis.cxx
index b0626762538125a523adb42ec9c0dc54161c5bc3..38a98509747f8355db3bef341893137aee4d2eb3 100644 (file)
@@ -22,6 +22,7 @@
 #include <TFile.h>
 #include <TSystem.h>
 #include <TF1.h>
+#include <TH3F.h>
 #include <TH2D.h>
 #include <TH1D.h>
 #include <TH1I.h>
@@ -52,7 +53,8 @@ AliProtonAnalysis::AliProtonAnalysis() :
   fNBinsY(0), fMinY(0), fMaxY(0),
   fNBinsPt(0), fMinPt(0), fMaxPt(0),
   fProtonContainer(0), fAntiProtonContainer(0),
-  fHistEvents(0), fHistYPtProtons(0), fHistYPtAntiProtons(0),
+  fHistEvents(0), fHistYPtProtons(0), fHistYPtAntiProtons(0), 
+  fHistEventStats(0),
   fEffGridListProtons(0), fCorrectionListProtons2D(0), 
   fEfficiencyListProtons1D(0), fCorrectionListProtons1D(0),
   fEffGridListAntiProtons(0), fCorrectionListAntiProtons2D(0), 
@@ -74,7 +76,7 @@ AliProtonAnalysis::AliProtonAnalysis(Int_t nbinsY,
   fNBinsY(nbinsY), fMinY(fLowY), fMaxY(fHighY),
   fNBinsPt(nbinsPt), fMinPt(fLowPt), fMaxPt(fHighPt),
   fProtonContainer(0), fAntiProtonContainer(0),
-  fHistEvents(0), fHistYPtProtons(0), fHistYPtAntiProtons(0),
+  fHistEvents(0), fHistYPtProtons(0), fHistYPtAntiProtons(0), fHistEventStats(0),
   fEffGridListProtons(0), fCorrectionListProtons2D(0), 
   fEfficiencyListProtons1D(0), fCorrectionListProtons1D(0),
   fEffGridListAntiProtons(0), fCorrectionListAntiProtons2D(0), 
@@ -85,8 +87,9 @@ AliProtonAnalysis::AliProtonAnalysis(Int_t nbinsY,
   fQAAntiProtonsAcceptedList(0), fQAAntiProtonsRejectedList(0),
   fInitQAFlag(kFALSE) {
   //Default constructor
-  if(!fInitQAFlag) InitQA();
-  fHistEvents = new TH1I("fHistEvents","Analyzed events",1,0,1);
+  fHistEvents = new TH1I("fHistEvents","Analyzed events",2,0.5,2.5);
+  fHistEvents->GetXaxis()->SetBinLabel(1,"Analyzed events");
+  fHistEvents->GetXaxis()->SetBinLabel(2,"Events with (anti)protons");
 
   fHistYPtProtons = new TH2D("fHistYPtProtons","Protons",
                             fNBinsY,fMinY,fMaxY,
@@ -132,6 +135,9 @@ AliProtonAnalysis::AliProtonAnalysis(Int_t nbinsY,
                                            kNSteps,2,iBin);
   fAntiProtonContainer->SetBinLimits(0,binLimY); //rapidity or eta
   fAntiProtonContainer->SetBinLimits(1,binLimPt); //pT
+
+  //Initialize the QA
+  if(!fInitQAFlag) InitQA();
 } 
 
 //____________________________________________________________________//
@@ -141,7 +147,7 @@ AliProtonAnalysis::AliProtonAnalysis(Int_t nbinsY, Double_t *gY,
   fNBinsY(nbinsY), fMinY(gY[0]), fMaxY(gY[nbinsY]),
   fNBinsPt(nbinsPt), fMinPt(gPt[0]), fMaxPt(gPt[nbinsPt]),
   fProtonContainer(0), fAntiProtonContainer(0),
-  fHistEvents(0), fHistYPtProtons(0), fHistYPtAntiProtons(0),
+  fHistEvents(0), fHistYPtProtons(0), fHistYPtAntiProtons(0), fHistEventStats(0),
   fEffGridListProtons(0), fCorrectionListProtons2D(0), 
   fEfficiencyListProtons1D(0), fCorrectionListProtons1D(0),
   fEffGridListAntiProtons(0), fCorrectionListAntiProtons2D(0), 
@@ -152,8 +158,9 @@ AliProtonAnalysis::AliProtonAnalysis(Int_t nbinsY, Double_t *gY,
   fQAAntiProtonsAcceptedList(0), fQAAntiProtonsRejectedList(0),
   fInitQAFlag(kFALSE) {
   //Default constructor
-  if(!fInitQAFlag) InitQA();
-  fHistEvents = new TH1I("fHistEvents","Analyzed events",1,0,1);
+  fHistEvents = new TH1I("fHistEvents","Analyzed events",2,0.5,2.5);
+  fHistEvents->GetXaxis()->SetBinLabel(1,"Analyzed events");
+  fHistEvents->GetXaxis()->SetBinLabel(2,"Events with (anti)protons");
 
   fHistYPtProtons = new TH2D("fHistYPtProtons","Protons",
                             fNBinsY,gY,fNBinsPt,gPt);
@@ -189,6 +196,9 @@ AliProtonAnalysis::AliProtonAnalysis(Int_t nbinsY, Double_t *gY,
                                            kNSteps,2,iBin);
   fAntiProtonContainer->SetBinLimits(0,gY); //rapidity or eta
   fAntiProtonContainer->SetBinLimits(1,gPt); //pT
+
+  //Initialize the QA
+  if(!fInitQAFlag) InitQA();
 } 
 
 //____________________________________________________________________//
@@ -199,6 +209,7 @@ AliProtonAnalysis::~AliProtonAnalysis() {
   if(fHistEvents) delete fHistEvents;
   if(fHistYPtProtons) delete fHistYPtProtons;
   if(fHistYPtAntiProtons) delete fHistYPtAntiProtons;
+  if(fHistEventStats) delete fHistEventStats;
   if(fProtonContainer) delete fProtonContainer;
   if(fAntiProtonContainer) delete fAntiProtonContainer;
 
@@ -228,7 +239,6 @@ void AliProtonAnalysis::InitAnalysisHistograms(Int_t nbinsY,
                                               Int_t nbinsPt, 
                                               Float_t fLowPt, Float_t fHighPt) {
   //Initializes the histograms
-  if(!fInitQAFlag) InitQA();
   fNBinsY = nbinsY;
   fMinY = fLowY;
   fMaxY = fHighY;
@@ -236,7 +246,9 @@ void AliProtonAnalysis::InitAnalysisHistograms(Int_t nbinsY,
   fMinPt = fLowPt;
   fMaxPt = fHighPt;
 
-  fHistEvents = new TH1I("fHistEvents","Analyzed events",1,0,1);
+  fHistEvents = new TH1I("fHistEvents","Analyzed events",2,0.5,2.5);
+  fHistEvents->GetXaxis()->SetBinLabel(1,"Analyzed events");
+  fHistEvents->GetXaxis()->SetBinLabel(2,"Events with (anti)protons");
 
   fHistYPtProtons = new TH2D("fHistYPtProtons","Protons",
                             fNBinsY,fMinY,fMaxY,
@@ -282,13 +294,15 @@ void AliProtonAnalysis::InitAnalysisHistograms(Int_t nbinsY,
                                            kNSteps,2,iBin);
   fAntiProtonContainer->SetBinLimits(0,binLimY); //rapidity
   fAntiProtonContainer->SetBinLimits(1,binLimPt); //pT
+
+  //Initialize the QA
+  if(!fInitQAFlag) InitQA();
 }
 
 //____________________________________________________________________//
 void AliProtonAnalysis::InitAnalysisHistograms(Int_t nbinsY, Double_t *gY, 
                                               Int_t nbinsPt, Double_t *gPt) {
   //Initializes the histograms using asymmetric values - global tracking
-  if(!fInitQAFlag) InitQA();
   fNBinsY = nbinsY;
   fMinY = gY[0];
   fMaxY = gY[nbinsY];
@@ -296,7 +310,9 @@ void AliProtonAnalysis::InitAnalysisHistograms(Int_t nbinsY, Double_t *gY,
   fMinPt = gPt[0];
   fMaxPt = gPt[nbinsPt];
 
-  fHistEvents = new TH1I("fHistEvents","Analyzed events",1,0,1);
+  fHistEvents = new TH1I("fHistEvents","Analyzed events",2,0.5,2.5);
+  fHistEvents->GetXaxis()->SetBinLabel(1,"Analyzed events");
+  fHistEvents->GetXaxis()->SetBinLabel(2,"Events with (anti)protons");
 
   fHistYPtProtons = new TH2D("fHistYPtProtons","Protons",
                             fNBinsY,gY,fNBinsPt,gPt);
@@ -333,6 +349,9 @@ void AliProtonAnalysis::InitAnalysisHistograms(Int_t nbinsY, Double_t *gY,
                                            kNSteps,2,iBin);
   fAntiProtonContainer->SetBinLimits(0,gY); //rapidity
   fAntiProtonContainer->SetBinLimits(1,gPt); //pT
+
+  //Initialize the QA
+  if(!fInitQAFlag) InitQA();
 }
 
 //____________________________________________________________________//
@@ -354,6 +373,7 @@ Bool_t AliProtonAnalysis::ReadFromFile(const char* filename) {
     fHistEvents = (TH1I *)list->At(2);
     fProtonContainer = (AliCFContainer *)list->At(3);
     fAntiProtonContainer = (AliCFContainer *)list->At(4);
+    fHistEventStats = (TH1F *)list->At(5);
   }
   else if(!list) {
     cout<<"Retrieving objects from the file... "<<endl;
@@ -362,9 +382,10 @@ Bool_t AliProtonAnalysis::ReadFromFile(const char* filename) {
     fHistEvents = (TH1I *)file->Get("fHistEvents");
     fProtonContainer = (AliCFContainer *)file->Get("containerProtons");
     fAntiProtonContainer = (AliCFContainer *)file->Get("containerAntiProtons");
+    fHistEventStats = (TH1F *)file->Get("fHistEventStats");
   }
   if((!fHistYPtProtons)||(!fHistYPtAntiProtons)||(!fHistEvents)
-     ||(!fProtonContainer)||(!fAntiProtonContainer)) {
+     ||(!fProtonContainer)||(!fAntiProtonContainer)||(!fHistEventStats)) {
     cout<<"Input containers were not found!!!"<<endl;
     status = kFALSE;
   }
@@ -383,8 +404,8 @@ TH1D *AliProtonAnalysis::GetProtonYHistogram() {
   //Get the y histogram for protons
   Int_t nAnalyzedEvents = GetNumberOfAnalyzedEvents();
 
-  TH1D *fYProtons = (TH1D *)fHistYPtProtons->ProjectionX("fYProtons",0,fHistYPtProtons->GetYaxis()->GetNbins(),"");
-  //TH1D *fYProtons = fProtonContainer->ShowProjection(0,0); //variable-step
+  //TH1D *fYProtons = (TH1D *)fHistYPtProtons->ProjectionX("fYProtons",0,fHistYPtProtons->GetYaxis()->GetNbins(),"");
+  TH1D *fYProtons = fProtonContainer->ShowProjection(0,kStepInPhaseSpace); //variable-step
    
   fYProtons->SetStats(kFALSE);
   fYProtons->GetYaxis()->SetTitle("(1/N_{events})(dN/dy)");
@@ -402,8 +423,8 @@ TH1D *AliProtonAnalysis::GetAntiProtonYHistogram() {
   //Get the y histogram for antiprotons
   Int_t nAnalyzedEvents = GetNumberOfAnalyzedEvents();
   
-  TH1D *fYAntiProtons = (TH1D *)fHistYPtAntiProtons->ProjectionX("fYAntiProtons",0,fHistYPtAntiProtons->GetYaxis()->GetNbins(),"");
-  //TH1D *fYAntiProtons = fAntiProtonContainer->ShowProjection(0,0);//variable-step 
+  //TH1D *fYAntiProtons = (TH1D *)fHistYPtAntiProtons->ProjectionX("fYAntiProtons",0,fHistYPtAntiProtons->GetYaxis()->GetNbins(),"");
+  TH1D *fYAntiProtons = fAntiProtonContainer->ShowProjection(0,kStepInPhaseSpace);//variable-step 
  
   fYAntiProtons->SetStats(kFALSE);
   fYAntiProtons->GetYaxis()->SetTitle("(1/N_{events})(dN/dy)");
@@ -421,8 +442,8 @@ TH1D *AliProtonAnalysis::GetProtonPtHistogram() {
   //Get the Pt histogram for protons
   Int_t nAnalyzedEvents = GetNumberOfAnalyzedEvents();
   
-  TH1D *fPtProtons = (TH1D *)fHistYPtProtons->ProjectionY("fPtProtons",0,fHistYPtProtons->GetXaxis()->GetNbins(),""); 
-  //TH1D *fPtProtons = fProtonContainer->ShowProjection(1,0); //variable-step
+  //TH1D *fPtProtons = (TH1D *)fHistYPtProtons->ProjectionY("fPtProtons",0,fHistYPtProtons->GetXaxis()->GetNbins(),""); 
+  TH1D *fPtProtons = fProtonContainer->ShowProjection(1,kStepInPhaseSpace); //variable-step
 
   fPtProtons->SetStats(kFALSE);
   fPtProtons->GetYaxis()->SetTitle("(1/N_{events})(dN/dP_{T})");
@@ -440,8 +461,8 @@ TH1D *AliProtonAnalysis::GetAntiProtonPtHistogram() {
   //Get the Pt histogram for antiprotons
   Int_t nAnalyzedEvents = GetNumberOfAnalyzedEvents();
   
-  TH1D *fPtAntiProtons = (TH1D *)fHistYPtAntiProtons->ProjectionY("fPtAntiProtons",0,fHistYPtProtons->GetXaxis()->GetNbins(),""); 
-  //TH1D *fPtAntiProtons = fAntiProtonContainer->ShowProjection(1,0); //variable-step
+  //TH1D *fPtAntiProtons = (TH1D *)fHistYPtAntiProtons->ProjectionY("fPtAntiProtons",0,fHistYPtProtons->GetXaxis()->GetNbins(),""); 
+  TH1D *fPtAntiProtons = fAntiProtonContainer->ShowProjection(1,kStepInPhaseSpace); //variable-step
 
   fPtAntiProtons->SetStats(kFALSE);
   fPtAntiProtons->GetYaxis()->SetTitle("(1/N_{events})(dN/dP_{T})");
@@ -670,7 +691,7 @@ void AliProtonAnalysis::Analyze(AliESDEvent* esd,
   Int_t nIdentifiedProtons = 0, nIdentifiedAntiProtons = 0;
   Int_t nSurvivedProtons = 0, nSurvivedAntiProtons = 0;
 
-  fHistEvents->Fill(0); //number of analyzed events
+  fHistEvents->Fill(1); //number of analyzed events
   Double_t containerInput[2] ;
   Double_t gPt = 0.0, gP = 0.0;
   nTracks = esd->GetNumberOfTracks();
@@ -690,190 +711,231 @@ void AliProtonAnalysis::Analyze(AliESDEvent* esd,
       track = &trackTPC ;
       }*/
 
+    Int_t  fIdxInt[200];
+    Int_t nClustersTPC = track->GetTPCclusters(fIdxInt);
+    Int_t npointsTPCdEdx = track->GetTPCsignalN();
+    Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0};  //The impact parameters and their covariance.
+
     if((fProtonAnalysisBase->GetAnalysisMode()==AliProtonAnalysisBase::kTPC)||(fProtonAnalysisBase->GetAnalysisMode()==AliProtonAnalysisBase::kHybrid)) {
       AliExternalTrackParam *tpcTrack = (AliExternalTrackParam *)track->GetTPCInnerParam();
       if(!tpcTrack) continue;
       gPt = tpcTrack->Pt();
       gP = tpcTrack->P();
+    
+      tpcTrack->PropagateToDCA(vertex,
+                              esd->GetMagneticField(),
+                              100.,dca,cov);
+
+      if(fProtonAnalysisBase->IsPrimary(esd,vertex,track)) {
+       if(fProtonAnalysisBase->IsAccepted(track)) {
+         ((TH2F *)(fQA2DList->At(0)))->Fill(gP,track->GetTPCsignal());
+         ((TH3F *)(fQA2DList->At(2)))->Fill(tpcTrack->Eta(),
+                                            tpcTrack->Phi()*180./TMath::Pi(),
+                                            npointsTPCdEdx);
+         ((TH3F *)(fQA2DList->At(4)))->Fill(tpcTrack->Eta(),
+                                            tpcTrack->Phi()*180./TMath::Pi(),
+                                            nClustersTPC);
+         ((TH3F *)(fQA2DList->At(6)))->Fill(gPt,
+                                            tpcTrack->Phi()*180./TMath::Pi(),
+                                            npointsTPCdEdx);
+         ((TH3F *)(fQA2DList->At(8)))->Fill(gPt,
+                                            tpcTrack->Phi()*180./TMath::Pi(),
+                                            nClustersTPC);     
+       }//quality cuts
+      }//primary cuts
       
       if(fProtonAnalysisBase->IsProton(track)) {
-       FillQA(esd,vertex,track);
+       //Step: kStepIdentified
+       if(fProtonAnalysisBase->GetEtaMode())
+         containerInput[0] = tpcTrack->Eta();
+       else
+         containerInput[0] = fProtonAnalysisBase->Rapidity(tpcTrack->Px(),
+                                                           tpcTrack->Py(),
+                                                           tpcTrack->Pz());
+       containerInput[1] = gPt;
        if(tpcTrack->Charge() > 0) {
          nIdentifiedProtons += 1;
-         if(fProtonAnalysisBase->GetEtaMode())
-           containerInput[0] = tpcTrack->Eta();
-         else
-           containerInput[0] = fProtonAnalysisBase->Rapidity(tpcTrack->Px(),
-                                                             tpcTrack->Py(),
-                                                             tpcTrack->Pz());
-         containerInput[1] = gPt;
-         fProtonContainer->Fill(containerInput,0);   
-         
-         if(!fProtonAnalysisBase->IsAccepted(esd,vertex,track)) continue;//track cuts
-         if(fProtonAnalysisBase->GetEtaMode())
-           containerInput[0] = tpcTrack->Eta();
-         else
-           containerInput[0] = fProtonAnalysisBase->Rapidity(tpcTrack->Px(),
-                                                             tpcTrack->Py(),
-                                                             tpcTrack->Pz());
-         containerInput[1] = gPt;
-         fProtonContainer->Fill(containerInput,1);   
-         
-         if(!fProtonAnalysisBase->IsInPhaseSpace(track)) continue; //track outside the analyzed y-Pt
-         nSurvivedProtons += 1;
-         if(fProtonAnalysisBase->GetEtaMode()) {
-           fHistYPtProtons->Fill(tpcTrack->Eta(),
-                                 gPt);
-           containerInput[0] = tpcTrack->Eta();
-         }
-         else {
-           fHistYPtProtons->Fill(fProtonAnalysisBase->Rapidity(tpcTrack->Px(),
-                                                               tpcTrack->Py(),
-                                                               tpcTrack->Pz()),
-                                 gPt);
-           //fill the container
-           containerInput[0] = fProtonAnalysisBase->Rapidity(tpcTrack->Px(),
-                                                             tpcTrack->Py(),
-                                                             tpcTrack->Pz());
-         }
-         containerInput[1] = gPt;
-         fProtonContainer->Fill(containerInput,2);   
+         fProtonContainer->Fill(containerInput,kStepIdentified);
        }//protons
        else if(tpcTrack->Charge() < 0) {
          nIdentifiedAntiProtons += 1;
-         if(fProtonAnalysisBase->GetEtaMode())
-           containerInput[0] = tpcTrack->Eta();
-         else
-           containerInput[0] = fProtonAnalysisBase->Rapidity(tpcTrack->Px(),
-                                                             tpcTrack->Py(),
-                                                             tpcTrack->Pz());
-         containerInput[1] = gPt;
-         fAntiProtonContainer->Fill(containerInput,0);   
+         fAntiProtonContainer->Fill(containerInput,kStepIdentified);
+       }//protons
+       
+       //Step: kStepIsPrimary
+       if(fProtonAnalysisBase->IsPrimary(esd,vertex,track)) {
+         if(tpcTrack->Charge() > 0)
+           fProtonContainer->Fill(containerInput,kStepIsPrimary);   
+         else if(tpcTrack->Charge() < 0) 
+           fAntiProtonContainer->Fill(containerInput,kStepIsPrimary);   
          
-         if(!fProtonAnalysisBase->IsAccepted(esd,vertex,track)) continue;//track cuts
-         if(fProtonAnalysisBase->GetEtaMode())
-           containerInput[0] = tpcTrack->Eta();
-         else
-           containerInput[0] = fProtonAnalysisBase->Rapidity(tpcTrack->Px(),
-                                                             tpcTrack->Py(),
-                                                             tpcTrack->Pz());
-         containerInput[1] = gPt;
-         fAntiProtonContainer->Fill(containerInput,1);   
+         FillQA(esd,vertex,track);       
          
-         if(!fProtonAnalysisBase->IsInPhaseSpace(track)) continue; //track outside the analyzed y-Pt
-         nSurvivedAntiProtons += 1;
-         if(fProtonAnalysisBase->GetEtaMode()) {
-           fHistYPtAntiProtons->Fill(tpcTrack->Eta(),
-                                     gPt);
-           containerInput[0] = tpcTrack->Eta();
-         }
-         else {
-           fHistYPtAntiProtons->Fill(fProtonAnalysisBase->Rapidity(tpcTrack->Px(),
-                                                                   tpcTrack->Py(),
-                                                                   tpcTrack->Pz()),
-                                     gPt);
-           //fill the container
-           containerInput[0] = fProtonAnalysisBase->Rapidity(tpcTrack->Px(),
-                                                             tpcTrack->Py(),
-                                                             tpcTrack->Pz());
-         }
-         containerInput[1] = gPt;
-         fAntiProtonContainer->Fill(containerInput,2);
-       }//antiprotons   
-      }//proton check
+         //Step: kStepSurvived
+         if(fProtonAnalysisBase->IsAccepted(track)) {
+           ((TH2F *)(fQA2DList->At(1)))->Fill(gP,track->GetTPCsignal());
+           ((TH3F *)(fQA2DList->At(3)))->Fill(tpcTrack->Eta(),
+                                              tpcTrack->Phi()*180./TMath::Pi(),
+                                              npointsTPCdEdx);
+           ((TH3F *)(fQA2DList->At(5)))->Fill(tpcTrack->Eta(),
+                                              tpcTrack->Phi()*180./TMath::Pi(),
+                                              nClustersTPC);
+           ((TH3F *)(fQA2DList->At(7)))->Fill(gPt,
+                                              tpcTrack->Phi()*180./TMath::Pi(),
+                                              npointsTPCdEdx);
+           ((TH3F *)(fQA2DList->At(9)))->Fill(gPt,
+                                              tpcTrack->Phi()*180./TMath::Pi(),
+                                              nClustersTPC);
+           
+           if(tpcTrack->Charge() > 0) {
+             fProtonContainer->Fill(containerInput,kStepSurvived);   
+             ((TH2F *)(fQA2DList->At(10)))->Fill(tpcTrack->Eta(),
+                                                 tpcTrack->Phi()*180./TMath::Pi());
+             ((TH2F *)(fQA2DList->At(12)))->Fill(tpcTrack->Pt(),
+                                                 TMath::Abs(dca[0]));
+             ((TH2F *)(fQA2DList->At(13)))->Fill(tpcTrack->Pt(),
+                                                 TMath::Abs(dca[1]));
+           }//protons
+           else if(tpcTrack->Charge() < 0) {
+             fAntiProtonContainer->Fill(containerInput,kStepSurvived);   
+             ((TH2F *)(fQA2DList->At(11)))->Fill(tpcTrack->Eta(),
+                                                 tpcTrack->Phi()*180./TMath::Pi());
+             ((TH2F *)(fQA2DList->At(14)))->Fill(tpcTrack->Pt(),
+                                                 TMath::Abs(dca[0]));
+             ((TH2F *)(fQA2DList->At(15)))->Fill(tpcTrack->Pt(),
+                                                 TMath::Abs(dca[1]));
+           }//antiprotons
+           
+           //Step: kStepInPhaseSpace
+           if(fProtonAnalysisBase->IsInPhaseSpace(track)) {
+             if(tpcTrack->Charge() > 0) {
+               nSurvivedProtons += 1;
+               fHistYPtProtons->Fill(containerInput[0],
+                                     containerInput[1]);
+               fProtonContainer->Fill(containerInput,kStepInPhaseSpace);   
+             }//protons
+             else if(tpcTrack->Charge() < 0) {
+               nSurvivedAntiProtons += 1;
+               fHistYPtAntiProtons->Fill(containerInput[0],
+                                         containerInput[1]);
+               fAntiProtonContainer->Fill(containerInput,kStepInPhaseSpace);
+             }//antiprotons
+           }//Step: kStepInPhaseSpace
+         }//Step: kStepSurvived
+       }//Step: kStepIsPrimary
+      }//Step: kStepIdentified
     }//TPC only tracks
     else if(fProtonAnalysisBase->GetAnalysisMode() == AliProtonAnalysisBase::kGlobal) {
       gPt = track->Pt();
       gP = track->P();
+      track->PropagateToDCA(vertex,
+                           esd->GetMagneticField(),
+                           100.,dca,cov);
+      
+      if(fProtonAnalysisBase->IsPrimary(esd,vertex,track)) {
+       if(fProtonAnalysisBase->IsAccepted(track)) {
+         ((TH2F *)(fQA2DList->At(0)))->Fill(gP,track->GetTPCsignal());
+         ((TH3F *)(fQA2DList->At(2)))->Fill(track->Eta(),
+                                            track->Phi()*180./TMath::Pi(),
+                                            npointsTPCdEdx);
+         ((TH3F *)(fQA2DList->At(4)))->Fill(track->Eta(),
+                                            track->Phi()*180./TMath::Pi(),
+                                            nClustersTPC);
+         ((TH3F *)(fQA2DList->At(6)))->Fill(gPt,
+                                            track->Phi()*180./TMath::Pi(),
+                                            npointsTPCdEdx);
+         ((TH3F *)(fQA2DList->At(8)))->Fill(gPt,
+                                            track->Phi()*180./TMath::Pi(),
+                                            nClustersTPC);     
+       }//quality cuts
+      }//primary cuts
       
       if(fProtonAnalysisBase->IsProton(track)) {
-       FillQA(esd,vertex,track);
+       //Step: kStepIdentified
+       if(fProtonAnalysisBase->GetEtaMode())
+         containerInput[0] = track->Eta();
+       else
+         containerInput[0] = fProtonAnalysisBase->Rapidity(track->Px(),
+                                                           track->Py(),
+                                                           track->Pz());
+       containerInput[1] = gPt;
        if(track->Charge() > 0) {
          nIdentifiedProtons += 1;
-         if(fProtonAnalysisBase->GetEtaMode())
-           containerInput[0] = track->Eta();
-         else
-           containerInput[0] = fProtonAnalysisBase->Rapidity(track->Px(),
-                                                             track->Py(),
-                                                             track->Pz());
-         containerInput[1] = gPt;
-         fProtonContainer->Fill(containerInput,0);   
-           
-         if(!fProtonAnalysisBase->IsAccepted(esd,vertex,track)) continue;//track cuts
-         if(fProtonAnalysisBase->GetEtaMode())
-           containerInput[0] = track->Eta();
-         else
-           containerInput[0] = fProtonAnalysisBase->Rapidity(track->Px(),
-                                                             track->Py(),
-                                                             track->Pz());
-         containerInput[1] = gPt;
-         fProtonContainer->Fill(containerInput,1);   
-
-         if(!fProtonAnalysisBase->IsInPhaseSpace(track)) continue; //track outside the analyzed y-Pt
-         nSurvivedProtons += 1;
-         if(fProtonAnalysisBase->GetEtaMode()) {
-           fHistYPtProtons->Fill(track->Eta(),
-                                 gPt);
-           containerInput[0] = track->Eta();
-         }
-         else {
-           fHistYPtProtons->Fill(fProtonAnalysisBase->Rapidity(track->Px(),
-                                                               track->Py(),
-                                                               track->Pz()),
-                                 gPt);
-           //fill the container
-           containerInput[0] = fProtonAnalysisBase->Rapidity(track->Px(),
-                                                             track->Py(),
-                                                             track->Pz());
-         }
-         containerInput[1] = gPt;
-         fProtonContainer->Fill(containerInput,2);   
+         fProtonContainer->Fill(containerInput,kStepIdentified);
        }//protons
        else if(track->Charge() < 0) {
          nIdentifiedAntiProtons += 1;
-         if(fProtonAnalysisBase->GetEtaMode())
-           containerInput[0] = track->Eta();
-         else
-           containerInput[0] = fProtonAnalysisBase->Rapidity(track->Px(),
-                                                             track->Py(),
-                                                             track->Pz());
-         containerInput[1] = gPt;
-         fAntiProtonContainer->Fill(containerInput,0);   
-
-         if(!fProtonAnalysisBase->IsAccepted(esd,vertex,track)) continue;//track cuts
-         if(fProtonAnalysisBase->GetEtaMode())
-           containerInput[0] = track->Eta();
-         else
-           containerInput[0] = fProtonAnalysisBase->Rapidity(track->Px(),
-                                                             track->Py(),
-                                                             track->Pz());
-         containerInput[1] = gPt;
-         fAntiProtonContainer->Fill(containerInput,1);   
+         fAntiProtonContainer->Fill(containerInput,kStepIdentified);
+       }//protons
+       
+       //Step: kStepIsPrimary
+       if(fProtonAnalysisBase->IsPrimary(esd,vertex,track)) {
+         if(track->Charge() > 0)
+           fProtonContainer->Fill(containerInput,kStepIsPrimary);   
+         else if(track->Charge() < 0) 
+           fAntiProtonContainer->Fill(containerInput,kStepIsPrimary);   
+         
+         FillQA(esd,vertex,track);       
          
-         if(!fProtonAnalysisBase->IsInPhaseSpace(track)) continue; //track outside the analyzed y-Pt
-         nSurvivedAntiProtons += 1;
-         if(fProtonAnalysisBase->GetEtaMode()) {
-           fHistYPtAntiProtons->Fill(track->Eta(),
-                                     gPt);
-           containerInput[0] = track->Eta();
-         }
-         else {
-           fHistYPtAntiProtons->Fill(fProtonAnalysisBase->Rapidity(track->Px(),
-                                                                   track->Py(),
-                                                                   track->Pz()),
-                                     gPt);
-           //fill the container
-           containerInput[0] = fProtonAnalysisBase->Rapidity(track->Px(),
-                                                             track->Py(),
-                                                             track->Pz());
-         }
-         containerInput[1] = gPt;
-         fAntiProtonContainer->Fill(containerInput,2);   
-       }//antiprotons
-      }//proton check 
-    }//combined tracking
+         //Step: kStepSurvived
+         if(fProtonAnalysisBase->IsAccepted(track)) {
+           ((TH2F *)(fQA2DList->At(1)))->Fill(gP,track->GetTPCsignal());
+           ((TH3F *)(fQA2DList->At(3)))->Fill(track->Eta(),
+                                              track->Phi()*180./TMath::Pi(),
+                                              npointsTPCdEdx);
+           ((TH3F *)(fQA2DList->At(5)))->Fill(track->Eta(),
+                                              track->Phi()*180./TMath::Pi(),
+                                              nClustersTPC);
+           ((TH3F *)(fQA2DList->At(7)))->Fill(gPt,
+                                              track->Phi()*180./TMath::Pi(),
+                                              npointsTPCdEdx);
+           ((TH3F *)(fQA2DList->At(9)))->Fill(gPt,
+                                              track->Phi()*180./TMath::Pi(),
+                                              nClustersTPC);
+           
+           if(track->Charge() > 0) {
+             fProtonContainer->Fill(containerInput,kStepSurvived);   
+             ((TH2F *)(fQA2DList->At(10)))->Fill(track->Eta(),
+                                                 track->Phi()*180./TMath::Pi());
+             ((TH2F *)(fQA2DList->At(12)))->Fill(track->Pt(),
+                                                 TMath::Abs(dca[0]));
+             ((TH2F *)(fQA2DList->At(13)))->Fill(track->Pt(),
+                                                 TMath::Abs(dca[1]));
+           }//protons
+           else if(track->Charge() < 0) {
+             fAntiProtonContainer->Fill(containerInput,kStepSurvived);   
+             ((TH2F *)(fQA2DList->At(11)))->Fill(track->Eta(),
+                                                 track->Phi()*180./TMath::Pi());
+             ((TH2F *)(fQA2DList->At(14)))->Fill(track->Pt(),
+                                                 TMath::Abs(dca[0]));
+             ((TH2F *)(fQA2DList->At(15)))->Fill(track->Pt(),
+                                                 TMath::Abs(dca[1]));
+           }//antiprotons
+           
+           //Step: kStepInPhaseSpace
+           if(fProtonAnalysisBase->IsInPhaseSpace(track)) {
+             if(track->Charge() > 0) {
+               nSurvivedProtons += 1;
+               fHistYPtProtons->Fill(containerInput[0],
+                                     containerInput[1]);
+               fProtonContainer->Fill(containerInput,kStepInPhaseSpace);   
+             }//protons
+             else if(track->Charge() < 0) {
+               nSurvivedAntiProtons += 1;
+               fHistYPtAntiProtons->Fill(containerInput[0],
+                                         containerInput[1]);
+               fAntiProtonContainer->Fill(containerInput,kStepInPhaseSpace);
+             }//antiprotons
+           }//Step: kStepInPhaseSpace
+         }//Step: kStepSurvived
+       }//Step: kStepIsPrimary
+      }//Step: kStepIdentified
+    }//Global tracking
   }//track loop 
   
+  if((nIdentifiedProtons > 0)||(nIdentifiedAntiProtons > 0))
+    fHistEvents->Fill(2); //number of analyzed events with at least one (anti)proton
+
   if(fProtonAnalysisBase->GetDebugMode())
     Printf("Initial number of tracks: %d | Identified (anti)protons: %d - %d | Survived (anti)protons: %d - %d",nTracks,nIdentifiedProtons,nIdentifiedAntiProtons,nSurvivedProtons,nSurvivedAntiProtons);
 }
@@ -881,7 +943,7 @@ void AliProtonAnalysis::Analyze(AliESDEvent* esd,
 //____________________________________________________________________//
 void AliProtonAnalysis::Analyze(AliAODEvent* const fAOD) {
   //Main analysis part - AOD
-  fHistEvents->Fill(0); //number of analyzed events
+  fHistEvents->Fill(1); //number of analyzed events
   Int_t nTracks = fAOD->GetNumberOfTracks();
   for(Int_t iTracks = 0; iTracks < nTracks; iTracks++) {
     AliAODTrack* track = fAOD->GetTrack(iTracks);
@@ -910,7 +972,7 @@ void AliProtonAnalysis::Analyze(AliAODEvent* const fAOD) {
 void AliProtonAnalysis::Analyze(AliStack* const stack, 
                                Bool_t iInclusive) {
   //Main analysis part - MC
-  fHistEvents->Fill(0); //number of analyzed events
+  fHistEvents->Fill(1); //number of analyzed events
 
   Int_t nParticles = 0;
   //inclusive protons - 
@@ -1252,7 +1314,117 @@ void AliProtonAnalysis::InitQA() {
   fQA2DList = new TList();
   fQA2DList->SetName("fQA2DList");
   fGlobalQAList->Add(fQA2DList);
-  
+
+  //dEdx plots
+  TH2F *gHistdEdxP = new TH2F("gHistdEdxP","dE/dx (TPC); P [GeV/c]; dE/dx [a.u]",1000,0.05,20.05,600,0,600);
+  fQA2DList->Add(gHistdEdxP);
+  TH2F *gHistProtonsdEdxP = new TH2F("gHistProtonsdEdxP","Accepted protons dE/dx (TPC); P [GeV/c]; dE/dx [a.u]",1000,0.05,20.05,600,0,600);
+  fQA2DList->Add(gHistProtonsdEdxP);
+
+  //eta-phi-Npoints(dEdx)
+  TH3F *gHistEtaPhiTPCdEdxNPoints = new TH3F("gHistEtaPhiTPCdEdxNPoints",
+                                            ";#eta;#phi;N_{points}(TPC)",
+                                            18,-0.9,0.9,
+                                            180,0,360,
+                                            100,0,200);
+  gHistEtaPhiTPCdEdxNPoints->SetStats(kTRUE);
+  fQA2DList->Add(gHistEtaPhiTPCdEdxNPoints);
+  TH3F *gHistProtonsEtaPhiTPCdEdxNPoints = new TH3F("gHistProtonsEtaPhiTPCdEdxNPoints",
+                                                   ";#eta;#phi;N_{points}(TPC)",
+                                                   18,-0.9,0.9,
+                                                   180,0,360,
+                                                   100,0,200);
+  gHistProtonsEtaPhiTPCdEdxNPoints->SetStats(kTRUE);
+  fQA2DList->Add(gHistProtonsEtaPhiTPCdEdxNPoints);
+
+  //eta-phi-Npoints
+  TH3F *gHistEtaPhiTPCNPoints = new TH3F("gHistEtaPhiTPCNPoints",
+                                        ";#eta;#phi;N_{points}(TPC)",
+                                        18,-0.9,0.9,
+                                        180,0,360,
+                                        100,0,200);
+  gHistEtaPhiTPCNPoints->SetStats(kTRUE);
+  fQA2DList->Add(gHistEtaPhiTPCNPoints);
+  TH3F *gHistProtonsEtaPhiTPCNPoints = new TH3F("gHistProtonsEtaPhiTPCNPoints",
+                                               ";#eta;#phi;N_{points}(TPC)",
+                                               18,-0.9,0.9,
+                                               180,0,360,
+                                               100,0,200);
+  gHistProtonsEtaPhiTPCNPoints->SetStats(kTRUE);
+  fQA2DList->Add(gHistProtonsEtaPhiTPCNPoints);
+
+  //pt-phi-Npoints(dEdx)
+  TH3F *gHistPtPhiTPCdEdxNPoints = new TH3F("gHistPtPhiTPCdEdxNPoints",
+                                           ";P_{T} [GeV/c];#phi;N_{points}(TPC)",
+                                           fNBinsPt,fMinPt,fMaxPt,
+                                           180,0,360,
+                                           100,0,200);
+  gHistPtPhiTPCdEdxNPoints->SetStats(kTRUE);
+  fQA2DList->Add(gHistPtPhiTPCdEdxNPoints);
+  TH3F *gHistProtonsPtPhiTPCdEdxNPoints = new TH3F("gHistProtonsPtPhiTPCdEdxNPoints",
+                                                   ";P_{T} [GeV/c];#phi;N_{points}(TPC)",
+                                                   fNBinsPt,fMinPt,fMaxPt,
+                                                   180,0,360,
+                                                   100,0,200);
+  gHistProtonsPtPhiTPCdEdxNPoints->SetStats(kTRUE);
+  fQA2DList->Add(gHistProtonsPtPhiTPCdEdxNPoints);
+
+  //pt-phi-Npoints
+  TH3F *gHistPtPhiTPCNPoints = new TH3F("gHistPtPhiTPCNPoints",
+                                       ";P_{T} [GeV/c];#phi;N_{points}(TPC)",
+                                       fNBinsPt,fMinPt,fMaxPt,
+                                       180,0,360,
+                                       100,0,200);
+  gHistPtPhiTPCNPoints->SetStats(kTRUE);
+  fQA2DList->Add(gHistPtPhiTPCNPoints);
+  TH3F *gHistProtonsPtPhiTPCNPoints = new TH3F("gHistProtonsPtPhiTPCNPoints",
+                                              ";P_{T} [GeV/c];#phi;N_{points}(TPC)",
+                                              fNBinsPt,fMinPt,fMaxPt,
+                                              180,0,360,
+                                              100,0,200);
+  gHistProtonsPtPhiTPCNPoints->SetStats(kTRUE);
+  fQA2DList->Add(gHistProtonsPtPhiTPCNPoints);
+
+  //eta-phi for protons & antiprotons
+  TH2F *gHistProtonsEtaPhi = new TH2F("gHistProtonsEtaPhi",
+                                     ";#eta;#phi",
+                                     18,-0.9,0.9,
+                                     180,0,360);
+  gHistProtonsEtaPhi->SetStats(kTRUE);
+  fQA2DList->Add(gHistProtonsEtaPhi);
+  TH2F *gHistAntiProtonsEtaPhi = new TH2F("gHistAntiProtonsEtaPhi",
+                                         ";#eta;#phi",
+                                         18,-0.9,0.9,
+                                         180,0,360);
+  gHistAntiProtonsEtaPhi->SetStats(kTRUE);
+  fQA2DList->Add(gHistAntiProtonsEtaPhi);
+
+  //dca vs pT for protons & antiprotons
+  TH2F *gHistProtonsDCAxyPt = new TH2F("gHistProtonsDCAxyPt",
+                                      ";P_{T} [GeV/c];dca_{xy} [cm]",
+                                      16,0.3,1.1,
+                                      1000,0,10);
+  gHistProtonsDCAxyPt->SetStats(kTRUE);
+  fQA2DList->Add(gHistProtonsDCAxyPt);
+  TH2F *gHistProtonsDCAzPt = new TH2F("gHistProtonsDCAzPt",
+                                     ";P_{T} [GeV/c];dca_{z} [cm]",
+                                     16,0.3,1.1,
+                                     1000,0,10);
+  gHistProtonsDCAzPt->SetStats(kTRUE);
+  fQA2DList->Add(gHistProtonsDCAzPt);
+  TH2F *gHistAntiProtonsDCAxyPt = new TH2F("gHistAntiProtonsDCAxyPt",
+                                          ";P_{T} [GeV/c];dca_{xy} [cm]",
+                                          16,0.3,1.1,
+                                          1000,0,10);
+  gHistAntiProtonsDCAxyPt->SetStats(kTRUE);
+  fQA2DList->Add(gHistAntiProtonsDCAxyPt);
+  TH2F *gHistAntiProtonsDCAzPt = new TH2F("gHistAntiProtonsDCAzPt",
+                                         ";P_{T} [GeV/c];dca_{z} [cm]",
+                                         16,0.3,1.1,
+                                         1000,0,10);
+  gHistAntiProtonsDCAzPt->SetStats(kTRUE);
+  fQA2DList->Add(gHistAntiProtonsDCAzPt);
+
   //========================================================//
   fQAProtonsAcceptedList = new TList();
   fQAProtonsAcceptedList->SetName("fQAProtonsAcceptedList");