-Added base Calo QA class.
[u/mrichter/AliRoot.git] / HLT / QA / tasks / AliAnalysisTaskHLTPHOS.cxx
1 // $Id$\r
2 \r
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
6 //*                                                                        *\r
7 //* Primary Authors: Zhongbao Yin <zbyin@mail.ccnu.edu.cn>,                *\r
8 //*                  Kalliopi Kanaki <Kalliopi.Kanaki@ift.uib.no>          *\r
9 //*                  Svein Lindal <svein.lindal@gmail.com>                 *\r
10 //*                  for The ALICE HLT Project.                            *\r
11 //*                                                                        *\r
12 //* Permission to use, copy, modify and distribute this software and its   *\r
13 //* documentation strictly for non-commercial purposes is hereby granted   *\r
14 //* without fee, provided that the above copyright notice appears in all   *\r
15 //* copies and that both the copyright notice and this permission notice   *\r
16 //* appear in the supporting documentation. The authors make no claims     *\r
17 //* about the suitability of this software for any purpose. It is          *\r
18 //* provided "as is" without express or implied warranty.                  *\r
19 //**************************************************************************\r
20 \r
21 /** @file   AliAnalysisTaskHLTPHOS.cxx\r
22     @author Zhongbao Yin, Kalliopi Kanaki, Svein Lindal\r
23     @date\r
24     @brief\r
25 */\r
26 \r
27 #include <iostream>\r
28 \r
29 #include "TChain.h"\r
30 #include "TTree.h"\r
31 #include "TH1F.h"\r
32 #include "TH2F.h"\r
33 #include "TCanvas.h"\r
34 #include "TVector3.h"\r
35 #include "TString.h"\r
36 #include "TObjArray.h"\r
37 #include "TFile.h"\r
38 \r
39 #include "AliESDEvent.h"\r
40 #include "AliESDRun.h"\r
41 #include "AliESDInputHandler.h"\r
42 #include "AliESDCaloCluster.h"\r
43 \r
44 #include "AliAnalysisTask.h"\r
45 #include "AliAnalysisManager.h"\r
46 #include "AliAnalysisTaskHLTPHOS.h"\r
47 \r
48 \r
49 ClassImp(AliAnalysisTaskHLTPHOS)\r
50 \r
51 \r
52 //===========================================================================================\r
53 \r
54 AliAnalysisTaskHLTPHOS::AliAnalysisTaskHLTPHOS(const char *name) : AliAnalysisTaskHLTCalo(name)\r
55   ,fHistOnlTrk2PHOS(0)\r
56   ,fHistOfflTrk2PHOS(0)\r
57   ,fHistOfflTrk2PHOSTrig(0)\r
58   ,fHistOfflTrk2PHOSNoTrig(0)\r
59 {\r
60   // Constructor\r
61 \r
62   // Define input and output slots here\r
63   // Input slot #0 works with a TChain\r
64   // DefineInput(0, TChain::Class());\r
65   // Output slot #0 writes into a TH1 container\r
66 \r
67   // DefineOutput(1, TList::Class());\r
68 }\r
69 \r
70 const Float_t AliAnalysisTaskHLTPHOS::fgkEtaMin = -0.12;  \r
71 const Float_t AliAnalysisTaskHLTPHOS::fgkEtaMax =  0.12;  \r
72 const Float_t AliAnalysisTaskHLTPHOS::fgkPhiMin[5]   = {3.83972, 4.18879, 4.53786, 4.88692, 5.23599};  \r
73 const Float_t AliAnalysisTaskHLTPHOS::fgkPhiMax[5]   = {4.18879, 4.53786, 4.88692, 5.23599, 5.58505};  \r
74 const Float_t AliAnalysisTaskHLTPHOS::fgkNormX[5]    = {-0.642788, -0.34202, 0, 0.34202, 0.642788};  \r
75 const Float_t AliAnalysisTaskHLTPHOS::fgkNormY[5]    = {-0.766044, -0.939693, -1, -0.939693, -0.766044};  \r
76 const Float_t AliAnalysisTaskHLTPHOS::fgkInitPosX[5] = {-295.682, -157.329, 0, 157.329, 295.682};  \r
77 const Float_t AliAnalysisTaskHLTPHOS::fgkInitPosY[5] = {-352.38, -432.259, -460, -432.259, -352.38};\r
78 \r
79 //----------------------------------------------------------------------------------------------------\r
80 \r
81 void AliAnalysisTaskHLTPHOS::CreateSpecificStuff(TList * fOutputList){\r
82 \r
83 \r
84 // --------------- define histograms ---------------------//\r
85 \r
86   fHistOfflTrk2PHOS = new TH2F("fHistOfflTrk2PHOS","track intersection point in #eta and #phi (offline)",100, -0.5, 0.5, 100, 240, 340); \r
87   fHistOnlTrk2PHOS  = new TH2F("fHistOnlTrk2PHOS", "track intersection point in #eta and #phi (HLT)",    100, -0.5, 0.5, 100, 240, 340);\r
88   \r
89   fHistOfflTrk2PHOSTrig   = new TH2F("fHistOfflTrk2PHOSTrig",  "track intersection point in #eta and #phi (offline triggered)",    100, -0.5, 0.5, 100, 240, 340);  \r
90   fHistOfflTrk2PHOSNoTrig = new TH2F("fHistOfflTrk2PHOSNoTrig","track intersection point in #eta and #phi (offline not triggered)",100, -0.5, 0.5, 100, 240, 340);   \r
91 \r
92   // -------------- add histograms to the output TList -----------------//\r
93   \r
94   fOutputList->Add(fHistOnlTrk2PHOS);\r
95   fOutputList->Add(fHistOfflTrk2PHOS);  \r
96   fOutputList->Add(fHistOfflTrk2PHOSTrig);\r
97   fOutputList->Add(fHistOfflTrk2PHOSNoTrig);\r
98 \r
99 }\r
100 \r
101 \r
102 void AliAnalysisTaskHLTPHOS::DoSpecificStuff(AliESDEvent * evESD, AliESDEvent * evHLTESD) {\r
103 \r
104 \r
105   Double_t b = evESD->GetMagneticField();\r
106   \r
107   //Double_t pos[] = { 0., 0., 0.};\r
108   //AliVertex *vtx = new AliVertex(pos, 0., 0);\r
109     \r
110 //   for(Int_t i = 0; i<fTrgClsArray->GetEntries(); i++){\r
111 //       if((evESD->GetFiredTriggerClasses()).Contains(((TObjString *)fTrgClsArray->At(i))->GetString()))  fHistTrigger->Fill(i);\r
112 //   }\r
113 // \r
114 //   if(evHLTESD->IsHLTTriggerFired()){\r
115 //      //fHistHLTTrigger->Fill(evESD->GetTriggerMask());\r
116 //      for(Int_t i = 0; i<fTrgClsArray->GetEntries(); i++){ \r
117 //          if((evESD->GetFiredTriggerClasses()).Contains(((TObjString *)fTrgClsArray->At(i))->GetString())) fHistHLTTrigger->Fill(i);\r
118 //      } \r
119 //   }\r
120 \r
121 \r
122 \r
123   if(evHLTESD->IsHLTTriggerFired()){\r
124     for(Int_t i = 0; i < evHLTESD->GetNumberOfTracks(); i++){\r
125          AliESDtrack * HLTesdTrk = evHLTESD->GetTrack(i);\r
126       \r
127         TVector3 v; \r
128         if(IsInPHOS(2, HLTesdTrk, b, v)){ \r
129           Float_t phi = v.Phi(); \r
130           if(phi<0) phi += 2.*TMath::Pi(); \r
131           fHistOnlTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg()); \r
132         }else if(IsInPHOS(3, HLTesdTrk, b, v)){ \r
133           Float_t phi = v.Phi();  \r
134           if(phi<0) phi += 2.*TMath::Pi();  \r
135           fHistOnlTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());  \r
136         }else if( IsInPHOS(4, HLTesdTrk, b, v) ){ \r
137           Float_t phi = v.Phi();   \r
138           if(phi<0) phi += 2.*TMath::Pi();   \r
139           fHistOnlTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg()); \r
140         } \r
141 \r
142 /*\r
143       if(IsInPHOS(2, HLTesdTrk, b) \r
144          || IsInPHOS(3, HLTesdTrk, b)\r
145          || IsInPHOS(4, HLTesdTrk, b) ) cout<<"Good Trigger"<<endl;\r
146 */      \r
147   \r
148 \r
149         \r
150      }\r
151   }else{\r
152 \r
153     for(Int_t i = 0; i < evHLTESD->GetNumberOfTracks(); i++){ \r
154         AliESDtrack * HLTesdTrk = evHLTESD->GetTrack(i); \r
155         TVector3 v;  \r
156         if(IsInPHOS(2, HLTesdTrk, b, v)){  \r
157           Float_t phi = v.Phi();  \r
158           if(phi<0) phi += 2.*TMath::Pi();  \r
159           fHistOnlTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());  \r
160         }else if(IsInPHOS(3, HLTesdTrk, b, v)){  \r
161           Float_t phi = v.Phi();   \r
162           if(phi<0) phi += 2.*TMath::Pi();   \r
163           fHistOnlTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());   \r
164         }else if( IsInPHOS(4, HLTesdTrk, b, v) ){  \r
165           Float_t phi = v.Phi();    \r
166           if(phi<0) phi += 2.*TMath::Pi();    \r
167           fHistOnlTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());  \r
168         }  \r
169     }\r
170   }\r
171 \r
172   if(evHLTESD->IsHLTTriggerFired()){\r
173        \r
174     for(Int_t i = 0; i < evESD->GetNumberOfTracks(); i++){ \r
175       AliESDtrack * esdTrk = evESD->GetTrack(i); \r
176 \r
177       TVector3 v;\r
178       if(IsInPHOS(2, esdTrk, b, v)){\r
179         Float_t phi = v.Phi();\r
180         if(phi<0) phi += 2.*TMath::Pi();\r
181         fHistOfflTrk2PHOSTrig->Fill(v.Eta(), phi*TMath::RadToDeg());\r
182         fHistOfflTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());\r
183       }else if(IsInPHOS(3, esdTrk, b, v)){\r
184         Float_t phi = v.Phi(); \r
185         if(phi<0) phi += 2.*TMath::Pi(); \r
186         fHistOfflTrk2PHOSTrig->Fill(v.Eta(), phi*TMath::RadToDeg()); \r
187         fHistOfflTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());\r
188       }else if( IsInPHOS(4, esdTrk, b, v) ){\r
189         Float_t phi = v.Phi();  \r
190         if(phi<0) phi += 2.*TMath::Pi();  \r
191         fHistOfflTrk2PHOSTrig->Fill(v.Eta(), phi*TMath::RadToDeg());\r
192         fHistOfflTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());\r
193       }\r
194     }\r
195   } else {\r
196    \r
197     for(Int_t i = 0; i < evESD->GetNumberOfTracks(); i++){ \r
198       AliESDtrack * esdTrk = evESD->GetTrack(i); \r
199 \r
200       TVector3 v; \r
201       if(IsInPHOS(2, esdTrk, b, v)){ \r
202         Float_t phi = v.Phi(); \r
203         if(phi<0) phi += 2.*TMath::Pi(); \r
204         fHistOfflTrk2PHOSNoTrig->Fill(v.Eta(), phi*TMath::RadToDeg()); \r
205         fHistOfflTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());\r
206         //cout<<"Event in PHOS 2: "<<fNevt<<endl;\r
207       }else if(IsInPHOS(3, esdTrk, b, v)){ \r
208         Float_t phi = v.Phi();  \r
209         if(phi<0) phi += 2.*TMath::Pi();  \r
210         fHistOfflTrk2PHOSNoTrig->Fill(v.Eta(), phi*TMath::RadToDeg());  \r
211         fHistOfflTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());\r
212         //cout<<"Event in PHOS 3: "<<fNevt<<endl;\r
213       }else if( IsInPHOS(4, esdTrk, b, v) ){ \r
214         Float_t phi = v.Phi();   \r
215         if(phi<0) phi += 2.*TMath::Pi();   \r
216         fHistOfflTrk2PHOSNoTrig->Fill(v.Eta(), phi*TMath::RadToDeg()); \r
217         fHistOfflTrk2PHOS->Fill(v.Eta(), phi*TMath::RadToDeg());\r
218         //cout<<"Event in PHOS 4: "<<fNevt<<endl;\r
219       } \r
220     }    \r
221   }\r
222 \r
223 \r
224   \r
225   //cout << "here" << endl;\r
226 \r
227   //Int_t nc = evHLTESD->GetPHOSClusters(fClustersArray);\r
228   //Int_t nc = evHLTESD->GetEMCALClusters(fClustersArray);\r
229   \r
230   //for(int i = 0; i < \r
231   // cout << nc << " ";\r
232   \r
233   // for(int i = 0; i < evHLTESD->GetNumberOfCaloClusters(); i++) {\r
234   //   AliESDCaloCluster * c = evHLTESD->GetCaloCluster(i); \r
235   //   cout << c->IsPHOS() << "i ";\r
236   // }\r
237   \r
238 \r
239   \r
240 \r
241 }\r
242 \r
243 Int_t AliAnalysisTaskHLTPHOS::GetClusters(AliESDEvent * event, TRefArray * clusters) {\r
244   return event->GetPHOSClusters(clusters);\r
245 }\r
246 \r
247 Bool_t AliAnalysisTaskHLTPHOS::IsThisDetector(AliESDCaloCluster * cluster) {\r
248   return cluster->IsPHOS();\r
249 }\r
250 \r
251 \r
252 Bool_t AliAnalysisTaskHLTPHOS::IsInPHOS(Int_t iMod, AliESDtrack * trk, Float_t b, TVector3& v){\r
253 \r
254 \r
255   Double_t normVector[3] = {fgkNormX[iMod], fgkNormY[iMod], 0};\r
256 \r
257   Double_t point[3] = {fgkInitPosX[iMod], fgkInitPosY[iMod], 0};\r
258   \r
259   if(!trk->Intersect(point, normVector, b)) return kFALSE;\r
260 \r
261   TVector3 trackPos(point);\r
262   \r
263   v=trackPos;\r
264 \r
265   Double_t phi = 0;\r
266   if(trackPos.Phi() < 0) phi = trackPos.Phi() + 2*TMath::Pi();\r
267   else phi = trackPos.Phi();\r
268 \r
269   if(trackPos.Eta() >= fgkEtaMin && \r
270      trackPos.Eta() <= fgkEtaMax &&\r
271      phi >= fgkPhiMin[iMod] &&\r
272      phi <= fgkPhiMax[iMod])\r
273     {\r
274       return kTRUE;\r
275     }\r
276   \r
277   return kFALSE;\r
278 }\r