]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ANALYSIS/AliAnalysisTaskPIDqa.cxx
new data types for arrays of cluster ids used for verification of data compression
[u/mrichter/AliRoot.git] / ANALYSIS / AliAnalysisTaskPIDqa.cxx
index 36b70fe1f4789788e4c79201a5901ae0a5461443..355e4edadb831733eb8a4196c9569e00dbc965ef 100644 (file)
@@ -38,6 +38,8 @@
 #include <AliTRDPIDResponse.h>
 #include <AliTOFPIDResponse.h>
 
+#include <AliESDEvent.h>
+
 #include "AliAnalysisTaskPIDqa.h"
 
 
@@ -49,9 +51,13 @@ AliAnalysisTaskSE(),
 fPIDResponse(0x0),
 fListQA(0x0),
 fListQAits(0x0),
+fListQAitsSA(0x0),
+fListQAitsPureSA(0x0),
 fListQAtpc(0x0),
 fListQAtrd(0x0),
-fListQAtof(0x0)
+fListQAtof(0x0),
+fListQAemcal(0x0),
+fListQAtpctof(0x0)
 {
   //
   // Dummy constructor
@@ -64,9 +70,13 @@ AliAnalysisTaskSE(name),
 fPIDResponse(0x0),
 fListQA(0x0),
 fListQAits(0x0),
+fListQAitsSA(0x0),
+fListQAitsPureSA(0x0),
 fListQAtpc(0x0),
 fListQAtrd(0x0),
-fListQAtof(0x0)
+fListQAtof(0x0),
+fListQAemcal(0x0),
+fListQAtpctof(0x0)
 {
   //
   // Default constructor
@@ -109,7 +119,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");
@@ -122,15 +140,29 @@ void AliAnalysisTaskPIDqa::UserCreateOutputObjects()
   fListQAtof->SetOwner();
   fListQAtof->SetName("TOF");
   
+  fListQAemcal=new TList;
+  fListQAemcal->SetOwner();
+  fListQAemcal->SetName("EMCAL");
+
+  fListQAtpctof=new TList;
+  fListQAtpctof->SetOwner();
+  fListQAtpctof->SetName("TPC_TOF");
+
   fListQA->Add(fListQAits);
+  fListQA->Add(fListQAitsSA);
+  fListQA->Add(fListQAitsPureSA);
   fListQA->Add(fListQAtpc);
   fListQA->Add(fListQAtrd);
   fListQA->Add(fListQAtof);
+  fListQA->Add(fListQAemcal);
+  fListQA->Add(fListQAtpctof);
 
   SetupITSqa();
   SetupTPCqa();
   SetupTRDqa();
   SetupTOFqa();
+  SetupEMCALqa();
+  SetupTPCTOFqa();
 
   PostData(1,fListQA);
 }
@@ -149,7 +181,10 @@ void AliAnalysisTaskPIDqa::UserExec(Option_t */*option*/)
   
   FillITSqa();
   FillTPCqa();
+  FillTRDqa();
   FillTOFqa();
+  FillEMCALqa();
+  FillTPCTOFqa();
 
   PostData(1,fListQA);
 }
@@ -157,6 +192,10 @@ void AliAnalysisTaskPIDqa::UserExec(Option_t */*option*/)
 //______________________________________________________________________________
 void AliAnalysisTaskPIDqa::FillITSqa()
 {
+  //
+  // Fill PID qa histograms for the ITS
+  //
+
   AliVEvent *event=InputEvent();
   
   Int_t ntracks=event->GetNumberOfTracks();
@@ -164,30 +203,47 @@ 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);
     }
-    
   }
 }
 
 //______________________________________________________________________________
 void AliAnalysisTaskPIDqa::FillTPCqa()
 {
+  //
+  // Fill PID qa histograms for the TPC
+  //
+  
   AliVEvent *event=InputEvent();
   
   Int_t ntracks=event->GetNumberOfTracks();
@@ -229,53 +285,285 @@ void AliAnalysisTaskPIDqa::FillTPCqa()
   }
 }
 
+//______________________________________________________________________________
+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  ) ||
+        !( (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()
 {
   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){
       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();
       h->Fill(mom,sig);
     }
+
+    Double_t mask = (Double_t)fPIDResponse->GetTOFResponse().GetStartTimeMask(mom) + 0.5;
+    ((TH1F*)fListQAtof->FindObject("hStartTimeMask_TOF"))->Fill(mask);
+
+    if (mom >= 1.0 && mom <= 2.0 ) {
+      Double_t nsigma= fPIDResponse->NumberOfSigmasTOF(track, (AliPID::EParticleType)AliPID::kKaon);
+      if (mask == 0) {
+       ((TH1F*)fListQAtof->FindObject("hNsigma_TOF_Kaon_T0-Fill"))->Fill(nsigma);
+      } else if (mask == 1) {
+       ((TH1F*)fListQAtof->FindObject("hNsigma_TOF_Kaon_T0-TOF"))->Fill(nsigma);
+      } else if ( (mask == 2) || (mask == 4) || (mask == 6) ) {
+       ((TH1F*)fListQAtof->FindObject("hNsigma_TOF_Kaon_T0-T0"))->Fill(nsigma);
+      } else {
+       ((TH1F*)fListQAtof->FindObject("hNsigma_TOF_Kaon_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()
+{
+  //
+  // 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::FillTPCTOFqa()
+{
+  //
+  // Fill PID qa histograms for the TOF
+  //   Here also the TPC histograms after TOF selection are filled
+  //
+
+  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::kTPCpid  ) == AliVTrack::kTPCpid ) ||
+        !((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 momTPC=track->GetTPCmomentum();
+
+    for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
+      //TOF nSigma
+      Double_t nSigmaTOF=fPIDResponse->NumberOfSigmasTOF(track, (AliPID::EParticleType)ispecie);
+      Double_t nSigmaTPC=fPIDResponse->NumberOfSigmasTPC(track, (AliPID::EParticleType)ispecie);
+
+      //TPC after TOF cut
+      TH2 *h=(TH2*)fListQAtpctof->At(ispecie);
+      if (h && TMath::Abs(nSigmaTOF)<3.) h->Fill(momTPC,nSigmaTPC);
+
+      //TOF after TPC cut
+      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);
+             
+           }
+         }
+       }
+      }
+    }
   }
 }
 
@@ -288,6 +576,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)),
@@ -295,15 +584,41 @@ 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;  
 }
 
 //______________________________________________________________________________
@@ -328,9 +643,9 @@ void AliAnalysisTaskPIDqa::SetupTPCqa()
                         "TPC signal vs. p;p [GeV]; TPC signal [arb. units]",
                         vX->GetNrows()-1,vX->GetMatrixArray(),
                         300,0,300);
-  
   fListQAtpc->Add(hSig);
-  
+
+  delete vX;  
 }
 
 //______________________________________________________________________________
@@ -339,7 +654,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;
 }
 
 //______________________________________________________________________________
@@ -350,7 +675,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)),
@@ -358,15 +683,106 @@ void AliAnalysisTaskPIDqa::SetupTOFqa()
                               200,-10,10);
     fListQAtof->Add(hNsigmaP);
   }
-  
-  
+
+  // for Kaons PID we differentiate on Time Zero
+  TH1F *hnSigT0Fill = new TH1F("hNsigma_TOF_Kaon_T0-Fill","TOF n#sigma (Kaon) T0-FILL [1-2. GeV/c]",200,-10,10);
+  fListQAtof->Add(hnSigT0Fill);
+  TH1F *hnSigT0T0 = new TH1F("hNsigma_TOF_Kaon_T0-T0","TOF n#sigma (Kaon) T0-T0 [1-2. GeV/c]",200,-10,10);
+  fListQAtof->Add(hnSigT0T0);
+  TH1F *hnSigT0TOF = new TH1F("hNsigma_TOF_Kaon_T0-TOF","TOF n#sigma (Kaon) T0-TOF [1.-2. GeV/c]",200,-10,10);
+  fListQAtof->Add(hnSigT0TOF);
+  TH1F *hnSigT0Best = new TH1F("hNsigma_TOF_Kaon_T0-Best","TOF n#sigma (Kaon) T0-Best [1-2. GeV/c]",200,-10,10);
+  fListQAtof->Add(hnSigT0Best);
+
   TH2F *hSig = new TH2F("hSigP_TOF",
                         "TOF signal vs. p;p [GeV]; TOF signal [arb. units]",
                         vX->GetNrows()-1,vX->GetMatrixArray(),
                         300,0,300);
+
+  delete vX;
   
   fListQAtof->Add(hSig);
+
+  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);
+}
+
+//______________________________________________________________________________
+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::SetupTPCTOFqa()
+{
+  //
+  // Create the qa objects for TPC + TOF combination
+  //
+  
+  TVectorD *vX=MakeLogBinning(200,.1,30);
+
+  //TPC signals after TOF cut
+  for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
+    TH2F *hNsigmaP = new TH2F(Form("hNsigmaP_TPC_TOF_%s",AliPID::ParticleName(ispecie)),
+                              Form("TPC n#sigma %s vs. p (after TOF 3#sigma cut);p_{TPC} [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
+                              vX->GetNrows()-1,vX->GetMatrixArray(),
+                              200,-10,10);
+    fListQAtpctof->Add(hNsigmaP);
+  }
+
+  //TOF signals after TPC cut
+  for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
+    TH2F *hNsigmaP = new TH2F(Form("hNsigmaP_TOF_TPC_%s",AliPID::ParticleName(ispecie)),
+                              Form("TOF n#sigma %s vs. p (after TPC n#sigma cut);p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
+                              vX->GetNrows()-1,vX->GetMatrixArray(),
+                              200,-10,10);
+    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;
 }
 
 //______________________________________________________________________________
@@ -447,3 +863,4 @@ TVectorD* AliAnalysisTaskPIDqa::MakeArbitraryBinning(const char* bins)
   delete arr;
   return binLimits;
 }
+