From aafecd8bbd1e13379dcd25cfba57e8b30c006765 Mon Sep 17 00:00:00 2001 From: panos Date: Tue, 27 Nov 2007 12:46:01 +0000 Subject: [PATCH] Possibility to define a momentum dependent prior probabilities from fit functions and use them for the PID --- PWG2/AliAnalysisTaskProtons.cxx | 15 ++++++++-- PWG2/AliAnalysisTaskProtons.h | 23 ++++++++++++++- PWG2/SPECTRA/AliProtonAnalysis.cxx | 38 ++++++++++++++++++++++-- PWG2/SPECTRA/AliProtonAnalysis.h | 24 +++++++++++++--- PWG2/runProtonAnalysis.C | 46 +++++++++++++++++++++++++++++- 5 files changed, 135 insertions(+), 11 deletions(-) diff --git a/PWG2/AliAnalysisTaskProtons.cxx b/PWG2/AliAnalysisTaskProtons.cxx index 4b48c012f79..4b2978d8989 100644 --- a/PWG2/AliAnalysisTaskProtons.cxx +++ b/PWG2/AliAnalysisTaskProtons.cxx @@ -2,6 +2,7 @@ #include "TTree.h" #include "TList.h" #include "TH2F.h" +#include "TF1.h" #include "TCanvas.h" #include "TLorentzVector.h" @@ -21,7 +22,10 @@ ClassImp(AliAnalysisTaskProtons) //________________________________________________________________________ AliAnalysisTaskProtons::AliAnalysisTaskProtons(const char *name) - : AliAnalysisTask(name, ""), fESD(0), fList(0), fAnalysis(0) { +: AliAnalysisTask(name, ""), fESD(0), fList(0), fAnalysis(0), + fElectronFunction(0), fMuonFunction(0), + fPionFunction(0), fKaonFunction(0), fProtonFunction(0), + fFunctionUsed(kFALSE) { // Constructor // Define input and output slots here @@ -73,7 +77,14 @@ void AliAnalysisTaskProtons::CreateOutputObjects() { fAnalysis->SetMaxSigmaToVertex(3.); fAnalysis->SetITSRefit(); fAnalysis->SetTPCRefit(); - fAnalysis->SetPriorProbabilities(partFrac); + if(fFunctionUsed) + fAnalysis->SetPriorProbabilityFunctions(fElectronFunction, + fMuonFunction, + fPionFunction, + fKaonFunction, + fProtonFunction); + else + fAnalysis->SetPriorProbabilities(partFrac); } //________________________________________________________________________ diff --git a/PWG2/AliAnalysisTaskProtons.h b/PWG2/AliAnalysisTaskProtons.h index 05bac66c3ae..eceeeee0228 100644 --- a/PWG2/AliAnalysisTaskProtons.h +++ b/PWG2/AliAnalysisTaskProtons.h @@ -6,6 +6,7 @@ class TList; class AliESDEvent; +#include "TF1.h" #include "PWG2spectra/SPECTRA/AliProtonAnalysis.h" #include "AliAnalysisTask.h" @@ -19,12 +20,32 @@ class AliAnalysisTaskProtons : public AliAnalysisTask { virtual void CreateOutputObjects(); virtual void Exec(Option_t *option); virtual void Terminate(Option_t *); + + void SetPriorProbabilityFunctions(TF1 *felectrons, + TF1 *fmuons, + TF1 *fpions, + TF1 *fkaons, + TF1 *fprotons) { + fFunctionUsed = kTRUE; + fElectronFunction = felectrons; + fMuonFunction = fmuons; + fPionFunction = fpions; + fKaonFunction = fkaons; + fProtonFunction = fprotons; + } private: AliESDEvent *fESD; //ESD object TList *fList; //TList output object AliProtonAnalysis *fAnalysis; //analysis object - + TF1 *fElectronFunction; //TF1 for e + TF1 *fMuonFunction; //TF1 for mu + TF1 *fPionFunction; //TF1 for pi + TF1 *fKaonFunction; //TF1 for K + TF1 *fProtonFunction; //TF1 for p + + Bool_t fFunctionUsed; //kTRUE if Functions are used + AliAnalysisTaskProtons(const AliAnalysisTaskProtons&); // not implemented AliAnalysisTaskProtons& operator=(const AliAnalysisTaskProtons&); // not implemented diff --git a/PWG2/SPECTRA/AliProtonAnalysis.cxx b/PWG2/SPECTRA/AliProtonAnalysis.cxx index 50504ff4d2b..a127d53d7bd 100644 --- a/PWG2/SPECTRA/AliProtonAnalysis.cxx +++ b/PWG2/SPECTRA/AliProtonAnalysis.cxx @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -45,6 +46,9 @@ AliProtonAnalysis::AliProtonAnalysis() : fMaxCov11Flag(kFALSE), fMaxCov22Flag(kFALSE), fMaxCov33Flag(kFALSE), fMaxCov44Flag(kFALSE), fMaxCov55Flag(kFALSE), fMaxSigmaToVertexFlag(kFALSE), fITSRefitFlag(kFALSE), fTPCRefitFlag(kFALSE), + fFunctionProbabilityFlag(kFALSE), + fElectronFunction(0), fMuonFunction(0), + fPionFunction(0), fKaonFunction(0), fProtonFunction(0), fHistYPtProtons(0), fHistYPtAntiProtons(0) { //Default constructor for(Int_t i = 0; i < 5; i++) fPartFrac[i] = 0.0; @@ -55,6 +59,18 @@ AliProtonAnalysis::AliProtonAnalysis(Int_t nbinsY, Float_t fLowY, Float_t fHighY TObject(), fNBinsY(nbinsY), fMinY(fLowY), fMaxY(fHighY), fNBinsPt(nbinsPt), fMinPt(fLowPt), fMaxPt(fHighPt), + fMinTPCClusters(0), fMinITSClusters(0), + fMaxChi2PerTPCCluster(0), fMaxChi2PerITSCluster(0), + fMaxCov11(0), fMaxCov22(0), fMaxCov33(0), fMaxCov44(0), fMaxCov55(0), + fMaxSigmaToVertex(0), + fMinTPCClustersFlag(kFALSE), fMinITSClustersFlag(kFALSE), + fMaxChi2PerTPCClusterFlag(kFALSE), fMaxChi2PerITSClusterFlag(kFALSE), + fMaxCov11Flag(kFALSE), fMaxCov22Flag(kFALSE), fMaxCov33Flag(kFALSE), fMaxCov44Flag(kFALSE), fMaxCov55Flag(kFALSE), + fMaxSigmaToVertexFlag(kFALSE), + fITSRefitFlag(kFALSE), fTPCRefitFlag(kFALSE), + fFunctionProbabilityFlag(kFALSE), + fElectronFunction(0), fMuonFunction(0), + fPionFunction(0), fKaonFunction(0), fProtonFunction(0), fHistYPtProtons(0), fHistYPtAntiProtons(0) { //Default constructor @@ -240,6 +256,21 @@ TH1D *AliProtonAnalysis::GetPtAsymmetryHistogram() { return hAsymmetryPt; } +//____________________________________________________________________// +Double_t AliProtonAnalysis::GetParticleFraction(Int_t i, Double_t p) { + Double_t partFrac; + if(fFunctionProbabilityFlag) { + if(i == 0) partFrac = fElectronFunction->Eval(p); + if(i == 1) partFrac = fMuonFunction->Eval(p); + if(i == 2) partFrac = fPionFunction->Eval(p); + if(i == 3) partFrac = fKaonFunction->Eval(p); + if(i == 4) partFrac = fProtonFunction->Eval(p); + } + else partFrac = fPartFrac[i]; + + return partFrac; +} + //____________________________________________________________________// void AliProtonAnalysis::Analyze(AliESDEvent* fESD) { //Main analysis part @@ -248,15 +279,16 @@ void AliProtonAnalysis::Analyze(AliESDEvent* fESD) { AliESDtrack* track = fESD->GetTrack(iTracks); if(IsAccepted(track)) { Double_t Pt = track->Pt(); + Double_t P = track->P(); - //pid + //pid Double_t probability[5]; track->GetESDpid(probability); Double_t rcc = 0.0; - for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += probability[i]*fPartFrac[i]; + for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += probability[i]*GetParticleFraction(i,P); if(rcc == 0.0) continue; Double_t w[5]; - for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = probability[i]*fPartFrac[i]/rcc; + for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = probability[i]*GetParticleFraction(i,P)/rcc; Long64_t fParticleType = TMath::LocMax(AliPID::kSPECIES,w); if(fParticleType == 4) { if(track->Charge() > 0) fHistYPtProtons->Fill(Rapidity(track),Pt); diff --git a/PWG2/SPECTRA/AliProtonAnalysis.h b/PWG2/SPECTRA/AliProtonAnalysis.h index 1726faeb6a7..fbaca564dcb 100644 --- a/PWG2/SPECTRA/AliProtonAnalysis.h +++ b/PWG2/SPECTRA/AliProtonAnalysis.h @@ -15,6 +15,7 @@ #include +class TF1; class TH2F; class TH1D; class AliESDEvent; @@ -74,7 +75,16 @@ class AliProtonAnalysis : public TObject { //Prior probabilities void SetPriorProbabilities(Double_t *partFrac) {for(Int_t i = 0; i < 5; i++) fPartFrac[i] = partFrac[i];} - + void SetPriorProbabilityFunctions(TF1 *felectron, TF1 *fmuon, TF1 *fpion, TF1 *fkaon, TF1 *fproton) { + fFunctionProbabilityFlag = kTRUE; + fElectronFunction = felectron; + fMuonFunction = fmuon; + fPionFunction = fpion; + fKaonFunction = fkaon; + fProtonFunction = fproton; + } + Double_t GetParticleFraction(Int_t i, Double_t p); + private: Bool_t IsAccepted(AliESDtrack *track); Float_t GetSigmaToVertex(AliESDtrack* esdTrack); @@ -97,10 +107,16 @@ class AliProtonAnalysis : public TObject { Bool_t fITSRefitFlag, fTPCRefitFlag; //shows if this cut is used or not //pid + Bool_t fFunctionProbabilityFlag; //flag: kTRUE if functions used Double_t fPartFrac[5]; //prior probabilities - - TH2F* fHistYPtProtons; //Y-Pt of Protons - TH2F* fHistYPtAntiProtons; // Y-Pt of Antiprotons + TF1 *fElectronFunction; //momentum dependence of the prior probs + TF1 *fMuonFunction; //momentum dependence of the prior probs + TF1 *fPionFunction; //momentum dependence of the prior probs + TF1 *fKaonFunction; //momentum dependence of the prior probs + TF1 *fProtonFunction; //momentum dependence of the prior probs + + TH2F *fHistYPtProtons; //Y-Pt of Protons + TH2F *fHistYPtAntiProtons; // Y-Pt of Antiprotons ClassDef(AliProtonAnalysis,0); }; diff --git a/PWG2/runProtonAnalysis.C b/PWG2/runProtonAnalysis.C index 361b1da2b57..7da6b1f2d29 100644 --- a/PWG2/runProtonAnalysis.C +++ b/PWG2/runProtonAnalysis.C @@ -70,6 +70,17 @@ void runLocal() { //____________________________________________// // 1st Proton task AliAnalysisTaskProtons *task1 = new AliAnalysisTaskProtons("TaskProtons"); + TFile *f = TFile::Open("PriorProb/PriorProbabilities.root "); + TF1 *fitElectrons = (TF1 *)f->Get("fitElectrons"); + TF1 *fitMuons = (TF1 *)f->Get("fitMuons"); + TF1 *fitPions = (TF1 *)f->Get("fitPions"); + TF1 *fitKaons = (TF1 *)f->Get("fitKaons"); + TF1 *fitProtons = (TF1 *)f->Get("fitProtons"); + task1->SetPriorProbabilityFunctions(fitElectrons, + fitMuons, + fitPions, + fitKaons, + fitProtons); mgr->AddTask(task1); // Create containers for input/output @@ -153,6 +164,17 @@ void runInteractive() { //____________________________________________// // 1st Proton task AliAnalysisTaskProtons *task1 = new AliAnalysisTaskProtons("TaskProtons"); + TFile *f = TFile::Open("PriorProb/PriorProbabilities.root "); + TF1 *fitElectrons = (TF1 *)f->Get("fitElectrons"); + TF1 *fitMuons = (TF1 *)f->Get("fitMuons"); + TF1 *fitPions = (TF1 *)f->Get("fitPions"); + TF1 *fitKaons = (TF1 *)f->Get("fitKaons"); + TF1 *fitProtons = (TF1 *)f->Get("fitProtons"); + task1->SetPriorProbabilityFunctions(fitElectrons, + fitMuons, + fitPions, + fitKaons, + fitProtons); mgr->AddTask(task1); // Create containers for input/output @@ -229,6 +251,17 @@ void runBatch() { //____________________________________________// // 1st Proton task AliAnalysisTaskProtons *task1 = new AliAnalysisTaskProtons("TaskProtons"); + TFile *f = TFile::Open("PriorProb/PriorProbabilities.root "); + TF1 *fitElectrons = (TF1 *)f->Get("fitElectrons"); + TF1 *fitMuons = (TF1 *)f->Get("fitMuons"); + TF1 *fitPions = (TF1 *)f->Get("fitPions"); + TF1 *fitKaons = (TF1 *)f->Get("fitKaons"); + TF1 *fitProtons = (TF1 *)f->Get("fitProtons"); + task1->SetPriorProbabilityFunctions(fitElectrons, + fitMuons, + fitPions, + fitKaons, + fitProtons); mgr->AddTask(task1); // Create containers for input/output @@ -252,7 +285,7 @@ void runProof() { timer.Start(); printf("****** Connect to PROOF *******\n"); TProof::Open("proof://lxb6046.cern.ch"); - gProof->SetParallel(1); + gProof->SetParallel(); // Enable the Analysis Package gProof->UploadPackage("STEERBase.par"); @@ -283,6 +316,17 @@ void runProof() { //____________________________________________// // 1st Proton task AliAnalysisTaskProtons *task1 = new AliAnalysisTaskProtons("TaskProtons"); + TFile *f = TFile::Open("PriorProb/PriorProbabilities.root "); + TF1 *fitElectrons = (TF1 *)f->Get("fitElectrons"); + TF1 *fitMuons = (TF1 *)f->Get("fitMuons"); + TF1 *fitPions = (TF1 *)f->Get("fitPions"); + TF1 *fitKaons = (TF1 *)f->Get("fitKaons"); + TF1 *fitProtons = (TF1 *)f->Get("fitProtons"); + task1->SetPriorProbabilityFunctions(fitElectrons, + fitMuons, + fitPions, + fitKaons, + fitProtons); mgr->AddTask(task1); // Create containers for input/output -- 2.43.0