]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG1/TPC/AliPerformanceTask.cxx
Safer rounding
[u/mrichter/AliRoot.git] / PWG1 / TPC / AliPerformanceTask.cxx
CommitLineData
7cc34f08 1/**************************************************************************\r
2* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *\r
3* *\r
4* Author: The ALICE Off-line Project. *\r
5* Contributors are mentioned in the code where appropriate. *\r
6* *\r
7* Permission to use, copy, modify and distribute this software and its *\r
8* documentation strictly for non-commercial purposes is hereby granted *\r
9* without fee, provided that the above copyright notice appears in all *\r
10* copies and that both the copyright notice and this permission notice *\r
11* appear in the supporting documentation. The authors make no claims *\r
12* about the suitability of this software for any purpose. It is *\r
13* provided "as is" without express or implied warranty. *\r
14**************************************************************************/\r
15\r
16//------------------------------------------------------------------------------\r
17// Implementation of the AliPerformanceTask class. It checks reconstruction performance \r
18// for the reconstructed vs MC particle tracks under several conditions. For real data \r
19// the control QA histograms are filled.\r
20//\r
21// The comparison output objects deriving from AliPerformanceObject \r
22// (e.g. AliPerformanceRes, AliPerformanceEff, AliPerformanceDEdx, AliPerformanceDCA ...) \r
23// are stored in the output file (details in description of these classes).\r
24// \r
25// Author: J.Otwinowski 01/04/2009 \r
814d192f 26// Changes by M.Knichel 15/10/2010\r
7cc34f08 27//------------------------------------------------------------------------------\r
28\r
29#include "iostream"\r
30\r
31#include "TChain.h"\r
32#include "TTree.h"\r
33#include "TH1F.h"\r
34#include "TCanvas.h"\r
35#include "TList.h"\r
36#include "TFile.h"\r
814d192f 37#include "TSystem.h"\r
7cc34f08 38\r
39#include "AliAnalysisTask.h"\r
40#include "AliAnalysisManager.h"\r
41#include "AliESDEvent.h"\r
42#include "AliESDfriend.h"\r
43#include "AliMCEvent.h"\r
44#include "AliESDInputHandler.h"\r
45#include "AliMCEventHandler.h"\r
46#include "AliESDVertex.h"\r
47#include "AliMagF.h"\r
48#include "AliTracker.h"\r
49#include "AliGeomManager.h"\r
52abd620 50#include "AliCDBManager.h"\r
7cc34f08 51\r
36ace53b 52#include "AliESDVZERO.h"\r
53#include "AliMultiplicity.h"\r
54\r
7cc34f08 55#include "AliMCInfo.h"\r
56#include "AliESDRecInfo.h"\r
57#include "AliMCInfoCuts.h"\r
58#include "AliRecInfoCuts.h"\r
59#include "AliComparisonObject.h"\r
60#include "AliPerformanceObject.h"\r
814d192f 61#include "AliTPCPerformanceSummary.h"\r
62#include "AliPerformanceTPC.h"\r
63#include "AliPerformanceDEdx.h"\r
f69eb048 64#include "AliPerformanceMatch.h"\r
7cc34f08 65#include "AliPerformanceTask.h"\r
66\r
814d192f 67\r
7cc34f08 68using namespace std;\r
69\r
70ClassImp(AliPerformanceTask)\r
71\r
72//_____________________________________________________________________________\r
73AliPerformanceTask::AliPerformanceTask() \r
a26a028b 74 : AliAnalysisTaskSE("Performance")\r
7cc34f08 75 , fESD(0)\r
76 , fESDfriend(0)\r
77 , fMC(0)\r
78 , fOutput(0)\r
814d192f 79 , fOutputSummary(0)\r
7cc34f08 80 , fPitList(0)\r
81 , fCompList(0)\r
82 , fUseMCInfo(kFALSE)\r
83 , fUseESDfriend(kFALSE)\r
636e5a51 84 , fUseHLT(kFALSE)\r
c1b69b58 85 , fUseTerminate(kTRUE)\r
36ace53b 86 , fUseCentrality(0)\r
19563116 87 , fUseOCDB(kTRUE)\r
7cc34f08 88{\r
89 // Dummy Constructor\r
90 // should not be used\r
91}\r
92\r
93//_____________________________________________________________________________\r
a26a028b 94AliPerformanceTask::AliPerformanceTask(const char *name, const char */*title*/) \r
95 : AliAnalysisTaskSE(name)\r
7cc34f08 96 , fESD(0)\r
97 , fESDfriend(0)\r
98 , fMC(0)\r
99 , fOutput(0)\r
814d192f 100 , fOutputSummary(0)\r
7cc34f08 101 , fPitList(0)\r
102 , fCompList(0)\r
103 , fUseMCInfo(kFALSE)\r
104 , fUseESDfriend(kFALSE)\r
636e5a51 105 , fUseHLT(kFALSE)\r
c1b69b58 106 , fUseTerminate(kTRUE)\r
36ace53b 107 , fUseCentrality(0)\r
19563116 108 , fUseOCDB(kTRUE)\r
7cc34f08 109{\r
110 // Constructor\r
111\r
112 // Define input and output slots here\r
65b3a5e1 113 DefineOutput(1, TList::Class());\r
814d192f 114 DefineOutput(2, TTree::Class());\r
7cc34f08 115\r
116 // create the list for comparison objects\r
117 fCompList = new TList;\r
118}\r
119\r
120//_____________________________________________________________________________\r
121AliPerformanceTask::~AliPerformanceTask()\r
122{\r
814d192f 123 if (fOutput) delete fOutput; fOutput = 0; \r
124 if (fOutputSummary) delete fOutputSummary; fOutputSummary = 0;\r
125 if (fCompList) delete fCompList; fCompList = 0; \r
7cc34f08 126}\r
127\r
7cc34f08 128//_____________________________________________________________________________\r
129Bool_t AliPerformanceTask::AddPerformanceObject(AliPerformanceObject *pObj) \r
130{\r
131 // add comparison object to the list\r
132 if(pObj == 0) {\r
133 Printf("ERROR: Could not add comparison object");\r
134 return kFALSE;\r
135 }\r
136\r
137 // add object to the list\r
138 fCompList->AddLast(pObj);\r
139 \r
140return kTRUE;\r
141}\r
142\r
143//_____________________________________________________________________________\r
a26a028b 144void AliPerformanceTask::UserCreateOutputObjects()\r
7cc34f08 145{\r
146 // Create histograms\r
147 // Called once\r
148\r
149 // create output list\r
150 fOutput = new TList;\r
151 fOutput->SetOwner();\r
152 fPitList = fOutput->MakeIterator();\r
814d192f 153 \r
154 // create output list\r
155 //fOutputSummary = new TTree;\r
156 \r
7cc34f08 157 // add comparison objects to the output\r
158 AliPerformanceObject *pObj=0;\r
159 Int_t count=0;\r
160 TIterator *pitCompList = fCompList->MakeIterator();\r
161 pitCompList->Reset();\r
162 while(( pObj = (AliPerformanceObject *)pitCompList->Next()) != NULL) {\r
163 fOutput->Add(pObj);\r
164 count++;\r
165 }\r
783eab45 166 Printf("UserCreateOutputObjects(): Number of output comparison objects: %d \n", count);\r
814d192f 167 \r
168 PostData(1, fOutput); \r
169 //PostData(2, fOutputSummary); \r
7cc34f08 170}\r
171\r
172//_____________________________________________________________________________\r
a26a028b 173void AliPerformanceTask::UserExec(Option_t *) \r
7cc34f08 174{\r
175 // Main loop\r
176 // Called for each event\r
636e5a51 177\r
178 // Decide whether to use HLT or Offline ESD\r
179 if(fUseHLT){\r
180\r
181 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> \r
182 (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());\r
183 \r
184 if (!esdH) {\r
185 printf("ERROR: Could not get ESDInputHandler");\r
186 return;\r
187 } \r
188 fESD = esdH->GetHLTEvent();\r
189 }// end if fUseHLT\r
190 else \r
191 fESD = (AliESDEvent*) (InputEvent());\r
192\r
a26a028b 193 if(fUseESDfriend)\r
194 {\r
195 fESDfriend = static_cast<AliESDfriend*>(fESD->FindListObject("AliESDfriend"));\r
196 if(!fESDfriend) {\r
197 Printf("ERROR: ESD friends not available");\r
198 }\r
199 }\r
200 \r
201 if(fUseMCInfo) {\r
202 fMC = MCEvent();\r
203 } \r
7cc34f08 204\r
a26a028b 205 //\r
7cc34f08 206 AliPerformanceObject *pObj=0;\r
207\r
208 if (!fESD) {\r
209 Printf("ERROR: ESD event not available");\r
210 return;\r
211 }\r
212 \r
213 if (fUseMCInfo && !fMC) {\r
214 Printf("ERROR: MC event not available");\r
215 return;\r
216 }\r
217\r
218 if(fUseESDfriend)\r
219 {\r
220 if(!fESDfriend) {\r
221 Printf("ERROR: ESD friends not available");\r
222 }\r
223 }\r
224\r
36ace53b 225 Int_t centBin = CalculateCentralityBin();\r
226\r
227\r
7cc34f08 228 // Process comparison\r
229 fPitList->Reset();\r
230 while(( pObj = (AliPerformanceObject *)fPitList->Next()) != NULL) {\r
36ace53b 231 if (!fUseCentrality) {\r
232 pObj->Exec(fMC,fESD,fESDfriend,fUseMCInfo,fUseESDfriend);\r
233 continue;\r
234 }\r
235\r
236 if (pObj->GetUseCentralityBin() == centBin) {\r
237 pObj->Exec(fMC,fESD,fESDfriend,fUseMCInfo,fUseESDfriend);\r
238 } \r
7cc34f08 239 }\r
240\r
241 // Post output data.\r
65b3a5e1 242 PostData(1, fOutput);\r
7cc34f08 243}\r
244\r
245//_____________________________________________________________________________\r
246void AliPerformanceTask::Terminate(Option_t *) \r
247{\r
9ca899e5 248 // Called once at the end \r
c1b69b58 249\r
250 if ( !fUseTerminate )\r
251 return;\r
252\r
7cc34f08 253 // check output data\r
814d192f 254 fOutputSummary = dynamic_cast<TTree*> (GetOutputData(2));\r
255 fOutput = dynamic_cast<TList*> (GetOutputData(1));\r
256 if (!fOutput) {\r
d41038d7 257 Printf("ERROR: AliPerformanceTask::Terminate(): fOutput data not available ..." );\r
814d192f 258 return;\r
259 }\r
260 if (fOutputSummary) { delete fOutputSummary; fOutputSummary=0; } \r
261 AliPerformanceObject* pObj=0;\r
262 AliPerformanceTPC* pTPC = 0;\r
263 AliPerformanceDEdx* pDEdx = 0;\r
f69eb048 264 AliPerformanceMatch* pMatch = 0;\r
814d192f 265 TIterator* itOut = fOutput->MakeIterator();\r
266 itOut->Reset();\r
267 while(( pObj = dynamic_cast<AliPerformanceObject*>(itOut->Next())) != NULL) { \r
f69eb048 268 pObj->AnalyseFinal();\r
269 if (! pTPC) { pTPC = dynamic_cast<AliPerformanceTPC*>(pObj); }\r
270 if (! pDEdx) { pDEdx = dynamic_cast<AliPerformanceDEdx*>(pObj); }\r
271 if (! pMatch) { pMatch = dynamic_cast<AliPerformanceMatch*>(pObj); }\r
814d192f 272 }\r
19563116 273 \r
274 if(!fUseOCDB) { \r
275 printf("DO NOT USE OCDB \n");\r
276 return;\r
277 }\r
278 \r
d41038d7 279 if (! AliCDBManager::Instance()->GetDefaultStorage()) { AliCDBManager::Instance()->SetDefaultStorage("raw://"); }\r
814d192f 280 TUUID uuid;\r
281 TString tmpFile = gSystem->TempDirectory() + TString("/TPCQASummary.") + uuid.AsString() + TString(".root");\r
f69eb048 282 AliTPCPerformanceSummary::WriteToFile(pTPC, pDEdx, pMatch, tmpFile.Data());\r
814d192f 283 TChain* chain = new TChain("tpcQA");\r
284 chain->Add(tmpFile.Data());\r
285 TTree *tree = chain->CopyTree("1");\r
286 if (chain) { delete chain; chain=0; }\r
287 fOutputSummary = tree;\r
288 \r
289 // Post output data.\r
290 PostData(2, fOutputSummary);\r
636e5a51 291\r
814d192f 292}\r
293\r
294//_____________________________________________________________________________\r
295void AliPerformanceTask::FinishTaskOutput()\r
296{\r
297 // called once at the end of each job (on the workernode)\r
298 //\r
299 // projects THnSparse to TH1,2,3\r
300 \r
301 fOutput = dynamic_cast<TList*> (GetOutputData(1));\r
302 if (!fOutput) {\r
303 Printf("ERROR: AliPerformanceTask::FinishTaskOutput(): fOutput data not available ..." );\r
304 return;\r
305 }\r
636e5a51 306\r
814d192f 307 AliPerformanceObject* pObj=0;\r
308 TIterator* itOut = fOutput->MakeIterator(); \r
309 itOut->Reset();\r
310 while(( pObj = dynamic_cast<AliPerformanceObject*>(itOut->Next())) != NULL) {\r
311 pObj->SetRunNumber(fCurrentRunNumber);\r
312 pObj->Analyse();\r
313 }\r
314 \r
315 // Post output data.\r
316 PostData(1, fOutput);\r
7cc34f08 317}\r
318\r
319//_____________________________________________________________________________\r
320Bool_t AliPerformanceTask::Notify()\r
321{\r
322 static Int_t count = 0;\r
323 count++;\r
324 Printf("Processing %d. file", count);\r
325\r
326 return kTRUE;\r
327}\r
36ace53b 328\r
329//________________________________________________________________________\r
330Int_t AliPerformanceTask::CalculateCentralityBin()\r
331{\r
332 // Get Centrality bin\r
333\r
334 Int_t centrality = -1;\r
335\r
336 if (fUseCentrality == 0)\r
337 return centrality;\r
338\r
339 AliESDVZERO* esdV0 = fESD->GetVZEROData();\r
340 Float_t multV0 = esdV0->GetMTotV0A() + esdV0->GetMTotV0C();\r
341 \r
342 Float_t nClusters[6];\r
343\r
344 const AliMultiplicity *mult = fESD->GetMultiplicity();\r
345 for(Int_t ilay = 0; ilay < 6; ilay++){\r
346 nClusters[ilay] = mult->GetNumberOfITSClusters(ilay);\r
347 }\r
348 \r
349 if ( fUseCentrality == 1 ) {\r
350 // -- centrality cuts V0\r
57d892c9 351#if 0 \r
352 // 2010-11-10 - now old cuts\r
36ace53b 353 if ( multV0 >= 0. && multV0 <= 106.75 ) centrality = 90;\r
354 else if ( multV0 > 106.75 && multV0 <= 277.55 ) centrality = 80;\r
355 else if ( multV0 > 277.55 && multV0 <= 661.85 ) centrality = 70;\r
356 else if ( multV0 > 661.85 && multV0 <= 1345.05 ) centrality = 60;\r
357 else if ( multV0 > 1345.05 && multV0 <= 2412.55 ) centrality = 50;\r
358 else if ( multV0 > 2412.55 && multV0 <= 3907.05 ) centrality = 40;\r
359 else if ( multV0 > 3907.05 && multV0 <= 6042.05 ) centrality = 30;\r
360 else if ( multV0 > 6042.05 && multV0 <= 8902.95 ) centrality = 20;\r
361 else if ( multV0 > 8902.95 && multV0 <= 12788.6 ) centrality = 10;\r
362 else if ( multV0 > 12788.6 && multV0 <= 15222.5 ) centrality = 5;\r
363 else if ( multV0 > 15222.5 && multV0 <= 19449.8 ) centrality = 0;\r
57d892c9 364#else\r
365 // 2010-11-14\r
366 if ( multV0 >= 0. && multV0 <= 124.5 ) centrality = 90;\r
367 else if ( multV0 > 124.5 && multV0 <= 274.5 ) centrality = 80;\r
368 else if ( multV0 > 274.5 && multV0 <= 574.5 ) centrality = 70;\r
369 else if ( multV0 > 574.5 && multV0 <= 1224.5 ) centrality = 60;\r
370 else if ( multV0 > 1224.5 && multV0 <= 2174.5 ) centrality = 50;\r
371 else if ( multV0 > 2174.5 && multV0 <= 3624.5 ) centrality = 40;\r
372 else if ( multV0 > 3624.5 && multV0 <= 5574.5 ) centrality = 30;\r
373 else if ( multV0 > 5574.5 && multV0 <= 8274.5 ) centrality = 20;\r
374 else if ( multV0 > 8274.5 && multV0 <= 12024.5 ) centrality = 10;\r
375 else if ( multV0 > 12024.5 && multV0 <= 14674.5 ) centrality = 5;\r
376 else if ( multV0 > 14674.5 && multV0 <= 19449.5 ) centrality = 0;\r
377#endif\r
36ace53b 378 }\r
379 else if ( fUseCentrality == 2 ) {\r
57d892c9 380#if 0 \r
381 // 2010-11-10 - now old cuts\r
36ace53b 382 if ( nClusters[1] >= 0. && nClusters[1] <= 7.18 ) centrality = 100;\r
383 else if ( nClusters[1] > 7.18 && nClusters[1] <= 35.9 ) centrality = 90;\r
384 else if ( nClusters[1] > 35.9 && nClusters[1] <= 93.34 ) centrality = 80;\r
385 else if ( nClusters[1] > 93.34 && nClusters[1] <= 222.58 ) centrality = 70;\r
386 else if ( nClusters[1] > 222.58 && nClusters[1] <= 437.98 ) centrality = 60;\r
387 else if ( nClusters[1] > 437.98 && nClusters[1] <= 768.26 ) centrality = 50;\r
388 else if ( nClusters[1] > 768.26 && nClusters[1] <= 1242.14 ) centrality = 40;\r
389 else if ( nClusters[1] > 1242.14 && nClusters[1] <= 1888.34 ) centrality = 30;\r
390 else if ( nClusters[1] > 1888.34 && nClusters[1] <= 2735.58 ) centrality = 20;\r
391 else if ( nClusters[1] > 2735.58 && nClusters[1] <= 3884.38 ) centrality = 10;\r
392 else if ( nClusters[1] > 3884.38 && nClusters[1] <= 4573.66 ) centrality = 5;\r
393 else if ( nClusters[1] > 4573.66 && nClusters[1] <= 6540.98 ) centrality = 0;\r
57d892c9 394#else\r
395 // 2010-11-14\r
396 if ( nClusters[1] > 0. && nClusters[1] <= 29.5 ) centrality = 90;\r
397 else if ( nClusters[1] > 29.5 && nClusters[1] <= 69.5 ) centrality = 80;\r
398 else if ( nClusters[1] > 69.5 && nClusters[1] <= 149.5 ) centrality = 70;\r
399 else if ( nClusters[1] > 149.5 && nClusters[1] <= 309.5 ) centrality = 60;\r
400 else if ( nClusters[1] > 309.5 && nClusters[1] <= 589.5 ) centrality = 50;\r
401 else if ( nClusters[1] > 589.5 && nClusters[1] <= 989.5 ) centrality = 40;\r
402 else if ( nClusters[1] > 989.5 && nClusters[1] <= 1569.5 ) centrality = 30;\r
403 else if ( nClusters[1] > 1569.5 && nClusters[1] <= 2369.5 ) centrality = 20;\r
404 else if ( nClusters[1] > 2369.5 && nClusters[1] <= 3509.5 ) centrality = 10;\r
405 else if ( nClusters[1] > 3509.5 && nClusters[1] <= 4349.5 ) centrality = 5;\r
406 else if ( nClusters[1] > 4349.5 && nClusters[1] <= 6540.5 ) centrality = 0;\r
407#endif\r
36ace53b 408 }\r
409 \r
410 return centrality;\r
411}\r
412\r