overwrite the image after each cycle
[u/mrichter/AliRoot.git] / STEER / AliQAManager.cxx
CommitLineData
2e331c8b 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: AliQAManager.cxx 30894 2009-02-05 13:46:48Z schutz $ */
17///////////////////////////////////////////////////////////////////////////////
18// //
19// class for running the QA makers //
20// //
bf76b847 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); //
2e331c8b 28// //
29///////////////////////////////////////////////////////////////////////////////
30
fec0891b 31#include <TCanvas.h>
2e331c8b 32#include <TKey.h>
33#include <TFile.h>
34#include <TFileMerger.h>
149a2367 35#include <TGrid.h>
36#include <TGridCollection.h>
37#include <TGridResult.h>
2e331c8b 38#include <TPluginManager.h>
39#include <TROOT.h>
40#include <TString.h>
41#include <TSystem.h>
7c9ff472 42#include <TStopwatch.h>
2e331c8b 43
44#include "AliCDBManager.h"
45#include "AliCDBEntry.h"
46#include "AliCDBId.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"
55#include "AliLog.h"
56#include "AliModule.h"
4e25ac79 57#include "AliQAv1.h"
634696f5 58#include "AliQAChecker.h"
59#include "AliQACheckerBase.h"
2e331c8b 60#include "AliQADataMakerRec.h"
61#include "AliQADataMakerSim.h"
62#include "AliQAManager.h"
63#include "AliRawReaderDate.h"
64#include "AliRawReaderFile.h"
65#include "AliRawReaderRoot.h"
66#include "AliRun.h"
67#include "AliRunLoader.h"
68#include "AliRunTag.h"
69
70ClassImp(AliQAManager)
71AliQAManager* AliQAManager::fgQAInstance = 0x0;
72
73//_____________________________________________________________________________
74AliQAManager::AliQAManager() :
75 AliCDBManager(),
76 fCurrentEvent(0),
77 fCycleSame(kFALSE),
78 fDetectors("ALL"),
79 fDetectorsW("ALL"),
80 fESD(NULL),
81 fESDTree(NULL),
82 fGAliceFileName(""),
83 fFirstEvent(0),
84 fMaxEvents(0),
85 fMode(""),
86 fNumberOfEvents(999999),
87 fRecoParam(),
88 fRunNumber(0),
89 fRawReader(NULL),
90 fRawReaderDelete(kTRUE),
91 fRunLoader(NULL),
bc8761a0 92 fTasks(""),
fec0891b 93 fEventSpecie(AliRecoParam::kDefault),
50dee02c 94 fPrintImage(kTRUE),
95 fSaveData(kTRUE)
2e331c8b 96{
97 // default ctor
98 fMaxEvents = fNumberOfEvents ;
99 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
4e25ac79 100 if (IsSelected(AliQAv1::GetDetName(iDet))) {
2e331c8b 101 fLoader[iDet] = NULL ;
102 fQADataMaker[iDet] = NULL ;
103 fQACycles[iDet] = 999999 ;
2e331c8b 104 }
105 }
75373542 106 SetWriteExpert() ;
2e331c8b 107}
108
109//_____________________________________________________________________________
634696f5 110AliQAManager::AliQAManager(AliQAv1::MODE_t mode, const Char_t* gAliceFilename) :
2e331c8b 111 AliCDBManager(),
112 fCurrentEvent(0),
113 fCycleSame(kFALSE),
114 fDetectors("ALL"),
115 fDetectorsW("ALL"),
116 fESD(NULL),
117 fESDTree(NULL),
118 fGAliceFileName(gAliceFilename),
119 fFirstEvent(0),
120 fMaxEvents(0),
634696f5 121 fMode(AliQAv1::GetModeName(mode)),
2e331c8b 122 fNumberOfEvents(999999),
123 fRecoParam(),
124 fRunNumber(0),
125 fRawReader(NULL),
126 fRawReaderDelete(kTRUE),
127 fRunLoader(NULL),
bc8761a0 128 fTasks(""),
fec0891b 129 fEventSpecie(AliRecoParam::kDefault),
50dee02c 130 fPrintImage(kTRUE),
131 fSaveData(kTRUE)
2e331c8b 132{
133 // default ctor
134 fMaxEvents = fNumberOfEvents ;
135 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
4e25ac79 136 if (IsSelected(AliQAv1::GetDetName(iDet))) {
2e331c8b 137 fLoader[iDet] = NULL ;
138 fQADataMaker[iDet] = NULL ;
139 fQACycles[iDet] = 999999 ;
65660bf3 140 }
141 }
75373542 142 SetWriteExpert() ;
2e331c8b 143}
144
145//_____________________________________________________________________________
146AliQAManager::AliQAManager(const AliQAManager & qas) :
147 AliCDBManager(),
148 fCurrentEvent(qas.fCurrentEvent),
149 fCycleSame(kFALSE),
150 fDetectors(qas.fDetectors),
151 fDetectorsW(qas.fDetectorsW),
152 fESD(NULL),
153 fESDTree(NULL),
154 fGAliceFileName(qas.fGAliceFileName),
155 fFirstEvent(qas.fFirstEvent),
156 fMaxEvents(qas.fMaxEvents),
157 fMode(qas.fMode),
158 fNumberOfEvents(qas.fNumberOfEvents),
159 fRecoParam(),
160 fRunNumber(qas.fRunNumber),
161 fRawReader(NULL),
162 fRawReaderDelete(kTRUE),
163 fRunLoader(NULL),
bc8761a0 164 fTasks(qas.fTasks),
fec0891b 165 fEventSpecie(qas.fEventSpecie),
50dee02c 166 fPrintImage(qas.fPrintImage),
167 fSaveData(qas.fSaveData)
fec0891b 168
2e331c8b 169{
170 // cpy ctor
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] ;
176 }
177}
178
179//_____________________________________________________________________________
180AliQAManager & AliQAManager::operator = (const AliQAManager & qas)
181{
182 // assignment operator
183 this->~AliQAManager() ;
184 new(this) AliQAManager(qas) ;
185 return *this ;
186}
187
188//_____________________________________________________________________________
189AliQAManager::~AliQAManager()
190{
191 // dtor
192 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
4e25ac79 193 if (IsSelected(AliQAv1::GetDetName(iDet))) {
2e331c8b 194 fLoader[iDet] = NULL;
195 if (fQADataMaker[iDet]) {
196 (fQADataMaker[iDet])->Finish() ;
197 delete fQADataMaker[iDet] ;
198 }
199 }
200 }
201 if (fRawReaderDelete) {
202 fRunLoader = NULL ;
203 delete fRawReader ;
204 fRawReader = NULL ;
205 }
cd2a0b54 206// TCanvas fakeCanvas ;
207// if (fPrintImage)
208// fakeCanvas.Print(Form("%s%s%d.%s]", AliQAv1::GetImageFileName(), GetMode(), fRunNumber, AliQAv1::GetImageFileFormat()), "ps");
2e331c8b 209}
210
211//_____________________________________________________________________________
4e25ac79 212Bool_t AliQAManager::DoIt(const AliQAv1::TASKINDEX_t taskIndex)
2e331c8b 213{
214 // Runs all the QA data Maker for every detector
215
216 Bool_t rv = kFALSE ;
217 // Fill QA data in event loop
218 for (UInt_t iEvent = fFirstEvent ; iEvent < (UInt_t)fMaxEvents ; iEvent++) {
219 fCurrentEvent++ ;
220 // Get the event
221 if ( iEvent%10 == 0 )
5379c4a3 222 AliDebug(AliQAv1::GetQADebugLevel(), Form("processing event %d", iEvent));
4e25ac79 223 if ( taskIndex == AliQAv1::kRAWS ) {
2e331c8b 224 if ( !fRawReader->NextEvent() )
225 break ;
4e25ac79 226 } else if ( taskIndex == AliQAv1::kESDS ) {
2e331c8b 227 if ( fESDTree->GetEntry(iEvent) == 0 )
228 break ;
229 } else {
230 if ( fRunLoader->GetEvent(iEvent) != 0 )
231 break ;
232 }
233 // loop over active loaders
234 for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
4e25ac79 235 if (IsSelected(AliQAv1::GetDetName(iDet))) {
2e331c8b 236 AliQADataMaker * qadm = GetQADataMaker(iDet) ;
237 if (!qadm) continue; // This detector doesn't have any QA (for example, HLT)
238 if ( qadm->IsCycleDone() ) {
239 qadm->EndOfCycle(taskIndex) ;
240 }
241 TTree * data = NULL ;
242 AliLoader* loader = GetLoader(qadm->GetUniqueID());
243 switch (taskIndex) {
4e25ac79 244 case AliQAv1::kNULLTASKINDEX :
2e331c8b 245 break ;
4e25ac79 246 case AliQAv1::kRAWS :
2e331c8b 247 qadm->Exec(taskIndex, fRawReader) ;
248 break ;
4e25ac79 249 case AliQAv1::kHITS :
2e331c8b 250 if( loader ) {
251 loader->LoadHits() ;
252 data = loader->TreeH() ;
253 if ( ! data ) {
4e25ac79 254 AliWarning(Form(" Hit Tree not found for %s", AliQAv1::GetDetName(iDet))) ;
2e331c8b 255 break ;
256 }
eca4fa66 257 qadm->Exec(taskIndex, data) ;
2e331c8b 258 }
2e331c8b 259 break ;
4e25ac79 260 case AliQAv1::kSDIGITS :
95144eea 261 {
262
263 TString fileName(Form("%s.SDigits.root", AliQAv1::GetDetName(iDet))) ;
264 if (gSystem->FindFile("./", fileName)) {
265 if( loader ) {
266 loader->LoadSDigits() ;
267 data = loader->TreeS() ;
268 if ( ! data ) {
269 AliWarning(Form(" SDigit Tree not found for %s", AliQAv1::GetDetName(iDet))) ;
270 break ;
271 }
272 qadm->Exec(taskIndex, data) ;
273 }
2e331c8b 274 }
95144eea 275 }
2e331c8b 276 break;
4e25ac79 277 case AliQAv1::kDIGITS :
fec0891b 278 if( loader ) {
279 loader->LoadDigits() ;
280 data = loader->TreeD() ;
281 if ( ! data ) {
282 AliWarning(Form(" Digit Tree not found for %s", AliQAv1::GetDetName(iDet))) ;
283 break ;
284 }
eca4fa66 285 qadm->Exec(taskIndex, data) ;
fec0891b 286 }
eca4fa66 287 break;
fec0891b 288 case AliQAv1::kDIGITSR :
289 if( loader ) {
290 loader->LoadDigits() ;
291 data = loader->TreeD() ;
292 if ( ! data ) {
293 AliWarning(Form(" Digit Tree not found for %s", AliQAv1::GetDetName(iDet))) ;
294 break ;
295 }
eca4fa66 296 qadm->Exec(taskIndex, data) ;
fec0891b 297 }
2e331c8b 298 break;
4e25ac79 299 case AliQAv1::kRECPOINTS :
2e331c8b 300 if( loader ) {
301 loader->LoadRecPoints() ;
302 data = loader->TreeR() ;
303 if (!data) {
4e25ac79 304 AliWarning(Form("RecPoints not found for %s", AliQAv1::GetDetName(iDet))) ;
2e331c8b 305 break ;
306 }
eca4fa66 307 qadm->Exec(taskIndex, data) ;
2e331c8b 308 }
2e331c8b 309 break;
4e25ac79 310 case AliQAv1::kTRACKSEGMENTS :
2e331c8b 311 break;
4e25ac79 312 case AliQAv1::kRECPARTICLES :
2e331c8b 313 break;
4e25ac79 314 case AliQAv1::kESDS :
2e331c8b 315 qadm->Exec(taskIndex, fESD) ;
316 break;
4e25ac79 317 case AliQAv1::kNTASKINDEX :
2e331c8b 318 break;
319 } //task switch
320 }
321 } // detector loop
5e303886 322 Increment(taskIndex) ;
2e331c8b 323 } // event loop
324 // Save QA data for all detectors
5e303886 325
2e331c8b 326 rv = Finish(taskIndex) ;
327
4e25ac79 328 if ( taskIndex == AliQAv1::kRAWS )
2e331c8b 329 fRawReader->RewindEvents() ;
330
331 return rv ;
332}
333
334//_____________________________________________________________________________
4e25ac79 335Bool_t AliQAManager::Finish(const AliQAv1::TASKINDEX_t taskIndex)
2e331c8b 336{
337 // write output to file for all detectors
8fa875cb 338
339 AliQAChecker::Instance()->SetRunNumber(fRunNumber) ;
340
2e331c8b 341 for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
4e25ac79 342 if (IsSelected(AliQAv1::GetDetName(iDet))) {
2e331c8b 343 AliQADataMaker * qadm = GetQADataMaker(iDet) ;
344 if (qadm)
345 qadm->EndOfCycle(taskIndex) ;
346 }
347 }
348 return kTRUE ;
349}
350
351//_____________________________________________________________________________
fec0891b 352TObjArray * AliQAManager::GetFromOCDB(AliQAv1::DETECTORINDEX_t det, AliQAv1::TASKINDEX_t task, const Char_t * year) const
2e331c8b 353{
354 // Retrieve the list of QA data for a given detector and a given task
355 TObjArray * rv = NULL ;
4e25ac79 356 if ( !strlen(AliQAv1::GetQARefStorage()) ) {
357 AliError("No storage defined, use AliQAv1::SetQARefStorage") ;
2e331c8b 358 return NULL ;
359 }
360 if ( ! IsDefaultStorageSet() ) {
4e25ac79 361 TString tmp(AliQAv1::GetQARefDefaultStorage()) ;
2e331c8b 362 tmp.Append(year) ;
363 tmp.Append("/") ;
364 Instance()->SetDefaultStorage(tmp.Data()) ;
4e25ac79 365 Instance()->SetSpecificStorage(Form("%s/*", AliQAv1::GetQAName()), AliQAv1::GetQARefStorage()) ;
2e331c8b 366 }
4e25ac79 367 TString detOCDBDir(Form("%s/%s/%s", AliQAv1::GetQAName(), AliQAv1::GetDetName((Int_t)det), AliQAv1::GetRefOCDBDirName())) ;
5379c4a3 368 AliDebug(AliQAv1::GetQADebugLevel(), Form("Retrieving reference data from %s/%s for %s", AliQAv1::GetQARefStorage(), detOCDBDir.Data(), AliQAv1::GetTaskName(task).Data())) ;
2e331c8b 369 AliCDBEntry* entry = QAManager()->Get(detOCDBDir.Data(), 0) ; //FIXME 0 --> Run Number
eca4fa66 370 TList * listDetQAD = static_cast<TList *>(entry->GetObject()) ;
2e331c8b 371 if ( listDetQAD )
eca4fa66 372 rv = static_cast<TObjArray *>(listDetQAD->FindObject(AliQAv1::GetTaskName(task))) ;
2e331c8b 373 return rv ;
374}
375
fec0891b 376//_____________________________________________________________________________
377TCanvas ** AliQAManager::GetImage(Char_t * detName)
378{
379 // retrieves QA Image for the given detector
380 TCanvas ** rv = NULL ;
381 Int_t detIndex = AliQAv1::GetDetIndex(detName) ;
634696f5 382 AliQACheckerBase * qac = AliQAChecker::Instance()->GetDetQAChecker(detIndex) ;
383 rv = qac->GetImage() ;
fec0891b 384 return rv ;
385}
386
2e331c8b 387//_____________________________________________________________________________
388AliLoader * AliQAManager::GetLoader(Int_t iDet)
389{
390 // get the loader for a detector
391
bf76b847 392 if ( !fRunLoader || iDet == AliQAv1::kCORR || iDet == AliQAv1::kGLOBAL )
2e331c8b 393 return NULL ;
394
4e25ac79 395 TString detName = AliQAv1::GetDetName(iDet) ;
2e331c8b 396 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
397 if (fLoader[iDet])
398 return fLoader[iDet] ;
399
400 // load the QA data maker object
401 TPluginManager* pluginManager = gROOT->GetPluginManager() ;
402 TString loaderName = "Ali" + detName + "Loader" ;
403
404 AliLoader * loader = NULL ;
405 // first check if a plugin is defined for the quality assurance data maker
406 TPluginHandler* pluginHandler = pluginManager->FindHandler("AliLoader", detName) ;
407 // if not, add a plugin for it
408 if (!pluginHandler) {
5379c4a3 409 AliDebug(AliQAv1::GetQADebugLevel(), Form("defining plugin for %s", loaderName.Data())) ;
2e331c8b 410 TString libs = gSystem->GetLibraries() ;
411 if (libs.Contains("lib" + detName + "base.so") || (gSystem->Load("lib" + detName + "base.so") >= 0)) {
412 pluginManager->AddHandler("AliQADataMaker", detName, loaderName, detName + "loader", loaderName + "()") ;
413 } else {
414 pluginManager->AddHandler("AliLoader", detName, loaderName, detName, loaderName + "()") ;
415 }
416 pluginHandler = pluginManager->FindHandler("AliLoader", detName) ;
417 }
418 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
419 loader = (AliLoader *) pluginHandler->ExecPlugin(0) ;
420 }
421 if (loader)
422 fLoader[iDet] = loader ;
423 return loader ;
424}
425
426//_____________________________________________________________________________
4e25ac79 427AliQAv1 * AliQAManager::GetQA(UInt_t run, UInt_t evt)
2e331c8b 428{
429// retrieves the QA object stored in a file named "Run{run}.Event{evt}_1.ESD.tag.root"
fec0891b 430 Char_t * fileName = Form("Run%d.Event%d_1.ESD.tag.root", run, evt) ;
2e331c8b 431 TFile * tagFile = TFile::Open(fileName) ;
432 if ( !tagFile ) {
433 AliError(Form("File %s not found", fileName)) ;
434 return NULL ;
435 }
eca4fa66 436 TTree * tagTree = static_cast<TTree *>(tagFile->Get("T")) ;
2e331c8b 437 if ( !tagTree ) {
438 AliError(Form("Tree T not found in %s", fileName)) ;
439 tagFile->Close() ;
440 return NULL ;
441 }
442 AliRunTag * tag = new AliRunTag ;
443 tagTree->SetBranchAddress("AliTAG", &tag) ;
444 tagTree->GetEntry(evt) ;
4e25ac79 445 AliQAv1 * qa = AliQAv1::Instance(tag->GetQALength(), tag->GetQAArray(), tag->GetESLength(), tag->GetEventSpecies()) ;
2e331c8b 446 tagFile->Close() ;
447 return qa ;
448}
449
450//_____________________________________________________________________________
451AliQADataMaker * AliQAManager::GetQADataMaker(const Int_t iDet)
452{
453 // get the quality assurance data maker for a detector
454
eca4fa66 455 AliQADataMaker * qadm = fQADataMaker[iDet] ;
456
457 if (qadm) {
458
5e232cd6 459 qadm->SetEventSpecie(fEventSpecie) ;
bc8761a0 460 if ( qadm->GetRecoParam() )
eca4fa66 461 if ( AliRecoParam::Convert(qadm->GetRecoParam()->GetEventSpecie()) != AliRecoParam::kDefault)
5e232cd6 462 qadm->SetEventSpecie(qadm->GetRecoParam()->GetEventSpecie()) ;
2e331c8b 463
eca4fa66 464 } else if (iDet == AliQAv1::kGLOBAL) { //Global QA
465
466 qadm = new AliGlobalQADataMaker();
4e25ac79 467 qadm->SetName(AliQAv1::GetDetName(iDet));
2e331c8b 468 qadm->SetUniqueID(iDet);
469 fQADataMaker[iDet] = qadm;
5e232cd6 470 qadm->SetEventSpecie(fEventSpecie) ;
bc8761a0 471 if ( qadm->GetRecoParam() )
5e232cd6 472 if ( AliRecoParam::Convert(qadm->GetRecoParam()->GetEventSpecie()) != AliRecoParam::kDefault)
473 qadm->SetEventSpecie(qadm->GetRecoParam()->GetEventSpecie()) ;
2e331c8b 474
eca4fa66 475 } else if (iDet == AliQAv1::kCORR && strcmp(GetMode(), "Rec") == 0 ) { //the data maker for correlations among detectors
476 qadm = new AliCorrQADataMakerRec(fQADataMaker) ;
4e25ac79 477 qadm->SetName(AliQAv1::GetDetName(iDet));
2e331c8b 478 qadm->SetUniqueID(iDet);
eca4fa66 479 fQADataMaker[iDet] = qadm;
5e232cd6 480 qadm->SetEventSpecie(fEventSpecie) ;
bc8761a0 481 if ( qadm->GetRecoParam() )
5e232cd6 482 if ( AliRecoParam::Convert(qadm->GetRecoParam()->GetEventSpecie()) != AliRecoParam::kDefault)
483 qadm->SetEventSpecie(qadm->GetRecoParam()->GetEventSpecie()) ;
2e331c8b 484
6090cc85 485 } else if ( iDet < AliQAv1::kGLOBAL ) {
eca4fa66 486
487 // load the QA data maker object
488 TPluginManager* pluginManager = gROOT->GetPluginManager() ;
489 TString detName = AliQAv1::GetDetName(iDet) ;
490 TString qadmName = "Ali" + detName + "QADataMaker" + GetMode() ;
491
492 // first check if a plugin is defined for the quality assurance data maker
493 TPluginHandler* pluginHandler = pluginManager->FindHandler("AliQADataMaker", detName) ;
494 // if not, add a plugin for it
495 if (!pluginHandler) {
496 AliDebug(AliQAv1::GetQADebugLevel(), Form("defining plugin for %s", qadmName.Data())) ;
497 TString libs = gSystem->GetLibraries() ;
bf76b847 498 TString temp(GetMode()) ;
499 temp.ToLower() ;
500 if (libs.Contains("lib" + detName + GetMode() + ".so") || (gSystem->Load("lib" + detName + temp.Data() + ".so") >= 0)) {
eca4fa66 501 pluginManager->AddHandler("AliQADataMaker", detName, qadmName, detName + "qadm", qadmName + "()") ;
502 } else {
503 pluginManager->AddHandler("AliQADataMaker", detName, qadmName, detName, qadmName + "()") ;
504 }
505 pluginHandler = pluginManager->FindHandler("AliQADataMaker", detName) ;
506 }
507 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
508 qadm = (AliQADataMaker *) pluginHandler->ExecPlugin(0) ;
509 }
510 if (qadm) {
511 qadm->SetName(AliQAv1::GetDetName(iDet));
512 qadm->SetUniqueID(iDet);
513 fQADataMaker[iDet] = qadm ;
514 qadm->SetEventSpecie(fEventSpecie) ;
515 if ( qadm->GetRecoParam() )
516 if ( AliRecoParam::Convert(qadm->GetRecoParam()->GetEventSpecie()) != AliRecoParam::kDefault)
517 qadm->SetEventSpecie(qadm->GetRecoParam()->GetEventSpecie()) ;
518 }
519 }
2e331c8b 520 return qadm ;
521}
522
523//_____________________________________________________________________________
524void AliQAManager::EndOfCycle(TObjArray * detArray)
525{
526 // End of cycle QADataMakers
527
8fa875cb 528 AliQAChecker::Instance()->SetRunNumber(fRunNumber) ;
cd2a0b54 529 TCanvas fakeCanvas ;
530 if (fPrintImage)
1d46dcf4 531 fakeCanvas.Print(Form("%s%s%d.%s[", AliQAv1::GetImageFileName(), GetMode(), fRunNumber, AliQAv1::GetImageFileFormat()), "ps") ;
2e331c8b 532 for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
4e25ac79 533 if (IsSelected(AliQAv1::GetDetName(iDet))) {
2e331c8b 534 AliQADataMaker * qadm = GetQADataMaker(iDet) ;
634696f5 535 AliQACheckerBase * qac = AliQAChecker::Instance()->GetDetQAChecker(iDet) ;
2e331c8b 536 if (!qadm)
537 continue ;
538 // skip non active detectors
539 if (detArray) {
4e25ac79 540 AliModule* det = static_cast<AliModule*>(detArray->FindObject(AliQAv1::GetDetName(iDet))) ;
2e331c8b 541 if (!det || !det->IsActive())
542 continue ;
543 }
6090cc85 544 if (qac)
545 qac->SetPrintImage(fPrintImage) ;
d338b679 546 for (UInt_t taskIndex = 0; taskIndex < AliQAv1::kNTASKINDEX; taskIndex++) {
547 if ( fTasks.Contains(Form("%d", taskIndex)) )
548 qadm->EndOfCycle(AliQAv1::GetTaskIndex(AliQAv1::GetTaskName(taskIndex))) ;
50dee02c 549 }
2e331c8b 550 qadm->Finish();
551 }
552 }
cd2a0b54 553 if (fPrintImage)
554 fakeCanvas.Print(Form("%s%s%d.%s]", AliQAv1::GetImageFileName(), GetMode(), fRunNumber, AliQAv1::GetImageFileFormat()), "ps");
2e331c8b 555}
556
557//_____________________________________________________________________________
558void AliQAManager::EndOfCycle(TString detectors)
559{
560 // End of cycle QADataMakers
561
634696f5 562 AliQAChecker::Instance()->SetRunNumber(fRunNumber) ;
cd2a0b54 563 TCanvas fakeCanvas ;
564 if (fPrintImage)
1d46dcf4 565 fakeCanvas.Print(Form("%s%s%d.%s[", AliQAv1::GetImageFileName(), GetMode(), fRunNumber, AliQAv1::GetImageFileFormat()), "ps") ;
fec0891b 566 for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
4e25ac79 567 if (IsSelected(AliQAv1::GetDetName(iDet))) {
2e331c8b 568 AliQADataMaker * qadm = GetQADataMaker(iDet) ;
634696f5 569 AliQACheckerBase * qac = AliQAChecker::Instance()->GetDetQAChecker(iDet) ;
2e331c8b 570 if (!qadm)
571 continue ;
572 // skip non active detectors
4e25ac79 573 if (!detectors.Contains(AliQAv1::GetDetName(iDet)))
2e331c8b 574 continue ;
6090cc85 575 if (qac)
576 qac->SetPrintImage(fPrintImage) ;
d338b679 577 for (UInt_t taskIndex = 0; taskIndex < AliQAv1::kNTASKINDEX; taskIndex++) {
578 if ( fTasks.Contains(Form("%d", taskIndex)) )
579 qadm->EndOfCycle(AliQAv1::GetTaskIndex(AliQAv1::GetTaskName(taskIndex))) ;
50dee02c 580 }
2e331c8b 581 qadm->Finish();
582 }
583 }
cd2a0b54 584 if (fPrintImage)
585 fakeCanvas.Print(Form("%s%s%d.%s]", AliQAv1::GetImageFileName(), GetMode(), fRunNumber, AliQAv1::GetImageFileFormat()), "ps");
2e331c8b 586}
587
588//_____________________________________________________________________________
5e303886 589void AliQAManager::Increment(const AliQAv1::TASKINDEX_t taskIndex)
2e331c8b 590{
591 // Increments the cycle counter for all QA Data Makers
5e303886 592 static AliQAv1::TASKINDEX_t currentTask = AliQAv1::kNTASKINDEX ;
593 if (currentTask == taskIndex)
594 return ;
595 else
596 currentTask = taskIndex ;
2e331c8b 597 for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
4e25ac79 598 if (IsSelected(AliQAv1::GetDetName(iDet))) {
2e331c8b 599 AliQADataMaker * qadm = GetQADataMaker(iDet) ;
600 if (qadm)
601 qadm->Increment() ;
602 }
603 }
604}
605
606//_____________________________________________________________________________
fec0891b 607Bool_t AliQAManager::InitQA(const AliQAv1::TASKINDEX_t taskIndex, const Char_t * input )
2e331c8b 608{
609 // Initialize the event source and QA data makers
610
611 fTasks += Form("%d", taskIndex) ;
612
4e25ac79 613 if (taskIndex == AliQAv1::kRAWS) {
2e331c8b 614 if (!fRawReader) {
615 fRawReader = AliRawReader::Create(input);
616 }
617 if ( ! fRawReader )
618 return kFALSE ;
619 fRawReaderDelete = kTRUE ;
620 fRawReader->NextEvent() ;
621 fRunNumber = fRawReader->GetRunNumber() ;
622 SetRun(fRunNumber) ;
623 fRawReader->RewindEvents();
624 fNumberOfEvents = 999999 ;
625 if ( fMaxEvents < 0 )
626 fMaxEvents = fNumberOfEvents ;
4e25ac79 627 } else if (taskIndex == AliQAv1::kESDS) {
628 fTasks = AliQAv1::GetTaskName(AliQAv1::kESDS) ;
2e331c8b 629 if (!gSystem->AccessPathName("AliESDs.root")) { // AliESDs.root exists
630 TFile * esdFile = TFile::Open("AliESDs.root") ;
eca4fa66 631 fESDTree = static_cast<TTree *> (esdFile->Get("esdTree")) ;
2e331c8b 632 if ( !fESDTree ) {
633 AliError("esdTree not found") ;
634 return kFALSE ;
635 } else {
636 fESD = new AliESDEvent() ;
637 fESD->ReadFromTree(fESDTree) ;
638 fESDTree->GetEntry(0) ;
639 fRunNumber = fESD->GetRunNumber() ;
640 fNumberOfEvents = fESDTree->GetEntries() ;
641 if ( fMaxEvents < 0 )
642 fMaxEvents = fNumberOfEvents ;
643 }
644 } else {
645 AliError("AliESDs.root not found") ;
646 return kFALSE ;
647 }
648 } else {
649 if ( !InitRunLoader() ) {
650 AliWarning("No Run Loader not found") ;
651 } else {
652 fNumberOfEvents = fRunLoader->GetNumberOfEvents() ;
653 if ( fMaxEvents < 0 )
654 fMaxEvents = fNumberOfEvents ;
655 }
656 }
657
658 // Get Detectors
659 TObjArray* detArray = NULL ;
660 if (fRunLoader) // check if RunLoader exists
661 if ( fRunLoader->GetAliRun() ) { // check if AliRun exists in gAlice.root
662 detArray = fRunLoader->GetAliRun()->Detectors() ;
663 fRunNumber = fRunLoader->GetHeader()->GetRun() ;
664 }
665
666 // Initialize all QA data makers for all detectors
667 fRunNumber = AliCDBManager::Instance()->GetRun() ;
668 if ( ! AliGeomManager::GetGeometry() )
669 AliGeomManager::LoadGeometry() ;
670
671 InitQADataMaker(fRunNumber, detArray) ; //, fCycleSame, kTRUE, detArray) ;
fec0891b 672 if (fPrintImage) {
673 TCanvas fakeCanvas ;
7c9ff472 674 TStopwatch timer ;
675 timer.Start() ;
676 while (timer.CpuTime()<5) {
677 timer.Continue();
678 gSystem->ProcessEvents();
679 }
1d46dcf4 680 fakeCanvas.Print(Form("%s%s%d.%s[", AliQAv1::GetImageFileName(), GetMode(), fRunNumber, AliQAv1::GetImageFileFormat()), "ps") ;
fec0891b 681 }
2e331c8b 682 return kTRUE ;
683}
684
685//_____________________________________________________________________________
686void AliQAManager::InitQADataMaker(UInt_t run, TObjArray * detArray)
687{
688 // Initializes The QADataMaker for all active detectors and for all active tasks
fec0891b 689 fRunNumber = run ;
2e331c8b 690 for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
4e25ac79 691 if (IsSelected(AliQAv1::GetDetName(iDet))) {
2e331c8b 692 AliQADataMaker * qadm = GetQADataMaker(iDet) ;
693 if (!qadm) {
4e25ac79 694 AliError(Form("AliQADataMaker not found for %s", AliQAv1::GetDetName(iDet))) ;
695 fDetectorsW.ReplaceAll(AliQAv1::GetDetName(iDet), "") ;
2e331c8b 696 } else {
697 if (fQAWriteExpert[iDet])
698 qadm->SetWriteExpert() ;
5379c4a3 699 AliDebug(AliQAv1::GetQADebugLevel(), Form("Data Maker found for %s %d", qadm->GetName(), qadm->WriteExpert())) ;
2e331c8b 700 // skip non active detectors
701 if (detArray) {
4e25ac79 702 AliModule* det = static_cast<AliModule*>(detArray->FindObject(AliQAv1::GetDetName(iDet))) ;
2e331c8b 703 if (!det || !det->IsActive())
704 continue ;
705 }
2e331c8b 706 // Set default reco params
707 Bool_t sameCycle = kFALSE ;
4e25ac79 708 for (UInt_t taskIndex = 0; taskIndex < AliQAv1::kNTASKINDEX; taskIndex++) {
2e331c8b 709 if ( fTasks.Contains(Form("%d", taskIndex)) ) {
4e25ac79 710 qadm->Init(AliQAv1::GetTaskIndex(AliQAv1::GetTaskName(taskIndex)), GetQACycles(qadm->GetUniqueID())) ;
711 qadm->StartOfCycle(AliQAv1::GetTaskIndex(AliQAv1::GetTaskName(taskIndex)), run, sameCycle) ;
2e331c8b 712 sameCycle = kTRUE ;
713 }
714 }
715 }
716 }
717 }
718}
719
720
721//_____________________________________________________________________________
722Bool_t AliQAManager::InitRunLoader()
723{
724 // get or create the run loader
725 if (fRunLoader) {
726 fCycleSame = kTRUE ;
727 } else {
728 if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
729 // load all base libraries to get the loader classes
730 TString libs = gSystem->GetLibraries() ;
731 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
4e25ac79 732 if (!IsSelected(AliQAv1::GetDetName(iDet)))
2e331c8b 733 continue ;
4e25ac79 734 TString detName = AliQAv1::GetDetName(iDet) ;
2e331c8b 735 if (detName == "HLT")
736 continue;
737 if (libs.Contains("lib" + detName + "base.so"))
738 continue;
739 gSystem->Load("lib" + detName + "base.so");
740 }
741 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data());
742 if (!fRunLoader) {
743 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
744 return kFALSE;
745 }
746 fRunLoader->CdGAFile();
747 if (fRunLoader->LoadgAlice() == 0) {
748 gAlice = fRunLoader->GetAliRun();
749 }
750
751 if (!gAlice) {
752 AliError(Form("no gAlice object found in file %s", fGAliceFileName.Data()));
753 return kFALSE;
754 }
755
756 } else { // galice.root does not exist
757 AliError(Form("the file %s does not exist", fGAliceFileName.Data()));
758 return kFALSE;
759 }
760 }
761
762 if (!fRunNumber) {
763 fRunLoader->LoadHeader();
764 fRunNumber = fRunLoader->GetHeader()->GetRun() ;
765 }
766 return kTRUE;
767}
768
769//_____________________________________________________________________________
fec0891b 770Bool_t AliQAManager::IsSelected(const Char_t * det)
2e331c8b 771{
772 // check whether detName is contained in detectors
773 // if yes, it is removed from detectors
774
775 Bool_t rv = kFALSE;
776 const TString detName(det) ;
777 // always activates Correlation
d282dbf5 778 if ( detName.Contains(AliQAv1::GetDetName(AliQAv1::kCORR)) || detName.Contains(AliQAv1::GetDetName(AliQAv1::kGLOBAL))) {
2e331c8b 779 rv = kTRUE ;
780 } else {
781 // check if all detectors are selected
782 if (fDetectors.Contains("ALL")) {
783 fDetectors = "ALL";
784 rv = kTRUE;
785 } else if ((fDetectors.CompareTo(detName) == 0) ||
786 fDetectors.BeginsWith(detName+" ") ||
787 fDetectors.EndsWith(" "+detName) ||
788 fDetectors.Contains(" "+detName+" ")) {
789 rv = kTRUE;
790 }
791 }
792 return rv ;
793}
794
795//_____________________________________________________________________________
87da0921 796Bool_t AliQAManager::Merge(Int_t runNumber, const char *fileName) const
2e331c8b 797{
bededc30 798 // Merge data from all detectors from a given run in one single file
87da0921 799 // Merge the QA results from all the data chunks in one run
800 // The 'fileName' is name of the output file with merged QA data
bededc30 801 if ( runNumber == -1)
802 runNumber = fRunNumber ;
87da0921 803 Bool_t rv = MergeData(runNumber,fileName) ;
bededc30 804 //rv *= MergeResults(runNumber) ; // not needed for the time being
2e331c8b 805 return rv ;
806}
807
149a2367 808//______________________________________________________________________
fec0891b 809Bool_t AliQAManager::MergeXML(const Char_t * collectionFile, const Char_t * subFile, const Char_t * outFile)
149a2367 810{
811 // merges files listed in a xml collection
812 // usage Merge(collection, outputFile))
813 // collection: is a xml collection
814
815 Bool_t rv = kFALSE ;
816
817 if ( strstr(collectionFile, ".xml") == 0 ) {
818 AliError("Input collection file must be an \".xml\" file\n") ;
819 return kFALSE ;
820 }
821
822 if ( !gGrid )
823 TGrid::Connect("alien://");
824 if ( !gGrid )
825 return kFALSE ;
826
827 // Open the file collection
5e232cd6 828 AliInfoClass(Form("*** Create Collection ***\n*** Wk-Dir = |%s| \n*** Coll = |%s| \n",gSystem->WorkingDirectory(), collectionFile));
149a2367 829
bededc30 830 TGridCollection * collection = (TGridCollection*)gROOT->ProcessLine(Form("TAlienCollection::Open(\"%s\")",collectionFile));
149a2367 831 TGridResult* result = collection->GetGridResult("", 0, 0);
832
833 Int_t index = 0 ;
fec0891b 834 const Char_t * turl ;
adae62c9 835 TFileMerger merger(kFALSE) ;
149a2367 836 if (!outFile) {
837 TString tempo(collectionFile) ;
838 if ( subFile)
839 tempo.ReplaceAll(".xml", subFile) ;
840 else
841 tempo.ReplaceAll(".xml", "_Merged.root") ;
842 outFile = tempo.Data() ;
843 }
844 merger.OutputFile(outFile) ;
845
846 while ( (turl = result->GetKey(index, "turl")) ) {
fec0891b 847 Char_t * file ;
149a2367 848 if ( subFile )
849 file = Form("%s#%s", turl, subFile) ;
850 else
851 file = Form("%s", turl) ;
852
5379c4a3 853 AliDebug(AliQAv1::GetQADebugLevel(), Form("%s\n", file)) ;
149a2367 854 merger.AddFile(file) ;
855 index++ ;
856 }
857
858 if (index)
859 merger.Merge() ;
860
5379c4a3 861 AliDebug(AliQAv1::GetQADebugLevel(), Form("Files merged into %s\n", outFile)) ;
149a2367 862
863 rv = kFALSE;
864 return rv ;
865}
866
69a898e3 867//_____________________________________________________________________________
868void AliQAManager::MergeCustom() const
869{
870 // Custom Merge of QA data from all detectors for all runs in one single file
871 // search all the run numbers
872 // search all the run numbers
873 gROOT->ProcessLine(".! ls *QA*.root > QAtempo.txt") ;
874 TString QAfile ;
875 FILE * QAfiles = fopen("QAtempo.txt", "r") ;
876 Int_t index = 0 ;
877 TList srunList ;
878 TIter nextRun(&srunList) ;
879 TObjString * srun = NULL ;
880 Int_t loRun = 999999999 ;
881 Int_t hiRun = 0 ;
882 while ( QAfile.Gets(QAfiles) ) {
883 Bool_t runExist = kFALSE ;
884 TString srunNew(QAfile(QAfile.Index("QA.")+3, QAfile.Index(".root")-(QAfile.Index("QA.")+3))) ;
885 Int_t cuRun = srunNew.Atoi() ;
886 if (cuRun < loRun)
887 loRun = cuRun ;
888 if (cuRun > hiRun)
889 hiRun = cuRun ;
eca4fa66 890 while ( (srun = static_cast<TObjString *> (nextRun())) ) {
69a898e3 891 if ( cuRun == (srun->String()).Atoi() ) {
892 runExist = kTRUE ;
893 break ;
894 }
895 }
896 nextRun.Reset() ;
897 if ( ! runExist )
898 srunList.Add(new TObjString(srunNew.Data()));
899 }
900 nextRun.Reset() ;
901 Int_t runNumber = 0 ;
4e25ac79 902 TFile mergedFile(Form("Merged.%s.Data.root", AliQAv1::GetQADataFileName()), "RECREATE") ;
69a898e3 903 TH1I * hisRun = new TH1I("hLMR", "List of merged runs", hiRun-loRun+10, loRun, hiRun+10) ;
904 // create the structure into the merged file
4e25ac79 905 for (Int_t iDet = 0; iDet < AliQAv1::kNDET ; iDet++) {
906 TDirectory * detDir = mergedFile.mkdir(AliQAv1::GetDetName(iDet)) ;
907 for (Int_t taskIndex = 0; taskIndex < AliQAv1::kNTASKINDEX; taskIndex++) {
69a898e3 908 detDir->cd() ;
4e25ac79 909 TDirectory * taskDir = gDirectory->mkdir(AliQAv1::GetTaskName(taskIndex)) ;
69a898e3 910 for (Int_t es = 0 ; es < AliRecoParam::kNSpecies ; es++) {
911 taskDir->cd() ;
912 TDirectory * esDir = gDirectory->mkdir(AliRecoParam::GetEventSpecieName(es)) ;
913 esDir->cd() ;
4e25ac79 914 gDirectory->mkdir(AliQAv1::GetExpert()) ;
69a898e3 915 }
916 }
917 }
eca4fa66 918 while ( (srun = static_cast<TObjString *> (nextRun())) ) {
69a898e3 919 runNumber = (srun->String()).Atoi() ;
920 hisRun->Fill(runNumber) ;
5379c4a3 921 AliDebug(AliQAv1::GetQADebugLevel(), Form("Merging run number %d", runNumber)) ;
69a898e3 922 // search all QA files for runNumber in the current directory
fec0891b 923 Char_t * fileList[AliQAv1::kNDET] ;
69a898e3 924 index = 0 ;
4e25ac79 925 for (Int_t iDet = 0; iDet < AliQAv1::kNDET ; iDet++) {
fec0891b 926 Char_t * file = gSystem->Which(gSystem->WorkingDirectory(), Form("%s.%s.%d.root", AliQAv1::GetDetName(iDet), AliQAv1::GetQADataFileName(), runNumber));
69a898e3 927 if (file)
928 fileList[index++] = file ;
929 }
930 if ( index == 0 ) {
931 AliError("No QA data file found\n") ;
932 return ;
933 }
934 for ( Int_t i = 0 ; i < index ; i++) {
935 TFile * inFile = TFile::Open(fileList[i]) ;
936 TList * listOfKeys =inFile->GetListOfKeys() ;
937 TIter nextkey(listOfKeys) ;
938 TObject * obj1 ;
939 TString dirName("") ;
940 while ( (obj1 = nextkey()) ) {
941 TDirectory * directoryDet = inFile->GetDirectory(obj1->GetName()) ;
942 if ( directoryDet ) {
5379c4a3 943 AliDebug(AliQAv1::GetQADebugLevel(), Form("%s dir = %s", inFile->GetName(), directoryDet->GetName())) ;
69a898e3 944 dirName += Form("%s/", directoryDet->GetName() ) ;
945 directoryDet->cd() ;
946 TList * listOfTasks = directoryDet->GetListOfKeys() ;
947 TIter nextTask(listOfTasks) ;
948 TObject * obj2 ;
949 while ( (obj2 = nextTask()) ) {
950 TDirectory * directoryTask = directoryDet->GetDirectory(obj2->GetName()) ;
951 if ( directoryTask ) {
952 dirName += Form("%s", obj2->GetName()) ;
5379c4a3 953 AliDebug(AliQAv1::GetQADebugLevel(), Form("%s", dirName.Data())) ;
69a898e3 954 directoryTask->cd() ;
955 TList * listOfEventSpecie = directoryTask->GetListOfKeys() ;
956 TIter nextEventSpecie(listOfEventSpecie) ;
957 TObject * obj3 ;
958 while ( (obj3 = nextEventSpecie()) ) {
959 TDirectory * directoryEventSpecie = directoryTask->GetDirectory(obj3->GetName()) ;
960 if ( directoryEventSpecie ) {
961 dirName += Form("/%s/", obj3->GetName()) ;
5379c4a3 962 AliDebug(AliQAv1::GetQADebugLevel(), Form("%s\n", dirName.Data())) ;
69a898e3 963 directoryEventSpecie->cd() ;
964 // histograms are here
965 TDirectory * mergedDirectory = mergedFile.GetDirectory(dirName.Data()) ;
966 TList * listOfData = directoryEventSpecie->GetListOfKeys() ;
967 TIter nextData(listOfData) ;
968 TKey * key ;
eca4fa66 969 while ( (key = static_cast<TKey *>(nextData())) ) {
69a898e3 970 TString className(key->GetClassName()) ;
971 if ( className.Contains("TH") || className.Contains("TProfile") ) {
eca4fa66 972 TH1 * histIn = static_cast<TH1*> (key->ReadObj()) ;
973 TH1 * histOu = static_cast<TH1*> (mergedDirectory->FindObjectAny(histIn->GetName())) ;
5379c4a3 974 AliDebug(AliQAv1::GetQADebugLevel(), Form("%s %x %x\n", key->GetName(), histIn, histOu)) ;
69a898e3 975 mergedDirectory->cd() ;
976 if ( ! histOu ) {
977 histIn->Write() ;
978 } else {
979 histOu->Add(histIn) ;
980 histOu->Write(histOu->GetName(), kOverwrite) ;
981 }
982 }
983 else if ( className.Contains("TDirectoryFile") ) {
984 TDirectory * dirExpert = directoryEventSpecie->GetDirectory(key->GetName()) ;
985 dirExpert->cd() ;
986 TDirectory * mergedDirectoryExpert = mergedDirectory->GetDirectory(dirExpert->GetName()) ;
987 TList * listOfExpertData = dirExpert->GetListOfKeys() ;
988 TIter nextExpertData(listOfExpertData) ;
989 TKey * keykey ;
eca4fa66 990 while ( (keykey = static_cast<TKey *>(nextExpertData())) ) {
69a898e3 991 TString classNameExpert(keykey->GetClassName()) ;
992 if (classNameExpert.Contains("TH")) {
eca4fa66 993 TH1 * histInExpert = static_cast<TH1*> (keykey->ReadObj()) ;
994 TH1 * histOuExpert = static_cast<TH1*> (mergedDirectory->FindObjectAny(histInExpert->GetName())) ;
69a898e3 995 mergedDirectoryExpert->cd() ;
996 if ( ! histOuExpert ) {
997 histInExpert->Write() ;
998 } else {
999 histOuExpert->Add(histInExpert) ;
1000 histOuExpert->Write(histOuExpert->GetName(), kOverwrite) ;
1001 }
1002 }
1003 }
1004 } else {
1005 AliError(Form("No merge done for this object %s in %s", key->GetName(), dirName.Data())) ;
1006 }
1007 }
1008 dirName.ReplaceAll(Form("/%s/",obj3->GetName()), "") ;
1009 }
1010 }
1011 dirName.ReplaceAll(obj2->GetName(), "") ;
1012 }
1013 }
1014 }
1015 }
1016 inFile->Close() ;
1017 }
1018 }
1019 mergedFile.cd() ;
1020 hisRun->Write() ;
1021 mergedFile.Close() ;
1022 srunList.Delete() ;
1023}
1024
2e331c8b 1025//_____________________________________________________________________________
87da0921 1026Bool_t AliQAManager::MergeData(const Int_t runNumber, const char *fileName) const
2e331c8b 1027{
bededc30 1028 // Merge QA data from all detectors for a given run in one single file
1029
87da0921 1030 TFileMerger merger(kFALSE) ;
1031 TString outFileName = fileName;
1032 if (outFileName.IsNull()) outFileName.Form("Merged.%s.Data.root",AliQAv1::GetQADataFileName());
2e331c8b 1033 merger.OutputFile(outFileName.Data()) ;
bededc30 1034 for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
fec0891b 1035 Char_t * file = gSystem->Which(gSystem->WorkingDirectory(), Form("%s.%s.%d.root", AliQAv1::GetDetName(iDet), AliQAv1::GetQADataFileName(), runNumber));
bededc30 1036 if (file)
1037 merger.AddFile(file) ;
1038 }
2e331c8b 1039 merger.Merge() ;
1040 return kTRUE ;
1041}
1042
1043//_____________________________________________________________________________
1044Bool_t AliQAManager::MergeResults(const Int_t runNumber) const
1045{
1046 // Merge the QA result from all the data chunks in a run
bededc30 1047 // to be revised whwn it will be used (see MergeData)
2e331c8b 1048 TString cmd ;
4e25ac79 1049 cmd = Form(".! ls %s*.root > tempo.txt", AliQAv1::GetQADataFileName()) ;
2e331c8b 1050 gROOT->ProcessLine(cmd.Data()) ;
1051 ifstream in("tempo.txt") ;
1052 const Int_t chunkMax = 100 ;
1053 TString fileList[chunkMax] ;
1054
1055 Int_t index = 0 ;
1056 while ( 1 ) {
1057 TString file ;
1058 in >> fileList[index] ;
1059 if ( !in.good() )
1060 break ;
5379c4a3 1061 AliDebug(AliQAv1::GetQADebugLevel(), Form("index = %d file = %s", index, (fileList[index].Data()))) ;
2e331c8b 1062 index++ ;
1063 }
1064
1065 if ( index == 0 ) {
1066 AliError("No QA Result File found") ;
1067 return kFALSE ;
1068 }
1069
1070 TFileMerger merger ;
fc07289e 1071 TString outFileName ;
1072 if (runNumber != -1)
4e25ac79 1073 outFileName = Form("Merged.%s.Result.%d.root",AliQAv1::GetQADataFileName(),runNumber);
fc07289e 1074 else
4e25ac79 1075 outFileName = Form("Merged.%s.Result.root",AliQAv1::GetQADataFileName());
2e331c8b 1076 merger.OutputFile(outFileName.Data()) ;
1077 for (Int_t ifile = 0 ; ifile < index ; ifile++) {
1078 TString file = fileList[ifile] ;
1079 merger.AddFile(file) ;
1080 }
1081 merger.Merge() ;
1082
1083 return kTRUE ;
1084}
1085
1086//_____________________________________________________________________________
1087void AliQAManager::Reset(const Bool_t sameCycle)
1088{
1089 // Reset the default data members
1090
1091 for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
4e25ac79 1092 if (IsSelected(AliQAv1::GetDetName(iDet))) {
2e331c8b 1093 AliQADataMaker * qadm = GetQADataMaker(iDet);
1094 qadm->Reset();
1095 }
1096 }
1097 if (fRawReaderDelete) {
1098 delete fRawReader ;
1099 fRawReader = NULL ;
1100 }
1101
1102 fCycleSame = sameCycle ;
1103 fESD = NULL ;
1104 fESDTree = NULL ;
1105 //fFirst = kTRUE ;
1106 fNumberOfEvents = 999999 ;
1107}
1108
1109//_____________________________________________________________________________
634696f5 1110AliQAManager * AliQAManager::QAManager(AliQAv1::MODE_t mode, TMap *entryCache, Int_t run)
2e331c8b 1111{
1112 // returns AliQAManager instance (singleton)
1113
1114 if (!fgQAInstance) {
634696f5 1115 if ( (mode != AliQAv1::kSIMMODE) && (mode != AliQAv1::kRECMODE) ) {
1116 AliErrorClass("You must specify kSIMMODE or kRECMODE") ;
bf76b847 1117 return NULL ;
1118 }
2e331c8b 1119 fgQAInstance = new AliQAManager(mode) ;
1120 if (!entryCache)
1121 fgQAInstance->Init();
1122 else
1123 fgQAInstance->InitFromCache(entryCache,run);
1124 }
1125 return fgQAInstance;
1126}
1127
5e303886 1128//_____________________________________________________________________________
1129AliQAManager * AliQAManager::QAManager(AliQAv1::TASKINDEX_t task)
1130{
1131 // returns AliQAManager instance (singleton)
634696f5 1132 return QAManager(AliQAv1::Mode(task)) ;
5e303886 1133}
1134
2e331c8b 1135//_____________________________________________________________________________
fec0891b 1136TString AliQAManager::Run(const Char_t * detectors, AliRawReader * rawReader, const Bool_t sameCycle)
2e331c8b 1137{
1138 //Runs all the QA data Maker for Raws only
1139
1140 fCycleSame = sameCycle ;
1141 fRawReader = rawReader ;
1142 fDetectors = detectors ;
1143 fDetectorsW = detectors ;
1144
1145 AliCDBManager* man = AliCDBManager::Instance() ;
1146
1147 if ( man->GetRun() == -1 ) {// check if run number not set previously and set it from raw data
1148 rawReader->NextEvent() ;
1149 man->SetRun(fRawReader->GetRunNumber()) ;
1150 rawReader->RewindEvents() ;
1151 }
1152
1153 if (!fCycleSame)
4e25ac79 1154 if ( !InitQA(AliQAv1::kRAWS) )
9b4aee57 1155 return "" ;
2e331c8b 1156 fRawReaderDelete = kFALSE ;
1157
4e25ac79 1158 DoIt(AliQAv1::kRAWS) ;
2e331c8b 1159 return fDetectorsW ;
1160}
1161
1162//_____________________________________________________________________________
fec0891b 1163TString AliQAManager::Run(const Char_t * detectors, const Char_t * fileName, const Bool_t sameCycle)
2e331c8b 1164{
1165 //Runs all the QA data Maker for Raws only
1166
1167 fCycleSame = sameCycle ;
1168 fDetectors = detectors ;
1169 fDetectorsW = detectors ;
1170
1171 AliCDBManager* man = AliCDBManager::Instance() ;
1172 if ( man->GetRun() == -1 ) { // check if run number not set previously and set it from AliRun
1173 AliRunLoader * rl = AliRunLoader::Open("galice.root") ;
1174 if ( ! rl ) {
1175 AliFatal("galice.root file not found in current directory") ;
1176 } else {
1177 rl->CdGAFile() ;
1178 rl->LoadgAlice() ;
1179 if ( ! rl->GetAliRun() ) {
1180 AliFatal("AliRun not found in galice.root") ;
1181 } else {
1182 rl->LoadHeader() ;
1183 man->SetRun(rl->GetHeader()->GetRun());
1184 }
1185 }
1186 }
1187
1188 if (!fCycleSame)
4e25ac79 1189 if ( !InitQA(AliQAv1::kRAWS, fileName) )
9b4aee57 1190 return "" ;
2e331c8b 1191
4e25ac79 1192 DoIt(AliQAv1::kRAWS) ;
2e331c8b 1193 return fDetectorsW ;
1194}
1195
1196//_____________________________________________________________________________
fec0891b 1197TString AliQAManager::Run(const Char_t * detectors, const AliQAv1::TASKINDEX_t taskIndex, Bool_t const sameCycle, const Char_t * fileName )
2e331c8b 1198{
1199 // Runs all the QA data Maker for every detector
1200
1201 fCycleSame = sameCycle ;
1202 fDetectors = detectors ;
1203 fDetectorsW = detectors ;
1204
1205 AliCDBManager* man = AliCDBManager::Instance() ;
1206 if ( man->GetRun() == -1 ) { // check if run number not set previously and set it from AliRun
1207 AliRunLoader * rl = AliRunLoader::Open("galice.root") ;
1208 if ( ! rl ) {
1209 AliFatal("galice.root file not found in current directory") ;
1210 } else {
1211 rl->CdGAFile() ;
1212 rl->LoadgAlice() ;
1213 if ( ! rl->GetAliRun() ) {
5379c4a3 1214 AliDebug(AliQAv1::GetQADebugLevel(), "AliRun not found in galice.root") ;
2e331c8b 1215 } else {
1216 rl->LoadHeader() ;
1217 man->SetRun(rl->GetHeader()->GetRun()) ;
1218 }
1219 }
1220 }
fec0891b 1221 if ( taskIndex == AliQAv1::kNULLTASKINDEX) {
4e25ac79 1222 for (UInt_t task = 0; task < AliQAv1::kNTASKINDEX; task++) {
2e331c8b 1223 if ( fTasks.Contains(Form("%d", task)) ) {
1224 if (!fCycleSame)
4e25ac79 1225 if ( !InitQA(AliQAv1::GetTaskIndex(AliQAv1::GetTaskName(task)), fileName) )
9b4aee57 1226 return "" ;
4e25ac79 1227 DoIt(AliQAv1::GetTaskIndex(AliQAv1::GetTaskName(task))) ;
2e331c8b 1228 }
1229 }
1230 } else {
1231 if (! fCycleSame )
1232 if ( !InitQA(taskIndex, fileName) )
9b4aee57 1233 return "" ;
2e331c8b 1234 DoIt(taskIndex) ;
1235 }
2e331c8b 1236 return fDetectorsW ;
2e331c8b 1237}
1238
1239//_____________________________________________________________________________
1240void AliQAManager::RunOneEvent(AliRawReader * rawReader)
1241{
1242 //Runs all the QA data Maker for Raws only and on one event only (event loop done by calling method)
1243 if ( ! rawReader )
1244 return ;
0d105c36 1245 if (fTasks.Contains(Form("%d", AliQAv1::kRAWS))){
2e331c8b 1246 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
4e25ac79 1247 if (!IsSelected(AliQAv1::GetDetName(iDet)))
2e331c8b 1248 continue;
1249 AliQADataMaker *qadm = GetQADataMaker(iDet);
1250 if (!qadm)
1251 continue;
1252 if ( qadm->IsCycleDone() ) {
1253 qadm->EndOfCycle() ;
1254 }
5e232cd6 1255 qadm->SetEventSpecie(fEventSpecie) ;
13a2370e 1256 if ( qadm->GetRecoParam() )
5e232cd6 1257 if ( AliRecoParam::Convert(qadm->GetRecoParam()->GetEventSpecie()) != AliRecoParam::kDefault)
1258 qadm->SetEventSpecie(qadm->GetRecoParam()->GetEventSpecie()) ;
4e25ac79 1259 qadm->Exec(AliQAv1::kRAWS, rawReader) ;
2e331c8b 1260 }
1261 }
1262}
1263
1264//_____________________________________________________________________________
1265void AliQAManager::RunOneEvent(AliESDEvent *& esd)
1266{
1267 //Runs all the QA data Maker for ESDs only and on one event only (event loop done by calling method)
1268
0d105c36 1269 if (fTasks.Contains(Form("%d", AliQAv1::kESDS))) {
2e331c8b 1270 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
4e25ac79 1271 if (!IsSelected(AliQAv1::GetDetName(iDet)))
2e331c8b 1272 continue;
1273 AliQADataMaker *qadm = GetQADataMaker(iDet);
1274 if (!qadm)
1275 continue;
5e232cd6 1276 qadm->SetEventSpecie(fEventSpecie) ;
82a30871 1277 if ( qadm->GetRecoParam() )
5e232cd6 1278 if ( AliRecoParam::Convert(qadm->GetRecoParam()->GetEventSpecie()) != AliRecoParam::kDefault)
1279 qadm->SetEventSpecie(qadm->GetRecoParam()->GetEventSpecie()) ;
2e331c8b 1280 if ( qadm->IsCycleDone() ) {
1281 qadm->EndOfCycle() ;
1282 }
4e25ac79 1283 qadm->Exec(AliQAv1::kESDS, esd) ;
2e331c8b 1284 }
1285 }
1286}
1287
1288//_____________________________________________________________________________
1289void AliQAManager::RunOneEventInOneDetector(Int_t det, TTree * tree)
1290{
1291 // Runs all the QA data Maker for ESDs only and on one event only (event loop done by calling method)
44ed7a66 1292
1293 TString test(tree->GetName()) ;
0d105c36 1294 if (fTasks.Contains(Form("%d", AliQAv1::kRECPOINTS))) {
4e25ac79 1295 if (IsSelected(AliQAv1::GetDetName(det))) {
2e331c8b 1296 AliQADataMaker *qadm = GetQADataMaker(det);
1297 if (qadm) {
5e232cd6 1298 qadm->SetEventSpecie(fEventSpecie) ;
31c31326 1299 if ( qadm->GetRecoParam() ) {
5e232cd6 1300 if ( AliRecoParam::Convert(qadm->GetRecoParam()->GetEventSpecie()) != AliRecoParam::kDefault)
31c31326 1301 qadm->SetEventSpecie(qadm->GetRecoParam()->GetEventSpecie()) ;
1302 else
5c5ea798 1303 AliError(Form("%d defined by %s is not an event specie", qadm->GetRecoParam()->GetEventSpecie(), qadm->GetName())) ;
31c31326 1304 }
2e331c8b 1305 if ( qadm->IsCycleDone() ) {
1306 qadm->EndOfCycle() ;
1307 }
44ed7a66 1308 if (test.Contains("TreeD")) {
1309 qadm->Exec(AliQAv1::kDIGITSR, tree) ;
44ed7a66 1310 } else if (test.Contains("TreeR")) {
1311 qadm->Exec(AliQAv1::kRECPOINTS, tree) ;
44ed7a66 1312 }
2e331c8b 1313 }
1314 }
1315 }
1316}
1317
1318//_____________________________________________________________________________
fec0891b 1319Bool_t AliQAManager::Save2OCDB(const Int_t runNumber, AliRecoParam::EventSpecie_t es, const Char_t * year, const Char_t * detectors) const
2e331c8b 1320{
1321 // take the locasl QA data merge into a single file and save in OCDB
1322 Bool_t rv = kTRUE ;
4e25ac79 1323 TString tmp(AliQAv1::GetQARefStorage()) ;
2e331c8b 1324 if ( tmp.IsNull() ) {
4e25ac79 1325 AliError("No storage defined, use AliQAv1::SetQARefStorage") ;
2e331c8b 1326 return kFALSE ;
1327 }
4e25ac79 1328 if ( !(tmp.Contains(AliQAv1::GetLabLocalOCDB()) || tmp.Contains(AliQAv1::GetLabAliEnOCDB())) ) {
1329 AliError(Form("%s is a wrong storage, use %s or %s", AliQAv1::GetQARefStorage(), AliQAv1::GetLabLocalOCDB().Data(), AliQAv1::GetLabAliEnOCDB().Data())) ;
2e331c8b 1330 return kFALSE ;
1331 }
1332 TString sdet(detectors) ;
1333 sdet.ToUpper() ;
1334 TFile * inputFile ;
1335 if ( sdet.Contains("ALL") ) {
1336 rv = Merge(runNumber) ;
1337 if ( ! rv )
1338 return kFALSE ;
4e25ac79 1339 TString inputFileName(Form("Merged.%s.Data.%d.root", AliQAv1::GetQADataFileName(), runNumber)) ;
2e331c8b 1340 inputFile = TFile::Open(inputFileName.Data()) ;
1341 rv = SaveIt2OCDB(runNumber, inputFile, year, es) ;
1342 } else {
4e25ac79 1343 for (Int_t index = 0; index < AliQAv1::kNDET; index++) {
1344 if (sdet.Contains(AliQAv1::GetDetName(index))) {
1345 TString inputFileName(Form("%s.%s.%d.root", AliQAv1::GetDetName(index), AliQAv1::GetQADataFileName(), runNumber)) ;
2e331c8b 1346 inputFile = TFile::Open(inputFileName.Data()) ;
1347 rv *= SaveIt2OCDB(runNumber, inputFile, year, es) ;
1348 }
1349 }
1350 }
1351 return rv ;
1352}
1353
1354//_____________________________________________________________________________
fec0891b 1355Bool_t AliQAManager::SaveIt2OCDB(const Int_t runNumber, TFile * inputFile, const Char_t * year, AliRecoParam::EventSpecie_t es) const
2e331c8b 1356{
1357 // reads the TH1 from file and adds it to appropriate list before saving to OCDB
1358 Bool_t rv = kTRUE ;
5379c4a3 1359 AliDebug(AliQAv1::GetQADebugLevel(), Form("Saving TH1s in %s to %s", inputFile->GetName(), AliQAv1::GetQARefStorage())) ;
2e331c8b 1360 if ( ! IsDefaultStorageSet() ) {
4e25ac79 1361 TString tmp( AliQAv1::GetQARefStorage() ) ;
1362 if ( tmp.Contains(AliQAv1::GetLabLocalOCDB()) )
1363 Instance()->SetDefaultStorage(AliQAv1::GetQARefStorage()) ;
2e331c8b 1364 else {
4e25ac79 1365 TString tmp1(AliQAv1::GetQARefDefaultStorage()) ;
2e331c8b 1366 tmp1.Append(year) ;
1367 tmp1.Append("?user=alidaq") ;
1368 Instance()->SetDefaultStorage(tmp1.Data()) ;
1369 }
1370 }
4e25ac79 1371 Instance()->SetSpecificStorage("*", AliQAv1::GetQARefStorage()) ;
2e331c8b 1372 if(GetRun() < 0)
1373 Instance()->SetRun(runNumber);
1374
1375 AliCDBMetaData mdr ;
1376 mdr.SetResponsible("yves schutz");
1377
4e25ac79 1378 for ( Int_t detIndex = 0 ; detIndex < AliQAv1::kNDET ; detIndex++) {
1379 TDirectory * detDir = inputFile->GetDirectory(AliQAv1::GetDetName(detIndex)) ;
2e331c8b 1380 if ( detDir ) {
5379c4a3 1381 AliDebug(AliQAv1::GetQADebugLevel(), Form("Entering %s", detDir->GetName())) ;
4e25ac79 1382 AliQAv1::SetQARefDataDirName(es) ;
1383 TString detOCDBDir(Form("%s/%s/%s", AliQAv1::GetDetName(detIndex), AliQAv1::GetRefOCDBDirName(), AliQAv1::GetRefDataDirName())) ;
2e331c8b 1384 AliCDBId idr(detOCDBDir.Data(), runNumber, AliCDBRunRange::Infinity()) ;
1385 TList * listDetQAD = new TList() ;
4e25ac79 1386 TString listName(Form("%s QA data Reference", AliQAv1::GetDetName(detIndex))) ;
1387 mdr.SetComment(Form("%s QA stuff", AliQAv1::GetDetName(detIndex)));
2e331c8b 1388 listDetQAD->SetName(listName) ;
1389 TList * taskList = detDir->GetListOfKeys() ;
1390 TIter nextTask(taskList) ;
1391 TKey * taskKey ;
eca4fa66 1392 while ( (taskKey = static_cast<TKey*>(nextTask())) ) {
2e331c8b 1393 TDirectory * taskDir = detDir->GetDirectory(taskKey->GetName()) ;
1394 TDirectory * esDir = taskDir->GetDirectory(AliRecoParam::GetEventSpecieName(es)) ;
5379c4a3 1395 AliDebug(AliQAv1::GetQADebugLevel(), Form("Saving %s", esDir->GetName())) ;
2e331c8b 1396 TObjArray * listTaskQAD = new TObjArray(100) ;
1397 listTaskQAD->SetName(Form("%s/%s", taskKey->GetName(), AliRecoParam::GetEventSpecieName(es))) ;
1398 listDetQAD->Add(listTaskQAD) ;
1399 TList * histList = esDir->GetListOfKeys() ;
1400 TIter nextHist(histList) ;
1401 TKey * histKey ;
eca4fa66 1402 while ( (histKey = static_cast<TKey*>(nextHist())) ) {
2e331c8b 1403 TObject * odata = esDir->Get(histKey->GetName()) ;
1404 if ( !odata ) {
1405 AliError(Form("%s in %s/%s returns a NULL pointer !!", histKey->GetName(), detDir->GetName(), taskDir->GetName())) ;
1406 } else {
4e25ac79 1407 if ( AliQAv1::GetExpert() == histKey->GetName() ) {
2e331c8b 1408 TDirectory * expertDir = esDir->GetDirectory(histKey->GetName()) ;
1409 TList * expertHistList = expertDir->GetListOfKeys() ;
1410 TIter nextExpertHist(expertHistList) ;
1411 TKey * expertHistKey ;
eca4fa66 1412 while ( (expertHistKey = static_cast<TKey*>(nextExpertHist())) ) {
2e331c8b 1413 TObject * expertOdata = expertDir->Get(expertHistKey->GetName()) ;
1414 if ( !expertOdata ) {
1415 AliError(Form("%s in %s/%s/Expert returns a NULL pointer !!", expertHistKey->GetName(), detDir->GetName(), taskDir->GetName())) ;
1416 } else {
5379c4a3 1417 AliDebug(AliQAv1::GetQADebugLevel(), Form("Adding %s", expertHistKey->GetName())) ;
2e331c8b 1418 if ( expertOdata->IsA()->InheritsFrom("TH1") ) {
5379c4a3 1419 AliDebug(AliQAv1::GetQADebugLevel(), Form("Adding %s", expertHistKey->GetName())) ;
2e331c8b 1420 TH1 * hExpertdata = static_cast<TH1*>(expertOdata) ;
1421 listTaskQAD->Add(hExpertdata) ;
1422 }
1423 }
1424 }
1425 }
5379c4a3 1426 AliDebug(AliQAv1::GetQADebugLevel(), Form("Adding %s", histKey->GetName())) ;
2e331c8b 1427 if ( odata->IsA()->InheritsFrom("TH1") ) {
5379c4a3 1428 AliDebug(AliQAv1::GetQADebugLevel(), Form("Adding %s", histKey->GetName())) ;
2e331c8b 1429 TH1 * hdata = static_cast<TH1*>(odata) ;
1430 listTaskQAD->Add(hdata) ;
1431 }
1432 }
1433 }
1434 }
1435 Instance()->Put(listDetQAD, idr, &mdr) ;
1436 }
1437 }
1438 return rv ;
1439}
1440
7c9ff472 1441//_____________________________________________________________________________
1442
1443void AliQAManager::SetCheckerExternParam(AliQAv1::DETECTORINDEX_t detIndex, TList * parameterList)
1444{
1445 // set the external parameters list for the detector checkers
1446 AliQACheckerBase * qac = AliQAChecker::Instance()->GetDetQAChecker(detIndex) ;
1447 qac->SetExternParamlist(parameterList) ;
1448 qac->PrintExternParam() ;
1449}
1450
2e331c8b 1451//_____________________________________________________________________________
1452void AliQAManager::SetEventSpecie(AliRecoParam::EventSpecie_t es)
1453{
4e25ac79 1454 // set the current event specie and inform AliQAv1 that this event specie has been encountered
bc8761a0 1455 fEventSpecie = es ;
4e25ac79 1456 AliQAv1::Instance()->SetEventSpecie(es) ;
2e331c8b 1457}
1458
1459//_____________________________________________________________________________
1460void AliQAManager::SetRecoParam(const Int_t det, const AliDetectorRecoParam *par)
1461{
1462 // Set custom reconstruction parameters for a given detector
1463 // Single set of parameters for all the events
1464 GetQADataMaker(det)->SetRecoParam(par) ;
1465}
1466
75373542 1467//_____________________________________________________________________________
1468void AliQAManager::SetWriteExpert()
1469{
1470 // enable the writing of QA expert data
1471 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
4e25ac79 1472 if (IsSelected(AliQAv1::GetDetName(iDet)))
75373542 1473 fQAWriteExpert[iDet] = kTRUE ;
1474 }
1475}
7cade814 1476
1477//_____________________________________________________________________________
1478void AliQAManager::Destroy() {
bf76b847 1479 // delete AliQAManager instance and
1480 // all associated objects
7cade814 1481
1482 if (fgQAInstance) {
eca4fa66 1483 delete fgQAInstance ;
1484 fgQAInstance = NULL ;
7cade814 1485 }
1486}
1487
bf76b847 1488//_____________________________________________________________________________
1489void AliQAManager::ShowQA() {
1490 // Show the result of the QA checking
1491 // for all detectors
1492 for ( Int_t detIndex = 0 ; detIndex < AliQAv1::kNDET ; detIndex++)
1493 AliQAv1::Instance(AliQAv1::GetDetIndex(AliQAv1::GetDetName(detIndex)))->Show() ;
1494}