]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/STEERBase/AliQA.cxx
ATO-37 - STEER/CDB/AliOCDBtoolkit.cxx - Use consistently SetSpecificStorage
[u/mrichter/AliRoot.git] / STEER / STEERBase / AliQA.cxx
CommitLineData
8661738e 1
421ab0fb 2/**************************************************************************
3 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * *
5 * Author: The ALICE Off-line Project. *
6 * Contributors are mentioned in the code where appropriate. *
7 * *
8 * Permission to use, copy, modify and distribute this software and its *
9 * documentation strictly for non-commercial purposes is hereby granted *
10 * without fee, provided that the above copyright notice appears in all *
11 * copies and that both the copyright notice and this permission notice *
12 * appear in the supporting documentation. The authors make no claims *
13 * about the suitability of this software for any purpose. It is *
14 * provided "as is" without express or implied warranty. *
15 **************************************************************************/
16/* $Id$ */
17
18//////////////////////////////////////////////////////////////////////////////
19//
20// Quality Assurance Object//_________________________________________________________________________
21// Quality Assurance object. The QA status is held in one word per detector,
22// each bit corresponds to a different status.
12581b04 23// bit 0-3 : QA raised during simulation (RAW)
24// bit 4-7 : QA raised during simulation (SIM)
25// bit 8-11 : QA raised during reconstruction (REC)
26// bit 12-15 : QA raised during ESD checking (ESD)
27// bit 16-19 : QA raised during analysis (ANA)
421ab0fb 28// Each of the 4 bits corresponds to a severity level of increasing importance
29// from lower to higher bit (INFO, WARNING, ERROR, FATAL)
30//
31//*-- Yves Schutz CERN, July 2007
32//////////////////////////////////////////////////////////////////////////////
33
34
b09247a2 35#include <cstdlib>
421ab0fb 36// --- ROOT system ---
34709735 37#include <TClass.h>
421ab0fb 38#include <TFile.h>
39#include <TSystem.h>
0d13dd63 40#include <TROOT.h>
421ab0fb 41
42// --- Standard library ---
43
44// --- AliRoot header files ---
45#include "AliLog.h"
2e42b4d4 46#include "AliQA.h"
421ab0fb 47
48
2e42b4d4 49ClassImp(AliQA)
f73f556a 50AliQA * AliQA::fgQA = 0x0 ;
51TFile * AliQA::fgQADataFile = 0x0 ;
4e25ac79 52TString AliQA::fgQADataFileName = "QA" ; // will transform into Det.QA.run.cycle.root
f73f556a 53TFile * AliQA::fgQARefFile = 0x0 ;
147c1c84 54TString AliQA::fgQARefDirName = "" ;
f73f556a 55TString AliQA::fgQARefFileName = "QA.root" ;
56TFile * AliQA::fgQAResultFile = 0x0 ;
57TString AliQA::fgQAResultDirName = "" ;
58TString AliQA::fgQAResultFileName = "QA.root" ;
59TString AliQA::fgDetNames[] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD",
38e7ce48 60 "ZDC", "PMD", "T0", "VZERO", "ACORDE", "HLT", "Global", "CORR","MFT"};
4fb24ca4 61TString AliQA::fgGRPPath = "GRP/GRP/Data" ;
4e25ac79 62TString AliQA::fgRTNames[] = {"UNKNOWN", "AUTO_TEST", "CALIBRATION", "CALIBRATION_PULSER", "CHANNEL_DELAY_TUNING", "COSMIC",
63 "COSMICS", "DAQ_FO_UNIF_SCAN", "DAQ_GEN_DAC_SCAN", "DAQ_MEAN_TH_SCAN", "DAQ_MIN_TH_SCAN",
64 "DAQ_NOISY_PIX_SCAN", "DAQ_PIX_DELAY_SCAN", "DAQ_UNIFORMITY_SCAN", "DCS_FO_UNIF_SCAN",
65 "DCS_MEAN_TH_SCAN", "DCS_MIN_TH_SCAN", "DCS_PIX_DELAY_SCAN", "DCS_UNIFORMITY_SCAN",
66 "DDL_TEST", "GAIN", "PEDESTAL", "INJECTOR", "LASER", "MONTECARLO", "NOISE", "NOISY_PIX_SCAN",
67 "PHYSICS", "PULSER", "STANDALONE", "STANDALONE_BC", "STANDALONE_CENTRAL", "STANDALONE_COSMIC",
68 "STANDALONE_EMD", "STANDALONE_LASER", "STANDALONE_MB", "STANDALONE_PEDESTAL",
69 "STANDALONE_SEMICENTRAL", "STANDALONE_PULSER" } ;
f73f556a 70TString AliQA::fgTaskNames[] = {"Raws", "Hits", "SDigits", "Digits", "RecPoints", "TrackSegments", "RecParticles", "ESDs"} ;
2204e424 71const TString AliQA::fgkLabLocalFile = "file://" ;
72const TString AliQA::fgkLabLocalOCDB = "local://" ;
73const TString AliQA::fgkLabAliEnOCDB = "alien://" ;
74const TString AliQA::fgkRefFileName = "QA.root" ;
75const TString AliQA::fgkQAName = "QA" ;
76const TString AliQA::fgkQACorrNtName = "CorrQA" ;
77const TString AliQA::fgkRefOCDBDirName = "Ref" ;
78TString AliQA::fgkRefDataDirName = "" ;
79const TString AliQA::fgkQARefOCDBDefault = "alien://folder=/alice/QA/20" ;
80const TString AliQA::fgkExpert = "Expert" ;
81const UInt_t AliQA::fgkExpertBit = 16 ;
82const UInt_t AliQA::fgkQABit = 17 ;
930e6e3e 83
421ab0fb 84//____________________________________________________________________________
2e42b4d4 85AliQA::AliQA() :
421ab0fb 86 TNamed("", ""),
9a223722 87 fNdet(kNDET),
4e25ac79 88 fQA(new ULong_t[fNdet]),
421ab0fb 89 fDet(kNULLDET),
4e25ac79 90 fTask(kNULLTASK)
91
421ab0fb 92{
93 // default constructor
4e25ac79 94 // beware singleton: not to be used
95
96 for (Int_t index = 0 ; index < fNdet ; index++)
97 fQA[index] = 0 ;
421ab0fb 98}
99
100//____________________________________________________________________________
2e42b4d4 101AliQA::AliQA(const AliQA& qa) :
421ab0fb 102 TNamed(qa),
9a223722 103 fNdet(qa.fNdet),
b9f60f9d 104 fQA(new ULong_t[qa.fNdet]),
421ab0fb 105 fDet(qa.fDet),
4e25ac79 106 fTask(qa.fTask)
421ab0fb 107{
108 // cpy ctor
4e580efc 109 memcpy(fQA, qa.fQA, sizeof(ULong_t)*fNdet);
421ab0fb 110}
111
112//_____________________________________________________________________________
2e42b4d4 113AliQA& AliQA::operator = (const AliQA& qa)
421ab0fb 114{
4e580efc 115 //
116 // Assignment operator
117 if(this != &qa) {
118 TNamed::operator=(qa);
119 fNdet = qa.fNdet;
120 delete [] fQA;
121 fQA = new ULong_t[fNdet];
122 memcpy(fQA, qa.fQA, sizeof(ULong_t)*fNdet);
123 fDet = qa.fDet;
124 fTask = qa.fTask;
125 }
4e25ac79 126 return *this;
27293674 127}
128
421ab0fb 129//_______________________________________________________________
96d67a8d 130AliQA::AliQA(const DETECTORINDEX_t det) :
9a223722 131 TNamed("QA", "Quality Assurance status"),
4e25ac79 132 fNdet(kNDET),
133 fQA(new ULong_t[fNdet]),
a5fa6165 134 fDet(det),
4e25ac79 135 fTask(kNULLTASK)
a5fa6165 136{
137 // constructor to be used
4e25ac79 138 if (! CheckRange(det) ) {
139 fDet = kNULLDET ;
140 return ;
141 }
142 Int_t index ;
143 for (index = 0; index < fNdet; index++)
144 fQA[index] = 0 ;
a5fa6165 145}
146
147//_______________________________________________________________
96d67a8d 148AliQA::AliQA(const ALITASK_t tsk) :
4e25ac79 149 TNamed("QA", "Quality Assurance status"),
150 fNdet(kNDET),
151 fQA(new ULong_t[fNdet]),
421ab0fb 152 fDet(kNULLDET),
4e25ac79 153 fTask(tsk)
421ab0fb 154{
155 // constructor to be used in the AliRoot module (SIM, REC, ESD or ANA)
4e25ac79 156 if (! CheckRange(tsk) ) {
157 fTask = kNULLTASK ;
158 return ;
159 }
160 Int_t index ;
161 for (index = 0; index < fNdet; index++)
162 fQA[index] = 0 ;
421ab0fb 163}
164
165//____________________________________________________________________________
2e42b4d4 166AliQA::~AliQA()
421ab0fb 167{
168 // dtor
4e25ac79 169 delete[] fQA ;
421ab0fb 170}
171
46ca5304 172//_______________________________________________________________
173void AliQA::Close()
174{
175 // close the open files
176 if (fgQADataFile)
177 if (fgQADataFile->IsOpen())
178 fgQADataFile->Close() ;
179 if (fgQAResultFile)
180 if (fgQAResultFile->IsOpen())
181 fgQAResultFile->Close() ;
182 if (fgQARefFile)
183 if (fgQARefFile->IsOpen())
184 fgQARefFile->Close() ;
185}
186
4ecde5fc 187//_______________________________________________________________
f12d42ce 188Bool_t AliQA::CheckFatal() const
4ecde5fc 189{
190 // check if any FATAL status is set
191 Bool_t rv = kFALSE ;
192 Int_t index ;
193 for (index = 0; index < kNDET ; index++)
4e25ac79 194 rv = rv || IsSet(DETECTORINDEX_t(index), fTask, kFATAL) ;
4ecde5fc 195 return rv ;
196}
197
421ab0fb 198//_______________________________________________________________
f12d42ce 199Bool_t AliQA::CheckRange(DETECTORINDEX_t det) const
421ab0fb 200{
a4976ef3 201 // check if detector is in given detector range: 0-kNDET
421ab0fb 202
a5fa6165 203 Bool_t rv = ( det < 0 || det > kNDET ) ? kFALSE : kTRUE ;
421ab0fb 204 if (!rv)
205 AliFatal(Form("Detector index %d is out of range: 0 <= index <= %d", det, kNDET)) ;
206 return rv ;
207}
208
209//_______________________________________________________________
f12d42ce 210Bool_t AliQA::CheckRange(ALITASK_t task) const
421ab0fb 211{
212 // check if task is given taskk range: 0:kNTASK
6c18591a 213 Bool_t rv = ( task < kRAW || task > kNTASK ) ? kFALSE : kTRUE ;
421ab0fb 214 if (!rv)
215 AliFatal(Form("Module index %d is out of range: 0 <= index <= %d", task, kNTASK)) ;
216 return rv ;
217}
218
219//_______________________________________________________________
f12d42ce 220Bool_t AliQA::CheckRange(QABIT_t bit) const
421ab0fb 221{
222 // check if bit is in given bit range: 0-kNBit
223
224 Bool_t rv = ( bit < 0 || bit > kNBIT ) ? kFALSE : kTRUE ;
225 if (!rv)
226 AliFatal(Form("Status bit %d is out of range: 0 <= bit <= %d", bit, kNBIT)) ;
227 return rv ;
228}
229
4e25ac79 230
4ecde5fc 231
a5fa6165 232//_______________________________________________________________
4e25ac79 233char * AliQA::GetAliTaskName(ALITASK_t tsk)
421ab0fb 234{
0b96c27c 235 // returns the char name corresponding to module index
236 TString tskName ;
237 switch (tsk) {
238 case kNULLTASK:
239 break ;
240 case kRAW:
241 tskName = "RAW" ;
242 break ;
243 case kSIM:
244 tskName = "SIM" ;
245 break ;
246 case kREC:
247 tskName = "REC" ;
248 break ;
249 case kESD:
250 tskName = "ESD" ;
251 break ;
252 case kANA:
253 tskName = "ANA" ;
254 break ;
255 default:
256 tsk = kNULLTASK ;
257 break ;
258 }
4e25ac79 259 return Form("%s", tskName.Data()) ;
0b96c27c 260}
0acdb2bb 261
0b96c27c 262//_______________________________________________________________
4e25ac79 263char * AliQA::GetBitName(QABIT_t bit) const
0b96c27c 264{
265 // returns the char name corresponding to bit
266 TString bitName ;
267 switch (bit) {
268 case kNULLBit:
269 break ;
270 case kINFO:
271 bitName = "INFO" ;
272 break ;
273 case kWARNING:
274 bitName = "WARNING" ;
275 break ;
276 case kERROR:
277 bitName = "ERROR" ;
278 break ;
279 case kFATAL:
280 bitName = "FATAL" ;
281 break ;
282 default:
283 bit = kNULLBit ;
284 break ;
285 }
4e25ac79 286 return Form("%s", bitName.Data()) ;
421ab0fb 287}
288
46ca5304 289//_______________________________________________________________
f12d42ce 290AliQA::DETECTORINDEX_t AliQA::GetDetIndex(const char * name)
96d67a8d 291{
292 // returns the detector index corresponding to a given name
293 TString sname(name) ;
294 DETECTORINDEX_t rv = kNULLDET ;
295 for (Int_t det = 0; det < kNDET ; det++) {
296 if ( GetDetName(det) == sname ) {
297 rv = DETECTORINDEX_t(det) ;
298 break ;
299 }
300 }
301 return rv ;
302}
303
7c002d48 304//_______________________________________________________________
305const char * AliQA::GetDetName(Int_t det)
306{
307 // returns the detector name corresponding to a given index (needed in a loop)
308
309 if ( det >= 0 && det < kNDET)
310 return (fgDetNames[det]).Data() ;
311 else
312 return NULL ;
313}
314
46ca5304 315//_______________________________________________________________
4e25ac79 316TFile * AliQA::GetQADataFile(const char * name, const Int_t run)
46ca5304 317{
318 // opens the file to store the detectors Quality Assurance Data Maker results
930e6e3e 319 const char * temp = Form("%s.%s.%d.root", name, fgQADataFileName.Data(), run) ;
96d67a8d 320 TString opt ;
321 if (! fgQADataFile ) {
322 if (gSystem->AccessPathName(temp))
323 opt = "NEW" ;
324 else
325 opt = "UPDATE" ;
326 fgQADataFile = TFile::Open(temp, opt.Data()) ;
327 } else {
328 if ( strcmp(temp, fgQADataFile->GetName()) != 0 ) {
329 fgQADataFile = dynamic_cast<TFile *>(gROOT->FindObject(temp)) ;
330 if ( !fgQADataFile ) {
331 if (gSystem->AccessPathName(temp))
332 opt = "NEW" ;
333 else
334 opt = "UPDATE" ;
335 fgQADataFile = TFile::Open(temp, opt.Data()) ;
336 }
337 }
46ca5304 338 }
96d67a8d 339 return fgQADataFile ;
46ca5304 340}
341
342//_____________________________________________________________________________
343TFile * AliQA::GetQADataFile(const char * fileName)
344{
345 // Open if necessary the Data file and return its pointer
346
347 if (!fgQADataFile)
348 if (!fileName)
349 fileName = AliQA::GetQADataFileName() ;
350 if (!gSystem->AccessPathName(fileName)) {
351 fgQADataFile = TFile::Open(fileName) ;
352 } else {
34709735 353 AliFatalClass(Form("File %s not found", fileName)) ;
46ca5304 354 }
355 return fgQADataFile ;
356}
357
4ecde5fc 358//_______________________________________________________________
359TFile * AliQA::GetQAResultFile()
360{
361 // opens the file to store the Quality Assurance Data Checker results
2ba0b5f5 362 if (fgQAResultFile)
363 fgQAResultFile->Close() ;
364 fgQAResultFile = 0x0 ;
365// if (!fgQAResultFile) {
1c0190ec 366 TString dirName(fgQAResultDirName) ;
2204e424 367 if ( dirName.Contains(fgkLabLocalFile))
368 dirName.ReplaceAll(fgkLabLocalFile, "") ;
1c0190ec 369 TString fileName(dirName + fgQAResultFileName) ;
46ca5304 370 TString opt("") ;
371 if ( !gSystem->AccessPathName(fileName) )
372 opt = "UPDATE" ;
5bd22145 373 else {
1c0190ec 374 if ( gSystem->AccessPathName(dirName) )
375 gSystem->mkdir(dirName) ;
46ca5304 376 opt = "NEW" ;
5bd22145 377 }
46ca5304 378 fgQAResultFile = TFile::Open(fileName, opt) ;
2ba0b5f5 379// }
46ca5304 380
381 return fgQAResultFile ;
421ab0fb 382}
383
4e25ac79 384//_______________________________________________________________
385const TString AliQA::GetRunTypeName(RUNTYPE_t rt)
386{
2204e424 387 // returns the name of a run type
4e25ac79 388 TString rv("Invalid Run Type") ;
389 if ( rt == kNULLTYPE ) {
390 rv = "Known RUN_TYPE are: \n" ;
391 for (Int_t index = 0 ; index < kNTYPE; index++) {
392 rv += Form("%2d -- %s\n", index, fgRTNames[index].Data()) ;
393 }
34709735 394 AliErrorClass(Form("%s", rv.Data())) ;
4e25ac79 395 return "" ;
396 }
397 else {
398 if ( rt > kNULLTYPE && rt < kNTYPE )
399 rv = fgRTNames[rt] ;
400 }
401 return rv ;
402}
403
940d8e5f 404//_______________________________________________________________
f12d42ce 405AliQA::TASKINDEX_t AliQA::GetTaskIndex(const char * name)
940d8e5f 406{
407 // returns the detector index corresponding to a given name
408 TString sname(name) ;
750730d8 409 TASKINDEX_t rv = kNULLTASKINDEX ;
75f6ebf0 410 for (Int_t tsk = 0; tsk < kNTASKINDEX ; tsk++) {
940d8e5f 411 if ( GetTaskName(tsk) == sname ) {
412 rv = TASKINDEX_t(tsk) ;
413 break ;
414 }
415 }
416 return rv ;
417}
418
421ab0fb 419//_______________________________________________________________
4e25ac79 420Bool_t AliQA::IsSet(DETECTORINDEX_t det, ALITASK_t tsk, QABIT_t bit) const
421ab0fb 421{
422 // Checks is the requested bit is set
384c0618 423
421ab0fb 424 CheckRange(det) ;
425 CheckRange(tsk) ;
426 CheckRange(bit) ;
384c0618 427
421ab0fb 428 ULong_t offset = Offset(tsk) ;
4e25ac79 429 ULong_t status = GetStatus(det) ;
421ab0fb 430 offset+= bit ;
431 status = (status & 1 << offset) != 0 ;
432 return status ;
433}
434
384c0618 435//_______________________________________________________________
4e25ac79 436Bool_t AliQA::IsSetAny(DETECTORINDEX_t det, ALITASK_t tsk) const
384c0618 437{
438 // Checks is the requested bit is set
439
440 CheckRange(det) ;
441 CheckRange(tsk) ;
442
443 ULong_t offset = Offset(tsk) ;
4e25ac79 444 ULong_t status = GetStatus(det) ;
445 UShort_t st = 0 ;
384c0618 446 for ( Int_t bit = 0 ; bit < kNBIT ; bit++) {
447 offset+= bit ;
448 st += (status & 1 << offset) != 0 ;
449 }
450 if ( st == 0 )
451 return kFALSE ;
452 else
453 return kTRUE ;
454}
455//_______________________________________________________________
4e25ac79 456Bool_t AliQA::IsSetAny(DETECTORINDEX_t det) const
384c0618 457{
458 // Checks is the requested bit is set
459
460 CheckRange(det) ;
461
4e25ac79 462 ULong_t status = GetStatus(det) ;
463 UShort_t st = 0 ;
384c0618 464 for ( Int_t tsk = 0 ; tsk < kNTASK ; tsk++) {
465 ULong_t offset = Offset(ALITASK_t(tsk)) ;
466 for ( Int_t bit = 0 ; bit < kNBIT ; bit++) {
467 offset+= bit ;
468 st += (status & 1 << offset) != 0 ;
469 }
470 }
471 if ( st == 0 )
472 return kFALSE ;
473 else
474 return kTRUE ;
475}
476
421ab0fb 477//_______________________________________________________________
2e42b4d4 478AliQA * AliQA::Instance()
421ab0fb 479{
4e25ac79 480 // Get an instance of the singleton.
481 // Object must have been instantiated with Instance(ALITASK) first
421ab0fb 482
27293674 483 return fgQA ;
484}
485
421ab0fb 486//_______________________________________________________________
96d67a8d 487AliQA * AliQA::Instance(const DETECTORINDEX_t det)
421ab0fb 488{
489 // Get an instance of the singleton. The only authorized way to call the ctor
490
9a223722 491 if ( ! fgQA) {
46ca5304 492 TFile * f = GetQAResultFile() ;
9a223722 493 fgQA = dynamic_cast<AliQA *>(f->Get("QA")) ;
494 if ( ! fgQA )
495 fgQA = new AliQA(det) ;
496 }
421ab0fb 497 fgQA->Set(det) ;
498 return fgQA ;
499}
500
501//_______________________________________________________________
96d67a8d 502AliQA * AliQA::Instance(const ALITASK_t tsk)
421ab0fb 503{
4e25ac79 504 // get an instance of the singleton.
421ab0fb 505
506 if ( ! fgQA)
507 switch (tsk) {
508 case kNULLTASK:
509 break ;
6c18591a 510 case kRAW:
2e42b4d4 511 fgQA = new AliQA(tsk) ;
6c18591a 512 break ;
513 case kSIM:
2e42b4d4 514 fgQA = new AliQA(tsk) ;
421ab0fb 515 break ;
516 case kREC:
34709735 517 AliInfoClass("fgQA = gAlice->GetQA()") ;
421ab0fb 518 break ;
519 case kESD:
34709735 520 AliInfoClass("fgQA = dynamic_cast<AliQA *> (esdFile->Get(\"QA\")") ;
421ab0fb 521 break ;
522 case kANA:
34709735 523 AliInfoClass("fgQA = dynamic_cast<AliQA *> (esdFile->Get(\"QA\")") ;
421ab0fb 524 break ;
525 case kNTASK:
526 break ;
527 }
528 if (fgQA)
529 fgQA->Set(tsk) ;
530 return fgQA ;
531}
532
533//_______________________________________________________________
96d67a8d 534AliQA * AliQA::Instance(const TASKINDEX_t tsk)
535{
536 // get an instance of the singleton.
537
538 ALITASK_t index = kNULLTASK ;
539
540 if ( tsk == kRAWS )
541 index = kRAW ;
542 else if (tsk < kDIGITS)
543 index = kSIM ;
544 else if (tsk < kRECPARTICLES)
545 index = kREC ;
546 else if (tsk == kESDS)
547 index = kESD ;
548
549 return Instance(index) ;
550}
551
0acdb2bb 552//_______________________________________________________________
f660a109 553Long64_t AliQA::Merge(const TCollection * list) {
33901d39 554 // Merge the QA resuls in the list into this single AliQA object
555
556 Long64_t nmerge=0;
557 for (Int_t det = 0 ; det < kNDET ; det++) {
558 Set(DETECTORINDEX_t(det)) ;
559 for (Int_t task = 0 ; task < kNTASK ; task++) {
560 Set(ALITASK_t(task)) ;
561 for (Int_t bit = 0 ; bit < kNBIT ; bit++) {
562 TIter next(list) ;
563 AliQA * qa ;
564 while ( (qa = (AliQA*)next() ) ) {
565 ++nmerge;
566 qa->IsSet(DETECTORINDEX_t(det), ALITASK_t(task), QABIT_t(bit)) ;
567 Set(QABIT_t(bit)) ;
568 } // qa list
569 } // bit
570 } // task
571 } // detector
572 return nmerge;
0acdb2bb 573}
574
96d67a8d 575//_______________________________________________________________
f12d42ce 576ULong_t AliQA::Offset(ALITASK_t tsk) const
421ab0fb 577{
578 // Calculates the bit offset for a given module (SIM, REC, ESD, ANA)
579
580 CheckRange(tsk) ;
581
582 ULong_t offset = 0 ;
583 switch (tsk) {
584 case kNULLTASK:
585 break ;
6c18591a 586 case kRAW:
421ab0fb 587 offset+= 0 ;
588 break ;
6c18591a 589 case kSIM:
421ab0fb 590 offset+= 4 ;
591 break ;
6c18591a 592 case kREC:
421ab0fb 593 offset+= 8 ;
594 break ;
6c18591a 595 case kESD:
421ab0fb 596 offset+= 12 ;
597 break ;
6c18591a 598 case kANA:
599 offset+= 16 ;
600 break ;
421ab0fb 601 case kNTASK:
602 break ;
603 }
604
605 return offset ;
606}
607
608//_______________________________________________________________
4e25ac79 609void AliQA::Set(QABIT_t bit)
421ab0fb 610{
4e25ac79 611 // Set the status bit of the current detector in the current module
421ab0fb 612
4e25ac79 613 SetStatusBit(fDet, fTask, bit) ;
421ab0fb 614}
615
4ecde5fc 616//_____________________________________________________________________________
4edbc5bc 617void AliQA::SetQARefStorage(const char * name)
4ecde5fc 618{
72c25501 619 // Set the root directory where the QA reference data are stored
620
621 fgQARefDirName = name ;
2204e424 622 if ( fgQARefDirName.Contains(fgkLabLocalFile) )
623 fgQARefFileName = fgkRefFileName ;
624 else if ( fgQARefDirName.Contains(fgkLabLocalOCDB) )
625 fgQARefFileName = fgkQAName ;
626 else if ( fgQARefDirName.Contains(fgkLabAliEnOCDB) )
627 fgQARefFileName = fgkQAName ;
4ecde5fc 628
4edbc5bc 629 else {
34709735 630 AliErrorClass(Form("%s is an invalid storage definition\n", name)) ;
4edbc5bc 631 fgQARefDirName = "" ;
632 fgQARefFileName = "" ;
633 }
72c25501 634 TString tmp(fgQARefDirName) ; // + fgQARefFileName) ;
34709735 635 AliInfoClass(Form("AliQA::SetQARefDir: QA references are in %s\n", tmp.Data()) ) ;
4ecde5fc 636}
637
4e25ac79 638//_____________________________________________________________________________
639void AliQA::SetQARefDataDirName(const char * name)
640{
641 // Set the lower level directory name where reference data are found
642 TString test(name) ;
643 RUNTYPE_t rt = kNULLTYPE ;
644 for (Int_t index = 0; index < kNTYPE; index++) {
645 if (test.CompareTo(fgRTNames[index]) == 0) {
646 rt = (RUNTYPE_t) index ;
647 break ;
648 }
649 }
650
651 if (rt == kNULLTYPE) {
34709735 652 AliWarningClass(Form("AliQA::SetQARefDataDirName: %s is an unknown RUN TYPE name\n", name)) ;
4e25ac79 653 return ;
654 }
655
656 SetQARefDataDirName(rt) ;
657}
658
4ecde5fc 659//_____________________________________________________________________________
660void AliQA::SetQAResultDirName(const char * name)
661{
662 // Set the root directory where to store the QA status object
663
664 fgQAResultDirName.Prepend(name) ;
34709735 665 AliInfoClass(Form("AliQA::SetQAResultDirName: QA results are in %s\n", fgQAResultDirName.Data())) ;
2204e424 666 if ( fgQAResultDirName.Contains(fgkLabLocalFile))
667 fgQAResultDirName.ReplaceAll(fgkLabLocalFile, "") ;
4ecde5fc 668 fgQAResultFileName.Prepend(fgQAResultDirName) ;
669}
670
421ab0fb 671//_______________________________________________________________
4e25ac79 672void AliQA::SetStatusBit(DETECTORINDEX_t det, ALITASK_t tsk, QABIT_t bit)
421ab0fb 673{
674 // Set the status bit for a given detector and a given task
675
676 CheckRange(det) ;
677 CheckRange(tsk) ;
678 CheckRange(bit) ;
679
680 ULong_t offset = Offset(tsk) ;
4e25ac79 681 ULong_t status = GetStatus(det) ;
421ab0fb 682 offset+= bit ;
683 status = status | 1 << offset ;
4e25ac79 684 SetStatus(det, status) ;
57acd2d2 685}
686
57acd2d2 687//_______________________________________________________________
4e25ac79 688void AliQA::ShowAll() const
421ab0fb 689{
690 // dispplay the QA status word
691 Int_t index ;
15df7cc8 692 for (index = 0 ; index < kNDET ; index++) {
693 for (Int_t tsk = kRAW ; tsk < kNTASK ; tsk++) {
4e25ac79 694 ShowStatus(DETECTORINDEX_t(index), ALITASK_t(tsk)) ;
695 }
15df7cc8 696 }
421ab0fb 697}
698
699//_______________________________________________________________
4e25ac79 700void AliQA::ShowStatus(DETECTORINDEX_t det, ALITASK_t tsk) const
421ab0fb 701{
0b96c27c 702 // Prints the full QA status of a given detector
703 CheckRange(det) ;
4e25ac79 704 ULong_t status = GetStatus(det) ;
0b96c27c 705 ULong_t tskStatus[kNTASK] ;
706 tskStatus[kRAW] = status & 0x0000f ;
707 tskStatus[kSIM] = status & 0x000f0 ;
708 tskStatus[kREC] = status & 0x00f00 ;
709 tskStatus[kESD] = status & 0x0f000 ;
710 tskStatus[kANA] = status & 0xf0000 ;
711
65b25288 712 AliInfo(Form("====> QA Status for %8s raw =0x%lx, sim=0x%lx, rec=0x%lx, esd=0x%lx, ana=0x%lx", GetDetName(det).Data(),
0b96c27c 713 tskStatus[kRAW], tskStatus[kSIM], tskStatus[kREC], tskStatus[kESD], tskStatus[kANA] )) ;
15df7cc8 714 if (tsk == kNULLTASK) {
715 for (Int_t itsk = kRAW ; itsk < kNTASK ; itsk++) {
4e25ac79 716 ShowASCIIStatus(det, ALITASK_t(itsk), tskStatus[itsk]) ;
15df7cc8 717 }
718 } else {
4e25ac79 719 ShowASCIIStatus(det, tsk, tskStatus[tsk]) ;
0b96c27c 720 }
721}
421ab0fb 722
0b96c27c 723//_______________________________________________________________
4e25ac79 724void AliQA::ShowASCIIStatus(DETECTORINDEX_t det, ALITASK_t tsk, const ULong_t status) const
0b96c27c 725{
726 // print the QA status in human readable format
727 TString text;
728 for (Int_t bit = kINFO ; bit < kNBIT ; bit++) {
4e25ac79 729 if (IsSet(det, tsk, QABIT_t(bit))) {
0b96c27c 730 text = GetBitName(QABIT_t(bit)) ;
731 text += " " ;
732 }
733 }
734 if (! text.IsNull())
34709735 735 AliWarningClass(Form(" %8s %4s 0x%4lx, Problem signalled: %8s \n", GetDetName(det).Data(), GetAliTaskName(tsk), status, text.Data())) ;
57acd2d2 736}
737
738//_______________________________________________________________
4e25ac79 739void AliQA::UnSet(QABIT_t bit)
96d67a8d 740{
741 // UnSet the status bit of the current detector in the current module
742
4e25ac79 743 UnSetStatusBit(fDet, fTask, bit) ;
96d67a8d 744}
745
746//_______________________________________________________________
4e25ac79 747void AliQA::UnSetStatusBit(DETECTORINDEX_t det, ALITASK_t tsk, QABIT_t bit)
96d67a8d 748{
749 // UnSet the status bit for a given detector and a given task
750
751 CheckRange(det) ;
752 CheckRange(tsk) ;
753 CheckRange(bit) ;
754
755 ULong_t offset = Offset(tsk) ;
4e25ac79 756 ULong_t status = GetStatus(det) ;
96d67a8d 757 offset+= bit ;
758 status = status & 0 << offset ;
4e25ac79 759 SetStatus(det, status) ;
2cc3149f 760}