]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/AliQADataMakerSteer.cxx
Fix from for producing a dataset via the alien plugin. Redirecting the alien 'find...
[u/mrichter/AliRoot.git] / STEER / AliQADataMakerSteer.cxx
CommitLineData
312e6f8d 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
16/* $Id$ */
202374b1 17///////////////////////////////////////////////////////////////////////////////
18// //
19// class for running the QA makers //
20// //
21// AliQADataMakerSteer qas; //
22// qas.Run(AliQA::kRAWS, rawROOTFileName); //
23// qas.Run(AliQA::kHITS); //
24// qas.Run(AliQA::kSDIGITS); //
25// qas.Run(AliQA::kDIGITS); //
26// qas.Run(AliQA::kRECPOINTS); //
27// qas.Run(AliQA::kESDS); //
28// //
29///////////////////////////////////////////////////////////////////////////////
312e6f8d 30
4edbc5bc 31#include <TKey.h>
312e6f8d 32#include <TFile.h>
567d83d9 33#include <TFileMerger.h>
312e6f8d 34#include <TPluginManager.h>
35#include <TROOT.h>
36#include <TString.h>
37#include <TSystem.h>
38
4edbc5bc 39#include "AliCDBManager.h"
40#include "AliCDBEntry.h"
41#include "AliCDBId.h"
42#include "AliCDBMetaData.h"
940d8e5f 43#include "AliCodeTimer.h"
a2b64fbd 44#include "AliCorrQADataMakerRec.h"
0233bebf 45#include "AliDetectorRecoParam.h"
312e6f8d 46#include "AliESDEvent.h"
f451171e 47#include "AliGeomManager.h"
30bbd491 48#include "AliGlobalQADataMaker.h"
6441b07a 49#include "AliHeader.h"
312e6f8d 50#include "AliLog.h"
007fcebb 51#include "AliModule.h"
312e6f8d 52#include "AliQA.h"
04236e67 53#include "AliQADataMakerRec.h"
54#include "AliQADataMakerSim.h"
312e6f8d 55#include "AliQADataMakerSteer.h"
4ecde5fc 56#include "AliRawReaderDate.h"
57#include "AliRawReaderFile.h"
312e6f8d 58#include "AliRawReaderRoot.h"
59#include "AliRun.h"
60#include "AliRunLoader.h"
61
62ClassImp(AliQADataMakerSteer)
63
64//_____________________________________________________________________________
30bbd491 65AliQADataMakerSteer::AliQADataMakerSteer(char * mode, const char* gAliceFilename, const char * name, const char * title) :
312e6f8d 66 TNamed(name, title),
018c2b09 67 fCurrentEvent(0),
c65c502a 68 fCycleSame(kFALSE),
fff5167b 69 fDetectors("ALL"),
70 fDetectorsW("ALL"),
312e6f8d 71 fESD(NULL),
72 fESDTree(NULL),
312e6f8d 73 fGAliceFileName(gAliceFilename),
e30aef00 74 fFirstEvent(0),
30bbd491 75 fMaxEvents(0),
76 fMode(mode),
774ac967 77 fNumberOfEvents(999999),
940d8e5f 78 fRecoParam(),
30bbd491 79 fRunNumber(0),
312e6f8d 80 fRawReader(NULL),
6441b07a 81 fRawReaderDelete(kTRUE),
940d8e5f 82 fRunLoader(NULL),
a2b64fbd 83 fTasks("")
312e6f8d 84{
85 // default ctor
f0c6fb4b 86 fMaxEvents = fNumberOfEvents ;
312e6f8d 87 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
4d52736b 88 if (IsSelected(AliQA::GetDetName(iDet))) {
89 fLoader[iDet] = NULL ;
90 fQADataMaker[iDet] = NULL ;
91 fQACycles[iDet] = 999999 ;
252f8aa8 92 fQAWriteExpert[iDet] = kFALSE ;
4d52736b 93 }
312e6f8d 94 }
95}
96
97//_____________________________________________________________________________
98AliQADataMakerSteer::AliQADataMakerSteer(const AliQADataMakerSteer & qas) :
99 TNamed(qas),
018c2b09 100 fCurrentEvent(qas.fCurrentEvent),
c65c502a 101 fCycleSame(kFALSE),
fff5167b 102 fDetectors(qas.fDetectors),
103 fDetectorsW(qas.fDetectorsW),
312e6f8d 104 fESD(NULL),
105 fESDTree(NULL),
312e6f8d 106 fGAliceFileName(qas.fGAliceFileName),
e30aef00 107 fFirstEvent(qas.fFirstEvent),
30bbd491 108 fMaxEvents(qas.fMaxEvents),
109 fMode(qas.fMode),
312e6f8d 110 fNumberOfEvents(qas.fNumberOfEvents),
940d8e5f 111 fRecoParam(),
112 fRunNumber(qas.fRunNumber),
312e6f8d 113 fRawReader(NULL),
6441b07a 114 fRawReaderDelete(kTRUE),
940d8e5f 115 fRunLoader(NULL),
a2b64fbd 116 fTasks(qas.fTasks)
312e6f8d 117{
118 // cpy ctor
119 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
252f8aa8 120 fLoader[iDet] = qas.fLoader[iDet] ;
121 fQADataMaker[iDet] = qas.fQADataMaker[iDet] ;
122 fQACycles[iDet] = qas.fQACycles[iDet] ;
123 fQAWriteExpert[iDet] = qas.fQAWriteExpert[iDet] ;
312e6f8d 124 }
125}
126
127//_____________________________________________________________________________
128AliQADataMakerSteer & AliQADataMakerSteer::operator = (const AliQADataMakerSteer & qas)
129{
130 // assignment operator
131 this->~AliQADataMakerSteer() ;
132 new(this) AliQADataMakerSteer(qas) ;
133 return *this ;
134}
135
136//_____________________________________________________________________________
137AliQADataMakerSteer::~AliQADataMakerSteer()
138{
139 // dtor
57e8b77b 140 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
141 if (IsSelected(AliQA::GetDetName(iDet))) {
4d52736b 142 fLoader[iDet] = NULL;
143 if (fQADataMaker[iDet]) {
144 (fQADataMaker[iDet])->Finish() ;
fa18368b 145 delete fQADataMaker[iDet] ;
4d52736b 146 }
57e8b77b 147 }
148 }
57e8b77b 149 if (fRawReaderDelete) {
150 fRunLoader = NULL ;
151 delete fRawReader ;
152 fRawReader = NULL ;
153 }
312e6f8d 154}
155
4d52736b 156//_____________________________________________________________________________
30bbd491 157Bool_t AliQADataMakerSteer::DoIt(const AliQA::TASKINDEX_t taskIndex)
4d52736b 158{
159 // Runs all the QA data Maker for every detector
95932286 160
4d52736b 161 Bool_t rv = kFALSE ;
4d52736b 162 // Fill QA data in event loop
95932286 163 for (UInt_t iEvent = fFirstEvent ; iEvent < (UInt_t)fMaxEvents ; iEvent++) {
018c2b09 164 fCurrentEvent++ ;
4d52736b 165 // Get the event
a6f6970e 166 if ( iEvent%10 == 0 )
167 AliInfo(Form("processing event %d", iEvent));
4d52736b 168 if ( taskIndex == AliQA::kRAWS ) {
169 if ( !fRawReader->NextEvent() )
170 break ;
171 } else if ( taskIndex == AliQA::kESDS ) {
774ac967 172 if ( fESDTree->GetEntry(iEvent) == 0 )
173 break ;
4d52736b 174 } else {
774ac967 175 if ( fRunLoader->GetEvent(iEvent) != 0 )
176 break ;
4d52736b 177 }
56f4f5f4 178 // loop over active loaders
30bbd491 179 for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
180 if (IsSelected(AliQA::GetDetName(iDet))) {
181 AliQADataMaker * qadm = GetQADataMaker(iDet) ;
d15bbee6 182 if (!qadm) continue; // This detector doesn't have any QA (for example, HLT)
30bbd491 183 if ( qadm->IsCycleDone() ) {
930e6e3e 184 qadm->EndOfCycle(taskIndex) ;
30bbd491 185 }
c5595529 186 TTree * data = NULL ;
30bbd491 187 AliLoader* loader = GetLoader(qadm->GetUniqueID());
188 switch (taskIndex) {
940d8e5f 189 case AliQA::kNULLTASKINDEX :
190 break ;
30bbd491 191 case AliQA::kRAWS :
192 qadm->Exec(taskIndex, fRawReader) ;
193 break ;
194 case AliQA::kHITS :
c5595529 195 if( loader ) {
196 loader->LoadHits() ;
197 data = loader->TreeH() ;
198 if ( ! data ) {
199 AliWarning(Form(" Hit Tree not found for %s", AliQA::GetDetName(iDet))) ;
200 break ;
201 }
202 }
203 qadm->Exec(taskIndex, data) ;
30bbd491 204 break ;
205 case AliQA::kSDIGITS :
c5595529 206 if( loader ) {
207 loader->LoadSDigits() ;
208 data = loader->TreeS() ;
209 if ( ! data ) {
210 AliWarning(Form(" SDigit Tree not found for %s", AliQA::GetDetName(iDet))) ;
211 break ;
212 }
213 }
214 qadm->Exec(taskIndex, data) ;
30bbd491 215 break;
216 case AliQA::kDIGITS :
c5595529 217 if( loader ) {
218 loader->LoadDigits() ;
219 data = loader->TreeD() ;
220 if ( ! data ) {
221 AliWarning(Form(" Digit Tree not found for %s", AliQA::GetDetName(iDet))) ;
222 break ;
223 }
224 }
225 qadm->Exec(taskIndex, data) ;
30bbd491 226 break;
227 case AliQA::kRECPOINTS :
c5595529 228 if( loader ) {
229 loader->LoadRecPoints() ;
230 data = loader->TreeR() ;
231 if (!data) {
232 AliWarning(Form("RecPoints not found for %s", AliQA::GetDetName(iDet))) ;
233 break ;
234 }
235 }
236 qadm->Exec(taskIndex, data) ;
237 break;
30bbd491 238 case AliQA::kTRACKSEGMENTS :
239 break;
240 case AliQA::kRECPARTICLES :
241 break;
242 case AliQA::kESDS :
243 qadm->Exec(taskIndex, fESD) ;
244 break;
245 case AliQA::kNTASKINDEX :
246 break;
247 } //task switch
248 }
4d52736b 249 } // detector loop
930e6e3e 250 Increment() ;
4d52736b 251 } // event loop
30bbd491 252 // Save QA data for all detectors
253 rv = Finish(taskIndex) ;
54b7165d 254
255 if ( taskIndex == AliQA::kRAWS )
256 fRawReader->RewindEvents() ;
fff5167b 257
4d52736b 258 return rv ;
259}
260
4edbc5bc 261//_____________________________________________________________________________
30bbd491 262Bool_t AliQADataMakerSteer::Finish(const AliQA::TASKINDEX_t taskIndex)
4edbc5bc 263{
264 // write output to file for all detectors
30bbd491 265 for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
266 if (IsSelected(AliQA::GetDetName(iDet))) {
267 AliQADataMaker * qadm = GetQADataMaker(iDet) ;
d15bbee6 268 if (qadm) qadm->EndOfCycle(taskIndex) ;
30bbd491 269 }
270 }
4edbc5bc 271 return kTRUE ;
272}
273
274//_____________________________________________________________________________
96d67a8d 275TObjArray * AliQADataMakerSteer::GetFromOCDB(AliQA::DETECTORINDEX_t det, AliQA::TASKINDEX_t task, const char * year) const
4edbc5bc 276{
277 // Retrieve the list of QA data for a given detector and a given task
f73f556a 278 TObjArray * rv = NULL ;
605cb8bb 279 if ( !strlen(AliQA::GetQARefStorage()) ) {
f73f556a 280 AliError("No storage defined, use AliQA::SetQARefStorage") ;
281 return NULL ;
282 }
4edbc5bc 283 AliCDBManager* man = AliCDBManager::Instance() ;
f73f556a 284 if ( ! man->IsDefaultStorageSet() ) {
11032e1d 285 TString tmp(AliQA::GetQARefDefaultStorage()) ;
286 tmp.Append(year) ;
287 tmp.Append("/") ;
288 man->SetDefaultStorage(tmp.Data()) ;
96d67a8d 289 man->SetSpecificStorage(Form("%s/*", AliQA::GetQAName()), AliQA::GetQARefStorage()) ;
f73f556a 290 }
614a7f99 291 TString detOCDBDir(Form("%s/%s/%s", AliQA::GetQAName(), AliQA::GetDetName((Int_t)det), AliQA::GetRefOCDBDirName())) ;
292 AliInfo(Form("Retrieving reference data from %s/%s for %s", AliQA::GetQARefStorage(), detOCDBDir.Data(), AliQA::GetTaskName(task).Data())) ;
293 AliCDBEntry* entry = man->Get(detOCDBDir.Data(), 0) ; //FIXME 0 --> Run Number
4edbc5bc 294 TList * listDetQAD = dynamic_cast<TList *>(entry->GetObject()) ;
295 if ( listDetQAD )
f73f556a 296 rv = dynamic_cast<TObjArray *>(listDetQAD->FindObject(AliQA::GetTaskName(task))) ;
4edbc5bc 297 return rv ;
298}
299
312e6f8d 300//_____________________________________________________________________________
301AliLoader * AliQADataMakerSteer::GetLoader(Int_t iDet)
302{
303 // get the loader for a detector
56f4f5f4 304
c5595529 305 if ( !fRunLoader || iDet == AliQA::kCORR)
56f4f5f4 306 return NULL ;
312e6f8d 307
308 TString detName = AliQA::GetDetName(iDet) ;
309 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
310 if (fLoader[iDet])
311 return fLoader[iDet] ;
312
313 // load the QA data maker object
314 TPluginManager* pluginManager = gROOT->GetPluginManager() ;
315 TString loaderName = "Ali" + detName + "Loader" ;
316
317 AliLoader * loader = NULL ;
318 // first check if a plugin is defined for the quality assurance data maker
319 TPluginHandler* pluginHandler = pluginManager->FindHandler("AliLoader", detName) ;
320 // if not, add a plugin for it
321 if (!pluginHandler) {
322 AliDebug(1, Form("defining plugin for %s", loaderName.Data())) ;
323 TString libs = gSystem->GetLibraries() ;
324 if (libs.Contains("lib" + detName + "base.so") || (gSystem->Load("lib" + detName + "base.so") >= 0)) {
325 pluginManager->AddHandler("AliQADataMaker", detName, loaderName, detName + "loader", loaderName + "()") ;
326 } else {
327 pluginManager->AddHandler("AliLoader", detName, loaderName, detName, loaderName + "()") ;
328 }
329 pluginHandler = pluginManager->FindHandler("AliLoader", detName) ;
330 }
331 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
332 loader = (AliLoader *) pluginHandler->ExecPlugin(0) ;
333 }
334 if (loader)
335 fLoader[iDet] = loader ;
336 return loader ;
337}
338
339//_____________________________________________________________________________
30bbd491 340AliQADataMaker * AliQADataMakerSteer::GetQADataMaker(const Int_t iDet)
312e6f8d 341{
342 // get the quality assurance data maker for a detector
343
344 if (fQADataMaker[iDet])
345 return fQADataMaker[iDet] ;
346
347 AliQADataMaker * qadm = NULL ;
348
30bbd491 349 if (iDet == AliQA::kGLOBAL) { //Global QA
350 qadm = new AliGlobalQADataMaker();
7c37c363 351 qadm->SetName(AliQA::GetDetName(iDet));
352 qadm->SetUniqueID(iDet);
30bbd491 353 fQADataMaker[iDet] = qadm;
354 return qadm;
355 }
356
a2b64fbd 357 if (iDet == AliQA::kCORR) { //the data maker for correlations among detectors
358 qadm = new AliCorrQADataMakerRec(fQADataMaker) ;
359 qadm->SetName(AliQA::GetDetName(iDet));
360 qadm->SetUniqueID(iDet);
361 fQADataMaker[iDet] = qadm;
362 return qadm;
363 }
364
30bbd491 365 // load the QA data maker object
366 TPluginManager* pluginManager = gROOT->GetPluginManager() ;
367 TString detName = AliQA::GetDetName(iDet) ;
368 TString tmp(fMode) ;
369 if (tmp.Contains("sim"))
370 tmp.ReplaceAll("s", "S") ;
371 else if (tmp.Contains("rec"))
372 tmp.ReplaceAll("r", "R") ;
373
374 TString qadmName = "Ali" + detName + "QADataMaker" + tmp ;
375
376 // first check if a plugin is defined for the quality assurance data maker
377 TPluginHandler* pluginHandler = pluginManager->FindHandler("AliQADataMaker", detName) ;
378 // if not, add a plugin for it
379 if (!pluginHandler) {
380 AliDebug(1, Form("defining plugin for %s", qadmName.Data())) ;
381 TString libs = gSystem->GetLibraries() ;
382 if (libs.Contains("lib" + detName + fMode + ".so") || (gSystem->Load("lib" + detName + fMode + ".so") >= 0)) {
383 pluginManager->AddHandler("AliQADataMaker", detName, qadmName, detName + "qadm", qadmName + "()") ;
384 } else {
385 pluginManager->AddHandler("AliQADataMaker", detName, qadmName, detName, qadmName + "()") ;
312e6f8d 386 }
30bbd491 387 pluginHandler = pluginManager->FindHandler("AliQADataMaker", detName) ;
388 }
389 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
390 qadm = (AliQADataMaker *) pluginHandler->ExecPlugin(0) ;
312e6f8d 391 }
940d8e5f 392 if (qadm) {
940d8e5f 393 qadm->SetName(AliQA::GetDetName(iDet));
394 qadm->SetUniqueID(iDet);
7c37c363 395 fQADataMaker[iDet] = qadm ;
940d8e5f 396 }
397
30bbd491 398 return qadm ;
312e6f8d 399}
400
940d8e5f 401//_____________________________________________________________________________
402void AliQADataMakerSteer::EndOfCycle(TObjArray * detArray)
403{
404 // End of cycle QADataMakers
405
406 for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
407 if (IsSelected(AliQA::GetDetName(iDet))) {
408 AliQADataMaker * qadm = GetQADataMaker(iDet) ;
409 if (!qadm)
410 continue ;
411 // skip non active detectors
412 if (detArray) {
413 AliModule* det = static_cast<AliModule*>(detArray->FindObject(AliQA::GetDetName(iDet))) ;
414 if (!det || !det->IsActive())
415 continue ;
416 }
417 for (UInt_t taskIndex = 0; taskIndex < AliQA::kNTASKINDEX; taskIndex++) {
418 if ( fTasks.Contains(Form("%d", taskIndex)) )
419 qadm->EndOfCycle(AliQA::GetTaskIndex(AliQA::GetTaskName(taskIndex))) ;
420 }
421 qadm->Finish();
422 }
423 }
424}
425
6294b9a7 426//_____________________________________________________________________________
427void AliQADataMakerSteer::EndOfCycle(TString detectors)
428{
429 // End of cycle QADataMakers
430
431 for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
432 if (IsSelected(AliQA::GetDetName(iDet))) {
433 AliQADataMaker * qadm = GetQADataMaker(iDet) ;
434 if (!qadm)
435 continue ;
436 // skip non active detectors
437 if (!detectors.Contains(AliQA::GetDetName(iDet)))
438 continue ;
439 for (UInt_t taskIndex = 0; taskIndex < AliQA::kNTASKINDEX; taskIndex++) {
440 if ( fTasks.Contains(Form("%d", taskIndex)) )
441 qadm->EndOfCycle(AliQA::GetTaskIndex(AliQA::GetTaskName(taskIndex))) ;
442 }
443 qadm->Finish();
444 }
445 }
446}
447
930e6e3e 448//_____________________________________________________________________________
449void AliQADataMakerSteer::Increment()
450{
451 // Increments the cycle counter for all QA Data Makers
452 for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
453 if (IsSelected(AliQA::GetDetName(iDet))) {
454 AliQADataMaker * qadm = GetQADataMaker(iDet) ;
455 if (qadm)
456 qadm->Increment() ;
457 }
458 }
459}
460
312e6f8d 461//_____________________________________________________________________________
30bbd491 462Bool_t AliQADataMakerSteer::Init(const AliQA::TASKINDEX_t taskIndex, const char * input )
312e6f8d 463{
464 // Initialize the event source and QA data makers
465
194bc923 466 //fTasks = AliQA::GetTaskName(taskIndex) ;
940d8e5f 467
6441b07a 468 if (taskIndex == AliQA::kRAWS) {
469 if (!fRawReader) {
e64fcb90 470 fRawReader = AliRawReader::Create(input);
4ecde5fc 471 }
940d8e5f 472 if ( ! fRawReader )
312e6f8d 473 return kFALSE ;
fff5167b 474 fRawReaderDelete = kTRUE ;
312e6f8d 475 fRawReader->NextEvent() ;
476 fRunNumber = fRawReader->GetRunNumber() ;
04236e67 477 AliCDBManager::Instance()->SetRun(fRunNumber) ;
312e6f8d 478 fRawReader->RewindEvents();
479 fNumberOfEvents = 999999 ;
f0c6fb4b 480 if ( fMaxEvents < 0 )
481 fMaxEvents = fNumberOfEvents ;
482 } else if (taskIndex == AliQA::kESDS) {
940d8e5f 483 fTasks = AliQA::GetTaskName(AliQA::kESDS) ;
b1344d8d 484 if (!gSystem->AccessPathName("AliESDs.root")) { // AliESDs.root exists
485 TFile * esdFile = TFile::Open("AliESDs.root") ;
486 fESDTree = dynamic_cast<TTree *> (esdFile->Get("esdTree")) ;
487 if ( !fESDTree ) {
488 AliError("esdTree not found") ;
489 return kFALSE ;
490 } else {
491 fESD = new AliESDEvent() ;
492 fESD->ReadFromTree(fESDTree) ;
493 fESDTree->GetEntry(0) ;
494 fRunNumber = fESD->GetRunNumber() ;
495 fNumberOfEvents = fESDTree->GetEntries() ;
496 if ( fMaxEvents < 0 )
497 fMaxEvents = fNumberOfEvents ;
498 }
499 } else {
500 AliError("AliESDs.root not found") ;
501 return kFALSE ;
502 }
503 } else {
504 if ( !InitRunLoader() ) {
505 AliWarning("No Run Loader not found") ;
506 } else {
507 fNumberOfEvents = fRunLoader->GetNumberOfEvents() ;
508 if ( fMaxEvents < 0 )
509 fMaxEvents = fNumberOfEvents ;
510 }
511 }
fff5167b 512
b1344d8d 513 // Get Detectors
514 TObjArray* detArray = NULL ;
56f4f5f4 515 if (fRunLoader) // check if RunLoader exists
b37ee1e8 516 if ( fRunLoader->GetAliRun() ) { // check if AliRun exists in gAlice.root
56f4f5f4 517 detArray = fRunLoader->GetAliRun()->Detectors() ;
b37ee1e8 518 fRunNumber = fRunLoader->GetHeader()->GetRun() ;
519 }
30bbd491 520
521 // Initialize all QA data makers for all detectors
522 fRunNumber = AliCDBManager::Instance()->GetRun() ;
523 if ( ! AliGeomManager::GetGeometry() )
524 AliGeomManager::LoadGeometry() ;
525
930e6e3e 526 InitQADataMaker(fRunNumber, fRecoParam, detArray) ; //, fCycleSame, kTRUE, detArray) ;
940d8e5f 527 return kTRUE ;
528}
529
530//_____________________________________________________________________________
930e6e3e 531void AliQADataMakerSteer::InitQADataMaker(UInt_t run, const AliRecoParam & par, TObjArray * detArray)
940d8e5f 532{
533 // Initializes The QADataMaker for all active detectors and for all active tasks
534
56f4f5f4 535 for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
4d52736b 536 if (IsSelected(AliQA::GetDetName(iDet))) {
30bbd491 537 AliQADataMaker * qadm = GetQADataMaker(iDet) ;
252f8aa8 538 if (fQAWriteExpert[iDet])
539 qadm->SetWriteExpert() ;
4d52736b 540 if (!qadm) {
fff5167b 541 AliError(Form("AliQADataMaker not found for %s", AliQA::GetDetName(iDet))) ;
542 fDetectorsW.ReplaceAll(AliQA::GetDetName(iDet), "") ;
4d52736b 543 } else {
fff5167b 544 AliDebug(1, Form("Data Maker found for %s", qadm->GetName())) ;
56f4f5f4 545 // skip non active detectors
546 if (detArray) {
547 AliModule* det = static_cast<AliModule*>(detArray->FindObject(AliQA::GetDetName(iDet))) ;
548 if (!det || !det->IsActive())
549 continue ;
550 }
940d8e5f 551 // Set default reco params
552 qadm->SetRecoParam(par.GetDetRecoParam(iDet));
930e6e3e 553 Bool_t sameCycle = kFALSE ;
940d8e5f 554 for (UInt_t taskIndex = 0; taskIndex < AliQA::kNTASKINDEX; taskIndex++) {
555 if ( fTasks.Contains(Form("%d", taskIndex)) ) {
930e6e3e 556 qadm->StartOfCycle(AliQA::GetTaskIndex(AliQA::GetTaskName(taskIndex)), run, sameCycle) ;
557 qadm->Init(AliQA::GetTaskIndex(AliQA::GetTaskName(taskIndex)), GetQACycles(qadm->GetUniqueID())) ;
558 sameCycle = kTRUE ;
940d8e5f 559 }
560 }
4d52736b 561 }
312e6f8d 562 }
940d8e5f 563 }
312e6f8d 564}
565
a2b64fbd 566
312e6f8d 567//_____________________________________________________________________________
568Bool_t AliQADataMakerSteer::InitRunLoader()
569{
570 // get or create the run loader
571 if (fRunLoader) {
c65c502a 572 fCycleSame = kTRUE ;
e4a998ed 573 } else {
574 if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
575 // load all base libraries to get the loader classes
576 TString libs = gSystem->GetLibraries() ;
577 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
578 if (!IsSelected(AliQA::GetDetName(iDet)))
579 continue ;
580 TString detName = AliQA::GetDetName(iDet) ;
581 if (detName == "HLT")
582 continue;
583 if (libs.Contains("lib" + detName + "base.so"))
584 continue;
585 gSystem->Load("lib" + detName + "base.so");
586 }
587 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data());
588 if (!fRunLoader) {
589 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
590 return kFALSE;
591 }
592 fRunLoader->CdGAFile();
593 if (fRunLoader->LoadgAlice() == 0) {
594 gAlice = fRunLoader->GetAliRun();
595 }
596
597 if (!gAlice) {
598 AliError(Form("no gAlice object found in file %s", fGAliceFileName.Data()));
599 return kFALSE;
600 }
4d52736b 601
e4a998ed 602 } else { // galice.root does not exist
603 AliError(Form("the file %s does not exist", fGAliceFileName.Data()));
312e6f8d 604 return kFALSE;
605 }
e4a998ed 606 }
312e6f8d 607
e4a998ed 608 if (!fRunNumber) {
609 fRunLoader->LoadHeader();
610 fRunNumber = fRunLoader->GetHeader()->GetRun() ;
611 }
612 return kTRUE;
312e6f8d 613}
614
04236e67 615//_____________________________________________________________________________
616Bool_t AliQADataMakerSteer::IsSelected(const char * det)
617{
618 // check whether detName is contained in detectors
619 // if yes, it is removed from detectors
620
56f4f5f4 621 Bool_t rv = kFALSE;
04236e67 622 const TString detName(det) ;
a2b64fbd 623 // always activates Correlation
624 if ( detName.Contains(AliQA::GetDetName(AliQA::kCORR))) {
625 rv = kTRUE ;
626 } else {
627 // check if all detectors are selected
628 if (fDetectors.Contains("ALL")) {
629 fDetectors = "ALL";
630 rv = kTRUE;
631 } else if ((fDetectors.CompareTo(detName) == 0) ||
632 fDetectors.BeginsWith(detName+" ") ||
633 fDetectors.EndsWith(" "+detName) ||
634 fDetectors.Contains(" "+detName+" ")) {
635 rv = kTRUE;
636 }
637 }
04236e67 638 return rv ;
639}
640
312e6f8d 641//_____________________________________________________________________________
4edbc5bc 642Bool_t AliQADataMakerSteer::Merge(const Int_t runNumber) const
f5464b75 643{
644 // Merge data from all the cycles from all detectors in one single file per run
645 // Merge the QA results from all the data chunks in one run
646 Bool_t rv = MergeData(runNumber) ;
647 rv *= MergeResults(runNumber) ;
648 return rv ;
649}
650
651
652//_____________________________________________________________________________
653Bool_t AliQADataMakerSteer::MergeData(const Int_t runNumber) const
315bba70 654{
567d83d9 655 // Merge all the cycles from all detectors in one single file per run
614a7f99 656 TString cmd ;
f5464b75 657 if (runNumber == -1)
147c1c84 658 cmd = Form(".! ls *%s*.%d.root > tempo.txt", AliQA::GetQADataFileName(), runNumber) ;
f5464b75 659 else
147c1c84 660 cmd = Form(".! ls *%s*.*.root > tempo.txt", AliQA::GetQADataFileName()) ;
614a7f99 661 gROOT->ProcessLine(cmd.Data()) ;
567d83d9 662 ifstream in("tempo.txt") ;
663 const Int_t runMax = 10 ;
664 TString file[AliQA::kNDET*runMax] ;
567d83d9 665
666 Int_t index = 0 ;
667 while ( 1 ) {
4edbc5bc 668 in >> file[index] ;
567d83d9 669 if ( !in.good() )
670 break ;
e5dedfe2 671 AliInfo(Form("index = %d file = %s", index, (file[index]).Data())) ;
672 index++ ;
4edbc5bc 673 }
674
675 if ( index == 0 ) {
676 AliError(Form("run number %d not found", runNumber)) ;
677 return kFALSE ;
567d83d9 678 }
147c1c84 679
680 TFileMerger merger ;
681 TString outFileName(Form("Merged.%s.Data.%d.root",AliQA::GetQADataFileName(),runNumber));
682 merger.OutputFile(outFileName.Data()) ;
683 for (Int_t ifile = 0 ; ifile < index-1 ; ifile++) {
684 TString pattern(Form("%s.%d.", AliQA::GetQADataFileName(), runNumber));
685 TString tmp(file[ifile]) ;
686 if (tmp.Contains(pattern)) {
687 merger.AddFile(tmp) ;
688 }
567d83d9 689 }
147c1c84 690 merger.Merge() ;
567d83d9 691 return kTRUE ;
315bba70 692}
693
f5464b75 694//_____________________________________________________________________________
695Bool_t AliQADataMakerSteer::MergeResults(const Int_t runNumber) const
696{
697 // Merge the QA result from all the data chunks in a run
698 TString cmd ;
699 cmd = Form(".! ls %s*.root > tempo.txt", AliQA::GetQADataFileName()) ;
700 gROOT->ProcessLine(cmd.Data()) ;
701 ifstream in("tempo.txt") ;
702 const Int_t chunkMax = 100 ;
703 TString fileList[chunkMax] ;
704
705 Int_t index = 0 ;
706 while ( 1 ) {
707 TString file ;
708 in >> fileList[index] ;
709 if ( !in.good() )
710 break ;
711 AliInfo(Form("index = %d file = %s", index, (fileList[index].Data()))) ;
712 index++ ;
713 }
714
715 if ( index == 0 ) {
716 AliError("No QA Result File found") ;
717 return kFALSE ;
718 }
719
720 TFileMerger merger ;
721 TString outFileName(Form("Merged.%s.Result.%d.root", AliQA::GetQADataFileName(), runNumber));
722 merger.OutputFile(outFileName.Data()) ;
723 for (Int_t ifile = 0 ; ifile < index ; ifile++) {
724 TString file = fileList[ifile] ;
725 merger.AddFile(file) ;
726 }
727 merger.Merge() ;
728
729 return kTRUE ;
730}
731
c65c502a 732//_____________________________________________________________________________
fff5167b 733void AliQADataMakerSteer::Reset(const Bool_t sameCycle)
c65c502a 734{
735 // Reset the default data members
c65c502a 736
30bbd491 737 for (UInt_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
738 if (IsSelected(AliQA::GetDetName(iDet))) {
739 AliQADataMaker * qadm = GetQADataMaker(iDet);
930e6e3e 740 qadm->Reset();
30bbd491 741 }
56f4f5f4 742 }
6441b07a 743 if (fRawReaderDelete) {
744 delete fRawReader ;
745 fRawReader = NULL ;
746 }
c65c502a 747
fff5167b 748 fCycleSame = sameCycle ;
c65c502a 749 fESD = NULL ;
750 fESDTree = NULL ;
30bbd491 751 //fFirst = kTRUE ;
774ac967 752 fNumberOfEvents = 999999 ;
c65c502a 753}
754
6441b07a 755//_____________________________________________________________________________
7c002d48 756TString AliQADataMakerSteer::Run(const char * detectors, AliRawReader * rawReader, const Bool_t sameCycle)
6441b07a 757{
758 //Runs all the QA data Maker for Raws only
7c002d48 759
760 fCycleSame = sameCycle ;
761 fRawReader = rawReader ;
4d52736b 762 fDetectors = detectors ;
7c002d48 763 fDetectorsW = detectors ;
764
95932286 765 AliCDBManager* man = AliCDBManager::Instance() ;
7930d770 766
95932286 767 if ( man->GetRun() == -1 ) {// check if run number not set previously and set it from raw data
95932286 768 rawReader->NextEvent() ;
769 man->SetRun(fRawReader->GetRunNumber()) ;
770 rawReader->RewindEvents() ;
771 }
772
6294b9a7 773 if (!fCycleSame)
774 if ( !Init(AliQA::kRAWS) )
775 return kFALSE ;
776 fRawReaderDelete = kFALSE ;
ea9ce23f 777
30bbd491 778 DoIt(AliQA::kRAWS) ;
e5dedfe2 779 return fDetectorsW ;
04236e67 780}
781
782//_____________________________________________________________________________
7c002d48 783TString AliQADataMakerSteer::Run(const char * detectors, const char * fileName, const Bool_t sameCycle)
04236e67 784{
785 //Runs all the QA data Maker for Raws only
7c002d48 786
787 fCycleSame = sameCycle ;
04236e67 788 fDetectors = detectors ;
e5dedfe2 789 fDetectorsW = detectors ;
04236e67 790
95932286 791 AliCDBManager* man = AliCDBManager::Instance() ;
95932286 792 if ( man->GetRun() == -1 ) { // check if run number not set previously and set it from AliRun
793 AliRunLoader * rl = AliRunLoader::Open("galice.root") ;
794 if ( ! rl ) {
795 AliFatal("galice.root file not found in current directory") ;
796 } else {
797 rl->CdGAFile() ;
798 rl->LoadgAlice() ;
799 if ( ! rl->GetAliRun() ) {
800 AliFatal("AliRun not found in galice.root") ;
801 } else {
802 rl->LoadHeader() ;
803 man->SetRun(rl->GetHeader()->GetRun());
804 }
805 }
806 }
807
6294b9a7 808 if (!fCycleSame)
809 if ( !Init(AliQA::kRAWS, fileName) )
810 return kFALSE ;
ea9ce23f 811
30bbd491 812 DoIt(AliQA::kRAWS) ;
fff5167b 813 return fDetectorsW ;
6441b07a 814}
815
312e6f8d 816//_____________________________________________________________________________
7c002d48 817TString AliQADataMakerSteer::Run(const char * detectors, const AliQA::TASKINDEX_t taskIndex, Bool_t const sameCycle, const char * fileName )
312e6f8d 818{
819 // Runs all the QA data Maker for every detector
7c002d48 820
821 fCycleSame = sameCycle ;
822 fDetectors = detectors ;
823 fDetectorsW = detectors ;
824
65c771ca 825 AliCDBManager* man = AliCDBManager::Instance() ;
95932286 826 if ( man->GetRun() == -1 ) { // check if run number not set previously and set it from AliRun
827 AliRunLoader * rl = AliRunLoader::Open("galice.root") ;
828 if ( ! rl ) {
829 AliFatal("galice.root file not found in current directory") ;
830 } else {
831 rl->CdGAFile() ;
832 rl->LoadgAlice() ;
833 if ( ! rl->GetAliRun() ) {
efb37e8e 834 AliInfo("AliRun not found in galice.root") ;
95932286 835 } else {
836 rl->LoadHeader() ;
837 man->SetRun(rl->GetHeader()->GetRun()) ;
838 }
839 }
840 }
841
ea9ce23f 842
940d8e5f 843 if ( taskIndex == AliQA::kNULLTASKINDEX) {
194bc923 844 for (UInt_t task = 0; task < AliQA::kNTASKINDEX; task++) {
b1344d8d 845 if ( fTasks.Contains(Form("%d", task)) ) {
846 if (!fCycleSame)
847 if ( !Init(AliQA::GetTaskIndex(AliQA::GetTaskName(task)), fileName) )
848 return kFALSE ;
849 DoIt(AliQA::GetTaskIndex(AliQA::GetTaskName(task))) ;
194bc923 850 }
851 }
852 } else {
6294b9a7 853 if (! fCycleSame )
854 if ( !Init(taskIndex, fileName) )
855 return kFALSE ;
856 DoIt(taskIndex) ;
857 }
4d52736b 858
e5dedfe2 859 return fDetectorsW ;
6441b07a 860
14e1eccc 861}
4edbc5bc 862
940d8e5f 863//_____________________________________________________________________________
864void AliQADataMakerSteer::RunOneEvent(AliRawReader * rawReader)
865{
866 //Runs all the QA data Maker for Raws only and on one event only (event loop done by calling method)
930e6e3e 867 if ( ! rawReader )
868 return ;
940d8e5f 869 AliCodeTimerAuto("") ;
a2b64fbd 870 if (fTasks.Contains(Form("%d", AliQA::kRAWS))){
871 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
872 if (!IsSelected(AliQA::GetDetName(iDet)))
873 continue;
874 AliQADataMaker *qadm = GetQADataMaker(iDet);
875 if (!qadm)
876 continue;
930e6e3e 877 if ( qadm->IsCycleDone() ) {
878 qadm->EndOfCycle() ;
879 }
a2b64fbd 880 AliCodeTimerStart(Form("running RAW quality assurance data maker for %s", AliQA::GetDetName(iDet)));
940d8e5f 881 qadm->Exec(AliQA::kRAWS, rawReader) ;
a2b64fbd 882 AliCodeTimerStop(Form("running RAW quality assurance data maker for %s", AliQA::GetDetName(iDet)));
940d8e5f 883 }
a2b64fbd 884 }
940d8e5f 885}
886
887//_____________________________________________________________________________
888void AliQADataMakerSteer::RunOneEvent(AliESDEvent *& esd)
889{
890 //Runs all the QA data Maker for ESDs only and on one event only (event loop done by calling method)
891
892 AliCodeTimerAuto("") ;
a2b64fbd 893 if (fTasks.Contains(Form("%d", AliQA::kESDS))) {
894 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
895 if (!IsSelected(AliQA::GetDetName(iDet)))
896 continue;
897 AliQADataMaker *qadm = GetQADataMaker(iDet);
898 if (!qadm)
899 continue;
930e6e3e 900 if ( qadm->IsCycleDone() ) {
901 qadm->EndOfCycle() ;
902 }
a2b64fbd 903 AliCodeTimerStart(Form("running ESD quality assurance data maker for %s", AliQA::GetDetName(iDet)));
940d8e5f 904 qadm->Exec(AliQA::kESDS, esd) ;
a2b64fbd 905 AliCodeTimerStop(Form("running ESD quality assurance data maker for %s", AliQA::GetDetName(iDet)));
940d8e5f 906 }
907 }
908}
909
910//_____________________________________________________________________________
911void AliQADataMakerSteer::RunOneEventInOneDetector(Int_t det, TTree * tree)
912{
913 // Runs all the QA data Maker for ESDs only and on one event only (event loop done by calling method)
914 AliCodeTimerAuto("") ;
a2b64fbd 915 if (fTasks.Contains(Form("%d", AliQA::kRECPOINTS))) {
930e6e3e 916 if (IsSelected(AliQA::GetDetName(det))) {
a2b64fbd 917 AliQADataMaker *qadm = GetQADataMaker(det);
918 if (qadm) {
930e6e3e 919 if ( qadm->IsCycleDone() ) {
920 qadm->EndOfCycle() ;
921 }
a2b64fbd 922 AliCodeTimerStart(Form("running RecPoints quality assurance data maker for %s", AliQA::GetDetName(det)));
923 qadm->Exec(AliQA::kRECPOINTS, tree) ;
930e6e3e 924 AliCodeTimerStop(Form("running RecPoints quality assurance data maker for %s", AliQA::GetDetName(det)));
925 }
926 }
927 }
940d8e5f 928}
929
4edbc5bc 930//_____________________________________________________________________________
147c1c84 931Bool_t AliQADataMakerSteer::Save2OCDB(const Int_t runNumber, const char * year, const char * detectors) const
4edbc5bc 932{
933 // take the locasl QA data merge into a single file and save in OCDB
934 Bool_t rv = kTRUE ;
935 TString tmp(AliQA::GetQARefStorage()) ;
936 if ( tmp.IsNull() ) {
937 AliError("No storage defined, use AliQA::SetQARefStorage") ;
938 return kFALSE ;
939 }
940 if ( !(tmp.Contains(AliQA::GetLabLocalOCDB()) || tmp.Contains(AliQA::GetLabAliEnOCDB())) ) {
941 AliError(Form("%s is a wrong storage, use %s or %s", AliQA::GetQARefStorage(), AliQA::GetLabLocalOCDB().Data(), AliQA::GetLabAliEnOCDB().Data())) ;
942 return kFALSE ;
943 }
944 TString sdet(detectors) ;
945 sdet.ToUpper() ;
946 TFile * inputFile ;
947 if ( sdet.Contains("ALL") ) {
948 rv = Merge(runNumber) ;
949 if ( ! rv )
950 return kFALSE ;
147c1c84 951 TString inputFileName(Form("Merged.%s.Data.%d.root", AliQA::GetQADataFileName(), runNumber)) ;
614a7f99 952 inputFile = TFile::Open(inputFileName.Data()) ;
11032e1d 953 rv = SaveIt2OCDB(runNumber, inputFile, year) ;
4edbc5bc 954 } else {
955 for (Int_t index = 0; index < AliQA::kNDET; index++) {
956 if (sdet.Contains(AliQA::GetDetName(index))) {
147c1c84 957 TString inputFileName(Form("%s.%s.%d.root", AliQA::GetDetName(index), AliQA::GetQADataFileName(), runNumber)) ;
614a7f99 958 inputFile = TFile::Open(inputFileName.Data()) ;
11032e1d 959 rv *= SaveIt2OCDB(runNumber, inputFile, year) ;
4edbc5bc 960 }
961 }
962 }
963 return rv ;
964}
965
966//_____________________________________________________________________________
11032e1d 967Bool_t AliQADataMakerSteer::SaveIt2OCDB(const Int_t runNumber, TFile * inputFile, const char * year) const
4edbc5bc 968{
969 // reads the TH1 from file and adds it to appropriate list before saving to OCDB
970 Bool_t rv = kTRUE ;
971 AliInfo(Form("Saving TH1s in %s to %s", inputFile->GetName(), AliQA::GetQARefStorage())) ;
972 AliCDBManager* man = AliCDBManager::Instance() ;
f73f556a 973 if ( ! man->IsDefaultStorageSet() ) {
a681ca96 974 TString tmp( AliQA::GetQARefStorage() ) ;
975 if ( tmp.Contains(AliQA::GetLabLocalOCDB()) )
976 man->SetDefaultStorage(AliQA::GetQARefStorage()) ;
977 else {
605cb8bb 978 TString tmp1(AliQA::GetQARefDefaultStorage()) ;
979 tmp1.Append(year) ;
980 tmp1.Append("?user=alidaq") ;
981 man->SetDefaultStorage(tmp1.Data()) ;
a681ca96 982 }
f73f556a 983 }
a681ca96 984 man->SetSpecificStorage("*", AliQA::GetQARefStorage()) ;
04236e67 985 if(man->GetRun() < 0)
986 man->SetRun(runNumber);
987
11032e1d 988 AliCDBMetaData mdr ;
989 mdr.SetResponsible("yves schutz");
990
4edbc5bc 991 for ( Int_t detIndex = 0 ; detIndex < AliQA::kNDET ; detIndex++) {
992 TDirectory * detDir = inputFile->GetDirectory(AliQA::GetDetName(detIndex)) ;
993 if ( detDir ) {
994 AliInfo(Form("Entering %s", detDir->GetName())) ;
614a7f99 995 TString detOCDBDir(Form("%s/%s/%s", AliQA::GetDetName(detIndex), AliQA::GetRefOCDBDirName(), AliQA::GetRefDataDirName())) ;
147c1c84 996 printf("SSSSSSSSSSSSSSSSSSSSS %s\n", detOCDBDir.Data()) ;
614a7f99 997 AliCDBId idr(detOCDBDir.Data(), runNumber, AliCDBRunRange::Infinity()) ;
4edbc5bc 998 TList * listDetQAD = new TList() ;
614a7f99 999 TString listName(Form("%s QA data Reference", AliQA::GetDetName(detIndex))) ;
11032e1d 1000 mdr.SetComment("HMPID QA stuff");
4edbc5bc 1001 listDetQAD->SetName(listName) ;
1002 TList * taskList = detDir->GetListOfKeys() ;
1003 TIter nextTask(taskList) ;
1004 TKey * taskKey ;
1005 while ( (taskKey = dynamic_cast<TKey*>(nextTask())) ) {
1006 TDirectory * taskDir = detDir->GetDirectory(taskKey->GetName()) ;
1007 AliInfo(Form("Saving %s", taskDir->GetName())) ;
f73f556a 1008 TObjArray * listTaskQAD = new TObjArray(100) ;
4edbc5bc 1009 listTaskQAD->SetName(taskKey->GetName()) ;
1010 listDetQAD->Add(listTaskQAD) ;
1011 TList * histList = taskDir->GetListOfKeys() ;
1012 TIter nextHist(histList) ;
1013 TKey * histKey ;
1014 while ( (histKey = dynamic_cast<TKey*>(nextHist())) ) {
1015 TObject * odata = taskDir->Get(histKey->GetName()) ;
a681ca96 1016 if ( !odata ) {
1017 AliError(Form("%s in %s/%s returns a NULL pointer !!", histKey->GetName(), detDir->GetName(), taskDir->GetName())) ;
1018 } else {
4edbc5bc 1019 AliInfo(Form("Adding %s", histKey->GetName())) ;
a681ca96 1020 if ( odata->IsA()->InheritsFrom("TH1") ) {
1021 AliInfo(Form("Adding %s", histKey->GetName())) ;
1022 TH1 * hdata = static_cast<TH1*>(odata) ;
1023 listTaskQAD->Add(hdata) ;
1024 }
4edbc5bc 1025 }
1026 }
1027 }
4edbc5bc 1028 man->Put(listDetQAD, idr, &mdr) ;
1029 }
1030 }
1031 return rv ;
1032}
a6f6970e 1033
940d8e5f 1034//_____________________________________________________________________________
1035void AliQADataMakerSteer::SetRecoParam(const char* detector, AliDetectorRecoParam *par)
1036{
1037 // Set custom reconstruction parameters for a given detector
1038 // Single set of parameters for all the events
194bc923 1039 for (UInt_t iDet = 0; iDet < fgkNDetectors; iDet++) {
940d8e5f 1040 if(!strcmp(detector, AliQA::GetDetName(iDet))) {
1041 par->SetAsDefault();
1042 fRecoParam.AddDetRecoParam(iDet,par);
1043 break;
1044 }
1045 }
1046}
1047
1048