]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/QA/tasks/AliAnalysisTaskHLT.cxx
- added selection criteria for filling the histograms, so that the HLT-offline compar...
[u/mrichter/AliRoot.git] / HLT / QA / tasks / AliAnalysisTaskHLT.cxx
CommitLineData
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
30class AliAnalysisTask;
31class 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
45ClassImp(AliAnalysisTaskHLT)
46
47//======================================================================================================
48
49AliAnalysisTaskHLT::AliAnalysisTaskHLT()
50:
51AliAnalysisTaskSE()
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
109AliAnalysisTaskHLT::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
180void 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
319void 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
357void 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
631void 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}