2 //**************************************************************************
3 //* This file is property of and copyright by the ALICE HLT Project *
4 //* ALICE Experiment at CERN, All rights reserved. *
6 //* Primary Authors: Zhongbao Yin <zbyin@mail.ccnu.edu.cn>, *
7 //* Kalliopi Kanaki <Kalliopi.Kanaki@ift.uib.no> *
8 //* for The ALICE HLT Project. *
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 //**************************************************************************
20 /** @file AliAnalysisTaskHLT.cxx
21 @author Kalliopi Kanaki, Hege Erdal
23 @brief An analysis task containing
24 loops over HLT and offline ESD trees for comparing
25 AliESDtrack properties.
30 class AliAnalysisTask;
31 class AliAnalysisManager;
39 #include "AliESDEvent.h"
40 #include "AliESDtrackCuts.h"
41 #include "AliESDInputHandler.h"
43 #include "AliAnalysisTaskHLT.h"
45 ClassImp(AliAnalysisTaskHLT)
47 //======================================================================================================
49 AliAnalysisTaskHLT::AliAnalysisTaskHLT()
94 // ,fNclusterOff_trig(0)
97 // ,fNclusterHLT_trig(0)
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
106 DefineOutput(1, TList::Class());
109 AliAnalysisTaskHLT::AliAnalysisTaskHLT(const char *name)
111 AliAnalysisTaskSE(name)
153 // ,fNclusterOff_trig(0)
156 // ,fNclusterHLT_trig(0)
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
166 DefineOutput(1, TList::Class());
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};
178 //----------------------------------------------------------------------------------------------------
180 void AliAnalysisTaskHLT::UserCreateOutputObjects(){
185 fOutputList = new TList();
186 fOutputList->SetName(GetName());
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");
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");
211 fHistTrigger = new TH1F("fHistTrigger", "CTP trigger counter", 64, 0, 64);
212 fHistTrigger->GetXaxis()->SetTitle("");
213 fHistTrigger->GetYaxis()->SetTitle("#Events");
215 fHistHLTTrigger = new TH1F("fHistHLTTrigger", "HLT CTP trigger counter", 64, 0, 64);
216 fHistHLTTrigger->GetXaxis()->SetTitle("");
217 fHistHLTTrigger->GetYaxis()->SetTitle("#Events");
220 fMomentumOff = new TH1F("fMomentum_off", "momentum (offline)",1000, 0., 100);
221 fMomentumHLT = new TH1F("fMomentum_hlt", "momentum (HLT)", 1000, 0., 100);
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);
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);
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);
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.);
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);
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);
241 fMultOff = new TH1F("fMult_off","track multiplicity (offline)",100,0,100);
242 fMultHLT = new TH1F("fMult_hlt","track multiplicity (HLT)", 100,0,100);
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);
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);
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);
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);
256 fEtaOff = new TH1F("fEta_off","pseudorapidity (offline)",100,-3,3);
257 fEtaHLT = new TH1F("fEta_hlt","pseudorapidity (HLT)", 100,-3,3);
259 fEtaDCAcutOff = new TH1F("fEtaDCAcut_off","pseudorapidity DCAcut (offline)",100,-3,3);
260 fEtaDCAcutHLT = new TH1F("fEtaDCAcut_hlt","pseudorapidity DCAcut (HLT)", 100,-3,3);
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);
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);
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);
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);
274 //---------------------- add histograms to the output TList ------------------//
276 fOutputList->Add(fHistTrigger);
277 fOutputList->Add(fHistHLTTrigger);
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);
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);
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.
323 AliESDEvent *esdOFF = dynamic_cast<AliESDEvent*>(InputEvent());
324 TString trgClasses = esdOFF->GetESDRun()->GetActiveTriggerClasses();
326 fTrgClsArray = trgClasses.Tokenize(" ");
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());
335 TString Statusnames[12]={"kTPCin",
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]);
357 void AliAnalysisTaskHLT::UserExec(Option_t *){
358 // see header file of AliAnalysisTask for documentation
360 AliESDEvent *esdOFF = dynamic_cast<AliESDEvent*>(InputEvent());
363 Printf("ERROR: fESD not available");
367 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*>(fInputHandler);
368 AliESDEvent *esdHLT = NULL;
369 if(esdH) esdHLT = esdH->GetHLTEvent();
372 Printf("ERROR: HLTesd not available");
377 //Fill CTP Trigger stuff
378 //fHistTrigger->Fill(esdOFF->GetTriggerMask());
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);
385 Double_t DCAcut = 7.0;
386 Double_t Momcut= 0.3;
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);
394 Double_t bfield = esdOFF->GetMagneticField();
396 UInt_t Statusnames[12]={AliESDtrack::kTPCin,
398 AliESDtrack::kTPCout,
399 AliESDtrack::kITSout,
400 AliESDtrack::kITSrefit,
401 AliESDtrack::kTPCrefit,
403 AliESDtrack::kTRDout,
404 AliESDtrack::kTRDrefit,
406 AliESDtrack::kTOFout,
407 AliESDtrack::kTOFrefit};
411 //---------------- HLT ESD tree -----------------------//
414 if(esdHLT->GetNumberOfTracks()!=0)
415 fMultHLT->Fill( esdHLT->GetNumberOfTracks() );
417 Double_t vertexHLT[3];
419 const AliESDVertex *vertHLT=esdHLT->GetPrimaryVertexTracks();
421 vertexHLT[0] = vertHLT->GetX();
422 vertexHLT[1] = vertHLT->GetY();
423 vertexHLT[2] = vertHLT->GetZ();
424 AliVertex *primVertexHLT = new AliVertex(vertexHLT, 0., 0);
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() );
433 //The primary vertex constraint is stricter for HLT than for Offline
434 if( vertHLT && vertHLT->GetNContributors() >= 5 && (TMath::Abs(vertHLT->GetZ())<5.5) ){
436 for(Int_t i=0; i<esdHLT->GetNumberOfTracks(); i++){
438 AliESDtrack *esdtrackHLT = esdHLT->GetTrack(i);
441 if(!(esdOFF->GetEventSpecie()==16)){ // reject laser events
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());
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);
453 fEtaHLT->Fill(esdtrackHLT->Eta());
455 Double_t dz[2] = {-999., -999.};
456 Double_t covar[3] = {0.,0.,0.};
457 esdtrackHLT->PropagateToDCA(primVertexHLT, bfield, 250., dz, covar);
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){
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()) );
474 if(esdHLT->IsHLTTriggerFired()){
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)
484 //----------------- OFFLINE ESD tree ----------------//
486 if(esdOFF->GetNumberOfTracks()!=0) fMultOff->Fill( esdOFF->GetNumberOfTracks() );
488 // Track cuts (except d0 cut)
489 //------- TPC track selection --------
490 Int_t minclsTPCOff=70;
491 Double_t maxchi2perTPCcl=4.;
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);
502 Double_t vertexOFF[3];
503 const AliESDVertex *vertOff=esdOFF->GetPrimaryVertexTracks();
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;
511 if(vertOff->GetNContributors()<1) {
513 vertOff = esdOFF->GetPrimaryVertexSPD();
514 if(vertOff->GetNContributors()<1) {
515 // NO GOOD VERTEX, SKIP EVENT
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() );
529 for(Int_t i=0; i<esdOFF->GetNumberOfTracks(); i++){
531 AliESDtrack *esdtrackOFF = esdOFF->GetTrack(i);
534 if(!(esdOFF->GetEventSpecie()==16)){ // reject laser events
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());
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);
545 Double_t dz[2] = {-999., -999.};
546 Double_t covar[3] = {0.,0.,0.};
547 esdtrackOFF->PropagateToDCA(primVertexOFF, bfield, 250., dz, covar);
549 fDCAOff->Fill( esdtrackOFF->GetD(esdOFF->GetPrimaryVertex()->GetXv(), esdOFF->GetPrimaryVertex()->GetYv(), bfield) );
550 fEtaOff->Fill(esdtrackOFF->Eta());
553 //Selection of primary tracks
554 //chosen after recommendations from: https://twiki.cern.ch/twiki/bin/view/ALICE/SelectionOfPrimaryTracksForPp2009DataAnalysis)
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...
562 if(TMath::Abs(esdtrackOFF->GetD(esdOFF->GetPrimaryVertex()->GetXv(), esdOFF->GetPrimaryVertex()->GetYv(), bfield))< DCAcut ){
564 fdEdxOff->Fill( esdtrackOFF->GetTPCsignal() );
565 fdEdxVSPOff->Fill( TMath::Abs(esdtrackOFF->P()), esdtrackOFF->GetTPCsignal() );
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()) );
577 if(esdHLT->IsHLTTriggerFired()){
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
587 // if(esdHLT->IsHLTTriggerFired()){
589 // for(Int_t i=0; i<esdOFF->GetNumberOfTracks(); i++){
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]));
597 // fHistOfflDZ->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1]));
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) {
605 // fNtracksThruZ0Trig++;
606 // fHistTrigger->Fill(6., 1);
607 // fHistTrigger->Fill(7., 1);
612 // fHistOfflTrkDCATrig->Fill(TMath::Abs(esdTrk->GetD(0., 0., bfield)));
613 // fDCAOff->Fill(TMath::Abs(esdTrk->GetD(0., 0., bfield)));
615 // if(esdTrk->GetTPCNcls()>0){
616 // fHistOfflTrkNclsTrig->Fill(esdTrk->GetTPCNcls());
617 // fHistOfflTrkNcls->Fill(esdTrk->GetTPCNcls());
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());
626 delete primVertexOFF;
627 delete primVertexHLT;
630 PostData(1, fOutputList);
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
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);
642 TLegend *legend = new TLegend(0.70,0.60,0.90,0.75);
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);
661 maxbin =fEtaDCAcutOff->GetBinContent(fEtaDCAcutOff->GetMaximumBin());
662 if(maxbin < fEtaDCAcutHLT->GetBinContent(fEtaDCAcutHLT->GetMaximumBin()))
663 maxbin=fEtaDCAcutHLT->GetBinContent(fEtaDCAcutHLT->GetMaximumBin());
664 fEtaDCAcutOff->SetMaximum(maxbin+20);
666 sprintf(etaname,"Pseudorapidity");
667 fEtaDCAcutOff->SetTitle(etaname);
668 fEtaDCAcutOff->SetLineColor(2);
669 fEtaDCAcutOff->DrawCopy("");
670 fEtaDCAcutHLT->DrawCopy("sames");
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");
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");
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");
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");
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);
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);
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");
735 fZvertexOff->SetTitle("Primary Vertex Distribution in Z");
736 fZvertexOff->SetLineColor(2);
737 fZvertexOff->DrawCopy("");
738 fZvertexHLT->DrawCopy("sames");
741 fMultHLT->SetTitle("Track Multiplicity, NumberTracks>0");
742 fMultHLT->DrawCopy("");
743 fMultOff->SetLineColor(2);
744 fMultOff->DrawCopy("sames");
746 string filename="Info_pr_track";
748 sprintf(plotname,"%s.png",filename.c_str());
749 c1->Print(plotname,"png");
751 filename="Info_pr_Event";
752 sprintf(plotname,"%s.png",filename.c_str());
753 c2->Print(plotname,"png");