1 /**************************************************************************
\r
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
\r
4 * Author: The ALICE Off-line Project. *
\r
5 * Contributors are mentioned in the code where appropriate. *
\r
7 * Permission to use, copy, modify and distribute this software and its *
\r
8 * documentation strictly for non-commercial purposes is hereby granted *
\r
9 * without fee, provided that the above copyright notice appears in all *
\r
10 * copies and that both the copyright notice and this permission notice *
\r
11 * appear in the supporting documentation. The authors make no claims *
\r
12 * about the suitability of this software for any purpose. It is *
\r
13 * provided "as is" without express or implied warranty. *
\r
14 **************************************************************************/
\r
16 /* $Id: AliAnalysisTaskPIDqa.cxx 43811 2010-09-23 14:13:31Z wiechula $ */
\r
18 #include <TVectorD.h>
\r
19 #include <TObjArray.h>
\r
22 #include <TPRegexp.h>
\r
25 #include <TSpline.h>
\r
27 #include <AliAnalysisManager.h>
\r
28 #include <AliInputEventHandler.h>
\r
29 #include <AliVEventHandler.h>
\r
30 #include <AliVEvent.h>
\r
31 #include <AliVParticle.h>
\r
32 #include <AliVTrack.h>
\r
35 #include <AliPIDResponse.h>
\r
36 #include <AliITSPIDResponse.h>
\r
37 #include <AliTPCPIDResponse.h>
\r
38 #include <AliTRDPIDResponse.h>
\r
39 #include <AliTOFPIDResponse.h>
\r
41 #include "AliAnalysisTaskPIDqa.h"
\r
44 ClassImp(AliAnalysisTaskPIDqa)
\r
46 //______________________________________________________________________________
\r
47 AliAnalysisTaskPIDqa::AliAnalysisTaskPIDqa():
\r
48 AliAnalysisTaskSE(),
\r
53 fListQAitsPureSA(0x0),
\r
61 // Dummy constructor
\r
65 //______________________________________________________________________________
\r
66 AliAnalysisTaskPIDqa::AliAnalysisTaskPIDqa(const char* name):
\r
67 AliAnalysisTaskSE(name),
\r
72 fListQAitsPureSA(0x0),
\r
80 // Default constructor
\r
82 DefineInput(0,TChain::Class());
\r
83 DefineOutput(1,TList::Class());
\r
86 //______________________________________________________________________________
\r
87 AliAnalysisTaskPIDqa::~AliAnalysisTaskPIDqa()
\r
95 //______________________________________________________________________________
\r
96 void AliAnalysisTaskPIDqa::UserCreateOutputObjects()
\r
99 // Create the output QA objects
\r
102 AliLog::SetClassDebugLevel("AliAnalysisTaskPIDqa",10);
\r
105 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
\r
106 AliInputEventHandler *inputHandler=dynamic_cast<AliInputEventHandler*>(man->GetInputEventHandler());
\r
107 if (!inputHandler) AliFatal("Input handler needed");
\r
109 //pid response object
\r
110 fPIDResponse=inputHandler->GetPIDResponse();
\r
111 if (!fPIDResponse) AliError("PIDResponse object was not created");
\r
115 fListQA->SetOwner();
\r
117 fListQAits=new TList;
\r
118 fListQAits->SetOwner();
\r
119 fListQAits->SetName("ITS");
\r
121 fListQAitsSA=new TList;
\r
122 fListQAitsSA->SetOwner();
\r
123 fListQAitsSA->SetName("ITS");
\r
125 fListQAitsPureSA=new TList;
\r
126 fListQAitsPureSA->SetOwner();
\r
127 fListQAitsPureSA->SetName("ITS");
\r
129 fListQAtpc=new TList;
\r
130 fListQAtpc->SetOwner();
\r
131 fListQAtpc->SetName("TPC");
\r
133 fListQAtrd=new TList;
\r
134 fListQAtrd->SetOwner();
\r
135 fListQAtrd->SetName("TRD");
\r
137 fListQAtof=new TList;
\r
138 fListQAtof->SetOwner();
\r
139 fListQAtof->SetName("TOF");
\r
141 fListQAemcal=new TList;
\r
142 fListQAemcal->SetOwner();
\r
143 fListQAemcal->SetName("EMCAL");
\r
145 fListQAtpctof=new TList;
\r
146 fListQAtpctof->SetOwner();
\r
147 fListQAtpctof->SetName("TPC_TOF");
\r
149 fListQA->Add(fListQAits);
\r
150 fListQA->Add(fListQAitsSA);
\r
151 fListQA->Add(fListQAitsPureSA);
\r
152 fListQA->Add(fListQAtpc);
\r
153 fListQA->Add(fListQAtrd);
\r
154 fListQA->Add(fListQAtof);
\r
155 fListQA->Add(fListQAemcal);
\r
156 fListQA->Add(fListQAtpctof);
\r
165 PostData(1,fListQA);
\r
169 //______________________________________________________________________________
\r
170 void AliAnalysisTaskPIDqa::UserExec(Option_t */*option*/)
\r
173 // Setup the PID response functions and fill the QA histograms
\r
176 AliVEvent *event=InputEvent();
\r
177 if (!event||!fPIDResponse) return;
\r
187 PostData(1,fListQA);
\r
190 //______________________________________________________________________________
\r
191 void AliAnalysisTaskPIDqa::FillITSqa()
\r
194 // Fill PID qa histograms for the ITS
\r
197 AliVEvent *event=InputEvent();
\r
199 Int_t ntracks=event->GetNumberOfTracks();
\r
200 for(Int_t itrack = 0; itrack < ntracks; itrack++){
\r
201 AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
\r
202 ULong_t status=track->GetStatus();
\r
203 // not that nice. status bits not in virtual interface
\r
204 // ITS refit + ITS pid
\r
205 if (!( ( (status & AliVTrack::kITSrefit)==AliVTrack::kITSrefit ) &&
\r
206 ( (status & AliVTrack::kITSpid )==AliVTrack::kITSpid ) )) continue;
\r
207 Double_t mom=track->P();
\r
209 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
\r
210 TH2 *h=(TH2*)fListQAits->At(ispecie);
\r
212 Double_t nSigma=fPIDResponse->NumberOfSigmasITS(track, (AliPID::EParticleType)ispecie);
\r
213 h->Fill(mom,nSigma);
\r
216 TH2 *h=(TH2*)fListQAits->At(AliPID::kSPECIES);
\r
218 Double_t sig=track->GetITSsignal();
\r
225 //______________________________________________________________________________
\r
226 void AliAnalysisTaskPIDqa::FillTPCqa()
\r
229 // Fill PID qa histograms for the TPC
\r
232 AliVEvent *event=InputEvent();
\r
234 Int_t ntracks=event->GetNumberOfTracks();
\r
235 for(Int_t itrack = 0; itrack < ntracks; itrack++){
\r
236 AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
\r
241 ULong_t status=track->GetStatus();
\r
242 // not that nice. status bits not in virtual interface
\r
243 // TPC refit + ITS refit + TPC pid
\r
244 if (!( (status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
\r
245 !( (status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ||
\r
246 !( (status & AliVTrack::kTPCpid ) == AliVTrack::kTPCpid ) ) continue;
\r
248 Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
\r
249 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
\r
250 if (track->GetTPCNclsF()>0) {
\r
251 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
\r
254 if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
\r
256 Double_t mom=track->GetTPCmomentum();
\r
258 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
\r
259 TH2 *h=(TH2*)fListQAtpc->At(ispecie);
\r
261 Double_t nSigma=fPIDResponse->NumberOfSigmasTPC(track, (AliPID::EParticleType)ispecie);
\r
262 h->Fill(mom,nSigma);
\r
265 TH2 *h=(TH2*)fListQAtpc->At(AliPID::kSPECIES);
\r
267 Double_t sig=track->GetTPCsignal();
\r
273 //______________________________________________________________________________
\r
274 void AliAnalysisTaskPIDqa::FillTRDqa()
\r
277 // Fill PID qa histograms for the TRD
\r
282 //______________________________________________________________________________
\r
283 void AliAnalysisTaskPIDqa::FillTOFqa()
\r
286 // Fill PID qa histograms for the TOF
\r
289 AliVEvent *event=InputEvent();
\r
291 Int_t ntracks=event->GetNumberOfTracks();
\r
292 for(Int_t itrack = 0; itrack < ntracks; itrack++){
\r
293 AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
\r
298 ULong_t status=track->GetStatus();
\r
299 // not that nice. status bits not in virtual interface
\r
300 // TPC refit + ITS refit +
\r
301 // TOF out + TOFpid +
\r
303 if (!((status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
\r
304 !((status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ||
\r
305 !((status & AliVTrack::kTOFout ) == AliVTrack::kTOFout ) ||
\r
306 !((status & AliVTrack::kTOFpid ) == AliVTrack::kTOFpid ) ||
\r
307 !((status & AliVTrack::kTIME ) == AliVTrack::kTIME ) ) continue;
\r
309 Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
\r
310 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
\r
311 if (track->GetTPCNclsF()>0) {
\r
312 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
\r
315 if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
\r
318 Double_t mom=track->P();
\r
320 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
\r
322 TH2 *h=(TH2*)fListQAtof->At(ispecie);
\r
324 Double_t nSigma=fPIDResponse->NumberOfSigmasTOF(track, (AliPID::EParticleType)ispecie);
\r
325 h->Fill(mom,nSigma);
\r
328 TH2 *h=(TH2*)fListQAtof->At(AliPID::kSPECIES);
\r
330 Double_t sig=track->GetTOFsignal();
\r
337 //______________________________________________________________________________
\r
338 void AliAnalysisTaskPIDqa::FillEMCALqa()
\r
341 // Fill PID qa histograms for the EMCAL
\r
344 AliVEvent *event=InputEvent();
\r
346 Int_t ntracks=event->GetNumberOfTracks();
\r
347 for(Int_t itrack = 0; itrack < ntracks; itrack++){
\r
348 AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
\r
353 ULong_t status=track->GetStatus();
\r
354 // not that nice. status bits not in virtual interface
\r
355 // TPC refit + ITS refit +
\r
356 // TOF out + TOFpid +
\r
358 if (!( (status & AliVTrack::kEMCALmatch) == AliVTrack::kEMCALmatch) ) continue;
\r
360 Double_t pt=track->Pt();
\r
362 //EMCAL nSigma (only for electrons at the moment)
\r
363 TH2 *h=(TH2*)fListQAemcal->At(0);
\r
365 Double_t nSigma=fPIDResponse->NumberOfSigmasEMCAL(track, (AliPID::EParticleType)0);
\r
366 h->Fill(pt,nSigma);
\r
368 //EMCAL signal (E/p vs. pT)
\r
369 h=(TH2*)fListQAemcal->At(1);
\r
372 Int_t nMatchClus = track->GetEMCALcluster();
\r
373 Double_t mom = track->P();
\r
374 Double_t eop = -1.;
\r
376 if(nMatchClus > -1){
\r
378 AliVCluster *matchedClus = (AliVCluster*)event->GetCaloCluster(nMatchClus);
\r
382 // matched cluster is EMCAL
\r
383 if(matchedClus->IsEMCAL()){
\r
385 Double_t fClsE = matchedClus->E();
\r
394 Printf("status status = AliVTrack::kEMCALmatch, BUT no matched cluster!");
\r
400 //______________________________________________________________________________
\r
401 void AliAnalysisTaskPIDqa::FillTPCTOFqa()
\r
404 // Fill PID qa histograms for the TOF
\r
405 // Here also the TPC histograms after TOF selection are filled
\r
408 AliVEvent *event=InputEvent();
\r
410 Int_t ntracks=event->GetNumberOfTracks();
\r
411 for(Int_t itrack = 0; itrack < ntracks; itrack++){
\r
412 AliVTrack *track=(AliVTrack*)event->GetTrack(itrack);
\r
417 ULong_t status=track->GetStatus();
\r
418 // not that nice. status bits not in virtual interface
\r
419 // TPC refit + ITS refit +
\r
420 // TOF out + TOFpid +
\r
422 if (!((status & AliVTrack::kTPCrefit) == AliVTrack::kTPCrefit) ||
\r
423 !((status & AliVTrack::kITSrefit) == AliVTrack::kITSrefit) ||
\r
424 !( (status & AliVTrack::kTPCpid ) == AliVTrack::kTPCpid ) ||
\r
425 !((status & AliVTrack::kTOFout ) == AliVTrack::kTOFout ) ||
\r
426 !((status & AliVTrack::kTOFpid ) == AliVTrack::kTOFpid ) ||
\r
427 !((status & AliVTrack::kTIME ) == AliVTrack::kTIME ) ) continue;
\r
429 Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
\r
430 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
\r
431 if (track->GetTPCNclsF()>0) {
\r
432 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC/track->GetTPCNclsF();
\r
435 if ( nCrossedRowsTPC<70 || ratioCrossedRowsOverFindableClustersTPC<.8 ) continue;
\r
438 Double_t mom=track->P();
\r
439 Double_t momTPC=track->GetTPCmomentum();
\r
441 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
\r
443 Double_t nSigmaTOF=fPIDResponse->NumberOfSigmasTOF(track, (AliPID::EParticleType)ispecie);
\r
444 Double_t nSigmaTPC=fPIDResponse->NumberOfSigmasTPC(track, (AliPID::EParticleType)ispecie);
\r
446 //TPC after TOF cut
\r
447 TH2 *h=(TH2*)fListQAtpctof->At(ispecie);
\r
448 if (h && TMath::Abs(nSigmaTOF)<3.) h->Fill(momTPC,nSigmaTPC);
\r
450 //TOF after TPC cut
\r
451 h=(TH2*)fListQAtpctof->At(ispecie+AliPID::kSPECIES);
\r
452 if (h && TMath::Abs(nSigmaTPC)<3.) h->Fill(mom,nSigmaTOF);
\r
454 //EMCAL after TOF and TPC cut
\r
455 h=(TH2*)fListQAtpctof->At(ispecie+2*AliPID::kSPECIES);
\r
456 if (h && TMath::Abs(nSigmaTOF)<3. && TMath::Abs(nSigmaTPC)<3. ){
\r
458 Int_t nMatchClus = track->GetEMCALcluster();
\r
459 Double_t pt = track->Pt();
\r
460 Double_t eop = -1.;
\r
462 if(nMatchClus > -1){
\r
464 AliVCluster *matchedClus = (AliVCluster*)event->GetCaloCluster(nMatchClus);
\r
468 // matched cluster is EMCAL
\r
469 if(matchedClus->IsEMCAL()){
\r
471 Double_t fClsE = matchedClus->E();
\r
485 //______________________________________________________________________________
\r
486 void AliAnalysisTaskPIDqa::SetupITSqa()
\r
489 // Create the ITS qa objects
\r
492 TVectorD *vX=MakeLogBinning(200,.1,30);
\r
494 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
\r
495 TH2F *hNsigmaP = new TH2F(Form("hNsigmaP_ITS_%s",AliPID::ParticleName(ispecie)),
\r
496 Form("ITS n#sigma %s vs. p;p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
\r
497 vX->GetNrows()-1,vX->GetMatrixArray(),
\r
499 fListQAits->Add(hNsigmaP);
\r
503 TH2F *hSig = new TH2F("hSigP_ITS",
\r
504 "ITS signal vs. p;p [GeV]; ITS signal [arb. units]",
\r
505 vX->GetNrows()-1,vX->GetMatrixArray(),
\r
507 fListQAits->Add(hSig);
\r
512 //______________________________________________________________________________
\r
513 void AliAnalysisTaskPIDqa::SetupTPCqa()
\r
516 // Create the TPC qa objects
\r
519 TVectorD *vX=MakeLogBinning(200,.1,30);
\r
521 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
\r
522 TH2F *hNsigmaP = new TH2F(Form("hNsigmaP_TPC_%s",AliPID::ParticleName(ispecie)),
\r
523 Form("TPC n#sigma %s vs. p;p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
\r
524 vX->GetNrows()-1,vX->GetMatrixArray(),
\r
526 fListQAtpc->Add(hNsigmaP);
\r
530 TH2F *hSig = new TH2F("hSigP_TPC",
\r
531 "TPC signal vs. p;p [GeV]; TPC signal [arb. units]",
\r
532 vX->GetNrows()-1,vX->GetMatrixArray(),
\r
534 fListQAtpc->Add(hSig);
\r
539 //______________________________________________________________________________
\r
540 void AliAnalysisTaskPIDqa::SetupTRDqa()
\r
543 // Create the TRD qa objects
\r
548 //______________________________________________________________________________
\r
549 void AliAnalysisTaskPIDqa::SetupTOFqa()
\r
552 // Create the TOF qa objects
\r
555 TVectorD *vX=MakeLogBinning(200,.1,30);
\r
557 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
\r
558 TH2F *hNsigmaP = new TH2F(Form("hNsigmaP_TOF_%s",AliPID::ParticleName(ispecie)),
\r
559 Form("TOF n#sigma %s vs. p;p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
\r
560 vX->GetNrows()-1,vX->GetMatrixArray(),
\r
562 fListQAtof->Add(hNsigmaP);
\r
566 TH2F *hSig = new TH2F("hSigP_TOF",
\r
567 "TOF signal vs. p;p [GeV]; TOF signal [arb. units]",
\r
568 vX->GetNrows()-1,vX->GetMatrixArray(),
\r
570 fListQAtof->Add(hSig);
\r
575 //______________________________________________________________________________
\r
576 void AliAnalysisTaskPIDqa::SetupEMCALqa()
\r
579 // Create the EMCAL qa objects
\r
582 TVectorD *vX=MakeLogBinning(200,.1,30);
\r
584 TH2F *hNsigmaPt = new TH2F(Form("hNsigmaPt_EMCAL_%s",AliPID::ParticleName(0)),
\r
585 Form("EMCAL n#sigma %s vs. p_{T};p_{T} [GeV]; n#sigma",AliPID::ParticleName(0)),
\r
586 vX->GetNrows()-1,vX->GetMatrixArray(),
\r
588 fListQAemcal->Add(hNsigmaPt);
\r
590 TH2F *hSigPt = new TH2F("hSigPt_EMCAL",
\r
591 "EMCAL signal (E/p) vs. p_{T};p_{T} [GeV]; EMCAL signal (E/p) [arb. units]",
\r
592 vX->GetNrows()-1,vX->GetMatrixArray(),
\r
594 fListQAemcal->Add(hSigPt);
\r
599 //______________________________________________________________________________
\r
600 void AliAnalysisTaskPIDqa::SetupTPCTOFqa()
\r
603 // Create the qa objects for TPC + TOF combination
\r
606 TVectorD *vX=MakeLogBinning(200,.1,30);
\r
608 //TPC signals after TOF cut
\r
609 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
\r
610 TH2F *hNsigmaP = new TH2F(Form("hNsigmaP_TPC_TOF_%s",AliPID::ParticleName(ispecie)),
\r
611 Form("TPC n#sigma %s vs. p (after TOF 3#sigma cut);p_{TPC} [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
\r
612 vX->GetNrows()-1,vX->GetMatrixArray(),
\r
614 fListQAtpctof->Add(hNsigmaP);
\r
617 //TOF signals after TPC cut
\r
618 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
\r
619 TH2F *hNsigmaP = new TH2F(Form("hNsigmaP_TOF_TPC_%s",AliPID::ParticleName(ispecie)),
\r
620 Form("TOF n#sigma %s vs. p (after TPC n#sigma cut);p [GeV]; n#sigma",AliPID::ParticleName(ispecie)),
\r
621 vX->GetNrows()-1,vX->GetMatrixArray(),
\r
623 fListQAtpctof->Add(hNsigmaP);
\r
626 //EMCAL signal after TOF and TPC cut
\r
627 for (Int_t ispecie=0; ispecie<AliPID::kSPECIES; ++ispecie){
\r
628 TH2F *heopPt = new TH2F(Form("heopPt_TOF_TPC_%s",AliPID::ParticleName(ispecie)),
\r
629 Form("EMCAL signal (E/p) %s vs. p_{T};p_{T} [GeV]; EMCAL signal (E/p) [arb. units]",AliPID::ParticleName(ispecie)),
\r
630 vX->GetNrows()-1,vX->GetMatrixArray(),
\r
632 fListQAtpctof->Add(heopPt);
\r
638 //______________________________________________________________________________
\r
639 TVectorD* AliAnalysisTaskPIDqa::MakeLogBinning(Int_t nbinsX, Double_t xmin, Double_t xmax)
\r
642 // Make logarithmic binning
\r
643 // the user has to delete the array afterwards!!!
\r
647 if (xmin<1e-20 || xmax<1e-20){
\r
648 AliError("For Log binning xmin and xmax must be > 1e-20. Using linear binning instead!");
\r
649 return MakeLinBinning(nbinsX, xmin, xmax);
\r
656 TVectorD *binLim=new TVectorD(nbinsX+1);
\r
657 Double_t first=xmin;
\r
658 Double_t last=xmax;
\r
659 Double_t expMax=TMath::Log(last/first);
\r
660 for (Int_t i=0; i<nbinsX+1; ++i){
\r
661 (*binLim)[i]=first*TMath::Exp(expMax/nbinsX*(Double_t)i);
\r
666 //______________________________________________________________________________
\r
667 TVectorD* AliAnalysisTaskPIDqa::MakeLinBinning(Int_t nbinsX, Double_t xmin, Double_t xmax)
\r
670 // Make linear binning
\r
671 // the user has to delete the array afterwards!!!
\r
678 TVectorD *binLim=new TVectorD(nbinsX+1);
\r
679 Double_t first=xmin;
\r
680 Double_t last=xmax;
\r
681 Double_t binWidth=(last-first)/nbinsX;
\r
682 for (Int_t i=0; i<nbinsX+1; ++i){
\r
683 (*binLim)[i]=first+binWidth*(Double_t)i;
\r
688 //_____________________________________________________________________________
\r
689 TVectorD* AliAnalysisTaskPIDqa::MakeArbitraryBinning(const char* bins)
\r
692 // Make arbitrary binning, bins separated by a ','
\r
694 TString limits(bins);
\r
695 if (limits.IsNull()){
\r
696 AliError("Bin Limit string is empty, cannot add the variable");
\r
700 TObjArray *arr=limits.Tokenize(",");
\r
701 Int_t nLimits=arr->GetEntries();
\r
703 AliError("Need at leas 2 bin limits, cannot add the variable");
\r
708 TVectorD *binLimits=new TVectorD(nLimits);
\r
709 for (Int_t iLim=0; iLim<nLimits; ++iLim){
\r
710 (*binLimits)[iLim]=(static_cast<TObjString*>(arr->At(iLim)))->GetString().Atof();
\r