]>
Commit | Line | Data |
---|---|---|
fb5b189b | 1 | // $Id$ |
2 | //************************************************************************** | |
3 | //* This file is property of and copyright by the ALICE HLT Project * | |
4 | //* ALICE Experiment at CERN, All rights reserved. * | |
5 | //* * | |
6 | //* Primary Authors: Zhongbao Yin <zbyin@mail.ccnu.edu.cn>, * | |
7 | //* Kalliopi Kanaki <Kalliopi.Kanaki@ift.uib.no> * | |
8 | //* for The ALICE HLT Project. * | |
9 | //* * | |
10 | //* Permission to use, copy, modify and distribute this software and its * | |
11 | //* documentation strictly for non-commercial purposes is hereby granted * | |
12 | //* without fee, provided that the above copyright notice appears in all * | |
13 | //* copies and that both the copyright notice and this permission notice * | |
14 | //* appear in the supporting documentation. The authors make no claims * | |
15 | //* about the suitability of this software for any purpose. It is * | |
16 | //* provided "as is" without express or implied warranty. * | |
17 | //************************************************************************** | |
18 | ||
19 | ||
20 | /** @file AliAnalysisTaskHLT.cxx | |
21 | @author Kalliopi Kanaki, Hege Erdal | |
22 | @date | |
23 | @brief An analysis task containing | |
24 | loops over HLT and offline ESD trees for comparing | |
25 | AliESDtrack properties. | |
26 | */ | |
27 | ||
28 | //#include <iostream> | |
29 | ||
30 | class AliAnalysisTask; | |
31 | class AliAnalysisManager; | |
32 | ||
33 | #include "TH1F.h" | |
34 | #include "TH2F.h" | |
e9fe1336 | 35 | #include "TCanvas.h" |
36 | #include "TLegend.h" | |
37 | #include "TStyle.h" | |
fb5b189b | 38 | #include "TString.h" |
39 | #include "AliESDEvent.h" | |
e9fe1336 | 40 | #include "AliESDtrackCuts.h" |
fb5b189b | 41 | #include "AliESDInputHandler.h" |
42 | ||
43 | #include "AliAnalysisTaskHLT.h" | |
44 | ||
45 | ClassImp(AliAnalysisTaskHLT) | |
46 | ||
47 | //====================================================================================================== | |
48 | ||
49 | AliAnalysisTaskHLT::AliAnalysisTaskHLT() | |
50 | : | |
51 | AliAnalysisTaskSE() | |
52 | ,fOutputList(0) | |
53 | ,fHistTrigger(0) | |
54 | ,fHistHLTTrigger(0) | |
55 | ,fMomentumOff(0) | |
56 | ,fDCAOff(0) | |
57 | ,fNclusterOff(0) | |
58 | ,fdEdxOff(0) | |
59 | ,fdEdxVSPOff(0) | |
60 | ,fPhiOff(0) | |
61 | ,fThetaOff(0) | |
62 | ,fMultOff(0) | |
63 | ,fXYvertexOff(0) | |
64 | ,fXvertexOff(0) | |
65 | ,fYvertexOff(0) | |
66 | ,fZvertexOff(0) | |
67 | ,fEtaOff(0) | |
68 | ,fEtaDCAcutOff(0) | |
69 | ,fNclusVSphiOff(0) | |
70 | ,fNclusVSthetaOff(0) | |
71 | ,fStatusOff(0) | |
72 | ,fStatusOff_Ocl(0) | |
73 | ||
74 | ,fMomentumHLT(0) | |
75 | ,fDCAHLT(0) | |
76 | ,fNclusterHLT(0) | |
77 | ,fdEdxHLT(0) | |
78 | ,fdEdxVSPHLT(0) | |
79 | ,fPhiHLT(0) | |
80 | ,fThetaHLT(0) | |
81 | ,fMultHLT(0) | |
82 | ,fXYvertexHLT(0) | |
83 | ,fXvertexHLT(0) | |
84 | ,fYvertexHLT(0) | |
85 | ,fZvertexHLT(0) | |
86 | ,fEtaHLT(0) | |
87 | ,fEtaDCAcutHLT(0) | |
88 | ,fNclusVSphiHLT(0) | |
89 | ,fNclusVSthetaHLT(0) | |
90 | ,fStatusHLT(0) | |
91 | ,fStatusHLT_Ocl(0) | |
92 | ||
93 | // ,fDCAOff_trig(0) | |
94 | // ,fNclusterOff_trig(0) | |
95 | // | |
96 | // ,fDCAHLT_trig(0) | |
97 | // ,fNclusterHLT_trig(0) | |
98 | ||
99 | { | |
100 | // Constructor | |
101 | // Define input and output slots here | |
102 | // Input slot #0 works with a TChain | |
103 | // DefineInput(0, TChain::Class()); | |
104 | // Output slot #0 writes into a TH1 container | |
105 | ||
106 | DefineOutput(1, TList::Class()); | |
107 | } | |
108 | ||
109 | AliAnalysisTaskHLT::AliAnalysisTaskHLT(const char *name) | |
110 | : | |
111 | AliAnalysisTaskSE(name) | |
112 | ,fOutputList(0) | |
113 | ,fHistTrigger(0) | |
114 | ,fHistHLTTrigger(0) | |
115 | ,fMomentumOff(0) | |
116 | ,fDCAOff(0) | |
117 | ,fNclusterOff(0) | |
118 | ,fdEdxOff(0) | |
119 | ,fdEdxVSPOff(0) | |
120 | ,fPhiOff(0) | |
121 | ,fThetaOff(0) | |
122 | ,fMultOff(0) | |
123 | ,fXYvertexOff(0) | |
124 | ,fXvertexOff(0) | |
125 | ,fYvertexOff(0) | |
126 | ,fZvertexOff(0) | |
127 | ,fEtaOff(0) | |
128 | ,fEtaDCAcutOff(0) | |
129 | ,fNclusVSphiOff(0) | |
130 | ,fNclusVSthetaOff(0) | |
131 | ,fStatusOff(0) | |
132 | ,fStatusOff_Ocl(0) | |
133 | ||
134 | ,fMomentumHLT(0) | |
135 | ,fDCAHLT(0) | |
136 | ,fNclusterHLT(0) | |
137 | ,fdEdxHLT(0) | |
138 | ,fdEdxVSPHLT(0) | |
139 | ,fPhiHLT(0) | |
140 | ,fThetaHLT(0) | |
141 | ,fMultHLT(0) | |
142 | ,fXYvertexHLT(0) | |
143 | ,fXvertexHLT(0) | |
144 | ,fYvertexHLT(0) | |
145 | ,fZvertexHLT(0) | |
146 | ,fEtaHLT(0) | |
147 | ,fEtaDCAcutHLT(0) | |
148 | ,fNclusVSphiHLT(0) | |
149 | ,fNclusVSthetaHLT(0) | |
150 | ,fStatusHLT(0) | |
151 | ,fStatusHLT_Ocl(0) | |
152 | // ,fDCAOff_trig(0) | |
153 | // ,fNclusterOff_trig(0) | |
154 | // | |
155 | // ,fDCAHLT_trig(0) | |
156 | // ,fNclusterHLT_trig(0) | |
157 | ||
158 | { | |
159 | // Constructor | |
160 | ||
161 | // Define input and output slots here | |
162 | // Input slot #0 works with a TChain | |
163 | // DefineInput(0, TChain::Class()); | |
164 | // Output slot #0 writes into a TH1 container | |
165 | ||
166 | DefineOutput(1, TList::Class()); | |
167 | } | |
168 | ||
169 | // const Float_t AliAnalysisTaskHLT::fgkEtaMin = -0.12; | |
170 | // const Float_t AliAnalysisTaskHLT::fgkEtaMax = 0.12; | |
171 | // const Float_t AliAnalysisTaskHLT::fgkPhiMin[5] = {3.83972, 4.18879, 4.53786, 4.88692, 5.23599}; | |
172 | // const Float_t AliAnalysisTaskHLT::fgkPhiMax[5] = {4.18879, 4.53786, 4.88692, 5.23599, 5.58505}; | |
173 | // const Float_t AliAnalysisTaskHLT::fgkNormX[5] = {-0.642788, -0.34202, 0, 0.34202, 0.642788}; | |
174 | // const Float_t AliAnalysisTaskHLT::fgkNormY[5] = {-0.766044, -0.939693, -1, -0.939693, -0.766044}; | |
175 | // const Float_t AliAnalysisTaskHLT::fgkInitPosX[5] = {-295.682, -157.329, 0, 157.329, 295.682}; | |
176 | // const Float_t AliAnalysisTaskHLT::fgkInitPosY[5] = {-352.38, -432.259, -460, -432.259, -352.38}; | |
177 | ||
178 | //---------------------------------------------------------------------------------------------------- | |
179 | ||
180 | void AliAnalysisTaskHLT::UserCreateOutputObjects(){ | |
181 | // Create histograms | |
182 | ||
183 | OpenFile(1); | |
184 | ||
185 | fOutputList = new TList(); | |
186 | fOutputList->SetName(GetName()); | |
187 | ||
188 | /* | |
189 | //0 mistriggered, 1 Good triggered, 2, triggered, 3 fake trigger, | |
190 | //4 events with offline track, 5 total events processed, | |
191 | //6 offline track thru CE, 7 online track to CE | |
192 | fHistTrigger = new TH1F("fHistTrigger", "Trigger Status", 8, -0.5, 7.5); | |
193 | fHistTrigger->GetXaxis()->SetTitle(""); | |
194 | fHistTrigger->GetYaxis()->SetTitle("Events"); | |
195 | fHistTrigger->SetMarkerStyle(kFullCircle); | |
196 | fHistTrigger->SetStats(0); | |
197 | fHistTrigger->SetFillColor(2); | |
198 | //fHistTrigger->SetDrawOption("B TEXT60"); | |
199 | ||
200 | //Set bin labels | |
201 | (fHistTrigger->GetXaxis())->SetBinLabel(1,"missed"); | |
202 | (fHistTrigger->GetXaxis())->SetBinLabel(2,"triggerWofflTrk"); | |
203 | (fHistTrigger->GetXaxis())->SetBinLabel(3,"triggered"); | |
204 | (fHistTrigger->GetXaxis())->SetBinLabel(4,"triggerWOofflTrk"); | |
205 | (fHistTrigger->GetXaxis())->SetBinLabel(5,"NevWofflTrk"); | |
206 | (fHistTrigger->GetXaxis())->SetBinLabel(6,"Nevt"); | |
207 | (fHistTrigger->GetXaxis())->SetBinLabel(7,"offlTrkThruCE"); | |
208 | (fHistTrigger->GetXaxis())->SetBinLabel(8,"onlTrkThruCE"); | |
209 | */ | |
210 | ||
211 | fHistTrigger = new TH1F("fHistTrigger", "CTP trigger counter", 64, 0, 64); | |
212 | fHistTrigger->GetXaxis()->SetTitle(""); | |
213 | fHistTrigger->GetYaxis()->SetTitle("#Events"); | |
214 | ||
215 | fHistHLTTrigger = new TH1F("fHistHLTTrigger", "HLT CTP trigger counter", 64, 0, 64); | |
216 | fHistHLTTrigger->GetXaxis()->SetTitle(""); | |
217 | fHistHLTTrigger->GetYaxis()->SetTitle("#Events"); | |
218 | ||
219 | ||
e9fe1336 | 220 | fMomentumOff = new TH1F("fMomentum_off", "momentum (offline)",1000, 0., 100); |
221 | fMomentumHLT = new TH1F("fMomentum_hlt", "momentum (HLT)", 1000, 0., 100); | |
fb5b189b | 222 | |
223 | fDCAOff = new TH1F("fDCA_off","DCA to beam line (offline)",200, -100, 100); | |
224 | fDCAHLT = new TH1F("fDCA_hlt","DCA to beam line (HLT)", 200, -100, 100); | |
225 | ||
226 | fNclusterOff = new TH1F("fNcluster_off","clusters per track (offline)", 200, 0, 200); | |
227 | fNclusterHLT = new TH1F("fNcluster_hlt","clusters per track (HLT)", 200, 0, 200); | |
228 | ||
229 | fdEdxOff = new TH1F("fdEdx_off","energy loss (offline)", 500, 0, 500); | |
230 | fdEdxHLT = new TH1F("fdEdx_hlt","energy loss (HLT) - not filled yet",500, 0, 500); | |
231 | ||
232 | fdEdxVSPOff = new TH2F("fdEdx_vs_P_off","dE/dx vs. momentum (offline)", 300, 0., 3., 500, 0., 500.); | |
233 | fdEdxVSPHLT = new TH2F("fdEdx_vs_P_hlt","dE/dx vs. momentum (HLT) - not filled yet",300, 0., 3., 500, 0., 500.); | |
234 | ||
e9fe1336 | 235 | fPhiOff = new TH1F("fPhi_off","azimuthal angle distribution (offline)",90,0,360); |
236 | fPhiHLT = new TH1F("fPhi_hlt","azimuthal angle distribution (HLT)", 90,0,360); | |
fb5b189b | 237 | |
238 | fThetaOff = new TH1F("fTheta_off","polar angle distribution (offline)",180,0,180); | |
239 | fThetaHLT = new TH1F("fTheta_hlt","polar angle distribution (HLT)", 180,0,180); | |
240 | ||
241 | fMultOff = new TH1F("fMult_off","track multiplicity (offline)",100,0,100); | |
242 | fMultHLT = new TH1F("fMult_hlt","track multiplicity (HLT)", 100,0,100); | |
243 | ||
244 | fXYvertexOff = new TH2F("fXYvertex_off","XY primary vertex (offline)",100,-5,5,100,-5,5); | |
245 | fXYvertexHLT = new TH2F("fXYvertex_hlt","XY primary vertex (HLT)", 100,-5,5,100,-5,5); | |
246 | ||
e9fe1336 | 247 | fXvertexOff = new TH1F("fXvertex_off","X primary vertex (offline)",1000,-1,1); |
248 | fXvertexHLT = new TH1F("fXvertex_hlt","X primary vertex (HLT)", 1000,-1,1); | |
fb5b189b | 249 | |
e9fe1336 | 250 | fYvertexOff = new TH1F("fYvertex_off","Y primary vertex (offline)",1000,-1,1); |
251 | fYvertexHLT = new TH1F("fYvertex_hlt","Y primary vertex (HLT)", 1000,-1,1); | |
fb5b189b | 252 | |
e9fe1336 | 253 | fZvertexOff = new TH1F("fZvertex_off","Z primary vertex (offline)",250,-30,30); |
254 | fZvertexHLT = new TH1F("fZvertex_hlt","Z primary vertex (HLT)", 250,-30,30); | |
fb5b189b | 255 | |
256 | fEtaOff = new TH1F("fEta_off","pseudorapidity (offline)",100,-3,3); | |
257 | fEtaHLT = new TH1F("fEta_hlt","pseudorapidity (HLT)", 100,-3,3); | |
258 | ||
259 | fEtaDCAcutOff = new TH1F("fEtaDCAcut_off","pseudorapidity DCAcut (offline)",100,-3,3); | |
260 | fEtaDCAcutHLT = new TH1F("fEtaDCAcut_hlt","pseudorapidity DCAcut (HLT)", 100,-3,3); | |
261 | ||
262 | fNclusVSphiOff = new TH2F("fNclus_vs_phi_off","clusters per track vs. #phi (offline)",360,0,360,160,0,160); | |
263 | fNclusVSphiHLT = new TH2F("fNclus_vs_phi_hlt","clusters per track vs. #phi (HLT)", 360,0,360,160,0,160); | |
264 | ||
265 | fNclusVSthetaOff = new TH2F("fNclus_vs_theta_off","clusters per track vs. #theta (offline)",180,0,180,160,0,160); | |
266 | fNclusVSthetaHLT = new TH2F("fNclus_vs_theta_hlt","clusters per track vs. #theta (HLT)", 180,0,180,160,0,160); | |
267 | ||
268 | fStatusOff = new TH1F("fStatus_off", "Status for different detectors (offline)",12, 0, 12); | |
269 | fStatusHLT = new TH1F("fStatus_hlt", "Status for different detectors (HLT)", 12, 0, 12); | |
270 | ||
271 | fStatusOff_Ocl = new TH1F("fStatus_Ocl_off", "Status for different detectors when #TPCcl=0 (offline)",12, 0, 12); | |
272 | fStatusHLT_Ocl = new TH1F("fStatus_Ocl_hlt", "Status for different detectors when #TPCcl=0 (HLT)", 12, 0, 12); | |
273 | ||
274 | //---------------------- add histograms to the output TList ------------------// | |
275 | ||
276 | fOutputList->Add(fHistTrigger); | |
277 | fOutputList->Add(fHistHLTTrigger); | |
278 | ||
279 | ||
280 | fOutputList->Add(fMomentumOff); | |
281 | fOutputList->Add(fDCAOff); | |
282 | fOutputList->Add(fNclusterOff); | |
283 | fOutputList->Add(fdEdxOff); | |
284 | fOutputList->Add(fdEdxVSPOff); | |
285 | fOutputList->Add(fPhiOff); | |
286 | fOutputList->Add(fThetaOff); | |
287 | fOutputList->Add(fMultOff); | |
288 | fOutputList->Add(fXYvertexOff); | |
289 | fOutputList->Add(fXvertexOff); | |
290 | fOutputList->Add(fYvertexOff); | |
291 | fOutputList->Add(fZvertexOff); | |
292 | fOutputList->Add(fEtaOff); | |
293 | fOutputList->Add(fEtaDCAcutOff); | |
294 | fOutputList->Add(fNclusVSphiOff); | |
295 | fOutputList->Add(fNclusVSthetaOff); | |
296 | fOutputList->Add(fStatusOff); | |
297 | fOutputList->Add(fStatusOff_Ocl); | |
298 | ||
299 | fOutputList->Add(fMomentumHLT); | |
300 | fOutputList->Add(fDCAHLT); | |
301 | fOutputList->Add(fNclusterHLT); | |
302 | fOutputList->Add(fdEdxHLT); | |
303 | fOutputList->Add(fdEdxVSPHLT); | |
304 | fOutputList->Add(fPhiHLT); | |
305 | fOutputList->Add(fThetaHLT); | |
306 | fOutputList->Add(fMultHLT); | |
307 | fOutputList->Add(fXYvertexHLT); | |
308 | fOutputList->Add(fXvertexHLT); | |
309 | fOutputList->Add(fYvertexHLT); | |
310 | fOutputList->Add(fZvertexHLT); | |
311 | fOutputList->Add(fEtaHLT); | |
312 | fOutputList->Add(fEtaDCAcutHLT); | |
313 | fOutputList->Add(fNclusVSphiHLT); | |
314 | fOutputList->Add(fNclusVSthetaHLT); | |
315 | fOutputList->Add(fStatusHLT); | |
316 | fOutputList->Add(fStatusHLT_Ocl); | |
317 | } | |
318 | ||
319 | void AliAnalysisTaskHLT::NotifyRun(){ | |
320 | // This will not work if the active trigger classes change from run to run. | |
321 | // Then one has to know all trigger classes before processing the data. | |
322 | ||
323 | AliESDEvent *esdOFF = dynamic_cast<AliESDEvent*>(InputEvent()); | |
324 | TString trgClasses = esdOFF->GetESDRun()->GetActiveTriggerClasses(); | |
325 | ||
326 | fTrgClsArray = trgClasses.Tokenize(" "); | |
327 | ||
328 | for(Int_t i=0; i<fTrgClsArray->GetEntries(); i++){ | |
329 | TString str = ((TObjString *)fTrgClsArray->At(i))->GetString(); | |
330 | (fHistTrigger->GetXaxis())->SetBinLabel(i+1, str.Data()); | |
331 | (fHistHLTTrigger->GetXaxis())->SetBinLabel(i+1, str.Data()); | |
332 | } | |
333 | esdOFF = NULL; | |
334 | ||
335 | TString Statusnames[12]={"kTPCin", | |
336 | "kITSin", | |
337 | "kTPCout", | |
338 | "kITSout", | |
339 | "kITSrefit", | |
340 | "kTPCrefit", | |
341 | "kTRDin", | |
342 | "kTRDout", | |
343 | "kTRDrefit", | |
344 | "kTOFin", | |
345 | "kTOFout", | |
346 | "kTOFrefit"}; | |
347 | ||
348 | for(int iii=0;iii<12;iii++){ | |
349 | (fStatusHLT->GetXaxis())->SetBinLabel(iii+1,Statusnames[iii]); | |
350 | (fStatusOff->GetXaxis())->SetBinLabel(iii+1,Statusnames[iii]); | |
351 | (fStatusHLT_Ocl->GetXaxis())->SetBinLabel(iii+1,Statusnames[iii]); | |
352 | (fStatusOff_Ocl->GetXaxis())->SetBinLabel(iii+1,Statusnames[iii]); | |
353 | } | |
354 | ||
355 | } | |
356 | ||
357 | void AliAnalysisTaskHLT::UserExec(Option_t *){ | |
358 | // see header file of AliAnalysisTask for documentation | |
359 | ||
360 | AliESDEvent *esdOFF = dynamic_cast<AliESDEvent*>(InputEvent()); | |
361 | ||
362 | if(!esdOFF){ | |
363 | Printf("ERROR: fESD not available"); | |
364 | return; | |
365 | } | |
366 | ||
367 | AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*>(fInputHandler); | |
368 | AliESDEvent *esdHLT = NULL; | |
369 | if(esdH) esdHLT = esdH->GetHLTEvent(); | |
370 | ||
371 | if(!esdHLT){ | |
372 | Printf("ERROR: HLTesd not available"); | |
373 | return; | |
374 | } | |
375 | ||
376 | ||
377 | //Fill CTP Trigger stuff | |
378 | //fHistTrigger->Fill(esdOFF->GetTriggerMask()); | |
379 | ||
380 | for(Int_t i=0; i<fTrgClsArray->GetEntries(); i++){ | |
381 | if((esdOFF->GetFiredTriggerClasses()).Contains(((TObjString *)fTrgClsArray->At(i))->GetString()))// && esdOFF->GetEventSpecie()==16) | |
382 | fHistTrigger->Fill(i); | |
383 | } | |
384 | ||
e9fe1336 | 385 | Double_t DCAcut = 7.0; |
386 | Double_t Momcut= 0.3; | |
fb5b189b | 387 | |
388 | char test[50]; | |
e9fe1336 | 389 | sprintf(test,"pseudorapidity (HLT), DCA cut = %f,\n Momentum cut = %f, TPC clusters > 70" , DCAcut, Momcut); |
fb5b189b | 390 | fEtaDCAcutHLT->SetTitle(test); |
e9fe1336 | 391 | sprintf(test,"pseudorapidity (offline), DCA cut = %f, Momentum cut = %f, TPC clusters > 70", DCAcut, Momcut); |
fb5b189b | 392 | fEtaDCAcutOff->SetTitle(test); |
393 | ||
394 | Double_t bfield = esdOFF->GetMagneticField(); | |
395 | ||
fb5b189b | 396 | UInt_t Statusnames[12]={AliESDtrack::kTPCin, |
397 | AliESDtrack::kITSin, | |
398 | AliESDtrack::kTPCout, | |
399 | AliESDtrack::kITSout, | |
400 | AliESDtrack::kITSrefit, | |
401 | AliESDtrack::kTPCrefit, | |
402 | AliESDtrack::kTRDin, | |
403 | AliESDtrack::kTRDout, | |
404 | AliESDtrack::kTRDrefit, | |
405 | AliESDtrack::kTOFin, | |
406 | AliESDtrack::kTOFout, | |
407 | AliESDtrack::kTOFrefit}; | |
408 | ||
e9fe1336 | 409 | |
410 | ||
411 | //---------------- HLT ESD tree -----------------------// | |
412 | ||
413 | ||
414 | if(esdHLT->GetNumberOfTracks()!=0) | |
415 | fMultHLT->Fill( esdHLT->GetNumberOfTracks() ); | |
416 | ||
417 | Double_t vertexHLT[3]; | |
fb5b189b | 418 | |
e9fe1336 | 419 | const AliESDVertex *vertHLT=esdHLT->GetPrimaryVertexTracks(); |
420 | ||
421 | vertexHLT[0] = vertHLT->GetX(); | |
422 | vertexHLT[1] = vertHLT->GetY(); | |
423 | vertexHLT[2] = vertHLT->GetZ(); | |
424 | AliVertex *primVertexHLT = new AliVertex(vertexHLT, 0., 0); | |
425 | ||
426 | if(vertHLT->GetZ()!=0){ | |
427 | fXYvertexHLT->Fill(vertHLT->GetX(), vertHLT->GetY() ); | |
428 | fXvertexHLT->Fill( vertHLT->GetX() ); | |
429 | fYvertexHLT->Fill( vertHLT->GetY() ); | |
430 | fZvertexHLT->Fill( vertHLT->GetZ() ); | |
431 | } | |
432 | ||
433 | //The primary vertex constraint is stricter for HLT than for Offline | |
434 | if( vertHLT && vertHLT->GetNContributors() >= 5 && (TMath::Abs(vertHLT->GetZ())<5.5) ){ | |
435 | ||
436 | for(Int_t i=0; i<esdHLT->GetNumberOfTracks(); i++){ | |
437 | ||
438 | AliESDtrack *esdtrackHLT = esdHLT->GetTrack(i); | |
fb5b189b | 439 | |
e9fe1336 | 440 | if(esdtrackHLT){ |
441 | if(!(esdOFF->GetEventSpecie()==16)){ // reject laser events | |
442 | ||
443 | if(esdtrackHLT->GetTPCNcls()>0) fNclusVSphiHLT->Fill(esdtrackHLT->Phi()*TMath::RadToDeg(), esdtrackHLT->GetTPCNcls()); | |
444 | if(esdtrackHLT->GetTPCNcls()>0) fNclusVSthetaHLT->Fill(esdtrackHLT->Theta()*TMath::RadToDeg(), esdtrackHLT->GetTPCNcls()); | |
445 | ||
446 | for(int jjj=0;jjj<12;jjj++){ | |
447 | if(esdtrackHLT->GetStatus()&Statusnames[jjj]) { | |
448 | fStatusHLT->Fill(jjj); | |
449 | if(esdtrackHLT->GetTPCNcls()==0) fStatusHLT_Ocl->Fill(jjj); | |
450 | } | |
451 | } | |
fb5b189b | 452 | |
e9fe1336 | 453 | fEtaHLT->Fill(esdtrackHLT->Eta()); |
fb5b189b | 454 | |
455 | Double_t dz[2] = {-999., -999.}; | |
456 | Double_t covar[3] = {0.,0.,0.}; | |
457 | esdtrackHLT->PropagateToDCA(primVertexHLT, bfield, 250., dz, covar); | |
458 | ||
459 | fDCAHLT->Fill(esdtrackHLT->GetD(esdHLT->GetPrimaryVertex()->GetXv(), esdHLT->GetPrimaryVertex()->GetYv(), bfield) ); | |
e9fe1336 | 460 | if(TMath::Abs(esdtrackHLT->GetD(esdHLT->GetPrimaryVertex()->GetXv(), esdHLT->GetPrimaryVertex()->GetYv(), bfield))< DCAcut){ |
461 | ||
462 | ||
463 | fdEdxHLT->Fill( esdtrackHLT->GetTPCsignal() ); | |
464 | fdEdxVSPHLT->Fill( TMath::Abs(esdtrackHLT->P()), esdtrackHLT->GetTPCsignal() ); | |
465 | if(TMath::Abs(esdtrackHLT->Pt()) > Momcut && esdtrackHLT->GetTPCNcls()>70){ | |
466 | fEtaDCAcutHLT->Fill(esdtrackHLT->Eta()); | |
467 | fPhiHLT->Fill(esdtrackHLT->Phi()*TMath::RadToDeg()); | |
468 | fThetaHLT->Fill(esdtrackHLT->Theta()*TMath::RadToDeg()); | |
469 | if(esdtrackHLT->GetStatus()&AliESDtrack::kTPCin || (esdtrackHLT->GetStatus()&AliESDtrack::kTPCin && esdtrackHLT->GetStatus()&AliESDtrack::kITSin))//{ | |
470 | fNclusterHLT->Fill(esdtrackHLT->GetTPCNcls()); | |
471 | fMomentumHLT->Fill( TMath::Abs(esdtrackHLT->P()) ); | |
472 | } | |
473 | ||
474 | if(esdHLT->IsHLTTriggerFired()){ | |
fb5b189b | 475 | |
e9fe1336 | 476 | }// end if for triggered hlt events |
477 | } // end if track < DCAcut | |
478 | } // end if not calibration event | |
479 | } // end if esdtrack is kTRUE | |
480 | } // end of loop over hlt tracks | |
481 | } // end of condition to select primary tracks (vertex cuts) | |
482 | ||
483 | ||
fb5b189b | 484 | //----------------- OFFLINE ESD tree ----------------// |
485 | ||
e9fe1336 | 486 | if(esdOFF->GetNumberOfTracks()!=0) fMultOff->Fill( esdOFF->GetNumberOfTracks() ); |
487 | ||
488 | // Track cuts (except d0 cut) | |
489 | //------- TPC track selection -------- | |
490 | Int_t minclsTPCOff=70; | |
491 | AliESDtrackCuts* esdtrackCutsITSTPCOff = new AliESDtrackCuts("esdtrackCutsITSTPC"); | |
492 | esdtrackCutsITSTPCOff->SetRequireITSRefit(kTRUE); | |
493 | esdtrackCutsITSTPCOff->SetClusterRequirementITS(AliESDtrackCuts::kSPD, | |
494 | AliESDtrackCuts::kAny); | |
495 | esdtrackCutsITSTPCOff->SetAcceptKinkDaughters(kFALSE); | |
496 | esdtrackCutsITSTPCOff->SetMinNClustersTPC(minclsTPCOff); | |
497 | esdtrackCutsITSTPCOff->SetMaxChi2PerClusterTPC(maxchi2perTPCcl); | |
498 | ||
fb5b189b | 499 | |
500 | Double_t vertexOFF[3]; | |
e9fe1336 | 501 | const AliESDVertex *vertOff=esdOFF->GetPrimaryVertexTracks(); |
502 | ||
503 | vertexOFF[0] = vertOff->GetX(); | |
504 | vertexOFF[1] = vertOff->GetY(); | |
505 | vertexOFF[2] = vertOff->GetZ(); | |
fb5b189b | 506 | AliVertex *primVertexOFF = new AliVertex(vertexOFF, 0., 0); |
e9fe1336 | 507 | Bool_t testVertex=kTRUE; |
508 | ||
509 | if(vertOff->GetNContributors()<1) { | |
510 | // SPD vertex | |
511 | vertOff = esdOFF->GetPrimaryVertexSPD(); | |
512 | if(vertOff->GetNContributors()<1) { | |
513 | // NO GOOD VERTEX, SKIP EVENT | |
514 | testVertex=kFALSE; | |
515 | } | |
516 | } | |
517 | ||
518 | if(vertOff->GetZ()!=0){ | |
519 | fXYvertexOff->Fill(vertOff->GetX(), vertOff->GetY() ); | |
520 | fXvertexOff->Fill( vertOff->GetX() ); | |
521 | fYvertexOff->Fill( vertOff->GetY() ); | |
522 | fZvertexOff->Fill( vertOff->GetZ() ); | |
523 | } | |
524 | ||
525 | if(testVertex){ | |
526 | ||
527 | for(Int_t i=0; i<esdOFF->GetNumberOfTracks(); i++){ | |
fb5b189b | 528 | |
e9fe1336 | 529 | AliESDtrack *esdtrackOFF = esdOFF->GetTrack(i); |
530 | ||
531 | if(esdtrackOFF){ | |
532 | if(!(esdOFF->GetEventSpecie()==16)){ // reject laser events | |
533 | ||
534 | if(esdtrackOFF->GetTPCNcls()>0) fNclusVSphiOff->Fill(esdtrackOFF->Phi()*TMath::RadToDeg(), esdtrackOFF->GetTPCNcls()); | |
535 | if(esdtrackOFF->GetTPCNcls()>0) fNclusVSthetaOff->Fill(esdtrackOFF->Theta()*TMath::RadToDeg(), esdtrackOFF->GetTPCNcls()); | |
fb5b189b | 536 | |
e9fe1336 | 537 | for(int jjj=0;jjj<12;jjj++){ |
538 | if(esdtrackOFF->GetStatus()&Statusnames[jjj]) { | |
539 | fStatusOff->Fill(jjj); | |
540 | if(esdtrackOFF->GetTPCNcls()==0) fStatusOff_Ocl->Fill(jjj); | |
541 | } | |
542 | } | |
fb5b189b | 543 | Double_t dz[2] = {-999., -999.}; |
544 | Double_t covar[3] = {0.,0.,0.}; | |
545 | esdtrackOFF->PropagateToDCA(primVertexOFF, bfield, 250., dz, covar); | |
546 | ||
547 | fDCAOff->Fill( esdtrackOFF->GetD(esdOFF->GetPrimaryVertex()->GetXv(), esdOFF->GetPrimaryVertex()->GetYv(), bfield) ); | |
e9fe1336 | 548 | fEtaOff->Fill(esdtrackOFF->Eta()); |
fb5b189b | 549 | |
fb5b189b | 550 | |
e9fe1336 | 551 | //Selection of primary tracks |
552 | //chosen after recommendations from: https://twiki.cern.ch/twiki/bin/view/ALICE/SelectionOfPrimaryTracksForPp2009DataAnalysis) | |
553 | // for each track | |
554 | // track quality cuts | |
555 | if(!esdtrackCutsITSTPCOff->AcceptTrack(esdtrackOFF)) continue; | |
556 | // bring it to the primary vertex and compute impact parameters | |
557 | if(!esdtrackOFF->RelateToVertex(vertOff,esdOFF->GetMagneticField(),kVeryBig)) continue; // this is already done in AliReconstruction... | |
558 | ||
559 | ||
560 | if(TMath::Abs(esdtrackOFF->GetD(esdOFF->GetPrimaryVertex()->GetXv(), esdOFF->GetPrimaryVertex()->GetYv(), bfield))< DCAcut ){ | |
561 | ||
562 | fdEdxOff->Fill( esdtrackOFF->GetTPCsignal() ); | |
563 | fdEdxVSPOff->Fill( TMath::Abs(esdtrackOFF->P()), esdtrackOFF->GetTPCsignal() ); | |
564 | ||
565 | if(TMath::Abs(esdtrackOFF->Pt()) > Momcut){ | |
566 | fEtaDCAcutOff->Fill(esdtrackOFF->Eta()); | |
567 | fPhiOff->Fill(esdtrackOFF->Phi()*TMath::RadToDeg()); | |
568 | fThetaOff->Fill(esdtrackOFF->Theta()*TMath::RadToDeg()); | |
569 | if(esdtrackOFF->GetStatus()&AliESDtrack::kTPCin || (esdtrackOFF->GetStatus()&AliESDtrack::kTPCin && esdtrackOFF->GetStatus()&AliESDtrack::kITSin) )//{ | |
570 | fNclusterOff->Fill(esdtrackOFF->GetTPCNcls()); | |
571 | fMomentumOff->Fill( TMath::Abs(esdtrackOFF->P()) ); | |
fb5b189b | 572 | |
e9fe1336 | 573 | } |
574 | ||
575 | if(esdHLT->IsHLTTriggerFired()){ | |
576 | ||
577 | } // end if for triggered hlt events | |
578 | }//end if over DCA cut | |
579 | }//end if not calibration event | |
580 | } // end if esdtrack is kTRUE | |
581 | } // end of loop over hlt tracks | |
582 | } // end of offline primary vertex conditions | |
fb5b189b | 583 | |
584 | ||
585 | // if(esdHLT->IsHLTTriggerFired()){ | |
586 | // | |
587 | // for(Int_t i=0; i<esdOFF->GetNumberOfTracks(); i++){ | |
588 | // | |
589 | // AliESDtrack *esdTrk = esdOFF->GetTrack(i); | |
590 | // Double_t dz[2] = {-999., -999.}; | |
591 | // Double_t covar[3] = {0}; | |
592 | // esdTrk->PropagateToDCA(vtx, bfield, 250., dz, covar); | |
593 | // fHistOfflDZTrig->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1])); | |
594 | // | |
595 | // fHistOfflDZ->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1])); | |
596 | // | |
597 | // /* | |
598 | // Double_t pnt[3] = {0., 0., 0.}; | |
599 | // Double_t norm[3] = {0., 0., 1.}; | |
600 | // if(esdTrk->Intersect(pnt, norm, bfield)){ | |
601 | // if(TMath::Sqrt(pnt[0]*pnt[0]+pnt[1]*pnt[1]) < 250) { | |
602 | // fNtracksThruZ0++; | |
603 | // fNtracksThruZ0Trig++; | |
604 | // fHistTrigger->Fill(6., 1); | |
605 | // fHistTrigger->Fill(7., 1); | |
606 | // } | |
607 | // } | |
608 | // */ | |
609 | // | |
610 | // fHistOfflTrkDCATrig->Fill(TMath::Abs(esdTrk->GetD(0., 0., bfield))); | |
611 | // fDCAOff->Fill(TMath::Abs(esdTrk->GetD(0., 0., bfield))); | |
612 | // | |
613 | // if(esdTrk->GetTPCNcls()>0){ | |
614 | // fHistOfflTrkNclsTrig->Fill(esdTrk->GetTPCNcls()); | |
615 | // fHistOfflTrkNcls->Fill(esdTrk->GetTPCNcls()); | |
616 | // } | |
617 | // | |
618 | // fHistOfflTrkPTrig->Fill(TMath::Abs(esdTrk->P())); | |
619 | // fHistOfflTrkP->Fill(TMath::Abs(esdTrk->P())); | |
620 | // fHistOffldEdx->Fill( esdTrk->GetTPCsignal()); | |
621 | // fHistOffldEdxVsP->Fill(TMath::Abs(esdTrk->P()), esdTrk->GetTPCsignal()); | |
622 | // } | |
e9fe1336 | 623 | |
fb5b189b | 624 | delete primVertexOFF; |
625 | delete primVertexHLT; | |
e9fe1336 | 626 | |
fb5b189b | 627 | // Post output data. |
628 | PostData(1, fOutputList); | |
629 | } | |
630 | ||
631 | void AliAnalysisTaskHLT::Terminate(Option_t *){ | |
632 | // see header file of AliAnalysisTask for documentation | |
fb5b189b | 633 | // Draw result to the screen |
634 | // Called once at the end of the query | |
635 | ||
e9fe1336 | 636 | //Will create 2 canvases at the end, and store them as .png |
637 | TCanvas *c1 = new TCanvas("c1","Info pr track, Offline vs Online",10,10,1210,810); | |
638 | Int_t maxbin=0; | |
639 | ||
640 | TLegend *legend = new TLegend(0.70,0.60,0.90,0.75); | |
641 | c1->Divide(3,2); | |
642 | ||
643 | c1->cd(1); | |
644 | maxbin =fEtaOff->GetBinContent(fEtaOff->GetMaximumBin()); | |
645 | if(maxbin < fEtaHLT->GetBinContent(fEtaHLT->GetMaximumBin())) | |
646 | maxbin=fEtaHLT->GetBinContent(fEtaHLT->GetMaximumBin()); | |
647 | fEtaOff->SetMaximum(maxbin+20); | |
648 | fEtaOff->SetTitle("Pseudorapidity (only primary vertex cut)"); | |
649 | fEtaOff->SetLineColor(2); | |
650 | fEtaOff->DrawCopy(""); | |
651 | legend->AddEntry(fEtaOff, "Offline", "LP"); | |
652 | fEtaHLT->DrawCopy("sameS"); | |
653 | legend->AddEntry(fEtaHLT,"HLT","LP"); | |
654 | legend->SetFillColor(10); | |
655 | legend->SetBorderSize(0); | |
656 | legend->Draw(); | |
657 | ||
658 | c1->cd(2); | |
659 | maxbin =fEtaDCAcutOff->GetBinContent(fEtaDCAcutOff->GetMaximumBin()); | |
660 | if(maxbin < fEtaDCAcutHLT->GetBinContent(fEtaDCAcutHLT->GetMaximumBin())) | |
661 | maxbin=fEtaDCAcutHLT->GetBinContent(fEtaDCAcutHLT->GetMaximumBin()); | |
662 | fEtaDCAcutOff->SetMaximum(maxbin+20); | |
663 | char etaname[50]; | |
664 | sprintf(etaname,"Pseudorapidity"); | |
665 | fEtaDCAcutOff->SetTitle(etaname); | |
666 | fEtaDCAcutOff->SetLineColor(2); | |
667 | fEtaDCAcutOff->DrawCopy(""); | |
668 | fEtaDCAcutHLT->DrawCopy("sames"); | |
669 | ||
670 | c1->cd(3); | |
671 | maxbin =fNclusterOff->GetBinContent(fNclusterOff->GetMaximumBin()); | |
672 | if(maxbin < fNclusterHLT->GetBinContent(fNclusterHLT->GetMaximumBin())) | |
673 | maxbin=fNclusterHLT->GetBinContent(fNclusterHLT->GetMaximumBin()); | |
674 | fNclusterOff->SetMaximum(maxbin+20); | |
675 | fNclusterOff->SetLineColor(2); | |
676 | fNclusterOff->SetTitle("Nr clusters per track"); | |
677 | fNclusterOff->DrawCopy(""); | |
678 | fNclusterHLT->DrawCopy("sames"); | |
679 | ||
680 | c1->cd(4); | |
681 | maxbin =fPhiOff->GetBinContent(fPhiOff->GetMaximumBin()); | |
682 | if(maxbin < fPhiHLT->GetBinContent(fPhiHLT->GetMaximumBin())) | |
683 | maxbin=fPhiHLT->GetBinContent(fPhiHLT->GetMaximumBin()); | |
684 | fPhiOff->SetMinimum(0); | |
685 | fPhiOff->SetMaximum(maxbin+20); | |
686 | fPhiOff->SetLineColor(2); | |
687 | fPhiOff->SetTitle("Azimuthal angle distribution"); | |
688 | fPhiOff->DrawCopy(""); | |
689 | fPhiHLT->DrawCopy("sames"); | |
690 | ||
691 | c1->cd(5); | |
692 | maxbin =fThetaOff->GetBinContent(fThetaOff->GetMaximumBin()); | |
693 | if(maxbin < fThetaHLT->GetBinContent(fThetaHLT->GetMaximumBin())) | |
694 | maxbin=fThetaHLT->GetBinContent(fThetaHLT->GetMaximumBin()); | |
695 | fThetaOff->SetMaximum(maxbin+20); | |
696 | fThetaOff->SetLineColor(2); | |
697 | fThetaOff->SetTitle("Polar angle distribution"); | |
698 | fThetaOff->DrawCopy(""); | |
699 | fThetaHLT->DrawCopy("sames"); | |
700 | ||
701 | c1->cd(6); | |
702 | maxbin =fMomentumOff->GetBinContent(fMomentumOff->GetMaximumBin()); | |
703 | if(maxbin < fMomentumHLT->GetBinContent(fMomentumHLT->GetMaximumBin())) | |
704 | maxbin=fMomentumHLT->GetBinContent(fMomentumHLT->GetMaximumBin()); | |
705 | fMomentumOff->SetMaximum(maxbin+200); | |
706 | fMomentumOff->GetXaxis()->SetRangeUser(0,5); | |
707 | fMomentumOff->SetLineColor(2); | |
708 | fMomentumOff->SetTitle("Momentum"); | |
709 | fMomentumOff->DrawCopy(""); | |
710 | fMomentumHLT->DrawCopy("sames"); | |
711 | ||
712 | TCanvas *c2= new TCanvas("c2", "Info pr event, Offline vs Online", 10 , 10,1210, 810); | |
713 | TLegend *legend2 = new TLegend(0.70,0.60,0.90,0.75); | |
714 | c2->Divide(3,2); | |
715 | c2->cd(1); | |
716 | fXvertexOff->SetTitle("Primary Vertex Distribution in X"); | |
717 | fXvertexOff->SetLineColor(2); | |
718 | fXvertexOff->GetXaxis()->SetRangeUser(-0.5,0.5); | |
719 | legend2->AddEntry(fXvertexOff,"Offline","LP"); | |
720 | fXvertexOff->DrawCopy(""); | |
721 | fXvertexHLT->DrawCopy("sames"); | |
722 | legend2->AddEntry(fXvertexHLT,"HLT","LP"); | |
723 | legend2->SetFillColor(10); | |
724 | legend2->SetBorderSize(0); | |
725 | legend2->Draw(); | |
726 | c2->cd(2); | |
727 | fYvertexOff->SetTitle("Primary Vertex Distribution in Y"); | |
728 | fYvertexOff->SetLineColor(2); | |
729 | fYvertexOff->GetXaxis()->SetRangeUser(-0.5,0.5); | |
730 | fYvertexOff->DrawCopy(""); | |
731 | fYvertexHLT->DrawCopy("sames"); | |
732 | c2->cd(3); | |
733 | fZvertexOff->SetTitle("Primary Vertex Distribution in Z"); | |
734 | fZvertexOff->SetLineColor(2); | |
735 | fZvertexOff->DrawCopy(""); | |
736 | fZvertexHLT->DrawCopy("sames"); | |
fb5b189b | 737 | |
e9fe1336 | 738 | c2->cd(4); |
739 | fMultHLT->SetTitle("Track Multiplicity, NumberTracks>0"); | |
740 | fMultHLT->DrawCopy(""); | |
741 | fMultOff->SetLineColor(2); | |
742 | fMultOff->DrawCopy("sames"); | |
743 | ||
744 | string filename="Info_pr_track"; | |
745 | char plotname[100]; | |
746 | sprintf(plotname,"%s.png",filename.c_str()); | |
747 | c1->Print(plotname,"png"); | |
748 | ||
749 | filename="Info_pr_Event"; | |
750 | sprintf(plotname,"%s.png",filename.c_str()); | |
751 | c2->Print(plotname,"png"); | |
752 | ||
fb5b189b | 753 | } |