]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGPP/TPC/AliPerformanceTask.cxx
#102886: Various fixes to the the code in EVE, STEER, PWGPP, cmake
[u/mrichter/AliRoot.git] / PWGPP / TPC / AliPerformanceTask.cxx
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
26 // Changes by M.Knichel 15/10/2010\r
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
37 #include "TSystem.h"\r
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
50 #include "AliCDBManager.h"\r
51 \r
52 #include "AliCentrality.h"\r
53 #include "AliESDVZERO.h"\r
54 #include "AliMultiplicity.h"\r
55 \r
56 #include "AliMCInfo.h"\r
57 #include "AliESDRecInfo.h"\r
58 #include "AliMCInfoCuts.h"\r
59 #include "AliRecInfoCuts.h"\r
60 #include "AliPerformanceObject.h"\r
61 #include "AliTPCPerformanceSummary.h"\r
62 #include "AliPerformanceTPC.h"\r
63 #include "AliPerformanceDEdx.h"\r
64 #include "AliPerformanceMatch.h"\r
65 #include "AliPerformanceTask.h"\r
66 \r
67 \r
68 using namespace std;\r
69 \r
70 ClassImp(AliPerformanceTask)\r
71 \r
72 //_____________________________________________________________________________\r
73 AliPerformanceTask::AliPerformanceTask() \r
74   : AliAnalysisTaskSE("Performance")\r
75   , fESD(0)\r
76   , fESDfriend(0)\r
77   , fMC(0)\r
78   , fOutput(0)\r
79   , fOutputSummary(0)\r
80   , fPitList(0)\r
81   , fCompList(0)\r
82   , fUseMCInfo(kFALSE)\r
83   , fUseESDfriend(kFALSE)\r
84   , fUseHLT(kFALSE)\r
85   , fUseTerminate(kTRUE)\r
86   , fUseCentrality(0)\r
87   , fUseOCDB(kTRUE)\r
88   , fUseCentralityBin(0)\r
89 {\r
90   // Dummy Constructor\r
91   // should not be used\r
92 }\r
93 \r
94 //_____________________________________________________________________________\r
95 AliPerformanceTask::AliPerformanceTask(const char *name, const char */*title*/) \r
96   : AliAnalysisTaskSE(name)\r
97   , fESD(0)\r
98   , fESDfriend(0)\r
99   , fMC(0)\r
100   , fOutput(0)\r
101   , fOutputSummary(0)\r
102   , fPitList(0)\r
103   , fCompList(0)\r
104   , fUseMCInfo(kFALSE)\r
105   , fUseESDfriend(kFALSE)\r
106   , fUseHLT(kFALSE)\r
107   , fUseTerminate(kTRUE)\r
108   , fUseCentrality(0)\r
109   , fUseOCDB(kTRUE)\r
110   , fUseCentralityBin(0)\r
111 {\r
112   // Constructor\r
113 \r
114   // Define input and output slots here\r
115   DefineOutput(0, TTree::Class());\r
116   DefineOutput(1, TList::Class());\r
117 \r
118   // create the list for comparison objects\r
119   fCompList = new TList;\r
120 }\r
121 \r
122 //_____________________________________________________________________________\r
123 AliPerformanceTask::~AliPerformanceTask()\r
124 {\r
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
130 }\r
131 \r
132 //_____________________________________________________________________________\r
133 Bool_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
144 return kTRUE;\r
145 }\r
146 \r
147 //_____________________________________________________________________________\r
148 void AliPerformanceTask::UserCreateOutputObjects()\r
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
157   \r
158   // create output list\r
159   //fOutputSummary = new TTree;\r
160   \r
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
170   Printf("UserCreateOutputObjects(): Number of output comparison objects: %d \n", count);\r
171   \r
172   PostData(1, fOutput);  \r
173   PostData(0, fOutputSummary);  \r
174 }\r
175 \r
176 //_____________________________________________________________________________\r
177 void AliPerformanceTask::UserExec(Option_t *) \r
178 {\r
179   // Main loop\r
180   // Called for each event\r
181 \r
182 \r
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
198   if(fUseESDfriend)\r
199     {\r
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
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
218 \r
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
237   // Process analysis\r
238   Bool_t process = kTRUE;\r
239 \r
240   // Check for centrality\r
241   if (fUseCentrality) {\r
242     if ( CalculateCentralityBin() != fUseCentralityBin ) {\r
243       process = kFALSE;\r
244     }\r
245   }\r
246 \r
247   // Process comparison\r
248   if (process) {\r
249     AliPerformanceObject *pObj=0;\r
250     fPitList->Reset();\r
251     while(( pObj = (AliPerformanceObject *)fPitList->Next()) != NULL) {\r
252           AliInfo(pObj->GetName());\r
253           pObj->Exec(fMC,fESD,fESDfriend,fUseMCInfo,fUseESDfriend);\r
254     }\r
255   }\r
256 \r
257   // Post output data.\r
258   PostData(1, fOutput);\r
259 }\r
260 \r
261 //_____________________________________________________________________________\r
262 void AliPerformanceTask::Terminate(Option_t *) \r
263 {\r
264   // Called once at the end \r
265 \r
266   if ( !fUseTerminate )\r
267     return;\r
268   \r
269   // check output data\r
270     fOutputSummary = dynamic_cast<TTree*> (GetOutputData(0));\r
271     fOutput = dynamic_cast<TList*> (GetOutputData(1));\r
272     if (!fOutput) {\r
273         Printf("ERROR: AliPerformanceTask::Terminate(): fOutput data not available  ..." );\r
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
280     AliPerformanceMatch* pMatch = 0;\r
281     AliPerformanceMatch* pPull = 0;\r
282     AliPerformanceMatch* pConstrain = 0;\r
283     TIterator* itOut = fOutput->MakeIterator();\r
284     itOut->Reset();\r
285     while(( pObj = dynamic_cast<AliPerformanceObject*>(itOut->Next())) != NULL) { \r
286       pObj->AnalyseFinal();\r
287       /*      if (!  pTPC)  {    pTPC = dynamic_cast<AliPerformanceTPC*>(pObj); }\r
288         if (! pDEdx)  {   pDEdx = dynamic_cast<AliPerformanceDEdx*>(pObj); }\r
289         if (! pMatch) {  pMatch = dynamic_cast<AliPerformanceMatch*>(pObj); }\r
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
295         if (!strcmp(pObj->GetName(),"AliPerformanceMatchITSTPC")) {  pPull = dynamic_cast<AliPerformanceMatch*>(pObj);}\r
296         if (!strcmp(pObj->GetName(),"AliPerformanceMatchTPCConstrain")) {  pConstrain = dynamic_cast<AliPerformanceMatch*>(pObj);}\r
297     }\r
298   \r
299    \r
300     if(!fUseOCDB)  { \r
301       printf("DO NOT USE OCDB \n");\r
302       return;\r
303     }\r
304   \r
305     if (! AliCDBManager::Instance()->GetDefaultStorage()) { AliCDBManager::Instance()->SetDefaultStorage("raw://"); }\r
306     TUUID uuid;\r
307     TString tmpFile = gSystem->TempDirectory() + TString("/TPCQASummary.") + uuid.AsString() + TString(".root");\r
308     AliTPCPerformanceSummary::WriteToFile(pTPC, pDEdx, pMatch, pPull, pConstrain, tmpFile.Data());\r
309     TChain* chain = new TChain("tpcQA");\r
310     if(!chain) return;\r
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
317      PostData(0, fOutputSummary);\r
318 \r
319 }\r
320 \r
321 //_____________________________________________________________________________\r
322 void 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
333 \r
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
344 }\r
345 \r
346 //_____________________________________________________________________________\r
347 Bool_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
355 \r
356 //________________________________________________________________________\r
357 Int_t AliPerformanceTask::CalculateCentralityBin(){\r
358   // Get Centrality bin\r
359 \r
360   Int_t centrality = -1;\r
361   Float_t centralityF = -1;\r
362 \r
363   if (fUseCentrality == 0)\r
364     return centrality;\r
365 \r
366   AliCentrality *esdCentrality = fESD->GetCentrality();\r
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
389   \r
390   return centrality;\r
391 }\r