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 AliAnalysisTaskHLTPHOS.cxx
\r
21 @author Zhongbao Yin, Kalliopi Kanaki
\r
32 #include "TCanvas.h"
\r
33 #include "TVector3.h"
\r
34 #include "TString.h"
\r
35 #include "TObjArray.h"
\r
38 #include "AliESDEvent.h"
\r
39 #include "AliESDRun.h"
\r
40 #include "AliESDInputHandler.h"
\r
42 #include "AliAnalysisTask.h"
\r
43 #include "AliAnalysisManager.h"
\r
44 #include "AliAnalysisTaskHLTPHOS.h"
\r
47 ClassImp(AliAnalysisTaskHLTPHOS)
\r
49 //===========================================================================================
\r
51 AliAnalysisTaskHLTPHOS::AliAnalysisTaskHLTPHOS(const char *name)
\r
53 AliAnalysisTaskSE(name)
\r
56 ,fHistOnlTrk2PHOS(0)
\r
57 ,fHistOfflTrk2PHOS(0)
\r
58 ,fHistOfflTrk2PHOSTrig(0)
\r
59 ,fHistOfflTrk2PHOSNoTrig(0)
\r
65 // Define input and output slots here
\r
66 // Input slot #0 works with a TChain
\r
67 // DefineInput(0, TChain::Class());
\r
68 // Output slot #0 writes into a TH1 container
\r
70 DefineOutput(1, TList::Class());
\r
73 const Float_t AliAnalysisTaskHLTPHOS::fgkEtaMin = -0.12;
\r
74 const Float_t AliAnalysisTaskHLTPHOS::fgkEtaMax = 0.12;
\r
75 const Float_t AliAnalysisTaskHLTPHOS::fgkPhiMin[5] = {3.83972, 4.18879, 4.53786, 4.88692, 5.23599};
\r
76 const Float_t AliAnalysisTaskHLTPHOS::fgkPhiMax[5] = {4.18879, 4.53786, 4.88692, 5.23599, 5.58505};
\r
77 const Float_t AliAnalysisTaskHLTPHOS::fgkNormX[5] = {-0.642788, -0.34202, 0, 0.34202, 0.642788};
\r
78 const Float_t AliAnalysisTaskHLTPHOS::fgkNormY[5] = {-0.766044, -0.939693, -1, -0.939693, -0.766044};
\r
79 const Float_t AliAnalysisTaskHLTPHOS::fgkInitPosX[5] = {-295.682, -157.329, 0, 157.329, 295.682};
\r
80 const Float_t AliAnalysisTaskHLTPHOS::fgkInitPosY[5] = {-352.38, -432.259, -460, -432.259, -352.38};
\r
82 //----------------------------------------------------------------------------------------------------
\r
84 void AliAnalysisTaskHLTPHOS::UserCreateOutputObjects(){
\r
85 // Create histograms
\r
89 fOutputList = new TList();
\r
90 fOutputList->SetName(GetName());
\r
92 // --------------- define histograms ---------------------//
\r
94 fHistOfflTrk2PHOS = new TH2F("fHistOfflTrk2PHOS","track intersection point in #eta and #phi (offline)",100, -0.5, 0.5, 100, 240, 340);
\r
95 fHistOnlTrk2PHOS = new TH2F("fHistOnlTrk2PHOS", "track intersection point in #eta and #phi (HLT)", 100, -0.5, 0.5, 100, 240, 340);
\r
97 fHistOfflTrk2PHOSTrig = new TH2F("fHistOfflTrk2PHOSTrig", "track intersection point in #eta and #phi (offline triggered)", 100, -0.5, 0.5, 100, 240, 340);
\r
98 fHistOfflTrk2PHOSNoTrig = new TH2F("fHistOfflTrk2PHOSNoTrig","track intersection point in #eta and #phi (offline not triggered)",100, -0.5, 0.5, 100, 240, 340);
\r
100 // -------------- add histograms to the output TList -----------------//
\r
102 fOutputList->Add(fHistOnlTrk2PHOS);
\r
103 fOutputList->Add(fHistOfflTrk2PHOS);
\r
104 fOutputList->Add(fHistOfflTrk2PHOSTrig);
\r
105 fOutputList->Add(fHistOfflTrk2PHOSNoTrig);
\r
109 void AliAnalysisTaskHLTPHOS::NotifyRun(){
\r
110 // This will not work if the active trigger classes change from run to run.
\r
111 // Then one has to know all trigger classes before processing the data.
\r
113 AliESDEvent* evESD = dynamic_cast<AliESDEvent*>(InputEvent());
\r
114 TString trgClasses = evESD->GetESDRun()->GetActiveTriggerClasses();
\r
116 fTrgClsArray = trgClasses.Tokenize(" ");
\r
117 //cout<<fTrgClsArray->GetEntries()<<endl;
\r
119 // for(Int_t i = 0; i < fTrgClsArray->GetEntries(); i++){
\r
120 // TString str = ((TObjString *)fTrgClsArray->At(i))->GetString();
\r
121 // (fHistTrigger->GetXaxis())->SetBinLabel(i+1, str.Data());
\r
122 // (fHistHLTTrigger->GetXaxis())->SetBinLabel(i+1, str.Data());
\r
128 void AliAnalysisTaskHLTPHOS::UserExec(Option_t *){
\r
130 AliESDEvent* evESD = dynamic_cast<AliESDEvent*>(InputEvent());
\r
133 Printf("ERROR: fESD not available");
\r
137 AliESDEvent* evHLTESD = 0;
\r
138 AliESDInputHandler* esdH = dynamic_cast<AliESDInputHandler*>(fInputHandler);
\r
140 if(esdH) evHLTESD = esdH->GetHLTEvent();
\r
143 Printf("ERROR: HLTesd not available");
\r
147 Double_t b = evESD->GetMagneticField();
\r
149 Double_t pos[] = { 0., 0., 0.};
\r
150 AliVertex *vtx = new AliVertex(pos, 0., 0);
\r
152 // for(Int_t i = 0; i<fTrgClsArray->GetEntries(); i++){
\r
153 // if((evESD->GetFiredTriggerClasses()).Contains(((TObjString *)fTrgClsArray->At(i))->GetString())) fHistTrigger->Fill(i);
\r
156 // if(evHLTESD->IsHLTTriggerFired()){
\r
157 // //fHistHLTTrigger->Fill(evESD->GetTriggerMask());
\r
158 // for(Int_t i = 0; i<fTrgClsArray->GetEntries(); i++){
\r
159 // if((evESD->GetFiredTriggerClasses()).Contains(((TObjString *)fTrgClsArray->At(i))->GetString())) fHistHLTTrigger->Fill(i);
\r
163 if(evHLTESD->IsHLTTriggerFired()){
\r
164 for(Int_t i = 0; i < evHLTESD->GetNumberOfTracks(); i++){
\r
165 AliESDtrack * HLTesdTrk = evHLTESD->GetTrack(i);
\r
168 if(IsInPHOS(2, HLTesdTrk, b, v)){
\r
169 Float_t phi = v.Phi();
\r
170 if(phi<0) phi += 2.*TMath::Pi();
\r
171 fHistOnlTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());
\r
172 }else if(IsInPHOS(3, HLTesdTrk, b, v)){
\r
173 Float_t phi = v.Phi();
\r
174 if(phi<0) phi += 2.*TMath::Pi();
\r
175 fHistOnlTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());
\r
176 }else if( IsInPHOS(4, HLTesdTrk, b, v) ){
\r
177 Float_t phi = v.Phi();
\r
178 if(phi<0) phi += 2.*TMath::Pi();
\r
179 fHistOnlTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());
\r
183 if(IsInPHOS(2, HLTesdTrk, b)
\r
184 || IsInPHOS(3, HLTesdTrk, b)
\r
185 || IsInPHOS(4, HLTesdTrk, b) ) cout<<"Good Trigger"<<endl;
\r
190 for(Int_t i = 0; i < evHLTESD->GetNumberOfTracks(); i++){
\r
191 AliESDtrack * HLTesdTrk = evHLTESD->GetTrack(i);
\r
194 if(IsInPHOS(2, HLTesdTrk, b, v)){
\r
195 Float_t phi = v.Phi();
\r
196 if(phi<0) phi += 2.*TMath::Pi();
\r
197 fHistOnlTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());
\r
198 }else if(IsInPHOS(3, HLTesdTrk, b, v)){
\r
199 Float_t phi = v.Phi();
\r
200 if(phi<0) phi += 2.*TMath::Pi();
\r
201 fHistOnlTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());
\r
202 }else if( IsInPHOS(4, HLTesdTrk, b, v) ){
\r
203 Float_t phi = v.Phi();
\r
204 if(phi<0) phi += 2.*TMath::Pi();
\r
205 fHistOnlTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());
\r
210 if(evHLTESD->IsHLTTriggerFired()){
\r
212 for(Int_t i = 0; i < evESD->GetNumberOfTracks(); i++){
\r
213 AliESDtrack * esdTrk = evESD->GetTrack(i);
\r
216 if(IsInPHOS(2, esdTrk, b, v)){
\r
217 Float_t phi = v.Phi();
\r
218 if(phi<0) phi += 2.*TMath::Pi();
\r
219 fHistOfflTrk2PHOSTrig->Fill(v.Eta(), phi*TMath::RadToDeg());
\r
220 fHistOfflTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());
\r
221 //cout<<"Event in PHOS 2: "<<fNevt<<endl;
\r
222 }else if(IsInPHOS(3, esdTrk, b, v)){
\r
223 Float_t phi = v.Phi();
\r
224 if(phi<0) phi += 2.*TMath::Pi();
\r
225 fHistOfflTrk2PHOSTrig->Fill(v.Eta(), phi*TMath::RadToDeg());
\r
226 fHistOfflTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());
\r
227 //cout<<"Event in PHOS 3: "<<fNevt<<endl;
\r
228 }else if( IsInPHOS(4, esdTrk, b, v) ){
\r
229 Float_t phi = v.Phi();
\r
230 if(phi<0) phi += 2.*TMath::Pi();
\r
231 fHistOfflTrk2PHOSTrig->Fill(v.Eta(), phi*TMath::RadToDeg());
\r
232 fHistOfflTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());
\r
233 //cout<<"Event in PHOS 4: "<<fNevt<<endl;
\r
238 for(Int_t i = 0; i < evESD->GetNumberOfTracks(); i++){
\r
239 AliESDtrack * esdTrk = evESD->GetTrack(i);
\r
242 if(IsInPHOS(2, esdTrk, b, v)){
\r
243 Float_t phi = v.Phi();
\r
244 if(phi<0) phi += 2.*TMath::Pi();
\r
245 fHistOfflTrk2PHOSNoTrig->Fill(v.Eta(), phi*TMath::RadToDeg());
\r
246 fHistOfflTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());
\r
247 //cout<<"Event in PHOS 2: "<<fNevt<<endl;
\r
248 }else if(IsInPHOS(3, esdTrk, b, v)){
\r
249 Float_t phi = v.Phi();
\r
250 if(phi<0) phi += 2.*TMath::Pi();
\r
251 fHistOfflTrk2PHOSNoTrig->Fill(v.Eta(), phi*TMath::RadToDeg());
\r
252 fHistOfflTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());
\r
253 //cout<<"Event in PHOS 3: "<<fNevt<<endl;
\r
254 }else if( IsInPHOS(4, esdTrk, b, v) ){
\r
255 Float_t phi = v.Phi();
\r
256 if(phi<0) phi += 2.*TMath::Pi();
\r
257 fHistOfflTrk2PHOSNoTrig->Fill(v.Eta(), phi*TMath::RadToDeg());
\r
258 fHistOfflTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());
\r
259 //cout<<"Event in PHOS 4: "<<fNevt<<endl;
\r
267 // Post output data.
\r
268 PostData(1, fOutputList);
\r
272 void AliAnalysisTaskHLTPHOS::Terminate(Option_t *){
\r
274 Printf("Number of tracks thru CE: %d", fNtracksThruZ0);
\r
275 Printf("Number of tracks thru CE from triggered events: %d",
\r
276 fNtracksThruZ0Trig);
\r
279 // Draw result to the screen
\r
280 // Called once at the end of the query
\r
282 // TCanvas *c1 = new TCanvas("AliAnalysisTaskHLTPHOS","Trigger",10,10,510,510);
\r
283 //fHistTrigger->DrawCopy("E");
\r
287 Bool_t AliAnalysisTaskHLTPHOS::IsInPHOS(Int_t iMod, AliESDtrack * trk, Float_t b, TVector3& v){
\r
289 Double_t normVector[3] = {fgkNormX[iMod], fgkNormY[iMod], 0};
\r
291 Double_t point[3] = {fgkInitPosX[iMod], fgkInitPosY[iMod], 0};
\r
293 if(!trk->Intersect(point, normVector, b)) return kFALSE;
\r
295 TVector3 trackPos(point);
\r
300 if(trackPos.Phi() < 0) phi = trackPos.Phi() + 2*TMath::Pi();
\r
301 else phi = trackPos.Phi();
\r
303 if(trackPos.Eta() >= fgkEtaMin &&
\r
304 trackPos.Eta() <= fgkEtaMax &&
\r
305 phi >= fgkPhiMin[iMod] &&
\r
306 phi <= fgkPhiMax[iMod])
\r