]>
Commit | Line | Data |
---|---|---|
1 | /************************************************************************* | |
2 | * Copyright(c) 1998-2008, ALICE Experiment at CERN, All rights reserved. * | |
3 | * * | |
4 | * Author: The ALICE Off-line Project. * | |
5 | * Contributors are mentioned in the code where appropriate. * | |
6 | * * | |
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 | **************************************************************************/ | |
15 | ||
16 | // ----------------------------------------------- | |
17 | // particle level cuts for azimuthal isotropic | |
18 | // expansion in highly central collisions analysis | |
19 | // author: Cristian Andrei | |
20 | // acristian@niham.nipne.ro | |
21 | // ------------------------------------------------ | |
22 | ||
23 | #include <TF1.h> | |
24 | #include <TFile.h> | |
25 | ||
26 | #include "AliAnalysisCentralCutESD.h" | |
27 | #include "AliESDtrack.h" | |
28 | ||
29 | ||
30 | class TObject; | |
31 | class TParticle; | |
32 | ||
33 | ||
34 | //____________________________________________________________________ | |
35 | ClassImp(AliAnalysisCentralCutESD) | |
36 | ||
37 | //____________________________________________________________________ | |
38 | AliAnalysisCentralCutESD::AliAnalysisCentralCutESD(const Char_t* name, const Char_t* title) | |
39 | :AliAnalysisCuts(name,title) | |
40 | ,fReqPID(kFALSE) | |
41 | ,fReqCharge(kFALSE) | |
42 | ,fPartType(kPiPlus) | |
43 | ,fPIDtype("Custom") | |
44 | ,fPriorsFunc(kFALSE) | |
45 | ,fPartPriors() | |
46 | ,fElectronFunction(0) | |
47 | ,fMuonFunction(0) | |
48 | ,fPionFunction(0) | |
49 | ,fKaonFunction(0) | |
50 | ,fProtonFunction(0) | |
51 | { | |
52 | // Constructor | |
53 | // Initialize the priors | |
54 | fPartPriors[0] = 0.01; | |
55 | fPartPriors[1] = 0.01; | |
56 | fPartPriors[2] = 0.85; | |
57 | fPartPriors[3] = 0.1; | |
58 | fPartPriors[4] = 0.05; | |
59 | ||
60 | if(fPriorsFunc){ | |
61 | TFile *f = TFile::Open("$ALICE_ROOT/PWG2/data/PriorProbabilities.root "); | |
62 | if(!f){ | |
63 | printf("Can't open PWG2 prior probabilities file!\n Exiting ...\n"); | |
64 | return; | |
65 | } | |
66 | fElectronFunction = (TF1 *)f->Get("fitElectrons"); | |
67 | fMuonFunction = (TF1 *)f->Get("fitMuons"); | |
68 | fPionFunction = (TF1 *)f->Get("fitPions"); | |
69 | fKaonFunction = (TF1 *)f->Get("fitKaons"); | |
70 | fProtonFunction = (TF1 *)f->Get("fitProtons"); | |
71 | } | |
72 | ||
73 | } | |
74 | ||
75 | AliAnalysisCentralCutESD::~AliAnalysisCentralCutESD() { | |
76 | // Destructor | |
77 | // Delete the created priors | |
78 | ||
79 | if(fPartPriors) delete [] fPartPriors; | |
80 | ||
81 | if(fElectronFunction) delete fElectronFunction; | |
82 | if(fMuonFunction) delete fMuonFunction; | |
83 | if(fPionFunction) delete fPionFunction; | |
84 | if(fKaonFunction) delete fKaonFunction; | |
85 | if(fProtonFunction) delete fProtonFunction; | |
86 | ||
87 | } | |
88 | ||
89 | ||
90 | Bool_t AliAnalysisCentralCutESD::IsSelected(TObject *obj){ | |
91 | // Checks if a particle passes the cuts | |
92 | ||
93 | AliESDtrack *track = dynamic_cast<AliESDtrack *>(obj); | |
94 | ||
95 | if(!track){ | |
96 | printf("AliAnalysisCentralCutESD:IsSelected ->Can't get track!\n"); | |
97 | return kFALSE; | |
98 | } | |
99 | ||
100 | if(fReqCharge){ | |
101 | if(!IsCharged(track)) return kFALSE; | |
102 | } | |
103 | ||
104 | if(fReqPID){ | |
105 | if(!IsA(track, fPartType)) return kFALSE; | |
106 | } | |
107 | ||
108 | return kTRUE; | |
109 | } | |
110 | ||
111 | ||
112 | Double_t AliAnalysisCentralCutESD::GetPriors(Int_t i, Double_t p) { | |
113 | //Return the a priori probs | |
114 | ||
115 | Double_t priors=0; | |
116 | if(fPriorsFunc) { | |
117 | if(i == 0) priors = fElectronFunction->Eval(p); | |
118 | if(i == 1) priors = fMuonFunction->Eval(p); | |
119 | if(i == 2) priors = fPionFunction->Eval(p); | |
120 | if(i == 3) priors = fKaonFunction->Eval(p); | |
121 | if(i == 4) priors = fProtonFunction->Eval(p); | |
122 | } | |
123 | else { | |
124 | priors = fPartPriors[i]; | |
125 | } | |
126 | ||
127 | return priors; | |
128 | } | |
129 | ||
130 | ||
131 | ||
132 | Bool_t AliAnalysisCentralCutESD::IsA(AliESDtrack *track, PDG_t reqPartType){ | |
133 | // Determines the type of the particle | |
134 | Int_t charge; | |
135 | ||
136 | if(reqPartType < 0){ | |
137 | charge = -1; | |
138 | } | |
139 | else{ | |
140 | charge = 1; | |
141 | } | |
142 | ||
143 | Double_t probability[5]; | |
144 | Double_t w[5]; | |
145 | ||
146 | Long64_t partType = 0; | |
147 | ||
148 | Double_t p = track->P(); | |
149 | ||
150 | track->GetESDpid(probability); | |
151 | ||
152 | Double_t s = 0.0; | |
153 | ||
154 | ||
155 | for(Int_t i = 0; i < AliPID::kSPECIES; i++){ | |
156 | s += probability[i]*GetPriors(i,p); | |
157 | } | |
158 | ||
159 | if(!s < 0.000001) { | |
160 | for(Int_t i = 0; i < AliPID::kSPECIES; i++){ | |
161 | w[i] = probability[i]*GetPriors(i,p)/s; | |
162 | } | |
163 | } | |
164 | ||
165 | ||
166 | if(fPIDtype.Contains("Bayesian")) { | |
167 | partType = TMath::LocMax(AliPID::kSPECIES,w); | |
168 | } | |
169 | ||
170 | else if(fPIDtype.Contains("Custom")){ | |
171 | for(Int_t i=0;i<AliPID::kSPECIES;i++) { | |
172 | if(w[i]>0.9){ | |
173 | partType = i; | |
174 | } | |
175 | } | |
176 | } | |
177 | ||
178 | else{ | |
179 | printf("Unknown PID method!\n"); | |
180 | return kFALSE; | |
181 | } | |
182 | ||
183 | if((AliPID::ParticleCode(partType)) != reqPartType){ | |
184 | return kFALSE; | |
185 | } | |
186 | ||
187 | if(track->Charge() != charge) return kFALSE; | |
188 | ||
189 | return kTRUE; | |
190 | ||
191 | } | |
192 | ||
193 | Bool_t AliAnalysisCentralCutESD::IsCharged(AliESDtrack* const track) const{ | |
194 | ||
195 | if(track->Charge() == 0) return kFALSE; | |
196 | ||
197 | return kTRUE; | |
198 | ||
199 | } |