LCOV - code coverage report
Current view: top level - STEER/STEERBase - AliQA.cxx (source / functions) Hit Total Coverage
Test: coverage.info Lines: 50 355 14.1 %
Date: 2016-06-14 17:26:59 Functions: 28 68 41.2 %

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

Generated by: LCOV version 1.11