]> git.uio.no Git - u/mrichter/AliRoot.git/blob - HLT/QA/tasks/AliAnalysisTaskHLT.cxx
- finalized the HLT cuts in agreement to the offline ones (Hege)
[u/mrichter/AliRoot.git] / HLT / QA / tasks / AliAnalysisTaskHLT.cxx
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"
35 #include "TCanvas.h"
36 #include "TLegend.h"
37 #include "TStyle.h"
38 #include "TString.h"
39 #include "AliESDEvent.h"
40 #include "AliESDtrackCuts.h"
41 #include "AliESDInputHandler.h"
42
43 #include "AliAnalysisTaskHLT.h"
44
45 ClassImp(AliAnalysisTaskHLT)
46
47 //======================================================================================================
48
49 AliAnalysisTaskHLT::AliAnalysisTaskHLT()
50 :
51 AliAnalysisTaskSE()
52   ,fESDOfftrackCuts(0)
53   ,fESDHLTtrackCuts(0)
54   ,fOutputList(0)
55   ,fHistTrigger(0)
56   ,fHistHLTTrigger(0)  
57   ,fChargeOff(0)  
58   ,fMomentumOff(0)      
59   ,fDCAOff(0)   
60   ,fNclusterOff(0)
61   ,fNclusterOffwCut(0)          
62   ,fdEdxOff(0)  
63   ,fdEdxVSPOff(0)       
64   ,fPhiOff(0)   
65   ,fThetaOff(0) 
66   ,fMultOff(0)  
67   ,fVertexVSNtracksOff(0)
68   ,fXYvertexOff(0)      
69   ,fXvertexOff(0)           
70   ,fYvertexOff(0)           
71   ,fZvertexOff(0)
72   ,fEtaOff(0)
73   ,fEtaDCAcutOff(0)
74   ,fEtaOffTpc(0)
75   ,fEtaOffTpcIts(0)
76   ,fNclusVSphiOff(0)
77   ,fNclusVSthetaOff(0)
78   ,fStatusOff(0)
79   ,fStatusOff_Ocl(0)
80   ,fEventSpecieOff(0)
81   
82   ,fChargeHLT(0)
83   ,fMomentumHLT(0)
84   ,fDCAHLT(0)  
85   ,fNclusterHLT(0)
86   ,fNclusterHLTwCut(0)
87   ,fdEdxHLT(0)    
88   ,fdEdxVSPHLT(0)
89   ,fPhiHLT(0)     
90   ,fThetaHLT(0)  
91   ,fMultHLT(0)  
92   ,fVertexVSNtracksHLT(0) 
93   ,fXYvertexHLT(0)
94   ,fXvertexHLT(0)
95   ,fYvertexHLT(0)
96   ,fZvertexHLT(0)
97   ,fEtaHLT(0)
98   ,fEtaDCAcutHLT(0)
99   ,fEtaHLTTpc(0)
100   ,fEtaHLTTpcIts(0)
101   ,fNclusVSphiHLT(0)        
102   ,fNclusVSthetaHLT(0)
103   ,fStatusHLT(0)
104   ,fStatusHLT_Ocl(0)
105   ,fEventSpecieHLT(0)
106   
107   //     ,fDCAOff_trig(0)
108   //     ,fNclusterOff_trig(0)
109   //     
110   //     ,fDCAHLT_trig(0)
111   //     ,fNclusterHLT_trig(0)
112
113 {
114   // Constructor
115   // Define input and output slots here
116   // Input slot #0 works with a TChain
117   // DefineInput(0, TChain::Class());
118   // Output slot #0 writes into a TH1 container
119
120   //DefineOutput(1, TList::Class());
121 }
122  
123 AliAnalysisTaskHLT::AliAnalysisTaskHLT(const char *name)
124   :
125   AliAnalysisTaskSE(name)    
126   ,fOutputList(0)
127   ,fHistTrigger(0)
128   ,fHistHLTTrigger(0)  
129   ,fChargeOff(0)  
130   ,fMomentumOff(0)      
131   ,fDCAOff(0)   
132   ,fNclusterOff(0)
133   ,fNclusterOffwCut(0)  
134   ,fdEdxOff(0)  
135   ,fdEdxVSPOff(0)       
136   ,fPhiOff(0)   
137   ,fThetaOff(0) 
138   ,fMultOff(0)  
139   ,fVertexVSNtracksOff(0)
140   ,fXYvertexOff(0)      
141   ,fXvertexOff(0)           
142   ,fYvertexOff(0)           
143   ,fZvertexOff(0)
144   ,fEtaOff(0)
145   ,fEtaDCAcutOff(0)
146   ,fEtaOffTpc(0)
147   ,fEtaOffTpcIts(0)
148   ,fNclusVSphiOff(0)
149   ,fNclusVSthetaOff(0)
150   ,fStatusOff(0)
151   ,fStatusOff_Ocl(0)
152   ,fEventSpecieOff(0)
153
154   ,fChargeHLT(0)      
155   ,fMomentumHLT(0)
156   ,fDCAHLT(0)  
157   ,fNclusterHLT(0)
158   ,fNclusterHLTwCut(0)
159   ,fdEdxHLT(0)    
160   ,fdEdxVSPHLT(0)
161   ,fPhiHLT(0)     
162   ,fThetaHLT(0)  
163   ,fMultHLT(0)  
164   ,fVertexVSNtracksHLT(0) 
165   ,fXYvertexHLT(0)
166   ,fXvertexHLT(0)
167   ,fYvertexHLT(0)
168   ,fZvertexHLT(0)
169   ,fEtaHLT(0)
170   ,fEtaDCAcutHLT(0)
171   ,fEtaHLTTpc(0)
172   ,fEtaHLTTpcIts(0)
173   ,fNclusVSphiHLT(0)        
174   ,fNclusVSthetaHLT(0)
175   ,fStatusHLT(0)
176   ,fStatusHLT_Ocl(0)    
177   ,fEventSpecieHLT(0)
178   //     ,fDCAOff_trig(0)
179   //     ,fNclusterOff_trig(0)
180   //     
181   //     ,fDCAHLT_trig(0)
182   //     ,fNclusterHLT_trig(0)
183
184 {
185   // Constructor
186
187   // Define input and output slots here
188   // Input slot #0 works with a TChain
189   // DefineInput(0, TChain::Class());
190   // Output slot #0 writes into a TH1 container
191
192   DefineOutput(1, TList::Class());
193 }
194
195 // const Float_t AliAnalysisTaskHLT::fgkEtaMin = -0.12;  
196 // const Float_t AliAnalysisTaskHLT::fgkEtaMax =  0.12;  
197 // const Float_t AliAnalysisTaskHLT::fgkPhiMin[5]   = {3.83972, 4.18879, 4.53786, 4.88692, 5.23599};  
198 // const Float_t AliAnalysisTaskHLT::fgkPhiMax[5]   = {4.18879, 4.53786, 4.88692, 5.23599, 5.58505};  
199 // const Float_t AliAnalysisTaskHLT::fgkNormX[5]    = {-0.642788, -0.34202, 0, 0.34202, 0.642788};  
200 // const Float_t AliAnalysisTaskHLT::fgkNormY[5]    = {-0.766044, -0.939693, -1, -0.939693, -0.766044};  
201 // const Float_t AliAnalysisTaskHLT::fgkInitPosX[5] = {-295.682, -157.329, 0, 157.329, 295.682};  
202 // const Float_t AliAnalysisTaskHLT::fgkInitPosY[5] = {-352.38, -432.259, -460, -432.259, -352.38};
203
204 //----------------------------------------------------------------------------------------------------
205
206 void AliAnalysisTaskHLT::UserCreateOutputObjects(){
207   // Create histograms
208
209   OpenFile(1);
210
211   fOutputList = new TList();
212   fOutputList->SetName(GetName());
213
214   /*
215   //0 mistriggered, 1 Good triggered, 2, triggered, 3 fake trigger, 
216   //4 events with offline track, 5 total events processed,
217   //6 offline track thru CE, 7 online track to CE
218   fHistTrigger = new TH1F("fHistTrigger", "Trigger Status", 8, -0.5, 7.5);
219   fHistTrigger->GetXaxis()->SetTitle("");
220   fHistTrigger->GetYaxis()->SetTitle("Events");
221   fHistTrigger->SetMarkerStyle(kFullCircle);
222   fHistTrigger->SetStats(0);
223   fHistTrigger->SetFillColor(2);
224   //fHistTrigger->SetDrawOption("B TEXT60");
225
226   //Set bin labels
227   (fHistTrigger->GetXaxis())->SetBinLabel(1,"missed");
228   (fHistTrigger->GetXaxis())->SetBinLabel(2,"triggerWofflTrk");
229   (fHistTrigger->GetXaxis())->SetBinLabel(3,"triggered");
230   (fHistTrigger->GetXaxis())->SetBinLabel(4,"triggerWOofflTrk");
231   (fHistTrigger->GetXaxis())->SetBinLabel(5,"NevWofflTrk");
232   (fHistTrigger->GetXaxis())->SetBinLabel(6,"Nevt");
233   (fHistTrigger->GetXaxis())->SetBinLabel(7,"offlTrkThruCE");
234   (fHistTrigger->GetXaxis())->SetBinLabel(8,"onlTrkThruCE"); 
235   */
236
237   fHistTrigger = new TH1F("fHistTrigger", "CTP trigger counter", 64, 0, 64);
238   fHistTrigger->GetXaxis()->SetTitle("");  
239   fHistTrigger->GetYaxis()->SetTitle("#Events"); 
240
241   fHistHLTTrigger = new TH1F("fHistHLTTrigger", "HLT CTP trigger counter", 64, 0, 64); 
242   fHistHLTTrigger->GetXaxis()->SetTitle("");
243   fHistHLTTrigger->GetYaxis()->SetTitle("#Events");
244
245   fChargeOff = new TH1F("fCharge_off", "Charge distribution (Offline)", 12, -3, 3);  
246   fChargeHLT = new TH1F("fCharge_hlt", "Charge distribution (HLT)", 12, -3, 3);  
247
248   
249   fMomentumOff = new TH1F("fMomentum_off", "momentum (offline)",1000, 0., 100);
250   fMomentumHLT = new TH1F("fMomentum_hlt", "momentum (HLT)",    1000, 0., 100);
251  
252   fDCAOff = new TH1F("fDCA_off","DCA to beam line (offline)",200, -100, 100);
253   fDCAHLT = new TH1F("fDCA_hlt","DCA to beam line (HLT)",    200, -100, 100);
254  
255   fNclusterOff = new TH1F("fNcluster_off","clusters per track (offline)", 200, 0, 200);
256   fNclusterHLT = new TH1F("fNcluster_hlt","clusters per track (HLT)",     200, 0, 200);
257  
258   fNclusterOffwCut = new TH1F("fNcluster_wcut_off","clusters per track with cuts (offline)", 200, 0, 200);
259   fNclusterHLTwCut = new TH1F("fNcluster_wcut_hlt","clusters per track with cuts (HLT)",     200, 0, 200);
260  
261   fdEdxOff = new TH1F("fdEdx_off","energy loss (offline)",             500, 0, 500);
262   fdEdxHLT = new TH1F("fdEdx_hlt","energy loss (HLT) - not filled yet",500, 0, 500);
263  
264   fdEdxVSPOff = new TH2F("fdEdx_vs_P_off","dE/dx vs. momentum (offline)",             300, 0., 3., 500, 0., 500.);
265   fdEdxVSPHLT = new TH2F("fdEdx_vs_P_hlt","dE/dx vs. momentum (HLT) - not filled yet",300, 0., 3., 500, 0., 500.);
266
267   fPhiOff = new TH1F("fPhi_off","azimuthal angle distribution (offline)",90,0,360);
268   fPhiHLT = new TH1F("fPhi_hlt","azimuthal angle distribution (HLT)",    90,0,360);
269   
270   fThetaOff = new TH1F("fTheta_off","polar angle distribution (offline)",180,0,180);
271   fThetaHLT = new TH1F("fTheta_hlt","polar angle distribution (HLT)",    180,0,180);
272   
273   fMultOff = new TH1F("fMult_off","track multiplicity (offline)",100,0,100);
274   fMultHLT = new TH1F("fMult_hlt","track multiplicity (HLT)",    100,0,100);
275
276   fVertexVSNtracksOff = new TH2F("fVertexNtracs_off", "Vertex resolution vs nr contributing tracks (Offline)",20, 0, 20, 40, -2, 2); 
277   fVertexVSNtracksHLT =  new TH2F("fVertexNtracs_hlt", "Vertex resolution vs nr contributing tracks (HLT)",20, 0, 20, 40, -2, 2); 
278   
279   fXYvertexOff = new TH2F("fXYvertex_off","XY primary vertex (offline)",100,-5,5,100,-5,5);
280   fXYvertexHLT = new TH2F("fXYvertex_hlt","XY primary vertex (HLT)",    100,-5,5,100,-5,5);
281   
282   fXvertexOff = new TH1F("fXvertex_off","X primary vertex (offline)",1000,-1,1);
283   fXvertexHLT = new TH1F("fXvertex_hlt","X primary vertex (HLT)",    1000,-1,1);
284  
285   fYvertexOff = new TH1F("fYvertex_off","Y primary vertex (offline)",1000,-1,1);
286   fYvertexHLT = new TH1F("fYvertex_hlt","Y primary vertex (HLT)",    1000,-1,1);
287  
288   fZvertexOff = new TH1F("fZvertex_off","Z primary vertex (offline)",250,-30,30);
289   fZvertexHLT = new TH1F("fZvertex_hlt","Z primary vertex (HLT)",    250,-30,30);
290   
291   fEtaOff = new TH1F("fEta_off","pseudorapidity (offline)",100,-3,3);
292   fEtaHLT = new TH1F("fEta_hlt","pseudorapidity (HLT)",    100,-3,3);
293  
294   fEtaDCAcutOff = new TH1F("fEtaDCAcut_off","pseudorapidity DCAcut (offline)",100,-3,3);
295   fEtaDCAcutHLT = new TH1F("fEtaDCAcut_hlt","pseudorapidity DCAcut (HLT)",    100,-3,3);
296  
297   fEtaOffTpc = new TH1F("fEtaTpc_off","pseudorapidity for kTPCin (offline)",100,-3,3);
298   fEtaHLTTpc = new TH1F("fEtaTpc_hlt","pseudorapidity for kTPCin (HLT)",    100,-3,3);
299
300   fEtaOffTpcIts = new TH1F("fEtaTpcIts_off","pseudorapidity for kTPCin && kITSin (offline)",100,-3,3);
301   fEtaHLTTpcIts = new TH1F("fEtaTpcIts_hlt","pseudorapidity for kTPCin && kITSin (HLT)",    100,-3,3);
302
303   fNclusVSphiOff = new TH2F("fNclus_vs_phi_off","clusters per track vs. #phi (offline)",360,0,360,160,0,160);
304   fNclusVSphiHLT = new TH2F("fNclus_vs_phi_hlt","clusters per track vs. #phi (HLT)",    360,0,360,160,0,160);
305   
306   fNclusVSthetaOff = new TH2F("fNclus_vs_theta_off","clusters per track vs. #theta (offline)",180,0,180,160,0,160);
307   fNclusVSthetaHLT = new TH2F("fNclus_vs_theta_hlt","clusters per track vs. #theta (HLT)",    180,0,180,160,0,160);
308
309   fStatusOff = new TH1F("fStatus_off", "Status for different detectors (offline)",12, 0, 12);
310   fStatusHLT = new TH1F("fStatus_hlt", "Status for different detectors (HLT)",    12, 0, 12);
311   
312   fStatusOff_Ocl = new TH1F("fStatus_Ocl_off", "Status for different detectors when #TPCcl=0 (offline)",12, 0, 12);
313   fStatusHLT_Ocl = new TH1F("fStatus_Ocl_hlt", "Status for different detectors when #TPCcl=0 (HLT)",    12, 0, 12);
314
315   fEventSpecieOff = new TH1F("fEventSpecie_off","Eventspecie for Offline",18, 0, 18);
316   fEventSpecieHLT = new TH1F("fEventSpecie_hlt","Eventspecie for HLT",18, 0, 18);
317
318   //---------------------- add histograms to the output TList ------------------//
319
320   fOutputList->Add(fHistTrigger);
321   fOutputList->Add(fHistHLTTrigger);
322
323   fOutputList->Add(fChargeOff);
324   fOutputList->Add(fMomentumOff);
325   fOutputList->Add(fDCAOff);      
326   fOutputList->Add(fNclusterOff);
327   fOutputList->Add(fNclusterOffwCut);
328   fOutputList->Add(fdEdxOff);     
329   fOutputList->Add(fdEdxVSPOff);
330   fOutputList->Add(fPhiOff);      
331   fOutputList->Add(fThetaOff);    
332   fOutputList->Add(fMultOff);
333   fOutputList->Add(fVertexVSNtracksOff);
334   fOutputList->Add(fXYvertexOff); 
335   fOutputList->Add(fXvertexOff);  
336   fOutputList->Add(fYvertexOff);  
337   fOutputList->Add(fZvertexOff);  
338   fOutputList->Add(fEtaOff);  
339   fOutputList->Add(fEtaDCAcutOff);
340   fOutputList->Add(fEtaOffTpc);
341   fOutputList->Add(fEtaOffTpcIts);
342   fOutputList->Add(fNclusVSphiOff);  
343   fOutputList->Add(fNclusVSthetaOff);
344   fOutputList->Add(fStatusOff);
345   fOutputList->Add(fStatusOff_Ocl);
346   fOutputList->Add(fEventSpecieOff);
347
348   fOutputList->Add(fChargeHLT);  
349   fOutputList->Add(fMomentumHLT); 
350   fOutputList->Add(fDCAHLT);      
351   fOutputList->Add(fNclusterHLT); 
352   fOutputList->Add(fNclusterHLTwCut); 
353   fOutputList->Add(fdEdxHLT);     
354   fOutputList->Add(fdEdxVSPHLT);
355   fOutputList->Add(fPhiHLT);      
356   fOutputList->Add(fThetaHLT);    
357   fOutputList->Add(fMultHLT);    
358   fOutputList->Add(fVertexVSNtracksHLT); 
359   fOutputList->Add(fXYvertexHLT); 
360   fOutputList->Add(fXvertexHLT);  
361   fOutputList->Add(fYvertexHLT);  
362   fOutputList->Add(fZvertexHLT);    
363   fOutputList->Add(fEtaHLT);  
364   fOutputList->Add(fEtaDCAcutHLT);
365   fOutputList->Add(fEtaHLTTpc);  
366   fOutputList->Add(fEtaHLTTpcIts);    
367   fOutputList->Add(fNclusVSphiHLT);  
368   fOutputList->Add(fNclusVSthetaHLT);
369   fOutputList->Add(fStatusHLT);
370   fOutputList->Add(fStatusHLT_Ocl);
371   fOutputList->Add(fEventSpecieHLT);
372
373   SetupESDtrackCuts();
374 }
375
376 void AliAnalysisTaskHLT::NotifyRun(){
377   // This will not work if the active trigger classes change from run to run.
378   // Then one has to know all trigger classes before processing the data.
379
380   AliESDEvent *esdOFF = dynamic_cast<AliESDEvent*>(InputEvent());
381   TString trgClasses = esdOFF->GetESDRun()->GetActiveTriggerClasses(); 
382  
383   fTrgClsArray = trgClasses.Tokenize(" ");
384      
385   for(Int_t i=0; i<fTrgClsArray->GetEntries(); i++){ 
386     TString str = ((TObjString *)fTrgClsArray->At(i))->GetString(); 
387     (fHistTrigger->GetXaxis())->SetBinLabel(i+1, str.Data()); 
388     (fHistHLTTrigger->GetXaxis())->SetBinLabel(i+1, str.Data()); 
389   }   
390   esdOFF = NULL;
391
392   TString Statusnames[12]={"kTPCin",
393                            "kITSin",
394                            "kTPCout",
395                            "kITSout",
396                            "kITSrefit",
397                            "kTPCrefit",
398                            "kTRDin",
399                            "kTRDout",
400                            "kTRDrefit",
401                            "kTOFin",
402                            "kTOFout",
403                            "kTOFrefit"};
404
405   for(int iii=0;iii<12;iii++){
406     (fStatusHLT->GetXaxis())->SetBinLabel(iii+1,Statusnames[iii]);
407     (fStatusOff->GetXaxis())->SetBinLabel(iii+1,Statusnames[iii]);
408     (fStatusHLT_Ocl->GetXaxis())->SetBinLabel(iii+1,Statusnames[iii]);
409     (fStatusOff_Ocl->GetXaxis())->SetBinLabel(iii+1,Statusnames[iii]);
410   }
411
412 }
413
414 void AliAnalysisTaskHLT::UserExec(Option_t *){
415   // see header file of AliAnalysisTask for documentation
416
417   AliESDEvent *esdOFF = dynamic_cast<AliESDEvent*>(InputEvent());
418   
419   if(!esdOFF){
420         Printf("ERROR: fESD not available");
421     return;
422   }
423   
424   AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*>(fInputHandler);
425   AliESDEvent *esdHLT = NULL;   
426   if(esdH) esdHLT = esdH->GetHLTEvent();
427     
428   if(!esdHLT){
429     Printf("ERROR: HLTesd not available");
430     return;
431   }
432
433   
434   //Fill CTP Trigger stuff
435   //fHistTrigger->Fill(esdOFF->GetTriggerMask());
436   
437   for(Int_t i=0; i<fTrgClsArray->GetEntries(); i++){
438     if((esdOFF->GetFiredTriggerClasses()).Contains(((TObjString *)fTrgClsArray->At(i))->GetString()))// && esdOFF->GetEventSpecie()==16)  
439       fHistTrigger->Fill(i);
440     if((esdHLT->GetFiredTriggerClasses()).Contains(((TObjString *)fTrgClsArray->At(i))->GetString()))// && esdOFF->GetEventSpecie()==16)  
441       fHistHLTTrigger->Fill(i);
442   }
443
444   Double_t DCAcut = 7.0;
445   Double_t Momcut= 0.3;
446
447   char test[50];
448   sprintf(test,"pseudorapidity (HLT), DCA cut = %f,\n Momentum cut = %f, TPC clusters > 70" , DCAcut, Momcut);
449   fEtaDCAcutHLT->SetTitle(test);
450   sprintf(test,"pseudorapidity (offline), DCA cut = %f, Momentum cut = %f, TPC clusters > 70", DCAcut, Momcut);
451   fEtaDCAcutOff->SetTitle(test);
452
453   Double_t bfield = esdOFF->GetMagneticField();
454  
455   UInt_t Statusnames[12]={AliESDtrack::kTPCin,
456                           AliESDtrack::kITSin,
457                           AliESDtrack::kTPCout,
458                           AliESDtrack::kITSout,
459                           AliESDtrack::kITSrefit,
460                           AliESDtrack::kTPCrefit,
461                           AliESDtrack::kTRDin,
462                           AliESDtrack::kTRDout,
463                           AliESDtrack::kTRDrefit,
464                           AliESDtrack::kTOFin,
465                           AliESDtrack::kTOFout,
466                           AliESDtrack::kTOFrefit};
467   
468
469
470   //---------------- HLT ESD tree -----------------------//
471
472   if(esdHLT->GetNumberOfTracks()!=0)
473     fMultHLT->Fill( esdHLT->GetNumberOfTracks() );
474          
475   Double_t vertexHLT[3];
476
477   const AliESDVertex *vertHLT=esdHLT->GetPrimaryVertexTracks();
478
479   vertexHLT[0] = vertHLT->GetX();
480   vertexHLT[1] = vertHLT->GetY();
481   vertexHLT[2] = vertHLT->GetZ();
482   AliVertex *primVertexHLT = new AliVertex(vertexHLT, 0., 0);
483
484   Bool_t testVertexHLT=kTRUE;
485   if(vertHLT->GetNContributors()<1) {
486     // SPD vertex
487     vertHLT = esdHLT->GetPrimaryVertexSPD();
488     if(vertHLT->GetNContributors()<1) {
489       // NO GOOD VERTEX, SKIP EVENT 
490       testVertexHLT=kFALSE;
491     }
492   }
493   fVertexVSNtracksHLT->Fill(vertHLT->GetNContributors(),vertHLT->GetZv());
494   if(vertHLT->GetZ()!=0){
495     fXYvertexHLT->Fill(vertHLT->GetX(), vertHLT->GetY() );
496     fXvertexHLT->Fill( vertHLT->GetX() );
497     fYvertexHLT->Fill( vertHLT->GetY() );
498     fZvertexHLT->Fill( vertHLT->GetZ() );
499   }
500
501
502   if(testVertexHLT){
503     //if( vertHLT && vertHLT->GetNContributors() >= 5 && (TMath::Abs(vertHLT->GetZ())<5.5) ){
504
505     fEventSpecieHLT->Fill(esdHLT->GetEventSpecie());
506
507     for(Int_t i=0; i<esdHLT->GetNumberOfTracks(); i++){ 
508   
509       AliESDtrack *esdtrackHLT = esdHLT->GetTrack(i); 
510       if(!esdtrackHLT){
511         continue;
512       }
513
514       //Fill which status flags that are set for an event
515       for(int jjj=0;jjj<12;jjj++){
516         if(esdtrackHLT->GetStatus()&Statusnames[jjj]) {
517           fStatusHLT->Fill(jjj);
518           if(esdtrackHLT->GetTPCNcls()==0) fStatusHLT_Ocl->Fill(jjj);
519         }
520       } 
521
522       if(esdtrackHLT->GetTPCNcls()>0) fNclusterHLT->Fill(esdtrackHLT->GetTPCNcls());
523       fChargeHLT->Fill(esdtrackHLT->Charge());
524  
525       if(esdtrackHLT->GetStatus()&AliESDtrack::kTPCin) fEtaHLTTpc->Fill(esdtrackHLT->Eta());
526       if (esdtrackHLT->GetStatus()&AliESDtrack::kTPCin && esdtrackHLT->GetStatus()&AliESDtrack::kITSin)  fEtaHLTTpcIts->Fill(esdtrackHLT->Eta());   
527       //ESD-cut
528       if(!fESDHLTtrackCuts->AcceptTrack(esdtrackHLT) )continue;         
529       
530       if((esdHLT->GetEventSpecie()==16)) {
531         Printf("Reject laser event %d",esdOFF->GetEventSpecie());
532         continue; //reject laser events
533       }
534       
535       if(esdtrackHLT->GetTPCNcls()>0) fNclusVSphiHLT->Fill(esdtrackHLT->Phi()*TMath::RadToDeg(), esdtrackHLT->GetTPCNcls());
536       if(esdtrackHLT->GetTPCNcls()>0) fNclusVSthetaHLT->Fill(esdtrackHLT->Theta()*TMath::RadToDeg(), esdtrackHLT->GetTPCNcls());
537       fEtaHLT->Fill(esdtrackHLT->Eta());
538  
539       fDCAHLT->Fill(esdtrackHLT->GetD(esdHLT->GetPrimaryVertex()->GetXv(), esdHLT->GetPrimaryVertex()->GetYv(), bfield) ); 
540       
541       fdEdxHLT->Fill( esdtrackHLT->GetTPCsignal() );
542       fdEdxVSPHLT->Fill( TMath::Abs(esdtrackHLT->P()), esdtrackHLT->GetTPCsignal() );         
543
544
545       if(TMath::Abs(esdtrackHLT->Pt()) <Momcut) continue; //cut away tracks with mom<0.3GeV
546       fEtaDCAcutHLT->Fill(esdtrackHLT->Eta());
547       fPhiHLT->Fill(esdtrackHLT->Phi()*TMath::RadToDeg());
548       fThetaHLT->Fill(esdtrackHLT->Theta()*TMath::RadToDeg());
549       if(esdtrackHLT->GetTPCNcls()>0) fNclusterHLTwCut->Fill(esdtrackHLT->GetTPCNcls());
550       fMomentumHLT->Fill( TMath::Abs(esdtrackHLT->P()) ); 
551
552           
553       if(esdHLT->IsHLTTriggerFired()){
554                     
555       }// end if for triggered hlt events        
556     } // end of loop over hlt tracks
557   }  
558
559
560   //----------------- OFFLINE ESD tree ----------------//
561   
562   if(esdOFF->GetNumberOfTracks()!=0)
563     fMultOff->Fill( esdOFF->GetNumberOfTracks() );
564
565   Double_t vertexOFF[3];
566
567   const AliESDVertex *vertOff=esdOFF->GetPrimaryVertexTracks();
568
569   vertexOFF[0] = vertOff->GetX();
570   vertexOFF[1] = vertOff->GetY();
571   vertexOFF[2] = vertOff->GetZ();
572   AliVertex *primVertexOFF = new AliVertex(vertexOFF, 0., 0);
573   Bool_t testVertex=kTRUE;
574
575   if(vertOff->GetNContributors()<1) {
576     // SPD vertex
577     vertOff = esdOFF->GetPrimaryVertexSPD();
578     if(vertOff->GetNContributors()<1) {
579       // NO GOOD VERTEX, SKIP EVENT 
580       testVertex=kFALSE;
581       //      Printf("This vertex is away");
582     }
583   }
584   fVertexVSNtracksOff->Fill(vertOff->GetNContributors(),vertOff->GetZv());
585   
586   if(vertOff->GetZ()!=0){
587     fXYvertexOff->Fill(vertOff->GetX(), vertOff->GetY() );
588     fXvertexOff->Fill( vertOff->GetX() );
589     fYvertexOff->Fill( vertOff->GetY() );
590     fZvertexOff->Fill( vertOff->GetZ() );
591   }
592
593   if(testVertex){ 
594
595     fEventSpecieOff->Fill(esdOFF->GetEventSpecie());
596
597     for(Int_t i=0; i<esdOFF->GetNumberOfTracks(); i++){ 
598      
599       AliESDtrack *esdtrackOFF = esdOFF->GetTrack(i); 
600
601       if (!esdtrackOFF) continue;
602
603       fChargeOff->Fill(esdtrackOFF->Charge());
604
605       if(esdtrackOFF->GetStatus()&AliESDtrack::kTPCin) fEtaOffTpc->Fill(esdtrackOFF->Eta());
606       if (esdtrackOFF->GetStatus()&AliESDtrack::kTPCin && esdtrackOFF->GetStatus()&AliESDtrack::kITSin)  fEtaOffTpcIts->Fill(esdtrackOFF->Eta());   
607       
608       //Fill histograms with which flags are set
609       for(int jjj=0;jjj<12;jjj++){
610         if(esdtrackOFF->GetStatus()&Statusnames[jjj]) {
611           fStatusOff->Fill(jjj);
612           if(esdtrackOFF->GetTPCNcls()==0) fStatusOff_Ocl->Fill(jjj);
613         }
614       } 
615       if(esdtrackOFF->GetTPCNcls()>0) fNclusterOff->Fill(esdtrackOFF->GetTPCNcls()); 
616
617
618       if(!fESDOfftrackCuts->AcceptTrack(esdtrackOFF) ) continue;// -- ESD cuts
619       if((esdOFF->GetEventSpecie()==16)) continue;        // reject laser events
620       if(esdtrackOFF->GetTPCNcls()>0) fNclusVSphiOff->Fill(esdtrackOFF->Phi()*TMath::RadToDeg(), esdtrackOFF->GetTPCNcls());
621       if(esdtrackOFF->GetTPCNcls()>0) fNclusVSthetaOff->Fill(esdtrackOFF->Theta()*TMath::RadToDeg(), esdtrackOFF->GetTPCNcls());
622
623       fDCAOff->Fill(esdtrackOFF->GetD(esdOFF->GetPrimaryVertex()->GetXv(), esdOFF->GetPrimaryVertex()->GetYv(), bfield) ); 
624       fEtaOff->Fill(esdtrackOFF->Eta());          
625       fdEdxOff->Fill( esdtrackOFF->GetTPCsignal() );
626       fdEdxVSPOff->Fill( TMath::Abs(esdtrackOFF->P()), esdtrackOFF->GetTPCsignal() );         
627           
628       if(TMath::Abs(esdtrackOFF->Pt()) < Momcut) continue;//cut away tracks with mom<0.3GeV
629       fEtaDCAcutOff->Fill(esdtrackOFF->Eta()); 
630       fPhiOff->Fill(esdtrackOFF->Phi()*TMath::RadToDeg());
631       fThetaOff->Fill(esdtrackOFF->Theta()*TMath::RadToDeg());
632       if(esdtrackOFF->GetTPCNcls()>0) fNclusterOffwCut->Fill(esdtrackOFF->GetTPCNcls()); 
633       fMomentumOff->Fill( TMath::Abs(esdtrackOFF->P()) ); 
634       
635           
636       if(esdHLT->IsHLTTriggerFired()){
637             
638       } // end if for triggered offl events
639
640     } // end of loop over offl tracks
641   
642   }
643
644
645   //   if(esdHLT->IsHLTTriggerFired()){
646   // 
647   //      for(Int_t i=0; i<esdOFF->GetNumberOfTracks(); i++){ 
648   //         
649   //     AliESDtrack *esdTrk = esdOFF->GetTrack(i);      
650   //          Double_t dz[2] = {-999., -999.};  
651   //          Double_t covar[3] = {0};
652   //          esdTrk->PropagateToDCA(vtx, bfield, 250., dz, covar);
653   //          fHistOfflDZTrig->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1]));
654   //       
655   //          fHistOfflDZ->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1]));
656   //       
657   //          /*
658   //          Double_t pnt[3] = {0., 0., 0.};
659   //          Double_t norm[3] = {0., 0., 1.};
660   //          if(esdTrk->Intersect(pnt, norm, bfield)){
661   //               if(TMath::Sqrt(pnt[0]*pnt[0]+pnt[1]*pnt[1]) < 250) {
662   //                 fNtracksThruZ0++;
663   //                 fNtracksThruZ0Trig++;
664   //                 fHistTrigger->Fill(6., 1);
665   //                 fHistTrigger->Fill(7., 1);
666   //               }
667   //          }
668   //          */
669   // 
670   //          fHistOfflTrkDCATrig->Fill(TMath::Abs(esdTrk->GetD(0., 0., bfield)));
671   //          fDCAOff->Fill(TMath::Abs(esdTrk->GetD(0., 0., bfield))); 
672   // 
673   //          if(esdTrk->GetTPCNcls()>0){
674   //        fHistOfflTrkNclsTrig->Fill(esdTrk->GetTPCNcls()); 
675   //        fHistOfflTrkNcls->Fill(esdTrk->GetTPCNcls());
676   //          }
677   // 
678   //          fHistOfflTrkPTrig->Fill(TMath::Abs(esdTrk->P()));
679   //          fHistOfflTrkP->Fill(TMath::Abs(esdTrk->P()));
680   //          fHistOffldEdx->Fill( esdTrk->GetTPCsignal());
681   //          fHistOffldEdxVsP->Fill(TMath::Abs(esdTrk->P()), esdTrk->GetTPCsignal());
682   //      }
683   
684   delete primVertexOFF;
685   delete primVertexHLT;
686   
687   // Post output data.
688   PostData(1, fOutputList);
689 }
690
691 void AliAnalysisTaskHLT::Terminate(Option_t *){
692   // see header file of AliAnalysisTask for documentation
693
694   // Draw result to the screen
695   // Called once at the end of the query
696
697   Bool_t print_png=kFALSE;
698   if(print_png){
699
700     Int_t maxbin =0;
701
702     TCanvas *c1 = new TCanvas("c1","Info pr track, Offline vs Online",10,10,1210,810);
703      
704     c1->Divide(3,2);
705      
706     c1->cd(1);
707     maxbin =fEtaOff->GetBinContent(fEtaOff->GetMaximumBin());
708     if(maxbin < fEtaHLT->GetBinContent(fEtaHLT->GetMaximumBin()))
709       maxbin=fEtaHLT->GetBinContent(fEtaHLT->GetMaximumBin());
710     fEtaOff->SetMaximum(maxbin+20);
711     fEtaOff->SetTitle("Pseudorapidity (without momentum cut)");
712     fEtaOff->SetLineColor(2);
713     fEtaOff->DrawCopy("");
714     fEtaHLT->DrawCopy("sameS");
715  
716     TLegend *legend = new TLegend(0.70,0.60,0.90,0.75);
717     legend->AddEntry(fEtaOff, "Offline", "LP");
718     legend->AddEntry(fEtaHLT,"HLT","LP");
719     legend->SetFillColor(10);
720     legend->SetBorderSize(0);
721     legend->Draw("");
722
723     c1->cd(2);
724     maxbin =fEtaDCAcutOff->GetBinContent(fEtaDCAcutOff->GetMaximumBin());
725     if(maxbin < fEtaDCAcutHLT->GetBinContent(fEtaDCAcutHLT->GetMaximumBin()))
726       maxbin=fEtaDCAcutHLT->GetBinContent(fEtaDCAcutHLT->GetMaximumBin());
727     fEtaDCAcutOff->SetMaximum(maxbin+20);
728     fEtaDCAcutOff->SetTitle("Pseudorapidity");
729     fEtaDCAcutOff->SetLineColor(2);
730     fEtaDCAcutOff->DrawCopy("");
731     fEtaDCAcutHLT->DrawCopy("sames");
732
733     c1->cd(3);
734     maxbin =fNclusterOff->GetBinContent(fNclusterOff->GetMaximumBin());
735     if(maxbin < fNclusterHLT->GetBinContent(fNclusterHLT->GetMaximumBin()))
736       maxbin=fNclusterHLT->GetBinContent(fNclusterHLT->GetMaximumBin());
737     fNclusterOff->SetMaximum(maxbin+20);
738     fNclusterOff->SetLineColor(2);
739     fNclusterOff->SetTitle("Nr clusters per track");
740     fNclusterOff->DrawCopy("");
741     fNclusterHLT->DrawCopy("sames");
742
743     c1->cd(4);
744     maxbin =fPhiOff->GetBinContent(fPhiOff->GetMaximumBin());
745     if(maxbin < fPhiHLT->GetBinContent(fPhiHLT->GetMaximumBin()))
746       maxbin=fPhiHLT->GetBinContent(fPhiHLT->GetMaximumBin());
747     fPhiOff->SetMinimum(0);
748     fPhiOff->SetMaximum(maxbin+20);
749     fPhiOff->SetLineColor(2);
750     fPhiOff->SetTitle("Azimuthal angle distribution");
751     fPhiOff->DrawCopy("");
752     fPhiHLT->DrawCopy("sames");
753
754     c1->cd(5);
755     maxbin =fThetaOff->GetBinContent(fThetaOff->GetMaximumBin());
756     if(maxbin < fThetaHLT->GetBinContent(fThetaHLT->GetMaximumBin()))
757       maxbin=fThetaHLT->GetBinContent(fThetaHLT->GetMaximumBin());
758     fThetaOff->SetMaximum(maxbin+20);
759     fThetaOff->SetLineColor(2);
760     fThetaOff->SetTitle("Polar angle distribution");
761     fThetaOff->DrawCopy("");
762     fThetaHLT->DrawCopy("sames");
763
764     c1->cd(6);
765     maxbin =fMomentumOff->GetBinContent(fMomentumOff->GetMaximumBin());
766     if(maxbin < fMomentumHLT->GetBinContent(fMomentumHLT->GetMaximumBin()))
767       maxbin=fMomentumHLT->GetBinContent(fMomentumHLT->GetMaximumBin());
768     fMomentumOff->SetMaximum(maxbin+200);
769     fMomentumOff->GetXaxis()->SetRangeUser(0,5);
770     fMomentumOff->SetLineColor(2);
771     fMomentumOff->SetTitle("Momentum");
772     fMomentumOff->DrawCopy("");
773     fMomentumHLT->DrawCopy("sames");
774
775     TCanvas *c2= new TCanvas("c2", "Info pr event, Offline vs Online", 10 , 10,1210, 810);
776     TLegend *legend2 = new TLegend(0.70,0.60,0.90,0.75);
777     c2->Divide(3,2);
778     c2->cd(1);
779     fXvertexOff->SetTitle("Primary Vertex Distribution in X");
780     fXvertexOff->SetLineColor(2);
781     fXvertexOff->GetXaxis()->SetRangeUser(-0.5,0.5);
782     legend2->AddEntry(fXvertexOff,"Offline","LP");
783     fXvertexOff->DrawCopy("");
784     fXvertexHLT->DrawCopy("sames");
785     legend2->AddEntry(fXvertexHLT,"HLT","LP");
786     legend2->SetFillColor(10);
787     legend2->SetBorderSize(0);
788     legend2->Draw();
789     c2->cd(2);
790     fYvertexOff->SetTitle("Primary Vertex Distribution in Y");
791     fYvertexOff->SetLineColor(2);
792     fYvertexOff->GetXaxis()->SetRangeUser(-0.5,0.5);
793     fYvertexOff->DrawCopy("");
794     fYvertexHLT->DrawCopy("sames");
795     c2->cd(3);
796     fZvertexOff->SetTitle("Primary Vertex Distribution in Z");
797     fZvertexOff->SetLineColor(2);
798     fZvertexOff->DrawCopy("");
799     fZvertexHLT->DrawCopy("sames");
800   
801     c2->cd(4);
802     fMultHLT->SetTitle("Track Multiplicity, NumberTracks>0");
803     fMultHLT->DrawCopy("");
804     fMultOff->SetLineColor(2);
805     fMultOff->DrawCopy("sames");
806
807     string filename="Info_pr_track";
808     char plotname[100];
809     sprintf(plotname,"%s.png",filename.c_str());
810     //  c1->Print("Info_pr_track.png","png");
811     c1->Print(plotname,"png");
812  
813     filename="Info_pr_Event";
814     sprintf(plotname,"%s.png",filename.c_str());
815     c2->Print(plotname,"png");
816   }
817
818 }
819
820 void AliAnalysisTaskHLT::SetupESDtrackCuts() {
821   // Setup ESD cuts
822
823   Bool_t selPrimaries = kTRUE;
824
825   fESDOfftrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2009(selPrimaries);
826
827   fESDHLTtrackCuts = new AliESDtrackCuts;
828
829   // TPC  
830   fESDHLTtrackCuts->SetRequireTPCStandAlone(kTRUE); // to get chi2 and ncls of kTPCin
831   fESDHLTtrackCuts->SetMinNClustersTPC(70);
832   fESDHLTtrackCuts->SetMaxChi2PerClusterTPC(4);
833   fESDHLTtrackCuts->SetAcceptKinkDaughters(kFALSE);
834
835   // -- fESDHLTtrackCuts->SetRequireTPCRefit(kTRUE); -- JMT not present in HLT ESD
836   // ITS
837   // -- fESDHLTtrackCuts->SetRequireITSRefit(kTRUE); -- JMT not present in HLT ESD
838
839   fESDHLTtrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
840                                              AliESDtrackCuts::kAny);
841   if(selPrimaries) { // 7*(0.0050+0.0060/pt^0.9)
842     fESDHLTtrackCuts->SetMaxDCAToVertexXYPtDep("0.0350+0.0420/pt^0.9");
843   }
844   
845   fESDHLTtrackCuts->SetMaxDCAToVertexZ(1.e6);
846   fESDHLTtrackCuts->SetDCAToVertex2D(kFALSE);
847   fESDHLTtrackCuts->SetRequireSigmaToVertex(kFALSE);
848   fESDHLTtrackCuts->SetEtaRange(-0.9,+0.9);
849
850   return;
851 }