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 **************************************************************************/
16 /* $Id: AliQAManager.cxx 30894 2009-02-05 13:46:48Z schutz $ */
17 ///////////////////////////////////////////////////////////////////////////////
19 // class for running the QA makers //
21 // AliQAManager qas; //
22 // qas.Run(AliQAv1::kRAWS, rawROOTFileName); //
23 // qas.Run(AliQAv1::kHITS); //
24 // qas.Run(AliQAv1::kSDIGITS); //
25 // qas.Run(AliQAv1::kDIGITS); //
26 // qas.Run(AliQAv1::kRECPOINTS); //
27 // qas.Run(AliQAv1::kESDS); //
29 ///////////////////////////////////////////////////////////////////////////////
34 #include <TFileMerger.h>
36 #include <TGridCollection.h>
37 #include <TGridResult.h>
38 #include <TPluginManager.h>
42 #include <TStopwatch.h>
44 #include "AliCDBManager.h"
45 #include "AliCDBEntry.h"
47 #include "AliCDBMetaData.h"
48 #include "AliCodeTimer.h"
49 #include "AliCorrQADataMakerRec.h"
50 #include "AliDetectorRecoParam.h"
51 #include "AliESDEvent.h"
52 #include "AliGeomManager.h"
53 #include "AliGlobalQADataMaker.h"
54 #include "AliHeader.h"
56 #include "AliModule.h"
58 #include "AliQAChecker.h"
59 #include "AliQACheckerBase.h"
60 #include "AliQADataMakerRec.h"
61 #include "AliQADataMakerSim.h"
62 #include "AliQAManager.h"
63 #include "AliRawReaderDate.h"
64 #include "AliRawReaderFile.h"
65 #include "AliRawReaderRoot.h"
67 #include "AliRunLoader.h"
68 #include "AliRunTag.h"
70 ClassImp(AliQAManager)
71 AliQAManager* AliQAManager::fgQAInstance = 0x0;
73 //_____________________________________________________________________________
74 AliQAManager::AliQAManager() :
86 fNumberOfEvents(999999),
90 fRawReaderDelete(kTRUE),
93 fEventSpecie(AliRecoParam::kDefault),
98 fMaxEvents = fNumberOfEvents ;
99 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
100 if (IsSelected(AliQAv1::GetDetName(iDet))) {
101 fLoader[iDet] = NULL ;
102 fQADataMaker[iDet] = NULL ;
103 fQACycles[iDet] = 999999 ;
109 //_____________________________________________________________________________
110 AliQAManager::AliQAManager(AliQAv1::MODE_t mode, const Char_t* gAliceFilename) :
118 fGAliceFileName(gAliceFilename),
121 fMode(AliQAv1::GetModeName(mode)),
122 fNumberOfEvents(999999),
126 fRawReaderDelete(kTRUE),
129 fEventSpecie(AliRecoParam::kDefault),
134 fMaxEvents = fNumberOfEvents ;
135 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
136 if (IsSelected(AliQAv1::GetDetName(iDet))) {
137 fLoader[iDet] = NULL ;
138 fQADataMaker[iDet] = NULL ;
139 fQACycles[iDet] = 999999 ;
145 //_____________________________________________________________________________
146 AliQAManager::AliQAManager(const AliQAManager & qas) :
148 fCurrentEvent(qas.fCurrentEvent),
150 fDetectors(qas.fDetectors),
151 fDetectorsW(qas.fDetectorsW),
154 fGAliceFileName(qas.fGAliceFileName),
155 fFirstEvent(qas.fFirstEvent),
156 fMaxEvents(qas.fMaxEvents),
158 fNumberOfEvents(qas.fNumberOfEvents),
160 fRunNumber(qas.fRunNumber),
162 fRawReaderDelete(kTRUE),
165 fEventSpecie(qas.fEventSpecie),
166 fPrintImage(qas.fPrintImage),
167 fSaveData(qas.fSaveData)
171 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
172 fLoader[iDet] = qas.fLoader[iDet] ;
173 fQADataMaker[iDet] = qas.fQADataMaker[iDet] ;
174 fQACycles[iDet] = qas.fQACycles[iDet] ;
175 fQAWriteExpert[iDet] = qas.fQAWriteExpert[iDet] ;
179 //_____________________________________________________________________________
180 AliQAManager & AliQAManager::operator = (const AliQAManager & qas)
182 // assignment operator
183 this->~AliQAManager() ;
184 new(this) AliQAManager(qas) ;
188 //_____________________________________________________________________________
189 AliQAManager::~AliQAManager()
192 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
193 if (IsSelected(AliQAv1::GetDetName(iDet))) {
194 fLoader[iDet] = NULL;
195 if (fQADataMaker[iDet]) {
196 (fQADataMaker[iDet])->Finish() ;
197 delete fQADataMaker[iDet] ;
201 if (fRawReaderDelete) {
207 //_____________________________________________________________________________
208 Bool_t AliQAManager::DoIt(const AliQAv1::TASKINDEX_t taskIndex)
210 // Runs all the QA data Maker for every detector
213 // Fill QA data in event loop
214 for (UInt_t iEvent = fFirstEvent ; iEvent < (UInt_t)fMaxEvents ; iEvent++) {
217 if ( iEvent%10 == 0 )
218 AliDebug(AliQAv1::GetQADebugLevel(), Form("processing event %d", iEvent));
219 if ( taskIndex == AliQAv1::kRAWS ) {
220 if ( !fRawReader->NextEvent() )
222 } else if ( taskIndex == AliQAv1::kESDS ) {
223 if ( fESDTree->GetEntry(iEvent) == 0 )
226 if ( fRunLoader->GetEvent(iEvent) != 0 )
229 // loop over active loaders
230 for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
231 if (IsSelected(AliQAv1::GetDetName(iDet))) {
232 AliQADataMaker * qadm = GetQADataMaker(iDet) ;
233 if (!qadm) continue; // This detector doesn't have any QA (for example, HLT)
234 if ( qadm->IsCycleDone() ) {
235 qadm->EndOfCycle(taskIndex) ;
237 TTree * data = NULL ;
238 AliLoader* loader = GetLoader(qadm->GetUniqueID());
240 case AliQAv1::kNULLTASKINDEX :
242 case AliQAv1::kRAWS :
243 qadm->Exec(taskIndex, fRawReader) ;
245 case AliQAv1::kHITS :
248 data = loader->TreeH() ;
250 AliWarning(Form(" Hit Tree not found for %s", AliQAv1::GetDetName(iDet))) ;
253 qadm->Exec(taskIndex, data) ;
256 case AliQAv1::kSDIGITS :
259 TString fileName(Form("%s.SDigits.root", AliQAv1::GetDetName(iDet))) ;
260 if (gSystem->FindFile("./", fileName)) {
262 loader->LoadSDigits() ;
263 data = loader->TreeS() ;
265 AliWarning(Form(" SDigit Tree not found for %s", AliQAv1::GetDetName(iDet))) ;
268 qadm->Exec(taskIndex, data) ;
273 case AliQAv1::kDIGITS :
275 loader->LoadDigits() ;
276 data = loader->TreeD() ;
278 AliWarning(Form(" Digit Tree not found for %s", AliQAv1::GetDetName(iDet))) ;
281 qadm->Exec(taskIndex, data) ;
284 case AliQAv1::kDIGITSR :
286 loader->LoadDigits() ;
287 data = loader->TreeD() ;
289 AliWarning(Form(" Digit Tree not found for %s", AliQAv1::GetDetName(iDet))) ;
292 qadm->Exec(taskIndex, data) ;
295 case AliQAv1::kRECPOINTS :
297 loader->LoadRecPoints() ;
298 data = loader->TreeR() ;
300 AliWarning(Form("RecPoints not found for %s", AliQAv1::GetDetName(iDet))) ;
303 qadm->Exec(taskIndex, data) ;
306 case AliQAv1::kTRACKSEGMENTS :
308 case AliQAv1::kRECPARTICLES :
310 case AliQAv1::kESDS :
311 qadm->Exec(taskIndex, fESD) ;
313 case AliQAv1::kNTASKINDEX :
318 Increment(taskIndex) ;
320 // Save QA data for all detectors
324 if ( taskIndex == AliQAv1::kRAWS )
325 fRawReader->RewindEvents() ;
330 //_____________________________________________________________________________
331 Bool_t AliQAManager::Finish(const AliQAv1::TASKINDEX_t taskIndex)
333 // write output to file for all detectors
335 AliQAChecker::Instance()->SetRunNumber(fRunNumber) ;
337 for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
338 if (IsSelected(AliQAv1::GetDetName(iDet))) {
339 AliQADataMaker * qadm = GetQADataMaker(iDet) ;
341 qadm->EndOfCycle(taskIndex) ;
347 //_____________________________________________________________________________
348 TObjArray * AliQAManager::GetFromOCDB(AliQAv1::DETECTORINDEX_t det, AliQAv1::TASKINDEX_t task, const Char_t * year) const
350 // Retrieve the list of QA data for a given detector and a given task
351 TObjArray * rv = NULL ;
352 if ( !strlen(AliQAv1::GetQARefStorage()) ) {
353 AliError("No storage defined, use AliQAv1::SetQARefStorage") ;
356 if ( ! IsDefaultStorageSet() ) {
357 TString tmp(AliQAv1::GetQARefDefaultStorage()) ;
360 Instance()->SetDefaultStorage(tmp.Data()) ;
361 Instance()->SetSpecificStorage(Form("%s/*", AliQAv1::GetQAName()), AliQAv1::GetQARefStorage()) ;
363 TString detOCDBDir(Form("%s/%s/%s", AliQAv1::GetQAName(), AliQAv1::GetDetName((Int_t)det), AliQAv1::GetRefOCDBDirName())) ;
364 AliDebug(AliQAv1::GetQADebugLevel(), Form("Retrieving reference data from %s/%s for %s", AliQAv1::GetQARefStorage(), detOCDBDir.Data(), AliQAv1::GetTaskName(task).Data())) ;
365 AliCDBEntry* entry = QAManager()->Get(detOCDBDir.Data(), 0) ; //FIXME 0 --> Run Number
366 TList * listDetQAD = static_cast<TList *>(entry->GetObject()) ;
368 rv = static_cast<TObjArray *>(listDetQAD->FindObject(AliQAv1::GetTaskName(task))) ;
372 //_____________________________________________________________________________
373 TCanvas ** AliQAManager::GetImage(Char_t * detName)
375 // retrieves QA Image for the given detector
376 TCanvas ** rv = NULL ;
377 Int_t detIndex = AliQAv1::GetDetIndex(detName) ;
378 AliQACheckerBase * qac = AliQAChecker::Instance()->GetDetQAChecker(detIndex) ;
379 rv = qac->GetImage() ;
383 //_____________________________________________________________________________
384 AliLoader * AliQAManager::GetLoader(Int_t iDet)
386 // get the loader for a detector
388 if ( !fRunLoader || iDet == AliQAv1::kCORR || iDet == AliQAv1::kGLOBAL )
391 TString detName = AliQAv1::GetDetName(iDet) ;
392 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
394 return fLoader[iDet] ;
396 // load the QA data maker object
397 TPluginManager* pluginManager = gROOT->GetPluginManager() ;
398 TString loaderName = "Ali" + detName + "Loader" ;
400 AliLoader * loader = NULL ;
401 // first check if a plugin is defined for the quality assurance data maker
402 TPluginHandler* pluginHandler = pluginManager->FindHandler("AliLoader", detName) ;
403 // if not, add a plugin for it
404 if (!pluginHandler) {
405 AliDebug(AliQAv1::GetQADebugLevel(), Form("defining plugin for %s", loaderName.Data())) ;
406 TString libs = gSystem->GetLibraries() ;
407 if (libs.Contains("lib" + detName + "base.so") || (gSystem->Load("lib" + detName + "base.so") >= 0)) {
408 pluginManager->AddHandler("AliQADataMaker", detName, loaderName, detName + "loader", loaderName + "()") ;
410 pluginManager->AddHandler("AliLoader", detName, loaderName, detName, loaderName + "()") ;
412 pluginHandler = pluginManager->FindHandler("AliLoader", detName) ;
414 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
415 loader = (AliLoader *) pluginHandler->ExecPlugin(0) ;
418 fLoader[iDet] = loader ;
422 //_____________________________________________________________________________
423 AliQAv1 * AliQAManager::GetQA(UInt_t run, UInt_t evt)
425 // retrieves the QA object stored in a file named "Run{run}.Event{evt}_1.ESD.tag.root"
426 Char_t * fileName = Form("Run%d.Event%d_1.ESD.tag.root", run, evt) ;
427 TFile * tagFile = TFile::Open(fileName) ;
429 AliError(Form("File %s not found", fileName)) ;
432 TTree * tagTree = static_cast<TTree *>(tagFile->Get("T")) ;
434 AliError(Form("Tree T not found in %s", fileName)) ;
438 AliRunTag * tag = new AliRunTag ;
439 tagTree->SetBranchAddress("AliTAG", &tag) ;
440 tagTree->GetEntry(evt) ;
441 AliQAv1 * qa = AliQAv1::Instance(tag->GetQALength(), tag->GetQAArray(), tag->GetESLength(), tag->GetEventSpecies()) ;
446 //_____________________________________________________________________________
447 AliQADataMaker * AliQAManager::GetQADataMaker(const Int_t iDet)
449 // get the quality assurance data maker for a detector
451 AliQADataMaker * qadm = fQADataMaker[iDet] ;
455 qadm->SetEventSpecie(fEventSpecie) ;
456 if ( qadm->GetRecoParam() )
457 if ( AliRecoParam::Convert(qadm->GetRecoParam()->GetEventSpecie()) != AliRecoParam::kDefault)
458 qadm->SetEventSpecie(qadm->GetRecoParam()->GetEventSpecie()) ;
460 } else if (iDet == AliQAv1::kGLOBAL && strcmp(GetMode(), AliQAv1::GetModeName(AliQAv1::kRECMODE)) == 0) { //Global QA
462 qadm = new AliGlobalQADataMaker();
463 qadm->SetName(AliQAv1::GetDetName(iDet));
464 qadm->SetUniqueID(iDet);
465 fQADataMaker[iDet] = qadm;
466 qadm->SetEventSpecie(fEventSpecie) ;
467 if ( qadm->GetRecoParam() )
468 if ( AliRecoParam::Convert(qadm->GetRecoParam()->GetEventSpecie()) != AliRecoParam::kDefault)
469 qadm->SetEventSpecie(qadm->GetRecoParam()->GetEventSpecie()) ;
471 } else if (iDet == AliQAv1::kCORR && strcmp(GetMode(), AliQAv1::GetModeName(AliQAv1::kRECMODE)) == 0 ) { //the data maker for correlations among detectors
472 qadm = new AliCorrQADataMakerRec(fQADataMaker) ;
473 qadm->SetName(AliQAv1::GetDetName(iDet));
474 qadm->SetUniqueID(iDet);
475 fQADataMaker[iDet] = qadm;
476 qadm->SetEventSpecie(fEventSpecie) ;
477 if ( qadm->GetRecoParam() )
478 if ( AliRecoParam::Convert(qadm->GetRecoParam()->GetEventSpecie()) != AliRecoParam::kDefault)
479 qadm->SetEventSpecie(qadm->GetRecoParam()->GetEventSpecie()) ;
481 } else if ( iDet < AliQAv1::kGLOBAL ) {
482 TString smode(GetMode()) ;
483 if (smode.Contains(AliQAv1::GetModeName(AliQAv1::kQAMODE)))
484 smode = AliQAv1::GetModeName(AliQAv1::kRECMODE) ;
485 // load the QA data maker object
486 TPluginManager* pluginManager = gROOT->GetPluginManager() ;
487 TString detName = AliQAv1::GetDetName(iDet) ;
488 TString qadmName = "Ali" + detName + "QADataMaker" + smode ;
490 // first check if a plugin is defined for the quality assurance data maker
491 TPluginHandler* pluginHandler = pluginManager->FindHandler("AliQADataMaker", detName) ;
492 // if not, add a plugin for it
493 if (!pluginHandler) {
494 AliDebug(AliQAv1::GetQADebugLevel(), Form("defining plugin for %s", qadmName.Data())) ;
495 TString libs = gSystem->GetLibraries() ;
496 TString temp(smode) ;
498 if (libs.Contains("lib" + detName + smode + ".so") || (gSystem->Load("lib" + detName + temp.Data() + ".so") >= 0)) {
499 pluginManager->AddHandler("AliQADataMaker", detName, qadmName, detName + "qadm", qadmName + "()") ;
501 pluginManager->AddHandler("AliQADataMaker", detName, qadmName, detName, qadmName + "()") ;
503 pluginHandler = pluginManager->FindHandler("AliQADataMaker", detName) ;
505 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
506 qadm = (AliQADataMaker *) pluginHandler->ExecPlugin(0) ;
509 qadm->SetName(AliQAv1::GetDetName(iDet));
510 qadm->SetUniqueID(iDet);
511 fQADataMaker[iDet] = qadm ;
512 qadm->SetEventSpecie(fEventSpecie) ;
513 if ( qadm->GetRecoParam() )
514 if ( AliRecoParam::Convert(qadm->GetRecoParam()->GetEventSpecie()) != AliRecoParam::kDefault)
515 qadm->SetEventSpecie(qadm->GetRecoParam()->GetEventSpecie()) ;
521 //_____________________________________________________________________________
522 void AliQAManager::EndOfCycle(TObjArray * detArray)
524 // End of cycle QADataMakers
526 AliQAChecker::Instance()->SetRunNumber(fRunNumber) ;
529 fakeCanvas.Print(Form("%s%s%d.%s[", AliQAv1::GetImageFileName(), GetMode(), fRunNumber, AliQAv1::GetImageFileFormat()), "ps") ;
530 for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
531 if (IsSelected(AliQAv1::GetDetName(iDet))) {
532 AliQADataMaker * qadm = GetQADataMaker(iDet) ;
535 // skip non active detectors
537 AliModule* det = static_cast<AliModule*>(detArray->FindObject(AliQAv1::GetDetName(iDet))) ;
538 if (!det || !det->IsActive())
541 AliQACheckerBase * qac = AliQAChecker::Instance()->GetDetQAChecker(iDet) ;
543 qac->SetPrintImage(fPrintImage) ;
544 for (UInt_t taskIndex = 0; taskIndex < AliQAv1::kNTASKINDEX; taskIndex++) {
545 if ( fTasks.Contains(Form("%d", taskIndex)) )
546 qadm->EndOfCycle(AliQAv1::GetTaskIndex(AliQAv1::GetTaskName(taskIndex))) ;
552 fakeCanvas.Print(Form("%s%s%d.%s]", AliQAv1::GetImageFileName(), GetMode(), fRunNumber, AliQAv1::GetImageFileFormat()), "ps");
555 //_____________________________________________________________________________
556 void AliQAManager::EndOfCycle(TString detectors)
558 // End of cycle QADataMakers
560 AliQAChecker::Instance()->SetRunNumber(fRunNumber) ;
563 fakeCanvas.Print(Form("%s%s%d.%s[", AliQAv1::GetImageFileName(), GetMode(), fRunNumber, AliQAv1::GetImageFileFormat()), "ps") ;
564 for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
565 if (IsSelected(AliQAv1::GetDetName(iDet))) {
566 AliQADataMaker * qadm = GetQADataMaker(iDet) ;
569 // skip non active detectors
570 if (!detectors.Contains(AliQAv1::GetDetName(iDet)))
572 AliQACheckerBase * qac = AliQAChecker::Instance()->GetDetQAChecker(iDet) ;
574 qac->SetPrintImage(fPrintImage) ;
575 for (UInt_t taskIndex = 0; taskIndex < AliQAv1::kNTASKINDEX; taskIndex++) {
576 if ( fTasks.Contains(Form("%d", taskIndex)) )
577 qadm->EndOfCycle(AliQAv1::GetTaskIndex(AliQAv1::GetTaskName(taskIndex))) ;
583 fakeCanvas.Print(Form("%s%s%d.%s]", AliQAv1::GetImageFileName(), GetMode(), fRunNumber, AliQAv1::GetImageFileFormat()), "ps");
586 //_____________________________________________________________________________
587 AliRecoParam::EventSpecie_t AliQAManager::GetEventSpecieFromESD()
589 AliRecoParam::EventSpecie_t runtype = AliRecoParam::kDefault ;
590 if (!gSystem->AccessPathName("AliESDs.root")) { // AliESDs.root exists
591 TFile * esdFile = TFile::Open("AliESDs.root") ;
592 TTree * esdTree = static_cast<TTree *> (esdFile->Get("esdTree")) ;
594 AliError("esdTree not found") ;
596 AliESDEvent * esd = new AliESDEvent() ;
597 esd->ReadFromTree(esdTree) ;
598 esdTree->GetEntry(0) ;
599 runtype = AliRecoParam::Convert(esd->GetEventType()) ;
602 AliError("AliESDs.root not found") ;
607 //_____________________________________________________________________________
608 void AliQAManager::Increment(const AliQAv1::TASKINDEX_t taskIndex)
610 // Increments the cycle counter for all QA Data Makers
611 static AliQAv1::TASKINDEX_t currentTask = AliQAv1::kNTASKINDEX ;
612 if (currentTask == taskIndex)
615 currentTask = taskIndex ;
616 for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
617 if (IsSelected(AliQAv1::GetDetName(iDet))) {
618 AliQADataMaker * qadm = GetQADataMaker(iDet) ;
625 //_____________________________________________________________________________
626 Bool_t AliQAManager::InitQA(const AliQAv1::TASKINDEX_t taskIndex, const Char_t * input )
628 // Initialize the event source and QA data makers
630 fTasks += Form("%d", taskIndex) ;
632 if (taskIndex == AliQAv1::kRAWS) {
634 fRawReader = AliRawReader::Create(input);
638 fRawReaderDelete = kTRUE ;
639 fRawReader->NextEvent() ;
640 fRunNumber = fRawReader->GetRunNumber() ;
642 fRawReader->RewindEvents();
643 fNumberOfEvents = 999999 ;
644 if ( fMaxEvents < 0 )
645 fMaxEvents = fNumberOfEvents ;
646 } else if (taskIndex == AliQAv1::kESDS) {
647 fTasks = AliQAv1::GetTaskName(AliQAv1::kESDS) ;
648 if (!gSystem->AccessPathName("AliESDs.root")) { // AliESDs.root exists
649 TFile * esdFile = TFile::Open("AliESDs.root") ;
650 fESDTree = static_cast<TTree *> (esdFile->Get("esdTree")) ;
652 AliError("esdTree not found") ;
655 fESD = new AliESDEvent() ;
656 fESD->ReadFromTree(fESDTree) ;
657 fESDTree->GetEntry(0) ;
658 fRunNumber = fESD->GetRunNumber() ;
659 fNumberOfEvents = fESDTree->GetEntries() ;
660 if ( fMaxEvents < 0 )
661 fMaxEvents = fNumberOfEvents ;
664 AliError("AliESDs.root not found") ;
668 if ( !InitRunLoader() ) {
669 AliWarning("No Run Loader not found") ;
671 fNumberOfEvents = fRunLoader->GetNumberOfEvents() ;
672 if ( fMaxEvents < 0 )
673 fMaxEvents = fNumberOfEvents ;
678 TObjArray* detArray = NULL ;
679 if (fRunLoader) // check if RunLoader exists
680 if ( fRunLoader->GetAliRun() ) { // check if AliRun exists in gAlice.root
681 detArray = fRunLoader->GetAliRun()->Detectors() ;
682 fRunNumber = fRunLoader->GetHeader()->GetRun() ;
685 // Initialize all QA data makers for all detectors
686 fRunNumber = AliCDBManager::Instance()->GetRun() ;
687 if ( ! AliGeomManager::GetGeometry() )
688 AliGeomManager::LoadGeometry() ;
690 InitQADataMaker(fRunNumber, detArray) ; //, fCycleSame, kTRUE, detArray) ;
695 while (timer.CpuTime()<5) {
697 gSystem->ProcessEvents();
699 fakeCanvas.Print(Form("%s%s%d.%s[", AliQAv1::GetImageFileName(), GetMode(), fRunNumber, AliQAv1::GetImageFileFormat()), "ps") ;
704 //_____________________________________________________________________________
705 void AliQAManager::InitQADataMaker(UInt_t run, TObjArray * detArray)
707 // Initializes The QADataMaker for all active detectors and for all active tasks
709 for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
710 if (IsSelected(AliQAv1::GetDetName(iDet))) {
711 AliQADataMaker * qadm = GetQADataMaker(iDet) ;
713 AliError(Form("AliQADataMaker not found for %s", AliQAv1::GetDetName(iDet))) ;
714 fDetectorsW.ReplaceAll(AliQAv1::GetDetName(iDet), "") ;
716 if (fQAWriteExpert[iDet])
717 qadm->SetWriteExpert() ;
718 AliDebug(AliQAv1::GetQADebugLevel(), Form("Data Maker found for %s %d", qadm->GetName(), qadm->WriteExpert())) ;
719 // skip non active detectors
721 AliModule* det = static_cast<AliModule*>(detArray->FindObject(AliQAv1::GetDetName(iDet))) ;
722 if (!det || !det->IsActive())
725 // Set default reco params
726 Bool_t sameCycle = kFALSE ;
727 for (UInt_t taskIndex = 0; taskIndex < AliQAv1::kNTASKINDEX; taskIndex++) {
728 if ( fTasks.Contains(Form("%d", taskIndex)) ) {
729 qadm->Init(AliQAv1::GetTaskIndex(AliQAv1::GetTaskName(taskIndex)), GetQACycles(qadm->GetUniqueID())) ;
730 qadm->StartOfCycle(AliQAv1::GetTaskIndex(AliQAv1::GetTaskName(taskIndex)), run, sameCycle) ;
740 //_____________________________________________________________________________
741 Bool_t AliQAManager::InitRunLoader()
743 // get or create the run loader
747 if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
748 // load all base libraries to get the loader classes
749 TString libs = gSystem->GetLibraries() ;
750 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
751 if (!IsSelected(AliQAv1::GetDetName(iDet)))
753 TString detName = AliQAv1::GetDetName(iDet) ;
754 if (detName == "HLT")
756 if (libs.Contains("lib" + detName + "base.so"))
758 gSystem->Load("lib" + detName + "base.so");
760 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data());
762 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
765 fRunLoader->CdGAFile();
766 if (fRunLoader->LoadgAlice() == 0) {
767 gAlice = fRunLoader->GetAliRun();
771 AliError(Form("no gAlice object found in file %s", fGAliceFileName.Data()));
775 } else { // galice.root does not exist
776 AliError(Form("the file %s does not exist", fGAliceFileName.Data()));
782 fRunLoader->LoadHeader();
783 fRunNumber = fRunLoader->GetHeader()->GetRun() ;
788 //_____________________________________________________________________________
789 Bool_t AliQAManager::IsSelected(const Char_t * det)
791 // check whether detName is contained in detectors
792 // if yes, it is removed from detectors
795 const TString detName(det) ;
796 // always activates Correlation
797 if ( detName.Contains(AliQAv1::GetDetName(AliQAv1::kCORR)) || detName.Contains(AliQAv1::GetDetName(AliQAv1::kGLOBAL))) {
800 // check if all detectors are selected
801 if (fDetectors.Contains("ALL")) {
804 } else if ((fDetectors.CompareTo(detName) == 0) ||
805 fDetectors.BeginsWith(detName+" ") ||
806 fDetectors.EndsWith(" "+detName) ||
807 fDetectors.Contains(" "+detName+" ")) {
814 //_____________________________________________________________________________
815 Bool_t AliQAManager::Merge(Int_t runNumber, const char *fileName) const
817 // Merge data from all detectors from a given run in one single file
818 // Merge the QA results from all the data chunks in one run
819 // The 'fileName' is name of the output file with merged QA data
820 if ( runNumber == -1)
821 runNumber = fRunNumber ;
822 Bool_t rv = MergeData(runNumber,fileName) ;
823 //rv *= MergeResults(runNumber) ; // not needed for the time being
827 //______________________________________________________________________
828 Bool_t AliQAManager::MergeXML(const Char_t * collectionFile, const Char_t * subFile, const Char_t * outFile)
830 // merges files listed in a xml collection
831 // usage Merge(collection, outputFile))
832 // collection: is a xml collection
836 if ( strstr(collectionFile, ".xml") == 0 ) {
837 AliError("Input collection file must be an \".xml\" file\n") ;
842 TGrid::Connect("alien://");
846 // Open the file collection
847 AliInfoClass(Form("*** Create Collection ***\n*** Wk-Dir = |%s| \n*** Coll = |%s| \n",gSystem->WorkingDirectory(), collectionFile));
849 TGridCollection * collection = (TGridCollection*)gROOT->ProcessLine(Form("TAlienCollection::Open(\"%s\")",collectionFile));
850 TGridResult* result = collection->GetGridResult("", 0, 0);
853 const Char_t * turl ;
854 TFileMerger merger(kFALSE) ;
856 TString tempo(collectionFile) ;
858 tempo.ReplaceAll(".xml", subFile) ;
860 tempo.ReplaceAll(".xml", "_Merged.root") ;
861 outFile = tempo.Data() ;
863 merger.OutputFile(outFile) ;
865 while ( (turl = result->GetKey(index, "turl")) ) {
868 file = Form("%s#%s", turl, subFile) ;
870 file = Form("%s", turl) ;
872 AliDebug(AliQAv1::GetQADebugLevel(), Form("%s\n", file)) ;
873 merger.AddFile(file) ;
880 AliDebug(AliQAv1::GetQADebugLevel(), Form("Files merged into %s\n", outFile)) ;
886 //_____________________________________________________________________________
887 void AliQAManager::MergeCustom() const
889 // Custom Merge of QA data from all detectors for all runs in one single file
890 // search all the run numbers
891 // search all the run numbers
892 gROOT->ProcessLine(".! ls *QA*.root > QAtempo.txt") ;
894 FILE * QAfiles = fopen("QAtempo.txt", "r") ;
897 TIter nextRun(&srunList) ;
898 TObjString * srun = NULL ;
899 Int_t loRun = 999999999 ;
901 while ( QAfile.Gets(QAfiles) ) {
902 Bool_t runExist = kFALSE ;
903 TString srunNew(QAfile(QAfile.Index("QA.")+3, QAfile.Index(".root")-(QAfile.Index("QA.")+3))) ;
904 Int_t cuRun = srunNew.Atoi() ;
909 while ( (srun = static_cast<TObjString *> (nextRun())) ) {
910 if ( cuRun == (srun->String()).Atoi() ) {
917 srunList.Add(new TObjString(srunNew.Data()));
920 Int_t runNumber = 0 ;
921 TFile mergedFile(Form("Merged.%s.Data.root", AliQAv1::GetQADataFileName()), "RECREATE") ;
922 TH1I * hisRun = new TH1I("hLMR", "List of merged runs", hiRun-loRun+10, loRun, hiRun+10) ;
923 // create the structure into the merged file
924 for (Int_t iDet = 0; iDet < AliQAv1::kNDET ; iDet++) {
925 TDirectory * detDir = mergedFile.mkdir(AliQAv1::GetDetName(iDet)) ;
926 for (Int_t taskIndex = 0; taskIndex < AliQAv1::kNTASKINDEX; taskIndex++) {
928 TDirectory * taskDir = gDirectory->mkdir(AliQAv1::GetTaskName(taskIndex)) ;
929 for (Int_t es = 0 ; es < AliRecoParam::kNSpecies ; es++) {
931 TDirectory * esDir = gDirectory->mkdir(AliRecoParam::GetEventSpecieName(es)) ;
933 gDirectory->mkdir(AliQAv1::GetExpert()) ;
937 while ( (srun = static_cast<TObjString *> (nextRun())) ) {
938 runNumber = (srun->String()).Atoi() ;
939 hisRun->Fill(runNumber) ;
940 AliDebug(AliQAv1::GetQADebugLevel(), Form("Merging run number %d", runNumber)) ;
941 // search all QA files for runNumber in the current directory
942 Char_t * fileList[AliQAv1::kNDET] ;
944 for (Int_t iDet = 0; iDet < AliQAv1::kNDET ; iDet++) {
945 Char_t * file = gSystem->Which(gSystem->WorkingDirectory(), Form("%s.%s.%d.root", AliQAv1::GetDetName(iDet), AliQAv1::GetQADataFileName(), runNumber));
947 fileList[index++] = file ;
950 AliError("No QA data file found\n") ;
953 for ( Int_t i = 0 ; i < index ; i++) {
954 TFile * inFile = TFile::Open(fileList[i]) ;
955 TList * listOfKeys =inFile->GetListOfKeys() ;
956 TIter nextkey(listOfKeys) ;
958 TString dirName("") ;
959 while ( (obj1 = nextkey()) ) {
960 TDirectory * directoryDet = inFile->GetDirectory(obj1->GetName()) ;
961 if ( directoryDet ) {
962 AliDebug(AliQAv1::GetQADebugLevel(), Form("%s dir = %s", inFile->GetName(), directoryDet->GetName())) ;
963 dirName += Form("%s/", directoryDet->GetName() ) ;
965 TList * listOfTasks = directoryDet->GetListOfKeys() ;
966 TIter nextTask(listOfTasks) ;
968 while ( (obj2 = nextTask()) ) {
969 TDirectory * directoryTask = directoryDet->GetDirectory(obj2->GetName()) ;
970 if ( directoryTask ) {
971 dirName += Form("%s", obj2->GetName()) ;
972 AliDebug(AliQAv1::GetQADebugLevel(), Form("%s", dirName.Data())) ;
973 directoryTask->cd() ;
974 TList * listOfEventSpecie = directoryTask->GetListOfKeys() ;
975 TIter nextEventSpecie(listOfEventSpecie) ;
977 while ( (obj3 = nextEventSpecie()) ) {
978 TDirectory * directoryEventSpecie = directoryTask->GetDirectory(obj3->GetName()) ;
979 if ( directoryEventSpecie ) {
980 dirName += Form("/%s/", obj3->GetName()) ;
981 AliDebug(AliQAv1::GetQADebugLevel(), Form("%s\n", dirName.Data())) ;
982 directoryEventSpecie->cd() ;
983 // histograms are here
984 TDirectory * mergedDirectory = mergedFile.GetDirectory(dirName.Data()) ;
985 TList * listOfData = directoryEventSpecie->GetListOfKeys() ;
986 TIter nextData(listOfData) ;
988 while ( (key = static_cast<TKey *>(nextData())) ) {
989 TString className(key->GetClassName()) ;
990 if ( className.Contains("TH") || className.Contains("TProfile") ) {
991 TH1 * histIn = static_cast<TH1*> (key->ReadObj()) ;
992 TH1 * histOu = static_cast<TH1*> (mergedDirectory->FindObjectAny(histIn->GetName())) ;
993 AliDebug(AliQAv1::GetQADebugLevel(), Form("%s %x %x\n", key->GetName(), histIn, histOu)) ;
994 mergedDirectory->cd() ;
998 histOu->Add(histIn) ;
999 histOu->Write(histOu->GetName(), kOverwrite) ;
1002 else if ( className.Contains("TDirectoryFile") ) {
1003 TDirectory * dirExpert = directoryEventSpecie->GetDirectory(key->GetName()) ;
1005 TDirectory * mergedDirectoryExpert = mergedDirectory->GetDirectory(dirExpert->GetName()) ;
1006 TList * listOfExpertData = dirExpert->GetListOfKeys() ;
1007 TIter nextExpertData(listOfExpertData) ;
1009 while ( (keykey = static_cast<TKey *>(nextExpertData())) ) {
1010 TString classNameExpert(keykey->GetClassName()) ;
1011 if (classNameExpert.Contains("TH")) {
1012 TH1 * histInExpert = static_cast<TH1*> (keykey->ReadObj()) ;
1013 TH1 * histOuExpert = static_cast<TH1*> (mergedDirectory->FindObjectAny(histInExpert->GetName())) ;
1014 mergedDirectoryExpert->cd() ;
1015 if ( ! histOuExpert ) {
1016 histInExpert->Write() ;
1018 histOuExpert->Add(histInExpert) ;
1019 histOuExpert->Write(histOuExpert->GetName(), kOverwrite) ;
1024 AliError(Form("No merge done for this object %s in %s", key->GetName(), dirName.Data())) ;
1027 dirName.ReplaceAll(Form("/%s/",obj3->GetName()), "") ;
1030 dirName.ReplaceAll(obj2->GetName(), "") ;
1040 mergedFile.Close() ;
1044 //_____________________________________________________________________________
1045 Bool_t AliQAManager::MergeData(const Int_t runNumber, const char *fileName) const
1047 // Merge QA data from all detectors for a given run in one single file
1049 TFileMerger merger(kFALSE) ;
1050 TString outFileName = fileName;
1051 if (outFileName.IsNull()) outFileName.Form("Merged.%s.Data.root",AliQAv1::GetQADataFileName());
1052 merger.OutputFile(outFileName.Data()) ;
1053 for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
1054 Char_t * file = gSystem->Which(gSystem->WorkingDirectory(), Form("%s.%s.%d.root", AliQAv1::GetDetName(iDet), AliQAv1::GetQADataFileName(), runNumber));
1056 merger.AddFile(file);
1063 //_____________________________________________________________________________
1064 Bool_t AliQAManager::MergeResults(const Int_t runNumber) const
1066 // Merge the QA result from all the data chunks in a run
1067 // to be revised whwn it will be used (see MergeData)
1069 cmd = Form(".! ls %s*.root > tempo.txt", AliQAv1::GetQADataFileName()) ;
1070 gROOT->ProcessLine(cmd.Data()) ;
1071 ifstream in("tempo.txt") ;
1072 const Int_t chunkMax = 100 ;
1073 TString fileList[chunkMax] ;
1078 in >> fileList[index] ;
1081 AliDebug(AliQAv1::GetQADebugLevel(), Form("index = %d file = %s", index, (fileList[index].Data()))) ;
1086 AliError("No QA Result File found") ;
1090 TFileMerger merger ;
1091 TString outFileName ;
1092 if (runNumber != -1)
1093 outFileName = Form("Merged.%s.Result.%d.root",AliQAv1::GetQADataFileName(),runNumber);
1095 outFileName = Form("Merged.%s.Result.root",AliQAv1::GetQADataFileName());
1096 merger.OutputFile(outFileName.Data()) ;
1097 for (Int_t ifile = 0 ; ifile < index ; ifile++) {
1098 TString file = fileList[ifile] ;
1099 merger.AddFile(file) ;
1106 //_____________________________________________________________________________
1107 void AliQAManager::Reset(const Bool_t sameCycle)
1109 // Reset the default data members
1111 for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
1112 if (IsSelected(AliQAv1::GetDetName(iDet))) {
1113 AliQADataMaker * qadm = GetQADataMaker(iDet);
1118 if (fRawReaderDelete) {
1123 fCycleSame = sameCycle ;
1127 fNumberOfEvents = 999999 ;
1130 //_____________________________________________________________________________
1131 void AliQAManager::ResetDetectors(AliQAv1::TASKINDEX_t task, AliQAv1::DETECTORINDEX_t det)
1133 //calls ResetDetector of specified or all detectors
1135 UInt_t iDetMax = fgkNDetectors ;
1136 if ( det != AliQAv1::kNULLDET ) {
1141 for (iDet = 0; iDet < iDetMax ; iDet++) {
1142 if (IsSelected(AliQAv1::GetDetName(iDet))) {
1143 AliQADataMaker * qadm = GetQADataMaker(iDet);
1144 qadm->ResetDetector(task);
1149 //_____________________________________________________________________________
1150 AliQAManager * AliQAManager::QAManager(AliQAv1::MODE_t mode, TMap *entryCache, Int_t run)
1152 // returns AliQAManager instance (singleton)
1154 if (!fgQAInstance) {
1155 if ( (mode != AliQAv1::kSIMMODE) && (mode != AliQAv1::kRECMODE) && (mode != AliQAv1::kQAMODE) ) {
1156 AliWarningClass("You must specify kSIMMODE or kRECMODE or kQAMODE") ;
1159 fgQAInstance = new AliQAManager(mode) ;
1161 fgQAInstance->Init();
1163 fgQAInstance->InitFromCache(entryCache,run);
1165 return fgQAInstance;
1168 //_____________________________________________________________________________
1169 AliQAManager * AliQAManager::QAManager(AliQAv1::TASKINDEX_t task)
1171 // returns AliQAManager instance (singleton)
1172 return QAManager(AliQAv1::Mode(task)) ;
1175 //_____________________________________________________________________________
1176 TString AliQAManager::Run(const Char_t * detectors, AliRawReader * rawReader, const Bool_t sameCycle)
1178 //Runs all the QA data Maker for Raws only
1180 fCycleSame = sameCycle ;
1181 fRawReader = rawReader ;
1182 fDetectors = detectors ;
1183 fDetectorsW = detectors ;
1185 AliCDBManager* man = AliCDBManager::Instance() ;
1187 if ( man->GetRun() == -1 ) {// check if run number not set previously and set it from raw data
1188 rawReader->NextEvent() ;
1189 man->SetRun(fRawReader->GetRunNumber()) ;
1190 rawReader->RewindEvents() ;
1194 if ( !InitQA(AliQAv1::kRAWS) )
1196 fRawReaderDelete = kFALSE ;
1198 DoIt(AliQAv1::kRAWS) ;
1199 return fDetectorsW ;
1202 //_____________________________________________________________________________
1203 TString AliQAManager::Run(const Char_t * detectors, const Char_t * fileName, const Bool_t sameCycle)
1205 //Runs all the QA data Maker for Raws only
1207 fCycleSame = sameCycle ;
1208 fDetectors = detectors ;
1209 fDetectorsW = detectors ;
1211 AliCDBManager* man = AliCDBManager::Instance() ;
1212 if ( man->GetRun() == -1 ) { // check if run number not set previously and set it from AliRun
1213 AliRunLoader * rl = AliRunLoader::Open("galice.root") ;
1215 AliFatal("galice.root file not found in current directory") ;
1219 if ( ! rl->GetAliRun() ) {
1220 AliFatal("AliRun not found in galice.root") ;
1223 man->SetRun(rl->GetHeader()->GetRun());
1229 if ( !InitQA(AliQAv1::kRAWS, fileName) )
1232 DoIt(AliQAv1::kRAWS) ;
1233 return fDetectorsW ;
1236 //_____________________________________________________________________________
1237 TString AliQAManager::Run(const Char_t * detectors, const AliQAv1::TASKINDEX_t taskIndex, Bool_t const sameCycle, const Char_t * fileName )
1239 // Runs all the QA data Maker for every detector
1241 fCycleSame = sameCycle ;
1242 fDetectors = detectors ;
1243 fDetectorsW = detectors ;
1245 AliCDBManager* man = AliCDBManager::Instance() ;
1246 if ( man->GetRun() == -1 ) { // check if run number not set previously and set it from AliRun
1247 AliRunLoader * rl = AliRunLoader::Open("galice.root") ;
1249 AliFatal("galice.root file not found in current directory") ;
1253 if ( ! rl->GetAliRun() ) {
1254 AliDebug(AliQAv1::GetQADebugLevel(), "AliRun not found in galice.root") ;
1257 man->SetRun(rl->GetHeader()->GetRun()) ;
1261 if ( taskIndex == AliQAv1::kNULLTASKINDEX) {
1262 for (UInt_t task = 0; task < AliQAv1::kNTASKINDEX; task++) {
1263 if ( fTasks.Contains(Form("%d", task)) ) {
1265 if ( !InitQA(AliQAv1::GetTaskIndex(AliQAv1::GetTaskName(task)), fileName) )
1267 DoIt(AliQAv1::GetTaskIndex(AliQAv1::GetTaskName(task))) ;
1272 if ( !InitQA(taskIndex, fileName) )
1276 return fDetectorsW ;
1279 //_____________________________________________________________________________
1280 void AliQAManager::RunOneEvent(AliRawReader * rawReader)
1282 //Runs all the QA data Maker for Raws only and on one event only (event loop done by calling method)
1285 if (fTasks.Contains(Form("%d", AliQAv1::kRAWS))){
1286 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1287 if (!IsSelected(AliQAv1::GetDetName(iDet)))
1289 AliQADataMaker *qadm = GetQADataMaker(iDet);
1292 if ( qadm->IsCycleDone() ) {
1293 qadm->EndOfCycle() ;
1295 qadm->SetEventSpecie(fEventSpecie) ;
1296 if ( qadm->GetRecoParam() )
1297 if ( AliRecoParam::Convert(qadm->GetRecoParam()->GetEventSpecie()) != AliRecoParam::kDefault)
1298 qadm->SetEventSpecie(qadm->GetRecoParam()->GetEventSpecie()) ;
1299 qadm->Exec(AliQAv1::kRAWS, rawReader) ;
1304 //_____________________________________________________________________________
1305 void AliQAManager::RunOneEvent(AliESDEvent *& esd, AliESDEvent *& hltesd)
1307 //Runs all the QA data Maker for ESDs only and on one event only (event loop done by calling method)
1309 if (fTasks.Contains(Form("%d", AliQAv1::kESDS))) {
1310 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1311 if (!IsSelected(AliQAv1::GetDetName(iDet)))
1313 AliQADataMaker *qadm = GetQADataMaker(iDet);
1316 qadm->SetEventSpecie(fEventSpecie) ;
1317 if ( qadm->GetRecoParam() )
1318 if ( AliRecoParam::Convert(qadm->GetRecoParam()->GetEventSpecie()) != AliRecoParam::kDefault)
1319 qadm->SetEventSpecie(qadm->GetRecoParam()->GetEventSpecie()) ;
1320 if ( qadm->IsCycleDone() ) {
1321 qadm->EndOfCycle() ;
1323 if (iDet == AliQAv1::kHLT) {
1326 esdarray.Add(hltesd);
1327 qadm->Exec(AliQAv1::kESDS, &esdarray);
1329 qadm->Exec(AliQAv1::kESDS, esd) ;
1335 //_____________________________________________________________________________
1336 void AliQAManager::RunOneEventInOneDetector(Int_t det, TTree * tree)
1338 // Runs all the QA data Maker for ESDs only and on one event only (event loop done by calling method)
1340 TString test(tree->GetName()) ;
1341 if (fTasks.Contains(Form("%d", AliQAv1::kRECPOINTS))) {
1342 if (IsSelected(AliQAv1::GetDetName(det))) {
1343 AliQADataMaker *qadm = GetQADataMaker(det);
1345 qadm->SetEventSpecie(fEventSpecie) ;
1346 if ( qadm->GetRecoParam() ) {
1347 if ( AliRecoParam::Convert(qadm->GetRecoParam()->GetEventSpecie()) != AliRecoParam::kDefault)
1348 qadm->SetEventSpecie(qadm->GetRecoParam()->GetEventSpecie()) ;
1350 AliError(Form("%d defined by %s is not an event specie", qadm->GetRecoParam()->GetEventSpecie(), qadm->GetName())) ;
1352 if ( qadm->IsCycleDone() ) {
1353 qadm->EndOfCycle() ;
1355 if (test.Contains("TreeD")) {
1356 qadm->Exec(AliQAv1::kDIGITSR, tree) ;
1357 } else if (test.Contains("TreeR")) {
1358 qadm->Exec(AliQAv1::kRECPOINTS, tree) ;
1365 //_____________________________________________________________________________
1366 Bool_t AliQAManager::Save2OCDB(const Int_t runNumber, AliRecoParam::EventSpecie_t es, const Char_t * year, const Char_t * detectors) const
1368 // take the locasl QA data merge into a single file and save in OCDB
1370 TString tmp(AliQAv1::GetQARefStorage()) ;
1371 if ( tmp.IsNull() ) {
1372 AliError("No storage defined, use AliQAv1::SetQARefStorage") ;
1375 if ( !(tmp.Contains(AliQAv1::GetLabLocalOCDB()) || tmp.Contains(AliQAv1::GetLabAliEnOCDB())) ) {
1376 AliError(Form("%s is a wrong storage, use %s or %s", AliQAv1::GetQARefStorage(), AliQAv1::GetLabLocalOCDB().Data(), AliQAv1::GetLabAliEnOCDB().Data())) ;
1379 TString sdet(detectors) ;
1382 if ( sdet.Contains("ALL") ) {
1383 rv = Merge(runNumber) ;
1386 TString inputFileName(Form("Merged.%s.Data.%d.root", AliQAv1::GetQADataFileName(), runNumber)) ;
1387 inputFile = TFile::Open(inputFileName.Data()) ;
1388 rv = SaveIt2OCDB(runNumber, inputFile, year, es) ;
1390 for (Int_t index = 0; index < AliQAv1::kNDET; index++) {
1391 if (sdet.Contains(AliQAv1::GetDetName(index))) {
1392 TString inputFileName(Form("%s.%s.%d.root", AliQAv1::GetDetName(index), AliQAv1::GetQADataFileName(), runNumber)) ;
1393 inputFile = TFile::Open(inputFileName.Data()) ;
1394 rv *= SaveIt2OCDB(runNumber, inputFile, year, es) ;
1401 //_____________________________________________________________________________
1402 Bool_t AliQAManager::SaveIt2OCDB(const Int_t runNumber, TFile * inputFile, const Char_t * year, AliRecoParam::EventSpecie_t es) const
1404 // reads the TH1 from file and adds it to appropriate list before saving to OCDB
1406 AliDebug(AliQAv1::GetQADebugLevel(), Form("Saving TH1s in %s to %s", inputFile->GetName(), AliQAv1::GetQARefStorage())) ;
1407 if ( ! IsDefaultStorageSet() ) {
1408 TString tmp( AliQAv1::GetQARefStorage() ) ;
1409 if ( tmp.Contains(AliQAv1::GetLabLocalOCDB()) )
1410 Instance()->SetDefaultStorage(AliQAv1::GetQARefStorage()) ;
1412 TString tmp1(AliQAv1::GetQARefDefaultStorage()) ;
1414 tmp1.Append("?user=alidaq") ;
1415 Instance()->SetDefaultStorage(tmp1.Data()) ;
1418 Instance()->SetSpecificStorage("*", AliQAv1::GetQARefStorage()) ;
1420 Instance()->SetRun(runNumber);
1422 AliCDBMetaData mdr ;
1423 mdr.SetResponsible("yves schutz");
1425 for ( Int_t detIndex = 0 ; detIndex < AliQAv1::kNDET ; detIndex++) {
1426 TDirectory * detDir = inputFile->GetDirectory(AliQAv1::GetDetName(detIndex)) ;
1428 AliDebug(AliQAv1::GetQADebugLevel(), Form("Entering %s", detDir->GetName())) ;
1429 AliQAv1::SetQARefDataDirName(es) ;
1430 TString detOCDBDir(Form("%s/%s/%s", AliQAv1::GetDetName(detIndex), AliQAv1::GetRefOCDBDirName(), AliQAv1::GetRefDataDirName())) ;
1431 AliCDBId idr(detOCDBDir.Data(), runNumber, AliCDBRunRange::Infinity()) ;
1432 TList * listDetQAD = new TList() ;
1433 TString listName(Form("%s QA data Reference", AliQAv1::GetDetName(detIndex))) ;
1434 mdr.SetComment(Form("%s QA stuff", AliQAv1::GetDetName(detIndex)));
1435 listDetQAD->SetName(listName) ;
1436 TList * taskList = detDir->GetListOfKeys() ;
1437 TIter nextTask(taskList) ;
1439 while ( (taskKey = static_cast<TKey*>(nextTask())) ) {
1440 TDirectory * taskDir = detDir->GetDirectory(taskKey->GetName()) ;
1441 TDirectory * esDir = taskDir->GetDirectory(AliRecoParam::GetEventSpecieName(es)) ;
1442 AliDebug(AliQAv1::GetQADebugLevel(), Form("Saving %s", esDir->GetName())) ;
1443 TObjArray * listTaskQAD = new TObjArray(100) ;
1444 listTaskQAD->SetName(Form("%s/%s", taskKey->GetName(), AliRecoParam::GetEventSpecieName(es))) ;
1445 listDetQAD->Add(listTaskQAD) ;
1446 TList * histList = esDir->GetListOfKeys() ;
1447 TIter nextHist(histList) ;
1449 while ( (histKey = static_cast<TKey*>(nextHist())) ) {
1450 TObject * odata = esDir->Get(histKey->GetName()) ;
1452 AliError(Form("%s in %s/%s returns a NULL pointer !!", histKey->GetName(), detDir->GetName(), taskDir->GetName())) ;
1454 if ( AliQAv1::GetExpert() == histKey->GetName() ) {
1455 TDirectory * expertDir = esDir->GetDirectory(histKey->GetName()) ;
1456 TList * expertHistList = expertDir->GetListOfKeys() ;
1457 TIter nextExpertHist(expertHistList) ;
1458 TKey * expertHistKey ;
1459 while ( (expertHistKey = static_cast<TKey*>(nextExpertHist())) ) {
1460 TObject * expertOdata = expertDir->Get(expertHistKey->GetName()) ;
1461 if ( !expertOdata ) {
1462 AliError(Form("%s in %s/%s/Expert returns a NULL pointer !!", expertHistKey->GetName(), detDir->GetName(), taskDir->GetName())) ;
1464 AliDebug(AliQAv1::GetQADebugLevel(), Form("Adding %s", expertHistKey->GetName())) ;
1465 if ( expertOdata->IsA()->InheritsFrom("TH1") ) {
1466 AliDebug(AliQAv1::GetQADebugLevel(), Form("Adding %s", expertHistKey->GetName())) ;
1467 TH1 * hExpertdata = static_cast<TH1*>(expertOdata) ;
1468 listTaskQAD->Add(hExpertdata) ;
1473 AliDebug(AliQAv1::GetQADebugLevel(), Form("Adding %s", histKey->GetName())) ;
1474 if ( odata->IsA()->InheritsFrom("TH1") ) {
1475 AliDebug(AliQAv1::GetQADebugLevel(), Form("Adding %s", histKey->GetName())) ;
1476 TH1 * hdata = static_cast<TH1*>(odata) ;
1477 listTaskQAD->Add(hdata) ;
1482 Instance()->Put(listDetQAD, idr, &mdr) ;
1488 //_____________________________________________________________________________
1490 void AliQAManager::SetCheckerExternParam(AliQAv1::DETECTORINDEX_t detIndex, TList * parameterList)
1492 // set the external parameters list for the detector checkers
1493 AliQACheckerBase * qac = AliQAChecker::Instance()->GetDetQAChecker(detIndex) ;
1494 qac->SetExternParamlist(parameterList) ;
1495 qac->PrintExternParam() ;
1498 //_____________________________________________________________________________
1499 void AliQAManager::SetEventSpecie(AliRecoParam::EventSpecie_t es)
1501 // set the current event specie and inform AliQAv1 that this event specie has been encountered
1503 AliQAv1::Instance()->SetEventSpecie(es) ;
1506 //_____________________________________________________________________________
1507 void AliQAManager::SetRecoParam(const Int_t det, const AliDetectorRecoParam *par)
1509 // Set custom reconstruction parameters for a given detector
1510 // Single set of parameters for all the events
1511 GetQADataMaker(det)->SetRecoParam(par) ;
1514 //_____________________________________________________________________________
1515 void AliQAManager::SetWriteExpert()
1517 // enable the writing of QA expert data
1518 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1519 if (IsSelected(AliQAv1::GetDetName(iDet)))
1520 fQAWriteExpert[iDet] = kTRUE ;
1524 //_____________________________________________________________________________
1525 void AliQAManager::Destroy() {
1526 // delete AliQAManager instance and
1527 // all associated objects
1530 delete fgQAInstance ;
1531 fgQAInstance = NULL ;
1535 //_____________________________________________________________________________
1536 void AliQAManager::ShowQA() {
1537 // Show the result of the QA checking
1538 // for all detectors
1539 for ( Int_t detIndex = 0 ; detIndex < AliQAv1::kNDET ; detIndex++)
1540 AliQAv1::Instance(AliQAv1::GetDetIndex(AliQAv1::GetDetName(detIndex)))->Show() ;