X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=ANALYSIS%2FAliAnalysisTaskPIDCombined.cxx;h=6c98be60e437cc1c50912e31f514bf7a61949f74;hb=fecdbe757f0a7371e75fa67e8f5804c1aa34dfb0;hp=939c76b3a1bc763e93323f8c0ba858c883593731;hpb=fc7b434ff83efe8965327fac942a4b01d473de83;p=u%2Fmrichter%2FAliRoot.git diff --git a/ANALYSIS/AliAnalysisTaskPIDCombined.cxx b/ANALYSIS/AliAnalysisTaskPIDCombined.cxx index 939c76b3a1b..6c98be60e43 100644 --- a/ANALYSIS/AliAnalysisTaskPIDCombined.cxx +++ b/ANALYSIS/AliAnalysisTaskPIDCombined.cxx @@ -1,343 +1,355 @@ -/************************************************************************* -* Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. * -* * -* Author: The ALICE Off-line Project. * -* Contributors are mentioned in the code where appropriate. * -* * -* Permission to use, copy, modify and distribute this software and its * -* documentation strictly for non-commercial purposes is hereby granted * -* without fee, provided that the above copyright notice appears in all * -* copies and that both the copyright notice and this permission notice * -* appear in the supporting documentation. The authors make no claims * -* about the suitability of this software for any purpose. It is * -* provided "as is" without express or implied warranty. * -**************************************************************************/ - -/////////////////////////////////////////////////////////////////////////// -// // -// Basic Analysis Task // -// for PID Analysis // -// // -/////////////////////////////////////////////////////////////////////////// - -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include - -#include "AliAnalysisTaskPIDCombined.h" - -const char *AliAnalysisTaskPIDCombined::fgkBinMomDesc[AliAnalysisTaskPIDCombined::kPtBins] = { - " 0 <= p < 0.5 GeV/c", - " 0.5 <= p < 0.7 GeV/c", - " 0.7 <= p < 1.0 GeV/c", - " 1.0 <= p < 1.5 GeV/c", - " 1.5 <= p < 2.0 GeV/c", - " p >= 2.0 GeV/c" -}; - -ClassImp(AliAnalysisTaskPIDCombined) - -//_________________________________________________________________________________ -AliAnalysisTaskPIDCombined::AliAnalysisTaskPIDCombined() : - AliAnalysisTaskSE(), - fHistList(), - fProbTPCnSigma(), - fProbTOFnSigma(), - fProbTPCTOFnSigmaTPC(), - fProbTPC(), - fProbTOF(), - fProbTPCTOF(), - fPriors(), - fProbTPCTOFnSigTPCMom(), - fProbTPCnSigTPCMom(), - fProbTOFnSigTOFMom(), - fPriorsUsed(), - fPIDResponse(0x0), - fPIDCombined(0x0), - fTrackCuts(0x0), - fTrackFilter(0x0) -{ - // - // Constructor - // -} - -//_________________________________________________________________________________ -AliAnalysisTaskPIDCombined::AliAnalysisTaskPIDCombined(const char *name) : - AliAnalysisTaskSE(name), - fHistList(), - fProbTPCnSigma(), - fProbTOFnSigma(), - fProbTPCTOFnSigmaTPC(), - fProbTPC(), - fProbTOF(), - fProbTPCTOF(), - fPriors(), - fProbTPCTOFnSigTPCMom(), - fProbTPCnSigTPCMom(), - fProbTOFnSigTOFMom(), - fPriorsUsed(), - fPIDResponse(0x0), - fPIDCombined(0x0), - fTrackCuts(0x0), - fTrackFilter(0x0) -{ - // - // Constructor - // - DefineInput(0,TChain::Class()); - DefineOutput(1, TList::Class()); -} - -//_________________________________________________________________________________ -void AliAnalysisTaskPIDCombined::UserCreateOutputObjects() -{ - // - // Initialise the framework objects - // - - - // ------- track cuts - fTrackCuts = new AliESDtrackCuts("fTrackCuts", "Standard"); - fTrackCuts->SetAcceptKinkDaughters(kFALSE); - fTrackCuts->SetMinNClustersTPC(80); - fTrackCuts->SetMaxChi2PerClusterTPC(4); - fTrackCuts->SetMaxDCAToVertexXY(3); - fTrackCuts->SetMaxDCAToVertexZ(3); - fTrackCuts->SetRequireTPCRefit(kTRUE); - fTrackCuts->SetRequireITSRefit(kTRUE); - fTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny); - fTrackFilter = new AliAnalysisFilter("trackFilter"); - fTrackFilter->AddCuts(fTrackCuts); - - - - // ------- setup PIDCombined - fPIDCombined=new AliPIDCombined; - fPIDCombined->SetDefaultTPCPriors(); - fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC+AliPIDResponse::kDetTOF); - - // no light nuclei - fPIDCombined->SetSelectedSpecies(AliPID::kSPECIES); - - - fHistList.Add(new TH1D("nEvents","Number of Evnets;Selection",2,0,2)); - Int_t ispecMax = (Int_t)AliPID::kSPECIES; // coverity fix - for (Int_t ispec=0; ispecSetBinContent(ich,0.02); - break; - case AliPID::kMuon: - for (Int_t ich=1;ich<=100;ich++) fPriors[ispec]->SetBinContent(ich,0.02); - break; - case AliPID::kPion: - for (Int_t ich=1;ich<=100;ich++) fPriors[ispec]->SetBinContent(ich,0.56); - break; - case AliPID::kKaon: - for (Int_t ich=1;ich<=100;ich++) fPriors[ispec]->SetBinContent(ich,0.20); - break; - case AliPID::kProton: - for (Int_t ich=1;ich<=100;ich++) fPriors[ispec]->SetBinContent(ich,0.20); - break; - default: - break; - } - fPIDCombined->SetPriorDistribution((AliPID::EParticleType)ispec,fPriors[ispec]); - - // priors used - fPriorsUsed[ispec] = new TH2D(Form("%s_priorsUsed",AliPID::ParticleName(ispec)), - Form("%s priors vs transverse momentum;p_{t} (GeV/c);priors",AliPID::ParticleName(ispec)), - 100,0.,20.,101,0,1.01); - fHistList.Add(fPriorsUsed[ispec]); - } - - - - fHistList.SetOwner(); - PostData(1,&fHistList); - - -} - -//_________________________________________________________________________________ -void AliAnalysisTaskPIDCombined::UserExec(Option_t *) -{ - // - // Main loop. Called for every event - // - AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager(); - AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler()); - fPIDResponse=inputHandler->GetPIDResponse(); - if (!fPIDResponse) AliFatal("This Task needs the PID response attached to the inputHandler"); - - // Printf(" ---------------------- UserExec PID task ---------------------"); - - FillHistogram("nEvents",0.); - - AliVEvent *event=InputEvent(); - AliVTrack *track=0x0; - Int_t ntracks=event->GetNumberOfTracks(); - - Double_t probTPC[AliPID::kSPECIES]={0.}; - Double_t probTOF[AliPID::kSPECIES]={0.}; - Double_t probTPCTOF[AliPID::kSPECIES]={0.}; - - //loop over all tracks - for (Int_t itrack=0; itrackGetTrack(itrack); - - if ( fTrackFilter->IsSelected(track) ) { - - Double_t mom=track->GetTPCmomentum(); - Int_t ibin=GetMomBin(mom); - - fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC); - UInt_t detUsed = fPIDCombined->ComputeProbabilities(track, fPIDResponse, probTPC); - - if (detUsed != 0) { // TPC is available - for (Int_t ispec=0; ispecNumberOfSigmasTPC(track,(AliPID::EParticleType)ispec); - fProbTPC[ispec]->Fill(mom,probTPC[ispec]); - fProbTPCnSigma[ispec]->Fill(nSigmaTPC,probTPC[ispec]); - fProbTPCnSigTPCMom[ibin][ispec]->Fill(nSigmaTPC,probTPC[ispec]); - } - - // compute priors for TPC+TOF, even if we ask just TOF for PID - fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTOF); - detUsed = fPIDCombined->ComputeProbabilities(track, fPIDResponse, probTOF); - Double_t priors[5]; // check priors used for TOF - fPIDCombined->GetPriors(track,priors,fPIDResponse,detUsed); - for(Int_t ispec=0;ispec<5;ispec++) fPriorsUsed[ispec]->Fill(TMath::Abs(track->Pt()),priors[ispec]); - - if (detUsed != 0) { // TOF is available - for (Int_t ispec=0; ispecNumberOfSigmasTOF(track,(AliPID::EParticleType)ispec); - fProbTOF[ispec]->Fill(mom,probTOF[ispec]); - fProbTOFnSigma[ispec]->Fill(nSigmaTOF,probTOF[ispec]); - fProbTOFnSigTOFMom[ibin][ispec]->Fill(nSigmaTOF,probTOF[ispec]); - } - } - - fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTOF|AliPIDResponse::kDetTPC); - detUsed = fPIDCombined->ComputeProbabilities(track, fPIDResponse, probTPCTOF); - if (detUsed == (UInt_t)fPIDCombined->GetDetectorMask() ) { - for (Int_t ispec=0; ispecNumberOfSigmasTPC(track,(AliPID::EParticleType)ispec); - fProbTPCTOF[ispec]->Fill(mom,probTPCTOF[ispec]); - fProbTPCTOFnSigmaTPC[ispec]->Fill(nSigmaTPC,probTPCTOF[ispec]); - fProbTPCTOFnSigTPCMom[ibin][ispec]->Fill(nSigmaTPC,probTPCTOF[ispec]); - } - } - - } - - - } - } - - PostData(1, &fHistList); -} - -//_________________________________________________________________________________ -void AliAnalysisTaskPIDCombined::FillHistogram(const char* name, Double_t x, Double_t weight) -{ - // - // Fill 1D histogram by name - // - ((TH1*)fHistList.FindObject(name))->Fill(x,weight); -} - -//_________________________________________________________________________________ -void AliAnalysisTaskPIDCombined::FillHistogram(const char* name, Double_t x, Double_t y, Double_t weight) -{ - // - // Fill 2D histogram by name - // - ((TH2*)fHistList.FindObject(name))->Fill(x,y,weight); -} - - -//_________________________________________________________________________________ -Int_t AliAnalysisTaskPIDCombined::GetMomBin(Float_t mom) -{ - // - // Given momentum return histogram to be filled - // - if (mom>0. && mom < 0.5) return 0; - if (mom>=0.5 && mom < 0.7) return 1; - if (mom>=0.7 && mom < 1.0) return 2; - if (mom>=1.0 && mom < 1.5) return 3; - if (mom>=1.5 && mom < 2.0) return 4; - return kPtBins-1; -} - +/************************************************************************* +* Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. * +* * +* Author: The ALICE Off-line Project. * +* Contributors are mentioned in the code where appropriate. * +* * +* Permission to use, copy, modify and distribute this software and its * +* documentation strictly for non-commercial purposes is hereby granted * +* without fee, provided that the above copyright notice appears in all * +* copies and that both the copyright notice and this permission notice * +* appear in the supporting documentation. The authors make no claims * +* about the suitability of this software for any purpose. It is * +* provided "as is" without express or implied warranty. * +**************************************************************************/ + +/////////////////////////////////////////////////////////////////////////// +// // +// Basic Analysis Task // +// for PID Analysis // +// // +/////////////////////////////////////////////////////////////////////////// + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +#include "AliAnalysisTaskPIDCombined.h" + +const char *AliAnalysisTaskPIDCombined::fgkBinMomDesc[AliAnalysisTaskPIDCombined::kPtBins] = { + " 0 <= p < 0.5 GeV/c", + " 0.5 <= p < 0.7 GeV/c", + " 0.7 <= p < 1.0 GeV/c", + " 1.0 <= p < 1.5 GeV/c", + " 1.5 <= p < 2.0 GeV/c", + " p >= 2.0 GeV/c" +}; + +ClassImp(AliAnalysisTaskPIDCombined) + +//_________________________________________________________________________________ +AliAnalysisTaskPIDCombined::AliAnalysisTaskPIDCombined() : + AliAnalysisTaskSE(), + fHistList(), + fProbTPCnSigma(), + fProbTOFnSigma(), + fProbTPCTOFnSigmaTPC(), + fProbTPC(), + fProbTOF(), + fProbTPCTOF(), + fPriors(), + fProbTPCTOFnSigTPCMom(), + fProbTPCnSigTPCMom(), + fProbTOFnSigTOFMom(), + fPriorsUsed(), + fPIDResponse(0x0), + fPIDCombined(0x0), + fTrackCuts(0x0), + fTrackFilter(0x0), + fDeDx(NULL), + fDeDxTuned(NULL) +{ + // + // Constructor + // +} + +//_________________________________________________________________________________ +AliAnalysisTaskPIDCombined::AliAnalysisTaskPIDCombined(const char *name) : + AliAnalysisTaskSE(name), + fHistList(), + fProbTPCnSigma(), + fProbTOFnSigma(), + fProbTPCTOFnSigmaTPC(), + fProbTPC(), + fProbTOF(), + fProbTPCTOF(), + fPriors(), + fProbTPCTOFnSigTPCMom(), + fProbTPCnSigTPCMom(), + fProbTOFnSigTOFMom(), + fPriorsUsed(), + fPIDResponse(0x0), + fPIDCombined(0x0), + fTrackCuts(0x0), + fTrackFilter(0x0), + fDeDx(NULL), + fDeDxTuned(NULL) +{ + // + // Constructor + // + DefineInput(0,TChain::Class()); + DefineOutput(1, TList::Class()); +} + +//_________________________________________________________________________________ +void AliAnalysisTaskPIDCombined::UserCreateOutputObjects() +{ + // + // Initialise the framework objects + // + + + // ------- track cuts + fTrackCuts = new AliESDtrackCuts("fTrackCuts", "Standard"); + fTrackCuts->SetAcceptKinkDaughters(kFALSE); + fTrackCuts->SetMinNClustersTPC(80); + fTrackCuts->SetMaxChi2PerClusterTPC(4); + fTrackCuts->SetMaxDCAToVertexXY(3); + fTrackCuts->SetMaxDCAToVertexZ(3); + fTrackCuts->SetRequireTPCRefit(kTRUE); + fTrackCuts->SetRequireITSRefit(kTRUE); + fTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny); + fTrackFilter = new AliAnalysisFilter("trackFilter"); + fTrackFilter->AddCuts(fTrackCuts); + + + + // ------- setup PIDCombined + fPIDCombined=new AliPIDCombined; + fPIDCombined->SetDefaultTPCPriors(); + fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC+AliPIDResponse::kDetTOF); + + // no light nuclei - no need to call it, this is default + // fPIDCombined->SetSelectedSpecies(AliPID::kSPECIES); + + + fHistList.Add(new TH1D("nEvents","Number of Evnets;Selection",2,0,2)); + + for (Int_t ispec=0; ispec<5; ++ispec){ + + + fProbTPC[ispec]=new TH2D(Form("prob%s_mom_TPC",AliPID::ParticleName(ispec)), + Form("%s probability vs. momentum;momentum;probability",AliPID::ParticleName(ispec)), + 100,0.,20.,50,0.,1.); + fHistList.Add(fProbTPC[ispec]); + fProbTPCnSigma[ispec]=new TH2D(Form("prob%s_nSigma_TPC",AliPID::ParticleName(ispec)), + Form("%s probability vs. n#sigma;n#sigma;probability",AliPID::ParticleName(ispec)), + 20,-5.,5.,50,0.,1.); + fHistList.Add(fProbTPCnSigma[ispec]); + + for (Int_t ibin=0;ibinSetBinContent(ich,0.02); + break; + case AliPID::kMuon: + for (Int_t ich=1;ich<=100;ich++) fPriors[ispec]->SetBinContent(ich,0.02); + break; + case AliPID::kPion: + for (Int_t ich=1;ich<=100;ich++) fPriors[ispec]->SetBinContent(ich,0.56); + break; + case AliPID::kKaon: + for (Int_t ich=1;ich<=100;ich++) fPriors[ispec]->SetBinContent(ich,0.20); + break; + case AliPID::kProton: + for (Int_t ich=1;ich<=100;ich++) fPriors[ispec]->SetBinContent(ich,0.20); + break; + default: + break; + } + fPIDCombined->SetPriorDistribution((AliPID::EParticleType)ispec,fPriors[ispec]); + + // priors used + fPriorsUsed[ispec] = new TH2D(Form("%s_priorsUsed",AliPID::ParticleName(ispec)), + Form("%s priors vs transverse momentum;p_{t} (GeV/c);priors",AliPID::ParticleName(ispec)), + 100,0.,20.,101,0,1.01); + fHistList.Add(fPriorsUsed[ispec]); + } + + + fDeDx = new TH2D("hDeDx",";p_{TPC};dE/dx (a.u.)",500,0,5,500,0,500); + fHistList.Add(fDeDx); + fDeDxTuned = new TH2D("hDeDxTuned",";p_{TPC};dE/dx (a.u.)",500,0,5,500,0,500); + fHistList.Add(fDeDxTuned); + + fHistList.SetOwner(); + PostData(1,&fHistList); + + +} + +//_________________________________________________________________________________ +void AliAnalysisTaskPIDCombined::UserExec(Option_t *) +{ + // + // Main loop. Called for every event + // + AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager(); + AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler()); + fPIDResponse=inputHandler->GetPIDResponse(); + if (!fPIDResponse) AliFatal("This Task needs the PID response attached to the inputHandler"); + + // Printf(" ---------------------- UserExec PID task ---------------------"); + + FillHistogram("nEvents",0.); + + AliVEvent *event=InputEvent(); + AliVTrack *track=0x0; + Int_t ntracks=event->GetNumberOfTracks(); + + Double_t probTPC[AliPID::kSPECIES]={0.}; + Double_t probTOF[AliPID::kSPECIES]={0.}; + Double_t probTPCTOF[AliPID::kSPECIES]={0.}; + + //loop over all tracks + for (Int_t itrack=0; itrackGetTrack(itrack); + + if ( fTrackFilter->IsSelected(track) ) { + + Double_t mom=track->GetTPCmomentum(); + Int_t ibin=GetMomBin(mom); + + fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC); + UInt_t detUsed = fPIDCombined->ComputeProbabilities(track, fPIDResponse, probTPC); + + if (detUsed != 0) { // TPC is available + for (Int_t ispec=0; ispecNumberOfSigmasTPC(track,(AliPID::EParticleType)ispec); + fProbTPC[ispec]->Fill(mom,probTPC[ispec]); + fProbTPCnSigma[ispec]->Fill(nSigmaTPC,probTPC[ispec]); + fProbTPCnSigTPCMom[ibin][ispec]->Fill(nSigmaTPC,probTPC[ispec]); + } + + // compute priors for TPC+TOF, even if we ask just TOF for PID + fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTOF); + detUsed = fPIDCombined->ComputeProbabilities(track, fPIDResponse, probTOF); + Double_t priors[5]; // check priors used for TOF + fPIDCombined->GetPriors(track,priors,fPIDResponse,detUsed); + for(Int_t ispec=0;ispec<5;ispec++) fPriorsUsed[ispec]->Fill(TMath::Abs(track->Pt()),priors[ispec]); + + if (detUsed != 0) { // TOF is available + for (Int_t ispec=0; ispecNumberOfSigmasTOF(track,(AliPID::EParticleType)ispec); + fProbTOF[ispec]->Fill(mom,probTOF[ispec]); + fProbTOFnSigma[ispec]->Fill(nSigmaTOF,probTOF[ispec]); + fProbTOFnSigTOFMom[ibin][ispec]->Fill(nSigmaTOF,probTOF[ispec]); + } + } + + fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTOF|AliPIDResponse::kDetTPC); + detUsed = fPIDCombined->ComputeProbabilities(track, fPIDResponse, probTPCTOF); + if (detUsed == (UInt_t)fPIDCombined->GetDetectorMask() ) { + for (Int_t ispec=0; ispecNumberOfSigmasTPC(track,(AliPID::EParticleType)ispec); + fProbTPCTOF[ispec]->Fill(mom,probTPCTOF[ispec]); + fProbTPCTOFnSigmaTPC[ispec]->Fill(nSigmaTPC,probTPCTOF[ispec]); + fProbTPCTOFnSigTPCMom[ibin][ispec]->Fill(nSigmaTPC,probTPCTOF[ispec]); + } + } + + } + + fPIDResponse->GetTPCsignalTunedOnData(track); + + fDeDx->Fill(mom,track->GetTPCsignal()); + fDeDxTuned->Fill(mom,track->GetTPCsignalTunedOnData()); + + } + } + + PostData(1, &fHistList); +} + +//_________________________________________________________________________________ +void AliAnalysisTaskPIDCombined::FillHistogram(const char* name, Double_t x, Double_t weight) +{ + // + // Fill 1D histogram by name + // + ((TH1*)fHistList.FindObject(name))->Fill(x,weight); +} + +//_________________________________________________________________________________ +void AliAnalysisTaskPIDCombined::FillHistogram(const char* name, Double_t x, Double_t y, Double_t weight) +{ + // + // Fill 2D histogram by name + // + ((TH2*)fHistList.FindObject(name))->Fill(x,y,weight); +} + + +//_________________________________________________________________________________ +Int_t AliAnalysisTaskPIDCombined::GetMomBin(Float_t mom) +{ + // + // Given momentum return histogram to be filled + // + if (mom>0. && mom < 0.5) return 0; + if (mom>=0.5 && mom < 0.7) return 1; + if (mom>=0.7 && mom < 1.0) return 2; + if (mom>=1.0 && mom < 1.5) return 3; + if (mom>=1.5 && mom < 2.0) return 4; + return kPtBins-1; +} +