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