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