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
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
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
20 /** @file AliAnalysisTaskHLTTPC.cxx
\r
21 @author Zhongbao Yin, Kalliopi Kanaki
\r
33 #include "TCanvas.h"
\r
34 #include "TVector3.h"
\r
35 #include "TString.h"
\r
36 #include "TObjArray.h"
\r
39 #include "AliESDEvent.h"
\r
40 #include "AliESDRun.h"
\r
41 #include "AliESDInputHandler.h"
\r
43 #include "AliAnalysisTask.h"
\r
44 #include "AliAnalysisManager.h"
\r
45 #include "AliAnalysisTaskHLTTPC.h"
\r
48 ClassImp(AliAnalysisTaskHLTTPC)
\r
50 //======================================================================================================
\r
52 AliAnalysisTaskHLTTPC::AliAnalysisTaskHLTTPC(const char *name)
\r
54 AliAnalysisTaskSE(name)
\r
60 ,fHistOfflTrkDCATrig(0)
\r
61 ,fHistOfflTrkDCANoTrig(0)
\r
63 ,fHistOnlTrkDCATrig(0)
\r
64 ,fHistOfflTrkNcls(0)
\r
65 ,fHistOfflTrkNclsTrig(0)
\r
66 ,fHistOfflTrkNclsNoTrig(0)
\r
68 ,fHistOnlTrkNclsTrig(0)
\r
69 ,fHistOfflTrkDCANoTrigNclsCut1(0)
\r
70 ,fHistOfflTrkDCANoTrigNclsCut2(0)
\r
72 ,fHistOfflTrkPTrig(0)
\r
73 ,fHistOfflTrkPNoTrig(0)
\r
75 ,fHistOfflResPtInv(0)
\r
76 ,fHistOnlResPtInv(0)
\r
79 ,fHistOffldEdxVsP(0)
\r
92 ,fHistOfflDZNoTrig(0)
\r
95 //,fNtracksThruZ0(0),
\r
96 //,fNtracksThruZ0Trig(0)
\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
105 DefineOutput(1, TList::Class());
\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
117 //----------------------------------------------------------------------------------------------------
\r
119 void AliAnalysisTaskHLTTPC::UserCreateOutputObjects(){
\r
120 // Create histograms
\r
124 fOutputList = new TList();
\r
125 fOutputList->SetName(GetName());
\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
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
150 fHistTrigger = new TH1F("fHistTrigger", "CTP trigger counter", 64, 0, 64);
\r
151 fHistTrigger->GetXaxis()->SetTitle("");
\r
152 fHistTrigger->GetYaxis()->SetTitle("#Events");
\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
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
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
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
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
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
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
179 fHistOnlTrkP = new TH1F("fHistOnlTrkP", "momentum (HLT)", 100, 0., 100);
\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
184 fHistOffldEdx = new TH1F("fHistOffldEdx", "energy loss (offline)",500, 0, 500);
\r
185 fHistOnldEdx = new TH1F("fHistOnldEdx", "energy loss (HLT)", 500, 0, 500);
\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
190 fHistOffldZ = new TH1F("fHistOffldZ","z resolution (offline)",100, 0, 5.);
\r
191 fHistOnldZ = new TH1F("fHistOnldZ", "z resolution (HLT)", 100, 0.,5.);
\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
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
199 fHistOfflTheta = new TH1F("fHistOfflTheta","#theta resolution (offline)",100, 0., 10);
\r
200 fHistOnlTheta = new TH1F("fHistOnlTheta", "#theta resolution (HLT)", 100, 0., 10);
\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
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
209 fOutputList->Add(fHistTrigger);
\r
210 fOutputList->Add(fHistHLTTrigger);
\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
229 fOutputList->Add(fHistOfflResPtInv); // cosmics
\r
230 fOutputList->Add(fHistOnlResPtInv); // cosmics
\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
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
254 AliESDEvent* evESD = dynamic_cast<AliESDEvent*>(InputEvent());
\r
255 TString trgClasses = evESD->GetESDRun()->GetActiveTriggerClasses();
\r
258 TObjArray * trgClsArray = trgClasses.Tokenize(" ");
\r
259 cout<<trgClsArray->GetEntries()<<endl;
\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
269 for(Int_t i = 0; i < trgClsArray->GetEntries(); i++){
\r
275 fTrgClsArray = trgClasses.Tokenize(" ");
\r
276 //cout<<fTrgClsArray->GetEntries()<<endl;
\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
286 void AliAnalysisTaskHLTTPC::UserExec(Option_t *){
\r
288 AliESDEvent* evESD = dynamic_cast<AliESDEvent*>(InputEvent());
\r
291 Printf("ERROR: fESD not available");
\r
295 AliESDEvent* evHLTESD = 0;
\r
296 AliESDInputHandler* esdH = dynamic_cast<AliESDInputHandler*>(fInputHandler);
\r
298 if(esdH) evHLTESD = esdH->GetHLTEvent();
\r
301 Printf("ERROR: HLTesd not available");
\r
305 Double_t b = evESD->GetMagneticField();
\r
307 Double_t pos[] = { 0., 0., 0.};
\r
308 AliVertex *vtx = new AliVertex(pos, 0., 0);
\r
310 //Fill CTP Trigger stuff
\r
311 //fHistTrigger->Fill(evESD->GetTriggerMask());
\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
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
324 if(evHLTESD->IsHLTTriggerFired()){
\r
325 for(Int_t i=0; i<evHLTESD->GetNumberOfTracks(); i++){
\r
326 AliESDtrack * HLTesdTrk = evHLTESD->GetTrack(i);
\r
328 if(HLTesdTrk->GetTPCNcls()>0){
\r
329 fHistOnlTrkNcls->Fill(HLTesdTrk->GetTPCNcls());
\r
330 fHistOnlTrkNclsTrig->Fill(HLTesdTrk->GetTPCNcls());
\r
333 Double_t dz[2] = {-999., -999.};
\r
334 Double_t covar[3] = {0.};
\r
336 HLTesdTrk->PropagateToDCA(vtx, b, 250., dz, covar);
\r
337 fHistOnlDZ->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1]));
\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
348 for(Int_t i=0; i<evHLTESD->GetNumberOfTracks(); i++){
\r
350 AliESDtrack * HLTesdTrk = evHLTESD->GetTrack(i);
\r
351 if(HLTesdTrk->GetTPCNcls()>0) fHistOnlTrkNcls->Fill(HLTesdTrk->GetTPCNcls());
\r
353 Double_t dz[2] = {-999., -999.};
\r
354 Double_t covar[3] = {0.};
\r
356 HLTesdTrk->PropagateToDCA(vtx, b, 250., dz, covar);
\r
357 fHistOnlDZ->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1]));
\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
368 if(evHLTESD->GetNumberOfTracks()==2){ // cosmics
\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
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
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
384 fHistOnlPhi->Fill(1000.*dPhi);
\r
385 fHistOnlTheta->Fill(1000.*TMath::Abs( (evHLTESD->GetTrack(0))->Theta() + (evHLTESD->GetTrack(1))->Theta() - TMath::Pi() ) );
\r
388 if(evESD->GetNumberOfTracks()==2){ // cosmics
\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
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
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
403 fHistOfflPhi->Fill(1000.*dPhi);
\r
404 fHistOfflTheta->Fill(1000.*TMath::Abs( (evESD->GetTrack(0))->Theta() + (evESD->GetTrack(1))->Theta() - TMath::Pi() ) );
\r
407 //fHistTrigger->Fill(5., 1);
\r
409 // Printf("There are %d tracks in this event", evESD->GetNumberOfTracks());
\r
411 //if(evESD->GetNumberOfTracks()>0) fHistTrigger->Fill(4., 1);
\r
413 if(evHLTESD->IsHLTTriggerFired()){
\r
414 //fHistTrigger->Fill(2., 1);
\r
416 for(Int_t i = 0; i < evESD->GetNumberOfTracks(); i++){
\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
424 fHistOfflDZ->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1]));
\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
432 fNtracksThruZ0Trig++;
\r
433 fHistTrigger->Fill(6., 1);
\r
434 fHistTrigger->Fill(7., 1);
\r
439 fHistOfflTrkDCATrig->Fill(TMath::Abs(esdTrk->GetD(0., 0., b)));
\r
440 fHistOfflTrkDCA->Fill(TMath::Abs(esdTrk->GetD(0., 0., b)));
\r
442 if(esdTrk->GetTPCNcls()>0){
\r
443 fHistOfflTrkNclsTrig->Fill(esdTrk->GetTPCNcls());
\r
444 fHistOfflTrkNcls->Fill(esdTrk->GetTPCNcls());
\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
454 for(Int_t i=0; i<evESD->GetNumberOfTracks(); i++){
\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
462 fHistOfflDZ->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1]));
\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
470 fHistTrigger->Fill(6., 1);
\r
475 fHistOfflTrkDCANoTrig->Fill(TMath::Abs(esdTrk->GetD(0., 0., b)));
\r
477 if(esdTrk->GetTPCNcls()>0) fHistOfflTrkNclsNoTrig->Fill(esdTrk->GetTPCNcls());
\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
482 fHistOfflTrkDCA->Fill(TMath::Abs(esdTrk->GetD(0., 0., b)));
\r
483 fHistOfflTrkNcls->Fill(esdTrk->GetTPCNcls());
\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
495 // Post output data.
\r
496 PostData(1, fOutputList);
\r
499 void AliAnalysisTaskHLTTPC::Terminate(Option_t *){
\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
506 // Draw result to the screen
\r
507 // Called once at the end of the query
\r
509 // TCanvas *c1 = new TCanvas("AliAnalysisTaskHLTTPC","Trigger",10,10,510,510);
\r
510 //fHistTrigger->DrawCopy("E");
\r