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>
40 #include <AliTPCdEdxInfo.h>
42 #include <AliESDEvent.h>
43 #include <AliAODEvent.h>
46 #include <AliESDv0KineCuts.h>
47 #include <AliESDtrackCuts.h>
49 #include <AliMCEvent.h>
51 #include "AliAnalysisTaskPIDqa.h"
54 ClassImp(AliAnalysisTaskPIDqa)
56 //______________________________________________________________________________
57 AliAnalysisTaskPIDqa::AliAnalysisTaskPIDqa():
68 fListQAitsPureSA(0x0),
71 fListQAtpcMCtruth(0x0),
72 fListQAtpcHybrid(0x0),
73 fListQAtpcOROChigh(0x0),
77 fListQAtrdNsigTPCTOF(0x0),
92 //______________________________________________________________________________
93 AliAnalysisTaskPIDqa::AliAnalysisTaskPIDqa(const char* name):
94 AliAnalysisTaskSE(name),
104 fListQAitsPureSA(0x0),
106 fListQAtpcBasic(0x0),
107 fListQAtpcMCtruth(0x0),
108 fListQAtpcHybrid(0x0),
109 fListQAtpcOROChigh(0x0),
113 fListQAtrdNsigTPCTOF(0x0),
118 fListQAtofhmpid(0x0),
124 // Default constructor
126 DefineInput(0,TChain::Class());
127 DefineOutput(1,TList::Class());
130 //______________________________________________________________________________
131 AliAnalysisTaskPIDqa::~AliAnalysisTaskPIDqa()
143 if (!AliAnalysisManager::GetAnalysisManager()->IsProofMode()) delete fListQA;
146 //______________________________________________________________________________
147 void AliAnalysisTaskPIDqa::UserCreateOutputObjects()
150 // Create the output QA objects
153 AliLog::SetClassDebugLevel("AliAnalysisTaskPIDqa",10);
156 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
157 AliInputEventHandler *inputHandler=dynamic_cast<AliInputEventHandler*>(man->GetInputEventHandler());
158 if (!inputHandler) AliFatal("Input handler needed");
160 //pid response object
161 fPIDResponse=inputHandler->GetPIDResponse();
162 if (!fPIDResponse) AliError("PIDResponse object was not created");
165 fV0cuts = new AliESDv0KineCuts;
168 fV0electrons = new TObjArray;
169 fV0pions = new TObjArray;
170 fV0kaons = new TObjArray;
171 fV0protons = new TObjArray;
177 fListQAits=new TList;
178 fListQAits->SetOwner();
179 fListQAits->SetName("ITS");
181 fListQAitsSA=new TList;
182 fListQAitsSA->SetOwner();
183 fListQAitsSA->SetName("ITS_SA");
185 fListQAitsPureSA=new TList;
186 fListQAitsPureSA->SetOwner();
187 fListQAitsPureSA->SetName("ITS_PureSA");
189 fListQAtpc=new TList;
190 fListQAtpc->SetOwner();
191 fListQAtpc->SetName("TPC");
193 fListQAtrd=new TList;
194 fListQAtrd->SetOwner();
195 fListQAtrd->SetName("TRD");
197 fListQAtrdNsig=new TList;
198 fListQAtrdNsig->SetOwner();
199 fListQAtrdNsig->SetName("TRDnSigma");
201 fListQAtrdNsigTPCTOF=new TList;
202 fListQAtrdNsigTPCTOF->SetOwner();
203 fListQAtrdNsigTPCTOF->SetName("TRDnSigma_TPCTOF");
205 fListQAtof=new TList;
206 fListQAtof->SetOwner();
207 fListQAtof->SetName("TOF");
210 fListQAt0->SetOwner();
211 fListQAt0->SetName("T0");
213 fListQAemcal=new TList;
214 fListQAemcal->SetOwner();
215 fListQAemcal->SetName("EMCAL");
217 fListQAhmpid=new TList;
218 fListQAhmpid->SetOwner();
219 fListQAhmpid->SetName("HMPID");
221 fListQAtpctof=new TList;
222 fListQAtpctof->SetOwner();
223 fListQAtpctof->SetName("TPC_TOF");
225 fListQAtofhmpid=new TList;
226 fListQAtofhmpid->SetOwner();
227 fListQAtofhmpid->SetName("TOF_HMPID");
230 fListQAV0->SetOwner();
231 fListQAV0->SetName("V0decay");
233 fListQAinfo=new TList;
234 fListQAinfo->SetOwner();
235 fListQAinfo->SetName("QAinfo");
237 fListQA->Add(fListQAits);
238 fListQA->Add(fListQAitsSA);
239 fListQA->Add(fListQAitsPureSA);
240 fListQA->Add(fListQAtpc);
241 fListQA->Add(fListQAtrd);
242 fListQA->Add(fListQAtof);
243 fListQA->Add(fListQAt0);
244 fListQA->Add(fListQAemcal);
245 fListQA->Add(fListQAhmpid);
246 fListQA->Add(fListQAtpctof);
247 fListQA->Add(fListQAtofhmpid);
248 fListQA->Add(fListQAV0);
249 fListQA->Add(fListQAinfo);
252 // SetupTPCqa(kFALSE, kTRUE, kFALSE);
267 //______________________________________________________________________________
268 void AliAnalysisTaskPIDqa::UserExec(Option_t */*option*/)
271 // Setup the PID response functions and fill the QA histograms
274 AliVEvent *event=InputEvent();
275 if (!event||!fPIDResponse) return;
277 // Start with the V0 task (only possible for ESDs?)
288 //combined detector QA
292 // Clear the V0 PID arrays
301 //______________________________________________________________________________
302 void AliAnalysisTaskPIDqa::FillV0PIDlist(){
305 // Fill the PID object arrays holding the pointers to identified particle tracks
308 // Dynamic cast to ESD events (DO NOTHING for AOD events)
309 AliESDEvent *event = dynamic_cast<AliESDEvent *>(InputEvent());
310 if ( !event ) return;
312 if(TString(event->GetBeamType())=="Pb-Pb" || TString(event->GetBeamType())=="A-A"){
313 fV0cuts->SetMode(AliESDv0KineCuts::kPurity,AliESDv0KineCuts::kPbPb);
316 fV0cuts->SetMode(AliESDv0KineCuts::kPurity,AliESDv0KineCuts::kPP);
321 fV0cuts->SetEvent(event);
323 // loop over V0 particles
324 for(Int_t iv0=0; iv0<event->GetNumberOfV0s();iv0++){
326 AliESDv0 *v0 = (AliESDv0 *) event->GetV0(iv0);
329 if(v0->GetOnFlyStatus()) continue;
331 // Get the particle selection
332 Bool_t foundV0 = kFALSE;
333 Int_t pdgV0, pdgP, pdgN;
335 foundV0 = fV0cuts->ProcessV0(v0, pdgV0, pdgP, pdgN);
336 if(!foundV0) continue;
338 Int_t iTrackP = v0->GetPindex(); // positive track
339 Int_t iTrackN = v0->GetNindex(); // negative track
341 // v0 Armenteros plot (QA)
342 Float_t armVar[2] = {0.0,0.0};
343 fV0cuts->Armenteros(v0, armVar);
345 TH2 *h=(TH2*)fListQAV0->At(0);
347 h->Fill(armVar[0],armVar[1]);
349 // fill the Object arrays
350 // positive particles
352 fV0electrons->Add((AliVTrack*)event->GetTrack(iTrackP));
354 else if( pdgP == 211){
355 fV0pions->Add((AliVTrack*)event->GetTrack(iTrackP));
357 else if( pdgP == 321){
358 fV0kaons->Add((AliVTrack*)event->GetTrack(iTrackP));
360 else if( pdgP == 2212){
361 fV0protons->Add((AliVTrack*)event->GetTrack(iTrackP));
364 // negative particles
366 fV0electrons->Add((AliVTrack*)event->GetTrack(iTrackN));
368 else if( pdgN == -211){
369 fV0pions->Add((AliVTrack*)event->GetTrack(iTrackN));
371 else if( pdgN == -321){
372 fV0kaons->Add((AliVTrack*)event->GetTrack(iTrackN));
374 else if( pdgN == -2212){
375 fV0protons->Add((AliVTrack*)event->GetTrack(iTrackN));
381 //______________________________________________________________________________
382 void AliAnalysisTaskPIDqa::ClearV0PIDlist(){
385 // Clear the PID object arrays
388 fV0electrons->Clear();
394 //______________________________________________________________________________
395 void AliAnalysisTaskPIDqa::FillITSqa()
398 // Fill PID qa histograms for the ITS
401 AliVEvent *event=InputEvent();
403 Int_t ntracks=event->GetNumberOfTracks();
404 for(Int_t itrack = 0; itrack < ntracks; itrack++){
405 AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
406 ULong_t status=track->GetStatus();
407 // not that nice. status bits not in virtual interface
408 // ITS refit + ITS pid selection
409 if (!( ( (status & AliVTrack::kITSrefit)==AliVTrack::kITSrefit ) ||
410 ! ( (status & AliVTrack::kITSpid )==AliVTrack::kITSpid ) )) continue;
411 Double_t mom=track->P();
413 TList *theList = 0x0;
414 if(( (status & AliVTrack::kTPCin)==AliVTrack::kTPCin )){
418 if(!( (status & AliVTrack::kITSpureSA)==AliVTrack::kITSpureSA )){
419 //ITS Standalone tracks
420 theList=fListQAitsSA;
422 //ITS Pure Standalone tracks
423 theList=fListQAitsPureSA;
428 for (Int_t ispecie=0; ispecie<AliPID::kSPECIESC; ++ispecie){
429 TH2 *h=(TH2*)theList->At(ispecie);
431 Double_t nSigma=fPIDResponse->NumberOfSigmasITS(track, (AliPID::EParticleType)ispecie);
434 TH2 *h=(TH2*)theList->At(AliPID::kSPECIESC);
436 Double_t sig=track->GetITSsignal();
443 //______________________________________________________________________________
444 void AliAnalysisTaskPIDqa::FillTPCHistogramsSignal(TList *sublist, Int_t scenario, AliVTrack *track, Int_t mult)
447 // Fill PID qa histograms for the TPC: Fill the histograms for the TPC signal for different settings
450 AliMCEvent *eventMC=MCEvent(); // MC event for MC truth PID
452 Double_t mom=0.; // track momentum
453 Double_t eta=0.; // track eta
454 Double_t sig=0.; // TPC dE/dx signal
455 Double_t sigStd=0.; // TPC dE/dx signal (standard = all ROCs)
456 Double_t sigIROC=0.; // TPC dE/dx signal (IROC)
457 Double_t sigOROCmedium=0.; // TPC dE/dx signal (OROCmedium)
458 Double_t sigOROClong=0.; // TPC dE/dx signal (OROClong)
459 Double_t eleLineDist=0.; // difference between TPC signal and electron expectation
460 Int_t trackLabel=0; // label of the AliVTrack to identify the corresponding MCtrack
461 Int_t pdgCode=0; // pdgcode of MC track for MC truth scenario
462 Int_t pdgCodeAbs=0; // absolute value of pdgcode to get both particles and antiparticles
463 Int_t iSigMax=1; // number of TPC signals (std = 1, set automatically higher if available)
464 Int_t nSpecies=0; // number of particle species under study
465 Int_t count=0; // counter for the number of plot sets for all species (i.e. nsigma vs. p, eta and mult)
467 mom=track->GetTPCmomentum();
469 sigStd=track->GetTPCsignal();
471 eleLineDist=sigStd-fPIDResponse->GetTPCResponse().GetExpectedSignal(track,AliPID::kElectron);
473 // Get number of particle species (less for V0 candidates = scenarios 40-44)
474 if (scenario > 39) nSpecies=(Int_t)AliPID::kSPECIES;
475 else nSpecies=(Int_t)AliPID::kSPECIESC;
477 // Set number of plot sets for all species
478 // (i.e. only nsigma vs. p => count=1; also vs. eta and mult => count=3)
479 if ( scenario == 1 || scenario > 39) count=3;
482 // Get MC track ( --> can be deleted if TPC signal is NOT filled for scenario=1 (MC truth)
484 trackLabel=TMath::Abs(track->GetLabel());
485 AliVTrack *mcTrack=(AliVTrack*)eventMC->GetTrack(trackLabel);
486 pdgCode=mcTrack->PdgCode();
487 pdgCodeAbs=TMath::Abs(pdgCode);
490 // Get TPC dE/dx info and different TPC signals (IROC, OROCmedium, OROClong)
491 AliTPCdEdxInfo* fTPCdEdxInfo = 0x0;
492 fTPCdEdxInfo = track->GetTPCdEdxInfo();
495 sigIROC=fTPCdEdxInfo->GetTPCsignalShortPad();
496 sigOROCmedium=fTPCdEdxInfo->GetTPCsignalMediumPad();
497 sigOROClong=fTPCdEdxInfo->GetTPCsignalLongPad();
500 //printf("mom = %.3f sigStd = %.3f sigIROC = %.3f sigOROCmedium = %.3f sigOROClong = %.3f \n",mom,sigStd,sigIROC,sigOROCmedium,sigOROClong);
504 // TPC signal for all particles vs. momentum (standard, IROC, OROCmedium, OROClong)
505 TH2 *h1std=(TH2*)sublist->At(count*nSpecies+4);
507 h1std->Fill(mom,sigStd);
510 TH2 *h1iroc=(TH2*)sublist->At(count*nSpecies+5);
511 if ( h1iroc && sigIROC ) {
512 h1iroc->Fill(mom,sigIROC);
515 TH2 *h1orocm=(TH2*)sublist->At(count*nSpecies+6);
516 if (h1orocm && sigOROCmedium ) {
517 h1orocm->Fill(mom,sigOROCmedium);
520 TH2 *h1orocl=(TH2*)sublist->At(count*nSpecies+7);
521 if ( h1orocl && sigOROClong ) {
522 h1orocl->Fill(mom,sigOROClong);
526 // - Beginn: MIP pions: TPC signal vs. eta, TPC signal vs. mult -
527 if (mom>0.45 && mom<0.5 && sigStd>40 && sigStd<60) {
529 Bool_t isPionMC=kTRUE;
532 if ( pdgCodeAbs != 211 && pdgCodeAbs != 111 ) isPionMC=kFALSE;
535 // MIP pions: TPC signal vs. eta (standard, IROC, OROCmedium, OROClong)
536 for (Int_t iSig=0; iSig<iSigMax; iSig++) {
537 if (iSig==0) sig=sigStd;
538 else if (iSig==1) sig=sigIROC;
539 else if (iSig==2) sig=sigOROCmedium;
540 else if (iSig==3) sig=sigOROClong;
542 TH2 *h2=(TH2*)sublist->At(count*nSpecies+8+iSig);
543 if ( h2 && isPionMC ) {
548 // MIP pions: TPC signal vs. mult (standard, IROC, OROCmedium, OROClong)
549 for (Int_t iSig=0; iSig<iSigMax; iSig++) {
550 if (iSig==0) sig=sigStd;
551 else if (iSig==1) sig=sigIROC;
552 else if (iSig==2) sig=sigOROCmedium;
553 else if (iSig==3) sig=sigOROClong;
555 TH2 *h3=(TH2*)sublist->At(count*nSpecies+12+iSig);
556 if ( h3 && isPionMC && mult > 0 ) {
560 } // - End: MIP pions -
562 // - Beginn: Electrons: TPC signal vs. eta, TPC signal vs. mult -
563 if (mom>0.32 && mom<0.38 && eleLineDist>-10. && eleLineDist<15.) {
565 Bool_t isElectronMC=kTRUE;
568 if ( pdgCodeAbs != 11 ) isElectronMC=kFALSE;
571 // Electrons: TPC signal vs. eta (standard, IROC, OROCmedium, OROClong)
572 for (Int_t iSig=0; iSig<iSigMax; iSig++) {
573 if (iSig==0) sig=sigStd;
574 else if (iSig==1) sig=sigIROC;
575 else if (iSig==2) sig=sigOROCmedium;
576 else if (iSig==3) sig=sigOROClong;
578 TH2 *h4=(TH2*)sublist->At(count*nSpecies+16+iSig);
579 if ( h4 && isElectronMC ) {
584 // Electrons: TPC signal vs. mult (standard, IROC, OROCmedium, OROClong)
585 for (Int_t iSig=0; iSig<iSigMax; iSig++) {
586 if (iSig==0) sig=sigStd;
587 else if (iSig==1) sig=sigIROC;
588 else if (iSig==2) sig=sigOROCmedium;
589 else if (iSig==3) sig=sigOROClong;
591 TH2 *h5=(TH2*)sublist->At(count*nSpecies+20+iSig);
592 if ( h5 && isElectronMC && mult > 0 ) {
596 } // - End: Electrons -
600 //______________________________________________________________________________
601 void AliAnalysisTaskPIDqa::FillTPCHistogramsNsigma(TList *sublist, Int_t scenario, AliVTrack *track, Int_t mult)
604 // Fill PID qa histograms for the TPC: Fill the histograms for TPC Nsigma for different settings
607 AliMCEvent *eventMC=MCEvent(); // MC event for MC truth PID
609 Double_t mom=0.; // track momentum
610 Double_t eta=0.; // track eta
611 Double_t nSigma=0.; // number of sigmas wrt. expected signal
612 Double_t sig=0.; // TPC dE/dx signal
613 Double_t eleLineDist=0.; // difference between TPC signal and electron expectation
614 Int_t trackLabel=0; // label of the AliVTrack to identify the corresponding MCtrack
615 Int_t pdgCode=0; // pdgcode of MC track for MC truth scenario
616 Int_t pdgCodeAbs=0; // absolute value of pdgcode to get both particles and antiparticles
617 Int_t nSpecies=0; // number of particle species under study
618 Int_t count=0; // counter for the number of plot sets for all species (i.e. vs. p, eta and mult)
620 mom=track->GetTPCmomentum();
622 sig=track->GetTPCsignal();
624 eleLineDist=sig-fPIDResponse->GetTPCResponse().GetExpectedSignal(track,AliPID::kElectron);
626 // Get number of particle species (less for V0 candidates = scenarios 40-44)
627 if (scenario > 39) nSpecies=(Int_t)AliPID::kSPECIES;
628 else nSpecies=(Int_t)AliPID::kSPECIESC;
630 // Set number of plot sets for all species
631 // (i.e. only vs. p => count=1; also vs. eta and mult => count=3)
632 if ( scenario == 1 || scenario > 39 ) count=3;
637 trackLabel=TMath::Abs(track->GetLabel());
638 AliVTrack *mcTrack=(AliVTrack*)eventMC->GetTrack(trackLabel);
639 pdgCode=mcTrack->PdgCode();
640 pdgCodeAbs=TMath::Abs(pdgCode);
644 // - Beginn: Nsigma vs. p, vs. eta and vs. multiplicity for different particle species -
645 for (Int_t ispecie=0; ispecie<nSpecies; ++ispecie){
647 TH2 *h=(TH2*)sublist->At(ispecie);
651 if ( ispecie == 0 && pdgCodeAbs != 11 ) continue; // Electron
652 if ( ispecie == 1 && pdgCodeAbs != 13 ) continue; // Muon
653 if ( ispecie == 2 && pdgCodeAbs != 211 && pdgCodeAbs!=111 ) continue; // Pion
654 if ( ispecie == 3 && pdgCodeAbs != 321 && pdgCodeAbs!=311 ) continue; // Kaon
655 if ( ispecie == 4 && pdgCodeAbs != 2212 ) continue; // Proton
656 if ( ispecie == 5 && pdgCodeAbs != 1000010020 ) continue; // Deuteron
657 if ( ispecie == 6 && pdgCodeAbs != 1000010030 ) continue; // Triton
658 if ( ispecie == 7 && pdgCodeAbs != 1000020030 ) continue; // Helium-3
659 if ( ispecie == 8 && pdgCodeAbs != 1000020040 ) continue; // Alpha
661 else if (scenario > 39) {
662 if ( ispecie == 0 && scenario != 40 ) continue; // Electron
663 if ( ispecie == 1 ) continue; // Muon
664 if ( ispecie == 2 && scenario != 42 ) continue; // Pion
665 if ( ispecie == 3 && scenario != 43 ) continue; // Kaon
666 if ( ispecie == 4 && scenario != 44 ) continue; // Proton
670 nSigma=fPIDResponse->NumberOfSigmasTPC(track, (AliPID::EParticleType)ispecie, AliTPCPIDResponse::kdEdxHybrid);
672 else if (scenario == 3) {
673 nSigma=fPIDResponse->NumberOfSigmasTPC(track, (AliPID::EParticleType)ispecie, AliTPCPIDResponse::kdEdxOROC);
676 nSigma=fPIDResponse->NumberOfSigmasTPC(track, (AliPID::EParticleType)ispecie);
682 TH2 *hEta=(TH2*)sublist->At(ispecie+nSpecies);
683 TH2 *hMult=(TH2*)sublist->At(ispecie+2*nSpecies);
685 if ( hEta ) hEta->Fill(eta,nSigma);
686 if ( hMult && mult > 0 ) hMult->Fill(mult,nSigma);
688 } // - End: different particle species -
691 // -- Beginn: Fill histograms for MIP pions and electrons (only for some scenarios) --
692 if ( scenario == 0 || scenario == 2 || scenario == 3 ) {
694 // - Beginn: MIP pions: Nsigma vs. eta, Nsigma vs. mult -
695 if (mom>0.45 && mom<0.5 && sig>40 && sig<60) {
697 Bool_t isPionMC=kTRUE;
699 TH2 *h1=(TH2*)sublist->At(count*nSpecies);
702 if ( pdgCodeAbs != 211 && pdgCodeAbs != 111 ) isPionMC=kFALSE;
704 nSigma=fPIDResponse->NumberOfSigmasTPC(track, AliPID::kPion);
707 else if (scenario == 2) {
708 nSigma=fPIDResponse->NumberOfSigmasTPC(track, AliPID::kPion, AliTPCPIDResponse::kdEdxHybrid);
710 else if (scenario == 3) {
711 nSigma=fPIDResponse->NumberOfSigmasTPC(track, AliPID::kPion, AliTPCPIDResponse::kdEdxOROC);
713 else nSigma=fPIDResponse->NumberOfSigmasTPC(track, AliPID::kPion);
715 if (isPionMC) h1->Fill(eta,nSigma);
718 TH2 *h2m=(TH2*)sublist->At(count*nSpecies+1);
719 if ( h2m && isPionMC && mult > 0 ) {
720 h2m->Fill(mult,nSigma);
723 } // - End: MIP pions -
725 // - Beginn: Electrons: Nsigma vs. eta, Nsigma vs. mult -
726 if (mom>0.32 && mom<0.38 && eleLineDist>-10. && eleLineDist<15.) {
728 Bool_t isElectronMC=kTRUE;
730 TH2 *h3=(TH2*)sublist->At(count*nSpecies+2);
733 if ( pdgCodeAbs != 11 ) isElectronMC=kFALSE;
735 nSigma=fPIDResponse->NumberOfSigmasTPC(track, AliPID::kElectron);
739 nSigma=fPIDResponse->NumberOfSigmasTPC(track, AliPID::kElectron, AliTPCPIDResponse::kdEdxHybrid);
741 else if (scenario == 3) {
742 nSigma=fPIDResponse->NumberOfSigmasTPC(track, AliPID::kElectron, AliTPCPIDResponse::kdEdxOROC);
744 else nSigma=fPIDResponse->NumberOfSigmasTPC(track, AliPID::kElectron);
746 if (isElectronMC) h3->Fill(eta,nSigma);
749 TH2 *h4m=(TH2*)sublist->At(count*nSpecies+3);
750 if ( h4m && isElectronMC && mult > 0 ) {
751 h4m->Fill(mult,nSigma);
754 } // - End: Electrons -
755 } // -- End: Fill histograms for MIP pions and electrons --
759 //______________________________________________________________________________
760 void AliAnalysisTaskPIDqa::FillTPCqa()
763 // Fill PID qa histograms for the TPC
766 // switches for the different scenarios
767 Bool_t scBasic=1; // default/basic
768 Bool_t scMCtruth=1; // for MC truth tracks
769 Bool_t scHybrid=1; // for hybrid PID (only LHC11h)
770 Bool_t scOROChigh=1; // only OROC signal (only LHC11h)
771 Bool_t scV0=1; // for V0 candidates (only for ESDs available)
772 Int_t scCounter=0; // counter of scenarios, used for the histograms at the end of FillTPCqa
775 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
776 AliInputEventHandler *inputHandler=dynamic_cast<AliInputEventHandler*>(man->GetInputEventHandler());
777 if (!inputHandler) AliFatal("Input handler needed");
779 AliVEvent *event=InputEvent();
781 // ESD or AOD event needed to get reference multiplicity (not in AliVEvent)
782 AliAODEvent *fAODevent = 0x0; // AOD event
783 AliESDEvent *fESDevent = 0x0; // ESD event
784 AliESDtrackCuts *esdTrackCuts = 0x0; // ESD track Cuts (ref mult is in AliESDtrackCuts)
786 Double_t eta=0.; // track eta
787 Int_t mult=0; // event multiplicity (TPConlyRefMult)
788 //Int_t nacc=0; // counter for accepted multiplicity
791 scMCtruth=(MCEvent()!=0x0);
793 // Check if period is data LHC11h by checking if
794 // the splines for ALLhigh have been set by AliPIDResponse
795 AliTPCPIDResponse &tpcResp=fPIDResponse->GetTPCResponse();
796 if (tpcResp.GetResponseFunction(AliPID::kPion, AliTPCPIDResponse::kALLhigh)==0x0) {
801 // Check if "ESD" or "AOD" and get the corresponding event and the beam type (or centrality)
802 TString analysisType = inputHandler->GetDataType(); // can be "ESD" or "AOD"
803 if (analysisType == "ESD") {
804 fESDevent = dynamic_cast<AliESDEvent*>( InputEvent() );
805 esdTrackCuts = new AliESDtrackCuts("esdTrackCuts");
806 //printf("\n--- New event - event type = ESD \n");
808 else if (analysisType == "AOD") {
809 fAODevent = dynamic_cast<AliAODEvent*>( InputEvent() );
810 //printf("\n--- New event - event type = AOD \n");
812 // disable V0 scenario, because V0s are not available for AODs in this current implementation
816 // Check if Basic list is already created
817 // If not: Go to SetupTPCqa and creat lists and histograms
818 if(!fListQAtpcBasic) {
819 //printf("\n--- No list QA TPC Basic found -> go to SetupTPCqa! ---\n");
820 SetupTPCqa(scMCtruth, scHybrid, scV0);
823 // Get the number of scenarios by counting those, which are switched on
824 if (scBasic) scCounter++;
825 if (scMCtruth) scCounter++;
826 if (scHybrid) scCounter++;
827 if (scOROChigh) scCounter++;
828 if (scV0) scCounter++;
830 // Get reference multiplicity for ESDs
831 if ( analysisType == "ESD" && esdTrackCuts ) {
832 mult=esdTrackCuts->GetReferenceMultiplicity(fESDevent,kTRUE);
835 // Get reference multiplicity for AODs
836 if ( analysisType == "AOD" && fAODevent ) {
837 AliAODHeader * header=dynamic_cast<AliAODHeader*>(fAODevent->GetHeader());
838 if(!header) AliFatal("Not a standard AOD");
839 mult=header->GetTPConlyRefMultiplicity();
843 printf("Reference multiplicity not available \n");
847 //printf("The multiplicity is = %i ",mult);
850 // -- Begin: track loop --
851 Int_t ntracks=event->GetNumberOfTracks();
852 for(Int_t itrack = 0; itrack < ntracks; itrack++){
853 AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
858 ULong_t status=track->GetStatus();
859 // not that nice. status bits not in virtual interface
860 // TPC refit + ITS refit + TPC pid
861 if (!( (status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
862 !( (status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ) continue;
864 // The TPC pid cut removes the light nuclei (>5 sigma from proton line)
865 //|| !( (status & AliVTrack::kTPCpid ) == AliVTrack::kTPCpid )
866 Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
867 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
868 if (track->GetTPCNclsF()>0) {
869 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
872 if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
875 if ( TMath::Abs(eta)>0.9 ) continue;
877 //nacc++; // counter for accepted multiplicity
879 // the default ("basic") scenario
881 FillTPCHistogramsNsigma(fListQAtpcBasic,0,track,mult);
882 FillTPCHistogramsSignal(fListQAtpcBasic,0,track,mult);
885 // only MC truth identified particles
886 if (scMCtruth == 1) {
887 FillTPCHistogramsNsigma(fListQAtpcMCtruth,1,track,mult);
890 // the "hybrid" scenario (only for LHC11h)
892 FillTPCHistogramsNsigma(fListQAtpcHybrid,2,track,mult);
895 // the "OROC high" scenario (only for LHC11h)
896 if (scOROChigh == 1) {
897 FillTPCHistogramsNsigma(fListQAtpcOROChigh,3,track,mult);
900 } // -- End: track loop --
903 // -- Begin: track loops for V0 candidates --
906 // - Begin: track loop for electrons from V0 -
907 for(Int_t itrack = 0; itrack < fV0electrons->GetEntries(); itrack++){
908 AliVTrack *track=(AliVTrack*)fV0electrons->At(itrack);
913 ULong_t status=track->GetStatus();
914 // not that nice. status bits not in virtual interface
915 // TPC refit + ITS refit + TPC pid
916 if (!( (status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
917 !( (status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ) continue;
919 // The TPC pid cut removes the light nuclei (>5 sigma from proton line)
920 //|| !( (status & AliVTrack::kTPCpid ) == AliVTrack::kTPCpid )
921 Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
922 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
923 if (track->GetTPCNclsF()>0) {
924 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
927 if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
930 if ( TMath::Abs(eta)>0.9 ) continue;
932 // fill histograms for V0 candidates
933 FillTPCHistogramsNsigma(fListQAtpcV0,40,track,mult);
935 } // - End: track loop for electrons from V0 -
938 // - Begin: track loop for pions from V0 -
939 for(Int_t itrack = 0; itrack < fV0pions->GetEntries(); itrack++){
940 AliVTrack *track=(AliVTrack*)fV0pions->At(itrack);
945 ULong_t status=track->GetStatus();
946 // not that nice. status bits not in virtual interface
947 // TPC refit + ITS refit + TPC pid
948 if (!( (status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
949 !( (status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ) continue;
951 // The TPC pid cut removes the light nuclei (>5 sigma from proton line)
952 //|| !( (status & AliVTrack::kTPCpid ) == AliVTrack::kTPCpid )
953 Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
954 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
955 if (track->GetTPCNclsF()>0) {
956 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
959 if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
962 if ( TMath::Abs(eta)>0.9 ) continue;
964 // fill histograms for V0 candidates
965 FillTPCHistogramsNsigma(fListQAtpcV0,42,track,mult);
967 } // - End: track loop for pions from V0 -
970 // - Begin: track loop for kaons from V0 -
971 for(Int_t itrack = 0; itrack < fV0kaons->GetEntries(); itrack++){
972 AliVTrack *track=(AliVTrack*)fV0kaons->At(itrack);
977 ULong_t status=track->GetStatus();
978 // not that nice. status bits not in virtual interface
979 // TPC refit + ITS refit + TPC pid
980 if (!( (status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
981 !( (status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ) continue;
983 // The TPC pid cut removes the light nuclei (>5 sigma from proton line)
984 //|| !( (status & AliVTrack::kTPCpid ) == AliVTrack::kTPCpid )
985 Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
986 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
987 if (track->GetTPCNclsF()>0) {
988 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
991 if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
994 if ( TMath::Abs(eta)>0.9 ) continue;
996 // fill histograms for V0 candidates
997 FillTPCHistogramsNsigma(fListQAtpcV0,43,track,mult);
999 } // - End: track loop for kaons from V0 -
1002 // - Begin: track loop for protons from V0 -
1003 for(Int_t itrack = 0; itrack < fV0protons->GetEntries(); itrack++){
1004 AliVTrack *track=(AliVTrack*)fV0protons->At(itrack);
1009 ULong_t status=track->GetStatus();
1010 // not that nice. status bits not in virtual interface
1011 // TPC refit + ITS refit + TPC pid
1012 if (!( (status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
1013 !( (status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ) continue;
1015 // The TPC pid cut removes the light nuclei (>5 sigma from proton line)
1016 //|| !( (status & AliVTrack::kTPCpid ) == AliVTrack::kTPCpid )
1017 Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
1018 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
1019 if (track->GetTPCNclsF()>0) {
1020 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
1023 if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
1026 if ( TMath::Abs(eta)>0.9 ) continue;
1028 // fill histograms for V0 candidates
1029 FillTPCHistogramsNsigma(fListQAtpcV0,44,track,mult);
1031 } // - End: track loop for protons from V0 -
1033 } // -- End: track loops for V0 candidates --
1036 // Multiplicity distribution
1037 TH1 *hm=(TH1*)fListQAtpc->At(scCounter);
1042 //printf("\nAccepted multiplicity = %i \n --- END of event --- \n",nacc);
1046 //______________________________________________________________________________
1047 void AliAnalysisTaskPIDqa::FillTRDqa()
1050 // Fill PID qa histograms for the TRD
1052 AliVEvent *event=InputEvent();
1053 Int_t ntracks = event->GetNumberOfTracks();
1054 for(Int_t itrack = 0; itrack < ntracks; itrack++){
1055 AliVTrack *track = (AliVTrack *)event->GetTrack(itrack);
1060 ULong_t status=track->GetStatus();
1061 // not that nice. status bits not in virtual interface
1062 // TPC refit + ITS refit + TPC pid + TRD out
1063 if (!( (status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
1064 !( (status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ||
1065 // !( (status & AliVTrack::kTPCpid ) == AliVTrack::kTPCpid ) || //removes light nuclei. So it is out for the moment
1066 !( (status & AliVTrack::kTRDout ) == AliVTrack::kTRDout )) continue;
1068 Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
1069 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
1070 if (track->GetTPCNclsF()>0) {
1071 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
1074 if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
1076 Double_t likelihoods[AliPID::kSPECIES];
1077 if(fPIDResponse->ComputeTRDProbability(track, AliPID::kSPECIES, likelihoods) != AliPIDResponse::kDetPidOk) continue;
1078 Int_t ntracklets = 0;
1079 Double_t momentum = -1.;
1080 for(Int_t itl = 0; itl < 6; itl++) {
1081 if(track->GetTRDmomentum(itl) > 0.) {
1083 if(momentum < 0) momentum = track->GetTRDmomentum(itl);
1087 for(Int_t ispecie = 0; ispecie < AliPID::kSPECIES; ispecie++){
1088 TH2F *hLike = (TH2F *)fListQAtrd->At(ntracklets*AliPID::kSPECIES+ispecie);
1089 if (hLike) hLike->Fill(momentum,likelihoods[ispecie]);
1092 //=== nSigma and signal ===
1093 for (Int_t ispecie=0; ispecie<AliPID::kSPECIESC; ++ispecie){
1094 TH2 *h=(TH2*)fListQAtrdNsig->At(ispecie);
1095 TH2 *hTPCTOF=(TH2*)fListQAtrdNsigTPCTOF->At(ispecie);
1096 if (!h || !hTPCTOF) continue;
1097 Float_t nSigmaTPC=fPIDResponse->NumberOfSigmas(AliPIDResponse::kTPC, track, (AliPID::EParticleType)ispecie);
1098 Float_t nSigmaTRD=fPIDResponse->NumberOfSigmas(AliPIDResponse::kTRD, track, (AliPID::EParticleType)ispecie);
1099 Float_t nSigmaTOF=fPIDResponse->NumberOfSigmas(AliPIDResponse::kTOF, track, (AliPID::EParticleType)ispecie);
1100 h->Fill(momentum,nSigmaTRD);
1102 if (TMath::Abs(nSigmaTPC)<3 && TMath::Abs(nSigmaTOF)<3) {
1103 hTPCTOF->Fill(momentum,nSigmaTRD);
1107 TH2 *h=(TH2*)fListQAtrdNsig->Last();
1110 Double_t sig=track->GetTRDsignal();
1111 h->Fill(momentum,sig);
1117 //______________________________________________________________________________
1118 void AliAnalysisTaskPIDqa::FillTOFqa()
1121 // Fill TOF information
1123 AliVEvent *event=InputEvent();
1125 Int_t ntracks=event->GetNumberOfTracks();
1126 Int_t tracksAtTof = 0;
1127 for(Int_t itrack = 0; itrack < ntracks; itrack++){
1128 AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
1133 ULong_t status=track->GetStatus();
1134 // TPC refit + ITS refit +
1137 // (we don't use kTOFmismatch because it depends on TPC and kTOFpid because it prevents light nuclei
1138 if (!((status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
1139 !((status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ||
1140 !((status & AliVTrack::kTOFout ) == AliVTrack::kTOFout ) ||
1141 // !((status & AliVTrack::kTOFpid ) == AliVTrack::kTOFpid ) ||
1142 !((status & AliVTrack::kTIME ) == AliVTrack::kTIME ) ) continue;
1144 Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
1145 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
1146 if (track->GetTPCNclsF()>0) {
1147 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
1150 if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
1154 Double_t mom=track->P();
1156 for (Int_t ispecie=0; ispecie<AliPID::kSPECIESC; ++ispecie){
1157 TH2 *h=(TH2*)fListQAtof->At(ispecie);
1159 Double_t nSigma=fPIDResponse->NumberOfSigmasTOF(track, (AliPID::EParticleType)ispecie);
1160 h->Fill(mom,nSigma);
1163 TH2 *h=(TH2*)fListQAtof->FindObject("hSigP_TOF");
1165 Double_t sig=track->GetTOFsignal()/1000.;
1169 Int_t mask = fPIDResponse->GetTOFResponse().GetStartTimeMask(mom);
1170 ((TH1F*)fListQAtof->FindObject("hStartTimeMask_TOF"))->Fill((Double_t)(mask+0.5));
1172 if (mom >= 0.75 && mom <= 1.25 ) {
1173 Double_t nsigma= fPIDResponse->NumberOfSigmasTOF(track, (AliPID::EParticleType)AliPID::kPion);
1175 ((TH1F*)fListQAtof->FindObject("hNsigma_TOF_Pion_T0-Fill"))->Fill(nsigma);
1176 } else if (mask == 1) {
1177 ((TH1F*)fListQAtof->FindObject("hNsigma_TOF_Pion_T0-TOF"))->Fill(nsigma);
1178 } else if ( (mask == 2) || (mask == 4) || (mask == 6) ) {
1179 ((TH1F*)fListQAtof->FindObject("hNsigma_TOF_Pion_T0-T0"))->Fill(nsigma);
1181 ((TH1F*)fListQAtof->FindObject("hNsigma_TOF_Pion_T0-Best"))->Fill(nsigma);
1183 if (mask & 0x1) { //at least TOF-T0 present
1185 (void)fPIDResponse->GetSignalDelta((AliPIDResponse::EDetector)AliPIDResponse::kTOF,track,(AliPID::EParticleType)AliPID::kPion,delta);
1186 ((TH1F*)fListQAtof->FindObject("hDelta_TOF_Pion"))->Fill(delta);
1190 Double_t res = (Double_t)fPIDResponse->GetTOFResponse().GetStartTimeRes(mom);
1191 ((TH1F*)fListQAtof->FindObject("hStartTimeRes_TOF"))->Fill(res);
1193 Double_t startTimeT0 = event->GetT0TOF(0);
1194 if (startTimeT0 < 90000) ((TH1F*)fListQAtof->FindObject("hStartTimeAC_T0"))->Fill(startTimeT0);
1196 startTimeT0 = event->GetT0TOF(1);
1197 if (startTimeT0 < 90000) ((TH1F*)fListQAtof->FindObject("hStartTimeA_T0"))->Fill(startTimeT0);
1198 startTimeT0 = event->GetT0TOF(2);
1199 if (startTimeT0 < 90000) ((TH1F*)fListQAtof->FindObject("hStartTimeC_T0"))->Fill(startTimeT0);
1202 if (tracksAtTof > 0) {
1203 ((TH1F* )fListQAtof->FindObject("hnTracksAt_TOF"))->Fill(tracksAtTof);
1204 Int_t mask = fPIDResponse->GetTOFResponse().GetStartTimeMask(5.);
1205 if (mask & 0x1) ((TH1F*)fListQAtof->FindObject("hT0MakerEff"))->Fill(tracksAtTof);
1209 //______________________________________________________________________________
1210 void AliAnalysisTaskPIDqa::FillT0qa()
1213 // Fill TOF information
1215 AliVEvent *event=InputEvent();
1217 Int_t ntracks=event->GetNumberOfTracks();
1219 Int_t tracksAtT0 = 0;
1221 for(Int_t itrack = 0; itrack < ntracks; itrack++){
1222 AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
1227 ULong_t status=track->GetStatus();
1228 // TPC refit + ITS refit +
1229 if (!((status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
1230 !((status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ) continue;
1231 Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
1232 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
1233 if (track->GetTPCNclsF()>0) {
1234 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
1236 if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
1241 Bool_t t0A = kFALSE;
1242 Bool_t t0C = kFALSE;
1243 Bool_t t0And = kFALSE;
1244 Double_t startTimeT0 = event->GetT0TOF(0); // AND
1245 if (startTimeT0 < 90000) {
1247 ((TH1F*)fListQAt0->FindObject("hStartTimeAC_T0"))->Fill(startTimeT0);
1249 startTimeT0 = event->GetT0TOF(1); // T0A
1250 if (startTimeT0 < 90000) {
1252 ((TH1F*)fListQAt0->FindObject("hStartTimeA_T0"))->Fill(startTimeT0);
1255 startTimeT0 = event->GetT0TOF(2); // T0C
1256 if (startTimeT0 < 90000) {
1258 ((TH1F*)fListQAt0->FindObject("hStartTimeC_T0"))->Fill(startTimeT0);
1261 ((TH1F* )fListQAt0->FindObject("hnTracksAt_T0"))->Fill(tracksAtT0);
1262 if (t0A) ((TH1F*)fListQAt0->FindObject("hT0AEff"))->Fill(tracksAtT0);
1263 if (t0C) ((TH1F*)fListQAt0->FindObject("hT0CEff"))->Fill(tracksAtT0);
1264 if (t0And) ((TH1F*)fListQAt0->FindObject("hT0AndEff"))->Fill(tracksAtT0);
1265 if (t0A || t0C) ((TH1F*)fListQAt0->FindObject("hT0OrEff"))->Fill(tracksAtT0);
1269 //______________________________________________________________________________
1270 void AliAnalysisTaskPIDqa::FillEMCALqa()
1273 // Fill PID qa histograms for the EMCAL
1276 AliVEvent *event=InputEvent();
1278 Int_t ntracks=event->GetNumberOfTracks();
1279 for(Int_t itrack = 0; itrack < ntracks; itrack++){
1280 AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
1285 ULong_t status=track->GetStatus();
1286 // not that nice. status bits not in virtual interface
1287 if (!( (status & AliVTrack::kEMCALmatch) == AliVTrack::kEMCALmatch) ) continue;
1289 Double_t pt=track->Pt();
1291 //EMCAL nSigma (only for electrons at the moment)
1292 TH2 *h=(TH2*)fListQAemcal->At(0);
1294 Double_t nSigma=fPIDResponse->NumberOfSigmasEMCAL(track, (AliPID::EParticleType)0);
1299 //EMCAL signal (E/p vs. pT) for electrons from V0
1300 for(Int_t itrack = 0; itrack < fV0electrons->GetEntries(); itrack++){
1301 AliVTrack *track=(AliVTrack*)fV0electrons->At(itrack);
1306 ULong_t status=track->GetStatus();
1307 // not that nice. status bits not in virtual interface
1308 if (!( (status & AliVTrack::kEMCALmatch) == AliVTrack::kEMCALmatch) ) continue;
1310 Double_t pt=track->Pt();
1312 TH2 *h=(TH2*)fListQAemcal->At(1);
1315 Int_t nMatchClus = track->GetEMCALcluster();
1316 Double_t mom = track->P();
1319 if(nMatchClus > -1){
1321 AliVCluster *matchedClus = (AliVCluster*)event->GetCaloCluster(nMatchClus);
1325 // matched cluster is EMCAL
1326 if(matchedClus->IsEMCAL()){
1328 Double_t fClsE = matchedClus->E();
1339 //EMCAL signal (E/p vs. pT) for pions from V0
1340 for(Int_t itrack = 0; itrack < fV0pions->GetEntries(); itrack++){
1341 AliVTrack *track=(AliVTrack*)fV0pions->At(itrack);
1346 ULong_t status=track->GetStatus();
1347 // not that nice. status bits not in virtual interface
1348 if (!( (status & AliVTrack::kEMCALmatch) == AliVTrack::kEMCALmatch) ) continue;
1350 Double_t pt=track->Pt();
1352 TH2 *h=(TH2*)fListQAemcal->At(2);
1355 Int_t nMatchClus = track->GetEMCALcluster();
1356 Double_t mom = track->P();
1359 if(nMatchClus > -1){
1361 AliVCluster *matchedClus = (AliVCluster*)event->GetCaloCluster(nMatchClus);
1365 // matched cluster is EMCAL
1366 if(matchedClus->IsEMCAL()){
1368 Double_t fClsE = matchedClus->E();
1379 //EMCAL signal (E/p vs. pT) for protons from V0
1380 for(Int_t itrack = 0; itrack < fV0protons->GetEntries(); itrack++){
1381 AliVTrack *track=(AliVTrack*)fV0protons->At(itrack);
1386 ULong_t status=track->GetStatus();
1387 // not that nice. status bits not in virtual interface
1388 if (!( (status & AliVTrack::kEMCALmatch) == AliVTrack::kEMCALmatch) ) continue;
1390 Double_t pt=track->Pt();
1392 TH2 *hP=(TH2*)fListQAemcal->At(3);
1393 TH2 *hAP=(TH2*)fListQAemcal->At(4);
1396 Int_t nMatchClus = track->GetEMCALcluster();
1397 Double_t mom = track->P();
1398 Int_t charge = track->Charge();
1401 if(nMatchClus > -1){
1403 AliVCluster *matchedClus = (AliVCluster*)event->GetCaloCluster(nMatchClus);
1407 // matched cluster is EMCAL
1408 if(matchedClus->IsEMCAL()){
1410 Double_t fClsE = matchedClus->E();
1413 if(charge > 0) hP->Fill(pt,eop);
1414 else if(charge < 0) hAP->Fill(pt,eop);
1425 //______________________________________________________________________________
1426 void AliAnalysisTaskPIDqa::FillHMPIDqa()
1429 // Fill PID qa histograms for the HMPID
1432 AliVEvent *event=InputEvent();
1434 Int_t ntracks=event->GetNumberOfTracks();
1435 for(Int_t itrack = 0; itrack < ntracks; itrack++){
1436 AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
1441 const ULong_t status=track->GetStatus();
1442 // not that nice. status bits not in virtual interface
1443 // TPC refit + ITS refit +
1444 // TOF out + TOFpid +
1446 if (!((status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
1447 !((status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ) continue;
1449 const Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
1450 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
1451 if (track->GetTPCNclsF()>0) {
1452 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
1455 if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
1457 const Double_t mom = track->P();
1458 const Double_t ckovAngle = track->GetHMPIDsignal();
1461 for (Int_t ispecie=0; ispecie<AliPID::kSPECIESC; ++ispecie){
1462 if (ispecie==AliPID::kElectron || ispecie==AliPID::kMuon) continue;
1463 TH2 *h=(TH2*)fListQAhmpid->At(nhists);
1464 if (!h) {++nhists; continue;}
1465 const Double_t nSigma=fPIDResponse->NumberOfSigmasHMPID(track, (AliPID::EParticleType)ispecie);
1466 h->Fill(mom,nSigma);
1470 TH1F *hThetavsMom = (TH1F*)fListQAhmpid->At(AliPID::kSPECIESC);
1472 if (hThetavsMom) hThetavsMom->Fill(mom,ckovAngle);
1476 //______________________________________________________________________________
1477 void AliAnalysisTaskPIDqa::FillTOFHMPIDqa()
1480 // Fill PID qa histograms for the HMPID
1483 AliVEvent *event=InputEvent();
1485 Int_t ntracks=event->GetNumberOfTracks();
1486 for(Int_t itrack = 0; itrack < ntracks; itrack++){
1487 AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
1492 ULong_t status=track->GetStatus();
1493 // not that nice. status bits not in virtual interface
1494 // TPC refit + ITS refit +
1495 // TOF out + TOFpid +
1497 if (!((status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
1498 !((status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ||
1499 !((status & AliVTrack::kTOFout ) == AliVTrack::kTOFout ) ||
1500 !((status & AliVTrack::kTOFpid ) == AliVTrack::kTOFpid ) ||
1501 !((status & AliVTrack::kTIME ) == AliVTrack::kTIME ) ) continue;
1503 Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
1504 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
1505 if (track->GetTPCNclsF()>0) {
1506 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
1509 if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
1511 Double_t mom = track->P();
1512 Double_t ckovAngle = track->GetHMPIDsignal();
1514 Double_t nSigmaTOF[3];
1517 for (Int_t ispecie=2; ispecie<5; ++ispecie){
1519 nSigmaTOF[ispecie-2]=fPIDResponse->NumberOfSigmasTOF(track, (AliPID::EParticleType)ispecie);
1520 h[ispecie-2] = (TH1F*)fListQAtofhmpid->At(ispecie-2);}
1522 if(TMath::Abs(nSigmaTOF[0])<2) h[0]->Fill(mom,ckovAngle);
1524 if(TMath::Abs(nSigmaTOF[1])<2 && TMath::Abs(nSigmaTOF[0])>3) h[1]->Fill(mom,ckovAngle);
1526 if(TMath::Abs(nSigmaTOF[2])<2 && TMath::Abs(nSigmaTOF[1])>3 && TMath::Abs(nSigmaTOF[0])>3) h[2]->Fill(mom,ckovAngle);
1532 //______________________________________________________________________________
1533 void AliAnalysisTaskPIDqa::FillTPCTOFqa()
1536 // Fill PID qa histograms for the TOF
1537 // Here also the TPC histograms after TOF selection are filled
1540 AliVEvent *event=InputEvent();
1542 Int_t ntracks=event->GetNumberOfTracks();
1543 for(Int_t itrack = 0; itrack < ntracks; itrack++){
1544 AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
1549 ULong_t status=track->GetStatus();
1550 // not that nice. status bits not in virtual interface
1551 // TPC refit + ITS refit +
1552 // TOF out + TOFpid +
1554 if (!((status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
1555 !((status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ||
1556 // !( (status & AliVTrack::kTPCpid ) == AliVTrack::kTPCpid ) || //removes light nuclei, so it is out for the moment
1557 !((status & AliVTrack::kTOFout ) == AliVTrack::kTOFout ) ||
1558 !((status & AliVTrack::kTOFpid ) == AliVTrack::kTOFpid ) ||
1559 !((status & AliVTrack::kTIME ) == AliVTrack::kTIME ) ) continue;
1561 Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
1562 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
1563 if (track->GetTPCNclsF()>0) {
1564 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
1567 if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
1570 Double_t mom=track->P();
1571 Double_t momTPC=track->GetTPCmomentum();
1573 for (Int_t ispecie=0; ispecie<AliPID::kSPECIESC; ++ispecie){
1575 Double_t nSigmaTOF=fPIDResponse->NumberOfSigmasTOF(track, (AliPID::EParticleType)ispecie);
1576 Double_t nSigmaTPC=fPIDResponse->NumberOfSigmasTPC(track, (AliPID::EParticleType)ispecie);
1579 TH2 *h=(TH2*)fListQAtpctof->At(ispecie);
1580 if (h && TMath::Abs(nSigmaTOF)<3.) h->Fill(momTPC,nSigmaTPC);
1583 h=(TH2*)fListQAtpctof->At(ispecie+AliPID::kSPECIESC);
1584 if (h && TMath::Abs(nSigmaTPC)<3.) h->Fill(mom,nSigmaTOF);
1586 //EMCAL after TOF and TPC cut
1587 h=(TH2*)fListQAtpctof->At(ispecie+2*AliPID::kSPECIESC);
1588 if (h && TMath::Abs(nSigmaTOF)<3. && TMath::Abs(nSigmaTPC)<3. ){
1590 Int_t nMatchClus = track->GetEMCALcluster();
1591 Double_t pt = track->Pt();
1594 if(nMatchClus > -1){
1596 AliVCluster *matchedClus = (AliVCluster*)event->GetCaloCluster(nMatchClus);
1600 // matched cluster is EMCAL
1601 if(matchedClus->IsEMCAL()){
1603 Double_t fClsE = matchedClus->E();
1617 //_____________________________________________________________________________
1618 void AliAnalysisTaskPIDqa::FillQAinfo()
1621 // Fill the QA information
1626 TObjArray *arrTPC=static_cast<TObjArray*>(fListQAinfo->At(0));
1627 if (fPIDResponse && arrTPC){
1628 AliTPCPIDResponse &tpcResp=fPIDResponse->GetTPCResponse();
1629 // fill spline names
1630 if (!arrTPC->UncheckedAt(0)){
1632 TObjArray *arrTPCsplineNames=new TObjArray(AliPID::kSPECIESC);
1633 arrTPCsplineNames->SetOwner();
1634 arrTPCsplineNames->SetName("TPC_spline_names");
1635 arrTPC->AddAt(arrTPCsplineNames,0);
1637 for (Int_t iresp=0; iresp<AliPID::kSPECIESC; ++iresp){
1638 const TObject *o=tpcResp.GetResponseFunction((AliPID::EParticleType)iresp);
1640 arrTPCsplineNames->Add(new TObjString(Form("%02d: %s",iresp, o->GetName())));
1644 // tpc response config
1645 if (!arrTPC->UncheckedAt(1)){
1647 TObjArray *arrTPCconfigInfo=new TObjArray;
1648 arrTPCconfigInfo->SetOwner();
1649 arrTPCconfigInfo->SetName("TPC_config_info");
1650 arrTPC->AddAt(arrTPCconfigInfo,1);
1652 TObjString *ostr=0x0;
1653 ostr=new TObjString;
1654 ostr->String().Form("Eta Corr map: %s", tpcResp.GetEtaCorrMap()?tpcResp.GetEtaCorrMap()->GetName():"none");
1655 arrTPCconfigInfo->Add(ostr);
1657 ostr=new TObjString;
1658 ostr->String().Form("Sigma Par map: %s", tpcResp.GetSigmaPar1Map()?tpcResp.GetSigmaPar1Map()->GetName():"none");
1659 arrTPCconfigInfo->Add(ostr);
1661 ostr=new TObjString;
1662 ostr->String().Form("MIP: %.2f", tpcResp.GetMIP());
1663 arrTPCconfigInfo->Add(ostr);
1665 ostr=new TObjString;
1666 ostr->String().Form("Res: Def %.3g (%.3g) : AllHigh %.3g (%.3g) : OROC high %.3g (%.3g)",
1667 tpcResp.GetRes0(AliTPCPIDResponse::kDefault), tpcResp.GetResN2(AliTPCPIDResponse::kDefault),
1668 tpcResp.GetRes0(AliTPCPIDResponse::kALLhigh), tpcResp.GetResN2(AliTPCPIDResponse::kALLhigh),
1669 tpcResp.GetRes0(AliTPCPIDResponse::kOROChigh), tpcResp.GetResN2(AliTPCPIDResponse::kOROChigh)
1671 arrTPCconfigInfo->Add(ostr);
1676 //______________________________________________________________________________
1677 void AliAnalysisTaskPIDqa::SetupITSqa()
1680 // Create the ITS qa objects
1683 TVectorD *vX=MakeLogBinning(200,.1,30);
1686 for (Int_t ispecie=0; ispecie<AliPID::kSPECIESC; ++ispecie){
1687 TH2F *hNsigmaP = new TH2F(Form("hNsigmaP_ITS_%s",AliPID::ParticleName(ispecie)),
1688 Form("ITS n#sigma %s vs. p;p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
1689 vX->GetNrows()-1,vX->GetMatrixArray(),
1691 fListQAits->Add(hNsigmaP);
1693 TH2F *hSig = new TH2F("hSigP_ITS",
1694 "ITS signal vs. p;p [GeV]; ITS signal [arb. units]",
1695 vX->GetNrows()-1,vX->GetMatrixArray(),
1697 fListQAits->Add(hSig);
1699 //ITS Standalone tracks
1700 for (Int_t ispecie=0; ispecie<AliPID::kSPECIESC; ++ispecie){
1701 TH2F *hNsigmaPSA = new TH2F(Form("hNsigmaP_ITSSA_%s",AliPID::ParticleName(ispecie)),
1702 Form("ITS n#sigma %s vs. p;p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
1703 vX->GetNrows()-1,vX->GetMatrixArray(),
1705 fListQAitsSA->Add(hNsigmaPSA);
1707 TH2F *hSigSA = new TH2F("hSigP_ITSSA",
1708 "ITS signal vs. p;p [GeV]; ITS signal [arb. units]",
1709 vX->GetNrows()-1,vX->GetMatrixArray(),
1711 fListQAitsSA->Add(hSigSA);
1713 //ITS Pure Standalone tracks
1714 for (Int_t ispecie=0; ispecie<AliPID::kSPECIESC; ++ispecie){
1715 TH2F *hNsigmaPPureSA = new TH2F(Form("hNsigmaP_ITSPureSA_%s",AliPID::ParticleName(ispecie)),
1716 Form("ITS n#sigma %s vs. p;p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
1717 vX->GetNrows()-1,vX->GetMatrixArray(),
1719 fListQAitsPureSA->Add(hNsigmaPPureSA);
1721 TH2F *hSigPureSA = new TH2F("hSigP_ITSPureSA",
1722 "ITS signal vs. p;p [GeV]; ITS signal [arb. units]",
1723 vX->GetNrows()-1,vX->GetMatrixArray(),
1725 fListQAitsPureSA->Add(hSigPureSA);
1730 //_____________________________________________________________________________
1731 void AliAnalysisTaskPIDqa::AddTPCHistogramsSignal(TList *sublist, const char *scenario)
1734 // Create the TPC qa objects: create histograms for the TPC signal for different settings
1737 TVectorD *vX=MakeLogBinning(200,.1,30);
1738 Int_t nBinsMult = 38;
1739 Double_t xBinsMult[39] = {0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100,
1740 120, 140, 160, 180, 200,
1741 300, 400, 500, 600, 700, 800, 900, 1000,
1742 1200, 1400, 1600, 1800, 2000,
1743 2200, 2400, 2600, 2800, 3000,
1744 3200, 3400, 3600, 3800, 4000
1746 const Int_t binsEta=110;
1747 Float_t etaMin=-1.1;
1750 char signal[4][12]={"std","IROC","OROCmedium","OROClong"};
1753 // TPC signal vs. p for all particles (standard, IROC, OROCmedium, OROClong)
1754 for (Int_t iSig=0; iSig<4; iSig++) {
1755 TH2F *hSigP = new TH2F(Form("hSigP_TPC_%s_%s",signal[iSig],scenario),
1756 Form("TPC_%s signal (%s) vs. p;p [GeV]; TPC signal [arb. units]",scenario,signal[iSig]),
1757 vX->GetNrows()-1,vX->GetMatrixArray(),
1759 sublist->Add(hSigP);
1762 // MIP pions: TPC signal vs. eta
1763 for (Int_t iSig=0; iSig<4; iSig++) {
1764 TH2F *hSigEtaMIPpi = new TH2F(Form("hSigEta_TPC_%s_%s_MIPpi",signal[iSig],scenario),
1765 Form("TPC_%s signal (%s) MIPpi vs. eta;#eta;TPC signal [arb. units]",scenario,signal[iSig]),
1766 binsEta,etaMin,etaMax,
1768 sublist->Add(hSigEtaMIPpi);
1771 // MIP pions: TPC signal vs. multiplicity
1772 for (Int_t iSig=0; iSig<4; iSig++) {
1773 TH2F *hSigMultMPIpi = new TH2F(Form("hSigMult_TPC_%s_%s_MIPpi",signal[iSig],scenario),
1774 Form("TPC_%s signal (%s) MIPpi vs. mult;multiplicity;TPC signal [arb. units]",scenario,signal[iSig]),
1775 nBinsMult,xBinsMult,
1777 sublist->Add(hSigMultMPIpi);
1780 // Electrons: TPC signal vs. eta
1781 for (Int_t iSig=0; iSig<4; iSig++) {
1782 TH2F *hSigEtaEle = new TH2F(Form("hSigEta_TPC_%s_%s_Ele",signal[iSig],scenario),
1783 Form("TPC_%s signal (%s) electrons vs. eta;#eta;TPC signal [arb. units]",scenario,signal[iSig]),
1784 binsEta,etaMin,etaMax,
1786 sublist->Add(hSigEtaEle);
1789 // Electrons: TPC signal vs. multiplicity
1790 for (Int_t iSig=0; iSig<4; iSig++) {
1791 TH2F *hSigMultEle = new TH2F(Form("hSigMult_TPC_%s_%s_Ele",signal[iSig],scenario),
1792 Form("TPC_%s signal (%s) electrons vs. mult;multiplicity;TPC signal [arb. units]",scenario,signal[iSig]),
1793 nBinsMult,xBinsMult,
1795 sublist->Add(hSigMultEle);
1802 //_____________________________________________________________________________
1803 void AliAnalysisTaskPIDqa::AddTPCHistogramsNsigma(TList *sublist, const char *scenario, Int_t scnumber)
1806 // Create the TPC qa objects: create histograms for TPC Nsigma for different settings
1809 TVectorD *vX=MakeLogBinning(200,.1,30.);
1810 Int_t nBinsMult = 38;
1811 Double_t xBinsMult[39] = {0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100,
1812 120, 140, 160, 180, 200,
1813 300, 400, 500, 600, 700, 800, 900, 1000,
1814 1200, 1400, 1600, 1800, 2000,
1815 2200, 2400, 2600, 2800, 3000,
1816 3200, 3400, 3600, 3800, 4000
1818 const Int_t binsEta=110;
1819 Float_t etaMin=-1.1;
1824 if (scnumber == 4) nSpecies=(Int_t)AliPID::kSPECIES;
1825 else nSpecies=(Int_t)AliPID::kSPECIESC;
1827 // Nsigma vs. p for different particle species
1828 for (Int_t ispecie=0; ispecie<nSpecies; ++ispecie){
1829 TH2F *hNsigmaP = new TH2F(Form("hNsigmaP_TPC_%s_%s",scenario,AliPID::ParticleName(ispecie)),
1830 Form("TPC_%s n#sigma %s vs. p;p [GeV]; n#sigma",scenario,AliPID::ParticleName(ispecie)),
1831 vX->GetNrows()-1,vX->GetMatrixArray(),
1833 sublist->Add(hNsigmaP);
1836 // Nsigma vs. eta for different particle species (only for some scenarios)
1837 if ( scnumber == 1 || scnumber == 4 ) {
1838 for (Int_t ispecie=0; ispecie<nSpecies; ++ispecie){
1839 TH2F *hNsigmaEta = new TH2F(Form("hNsigmaEta_TPC_%s_%s",scenario,AliPID::ParticleName(ispecie)),
1840 Form("TPC_%s n#sigma %s vs. eta;#eta; n#sigma",scenario,AliPID::ParticleName(ispecie)),
1841 binsEta,etaMin,etaMax,
1843 sublist->Add(hNsigmaEta);
1847 // Nsigma vs. multiplicity for different particle species (only for some scenarios)
1848 if ( scnumber == 1 || scnumber == 4 ) {
1849 for (Int_t ispecie=0; ispecie<nSpecies; ++ispecie){
1850 TH2F *hNsigmaMult = new TH2F(Form("hNsigmaMult_TPC_%s_%s",scenario,AliPID::ParticleName(ispecie)),
1851 Form("TPC_%s n#sigma %s vs. mult;multiplicity; n#sigma",scenario,AliPID::ParticleName(ispecie)),
1852 nBinsMult,xBinsMult,
1854 sublist->Add(hNsigmaMult);
1858 // - Beginn: Adding histograms for MIP pions and electrons (only for some scenarios) -
1859 if ( scnumber == 0 || scnumber == 2 || scnumber == 3 ) {
1861 // MIP pions: Nsigma vs. eta
1862 TH2F *hNsigmaEtaMIPpi = new TH2F(Form("hNsigmaEta_TPC_%s_MIPpi",scenario),
1863 Form("TPC_%s n#sigma MIPpi vs. eta;#eta; n#sigma",scenario),
1864 binsEta,etaMin,etaMax,
1866 sublist->Add(hNsigmaEtaMIPpi);
1868 // MIP pions: Nsigma vs. multiplicity
1869 TH2F *hNsigmaMultMIPpi = new TH2F(Form("hNsigmaMult_TPC_%s_MIPpi",scenario),
1870 Form("TPC_%s n#sigma MIPpi vs. mult;multiplicity; n#sigma",scenario),
1871 nBinsMult,xBinsMult,
1873 sublist->Add(hNsigmaMultMIPpi);
1875 // Electrons: Nsigma vs. eta
1876 TH2F *hNsigmaEtaEle = new TH2F(Form("hNsigmaEta_TPC_%s_Ele",scenario),
1877 Form("TPC_%s n#sigma electrons vs. eta;#eta; n#sigma",scenario),
1878 binsEta,etaMin,etaMax,
1880 sublist->Add(hNsigmaEtaEle);
1882 // Electrons: Nsigma vs. multiplicity
1883 TH2F *hNsigmaMultEle = new TH2F(Form("hNsigmaMult_TPC_%s_Ele",scenario),
1884 Form("TPC_%s n#sigma electrons vs. mult;multiplicity; n#sigma",scenario),
1885 nBinsMult,xBinsMult,
1887 sublist->Add(hNsigmaMultEle);
1888 } // - End: Adding histograms for MIP pions and electrons
1894 //______________________________________________________________________________
1895 void AliAnalysisTaskPIDqa::SetupTPCqa(Bool_t fillMC, Bool_t fill11h, Bool_t fillV0)
1898 // Create the TPC qa objects
1901 // Set up the multiplicity binning
1902 Int_t nBinsMult = 38;
1903 Double_t xBinsMult[39] = {0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100,
1904 120, 140, 160, 180, 200,
1905 300, 400, 500, 600, 700, 800, 900, 1000,
1906 1200, 1400, 1600, 1800, 2000,
1907 2200, 2400, 2600, 2800, 3000,
1908 3200, 3400, 3600, 3800, 4000
1912 // Create TPC sublists for different scenarios
1913 // corresponding to available information,
1914 // e.g. MC or not, special settings for LHC11h
1916 // basic/default scenario, used always
1917 fListQAtpcBasic=new TList;
1918 fListQAtpcBasic->SetOwner();
1919 fListQAtpcBasic->SetName("TPCBasic");
1920 fListQAtpc->Add(fListQAtpcBasic);
1922 // MC truth scenario: use only MC truth identified particles
1923 // only available for MC
1924 if (fillMC == kTRUE) {
1925 fListQAtpcMCtruth=new TList;
1926 fListQAtpcMCtruth->SetOwner();
1927 fListQAtpcMCtruth->SetName("TPCMCtruth");
1928 fListQAtpc->Add(fListQAtpcMCtruth);
1931 // Hybrid and OROChigh scenarios,
1932 // special settings only available for PbPb LHC11h data
1933 if (fill11h == kTRUE) {
1934 fListQAtpcHybrid=new TList;
1935 fListQAtpcHybrid->SetOwner();
1936 fListQAtpcHybrid->SetName("TPCHybrid");
1937 fListQAtpc->Add(fListQAtpcHybrid);
1939 fListQAtpcOROChigh=new TList;
1940 fListQAtpcOROChigh->SetOwner();
1941 fListQAtpcOROChigh->SetName("TPCOROChigh");
1942 fListQAtpc->Add(fListQAtpcOROChigh);
1945 // scenario only for V0s,
1946 // only available for ESDs
1947 if (fillV0 == kTRUE) {
1948 fListQAtpcV0=new TList;
1949 fListQAtpcV0->SetOwner();
1950 fListQAtpcV0->SetName("TPCV0");
1951 fListQAtpc->Add(fListQAtpcV0);
1955 // the default ("basic") scenario
1956 AddTPCHistogramsNsigma(fListQAtpcBasic,"Basic",0);
1957 AddTPCHistogramsSignal(fListQAtpcBasic,"Basic");
1959 // only MC truth identified particles
1961 AddTPCHistogramsNsigma(fListQAtpcMCtruth,"MCtruth",1);
1964 // the "hybrid" scenario (only for period LHC11h)
1966 AddTPCHistogramsNsigma(fListQAtpcHybrid,"Hybrid",2);
1969 // the "OROC high" scenario (only for period LHC11h)
1971 AddTPCHistogramsNsigma(fListQAtpcOROChigh,"OROChigh",3);
1976 AddTPCHistogramsNsigma(fListQAtpcV0,"V0",4);
1980 // Multiplicity distribution --- as check
1981 TH1F *hMult = new TH1F("hMult_TPC",
1982 "Multiplicity distribution;multiplicity;counts",
1983 nBinsMult,xBinsMult);
1984 fListQAtpc->Add(hMult);
1988 //______________________________________________________________________________
1989 void AliAnalysisTaskPIDqa::SetupTRDqa()
1992 // Create the TRD qa objects
1994 TVectorD *vX=MakeLogBinning(200,.1,30);
1995 for(Int_t itl = 0; itl < 6; ++itl){
1996 for(Int_t ispecie = 0; ispecie < AliPID::kSPECIES; ispecie++){
1997 TH2F *hLikeP = new TH2F(Form("hLikeP_TRD_%dtls_%s", itl, AliPID::ParticleName(ispecie)),
1998 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)),
1999 vX->GetNrows()-1, vX->GetMatrixArray(),
2001 fListQAtrd->Add(hLikeP);
2005 // === nSigma Values and signal ===
2006 for (Int_t ispecie=0; ispecie<AliPID::kSPECIESC; ++ispecie){
2007 TH2F *hNsigmaP = new TH2F(Form("hNsigmaP_TRD_%s",AliPID::ParticleName(ispecie)),
2008 Form("TRD n#sigma %s vs. p;p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
2009 vX->GetNrows()-1,vX->GetMatrixArray(),
2011 fListQAtrdNsig->Add(hNsigmaP);
2014 TH2F *hSig = new TH2F("hSigP_TRD",
2015 "TRD signal vs. p;p [GeV]; TRD signal [arb. units]",
2016 vX->GetNrows()-1,vX->GetMatrixArray(),
2018 fListQAtrdNsig->Add(hSig);
2020 fListQAtrd->Add(fListQAtrdNsig);
2022 // === Same after 3 sigma in TPC and TOF
2023 for (Int_t ispecie=0; ispecie<AliPID::kSPECIESC; ++ispecie){
2024 TH2F *hNsigmaP = new TH2F(Form("hNsigmaP_TRD_TPCTOF_%s",AliPID::ParticleName(ispecie)),
2025 Form("TRD n#sigma %s vs. p after 3#sigma cut in TPC&TOF;p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
2026 vX->GetNrows()-1,vX->GetMatrixArray(),
2028 fListQAtrdNsigTPCTOF->Add(hNsigmaP);
2031 fListQAtrd->Add(fListQAtrdNsigTPCTOF);
2036 //______________________________________________________________________________
2037 void AliAnalysisTaskPIDqa::SetupTOFqa()
2040 // Create the TOF qa objects
2043 TVectorD *vX=MakeLogBinning(200,.1,30);
2045 for (Int_t ispecie=0; ispecie<AliPID::kSPECIESC; ++ispecie){
2046 TH2F *hNsigmaP = new TH2F(Form("hNsigmaP_TOF_%s",AliPID::ParticleName(ispecie)),
2047 Form("TOF n#sigma %s vs. p;p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
2048 vX->GetNrows()-1,vX->GetMatrixArray(),
2050 fListQAtof->Add(hNsigmaP);
2053 TH1F *hnSigT0Fill = new TH1F("hNsigma_TOF_Pion_T0-Fill","TOF n#sigma (Pion) T0-FILL [0.75-1.25. GeV/c]",200,-10,10);
2054 fListQAtof->Add(hnSigT0Fill);
2055 TH1F *hnSigT0T0 = new TH1F("hNsigma_TOF_Pion_T0-T0","TOF n#sigma (Pion) T0-T0 [0.75-1.25 GeV/c]",200,-10,10);
2056 fListQAtof->Add(hnSigT0T0);
2057 TH1F *hnSigT0TOF = new TH1F("hNsigma_TOF_Pion_T0-TOF","TOF n#sigma (Pion) T0-TOF [0.75-1.25 GeV/c]",200,-10,10);
2058 fListQAtof->Add(hnSigT0TOF);
2059 TH1F *hnSigT0Best = new TH1F("hNsigma_TOF_Pion_T0-Best","TOF n#sigma (Pion) T0-Best [0.75-1.25 GeV/c]",200,-10,10);
2060 fListQAtof->Add(hnSigT0Best);
2061 TH1F *hnDeltaPi = new TH1F("hDelta_TOF_Pion","DeltaT (Pion) [0.75-1.25 GeV/c]",50,-500,500);
2062 fListQAtof->Add(hnDeltaPi);
2064 TH2F *hSig = new TH2F("hSigP_TOF",
2065 "TOF signal vs. p;p [GeV]; TOF signal [ns]",
2066 vX->GetNrows()-1,vX->GetMatrixArray(),
2071 fListQAtof->Add(hSig);
2073 TH1F *hStartTimeMaskTOF = new TH1F("hStartTimeMask_TOF","StartTime mask",8,0,8);
2074 fListQAtof->Add(hStartTimeMaskTOF);
2075 TH1F *hStartTimeResTOF = new TH1F("hStartTimeRes_TOF","StartTime resolution [ps]",100,0,500);
2076 fListQAtof->Add(hStartTimeResTOF);
2078 TH1F *hnTracksAtTOF = new TH1F("hnTracksAt_TOF","Matched tracks at TOF",100,0,100);
2079 fListQAtof->Add(hnTracksAtTOF);
2080 TH1F *hT0MakerEff = new TH1F("hT0MakerEff","Events with T0-TOF vs nTracks",100,0,100);
2081 fListQAtof->Add(hT0MakerEff);
2083 // this in principle should stay on a T0 PID QA, but are just the data prepared for TOF use
2084 TH1F *hStartTimeAT0 = new TH1F("hStartTimeA_T0","StartTime from T0A [ps]",1000,-1000,1000);
2085 fListQAtof->Add(hStartTimeAT0);
2086 TH1F *hStartTimeCT0 = new TH1F("hStartTimeC_T0","StartTime from T0C [ps]",1000,-1000,1000);
2087 fListQAtof->Add(hStartTimeCT0);
2088 TH1F *hStartTimeACT0 = new TH1F("hStartTimeAC_T0","StartTime from T0AC [ps]",1000,-1000,1000);;
2089 fListQAtof->Add(hStartTimeACT0);
2093 //______________________________________________________________________________
2094 void AliAnalysisTaskPIDqa::SetupT0qa()
2097 // Create the T0 qa objects
2100 // these are similar to plots inside TOFqa, but these are for all events
2101 TH1F *hStartTimeAT0 = new TH1F("hStartTimeA_T0","StartTime from T0A [ps]",1000,-1000,1000);
2102 fListQAt0->Add(hStartTimeAT0);
2103 TH1F *hStartTimeCT0 = new TH1F("hStartTimeC_T0","StartTime from T0C [ps]",1000,-1000,1000);
2104 fListQAt0->Add(hStartTimeCT0);
2105 TH1F *hStartTimeACT0 = new TH1F("hStartTimeAC_T0","StartTime from T0AC [ps]",1000,-1000,1000);;
2106 fListQAt0->Add(hStartTimeACT0);
2108 TH1F *hnTracksAtT0 = new TH1F("hnTracksAt_T0","Tracks for events selected for T0",100,0,100);
2109 fListQAt0->Add(hnTracksAtT0);
2110 TH1F *hT0AEff = new TH1F("hT0AEff","Events with T0A vs nTracks",100,0,100);
2111 fListQAt0->Add(hT0AEff);
2112 TH1F *hT0CEff = new TH1F("hT0CEff","Events with T0C vs nTracks",100,0,100);
2113 fListQAt0->Add(hT0CEff);
2114 TH1F *hT0AndEff = new TH1F("hT0AndEff","Events with T0AC (AND) vs nTracks",100,0,100);
2115 fListQAt0->Add(hT0AndEff);
2116 TH1F *hT0OrEff = new TH1F("hT0OrEff","Events with T0AC (OR) vs nTracks",100,0,100);
2117 fListQAt0->Add(hT0OrEff);
2122 //______________________________________________________________________________
2123 void AliAnalysisTaskPIDqa::SetupEMCALqa()
2126 // Create the EMCAL qa objects
2129 TVectorD *vX=MakeLogBinning(200,.1,30);
2131 TH2F *hNsigmaPt = new TH2F(Form("hNsigmaPt_EMCAL_%s",AliPID::ParticleName(0)),
2132 Form("EMCAL n#sigma %s vs. p_{T};p_{T} [GeV]; n#sigma",AliPID::ParticleName(0)),
2133 vX->GetNrows()-1,vX->GetMatrixArray(),
2135 fListQAemcal->Add(hNsigmaPt);
2138 TH2F *hSigPtEle = new TH2F("hSigPt_EMCAL_Ele",
2139 "EMCAL signal (E/p) vs. p_{T} for electrons;p_{T} [GeV]; EMCAL signal (E/p) [arb. units]",
2140 vX->GetNrows()-1,vX->GetMatrixArray(),
2142 fListQAemcal->Add(hSigPtEle);
2144 TH2F *hSigPtPions = new TH2F("hSigPt_EMCAL_Pions",
2145 "EMCAL signal (E/p) vs. p_{T} for pions;p_{T} [GeV]; EMCAL signal (E/p) [arb. units]",
2146 vX->GetNrows()-1,vX->GetMatrixArray(),
2148 fListQAemcal->Add(hSigPtPions);
2150 TH2F *hSigPtProtons = new TH2F("hSigPt_EMCAL_Protons",
2151 "EMCAL signal (E/p) vs. p_{T} for protons;p_{T} [GeV]; EMCAL signal (E/p) [arb. units]",
2152 vX->GetNrows()-1,vX->GetMatrixArray(),
2154 fListQAemcal->Add(hSigPtProtons);
2156 TH2F *hSigPtAntiProtons = new TH2F("hSigPt_EMCAL_Antiprotons",
2157 "EMCAL signal (E/p) vs. p_{T} for antiprotons;p_{T} [GeV]; EMCAL signal (E/p) [arb. units]",
2158 vX->GetNrows()-1,vX->GetMatrixArray(),
2160 fListQAemcal->Add(hSigPtAntiProtons);
2165 //______________________________________________________________________________
2166 void AliAnalysisTaskPIDqa::SetupHMPIDqa()
2169 // Create the HMPID qa objects
2172 TVectorD *vX=MakeLogBinning(200,.1,30);
2176 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
2177 if (ispecie==AliPID::kElectron || ispecie==AliPID::kMuon) continue;
2178 TH2F *hNsigmaP = new TH2F(Form("hNsigmaP_HMPID_%s",AliPID::ParticleName(ispecie)),
2179 Form("HMPID n#sigma %s vs. p;p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
2180 vX->GetNrows()-1,vX->GetMatrixArray(),
2182 fListQAhmpid->AddAt(hNsigmaP, nhists);
2187 TH2F *hCkovAnglevsMom = new TH2F("hCkovAnglevsMom", "Cherenkov angle vs momentum",
2188 vX->GetNrows()-1,vX->GetMatrixArray(),
2190 fListQAhmpid->AddAt(hCkovAnglevsMom,nhists);
2195 //______________________________________________________________________________
2196 void AliAnalysisTaskPIDqa::SetupTOFHMPIDqa()
2199 // Create the HMPID qa objects
2202 TH2F *hCkovAnglevsMomPion = new TH2F("hCkovAnglevsMom_pion", "Cherenkov angle vs momentum for pions",500,0,5.,500,0,1);
2203 fListQAtofhmpid->Add(hCkovAnglevsMomPion);
2205 TH2F *hCkovAnglevsMomKaon = new TH2F("hCkovAnglevsMom_kaon", "Cherenkov angle vs momentum for kaons",500,0,5.,500,0,1);
2206 fListQAtofhmpid->Add(hCkovAnglevsMomKaon);
2208 TH2F *hCkovAnglevsMomProton = new TH2F("hCkovAnglevsMom_proton","Cherenkov angle vs momentum for protons",500,0,5.,500,0,1);
2209 fListQAtofhmpid->Add(hCkovAnglevsMomProton);
2214 //______________________________________________________________________________
2215 void AliAnalysisTaskPIDqa::SetupTPCTOFqa()
2218 // Create the qa objects for TPC + TOF combination
2221 TVectorD *vX=MakeLogBinning(200,.1,30);
2223 //TPC signals after TOF cut
2224 for (Int_t ispecie=0; ispecie<AliPID::kSPECIESC; ++ispecie){
2225 TH2F *hNsigmaP = new TH2F(Form("hNsigmaP_TPC_TOF_%s",AliPID::ParticleName(ispecie)),
2226 Form("TPC n#sigma %s vs. p (after TOF 3#sigma cut);p_{TPC} [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
2227 vX->GetNrows()-1,vX->GetMatrixArray(),
2229 fListQAtpctof->Add(hNsigmaP);
2232 //TOF signals after TPC cut
2233 for (Int_t ispecie=0; ispecie<AliPID::kSPECIESC; ++ispecie){
2234 TH2F *hNsigmaP = new TH2F(Form("hNsigmaP_TOF_TPC_%s",AliPID::ParticleName(ispecie)),
2235 Form("TOF n#sigma %s vs. p (after TPC n#sigma cut);p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
2236 vX->GetNrows()-1,vX->GetMatrixArray(),
2238 fListQAtpctof->Add(hNsigmaP);
2241 //EMCAL signal after TOF and TPC cut
2242 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
2243 TH2F *heopPt = new TH2F(Form("heopPt_TOF_TPC_%s",AliPID::ParticleName(ispecie)),
2244 Form("EMCAL signal (E/p) %s vs. p_{T};p_{T} [GeV]; EMCAL signal (E/p) [arb. units]",AliPID::ParticleName(ispecie)),
2245 vX->GetNrows()-1,vX->GetMatrixArray(),
2247 fListQAtpctof->Add(heopPt);
2252 //______________________________________________________________________________
2253 void AliAnalysisTaskPIDqa::SetupV0qa()
2256 // Create the qa objects for V0 Kine cuts
2259 TH2F *hArmenteros = new TH2F("hArmenteros", "Armenteros plot",200,-1.,1.,200,0.,0.4);
2260 fListQAV0->Add(hArmenteros);
2264 //_____________________________________________________________________________
2265 void AliAnalysisTaskPIDqa::SetupQAinfo(){
2267 // Setup the info of QA objects
2270 TObjArray *arr=new TObjArray;
2271 arr->SetName("TPC_info");
2272 fListQAinfo->Add(arr);
2275 //______________________________________________________________________________
2276 TVectorD* AliAnalysisTaskPIDqa::MakeLogBinning(Int_t nbinsX, Double_t xmin, Double_t xmax)
2279 // Make logarithmic binning
2280 // the user has to delete the array afterwards!!!
2284 if (xmin<1e-20 || xmax<1e-20){
2285 AliError("For Log binning xmin and xmax must be > 1e-20. Using linear binning instead!");
2286 return MakeLinBinning(nbinsX, xmin, xmax);
2293 TVectorD *binLim=new TVectorD(nbinsX+1);
2294 Double_t first=xmin;
2296 Double_t expMax=TMath::Log(last/first);
2297 for (Int_t i=0; i<nbinsX+1; ++i){
2298 (*binLim)[i]=first*TMath::Exp(expMax/nbinsX*(Double_t)i);
2303 //______________________________________________________________________________
2304 TVectorD* AliAnalysisTaskPIDqa::MakeLinBinning(Int_t nbinsX, Double_t xmin, Double_t xmax)
2307 // Make linear binning
2308 // the user has to delete the array afterwards!!!
2315 TVectorD *binLim=new TVectorD(nbinsX+1);
2316 Double_t first=xmin;
2318 Double_t binWidth=(last-first)/nbinsX;
2319 for (Int_t i=0; i<nbinsX+1; ++i){
2320 (*binLim)[i]=first+binWidth*(Double_t)i;
2325 //_____________________________________________________________________________
2326 TVectorD* AliAnalysisTaskPIDqa::MakeArbitraryBinning(const char* bins)
2329 // Make arbitrary binning, bins separated by a ','
2331 TString limits(bins);
2332 if (limits.IsNull()){
2333 AliError("Bin Limit string is empty, cannot add the variable");
2337 TObjArray *arr=limits.Tokenize(",");
2338 Int_t nLimits=arr->GetEntries();
2340 AliError("Need at leas 2 bin limits, cannot add the variable");
2345 TVectorD *binLimits=new TVectorD(nLimits);
2346 for (Int_t iLim=0; iLim<nLimits; ++iLim){
2347 (*binLimits)[iLim]=(static_cast<TObjString*>(arr->At(iLim)))->GetString().Atof();