]>
Commit | Line | Data |
---|---|---|
312e6f8d | 1 | /************************************************************************** |
2 | * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * | |
3 | * * | |
4 | * Author: The ALICE Off-line Project. * | |
5 | * Contributors are mentioned in the code where appropriate. * | |
6 | * * | |
7 | * Permission to use, copy, modify and distribute this software and its * | |
8 | * documentation strictly for non-commercial purposes is hereby granted * | |
9 | * without fee, provided that the above copyright notice appears in all * | |
10 | * copies and that both the copyright notice and this permission notice * | |
11 | * appear in the supporting documentation. The authors make no claims * | |
12 | * about the suitability of this software for any purpose. It is * | |
13 | * provided "as is" without express or implied warranty. * | |
14 | **************************************************************************/ | |
15 | ||
16 | /* $Id$ */ | |
17 | ||
18 | #include <TFile.h> | |
19 | #include <TPluginManager.h> | |
20 | #include <TROOT.h> | |
21 | #include <TString.h> | |
22 | #include <TSystem.h> | |
23 | ||
24 | #include "AliESDEvent.h" | |
25 | #include "AliLog.h" | |
26 | #include "AliQA.h" | |
27 | #include "AliQADataMaker.h" | |
28 | #include "AliQADataMakerSteer.h" | |
29 | #include "AliRawReaderRoot.h" | |
30 | #include "AliRun.h" | |
31 | #include "AliRunLoader.h" | |
32 | ||
33 | ClassImp(AliQADataMakerSteer) | |
34 | ||
35 | //_____________________________________________________________________________ | |
36 | AliQADataMakerSteer::AliQADataMakerSteer(const char* gAliceFilename, const char * name, const char * title) : | |
37 | TNamed(name, title), | |
38 | fCycleOption("new"), | |
39 | fESD(NULL), | |
40 | fESDTree(NULL), | |
41 | fFirst(kTRUE), | |
42 | fGAliceFileName(gAliceFilename), | |
43 | fRunNumber(0), | |
44 | fNumberOfEvents(0), | |
45 | fRawReader(NULL), | |
46 | fRunLoader(NULL) | |
47 | { | |
48 | // default ctor | |
49 | for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) { | |
50 | fLoader[iDet] = NULL ; | |
51 | fQADataMaker[iDet] = NULL ; | |
52 | fQACycles[iDet] = 999999 ; | |
53 | } | |
54 | } | |
55 | ||
56 | //_____________________________________________________________________________ | |
57 | AliQADataMakerSteer::AliQADataMakerSteer(const AliQADataMakerSteer & qas) : | |
58 | TNamed(qas), | |
59 | fCycleOption("new"), | |
60 | fESD(NULL), | |
61 | fESDTree(NULL), | |
62 | fFirst(qas.fFirst), | |
63 | fGAliceFileName(qas.fGAliceFileName), | |
64 | fRunNumber(qas.fRunNumber), | |
65 | fNumberOfEvents(qas.fNumberOfEvents), | |
66 | fRawReader(NULL), | |
67 | fRunLoader(NULL) | |
68 | { | |
69 | // cpy ctor | |
70 | for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) { | |
71 | fLoader[iDet] = qas.fLoader[iDet] ; | |
72 | fQADataMaker[iDet] = qas.fQADataMaker[iDet] ; | |
73 | fQACycles[iDet] = qas.fQACycles[iDet] ; | |
74 | } | |
75 | } | |
76 | ||
77 | //_____________________________________________________________________________ | |
78 | AliQADataMakerSteer & AliQADataMakerSteer::operator = (const AliQADataMakerSteer & qas) | |
79 | { | |
80 | // assignment operator | |
81 | this->~AliQADataMakerSteer() ; | |
82 | new(this) AliQADataMakerSteer(qas) ; | |
83 | return *this ; | |
84 | } | |
85 | ||
86 | //_____________________________________________________________________________ | |
87 | AliQADataMakerSteer::~AliQADataMakerSteer() | |
88 | { | |
89 | // dtor | |
90 | for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) { | |
91 | fLoader[iDet] = NULL; | |
92 | delete fQADataMaker[iDet]; | |
93 | fQADataMaker[iDet] = NULL; | |
94 | } | |
95 | ||
96 | delete fRunLoader; | |
97 | fRunLoader = NULL; | |
98 | delete fRawReader; | |
99 | fRawReader = NULL; | |
100 | } | |
101 | ||
102 | //_____________________________________________________________________________ | |
103 | AliLoader * AliQADataMakerSteer::GetLoader(Int_t iDet) | |
104 | { | |
105 | // get the loader for a detector | |
106 | ||
107 | TString detName = AliQA::GetDetName(iDet) ; | |
108 | fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader"); | |
109 | if (fLoader[iDet]) | |
110 | return fLoader[iDet] ; | |
111 | ||
112 | // load the QA data maker object | |
113 | TPluginManager* pluginManager = gROOT->GetPluginManager() ; | |
114 | TString loaderName = "Ali" + detName + "Loader" ; | |
115 | ||
116 | AliLoader * loader = NULL ; | |
117 | // first check if a plugin is defined for the quality assurance data maker | |
118 | TPluginHandler* pluginHandler = pluginManager->FindHandler("AliLoader", detName) ; | |
119 | // if not, add a plugin for it | |
120 | if (!pluginHandler) { | |
121 | AliDebug(1, Form("defining plugin for %s", loaderName.Data())) ; | |
122 | TString libs = gSystem->GetLibraries() ; | |
123 | if (libs.Contains("lib" + detName + "base.so") || (gSystem->Load("lib" + detName + "base.so") >= 0)) { | |
124 | pluginManager->AddHandler("AliQADataMaker", detName, loaderName, detName + "loader", loaderName + "()") ; | |
125 | } else { | |
126 | pluginManager->AddHandler("AliLoader", detName, loaderName, detName, loaderName + "()") ; | |
127 | } | |
128 | pluginHandler = pluginManager->FindHandler("AliLoader", detName) ; | |
129 | } | |
130 | if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) { | |
131 | loader = (AliLoader *) pluginHandler->ExecPlugin(0) ; | |
132 | } | |
133 | if (loader) | |
134 | fLoader[iDet] = loader ; | |
135 | return loader ; | |
136 | } | |
137 | ||
138 | //_____________________________________________________________________________ | |
139 | AliQADataMaker * AliQADataMakerSteer::GetQADataMaker(Int_t iDet) | |
140 | { | |
141 | // get the quality assurance data maker for a detector | |
142 | ||
143 | if (fQADataMaker[iDet]) | |
144 | return fQADataMaker[iDet] ; | |
145 | ||
146 | AliQADataMaker * qadm = NULL ; | |
147 | ||
148 | if (fFirst) { | |
149 | // load the QA data maker object | |
150 | TPluginManager* pluginManager = gROOT->GetPluginManager() ; | |
151 | TString detName = AliQA::GetDetName(iDet) ; | |
152 | TString qadmName = "Ali" + detName + "QADataMaker" ; | |
153 | ||
154 | // first check if a plugin is defined for the quality assurance data maker | |
155 | TPluginHandler* pluginHandler = pluginManager->FindHandler("AliQADataMaker", detName) ; | |
156 | // if not, add a plugin for it | |
157 | if (!pluginHandler) { | |
158 | AliDebug(1, Form("defining plugin for %s", qadmName.Data())) ; | |
159 | TString libs = gSystem->GetLibraries() ; | |
160 | if (libs.Contains("lib" + detName + "base.so") || (gSystem->Load("lib" + detName + "base.so") >= 0)) { | |
161 | pluginManager->AddHandler("AliQADataMaker", detName, qadmName, detName + "qadm", qadmName + "()") ; | |
162 | } else { | |
163 | pluginManager->AddHandler("AliQADataMaker", detName, qadmName, detName, qadmName + "()") ; | |
164 | } | |
165 | pluginHandler = pluginManager->FindHandler("AliQADataMaker", detName) ; | |
166 | } | |
167 | if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) { | |
168 | qadm = (AliQADataMaker *) pluginHandler->ExecPlugin(0) ; | |
169 | } | |
170 | if (qadm) | |
171 | fQADataMaker[iDet] = qadm ; | |
172 | } | |
173 | return qadm ; | |
174 | } | |
175 | ||
176 | //_____________________________________________________________________________ | |
177 | Bool_t AliQADataMakerSteer::Init(const AliQA::TASKINDEX taskIndex, const char * fileName ) | |
178 | { | |
179 | // Initialize the event source and QA data makers | |
180 | ||
181 | if (taskIndex == AliQA::kRAWS) { | |
182 | fRawReader = new AliRawReaderRoot(fileName) ; | |
183 | if ( ! fRawReader ) | |
184 | return kFALSE ; | |
185 | fRawReader->NextEvent() ; | |
186 | fRunNumber = fRawReader->GetRunNumber() ; | |
187 | fRawReader->RewindEvents(); | |
188 | fNumberOfEvents = 999999 ; | |
189 | ||
190 | } else if (taskIndex == AliQA::kESDS) { | |
191 | if (!gSystem->AccessPathName("AliESDs.root")) { // AliESDs.root exists | |
192 | TFile * esdFile = TFile::Open("AliESDs.root") ; | |
193 | fESDTree = dynamic_cast<TTree *> (esdFile->Get("esdTree")) ; | |
194 | fESD = new AliESDEvent() ; | |
195 | fESD->ReadFromTree(fESDTree) ; | |
196 | fESDTree->GetEntry(0) ; | |
197 | fRunNumber = fESD->GetRunNumber() ; | |
198 | fNumberOfEvents = fESDTree->GetEntries() ; | |
199 | } else { | |
200 | AliError("AliESDs.root not found") ; | |
201 | return kFALSE ; | |
202 | } | |
203 | ||
204 | } else { | |
205 | if ( !InitRunLoader() ) { | |
206 | AliError("Problems in getting the Run Loader") ; | |
207 | return kFALSE ; | |
208 | } else { | |
209 | fRunNumber = fRunLoader->GetAliRun()->GetRunNumber() ; | |
210 | fNumberOfEvents = fRunLoader->GetNumberOfEvents() ; | |
211 | } | |
212 | } | |
213 | ||
214 | // Initialize all QA data makers for all detectors | |
215 | for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) { | |
216 | AliQADataMaker * qadm = GetQADataMaker(iDet) ; | |
217 | if (!qadm) { | |
218 | AliWarning(Form("AliQADataMaker not found for %s", AliQA::GetDetName(iDet))) ; | |
219 | } else { | |
220 | AliInfo(Form("Data Maker found for %s", qadm->GetName())) ; | |
221 | qadm->Init(taskIndex, fRunNumber, GetQACycles(iDet)) ; | |
222 | qadm->StartOfCycle(taskIndex, fCycleOption) ; | |
223 | } | |
224 | } | |
225 | fFirst = kFALSE ; | |
226 | return kTRUE ; | |
227 | } | |
228 | ||
229 | //_____________________________________________________________________________ | |
230 | Bool_t AliQADataMakerSteer::InitRunLoader() | |
231 | { | |
232 | // get or create the run loader | |
233 | if (fRunLoader) { | |
234 | fCycleOption = "same" ; | |
235 | return kTRUE ; | |
236 | } | |
237 | ||
238 | if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists | |
239 | // load all base libraries to get the loader classes | |
240 | TString libs = gSystem->GetLibraries() ; | |
241 | for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) { | |
242 | TString detName = AliQA::GetDetName(iDet) ; | |
243 | if (detName == "HLT") | |
244 | continue; | |
245 | if (libs.Contains("lib" + detName + "base.so")) | |
246 | continue; | |
247 | gSystem->Load("lib" + detName + "base.so"); | |
248 | } | |
249 | fRunLoader = AliRunLoader::Open(fGAliceFileName.Data()); | |
250 | if (!fRunLoader) { | |
251 | AliError(Form("no run loader found in file %s", fGAliceFileName.Data())); | |
252 | return kFALSE; | |
253 | } | |
254 | fRunLoader->CdGAFile(); | |
255 | if (fRunLoader->LoadgAlice() == 0) { | |
256 | gAlice = fRunLoader->GetAliRun(); | |
257 | } | |
258 | if (!gAlice) { | |
259 | AliError(Form("no gAlice object found in file %s", fGAliceFileName.Data())); | |
260 | return kFALSE; | |
261 | } | |
262 | ||
263 | } else { // galice.root does not exist | |
264 | AliError(Form("the file %s does not exist", fGAliceFileName.Data())); | |
265 | return kFALSE; | |
266 | } | |
267 | ||
268 | return kTRUE; | |
269 | } | |
270 | ||
271 | //_____________________________________________________________________________ | |
272 | Bool_t AliQADataMakerSteer::Finish(const AliQA::TASKINDEX taskIndex) | |
273 | { | |
274 | // write output to file for all detectors | |
275 | for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) { | |
276 | AliQADataMaker * qadm = GetQADataMaker(iDet) ; | |
277 | if (qadm) { | |
278 | qadm->EndOfCycle(taskIndex) ; | |
279 | qadm->Finish(taskIndex) ; | |
280 | } | |
281 | } | |
282 | return kTRUE ; | |
283 | } | |
284 | ||
285 | //_____________________________________________________________________________ | |
286 | Bool_t AliQADataMakerSteer::Run(const AliQA::TASKINDEX taskIndex, const char * fileName ) | |
287 | { | |
288 | // Runs all the QA data Maker for every detector | |
289 | Bool_t rv = kFALSE ; | |
290 | ||
291 | if ( !Init(taskIndex, fileName) ) | |
292 | return kFALSE ; | |
293 | ||
294 | // Fill QA data in event loop | |
295 | for (UInt_t iEvent = 0 ; iEvent < fNumberOfEvents ; iEvent++) { | |
296 | // Get the event | |
297 | AliInfo(Form("processing event %d", iEvent)); | |
298 | if ( taskIndex == AliQA::kRAWS ) { | |
299 | if ( !fRawReader->NextEvent() ) | |
300 | break ; | |
301 | } else if ( taskIndex == AliQA::kESDS ) { | |
302 | fESDTree->GetEntry(iEvent) ; | |
303 | } else { | |
304 | fRunLoader->GetEvent(iEvent); | |
305 | } | |
306 | // loop over detectors | |
307 | for (UInt_t iDet = 0 ; iDet < fgkNDetectors ; iDet++) { | |
308 | AliQADataMaker * qadm = GetQADataMaker(iDet) ; | |
309 | if (!qadm) { | |
310 | rv = kFALSE ; | |
311 | } else { | |
312 | if ( qadm->IsCycleDone() ) { | |
313 | qadm->EndOfCycle(AliQA::kRAWS) ; | |
314 | qadm->StartOfCycle(AliQA::kRAWS) ; | |
315 | } | |
316 | TTree * data ; | |
317 | switch (taskIndex) { | |
318 | case AliQA::kRAWS : | |
319 | qadm->Exec(taskIndex, fRawReader) ; | |
320 | break ; | |
321 | case AliQA::kHITS : | |
322 | GetLoader(iDet)->LoadHits() ; | |
323 | data = GetLoader(iDet)->TreeH() ; | |
324 | if ( ! data ) { | |
325 | AliWarning(Form(" Hit Tree not found for %s", AliQA::GetDetName(iDet))) ; | |
326 | } else { | |
327 | qadm->Exec(taskIndex, data) ; | |
328 | } | |
329 | break ; | |
330 | case AliQA::kSDIGITS : | |
331 | GetLoader(iDet)->LoadSDigits() ; | |
332 | data = GetLoader(iDet)->TreeS() ; | |
333 | if ( ! data ) { | |
334 | AliWarning(Form(" SDigit Tree not found for %s", AliQA::GetDetName(iDet))) ; | |
335 | } else { | |
336 | qadm->Exec(taskIndex, data) ; | |
337 | } | |
338 | break; | |
339 | case AliQA::kDIGITS : | |
340 | GetLoader(iDet)->LoadDigits() ; | |
341 | data = GetLoader(iDet)->TreeD() ; | |
342 | if ( ! data ) { | |
343 | AliWarning(Form(" Digit Tree not found for %s", AliQA::GetDetName(iDet))) ; | |
344 | } else { | |
345 | qadm->Exec(taskIndex, data) ; | |
346 | } | |
347 | break; | |
348 | case AliQA::kRECPOINTS : | |
349 | GetLoader(iDet)->LoadRecPoints() ; | |
350 | data = GetLoader(iDet)->TreeR() ; | |
351 | if (!data) { | |
352 | AliWarning(Form("RecPoints not found for %s", AliQA::GetDetName(iDet))) ; | |
353 | } else { | |
354 | qadm->Exec(taskIndex, data) ; | |
355 | } | |
356 | break; | |
357 | case AliQA::kTRACKSEGMENTS : | |
358 | break; | |
359 | case AliQA::kRECPARTICLES : | |
360 | break; | |
361 | case AliQA::kESDS : | |
362 | qadm->Exec(taskIndex, fESD) ; | |
363 | break; | |
364 | } //task switch | |
365 | qadm->Increment() ; | |
366 | } //data maker exist | |
367 | } // detector loop | |
368 | } // event loop | |
369 | // Save QA data for all detectors | |
370 | rv = Finish(taskIndex) ; | |
371 | return rv ; | |
372 | } |