]> git.uio.no Git - u/mrichter/AliRoot.git/blob - HLT/QA/tasks/AliAnalysisTaskHLTTPC.cxx
- added analysis task for comparing the HLT with the offline esd tree, mainly on...
[u/mrichter/AliRoot.git] / HLT / QA / tasks / AliAnalysisTaskHLTTPC.cxx
1 // $Id$\r
2 \r
3 //**************************************************************************\r
4 //* This file is property of and copyright by the ALICE HLT Project        *\r
5 //* ALICE Experiment at CERN, All rights reserved.                         *\r
6 //*                                                                        *\r
7 //* Primary Authors: Zhongbao Yin <zbyin@mail.ccnu.edu.cn>,                *\r
8 //*                  Kalliopi Kanaki <Kalliopi.Kanaki@ift.uib.no>          *\r
9 //*                  for The ALICE HLT Project.                            *\r
10 //*                                                                        *\r
11 //* Permission to use, copy, modify and distribute this software and its   *\r
12 //* documentation strictly for non-commercial purposes is hereby granted   *\r
13 //* without fee, provided that the above copyright notice appears in all   *\r
14 //* copies and that both the copyright notice and this permission notice   *\r
15 //* appear in the supporting documentation. The authors make no claims     *\r
16 //* about the suitability of this software for any purpose. It is          *\r
17 //* provided "as is" without express or implied warranty.                  *\r
18 //**************************************************************************\r
19 \r
20 /** @file   AliAnalysisTaskHLTTPC.cxx  \r
21     @author Zhongbao Yin, Kalliopi Kanaki\r
22     @date \r
23     @brief\r
24 */\r
25 \r
26 \r
27 #include <iostream>\r
28 \r
29 #include "TChain.h"\r
30 #include "TTree.h"\r
31 #include "TH1F.h"\r
32 #include "TH2F.h"\r
33 #include "TCanvas.h"\r
34 #include "TVector3.h"\r
35 #include "TString.h"\r
36 #include "TObjArray.h"\r
37 #include "TFile.h"\r
38 \r
39 #include "AliESDEvent.h"\r
40 #include "AliESDRun.h"\r
41 #include "AliESDInputHandler.h"\r
42 \r
43 #include "AliAnalysisTask.h"\r
44 #include "AliAnalysisManager.h"\r
45 #include "AliAnalysisTaskHLTTPC.h"\r
46 \r
47 \r
48 ClassImp(AliAnalysisTaskHLTTPC)\r
49 \r
50 //======================================================================================================\r
51  \r
52   AliAnalysisTaskHLTTPC::AliAnalysisTaskHLTTPC(const char *name)\r
53     :\r
54      AliAnalysisTaskSE(name)\r
55     ,fESDRun(0)\r
56     ,fOutputList(0)\r
57     ,fHistTrigger(0)\r
58     ,fHistHLTTrigger(0)\r
59     ,fHistOfflTrkDCA(0)\r
60     ,fHistOfflTrkDCATrig(0)\r
61     ,fHistOfflTrkDCANoTrig(0)\r
62     ,fHistOnlTrkDCA(0)\r
63     ,fHistOnlTrkDCATrig(0)\r
64     ,fHistOfflTrkNcls(0)\r
65     ,fHistOfflTrkNclsTrig(0)\r
66     ,fHistOfflTrkNclsNoTrig(0)\r
67     ,fHistOnlTrkNcls(0)\r
68     ,fHistOnlTrkNclsTrig(0)\r
69     ,fHistOfflTrkDCANoTrigNclsCut1(0)\r
70     ,fHistOfflTrkDCANoTrigNclsCut2(0)\r
71     ,fHistOfflTrkP(0)\r
72     ,fHistOfflTrkPTrig(0)\r
73     ,fHistOfflTrkPNoTrig(0)\r
74     ,fHistOnlTrkP(0)\r
75     ,fHistOfflResPtInv(0)\r
76     ,fHistOnlResPtInv(0)\r
77     ,fHistOffldEdx(0)\r
78     ,fHistOnldEdx(0)\r
79     ,fHistOffldEdxVsP(0)\r
80     ,fHistOnldEdxVsP(0)\r
81     ,fHistOffldZ(0) \r
82     ,fHistOnldZ(0) \r
83     ,fHistOffldX(0) \r
84     ,fHistOnldX(0) \r
85     ,fHistOfflPhi(0) \r
86     ,fHistOnlPhi(0) \r
87     ,fHistOfflTheta(0) \r
88     ,fHistOnlTheta(0)\r
89     ,fHistOnlDZ(0)\r
90     ,fHistOfflDZ(0)\r
91     ,fHistOfflDZTrig(0)\r
92     ,fHistOfflDZNoTrig(0)\r
93     ,fNevt(0)\r
94     ,fTrgClsArray(0)     \r
95      //,fNtracksThruZ0(0),\r
96      //,fNtracksThruZ0Trig(0)\r
97 {\r
98   // Constructor\r
99 \r
100   // Define input and output slots here\r
101   // Input slot #0 works with a TChain\r
102   // DefineInput(0, TChain::Class());\r
103   // Output slot #0 writes into a TH1 container\r
104 \r
105   DefineOutput(1, TList::Class());\r
106 }\r
107 \r
108 const Float_t AliAnalysisTaskHLTTPC::fgkEtaMin = -0.12;  \r
109 const Float_t AliAnalysisTaskHLTTPC::fgkEtaMax =  0.12;  \r
110 const Float_t AliAnalysisTaskHLTTPC::fgkPhiMin[5]   = {3.83972, 4.18879, 4.53786, 4.88692, 5.23599};  \r
111 const Float_t AliAnalysisTaskHLTTPC::fgkPhiMax[5]   = {4.18879, 4.53786, 4.88692, 5.23599, 5.58505};  \r
112 const Float_t AliAnalysisTaskHLTTPC::fgkNormX[5]    = {-0.642788, -0.34202, 0, 0.34202, 0.642788};  \r
113 const Float_t AliAnalysisTaskHLTTPC::fgkNormY[5]    = {-0.766044, -0.939693, -1, -0.939693, -0.766044};  \r
114 const Float_t AliAnalysisTaskHLTTPC::fgkInitPosX[5] = {-295.682, -157.329, 0, 157.329, 295.682};  \r
115 const Float_t AliAnalysisTaskHLTTPC::fgkInitPosY[5] = {-352.38, -432.259, -460, -432.259, -352.38};\r
116 \r
117 //----------------------------------------------------------------------------------------------------\r
118 \r
119 void AliAnalysisTaskHLTTPC::UserCreateOutputObjects(){\r
120 // Create histograms\r
121 \r
122   OpenFile(1);\r
123 \r
124   fOutputList = new TList();\r
125   fOutputList->SetName(GetName());\r
126 \r
127   /*\r
128   //0 mistriggered, 1 Good triggered, 2, triggered, 3 fake trigger, \r
129   //4 events with offline track, 5 total events processed,\r
130   //6 offline track thru CE, 7 online track to CE\r
131   fHistTrigger = new TH1F("fHistTrigger", "Trigger Status", 8, -0.5, 7.5);\r
132   fHistTrigger->GetXaxis()->SetTitle("");\r
133   fHistTrigger->GetYaxis()->SetTitle("Events");\r
134   fHistTrigger->SetMarkerStyle(kFullCircle);\r
135   fHistTrigger->SetStats(0);\r
136   fHistTrigger->SetFillColor(2);\r
137   //fHistTrigger->SetDrawOption("B TEXT60");\r
138 \r
139   //Set bin labels\r
140   (fHistTrigger->GetXaxis())->SetBinLabel(1,"missed");\r
141   (fHistTrigger->GetXaxis())->SetBinLabel(2,"triggerWofflTrk");\r
142   (fHistTrigger->GetXaxis())->SetBinLabel(3,"triggered");\r
143   (fHistTrigger->GetXaxis())->SetBinLabel(4,"triggerWOofflTrk");\r
144   (fHistTrigger->GetXaxis())->SetBinLabel(5,"NevWofflTrk");\r
145   (fHistTrigger->GetXaxis())->SetBinLabel(6,"Nevt");\r
146   (fHistTrigger->GetXaxis())->SetBinLabel(7,"offlTrkThruCE");\r
147   (fHistTrigger->GetXaxis())->SetBinLabel(8,"onlTrkThruCE"); \r
148   */\r
149 \r
150   fHistTrigger = new TH1F("fHistTrigger", "CTP trigger counter", 64, 0, 64);\r
151   fHistTrigger->GetXaxis()->SetTitle("");  \r
152   fHistTrigger->GetYaxis()->SetTitle("#Events"); \r
153 \r
154   fHistHLTTrigger = new TH1F("fHistHLTTrigger", "HLT CTP trigger counter", 64, 0, 64); \r
155   fHistHLTTrigger->GetXaxis()->SetTitle("");\r
156   fHistHLTTrigger->GetYaxis()->SetTitle("#Events");  \r
157  \r
158   fHistOfflTrkDCA       = new TH1F("fHistOfflTrkDCA",      "DCA to beam line (offline)",               250, 0, 250);\r
159   fHistOfflTrkDCATrig   = new TH1F("fHistOfflTrkDCATrig",  "DCA to beam line (triggered offline)",     250, 0, 250);\r
160   fHistOfflTrkDCANoTrig = new TH1F("fHistOfflTrkDCANoTrig","DCA to beam line (offline, not triggered)",250, 0, 250);\r
161  \r
162   fHistOnlTrkDCA     = new TH1F("fHistOnlTrkDCA",    "DCA to beam line (HLT)",          250, 0, 250);\r
163   fHistOnlTrkDCATrig = new TH1F("fHistOnlTrkDCATrig","DCA to beam line (HLT triggered)",250, 0, 250); \r
164  \r
165   fHistOfflTrkNcls       = new TH1F("fHistOfflTrkNcls",      "clusters per track (offline)",               200, 0, 200);\r
166   fHistOfflTrkNclsTrig   = new TH1F("fHistOfflTrkNclsTrig",  "clusters per track (triggered offline)",     200, 0, 200); \r
167   fHistOfflTrkNclsNoTrig = new TH1F("fHistOfflTrkNclsNoTrig","clusters per track (offline, not triggered)",200, 0, 200);\r
168 \r
169   fHistOnlTrkNcls     = new TH1F("fHistOnlTrkNcls",    "clusters per track (HLT)",           200, 0, 200);\r
170   fHistOnlTrkNclsTrig = new TH1F("fHistOnlTrkNclsTrig","clusters per track (HLT triggered)", 200, 0, 200); \r
171  \r
172   fHistOfflTrkDCANoTrigNclsCut1 = new TH1F("fHistOfflTrkDCANoTrigNclsCut1", "DCA to beam line (offline Ncls>=60, not triggered)",250, 0, 250);\r
173   fHistOfflTrkDCANoTrigNclsCut2 = new TH1F("fHistOfflTrkDCANoTrigNclsCut2", "DCA to beam line (offline Ncls<60, not triggered)", 250, 0, 250);\r
174  \r
175   fHistOfflTrkP       = new TH1F("fHistOfflTrkP",      "momentum (offline)",               100, 0., 100);\r
176   fHistOfflTrkPTrig   = new TH1F("fHistOfflTrkPTrig",  "momentum (offline triggered)",     100, 0., 100);\r
177   fHistOfflTrkPNoTrig = new TH1F("fHistOfflTrkPNoTrig","momentum (offline, not triggered)",100, 0., 100);\r
178  \r
179   fHistOnlTrkP = new TH1F("fHistOnlTrkP", "momentum (HLT)", 100, 0., 100);\r
180  \r
181   fHistOfflResPtInv = new TH1F("fHistOfflResPtInv","resolution on 1/pt for the case with 2 offline tracks",100, 0., 1); // cosmics\r
182   fHistOnlResPtInv  = new TH1F("fHistOnlResPtInv", "resolution on 1/pt for the case with 2 HLT tracks",    100, 0., 1); // cosmics\r
183  \r
184   fHistOffldEdx = new TH1F("fHistOffldEdx", "energy loss (offline)",500, 0, 500);\r
185   fHistOnldEdx  = new TH1F("fHistOnldEdx",  "energy loss (HLT)",    500, 0, 500);\r
186  \r
187   fHistOffldEdxVsP = new TH2F("fHistOffldEdxVsP","dE/dx vs. momentum (offline)",100, 0., 100., 500, 0., 500.);\r
188   fHistOnldEdxVsP  = new TH2F("fHistOnldEdxVsP", "dE/dx vs. momentum (HLT)",    100, 0., 100., 500, 0., 500.);\r
189  \r
190   fHistOffldZ = new TH1F("fHistOffldZ","z resolution (offline)",100, 0, 5.);\r
191   fHistOnldZ  = new TH1F("fHistOnldZ", "z resolution (HLT)",    100, 0.,5.);\r
192 \r
193   fHistOffldX = new TH1F("fHistOffldX","r resolution (offline)",100, 0., 5.);\r
194   fHistOnldX  = new TH1F("fHistOnldX", "r resolution (HLT)",    100, 0., 5.);\r
195   \r
196   fHistOfflPhi = new TH1F("fHistOfflPhi","#phi resolution (offline)",100, 0., 10); // in mrad\r
197   fHistOnlPhi  = new TH1F("fHistOnlPhi", "#phi resolution (HLT)",    100, 0., 10); // in mrad\r
198  \r
199   fHistOfflTheta = new TH1F("fHistOfflTheta","#theta resolution (offline)",100, 0., 10);\r
200   fHistOnlTheta  = new TH1F("fHistOnlTheta", "#theta resolution (HLT)",    100, 0., 10);\r
201 \r
202   fHistOfflDZ = new TH2F("fHistOfflDZ","track D vs. Z (offline)",1000, 0., 250, 1000, 0., 250);\r
203   fHistOnlDZ  = new TH2F("fHistOnlDZ", "track D vs. Z (HLT)",    1000, 0., 250, 1000, 0., 250);\r
204  \r
205   fHistOfflDZTrig   = new TH2F("fHistOfflDZTrig",  "track D vs. Z (offline triggered)",    1000, 0., 250, 1000, 0., 250);\r
206   fHistOfflDZNoTrig = new TH2F("fHistOfflDZNoTrig","track D vs. Z (offline not triggered)",1000, 0., 250, 1000, 0., 250);\r
207 \r
208 \r
209   fOutputList->Add(fHistTrigger);\r
210   fOutputList->Add(fHistHLTTrigger);\r
211 \r
212   fOutputList->Add(fHistOfflTrkDCA);\r
213   fOutputList->Add(fHistOfflTrkDCATrig);\r
214   fOutputList->Add(fHistOfflTrkDCANoTrig);\r
215   fOutputList->Add(fHistOnlTrkDCA);\r
216   fOutputList->Add(fHistOnlTrkDCATrig); \r
217   fOutputList->Add(fHistOfflTrkNcls);\r
218   fOutputList->Add(fHistOfflTrkNclsTrig);\r
219   fOutputList->Add(fHistOfflTrkNclsNoTrig);  \r
220   fOutputList->Add(fHistOnlTrkNcls);\r
221   fOutputList->Add(fHistOnlTrkNclsTrig);\r
222   fOutputList->Add(fHistOfflTrkDCANoTrigNclsCut1);\r
223   fOutputList->Add(fHistOfflTrkDCANoTrigNclsCut2);\r
224   fOutputList->Add(fHistOfflTrkP);\r
225   fOutputList->Add(fHistOfflTrkPTrig);\r
226   fOutputList->Add(fHistOfflTrkPNoTrig);\r
227   fOutputList->Add(fHistOnlTrkP);\r
228 \r
229   fOutputList->Add(fHistOfflResPtInv); // cosmics\r
230   fOutputList->Add(fHistOnlResPtInv);  // cosmics\r
231 \r
232   fOutputList->Add(fHistOffldEdx);\r
233   fOutputList->Add(fHistOnldEdx);\r
234   fOutputList->Add(fHistOffldEdxVsP);\r
235   fOutputList->Add(fHistOnldEdxVsP);\r
236   fOutputList->Add(fHistOffldZ);\r
237   fOutputList->Add(fHistOnldZ);\r
238   fOutputList->Add(fHistOffldX);\r
239   fOutputList->Add(fHistOnldX);\r
240   fOutputList->Add(fHistOfflPhi);  \r
241   fOutputList->Add(fHistOnlPhi);\r
242   fOutputList->Add(fHistOfflTheta);\r
243   fOutputList->Add(fHistOnlTheta);\r
244   fOutputList->Add(fHistOfflDZ);\r
245   fOutputList->Add(fHistOnlDZ);  \r
246   fOutputList->Add(fHistOfflDZTrig);  \r
247   fOutputList->Add(fHistOfflDZNoTrig);\r
248 }\r
249 \r
250 void AliAnalysisTaskHLTTPC::NotifyRun(){\r
251 // This will not work if the active trigger classes change from run to run.\r
252 // Then one has to know all trigger classes before processing the data.\r
253 \r
254   AliESDEvent* evESD = dynamic_cast<AliESDEvent*>(InputEvent());\r
255   TString trgClasses = evESD->GetESDRun()->GetActiveTriggerClasses(); \r
256  \r
257   /*\r
258   TObjArray * trgClsArray = trgClasses.Tokenize(" ");\r
259   cout<<trgClsArray->GetEntries()<<endl;\r
260 \r
261   if(!fTrgClsArray){\r
262     fTrgClsArray = trgClsArray;\r
263     for(Int_t i = 0; i < fTrgClsArray->GetEntries(); i++){  \r
264       TString str = ((TObjString *)fTrgClsArray->At(i))->GetString();  \r
265       (fHistTrigger->GetXaxis())->SetBinLabel(i+1, str.Data());  \r
266       (fHistHLTTrigger->GetXaxis())->SetBinLabel(i+1, str.Data());  \r
267     }  \r
268   }else{\r
269     for(Int_t i = 0; i < trgClsArray->GetEntries(); i++){\r
270       \r
271     }\r
272   }\r
273   */\r
274 \r
275   fTrgClsArray = trgClasses.Tokenize(" ");\r
276   //cout<<fTrgClsArray->GetEntries()<<endl; \r
277     \r
278   for(Int_t i=0; i<fTrgClsArray->GetEntries(); i++){ \r
279       TString str = ((TObjString *)fTrgClsArray->At(i))->GetString(); \r
280       (fHistTrigger->GetXaxis())->SetBinLabel(i+1, str.Data()); \r
281       (fHistHLTTrigger->GetXaxis())->SetBinLabel(i+1, str.Data()); \r
282   }   \r
283   evESD = NULL;\r
284 }\r
285 \r
286 void AliAnalysisTaskHLTTPC::UserExec(Option_t *){\r
287 \r
288   AliESDEvent* evESD = dynamic_cast<AliESDEvent*>(InputEvent());\r
289   \r
290   if (!evESD) {\r
291     Printf("ERROR: fESD not available");\r
292     return;\r
293   }\r
294   \r
295   AliESDEvent* evHLTESD = 0;\r
296   AliESDInputHandler* esdH = dynamic_cast<AliESDInputHandler*>(fInputHandler);\r
297    \r
298   if(esdH) evHLTESD = esdH->GetHLTEvent();\r
299     \r
300   if(!evHLTESD){\r
301       Printf("ERROR: HLTesd not available");\r
302       return;\r
303   }\r
304 \r
305   Double_t b = evESD->GetMagneticField();\r
306   \r
307   Double_t pos[] = { 0., 0., 0.};\r
308   AliVertex *vtx = new AliVertex(pos, 0., 0);\r
309   \r
310   //Fill CTP Trigger stuff\r
311   //fHistTrigger->Fill(evESD->GetTriggerMask());\r
312   \r
313   for(Int_t i = 0; i<fTrgClsArray->GetEntries(); i++){\r
314       if((evESD->GetFiredTriggerClasses()).Contains(((TObjString *)fTrgClsArray->At(i))->GetString()))  fHistTrigger->Fill(i);\r
315   }\r
316 \r
317   if(evHLTESD->IsHLTTriggerFired()){\r
318      //fHistHLTTrigger->Fill(evESD->GetTriggerMask());\r
319      for(Int_t i = 0; i<fTrgClsArray->GetEntries(); i++){ \r
320          if((evESD->GetFiredTriggerClasses()).Contains(((TObjString *)fTrgClsArray->At(i))->GetString())) fHistHLTTrigger->Fill(i);\r
321      } \r
322   }\r
323 \r
324   if(evHLTESD->IsHLTTriggerFired()){\r
325      for(Int_t i=0; i<evHLTESD->GetNumberOfTracks(); i++){\r
326          AliESDtrack * HLTesdTrk = evHLTESD->GetTrack(i);\r
327         \r
328       if(HLTesdTrk->GetTPCNcls()>0){\r
329          fHistOnlTrkNcls->Fill(HLTesdTrk->GetTPCNcls());\r
330          fHistOnlTrkNclsTrig->Fill(HLTesdTrk->GetTPCNcls());\r
331       }\r
332         \r
333       Double_t dz[2] = {-999., -999.};  \r
334       Double_t covar[3] = {0.};\r
335       \r
336       HLTesdTrk->PropagateToDCA(vtx, b, 250., dz, covar); \r
337       fHistOnlDZ->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1])); \r
338       \r
339       if(HLTesdTrk){\r
340          fHistOnlTrkDCA->Fill(TMath::Abs(HLTesdTrk->GetD(0., 0., b)));\r
341          fHistOnlTrkP->Fill(TMath::Abs(HLTesdTrk->P()));\r
342          fHistOnldEdx->Fill(HLTesdTrk->GetTPCsignal());\r
343          fHistOnldEdxVsP->Fill(TMath::Abs(HLTesdTrk->P()), HLTesdTrk->GetTPCsignal()); \r
344          fHistOnlTrkDCATrig->Fill(TMath::Abs(HLTesdTrk->GetD(0., 0., b)));\r
345       }\r
346      }\r
347   } else {\r
348     for(Int_t i=0; i<evHLTESD->GetNumberOfTracks(); i++){ \r
349     \r
350         AliESDtrack * HLTesdTrk = evHLTESD->GetTrack(i); \r
351         if(HLTesdTrk->GetTPCNcls()>0) fHistOnlTrkNcls->Fill(HLTesdTrk->GetTPCNcls()); \r
352                   \r
353         Double_t dz[2] = {-999., -999.};   \r
354         Double_t covar[3] = {0.}; \r
355       \r
356         HLTesdTrk->PropagateToDCA(vtx, b, 250., dz, covar);  \r
357         fHistOnlDZ->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1]));  \r
358       \r
359         if(HLTesdTrk){ \r
360            fHistOnlTrkDCA->Fill(TMath::Abs(HLTesdTrk->GetD(0., 0., b))); \r
361            fHistOnlTrkP->Fill(TMath::Abs(HLTesdTrk->P())); \r
362            fHistOnldEdx->Fill( HLTesdTrk->GetTPCsignal());\r
363            fHistOnldEdxVsP->Fill(TMath::Abs(HLTesdTrk->P()), HLTesdTrk->GetTPCsignal());\r
364         } \r
365     } \r
366   }\r
367 \r
368   if(evHLTESD->GetNumberOfTracks()==2){ // cosmics\r
369   \r
370      Double_t oneOverPt1 = (evHLTESD->GetTrack(0))->OneOverPt();\r
371      Double_t oneOverPt2 = (evHLTESD->GetTrack(1))->OneOverPt();\r
372      //cout<<"1/pt: "<<oneOverPt1<<", "<<oneOverPt2<<endl;\r
373      fHistOnlResPtInv->Fill(2.*TMath::Abs(oneOverPt1-oneOverPt2)/(oneOverPt1+oneOverPt2));\r
374 \r
375      Float_t dz1[2], dz2[2];\r
376      (evHLTESD->GetTrack(0))->GetDZ(0., 0., 0., b, dz1);\r
377      (evHLTESD->GetTrack(1))->GetDZ(0., 0., 0., b, dz2);\r
378      fHistOnldX->Fill(TMath::Abs(TMath::Abs(dz1[0])-TMath::Abs(dz2[0])));\r
379      fHistOnldZ->Fill(TMath::Abs(dz1[1]-dz2[1]));\r
380     \r
381      Float_t dPhi = TMath::Abs( (evHLTESD->GetTrack(0))->Phi() - (evHLTESD->GetTrack(1))->Phi() - TMath::Pi() );\r
382      if(dPhi>2.*TMath::Pi()) dPhi -= 2.*TMath::Pi();\r
383     \r
384      fHistOnlPhi->Fill(1000.*dPhi);\r
385      fHistOnlTheta->Fill(1000.*TMath::Abs( (evHLTESD->GetTrack(0))->Theta() + (evHLTESD->GetTrack(1))->Theta() - TMath::Pi() ) );\r
386   }\r
387   \r
388   if(evESD->GetNumberOfTracks()==2){ // cosmics\r
389     \r
390      Double_t oneOverPt1 = (evESD->GetTrack(0))->OneOverPt(); \r
391      Double_t oneOverPt2 = (evESD->GetTrack(1))->OneOverPt(); \r
392      fHistOfflResPtInv->Fill(2.*TMath::Abs(oneOverPt1-oneOverPt2)/(oneOverPt1+oneOverPt2) );\r
393 \r
394      Float_t dz1[2], dz2[2]; \r
395      (evESD->GetTrack(0))->GetDZ(0., 0., 0., b, dz1); \r
396      (evESD->GetTrack(1))->GetDZ(0., 0., 0., b, dz2); \r
397      fHistOffldX->Fill(TMath::Abs(TMath::Abs(dz1[0])-TMath::Abs(dz2[0]))); \r
398      fHistOffldZ->Fill(TMath::Abs(dz1[1]-dz2[1]));\r
399     \r
400      Float_t dPhi = TMath::Abs( (evESD->GetTrack(0))->Phi() - (evESD->GetTrack(1))->Phi() - TMath::Pi() );\r
401      if(dPhi>2.*TMath::Pi()) dPhi -= 2.*TMath::Pi();\r
402     \r
403      fHistOfflPhi->Fill(1000.*dPhi); \r
404      fHistOfflTheta->Fill(1000.*TMath::Abs( (evESD->GetTrack(0))->Theta() + (evESD->GetTrack(1))->Theta() - TMath::Pi() ) ); \r
405   }\r
406 \r
407   //fHistTrigger->Fill(5., 1);\r
408 \r
409   //  Printf("There are %d tracks in this event", evESD->GetNumberOfTracks());\r
410 \r
411   //if(evESD->GetNumberOfTracks()>0) fHistTrigger->Fill(4., 1);\r
412 \r
413   if(evHLTESD->IsHLTTriggerFired()){\r
414      //fHistTrigger->Fill(2., 1);\r
415 \r
416      for(Int_t i = 0; i < evESD->GetNumberOfTracks(); i++){ \r
417         \r
418          AliESDtrack *esdTrk = evESD->GetTrack(i);      \r
419          Double_t dz[2] = {-999., -999.};  \r
420          Double_t covar[3] = {0};\r
421          esdTrk->PropagateToDCA(vtx, b, 250., dz, covar);\r
422          fHistOfflDZTrig->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1]));\r
423       \r
424          fHistOfflDZ->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1]));\r
425       \r
426          /*\r
427          Double_t pnt[3] = {0., 0., 0.};\r
428          Double_t norm[3] = {0., 0., 1.};\r
429          if(esdTrk->Intersect(pnt, norm, b)){\r
430            if(TMath::Sqrt(pnt[0]*pnt[0]+pnt[1]*pnt[1]) < 250) {\r
431              fNtracksThruZ0++;\r
432              fNtracksThruZ0Trig++;\r
433              fHistTrigger->Fill(6., 1);\r
434              fHistTrigger->Fill(7., 1);\r
435            }\r
436          }\r
437          */\r
438 \r
439          fHistOfflTrkDCATrig->Fill(TMath::Abs(esdTrk->GetD(0., 0., b)));\r
440          fHistOfflTrkDCA->Fill(TMath::Abs(esdTrk->GetD(0., 0., b))); \r
441 \r
442          if(esdTrk->GetTPCNcls()>0){\r
443             fHistOfflTrkNclsTrig->Fill(esdTrk->GetTPCNcls()); \r
444             fHistOfflTrkNcls->Fill(esdTrk->GetTPCNcls());\r
445          }\r
446 \r
447          fHistOfflTrkPTrig->Fill(TMath::Abs(esdTrk->P()));\r
448          fHistOfflTrkP->Fill(TMath::Abs(esdTrk->P()));\r
449          fHistOffldEdx->Fill( esdTrk->GetTPCsignal());\r
450          fHistOffldEdxVsP->Fill(TMath::Abs(esdTrk->P()), esdTrk->GetTPCsignal());\r
451      }\r
452   } else {\r
453 \r
454     for(Int_t i=0; i<evESD->GetNumberOfTracks(); i++){ \r
455       \r
456         AliESDtrack * esdTrk = evESD->GetTrack(i); \r
457         Double_t dz[2] = {0};  \r
458         Double_t covar[3] = {0};\r
459         esdTrk->PropagateToDCA(vtx, b, 250., dz, covar); \r
460         fHistOfflDZNoTrig->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1])); \r
461 \r
462         fHistOfflDZ->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1]));\r
463       \r
464          /*\r
465          Double_t pnt[3] = {0., 0., 0.}; \r
466          Double_t norm[3] = {0., 0., 1.}; \r
467          if(esdTrk->Intersect(pnt, norm, b)){ \r
468            if(TMath::Sqrt(pnt[0]*pnt[0]+pnt[1]*pnt[1]) < 250) { \r
469              fNtracksThruZ0++; \r
470              fHistTrigger->Fill(6., 1);\r
471            } \r
472          } \r
473          */\r
474   \r
475          fHistOfflTrkDCANoTrig->Fill(TMath::Abs(esdTrk->GetD(0., 0., b)));\r
476       \r
477          if(esdTrk->GetTPCNcls()>0) fHistOfflTrkNclsNoTrig->Fill(esdTrk->GetTPCNcls()); \r
478       \r
479          if(esdTrk->GetTPCNcls()>=60) fHistOfflTrkDCANoTrigNclsCut1->Fill(TMath::Abs(esdTrk->GetD(0., 0., b)));\r
480          else fHistOfflTrkDCANoTrigNclsCut2->Fill(TMath::Abs(esdTrk->GetD(0., 0., b)));\r
481       \r
482          fHistOfflTrkDCA->Fill(TMath::Abs(esdTrk->GetD(0., 0., b)));\r
483          fHistOfflTrkNcls->Fill(esdTrk->GetTPCNcls());\r
484       \r
485          fHistOfflTrkPNoTrig->Fill(TMath::Abs(esdTrk->P()));\r
486          fHistOfflTrkP->Fill(TMath::Abs(esdTrk->P()));\r
487          fHistOffldEdx->Fill( esdTrk->GetTPCsignal());\r
488          fHistOffldEdxVsP->Fill(TMath::Abs(esdTrk->P()), esdTrk->GetTPCsignal());\r
489     }       \r
490   }\r
491 \r
492   fNevt++;\r
493   delete vtx;\r
494 \r
495   // Post output data.\r
496   PostData(1, fOutputList);\r
497  }\r
498 \r
499 void AliAnalysisTaskHLTTPC::Terminate(Option_t *){\r
500   /*\r
501   Printf("Number of tracks thru CE: %d", fNtracksThruZ0);\r
502   Printf("Number of tracks thru CE from triggered events: %d", \r
503          fNtracksThruZ0Trig);\r
504   */\r
505 \r
506   // Draw result to the screen\r
507   // Called once at the end of the query\r
508 \r
509   //  TCanvas *c1 = new TCanvas("AliAnalysisTaskHLTTPC","Trigger",10,10,510,510);\r
510   //fHistTrigger->DrawCopy("E");\r
511   \r
512 }\r