1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
20 #include <TFileMerger.h>
21 #include <TPluginManager.h>
26 #include "AliCDBManager.h"
27 #include "AliCDBEntry.h"
29 #include "AliCDBMetaData.h"
30 #include "AliESDEvent.h"
31 #include "AliHeader.h"
33 #include "AliModule.h"
35 #include "AliQADataMakerRec.h"
36 #include "AliQADataMakerSim.h"
37 #include "AliQADataMakerSteer.h"
38 #include "AliRawReaderDate.h"
39 #include "AliRawReaderFile.h"
40 #include "AliRawReaderRoot.h"
42 #include "AliRunLoader.h"
44 ClassImp(AliQADataMakerSteer)
46 //_____________________________________________________________________________
47 AliQADataMakerSteer::AliQADataMakerSteer(const char* gAliceFilename, const char * name, const char * title) :
54 fGAliceFileName(gAliceFilename),
56 fNumberOfEvents(999999),
58 fRawReaderDelete(kTRUE),
62 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
63 if (IsSelected(AliQA::GetDetName(iDet))) {
64 fLoader[iDet] = NULL ;
65 fQADataMaker[iDet] = NULL ;
66 fQACycles[iDet] = 999999 ;
71 //_____________________________________________________________________________
72 AliQADataMakerSteer::AliQADataMakerSteer(const AliQADataMakerSteer & qas) :
75 fDetectors(qas.fDetectors),
79 fGAliceFileName(qas.fGAliceFileName),
80 fRunNumber(qas.fRunNumber),
81 fNumberOfEvents(qas.fNumberOfEvents),
83 fRawReaderDelete(kTRUE),
87 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
88 fLoader[iDet] = qas.fLoader[iDet] ;
89 fQADataMaker[iDet] = qas.fQADataMaker[iDet] ;
90 fQACycles[iDet] = qas.fQACycles[iDet] ;
94 //_____________________________________________________________________________
95 AliQADataMakerSteer & AliQADataMakerSteer::operator = (const AliQADataMakerSteer & qas)
97 // assignment operator
98 this->~AliQADataMakerSteer() ;
99 new(this) AliQADataMakerSteer(qas) ;
103 //_____________________________________________________________________________
104 AliQADataMakerSteer::~AliQADataMakerSteer()
107 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
108 if (IsSelected(AliQA::GetDetName(iDet))) {
109 fLoader[iDet] = NULL;
110 if (fQADataMaker[iDet]) {
111 (fQADataMaker[iDet])->Finish() ;
112 delete fQADataMaker[iDet] ;
113 fQADataMaker[iDet] = NULL ;
118 if (fRawReaderDelete) {
125 //_____________________________________________________________________________
126 Bool_t AliQADataMakerSteer::DoIt(const AliQA::TASKINDEX taskIndex, const char * mode)
128 // Runs all the QA data Maker for every detector
131 // Fill QA data in event loop
132 for (UInt_t iEvent = 0 ; iEvent < fNumberOfEvents ; iEvent++) {
134 AliDebug(1, Form("processing event %d", iEvent));
135 if ( taskIndex == AliQA::kRAWS ) {
136 if ( !fRawReader->NextEvent() )
138 } else if ( taskIndex == AliQA::kESDS ) {
139 if ( fESDTree->GetEntry(iEvent) == 0 )
142 if ( fRunLoader->GetEvent(iEvent) != 0 )
145 // loop over detectors
146 TObjArray* detArray = NULL ;
147 if (fRunLoader) // check if RunLoader exists
148 if ( fRunLoader->GetAliRun() ) // check if AliRun exists in gAlice.root
149 detArray = fRunLoader->GetAliRun()->Detectors() ;
150 for (UInt_t iDet = 0 ; iDet < fgkNDetectors ; iDet++) {
152 AliModule* det = static_cast<AliModule*>(detArray->FindObject(AliQA::GetDetName(iDet))) ;
153 if (!det || !det->IsActive())
156 if (!IsSelected(AliQA::GetDetName(iDet)))
158 AliQADataMaker * qadm = GetQADataMaker(iDet, mode) ;
162 if ( qadm->IsCycleDone() ) {
163 qadm->EndOfCycle(AliQA::kRAWS) ;
164 qadm->StartOfCycle(AliQA::kRAWS) ;
169 qadm->Exec(taskIndex, fRawReader) ;
172 GetLoader(iDet)->LoadHits() ;
173 data = GetLoader(iDet)->TreeH() ;
175 AliWarning(Form(" Hit Tree not found for %s", AliQA::GetDetName(iDet))) ;
177 qadm->Exec(taskIndex, data) ;
180 case AliQA::kSDIGITS :
181 GetLoader(iDet)->LoadSDigits() ;
182 data = GetLoader(iDet)->TreeS() ;
184 AliWarning(Form(" SDigit Tree not found for %s", AliQA::GetDetName(iDet))) ;
186 qadm->Exec(taskIndex, data) ;
189 case AliQA::kDIGITS :
190 GetLoader(iDet)->LoadDigits() ;
191 data = GetLoader(iDet)->TreeD() ;
193 AliWarning(Form(" Digit Tree not found for %s", AliQA::GetDetName(iDet))) ;
195 qadm->Exec(taskIndex, data) ;
198 case AliQA::kRECPOINTS :
199 GetLoader(iDet)->LoadRecPoints() ;
200 data = GetLoader(iDet)->TreeR() ;
202 AliWarning(Form("RecPoints not found for %s", AliQA::GetDetName(iDet))) ;
204 qadm->Exec(taskIndex, data) ;
207 case AliQA::kTRACKSEGMENTS :
209 case AliQA::kRECPARTICLES :
212 qadm->Exec(taskIndex, fESD) ;
214 case AliQA::kNTASKINDEX :
221 // Save QA data for all detectors
222 rv = Finish(taskIndex, mode) ;
226 //_____________________________________________________________________________
227 Bool_t AliQADataMakerSteer::Finish(const AliQA::TASKINDEX taskIndex, const char * mode)
229 // write output to file for all detectors
230 for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
231 if (IsSelected(AliQA::GetDetName(iDet))) {
232 AliQADataMaker * qadm = GetQADataMaker(iDet, mode) ;
234 qadm->EndOfCycle(taskIndex) ;
241 //_____________________________________________________________________________
242 TObjArray * AliQADataMakerSteer::GetFromOCDB(AliQA::DETECTORINDEX det, AliQA::TASKINDEX task) const
244 // Retrieve the list of QA data for a given detector and a given task
245 TObjArray * rv = NULL ;
246 TString tmp(AliQA::GetQARefStorage()) ;
247 if ( tmp.IsNull() ) {
248 AliError("No storage defined, use AliQA::SetQARefStorage") ;
251 AliCDBManager* man = AliCDBManager::Instance() ;
252 if ( ! man->IsDefaultStorageSet() ) {
253 man->SetDefaultStorage(AliQA::GetQARefDefaultStorage()) ;
254 man->SetSpecificStorage(Form("%s/*", AliQA::GetQAOCDBDirName()), AliQA::GetQARefStorage()) ;
256 char detOCDBDir[10] ;
257 sprintf(detOCDBDir, "%s/%s/%s", AliQA::GetQAOCDBDirName(), AliQA::GetDetName((Int_t)det), AliQA::GetRefOCDBDirName()) ;
258 AliInfo(Form("Retrieving reference data from %s/%s for %s", AliQA::GetQARefStorage(), detOCDBDir, AliQA::GetTaskName(task).Data())) ;
259 AliCDBEntry* entry = man->Get(detOCDBDir, 0) ; //FIXME 0 --> Run Number
260 TList * listDetQAD = dynamic_cast<TList *>(entry->GetObject()) ;
262 rv = dynamic_cast<TObjArray *>(listDetQAD->FindObject(AliQA::GetTaskName(task))) ;
266 //_____________________________________________________________________________
267 AliLoader * AliQADataMakerSteer::GetLoader(Int_t iDet)
269 // get the loader for a detector
271 TString detName = AliQA::GetDetName(iDet) ;
272 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
274 return fLoader[iDet] ;
276 // load the QA data maker object
277 TPluginManager* pluginManager = gROOT->GetPluginManager() ;
278 TString loaderName = "Ali" + detName + "Loader" ;
280 AliLoader * loader = NULL ;
281 // first check if a plugin is defined for the quality assurance data maker
282 TPluginHandler* pluginHandler = pluginManager->FindHandler("AliLoader", detName) ;
283 // if not, add a plugin for it
284 if (!pluginHandler) {
285 AliDebug(1, Form("defining plugin for %s", loaderName.Data())) ;
286 TString libs = gSystem->GetLibraries() ;
287 if (libs.Contains("lib" + detName + "base.so") || (gSystem->Load("lib" + detName + "base.so") >= 0)) {
288 pluginManager->AddHandler("AliQADataMaker", detName, loaderName, detName + "loader", loaderName + "()") ;
290 pluginManager->AddHandler("AliLoader", detName, loaderName, detName, loaderName + "()") ;
292 pluginHandler = pluginManager->FindHandler("AliLoader", detName) ;
294 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
295 loader = (AliLoader *) pluginHandler->ExecPlugin(0) ;
298 fLoader[iDet] = loader ;
302 //_____________________________________________________________________________
303 AliQADataMaker * AliQADataMakerSteer::GetQADataMaker(const Int_t iDet, const char * mode )
305 // get the quality assurance data maker for a detector
307 if (fQADataMaker[iDet])
308 return fQADataMaker[iDet] ;
310 AliQADataMaker * qadm = NULL ;
313 // load the QA data maker object
314 TPluginManager* pluginManager = gROOT->GetPluginManager() ;
315 TString detName = AliQA::GetDetName(iDet) ;
317 if (tmp.Contains("sim"))
318 tmp.ReplaceAll("s", "S") ;
319 else if (tmp.Contains("rec"))
320 tmp.ReplaceAll("r", "R") ;
321 TString qadmName = "Ali" + detName + "QADataMaker" + tmp ;
323 // first check if a plugin is defined for the quality assurance data maker
324 TPluginHandler* pluginHandler = pluginManager->FindHandler("AliQADataMaker", detName) ;
325 // if not, add a plugin for it
326 if (!pluginHandler) {
327 AliDebug(1, Form("defining plugin for %s", qadmName.Data())) ;
328 TString libs = gSystem->GetLibraries() ;
329 if (libs.Contains("lib" + detName + mode + ".so") || (gSystem->Load("lib" + detName + mode + ".so") >= 0)) {
330 pluginManager->AddHandler("AliQADataMaker", detName, qadmName, detName + "qadm", qadmName + "()") ;
332 pluginManager->AddHandler("AliQADataMaker", detName, qadmName, detName, qadmName + "()") ;
334 pluginHandler = pluginManager->FindHandler("AliQADataMaker", detName) ;
336 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
337 qadm = (AliQADataMaker *) pluginHandler->ExecPlugin(0) ;
340 fQADataMaker[iDet] = qadm ;
345 //_____________________________________________________________________________
346 Bool_t AliQADataMakerSteer::Init(const AliQA::TASKINDEX taskIndex, const char * mode, const char * input )
348 // Initialize the event source and QA data makers
350 if (taskIndex == AliQA::kRAWS) {
352 TString fileName(input);
353 if (fileName.EndsWith("/")) {
354 fRawReader = new AliRawReaderFile(fileName);
355 } else if (fileName.EndsWith(".root")) {
356 fRawReader = new AliRawReaderRoot(fileName);
357 } else if (!fileName.IsNull()) {
358 fRawReader = new AliRawReaderDate(fileName);
359 fRawReader->SelectEvents(7);
364 fRawReaderDelete = kFALSE ;
365 fRawReader->NextEvent() ;
366 fRunNumber = fRawReader->GetRunNumber() ;
367 AliCDBManager::Instance()->SetRun(fRunNumber) ;
368 fRawReader->RewindEvents();
369 fNumberOfEvents = 999999 ;
370 } else if (taskIndex == AliQA::kESDS) {
371 if (!gSystem->AccessPathName("AliESDs.root")) { // AliESDs.root exists
372 TFile * esdFile = TFile::Open("AliESDs.root") ;
373 fESDTree = dynamic_cast<TTree *> (esdFile->Get("esdTree")) ;
375 AliError("esdTree not found") ;
378 fESD = new AliESDEvent() ;
379 fESD->ReadFromTree(fESDTree) ;
380 fESDTree->GetEntry(0) ;
381 fRunNumber = fESD->GetRunNumber() ;
382 fNumberOfEvents = fESDTree->GetEntries() ;
385 AliError("AliESDs.root not found") ;
389 if ( !InitRunLoader() ) {
390 AliWarning("No Run Loader not found") ;
392 fNumberOfEvents = fRunLoader->GetNumberOfEvents() ;
395 // Initialize all QA data makers for all detectors
396 for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
397 if (IsSelected(AliQA::GetDetName(iDet))) {
398 AliQADataMaker * qadm = GetQADataMaker(iDet, mode) ;
400 AliWarning(Form("AliQADataMaker not found for %s", AliQA::GetDetName(iDet))) ;
402 AliInfo(Form("Data Maker found for %s", qadm->GetName())) ;
403 qadm->Init(taskIndex, fRunNumber, GetQACycles(iDet)) ;
404 qadm->StartOfCycle(taskIndex, fCycleSame) ;
412 //_____________________________________________________________________________
413 Bool_t AliQADataMakerSteer::InitRunLoader()
415 // get or create the run loader
421 if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
422 // load all base libraries to get the loader classes
423 TString libs = gSystem->GetLibraries() ;
424 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
425 if (!IsSelected(AliQA::GetDetName(iDet)))
427 TString detName = AliQA::GetDetName(iDet) ;
428 if (detName == "HLT")
430 if (libs.Contains("lib" + detName + "base.so"))
432 gSystem->Load("lib" + detName + "base.so");
434 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data());
436 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
439 fRunLoader->CdGAFile();
440 if (fRunLoader->LoadgAlice() == 0) {
441 gAlice = fRunLoader->GetAliRun();
445 AliError(Form("no gAlice object found in file %s", fGAliceFileName.Data()));
449 } else { // galice.root does not exist
450 AliError(Form("the file %s does not exist", fGAliceFileName.Data()));
457 //_____________________________________________________________________________
458 Bool_t AliQADataMakerSteer::IsSelected(const char * det)
460 // check whether detName is contained in detectors
461 // if yes, it is removed from detectors
463 const TString detName(det) ;
464 // check if all detectors are selected
465 if ((fDetectors.CompareTo("ALL") == 0) ||
466 fDetectors.BeginsWith("ALL ") ||
467 fDetectors.EndsWith(" ALL") ||
468 fDetectors.Contains(" ALL ")) {
473 // search for the given detector
475 if ((fDetectors.CompareTo(detName) == 0) ||
476 fDetectors.BeginsWith(detName+" ") ||
477 fDetectors.EndsWith(" "+detName) ||
478 fDetectors.Contains(" "+detName+" ")) {
479 // fDetectors.ReplaceAll(detName, "");
483 // clean up the detectors string
484 // while (fDetectors.Contains(" "))
485 // fDetectors.ReplaceAll(" ", " ");
486 // while (fDetectors.BeginsWith(" "))
487 // fDetectors.Remove(0, 1);
488 // while (fDetectors.EndsWith(" "))
489 // fDetectors.Remove(fDetectors.Length()-1, 1);
494 //_____________________________________________________________________________
495 Bool_t AliQADataMakerSteer::Merge(const Int_t runNumber) const
497 // Merge all the cycles from all detectors in one single file per run
499 if ( runNumber == -1 )
500 sprintf(cmd, ".! ls *%s*.*.*.root > tempo.txt", AliQA::GetQADataFileName()) ;
502 sprintf(cmd, ".! ls *%s*.%d.*.root > tempo.txt", AliQA::GetQADataFileName(), runNumber) ;
503 gROOT->ProcessLine(cmd) ;
504 ifstream in("tempo.txt") ;
505 const Int_t runMax = 10 ;
506 TString file[AliQA::kNDET*runMax] ;
507 Int_t run[AliQA::kNDET*runMax] ;
518 AliError(Form("run number %d not found", runNumber)) ;
524 sprintf(stmp, ".%s.", AliQA::GetQADataFileName()) ;
525 for (Int_t ifile = 0 ; ifile < index-1 ; ifile++) {
526 TString tmp(file[ifile]) ;
527 tmp.ReplaceAll(".root", "") ;
528 TString det = tmp(0, tmp.Index(".")) ;
529 tmp.Remove(0, tmp.Index(stmp)+4) ;
530 TString ttmp = tmp(0, tmp.Index(".")) ;
531 Int_t newRun = ttmp.Atoi() ;
532 for (Int_t irun = 0; irun < runIndex; irun++) {
533 if (newRun == run[irun])
535 run[runIndex] = newRun ;
538 ttmp = tmp(tmp.Index("."), tmp.Length()) ;
539 Int_t cycle = ttmp.Atoi() ;
540 AliInfo(Form("%s : det = %s run = %d cycle = %d \n", file[ifile].Data(), det.Data(), newRun, cycle)) ;
542 for (Int_t irun = 0 ; irun < runIndex ; irun++) {
544 char outFileName[20] ;
545 sprintf(outFileName, "Merged.%s.%d.root", AliQA::GetQADataFileName(), run[irun]) ;
546 merger.OutputFile(outFileName) ;
547 for (Int_t ifile = 0 ; ifile < index-1 ; ifile++) {
549 sprintf(pattern, "%s.%d.", AliQA::GetQADataFileName(), run[irun]) ;
550 TString tmp(file[ifile]) ;
551 if (tmp.Contains(pattern))
552 merger.AddFile(tmp) ;
560 //_____________________________________________________________________________
561 void AliQADataMakerSteer::Reset()
563 // Reset the default data members
564 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
565 if (IsSelected(AliQA::GetDetName(iDet))) {
566 fLoader[iDet] = NULL;
567 if (fQADataMaker[iDet]) {
568 (fQADataMaker[iDet])->Reset() ;
569 //delete fQADataMaker[iDet] ;
570 //fQADataMaker[iDet] = NULL ;
575 if (fRawReaderDelete) {
580 fCycleSame = kFALSE ;
584 fNumberOfEvents = 999999 ;
587 //_____________________________________________________________________________
588 Bool_t AliQADataMakerSteer::Run(const char * detectors, AliRawReader * rawReader)
590 //Runs all the QA data Maker for Raws only
591 fRawReader = rawReader ;
592 fRawReaderDelete = kFALSE ;
594 fDetectors = detectors ;
596 // Initialize all QA data makers for all detectors
597 for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
598 if (IsSelected(AliQA::GetDetName(iDet))) {
599 AliQADataMaker * qadm = GetQADataMaker(iDet, "rec") ;
601 AliWarning(Form("AliQADataMaker not found for %s", AliQA::GetDetName(iDet))) ;
603 AliInfo(Form("Data Maker found for %s", qadm->GetName())) ;
604 qadm->Init(AliQA::kRAWS, fRunNumber, GetQACycles(iDet)) ;
605 qadm->StartOfCycle(AliQA::kRAWS, fCycleSame) ;
611 return DoIt(AliQA::kRAWS, "rec") ;
614 //_____________________________________________________________________________
615 Bool_t AliQADataMakerSteer::Run(const char * detectors, const char * fileName)
617 //Runs all the QA data Maker for Raws only
619 fDetectors = detectors ;
621 if ( !Init(AliQA::kRAWS, "rec", fileName) )
624 // Initialize all QA data makers for all detectors
625 for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
626 if (IsSelected(AliQA::GetDetName(iDet))) {
627 AliQADataMaker * qadm = GetQADataMaker(iDet, "rec") ;
629 AliWarning(Form("AliQADataMaker not found for %s", AliQA::GetDetName(iDet))) ;
631 AliInfo(Form("Data Maker found for %s", qadm->GetName())) ;
632 qadm->Init(AliQA::kRAWS, fRunNumber, GetQACycles(iDet)) ;
633 qadm->StartOfCycle(AliQA::kRAWS, fCycleSame) ;
639 return DoIt(AliQA::kRAWS, "rec") ;
642 //_____________________________________________________________________________
643 Bool_t AliQADataMakerSteer::Run(const char * detectors, const AliQA::TASKINDEX taskIndex, const char * fileName )
645 // Runs all the QA data Maker for every detector
648 fDetectors = detectors ;
651 if ( (taskIndex == AliQA::kHITS) || (taskIndex == AliQA::kSDIGITS) || (taskIndex == AliQA::kDIGITS) )
653 else if ( (taskIndex == AliQA::kRAWS) || (taskIndex == AliQA::kRECPOINTS) || (taskIndex == AliQA::kESDS) )
656 AliError(Form("%s not implemented", AliQA::GetTaskName(taskIndex).Data())) ;
660 if ( !Init(taskIndex, mode, fileName) )
663 rv = DoIt(taskIndex, mode) ;
669 //_____________________________________________________________________________
670 Bool_t AliQADataMakerSteer::Save2OCDB(const Int_t runNumber, const Int_t cycleNumber, const char * detectors) const
672 // take the locasl QA data merge into a single file and save in OCDB
674 TString tmp(AliQA::GetQARefStorage()) ;
675 if ( tmp.IsNull() ) {
676 AliError("No storage defined, use AliQA::SetQARefStorage") ;
679 if ( !(tmp.Contains(AliQA::GetLabLocalOCDB()) || tmp.Contains(AliQA::GetLabAliEnOCDB())) ) {
680 AliError(Form("%s is a wrong storage, use %s or %s", AliQA::GetQARefStorage(), AliQA::GetLabLocalOCDB().Data(), AliQA::GetLabAliEnOCDB().Data())) ;
683 TString sdet(detectors) ;
686 if ( sdet.Contains("ALL") ) {
687 rv = Merge(runNumber) ;
690 char inputFileName[20] ;
691 sprintf(inputFileName, "Merged.%s.%d.root", AliQA::GetQADataFileName(), runNumber) ;
692 inputFile = TFile::Open(inputFileName) ;
693 rv = SaveIt2OCDB(runNumber, inputFile) ;
695 for (Int_t index = 0; index < AliQA::kNDET; index++) {
696 if (sdet.Contains(AliQA::GetDetName(index))) {
697 char inputFileName[20] ;
698 sprintf(inputFileName, "%s.%s.%d.%d.root", AliQA::GetDetName(index), AliQA::GetQADataFileName(), runNumber, cycleNumber) ;
699 inputFile = TFile::Open(inputFileName) ;
700 rv *= SaveIt2OCDB(runNumber, inputFile) ;
707 //_____________________________________________________________________________
708 Bool_t AliQADataMakerSteer::SaveIt2OCDB(const Int_t runNumber, TFile * inputFile) const
710 // reads the TH1 from file and adds it to appropriate list before saving to OCDB
712 AliInfo(Form("Saving TH1s in %s to %s", inputFile->GetName(), AliQA::GetQARefStorage())) ;
713 AliCDBManager* man = AliCDBManager::Instance() ;
714 if ( ! man->IsDefaultStorageSet() ) {
715 man->SetDefaultStorage(AliQA::GetQARefDefaultStorage()) ;
716 man->SetSpecificStorage(Form("%s/*", AliQA::GetQAOCDBDirName()), AliQA::GetQARefStorage()) ;
718 if(man->GetRun() < 0)
719 man->SetRun(runNumber);
721 for ( Int_t detIndex = 0 ; detIndex < AliQA::kNDET ; detIndex++) {
722 TDirectory * detDir = inputFile->GetDirectory(AliQA::GetDetName(detIndex)) ;
724 AliInfo(Form("Entering %s", detDir->GetName())) ;
725 char detOCDBDir[20] ;
726 sprintf(detOCDBDir, "%s/%s/%s", AliQA::GetQAOCDBDirName(), AliQA::GetDetName(detIndex), AliQA::GetRefOCDBDirName()) ;
727 AliCDBId idr(detOCDBDir, runNumber, 999999999) ;
728 TList * listDetQAD = new TList() ;
730 sprintf(listName, "%s QA data Reference", AliQA::GetDetName(detIndex)) ;
731 listDetQAD->SetName(listName) ;
732 TList * taskList = detDir->GetListOfKeys() ;
733 TIter nextTask(taskList) ;
735 while ( (taskKey = dynamic_cast<TKey*>(nextTask())) ) {
736 TDirectory * taskDir = detDir->GetDirectory(taskKey->GetName()) ;
737 AliInfo(Form("Saving %s", taskDir->GetName())) ;
738 TObjArray * listTaskQAD = new TObjArray(100) ;
739 listTaskQAD->SetName(taskKey->GetName()) ;
740 listDetQAD->Add(listTaskQAD) ;
741 TList * histList = taskDir->GetListOfKeys() ;
742 TIter nextHist(histList) ;
744 while ( (histKey = dynamic_cast<TKey*>(nextHist())) ) {
745 TObject * odata = taskDir->Get(histKey->GetName()) ;
746 if ( odata->IsA()->InheritsFrom("TH1") ) {
747 AliInfo(Form("Adding %s", histKey->GetName())) ;
748 TH1 * hdata = static_cast<TH1*>(odata) ;
749 listTaskQAD->Add(hdata) ;
754 man->Put(listDetQAD, idr, &mdr) ;