]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/QA/tasks/AliAnalysisTaskHLT.cxx
revised alignment parameters for first year geometry based on survey and calculations...
[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
a4dae8cd 106 //DefineOutput(1, TList::Class());
fb5b189b 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;
fcf71d87 369
370 if(esdH){
371 esdHLT = esdH->GetHLTEvent();
372 }
d132ef8c 373
374 if(!esdHLT){
fcf71d87 375 Printf("ERROR: HLTesd not available");
376 return;
fb5b189b 377 }
378
fcf71d87 379 if(esdHLT->GetNumberOfTracks()==0){
380 Printf("No tracks in the HLTesdTree for event %d", esdHLT->GetEventNumberInFile());
381 return;
382 }
383
fb5b189b 384 //Fill CTP Trigger stuff
385 //fHistTrigger->Fill(esdOFF->GetTriggerMask());
386
387 for(Int_t i=0; i<fTrgClsArray->GetEntries(); i++){
388 if((esdOFF->GetFiredTriggerClasses()).Contains(((TObjString *)fTrgClsArray->At(i))->GetString()))// && esdOFF->GetEventSpecie()==16)
389 fHistTrigger->Fill(i);
390 }
391
e9fe1336 392 Double_t DCAcut = 7.0;
393 Double_t Momcut= 0.3;
fb5b189b 394
395 char test[50];
e9fe1336 396 sprintf(test,"pseudorapidity (HLT), DCA cut = %f,\n Momentum cut = %f, TPC clusters > 70" , DCAcut, Momcut);
fb5b189b 397 fEtaDCAcutHLT->SetTitle(test);
e9fe1336 398 sprintf(test,"pseudorapidity (offline), DCA cut = %f, Momentum cut = %f, TPC clusters > 70", DCAcut, Momcut);
fb5b189b 399 fEtaDCAcutOff->SetTitle(test);
400
401 Double_t bfield = esdOFF->GetMagneticField();
402
fb5b189b 403 UInt_t Statusnames[12]={AliESDtrack::kTPCin,
404 AliESDtrack::kITSin,
405 AliESDtrack::kTPCout,
406 AliESDtrack::kITSout,
407 AliESDtrack::kITSrefit,
408 AliESDtrack::kTPCrefit,
409 AliESDtrack::kTRDin,
410 AliESDtrack::kTRDout,
411 AliESDtrack::kTRDrefit,
412 AliESDtrack::kTOFin,
413 AliESDtrack::kTOFout,
414 AliESDtrack::kTOFrefit};
415
e9fe1336 416
417
418 //---------------- HLT ESD tree -----------------------//
419
420
421 if(esdHLT->GetNumberOfTracks()!=0)
422 fMultHLT->Fill( esdHLT->GetNumberOfTracks() );
423
424 Double_t vertexHLT[3];
fb5b189b 425
e9fe1336 426 const AliESDVertex *vertHLT=esdHLT->GetPrimaryVertexTracks();
427
428 vertexHLT[0] = vertHLT->GetX();
429 vertexHLT[1] = vertHLT->GetY();
430 vertexHLT[2] = vertHLT->GetZ();
431 AliVertex *primVertexHLT = new AliVertex(vertexHLT, 0., 0);
432
433 if(vertHLT->GetZ()!=0){
434 fXYvertexHLT->Fill(vertHLT->GetX(), vertHLT->GetY() );
435 fXvertexHLT->Fill( vertHLT->GetX() );
436 fYvertexHLT->Fill( vertHLT->GetY() );
437 fZvertexHLT->Fill( vertHLT->GetZ() );
438 }
439
440 //The primary vertex constraint is stricter for HLT than for Offline
441 if( vertHLT && vertHLT->GetNContributors() >= 5 && (TMath::Abs(vertHLT->GetZ())<5.5) ){
442
443 for(Int_t i=0; i<esdHLT->GetNumberOfTracks(); i++){
444
445 AliESDtrack *esdtrackHLT = esdHLT->GetTrack(i);
fb5b189b 446
e9fe1336 447 if(esdtrackHLT){
448 if(!(esdOFF->GetEventSpecie()==16)){ // reject laser events
449
450 if(esdtrackHLT->GetTPCNcls()>0) fNclusVSphiHLT->Fill(esdtrackHLT->Phi()*TMath::RadToDeg(), esdtrackHLT->GetTPCNcls());
451 if(esdtrackHLT->GetTPCNcls()>0) fNclusVSthetaHLT->Fill(esdtrackHLT->Theta()*TMath::RadToDeg(), esdtrackHLT->GetTPCNcls());
452
453 for(int jjj=0;jjj<12;jjj++){
454 if(esdtrackHLT->GetStatus()&Statusnames[jjj]) {
455 fStatusHLT->Fill(jjj);
456 if(esdtrackHLT->GetTPCNcls()==0) fStatusHLT_Ocl->Fill(jjj);
457 }
458 }
fb5b189b 459
e9fe1336 460 fEtaHLT->Fill(esdtrackHLT->Eta());
fb5b189b 461
462 Double_t dz[2] = {-999., -999.};
463 Double_t covar[3] = {0.,0.,0.};
464 esdtrackHLT->PropagateToDCA(primVertexHLT, bfield, 250., dz, covar);
465
466 fDCAHLT->Fill(esdtrackHLT->GetD(esdHLT->GetPrimaryVertex()->GetXv(), esdHLT->GetPrimaryVertex()->GetYv(), bfield) );
e9fe1336 467 if(TMath::Abs(esdtrackHLT->GetD(esdHLT->GetPrimaryVertex()->GetXv(), esdHLT->GetPrimaryVertex()->GetYv(), bfield))< DCAcut){
468
469
470 fdEdxHLT->Fill( esdtrackHLT->GetTPCsignal() );
471 fdEdxVSPHLT->Fill( TMath::Abs(esdtrackHLT->P()), esdtrackHLT->GetTPCsignal() );
472 if(TMath::Abs(esdtrackHLT->Pt()) > Momcut && esdtrackHLT->GetTPCNcls()>70){
473 fEtaDCAcutHLT->Fill(esdtrackHLT->Eta());
474 fPhiHLT->Fill(esdtrackHLT->Phi()*TMath::RadToDeg());
475 fThetaHLT->Fill(esdtrackHLT->Theta()*TMath::RadToDeg());
476 if(esdtrackHLT->GetStatus()&AliESDtrack::kTPCin || (esdtrackHLT->GetStatus()&AliESDtrack::kTPCin && esdtrackHLT->GetStatus()&AliESDtrack::kITSin))//{
477 fNclusterHLT->Fill(esdtrackHLT->GetTPCNcls());
478 fMomentumHLT->Fill( TMath::Abs(esdtrackHLT->P()) );
479 }
480
481 if(esdHLT->IsHLTTriggerFired()){
fb5b189b 482
e9fe1336 483 }// end if for triggered hlt events
484 } // end if track < DCAcut
485 } // end if not calibration event
486 } // end if esdtrack is kTRUE
487 } // end of loop over hlt tracks
488 } // end of condition to select primary tracks (vertex cuts)
489
490
fb5b189b 491 //----------------- OFFLINE ESD tree ----------------//
492
e9fe1336 493 if(esdOFF->GetNumberOfTracks()!=0) fMultOff->Fill( esdOFF->GetNumberOfTracks() );
494
495 // Track cuts (except d0 cut)
496 //------- TPC track selection --------
497 Int_t minclsTPCOff=70;
6368a7f3 498 Double_t maxchi2perTPCcl=4.;
499
e9fe1336 500 AliESDtrackCuts* esdtrackCutsITSTPCOff = new AliESDtrackCuts("esdtrackCutsITSTPC");
501 esdtrackCutsITSTPCOff->SetRequireITSRefit(kTRUE);
502 esdtrackCutsITSTPCOff->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
503 AliESDtrackCuts::kAny);
504 esdtrackCutsITSTPCOff->SetAcceptKinkDaughters(kFALSE);
505 esdtrackCutsITSTPCOff->SetMinNClustersTPC(minclsTPCOff);
926510ec 506 esdtrackCutsITSTPCOff->SetMaxChi2PerClusterTPC(maxchi2perTPCcl);
e9fe1336 507
fb5b189b 508
509 Double_t vertexOFF[3];
e9fe1336 510 const AliESDVertex *vertOff=esdOFF->GetPrimaryVertexTracks();
511
512 vertexOFF[0] = vertOff->GetX();
513 vertexOFF[1] = vertOff->GetY();
514 vertexOFF[2] = vertOff->GetZ();
fb5b189b 515 AliVertex *primVertexOFF = new AliVertex(vertexOFF, 0., 0);
e9fe1336 516 Bool_t testVertex=kTRUE;
517
518 if(vertOff->GetNContributors()<1) {
519 // SPD vertex
520 vertOff = esdOFF->GetPrimaryVertexSPD();
521 if(vertOff->GetNContributors()<1) {
522 // NO GOOD VERTEX, SKIP EVENT
523 testVertex=kFALSE;
524 }
525 }
526
527 if(vertOff->GetZ()!=0){
528 fXYvertexOff->Fill(vertOff->GetX(), vertOff->GetY() );
529 fXvertexOff->Fill( vertOff->GetX() );
530 fYvertexOff->Fill( vertOff->GetY() );
531 fZvertexOff->Fill( vertOff->GetZ() );
532 }
533
534 if(testVertex){
535
536 for(Int_t i=0; i<esdOFF->GetNumberOfTracks(); i++){
fb5b189b 537
e9fe1336 538 AliESDtrack *esdtrackOFF = esdOFF->GetTrack(i);
539
540 if(esdtrackOFF){
541 if(!(esdOFF->GetEventSpecie()==16)){ // reject laser events
542
543 if(esdtrackOFF->GetTPCNcls()>0) fNclusVSphiOff->Fill(esdtrackOFF->Phi()*TMath::RadToDeg(), esdtrackOFF->GetTPCNcls());
544 if(esdtrackOFF->GetTPCNcls()>0) fNclusVSthetaOff->Fill(esdtrackOFF->Theta()*TMath::RadToDeg(), esdtrackOFF->GetTPCNcls());
fb5b189b 545
e9fe1336 546 for(int jjj=0;jjj<12;jjj++){
547 if(esdtrackOFF->GetStatus()&Statusnames[jjj]) {
548 fStatusOff->Fill(jjj);
549 if(esdtrackOFF->GetTPCNcls()==0) fStatusOff_Ocl->Fill(jjj);
550 }
551 }
fb5b189b 552 Double_t dz[2] = {-999., -999.};
553 Double_t covar[3] = {0.,0.,0.};
554 esdtrackOFF->PropagateToDCA(primVertexOFF, bfield, 250., dz, covar);
555
556 fDCAOff->Fill( esdtrackOFF->GetD(esdOFF->GetPrimaryVertex()->GetXv(), esdOFF->GetPrimaryVertex()->GetYv(), bfield) );
e9fe1336 557 fEtaOff->Fill(esdtrackOFF->Eta());
fb5b189b 558
fb5b189b 559
e9fe1336 560 //Selection of primary tracks
561 //chosen after recommendations from: https://twiki.cern.ch/twiki/bin/view/ALICE/SelectionOfPrimaryTracksForPp2009DataAnalysis)
562 // for each track
563 // track quality cuts
564 if(!esdtrackCutsITSTPCOff->AcceptTrack(esdtrackOFF)) continue;
565 // bring it to the primary vertex and compute impact parameters
566 if(!esdtrackOFF->RelateToVertex(vertOff,esdOFF->GetMagneticField(),kVeryBig)) continue; // this is already done in AliReconstruction...
567
568
569 if(TMath::Abs(esdtrackOFF->GetD(esdOFF->GetPrimaryVertex()->GetXv(), esdOFF->GetPrimaryVertex()->GetYv(), bfield))< DCAcut ){
570
571 fdEdxOff->Fill( esdtrackOFF->GetTPCsignal() );
572 fdEdxVSPOff->Fill( TMath::Abs(esdtrackOFF->P()), esdtrackOFF->GetTPCsignal() );
573
574 if(TMath::Abs(esdtrackOFF->Pt()) > Momcut){
575 fEtaDCAcutOff->Fill(esdtrackOFF->Eta());
576 fPhiOff->Fill(esdtrackOFF->Phi()*TMath::RadToDeg());
577 fThetaOff->Fill(esdtrackOFF->Theta()*TMath::RadToDeg());
578 if(esdtrackOFF->GetStatus()&AliESDtrack::kTPCin || (esdtrackOFF->GetStatus()&AliESDtrack::kTPCin && esdtrackOFF->GetStatus()&AliESDtrack::kITSin) )//{
579 fNclusterOff->Fill(esdtrackOFF->GetTPCNcls());
580 fMomentumOff->Fill( TMath::Abs(esdtrackOFF->P()) );
fb5b189b 581
e9fe1336 582 }
583
584 if(esdHLT->IsHLTTriggerFired()){
585
586 } // end if for triggered hlt events
587 }//end if over DCA cut
588 }//end if not calibration event
589 } // end if esdtrack is kTRUE
590 } // end of loop over hlt tracks
591 } // end of offline primary vertex conditions
fb5b189b 592
593
594 // if(esdHLT->IsHLTTriggerFired()){
595 //
596 // for(Int_t i=0; i<esdOFF->GetNumberOfTracks(); i++){
597 //
598 // AliESDtrack *esdTrk = esdOFF->GetTrack(i);
599 // Double_t dz[2] = {-999., -999.};
600 // Double_t covar[3] = {0};
601 // esdTrk->PropagateToDCA(vtx, bfield, 250., dz, covar);
602 // fHistOfflDZTrig->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1]));
603 //
604 // fHistOfflDZ->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1]));
605 //
606 // /*
607 // Double_t pnt[3] = {0., 0., 0.};
608 // Double_t norm[3] = {0., 0., 1.};
609 // if(esdTrk->Intersect(pnt, norm, bfield)){
610 // if(TMath::Sqrt(pnt[0]*pnt[0]+pnt[1]*pnt[1]) < 250) {
611 // fNtracksThruZ0++;
612 // fNtracksThruZ0Trig++;
613 // fHistTrigger->Fill(6., 1);
614 // fHistTrigger->Fill(7., 1);
615 // }
616 // }
617 // */
618 //
619 // fHistOfflTrkDCATrig->Fill(TMath::Abs(esdTrk->GetD(0., 0., bfield)));
620 // fDCAOff->Fill(TMath::Abs(esdTrk->GetD(0., 0., bfield)));
621 //
622 // if(esdTrk->GetTPCNcls()>0){
623 // fHistOfflTrkNclsTrig->Fill(esdTrk->GetTPCNcls());
624 // fHistOfflTrkNcls->Fill(esdTrk->GetTPCNcls());
625 // }
626 //
627 // fHistOfflTrkPTrig->Fill(TMath::Abs(esdTrk->P()));
628 // fHistOfflTrkP->Fill(TMath::Abs(esdTrk->P()));
629 // fHistOffldEdx->Fill( esdTrk->GetTPCsignal());
630 // fHistOffldEdxVsP->Fill(TMath::Abs(esdTrk->P()), esdTrk->GetTPCsignal());
631 // }
e9fe1336 632
fb5b189b 633 delete primVertexOFF;
634 delete primVertexHLT;
e9fe1336 635
fb5b189b 636 // Post output data.
637 PostData(1, fOutputList);
638}
639
640void AliAnalysisTaskHLT::Terminate(Option_t *){
641 // see header file of AliAnalysisTask for documentation
fb5b189b 642 // Draw result to the screen
643 // Called once at the end of the query
644
e9fe1336 645 //Will create 2 canvases at the end, and store them as .png
646 TCanvas *c1 = new TCanvas("c1","Info pr track, Offline vs Online",10,10,1210,810);
647 Int_t maxbin=0;
648
649 TLegend *legend = new TLegend(0.70,0.60,0.90,0.75);
650 c1->Divide(3,2);
651
652 c1->cd(1);
653 maxbin =fEtaOff->GetBinContent(fEtaOff->GetMaximumBin());
654 if(maxbin < fEtaHLT->GetBinContent(fEtaHLT->GetMaximumBin()))
655 maxbin=fEtaHLT->GetBinContent(fEtaHLT->GetMaximumBin());
656 fEtaOff->SetMaximum(maxbin+20);
657 fEtaOff->SetTitle("Pseudorapidity (only primary vertex cut)");
658 fEtaOff->SetLineColor(2);
659 fEtaOff->DrawCopy("");
660 legend->AddEntry(fEtaOff, "Offline", "LP");
661 fEtaHLT->DrawCopy("sameS");
662 legend->AddEntry(fEtaHLT,"HLT","LP");
663 legend->SetFillColor(10);
664 legend->SetBorderSize(0);
665 legend->Draw();
666
667 c1->cd(2);
668 maxbin =fEtaDCAcutOff->GetBinContent(fEtaDCAcutOff->GetMaximumBin());
669 if(maxbin < fEtaDCAcutHLT->GetBinContent(fEtaDCAcutHLT->GetMaximumBin()))
670 maxbin=fEtaDCAcutHLT->GetBinContent(fEtaDCAcutHLT->GetMaximumBin());
671 fEtaDCAcutOff->SetMaximum(maxbin+20);
672 char etaname[50];
673 sprintf(etaname,"Pseudorapidity");
674 fEtaDCAcutOff->SetTitle(etaname);
675 fEtaDCAcutOff->SetLineColor(2);
676 fEtaDCAcutOff->DrawCopy("");
677 fEtaDCAcutHLT->DrawCopy("sames");
678
679 c1->cd(3);
680 maxbin =fNclusterOff->GetBinContent(fNclusterOff->GetMaximumBin());
681 if(maxbin < fNclusterHLT->GetBinContent(fNclusterHLT->GetMaximumBin()))
682 maxbin=fNclusterHLT->GetBinContent(fNclusterHLT->GetMaximumBin());
683 fNclusterOff->SetMaximum(maxbin+20);
684 fNclusterOff->SetLineColor(2);
685 fNclusterOff->SetTitle("Nr clusters per track");
686 fNclusterOff->DrawCopy("");
687 fNclusterHLT->DrawCopy("sames");
688
689 c1->cd(4);
690 maxbin =fPhiOff->GetBinContent(fPhiOff->GetMaximumBin());
691 if(maxbin < fPhiHLT->GetBinContent(fPhiHLT->GetMaximumBin()))
692 maxbin=fPhiHLT->GetBinContent(fPhiHLT->GetMaximumBin());
693 fPhiOff->SetMinimum(0);
694 fPhiOff->SetMaximum(maxbin+20);
695 fPhiOff->SetLineColor(2);
696 fPhiOff->SetTitle("Azimuthal angle distribution");
697 fPhiOff->DrawCopy("");
698 fPhiHLT->DrawCopy("sames");
699
700 c1->cd(5);
701 maxbin =fThetaOff->GetBinContent(fThetaOff->GetMaximumBin());
702 if(maxbin < fThetaHLT->GetBinContent(fThetaHLT->GetMaximumBin()))
703 maxbin=fThetaHLT->GetBinContent(fThetaHLT->GetMaximumBin());
704 fThetaOff->SetMaximum(maxbin+20);
705 fThetaOff->SetLineColor(2);
706 fThetaOff->SetTitle("Polar angle distribution");
707 fThetaOff->DrawCopy("");
708 fThetaHLT->DrawCopy("sames");
709
710 c1->cd(6);
711 maxbin =fMomentumOff->GetBinContent(fMomentumOff->GetMaximumBin());
712 if(maxbin < fMomentumHLT->GetBinContent(fMomentumHLT->GetMaximumBin()))
713 maxbin=fMomentumHLT->GetBinContent(fMomentumHLT->GetMaximumBin());
714 fMomentumOff->SetMaximum(maxbin+200);
715 fMomentumOff->GetXaxis()->SetRangeUser(0,5);
716 fMomentumOff->SetLineColor(2);
717 fMomentumOff->SetTitle("Momentum");
718 fMomentumOff->DrawCopy("");
719 fMomentumHLT->DrawCopy("sames");
720
721 TCanvas *c2= new TCanvas("c2", "Info pr event, Offline vs Online", 10 , 10,1210, 810);
722 TLegend *legend2 = new TLegend(0.70,0.60,0.90,0.75);
723 c2->Divide(3,2);
724 c2->cd(1);
725 fXvertexOff->SetTitle("Primary Vertex Distribution in X");
726 fXvertexOff->SetLineColor(2);
727 fXvertexOff->GetXaxis()->SetRangeUser(-0.5,0.5);
728 legend2->AddEntry(fXvertexOff,"Offline","LP");
729 fXvertexOff->DrawCopy("");
730 fXvertexHLT->DrawCopy("sames");
731 legend2->AddEntry(fXvertexHLT,"HLT","LP");
732 legend2->SetFillColor(10);
733 legend2->SetBorderSize(0);
734 legend2->Draw();
735 c2->cd(2);
736 fYvertexOff->SetTitle("Primary Vertex Distribution in Y");
737 fYvertexOff->SetLineColor(2);
738 fYvertexOff->GetXaxis()->SetRangeUser(-0.5,0.5);
739 fYvertexOff->DrawCopy("");
740 fYvertexHLT->DrawCopy("sames");
741 c2->cd(3);
742 fZvertexOff->SetTitle("Primary Vertex Distribution in Z");
743 fZvertexOff->SetLineColor(2);
744 fZvertexOff->DrawCopy("");
745 fZvertexHLT->DrawCopy("sames");
fb5b189b 746
e9fe1336 747 c2->cd(4);
748 fMultHLT->SetTitle("Track Multiplicity, NumberTracks>0");
749 fMultHLT->DrawCopy("");
750 fMultOff->SetLineColor(2);
751 fMultOff->DrawCopy("sames");
752
753 string filename="Info_pr_track";
754 char plotname[100];
755 sprintf(plotname,"%s.png",filename.c_str());
756 c1->Print(plotname,"png");
757
758 filename="Info_pr_Event";
759 sprintf(plotname,"%s.png",filename.c_str());
760 c2->Print(plotname,"png");
761
fb5b189b 762}