3 //**************************************************************************
4 //* This file is property of and copyright by the ALICE HLT Project *
5 //* ALICE Experiment at CERN, All rights reserved. *
7 //* Primary Authors: Zhongbao Yin <zbyin@mail.ccnu.edu.cn>, *
8 //* Kalliopi Kanaki <Kalliopi.Kanaki@ift.uib.no> *
9 //* Svein Lindal <svein.lindal@gmail.com> *
10 //* for The ALICE HLT Project. *
12 //* Permission to use, copy, modify and distribute this software and its *
13 //* documentation strictly for non-commercial purposes is hereby granted *
14 //* without fee, provided that the above copyright notice appears in all *
15 //* copies and that both the copyright notice and this permission notice *
16 //* appear in the supporting documentation. The authors make no claims *
17 //* about the suitability of this software for any purpose. It is *
18 //* provided "as is" without express or implied warranty. *
19 //**************************************************************************
21 /** @file AliAnalysisTaskHLTPHOS.cxx
22 @author Zhongbao Yin, Kalliopi Kanaki, Svein Lindal
36 #include "TObjArray.h"
39 #include "AliESDEvent.h"
40 #include "AliESDRun.h"
41 #include "AliESDInputHandler.h"
42 #include "AliESDCaloCluster.h"
44 #include "AliAnalysisTask.h"
45 #include "AliAnalysisManager.h"
46 #include "AliAnalysisTaskHLTPHOS.h"
49 ClassImp(AliAnalysisTaskHLTPHOS)
52 //===========================================================================================
54 AliAnalysisTaskHLTPHOS::AliAnalysisTaskHLTPHOS() : AliAnalysisTaskHLTCalo()
57 ,fHistOfflTrk2PHOSTrig(0)
58 ,fHistOfflTrk2PHOSNoTrig(0)
62 // Define input and output slots here
63 // Input slot #0 works with a TChain
64 // DefineInput(0, TChain::Class());
65 // Output slot #0 writes into a TH1 container
67 // DefineOutput(1, TList::Class());
71 AliAnalysisTaskHLTPHOS::AliAnalysisTaskHLTPHOS(const char *name) : AliAnalysisTaskHLTCalo(name)
74 ,fHistOfflTrk2PHOSTrig(0)
75 ,fHistOfflTrk2PHOSNoTrig(0)
79 // Define input and output slots here
80 // Input slot #0 works with a TChain
81 // DefineInput(0, TChain::Class());
82 // Output slot #0 writes into a TH1 container
84 // DefineOutput(1, TList::Class());
87 const Float_t AliAnalysisTaskHLTPHOS::fgkEtaMin = -0.12;
88 const Float_t AliAnalysisTaskHLTPHOS::fgkEtaMax = 0.12;
89 const Float_t AliAnalysisTaskHLTPHOS::fgkPhiMin[5] = {3.83972, 4.18879, 4.53786, 4.88692, 5.23599};
90 const Float_t AliAnalysisTaskHLTPHOS::fgkPhiMax[5] = {4.18879, 4.53786, 4.88692, 5.23599, 5.58505};
91 const Float_t AliAnalysisTaskHLTPHOS::fgkNormX[5] = {-0.642788, -0.34202, 0, 0.34202, 0.642788};
92 const Float_t AliAnalysisTaskHLTPHOS::fgkNormY[5] = {-0.766044, -0.939693, -1, -0.939693, -0.766044};
93 const Float_t AliAnalysisTaskHLTPHOS::fgkInitPosX[5] = {-295.682, -157.329, 0, 157.329, 295.682};
94 const Float_t AliAnalysisTaskHLTPHOS::fgkInitPosY[5] = {-352.38, -432.259, -460, -432.259, -352.38};
96 //----------------------------------------------------------------------------------------------------
98 void AliAnalysisTaskHLTPHOS::CreateSpecificStuff(TList * fOutputList){
101 // --------------- define histograms ---------------------//
103 fHistOfflTrk2PHOS = new TH2F("fHistOfflTrk2PHOS","track intersection point in #eta and #phi (offline)",100, -0.5, 0.5, 100, 240, 340);
104 fHistOnlTrk2PHOS = new TH2F("fHistOnlTrk2PHOS", "track intersection point in #eta and #phi (HLT)", 100, -0.5, 0.5, 100, 240, 340);
106 fHistOfflTrk2PHOSTrig = new TH2F("fHistOfflTrk2PHOSTrig", "track intersection point in #eta and #phi (offline triggered)", 100, -0.5, 0.5, 100, 240, 340);
107 fHistOfflTrk2PHOSNoTrig = new TH2F("fHistOfflTrk2PHOSNoTrig","track intersection point in #eta and #phi (offline not triggered)",100, -0.5, 0.5, 100, 240, 340);
109 // -------------- add histograms to the output TList -----------------//
111 fOutputList->Add(fHistOnlTrk2PHOS);
112 fOutputList->Add(fHistOfflTrk2PHOS);
113 fOutputList->Add(fHistOfflTrk2PHOSTrig);
114 fOutputList->Add(fHistOfflTrk2PHOSNoTrig);
119 void AliAnalysisTaskHLTPHOS::DoSpecificStuff(const AliESDEvent * evESD, const AliESDEvent * evHLTESD) {
120 //Do PHOS specific tests
122 Double_t b = evESD->GetMagneticField();
124 //Double_t pos[] = { 0., 0., 0.};
125 //AliVertex *vtx = new AliVertex(pos, 0., 0);
127 // for(Int_t i = 0; i<fTrgClsArray->GetEntries(); i++){
128 // if((evESD->GetFiredTriggerClasses()).Contains(((TObjString *)fTrgClsArray->At(i))->GetString())) fHistTrigger->Fill(i);
131 // if(evHLTESD->IsHLTTriggerFired()){
132 // //fHistHLTTrigger->Fill(evESD->GetTriggerMask());
133 // for(Int_t i = 0; i<fTrgClsArray->GetEntries(); i++){
134 // if((evESD->GetFiredTriggerClasses()).Contains(((TObjString *)fTrgClsArray->At(i))->GetString())) fHistHLTTrigger->Fill(i);
140 if(evHLTESD->IsHLTTriggerFired()){
141 for(Int_t i = 0; i < evHLTESD->GetNumberOfTracks(); i++){
142 AliESDtrack * HLTesdTrk = evHLTESD->GetTrack(i);
145 if(IsInPHOS(2, HLTesdTrk, b, v)){
146 Float_t phi = v.Phi();
147 if(phi<0) phi += 2.*TMath::Pi();
148 fHistOnlTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());
149 }else if(IsInPHOS(3, HLTesdTrk, b, v)){
150 Float_t phi = v.Phi();
151 if(phi<0) phi += 2.*TMath::Pi();
152 fHistOnlTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());
153 }else if( IsInPHOS(4, HLTesdTrk, b, v) ){
154 Float_t phi = v.Phi();
155 if(phi<0) phi += 2.*TMath::Pi();
156 fHistOnlTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());
160 if(IsInPHOS(2, HLTesdTrk, b)
161 || IsInPHOS(3, HLTesdTrk, b)
162 || IsInPHOS(4, HLTesdTrk, b) ) cout<<"Good Trigger"<<endl;
170 for(Int_t i = 0; i < evHLTESD->GetNumberOfTracks(); i++){
171 AliESDtrack * HLTesdTrk = evHLTESD->GetTrack(i);
173 if(IsInPHOS(2, HLTesdTrk, b, v)){
174 Float_t phi = v.Phi();
175 if(phi<0) phi += 2.*TMath::Pi();
176 fHistOnlTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());
177 }else if(IsInPHOS(3, HLTesdTrk, b, v)){
178 Float_t phi = v.Phi();
179 if(phi<0) phi += 2.*TMath::Pi();
180 fHistOnlTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());
181 }else if( IsInPHOS(4, HLTesdTrk, b, v) ){
182 Float_t phi = v.Phi();
183 if(phi<0) phi += 2.*TMath::Pi();
184 fHistOnlTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());
189 if(evHLTESD->IsHLTTriggerFired()){
191 for(Int_t i = 0; i < evESD->GetNumberOfTracks(); i++){
192 AliESDtrack * esdTrk = evESD->GetTrack(i);
195 if(IsInPHOS(2, esdTrk, b, v)){
196 Float_t phi = v.Phi();
197 if(phi<0) phi += 2.*TMath::Pi();
198 fHistOfflTrk2PHOSTrig->Fill(v.Eta(), phi*TMath::RadToDeg());
199 fHistOfflTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());
200 }else if(IsInPHOS(3, esdTrk, b, v)){
201 Float_t phi = v.Phi();
202 if(phi<0) phi += 2.*TMath::Pi();
203 fHistOfflTrk2PHOSTrig->Fill(v.Eta(), phi*TMath::RadToDeg());
204 fHistOfflTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());
205 }else if( IsInPHOS(4, esdTrk, b, v) ){
206 Float_t phi = v.Phi();
207 if(phi<0) phi += 2.*TMath::Pi();
208 fHistOfflTrk2PHOSTrig->Fill(v.Eta(), phi*TMath::RadToDeg());
209 fHistOfflTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());
214 for(Int_t i = 0; i < evESD->GetNumberOfTracks(); i++){
215 AliESDtrack * esdTrk = evESD->GetTrack(i);
218 if(IsInPHOS(2, esdTrk, b, v)){
219 Float_t phi = v.Phi();
220 if(phi<0) phi += 2.*TMath::Pi();
221 fHistOfflTrk2PHOSNoTrig->Fill(v.Eta(), phi*TMath::RadToDeg());
222 fHistOfflTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());
223 //cout<<"Event in PHOS 2: "<<fNevt<<endl;
224 }else if(IsInPHOS(3, esdTrk, b, v)){
225 Float_t phi = v.Phi();
226 if(phi<0) phi += 2.*TMath::Pi();
227 fHistOfflTrk2PHOSNoTrig->Fill(v.Eta(), phi*TMath::RadToDeg());
228 fHistOfflTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());
229 //cout<<"Event in PHOS 3: "<<fNevt<<endl;
230 }else if( IsInPHOS(4, esdTrk, b, v) ){
231 Float_t phi = v.Phi();
232 if(phi<0) phi += 2.*TMath::Pi();
233 fHistOfflTrk2PHOSNoTrig->Fill(v.Eta(), phi*TMath::RadToDeg());
234 fHistOfflTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());
235 //cout<<"Event in PHOS 4: "<<fNevt<<endl;
242 //cout << "here" << endl;
244 //Int_t nc = evHLTESD->GetPHOSClusters(fClustersArray);
245 //Int_t nc = evHLTESD->GetEMCALClusters(fClustersArray);
248 // cout << nc << " ";
250 // for(int i = 0; i < evHLTESD->GetNumberOfCaloClusters(); i++) {
251 // AliESDCaloCluster * c = evHLTESD->GetCaloCluster(i);
252 // cout << c->IsPHOS() << "i ";
260 Int_t AliAnalysisTaskHLTPHOS::GetClusters(AliESDEvent * event, TRefArray * clusters) {
261 return event->GetPHOSClusters(clusters);
264 Bool_t AliAnalysisTaskHLTPHOS::IsThisDetector(AliESDCaloCluster * cluster) {
265 return cluster->IsPHOS();
269 Bool_t AliAnalysisTaskHLTPHOS::IsInPHOS(Int_t iMod, AliESDtrack * trk, Float_t b, TVector3& v){
272 Double_t normVector[3] = {fgkNormX[iMod], fgkNormY[iMod], 0};
274 Double_t point[3] = {fgkInitPosX[iMod], fgkInitPosY[iMod], 0};
276 if(!trk->Intersect(point, normVector, b)) return kFALSE;
278 TVector3 trackPos(point);
283 if(trackPos.Phi() < 0) phi = trackPos.Phi() + 2*TMath::Pi();
284 else phi = trackPos.Phi();
286 if(trackPos.Eta() >= fgkEtaMin &&
287 trackPos.Eta() <= fgkEtaMax &&
288 phi >= fgkPhiMin[iMod] &&
289 phi <= fgkPhiMax[iMod])