]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/QA/tasks/AliAnalysisTaskHLTCalo.cxx
- updates for synchronizing with the framework
[u/mrichter/AliRoot.git] / HLT / QA / tasks / AliAnalysisTaskHLTCalo.cxx
CommitLineData
fc0eba5b 1// $Id: AliAnalysisTaskHLTCalo.cxx 40285 2010-04-09 14:04:51Z kkanaki $\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//* for The ALICE HLT Project. *\r
10//* *\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
19\r
20/** @file AliAnalysisTaskHLTCalo.cxx\r
21 @author Zhongbao Yin, Kalliopi Kanaki, Svein Lindal\r
22 @date\r
23 @brief\r
24*/\r
25\r
26#include <iostream>\r
27\r
28#include "TChain.h"\r
29#include "TTree.h"\r
30#include "TH1F.h"\r
31#include "TH2F.h"\r
32#include "TCanvas.h"\r
33#include "TVector3.h"\r
34#include "TString.h"\r
35#include "TObjArray.h"\r
36#include "TFile.h"\r
37#include "TList.h"\r
38#include "TRefArray.h"\r
39\r
40#include "AliESDEvent.h"\r
41#include "AliESDRun.h"\r
42#include "AliESDInputHandler.h"\r
43#include "AliESDCaloCluster.h"\r
c32fb395 44#include "AliESDtrack.h"\r
fc0eba5b 45#include "AliAnalysisTask.h"\r
46#include "AliAnalysisManager.h"\r
47#include "AliAnalysisTaskHLTCalo.h"\r
48\r
49#include "AliHLTCaloHistoInvMass.h"\r
50#include "AliHLTCaloHistoClusterEnergy.h"\r
51#include "AliHLTCaloHistoMatchedTracks.h"\r
52#include "AliHLTCaloHistoProducer.h"\r
53\r
7e9b72dc 54#include "AliHLTGlobalTriggerDecision.h"\r
55\r
fc0eba5b 56ClassImp(AliAnalysisTaskHLTCalo)\r
57\r
58//===========================================================================================\r
59\r
c32fb395 60AliAnalysisTaskHLTCalo::AliAnalysisTaskHLTCalo() : AliAnalysisTaskSE()\r
7e9b72dc 61 ,fUseHLTTrigger(kFALSE)\r
c32fb395 62 ,fESDRun(0)\r
63 ,fOutputList(0)\r
64 ,fHistOfflResiduals(NULL)\r
65 ,fHistOnlResiduals(NULL)\r
66 ,fHistOfflDz(NULL)\r
67 ,fHistOnlDz(NULL)\r
68 ,fHistOfflDxy(NULL)\r
69 ,fHistOnlDxy(NULL)\r
70 ,fNevt(0)\r
71 ,fTrgClsArray(0)\r
72 ,fGlobalHistoProdArrOff(NULL)\r
73 ,fGlobalHistoProdArrOn(NULL)\r
74 ,fClustersArray(NULL)\r
97c5203c 75 ,fCaloName("")\r
c32fb395 76{\r
77 // Constructor\r
78\r
79 // Define input and output slots here\r
80 // Input slot #0 works with a TChain\r
81 // DefineInput(0, TChain::Class());\r
82 // Output slot #0 writes into a TH1 container\r
83\r
84 //DefineOutput(1, TList::Class());\r
85}\r
86\r
fc0eba5b 87AliAnalysisTaskHLTCalo::AliAnalysisTaskHLTCalo(const char *name)\r
88: \r
89AliAnalysisTaskSE(name)\r
7e9b72dc 90 ,fUseHLTTrigger(kFALSE)\r
fc0eba5b 91 ,fESDRun(0)\r
92 ,fOutputList(0)\r
93 ,fHistOfflResiduals(NULL)\r
94 ,fHistOnlResiduals(NULL)\r
95 ,fHistOfflDz(NULL)\r
96 ,fHistOnlDz(NULL)\r
97 ,fHistOfflDxy(NULL)\r
98 ,fHistOnlDxy(NULL)\r
c32fb395 99 ,fHistOfflResidualsPos(NULL)\r
100 ,fHistOnlResidualsPos(NULL)\r
101 ,fHistOfflDzPos(NULL)\r
102 ,fHistOnlDzPos(NULL)\r
103 ,fHistOfflDxyPos(NULL)\r
104 ,fHistOnlDxyPos(NULL)\r
105 ,fHistOfflResidualsNeg(NULL)\r
106 ,fHistOnlResidualsNeg(NULL)\r
107 ,fHistOfflDzNeg(NULL)\r
108 ,fHistOnlDzNeg(NULL)\r
109 ,fHistOfflDxyNeg(NULL)\r
110 ,fHistOnlDxyNeg(NULL)\r
111 ,fHistNclvsNcl(NULL)\r
112 ,fHistTotEVsTotE(NULL)\r
fc0eba5b 113 ,fNevt(0)\r
114 ,fTrgClsArray(0)\r
115 ,fGlobalHistoProdArrOff(NULL)\r
116 ,fGlobalHistoProdArrOn(NULL)\r
117 ,fClustersArray(NULL)\r
97c5203c 118 ,fCaloName(name)\r
fc0eba5b 119{\r
120 // Constructor\r
121\r
122 // Define input and output slots here\r
123 // Input slot #0 works with a TChain\r
124 // DefineInput(0, TChain::Class());\r
125 // Output slot #0 writes into a TH1 container\r
126\r
127 DefineOutput(1, TList::Class());\r
128}\r
129\r
130\r
131//----------------------------------------------------------------------------------------------------\r
132\r
133void AliAnalysisTaskHLTCalo::UserCreateOutputObjects(){\r
134// Create histograms\r
135\r
136 OpenFile(1);\r
137\r
138 fOutputList = new TList();\r
cecabf41 139 fOutputList->SetOwner();\r
fc0eba5b 140 fOutputList->SetName(GetName());\r
141\r
142 CreateSpecificStuff(fOutputList);\r
143 \r
144// --------------- define histograms ---------------------//\r
145\r
146 fHistOfflResiduals = new TH1F("fHistOfflResiduals", "Residuals between cluster and nearest track in cm (offline)", 50, 0, 50);\r
147 fHistOnlResiduals = new TH1F("fHistOnlResiduals", "Residuals between cluster and nearest track in cm (online)", 50, 0, 50);\r
c32fb395 148 fHistOfflDxy = new TH1F("fHistOfflDxy", "Dxy between cluster and nearest track in cm (offline)", 80, -40, 40);\r
149 fHistOnlDxy = new TH1F("fHistOnlDxy", "Dxy between cluster and nearest track in cm (online)", 80, -40, 40);\r
150 fHistOfflDz = new TH1F("fHistOfflDz", "Dz between cluster and nearest track in cm (offline)", 80, -40, 40);\r
151 fHistOnlDz = new TH1F("fHistOnlDz", "Dz between cluster and nearest track in cm (online)", 80, -40, 40);\r
152\r
153 fHistOfflResidualsPos = new TH1F("fHistOfflResidualsPos", "Residuals between cluster and nearest track in cm (offline)Pos", 50, 0, 50);\r
154 fHistOnlResidualsPos = new TH1F("fHistOnlResidualsPos", "Residuals between cluster and nearest track in cm (online)Pos", 50, 0, 50);\r
155 fHistOfflDxyPos = new TH1F("fHistOfflDxyPos", "Dxy between cluster and nearest track in cm (offline)Pos", 80, -40, 40);\r
156 fHistOnlDxyPos = new TH1F("fHistOnlDxyPos", "Dxy between cluster and nearest track in cm (online)Pos", 80, -40, 40);\r
157 fHistOfflDzPos = new TH1F("fHistOfflDzPos", "Dz between cluster and nearest track in cm (offline)Pos", 80, -40, 40);\r
158 fHistOnlDzPos = new TH1F("fHistOnlDzPos", "Dz between cluster and nearest track in cm (online)Pos", 80, -40, 40);\r
159\r
160 fHistOfflResidualsNeg = new TH1F("fHistOfflResidualsNeg", "Residuals between cluster and nearest track in cm (offline)Neg", 50, 0, 50);\r
161 fHistOnlResidualsNeg = new TH1F("fHistOnlResidualsNeg", "Residuals between cluster and nearest track in cm (online)Neg", 50, 0, 50);\r
162 fHistOfflDxyNeg = new TH1F("fHistOfflDxyNeg", "Dxy between cluster and nearest track in cm (offline)Neg", 80, -40, 40);\r
163 fHistOnlDxyNeg = new TH1F("fHistOnlDxyNeg", "Dxy between cluster and nearest track in cm (online)Neg", 80, -40, 40);\r
164 fHistOfflDzNeg = new TH1F("fHistOfflDzNeg", "Dz between cluster and nearest track in cm (offline)Neg", 80, -40, 40);\r
165 fHistOnlDzNeg = new TH1F("fHistOnlDzNeg", "Dz between cluster and nearest track in cm (online)Neg", 80, -40, 40);\r
166\r
167 fHistNclvsNcl = new TH2F("fHistNclvsNcl", "Number of offline cl vs online cl", 100, 0, 10, 100, 0, 10);\r
168 fHistTotEVsTotE = new TH2F("fHistTotEVsTotE", "Total energy in online cl vs total energy in offline cl", 300, 0, 150, 300, 0, 150);\r
169 fHistTotEVsTotE->SetXTitle("Offline energy sum");\r
170 fHistTotEVsTotE->SetYTitle("Online energy sum");\r
fc0eba5b 171 // HLT histogram producers\r
172 fGlobalHistoProdArrOff = new TObjArray();\r
173 fGlobalHistoProdArrOn = new TObjArray();\r
174\r
fc0eba5b 175 \r
97c5203c 176 fGlobalHistoProdArrOff->AddLast(dynamic_cast<TObject*>(new AliHLTCaloHistoClusterEnergy(Form("%s_OFF", fCaloName.Data()))));\r
177 fGlobalHistoProdArrOff->AddLast(dynamic_cast<TObject*>(new AliHLTCaloHistoInvMass(Form("%s_OFF", fCaloName.Data() ))));\r
178 fGlobalHistoProdArrOff->AddLast(dynamic_cast<TObject*>(new AliHLTCaloHistoMatchedTracks(Form("%s_OFF", fCaloName.Data() ))));\r
fc0eba5b 179\r
97c5203c 180 fGlobalHistoProdArrOn->AddLast(dynamic_cast<TObject*>(new AliHLTCaloHistoClusterEnergy(Form("%s_ON", fCaloName.Data() ))));\r
181 fGlobalHistoProdArrOn->AddLast(dynamic_cast<TObject*>(new AliHLTCaloHistoInvMass(Form("%s_ON", fCaloName.Data() ))));\r
182 fGlobalHistoProdArrOn->AddLast(dynamic_cast<TObject*>(new AliHLTCaloHistoMatchedTracks(Form("%s_ON", fCaloName.Data() ))));\r
fc0eba5b 183\r
184 fClustersArray = new TRefArray();\r
185\r
186 // -------------- add histograms to the output TList -----------------//\r
187 \r
188 fOutputList->Add(fHistOfflResiduals);\r
189 fOutputList->Add(fHistOnlResiduals);\r
fc0eba5b 190 fOutputList->Add(fHistOfflDz);\r
191 fOutputList->Add(fHistOnlDz);\r
fc0eba5b 192 fOutputList->Add(fHistOfflDxy);\r
193 fOutputList->Add(fHistOnlDxy);\r
194\r
c32fb395 195\r
196 fOutputList->Add(fHistOfflResidualsPos);\r
197 fOutputList->Add(fHistOnlResidualsPos);\r
198 fOutputList->Add(fHistOfflDzPos);\r
199 fOutputList->Add(fHistOnlDzPos);\r
200 fOutputList->Add(fHistOfflDxyPos);\r
201 fOutputList->Add(fHistOnlDxyPos);\r
202\r
203\r
204 fOutputList->Add(fHistOfflResidualsNeg);\r
205 fOutputList->Add(fHistOnlResidualsNeg);\r
206 fOutputList->Add(fHistOfflDzNeg);\r
207 fOutputList->Add(fHistOnlDzNeg);\r
208 fOutputList->Add(fHistOfflDxyNeg);\r
209 fOutputList->Add(fHistOnlDxyNeg);\r
210\r
211\r
212 fOutputList->Add(fHistTotEVsTotE);\r
213 fOutputList->Add(fHistNclvsNcl);\r
214\r
fc0eba5b 215 for(int ip = 0; ip < fGlobalHistoProdArrOff->GetEntriesFast(); ip++) {\r
216 AliHLTCaloHistoProducer *prod = dynamic_cast<AliHLTCaloHistoProducer*>(fGlobalHistoProdArrOff->At(ip));\r
217 fOutputList->AddAll(prod->GetHistograms());\r
218 }\r
219\r
220 for(int ip = 0; ip < fGlobalHistoProdArrOn->GetEntriesFast(); ip++) {\r
221 AliHLTCaloHistoProducer *prod = dynamic_cast<AliHLTCaloHistoProducer*>(fGlobalHistoProdArrOn->At(ip));\r
222 fOutputList->AddAll(prod->GetHistograms());\r
223 }\r
224 \r
cecabf41 225 PostData(1, fOutputList);\r
fc0eba5b 226}\r
227\r
228void AliAnalysisTaskHLTCalo::NotifyRun(){\r
229// This will not work if the active trigger classes change from run to run.\r
230// Then one has to know all trigger classes before processing the data.\r
231\r
232 AliESDEvent* evESD = dynamic_cast<AliESDEvent*>(InputEvent());\r
233 TString trgClasses = evESD->GetESDRun()->GetActiveTriggerClasses(); \r
234 \r
235 fTrgClsArray = trgClasses.Tokenize(" ");\r
236 //cout<<fTrgClsArray->GetEntries()<<endl; \r
237 \r
238// for(Int_t i = 0; i < fTrgClsArray->GetEntries(); i++){ \r
239// TString str = ((TObjString *)fTrgClsArray->At(i))->GetString(); \r
240// (fHistTrigger->GetXaxis())->SetBinLabel(i+1, str.Data()); \r
241// (fHistHLTTrigger->GetXaxis())->SetBinLabel(i+1, str.Data()); \r
242// } \r
243 \r
244 evESD = NULL;\r
245}\r
246\r
247void AliAnalysisTaskHLTCalo::UserExec(Option_t *){\r
248\r
c32fb395 249\r
fc0eba5b 250 AliESDEvent* evESD = dynamic_cast<AliESDEvent*>(InputEvent());\r
251 \r
252 if (!evESD) {\r
253 Printf("ERROR: fESD not available");\r
254 return;\r
255 }\r
256 \r
257 AliESDEvent* evHLTESD = 0;\r
258 AliESDInputHandler* esdH = dynamic_cast<AliESDInputHandler*>(fInputHandler);\r
259 \r
260 if(esdH) evHLTESD = esdH->GetHLTEvent();\r
261 \r
262 if(!evHLTESD){\r
263 Printf("ERROR: HLTesd not available");\r
264 return;\r
265 }\r
266\r
7e9b72dc 267 // To check if anything was triggered in HLT.\r
268 if(fUseHLTTrigger){ \r
269 if (!((AliHLTGlobalTriggerDecision*)evHLTESD->GetHLTTriggerDecision())->Result()){\r
270 return;\r
271 // Process all and any events that were triggered by HLT.\r
272 } \r
273 }\r
c32fb395 274\r
fc0eba5b 275 DoSpecificStuff(evESD, evHLTESD);\r
c32fb395 276 \r
277 Double_t offE = 0.0;\r
278 Double_t onE = 0.0;\r
279\r
280\r
fc0eba5b 281 for(int icl = 0; icl < evESD->GetNumberOfCaloClusters(); icl++) {\r
282 AliESDCaloCluster * cluster = evESD->GetCaloCluster(icl);\r
c32fb395 283 if(IsThisDetector(cluster)) {\r
284 \r
285 offE += cluster->E();\r
286 fHistOfflResiduals->Fill(cluster->GetEmcCpvDistance());\r
287 fHistOfflDz->Fill(cluster->GetTrackDz());\r
288 fHistOfflDxy->Fill(cluster->GetTrackDx());\r
289 \r
290 \r
291 TArrayI* matchedTracks = cluster->GetTracksMatched();\r
292 \r
293 if (matchedTracks) {\r
294 if (matchedTracks->At(0) > -1) {\r
295 \r
296 Int_t trackID = matchedTracks->At(0);\r
297 \r
298 AliESDtrack * track = evESD->GetTrack(trackID);\r
299\r
300 if(track) {\r
301 if (track->Charge() > 0) {\r
302 \r
303 fHistOfflResidualsPos->Fill(cluster->GetEmcCpvDistance());;\r
304 fHistOfflDzPos->Fill(cluster->GetTrackDz());\r
305 fHistOfflDxyPos->Fill(cluster->GetTrackDx());\r
306 \r
307 } else if (track->Charge() < 0) {\r
308 \r
309 fHistOfflResidualsNeg->Fill(cluster->GetEmcCpvDistance());;\r
310 fHistOfflDzNeg->Fill(cluster->GetTrackDz());\r
311 fHistOfflDxyNeg->Fill(cluster->GetTrackDx());\r
312 \r
313 } else {\r
314 cout <<"BALLE wtf!!"<<endl;\r
315 }\r
316 \r
317 } else {\r
318 cout << "BALLE no track!"<<endl;\r
319 }\r
320 }\r
321 } else {\r
322 cout << "BALLE no array"<<endl;\r
323 }\r
fc0eba5b 324 }\r
325 }\r
326\r
c32fb395 327 \r
328\r
fc0eba5b 329 for(int icl = 0; icl < evHLTESD->GetNumberOfCaloClusters(); icl++) {\r
330 AliESDCaloCluster * cluster = evHLTESD->GetCaloCluster(icl);\r
c32fb395 331 if(IsThisDetector(cluster)) {\r
332 onE += cluster->E();\r
fc0eba5b 333 fHistOnlResiduals->Fill(evHLTESD->GetCaloCluster(icl)->GetEmcCpvDistance());\r
334 fHistOnlDxy->Fill(evHLTESD->GetCaloCluster(icl)->GetTrackDx());\r
335 fHistOnlDz->Fill(evHLTESD->GetCaloCluster(icl)->GetTrackDz());\r
c32fb395 336\r
337 TArrayI* matchedTracks = cluster->GetTracksMatched();\r
338 \r
339 if (matchedTracks) {\r
340 if (matchedTracks->At(0) > -1) {\r
341 \r
342 Int_t trackID = matchedTracks->At(0);\r
343 \r
344 AliESDtrack * track = evHLTESD->GetTrack(trackID);\r
345\r
346 if(track) {\r
347 if (track->Charge() > 0) {\r
348 \r
349 fHistOnlResidualsPos->Fill(cluster->GetEmcCpvDistance());;\r
350 fHistOnlDzPos->Fill(cluster->GetTrackDz());\r
351 fHistOnlDxyPos->Fill(cluster->GetTrackDx());\r
352 \r
353 } else if (track->Charge() < 0) {\r
354 \r
355 fHistOnlResidualsNeg->Fill(cluster->GetEmcCpvDistance());;\r
356 fHistOnlDzNeg->Fill(cluster->GetTrackDz());\r
357 fHistOnlDxyNeg->Fill(cluster->GetTrackDx());\r
358 \r
359 } else {\r
360 cout <<"BALLE wtf!!"<<endl;\r
361 }\r
362 \r
363 } else {\r
364 cout << "BALLE no track!"<<endl;\r
365 }\r
366 }\r
367 } else {\r
368 //cout << "BALLE no array"<<endl;\r
369 }\r
370\r
371\r
372\r
373\r
374\r
fc0eba5b 375 }\r
376 }\r
377\r
378 Int_t nc = GetClusters(evESD, fClustersArray);\r
379 for(int ip = 0; ip < fGlobalHistoProdArrOff->GetEntriesFast(); ip++) {\r
380 AliHLTCaloHistoProducer *prod = dynamic_cast<AliHLTCaloHistoProducer*>(fGlobalHistoProdArrOff->At(ip));\r
381 prod->FillHistograms(nc, fClustersArray);\r
382 }\r
383 \r
c32fb395 384 Int_t nOnc = GetClusters(evHLTESD, fClustersArray);\r
fc0eba5b 385 for(int ip = 0; ip < fGlobalHistoProdArrOn->GetEntriesFast(); ip++) {\r
386 AliHLTCaloHistoProducer *prod = dynamic_cast<AliHLTCaloHistoProducer*>(fGlobalHistoProdArrOn->At(ip));\r
c32fb395 387 prod->FillHistograms(nOnc, fClustersArray);\r
fc0eba5b 388 }\r
389 \r
c32fb395 390 fHistNclvsNcl->Fill(nc, nOnc);\r
391 fHistTotEVsTotE->Fill(offE, onE);\r
392\r
fc0eba5b 393\r
394 fNevt++;\r
395\r
396 // Post output data.\r
397 PostData(1, fOutputList);\r
398\r
399}\r
400\r
401void AliAnalysisTaskHLTCalo::Terminate(Option_t *){\r
402\r
403 \r
c32fb395 404 \r
fc0eba5b 405 // Printf("Number of tracks thru CE: %d", fNtracksThruZ0);\r
406 // Printf("Number of tracks thru CE from triggered events: %d", \r
407 // fNtracksThruZ0Trig);\r
408 \r
409\r
410 // Draw result to the screen\r
411 // Called once at the end of the query\r
412\r
413 // TCanvas *c1 = new TCanvas("AliAnalysisTaskHLTCalo","Trigger",10,10,510,510);\r
414 //fHistTrigger->DrawCopy("E");\r
415 \r
416}\r