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> |
567d83d9 |
19 | #include <TFileMerger.h> |
312e6f8d |
20 | #include <TPluginManager.h> |
21 | #include <TROOT.h> |
22 | #include <TString.h> |
23 | #include <TSystem.h> |
24 | |
25 | #include "AliESDEvent.h" |
26 | #include "AliLog.h" |
007fcebb |
27 | #include "AliModule.h" |
312e6f8d |
28 | #include "AliQA.h" |
29 | #include "AliQADataMaker.h" |
30 | #include "AliQADataMakerSteer.h" |
4ecde5fc |
31 | #include "AliRawReaderDate.h" |
32 | #include "AliRawReaderFile.h" |
312e6f8d |
33 | #include "AliRawReaderRoot.h" |
34 | #include "AliRun.h" |
35 | #include "AliRunLoader.h" |
36 | |
37 | ClassImp(AliQADataMakerSteer) |
38 | |
39 | //_____________________________________________________________________________ |
40 | AliQADataMakerSteer::AliQADataMakerSteer(const char* gAliceFilename, const char * name, const char * title) : |
41 | TNamed(name, title), |
c65c502a |
42 | fCycleSame(kFALSE), |
312e6f8d |
43 | fESD(NULL), |
44 | fESDTree(NULL), |
45 | fFirst(kTRUE), |
46 | fGAliceFileName(gAliceFilename), |
47 | fRunNumber(0), |
48 | fNumberOfEvents(0), |
49 | fRawReader(NULL), |
50 | fRunLoader(NULL) |
51 | { |
52 | // default ctor |
53 | for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) { |
54 | fLoader[iDet] = NULL ; |
55 | fQADataMaker[iDet] = NULL ; |
56 | fQACycles[iDet] = 999999 ; |
57 | } |
58 | } |
59 | |
60 | //_____________________________________________________________________________ |
61 | AliQADataMakerSteer::AliQADataMakerSteer(const AliQADataMakerSteer & qas) : |
62 | TNamed(qas), |
c65c502a |
63 | fCycleSame(kFALSE), |
312e6f8d |
64 | fESD(NULL), |
65 | fESDTree(NULL), |
66 | fFirst(qas.fFirst), |
67 | fGAliceFileName(qas.fGAliceFileName), |
68 | fRunNumber(qas.fRunNumber), |
69 | fNumberOfEvents(qas.fNumberOfEvents), |
70 | fRawReader(NULL), |
71 | fRunLoader(NULL) |
72 | { |
73 | // cpy ctor |
74 | for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) { |
75 | fLoader[iDet] = qas.fLoader[iDet] ; |
76 | fQADataMaker[iDet] = qas.fQADataMaker[iDet] ; |
77 | fQACycles[iDet] = qas.fQACycles[iDet] ; |
78 | } |
79 | } |
80 | |
81 | //_____________________________________________________________________________ |
82 | AliQADataMakerSteer & AliQADataMakerSteer::operator = (const AliQADataMakerSteer & qas) |
83 | { |
84 | // assignment operator |
85 | this->~AliQADataMakerSteer() ; |
86 | new(this) AliQADataMakerSteer(qas) ; |
87 | return *this ; |
88 | } |
89 | |
90 | //_____________________________________________________________________________ |
91 | AliQADataMakerSteer::~AliQADataMakerSteer() |
92 | { |
93 | // dtor |
94 | for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) { |
95 | fLoader[iDet] = NULL; |
c65c502a |
96 | if (fQADataMaker[iDet]) { |
97 | (fQADataMaker[iDet])->Finish() ; |
98 | delete fQADataMaker[iDet] ; |
99 | fQADataMaker[iDet] = NULL ; |
100 | } |
312e6f8d |
101 | } |
102 | |
c65c502a |
103 | fRunLoader = NULL ; |
104 | delete fRawReader ; |
105 | fRawReader = NULL ; |
312e6f8d |
106 | } |
107 | |
108 | //_____________________________________________________________________________ |
109 | AliLoader * AliQADataMakerSteer::GetLoader(Int_t iDet) |
110 | { |
111 | // get the loader for a detector |
112 | |
113 | TString detName = AliQA::GetDetName(iDet) ; |
114 | fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader"); |
115 | if (fLoader[iDet]) |
116 | return fLoader[iDet] ; |
117 | |
118 | // load the QA data maker object |
119 | TPluginManager* pluginManager = gROOT->GetPluginManager() ; |
120 | TString loaderName = "Ali" + detName + "Loader" ; |
121 | |
122 | AliLoader * loader = NULL ; |
123 | // first check if a plugin is defined for the quality assurance data maker |
124 | TPluginHandler* pluginHandler = pluginManager->FindHandler("AliLoader", detName) ; |
125 | // if not, add a plugin for it |
126 | if (!pluginHandler) { |
127 | AliDebug(1, Form("defining plugin for %s", loaderName.Data())) ; |
128 | TString libs = gSystem->GetLibraries() ; |
129 | if (libs.Contains("lib" + detName + "base.so") || (gSystem->Load("lib" + detName + "base.so") >= 0)) { |
130 | pluginManager->AddHandler("AliQADataMaker", detName, loaderName, detName + "loader", loaderName + "()") ; |
131 | } else { |
132 | pluginManager->AddHandler("AliLoader", detName, loaderName, detName, loaderName + "()") ; |
133 | } |
134 | pluginHandler = pluginManager->FindHandler("AliLoader", detName) ; |
135 | } |
136 | if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) { |
137 | loader = (AliLoader *) pluginHandler->ExecPlugin(0) ; |
138 | } |
139 | if (loader) |
140 | fLoader[iDet] = loader ; |
141 | return loader ; |
142 | } |
143 | |
144 | //_____________________________________________________________________________ |
145 | AliQADataMaker * AliQADataMakerSteer::GetQADataMaker(Int_t iDet) |
146 | { |
147 | // get the quality assurance data maker for a detector |
148 | |
149 | if (fQADataMaker[iDet]) |
150 | return fQADataMaker[iDet] ; |
151 | |
152 | AliQADataMaker * qadm = NULL ; |
153 | |
154 | if (fFirst) { |
155 | // load the QA data maker object |
156 | TPluginManager* pluginManager = gROOT->GetPluginManager() ; |
157 | TString detName = AliQA::GetDetName(iDet) ; |
158 | TString qadmName = "Ali" + detName + "QADataMaker" ; |
159 | |
160 | // first check if a plugin is defined for the quality assurance data maker |
161 | TPluginHandler* pluginHandler = pluginManager->FindHandler("AliQADataMaker", detName) ; |
162 | // if not, add a plugin for it |
163 | if (!pluginHandler) { |
164 | AliDebug(1, Form("defining plugin for %s", qadmName.Data())) ; |
165 | TString libs = gSystem->GetLibraries() ; |
166 | if (libs.Contains("lib" + detName + "base.so") || (gSystem->Load("lib" + detName + "base.so") >= 0)) { |
167 | pluginManager->AddHandler("AliQADataMaker", detName, qadmName, detName + "qadm", qadmName + "()") ; |
168 | } else { |
169 | pluginManager->AddHandler("AliQADataMaker", detName, qadmName, detName, qadmName + "()") ; |
170 | } |
171 | pluginHandler = pluginManager->FindHandler("AliQADataMaker", detName) ; |
172 | } |
173 | if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) { |
174 | qadm = (AliQADataMaker *) pluginHandler->ExecPlugin(0) ; |
175 | } |
176 | if (qadm) |
177 | fQADataMaker[iDet] = qadm ; |
178 | } |
179 | return qadm ; |
180 | } |
181 | |
182 | //_____________________________________________________________________________ |
4ecde5fc |
183 | Bool_t AliQADataMakerSteer::Init(const AliQA::TASKINDEX taskIndex, const char * input ) |
312e6f8d |
184 | { |
185 | // Initialize the event source and QA data makers |
186 | |
187 | if (taskIndex == AliQA::kRAWS) { |
4ecde5fc |
188 | TString fileName(input); |
189 | if (fileName.EndsWith("/")) { |
190 | fRawReader = new AliRawReaderFile(fileName); |
191 | } else if (fileName.EndsWith(".root")) { |
192 | fRawReader = new AliRawReaderRoot(fileName); |
193 | } else if (!fileName.IsNull()) { |
194 | fRawReader = new AliRawReaderDate(fileName); |
195 | fRawReader->SelectEvents(7); |
196 | } |
312e6f8d |
197 | if ( ! fRawReader ) |
198 | return kFALSE ; |
199 | fRawReader->NextEvent() ; |
200 | fRunNumber = fRawReader->GetRunNumber() ; |
201 | fRawReader->RewindEvents(); |
202 | fNumberOfEvents = 999999 ; |
ad265f3e |
203 | } else if (taskIndex == AliQA::kESDS) { |
204 | if (!gSystem->AccessPathName("AliESDs.root")) { // AliESDs.root exists |
205 | TFile * esdFile = TFile::Open("AliESDs.root") ; |
206 | fESDTree = dynamic_cast<TTree *> (esdFile->Get("esdTree")) ; |
207 | fESD = new AliESDEvent() ; |
208 | fESD->ReadFromTree(fESDTree) ; |
209 | fESDTree->GetEntry(0) ; |
210 | fRunNumber = fESD->GetRunNumber() ; |
211 | fNumberOfEvents = fESDTree->GetEntries() ; |
212 | } else { |
213 | AliError("AliESDs.root not found") ; |
214 | return kFALSE ; |
215 | } |
312e6f8d |
216 | } else { |
217 | if ( !InitRunLoader() ) { |
808b7099 |
218 | AliError("Run Loader not found") ; |
312e6f8d |
219 | return kFALSE ; |
220 | } else { |
ad265f3e |
221 | if (fRunLoader->GetAliRun()) |
222 | fRunNumber = fRunLoader->GetAliRun()->GetRunNumber() ; |
312e6f8d |
223 | fNumberOfEvents = fRunLoader->GetNumberOfEvents() ; |
224 | } |
ad265f3e |
225 | } |
226 | |
312e6f8d |
227 | // Initialize all QA data makers for all detectors |
228 | for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) { |
229 | AliQADataMaker * qadm = GetQADataMaker(iDet) ; |
230 | if (!qadm) { |
231 | AliWarning(Form("AliQADataMaker not found for %s", AliQA::GetDetName(iDet))) ; |
232 | } else { |
233 | AliInfo(Form("Data Maker found for %s", qadm->GetName())) ; |
234 | qadm->Init(taskIndex, fRunNumber, GetQACycles(iDet)) ; |
c65c502a |
235 | qadm->StartOfCycle(taskIndex, fCycleSame) ; |
312e6f8d |
236 | } |
237 | } |
238 | fFirst = kFALSE ; |
239 | return kTRUE ; |
240 | } |
241 | |
242 | //_____________________________________________________________________________ |
243 | Bool_t AliQADataMakerSteer::InitRunLoader() |
244 | { |
245 | // get or create the run loader |
246 | if (fRunLoader) { |
c65c502a |
247 | fCycleSame = kTRUE ; |
312e6f8d |
248 | return kTRUE ; |
249 | } |
250 | |
251 | if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists |
252 | // load all base libraries to get the loader classes |
253 | TString libs = gSystem->GetLibraries() ; |
254 | for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) { |
255 | TString detName = AliQA::GetDetName(iDet) ; |
256 | if (detName == "HLT") |
257 | continue; |
258 | if (libs.Contains("lib" + detName + "base.so")) |
259 | continue; |
260 | gSystem->Load("lib" + detName + "base.so"); |
261 | } |
262 | fRunLoader = AliRunLoader::Open(fGAliceFileName.Data()); |
263 | if (!fRunLoader) { |
264 | AliError(Form("no run loader found in file %s", fGAliceFileName.Data())); |
265 | return kFALSE; |
266 | } |
267 | fRunLoader->CdGAFile(); |
268 | if (fRunLoader->LoadgAlice() == 0) { |
269 | gAlice = fRunLoader->GetAliRun(); |
270 | } |
271 | if (!gAlice) { |
272 | AliError(Form("no gAlice object found in file %s", fGAliceFileName.Data())); |
273 | return kFALSE; |
274 | } |
275 | |
276 | } else { // galice.root does not exist |
277 | AliError(Form("the file %s does not exist", fGAliceFileName.Data())); |
278 | return kFALSE; |
279 | } |
280 | |
281 | return kTRUE; |
282 | } |
283 | |
284 | //_____________________________________________________________________________ |
285 | Bool_t AliQADataMakerSteer::Finish(const AliQA::TASKINDEX taskIndex) |
286 | { |
287 | // write output to file for all detectors |
288 | for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) { |
289 | AliQADataMaker * qadm = GetQADataMaker(iDet) ; |
290 | if (qadm) { |
291 | qadm->EndOfCycle(taskIndex) ; |
312e6f8d |
292 | } |
293 | } |
294 | return kTRUE ; |
295 | } |
296 | |
315bba70 |
297 | //_____________________________________________________________________________ |
298 | Bool_t AliQADataMakerSteer::Merge() |
299 | { |
567d83d9 |
300 | // Merge all the cycles from all detectors in one single file per run |
301 | |
302 | gROOT->ProcessLine(".! ls *QA*.*.*.root > tempo.txt") ; |
303 | ifstream in("tempo.txt") ; |
304 | const Int_t runMax = 10 ; |
305 | TString file[AliQA::kNDET*runMax] ; |
306 | Int_t run[AliQA::kNDET*runMax] ; |
307 | |
308 | Int_t index = 0 ; |
309 | while ( 1 ) { |
310 | in >> file[index++] ; |
311 | if ( !in.good() ) |
312 | break ; |
313 | } |
314 | Int_t previousRun = -1 ; |
315 | Int_t runIndex = 0 ; |
316 | for (Int_t ifile = 0 ; ifile < index-1 ; ifile++) { |
317 | TString tmp(file[ifile]) ; |
318 | tmp.ReplaceAll(".root", "") ; |
319 | TString det = tmp(0, tmp.Index(".")) ; |
320 | tmp.Remove(0, tmp.Index(".QA.")+4) ; |
321 | TString ttmp = tmp(0, tmp.Index(".")) ; |
322 | Int_t newRun = ttmp.Atoi() ; |
323 | if (newRun != previousRun) { |
324 | run[runIndex] = newRun ; |
325 | previousRun = newRun ; |
326 | runIndex++ ; |
327 | } |
328 | ttmp = tmp(tmp.Index("."), tmp.Length()) ; |
329 | Int_t cycle = ttmp.Atoi() ; |
330 | AliInfo(Form("%s : det = %s run = %d cycle = %d \n", file[ifile].Data(), det.Data(), newRun, cycle)) ; |
331 | } |
332 | for (Int_t irun = 0 ; irun < runIndex ; irun++) { |
333 | TFileMerger merger ; |
334 | char outFileName[runMax] ; |
335 | sprintf(outFileName, "Merged.QA.%d.root", runIndex-1) ; |
336 | merger.OutputFile(outFileName) ; |
337 | for (Int_t ifile = 0 ; ifile < index-1 ; ifile++) { |
338 | char pattern[100] ; |
339 | sprintf(pattern, "QA.%d.", runIndex-1) ; |
340 | TString tmp(file[ifile]) ; |
341 | if (tmp.Contains(pattern)) |
342 | merger.AddFile(tmp) ; |
343 | } |
344 | merger.Merge() ; |
345 | } |
346 | |
347 | return kTRUE ; |
315bba70 |
348 | } |
349 | |
c65c502a |
350 | //_____________________________________________________________________________ |
351 | void AliQADataMakerSteer::Reset() |
352 | { |
353 | // Reset the default data members |
354 | for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) { |
355 | fLoader[iDet] = NULL; |
356 | if (fQADataMaker[iDet]) { |
357 | (fQADataMaker[iDet])->Reset() ; |
358 | // delete fQADataMaker[iDet] ; |
359 | // fQADataMaker[iDet] = NULL ; |
360 | } |
361 | } |
362 | |
c65c502a |
363 | delete fRawReader ; |
364 | fRawReader = NULL ; |
365 | |
366 | fCycleSame = kFALSE ; |
367 | fESD = NULL ; |
368 | fESDTree = NULL ; |
369 | fFirst = kTRUE ; |
370 | fNumberOfEvents = 0 ; |
371 | } |
372 | |
312e6f8d |
373 | //_____________________________________________________________________________ |
374 | Bool_t AliQADataMakerSteer::Run(const AliQA::TASKINDEX taskIndex, const char * fileName ) |
375 | { |
376 | // Runs all the QA data Maker for every detector |
377 | Bool_t rv = kFALSE ; |
378 | |
379 | if ( !Init(taskIndex, fileName) ) |
380 | return kFALSE ; |
381 | |
382 | // Fill QA data in event loop |
383 | for (UInt_t iEvent = 0 ; iEvent < fNumberOfEvents ; iEvent++) { |
384 | // Get the event |
808b7099 |
385 | AliDebug(1, Form("processing event %d", iEvent)); |
312e6f8d |
386 | if ( taskIndex == AliQA::kRAWS ) { |
387 | if ( !fRawReader->NextEvent() ) |
388 | break ; |
389 | } else if ( taskIndex == AliQA::kESDS ) { |
390 | fESDTree->GetEntry(iEvent) ; |
391 | } else { |
392 | fRunLoader->GetEvent(iEvent); |
393 | } |
394 | // loop over detectors |
efc25b83 |
395 | TObjArray* detArray = NULL ; |
396 | if (fRunLoader) // check if RunLoader exists |
397 | if ( fRunLoader->GetAliRun() ) // check if AliRun exists in gAlice.root |
398 | detArray = fRunLoader->GetAliRun()->Detectors() ; |
312e6f8d |
399 | for (UInt_t iDet = 0 ; iDet < fgkNDetectors ; iDet++) { |
efc25b83 |
400 | if (detArray) { |
401 | AliModule* det = static_cast<AliModule*>(detArray->FindObject(AliQA::GetDetName(iDet))) ; |
402 | if (!det || !det->IsActive()) |
403 | continue; |
404 | } |
312e6f8d |
405 | AliQADataMaker * qadm = GetQADataMaker(iDet) ; |
406 | if (!qadm) { |
407 | rv = kFALSE ; |
408 | } else { |
409 | if ( qadm->IsCycleDone() ) { |
410 | qadm->EndOfCycle(AliQA::kRAWS) ; |
411 | qadm->StartOfCycle(AliQA::kRAWS) ; |
412 | } |
413 | TTree * data ; |
414 | switch (taskIndex) { |
415 | case AliQA::kRAWS : |
416 | qadm->Exec(taskIndex, fRawReader) ; |
417 | break ; |
418 | case AliQA::kHITS : |
419 | GetLoader(iDet)->LoadHits() ; |
420 | data = GetLoader(iDet)->TreeH() ; |
421 | if ( ! data ) { |
422 | AliWarning(Form(" Hit Tree not found for %s", AliQA::GetDetName(iDet))) ; |
423 | } else { |
424 | qadm->Exec(taskIndex, data) ; |
425 | } |
426 | break ; |
427 | case AliQA::kSDIGITS : |
428 | GetLoader(iDet)->LoadSDigits() ; |
429 | data = GetLoader(iDet)->TreeS() ; |
430 | if ( ! data ) { |
431 | AliWarning(Form(" SDigit Tree not found for %s", AliQA::GetDetName(iDet))) ; |
432 | } else { |
433 | qadm->Exec(taskIndex, data) ; |
434 | } |
435 | break; |
436 | case AliQA::kDIGITS : |
437 | GetLoader(iDet)->LoadDigits() ; |
438 | data = GetLoader(iDet)->TreeD() ; |
439 | if ( ! data ) { |
440 | AliWarning(Form(" Digit Tree not found for %s", AliQA::GetDetName(iDet))) ; |
441 | } else { |
442 | qadm->Exec(taskIndex, data) ; |
443 | } |
444 | break; |
445 | case AliQA::kRECPOINTS : |
446 | GetLoader(iDet)->LoadRecPoints() ; |
447 | data = GetLoader(iDet)->TreeR() ; |
448 | if (!data) { |
449 | AliWarning(Form("RecPoints not found for %s", AliQA::GetDetName(iDet))) ; |
450 | } else { |
451 | qadm->Exec(taskIndex, data) ; |
452 | } |
453 | break; |
454 | case AliQA::kTRACKSEGMENTS : |
455 | break; |
456 | case AliQA::kRECPARTICLES : |
457 | break; |
458 | case AliQA::kESDS : |
459 | qadm->Exec(taskIndex, fESD) ; |
460 | break; |
461 | } //task switch |
462 | qadm->Increment() ; |
463 | } //data maker exist |
464 | } // detector loop |
465 | } // event loop |
466 | // Save QA data for all detectors |
467 | rv = Finish(taskIndex) ; |
468 | return rv ; |
14e1eccc |
469 | } |