]>
Commit | Line | Data |
---|---|---|
9a8aafa5 | 1 | /************************************************************************** |
2 | * Copyright(c) 1998-1999, 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 | ||
dcb23f7e | 16 | //============================================================================== |
740b6bde | 17 | // AliHMPIDAnalysysTask - Class representing a basic analysis tool of HMPID data at |
dcb23f7e | 18 | // level of ESD. |
740b6bde | 19 | // A set of histograms is created. |
dcb23f7e | 20 | //============================================================================== |
740b6bde | 21 | // |
dcb23f7e | 22 | // By means of AliHMPIDAnalysisTask.C macro it is possible to use this class |
740b6bde | 23 | // to perform the analysis on local data, on data on alien using local machine |
24 | // and on CAF. | |
dcb23f7e | 25 | |
9a8aafa5 | 26 | #ifndef AliHMPIDAnalysisTASK_CXX |
27 | #define AliHMPIDAnalysisTASK_CXX | |
28 | ||
740b6bde | 29 | |
30 | #include "TH1.h" | |
31 | #include "TH2.h" | |
32 | #include "TFile.h" | |
33 | #include "TCanvas.h" | |
34 | #include "TGraphErrors.h" | |
9a8aafa5 | 35 | #include "AliAnalysisManager.h" |
38b8c336 | 36 | #include "AliESDInputHandler.h" |
740b6bde | 37 | #include "AliMCEventHandler.h" |
38 | #include "AliMCEvent.h" | |
9a8aafa5 | 39 | #include "AliESDtrack.h" |
740b6bde | 40 | #include "AliPID.h" |
41 | #include "AliLog.h" | |
38b8c336 | 42 | #include "AliHMPIDAnalysisTask.h" |
9a8aafa5 | 43 | |
44 | ClassImp(AliHMPIDAnalysisTask) | |
45 | ||
46 | //__________________________________________________________________________ | |
47 | AliHMPIDAnalysisTask::AliHMPIDAnalysisTask() : | |
38b8c336 | 48 | fESD(0x0),fHmpHistList(0x0), |
9a8aafa5 | 49 | fNevts(0), |
50 | fTrigNevts(0), | |
38b8c336 | 51 | fTrigger(0), |
dcb23f7e | 52 | fHmpPesdPhmp(0x0),fHmpCkovPesd(0x0),fHmpCkovPhmp(0x0), |
38b8c336 | 53 | fHmpMipTrkDist(0x0),fHmpMipTrkDistX(0x0),fHmpMipTrkDistY(0x0),fHmpMipCharge3cm(0x0),fHmpMipCharge1cm(0x0),fHmpNumPhots(0x0), |
740b6bde | 54 | fHmpTrkFlags(0x0), |
55 | fN1(6), | |
56 | fN2(8), | |
57 | fPionEff(0x0), | |
58 | fKaonEff(0x0), | |
59 | fProtEff(0x0), | |
60 | fPionTot(0x0), | |
61 | fKaonTot(0x0), | |
62 | fProtTot(0x0), | |
63 | fPionNot(0x0), | |
64 | fKaonNot(0x0), | |
65 | fProtNot(0x0), | |
66 | fPionCon(0x0), | |
67 | fKaonCon(0x0), | |
68 | fProtCon(0x0), | |
69 | fThetavsPiFromK(0x0), | |
70 | fThetapivsPesd(0x0), | |
71 | fThetaKvsPesd(0x0), | |
72 | fThetaPvsPesd(0x0) | |
9a8aafa5 | 73 | { |
74 | // | |
75 | //Default ctor | |
76 | // | |
77 | } | |
740b6bde | 78 | |
9a8aafa5 | 79 | //___________________________________________________________________________ |
80 | AliHMPIDAnalysisTask::AliHMPIDAnalysisTask(const Char_t* name) : | |
81 | AliAnalysisTaskSE(name), | |
740b6bde | 82 | fESD(0), fHmpHistList(0x0), fNevts(0), |
9a8aafa5 | 83 | fTrigNevts(0), |
38b8c336 | 84 | fTrigger(0), |
740b6bde | 85 | fHmpPesdPhmp(0x0), fHmpCkovPesd(0x0), fHmpCkovPhmp(0x0), |
86 | fHmpMipTrkDist(0x0), fHmpMipTrkDistX(0x0), fHmpMipTrkDistY(0x0), | |
87 | fHmpMipCharge3cm(0x0), fHmpMipCharge1cm(0x0), | |
88 | fHmpNumPhots(0x0), fHmpTrkFlags(0x0), | |
89 | fN1(6), | |
90 | fN2(8), | |
91 | fPionEff(0x0), | |
92 | fKaonEff(0x0), | |
93 | fProtEff(0x0), | |
94 | fPionTot(0x0), | |
95 | fKaonTot(0x0), | |
96 | fProtTot(0x0), | |
97 | fPionNot(0x0), | |
98 | fKaonNot(0x0), | |
99 | fProtNot(0x0), | |
100 | fPionCon(0x0), | |
101 | fKaonCon(0x0), | |
102 | fProtCon(0x0), | |
103 | fThetavsPiFromK(0x0), | |
104 | fThetapivsPesd(0x0), | |
105 | fThetaKvsPesd(0x0), | |
106 | fThetaPvsPesd(0x0) | |
9a8aafa5 | 107 | { |
108 | // | |
109 | // Constructor. Initialization of Inputs and Outputs | |
110 | // | |
740b6bde | 111 | |
38b8c336 | 112 | DefineOutput(0,TList::Class()); |
740b6bde | 113 | } |
114 | ||
dcb23f7e | 115 | //___________________________________________________________________________ |
740b6bde | 116 | AliHMPIDAnalysisTask& AliHMPIDAnalysisTask::operator=(const AliHMPIDAnalysisTask& c) |
dcb23f7e | 117 | { |
118 | // | |
119 | // Assignment operator | |
120 | // | |
121 | if (this!=&c) { | |
740b6bde | 122 | AliAnalysisTaskSE::operator=(c); |
123 | fESD = c.fESD; | |
124 | fHmpHistList = c.fHmpHistList; | |
dcb23f7e | 125 | fNevts = c.fNevts; |
126 | fTrigNevts = c.fTrigNevts; | |
127 | fTrigger = c.fTrigger; | |
740b6bde | 128 | fHmpPesdPhmp = c.fHmpPesdPhmp; |
129 | fHmpCkovPesd = c.fHmpCkovPesd; | |
130 | fHmpCkovPhmp = c.fHmpCkovPhmp; | |
dcb23f7e | 131 | fHmpMipTrkDist = c.fHmpMipTrkDist; |
132 | fHmpMipTrkDistX = c.fHmpMipTrkDistX; | |
133 | fHmpMipTrkDistY = c.fHmpMipTrkDistY; | |
134 | fHmpMipCharge3cm = c.fHmpMipCharge3cm; | |
135 | fHmpMipCharge1cm = c.fHmpMipCharge1cm; | |
136 | fHmpNumPhots = c.fHmpNumPhots; | |
137 | fHmpTrkFlags = c.fHmpTrkFlags; | |
740b6bde | 138 | fN1 = c.fN1; |
139 | fN2 = c.fN2; | |
140 | fPionEff = c.fPionEff; | |
141 | fKaonEff = c.fKaonEff; | |
142 | fProtEff = c.fProtEff; | |
143 | fPionTot = c.fPionTot; | |
144 | fKaonTot = c.fKaonTot; | |
145 | fProtTot = c.fProtTot; | |
146 | fPionNot = c.fPionNot; | |
147 | fKaonNot = c.fKaonNot; | |
148 | fProtNot = c.fProtNot; | |
149 | fPionCon = c.fPionCon; | |
150 | fKaonCon = c.fKaonCon; | |
151 | fProtCon = c.fProtCon; | |
152 | fThetavsPiFromK = c.fThetavsPiFromK; | |
153 | fThetapivsPesd = c.fThetapivsPesd; | |
154 | fThetaKvsPesd = c.fThetaKvsPesd; | |
155 | fThetaPvsPesd = c.fThetaPvsPesd; | |
dcb23f7e | 156 | } |
157 | return *this; | |
740b6bde | 158 | } |
dcb23f7e | 159 | |
160 | //___________________________________________________________________________ | |
161 | AliHMPIDAnalysisTask::AliHMPIDAnalysisTask(const AliHMPIDAnalysisTask& c) : | |
162 | AliAnalysisTaskSE(c), | |
163 | fESD(c.fESD),fHmpHistList(c.fHmpHistList), fNevts(c.fNevts), | |
164 | fTrigNevts(c.fTrigNevts), | |
165 | fTrigger(c.fTrigger), | |
166 | fHmpPesdPhmp(c.fHmpPesdPhmp),fHmpCkovPesd(c.fHmpCkovPesd),fHmpCkovPhmp(c.fHmpCkovPhmp), | |
740b6bde | 167 | fHmpMipTrkDist(c.fHmpMipTrkDist),fHmpMipTrkDistX(c.fHmpMipTrkDistX),fHmpMipTrkDistY(c.fHmpMipTrkDistY), |
168 | fHmpMipCharge3cm(c.fHmpMipCharge3cm), fHmpMipCharge1cm(c.fHmpMipCharge1cm), | |
169 | fHmpNumPhots(c.fHmpNumPhots), fHmpTrkFlags(c.fHmpTrkFlags), | |
170 | fN1(c.fN1), | |
171 | fN2(c.fN2), | |
172 | fPionEff(c.fPionEff), | |
173 | fKaonEff(c.fKaonEff), | |
174 | fProtEff(c.fProtEff), | |
175 | fPionTot(c.fPionTot), | |
176 | fKaonTot(c.fKaonTot), | |
177 | fProtTot(c.fProtTot), | |
178 | fPionNot(c.fPionNot), | |
179 | fKaonNot(c.fKaonNot), | |
180 | fProtNot(c.fProtNot), | |
181 | fPionCon(c.fPionCon), | |
182 | fKaonCon(c.fKaonCon), | |
183 | fProtCon(c.fProtCon), | |
184 | fThetavsPiFromK(c.fThetavsPiFromK), | |
185 | fThetapivsPesd(c.fThetapivsPesd), | |
186 | fThetaKvsPesd(c.fThetaKvsPesd), | |
187 | fThetaPvsPesd(c.fThetaPvsPesd) | |
dcb23f7e | 188 | { |
189 | // | |
190 | // Copy Constructor | |
191 | // | |
192 | } | |
193 | ||
9a8aafa5 | 194 | //___________________________________________________________________________ |
195 | AliHMPIDAnalysisTask::~AliHMPIDAnalysisTask() { | |
196 | // | |
197 | //destructor | |
198 | // | |
740b6bde | 199 | Info("~AliHMPIDAnalysisTask","Calling Destructor"); |
38b8c336 | 200 | if (fHmpHistList) {fHmpHistList->Clear(); delete fHmpHistList;} |
9a8aafa5 | 201 | } |
740b6bde | 202 | |
38b8c336 | 203 | //___________________________________________________________________________ |
740b6bde | 204 | void AliHMPIDAnalysisTask::ConnectInputData(Option_t *) |
38b8c336 | 205 | { |
206 | // Connect ESD here | |
740b6bde | 207 | |
38b8c336 | 208 | AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()); |
209 | if (!esdH) { | |
740b6bde | 210 | AliDebug(2,Form("ERROR: Could not get ESDInputHandler")); |
38b8c336 | 211 | } else |
212 | fESD = esdH->GetEvent(); | |
740b6bde | 213 | |
214 | // Connect MC | |
215 | ||
216 | AliMCEventHandler *mcH = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler()); | |
217 | if (!mcH) { | |
218 | AliDebug(2,Form("ERROR: Could not get MCEventHandler")); | |
219 | } else | |
220 | fMC = mcH->MCEvent(); | |
221 | } | |
222 | ||
9a8aafa5 | 223 | //_________________________________________________ |
38b8c336 | 224 | void AliHMPIDAnalysisTask::Exec(Option_t *) |
9a8aafa5 | 225 | { |
740b6bde | 226 | AliStack* pStack = fMC->Stack(); |
227 | Int_t label; | |
228 | Double_t priors[5]={1.,1.,1.,1.,1.}; //{0.01,0.01,0.83,0.10,0.5}; | |
229 | Double_t probs[5]; | |
230 | AliPID *pPid = new AliPID(); | |
231 | pPid->SetPriors(priors); | |
232 | Double_t n = 1.293; | |
233 | Double_t dGeVMass[] = {0.000511,0.105658,0.13957018,0.493677,0.938272}; | |
234 | ||
235 | AliESDtrack *track=0; | |
236 | TParticle *pPart=0; | |
9a8aafa5 | 237 | // |
238 | // Main loop function, executed on Event basis | |
239 | // | |
9a8aafa5 | 240 | for (Int_t iTrack = 0; iTrack<fESD->GetNumberOfTracks(); iTrack++) { |
241 | ||
740b6bde | 242 | track = fESD->GetTrack(iTrack); |
9a8aafa5 | 243 | if(!track) continue; |
740b6bde | 244 | Double_t dPtr = track->P(); |
9a8aafa5 | 245 | Double_t rin[3], rout[3]; |
246 | track->GetInnerXYZ(rin); | |
247 | track->GetOuterXYZ(rout); | |
740b6bde | 248 | Double_t ktol = 0.001; |
249 | ||
250 | if(Equal(track->GetHMPIDsignal(),-20.,ktol)) fHmpTrkFlags->Fill(0); | |
251 | else if(Equal(track->GetHMPIDsignal(),-9.,ktol)) fHmpTrkFlags->Fill(1); | |
252 | else if(Equal(track->GetHMPIDsignal(),-5.,ktol)) fHmpTrkFlags->Fill(2); | |
253 | else if(Equal(track->GetHMPIDsignal(),-11.,ktol)) fHmpTrkFlags->Fill(3); | |
254 | else if(Equal(track->GetHMPIDsignal(),-22.,ktol)) fHmpTrkFlags->Fill(4); | |
255 | else fHmpTrkFlags->Fill(4); | |
256 | ||
dcb23f7e | 257 | if(Equal(track->GetHMPIDsignal(),-20.,ktol)) continue; |
38b8c336 | 258 | if(track->GetHMPIDcluIdx() < 0) continue; |
740b6bde | 259 | |
260 | //Int_t ch = track->GetHMPIDcluIdx()/1000000; | |
261 | Int_t q, nph; | |
262 | Float_t x, y; | |
9a8aafa5 | 263 | Float_t xpc, ypc, th, ph; |
38b8c336 | 264 | track->GetHMPIDmip(x,y,q,nph); |
265 | track->GetHMPIDtrk(xpc,ypc,th,ph); | |
740b6bde | 266 | |
dcb23f7e | 267 | if(Equal(x,0.,ktol) && Equal(y,0.,ktol) && Equal(xpc,0.,ktol) && Equal(ypc,0.,ktol)) continue; |
740b6bde | 268 | |
9a8aafa5 | 269 | Double_t dist = TMath::Sqrt( (xpc-x)*(xpc-x) + (ypc - y)*(ypc - y)); |
38b8c336 | 270 | fHmpMipTrkDist->Fill(dist); |
740b6bde | 271 | fHmpMipTrkDistX->Fill(xpc - x); |
38b8c336 | 272 | fHmpMipTrkDistY->Fill(ypc - y); |
740b6bde | 273 | Double_t pHmp[3] = {0}, pHmp3 = 0; |
274 | if (track->GetOuterHmpPxPyPz(pHmp)) pHmp3 = TMath::Sqrt(pHmp[0]*pHmp[0]+pHmp[1]*pHmp[1]+pHmp[2]*pHmp[2]); | |
275 | if (dist <= 3.0) fHmpMipCharge3cm->Fill(q); | |
276 | ||
277 | Float_t thetaTheorPion = 999., thetaTheorKaon = 999., thetaTheorProt = 999., | |
278 | thetaHmpTheorPion = 999., thetaHmpTheorKaon = 999., thetaHmpTheorProt = 999.; | |
279 | if(dPtr != 0){ | |
280 | thetaTheorPion = TMath::ACos(TMath::Sqrt(dPtr*dPtr + dGeVMass[2]*dGeVMass[2])/(n*dPtr)); | |
281 | thetaTheorKaon = TMath::ACos(TMath::Sqrt(dPtr*dPtr + dGeVMass[3]*dGeVMass[3])/(n*dPtr)); | |
282 | thetaTheorProt = TMath::ACos(TMath::Sqrt(dPtr*dPtr + dGeVMass[4]*dGeVMass[4])/(n*dPtr)); | |
283 | } | |
284 | if(pHmp3 != 0){ | |
285 | thetaHmpTheorPion = TMath::ACos(TMath::Sqrt(pHmp3*pHmp3 + dGeVMass[2]*dGeVMass[2])/(n*pHmp3)); | |
286 | thetaHmpTheorKaon = TMath::ACos(TMath::Sqrt(pHmp3*pHmp3 + dGeVMass[3]*dGeVMass[3])/(n*pHmp3)); | |
287 | thetaHmpTheorProt = TMath::ACos(TMath::Sqrt(pHmp3*pHmp3 + dGeVMass[4]*dGeVMass[4])/(n*pHmp3)); | |
288 | } | |
289 | ||
290 | track->GetHMPIDpid(probs); | |
291 | pPid->SetProbabilities(probs); | |
292 | if ((label = track->GetLabel()) < 0) continue; | |
293 | pPart = pStack->Particle(label); | |
294 | ||
295 | ||
38b8c336 | 296 | if(track->GetHMPIDsignal() > 0 ) |
297 | { | |
740b6bde | 298 | fHmpPesdPhmp->Fill(track->P(),pHmp3); |
299 | if (dist<=1.0) fHmpMipCharge1cm->Fill(q); | |
38b8c336 | 300 | fHmpNumPhots->Fill(nph); |
301 | fHmpCkovPesd->Fill(track->P(),track->GetHMPIDsignal()); | |
740b6bde | 302 | fHmpCkovPhmp->Fill(pHmp3,track->GetHMPIDsignal()); |
303 | ||
304 | if (!pStack->IsPhysicalPrimary(label)) continue; | |
305 | Int_t pdgCode = TMath::Abs(pPart->GetPdgCode()); | |
306 | if (pdgCode==211){ | |
307 | fThetapivsPesd->Fill(track->P(),track->GetHMPIDsignal()); | |
308 | Int_t mot=pPart->GetFirstMother(); | |
309 | if (mot > -1){ | |
310 | TParticle *pMot=pStack->Particle(mot); | |
311 | TString str=pMot->GetName(); | |
312 | if (str.Contains("K")) fThetavsPiFromK->Fill(pHmp3,track->GetHMPIDsignal()); | |
313 | } | |
314 | } | |
315 | if (pdgCode==321) fThetaKvsPesd->Fill(track->P(),track->GetHMPIDsignal()); | |
316 | if (pdgCode==2212) fThetaPvsPesd->Fill(track->P(),track->GetHMPIDsignal()); | |
317 | ||
318 | if (track->Pt()<1. || track->Pt()>5.) continue; | |
319 | Int_t ptBin=(Int_t) (2*(track->Pt()-1)); | |
320 | if (pdgCode!=2212) fProtCon->Fill(ptBin); | |
321 | if (pdgCode==2212){ | |
322 | fProtTot->Fill(ptBin); | |
323 | fProtEff->Fill(ptBin,pPid->GetProbability(AliPID::kProton)); | |
324 | fPionNot->Fill(ptBin,pPid->GetProbability(AliPID::kPion)); | |
325 | fKaonNot->Fill(ptBin,pPid->GetProbability(AliPID::kKaon)); | |
326 | } | |
327 | if (pdgCode!=211) fPionCon->Fill(ptBin); | |
328 | if (pdgCode!=321) fKaonCon->Fill(ptBin); | |
329 | if (pdgCode==211){ | |
330 | if (ptBin < 6){ | |
331 | Float_t weight=pPid->GetProbability(AliPID::kElectron)+ | |
332 | pPid->GetProbability(AliPID::kMuon)+ | |
333 | pPid->GetProbability(AliPID::kPion); | |
334 | fPionTot->Fill(ptBin); | |
335 | fPionEff->Fill(ptBin,weight); | |
336 | fKaonNot->Fill(ptBin,pPid->GetProbability(AliPID::kKaon)); | |
337 | } | |
338 | fProtNot->Fill(ptBin,pPid->GetProbability(AliPID::kProton)); | |
339 | } | |
340 | if (pdgCode==321){ | |
341 | if (ptBin < 6){ | |
342 | fKaonTot->Fill(ptBin); | |
343 | fKaonEff->Fill(ptBin,pPid->GetProbability(AliPID::kKaon)); | |
344 | fPionNot->Fill(ptBin,(pPid->GetProbability(AliPID::kPion))); | |
345 | } | |
346 | fProtNot->Fill(ptBin,(pPid->GetProbability(AliPID::kProton))); | |
347 | } | |
38b8c336 | 348 | }//there is signal |
740b6bde | 349 | }//track loop |
350 | ||
351 | delete pPid; | |
352 | ||
9a8aafa5 | 353 | /* PostData(0) is taken care of by AliAnalysisTaskSE */ |
740b6bde | 354 | PostData(0,fHmpHistList); |
9a8aafa5 | 355 | } |
356 | ||
9a8aafa5 | 357 | //___________________________________________________________________________ |
358 | void AliHMPIDAnalysisTask::Terminate(Option_t*) | |
359 | { | |
360 | // The Terminate() function is the last function to be called during | |
361 | // a query. It always runs on the client, it can be used to present | |
362 | // the results graphically or save the results to file. | |
363 | ||
364 | Info("Terminate",""); | |
740b6bde | 365 | fHmpHistList = dynamic_cast<TList*> (GetOutputData(0)); |
366 | ||
367 | fPionEff = dynamic_cast<TH1F*> (fHmpHistList->FindObject("PionEff")); | |
368 | fPionTot = dynamic_cast<TH1I*> (fHmpHistList->FindObject("PionTot")); | |
369 | fPionNot = dynamic_cast<TH1F*> (fHmpHistList->FindObject("PionNot")); | |
370 | fPionCon = dynamic_cast<TH1I*> (fHmpHistList->FindObject("PionCon")); | |
371 | fKaonEff = dynamic_cast<TH1F*> (fHmpHistList->FindObject("KaonEff")); | |
372 | fKaonTot = dynamic_cast<TH1I*> (fHmpHistList->FindObject("KaonTot")); | |
373 | fKaonNot = dynamic_cast<TH1F*> (fHmpHistList->FindObject("KaonNot")); | |
374 | fKaonCon = dynamic_cast<TH1I*> (fHmpHistList->FindObject("KaonCon")); | |
375 | fProtEff = dynamic_cast<TH1F*> (fHmpHistList->FindObject("ProtEff")); | |
376 | fProtTot = dynamic_cast<TH1I*> (fHmpHistList->FindObject("ProtTot")); | |
377 | fProtNot = dynamic_cast<TH1F*> (fHmpHistList->FindObject("ProtNot")); | |
378 | fProtCon = dynamic_cast<TH1I*> (fHmpHistList->FindObject("ProtCon")); | |
379 | ||
380 | Float_t *pionEff=fPionEff->GetArray(); | |
381 | Int_t *pionTot=fPionTot->GetArray(); | |
382 | Float_t *pionNot=fPionNot->GetArray(); | |
383 | Int_t *pionCon=fPionCon->GetArray(); | |
384 | Float_t *kaonEff=fKaonEff->GetArray(); | |
385 | Int_t *kaonTot=fKaonTot->GetArray(); | |
386 | Float_t *kaonNot=fKaonNot->GetArray(); | |
387 | Int_t *kaonCon=fKaonCon->GetArray(); | |
388 | Float_t *protEff=fProtEff->GetArray(); | |
389 | Int_t *protTot=fProtTot->GetArray(); | |
390 | Float_t *protNot=fProtNot->GetArray(); | |
391 | Int_t *protCon=fProtCon->GetArray(); | |
392 | ||
393 | TGraphErrors *effPi = new TGraphErrors(fN1); | |
394 | TGraphErrors *effKa = new TGraphErrors(fN1); | |
395 | TGraphErrors *effPr = new TGraphErrors(fN2); | |
396 | TGraphErrors *conPi = new TGraphErrors(fN1); | |
397 | TGraphErrors *conKa = new TGraphErrors(fN1); | |
398 | TGraphErrors *conPr = new TGraphErrors(fN2); | |
399 | ||
400 | Float_t pt[8]={1.25,1.75,2.25,2.75,3.25,3.75,4.25,4.75}; | |
401 | Float_t eff=0, effErr=0, con=0, conErr=0; | |
402 | for (Int_t i=0; i< fN2; i++){ | |
403 | eff = protEff[i+1]/TMath::Max(protTot[i+1],1); | |
404 | effErr = TMath::Sqrt(eff*(1.-eff)/TMath::Max(protTot[i+1],1)); | |
405 | con = protNot[i+1]/TMath::Max(protCon[i+1],1); | |
406 | conErr = TMath::Sqrt(con*(1.-con)/protCon[i+1]); | |
407 | effPr->SetPoint(i,pt[i],eff); | |
408 | effPr->SetPointError(i,0,effErr); | |
409 | conPr->SetPoint(i,pt[i],con); | |
410 | conPr->SetPointError(i,0,conErr); | |
411 | ||
412 | if (i>=fN1) continue; | |
413 | eff = pionEff[i+1]/pionTot[i+1]; | |
414 | effErr = TMath::Sqrt(eff*(1.-eff)/pionTot[i+1]); | |
415 | con=pionNot[i+1]/pionCon[i+1]; | |
416 | conErr = TMath::Sqrt(con*(1.-con)/pionCon[i+1]); | |
417 | effPi->SetPoint(i,pt[i],(Float_t)pionEff[i+1]/(Float_t)pionTot[i+1]); | |
418 | effPi->SetPointError(i,0,effErr); | |
419 | conPi->SetPoint(i,pt[i],(Float_t)pionNot[i+1]/(Float_t)pionCon[i+1]); | |
420 | conPi->SetPointError(i,0,conErr); | |
421 | ||
422 | eff = kaonEff[i+1]/TMath::Max(kaonTot[i+1],1); | |
423 | effErr = TMath::Sqrt(eff*(1.-eff)/kaonTot[i+1]); | |
424 | con = kaonNot[i+1]/TMath::Max(kaonCon[i+1],1); | |
425 | conErr = TMath::Sqrt(con*(1.-con)/kaonCon[i+1]); | |
426 | effKa->SetPoint(i,pt[i],(Float_t)kaonEff[i+1]/TMath::Max(kaonTot[i+1],1)); | |
427 | effKa->SetPointError(i,0,effErr); | |
428 | conKa->SetPoint(i,pt[i],(Float_t)kaonNot[i+1]/TMath::Max(kaonCon[i+1],1)); | |
429 | conKa->SetPointError(i,0,conErr); | |
430 | } | |
431 | ||
432 | TCanvas *pCan=new TCanvas("Hmp","Efficiency and contamination",500,900); | |
433 | pCan->Divide(1,3); | |
434 | ||
435 | pCan->cd(1); | |
436 | effPi->SetTitle("Pions"); | |
437 | effPi->GetXaxis()->SetTitle("p_{T} (GeV/c)"); | |
438 | effPi->GetYaxis()->SetRangeUser(0.,1.); | |
439 | effPi->SetMarkerStyle(20); | |
440 | effPi->Draw("ALP"); | |
441 | conPi->SetMarkerStyle(21); | |
442 | conPi->Draw("sameLP"); | |
443 | ||
444 | pCan->cd(2); | |
445 | effKa->SetTitle("Kaons"); | |
446 | effKa->GetXaxis()->SetTitle("p_{T} (GeV/c)"); | |
447 | effKa->GetYaxis()->SetRangeUser(0.,1.); | |
448 | effKa->SetMarkerStyle(20); | |
449 | effKa->Draw("ALP"); | |
450 | conKa->SetMarkerStyle(21); | |
451 | conKa->Draw("sameLP"); | |
452 | ||
453 | pCan->cd(3); | |
454 | effPr->SetTitle("Protons"); | |
455 | effPr->GetXaxis()->SetTitle("p_{T} (GeV/c)"); | |
456 | effPr->GetYaxis()->SetRangeUser(0.,1.); | |
457 | effPr->SetMarkerStyle(20); | |
458 | effPr->Draw("ALP"); | |
459 | conPr->SetMarkerStyle(21); | |
460 | conPr->Draw("sameLP"); | |
461 | ||
462 | TFile *outFile = new TFile("HmpidGraphs.root","recreate"); | |
463 | pCan->Write(); | |
464 | outFile->Close(); | |
465 | ||
9a8aafa5 | 466 | AliAnalysisTaskSE::Terminate(); |
467 | ||
468 | } | |
469 | ||
9a8aafa5 | 470 | //___________________________________________________________________________ |
38b8c336 | 471 | void AliHMPIDAnalysisTask::CreateOutputObjects() { |
9a8aafa5 | 472 | // |
473 | //HERE ONE CAN CREATE OUTPUT OBJECTS | |
474 | //TO BE SET BEFORE THE EXECUTION OF THE TASK | |
475 | // | |
9a8aafa5 | 476 | |
477 | //slot #1 | |
38b8c336 | 478 | OpenFile(0); |
479 | fHmpHistList = new TList(); | |
740b6bde | 480 | |
38b8c336 | 481 | fHmpPesdPhmp = new TH2F("fHmpPesdPhmp","HMPID: ESD p - running p;HMP p (GeV/c);ESD p (Gev/c)",100,0,10,100,0,10); |
482 | fHmpHistList->Add(fHmpPesdPhmp); | |
740b6bde | 483 | |
38b8c336 | 484 | fHmpCkovPesd = new TH2F("fHmpCkovPesd","HMPID: ThetaCherenkov vs P;p_esd (GeV/c);#Theta_C;Entries",100,0,10,110,0,1.1); |
485 | fHmpHistList->Add(fHmpCkovPesd); | |
740b6bde | 486 | |
38b8c336 | 487 | fHmpCkovPhmp = new TH2F("fHmpCkovPhmp","HMPID: ThetaCherenkov vs P;p_hmp (GeV/c);#Theta_C;Entries",100,0,10,110,0,1.1); |
740b6bde | 488 | fHmpHistList->Add(fHmpCkovPhmp); |
489 | ||
38b8c336 | 490 | fHmpMipTrkDist = new TH1F("fHmpMipTrkDist","HMPID MIP-Track distance;distance (cm);Entries",800,-20,20); |
491 | fHmpHistList->Add(fHmpMipTrkDist); | |
740b6bde | 492 | |
38b8c336 | 493 | fHmpMipTrkDistX = new TH1F("fHmpMipTrkDistX","HMPID MIP-Track distance in local X;distance (cm);Entries",800,-20,20); |
494 | fHmpHistList->Add(fHmpMipTrkDistX); | |
740b6bde | 495 | |
38b8c336 | 496 | fHmpMipTrkDistY = new TH1F("fHmpMipTrkDistY","HMPID MIP-Track distance in local Y;distance (cm);Entries",800,-20,20); |
497 | fHmpHistList->Add(fHmpMipTrkDistY); | |
740b6bde | 498 | |
38b8c336 | 499 | fHmpMipCharge3cm = new TH1F("fHmpMipCharge3cm","HMPID MIP Charge;MIP Charge (ADC);Entries",5001,-0.5,5000.5); |
500 | fHmpHistList->Add(fHmpMipCharge3cm); | |
740b6bde | 501 | |
38b8c336 | 502 | fHmpMipCharge1cm = new TH1F("fHmpMipCharge1cm","HMPID MIP Charge;MIP Charge (ADC);Entries",5001,-0.5,5000.5); |
503 | fHmpHistList->Add(fHmpMipCharge1cm); | |
740b6bde | 504 | |
38b8c336 | 505 | fHmpNumPhots = new TH1F("fHmpNumPhots","HMPID Number of photon clusters on ring;#photon clus.;Entries",51,-0.5,50.5); |
506 | fHmpHistList->Add(fHmpNumPhots); | |
740b6bde | 507 | |
38b8c336 | 508 | fHmpTrkFlags = new TH1F("fHmpTrkFlags","HMPID track flags",6,0,6); |
509 | TString summary[6] = {"NotPerformed","MipDistCut", "MipQdcCut", "NoPhotAccept", "kNoRad", "other"}; | |
510 | for(Int_t ibin = 0; ibin < 6; ibin++) fHmpTrkFlags->GetXaxis()->SetBinLabel(ibin+1,Form("%i %s",ibin+1,summary[ibin].Data())); | |
511 | fHmpHistList->Add(fHmpTrkFlags); | |
740b6bde | 512 | |
513 | fPionEff = new TH1F("PionEff","Identified pions",fN1,0,fN1); | |
514 | fKaonEff = new TH1F("KaonEff","Identified kaons",fN1,0,fN1); | |
515 | fProtEff = new TH1F("ProtEff","Identified protons",fN2,0,fN2); | |
516 | fPionTot = new TH1I("PionTot","Total MC pions",fN1,0,fN1); | |
517 | fKaonTot = new TH1I("KaonTot","Total MC kaons",fN1,0,fN1); | |
518 | fProtTot = new TH1I("ProtTot","Total MC protons",fN2,0,fN2); | |
519 | fPionNot = new TH1F("PionNot","Misidentified pions",fN1,0,fN1); | |
520 | fKaonNot = new TH1F("KaonNot","Misidentified kaons",fN1,0,fN1); | |
521 | fProtNot = new TH1F("ProtNot","Misidentified protons",fN2,0,fN2); | |
522 | fPionCon = new TH1I("PionCon","Total not MC pions",fN1,0,fN1); | |
523 | fKaonCon = new TH1I("KaonCon","Total not MC kaons",fN1,0,fN1); | |
524 | fProtCon = new TH1I("ProtCon","Total not MC protons",fN2,0,fN2); | |
525 | ||
526 | fHmpHistList->Add(fPionEff); fHmpHistList->Add(fKaonEff); fHmpHistList->Add(fProtEff); | |
527 | fHmpHistList->Add(fPionTot); fHmpHistList->Add(fKaonTot); fHmpHistList->Add(fProtTot); | |
528 | fHmpHistList->Add(fPionNot); fHmpHistList->Add(fKaonNot); fHmpHistList->Add(fProtNot); | |
529 | fHmpHistList->Add(fPionCon); fHmpHistList->Add(fKaonCon); fHmpHistList->Add(fProtCon); | |
530 | ||
531 | fThetavsPiFromK= new TH2F("ThetavsPiFromK","Theta vs p of pions from K;p_esd (GeV/c);#Theta_C",100,0,10,110,0,1.1); | |
532 | fHmpHistList->Add(fThetavsPiFromK); | |
533 | ||
534 | fThetapivsPesd = new TH2F("ThetapivsPesd","Theta of pions vs p of esd;p_esd (GeV/c);#Theta_C",100,0,10,110,0,1.1); | |
535 | fHmpHistList->Add(fThetapivsPesd); | |
536 | ||
537 | fThetaKvsPesd = new TH2F("ThetaKvsPesd","Theta of kaons vs p of esd;p_esd (GeV/c);#Theta_C",100,0,10,110,0,1.1); | |
538 | fHmpHistList->Add(fThetaKvsPesd); | |
539 | ||
540 | fThetaPvsPesd = new TH2F("ThetaPvsPesd","Theta of protons vs p of esd;p_esd (GeV/c);#Theta_C",100,0,10,110,0,1.1); | |
541 | fHmpHistList->Add(fThetaPvsPesd); | |
542 | ||
9a8aafa5 | 543 | } |
dcb23f7e | 544 | //____________________________________________________________________________________________________________________________________ |
545 | Bool_t AliHMPIDAnalysisTask::Equal(Double_t x, Double_t y, Double_t tolerance) | |
546 | { | |
740b6bde | 547 | return abs(x - y) <= tolerance ; |
548 | } | |
dcb23f7e | 549 | |
9a8aafa5 | 550 | #endif |