1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 /* $Id: AliAnalysisTaskPIDqa.cxx 43811 2010-09-23 14:13:31Z wiechula $ */
19 #include <TObjArray.h>
27 #include <AliAnalysisManager.h>
28 #include <AliInputEventHandler.h>
29 #include <AliVEventHandler.h>
30 #include <AliVEvent.h>
31 #include <AliVParticle.h>
32 #include <AliVTrack.h>
35 #include <AliPIDResponse.h>
36 #include <AliITSPIDResponse.h>
37 #include <AliTPCPIDResponse.h>
38 #include <AliTRDPIDResponse.h>
39 #include <AliTOFPIDResponse.h>
41 #include <AliESDEvent.h>
43 #include "AliAnalysisTaskPIDqa.h"
46 ClassImp(AliAnalysisTaskPIDqa)
48 //______________________________________________________________________________
49 AliAnalysisTaskPIDqa::AliAnalysisTaskPIDqa():
55 fListQAitsPureSA(0x0),
68 //______________________________________________________________________________
69 AliAnalysisTaskPIDqa::AliAnalysisTaskPIDqa(const char* name):
70 AliAnalysisTaskSE(name),
75 fListQAitsPureSA(0x0),
84 // Default constructor
86 DefineInput(0,TChain::Class());
87 DefineOutput(1,TList::Class());
90 //______________________________________________________________________________
91 AliAnalysisTaskPIDqa::~AliAnalysisTaskPIDqa()
99 //______________________________________________________________________________
100 void AliAnalysisTaskPIDqa::UserCreateOutputObjects()
103 // Create the output QA objects
106 AliLog::SetClassDebugLevel("AliAnalysisTaskPIDqa",10);
109 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
110 AliInputEventHandler *inputHandler=dynamic_cast<AliInputEventHandler*>(man->GetInputEventHandler());
111 if (!inputHandler) AliFatal("Input handler needed");
113 //pid response object
114 fPIDResponse=inputHandler->GetPIDResponse();
115 if (!fPIDResponse) AliError("PIDResponse object was not created");
121 fListQAits=new TList;
122 fListQAits->SetOwner();
123 fListQAits->SetName("ITS");
125 fListQAitsSA=new TList;
126 fListQAitsSA->SetOwner();
127 fListQAitsSA->SetName("ITS_SA");
129 fListQAitsPureSA=new TList;
130 fListQAitsPureSA->SetOwner();
131 fListQAitsPureSA->SetName("ITS_PureSA");
133 fListQAtpc=new TList;
134 fListQAtpc->SetOwner();
135 fListQAtpc->SetName("TPC");
137 fListQAtrd=new TList;
138 fListQAtrd->SetOwner();
139 fListQAtrd->SetName("TRD");
141 fListQAtof=new TList;
142 fListQAtof->SetOwner();
143 fListQAtof->SetName("TOF");
145 fListQAemcal=new TList;
146 fListQAemcal->SetOwner();
147 fListQAemcal->SetName("EMCAL");
149 fListQAhmpid=new TList;
150 fListQAhmpid->SetOwner();
151 fListQAhmpid->SetName("HMPID");
153 fListQAtpctof=new TList;
154 fListQAtpctof->SetOwner();
155 fListQAtpctof->SetName("TPC_TOF");
157 fListQA->Add(fListQAits);
158 fListQA->Add(fListQAitsSA);
159 fListQA->Add(fListQAitsPureSA);
160 fListQA->Add(fListQAtpc);
161 fListQA->Add(fListQAtrd);
162 fListQA->Add(fListQAtof);
163 fListQA->Add(fListQAemcal);
164 fListQA->Add(fListQAhmpid);
165 fListQA->Add(fListQAtpctof);
179 //______________________________________________________________________________
180 void AliAnalysisTaskPIDqa::UserExec(Option_t */*option*/)
183 // Setup the PID response functions and fill the QA histograms
186 AliVEvent *event=InputEvent();
187 if (!event||!fPIDResponse) return;
201 //______________________________________________________________________________
202 void AliAnalysisTaskPIDqa::FillITSqa()
205 // Fill PID qa histograms for the ITS
208 AliVEvent *event=InputEvent();
210 Int_t ntracks=event->GetNumberOfTracks();
211 for(Int_t itrack = 0; itrack < ntracks; itrack++){
212 AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
213 ULong_t status=track->GetStatus();
214 // not that nice. status bits not in virtual interface
215 // ITS refit + ITS pid selection
216 if (!( ( (status & AliVTrack::kITSrefit)==AliVTrack::kITSrefit ) ||
217 ! ( (status & AliVTrack::kITSpid )==AliVTrack::kITSpid ) )) continue;
218 Double_t mom=track->P();
220 TList *theList = 0x0;
221 if(( (status & AliVTrack::kTPCin)==AliVTrack::kTPCin )){
225 if(!( (status & AliVTrack::kITSpureSA)==AliVTrack::kITSpureSA )){
226 //ITS Standalone tracks
227 theList=fListQAitsSA;
229 //ITS Pure Standalone tracks
230 theList=fListQAitsPureSA;
235 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
236 TH2 *h=(TH2*)theList->At(ispecie);
238 Double_t nSigma=fPIDResponse->NumberOfSigmasITS(track, (AliPID::EParticleType)ispecie);
241 TH2 *h=(TH2*)theList->At(AliPID::kSPECIES);
243 Double_t sig=track->GetITSsignal();
249 //______________________________________________________________________________
250 void AliAnalysisTaskPIDqa::FillTPCqa()
253 // Fill PID qa histograms for the TPC
256 AliVEvent *event=InputEvent();
258 Int_t ntracks=event->GetNumberOfTracks();
259 for(Int_t itrack = 0; itrack < ntracks; itrack++){
260 AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
265 ULong_t status=track->GetStatus();
266 // not that nice. status bits not in virtual interface
267 // TPC refit + ITS refit + TPC pid
268 if (!( (status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
269 !( (status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ) continue;
271 // The TPC pid cut removes the light nuclei (>5 sigma from proton line)
272 //|| !( (status & AliVTrack::kTPCpid ) == AliVTrack::kTPCpid )
273 Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
274 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
275 if (track->GetTPCNclsF()>0) {
276 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
279 if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
281 Double_t mom=track->GetTPCmomentum();
283 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
284 TH2 *h=(TH2*)fListQAtpc->At(ispecie);
286 Double_t nSigma=fPIDResponse->NumberOfSigmasTPC(track, (AliPID::EParticleType)ispecie);
290 TH2 *h=(TH2*)fListQAtpc->At(AliPID::kSPECIES);
292 Double_t sig=track->GetTPCsignal();
298 //______________________________________________________________________________
299 void AliAnalysisTaskPIDqa::FillTRDqa()
302 // Fill PID qa histograms for the TRD
304 AliVEvent *event=InputEvent();
305 Int_t ntracks = event->GetNumberOfTracks();
306 for(Int_t itrack = 0; itrack < ntracks; itrack++){
307 AliVTrack *track = (AliVTrack *)event->GetTrack(itrack);
312 ULong_t status=track->GetStatus();
313 // not that nice. status bits not in virtual interface
314 // TPC refit + ITS refit + TPC pid + TRD out
315 if (!( (status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
316 !( (status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ||
317 // !( (status & AliVTrack::kTPCpid ) == AliVTrack::kTPCpid ) || //removes light nuclei. So it is out for the moment
318 !( (status & AliVTrack::kTRDout ) == AliVTrack::kTRDout )) continue;
320 Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
321 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
322 if (track->GetTPCNclsF()>0) {
323 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
326 if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
328 Double_t likelihoods[AliPID::kSPECIES];
329 if(fPIDResponse->ComputeTRDProbability(track, AliPID::kSPECIES, likelihoods) != AliPIDResponse::kDetPidOk) continue;
330 Int_t ntracklets = 0;
331 Double_t momentum = -1.;
332 for(Int_t itl = 0; itl < 6; itl++)
333 if(track->GetTRDmomentum(itl) > 0.){
335 if(momentum < 0) momentum = track->GetTRDmomentum(itl);
337 for(Int_t ispecie = 0; ispecie < AliPID::kSPECIES; ispecie++){
338 TH2F *hLike = (TH2F *)fListQAtrd->At(ntracklets*AliPID::kSPECIES+ispecie);
339 if (hLike) hLike->Fill(momentum,likelihoods[ispecie]);
344 //______________________________________________________________________________
345 void AliAnalysisTaskPIDqa::FillTOFqa()
348 // Fill TOF information
350 AliVEvent *event=InputEvent();
352 Int_t ntracks=event->GetNumberOfTracks();
353 Int_t tracksAtTof = 0;
354 for(Int_t itrack = 0; itrack < ntracks; itrack++){
355 AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
360 ULong_t status=track->GetStatus();
361 // TPC refit + ITS refit +
362 // TOF out + TOFpid +
364 // (we don't use kTOFmismatch because it depends on TPC....)
365 if (!((status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
366 !((status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ||
367 !((status & AliVTrack::kTOFout ) == AliVTrack::kTOFout ) ||
368 !((status & AliVTrack::kTOFpid ) == AliVTrack::kTOFpid ) ||
369 !((status & AliVTrack::kTIME ) == AliVTrack::kTIME ) ) continue;
371 Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
372 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
373 if (track->GetTPCNclsF()>0) {
374 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
377 if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
381 Double_t mom=track->P();
383 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
384 TH2 *h=(TH2*)fListQAtof->At(ispecie);
386 Double_t nSigma=fPIDResponse->NumberOfSigmasTOF(track, (AliPID::EParticleType)ispecie);
390 TH2 *h=(TH2*)fListQAtof->FindObject("hSigP_TOF");
392 Double_t sig=track->GetTOFsignal();
396 Int_t mask = fPIDResponse->GetTOFResponse().GetStartTimeMask(mom);
397 ((TH1F*)fListQAtof->FindObject("hStartTimeMask_TOF"))->Fill((Double_t)(mask+0.5));
399 if (mom >= 0.75 && mom <= 1.25 ) {
400 Double_t nsigma= fPIDResponse->NumberOfSigmasTOF(track, (AliPID::EParticleType)AliPID::kPion);
402 ((TH1F*)fListQAtof->FindObject("hNsigma_TOF_Pion_T0-Fill"))->Fill(nsigma);
403 } else if (mask == 1) {
404 ((TH1F*)fListQAtof->FindObject("hNsigma_TOF_Pion_T0-TOF"))->Fill(nsigma);
405 } else if ( (mask == 2) || (mask == 4) || (mask == 6) ) {
406 ((TH1F*)fListQAtof->FindObject("hNsigma_TOF_Pion_T0-T0"))->Fill(nsigma);
408 ((TH1F*)fListQAtof->FindObject("hNsigma_TOF_Pion_T0-Best"))->Fill(nsigma);
412 Double_t res = (Double_t)fPIDResponse->GetTOFResponse().GetStartTimeRes(mom);
413 ((TH1F*)fListQAtof->FindObject("hStartTimeRes_TOF"))->Fill(res);
415 AliESDEvent *esd = dynamic_cast<AliESDEvent *>(event);
417 Double_t startTime = esd->GetT0TOF(0);
418 if (startTime < 90000) ((TH1F*)fListQAtof->FindObject("hStartTimeAC_T0"))->Fill(startTime);
420 startTime = esd->GetT0TOF(1);
421 if (startTime < 90000) ((TH1F*)fListQAtof->FindObject("hStartTimeA_T0"))->Fill(startTime);
422 startTime = esd->GetT0TOF(2);
423 if (startTime < 90000) ((TH1F*)fListQAtof->FindObject("hStartTimeC_T0"))->Fill(startTime);
427 if (tracksAtTof > 0) {
428 ((TH1F* )fListQAtof->FindObject("hnTracksAt_TOF"))->Fill(tracksAtTof);
429 Int_t mask = fPIDResponse->GetTOFResponse().GetStartTimeMask(5.);
430 if (mask & 0x1) ((TH1F*)fListQAtof->FindObject("hT0MakerEff"))->Fill(tracksAtTof);
435 //______________________________________________________________________________
436 void AliAnalysisTaskPIDqa::FillEMCALqa()
439 // Fill PID qa histograms for the EMCAL
442 AliVEvent *event=InputEvent();
444 Int_t ntracks=event->GetNumberOfTracks();
445 for(Int_t itrack = 0; itrack < ntracks; itrack++){
446 AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
451 ULong_t status=track->GetStatus();
452 // not that nice. status bits not in virtual interface
453 // TPC refit + ITS refit +
454 // TOF out + TOFpid +
456 if (!( (status & AliVTrack::kEMCALmatch) == AliVTrack::kEMCALmatch) ) continue;
458 Double_t pt=track->Pt();
460 //EMCAL nSigma (only for electrons at the moment)
461 TH2 *h=(TH2*)fListQAemcal->At(0);
463 Double_t nSigma=fPIDResponse->NumberOfSigmasEMCAL(track, (AliPID::EParticleType)0);
466 //EMCAL signal (E/p vs. pT)
467 h=(TH2*)fListQAemcal->At(1);
470 Int_t nMatchClus = track->GetEMCALcluster();
471 Double_t mom = track->P();
476 AliVCluster *matchedClus = (AliVCluster*)event->GetCaloCluster(nMatchClus);
480 // matched cluster is EMCAL
481 if(matchedClus->IsEMCAL()){
483 Double_t fClsE = matchedClus->E();
496 //______________________________________________________________________________
497 void AliAnalysisTaskPIDqa::FillHMPIDqa()
500 // Fill PID qa histograms for the HMPID
503 AliVEvent *event=InputEvent();
505 Int_t ntracks=event->GetNumberOfTracks();
506 for(Int_t itrack = 0; itrack < ntracks; itrack++){
507 AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
512 ULong_t status=track->GetStatus();
513 // not that nice. status bits not in virtual interface
514 // TPC refit + ITS refit +
515 // TOF out + TOFpid +
517 if (!((status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
518 !((status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ||
519 !((status & AliVTrack::kTOFout ) == AliVTrack::kTOFout ) ||
520 !((status & AliVTrack::kTOFpid ) == AliVTrack::kTOFpid ) ||
521 !((status & AliVTrack::kTIME ) == AliVTrack::kTIME ) ) continue;
523 Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
524 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
525 if (track->GetTPCNclsF()>0) {
526 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
529 if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
531 Double_t mom = track->P();
532 Double_t ckovAngle = track->GetHMPIDsignal();
534 Double_t nSigmaTOF[3];
538 for (Int_t ispecie=2; ispecie<AliPID::kSPECIES; ++ispecie){
540 nSigmaTOF[ispecie]=fPIDResponse->NumberOfSigmasTOF(track, (AliPID::EParticleType)ispecie);
541 h[ispecie-2] = (TH1F*)fListQAhmpid->At(ispecie-2);}
543 if(TMath::Abs(nSigmaTOF[0])<2) h[0]->Fill(mom,ckovAngle);
545 if(TMath::Abs(nSigmaTOF[1])<2 && TMath::Abs(nSigmaTOF[0])>3) h[1]->Fill(mom,ckovAngle);
547 if(TMath::Abs(nSigmaTOF[2])<2 && TMath::Abs(nSigmaTOF[1])>3 && TMath::Abs(nSigmaTOF[0])>3) h[2]->Fill(mom,ckovAngle);
553 //______________________________________________________________________________
554 void AliAnalysisTaskPIDqa::FillTPCTOFqa()
557 // Fill PID qa histograms for the TOF
558 // Here also the TPC histograms after TOF selection are filled
561 AliVEvent *event=InputEvent();
563 Int_t ntracks=event->GetNumberOfTracks();
564 for(Int_t itrack = 0; itrack < ntracks; itrack++){
565 AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
570 ULong_t status=track->GetStatus();
571 // not that nice. status bits not in virtual interface
572 // TPC refit + ITS refit +
573 // TOF out + TOFpid +
575 if (!((status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
576 !((status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ||
577 // !( (status & AliVTrack::kTPCpid ) == AliVTrack::kTPCpid ) || //removes light nuclei, so it is out for the moment
578 !((status & AliVTrack::kTOFout ) == AliVTrack::kTOFout ) ||
579 !((status & AliVTrack::kTOFpid ) == AliVTrack::kTOFpid ) ||
580 !((status & AliVTrack::kTIME ) == AliVTrack::kTIME ) ) continue;
582 Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
583 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
584 if (track->GetTPCNclsF()>0) {
585 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
588 if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
591 Double_t mom=track->P();
592 Double_t momTPC=track->GetTPCmomentum();
594 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
596 Double_t nSigmaTOF=fPIDResponse->NumberOfSigmasTOF(track, (AliPID::EParticleType)ispecie);
597 Double_t nSigmaTPC=fPIDResponse->NumberOfSigmasTPC(track, (AliPID::EParticleType)ispecie);
600 TH2 *h=(TH2*)fListQAtpctof->At(ispecie);
601 if (h && TMath::Abs(nSigmaTOF)<3.) h->Fill(momTPC,nSigmaTPC);
604 h=(TH2*)fListQAtpctof->At(ispecie+AliPID::kSPECIES);
605 if (h && TMath::Abs(nSigmaTPC)<3.) h->Fill(mom,nSigmaTOF);
607 //EMCAL after TOF and TPC cut
608 h=(TH2*)fListQAtpctof->At(ispecie+2*AliPID::kSPECIES);
609 if (h && TMath::Abs(nSigmaTOF)<3. && TMath::Abs(nSigmaTPC)<3. ){
611 Int_t nMatchClus = track->GetEMCALcluster();
612 Double_t pt = track->Pt();
617 AliVCluster *matchedClus = (AliVCluster*)event->GetCaloCluster(nMatchClus);
621 // matched cluster is EMCAL
622 if(matchedClus->IsEMCAL()){
624 Double_t fClsE = matchedClus->E();
638 //______________________________________________________________________________
639 void AliAnalysisTaskPIDqa::SetupITSqa()
642 // Create the ITS qa objects
645 TVectorD *vX=MakeLogBinning(200,.1,30);
648 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
649 TH2F *hNsigmaP = new TH2F(Form("hNsigmaP_ITS_%s",AliPID::ParticleName(ispecie)),
650 Form("ITS n#sigma %s vs. p;p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
651 vX->GetNrows()-1,vX->GetMatrixArray(),
653 fListQAits->Add(hNsigmaP);
655 TH2F *hSig = new TH2F("hSigP_ITS",
656 "ITS signal vs. p;p [GeV]; ITS signal [arb. units]",
657 vX->GetNrows()-1,vX->GetMatrixArray(),
659 fListQAits->Add(hSig);
661 //ITS Standalone tracks
662 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
663 TH2F *hNsigmaPSA = new TH2F(Form("hNsigmaP_ITSSA_%s",AliPID::ParticleName(ispecie)),
664 Form("ITS n#sigma %s vs. p;p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
665 vX->GetNrows()-1,vX->GetMatrixArray(),
667 fListQAitsSA->Add(hNsigmaPSA);
669 TH2F *hSigSA = new TH2F("hSigP_ITSSA",
670 "ITS signal vs. p;p [GeV]; ITS signal [arb. units]",
671 vX->GetNrows()-1,vX->GetMatrixArray(),
673 fListQAitsSA->Add(hSigSA);
675 //ITS Pure Standalone tracks
676 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
677 TH2F *hNsigmaPPureSA = new TH2F(Form("hNsigmaP_ITSPureSA_%s",AliPID::ParticleName(ispecie)),
678 Form("ITS n#sigma %s vs. p;p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
679 vX->GetNrows()-1,vX->GetMatrixArray(),
681 fListQAitsPureSA->Add(hNsigmaPPureSA);
683 TH2F *hSigPureSA = new TH2F("hSigP_ITSPureSA",
684 "ITS signal vs. p;p [GeV]; ITS signal [arb. units]",
685 vX->GetNrows()-1,vX->GetMatrixArray(),
687 fListQAitsPureSA->Add(hSigPureSA);
692 //______________________________________________________________________________
693 void AliAnalysisTaskPIDqa::SetupTPCqa()
696 // Create the TPC qa objects
699 TVectorD *vX=MakeLogBinning(200,.1,30);
701 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
702 TH2F *hNsigmaP = new TH2F(Form("hNsigmaP_TPC_%s",AliPID::ParticleName(ispecie)),
703 Form("TPC n#sigma %s vs. p;p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
704 vX->GetNrows()-1,vX->GetMatrixArray(),
706 fListQAtpc->Add(hNsigmaP);
710 TH2F *hSig = new TH2F("hSigP_TPC",
711 "TPC signal vs. p;p [GeV]; TPC signal [arb. units]",
712 vX->GetNrows()-1,vX->GetMatrixArray(),
714 fListQAtpc->Add(hSig);
719 //______________________________________________________________________________
720 void AliAnalysisTaskPIDqa::SetupTRDqa()
723 // Create the TRD qa objects
725 TVectorD *vX=MakeLogBinning(200,.1,30);
726 for(Int_t itl = 0; itl < 6; ++itl){
727 for(Int_t ispecie = 0; ispecie < AliPID::kSPECIES; ispecie++){
728 TH2F *hLikeP = new TH2F(Form("hLikeP_TRD_%dtls_%s", itl, AliPID::ParticleName(ispecie)),
729 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)),
730 vX->GetNrows()-1, vX->GetMatrixArray(),
732 fListQAtrd->Add(hLikeP);
738 //______________________________________________________________________________
739 void AliAnalysisTaskPIDqa::SetupTOFqa()
742 // Create the TOF qa objects
745 TVectorD *vX=MakeLogBinning(200,.1,30);
747 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
748 TH2F *hNsigmaP = new TH2F(Form("hNsigmaP_TOF_%s",AliPID::ParticleName(ispecie)),
749 Form("TOF n#sigma %s vs. p;p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
750 vX->GetNrows()-1,vX->GetMatrixArray(),
752 fListQAtof->Add(hNsigmaP);
755 // for Kaons PID we differentiate on Time Zero
756 TH1F *hnSigT0Fill = new TH1F("hNsigma_TOF_Pion_T0-Fill","TOF n#sigma (Pion) T0-FILL [0.75-1.25. GeV/c]",200,-10,10);
757 fListQAtof->Add(hnSigT0Fill);
758 TH1F *hnSigT0T0 = new TH1F("hNsigma_TOF_Pion_T0-T0","TOF n#sigma (Pion) T0-T0 [0.75-1.25 GeV/c]",200,-10,10);
759 fListQAtof->Add(hnSigT0T0);
760 TH1F *hnSigT0TOF = new TH1F("hNsigma_TOF_Pion_T0-TOF","TOF n#sigma (Pion) T0-TOF [0.75-1.25 GeV/c]",200,-10,10);
761 fListQAtof->Add(hnSigT0TOF);
762 TH1F *hnSigT0Best = new TH1F("hNsigma_TOF_Pion_T0-Best","TOF n#sigma (Pion) T0-Best [0.75-1.25 GeV/c]",200,-10,10);
763 fListQAtof->Add(hnSigT0Best);
765 TH2F *hSig = new TH2F("hSigP_TOF",
766 "TOF signal vs. p;p [GeV]; TOF signal [arb. units]",
767 vX->GetNrows()-1,vX->GetMatrixArray(),
772 fListQAtof->Add(hSig);
774 TH1F *hStartTimeMaskTOF = new TH1F("hStartTimeMask_TOF","StartTime mask",8,0,8);
775 fListQAtof->Add(hStartTimeMaskTOF);
776 TH1F *hStartTimeResTOF = new TH1F("hStartTimeRes_TOF","StartTime resolution [ps]",100,0,500);
777 fListQAtof->Add(hStartTimeResTOF);
779 TH1F *hnTracksAtTOF = new TH1F("hnTracksAt_TOF","Matched tracks at TOF",20,0,20);
780 fListQAtof->Add(hnTracksAtTOF);
781 TH1F *hT0MakerEff = new TH1F("hT0MakerEff","Events with T0-TOF vs nTracks",20,0,20);
782 fListQAtof->Add(hT0MakerEff);
784 // this in principle should stay on a T0 PID QA, but are just the data prepared for TOF use
785 TH1F *hStartTimeAT0 = new TH1F("hStartTimeA_T0","StartTime from T0A [ps]",1000,-1000,1000);
786 fListQAtof->Add(hStartTimeAT0);
787 TH1F *hStartTimeCT0 = new TH1F("hStartTimeC_T0","StartTime from T0C [ps]",1000,-1000,1000);
788 fListQAtof->Add(hStartTimeCT0);
789 TH1F *hStartTimeACT0 = new TH1F("hStartTimeAC_T0","StartTime from T0AC [ps]",1000,-1000,1000);;
790 fListQAtof->Add(hStartTimeACT0);
793 //______________________________________________________________________________
794 void AliAnalysisTaskPIDqa::SetupEMCALqa()
797 // Create the EMCAL qa objects
800 TVectorD *vX=MakeLogBinning(200,.1,30);
802 TH2F *hNsigmaPt = new TH2F(Form("hNsigmaPt_EMCAL_%s",AliPID::ParticleName(0)),
803 Form("EMCAL n#sigma %s vs. p_{T};p_{T} [GeV]; n#sigma",AliPID::ParticleName(0)),
804 vX->GetNrows()-1,vX->GetMatrixArray(),
806 fListQAemcal->Add(hNsigmaPt);
808 TH2F *hSigPt = new TH2F("hSigPt_EMCAL",
809 "EMCAL signal (E/p) vs. p_{T};p_{T} [GeV]; EMCAL signal (E/p) [arb. units]",
810 vX->GetNrows()-1,vX->GetMatrixArray(),
812 fListQAemcal->Add(hSigPt);
817 //______________________________________________________________________________
818 void AliAnalysisTaskPIDqa::SetupHMPIDqa()
821 // Create the HMPID qa objects
824 TH2F *hCkovAnglevsMomPion = new TH2F("hCkovAnglevsMom_pion", "Cherenkov angle vs momnetum for pions",500,0,5.,500,0,1);
825 fListQAhmpid->Add(hCkovAnglevsMomPion);
827 TH2F *hCkovAnglevsMomKaon = new TH2F("hCkovAnglevsMom_kaon", "Cherenkov angle vs momnetum for kaons",500,0,5.,500,0,1);
828 fListQAhmpid->Add(hCkovAnglevsMomKaon);
830 TH2F *hCkovAnglevsMomProton = new TH2F("hCkovAnglevsMom_proton","Cherenkov angle vs momnetum for protons",500,0,5.,500,0,1);
831 fListQAhmpid->Add(hCkovAnglevsMomProton);
836 //______________________________________________________________________________
837 void AliAnalysisTaskPIDqa::SetupTPCTOFqa()
840 // Create the qa objects for TPC + TOF combination
843 TVectorD *vX=MakeLogBinning(200,.1,30);
845 //TPC signals after TOF cut
846 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
847 TH2F *hNsigmaP = new TH2F(Form("hNsigmaP_TPC_TOF_%s",AliPID::ParticleName(ispecie)),
848 Form("TPC n#sigma %s vs. p (after TOF 3#sigma cut);p_{TPC} [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
849 vX->GetNrows()-1,vX->GetMatrixArray(),
851 fListQAtpctof->Add(hNsigmaP);
854 //TOF signals after TPC cut
855 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
856 TH2F *hNsigmaP = new TH2F(Form("hNsigmaP_TOF_TPC_%s",AliPID::ParticleName(ispecie)),
857 Form("TOF n#sigma %s vs. p (after TPC n#sigma cut);p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
858 vX->GetNrows()-1,vX->GetMatrixArray(),
860 fListQAtpctof->Add(hNsigmaP);
863 //EMCAL signal after TOF and TPC cut
864 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
865 TH2F *heopPt = new TH2F(Form("heopPt_TOF_TPC_%s",AliPID::ParticleName(ispecie)),
866 Form("EMCAL signal (E/p) %s vs. p_{T};p_{T} [GeV]; EMCAL signal (E/p) [arb. units]",AliPID::ParticleName(ispecie)),
867 vX->GetNrows()-1,vX->GetMatrixArray(),
869 fListQAtpctof->Add(heopPt);
875 //______________________________________________________________________________
876 TVectorD* AliAnalysisTaskPIDqa::MakeLogBinning(Int_t nbinsX, Double_t xmin, Double_t xmax)
879 // Make logarithmic binning
880 // the user has to delete the array afterwards!!!
884 if (xmin<1e-20 || xmax<1e-20){
885 AliError("For Log binning xmin and xmax must be > 1e-20. Using linear binning instead!");
886 return MakeLinBinning(nbinsX, xmin, xmax);
893 TVectorD *binLim=new TVectorD(nbinsX+1);
896 Double_t expMax=TMath::Log(last/first);
897 for (Int_t i=0; i<nbinsX+1; ++i){
898 (*binLim)[i]=first*TMath::Exp(expMax/nbinsX*(Double_t)i);
903 //______________________________________________________________________________
904 TVectorD* AliAnalysisTaskPIDqa::MakeLinBinning(Int_t nbinsX, Double_t xmin, Double_t xmax)
907 // Make linear binning
908 // the user has to delete the array afterwards!!!
915 TVectorD *binLim=new TVectorD(nbinsX+1);
918 Double_t binWidth=(last-first)/nbinsX;
919 for (Int_t i=0; i<nbinsX+1; ++i){
920 (*binLim)[i]=first+binWidth*(Double_t)i;
925 //_____________________________________________________________________________
926 TVectorD* AliAnalysisTaskPIDqa::MakeArbitraryBinning(const char* bins)
929 // Make arbitrary binning, bins separated by a ','
931 TString limits(bins);
932 if (limits.IsNull()){
933 AliError("Bin Limit string is empty, cannot add the variable");
937 TObjArray *arr=limits.Tokenize(",");
938 Int_t nLimits=arr->GetEntries();
940 AliError("Need at leas 2 bin limits, cannot add the variable");
945 TVectorD *binLimits=new TVectorD(nLimits);
946 for (Int_t iLim=0; iLim<nLimits; ++iLim){
947 (*binLimits)[iLim]=(static_cast<TObjString*>(arr->At(iLim)))->GetString().Atof();