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 "AliAnalysisTaskPIDqa.h"
44 ClassImp(AliAnalysisTaskPIDqa)
46 //______________________________________________________________________________
47 AliAnalysisTaskPIDqa::AliAnalysisTaskPIDqa():
61 //______________________________________________________________________________
62 AliAnalysisTaskPIDqa::AliAnalysisTaskPIDqa(const char* name):
63 AliAnalysisTaskSE(name),
72 // Default constructor
74 DefineInput(0,TChain::Class());
75 DefineOutput(1,TList::Class());
78 //______________________________________________________________________________
79 AliAnalysisTaskPIDqa::~AliAnalysisTaskPIDqa()
87 //______________________________________________________________________________
88 void AliAnalysisTaskPIDqa::UserCreateOutputObjects()
91 // Create the output QA objects
94 AliLog::SetClassDebugLevel("AliAnalysisTaskPIDqa",10);
97 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
98 AliInputEventHandler *inputHandler=dynamic_cast<AliInputEventHandler*>(man->GetInputEventHandler());
99 if (!inputHandler) AliFatal("Input handler needed");
101 //pid response object
102 fPIDResponse=inputHandler->GetPIDResponse();
103 if (!fPIDResponse) AliError("PIDResponse object was not created");
109 fListQAits=new TList;
110 fListQAits->SetOwner();
111 fListQAits->SetName("ITS");
113 fListQAtpc=new TList;
114 fListQAtpc->SetOwner();
115 fListQAtpc->SetName("TPC");
117 fListQAtrd=new TList;
118 fListQAtrd->SetOwner();
119 fListQAtrd->SetName("TRD");
121 fListQAtof=new TList;
122 fListQAtof->SetOwner();
123 fListQAtof->SetName("TOF");
125 fListQA->Add(fListQAits);
126 fListQA->Add(fListQAtpc);
127 fListQA->Add(fListQAtrd);
128 fListQA->Add(fListQAtof);
139 //______________________________________________________________________________
140 void AliAnalysisTaskPIDqa::UserExec(Option_t */*option*/)
143 // Setup the PID response functions and fill the QA histograms
146 AliVEvent *event=InputEvent();
147 if (!event||!fPIDResponse) return;
157 //______________________________________________________________________________
158 void AliAnalysisTaskPIDqa::FillITSqa()
160 AliVEvent *event=InputEvent();
162 Int_t ntracks=event->GetNumberOfTracks();
163 for(Int_t itrack = 0; itrack < ntracks; itrack++){
164 AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
165 ULong_t status=track->GetStatus();
166 // not that nice. status bits not in virtual interface
167 // ITS refit + ITS pid
168 if (!( ( (status & AliVTrack::kITSrefit)==AliVTrack::kITSrefit ) &&
169 ( (status & AliVTrack::kITSpid )==AliVTrack::kITSpid ) )) continue;
170 Double_t mom=track->P();
172 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
173 TH2 *h=(TH2*)fListQAits->At(ispecie);
175 Double_t nSigma=fPIDResponse->NumberOfSigmasITS(track, (AliPID::EParticleType)ispecie);
179 TH2 *h=(TH2*)fListQAits->At(AliPID::kSPECIES);
181 Double_t sig=track->GetITSsignal();
188 //______________________________________________________________________________
189 void AliAnalysisTaskPIDqa::FillTPCqa()
191 AliVEvent *event=InputEvent();
193 Int_t ntracks=event->GetNumberOfTracks();
194 for(Int_t itrack = 0; itrack < ntracks; itrack++){
195 AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
200 ULong_t status=track->GetStatus();
201 // not that nice. status bits not in virtual interface
202 // TPC refit + ITS refit + TPC pid
203 if (!( (status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
204 !( (status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ||
205 !( (status & AliVTrack::kTPCpid ) == AliVTrack::kTPCpid ) ) continue;
207 Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
208 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
209 if (track->GetTPCNclsF()>0) {
210 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
213 if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
215 Double_t mom=track->GetTPCmomentum();
217 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
218 TH2 *h=(TH2*)fListQAtpc->At(ispecie);
220 Double_t nSigma=fPIDResponse->NumberOfSigmasTPC(track, (AliPID::EParticleType)ispecie);
224 TH2 *h=(TH2*)fListQAtpc->At(AliPID::kSPECIES);
226 Double_t sig=track->GetTPCsignal();
232 //______________________________________________________________________________
233 void AliAnalysisTaskPIDqa::FillTOFqa()
235 AliVEvent *event=InputEvent();
237 Int_t ntracks=event->GetNumberOfTracks();
238 for(Int_t itrack = 0; itrack < ntracks; itrack++){
239 AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
244 ULong_t status=track->GetStatus();
245 // not that nice. status bits not in virtual interface
246 // TPC refit + ITS refit +
247 // TOF out + TOFpid +
249 if (!((status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
250 !((status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ||
251 !((status & AliVTrack::kTOFout ) == AliVTrack::kTOFout ) ||
252 !((status & AliVTrack::kTOFpid ) == AliVTrack::kTOFpid ) ||
253 !((status & AliVTrack::kTIME ) == AliVTrack::kTIME ) ) continue;
255 Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
256 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
257 if (track->GetTPCNclsF()>0) {
258 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
261 if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
264 Double_t mom=track->P();
266 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
267 TH2 *h=(TH2*)fListQAtof->At(ispecie);
269 Double_t nSigma=fPIDResponse->NumberOfSigmasTOF(track, (AliPID::EParticleType)ispecie);
273 TH2 *h=(TH2*)fListQAtof->At(AliPID::kSPECIES);
275 Double_t sig=track->GetTOFsignal();
282 //______________________________________________________________________________
283 void AliAnalysisTaskPIDqa::SetupITSqa()
286 // Create the ITS qa objects
289 TVectorD *vX=MakeLogBinning(200,.1,30);
291 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
292 TH2F *hNsigmaP = new TH2F(Form("hNsigmaP_ITS_%s",AliPID::ParticleName(ispecie)),
293 Form("ITS n#sigma %s vs. p;p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
294 vX->GetNrows()-1,vX->GetMatrixArray(),
296 fListQAits->Add(hNsigmaP);
300 TH2F *hSig = new TH2F("hSigP_ITS",
301 "ITS signal vs. p;p [GeV]; ITS signal [arb. units]",
302 vX->GetNrows()-1,vX->GetMatrixArray(),
305 fListQAits->Add(hSig);
309 //______________________________________________________________________________
310 void AliAnalysisTaskPIDqa::SetupTPCqa()
313 // Create the TPC qa objects
316 TVectorD *vX=MakeLogBinning(200,.1,30);
318 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
319 TH2F *hNsigmaP = new TH2F(Form("hNsigmaP_TPC_%s",AliPID::ParticleName(ispecie)),
320 Form("TPC n#sigma %s vs. p;p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
321 vX->GetNrows()-1,vX->GetMatrixArray(),
323 fListQAtpc->Add(hNsigmaP);
327 TH2F *hSig = new TH2F("hSigP_TPC",
328 "TPC signal vs. p;p [GeV]; TPC signal [arb. units]",
329 vX->GetNrows()-1,vX->GetMatrixArray(),
332 fListQAtpc->Add(hSig);
336 //______________________________________________________________________________
337 void AliAnalysisTaskPIDqa::SetupTRDqa()
340 // Create the TRD qa objects
345 //______________________________________________________________________________
346 void AliAnalysisTaskPIDqa::SetupTOFqa()
349 // Create the TOF qa objects
352 TVectorD *vX=MakeLogBinning(200,.1,30);
354 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
355 TH2F *hNsigmaP = new TH2F(Form("hNsigmaP_TOF_%s",AliPID::ParticleName(ispecie)),
356 Form("TOF n#sigma %s vs. p;p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
357 vX->GetNrows()-1,vX->GetMatrixArray(),
359 fListQAtof->Add(hNsigmaP);
363 TH2F *hSig = new TH2F("hSigP_TOF",
364 "TOF signal vs. p;p [GeV]; TOF signal [arb. units]",
365 vX->GetNrows()-1,vX->GetMatrixArray(),
368 fListQAtof->Add(hSig);
372 //______________________________________________________________________________
373 TVectorD* AliAnalysisTaskPIDqa::MakeLogBinning(Int_t nbinsX, Double_t xmin, Double_t xmax)
376 // Make logarithmic binning
377 // the user has to delete the array afterwards!!!
381 if (xmin<1e-20 || xmax<1e-20){
382 AliError("For Log binning xmin and xmax must be > 1e-20. Using linear binning instead!");
383 return MakeLinBinning(nbinsX, xmin, xmax);
390 TVectorD *binLim=new TVectorD(nbinsX+1);
393 Double_t expMax=TMath::Log(last/first);
394 for (Int_t i=0; i<nbinsX+1; ++i){
395 (*binLim)[i]=first*TMath::Exp(expMax/nbinsX*(Double_t)i);
400 //______________________________________________________________________________
401 TVectorD* AliAnalysisTaskPIDqa::MakeLinBinning(Int_t nbinsX, Double_t xmin, Double_t xmax)
404 // Make linear binning
405 // the user has to delete the array afterwards!!!
412 TVectorD *binLim=new TVectorD(nbinsX+1);
415 Double_t binWidth=(last-first)/nbinsX;
416 for (Int_t i=0; i<nbinsX+1; ++i){
417 (*binLim)[i]=first+binWidth*(Double_t)i;
422 //_____________________________________________________________________________
423 TVectorD* AliAnalysisTaskPIDqa::MakeArbitraryBinning(const char* bins)
426 // Make arbitrary binning, bins separated by a ','
428 TString limits(bins);
429 if (limits.IsNull()){
430 AliError("Bin Limit string is empty, cannot add the variable");
434 TObjArray *arr=limits.Tokenize(",");
435 Int_t nLimits=arr->GetEntries();
437 AliError("Need at leas 2 bin limits, cannot add the variable");
442 TVectorD *binLimits=new TVectorD(nLimits);
443 for (Int_t iLim=0; iLim<nLimits; ++iLim){
444 (*binLimits)[iLim]=(static_cast<TObjString*>(arr->At(iLim)))->GetString().Atof();