added an additional directory under Ref
[u/mrichter/AliRoot.git] / STEER / AliQADataMakerSteer.cxx
CommitLineData
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$ */
202374b1 17///////////////////////////////////////////////////////////////////////////////
18// //
19// class for running the QA makers //
20// //
21// AliQADataMakerSteer qas; //
22// qas.Run(AliQA::kRAWS, rawROOTFileName); //
23// qas.Run(AliQA::kHITS); //
24// qas.Run(AliQA::kSDIGITS); //
25// qas.Run(AliQA::kDIGITS); //
26// qas.Run(AliQA::kRECPOINTS); //
27// qas.Run(AliQA::kESDS); //
28// //
29///////////////////////////////////////////////////////////////////////////////
312e6f8d 30
4edbc5bc 31#include <TKey.h>
312e6f8d 32#include <TFile.h>
567d83d9 33#include <TFileMerger.h>
312e6f8d 34#include <TPluginManager.h>
35#include <TROOT.h>
36#include <TString.h>
37#include <TSystem.h>
38
4edbc5bc 39#include "AliCDBManager.h"
40#include "AliCDBEntry.h"
41#include "AliCDBId.h"
42#include "AliCDBMetaData.h"
312e6f8d 43#include "AliESDEvent.h"
6441b07a 44#include "AliHeader.h"
312e6f8d 45#include "AliLog.h"
007fcebb 46#include "AliModule.h"
312e6f8d 47#include "AliQA.h"
04236e67 48#include "AliQADataMakerRec.h"
49#include "AliQADataMakerSim.h"
312e6f8d 50#include "AliQADataMakerSteer.h"
4ecde5fc 51#include "AliRawReaderDate.h"
52#include "AliRawReaderFile.h"
312e6f8d 53#include "AliRawReaderRoot.h"
54#include "AliRun.h"
55#include "AliRunLoader.h"
56
57ClassImp(AliQADataMakerSteer)
58
59//_____________________________________________________________________________
60AliQADataMakerSteer::AliQADataMakerSteer(const char* gAliceFilename, const char * name, const char * title) :
61 TNamed(name, title),
018c2b09 62 fCurrentEvent(0),
c65c502a 63 fCycleSame(kFALSE),
fff5167b 64 fDetectors("ALL"),
65 fDetectorsW("ALL"),
312e6f8d 66 fESD(NULL),
67 fESDTree(NULL),
68 fFirst(kTRUE),
69 fGAliceFileName(gAliceFilename),
f0c6fb4b 70 fMaxEvents(0),
774ac967 71 fNumberOfEvents(999999),
f0c6fb4b 72 fRunNumber(0),
312e6f8d 73 fRawReader(NULL),
6441b07a 74 fRawReaderDelete(kTRUE),
312e6f8d 75 fRunLoader(NULL)
76{
77 // default ctor
f0c6fb4b 78 fMaxEvents = fNumberOfEvents ;
312e6f8d 79 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
4d52736b 80 if (IsSelected(AliQA::GetDetName(iDet))) {
81 fLoader[iDet] = NULL ;
82 fQADataMaker[iDet] = NULL ;
83 fQACycles[iDet] = 999999 ;
84 }
312e6f8d 85 }
86}
87
88//_____________________________________________________________________________
89AliQADataMakerSteer::AliQADataMakerSteer(const AliQADataMakerSteer & qas) :
90 TNamed(qas),
018c2b09 91 fCurrentEvent(qas.fCurrentEvent),
c65c502a 92 fCycleSame(kFALSE),
fff5167b 93 fDetectors(qas.fDetectors),
94 fDetectorsW(qas.fDetectorsW),
312e6f8d 95 fESD(NULL),
96 fESDTree(NULL),
97 fFirst(qas.fFirst),
98 fGAliceFileName(qas.fGAliceFileName),
f0c6fb4b 99 fMaxEvents(qas.fMaxEvents),
312e6f8d 100 fNumberOfEvents(qas.fNumberOfEvents),
f0c6fb4b 101 fRunNumber(qas.fRunNumber),
312e6f8d 102 fRawReader(NULL),
6441b07a 103 fRawReaderDelete(kTRUE),
312e6f8d 104 fRunLoader(NULL)
105{
106 // cpy ctor
107 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
108 fLoader[iDet] = qas.fLoader[iDet] ;
109 fQADataMaker[iDet] = qas.fQADataMaker[iDet] ;
110 fQACycles[iDet] = qas.fQACycles[iDet] ;
111 }
112}
113
114//_____________________________________________________________________________
115AliQADataMakerSteer & AliQADataMakerSteer::operator = (const AliQADataMakerSteer & qas)
116{
117 // assignment operator
118 this->~AliQADataMakerSteer() ;
119 new(this) AliQADataMakerSteer(qas) ;
120 return *this ;
121}
122
123//_____________________________________________________________________________
124AliQADataMakerSteer::~AliQADataMakerSteer()
125{
126 // dtor
127 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
4d52736b 128 if (IsSelected(AliQA::GetDetName(iDet))) {
129 fLoader[iDet] = NULL;
130 if (fQADataMaker[iDet]) {
131 (fQADataMaker[iDet])->Finish() ;
132 delete fQADataMaker[iDet] ;
133 fQADataMaker[iDet] = NULL ;
134 }
135 }
312e6f8d 136 }
137
6441b07a 138 if (fRawReaderDelete) {
139 fRunLoader = NULL ;
140 delete fRawReader ;
141 fRawReader = NULL ;
142 }
312e6f8d 143}
144
4d52736b 145//_____________________________________________________________________________
04236e67 146Bool_t AliQADataMakerSteer::DoIt(const AliQA::TASKINDEX taskIndex, const char * mode)
4d52736b 147{
148 // Runs all the QA data Maker for every detector
fff5167b 149
4d52736b 150 Bool_t rv = kFALSE ;
4d52736b 151 // Fill QA data in event loop
f0c6fb4b 152 for (UInt_t iEvent = 0 ; iEvent < (UInt_t)fMaxEvents ; iEvent++) {
018c2b09 153 fCurrentEvent++ ;
4d52736b 154 // Get the event
a6f6970e 155 if ( iEvent%10 == 0 )
156 AliInfo(Form("processing event %d", iEvent));
4d52736b 157 if ( taskIndex == AliQA::kRAWS ) {
158 if ( !fRawReader->NextEvent() )
159 break ;
160 } else if ( taskIndex == AliQA::kESDS ) {
774ac967 161 if ( fESDTree->GetEntry(iEvent) == 0 )
162 break ;
4d52736b 163 } else {
774ac967 164 if ( fRunLoader->GetEvent(iEvent) != 0 )
165 break ;
4d52736b 166 }
167 // loop over detectors
168 TObjArray* detArray = NULL ;
169 if (fRunLoader) // check if RunLoader exists
170 if ( fRunLoader->GetAliRun() ) // check if AliRun exists in gAlice.root
171 detArray = fRunLoader->GetAliRun()->Detectors() ;
172 for (UInt_t iDet = 0 ; iDet < fgkNDetectors ; iDet++) {
173 if (detArray) {
174 AliModule* det = static_cast<AliModule*>(detArray->FindObject(AliQA::GetDetName(iDet))) ;
175 if (!det || !det->IsActive())
176 continue ;
177 }
178 if (!IsSelected(AliQA::GetDetName(iDet)))
179 continue ;
04236e67 180 AliQADataMaker * qadm = GetQADataMaker(iDet, mode) ;
4d52736b 181 if (!qadm) {
182 rv = kFALSE ;
183 } else {
184 if ( qadm->IsCycleDone() ) {
185 qadm->EndOfCycle(AliQA::kRAWS) ;
186 qadm->StartOfCycle(AliQA::kRAWS) ;
187 }
188 TTree * data ;
189 switch (taskIndex) {
190 case AliQA::kRAWS :
191 qadm->Exec(taskIndex, fRawReader) ;
192 break ;
193 case AliQA::kHITS :
194 GetLoader(iDet)->LoadHits() ;
195 data = GetLoader(iDet)->TreeH() ;
196 if ( ! data ) {
197 AliWarning(Form(" Hit Tree not found for %s", AliQA::GetDetName(iDet))) ;
198 } else {
199 qadm->Exec(taskIndex, data) ;
200 }
201 break ;
202 case AliQA::kSDIGITS :
203 GetLoader(iDet)->LoadSDigits() ;
204 data = GetLoader(iDet)->TreeS() ;
205 if ( ! data ) {
206 AliWarning(Form(" SDigit Tree not found for %s", AliQA::GetDetName(iDet))) ;
207 } else {
208 qadm->Exec(taskIndex, data) ;
209 }
210 break;
211 case AliQA::kDIGITS :
212 GetLoader(iDet)->LoadDigits() ;
213 data = GetLoader(iDet)->TreeD() ;
214 if ( ! data ) {
215 AliWarning(Form(" Digit Tree not found for %s", AliQA::GetDetName(iDet))) ;
216 } else {
217 qadm->Exec(taskIndex, data) ;
218 }
219 break;
220 case AliQA::kRECPOINTS :
221 GetLoader(iDet)->LoadRecPoints() ;
222 data = GetLoader(iDet)->TreeR() ;
223 if (!data) {
224 AliWarning(Form("RecPoints not found for %s", AliQA::GetDetName(iDet))) ;
225 } else {
226 qadm->Exec(taskIndex, data) ;
227 }
228 break;
229 case AliQA::kTRACKSEGMENTS :
230 break;
231 case AliQA::kRECPARTICLES :
232 break;
233 case AliQA::kESDS :
234 qadm->Exec(taskIndex, fESD) ;
235 break;
4edbc5bc 236 case AliQA::kNTASKINDEX :
237 break;
4d52736b 238 } //task switch
fff5167b 239 //qadm->Increment() ;
4d52736b 240 } //data maker exist
241 } // detector loop
242 } // event loop
a6f6970e 243// // Save QA data for all detectors
04236e67 244 rv = Finish(taskIndex, mode) ;
fff5167b 245
4d52736b 246 return rv ;
247}
248
4edbc5bc 249//_____________________________________________________________________________
04236e67 250Bool_t AliQADataMakerSteer::Finish(const AliQA::TASKINDEX taskIndex, const char * mode)
4edbc5bc 251{
252 // write output to file for all detectors
253 for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
254 if (IsSelected(AliQA::GetDetName(iDet))) {
04236e67 255 AliQADataMaker * qadm = GetQADataMaker(iDet, mode) ;
4edbc5bc 256 if (qadm) {
257 qadm->EndOfCycle(taskIndex) ;
258 }
259 }
260 }
261 return kTRUE ;
262}
263
264//_____________________________________________________________________________
f73f556a 265TObjArray * AliQADataMakerSteer::GetFromOCDB(AliQA::DETECTORINDEX det, AliQA::TASKINDEX task) const
4edbc5bc 266{
267 // Retrieve the list of QA data for a given detector and a given task
f73f556a 268 TObjArray * rv = NULL ;
269 TString tmp(AliQA::GetQARefStorage()) ;
270 if ( tmp.IsNull() ) {
271 AliError("No storage defined, use AliQA::SetQARefStorage") ;
272 return NULL ;
273 }
4edbc5bc 274 AliCDBManager* man = AliCDBManager::Instance() ;
f73f556a 275 if ( ! man->IsDefaultStorageSet() ) {
276 man->SetDefaultStorage(AliQA::GetQARefDefaultStorage()) ;
277 man->SetSpecificStorage(Form("%s/*", AliQA::GetQAOCDBDirName()), AliQA::GetQARefStorage()) ;
278 }
279 char detOCDBDir[10] ;
280 sprintf(detOCDBDir, "%s/%s/%s", AliQA::GetQAOCDBDirName(), AliQA::GetDetName((Int_t)det), AliQA::GetRefOCDBDirName()) ;
281 AliInfo(Form("Retrieving reference data from %s/%s for %s", AliQA::GetQARefStorage(), detOCDBDir, AliQA::GetTaskName(task).Data())) ;
282 AliCDBEntry* entry = man->Get(detOCDBDir, 0) ; //FIXME 0 --> Run Number
4edbc5bc 283 TList * listDetQAD = dynamic_cast<TList *>(entry->GetObject()) ;
284 if ( listDetQAD )
f73f556a 285 rv = dynamic_cast<TObjArray *>(listDetQAD->FindObject(AliQA::GetTaskName(task))) ;
4edbc5bc 286 return rv ;
287}
288
312e6f8d 289//_____________________________________________________________________________
290AliLoader * AliQADataMakerSteer::GetLoader(Int_t iDet)
291{
292 // get the loader for a detector
293
294 TString detName = AliQA::GetDetName(iDet) ;
295 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
296 if (fLoader[iDet])
297 return fLoader[iDet] ;
298
299 // load the QA data maker object
300 TPluginManager* pluginManager = gROOT->GetPluginManager() ;
301 TString loaderName = "Ali" + detName + "Loader" ;
302
303 AliLoader * loader = NULL ;
304 // first check if a plugin is defined for the quality assurance data maker
305 TPluginHandler* pluginHandler = pluginManager->FindHandler("AliLoader", detName) ;
306 // if not, add a plugin for it
307 if (!pluginHandler) {
308 AliDebug(1, Form("defining plugin for %s", loaderName.Data())) ;
309 TString libs = gSystem->GetLibraries() ;
310 if (libs.Contains("lib" + detName + "base.so") || (gSystem->Load("lib" + detName + "base.so") >= 0)) {
311 pluginManager->AddHandler("AliQADataMaker", detName, loaderName, detName + "loader", loaderName + "()") ;
312 } else {
313 pluginManager->AddHandler("AliLoader", detName, loaderName, detName, loaderName + "()") ;
314 }
315 pluginHandler = pluginManager->FindHandler("AliLoader", detName) ;
316 }
317 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
318 loader = (AliLoader *) pluginHandler->ExecPlugin(0) ;
319 }
320 if (loader)
321 fLoader[iDet] = loader ;
322 return loader ;
323}
324
325//_____________________________________________________________________________
04236e67 326AliQADataMaker * AliQADataMakerSteer::GetQADataMaker(const Int_t iDet, const char * mode )
312e6f8d 327{
328 // get the quality assurance data maker for a detector
329
330 if (fQADataMaker[iDet])
331 return fQADataMaker[iDet] ;
332
333 AliQADataMaker * qadm = NULL ;
334
335 if (fFirst) {
336 // load the QA data maker object
337 TPluginManager* pluginManager = gROOT->GetPluginManager() ;
338 TString detName = AliQA::GetDetName(iDet) ;
9afca7a6 339 TString tmp(mode) ;
340 if (tmp.Contains("sim"))
341 tmp.ReplaceAll("s", "S") ;
342 else if (tmp.Contains("rec"))
343 tmp.ReplaceAll("r", "R") ;
344 TString qadmName = "Ali" + detName + "QADataMaker" + tmp ;
312e6f8d 345
346 // first check if a plugin is defined for the quality assurance data maker
347 TPluginHandler* pluginHandler = pluginManager->FindHandler("AliQADataMaker", detName) ;
348 // if not, add a plugin for it
349 if (!pluginHandler) {
350 AliDebug(1, Form("defining plugin for %s", qadmName.Data())) ;
351 TString libs = gSystem->GetLibraries() ;
04236e67 352 if (libs.Contains("lib" + detName + mode + ".so") || (gSystem->Load("lib" + detName + mode + ".so") >= 0)) {
312e6f8d 353 pluginManager->AddHandler("AliQADataMaker", detName, qadmName, detName + "qadm", qadmName + "()") ;
354 } else {
355 pluginManager->AddHandler("AliQADataMaker", detName, qadmName, detName, qadmName + "()") ;
356 }
357 pluginHandler = pluginManager->FindHandler("AliQADataMaker", detName) ;
358 }
359 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
360 qadm = (AliQADataMaker *) pluginHandler->ExecPlugin(0) ;
361 }
362 if (qadm)
363 fQADataMaker[iDet] = qadm ;
364 }
365 return qadm ;
366}
367
368//_____________________________________________________________________________
04236e67 369Bool_t AliQADataMakerSteer::Init(const AliQA::TASKINDEX taskIndex, const char * mode, const char * input )
312e6f8d 370{
371 // Initialize the event source and QA data makers
372
6441b07a 373 if (taskIndex == AliQA::kRAWS) {
374 if (!fRawReader) {
375 TString fileName(input);
376 if (fileName.EndsWith("/")) {
377 fRawReader = new AliRawReaderFile(fileName);
378 } else if (fileName.EndsWith(".root")) {
379 fRawReader = new AliRawReaderRoot(fileName);
380 } else if (!fileName.IsNull()) {
381 fRawReader = new AliRawReaderDate(fileName);
382 fRawReader->SelectEvents(7);
383 }
4ecde5fc 384 }
312e6f8d 385 if ( ! fRawReader )
386 return kFALSE ;
fff5167b 387 fRawReaderDelete = kTRUE ;
312e6f8d 388 fRawReader->NextEvent() ;
389 fRunNumber = fRawReader->GetRunNumber() ;
04236e67 390 AliCDBManager::Instance()->SetRun(fRunNumber) ;
312e6f8d 391 fRawReader->RewindEvents();
392 fNumberOfEvents = 999999 ;
f0c6fb4b 393 if ( fMaxEvents < 0 )
394 fMaxEvents = fNumberOfEvents ;
395 } else if (taskIndex == AliQA::kESDS) {
ad265f3e 396 if (!gSystem->AccessPathName("AliESDs.root")) { // AliESDs.root exists
397 TFile * esdFile = TFile::Open("AliESDs.root") ;
398 fESDTree = dynamic_cast<TTree *> (esdFile->Get("esdTree")) ;
04236e67 399 if ( !fESDTree ) {
400 AliError("esdTree not found") ;
401 return kFALSE ;
402 } else {
403 fESD = new AliESDEvent() ;
404 fESD->ReadFromTree(fESDTree) ;
405 fESDTree->GetEntry(0) ;
406 fRunNumber = fESD->GetRunNumber() ;
407 fNumberOfEvents = fESDTree->GetEntries() ;
f0c6fb4b 408 if ( fMaxEvents < 0 )
409 fMaxEvents = fNumberOfEvents ;
04236e67 410 }
ad265f3e 411 } else {
412 AliError("AliESDs.root not found") ;
413 return kFALSE ;
414 }
312e6f8d 415 } else {
774ac967 416 if ( !InitRunLoader() ) {
417 AliWarning("No Run Loader not found") ;
312e6f8d 418 } else {
312e6f8d 419 fNumberOfEvents = fRunLoader->GetNumberOfEvents() ;
f0c6fb4b 420 if ( fMaxEvents < 0 )
421 fMaxEvents = fNumberOfEvents ;
422
312e6f8d 423 }
ad265f3e 424 }
774ac967 425 // Initialize all QA data makers for all detectors
312e6f8d 426 for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
fff5167b 427
4d52736b 428 if (IsSelected(AliQA::GetDetName(iDet))) {
04236e67 429 AliQADataMaker * qadm = GetQADataMaker(iDet, mode) ;
4d52736b 430 if (!qadm) {
fff5167b 431 AliError(Form("AliQADataMaker not found for %s", AliQA::GetDetName(iDet))) ;
432 fDetectorsW.ReplaceAll(AliQA::GetDetName(iDet), "") ;
4d52736b 433 } else {
fff5167b 434 AliDebug(1, Form("Data Maker found for %s", qadm->GetName())) ;
4d52736b 435 qadm->Init(taskIndex, fRunNumber, GetQACycles(iDet)) ;
436 qadm->StartOfCycle(taskIndex, fCycleSame) ;
437 }
312e6f8d 438 }
439 }
440 fFirst = kFALSE ;
441 return kTRUE ;
442}
443
444//_____________________________________________________________________________
445Bool_t AliQADataMakerSteer::InitRunLoader()
446{
447 // get or create the run loader
448 if (fRunLoader) {
c65c502a 449 fCycleSame = kTRUE ;
312e6f8d 450 return kTRUE ;
451 }
452
453 if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
454 // load all base libraries to get the loader classes
455 TString libs = gSystem->GetLibraries() ;
456 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
4d52736b 457 if (!IsSelected(AliQA::GetDetName(iDet)))
458 continue ;
312e6f8d 459 TString detName = AliQA::GetDetName(iDet) ;
460 if (detName == "HLT")
461 continue;
462 if (libs.Contains("lib" + detName + "base.so"))
463 continue;
464 gSystem->Load("lib" + detName + "base.so");
465 }
466 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data());
467 if (!fRunLoader) {
468 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
469 return kFALSE;
470 }
471 fRunLoader->CdGAFile();
472 if (fRunLoader->LoadgAlice() == 0) {
473 gAlice = fRunLoader->GetAliRun();
474 }
4d52736b 475
312e6f8d 476 if (!gAlice) {
477 AliError(Form("no gAlice object found in file %s", fGAliceFileName.Data()));
478 return kFALSE;
479 }
480
481 } else { // galice.root does not exist
482 AliError(Form("the file %s does not exist", fGAliceFileName.Data()));
483 return kFALSE;
484 }
485
486 return kTRUE;
487}
488
04236e67 489//_____________________________________________________________________________
490Bool_t AliQADataMakerSteer::IsSelected(const char * det)
491{
492 // check whether detName is contained in detectors
493 // if yes, it is removed from detectors
494
495 const TString detName(det) ;
496 // check if all detectors are selected
497 if ((fDetectors.CompareTo("ALL") == 0) ||
498 fDetectors.BeginsWith("ALL ") ||
499 fDetectors.EndsWith(" ALL") ||
500 fDetectors.Contains(" ALL ")) {
501 fDetectors = "ALL";
502 return kTRUE;
503 }
504
505 // search for the given detector
506 Bool_t rv = kFALSE;
fff5167b 507 //AliInfo(Form("SSSSSSSSSSSSS fd = %s det = %s ", fDetectors.Data(), det)) ;
04236e67 508 if ((fDetectors.CompareTo(detName) == 0) ||
509 fDetectors.BeginsWith(detName+" ") ||
510 fDetectors.EndsWith(" "+detName) ||
511 fDetectors.Contains(" "+detName+" ")) {
512 // fDetectors.ReplaceAll(detName, "");
513 rv = kTRUE;
514 }
515
516 // clean up the detectors string
517 // while (fDetectors.Contains(" "))
518 // fDetectors.ReplaceAll(" ", " ");
519 // while (fDetectors.BeginsWith(" "))
520 // fDetectors.Remove(0, 1);
521 // while (fDetectors.EndsWith(" "))
522 // fDetectors.Remove(fDetectors.Length()-1, 1);
523
524 return rv ;
525}
526
312e6f8d 527//_____________________________________________________________________________
4edbc5bc 528Bool_t AliQADataMakerSteer::Merge(const Int_t runNumber) const
315bba70 529{
567d83d9 530 // Merge all the cycles from all detectors in one single file per run
4edbc5bc 531 char cmd[80] ;
532 if ( runNumber == -1 )
533 sprintf(cmd, ".! ls *%s*.*.*.root > tempo.txt", AliQA::GetQADataFileName()) ;
534 else
535 sprintf(cmd, ".! ls *%s*.%d.*.root > tempo.txt", AliQA::GetQADataFileName(), runNumber) ;
536 gROOT->ProcessLine(cmd) ;
567d83d9 537 ifstream in("tempo.txt") ;
538 const Int_t runMax = 10 ;
539 TString file[AliQA::kNDET*runMax] ;
540 Int_t run[AliQA::kNDET*runMax] ;
541
542 Int_t index = 0 ;
543 while ( 1 ) {
4edbc5bc 544 in >> file[index] ;
567d83d9 545 if ( !in.good() )
546 break ;
e5dedfe2 547 AliInfo(Form("index = %d file = %s", index, (file[index]).Data())) ;
548 index++ ;
4edbc5bc 549 }
550
551 if ( index == 0 ) {
552 AliError(Form("run number %d not found", runNumber)) ;
553 return kFALSE ;
567d83d9 554 }
4edbc5bc 555
fff5167b 556 Int_t runIndex = 0 ;
557 Int_t runIndexMax = 0 ;
4edbc5bc 558 char stmp[10] ;
559 sprintf(stmp, ".%s.", AliQA::GetQADataFileName()) ;
dbf9dc0d 560 for (Int_t ifile = 0 ; ifile < index ; ifile++) {
567d83d9 561 TString tmp(file[ifile]) ;
562 tmp.ReplaceAll(".root", "") ;
563 TString det = tmp(0, tmp.Index(".")) ;
4edbc5bc 564 tmp.Remove(0, tmp.Index(stmp)+4) ;
567d83d9 565 TString ttmp = tmp(0, tmp.Index(".")) ;
566 Int_t newRun = ttmp.Atoi() ;
fff5167b 567 for (Int_t irun = 0; irun <= runIndexMax; irun++) {
436a9f16 568 if (newRun == run[irun])
569 break ;
567d83d9 570 run[runIndex] = newRun ;
567d83d9 571 runIndex++ ;
572 }
fff5167b 573 runIndexMax = runIndex ;
574 ttmp = tmp(tmp.Index(".")+1, tmp.Length()) ;
567d83d9 575 Int_t cycle = ttmp.Atoi() ;
fff5167b 576 AliDebug(1, Form("%s : det = %s run = %d cycle = %d \n", file[ifile].Data(), det.Data(), newRun, cycle)) ;
567d83d9 577 }
fff5167b 578 for (Int_t irun = 0 ; irun < runIndexMax ; irun++) {
567d83d9 579 TFileMerger merger ;
4edbc5bc 580 char outFileName[20] ;
436a9f16 581 sprintf(outFileName, "Merged.%s.%d.root", AliQA::GetQADataFileName(), run[irun]) ;
567d83d9 582 merger.OutputFile(outFileName) ;
583 for (Int_t ifile = 0 ; ifile < index-1 ; ifile++) {
584 char pattern[100] ;
436a9f16 585 sprintf(pattern, "%s.%d.", AliQA::GetQADataFileName(), run[irun]) ;
567d83d9 586 TString tmp(file[ifile]) ;
fff5167b 587 if (tmp.Contains(pattern)) {
567d83d9 588 merger.AddFile(tmp) ;
fff5167b 589 }
567d83d9 590 }
591 merger.Merge() ;
592 }
593
594 return kTRUE ;
315bba70 595}
596
c65c502a 597//_____________________________________________________________________________
fff5167b 598void AliQADataMakerSteer::Reset(const Bool_t sameCycle)
c65c502a 599{
600 // Reset the default data members
601 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
4d52736b 602 if (IsSelected(AliQA::GetDetName(iDet))) {
603 fLoader[iDet] = NULL;
604 if (fQADataMaker[iDet]) {
fff5167b 605 (fQADataMaker[iDet])->Reset(sameCycle) ;
4d52736b 606 //delete fQADataMaker[iDet] ;
607 //fQADataMaker[iDet] = NULL ;
608 }
c65c502a 609 }
610 }
611
6441b07a 612 if (fRawReaderDelete) {
613 delete fRawReader ;
614 fRawReader = NULL ;
615 }
c65c502a 616
fff5167b 617 fCycleSame = sameCycle ;
c65c502a 618 fESD = NULL ;
619 fESDTree = NULL ;
620 fFirst = kTRUE ;
774ac967 621 fNumberOfEvents = 999999 ;
c65c502a 622}
623
6441b07a 624//_____________________________________________________________________________
e5dedfe2 625TString AliQADataMakerSteer::Run(const char * detectors, AliRawReader * rawReader)
6441b07a 626{
627 //Runs all the QA data Maker for Raws only
e5dedfe2 628
4d52736b 629 fRawReader = rawReader ;
4d52736b 630 fDetectors = detectors ;
e5dedfe2 631 fDetectorsW = detectors ;
632
633 if ( !Init(AliQA::kRAWS, "rec") )
634 return kFALSE ;
635 fRawReaderDelete = kFALSE ;
636
637 DoIt(AliQA::kRAWS, "rec") ;
638 return fDetectorsW ;
04236e67 639}
640
641//_____________________________________________________________________________
fff5167b 642TString AliQADataMakerSteer::Run(const char * detectors, const char * fileName)
04236e67 643{
644 //Runs all the QA data Maker for Raws only
e5dedfe2 645
04236e67 646 fDetectors = detectors ;
e5dedfe2 647 fDetectorsW = detectors ;
04236e67 648
1aa42107 649 if ( !Init(AliQA::kRAWS, "rec", fileName) )
04236e67 650 return kFALSE ;
651
fff5167b 652 DoIt(AliQA::kRAWS, "rec") ;
653 return fDetectorsW ;
6441b07a 654}
655
312e6f8d 656//_____________________________________________________________________________
e5dedfe2 657TString AliQADataMakerSteer::Run(const char * detectors, const AliQA::TASKINDEX taskIndex, const char * fileName )
312e6f8d 658{
659 // Runs all the QA data Maker for every detector
6441b07a 660
e5dedfe2 661 fDetectors = detectors ;
662 fDetectorsW = detectors ;
04236e67 663
664 char * mode ;
665 if ( (taskIndex == AliQA::kHITS) || (taskIndex == AliQA::kSDIGITS) || (taskIndex == AliQA::kDIGITS) )
1aa42107 666 mode = "sim" ;
04236e67 667 else if ( (taskIndex == AliQA::kRAWS) || (taskIndex == AliQA::kRECPOINTS) || (taskIndex == AliQA::kESDS) )
1aa42107 668 mode = "rec" ;
04236e67 669 else {
670 AliError(Form("%s not implemented", AliQA::GetTaskName(taskIndex).Data())) ;
e5dedfe2 671 return "" ;
04236e67 672 }
fff5167b 673
04236e67 674 if ( !Init(taskIndex, mode, fileName) )
312e6f8d 675 return kFALSE ;
fff5167b 676
e5dedfe2 677 DoIt(taskIndex, mode) ;
4d52736b 678
e5dedfe2 679 return fDetectorsW ;
6441b07a 680
14e1eccc 681}
4edbc5bc 682
683//_____________________________________________________________________________
684Bool_t AliQADataMakerSteer::Save2OCDB(const Int_t runNumber, const Int_t cycleNumber, const char * detectors) const
685{
686 // take the locasl QA data merge into a single file and save in OCDB
687 Bool_t rv = kTRUE ;
688 TString tmp(AliQA::GetQARefStorage()) ;
689 if ( tmp.IsNull() ) {
690 AliError("No storage defined, use AliQA::SetQARefStorage") ;
691 return kFALSE ;
692 }
693 if ( !(tmp.Contains(AliQA::GetLabLocalOCDB()) || tmp.Contains(AliQA::GetLabAliEnOCDB())) ) {
694 AliError(Form("%s is a wrong storage, use %s or %s", AliQA::GetQARefStorage(), AliQA::GetLabLocalOCDB().Data(), AliQA::GetLabAliEnOCDB().Data())) ;
695 return kFALSE ;
696 }
697 TString sdet(detectors) ;
698 sdet.ToUpper() ;
699 TFile * inputFile ;
700 if ( sdet.Contains("ALL") ) {
701 rv = Merge(runNumber) ;
702 if ( ! rv )
703 return kFALSE ;
704 char inputFileName[20] ;
705 sprintf(inputFileName, "Merged.%s.%d.root", AliQA::GetQADataFileName(), runNumber) ;
706 inputFile = TFile::Open(inputFileName) ;
f73f556a 707 rv = SaveIt2OCDB(runNumber, inputFile) ;
4edbc5bc 708 } else {
709 for (Int_t index = 0; index < AliQA::kNDET; index++) {
710 if (sdet.Contains(AliQA::GetDetName(index))) {
711 char inputFileName[20] ;
712 sprintf(inputFileName, "%s.%s.%d.%d.root", AliQA::GetDetName(index), AliQA::GetQADataFileName(), runNumber, cycleNumber) ;
713 inputFile = TFile::Open(inputFileName) ;
f73f556a 714 rv *= SaveIt2OCDB(runNumber, inputFile) ;
4edbc5bc 715 }
716 }
717 }
718 return rv ;
719}
720
721//_____________________________________________________________________________
f73f556a 722Bool_t AliQADataMakerSteer::SaveIt2OCDB(const Int_t runNumber, TFile * inputFile) const
4edbc5bc 723{
724 // reads the TH1 from file and adds it to appropriate list before saving to OCDB
725 Bool_t rv = kTRUE ;
726 AliInfo(Form("Saving TH1s in %s to %s", inputFile->GetName(), AliQA::GetQARefStorage())) ;
727 AliCDBManager* man = AliCDBManager::Instance() ;
f73f556a 728 if ( ! man->IsDefaultStorageSet() ) {
729 man->SetDefaultStorage(AliQA::GetQARefDefaultStorage()) ;
730 man->SetSpecificStorage(Form("%s/*", AliQA::GetQAOCDBDirName()), AliQA::GetQARefStorage()) ;
731 }
04236e67 732 if(man->GetRun() < 0)
733 man->SetRun(runNumber);
734
4edbc5bc 735 for ( Int_t detIndex = 0 ; detIndex < AliQA::kNDET ; detIndex++) {
736 TDirectory * detDir = inputFile->GetDirectory(AliQA::GetDetName(detIndex)) ;
737 if ( detDir ) {
738 AliInfo(Form("Entering %s", detDir->GetName())) ;
f73f556a 739 char detOCDBDir[20] ;
740 sprintf(detOCDBDir, "%s/%s/%s", AliQA::GetQAOCDBDirName(), AliQA::GetDetName(detIndex), AliQA::GetRefOCDBDirName()) ;
741 AliCDBId idr(detOCDBDir, runNumber, 999999999) ;
4edbc5bc 742 TList * listDetQAD = new TList() ;
743 char listName[20] ;
744 sprintf(listName, "%s QA data Reference", AliQA::GetDetName(detIndex)) ;
745 listDetQAD->SetName(listName) ;
746 TList * taskList = detDir->GetListOfKeys() ;
747 TIter nextTask(taskList) ;
748 TKey * taskKey ;
749 while ( (taskKey = dynamic_cast<TKey*>(nextTask())) ) {
750 TDirectory * taskDir = detDir->GetDirectory(taskKey->GetName()) ;
751 AliInfo(Form("Saving %s", taskDir->GetName())) ;
f73f556a 752 TObjArray * listTaskQAD = new TObjArray(100) ;
4edbc5bc 753 listTaskQAD->SetName(taskKey->GetName()) ;
754 listDetQAD->Add(listTaskQAD) ;
755 TList * histList = taskDir->GetListOfKeys() ;
756 TIter nextHist(histList) ;
757 TKey * histKey ;
758 while ( (histKey = dynamic_cast<TKey*>(nextHist())) ) {
759 TObject * odata = taskDir->Get(histKey->GetName()) ;
760 if ( odata->IsA()->InheritsFrom("TH1") ) {
761 AliInfo(Form("Adding %s", histKey->GetName())) ;
762 TH1 * hdata = static_cast<TH1*>(odata) ;
763 listTaskQAD->Add(hdata) ;
764 }
765 }
766 }
767 AliCDBMetaData mdr ;
768 man->Put(listDetQAD, idr, &mdr) ;
769 }
770 }
771 return rv ;
772}
a6f6970e 773