]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGPP/TPC/AliPerformanceTask.cxx
#102886: Various fixes to the the code in EVE, STEER, PWGPP, cmake
[u/mrichter/AliRoot.git] / PWGPP / 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
5da23c19 52#include "AliCentrality.h"\r
36ace53b 53#include "AliESDVZERO.h"\r
54#include "AliMultiplicity.h"\r
55\r
7cc34f08 56#include "AliMCInfo.h"\r
57#include "AliESDRecInfo.h"\r
58#include "AliMCInfoCuts.h"\r
59#include "AliRecInfoCuts.h"\r
7cc34f08 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
1e9c263c 88 , fUseCentralityBin(0)\r
7cc34f08 89{\r
90 // Dummy Constructor\r
91 // should not be used\r
92}\r
93\r
94//_____________________________________________________________________________\r
a26a028b 95AliPerformanceTask::AliPerformanceTask(const char *name, const char */*title*/) \r
96 : AliAnalysisTaskSE(name)\r
7cc34f08 97 , fESD(0)\r
98 , fESDfriend(0)\r
99 , fMC(0)\r
100 , fOutput(0)\r
814d192f 101 , fOutputSummary(0)\r
7cc34f08 102 , fPitList(0)\r
103 , fCompList(0)\r
104 , fUseMCInfo(kFALSE)\r
105 , fUseESDfriend(kFALSE)\r
636e5a51 106 , fUseHLT(kFALSE)\r
c1b69b58 107 , fUseTerminate(kTRUE)\r
36ace53b 108 , fUseCentrality(0)\r
19563116 109 , fUseOCDB(kTRUE)\r
1e9c263c 110 , fUseCentralityBin(0)\r
7cc34f08 111{\r
112 // Constructor\r
113\r
114 // Define input and output slots here\r
10d5d625 115 DefineOutput(0, TTree::Class());\r
65b3a5e1 116 DefineOutput(1, TList::Class());\r
7cc34f08 117\r
118 // create the list for comparison objects\r
119 fCompList = new TList;\r
120}\r
121\r
122//_____________________________________________________________________________\r
123AliPerformanceTask::~AliPerformanceTask()\r
124{\r
9c12af5f 125 if (!AliAnalysisManager::GetAnalysisManager()->IsProofMode()) {\r
126 if (fOutput) delete fOutput; fOutput = 0; \r
127 if (fOutputSummary) delete fOutputSummary; fOutputSummary = 0;\r
128 if (fCompList) delete fCompList; fCompList = 0; \r
129 }\r
7cc34f08 130}\r
131\r
7cc34f08 132//_____________________________________________________________________________\r
133Bool_t AliPerformanceTask::AddPerformanceObject(AliPerformanceObject *pObj) \r
134{\r
135 // add comparison object to the list\r
136 if(pObj == 0) {\r
137 Printf("ERROR: Could not add comparison object");\r
138 return kFALSE;\r
139 }\r
140\r
141 // add object to the list\r
142 fCompList->AddLast(pObj);\r
143 \r
144return kTRUE;\r
145}\r
146\r
147//_____________________________________________________________________________\r
a26a028b 148void AliPerformanceTask::UserCreateOutputObjects()\r
7cc34f08 149{\r
150 // Create histograms\r
151 // Called once\r
152\r
153 // create output list\r
154 fOutput = new TList;\r
155 fOutput->SetOwner();\r
156 fPitList = fOutput->MakeIterator();\r
814d192f 157 \r
158 // create output list\r
159 //fOutputSummary = new TTree;\r
160 \r
7cc34f08 161 // add comparison objects to the output\r
162 AliPerformanceObject *pObj=0;\r
163 Int_t count=0;\r
164 TIterator *pitCompList = fCompList->MakeIterator();\r
165 pitCompList->Reset();\r
166 while(( pObj = (AliPerformanceObject *)pitCompList->Next()) != NULL) {\r
167 fOutput->Add(pObj);\r
168 count++;\r
169 }\r
783eab45 170 Printf("UserCreateOutputObjects(): Number of output comparison objects: %d \n", count);\r
814d192f 171 \r
172 PostData(1, fOutput); \r
10d5d625 173 PostData(0, fOutputSummary); \r
7cc34f08 174}\r
175\r
176//_____________________________________________________________________________\r
a26a028b 177void AliPerformanceTask::UserExec(Option_t *) \r
7cc34f08 178{\r
179 // Main loop\r
180 // Called for each event\r
636e5a51 181\r
af960f39 182\r
636e5a51 183 // Decide whether to use HLT or Offline ESD\r
184 if(fUseHLT){\r
185\r
186 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> \r
187 (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());\r
188 \r
189 if (!esdH) {\r
190 printf("ERROR: Could not get ESDInputHandler");\r
191 return;\r
192 } \r
193 fESD = esdH->GetHLTEvent();\r
194 }// end if fUseHLT\r
195 else \r
196 fESD = (AliESDEvent*) (InputEvent());\r
197\r
a26a028b 198 if(fUseESDfriend)\r
199 {\r
e95d4942 200 if (fUseHLT)\r
201 {\r
202 AliESDEvent *fESDoffline;\r
203 fESDoffline = (AliESDEvent*) (InputEvent());\r
204 fESDfriend = static_cast<AliESDfriend*>(fESDoffline->FindListObject("AliESDfriend"));\r
205 }\r
206 else\r
207 {\r
208 fESDfriend = static_cast<AliESDfriend*>(fESD->FindListObject("AliESDfriend"));\r
209 }\r
a26a028b 210 if(!fESDfriend) {\r
211 Printf("ERROR: ESD friends not available");\r
212 }\r
213 }\r
214 \r
215 if(fUseMCInfo) {\r
216 fMC = MCEvent();\r
217 } \r
7cc34f08 218\r
7cc34f08 219\r
220 if (!fESD) {\r
221 Printf("ERROR: ESD event not available");\r
222 return;\r
223 }\r
224 \r
225 if (fUseMCInfo && !fMC) {\r
226 Printf("ERROR: MC event not available");\r
227 return;\r
228 }\r
229\r
230 if(fUseESDfriend)\r
231 {\r
232 if(!fESDfriend) {\r
233 Printf("ERROR: ESD friends not available");\r
234 }\r
235 }\r
236\r
1e9c263c 237 // Process analysis\r
238 Bool_t process = kTRUE;\r
36ace53b 239\r
af960f39 240 // Check for centrality\r
1e9c263c 241 if (fUseCentrality) {\r
242 if ( CalculateCentralityBin() != fUseCentralityBin ) {\r
243 process = kFALSE;\r
244 }\r
245 }\r
36ace53b 246\r
7cc34f08 247 // Process comparison\r
1e9c263c 248 if (process) {\r
249 AliPerformanceObject *pObj=0;\r
250 fPitList->Reset();\r
251 while(( pObj = (AliPerformanceObject *)fPitList->Next()) != NULL) {\r
53410273 252 AliInfo(pObj->GetName());\r
1e9c263c 253 pObj->Exec(fMC,fESD,fESDfriend,fUseMCInfo,fUseESDfriend);\r
36ace53b 254 }\r
7cc34f08 255 }\r
256\r
257 // Post output data.\r
65b3a5e1 258 PostData(1, fOutput);\r
7cc34f08 259}\r
260\r
261//_____________________________________________________________________________\r
262void AliPerformanceTask::Terminate(Option_t *) \r
263{\r
9ca899e5 264 // Called once at the end \r
c1b69b58 265\r
266 if ( !fUseTerminate )\r
267 return;\r
1833a193 268 \r
7cc34f08 269 // check output data\r
10d5d625 270 fOutputSummary = dynamic_cast<TTree*> (GetOutputData(0));\r
814d192f 271 fOutput = dynamic_cast<TList*> (GetOutputData(1));\r
272 if (!fOutput) {\r
d41038d7 273 Printf("ERROR: AliPerformanceTask::Terminate(): fOutput data not available ..." );\r
814d192f 274 return;\r
275 }\r
276 if (fOutputSummary) { delete fOutputSummary; fOutputSummary=0; } \r
277 AliPerformanceObject* pObj=0;\r
278 AliPerformanceTPC* pTPC = 0;\r
279 AliPerformanceDEdx* pDEdx = 0;\r
f69eb048 280 AliPerformanceMatch* pMatch = 0;\r
1833a193 281 AliPerformanceMatch* pPull = 0;\r
9f5fbaba 282 AliPerformanceMatch* pConstrain = 0;\r
814d192f 283 TIterator* itOut = fOutput->MakeIterator();\r
284 itOut->Reset();\r
285 while(( pObj = dynamic_cast<AliPerformanceObject*>(itOut->Next())) != NULL) { \r
1833a193 286 pObj->AnalyseFinal();\r
287 /* if (! pTPC) { pTPC = dynamic_cast<AliPerformanceTPC*>(pObj); }\r
f69eb048 288 if (! pDEdx) { pDEdx = dynamic_cast<AliPerformanceDEdx*>(pObj); }\r
289 if (! pMatch) { pMatch = dynamic_cast<AliPerformanceMatch*>(pObj); }\r
1833a193 290 if ((! pPull) && pMatch ) { pPull = dynamic_cast<AliPerformanceMatch*>(pObj);*/\r
291\r
292 if (!strcmp(pObj->GetName(),"AliPerformanceTPC")) { pTPC = dynamic_cast<AliPerformanceTPC*>(pObj); }\r
293 if (!strcmp(pObj->GetName(),"AliPerformanceDEdxTPCInner")) { pDEdx = dynamic_cast<AliPerformanceDEdx*>(pObj); }\r
294 if (!strcmp(pObj->GetName(),"AliPerformanceMatchTPCITS")) { pMatch = dynamic_cast<AliPerformanceMatch*>(pObj); }\r
9f5fbaba 295 if (!strcmp(pObj->GetName(),"AliPerformanceMatchITSTPC")) { pPull = dynamic_cast<AliPerformanceMatch*>(pObj);}\r
296 if (!strcmp(pObj->GetName(),"AliPerformanceMatchTPCConstrain")) { pConstrain = dynamic_cast<AliPerformanceMatch*>(pObj);}\r
814d192f 297 }\r
9f5fbaba 298 \r
19563116 299 \r
300 if(!fUseOCDB) { \r
301 printf("DO NOT USE OCDB \n");\r
302 return;\r
303 }\r
304 \r
d41038d7 305 if (! AliCDBManager::Instance()->GetDefaultStorage()) { AliCDBManager::Instance()->SetDefaultStorage("raw://"); }\r
814d192f 306 TUUID uuid;\r
307 TString tmpFile = gSystem->TempDirectory() + TString("/TPCQASummary.") + uuid.AsString() + TString(".root");\r
9f5fbaba 308 AliTPCPerformanceSummary::WriteToFile(pTPC, pDEdx, pMatch, pPull, pConstrain, tmpFile.Data());\r
814d192f 309 TChain* chain = new TChain("tpcQA");\r
18e588e9 310 if(!chain) return;\r
814d192f 311 chain->Add(tmpFile.Data());\r
312 TTree *tree = chain->CopyTree("1");\r
313 if (chain) { delete chain; chain=0; }\r
314 fOutputSummary = tree;\r
315 \r
316 // Post output data.\r
10d5d625 317 PostData(0, fOutputSummary);\r
636e5a51 318\r
814d192f 319}\r
320\r
321//_____________________________________________________________________________\r
322void AliPerformanceTask::FinishTaskOutput()\r
323{\r
324 // called once at the end of each job (on the workernode)\r
325 //\r
326 // projects THnSparse to TH1,2,3\r
327 \r
328 fOutput = dynamic_cast<TList*> (GetOutputData(1));\r
329 if (!fOutput) {\r
330 Printf("ERROR: AliPerformanceTask::FinishTaskOutput(): fOutput data not available ..." );\r
331 return;\r
332 }\r
636e5a51 333\r
814d192f 334 AliPerformanceObject* pObj=0;\r
335 TIterator* itOut = fOutput->MakeIterator(); \r
336 itOut->Reset();\r
337 while(( pObj = dynamic_cast<AliPerformanceObject*>(itOut->Next())) != NULL) {\r
338 pObj->SetRunNumber(fCurrentRunNumber);\r
339 pObj->Analyse();\r
340 }\r
341 \r
342 // Post output data.\r
343 PostData(1, fOutput);\r
7cc34f08 344}\r
345\r
346//_____________________________________________________________________________\r
347Bool_t AliPerformanceTask::Notify()\r
348{\r
349 static Int_t count = 0;\r
350 count++;\r
351 Printf("Processing %d. file", count);\r
352\r
353 return kTRUE;\r
354}\r
36ace53b 355\r
356//________________________________________________________________________\r
1e9c263c 357Int_t AliPerformanceTask::CalculateCentralityBin(){\r
36ace53b 358 // Get Centrality bin\r
359\r
360 Int_t centrality = -1;\r
1e9c263c 361 Float_t centralityF = -1;\r
36ace53b 362\r
363 if (fUseCentrality == 0)\r
364 return centrality;\r
365\r
5da23c19 366 AliCentrality *esdCentrality = fESD->GetCentrality();\r
1e9c263c 367 \r
368 // New : 2010-11-18 JMT \r
369 if ( fUseCentrality == 1 )\r
370 centralityF = esdCentrality->GetCentralityPercentile("V0M");\r
371 else if ( fUseCentrality == 2 )\r
372 centralityF = esdCentrality->GetCentralityPercentile("CL1");\r
373 else if ( fUseCentrality == 3 )\r
374 centralityF = esdCentrality->GetCentralityPercentile("TRK"); \r
375 if (centralityF == 0.)\r
376 centralityF = 100.;\r
377\r
378 if ( centralityF >= 0. && centralityF < 5.) centrality = 0;\r
379 else if ( centralityF >= 5. && centralityF < 10.) centrality = 5;\r
380 else if ( centralityF >= 10. && centralityF < 20.) centrality = 10;\r
381 else if ( centralityF >= 20. && centralityF < 30.) centrality = 20;\r
382 else if ( centralityF >= 30. && centralityF < 40.) centrality = 30;\r
383 else if ( centralityF >= 40. && centralityF < 50.) centrality = 40;\r
384 else if ( centralityF >= 50. && centralityF < 60.) centrality = 50;\r
385 else if ( centralityF >= 60. && centralityF < 70.) centrality = 60;\r
386 else if ( centralityF >= 70. && centralityF < 80.) centrality = 70;\r
387 else if ( centralityF >= 80. && centralityF < 90.) centrality = 80;\r
388 else if ( centralityF >= 90. && centralityF <=100.) centrality = 90;\r
36ace53b 389 \r
390 return centrality;\r
391}\r