]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ANALYSIS/AliAnalysisTaskPIDqa.cxx
Filtering out the beam-gas.
[u/mrichter/AliRoot.git] / ANALYSIS / AliAnalysisTaskPIDqa.cxx
index 68c1ed48be7f2b6b6fb842fd3b9f39b976ae372d..461902f175b990e05087d9ce313a08bf3bcfc0d3 100644 (file)
@@ -38,6 +38,8 @@
 #include <AliTRDPIDResponse.h>
 #include <AliTOFPIDResponse.h>
 
+#include <AliESDEvent.h>
+
 #include "AliAnalysisTaskPIDqa.h"
 
 
@@ -49,10 +51,14 @@ AliAnalysisTaskSE(),
 fPIDResponse(0x0),
 fListQA(0x0),
 fListQAits(0x0),
+fListQAitsSA(0x0),
+fListQAitsPureSA(0x0),
 fListQAtpc(0x0),
 fListQAtrd(0x0),
 fListQAtof(0x0),
 fListQAemcal(0x0),
+fListQAhmpid(0x0),
+fListQAtofhmpid(0x0),
 fListQAtpctof(0x0)
 {
   //
@@ -66,10 +72,14 @@ AliAnalysisTaskSE(name),
 fPIDResponse(0x0),
 fListQA(0x0),
 fListQAits(0x0),
+fListQAitsSA(0x0),
+fListQAitsPureSA(0x0),
 fListQAtpc(0x0),
 fListQAtrd(0x0),
 fListQAtof(0x0),
 fListQAemcal(0x0),
+fListQAhmpid(0x0),
+fListQAtofhmpid(0x0),
 fListQAtpctof(0x0)
 {
   //
@@ -85,7 +95,7 @@ AliAnalysisTaskPIDqa::~AliAnalysisTaskPIDqa()
   //
   // Destructor
   //
-
+  delete fListQA;
 }
 
 //______________________________________________________________________________
@@ -113,7 +123,15 @@ void AliAnalysisTaskPIDqa::UserCreateOutputObjects()
   fListQAits=new TList;
   fListQAits->SetOwner();
   fListQAits->SetName("ITS");
-  
+
+  fListQAitsSA=new TList;
+  fListQAitsSA->SetOwner();
+  fListQAitsSA->SetName("ITS_SA");
+
+  fListQAitsPureSA=new TList;
+  fListQAitsPureSA->SetOwner();
+  fListQAitsPureSA->SetName("ITS_PureSA");
+
   fListQAtpc=new TList;
   fListQAtpc->SetOwner();
   fListQAtpc->SetName("TPC");
@@ -129,25 +147,39 @@ void AliAnalysisTaskPIDqa::UserCreateOutputObjects()
   fListQAemcal=new TList;
   fListQAemcal->SetOwner();
   fListQAemcal->SetName("EMCAL");
-
+  
+  fListQAhmpid=new TList;
+  fListQAhmpid->SetOwner();
+  fListQAhmpid->SetName("HMPID");
+  
   fListQAtpctof=new TList;
   fListQAtpctof->SetOwner();
   fListQAtpctof->SetName("TPC_TOF");
 
+  fListQAtofhmpid=new TList;
+  fListQAtofhmpid->SetOwner();
+  fListQAtofhmpid->SetName("TOF_HMPID");
+  
   fListQA->Add(fListQAits);
+  fListQA->Add(fListQAitsSA);
+  fListQA->Add(fListQAitsPureSA);
   fListQA->Add(fListQAtpc);
   fListQA->Add(fListQAtrd);
   fListQA->Add(fListQAtof);
   fListQA->Add(fListQAemcal);
+  fListQA->Add(fListQAhmpid);
   fListQA->Add(fListQAtpctof);
+  fListQA->Add(fListQAtofhmpid);
 
   SetupITSqa();
   SetupTPCqa();
   SetupTRDqa();
   SetupTOFqa();
   SetupEMCALqa();
+  SetupHMPIDqa();
   SetupTPCTOFqa();
-
+  SetupTOFHMPIDqa();
+  
   PostData(1,fListQA);
 }
 
@@ -168,8 +200,12 @@ void AliAnalysisTaskPIDqa::UserExec(Option_t */*option*/)
   FillTRDqa();
   FillTOFqa();
   FillEMCALqa();
+  FillHMPIDqa();
+  
+  //combined detector QA
   FillTPCTOFqa();
-
+  FillTOFHMPIDqa();
+  
   PostData(1,fListQA);
 }
 
@@ -187,24 +223,37 @@ void AliAnalysisTaskPIDqa::FillITSqa()
     AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
     ULong_t status=track->GetStatus();
     // not that nice. status bits not in virtual interface
-    // ITS refit + ITS pid
-    if (!( ( (status & AliVTrack::kITSrefit)==AliVTrack::kITSrefit ) &&
-           ( (status & AliVTrack::kITSpid  )==AliVTrack::kITSpid   ) )) continue;
+    // ITS refit + ITS pid selection
+    if (!( ( (status & AliVTrack::kITSrefit)==AliVTrack::kITSrefit ) ||
+          ! ( (status & AliVTrack::kITSpid  )==AliVTrack::kITSpid   ) )) continue;
     Double_t mom=track->P();
     
+    TList *theList = 0x0;
+    if(( (status & AliVTrack::kTPCin)==AliVTrack::kTPCin )){
+      //ITS+TPC tracks
+      theList=fListQAits;
+    }else{
+      if(!( (status & AliVTrack::kITSpureSA)==AliVTrack::kITSpureSA )){ 
+       //ITS Standalone tracks
+       theList=fListQAitsSA;
+      }else{
+       //ITS Pure Standalone tracks
+       theList=fListQAitsPureSA;
+      }
+    }
+    
+    
     for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
-      TH2 *h=(TH2*)fListQAits->At(ispecie);
+      TH2 *h=(TH2*)theList->At(ispecie);
       if (!h) continue;
       Double_t nSigma=fPIDResponse->NumberOfSigmasITS(track, (AliPID::EParticleType)ispecie);
       h->Fill(mom,nSigma);
     }
-    
-    TH2 *h=(TH2*)fListQAits->At(AliPID::kSPECIES);
+    TH2 *h=(TH2*)theList->At(AliPID::kSPECIES);
     if (h) {
       Double_t sig=track->GetITSsignal();
       h->Fill(mom,sig);
     }
-    
   }
 }
 
@@ -228,9 +277,10 @@ void AliAnalysisTaskPIDqa::FillTPCqa()
     // not that nice. status bits not in virtual interface
     // TPC refit + ITS refit + TPC pid
     if (!( (status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
-        !( (status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ||
-        !( (status & AliVTrack::kTPCpid  ) == AliVTrack::kTPCpid  ) ) continue;
-    
+        !( (status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ) continue;
+
+    // The TPC pid cut removes the light nuclei (>5 sigma from proton line)
+    //||        !( (status & AliVTrack::kTPCpid  ) == AliVTrack::kTPCpid  )
     Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
     Float_t  ratioCrossedRowsOverFindableClustersTPC = 1.0;
     if (track->GetTPCNclsF()>0) {
@@ -262,64 +312,137 @@ void AliAnalysisTaskPIDqa::FillTRDqa()
   //
   // Fill PID qa histograms for the TRD
   //
+  AliVEvent *event=InputEvent();
+  Int_t ntracks = event->GetNumberOfTracks();
+  for(Int_t itrack = 0; itrack <  ntracks; itrack++){
+    AliVTrack *track = (AliVTrack *)event->GetTrack(itrack);
+
+    //
+    //basic track cuts
+    //
+    ULong_t status=track->GetStatus();
+    // not that nice. status bits not in virtual interface
+    // TPC refit + ITS refit + TPC pid + TRD out
+    if (!( (status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
+        !( (status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ||
+//         !( (status & AliVTrack::kTPCpid  ) == AliVTrack::kTPCpid  ) || //removes light nuclei. So it is out for the moment
+        !( (status & AliVTrack::kTRDout  ) == AliVTrack::kTRDout  )) continue;
+    
+    Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
+    Float_t  ratioCrossedRowsOverFindableClustersTPC = 1.0;
+    if (track->GetTPCNclsF()>0) {
+      ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
+    }
+    
+    if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
 
+    Double_t likelihoods[AliPID::kSPECIES];
+    if(fPIDResponse->ComputeTRDProbability(track, AliPID::kSPECIES, likelihoods) != AliPIDResponse::kDetPidOk) continue;
+    Int_t ntracklets = 0;
+    Double_t momentum = -1.;
+    for(Int_t itl = 0; itl < 6; itl++)
+      if(track->GetTRDmomentum(itl) > 0.){
+        ntracklets++;
+        if(momentum < 0) momentum = track->GetTRDmomentum(itl);
+    } 
+    for(Int_t ispecie = 0; ispecie < AliPID::kSPECIES; ispecie++){
+      TH2F *hLike = (TH2F *)fListQAtrd->At(ntracklets*AliPID::kSPECIES+ispecie);
+      if (hLike) hLike->Fill(momentum,likelihoods[ispecie]);
+    }
+  }
 }
 
 //______________________________________________________________________________
 void AliAnalysisTaskPIDqa::FillTOFqa()
 {
   //
-  // Fill PID qa histograms for the TOF
+  // Fill TOF information
   //
-
   AliVEvent *event=InputEvent();
-  
+
   Int_t ntracks=event->GetNumberOfTracks();
+  Int_t tracksAtTof = 0;
   for(Int_t itrack = 0; itrack < ntracks; itrack++){
     AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
-    
+
     //
     //basic track cuts
     //
     ULong_t status=track->GetStatus();
-    // not that nice. status bits not in virtual interface
     // TPC refit + ITS refit +
     // TOF out + TOFpid +
     // kTIME
+    // (we don't use kTOFmismatch because it depends on TPC....)
     if (!((status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
         !((status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ||
         !((status & AliVTrack::kTOFout  ) == AliVTrack::kTOFout  ) ||
         !((status & AliVTrack::kTOFpid  ) == AliVTrack::kTOFpid  ) ||
         !((status & AliVTrack::kTIME    ) == AliVTrack::kTIME    ) ) continue;
-    
+
     Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
     Float_t  ratioCrossedRowsOverFindableClustersTPC = 1.0;
     if (track->GetTPCNclsF()>0) {
       ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
     }
-    
+
     if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
-    
-    
+
+    tracksAtTof++;
+
     Double_t mom=track->P();
-    
+
     for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
-      //TOF nSigma
       TH2 *h=(TH2*)fListQAtof->At(ispecie);
       if (!h) continue;
       Double_t nSigma=fPIDResponse->NumberOfSigmasTOF(track, (AliPID::EParticleType)ispecie);
       h->Fill(mom,nSigma);
     }
-    
-    TH2 *h=(TH2*)fListQAtof->At(AliPID::kSPECIES);
+
+    TH2 *h=(TH2*)fListQAtof->FindObject("hSigP_TOF");
     if (h) {
-      Double_t sig=track->GetTOFsignal();
+      Double_t sig=track->GetTOFsignal()/1000.;
       h->Fill(mom,sig);
     }
-    
+
+    Int_t mask = fPIDResponse->GetTOFResponse().GetStartTimeMask(mom);
+    ((TH1F*)fListQAtof->FindObject("hStartTimeMask_TOF"))->Fill((Double_t)(mask+0.5));
+
+    if (mom >= 0.75 && mom <= 1.25 ) {
+      Double_t nsigma= fPIDResponse->NumberOfSigmasTOF(track, (AliPID::EParticleType)AliPID::kPion);
+      if (mask == 0) {
+       ((TH1F*)fListQAtof->FindObject("hNsigma_TOF_Pion_T0-Fill"))->Fill(nsigma);
+      } else if (mask == 1) {
+       ((TH1F*)fListQAtof->FindObject("hNsigma_TOF_Pion_T0-TOF"))->Fill(nsigma);
+      } else if ( (mask == 2) || (mask == 4) || (mask == 6) ) {
+       ((TH1F*)fListQAtof->FindObject("hNsigma_TOF_Pion_T0-T0"))->Fill(nsigma);
+      } else {
+       ((TH1F*)fListQAtof->FindObject("hNsigma_TOF_Pion_T0-Best"))->Fill(nsigma);
+      }
+    }
+
+    Double_t res = (Double_t)fPIDResponse->GetTOFResponse().GetStartTimeRes(mom);
+    ((TH1F*)fListQAtof->FindObject("hStartTimeRes_TOF"))->Fill(res);
+
+    AliESDEvent *esd = dynamic_cast<AliESDEvent *>(event);
+    if (esd) {
+      Double_t startTime = esd->GetT0TOF(0);
+      if (startTime < 90000) ((TH1F*)fListQAtof->FindObject("hStartTimeAC_T0"))->Fill(startTime);
+      else {
+        startTime = esd->GetT0TOF(1);
+        if (startTime < 90000) ((TH1F*)fListQAtof->FindObject("hStartTimeA_T0"))->Fill(startTime);
+        startTime = esd->GetT0TOF(2);
+        if (startTime < 90000) ((TH1F*)fListQAtof->FindObject("hStartTimeC_T0"))->Fill(startTime);
+      }
+    }
+  }
+  if (tracksAtTof > 0) {
+    ((TH1F* )fListQAtof->FindObject("hnTracksAt_TOF"))->Fill(tracksAtTof);
+    Int_t mask = fPIDResponse->GetTOFResponse().GetStartTimeMask(5.);
+    if (mask & 0x1) ((TH1F*)fListQAtof->FindObject("hT0MakerEff"))->Fill(tracksAtTof);
   }
 }
 
+
 //______________________________________________________________________________
 void AliAnalysisTaskPIDqa::FillEMCALqa()
 {
@@ -327,6 +450,155 @@ void AliAnalysisTaskPIDqa::FillEMCALqa()
   // Fill PID qa histograms for the EMCAL
   //
 
+  AliVEvent *event=InputEvent();
+  
+  Int_t ntracks=event->GetNumberOfTracks();
+  for(Int_t itrack = 0; itrack < ntracks; itrack++){
+    AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
+    
+    //
+    //basic track cuts
+    //
+    ULong_t status=track->GetStatus();
+    // not that nice. status bits not in virtual interface
+    // TPC refit + ITS refit +
+    // TOF out + TOFpid +
+    // kTIME
+    if (!( (status & AliVTrack::kEMCALmatch) == AliVTrack::kEMCALmatch) ) continue;
+
+    Double_t pt=track->Pt();
+   
+    //EMCAL nSigma (only for electrons at the moment)
+    TH2 *h=(TH2*)fListQAemcal->At(0);
+    if (!h) continue;
+    Double_t nSigma=fPIDResponse->NumberOfSigmasEMCAL(track, (AliPID::EParticleType)0);
+    h->Fill(pt,nSigma);
+    
+    //EMCAL signal (E/p vs. pT)
+    h=(TH2*)fListQAemcal->At(1);
+    if (h) {
+
+      Int_t nMatchClus = track->GetEMCALcluster();
+      Double_t mom     = track->P();
+      Double_t eop     = -1.;
+
+      if(nMatchClus > -1){
+    
+        AliVCluster *matchedClus = (AliVCluster*)event->GetCaloCluster(nMatchClus);
+
+        if(matchedClus){
+
+          // matched cluster is EMCAL
+          if(matchedClus->IsEMCAL()){
+
+            Double_t fClsE       = matchedClus->E();
+            eop                  = fClsE/mom;
+
+            h->Fill(pt,eop);
+
+          }
+        }
+      }
+    }
+  }
+}
+
+
+//______________________________________________________________________________
+void AliAnalysisTaskPIDqa::FillHMPIDqa()
+{
+  //
+  // Fill PID qa histograms for the HMPID
+  //
+  
+  AliVEvent *event=InputEvent();
+  
+  Int_t ntracks=event->GetNumberOfTracks();
+  for(Int_t itrack = 0; itrack < ntracks; itrack++){
+    AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
+    
+    //
+    //basic track cuts
+    //
+    ULong_t status=track->GetStatus();
+    // not that nice. status bits not in virtual interface
+    // TPC refit + ITS refit +
+    // TOF out + TOFpid +
+    // kTIME
+    if (!((status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
+        !((status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ) continue;
+
+    Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
+    Float_t  ratioCrossedRowsOverFindableClustersTPC = 1.0;
+    if (track->GetTPCNclsF()>0) {
+      ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
+    }
+
+    if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
+    
+    Double_t mom = track->P();
+    Double_t ckovAngle = track->GetHMPIDsignal();
+    
+    TH1F *hThetavsMom = (TH1F*)fListQAhmpid->At(0);;
+    
+    hThetavsMom->Fill(mom,ckovAngle);    
+  
+  }
+}
+//______________________________________________________________________________
+void AliAnalysisTaskPIDqa::FillTOFHMPIDqa()
+{
+  //
+  // Fill PID qa histograms for the HMPID
+  //
+  
+  AliVEvent *event=InputEvent();
+  
+  Int_t ntracks=event->GetNumberOfTracks();
+  for(Int_t itrack = 0; itrack < ntracks; itrack++){
+    AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
+    
+    //
+    //basic track cuts
+    //
+    ULong_t status=track->GetStatus();
+    // not that nice. status bits not in virtual interface
+    // TPC refit + ITS refit +
+    // TOF out + TOFpid +
+    // kTIME
+    if (!((status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
+        !((status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ||
+        !((status & AliVTrack::kTOFout  ) == AliVTrack::kTOFout  ) ||
+        !((status & AliVTrack::kTOFpid  ) == AliVTrack::kTOFpid  ) ||
+        !((status & AliVTrack::kTIME    ) == AliVTrack::kTIME    ) ) continue;
+
+    Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
+    Float_t  ratioCrossedRowsOverFindableClustersTPC = 1.0;
+    if (track->GetTPCNclsF()>0) {
+      ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
+    }
+
+    if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
+    
+    Double_t mom = track->P();
+    Double_t ckovAngle = track->GetHMPIDsignal();
+    
+    Double_t nSigmaTOF[3]; 
+    TH1F *h[3];
+    
+    for (Int_t ispecie=2; ispecie<AliPID::kSPECIES; ++ispecie){
+      //TOF nSigma
+      nSigmaTOF[ispecie]=fPIDResponse->NumberOfSigmasTOF(track, (AliPID::EParticleType)ispecie);
+      h[ispecie-2] = (TH1F*)fListQAtofhmpid->At(ispecie-2);}
+      
+    if(TMath::Abs(nSigmaTOF[0])<2)                                                              h[0]->Fill(mom,ckovAngle);
+    
+    if(TMath::Abs(nSigmaTOF[1])<2 && TMath::Abs(nSigmaTOF[0])>3)                                h[1]->Fill(mom,ckovAngle);
+
+    if(TMath::Abs(nSigmaTOF[2])<2 && TMath::Abs(nSigmaTOF[1])>3 && TMath::Abs(nSigmaTOF[0])>3)  h[2]->Fill(mom,ckovAngle);
+      
+  }
+  
 }
 
 //______________________________________________________________________________
@@ -353,7 +625,7 @@ void AliAnalysisTaskPIDqa::FillTPCTOFqa()
     // kTIME
     if (!((status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
         !((status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ||
-        !( (status & AliVTrack::kTPCpid  ) == AliVTrack::kTPCpid ) ||
+//         !( (status & AliVTrack::kTPCpid  ) == AliVTrack::kTPCpid ) || //removes light nuclei, so it is out for the moment
         !((status & AliVTrack::kTOFout  ) == AliVTrack::kTOFout  ) ||
         !((status & AliVTrack::kTOFpid  ) == AliVTrack::kTOFpid  ) ||
         !((status & AliVTrack::kTIME    ) == AliVTrack::kTIME    ) ) continue;
@@ -383,6 +655,33 @@ void AliAnalysisTaskPIDqa::FillTPCTOFqa()
       h=(TH2*)fListQAtpctof->At(ispecie+AliPID::kSPECIES);
       if (h && TMath::Abs(nSigmaTPC)<3.) h->Fill(mom,nSigmaTOF);
 
+      //EMCAL after TOF and TPC cut
+      h=(TH2*)fListQAtpctof->At(ispecie+2*AliPID::kSPECIES);
+      if (h && TMath::Abs(nSigmaTOF)<3. && TMath::Abs(nSigmaTPC)<3. ){
+
+       Int_t nMatchClus = track->GetEMCALcluster();
+       Double_t pt      = track->Pt();
+       Double_t eop     = -1.;
+       
+       if(nMatchClus > -1){
+         
+         AliVCluster *matchedClus = (AliVCluster*)event->GetCaloCluster(nMatchClus);
+         
+         if(matchedClus){
+           
+           // matched cluster is EMCAL
+           if(matchedClus->IsEMCAL()){
+             
+             Double_t fClsE       = matchedClus->E();
+             eop                  = fClsE/mom;
+
+             h->Fill(pt,eop);
+             
+           }
+         }
+       }
+      }
     }
   }
 }
@@ -396,6 +695,7 @@ void AliAnalysisTaskPIDqa::SetupITSqa()
   
   TVectorD *vX=MakeLogBinning(200,.1,30);
   
+  //ITS+TPC tracks
   for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
     TH2F *hNsigmaP = new TH2F(Form("hNsigmaP_ITS_%s",AliPID::ParticleName(ispecie)),
                               Form("ITS n#sigma %s vs. p;p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
@@ -403,14 +703,40 @@ void AliAnalysisTaskPIDqa::SetupITSqa()
                               200,-10,10);
     fListQAits->Add(hNsigmaP);
   }
-  
-  
   TH2F *hSig = new TH2F("hSigP_ITS",
                         "ITS signal vs. p;p [GeV]; ITS signal [arb. units]",
                         vX->GetNrows()-1,vX->GetMatrixArray(),
                         300,0,300);
   fListQAits->Add(hSig);
 
+  //ITS Standalone tracks
+  for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
+    TH2F *hNsigmaPSA = new TH2F(Form("hNsigmaP_ITSSA_%s",AliPID::ParticleName(ispecie)),
+                               Form("ITS n#sigma %s vs. p;p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
+                               vX->GetNrows()-1,vX->GetMatrixArray(),
+                               200,-10,10);
+    fListQAitsSA->Add(hNsigmaPSA);
+  }
+  TH2F *hSigSA = new TH2F("hSigP_ITSSA",
+                         "ITS signal vs. p;p [GeV]; ITS signal [arb. units]",
+                         vX->GetNrows()-1,vX->GetMatrixArray(),
+                         300,0,300);
+  fListQAitsSA->Add(hSigSA);
+  
+  //ITS Pure Standalone tracks
+  for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
+    TH2F *hNsigmaPPureSA = new TH2F(Form("hNsigmaP_ITSPureSA_%s",AliPID::ParticleName(ispecie)),
+                                   Form("ITS n#sigma %s vs. p;p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
+                                   vX->GetNrows()-1,vX->GetMatrixArray(),
+                                   200,-10,10);
+    fListQAitsPureSA->Add(hNsigmaPPureSA);
+  }
+  TH2F *hSigPureSA = new TH2F("hSigP_ITSPureSA",
+                             "ITS signal vs. p;p [GeV]; ITS signal [arb. units]",
+                             vX->GetNrows()-1,vX->GetMatrixArray(),
+                             300,0,300);
+  fListQAitsPureSA->Add(hSigPureSA);
+  
   delete vX;  
 }
 
@@ -447,7 +773,17 @@ void AliAnalysisTaskPIDqa::SetupTRDqa()
   //
   // Create the TRD qa objects
   //
-  
+  TVectorD *vX=MakeLogBinning(200,.1,30);
+  for(Int_t itl = 0; itl < 6; ++itl){
+    for(Int_t ispecie = 0; ispecie < AliPID::kSPECIES; ispecie++){
+      TH2F *hLikeP = new TH2F(Form("hLikeP_TRD_%dtls_%s", itl, AliPID::ParticleName(ispecie)),
+                              Form("TRD Likelihood to be %s %s for tracks having %d %s; p (GeV/c); TRD %s Likelihood", ispecie == 0 ? "an" : "a", AliPID::ParticleName(ispecie), itl+1, itl == 0 ? "tracklet" : "tracklets", AliPID::ParticleName(ispecie)),
+                              vX->GetNrows()-1, vX->GetMatrixArray(),
+                              100, 0., 1.);
+      fListQAtrd->Add(hLikeP);
+    }
+  }
+  delete vX;
 }
 
 //______________________________________________________________________________
@@ -458,7 +794,7 @@ void AliAnalysisTaskPIDqa::SetupTOFqa()
   //
   
   TVectorD *vX=MakeLogBinning(200,.1,30);
-  
+
   for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
     TH2F *hNsigmaP = new TH2F(Form("hNsigmaP_TOF_%s",AliPID::ParticleName(ispecie)),
                               Form("TOF n#sigma %s vs. p;p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
@@ -466,15 +802,43 @@ void AliAnalysisTaskPIDqa::SetupTOFqa()
                               200,-10,10);
     fListQAtof->Add(hNsigmaP);
   }
-  
-  
+
+  // for Kaons PID we differentiate on Time Zero
+  TH1F *hnSigT0Fill = new TH1F("hNsigma_TOF_Pion_T0-Fill","TOF n#sigma (Pion) T0-FILL [0.75-1.25. GeV/c]",200,-10,10);
+  fListQAtof->Add(hnSigT0Fill);
+  TH1F *hnSigT0T0 = new TH1F("hNsigma_TOF_Pion_T0-T0","TOF n#sigma (Pion) T0-T0 [0.75-1.25 GeV/c]",200,-10,10);
+  fListQAtof->Add(hnSigT0T0);
+  TH1F *hnSigT0TOF = new TH1F("hNsigma_TOF_Pion_T0-TOF","TOF n#sigma (Pion) T0-TOF [0.75-1.25 GeV/c]",200,-10,10);
+  fListQAtof->Add(hnSigT0TOF);
+  TH1F *hnSigT0Best = new TH1F("hNsigma_TOF_Pion_T0-Best","TOF n#sigma (Pion) T0-Best [0.75-1.25 GeV/c]",200,-10,10);
+  fListQAtof->Add(hnSigT0Best);
+
   TH2F *hSig = new TH2F("hSigP_TOF",
-                        "TOF signal vs. p;p [GeV]; TOF signal [arb. units]",
+                        "TOF signal vs. p;p [GeV]; TOF signal [ns]",
                         vX->GetNrows()-1,vX->GetMatrixArray(),
-                        300,0,300);
+                        300,0,30);
+
+  delete vX;
+  
   fListQAtof->Add(hSig);
 
-  delete vX;  
+  TH1F *hStartTimeMaskTOF = new TH1F("hStartTimeMask_TOF","StartTime mask",8,0,8);
+  fListQAtof->Add(hStartTimeMaskTOF);
+  TH1F *hStartTimeResTOF = new TH1F("hStartTimeRes_TOF","StartTime resolution [ps]",100,0,500);
+  fListQAtof->Add(hStartTimeResTOF);
+
+  TH1F *hnTracksAtTOF = new TH1F("hnTracksAt_TOF","Matched tracks at TOF",20,0,20);
+  fListQAtof->Add(hnTracksAtTOF);
+  TH1F *hT0MakerEff = new TH1F("hT0MakerEff","Events with T0-TOF vs nTracks",20,0,20);
+  fListQAtof->Add(hT0MakerEff);
+
+  // this in principle should stay on a T0 PID QA, but are just the data prepared for TOF use
+  TH1F *hStartTimeAT0 = new TH1F("hStartTimeA_T0","StartTime from T0A [ps]",1000,-1000,1000);
+  fListQAtof->Add(hStartTimeAT0);
+  TH1F *hStartTimeCT0 = new TH1F("hStartTimeC_T0","StartTime from T0C [ps]",1000,-1000,1000);
+  fListQAtof->Add(hStartTimeCT0);
+  TH1F *hStartTimeACT0 = new TH1F("hStartTimeAC_T0","StartTime from T0AC [ps]",1000,-1000,1000);;
+  fListQAtof->Add(hStartTimeACT0);
 }
 
 //______________________________________________________________________________
@@ -484,8 +848,54 @@ void AliAnalysisTaskPIDqa::SetupEMCALqa()
   // Create the EMCAL qa objects
   //
 
+  TVectorD *vX=MakeLogBinning(200,.1,30);
+  
+  TH2F *hNsigmaPt = new TH2F(Form("hNsigmaPt_EMCAL_%s",AliPID::ParticleName(0)),
+                            Form("EMCAL n#sigma %s vs. p_{T};p_{T} [GeV]; n#sigma",AliPID::ParticleName(0)),
+                            vX->GetNrows()-1,vX->GetMatrixArray(),
+                            200,-10,10);
+  fListQAemcal->Add(hNsigmaPt);  
+  
+  TH2F *hSigPt = new TH2F("hSigPt_EMCAL",
+                        "EMCAL signal (E/p) vs. p_{T};p_{T} [GeV]; EMCAL signal (E/p) [arb. units]",
+                        vX->GetNrows()-1,vX->GetMatrixArray(),
+                        200,0,2);
+  fListQAemcal->Add(hSigPt);
+
+  delete vX;  
+}
+
+//______________________________________________________________________________
+void AliAnalysisTaskPIDqa::SetupHMPIDqa()
+{
+  //
+  // Create the HMPID qa objects
+  //
+  
+  TH2F *hCkovAnglevsMom   = new TH2F("hCkovAnglevsMom",  "Cherenkov angle vs momnetum",500,0,5.,500,0,1);
+  fListQAhmpid->Add(hCkovAnglevsMom);
+  
 }
 
+//______________________________________________________________________________
+void AliAnalysisTaskPIDqa::SetupTOFHMPIDqa()
+{
+  //
+  // Create the HMPID qa objects
+  //
+  
+  TH2F *hCkovAnglevsMomPion   = new TH2F("hCkovAnglevsMom_pion",  "Cherenkov angle vs momnetum for pions",500,0,5.,500,0,1);
+  fListQAtofhmpid->Add(hCkovAnglevsMomPion);
+  
+  TH2F *hCkovAnglevsMomKaon   = new TH2F("hCkovAnglevsMom_kaon",  "Cherenkov angle vs momnetum for kaons",500,0,5.,500,0,1);
+  fListQAtofhmpid->Add(hCkovAnglevsMomKaon);
+  
+  TH2F *hCkovAnglevsMomProton = new TH2F("hCkovAnglevsMom_proton","Cherenkov angle vs momnetum for protons",500,0,5.,500,0,1);
+  fListQAtofhmpid->Add(hCkovAnglevsMomProton);
+  
+  
+}  
+
 //______________________________________________________________________________
 void AliAnalysisTaskPIDqa::SetupTPCTOFqa()
 {
@@ -513,6 +923,15 @@ void AliAnalysisTaskPIDqa::SetupTPCTOFqa()
     fListQAtpctof->Add(hNsigmaP);
   }
 
+  //EMCAL signal after TOF and TPC cut
+  for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
+    TH2F *heopPt = new TH2F(Form("heopPt_TOF_TPC_%s",AliPID::ParticleName(ispecie)),
+                           Form("EMCAL signal (E/p) %s vs. p_{T};p_{T} [GeV]; EMCAL signal (E/p) [arb. units]",AliPID::ParticleName(ispecie)),
+                           vX->GetNrows()-1,vX->GetMatrixArray(),
+                           200,0,2);
+    fListQAtpctof->Add(heopPt);
+  }
+
   delete vX;
 }
 
@@ -594,3 +1013,4 @@ TVectorD* AliAnalysisTaskPIDqa::MakeArbitraryBinning(const char* bins)
   delete arr;
   return binLimits;
 }
+