-// $Id$\r
-\r
-//**************************************************************************\r
-//* This file is property of and copyright by the ALICE HLT Project *\r
-//* ALICE Experiment at CERN, All rights reserved. *\r
-//* *\r
-//* Primary Authors: Zhongbao Yin <zbyin@mail.ccnu.edu.cn>, *\r
-//* Kalliopi Kanaki <Kalliopi.Kanaki@ift.uib.no> *\r
-//* for The ALICE HLT Project. *\r
-//* *\r
-//* Permission to use, copy, modify and distribute this software and its *\r
-//* documentation strictly for non-commercial purposes is hereby granted *\r
-//* without fee, provided that the above copyright notice appears in all *\r
-//* copies and that both the copyright notice and this permission notice *\r
-//* appear in the supporting documentation. The authors make no claims *\r
-//* about the suitability of this software for any purpose. It is *\r
-//* provided "as is" without express or implied warranty. *\r
-//**************************************************************************\r
-\r
-/** @file AliAnalysisTaskHLTTPC.cxx \r
- @author Zhongbao Yin, Kalliopi Kanaki\r
- @date \r
- @brief\r
-*/\r
-\r
-\r
-#include <iostream>\r
-\r
-#include "TChain.h"\r
-#include "TTree.h"\r
-#include "TH1F.h"\r
-#include "TH2F.h"\r
-#include "TCanvas.h"\r
-#include "TVector3.h"\r
-#include "TString.h"\r
-#include "TObjArray.h"\r
-#include "TFile.h"\r
-\r
-#include "AliESDEvent.h"\r
-#include "AliESDRun.h"\r
-#include "AliESDInputHandler.h"\r
-\r
-#include "AliAnalysisTask.h"\r
-#include "AliAnalysisManager.h"\r
-#include "AliAnalysisTaskHLTTPC.h"\r
-\r
-\r
-ClassImp(AliAnalysisTaskHLTTPC)\r
-\r
-//======================================================================================================\r
- \r
- AliAnalysisTaskHLTTPC::AliAnalysisTaskHLTTPC(const char *name)\r
- :\r
- AliAnalysisTaskSE(name)\r
- ,fESDRun(0)\r
- ,fOutputList(0)\r
- ,fHistTrigger(0)\r
- ,fHistHLTTrigger(0)\r
- ,fHistOfflTrkDCA(0)\r
- ,fHistOfflTrkDCATrig(0)\r
- ,fHistOfflTrkDCANoTrig(0)\r
- ,fHistOnlTrkDCA(0)\r
- ,fHistOnlTrkDCATrig(0)\r
- ,fHistOfflTrkNcls(0)\r
- ,fHistOfflTrkNclsTrig(0)\r
- ,fHistOfflTrkNclsNoTrig(0)\r
- ,fHistOnlTrkNcls(0)\r
- ,fHistOnlTrkNclsTrig(0)\r
- ,fHistOfflTrkDCANoTrigNclsCut1(0)\r
- ,fHistOfflTrkDCANoTrigNclsCut2(0)\r
- ,fHistOfflTrkP(0)\r
- ,fHistOfflTrkPTrig(0)\r
- ,fHistOfflTrkPNoTrig(0)\r
- ,fHistOnlTrkP(0)\r
- ,fHistOfflResPtInv(0)\r
- ,fHistOnlResPtInv(0)\r
- ,fHistOffldEdx(0)\r
- ,fHistOnldEdx(0)\r
- ,fHistOffldEdxVsP(0)\r
- ,fHistOnldEdxVsP(0)\r
- ,fHistOffldZ(0) \r
- ,fHistOnldZ(0) \r
- ,fHistOffldX(0) \r
- ,fHistOnldX(0) \r
- ,fHistOfflPhi(0) \r
- ,fHistOnlPhi(0) \r
- ,fHistOfflTheta(0) \r
- ,fHistOnlTheta(0)\r
- ,fHistOnlDZ(0)\r
- ,fHistOfflDZ(0)\r
- ,fHistOfflDZTrig(0)\r
- ,fHistOfflDZNoTrig(0)\r
- ,fNevt(0)\r
- ,fTrgClsArray(0) \r
- //,fNtracksThruZ0(0),\r
- //,fNtracksThruZ0Trig(0)\r
-{\r
- // Constructor\r
-\r
- // Define input and output slots here\r
- // Input slot #0 works with a TChain\r
- // DefineInput(0, TChain::Class());\r
- // Output slot #0 writes into a TH1 container\r
-\r
- DefineOutput(1, TList::Class());\r
-}\r
-\r
-const Float_t AliAnalysisTaskHLTTPC::fgkEtaMin = -0.12; \r
-const Float_t AliAnalysisTaskHLTTPC::fgkEtaMax = 0.12; \r
-const Float_t AliAnalysisTaskHLTTPC::fgkPhiMin[5] = {3.83972, 4.18879, 4.53786, 4.88692, 5.23599}; \r
-const Float_t AliAnalysisTaskHLTTPC::fgkPhiMax[5] = {4.18879, 4.53786, 4.88692, 5.23599, 5.58505}; \r
-const Float_t AliAnalysisTaskHLTTPC::fgkNormX[5] = {-0.642788, -0.34202, 0, 0.34202, 0.642788}; \r
-const Float_t AliAnalysisTaskHLTTPC::fgkNormY[5] = {-0.766044, -0.939693, -1, -0.939693, -0.766044}; \r
-const Float_t AliAnalysisTaskHLTTPC::fgkInitPosX[5] = {-295.682, -157.329, 0, 157.329, 295.682}; \r
-const Float_t AliAnalysisTaskHLTTPC::fgkInitPosY[5] = {-352.38, -432.259, -460, -432.259, -352.38};\r
-\r
-//----------------------------------------------------------------------------------------------------\r
-\r
-void AliAnalysisTaskHLTTPC::UserCreateOutputObjects(){\r
-// Create histograms\r
-\r
- OpenFile(1);\r
-\r
- fOutputList = new TList();\r
- fOutputList->SetName(GetName());\r
-\r
- /*\r
- //0 mistriggered, 1 Good triggered, 2, triggered, 3 fake trigger, \r
- //4 events with offline track, 5 total events processed,\r
- //6 offline track thru CE, 7 online track to CE\r
- fHistTrigger = new TH1F("fHistTrigger", "Trigger Status", 8, -0.5, 7.5);\r
- fHistTrigger->GetXaxis()->SetTitle("");\r
- fHistTrigger->GetYaxis()->SetTitle("Events");\r
- fHistTrigger->SetMarkerStyle(kFullCircle);\r
- fHistTrigger->SetStats(0);\r
- fHistTrigger->SetFillColor(2);\r
- //fHistTrigger->SetDrawOption("B TEXT60");\r
-\r
- //Set bin labels\r
- (fHistTrigger->GetXaxis())->SetBinLabel(1,"missed");\r
- (fHistTrigger->GetXaxis())->SetBinLabel(2,"triggerWofflTrk");\r
- (fHistTrigger->GetXaxis())->SetBinLabel(3,"triggered");\r
- (fHistTrigger->GetXaxis())->SetBinLabel(4,"triggerWOofflTrk");\r
- (fHistTrigger->GetXaxis())->SetBinLabel(5,"NevWofflTrk");\r
- (fHistTrigger->GetXaxis())->SetBinLabel(6,"Nevt");\r
- (fHistTrigger->GetXaxis())->SetBinLabel(7,"offlTrkThruCE");\r
- (fHistTrigger->GetXaxis())->SetBinLabel(8,"onlTrkThruCE"); \r
- */\r
-\r
- fHistTrigger = new TH1F("fHistTrigger", "CTP trigger counter", 64, 0, 64);\r
- fHistTrigger->GetXaxis()->SetTitle(""); \r
- fHistTrigger->GetYaxis()->SetTitle("#Events"); \r
-\r
- fHistHLTTrigger = new TH1F("fHistHLTTrigger", "HLT CTP trigger counter", 64, 0, 64); \r
- fHistHLTTrigger->GetXaxis()->SetTitle("");\r
- fHistHLTTrigger->GetYaxis()->SetTitle("#Events"); \r
- \r
- fHistOfflTrkDCA = new TH1F("fHistOfflTrkDCA", "DCA to beam line (offline)", 250, 0, 250);\r
- fHistOfflTrkDCATrig = new TH1F("fHistOfflTrkDCATrig", "DCA to beam line (triggered offline)", 250, 0, 250);\r
- fHistOfflTrkDCANoTrig = new TH1F("fHistOfflTrkDCANoTrig","DCA to beam line (offline, not triggered)",250, 0, 250);\r
- \r
- fHistOnlTrkDCA = new TH1F("fHistOnlTrkDCA", "DCA to beam line (HLT)", 250, 0, 250);\r
- fHistOnlTrkDCATrig = new TH1F("fHistOnlTrkDCATrig","DCA to beam line (HLT triggered)",250, 0, 250); \r
- \r
- fHistOfflTrkNcls = new TH1F("fHistOfflTrkNcls", "clusters per track (offline)", 200, 0, 200);\r
- fHistOfflTrkNclsTrig = new TH1F("fHistOfflTrkNclsTrig", "clusters per track (triggered offline)", 200, 0, 200); \r
- fHistOfflTrkNclsNoTrig = new TH1F("fHistOfflTrkNclsNoTrig","clusters per track (offline, not triggered)",200, 0, 200);\r
-\r
- fHistOnlTrkNcls = new TH1F("fHistOnlTrkNcls", "clusters per track (HLT)", 200, 0, 200);\r
- fHistOnlTrkNclsTrig = new TH1F("fHistOnlTrkNclsTrig","clusters per track (HLT triggered)", 200, 0, 200); \r
- \r
- fHistOfflTrkDCANoTrigNclsCut1 = new TH1F("fHistOfflTrkDCANoTrigNclsCut1", "DCA to beam line (offline Ncls>=60, not triggered)",250, 0, 250);\r
- fHistOfflTrkDCANoTrigNclsCut2 = new TH1F("fHistOfflTrkDCANoTrigNclsCut2", "DCA to beam line (offline Ncls<60, not triggered)", 250, 0, 250);\r
- \r
- fHistOfflTrkP = new TH1F("fHistOfflTrkP", "momentum (offline)", 100, 0., 100);\r
- fHistOfflTrkPTrig = new TH1F("fHistOfflTrkPTrig", "momentum (offline triggered)", 100, 0., 100);\r
- fHistOfflTrkPNoTrig = new TH1F("fHistOfflTrkPNoTrig","momentum (offline, not triggered)",100, 0., 100);\r
- \r
- fHistOnlTrkP = new TH1F("fHistOnlTrkP", "momentum (HLT)", 100, 0., 100);\r
- \r
- fHistOfflResPtInv = new TH1F("fHistOfflResPtInv","resolution on 1/pt for the case with 2 offline tracks",100, 0., 1); // cosmics\r
- fHistOnlResPtInv = new TH1F("fHistOnlResPtInv", "resolution on 1/pt for the case with 2 HLT tracks", 100, 0., 1); // cosmics\r
- \r
- fHistOffldEdx = new TH1F("fHistOffldEdx", "energy loss (offline)",500, 0, 500);\r
- fHistOnldEdx = new TH1F("fHistOnldEdx", "energy loss (HLT)", 500, 0, 500);\r
- \r
- fHistOffldEdxVsP = new TH2F("fHistOffldEdxVsP","dE/dx vs. momentum (offline)",100, 0., 100., 500, 0., 500.);\r
- fHistOnldEdxVsP = new TH2F("fHistOnldEdxVsP", "dE/dx vs. momentum (HLT)", 100, 0., 100., 500, 0., 500.);\r
- \r
- fHistOffldZ = new TH1F("fHistOffldZ","z resolution (offline)",100, 0, 5.);\r
- fHistOnldZ = new TH1F("fHistOnldZ", "z resolution (HLT)", 100, 0.,5.);\r
-\r
- fHistOffldX = new TH1F("fHistOffldX","r resolution (offline)",100, 0., 5.);\r
- fHistOnldX = new TH1F("fHistOnldX", "r resolution (HLT)", 100, 0., 5.);\r
- \r
- fHistOfflPhi = new TH1F("fHistOfflPhi","#phi resolution (offline)",100, 0., 10); // in mrad\r
- fHistOnlPhi = new TH1F("fHistOnlPhi", "#phi resolution (HLT)", 100, 0., 10); // in mrad\r
- \r
- fHistOfflTheta = new TH1F("fHistOfflTheta","#theta resolution (offline)",100, 0., 10);\r
- fHistOnlTheta = new TH1F("fHistOnlTheta", "#theta resolution (HLT)", 100, 0., 10);\r
-\r
- fHistOfflDZ = new TH2F("fHistOfflDZ","track D vs. Z (offline)",1000, 0., 250, 1000, 0., 250);\r
- fHistOnlDZ = new TH2F("fHistOnlDZ", "track D vs. Z (HLT)", 1000, 0., 250, 1000, 0., 250);\r
- \r
- fHistOfflDZTrig = new TH2F("fHistOfflDZTrig", "track D vs. Z (offline triggered)", 1000, 0., 250, 1000, 0., 250);\r
- fHistOfflDZNoTrig = new TH2F("fHistOfflDZNoTrig","track D vs. Z (offline not triggered)",1000, 0., 250, 1000, 0., 250);\r
-\r
-\r
- fOutputList->Add(fHistTrigger);\r
- fOutputList->Add(fHistHLTTrigger);\r
-\r
- fOutputList->Add(fHistOfflTrkDCA);\r
- fOutputList->Add(fHistOfflTrkDCATrig);\r
- fOutputList->Add(fHistOfflTrkDCANoTrig);\r
- fOutputList->Add(fHistOnlTrkDCA);\r
- fOutputList->Add(fHistOnlTrkDCATrig); \r
- fOutputList->Add(fHistOfflTrkNcls);\r
- fOutputList->Add(fHistOfflTrkNclsTrig);\r
- fOutputList->Add(fHistOfflTrkNclsNoTrig); \r
- fOutputList->Add(fHistOnlTrkNcls);\r
- fOutputList->Add(fHistOnlTrkNclsTrig);\r
- fOutputList->Add(fHistOfflTrkDCANoTrigNclsCut1);\r
- fOutputList->Add(fHistOfflTrkDCANoTrigNclsCut2);\r
- fOutputList->Add(fHistOfflTrkP);\r
- fOutputList->Add(fHistOfflTrkPTrig);\r
- fOutputList->Add(fHistOfflTrkPNoTrig);\r
- fOutputList->Add(fHistOnlTrkP);\r
-\r
- fOutputList->Add(fHistOfflResPtInv); // cosmics\r
- fOutputList->Add(fHistOnlResPtInv); // cosmics\r
-\r
- fOutputList->Add(fHistOffldEdx);\r
- fOutputList->Add(fHistOnldEdx);\r
- fOutputList->Add(fHistOffldEdxVsP);\r
- fOutputList->Add(fHistOnldEdxVsP);\r
- fOutputList->Add(fHistOffldZ);\r
- fOutputList->Add(fHistOnldZ);\r
- fOutputList->Add(fHistOffldX);\r
- fOutputList->Add(fHistOnldX);\r
- fOutputList->Add(fHistOfflPhi); \r
- fOutputList->Add(fHistOnlPhi);\r
- fOutputList->Add(fHistOfflTheta);\r
- fOutputList->Add(fHistOnlTheta);\r
- fOutputList->Add(fHistOfflDZ);\r
- fOutputList->Add(fHistOnlDZ); \r
- fOutputList->Add(fHistOfflDZTrig); \r
- fOutputList->Add(fHistOfflDZNoTrig);\r
-}\r
-\r
-void AliAnalysisTaskHLTTPC::NotifyRun(){\r
-// This will not work if the active trigger classes change from run to run.\r
-// Then one has to know all trigger classes before processing the data.\r
-\r
- AliESDEvent* evESD = dynamic_cast<AliESDEvent*>(InputEvent());\r
- TString trgClasses = evESD->GetESDRun()->GetActiveTriggerClasses(); \r
- \r
- /*\r
- TObjArray * trgClsArray = trgClasses.Tokenize(" ");\r
- cout<<trgClsArray->GetEntries()<<endl;\r
-\r
- if(!fTrgClsArray){\r
- fTrgClsArray = trgClsArray;\r
- for(Int_t i = 0; i < fTrgClsArray->GetEntries(); i++){ \r
- TString str = ((TObjString *)fTrgClsArray->At(i))->GetString(); \r
- (fHistTrigger->GetXaxis())->SetBinLabel(i+1, str.Data()); \r
- (fHistHLTTrigger->GetXaxis())->SetBinLabel(i+1, str.Data()); \r
- } \r
- }else{\r
- for(Int_t i = 0; i < trgClsArray->GetEntries(); i++){\r
- \r
- }\r
- }\r
- */\r
-\r
- fTrgClsArray = trgClasses.Tokenize(" ");\r
- //cout<<fTrgClsArray->GetEntries()<<endl; \r
- \r
- for(Int_t i=0; i<fTrgClsArray->GetEntries(); i++){ \r
- TString str = ((TObjString *)fTrgClsArray->At(i))->GetString(); \r
- (fHistTrigger->GetXaxis())->SetBinLabel(i+1, str.Data()); \r
- (fHistHLTTrigger->GetXaxis())->SetBinLabel(i+1, str.Data()); \r
- } \r
- evESD = NULL;\r
-}\r
-\r
-void AliAnalysisTaskHLTTPC::UserExec(Option_t *){\r
-\r
- AliESDEvent* evESD = dynamic_cast<AliESDEvent*>(InputEvent());\r
- \r
- if (!evESD) {\r
- Printf("ERROR: fESD not available");\r
- return;\r
- }\r
- \r
- AliESDEvent* evHLTESD = 0;\r
- AliESDInputHandler* esdH = dynamic_cast<AliESDInputHandler*>(fInputHandler);\r
- \r
- if(esdH) evHLTESD = esdH->GetHLTEvent();\r
- \r
- if(!evHLTESD){\r
- Printf("ERROR: HLTesd not available");\r
- return;\r
- }\r
-\r
- Double_t b = evESD->GetMagneticField();\r
- \r
- Double_t pos[] = { 0., 0., 0.};\r
- AliVertex *vtx = new AliVertex(pos, 0., 0);\r
- \r
- //Fill CTP Trigger stuff\r
- //fHistTrigger->Fill(evESD->GetTriggerMask());\r
- \r
- for(Int_t i = 0; i<fTrgClsArray->GetEntries(); i++){\r
- if((evESD->GetFiredTriggerClasses()).Contains(((TObjString *)fTrgClsArray->At(i))->GetString())) fHistTrigger->Fill(i);\r
- }\r
-\r
- if(evHLTESD->IsHLTTriggerFired()){\r
- //fHistHLTTrigger->Fill(evESD->GetTriggerMask());\r
- for(Int_t i = 0; i<fTrgClsArray->GetEntries(); i++){ \r
- if((evESD->GetFiredTriggerClasses()).Contains(((TObjString *)fTrgClsArray->At(i))->GetString())) fHistHLTTrigger->Fill(i);\r
- } \r
- }\r
-\r
- if(evHLTESD->IsHLTTriggerFired()){\r
- for(Int_t i=0; i<evHLTESD->GetNumberOfTracks(); i++){\r
- AliESDtrack * HLTesdTrk = evHLTESD->GetTrack(i);\r
- \r
- if(HLTesdTrk->GetTPCNcls()>0){\r
- fHistOnlTrkNcls->Fill(HLTesdTrk->GetTPCNcls());\r
- fHistOnlTrkNclsTrig->Fill(HLTesdTrk->GetTPCNcls());\r
- }\r
- \r
- Double_t dz[2] = {-999., -999.}; \r
- Double_t covar[3] = {0.};\r
- \r
- HLTesdTrk->PropagateToDCA(vtx, b, 250., dz, covar); \r
- fHistOnlDZ->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1])); \r
- \r
- if(HLTesdTrk){\r
- fHistOnlTrkDCA->Fill(TMath::Abs(HLTesdTrk->GetD(0., 0., b)));\r
- fHistOnlTrkP->Fill(TMath::Abs(HLTesdTrk->P()));\r
- fHistOnldEdx->Fill(HLTesdTrk->GetTPCsignal());\r
- fHistOnldEdxVsP->Fill(TMath::Abs(HLTesdTrk->P()), HLTesdTrk->GetTPCsignal()); \r
- fHistOnlTrkDCATrig->Fill(TMath::Abs(HLTesdTrk->GetD(0., 0., b)));\r
- }\r
- }\r
- } else {\r
- for(Int_t i=0; i<evHLTESD->GetNumberOfTracks(); i++){ \r
- \r
- AliESDtrack * HLTesdTrk = evHLTESD->GetTrack(i); \r
- if(HLTesdTrk->GetTPCNcls()>0) fHistOnlTrkNcls->Fill(HLTesdTrk->GetTPCNcls()); \r
- \r
- Double_t dz[2] = {-999., -999.}; \r
- Double_t covar[3] = {0.}; \r
- \r
- HLTesdTrk->PropagateToDCA(vtx, b, 250., dz, covar); \r
- fHistOnlDZ->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1])); \r
- \r
- if(HLTesdTrk){ \r
- fHistOnlTrkDCA->Fill(TMath::Abs(HLTesdTrk->GetD(0., 0., b))); \r
- fHistOnlTrkP->Fill(TMath::Abs(HLTesdTrk->P())); \r
- fHistOnldEdx->Fill( HLTesdTrk->GetTPCsignal());\r
- fHistOnldEdxVsP->Fill(TMath::Abs(HLTesdTrk->P()), HLTesdTrk->GetTPCsignal());\r
- } \r
- } \r
- }\r
-\r
- if(evHLTESD->GetNumberOfTracks()==2){ // cosmics\r
- \r
- Double_t oneOverPt1 = (evHLTESD->GetTrack(0))->OneOverPt();\r
- Double_t oneOverPt2 = (evHLTESD->GetTrack(1))->OneOverPt();\r
- //cout<<"1/pt: "<<oneOverPt1<<", "<<oneOverPt2<<endl;\r
- fHistOnlResPtInv->Fill(2.*TMath::Abs(oneOverPt1-oneOverPt2)/(oneOverPt1+oneOverPt2));\r
-\r
- Float_t dz1[2], dz2[2];\r
- (evHLTESD->GetTrack(0))->GetDZ(0., 0., 0., b, dz1);\r
- (evHLTESD->GetTrack(1))->GetDZ(0., 0., 0., b, dz2);\r
- fHistOnldX->Fill(TMath::Abs(TMath::Abs(dz1[0])-TMath::Abs(dz2[0])));\r
- fHistOnldZ->Fill(TMath::Abs(dz1[1]-dz2[1]));\r
- \r
- Float_t dPhi = TMath::Abs( (evHLTESD->GetTrack(0))->Phi() - (evHLTESD->GetTrack(1))->Phi() - TMath::Pi() );\r
- if(dPhi>2.*TMath::Pi()) dPhi -= 2.*TMath::Pi();\r
- \r
- fHistOnlPhi->Fill(1000.*dPhi);\r
- fHistOnlTheta->Fill(1000.*TMath::Abs( (evHLTESD->GetTrack(0))->Theta() + (evHLTESD->GetTrack(1))->Theta() - TMath::Pi() ) );\r
- }\r
- \r
- if(evESD->GetNumberOfTracks()==2){ // cosmics\r
- \r
- Double_t oneOverPt1 = (evESD->GetTrack(0))->OneOverPt(); \r
- Double_t oneOverPt2 = (evESD->GetTrack(1))->OneOverPt(); \r
- fHistOfflResPtInv->Fill(2.*TMath::Abs(oneOverPt1-oneOverPt2)/(oneOverPt1+oneOverPt2) );\r
-\r
- Float_t dz1[2], dz2[2]; \r
- (evESD->GetTrack(0))->GetDZ(0., 0., 0., b, dz1); \r
- (evESD->GetTrack(1))->GetDZ(0., 0., 0., b, dz2); \r
- fHistOffldX->Fill(TMath::Abs(TMath::Abs(dz1[0])-TMath::Abs(dz2[0]))); \r
- fHistOffldZ->Fill(TMath::Abs(dz1[1]-dz2[1]));\r
- \r
- Float_t dPhi = TMath::Abs( (evESD->GetTrack(0))->Phi() - (evESD->GetTrack(1))->Phi() - TMath::Pi() );\r
- if(dPhi>2.*TMath::Pi()) dPhi -= 2.*TMath::Pi();\r
- \r
- fHistOfflPhi->Fill(1000.*dPhi); \r
- fHistOfflTheta->Fill(1000.*TMath::Abs( (evESD->GetTrack(0))->Theta() + (evESD->GetTrack(1))->Theta() - TMath::Pi() ) ); \r
- }\r
-\r
- //fHistTrigger->Fill(5., 1);\r
-\r
- // Printf("There are %d tracks in this event", evESD->GetNumberOfTracks());\r
-\r
- //if(evESD->GetNumberOfTracks()>0) fHistTrigger->Fill(4., 1);\r
-\r
- if(evHLTESD->IsHLTTriggerFired()){\r
- //fHistTrigger->Fill(2., 1);\r
-\r
- for(Int_t i = 0; i < evESD->GetNumberOfTracks(); i++){ \r
- \r
- AliESDtrack *esdTrk = evESD->GetTrack(i); \r
- Double_t dz[2] = {-999., -999.}; \r
- Double_t covar[3] = {0};\r
- esdTrk->PropagateToDCA(vtx, b, 250., dz, covar);\r
- fHistOfflDZTrig->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1]));\r
- \r
- fHistOfflDZ->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1]));\r
- \r
- /*\r
- Double_t pnt[3] = {0., 0., 0.};\r
- Double_t norm[3] = {0., 0., 1.};\r
- if(esdTrk->Intersect(pnt, norm, b)){\r
- if(TMath::Sqrt(pnt[0]*pnt[0]+pnt[1]*pnt[1]) < 250) {\r
- fNtracksThruZ0++;\r
- fNtracksThruZ0Trig++;\r
- fHistTrigger->Fill(6., 1);\r
- fHistTrigger->Fill(7., 1);\r
- }\r
- }\r
- */\r
-\r
- fHistOfflTrkDCATrig->Fill(TMath::Abs(esdTrk->GetD(0., 0., b)));\r
- fHistOfflTrkDCA->Fill(TMath::Abs(esdTrk->GetD(0., 0., b))); \r
-\r
- if(esdTrk->GetTPCNcls()>0){\r
- fHistOfflTrkNclsTrig->Fill(esdTrk->GetTPCNcls()); \r
- fHistOfflTrkNcls->Fill(esdTrk->GetTPCNcls());\r
- }\r
-\r
- fHistOfflTrkPTrig->Fill(TMath::Abs(esdTrk->P()));\r
- fHistOfflTrkP->Fill(TMath::Abs(esdTrk->P()));\r
- fHistOffldEdx->Fill( esdTrk->GetTPCsignal());\r
- fHistOffldEdxVsP->Fill(TMath::Abs(esdTrk->P()), esdTrk->GetTPCsignal());\r
- }\r
- } else {\r
-\r
- for(Int_t i=0; i<evESD->GetNumberOfTracks(); i++){ \r
- \r
- AliESDtrack * esdTrk = evESD->GetTrack(i); \r
- Double_t dz[2] = {0}; \r
- Double_t covar[3] = {0};\r
- esdTrk->PropagateToDCA(vtx, b, 250., dz, covar); \r
- fHistOfflDZNoTrig->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1])); \r
-\r
- fHistOfflDZ->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1]));\r
- \r
- /*\r
- Double_t pnt[3] = {0., 0., 0.}; \r
- Double_t norm[3] = {0., 0., 1.}; \r
- if(esdTrk->Intersect(pnt, norm, b)){ \r
- if(TMath::Sqrt(pnt[0]*pnt[0]+pnt[1]*pnt[1]) < 250) { \r
- fNtracksThruZ0++; \r
- fHistTrigger->Fill(6., 1);\r
- } \r
- } \r
- */\r
- \r
- fHistOfflTrkDCANoTrig->Fill(TMath::Abs(esdTrk->GetD(0., 0., b)));\r
- \r
- if(esdTrk->GetTPCNcls()>0) fHistOfflTrkNclsNoTrig->Fill(esdTrk->GetTPCNcls()); \r
- \r
- if(esdTrk->GetTPCNcls()>=60) fHistOfflTrkDCANoTrigNclsCut1->Fill(TMath::Abs(esdTrk->GetD(0., 0., b)));\r
- else fHistOfflTrkDCANoTrigNclsCut2->Fill(TMath::Abs(esdTrk->GetD(0., 0., b)));\r
- \r
- fHistOfflTrkDCA->Fill(TMath::Abs(esdTrk->GetD(0., 0., b)));\r
- fHistOfflTrkNcls->Fill(esdTrk->GetTPCNcls());\r
- \r
- fHistOfflTrkPNoTrig->Fill(TMath::Abs(esdTrk->P()));\r
- fHistOfflTrkP->Fill(TMath::Abs(esdTrk->P()));\r
- fHistOffldEdx->Fill( esdTrk->GetTPCsignal());\r
- fHistOffldEdxVsP->Fill(TMath::Abs(esdTrk->P()), esdTrk->GetTPCsignal());\r
- } \r
- }\r
-\r
- fNevt++;\r
- delete vtx;\r
-\r
- // Post output data.\r
- PostData(1, fOutputList);\r
- }\r
-\r
-void AliAnalysisTaskHLTTPC::Terminate(Option_t *){\r
- /*\r
- Printf("Number of tracks thru CE: %d", fNtracksThruZ0);\r
- Printf("Number of tracks thru CE from triggered events: %d", \r
- fNtracksThruZ0Trig);\r
- */\r
-\r
- // Draw result to the screen\r
- // Called once at the end of the query\r
-\r
- // TCanvas *c1 = new TCanvas("AliAnalysisTaskHLTTPC","Trigger",10,10,510,510);\r
- //fHistTrigger->DrawCopy("E");\r
- \r
-}\r
+// $Id$
+
+//**************************************************************************
+//* This file is property of and copyright by the ALICE HLT Project *
+//* ALICE Experiment at CERN, All rights reserved. *
+//* *
+//* Primary Authors: Zhongbao Yin <zbyin@mail.ccnu.edu.cn>, *
+//* Kalliopi Kanaki <Kalliopi.Kanaki@ift.uib.no> *
+//* for The ALICE HLT Project. *
+//* *
+//* Permission to use, copy, modify and distribute this software and its *
+//* documentation strictly for non-commercial purposes is hereby granted *
+//* without fee, provided that the above copyright notice appears in all *
+//* copies and that both the copyright notice and this permission notice *
+//* appear in the supporting documentation. The authors make no claims *
+//* about the suitability of this software for any purpose. It is *
+//* provided "as is" without express or implied warranty. *
+//**************************************************************************
+
+/** @file AliAnalysisTaskHLTTPC.cxx
+ @author Zhongbao Yin, Kalliopi Kanaki
+ @date
+ @brief
+*/
+
+
+#include <iostream>
+
+#include "TChain.h"
+#include "TTree.h"
+#include "TH1F.h"
+#include "TH2F.h"
+#include "TCanvas.h"
+#include "TVector3.h"
+#include "TString.h"
+#include "TObjArray.h"
+#include "TFile.h"
+
+#include "AliESDEvent.h"
+#include "AliESDRun.h"
+#include "AliESDInputHandler.h"
+
+#include "AliAnalysisTask.h"
+#include "AliAnalysisManager.h"
+#include "AliAnalysisTaskHLTTPC.h"
+
+
+ClassImp(AliAnalysisTaskHLTTPC)
+
+//======================================================================================================
+
+ AliAnalysisTaskHLTTPC::AliAnalysisTaskHLTTPC(const char *name)
+ :
+ AliAnalysisTaskSE(name)
+ ,fESDRun(0)
+ ,fOutputList(0)
+ ,fHistTrigger(0)
+ ,fHistHLTTrigger(0)
+ ,fHistOfflTrkDCA(0)
+ ,fHistOfflTrkDCATrig(0)
+ ,fHistOfflTrkDCANoTrig(0)
+ ,fHistOnlTrkDCA(0)
+ ,fHistOnlTrkDCATrig(0)
+ ,fHistOfflTrkNcls(0)
+ ,fHistOfflTrkNclsTrig(0)
+ ,fHistOfflTrkNclsNoTrig(0)
+ ,fHistOnlTrkNcls(0)
+ ,fHistOnlTrkNclsTrig(0)
+ ,fHistOfflTrkDCANoTrigNclsCut1(0)
+ ,fHistOfflTrkDCANoTrigNclsCut2(0)
+ ,fHistOfflTrkP(0)
+ ,fHistOfflTrkPTrig(0)
+ ,fHistOfflTrkPNoTrig(0)
+ ,fHistOnlTrkP(0)
+ ,fHistOfflResPtInv(0)
+ ,fHistOnlResPtInv(0)
+ ,fHistOffldEdx(0)
+ ,fHistOnldEdx(0)
+ ,fHistOffldEdxVsP(0)
+ ,fHistOnldEdxVsP(0)
+ ,fHistOffldZ(0)
+ ,fHistOnldZ(0)
+ ,fHistOffldX(0)
+ ,fHistOnldX(0)
+ ,fHistOfflPhi(0)
+ ,fHistOnlPhi(0)
+ ,fHistOfflTheta(0)
+ ,fHistOnlTheta(0)
+ ,fHistOnlDZ(0)
+ ,fHistOfflDZ(0)
+ ,fHistOfflDZTrig(0)
+ ,fHistOfflDZNoTrig(0)
+ ,fNevt(0)
+ ,fTrgClsArray(0)
+ //,fNtracksThruZ0(0),
+ //,fNtracksThruZ0Trig(0)
+{
+ // Constructor
+
+ // Define input and output slots here
+ // Input slot #0 works with a TChain
+ // DefineInput(0, TChain::Class());
+ // Output slot #0 writes into a TH1 container
+
+ DefineOutput(1, TList::Class());
+}
+
+const Float_t AliAnalysisTaskHLTTPC::fgkEtaMin = -0.12;
+const Float_t AliAnalysisTaskHLTTPC::fgkEtaMax = 0.12;
+const Float_t AliAnalysisTaskHLTTPC::fgkPhiMin[5] = {3.83972, 4.18879, 4.53786, 4.88692, 5.23599};
+const Float_t AliAnalysisTaskHLTTPC::fgkPhiMax[5] = {4.18879, 4.53786, 4.88692, 5.23599, 5.58505};
+const Float_t AliAnalysisTaskHLTTPC::fgkNormX[5] = {-0.642788, -0.34202, 0, 0.34202, 0.642788};
+const Float_t AliAnalysisTaskHLTTPC::fgkNormY[5] = {-0.766044, -0.939693, -1, -0.939693, -0.766044};
+const Float_t AliAnalysisTaskHLTTPC::fgkInitPosX[5] = {-295.682, -157.329, 0, 157.329, 295.682};
+const Float_t AliAnalysisTaskHLTTPC::fgkInitPosY[5] = {-352.38, -432.259, -460, -432.259, -352.38};
+
+//----------------------------------------------------------------------------------------------------
+
+void AliAnalysisTaskHLTTPC::UserCreateOutputObjects(){
+// Create histograms
+
+ OpenFile(1);
+
+ fOutputList = new TList();
+ fOutputList->SetName(GetName());
+
+ /*
+ //0 mistriggered, 1 Good triggered, 2, triggered, 3 fake trigger,
+ //4 events with offline track, 5 total events processed,
+ //6 offline track thru CE, 7 online track to CE
+ fHistTrigger = new TH1F("fHistTrigger", "Trigger Status", 8, -0.5, 7.5);
+ fHistTrigger->GetXaxis()->SetTitle("");
+ fHistTrigger->GetYaxis()->SetTitle("Events");
+ fHistTrigger->SetMarkerStyle(kFullCircle);
+ fHistTrigger->SetStats(0);
+ fHistTrigger->SetFillColor(2);
+ //fHistTrigger->SetDrawOption("B TEXT60");
+
+ //Set bin labels
+ (fHistTrigger->GetXaxis())->SetBinLabel(1,"missed");
+ (fHistTrigger->GetXaxis())->SetBinLabel(2,"triggerWofflTrk");
+ (fHistTrigger->GetXaxis())->SetBinLabel(3,"triggered");
+ (fHistTrigger->GetXaxis())->SetBinLabel(4,"triggerWOofflTrk");
+ (fHistTrigger->GetXaxis())->SetBinLabel(5,"NevWofflTrk");
+ (fHistTrigger->GetXaxis())->SetBinLabel(6,"Nevt");
+ (fHistTrigger->GetXaxis())->SetBinLabel(7,"offlTrkThruCE");
+ (fHistTrigger->GetXaxis())->SetBinLabel(8,"onlTrkThruCE");
+ */
+
+ fHistTrigger = new TH1F("fHistTrigger", "CTP trigger counter", 64, 0, 64);
+ fHistTrigger->GetXaxis()->SetTitle("");
+ fHistTrigger->GetYaxis()->SetTitle("#Events");
+
+ fHistHLTTrigger = new TH1F("fHistHLTTrigger", "HLT CTP trigger counter", 64, 0, 64);
+ fHistHLTTrigger->GetXaxis()->SetTitle("");
+ fHistHLTTrigger->GetYaxis()->SetTitle("#Events");
+
+ fHistOfflTrkDCA = new TH1F("fHistOfflTrkDCA", "DCA to beam line (offline)", 250, 0, 250);
+ fHistOfflTrkDCATrig = new TH1F("fHistOfflTrkDCATrig", "DCA to beam line (triggered offline)", 250, 0, 250);
+ fHistOfflTrkDCANoTrig = new TH1F("fHistOfflTrkDCANoTrig","DCA to beam line (offline, not triggered)",250, 0, 250);
+
+ fHistOnlTrkDCA = new TH1F("fHistOnlTrkDCA", "DCA to beam line (HLT)", 250, 0, 250);
+ fHistOnlTrkDCATrig = new TH1F("fHistOnlTrkDCATrig","DCA to beam line (HLT triggered)",250, 0, 250);
+
+ fHistOfflTrkNcls = new TH1F("fHistOfflTrkNcls", "clusters per track (offline)", 200, 0, 200);
+ fHistOfflTrkNclsTrig = new TH1F("fHistOfflTrkNclsTrig", "clusters per track (triggered offline)", 200, 0, 200);
+ fHistOfflTrkNclsNoTrig = new TH1F("fHistOfflTrkNclsNoTrig","clusters per track (offline, not triggered)",200, 0, 200);
+
+ fHistOnlTrkNcls = new TH1F("fHistOnlTrkNcls", "clusters per track (HLT)", 200, 0, 200);
+ fHistOnlTrkNclsTrig = new TH1F("fHistOnlTrkNclsTrig","clusters per track (HLT triggered)", 200, 0, 200);
+
+ fHistOfflTrkDCANoTrigNclsCut1 = new TH1F("fHistOfflTrkDCANoTrigNclsCut1", "DCA to beam line (offline Ncls>=60, not triggered)",250, 0, 250);
+ fHistOfflTrkDCANoTrigNclsCut2 = new TH1F("fHistOfflTrkDCANoTrigNclsCut2", "DCA to beam line (offline Ncls<60, not triggered)", 250, 0, 250);
+
+ fHistOfflTrkP = new TH1F("fHistOfflTrkP", "momentum (offline)", 100, 0., 100);
+ fHistOfflTrkPTrig = new TH1F("fHistOfflTrkPTrig", "momentum (offline triggered)", 100, 0., 100);
+ fHistOfflTrkPNoTrig = new TH1F("fHistOfflTrkPNoTrig","momentum (offline, not triggered)",100, 0., 100);
+
+ fHistOnlTrkP = new TH1F("fHistOnlTrkP", "momentum (HLT)", 100, 0., 100);
+
+ fHistOfflResPtInv = new TH1F("fHistOfflResPtInv","resolution on 1/pt for the case with 2 offline tracks",100, 0., 1); // cosmics
+ fHistOnlResPtInv = new TH1F("fHistOnlResPtInv", "resolution on 1/pt for the case with 2 HLT tracks", 100, 0., 1); // cosmics
+
+ fHistOffldEdx = new TH1F("fHistOffldEdx", "energy loss (offline)",500, 0, 500);
+ fHistOnldEdx = new TH1F("fHistOnldEdx", "energy loss (HLT)", 500, 0, 500);
+
+ fHistOffldEdxVsP = new TH2F("fHistOffldEdxVsP","dE/dx vs. momentum (offline)",100, 0., 100., 500, 0., 500.);
+ fHistOnldEdxVsP = new TH2F("fHistOnldEdxVsP", "dE/dx vs. momentum (HLT)", 100, 0., 100., 500, 0., 500.);
+
+ fHistOffldZ = new TH1F("fHistOffldZ","z resolution (offline)",100, 0, 5.);
+ fHistOnldZ = new TH1F("fHistOnldZ", "z resolution (HLT)", 100, 0.,5.);
+
+ fHistOffldX = new TH1F("fHistOffldX","r resolution (offline)",100, 0., 5.);
+ fHistOnldX = new TH1F("fHistOnldX", "r resolution (HLT)", 100, 0., 5.);
+
+ fHistOfflPhi = new TH1F("fHistOfflPhi","#phi resolution (offline)",100, 0., 10); // in mrad
+ fHistOnlPhi = new TH1F("fHistOnlPhi", "#phi resolution (HLT)", 100, 0., 10); // in mrad
+
+ fHistOfflTheta = new TH1F("fHistOfflTheta","#theta resolution (offline)",100, 0., 10);
+ fHistOnlTheta = new TH1F("fHistOnlTheta", "#theta resolution (HLT)", 100, 0., 10);
+
+ fHistOfflDZ = new TH2F("fHistOfflDZ","track D vs. Z (offline)",1000, 0., 250, 1000, 0., 250);
+ fHistOnlDZ = new TH2F("fHistOnlDZ", "track D vs. Z (HLT)", 1000, 0., 250, 1000, 0., 250);
+
+ fHistOfflDZTrig = new TH2F("fHistOfflDZTrig", "track D vs. Z (offline triggered)", 1000, 0., 250, 1000, 0., 250);
+ fHistOfflDZNoTrig = new TH2F("fHistOfflDZNoTrig","track D vs. Z (offline not triggered)",1000, 0., 250, 1000, 0., 250);
+
+
+ fOutputList->Add(fHistTrigger);
+ fOutputList->Add(fHistHLTTrigger);
+
+ fOutputList->Add(fHistOfflTrkDCA);
+ fOutputList->Add(fHistOfflTrkDCATrig);
+ fOutputList->Add(fHistOfflTrkDCANoTrig);
+ fOutputList->Add(fHistOnlTrkDCA);
+ fOutputList->Add(fHistOnlTrkDCATrig);
+ fOutputList->Add(fHistOfflTrkNcls);
+ fOutputList->Add(fHistOfflTrkNclsTrig);
+ fOutputList->Add(fHistOfflTrkNclsNoTrig);
+ fOutputList->Add(fHistOnlTrkNcls);
+ fOutputList->Add(fHistOnlTrkNclsTrig);
+ fOutputList->Add(fHistOfflTrkDCANoTrigNclsCut1);
+ fOutputList->Add(fHistOfflTrkDCANoTrigNclsCut2);
+ fOutputList->Add(fHistOfflTrkP);
+ fOutputList->Add(fHistOfflTrkPTrig);
+ fOutputList->Add(fHistOfflTrkPNoTrig);
+ fOutputList->Add(fHistOnlTrkP);
+
+ fOutputList->Add(fHistOfflResPtInv); // cosmics
+ fOutputList->Add(fHistOnlResPtInv); // cosmics
+
+ fOutputList->Add(fHistOffldEdx);
+ fOutputList->Add(fHistOnldEdx);
+ fOutputList->Add(fHistOffldEdxVsP);
+ fOutputList->Add(fHistOnldEdxVsP);
+ fOutputList->Add(fHistOffldZ);
+ fOutputList->Add(fHistOnldZ);
+ fOutputList->Add(fHistOffldX);
+ fOutputList->Add(fHistOnldX);
+ fOutputList->Add(fHistOfflPhi);
+ fOutputList->Add(fHistOnlPhi);
+ fOutputList->Add(fHistOfflTheta);
+ fOutputList->Add(fHistOnlTheta);
+ fOutputList->Add(fHistOfflDZ);
+ fOutputList->Add(fHistOnlDZ);
+ fOutputList->Add(fHistOfflDZTrig);
+ fOutputList->Add(fHistOfflDZNoTrig);
+}
+
+void AliAnalysisTaskHLTTPC::NotifyRun(){
+// This will not work if the active trigger classes change from run to run.
+// Then one has to know all trigger classes before processing the data.
+
+ AliESDEvent* evESD = dynamic_cast<AliESDEvent*>(InputEvent());
+ TString trgClasses = evESD->GetESDRun()->GetActiveTriggerClasses();
+
+ /*
+ TObjArray * trgClsArray = trgClasses.Tokenize(" ");
+ cout<<trgClsArray->GetEntries()<<endl;
+
+ if(!fTrgClsArray){
+ fTrgClsArray = trgClsArray;
+ for(Int_t i = 0; i < fTrgClsArray->GetEntries(); i++){
+ TString str = ((TObjString *)fTrgClsArray->At(i))->GetString();
+ (fHistTrigger->GetXaxis())->SetBinLabel(i+1, str.Data());
+ (fHistHLTTrigger->GetXaxis())->SetBinLabel(i+1, str.Data());
+ }
+ }else{
+ for(Int_t i = 0; i < trgClsArray->GetEntries(); i++){
+
+ }
+ }
+ */
+
+ fTrgClsArray = trgClasses.Tokenize(" ");
+ //cout<<fTrgClsArray->GetEntries()<<endl;
+
+ for(Int_t i=0; i<fTrgClsArray->GetEntries(); i++){
+ TString str = ((TObjString *)fTrgClsArray->At(i))->GetString();
+ (fHistTrigger->GetXaxis())->SetBinLabel(i+1, str.Data());
+ (fHistHLTTrigger->GetXaxis())->SetBinLabel(i+1, str.Data());
+ }
+ evESD = NULL;
+}
+
+void AliAnalysisTaskHLTTPC::UserExec(Option_t *){
+
+ AliESDEvent* evESD = dynamic_cast<AliESDEvent*>(InputEvent());
+
+ if (!evESD) {
+ Printf("ERROR: fESD not available");
+ return;
+ }
+
+ AliESDEvent* evHLTESD = 0;
+ AliESDInputHandler* esdH = dynamic_cast<AliESDInputHandler*>(fInputHandler);
+
+ if(esdH) evHLTESD = esdH->GetHLTEvent();
+
+ if(!evHLTESD){
+ Printf("ERROR: HLTesd not available");
+ return;
+ }
+
+ Double_t b = evESD->GetMagneticField();
+
+ Double_t pos[] = { 0., 0., 0.};
+ AliVertex *vtx = new AliVertex(pos, 0., 0);
+
+ //Fill CTP Trigger stuff
+ //fHistTrigger->Fill(evESD->GetTriggerMask());
+
+ for(Int_t i = 0; i<fTrgClsArray->GetEntries(); i++){
+ if((evESD->GetFiredTriggerClasses()).Contains(((TObjString *)fTrgClsArray->At(i))->GetString())) fHistTrigger->Fill(i);
+ }
+
+ if(evHLTESD->IsHLTTriggerFired()){
+ //fHistHLTTrigger->Fill(evESD->GetTriggerMask());
+ for(Int_t i = 0; i<fTrgClsArray->GetEntries(); i++){
+ if((evESD->GetFiredTriggerClasses()).Contains(((TObjString *)fTrgClsArray->At(i))->GetString())) fHistHLTTrigger->Fill(i);
+ }
+ }
+
+ if(evHLTESD->IsHLTTriggerFired()){
+ for(Int_t i=0; i<evHLTESD->GetNumberOfTracks(); i++){
+ AliESDtrack * HLTesdTrk = evHLTESD->GetTrack(i);
+
+ if(HLTesdTrk->GetTPCNcls()>0){
+ fHistOnlTrkNcls->Fill(HLTesdTrk->GetTPCNcls());
+ fHistOnlTrkNclsTrig->Fill(HLTesdTrk->GetTPCNcls());
+ }
+
+ Double_t dz[2] = {-999., -999.};
+ Double_t covar[3] = {0.};
+
+ HLTesdTrk->PropagateToDCA(vtx, b, 250., dz, covar);
+ fHistOnlDZ->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1]));
+
+ if(HLTesdTrk){
+ fHistOnlTrkDCA->Fill(TMath::Abs(HLTesdTrk->GetD(0., 0., b)));
+ fHistOnlTrkP->Fill(TMath::Abs(HLTesdTrk->P()));
+ fHistOnldEdx->Fill(HLTesdTrk->GetTPCsignal());
+ fHistOnldEdxVsP->Fill(TMath::Abs(HLTesdTrk->P()), HLTesdTrk->GetTPCsignal());
+ fHistOnlTrkDCATrig->Fill(TMath::Abs(HLTesdTrk->GetD(0., 0., b)));
+ }
+ }
+ } else {
+ for(Int_t i=0; i<evHLTESD->GetNumberOfTracks(); i++){
+
+ AliESDtrack * HLTesdTrk = evHLTESD->GetTrack(i);
+ if(HLTesdTrk->GetTPCNcls()>0) fHistOnlTrkNcls->Fill(HLTesdTrk->GetTPCNcls());
+
+ Double_t dz[2] = {-999., -999.};
+ Double_t covar[3] = {0.};
+
+ HLTesdTrk->PropagateToDCA(vtx, b, 250., dz, covar);
+ fHistOnlDZ->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1]));
+
+ if(HLTesdTrk){
+ fHistOnlTrkDCA->Fill(TMath::Abs(HLTesdTrk->GetD(0., 0., b)));
+ fHistOnlTrkP->Fill(TMath::Abs(HLTesdTrk->P()));
+ fHistOnldEdx->Fill( HLTesdTrk->GetTPCsignal());
+ fHistOnldEdxVsP->Fill(TMath::Abs(HLTesdTrk->P()), HLTesdTrk->GetTPCsignal());
+ }
+ }
+ }
+
+ if(evHLTESD->GetNumberOfTracks()==2){ // cosmics
+
+ Double_t oneOverPt1 = (evHLTESD->GetTrack(0))->OneOverPt();
+ Double_t oneOverPt2 = (evHLTESD->GetTrack(1))->OneOverPt();
+ //cout<<"1/pt: "<<oneOverPt1<<", "<<oneOverPt2<<endl;
+ fHistOnlResPtInv->Fill(2.*TMath::Abs(oneOverPt1-oneOverPt2)/(oneOverPt1+oneOverPt2));
+
+ Float_t dz1[2], dz2[2];
+ (evHLTESD->GetTrack(0))->GetDZ(0., 0., 0., b, dz1);
+ (evHLTESD->GetTrack(1))->GetDZ(0., 0., 0., b, dz2);
+ fHistOnldX->Fill(TMath::Abs(TMath::Abs(dz1[0])-TMath::Abs(dz2[0])));
+ fHistOnldZ->Fill(TMath::Abs(dz1[1]-dz2[1]));
+
+ Float_t dPhi = TMath::Abs( (evHLTESD->GetTrack(0))->Phi() - (evHLTESD->GetTrack(1))->Phi() - TMath::Pi() );
+ if(dPhi>2.*TMath::Pi()) dPhi -= 2.*TMath::Pi();
+
+ fHistOnlPhi->Fill(1000.*dPhi);
+ fHistOnlTheta->Fill(1000.*TMath::Abs( (evHLTESD->GetTrack(0))->Theta() + (evHLTESD->GetTrack(1))->Theta() - TMath::Pi() ) );
+ }
+
+ if(evESD->GetNumberOfTracks()==2){ // cosmics
+
+ Double_t oneOverPt1 = (evESD->GetTrack(0))->OneOverPt();
+ Double_t oneOverPt2 = (evESD->GetTrack(1))->OneOverPt();
+ fHistOfflResPtInv->Fill(2.*TMath::Abs(oneOverPt1-oneOverPt2)/(oneOverPt1+oneOverPt2) );
+
+ Float_t dz1[2], dz2[2];
+ (evESD->GetTrack(0))->GetDZ(0., 0., 0., b, dz1);
+ (evESD->GetTrack(1))->GetDZ(0., 0., 0., b, dz2);
+ fHistOffldX->Fill(TMath::Abs(TMath::Abs(dz1[0])-TMath::Abs(dz2[0])));
+ fHistOffldZ->Fill(TMath::Abs(dz1[1]-dz2[1]));
+
+ Float_t dPhi = TMath::Abs( (evESD->GetTrack(0))->Phi() - (evESD->GetTrack(1))->Phi() - TMath::Pi() );
+ if(dPhi>2.*TMath::Pi()) dPhi -= 2.*TMath::Pi();
+
+ fHistOfflPhi->Fill(1000.*dPhi);
+ fHistOfflTheta->Fill(1000.*TMath::Abs( (evESD->GetTrack(0))->Theta() + (evESD->GetTrack(1))->Theta() - TMath::Pi() ) );
+ }
+
+ //fHistTrigger->Fill(5., 1);
+
+ // Printf("There are %d tracks in this event", evESD->GetNumberOfTracks());
+
+ //if(evESD->GetNumberOfTracks()>0) fHistTrigger->Fill(4., 1);
+
+ if(evHLTESD->IsHLTTriggerFired()){
+ //fHistTrigger->Fill(2., 1);
+
+ for(Int_t i = 0; i < evESD->GetNumberOfTracks(); i++){
+
+ AliESDtrack *esdTrk = evESD->GetTrack(i);
+ Double_t dz[2] = {-999., -999.};
+ Double_t covar[3] = {0};
+ esdTrk->PropagateToDCA(vtx, b, 250., dz, covar);
+ fHistOfflDZTrig->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1]));
+
+ fHistOfflDZ->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1]));
+
+ /*
+ Double_t pnt[3] = {0., 0., 0.};
+ Double_t norm[3] = {0., 0., 1.};
+ if(esdTrk->Intersect(pnt, norm, b)){
+ if(TMath::Sqrt(pnt[0]*pnt[0]+pnt[1]*pnt[1]) < 250) {
+ fNtracksThruZ0++;
+ fNtracksThruZ0Trig++;
+ fHistTrigger->Fill(6., 1);
+ fHistTrigger->Fill(7., 1);
+ }
+ }
+ */
+
+ fHistOfflTrkDCATrig->Fill(TMath::Abs(esdTrk->GetD(0., 0., b)));
+ fHistOfflTrkDCA->Fill(TMath::Abs(esdTrk->GetD(0., 0., b)));
+
+ if(esdTrk->GetTPCNcls()>0){
+ fHistOfflTrkNclsTrig->Fill(esdTrk->GetTPCNcls());
+ fHistOfflTrkNcls->Fill(esdTrk->GetTPCNcls());
+ }
+
+ fHistOfflTrkPTrig->Fill(TMath::Abs(esdTrk->P()));
+ fHistOfflTrkP->Fill(TMath::Abs(esdTrk->P()));
+ fHistOffldEdx->Fill( esdTrk->GetTPCsignal());
+ fHistOffldEdxVsP->Fill(TMath::Abs(esdTrk->P()), esdTrk->GetTPCsignal());
+ }
+ } else {
+
+ for(Int_t i=0; i<evESD->GetNumberOfTracks(); i++){
+
+ AliESDtrack * esdTrk = evESD->GetTrack(i);
+ Double_t dz[2] = {0};
+ Double_t covar[3] = {0};
+ esdTrk->PropagateToDCA(vtx, b, 250., dz, covar);
+ fHistOfflDZNoTrig->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1]));
+
+ fHistOfflDZ->Fill(TMath::Abs(dz[0]), TMath::Abs(dz[1]));
+
+ /*
+ Double_t pnt[3] = {0., 0., 0.};
+ Double_t norm[3] = {0., 0., 1.};
+ if(esdTrk->Intersect(pnt, norm, b)){
+ if(TMath::Sqrt(pnt[0]*pnt[0]+pnt[1]*pnt[1]) < 250) {
+ fNtracksThruZ0++;
+ fHistTrigger->Fill(6., 1);
+ }
+ }
+ */
+
+ fHistOfflTrkDCANoTrig->Fill(TMath::Abs(esdTrk->GetD(0., 0., b)));
+
+ if(esdTrk->GetTPCNcls()>0) fHistOfflTrkNclsNoTrig->Fill(esdTrk->GetTPCNcls());
+
+ if(esdTrk->GetTPCNcls()>=60) fHistOfflTrkDCANoTrigNclsCut1->Fill(TMath::Abs(esdTrk->GetD(0., 0., b)));
+ else fHistOfflTrkDCANoTrigNclsCut2->Fill(TMath::Abs(esdTrk->GetD(0., 0., b)));
+
+ fHistOfflTrkDCA->Fill(TMath::Abs(esdTrk->GetD(0., 0., b)));
+ fHistOfflTrkNcls->Fill(esdTrk->GetTPCNcls());
+
+ fHistOfflTrkPNoTrig->Fill(TMath::Abs(esdTrk->P()));
+ fHistOfflTrkP->Fill(TMath::Abs(esdTrk->P()));
+ fHistOffldEdx->Fill( esdTrk->GetTPCsignal());
+ fHistOffldEdxVsP->Fill(TMath::Abs(esdTrk->P()), esdTrk->GetTPCsignal());
+ }
+ }
+
+ fNevt++;
+ delete vtx;
+
+ // Post output data.
+ PostData(1, fOutputList);
+ }
+
+void AliAnalysisTaskHLTTPC::Terminate(Option_t *){
+ /*
+ Printf("Number of tracks thru CE: %d", fNtracksThruZ0);
+ Printf("Number of tracks thru CE from triggered events: %d",
+ fNtracksThruZ0Trig);
+ */
+
+ // Draw result to the screen
+ // Called once at the end of the query
+
+ // TCanvas *c1 = new TCanvas("AliAnalysisTaskHLTTPC","Trigger",10,10,510,510);
+ //fHistTrigger->DrawCopy("E");
+
+}