]> git.uio.no Git - u/mrichter/AliRoot.git/blob - HLT/QA/tasks/AliAnalysisTaskHLT.cxx
- fixed compilation warning
[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   ,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   
220   fMomentumOff = new TH1F("fMomentum_off", "momentum (offline)",1000, 0., 100);
221   fMomentumHLT = new TH1F("fMomentum_hlt", "momentum (HLT)",    1000, 0., 100);
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
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);
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   
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);
249  
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);
252  
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);
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
385   Double_t DCAcut = 7.0;
386   Double_t Momcut= 0.3;
387
388   char test[50];
389   sprintf(test,"pseudorapidity (HLT), DCA cut = %f,\n Momentum cut = %f, TPC clusters > 70" , DCAcut, Momcut);
390   fEtaDCAcutHLT->SetTitle(test);
391   sprintf(test,"pseudorapidity (offline), DCA cut = %f, Momentum cut = %f, TPC clusters > 70", DCAcut, Momcut);
392   fEtaDCAcutOff->SetTitle(test);
393
394   Double_t bfield = esdOFF->GetMagneticField();
395  
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   
409
410
411   //---------------- HLT ESD tree -----------------------//
412       
413
414   if(esdHLT->GetNumberOfTracks()!=0)
415     fMultHLT->Fill( esdHLT->GetNumberOfTracks() );
416          
417   Double_t vertexHLT[3];
418   
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); 
439     
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           } 
452
453           fEtaHLT->Fill(esdtrackHLT->Eta());
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) ); 
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()){
475                     
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
484   //----------------- OFFLINE ESD tree ----------------//
485   
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   Double_t maxchi2perTPCcl=4.;
492   
493   AliESDtrackCuts* esdtrackCutsITSTPCOff = new AliESDtrackCuts("esdtrackCutsITSTPC");
494   esdtrackCutsITSTPCOff->SetRequireITSRefit(kTRUE);
495   esdtrackCutsITSTPCOff->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
496                                                AliESDtrackCuts::kAny);
497   esdtrackCutsITSTPCOff->SetAcceptKinkDaughters(kFALSE);
498   esdtrackCutsITSTPCOff->SetMinNClustersTPC(minclsTPCOff);
499   esdtrackCutsITSTPCOff->SetMaxChi2PerClusterTPC(maxchi2perTPCcl); 
500
501
502   Double_t vertexOFF[3];
503   const AliESDVertex *vertOff=esdOFF->GetPrimaryVertexTracks();
504
505   vertexOFF[0] = vertOff->GetX();
506   vertexOFF[1] = vertOff->GetY();
507   vertexOFF[2] = vertOff->GetZ();
508   AliVertex *primVertexOFF = new AliVertex(vertexOFF, 0., 0);
509   Bool_t testVertex=kTRUE;
510
511   if(vertOff->GetNContributors()<1) {
512     // SPD vertex
513     vertOff = esdOFF->GetPrimaryVertexSPD();
514     if(vertOff->GetNContributors()<1) {
515       // NO GOOD VERTEX, SKIP EVENT 
516       testVertex=kFALSE;
517     }
518   }
519
520   if(vertOff->GetZ()!=0){
521     fXYvertexOff->Fill(vertOff->GetX(), vertOff->GetY() );
522     fXvertexOff->Fill( vertOff->GetX() );
523     fYvertexOff->Fill( vertOff->GetY() );
524     fZvertexOff->Fill( vertOff->GetZ() );
525   }
526
527   if(testVertex){ 
528
529     for(Int_t i=0; i<esdOFF->GetNumberOfTracks(); i++){ 
530      
531       AliESDtrack *esdtrackOFF = esdOFF->GetTrack(i); 
532
533       if(esdtrackOFF){ 
534         if(!(esdOFF->GetEventSpecie()==16)){ // reject laser events
535
536           if(esdtrackOFF->GetTPCNcls()>0) fNclusVSphiOff->Fill(esdtrackOFF->Phi()*TMath::RadToDeg(), esdtrackOFF->GetTPCNcls());
537           if(esdtrackOFF->GetTPCNcls()>0) fNclusVSthetaOff->Fill(esdtrackOFF->Theta()*TMath::RadToDeg(), esdtrackOFF->GetTPCNcls());
538           
539           for(int jjj=0;jjj<12;jjj++){
540             if(esdtrackOFF->GetStatus()&Statusnames[jjj]) {
541               fStatusOff->Fill(jjj);
542               if(esdtrackOFF->GetTPCNcls()==0) fStatusOff_Ocl->Fill(jjj);
543             }
544           } 
545           Double_t dz[2]    = {-999., -999.};   
546           Double_t covar[3] = {0.,0.,0.};        
547           esdtrackOFF->PropagateToDCA(primVertexOFF, bfield, 250., dz, covar);  
548           
549           fDCAOff->Fill( esdtrackOFF->GetD(esdOFF->GetPrimaryVertex()->GetXv(), esdOFF->GetPrimaryVertex()->GetYv(), bfield) ); 
550           fEtaOff->Fill(esdtrackOFF->Eta());
551           
552
553           //Selection of primary tracks 
554           //chosen after recommendations from: https://twiki.cern.ch/twiki/bin/view/ALICE/SelectionOfPrimaryTracksForPp2009DataAnalysis)
555           // for each track
556           // track quality cuts
557           if(!esdtrackCutsITSTPCOff->AcceptTrack(esdtrackOFF)) continue;
558           // bring it to the primary vertex and compute impact parameters
559           if(!esdtrackOFF->RelateToVertex(vertOff,esdOFF->GetMagneticField(),kVeryBig)) continue; // this is already done in AliReconstruction...
560         
561
562           if(TMath::Abs(esdtrackOFF->GetD(esdOFF->GetPrimaryVertex()->GetXv(), esdOFF->GetPrimaryVertex()->GetYv(), bfield))< DCAcut ){
563
564             fdEdxOff->Fill( esdtrackOFF->GetTPCsignal() );
565             fdEdxVSPOff->Fill( TMath::Abs(esdtrackOFF->P()), esdtrackOFF->GetTPCsignal() );         
566
567             if(TMath::Abs(esdtrackOFF->Pt()) > Momcut){
568               fEtaDCAcutOff->Fill(esdtrackOFF->Eta()); 
569               fPhiOff->Fill(esdtrackOFF->Phi()*TMath::RadToDeg());
570               fThetaOff->Fill(esdtrackOFF->Theta()*TMath::RadToDeg());
571               if(esdtrackOFF->GetStatus()&AliESDtrack::kTPCin || (esdtrackOFF->GetStatus()&AliESDtrack::kTPCin && esdtrackOFF->GetStatus()&AliESDtrack::kITSin) )//{
572                 fNclusterOff->Fill(esdtrackOFF->GetTPCNcls()); 
573               fMomentumOff->Fill( TMath::Abs(esdtrackOFF->P()) ); 
574             
575             }
576
577             if(esdHLT->IsHLTTriggerFired()){
578             
579             } // end if for triggered hlt events
580           }//end if over DCA cut
581         }//end if not calibration event
582       } // end if esdtrack is kTRUE    
583     } // end of loop over hlt tracks  
584   } // end of offline primary vertex conditions 
585
586
587   //   if(esdHLT->IsHLTTriggerFired()){
588   // 
589   //      for(Int_t i=0; i<esdOFF->GetNumberOfTracks(); i++){ 
590   //         
591   //     AliESDtrack *esdTrk = esdOFF->GetTrack(i);      
592   //          Double_t dz[2] = {-999., -999.};  
593   //          Double_t covar[3] = {0};
594   //          esdTrk->PropagateToDCA(vtx, bfield, 250., dz, covar);
595   //          fHistOfflDZTrig->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1]));
596   //       
597   //          fHistOfflDZ->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1]));
598   //       
599   //          /*
600   //          Double_t pnt[3] = {0., 0., 0.};
601   //          Double_t norm[3] = {0., 0., 1.};
602   //          if(esdTrk->Intersect(pnt, norm, bfield)){
603   //               if(TMath::Sqrt(pnt[0]*pnt[0]+pnt[1]*pnt[1]) < 250) {
604   //                 fNtracksThruZ0++;
605   //                 fNtracksThruZ0Trig++;
606   //                 fHistTrigger->Fill(6., 1);
607   //                 fHistTrigger->Fill(7., 1);
608   //               }
609   //          }
610   //          */
611   // 
612   //          fHistOfflTrkDCATrig->Fill(TMath::Abs(esdTrk->GetD(0., 0., bfield)));
613   //          fDCAOff->Fill(TMath::Abs(esdTrk->GetD(0., 0., bfield))); 
614   // 
615   //          if(esdTrk->GetTPCNcls()>0){
616   //        fHistOfflTrkNclsTrig->Fill(esdTrk->GetTPCNcls()); 
617   //        fHistOfflTrkNcls->Fill(esdTrk->GetTPCNcls());
618   //          }
619   // 
620   //          fHistOfflTrkPTrig->Fill(TMath::Abs(esdTrk->P()));
621   //          fHistOfflTrkP->Fill(TMath::Abs(esdTrk->P()));
622   //          fHistOffldEdx->Fill( esdTrk->GetTPCsignal());
623   //          fHistOffldEdxVsP->Fill(TMath::Abs(esdTrk->P()), esdTrk->GetTPCsignal());
624   //      }
625   
626   delete primVertexOFF;
627   delete primVertexHLT;
628   
629   // Post output data.
630   PostData(1, fOutputList);
631 }
632
633 void AliAnalysisTaskHLT::Terminate(Option_t *){
634   // see header file of AliAnalysisTask for documentation
635   // Draw result to the screen
636   // Called once at the end of the query
637
638   //Will create 2 canvases at the end, and store them as .png
639   TCanvas *c1 = new TCanvas("c1","Info pr track, Offline vs Online",10,10,1210,810);
640   Int_t maxbin=0;
641
642   TLegend *legend = new TLegend(0.70,0.60,0.90,0.75);
643   c1->Divide(3,2);
644
645   c1->cd(1);
646   maxbin =fEtaOff->GetBinContent(fEtaOff->GetMaximumBin());
647   if(maxbin < fEtaHLT->GetBinContent(fEtaHLT->GetMaximumBin()))
648     maxbin=fEtaHLT->GetBinContent(fEtaHLT->GetMaximumBin());
649   fEtaOff->SetMaximum(maxbin+20);
650   fEtaOff->SetTitle("Pseudorapidity (only primary vertex cut)");
651   fEtaOff->SetLineColor(2);
652   fEtaOff->DrawCopy("");
653   legend->AddEntry(fEtaOff, "Offline", "LP");
654   fEtaHLT->DrawCopy("sameS");
655   legend->AddEntry(fEtaHLT,"HLT","LP");
656   legend->SetFillColor(10);
657   legend->SetBorderSize(0);
658   legend->Draw();
659
660   c1->cd(2);
661   maxbin =fEtaDCAcutOff->GetBinContent(fEtaDCAcutOff->GetMaximumBin());
662   if(maxbin < fEtaDCAcutHLT->GetBinContent(fEtaDCAcutHLT->GetMaximumBin()))
663     maxbin=fEtaDCAcutHLT->GetBinContent(fEtaDCAcutHLT->GetMaximumBin());
664   fEtaDCAcutOff->SetMaximum(maxbin+20);
665   char etaname[50];
666   sprintf(etaname,"Pseudorapidity");  
667   fEtaDCAcutOff->SetTitle(etaname);
668   fEtaDCAcutOff->SetLineColor(2);
669   fEtaDCAcutOff->DrawCopy("");
670   fEtaDCAcutHLT->DrawCopy("sames");
671
672   c1->cd(3);
673   maxbin =fNclusterOff->GetBinContent(fNclusterOff->GetMaximumBin());
674   if(maxbin < fNclusterHLT->GetBinContent(fNclusterHLT->GetMaximumBin()))
675     maxbin=fNclusterHLT->GetBinContent(fNclusterHLT->GetMaximumBin());
676   fNclusterOff->SetMaximum(maxbin+20);
677   fNclusterOff->SetLineColor(2);
678   fNclusterOff->SetTitle("Nr clusters per track");
679   fNclusterOff->DrawCopy("");
680   fNclusterHLT->DrawCopy("sames");
681
682   c1->cd(4);
683   maxbin =fPhiOff->GetBinContent(fPhiOff->GetMaximumBin());
684   if(maxbin < fPhiHLT->GetBinContent(fPhiHLT->GetMaximumBin()))
685     maxbin=fPhiHLT->GetBinContent(fPhiHLT->GetMaximumBin());
686   fPhiOff->SetMinimum(0);
687   fPhiOff->SetMaximum(maxbin+20);
688   fPhiOff->SetLineColor(2);
689   fPhiOff->SetTitle("Azimuthal angle distribution");
690   fPhiOff->DrawCopy("");
691   fPhiHLT->DrawCopy("sames");
692
693   c1->cd(5);
694   maxbin =fThetaOff->GetBinContent(fThetaOff->GetMaximumBin());
695   if(maxbin < fThetaHLT->GetBinContent(fThetaHLT->GetMaximumBin()))
696     maxbin=fThetaHLT->GetBinContent(fThetaHLT->GetMaximumBin());
697   fThetaOff->SetMaximum(maxbin+20);
698   fThetaOff->SetLineColor(2);
699   fThetaOff->SetTitle("Polar angle distribution");
700   fThetaOff->DrawCopy("");
701   fThetaHLT->DrawCopy("sames");
702
703   c1->cd(6);
704   maxbin =fMomentumOff->GetBinContent(fMomentumOff->GetMaximumBin());
705   if(maxbin < fMomentumHLT->GetBinContent(fMomentumHLT->GetMaximumBin()))
706     maxbin=fMomentumHLT->GetBinContent(fMomentumHLT->GetMaximumBin());
707   fMomentumOff->SetMaximum(maxbin+200);
708   fMomentumOff->GetXaxis()->SetRangeUser(0,5);
709   fMomentumOff->SetLineColor(2);
710   fMomentumOff->SetTitle("Momentum");
711   fMomentumOff->DrawCopy("");
712   fMomentumHLT->DrawCopy("sames");
713
714   TCanvas *c2= new TCanvas("c2", "Info pr event, Offline vs Online", 10 , 10,1210, 810);
715   TLegend *legend2 = new TLegend(0.70,0.60,0.90,0.75);
716   c2->Divide(3,2);
717   c2->cd(1);
718   fXvertexOff->SetTitle("Primary Vertex Distribution in X");
719   fXvertexOff->SetLineColor(2);
720   fXvertexOff->GetXaxis()->SetRangeUser(-0.5,0.5);
721   legend2->AddEntry(fXvertexOff,"Offline","LP");
722   fXvertexOff->DrawCopy("");
723   fXvertexHLT->DrawCopy("sames");
724   legend2->AddEntry(fXvertexHLT,"HLT","LP");
725   legend2->SetFillColor(10);
726   legend2->SetBorderSize(0);
727   legend2->Draw();
728   c2->cd(2);
729   fYvertexOff->SetTitle("Primary Vertex Distribution in Y");
730   fYvertexOff->SetLineColor(2);
731   fYvertexOff->GetXaxis()->SetRangeUser(-0.5,0.5);
732   fYvertexOff->DrawCopy("");
733   fYvertexHLT->DrawCopy("sames");
734   c2->cd(3);
735   fZvertexOff->SetTitle("Primary Vertex Distribution in Z");
736   fZvertexOff->SetLineColor(2);
737   fZvertexOff->DrawCopy("");
738   fZvertexHLT->DrawCopy("sames");
739   
740   c2->cd(4);
741   fMultHLT->SetTitle("Track Multiplicity, NumberTracks>0");
742   fMultHLT->DrawCopy("");
743   fMultOff->SetLineColor(2);
744   fMultOff->DrawCopy("sames");
745
746   string filename="Info_pr_track";
747   char plotname[100];
748   sprintf(plotname,"%s.png",filename.c_str());
749   c1->Print(plotname,"png");
750
751   filename="Info_pr_Event";
752   sprintf(plotname,"%s.png",filename.c_str());
753   c2->Print(plotname,"png");
754
755 }