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()
67 ,fVertexVSNtracksOff(0)
92 ,fVertexVSNtracksHLT(0)
108 // ,fNclusterOff_trig(0)
111 // ,fNclusterHLT_trig(0)
115 // Define input and output slots here
116 // Input slot #0 works with a TChain
117 // DefineInput(0, TChain::Class());
118 // Output slot #0 writes into a TH1 container
120 //DefineOutput(1, TList::Class());
123 AliAnalysisTaskHLT::AliAnalysisTaskHLT(const char *name)
125 AliAnalysisTaskSE(name)
139 ,fVertexVSNtracksOff(0)
164 ,fVertexVSNtracksHLT(0)
179 // ,fNclusterOff_trig(0)
182 // ,fNclusterHLT_trig(0)
187 // Define input and output slots here
188 // Input slot #0 works with a TChain
189 // DefineInput(0, TChain::Class());
190 // Output slot #0 writes into a TH1 container
192 DefineOutput(1, TList::Class());
195 // const Float_t AliAnalysisTaskHLT::fgkEtaMin = -0.12;
196 // const Float_t AliAnalysisTaskHLT::fgkEtaMax = 0.12;
197 // const Float_t AliAnalysisTaskHLT::fgkPhiMin[5] = {3.83972, 4.18879, 4.53786, 4.88692, 5.23599};
198 // const Float_t AliAnalysisTaskHLT::fgkPhiMax[5] = {4.18879, 4.53786, 4.88692, 5.23599, 5.58505};
199 // const Float_t AliAnalysisTaskHLT::fgkNormX[5] = {-0.642788, -0.34202, 0, 0.34202, 0.642788};
200 // const Float_t AliAnalysisTaskHLT::fgkNormY[5] = {-0.766044, -0.939693, -1, -0.939693, -0.766044};
201 // const Float_t AliAnalysisTaskHLT::fgkInitPosX[5] = {-295.682, -157.329, 0, 157.329, 295.682};
202 // const Float_t AliAnalysisTaskHLT::fgkInitPosY[5] = {-352.38, -432.259, -460, -432.259, -352.38};
204 //----------------------------------------------------------------------------------------------------
206 void AliAnalysisTaskHLT::UserCreateOutputObjects(){
211 fOutputList = new TList();
212 fOutputList->SetName(GetName());
215 //0 mistriggered, 1 Good triggered, 2, triggered, 3 fake trigger,
216 //4 events with offline track, 5 total events processed,
217 //6 offline track thru CE, 7 online track to CE
218 fHistTrigger = new TH1F("fHistTrigger", "Trigger Status", 8, -0.5, 7.5);
219 fHistTrigger->GetXaxis()->SetTitle("");
220 fHistTrigger->GetYaxis()->SetTitle("Events");
221 fHistTrigger->SetMarkerStyle(kFullCircle);
222 fHistTrigger->SetStats(0);
223 fHistTrigger->SetFillColor(2);
224 //fHistTrigger->SetDrawOption("B TEXT60");
227 (fHistTrigger->GetXaxis())->SetBinLabel(1,"missed");
228 (fHistTrigger->GetXaxis())->SetBinLabel(2,"triggerWofflTrk");
229 (fHistTrigger->GetXaxis())->SetBinLabel(3,"triggered");
230 (fHistTrigger->GetXaxis())->SetBinLabel(4,"triggerWOofflTrk");
231 (fHistTrigger->GetXaxis())->SetBinLabel(5,"NevWofflTrk");
232 (fHistTrigger->GetXaxis())->SetBinLabel(6,"Nevt");
233 (fHistTrigger->GetXaxis())->SetBinLabel(7,"offlTrkThruCE");
234 (fHistTrigger->GetXaxis())->SetBinLabel(8,"onlTrkThruCE");
237 fHistTrigger = new TH1F("fHistTrigger", "CTP trigger counter", 64, 0, 64);
238 fHistTrigger->GetXaxis()->SetTitle("");
239 fHistTrigger->GetYaxis()->SetTitle("#Events");
241 fHistHLTTrigger = new TH1F("fHistHLTTrigger", "HLT CTP trigger counter", 64, 0, 64);
242 fHistHLTTrigger->GetXaxis()->SetTitle("");
243 fHistHLTTrigger->GetYaxis()->SetTitle("#Events");
245 fChargeOff = new TH1F("fCharge_off", "Charge distribution (Offline)", 12, -3, 3);
246 fChargeHLT = new TH1F("fCharge_hlt", "Charge distribution (HLT)", 12, -3, 3);
249 fMomentumOff = new TH1F("fMomentum_off", "momentum (offline)",1000, 0., 100);
250 fMomentumHLT = new TH1F("fMomentum_hlt", "momentum (HLT)", 1000, 0., 100);
252 fDCAOff = new TH1F("fDCA_off","DCA to beam line (offline)",200, -100, 100);
253 fDCAHLT = new TH1F("fDCA_hlt","DCA to beam line (HLT)", 200, -100, 100);
255 fNclusterOff = new TH1F("fNcluster_off","clusters per track (offline)", 200, 0, 200);
256 fNclusterHLT = new TH1F("fNcluster_hlt","clusters per track (HLT)", 200, 0, 200);
258 fNclusterOffwCut = new TH1F("fNcluster_wcut_off","clusters per track with cuts (offline)", 200, 0, 200);
259 fNclusterHLTwCut = new TH1F("fNcluster_wcut_hlt","clusters per track with cuts (HLT)", 200, 0, 200);
261 fdEdxOff = new TH1F("fdEdx_off","energy loss (offline)", 500, 0, 500);
262 fdEdxHLT = new TH1F("fdEdx_hlt","energy loss (HLT) - not filled yet",500, 0, 500);
264 fdEdxVSPOff = new TH2F("fdEdx_vs_P_off","dE/dx vs. momentum (offline)", 300, 0., 3., 500, 0., 500.);
265 fdEdxVSPHLT = new TH2F("fdEdx_vs_P_hlt","dE/dx vs. momentum (HLT) - not filled yet",300, 0., 3., 500, 0., 500.);
267 fPhiOff = new TH1F("fPhi_off","azimuthal angle distribution (offline)",90,0,360);
268 fPhiHLT = new TH1F("fPhi_hlt","azimuthal angle distribution (HLT)", 90,0,360);
270 fThetaOff = new TH1F("fTheta_off","polar angle distribution (offline)",180,0,180);
271 fThetaHLT = new TH1F("fTheta_hlt","polar angle distribution (HLT)", 180,0,180);
273 fMultOff = new TH1F("fMult_off","track multiplicity (offline)",100,0,100);
274 fMultHLT = new TH1F("fMult_hlt","track multiplicity (HLT)", 100,0,100);
276 fVertexVSNtracksOff = new TH2F("fVertexNtracs_off", "Vertex resolution vs nr contributing tracks (Offline)",20, 0, 20, 40, -2, 2);
277 fVertexVSNtracksHLT = new TH2F("fVertexNtracs_hlt", "Vertex resolution vs nr contributing tracks (HLT)",20, 0, 20, 40, -2, 2);
279 fXYvertexOff = new TH2F("fXYvertex_off","XY primary vertex (offline)",100,-5,5,100,-5,5);
280 fXYvertexHLT = new TH2F("fXYvertex_hlt","XY primary vertex (HLT)", 100,-5,5,100,-5,5);
282 fXvertexOff = new TH1F("fXvertex_off","X primary vertex (offline)",1000,-1,1);
283 fXvertexHLT = new TH1F("fXvertex_hlt","X primary vertex (HLT)", 1000,-1,1);
285 fYvertexOff = new TH1F("fYvertex_off","Y primary vertex (offline)",1000,-1,1);
286 fYvertexHLT = new TH1F("fYvertex_hlt","Y primary vertex (HLT)", 1000,-1,1);
288 fZvertexOff = new TH1F("fZvertex_off","Z primary vertex (offline)",250,-30,30);
289 fZvertexHLT = new TH1F("fZvertex_hlt","Z primary vertex (HLT)", 250,-30,30);
291 fEtaOff = new TH1F("fEta_off","pseudorapidity (offline)",100,-3,3);
292 fEtaHLT = new TH1F("fEta_hlt","pseudorapidity (HLT)", 100,-3,3);
294 fEtaDCAcutOff = new TH1F("fEtaDCAcut_off","pseudorapidity DCAcut (offline)",100,-3,3);
295 fEtaDCAcutHLT = new TH1F("fEtaDCAcut_hlt","pseudorapidity DCAcut (HLT)", 100,-3,3);
297 fEtaOffTpc = new TH1F("fEtaTpc_off","pseudorapidity for kTPCin (offline)",100,-3,3);
298 fEtaHLTTpc = new TH1F("fEtaTpc_hlt","pseudorapidity for kTPCin (HLT)", 100,-3,3);
300 fEtaOffTpcIts = new TH1F("fEtaTpcIts_off","pseudorapidity for kTPCin && kITSin (offline)",100,-3,3);
301 fEtaHLTTpcIts = new TH1F("fEtaTpcIts_hlt","pseudorapidity for kTPCin && kITSin (HLT)", 100,-3,3);
303 fNclusVSphiOff = new TH2F("fNclus_vs_phi_off","clusters per track vs. #phi (offline)",360,0,360,160,0,160);
304 fNclusVSphiHLT = new TH2F("fNclus_vs_phi_hlt","clusters per track vs. #phi (HLT)", 360,0,360,160,0,160);
306 fNclusVSthetaOff = new TH2F("fNclus_vs_theta_off","clusters per track vs. #theta (offline)",180,0,180,160,0,160);
307 fNclusVSthetaHLT = new TH2F("fNclus_vs_theta_hlt","clusters per track vs. #theta (HLT)", 180,0,180,160,0,160);
309 fStatusOff = new TH1F("fStatus_off", "Status for different detectors (offline)",12, 0, 12);
310 fStatusHLT = new TH1F("fStatus_hlt", "Status for different detectors (HLT)", 12, 0, 12);
312 fStatusOff_Ocl = new TH1F("fStatus_Ocl_off", "Status for different detectors when #TPCcl=0 (offline)",12, 0, 12);
313 fStatusHLT_Ocl = new TH1F("fStatus_Ocl_hlt", "Status for different detectors when #TPCcl=0 (HLT)", 12, 0, 12);
315 fEventSpecieOff = new TH1F("fEventSpecie_off","Eventspecie for Offline",18, 0, 18);
316 fEventSpecieHLT = new TH1F("fEventSpecie_hlt","Eventspecie for HLT",18, 0, 18);
318 //---------------------- add histograms to the output TList ------------------//
320 fOutputList->Add(fHistTrigger);
321 fOutputList->Add(fHistHLTTrigger);
323 fOutputList->Add(fChargeOff);
324 fOutputList->Add(fMomentumOff);
325 fOutputList->Add(fDCAOff);
326 fOutputList->Add(fNclusterOff);
327 fOutputList->Add(fNclusterOffwCut);
328 fOutputList->Add(fdEdxOff);
329 fOutputList->Add(fdEdxVSPOff);
330 fOutputList->Add(fPhiOff);
331 fOutputList->Add(fThetaOff);
332 fOutputList->Add(fMultOff);
333 fOutputList->Add(fVertexVSNtracksOff);
334 fOutputList->Add(fXYvertexOff);
335 fOutputList->Add(fXvertexOff);
336 fOutputList->Add(fYvertexOff);
337 fOutputList->Add(fZvertexOff);
338 fOutputList->Add(fEtaOff);
339 fOutputList->Add(fEtaDCAcutOff);
340 fOutputList->Add(fEtaOffTpc);
341 fOutputList->Add(fEtaOffTpcIts);
342 fOutputList->Add(fNclusVSphiOff);
343 fOutputList->Add(fNclusVSthetaOff);
344 fOutputList->Add(fStatusOff);
345 fOutputList->Add(fStatusOff_Ocl);
346 fOutputList->Add(fEventSpecieOff);
348 fOutputList->Add(fChargeHLT);
349 fOutputList->Add(fMomentumHLT);
350 fOutputList->Add(fDCAHLT);
351 fOutputList->Add(fNclusterHLT);
352 fOutputList->Add(fNclusterHLTwCut);
353 fOutputList->Add(fdEdxHLT);
354 fOutputList->Add(fdEdxVSPHLT);
355 fOutputList->Add(fPhiHLT);
356 fOutputList->Add(fThetaHLT);
357 fOutputList->Add(fMultHLT);
358 fOutputList->Add(fVertexVSNtracksHLT);
359 fOutputList->Add(fXYvertexHLT);
360 fOutputList->Add(fXvertexHLT);
361 fOutputList->Add(fYvertexHLT);
362 fOutputList->Add(fZvertexHLT);
363 fOutputList->Add(fEtaHLT);
364 fOutputList->Add(fEtaDCAcutHLT);
365 fOutputList->Add(fEtaHLTTpc);
366 fOutputList->Add(fEtaHLTTpcIts);
367 fOutputList->Add(fNclusVSphiHLT);
368 fOutputList->Add(fNclusVSthetaHLT);
369 fOutputList->Add(fStatusHLT);
370 fOutputList->Add(fStatusHLT_Ocl);
371 fOutputList->Add(fEventSpecieHLT);
376 void AliAnalysisTaskHLT::NotifyRun(){
377 // This will not work if the active trigger classes change from run to run.
378 // Then one has to know all trigger classes before processing the data.
380 AliESDEvent *esdOFF = dynamic_cast<AliESDEvent*>(InputEvent());
381 TString trgClasses = esdOFF->GetESDRun()->GetActiveTriggerClasses();
383 fTrgClsArray = trgClasses.Tokenize(" ");
385 for(Int_t i=0; i<fTrgClsArray->GetEntries(); i++){
386 TString str = ((TObjString *)fTrgClsArray->At(i))->GetString();
387 (fHistTrigger->GetXaxis())->SetBinLabel(i+1, str.Data());
388 (fHistHLTTrigger->GetXaxis())->SetBinLabel(i+1, str.Data());
392 TString Statusnames[12]={"kTPCin",
405 for(int iii=0;iii<12;iii++){
406 (fStatusHLT->GetXaxis())->SetBinLabel(iii+1,Statusnames[iii]);
407 (fStatusOff->GetXaxis())->SetBinLabel(iii+1,Statusnames[iii]);
408 (fStatusHLT_Ocl->GetXaxis())->SetBinLabel(iii+1,Statusnames[iii]);
409 (fStatusOff_Ocl->GetXaxis())->SetBinLabel(iii+1,Statusnames[iii]);
414 void AliAnalysisTaskHLT::UserExec(Option_t *){
415 // see header file of AliAnalysisTask for documentation
417 AliESDEvent *esdOFF = dynamic_cast<AliESDEvent*>(InputEvent());
420 Printf("ERROR: fESD not available");
424 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*>(fInputHandler);
425 AliESDEvent *esdHLT = NULL;
426 if(esdH) esdHLT = esdH->GetHLTEvent();
429 Printf("ERROR: HLTesd not available");
434 //Fill CTP Trigger stuff
435 //fHistTrigger->Fill(esdOFF->GetTriggerMask());
437 for(Int_t i=0; i<fTrgClsArray->GetEntries(); i++){
438 if((esdOFF->GetFiredTriggerClasses()).Contains(((TObjString *)fTrgClsArray->At(i))->GetString()))// && esdOFF->GetEventSpecie()==16)
439 fHistTrigger->Fill(i);
440 if((esdHLT->GetFiredTriggerClasses()).Contains(((TObjString *)fTrgClsArray->At(i))->GetString()))// && esdOFF->GetEventSpecie()==16)
441 fHistHLTTrigger->Fill(i);
444 Double_t DCAcut = 7.0;
445 Double_t Momcut= 0.3;
448 sprintf(test,"pseudorapidity (HLT), DCA cut = %f,\n Momentum cut = %f, TPC clusters > 70" , DCAcut, Momcut);
449 fEtaDCAcutHLT->SetTitle(test);
450 sprintf(test,"pseudorapidity (offline), DCA cut = %f, Momentum cut = %f, TPC clusters > 70", DCAcut, Momcut);
451 fEtaDCAcutOff->SetTitle(test);
453 Double_t bfield = esdOFF->GetMagneticField();
455 UInt_t Statusnames[12]={AliESDtrack::kTPCin,
457 AliESDtrack::kTPCout,
458 AliESDtrack::kITSout,
459 AliESDtrack::kITSrefit,
460 AliESDtrack::kTPCrefit,
462 AliESDtrack::kTRDout,
463 AliESDtrack::kTRDrefit,
465 AliESDtrack::kTOFout,
466 AliESDtrack::kTOFrefit};
470 //---------------- HLT ESD tree -----------------------//
472 if(esdHLT->GetNumberOfTracks()!=0)
473 fMultHLT->Fill( esdHLT->GetNumberOfTracks() );
475 Double_t vertexHLT[3];
477 const AliESDVertex *vertHLT=esdHLT->GetPrimaryVertexTracks();
479 vertexHLT[0] = vertHLT->GetX();
480 vertexHLT[1] = vertHLT->GetY();
481 vertexHLT[2] = vertHLT->GetZ();
482 AliVertex *primVertexHLT = new AliVertex(vertexHLT, 0., 0);
484 Bool_t testVertexHLT=kTRUE;
485 if(vertHLT->GetNContributors()<1) {
487 vertHLT = esdHLT->GetPrimaryVertexSPD();
488 if(vertHLT->GetNContributors()<1) {
489 // NO GOOD VERTEX, SKIP EVENT
490 testVertexHLT=kFALSE;
493 fVertexVSNtracksHLT->Fill(vertHLT->GetNContributors(),vertHLT->GetZv());
494 if(vertHLT->GetZ()!=0){
495 fXYvertexHLT->Fill(vertHLT->GetX(), vertHLT->GetY() );
496 fXvertexHLT->Fill( vertHLT->GetX() );
497 fYvertexHLT->Fill( vertHLT->GetY() );
498 fZvertexHLT->Fill( vertHLT->GetZ() );
503 //if( vertHLT && vertHLT->GetNContributors() >= 5 && (TMath::Abs(vertHLT->GetZ())<5.5) ){
505 fEventSpecieHLT->Fill(esdHLT->GetEventSpecie());
507 for(Int_t i=0; i<esdHLT->GetNumberOfTracks(); i++){
509 AliESDtrack *esdtrackHLT = esdHLT->GetTrack(i);
514 //Fill which status flags that are set for an event
515 for(int jjj=0;jjj<12;jjj++){
516 if(esdtrackHLT->GetStatus()&Statusnames[jjj]) {
517 fStatusHLT->Fill(jjj);
518 if(esdtrackHLT->GetTPCNcls()==0) fStatusHLT_Ocl->Fill(jjj);
522 if(esdtrackHLT->GetTPCNcls()>0) fNclusterHLT->Fill(esdtrackHLT->GetTPCNcls());
523 fChargeHLT->Fill(esdtrackHLT->Charge());
525 if(esdtrackHLT->GetStatus()&AliESDtrack::kTPCin) fEtaHLTTpc->Fill(esdtrackHLT->Eta());
526 if (esdtrackHLT->GetStatus()&AliESDtrack::kTPCin && esdtrackHLT->GetStatus()&AliESDtrack::kITSin) fEtaHLTTpcIts->Fill(esdtrackHLT->Eta());
528 if(!fESDHLTtrackCuts->AcceptTrack(esdtrackHLT) )continue;
530 if((esdHLT->GetEventSpecie()==16)) {
531 Printf("Reject laser event %d",esdOFF->GetEventSpecie());
532 continue; //reject laser events
535 if(esdtrackHLT->GetTPCNcls()>0) fNclusVSphiHLT->Fill(esdtrackHLT->Phi()*TMath::RadToDeg(), esdtrackHLT->GetTPCNcls());
536 if(esdtrackHLT->GetTPCNcls()>0) fNclusVSthetaHLT->Fill(esdtrackHLT->Theta()*TMath::RadToDeg(), esdtrackHLT->GetTPCNcls());
537 fEtaHLT->Fill(esdtrackHLT->Eta());
539 fDCAHLT->Fill(esdtrackHLT->GetD(esdHLT->GetPrimaryVertex()->GetXv(), esdHLT->GetPrimaryVertex()->GetYv(), bfield) );
541 fdEdxHLT->Fill( esdtrackHLT->GetTPCsignal() );
542 fdEdxVSPHLT->Fill( TMath::Abs(esdtrackHLT->P()), esdtrackHLT->GetTPCsignal() );
545 if(TMath::Abs(esdtrackHLT->Pt()) <Momcut) continue; //cut away tracks with mom<0.3GeV
546 fEtaDCAcutHLT->Fill(esdtrackHLT->Eta());
547 fPhiHLT->Fill(esdtrackHLT->Phi()*TMath::RadToDeg());
548 fThetaHLT->Fill(esdtrackHLT->Theta()*TMath::RadToDeg());
549 if(esdtrackHLT->GetTPCNcls()>0) fNclusterHLTwCut->Fill(esdtrackHLT->GetTPCNcls());
550 fMomentumHLT->Fill( TMath::Abs(esdtrackHLT->P()) );
553 if(esdHLT->IsHLTTriggerFired()){
555 }// end if for triggered hlt events
556 } // end of loop over hlt tracks
560 //----------------- OFFLINE ESD tree ----------------//
562 if(esdOFF->GetNumberOfTracks()!=0)
563 fMultOff->Fill( esdOFF->GetNumberOfTracks() );
565 Double_t vertexOFF[3];
567 const AliESDVertex *vertOff=esdOFF->GetPrimaryVertexTracks();
569 vertexOFF[0] = vertOff->GetX();
570 vertexOFF[1] = vertOff->GetY();
571 vertexOFF[2] = vertOff->GetZ();
572 AliVertex *primVertexOFF = new AliVertex(vertexOFF, 0., 0);
573 Bool_t testVertex=kTRUE;
575 if(vertOff->GetNContributors()<1) {
577 vertOff = esdOFF->GetPrimaryVertexSPD();
578 if(vertOff->GetNContributors()<1) {
579 // NO GOOD VERTEX, SKIP EVENT
581 // Printf("This vertex is away");
584 fVertexVSNtracksOff->Fill(vertOff->GetNContributors(),vertOff->GetZv());
586 if(vertOff->GetZ()!=0){
587 fXYvertexOff->Fill(vertOff->GetX(), vertOff->GetY() );
588 fXvertexOff->Fill( vertOff->GetX() );
589 fYvertexOff->Fill( vertOff->GetY() );
590 fZvertexOff->Fill( vertOff->GetZ() );
595 fEventSpecieOff->Fill(esdOFF->GetEventSpecie());
597 for(Int_t i=0; i<esdOFF->GetNumberOfTracks(); i++){
599 AliESDtrack *esdtrackOFF = esdOFF->GetTrack(i);
601 if (!esdtrackOFF) continue;
603 fChargeOff->Fill(esdtrackOFF->Charge());
605 if(esdtrackOFF->GetStatus()&AliESDtrack::kTPCin) fEtaOffTpc->Fill(esdtrackOFF->Eta());
606 if (esdtrackOFF->GetStatus()&AliESDtrack::kTPCin && esdtrackOFF->GetStatus()&AliESDtrack::kITSin) fEtaOffTpcIts->Fill(esdtrackOFF->Eta());
608 //Fill histograms with which flags are set
609 for(int jjj=0;jjj<12;jjj++){
610 if(esdtrackOFF->GetStatus()&Statusnames[jjj]) {
611 fStatusOff->Fill(jjj);
612 if(esdtrackOFF->GetTPCNcls()==0) fStatusOff_Ocl->Fill(jjj);
615 if(esdtrackOFF->GetTPCNcls()>0) fNclusterOff->Fill(esdtrackOFF->GetTPCNcls());
618 if(!fESDOfftrackCuts->AcceptTrack(esdtrackOFF) ) continue;// -- ESD cuts
619 if((esdOFF->GetEventSpecie()==16)) continue; // reject laser events
620 if(esdtrackOFF->GetTPCNcls()>0) fNclusVSphiOff->Fill(esdtrackOFF->Phi()*TMath::RadToDeg(), esdtrackOFF->GetTPCNcls());
621 if(esdtrackOFF->GetTPCNcls()>0) fNclusVSthetaOff->Fill(esdtrackOFF->Theta()*TMath::RadToDeg(), esdtrackOFF->GetTPCNcls());
623 fDCAOff->Fill(esdtrackOFF->GetD(esdOFF->GetPrimaryVertex()->GetXv(), esdOFF->GetPrimaryVertex()->GetYv(), bfield) );
624 fEtaOff->Fill(esdtrackOFF->Eta());
625 fdEdxOff->Fill( esdtrackOFF->GetTPCsignal() );
626 fdEdxVSPOff->Fill( TMath::Abs(esdtrackOFF->P()), esdtrackOFF->GetTPCsignal() );
628 if(TMath::Abs(esdtrackOFF->Pt()) < Momcut) continue;//cut away tracks with mom<0.3GeV
629 fEtaDCAcutOff->Fill(esdtrackOFF->Eta());
630 fPhiOff->Fill(esdtrackOFF->Phi()*TMath::RadToDeg());
631 fThetaOff->Fill(esdtrackOFF->Theta()*TMath::RadToDeg());
632 if(esdtrackOFF->GetTPCNcls()>0) fNclusterOffwCut->Fill(esdtrackOFF->GetTPCNcls());
633 fMomentumOff->Fill( TMath::Abs(esdtrackOFF->P()) );
636 if(esdHLT->IsHLTTriggerFired()){
638 } // end if for triggered offl events
640 } // end of loop over offl tracks
645 // if(esdHLT->IsHLTTriggerFired()){
647 // for(Int_t i=0; i<esdOFF->GetNumberOfTracks(); i++){
649 // AliESDtrack *esdTrk = esdOFF->GetTrack(i);
650 // Double_t dz[2] = {-999., -999.};
651 // Double_t covar[3] = {0};
652 // esdTrk->PropagateToDCA(vtx, bfield, 250., dz, covar);
653 // fHistOfflDZTrig->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1]));
655 // fHistOfflDZ->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1]));
658 // Double_t pnt[3] = {0., 0., 0.};
659 // Double_t norm[3] = {0., 0., 1.};
660 // if(esdTrk->Intersect(pnt, norm, bfield)){
661 // if(TMath::Sqrt(pnt[0]*pnt[0]+pnt[1]*pnt[1]) < 250) {
663 // fNtracksThruZ0Trig++;
664 // fHistTrigger->Fill(6., 1);
665 // fHistTrigger->Fill(7., 1);
670 // fHistOfflTrkDCATrig->Fill(TMath::Abs(esdTrk->GetD(0., 0., bfield)));
671 // fDCAOff->Fill(TMath::Abs(esdTrk->GetD(0., 0., bfield)));
673 // if(esdTrk->GetTPCNcls()>0){
674 // fHistOfflTrkNclsTrig->Fill(esdTrk->GetTPCNcls());
675 // fHistOfflTrkNcls->Fill(esdTrk->GetTPCNcls());
678 // fHistOfflTrkPTrig->Fill(TMath::Abs(esdTrk->P()));
679 // fHistOfflTrkP->Fill(TMath::Abs(esdTrk->P()));
680 // fHistOffldEdx->Fill( esdTrk->GetTPCsignal());
681 // fHistOffldEdxVsP->Fill(TMath::Abs(esdTrk->P()), esdTrk->GetTPCsignal());
684 delete primVertexOFF;
685 delete primVertexHLT;
688 PostData(1, fOutputList);
691 void AliAnalysisTaskHLT::Terminate(Option_t *){
692 // see header file of AliAnalysisTask for documentation
694 // Draw result to the screen
695 // Called once at the end of the query
697 Bool_t print_png=kFALSE;
702 TCanvas *c1 = new TCanvas("c1","Info pr track, Offline vs Online",10,10,1210,810);
707 maxbin =fEtaOff->GetBinContent(fEtaOff->GetMaximumBin());
708 if(maxbin < fEtaHLT->GetBinContent(fEtaHLT->GetMaximumBin()))
709 maxbin=fEtaHLT->GetBinContent(fEtaHLT->GetMaximumBin());
710 fEtaOff->SetMaximum(maxbin+20);
711 fEtaOff->SetTitle("Pseudorapidity (without momentum cut)");
712 fEtaOff->SetLineColor(2);
713 fEtaOff->DrawCopy("");
714 fEtaHLT->DrawCopy("sameS");
716 TLegend *legend = new TLegend(0.70,0.60,0.90,0.75);
717 legend->AddEntry(fEtaOff, "Offline", "LP");
718 legend->AddEntry(fEtaHLT,"HLT","LP");
719 legend->SetFillColor(10);
720 legend->SetBorderSize(0);
724 maxbin =fEtaDCAcutOff->GetBinContent(fEtaDCAcutOff->GetMaximumBin());
725 if(maxbin < fEtaDCAcutHLT->GetBinContent(fEtaDCAcutHLT->GetMaximumBin()))
726 maxbin=fEtaDCAcutHLT->GetBinContent(fEtaDCAcutHLT->GetMaximumBin());
727 fEtaDCAcutOff->SetMaximum(maxbin+20);
728 fEtaDCAcutOff->SetTitle("Pseudorapidity");
729 fEtaDCAcutOff->SetLineColor(2);
730 fEtaDCAcutOff->DrawCopy("");
731 fEtaDCAcutHLT->DrawCopy("sames");
734 maxbin =fNclusterOff->GetBinContent(fNclusterOff->GetMaximumBin());
735 if(maxbin < fNclusterHLT->GetBinContent(fNclusterHLT->GetMaximumBin()))
736 maxbin=fNclusterHLT->GetBinContent(fNclusterHLT->GetMaximumBin());
737 fNclusterOff->SetMaximum(maxbin+20);
738 fNclusterOff->SetLineColor(2);
739 fNclusterOff->SetTitle("Nr clusters per track");
740 fNclusterOff->DrawCopy("");
741 fNclusterHLT->DrawCopy("sames");
744 maxbin =fPhiOff->GetBinContent(fPhiOff->GetMaximumBin());
745 if(maxbin < fPhiHLT->GetBinContent(fPhiHLT->GetMaximumBin()))
746 maxbin=fPhiHLT->GetBinContent(fPhiHLT->GetMaximumBin());
747 fPhiOff->SetMinimum(0);
748 fPhiOff->SetMaximum(maxbin+20);
749 fPhiOff->SetLineColor(2);
750 fPhiOff->SetTitle("Azimuthal angle distribution");
751 fPhiOff->DrawCopy("");
752 fPhiHLT->DrawCopy("sames");
755 maxbin =fThetaOff->GetBinContent(fThetaOff->GetMaximumBin());
756 if(maxbin < fThetaHLT->GetBinContent(fThetaHLT->GetMaximumBin()))
757 maxbin=fThetaHLT->GetBinContent(fThetaHLT->GetMaximumBin());
758 fThetaOff->SetMaximum(maxbin+20);
759 fThetaOff->SetLineColor(2);
760 fThetaOff->SetTitle("Polar angle distribution");
761 fThetaOff->DrawCopy("");
762 fThetaHLT->DrawCopy("sames");
765 maxbin =fMomentumOff->GetBinContent(fMomentumOff->GetMaximumBin());
766 if(maxbin < fMomentumHLT->GetBinContent(fMomentumHLT->GetMaximumBin()))
767 maxbin=fMomentumHLT->GetBinContent(fMomentumHLT->GetMaximumBin());
768 fMomentumOff->SetMaximum(maxbin+200);
769 fMomentumOff->GetXaxis()->SetRangeUser(0,5);
770 fMomentumOff->SetLineColor(2);
771 fMomentumOff->SetTitle("Momentum");
772 fMomentumOff->DrawCopy("");
773 fMomentumHLT->DrawCopy("sames");
775 TCanvas *c2= new TCanvas("c2", "Info pr event, Offline vs Online", 10 , 10,1210, 810);
776 TLegend *legend2 = new TLegend(0.70,0.60,0.90,0.75);
779 fXvertexOff->SetTitle("Primary Vertex Distribution in X");
780 fXvertexOff->SetLineColor(2);
781 fXvertexOff->GetXaxis()->SetRangeUser(-0.5,0.5);
782 legend2->AddEntry(fXvertexOff,"Offline","LP");
783 fXvertexOff->DrawCopy("");
784 fXvertexHLT->DrawCopy("sames");
785 legend2->AddEntry(fXvertexHLT,"HLT","LP");
786 legend2->SetFillColor(10);
787 legend2->SetBorderSize(0);
790 fYvertexOff->SetTitle("Primary Vertex Distribution in Y");
791 fYvertexOff->SetLineColor(2);
792 fYvertexOff->GetXaxis()->SetRangeUser(-0.5,0.5);
793 fYvertexOff->DrawCopy("");
794 fYvertexHLT->DrawCopy("sames");
796 fZvertexOff->SetTitle("Primary Vertex Distribution in Z");
797 fZvertexOff->SetLineColor(2);
798 fZvertexOff->DrawCopy("");
799 fZvertexHLT->DrawCopy("sames");
802 fMultHLT->SetTitle("Track Multiplicity, NumberTracks>0");
803 fMultHLT->DrawCopy("");
804 fMultOff->SetLineColor(2);
805 fMultOff->DrawCopy("sames");
807 string filename="Info_pr_track";
809 sprintf(plotname,"%s.png",filename.c_str());
810 // c1->Print("Info_pr_track.png","png");
811 c1->Print(plotname,"png");
813 filename="Info_pr_Event";
814 sprintf(plotname,"%s.png",filename.c_str());
815 c2->Print(plotname,"png");
820 void AliAnalysisTaskHLT::SetupESDtrackCuts() {
823 Bool_t selPrimaries = kTRUE;
825 fESDOfftrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2009(selPrimaries);
827 fESDHLTtrackCuts = new AliESDtrackCuts;
830 fESDHLTtrackCuts->SetRequireTPCStandAlone(kTRUE); // to get chi2 and ncls of kTPCin
831 fESDHLTtrackCuts->SetMinNClustersTPC(70);
832 fESDHLTtrackCuts->SetMaxChi2PerClusterTPC(4);
833 fESDHLTtrackCuts->SetAcceptKinkDaughters(kFALSE);
835 // -- fESDHLTtrackCuts->SetRequireTPCRefit(kTRUE); -- JMT not present in HLT ESD
837 // -- fESDHLTtrackCuts->SetRequireITSRefit(kTRUE); -- JMT not present in HLT ESD
839 fESDHLTtrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
840 AliESDtrackCuts::kAny);
841 if(selPrimaries) { // 7*(0.0050+0.0060/pt^0.9)
842 fESDHLTtrackCuts->SetMaxDCAToVertexXYPtDep("0.0350+0.0420/pt^0.9");
845 fESDHLTtrackCuts->SetMaxDCAToVertexZ(1.e6);
846 fESDHLTtrackCuts->SetDCAToVertex2D(kFALSE);
847 fESDHLTtrackCuts->SetRequireSigmaToVertex(kFALSE);
848 fESDHLTtrackCuts->SetEtaRange(-0.9,+0.9);