]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG1/TPC/AliPerformanceTask.cxx
extentions by Jochen Thaeder
[u/mrichter/AliRoot.git] / PWG1 / 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 "AliMCInfo.h"\r
53 #include "AliESDRecInfo.h"\r
54 #include "AliMCInfoCuts.h"\r
55 #include "AliRecInfoCuts.h"\r
56 #include "AliComparisonObject.h"\r
57 #include "AliPerformanceObject.h"\r
58 #include "AliTPCPerformanceSummary.h"\r
59 #include "AliPerformanceTPC.h"\r
60 #include "AliPerformanceDEdx.h"\r
61 #include "AliPerformanceTask.h"\r
62 \r
63 \r
64 using namespace std;\r
65 \r
66 ClassImp(AliPerformanceTask)\r
67 \r
68 //_____________________________________________________________________________\r
69 AliPerformanceTask::AliPerformanceTask() \r
70   : AliAnalysisTaskSE("Performance")\r
71   , fESD(0)\r
72   , fESDfriend(0)\r
73   , fMC(0)\r
74   , fOutput(0)\r
75   , fOutputSummary(0)\r
76   , fPitList(0)\r
77   , fCompList(0)\r
78   , fUseMCInfo(kFALSE)\r
79   , fUseESDfriend(kFALSE)\r
80   , fUseHLT(kFALSE)\r
81   , fUseTerminate(kTRUE)\r
82 {\r
83   // Dummy Constructor\r
84   // should not be used\r
85 }\r
86 \r
87 //_____________________________________________________________________________\r
88 AliPerformanceTask::AliPerformanceTask(const char *name, const char */*title*/) \r
89   : AliAnalysisTaskSE(name)\r
90   , fESD(0)\r
91   , fESDfriend(0)\r
92   , fMC(0)\r
93   , fOutput(0)\r
94   , fOutputSummary(0)\r
95   , fPitList(0)\r
96   , fCompList(0)\r
97   , fUseMCInfo(kFALSE)\r
98   , fUseESDfriend(kFALSE)\r
99   , fUseHLT(kFALSE)\r
100   , fUseTerminate(kTRUE)\r
101 {\r
102   // Constructor\r
103 \r
104   // Define input and output slots here\r
105   DefineOutput(1, TList::Class());\r
106   DefineOutput(2, TTree::Class());\r
107 \r
108   // create the list for comparison objects\r
109   fCompList = new TList;\r
110 }\r
111 \r
112 //_____________________________________________________________________________\r
113 AliPerformanceTask::~AliPerformanceTask()\r
114 {\r
115   if (fOutput)     delete fOutput;    fOutput   = 0; \r
116   if (fOutputSummary) delete fOutputSummary; fOutputSummary = 0;\r
117   if (fCompList)   delete fCompList;  fCompList = 0; \r
118 }\r
119 \r
120 //_____________________________________________________________________________\r
121 Bool_t AliPerformanceTask::AddPerformanceObject(AliPerformanceObject *pObj) \r
122 {\r
123   // add comparison object to the list\r
124   if(pObj == 0) {\r
125     Printf("ERROR: Could not add comparison object");\r
126     return kFALSE;\r
127   }\r
128 \r
129   // add object to the list\r
130   fCompList->AddLast(pObj);\r
131        \r
132 return kTRUE;\r
133 }\r
134 \r
135 //_____________________________________________________________________________\r
136 void AliPerformanceTask::UserCreateOutputObjects()\r
137 {\r
138   // Create histograms\r
139   // Called once\r
140 \r
141   // create output list\r
142   fOutput = new TList;\r
143   fOutput->SetOwner();\r
144   fPitList = fOutput->MakeIterator();\r
145   \r
146   // create output list\r
147   //fOutputSummary = new TTree;\r
148   \r
149   // add comparison objects to the output\r
150   AliPerformanceObject *pObj=0;\r
151   Int_t count=0;\r
152   TIterator *pitCompList = fCompList->MakeIterator();\r
153   pitCompList->Reset();\r
154   while(( pObj = (AliPerformanceObject *)pitCompList->Next()) != NULL) {\r
155     fOutput->Add(pObj);\r
156     count++;\r
157   }\r
158   Printf("UserCreateOutputObjects(): Number of output comparison objects: %d \n", count);\r
159   \r
160   PostData(1, fOutput);  \r
161   //PostData(2, fOutputSummary);  \r
162 }\r
163 \r
164 //_____________________________________________________________________________\r
165 void AliPerformanceTask::UserExec(Option_t *) \r
166 {\r
167   // Main loop\r
168   // Called for each event\r
169 \r
170   // Decide whether to use HLT or Offline ESD\r
171   if(fUseHLT){\r
172 \r
173     AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> \r
174       (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());\r
175     \r
176     if (!esdH) {\r
177       printf("ERROR: Could not get ESDInputHandler");\r
178       return;\r
179     } \r
180     fESD = esdH->GetHLTEvent();\r
181   }// end if fUseHLT\r
182   else  \r
183     fESD = (AliESDEvent*) (InputEvent());\r
184 \r
185   if(fUseESDfriend)\r
186     {\r
187       fESDfriend = static_cast<AliESDfriend*>(fESD->FindListObject("AliESDfriend"));\r
188       if(!fESDfriend) {\r
189         Printf("ERROR: ESD friends not available");\r
190       }\r
191     }\r
192   \r
193   if(fUseMCInfo) {\r
194       fMC = MCEvent();\r
195   }  \r
196 \r
197   //\r
198   AliPerformanceObject *pObj=0;\r
199 \r
200   if (!fESD) {\r
201     Printf("ERROR: ESD event not available");\r
202     return;\r
203   }\r
204   \r
205   if (fUseMCInfo && !fMC) {\r
206     Printf("ERROR: MC event not available");\r
207     return;\r
208   }\r
209 \r
210   if(fUseESDfriend)\r
211   {\r
212     if(!fESDfriend) {\r
213     Printf("ERROR: ESD friends not available");\r
214     }\r
215   }\r
216 \r
217   // Process comparison\r
218   fPitList->Reset();\r
219   while(( pObj = (AliPerformanceObject *)fPitList->Next()) != NULL) {\r
220     pObj->Exec(fMC,fESD,fESDfriend,fUseMCInfo,fUseESDfriend);\r
221   }\r
222 \r
223   // Post output data.\r
224   PostData(1, fOutput);\r
225 }\r
226 \r
227 //_____________________________________________________________________________\r
228 void AliPerformanceTask::Terminate(Option_t *) \r
229 {\r
230   // Called once at the end \r
231 \r
232   if ( !fUseTerminate )\r
233     return;\r
234 \r
235   // check output data\r
236     fOutputSummary = dynamic_cast<TTree*> (GetOutputData(2));\r
237     fOutput = dynamic_cast<TList*> (GetOutputData(1));\r
238     if (!fOutput) {\r
239         Printf("ERROR: AliPerformanceTask::Terminate(): fOutput data not available  ..." );\r
240         return;\r
241    }\r
242     if (fOutputSummary) { delete fOutputSummary; fOutputSummary=0; }      \r
243     AliPerformanceObject* pObj=0;\r
244     AliPerformanceTPC*  pTPC = 0;\r
245     AliPerformanceDEdx* pDEdx = 0;\r
246     TIterator* itOut = fOutput->MakeIterator();\r
247     itOut->Reset();\r
248     while(( pObj = dynamic_cast<AliPerformanceObject*>(itOut->Next())) != NULL) { \r
249         if (!  pTPC) {  pTPC = dynamic_cast<AliPerformanceTPC*>(pObj); }\r
250         if (! pDEdx) { pDEdx = dynamic_cast<AliPerformanceDEdx*>(pObj); }\r
251     }\r
252     if (! AliCDBManager::Instance()->GetDefaultStorage()) { AliCDBManager::Instance()->SetDefaultStorage("raw://"); }\r
253     TUUID uuid;\r
254     TString tmpFile = gSystem->TempDirectory() + TString("/TPCQASummary.") + uuid.AsString() + TString(".root");\r
255     AliTPCPerformanceSummary::WriteToFile(pTPC, pDEdx, tmpFile.Data());\r
256     TChain* chain = new TChain("tpcQA");\r
257     chain->Add(tmpFile.Data());\r
258     TTree *tree = chain->CopyTree("1");\r
259     if (chain) { delete chain; chain=0; }\r
260     fOutputSummary = tree;\r
261       \r
262      // Post output data.\r
263      PostData(2, fOutputSummary);\r
264 \r
265 }\r
266 \r
267 //_____________________________________________________________________________\r
268 void AliPerformanceTask::FinishTaskOutput()\r
269 {\r
270     // called once at the end of each job (on the workernode)\r
271     //\r
272     // projects THnSparse to TH1,2,3\r
273     \r
274     fOutput = dynamic_cast<TList*> (GetOutputData(1));\r
275     if (!fOutput) {\r
276         Printf("ERROR: AliPerformanceTask::FinishTaskOutput(): fOutput data not available  ..." );\r
277         return;\r
278    }\r
279 \r
280       AliPerformanceObject* pObj=0;\r
281       TIterator* itOut = fOutput->MakeIterator();  \r
282       itOut->Reset();\r
283       while(( pObj = dynamic_cast<AliPerformanceObject*>(itOut->Next())) != NULL) {\r
284           pObj->SetRunNumber(fCurrentRunNumber);\r
285           pObj->Analyse();\r
286       }\r
287       \r
288      // Post output data.\r
289      PostData(1, fOutput);\r
290 }\r
291 \r
292 //_____________________________________________________________________________\r
293 Bool_t AliPerformanceTask::Notify()\r
294 {\r
295   static Int_t count = 0;\r
296   count++;\r
297   Printf("Processing %d. file", count);\r
298 \r
299   return kTRUE;\r
300 }\r