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),
69 //______________________________________________________________________________
70 AliAnalysisTaskPIDqa::AliAnalysisTaskPIDqa(const char* name):
71 AliAnalysisTaskSE(name),
76 fListQAitsPureSA(0x0),
86 // Default constructor
88 DefineInput(0,TChain::Class());
89 DefineOutput(1,TList::Class());
92 //______________________________________________________________________________
93 AliAnalysisTaskPIDqa::~AliAnalysisTaskPIDqa()
101 //______________________________________________________________________________
102 void AliAnalysisTaskPIDqa::UserCreateOutputObjects()
105 // Create the output QA objects
108 AliLog::SetClassDebugLevel("AliAnalysisTaskPIDqa",10);
111 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
112 AliInputEventHandler *inputHandler=dynamic_cast<AliInputEventHandler*>(man->GetInputEventHandler());
113 if (!inputHandler) AliFatal("Input handler needed");
115 //pid response object
116 fPIDResponse=inputHandler->GetPIDResponse();
117 if (!fPIDResponse) AliError("PIDResponse object was not created");
123 fListQAits=new TList;
124 fListQAits->SetOwner();
125 fListQAits->SetName("ITS");
127 fListQAitsSA=new TList;
128 fListQAitsSA->SetOwner();
129 fListQAitsSA->SetName("ITS_SA");
131 fListQAitsPureSA=new TList;
132 fListQAitsPureSA->SetOwner();
133 fListQAitsPureSA->SetName("ITS_PureSA");
135 fListQAtpc=new TList;
136 fListQAtpc->SetOwner();
137 fListQAtpc->SetName("TPC");
139 fListQAtrd=new TList;
140 fListQAtrd->SetOwner();
141 fListQAtrd->SetName("TRD");
143 fListQAtof=new TList;
144 fListQAtof->SetOwner();
145 fListQAtof->SetName("TOF");
147 fListQAemcal=new TList;
148 fListQAemcal->SetOwner();
149 fListQAemcal->SetName("EMCAL");
151 fListQAhmpid=new TList;
152 fListQAhmpid->SetOwner();
153 fListQAhmpid->SetName("HMPID");
155 fListQAtpctof=new TList;
156 fListQAtpctof->SetOwner();
157 fListQAtpctof->SetName("TPC_TOF");
159 fListQAtofhmpid=new TList;
160 fListQAtofhmpid->SetOwner();
161 fListQAtofhmpid->SetName("TOF_HMPID");
163 fListQA->Add(fListQAits);
164 fListQA->Add(fListQAitsSA);
165 fListQA->Add(fListQAitsPureSA);
166 fListQA->Add(fListQAtpc);
167 fListQA->Add(fListQAtrd);
168 fListQA->Add(fListQAtof);
169 fListQA->Add(fListQAemcal);
170 fListQA->Add(fListQAhmpid);
171 fListQA->Add(fListQAtpctof);
172 fListQA->Add(fListQAtofhmpid);
187 //______________________________________________________________________________
188 void AliAnalysisTaskPIDqa::UserExec(Option_t */*option*/)
191 // Setup the PID response functions and fill the QA histograms
194 AliVEvent *event=InputEvent();
195 if (!event||!fPIDResponse) return;
205 //combined detector QA
212 //______________________________________________________________________________
213 void AliAnalysisTaskPIDqa::FillITSqa()
216 // Fill PID qa histograms for the ITS
219 AliVEvent *event=InputEvent();
221 Int_t ntracks=event->GetNumberOfTracks();
222 for(Int_t itrack = 0; itrack < ntracks; itrack++){
223 AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
224 ULong_t status=track->GetStatus();
225 // not that nice. status bits not in virtual interface
226 // ITS refit + ITS pid selection
227 if (!( ( (status & AliVTrack::kITSrefit)==AliVTrack::kITSrefit ) ||
228 ! ( (status & AliVTrack::kITSpid )==AliVTrack::kITSpid ) )) continue;
229 Double_t mom=track->P();
231 TList *theList = 0x0;
232 if(( (status & AliVTrack::kTPCin)==AliVTrack::kTPCin )){
236 if(!( (status & AliVTrack::kITSpureSA)==AliVTrack::kITSpureSA )){
237 //ITS Standalone tracks
238 theList=fListQAitsSA;
240 //ITS Pure Standalone tracks
241 theList=fListQAitsPureSA;
246 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
247 TH2 *h=(TH2*)theList->At(ispecie);
249 Double_t nSigma=fPIDResponse->NumberOfSigmasITS(track, (AliPID::EParticleType)ispecie);
252 TH2 *h=(TH2*)theList->At(AliPID::kSPECIES);
254 Double_t sig=track->GetITSsignal();
260 //______________________________________________________________________________
261 void AliAnalysisTaskPIDqa::FillTPCqa()
264 // Fill PID qa histograms for the TPC
267 AliVEvent *event=InputEvent();
269 Int_t ntracks=event->GetNumberOfTracks();
270 for(Int_t itrack = 0; itrack < ntracks; itrack++){
271 AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
276 ULong_t status=track->GetStatus();
277 // not that nice. status bits not in virtual interface
278 // TPC refit + ITS refit + TPC pid
279 if (!( (status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
280 !( (status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ) continue;
282 // The TPC pid cut removes the light nuclei (>5 sigma from proton line)
283 //|| !( (status & AliVTrack::kTPCpid ) == AliVTrack::kTPCpid )
284 Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
285 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
286 if (track->GetTPCNclsF()>0) {
287 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
290 if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
292 Double_t mom=track->GetTPCmomentum();
294 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
295 TH2 *h=(TH2*)fListQAtpc->At(ispecie);
297 Double_t nSigma=fPIDResponse->NumberOfSigmasTPC(track, (AliPID::EParticleType)ispecie);
301 TH2 *h=(TH2*)fListQAtpc->At(AliPID::kSPECIES);
303 Double_t sig=track->GetTPCsignal();
309 //______________________________________________________________________________
310 void AliAnalysisTaskPIDqa::FillTRDqa()
313 // Fill PID qa histograms for the TRD
315 AliVEvent *event=InputEvent();
316 Int_t ntracks = event->GetNumberOfTracks();
317 for(Int_t itrack = 0; itrack < ntracks; itrack++){
318 AliVTrack *track = (AliVTrack *)event->GetTrack(itrack);
323 ULong_t status=track->GetStatus();
324 // not that nice. status bits not in virtual interface
325 // TPC refit + ITS refit + TPC pid + TRD out
326 if (!( (status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
327 !( (status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ||
328 // !( (status & AliVTrack::kTPCpid ) == AliVTrack::kTPCpid ) || //removes light nuclei. So it is out for the moment
329 !( (status & AliVTrack::kTRDout ) == AliVTrack::kTRDout )) continue;
331 Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
332 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
333 if (track->GetTPCNclsF()>0) {
334 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
337 if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
339 Double_t likelihoods[AliPID::kSPECIES];
340 if(fPIDResponse->ComputeTRDProbability(track, AliPID::kSPECIES, likelihoods) != AliPIDResponse::kDetPidOk) continue;
341 Int_t ntracklets = 0;
342 Double_t momentum = -1.;
343 for(Int_t itl = 0; itl < 6; itl++)
344 if(track->GetTRDmomentum(itl) > 0.){
346 if(momentum < 0) momentum = track->GetTRDmomentum(itl);
348 for(Int_t ispecie = 0; ispecie < AliPID::kSPECIES; ispecie++){
349 TH2F *hLike = (TH2F *)fListQAtrd->At(ntracklets*AliPID::kSPECIES+ispecie);
350 if (hLike) hLike->Fill(momentum,likelihoods[ispecie]);
355 //______________________________________________________________________________
356 void AliAnalysisTaskPIDqa::FillTOFqa()
359 // Fill TOF information
361 AliVEvent *event=InputEvent();
363 Int_t ntracks=event->GetNumberOfTracks();
364 Int_t tracksAtTof = 0;
365 for(Int_t itrack = 0; itrack < ntracks; itrack++){
366 AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
371 ULong_t status=track->GetStatus();
372 // TPC refit + ITS refit +
373 // TOF out + TOFpid +
375 // (we don't use kTOFmismatch because it depends on TPC....)
376 if (!((status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
377 !((status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ||
378 !((status & AliVTrack::kTOFout ) == AliVTrack::kTOFout ) ||
379 !((status & AliVTrack::kTOFpid ) == AliVTrack::kTOFpid ) ||
380 !((status & AliVTrack::kTIME ) == AliVTrack::kTIME ) ) continue;
382 Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
383 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
384 if (track->GetTPCNclsF()>0) {
385 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
388 if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
392 Double_t mom=track->P();
394 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
395 TH2 *h=(TH2*)fListQAtof->At(ispecie);
397 Double_t nSigma=fPIDResponse->NumberOfSigmasTOF(track, (AliPID::EParticleType)ispecie);
401 TH2 *h=(TH2*)fListQAtof->FindObject("hSigP_TOF");
403 Double_t sig=track->GetTOFsignal()/1000.;
407 Int_t mask = fPIDResponse->GetTOFResponse().GetStartTimeMask(mom);
408 ((TH1F*)fListQAtof->FindObject("hStartTimeMask_TOF"))->Fill((Double_t)(mask+0.5));
410 if (mom >= 0.75 && mom <= 1.25 ) {
411 Double_t nsigma= fPIDResponse->NumberOfSigmasTOF(track, (AliPID::EParticleType)AliPID::kPion);
413 ((TH1F*)fListQAtof->FindObject("hNsigma_TOF_Pion_T0-Fill"))->Fill(nsigma);
414 } else if (mask == 1) {
415 ((TH1F*)fListQAtof->FindObject("hNsigma_TOF_Pion_T0-TOF"))->Fill(nsigma);
416 } else if ( (mask == 2) || (mask == 4) || (mask == 6) ) {
417 ((TH1F*)fListQAtof->FindObject("hNsigma_TOF_Pion_T0-T0"))->Fill(nsigma);
419 ((TH1F*)fListQAtof->FindObject("hNsigma_TOF_Pion_T0-Best"))->Fill(nsigma);
423 Double_t res = (Double_t)fPIDResponse->GetTOFResponse().GetStartTimeRes(mom);
424 ((TH1F*)fListQAtof->FindObject("hStartTimeRes_TOF"))->Fill(res);
426 AliESDEvent *esd = dynamic_cast<AliESDEvent *>(event);
428 Double_t startTime = esd->GetT0TOF(0);
429 if (startTime < 90000) ((TH1F*)fListQAtof->FindObject("hStartTimeAC_T0"))->Fill(startTime);
431 startTime = esd->GetT0TOF(1);
432 if (startTime < 90000) ((TH1F*)fListQAtof->FindObject("hStartTimeA_T0"))->Fill(startTime);
433 startTime = esd->GetT0TOF(2);
434 if (startTime < 90000) ((TH1F*)fListQAtof->FindObject("hStartTimeC_T0"))->Fill(startTime);
438 if (tracksAtTof > 0) {
439 ((TH1F* )fListQAtof->FindObject("hnTracksAt_TOF"))->Fill(tracksAtTof);
440 Int_t mask = fPIDResponse->GetTOFResponse().GetStartTimeMask(5.);
441 if (mask & 0x1) ((TH1F*)fListQAtof->FindObject("hT0MakerEff"))->Fill(tracksAtTof);
446 //______________________________________________________________________________
447 void AliAnalysisTaskPIDqa::FillEMCALqa()
450 // Fill PID qa histograms for the EMCAL
453 AliVEvent *event=InputEvent();
455 Int_t ntracks=event->GetNumberOfTracks();
456 for(Int_t itrack = 0; itrack < ntracks; itrack++){
457 AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
462 ULong_t status=track->GetStatus();
463 // not that nice. status bits not in virtual interface
464 // TPC refit + ITS refit +
465 // TOF out + TOFpid +
467 if (!( (status & AliVTrack::kEMCALmatch) == AliVTrack::kEMCALmatch) ) continue;
469 Double_t pt=track->Pt();
471 //EMCAL nSigma (only for electrons at the moment)
472 TH2 *h=(TH2*)fListQAemcal->At(0);
474 Double_t nSigma=fPIDResponse->NumberOfSigmasEMCAL(track, (AliPID::EParticleType)0);
477 //EMCAL signal (E/p vs. pT)
478 h=(TH2*)fListQAemcal->At(1);
481 Int_t nMatchClus = track->GetEMCALcluster();
482 Double_t mom = track->P();
487 AliVCluster *matchedClus = (AliVCluster*)event->GetCaloCluster(nMatchClus);
491 // matched cluster is EMCAL
492 if(matchedClus->IsEMCAL()){
494 Double_t fClsE = matchedClus->E();
507 //______________________________________________________________________________
508 void AliAnalysisTaskPIDqa::FillHMPIDqa()
511 // Fill PID qa histograms for the HMPID
514 AliVEvent *event=InputEvent();
516 Int_t ntracks=event->GetNumberOfTracks();
517 for(Int_t itrack = 0; itrack < ntracks; itrack++){
518 AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
523 ULong_t status=track->GetStatus();
524 // not that nice. status bits not in virtual interface
525 // TPC refit + ITS refit +
526 // TOF out + TOFpid +
528 if (!((status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
529 !((status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ) continue;
531 Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
532 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
533 if (track->GetTPCNclsF()>0) {
534 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
537 if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
539 Double_t mom = track->P();
540 Double_t ckovAngle = track->GetHMPIDsignal();
542 TH1F *hThetavsMom = (TH1F*)fListQAhmpid->At(0);;
544 hThetavsMom->Fill(mom,ckovAngle);
548 //______________________________________________________________________________
549 void AliAnalysisTaskPIDqa::FillTOFHMPIDqa()
552 // Fill PID qa histograms for the HMPID
555 AliVEvent *event=InputEvent();
557 Int_t ntracks=event->GetNumberOfTracks();
558 for(Int_t itrack = 0; itrack < ntracks; itrack++){
559 AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
564 ULong_t status=track->GetStatus();
565 // not that nice. status bits not in virtual interface
566 // TPC refit + ITS refit +
567 // TOF out + TOFpid +
569 if (!((status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
570 !((status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ||
571 !((status & AliVTrack::kTOFout ) == AliVTrack::kTOFout ) ||
572 !((status & AliVTrack::kTOFpid ) == AliVTrack::kTOFpid ) ||
573 !((status & AliVTrack::kTIME ) == AliVTrack::kTIME ) ) continue;
575 Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
576 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
577 if (track->GetTPCNclsF()>0) {
578 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
581 if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
583 Double_t mom = track->P();
584 Double_t ckovAngle = track->GetHMPIDsignal();
586 Double_t nSigmaTOF[3];
589 for (Int_t ispecie=2; ispecie<AliPID::kSPECIES; ++ispecie){
591 nSigmaTOF[ispecie]=fPIDResponse->NumberOfSigmasTOF(track, (AliPID::EParticleType)ispecie);
592 h[ispecie-2] = (TH1F*)fListQAtofhmpid->At(ispecie-2);}
594 if(TMath::Abs(nSigmaTOF[0])<2) h[0]->Fill(mom,ckovAngle);
596 if(TMath::Abs(nSigmaTOF[1])<2 && TMath::Abs(nSigmaTOF[0])>3) h[1]->Fill(mom,ckovAngle);
598 if(TMath::Abs(nSigmaTOF[2])<2 && TMath::Abs(nSigmaTOF[1])>3 && TMath::Abs(nSigmaTOF[0])>3) h[2]->Fill(mom,ckovAngle);
604 //______________________________________________________________________________
605 void AliAnalysisTaskPIDqa::FillTPCTOFqa()
608 // Fill PID qa histograms for the TOF
609 // Here also the TPC histograms after TOF selection are filled
612 AliVEvent *event=InputEvent();
614 Int_t ntracks=event->GetNumberOfTracks();
615 for(Int_t itrack = 0; itrack < ntracks; itrack++){
616 AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
621 ULong_t status=track->GetStatus();
622 // not that nice. status bits not in virtual interface
623 // TPC refit + ITS refit +
624 // TOF out + TOFpid +
626 if (!((status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
627 !((status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ||
628 // !( (status & AliVTrack::kTPCpid ) == AliVTrack::kTPCpid ) || //removes light nuclei, so it is out for the moment
629 !((status & AliVTrack::kTOFout ) == AliVTrack::kTOFout ) ||
630 !((status & AliVTrack::kTOFpid ) == AliVTrack::kTOFpid ) ||
631 !((status & AliVTrack::kTIME ) == AliVTrack::kTIME ) ) continue;
633 Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
634 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
635 if (track->GetTPCNclsF()>0) {
636 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
639 if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
642 Double_t mom=track->P();
643 Double_t momTPC=track->GetTPCmomentum();
645 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
647 Double_t nSigmaTOF=fPIDResponse->NumberOfSigmasTOF(track, (AliPID::EParticleType)ispecie);
648 Double_t nSigmaTPC=fPIDResponse->NumberOfSigmasTPC(track, (AliPID::EParticleType)ispecie);
651 TH2 *h=(TH2*)fListQAtpctof->At(ispecie);
652 if (h && TMath::Abs(nSigmaTOF)<3.) h->Fill(momTPC,nSigmaTPC);
655 h=(TH2*)fListQAtpctof->At(ispecie+AliPID::kSPECIES);
656 if (h && TMath::Abs(nSigmaTPC)<3.) h->Fill(mom,nSigmaTOF);
658 //EMCAL after TOF and TPC cut
659 h=(TH2*)fListQAtpctof->At(ispecie+2*AliPID::kSPECIES);
660 if (h && TMath::Abs(nSigmaTOF)<3. && TMath::Abs(nSigmaTPC)<3. ){
662 Int_t nMatchClus = track->GetEMCALcluster();
663 Double_t pt = track->Pt();
668 AliVCluster *matchedClus = (AliVCluster*)event->GetCaloCluster(nMatchClus);
672 // matched cluster is EMCAL
673 if(matchedClus->IsEMCAL()){
675 Double_t fClsE = matchedClus->E();
689 //______________________________________________________________________________
690 void AliAnalysisTaskPIDqa::SetupITSqa()
693 // Create the ITS qa objects
696 TVectorD *vX=MakeLogBinning(200,.1,30);
699 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
700 TH2F *hNsigmaP = new TH2F(Form("hNsigmaP_ITS_%s",AliPID::ParticleName(ispecie)),
701 Form("ITS n#sigma %s vs. p;p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
702 vX->GetNrows()-1,vX->GetMatrixArray(),
704 fListQAits->Add(hNsigmaP);
706 TH2F *hSig = new TH2F("hSigP_ITS",
707 "ITS signal vs. p;p [GeV]; ITS signal [arb. units]",
708 vX->GetNrows()-1,vX->GetMatrixArray(),
710 fListQAits->Add(hSig);
712 //ITS Standalone tracks
713 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
714 TH2F *hNsigmaPSA = new TH2F(Form("hNsigmaP_ITSSA_%s",AliPID::ParticleName(ispecie)),
715 Form("ITS n#sigma %s vs. p;p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
716 vX->GetNrows()-1,vX->GetMatrixArray(),
718 fListQAitsSA->Add(hNsigmaPSA);
720 TH2F *hSigSA = new TH2F("hSigP_ITSSA",
721 "ITS signal vs. p;p [GeV]; ITS signal [arb. units]",
722 vX->GetNrows()-1,vX->GetMatrixArray(),
724 fListQAitsSA->Add(hSigSA);
726 //ITS Pure Standalone tracks
727 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
728 TH2F *hNsigmaPPureSA = new TH2F(Form("hNsigmaP_ITSPureSA_%s",AliPID::ParticleName(ispecie)),
729 Form("ITS n#sigma %s vs. p;p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
730 vX->GetNrows()-1,vX->GetMatrixArray(),
732 fListQAitsPureSA->Add(hNsigmaPPureSA);
734 TH2F *hSigPureSA = new TH2F("hSigP_ITSPureSA",
735 "ITS signal vs. p;p [GeV]; ITS signal [arb. units]",
736 vX->GetNrows()-1,vX->GetMatrixArray(),
738 fListQAitsPureSA->Add(hSigPureSA);
743 //______________________________________________________________________________
744 void AliAnalysisTaskPIDqa::SetupTPCqa()
747 // Create the TPC qa objects
750 TVectorD *vX=MakeLogBinning(200,.1,30);
752 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
753 TH2F *hNsigmaP = new TH2F(Form("hNsigmaP_TPC_%s",AliPID::ParticleName(ispecie)),
754 Form("TPC n#sigma %s vs. p;p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
755 vX->GetNrows()-1,vX->GetMatrixArray(),
757 fListQAtpc->Add(hNsigmaP);
761 TH2F *hSig = new TH2F("hSigP_TPC",
762 "TPC signal vs. p;p [GeV]; TPC signal [arb. units]",
763 vX->GetNrows()-1,vX->GetMatrixArray(),
765 fListQAtpc->Add(hSig);
770 //______________________________________________________________________________
771 void AliAnalysisTaskPIDqa::SetupTRDqa()
774 // Create the TRD qa objects
776 TVectorD *vX=MakeLogBinning(200,.1,30);
777 for(Int_t itl = 0; itl < 6; ++itl){
778 for(Int_t ispecie = 0; ispecie < AliPID::kSPECIES; ispecie++){
779 TH2F *hLikeP = new TH2F(Form("hLikeP_TRD_%dtls_%s", itl, AliPID::ParticleName(ispecie)),
780 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)),
781 vX->GetNrows()-1, vX->GetMatrixArray(),
783 fListQAtrd->Add(hLikeP);
789 //______________________________________________________________________________
790 void AliAnalysisTaskPIDqa::SetupTOFqa()
793 // Create the TOF qa objects
796 TVectorD *vX=MakeLogBinning(200,.1,30);
798 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
799 TH2F *hNsigmaP = new TH2F(Form("hNsigmaP_TOF_%s",AliPID::ParticleName(ispecie)),
800 Form("TOF n#sigma %s vs. p;p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
801 vX->GetNrows()-1,vX->GetMatrixArray(),
803 fListQAtof->Add(hNsigmaP);
806 // for Kaons PID we differentiate on Time Zero
807 TH1F *hnSigT0Fill = new TH1F("hNsigma_TOF_Pion_T0-Fill","TOF n#sigma (Pion) T0-FILL [0.75-1.25. GeV/c]",200,-10,10);
808 fListQAtof->Add(hnSigT0Fill);
809 TH1F *hnSigT0T0 = new TH1F("hNsigma_TOF_Pion_T0-T0","TOF n#sigma (Pion) T0-T0 [0.75-1.25 GeV/c]",200,-10,10);
810 fListQAtof->Add(hnSigT0T0);
811 TH1F *hnSigT0TOF = new TH1F("hNsigma_TOF_Pion_T0-TOF","TOF n#sigma (Pion) T0-TOF [0.75-1.25 GeV/c]",200,-10,10);
812 fListQAtof->Add(hnSigT0TOF);
813 TH1F *hnSigT0Best = new TH1F("hNsigma_TOF_Pion_T0-Best","TOF n#sigma (Pion) T0-Best [0.75-1.25 GeV/c]",200,-10,10);
814 fListQAtof->Add(hnSigT0Best);
816 TH2F *hSig = new TH2F("hSigP_TOF",
817 "TOF signal vs. p;p [GeV]; TOF signal [ns]",
818 vX->GetNrows()-1,vX->GetMatrixArray(),
823 fListQAtof->Add(hSig);
825 TH1F *hStartTimeMaskTOF = new TH1F("hStartTimeMask_TOF","StartTime mask",8,0,8);
826 fListQAtof->Add(hStartTimeMaskTOF);
827 TH1F *hStartTimeResTOF = new TH1F("hStartTimeRes_TOF","StartTime resolution [ps]",100,0,500);
828 fListQAtof->Add(hStartTimeResTOF);
830 TH1F *hnTracksAtTOF = new TH1F("hnTracksAt_TOF","Matched tracks at TOF",20,0,20);
831 fListQAtof->Add(hnTracksAtTOF);
832 TH1F *hT0MakerEff = new TH1F("hT0MakerEff","Events with T0-TOF vs nTracks",20,0,20);
833 fListQAtof->Add(hT0MakerEff);
835 // this in principle should stay on a T0 PID QA, but are just the data prepared for TOF use
836 TH1F *hStartTimeAT0 = new TH1F("hStartTimeA_T0","StartTime from T0A [ps]",1000,-1000,1000);
837 fListQAtof->Add(hStartTimeAT0);
838 TH1F *hStartTimeCT0 = new TH1F("hStartTimeC_T0","StartTime from T0C [ps]",1000,-1000,1000);
839 fListQAtof->Add(hStartTimeCT0);
840 TH1F *hStartTimeACT0 = new TH1F("hStartTimeAC_T0","StartTime from T0AC [ps]",1000,-1000,1000);;
841 fListQAtof->Add(hStartTimeACT0);
844 //______________________________________________________________________________
845 void AliAnalysisTaskPIDqa::SetupEMCALqa()
848 // Create the EMCAL qa objects
851 TVectorD *vX=MakeLogBinning(200,.1,30);
853 TH2F *hNsigmaPt = new TH2F(Form("hNsigmaPt_EMCAL_%s",AliPID::ParticleName(0)),
854 Form("EMCAL n#sigma %s vs. p_{T};p_{T} [GeV]; n#sigma",AliPID::ParticleName(0)),
855 vX->GetNrows()-1,vX->GetMatrixArray(),
857 fListQAemcal->Add(hNsigmaPt);
859 TH2F *hSigPt = new TH2F("hSigPt_EMCAL",
860 "EMCAL signal (E/p) vs. p_{T};p_{T} [GeV]; EMCAL signal (E/p) [arb. units]",
861 vX->GetNrows()-1,vX->GetMatrixArray(),
863 fListQAemcal->Add(hSigPt);
868 //______________________________________________________________________________
869 void AliAnalysisTaskPIDqa::SetupHMPIDqa()
872 // Create the HMPID qa objects
875 TH2F *hCkovAnglevsMom = new TH2F("hCkovAnglevsMom", "Cherenkov angle vs momnetum",500,0,5.,500,0,1);
876 fListQAhmpid->Add(hCkovAnglevsMom);
880 //______________________________________________________________________________
881 void AliAnalysisTaskPIDqa::SetupTOFHMPIDqa()
884 // Create the HMPID qa objects
887 TH2F *hCkovAnglevsMomPion = new TH2F("hCkovAnglevsMom_pion", "Cherenkov angle vs momnetum for pions",500,0,5.,500,0,1);
888 fListQAtofhmpid->Add(hCkovAnglevsMomPion);
890 TH2F *hCkovAnglevsMomKaon = new TH2F("hCkovAnglevsMom_kaon", "Cherenkov angle vs momnetum for kaons",500,0,5.,500,0,1);
891 fListQAtofhmpid->Add(hCkovAnglevsMomKaon);
893 TH2F *hCkovAnglevsMomProton = new TH2F("hCkovAnglevsMom_proton","Cherenkov angle vs momnetum for protons",500,0,5.,500,0,1);
894 fListQAtofhmpid->Add(hCkovAnglevsMomProton);
899 //______________________________________________________________________________
900 void AliAnalysisTaskPIDqa::SetupTPCTOFqa()
903 // Create the qa objects for TPC + TOF combination
906 TVectorD *vX=MakeLogBinning(200,.1,30);
908 //TPC signals after TOF cut
909 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
910 TH2F *hNsigmaP = new TH2F(Form("hNsigmaP_TPC_TOF_%s",AliPID::ParticleName(ispecie)),
911 Form("TPC n#sigma %s vs. p (after TOF 3#sigma cut);p_{TPC} [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
912 vX->GetNrows()-1,vX->GetMatrixArray(),
914 fListQAtpctof->Add(hNsigmaP);
917 //TOF signals after TPC cut
918 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
919 TH2F *hNsigmaP = new TH2F(Form("hNsigmaP_TOF_TPC_%s",AliPID::ParticleName(ispecie)),
920 Form("TOF n#sigma %s vs. p (after TPC n#sigma cut);p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
921 vX->GetNrows()-1,vX->GetMatrixArray(),
923 fListQAtpctof->Add(hNsigmaP);
926 //EMCAL signal after TOF and TPC cut
927 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
928 TH2F *heopPt = new TH2F(Form("heopPt_TOF_TPC_%s",AliPID::ParticleName(ispecie)),
929 Form("EMCAL signal (E/p) %s vs. p_{T};p_{T} [GeV]; EMCAL signal (E/p) [arb. units]",AliPID::ParticleName(ispecie)),
930 vX->GetNrows()-1,vX->GetMatrixArray(),
932 fListQAtpctof->Add(heopPt);
938 //______________________________________________________________________________
939 TVectorD* AliAnalysisTaskPIDqa::MakeLogBinning(Int_t nbinsX, Double_t xmin, Double_t xmax)
942 // Make logarithmic binning
943 // the user has to delete the array afterwards!!!
947 if (xmin<1e-20 || xmax<1e-20){
948 AliError("For Log binning xmin and xmax must be > 1e-20. Using linear binning instead!");
949 return MakeLinBinning(nbinsX, xmin, xmax);
956 TVectorD *binLim=new TVectorD(nbinsX+1);
959 Double_t expMax=TMath::Log(last/first);
960 for (Int_t i=0; i<nbinsX+1; ++i){
961 (*binLim)[i]=first*TMath::Exp(expMax/nbinsX*(Double_t)i);
966 //______________________________________________________________________________
967 TVectorD* AliAnalysisTaskPIDqa::MakeLinBinning(Int_t nbinsX, Double_t xmin, Double_t xmax)
970 // Make linear binning
971 // the user has to delete the array afterwards!!!
978 TVectorD *binLim=new TVectorD(nbinsX+1);
981 Double_t binWidth=(last-first)/nbinsX;
982 for (Int_t i=0; i<nbinsX+1; ++i){
983 (*binLim)[i]=first+binWidth*(Double_t)i;
988 //_____________________________________________________________________________
989 TVectorD* AliAnalysisTaskPIDqa::MakeArbitraryBinning(const char* bins)
992 // Make arbitrary binning, bins separated by a ','
994 TString limits(bins);
995 if (limits.IsNull()){
996 AliError("Bin Limit string is empty, cannot add the variable");
1000 TObjArray *arr=limits.Tokenize(",");
1001 Int_t nLimits=arr->GetEntries();
1003 AliError("Need at leas 2 bin limits, cannot add the variable");
1008 TVectorD *binLimits=new TVectorD(nLimits);
1009 for (Int_t iLim=0; iLim<nLimits; ++iLim){
1010 (*binLimits)[iLim]=(static_cast<TObjString*>(arr->At(iLim)))->GetString().Atof();