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