ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
/* $Id: AliQAv1.cxx 31503 2009-03-16 11:01:16Z schutz $ */

//////////////////////////////////////////////////////////////////////////////
//
// Quality Assurance Object//_________________________________________________________________________
// Quality Assurance object. The QA status is held in one word per detector,
// each bit corresponds to a different status.
// bit 0-3   : QA raised during simulation      (RAW)
// bit 4-7   : QA raised during simulation      (SIM)
// bit 8-11  : QA raised during reconstruction  (REC)
// bit 12-15 : QA raised during ESD checking    (ESD)
// bit 16-19 : QA raised during analysis        (ANA)
// Each of the 4 bits corresponds to a severity level of increasing importance
// from lower to higher bit (INFO, WARNING, ERROR, FATAL)
//
//*-- Yves Schutz CERN, July 2007 
//////////////////////////////////////////////////////////////////////////////


#include <cstdlib>
// --- ROOT system ---
#include <TClass.h>
#include <TFile.h>
#include <TH1.h>
#include <TSystem.h>
#include <TROOT.h>

// --- Standard library ---

// --- AliRoot header files ---
#include "AliLog.h"
#include "AliQAv1.h"


ClassImp(AliQAv1)
AliQAv1  *     AliQAv1::fgQA                   = 0x0 ;
TFile    *     AliQAv1::fgQADataFile           = 0x0 ;   
TString        AliQAv1::fgQADataFileName       = "QA" ;  // will transform into Det.QA.run.root  
TFile    *     AliQAv1::fgQARefFile            = 0x0 ;   
TString        AliQAv1::fgQARefDirName	       = "" ; 
TString        AliQAv1::fgQARefFileName        = "QA.root" ;
TFile    *     AliQAv1::fgQAResultFile         = 0x0 ;  
TString        AliQAv1::fgQAResultDirName      = "" ;  
TString        AliQAv1::fgQAResultFileName     = "QA.root" ; 
TString        AliQAv1::fgDetNames[]           = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD",
                                                  "ZDC", "PMD", "T0", "VZERO", "ACORDE","AD","FIT","MFT", "HLT", "Global", "CORR" } ;   
TString        AliQAv1::fgGRPPath              = "GRP/GRP/Data" ; 
TString        AliQAv1::fgTaskNames[]          = {"Raws", "Hits", "SDigits", "Digits", "DigitsR", "RecPoints", "TrackSegments", "RecParticles", "ESDs"} ;   
TString        AliQAv1::fgModeNames[]          = {"", "Sim", "Rec", "QA"} ;   
const TString  AliQAv1::fgkLabLocalFile        = "file://"  ; 
const TString  AliQAv1::fgkLabLocalOCDB        = "local://" ;  
const TString  AliQAv1::fgkLabAliEnOCDB        = "alien://" ;  
const TString  AliQAv1::fgkRefFileName         = "QA.root" ; 
const TString  AliQAv1::fgkQAName              = "QA"  ; 
const TString  AliQAv1::fgkQACorrNtName        = "CorrQA" ;  
const TString  AliQAv1::fgkRefOCDBDirName      = "QA"  ; 
TString AliQAv1::fgRefDataDirName	             = ""  ; 
const TString  AliQAv1::fgkQARefOCDBDefault    = "alien://folder=/alice/QA/20"  ; 
const TString  AliQAv1::fgkExpert              = "Expert" ; 
//
const UInt_t   AliQAv1::fgkQAClonedBit         = BIT(14); // RS: bits set to the histos or arrays of cloned histos
const UInt_t   AliQAv1::fgkForbidCloningBit    = BIT(15); // to flag the state (cloned or not) of the 
const UInt_t   AliQAv1::fgkOrigHistoKeptBit    = BIT(16); // object at the given slot of fXXXQAList[]
//
const UInt_t   AliQAv1::fgkExpertBit           = BIT(19);  
const UInt_t   AliQAv1::fgkQABit               = BIT(20) ; 
const UInt_t   AliQAv1::fgkImageBit            = BIT(21) ; 
const Int_t    AliQAv1::fgkQADebugLevel        = 99 ; 
const TString  AliQAv1::fgkImageFileName       = "QAImage" ; 
const TString  AliQAv1::fImageFileFormat       = "ps" ; 
const UShort_t AliQAv1::fgkMaxQAObjects        = 10000 ; 

//____________________________________________________________________________
AliQAv1::AliQAv1() : 
  TNamed("", ""), 
  fNdet(kNDET), 
  fNEventSpecies(AliRecoParam::kNSpecies), 
  fLengthQA(fNdet*fNEventSpecies),
  fQA(new ULong_t[fLengthQA]), 
  fDet(kNULLDET),
  fTask(kNULLTASK), 
  fEventSpecie(AliRecoParam::kDefault), 
  fEventSpecies(new Bool_t[fNEventSpecies])
{
  // default constructor
  memset(fQA,0,fLengthQA*sizeof(ULong_t));
  memset(fEventSpecies,kFALSE,fNEventSpecies*sizeof(Bool_t));
}

//____________________________________________________________________________
AliQAv1::AliQAv1(const AliQAv1& qa) :
  TNamed(qa),
  fNdet(qa.fNdet), 
  fNEventSpecies(qa.fNEventSpecies), 
  fLengthQA(qa.fLengthQA),
  fQA(new ULong_t[fLengthQA]), 
  fDet(qa.fDet),
  fTask(qa.fTask), 
  fEventSpecie(qa.fEventSpecie), 
  fEventSpecies(new Bool_t[fNEventSpecies])
{ 
  // cpy ctor
  memcpy(fQA,qa.fQA,fLengthQA*sizeof(ULong_t));
  memcpy(fEventSpecies,qa.fEventSpecies,fNEventSpecies*sizeof(Bool_t));
}

//_____________________________________________________________________________
AliQAv1& AliQAv1::operator = (const AliQAv1& qa)
{
  // assignment operator
  if(&qa != this) {
    TNamed::operator=(qa);
    fNdet          = qa.fNdet;
    fNEventSpecies = qa.fNEventSpecies; 
    fLengthQA      = qa.fLengthQA;

    if(fQA) delete [] fQA;
    fQA = new ULong_t[fLengthQA];
    memcpy(fQA,qa.fQA,fLengthQA*sizeof(ULong_t));

    fDet = qa.fDet;
    fTask = qa.fTask;
    fEventSpecie = qa.fEventSpecie; 
    if(fEventSpecies) delete [] fEventSpecies;
    fEventSpecies = new Bool_t[fNEventSpecies];
    memcpy(fEventSpecies,qa.fEventSpecies,fNEventSpecies*sizeof(Bool_t));
  }  
  return *this;
}

//_______________________________________________________________
AliQAv1::AliQAv1(const Int_t qalength, ULong_t * qa, const Int_t eslength, Bool_t * es) :
TNamed("QA", "Quality Assurance status"),
fNdet(kNDET), 
fNEventSpecies(eslength), 
fLengthQA(qalength),
fQA(new ULong_t[fLengthQA]), 
fDet(kNULLDET),
fTask(kNULLTASK), 
fEventSpecie(AliRecoParam::kDefault), 
fEventSpecies(new Bool_t[fNEventSpecies])
{
  // constructor to be used
  memcpy(fQA, qa, fLengthQA*sizeof(ULong_t));
  memcpy(fEventSpecies, es, fNEventSpecies*sizeof(Bool_t));
}

//_______________________________________________________________
AliQAv1::AliQAv1(const DETECTORINDEX_t det) :
  TNamed("QA", "Quality Assurance status"),
  fNdet(kNDET), 
  fNEventSpecies(AliRecoParam::kNSpecies), 
  fLengthQA(fNdet*fNEventSpecies),
  fQA(new ULong_t[fLengthQA]), 
  fDet(det),
  fTask(kNULLTASK), 
  fEventSpecie(AliRecoParam::kDefault), 
  fEventSpecies(new Bool_t[fNEventSpecies])
{
  // constructor to be used
  if (! CheckRange(det) ) fDet = kNULLDET ; 
  memset(fQA,0,fLengthQA*sizeof(ULong_t));
  memset(fEventSpecies,kFALSE,fNEventSpecies*sizeof(Bool_t));
}
  
//_______________________________________________________________
AliQAv1::AliQAv1(const ALITASK_t tsk) :
  TNamed("QA", "Quality Assurance status"),
  fNdet(kNDET), 
  fNEventSpecies(AliRecoParam::kNSpecies), 
  fLengthQA(fNdet*fNEventSpecies),
  fQA(new ULong_t[fLengthQA]), 
  fDet(kNULLDET),
  fTask(tsk), 
  fEventSpecie(AliRecoParam::kDefault), 
  fEventSpecies(new Bool_t[fNEventSpecies])
{
  // constructor to be used in the AliRoot module (SIM, REC, ESD or ANA)
  if (! CheckRange(tsk) ) fTask = kNULLTASK ; 
  memset(fQA,0,fLengthQA*sizeof(ULong_t));
  memset(fEventSpecies,kFALSE,fNEventSpecies*sizeof(Bool_t));
}

//____________________________________________________________________________
AliQAv1::~AliQAv1() 
{
  // dtor  
  delete [] fQA;
  delete [] fEventSpecies;
}

//_______________________________________________________________
void AliQAv1::Close() 
{
	// close the open files
	if (fgQADataFile) 
		if (fgQADataFile->IsOpen())
			fgQADataFile->Close() ; 
	if (fgQAResultFile) 
		if (fgQAResultFile->IsOpen()) 
			fgQAResultFile->Close() ;
	if (fgQARefFile)
		if (fgQARefFile->IsOpen())
			fgQARefFile->Close() ; 
} 

//_______________________________________________________________
Bool_t AliQAv1::CheckFatal() const
{
  // check if any FATAL status is set
  Bool_t rv = kFALSE ;
  Int_t index ;
  for (index = 0; index < kNDET ; index++)
    rv = rv || IsSet(DETECTORINDEX_t(index), fTask, fEventSpecie, kFATAL) ;
  return rv ;
}

//_______________________________________________________________
Bool_t AliQAv1::CheckRange(DETECTORINDEX_t det) const
{ 
  // check if detector is in given detector range: 0-kNDET

  Bool_t rv = ( det < 0 || det > kNDET )  ? kFALSE : kTRUE ;
  if (!rv)
    AliFatal(Form("Detector index %d is out of range: 0 <= index <= %d", det, kNDET)) ;
  return rv ;
}

//_______________________________________________________________
Bool_t AliQAv1::CheckRange(ALITASK_t task) const
{ 
  // check if task is given taskk range: 0:kNTASK
  Bool_t rv = ( task < kRAW || task > kNTASK )  ? kFALSE : kTRUE ;
  if (!rv)
    AliFatal(Form("Module index %d is out of range: 0 <= index <= %d", task, kNTASK)) ;
  return rv ;
}

//_______________________________________________________________
Bool_t AliQAv1::CheckRange(QABIT_t bit) const
{ 
  // check if bit is in given bit range: 0-kNBit

  Bool_t rv = ( bit < 0 || bit > kNBIT )  ? kFALSE : kTRUE ;
  if (!rv)
    AliFatal(Form("Status bit %d is out of range: 0 <= bit <= %d", bit, kNBIT)) ;
  return rv ;
}

//_______________________________________________________________
Bool_t AliQAv1::CheckRange(AliRecoParam::EventSpecie_t es) const
{ 
  // check if bit is in given bit range: 0-kNBit
  Bool_t rv = kFALSE ; 
  switch (es) {
    case AliRecoParam::kDefault: 
      rv = kTRUE ; 
      break ; 
    case AliRecoParam::kLowMult: 
      rv = kTRUE ; 
      break ; 
    case AliRecoParam::kHighMult: 
      rv = kTRUE ; 
      break ; 
    case AliRecoParam::kCosmic: 
      rv = kTRUE ; 
      break ; 
    case AliRecoParam::kCalib: 
      rv = kTRUE ; 
      break ; 
  }
  if (!rv)
    AliFatal(Form("Event Specie %d is not valid", es)) ;
  return rv ;
}

//_______________________________________________________________
const char * AliQAv1::GetAliTaskName(ALITASK_t tsk)
{
	// returns the char name corresponding to module index
	switch (tsk) {
		case kNULLTASK:
			break ; 
		case kRAW:
			return "RAW" ;
			break ;  
		case kSIM:
			return "SIM" ;
			break ;
		case kREC:
			return "REC" ;
			break ;
		case kESD:
			return "ESD" ;
			break ;
		case kANA:
			return "ANA" ;
			break ;
		default:
      return "" ; 
			break ;
	}
  return "" ;
}

//_______________________________________________________________
const char * AliQAv1::GetBitName(QABIT_t bit) const
{
	// returns the char name corresponding to bit 
	TString bitName ;
	switch (bit) {
		case kNULLBit:
			bitName = "NONE" ;
			break ; 
		case kINFO:
			bitName = "INFO" ;
			break ;  
		case kWARNING:
			bitName = "WARNING" ;
			break ;
		case kERROR:
			bitName = "ERROR" ;
			break ;
		case kFATAL:
			bitName = "FATAL" ;
			break ;
		default:
			bit = kNULLBit ; 
			break ;
	}
	return bitName.Data() ;
}

//_______________________________________________________________
TH1 * AliQAv1::GetData(TObjArray** list, Int_t index, AliRecoParam::EventSpecie_t eventSpecie)
{
    // retrieve QA data from the list at a given index and for a given event specie 
  TH1 * rv = NULL ; 
  Int_t esindex = AliRecoParam::AConvert(eventSpecie) ; 
  TObjArray * arr = list[esindex] ;
  if (arr) {
    if ( index > AliQAv1::GetMaxQAObj() ) {
			AliErrorClass(Form("Max number of authorized QA objects is %d", AliQAv1::GetMaxQAObj())) ; 
		} else {
      if ( arr->At(index) )  {
        rv = static_cast<TH1*>(arr->At(index)) ; 
      } 	
    }
  }  
  return rv ; 
}

//_______________________________________________________________
AliQAv1::DETECTORINDEX_t AliQAv1::GetDetIndex(const char * name) 
{
	// returns the detector index corresponding to a given name
	TString sname(name) ; 
	DETECTORINDEX_t rv = kNULLDET ; 
	for (Int_t det = 0; det < kNDET ; det++) {
		if ( GetDetName(det) == sname ) {
			rv = DETECTORINDEX_t(det) ; 
			break ; 
		}
	}
	return rv ; 		
}

//_______________________________________________________________
const char * AliQAv1::GetDetName(Int_t det) 
{
	// returns the detector name corresponding to a given index (needed in a loop)
	
	if ( det >= 0 &&  det < kNDET) 
		return (fgDetNames[det]).Data() ; 
	else 
		return NULL ; 
}

//_______________________________________________________________
TFile * AliQAv1::GetQADataFile(const char * name, Int_t run) 
{
  // opens the file to store the detectors Quality Assurance Data Maker results
	const char * temp = Form("%s.%s.%d.root", name, fgQADataFileName.Data(), run) ; 
	TString opt ; 
	if (! fgQADataFile ) {     
		if  (gSystem->AccessPathName(temp))
			opt = "NEW" ;
		else 
			opt = "UPDATE" ; 
		fgQADataFile = TFile::Open(temp, opt.Data()) ;
	} else {
		if ( strcmp(temp, fgQADataFile->GetName()) != 0 ) {
			fgQADataFile = static_cast<TFile *>(gROOT->FindObject(temp)) ;
			if ( !fgQADataFile ) {
          if  (gSystem->AccessPathName(temp))
            opt = "NEW" ;
          else 
            opt = "UPDATE" ; 
				fgQADataFile = TFile::Open(temp, opt.Data()) ;
			}
		}
  }
	return fgQADataFile ;
} 

//_____________________________________________________________________________
AliQAv1::MODE_t AliQAv1::Mode(TASKINDEX_t task) {
  // return "rec" or "sim" depending on the task
  
  switch (task) {
    case AliQAv1::kRAWS:
      return kRECMODE ; 
      break;
    case AliQAv1::kHITS:
      return kSIMMODE ; 
      break;
    case AliQAv1::kSDIGITS:
      return kSIMMODE ; 
      break;
    case AliQAv1::kDIGITS:
      return kSIMMODE ; 
      break;
    case AliQAv1::kDIGITSR:
      return kRECMODE ; 
      break;
    case AliQAv1::kRECPOINTS:
      return kRECMODE ; 
      break ; 
    case AliQAv1::kTRACKSEGMENTS:
      return kRECMODE ; 
      break;
    case AliQAv1::kRECPARTICLES:
      return kRECMODE ; 
      break;
    case AliQAv1::kESDS:
      return kRECMODE ; 
      break;
    default:
      break;
  }
  return AliQAv1::kNULLMODE;
}

//_____________________________________________________________________________
TFile * AliQAv1::GetQADataFile(const char * fileName)
{
  // Open if necessary the Data file and return its pointer

  if (!fgQADataFile) {
    if (!fileName) 
      fileName = AliQAv1::GetQADataFileName() ; 
    if  (!gSystem->AccessPathName(fileName)) {
      fgQADataFile =  TFile::Open(fileName) ;
    } else {
      AliFatalClass(Form("File %s not found", fileName)) ;
    }
  }
  return fgQADataFile ; 
}

//_______________________________________________________________
TFile * AliQAv1::GetQAResultFile() 
{
  // opens the file to store the  Quality Assurance Data Checker results	
  if (fgQAResultFile) {
   if (fgQAResultFile->IsOpen()) 
    fgQAResultFile->Close();
   delete fgQAResultFile;
  }
  TString dirName(fgQAResultDirName) ; 
  if ( dirName.Contains(fgkLabLocalFile)) 
    dirName.ReplaceAll(fgkLabLocalFile, "") ;
  TString fileName(dirName + fgQAResultFileName) ; 
  TString opt("") ; 
  if ( !gSystem->AccessPathName(fileName) )
    opt = "UPDATE" ; 
  else { 
    if ( gSystem->AccessPathName(dirName) )
      gSystem->mkdir(dirName) ; 
    opt = "NEW" ; 
  }
  fgQAResultFile = TFile::Open(fileName, opt) ;   
  return fgQAResultFile ; 
}

//_______________________________________________________________
AliQAv1::QABIT_t AliQAv1::GetQAStatusBit(AliRecoParam::EventSpecie_t es, DETECTORINDEX_t det, ALITASK_t tsk) const
{
    // returns the QA bit set
  QABIT_t rv = kNULLBit ; 
  if ( es == AliRecoParam::kDefault) 
    es = fEventSpecie ; 
  if ( det == kNULLDET ) 
    det = fDet ; 
  if ( tsk == kNULLTASK ) 
    tsk = fTask ; 
  for (Int_t bit = kINFO ; bit < kNBIT ; bit++) {
		if (IsSet(det, tsk, es, QABIT_t(bit))) 
      rv = QABIT_t(bit) ;
	}
  return rv ; 
}

//_______________________________________________________________
AliQAv1::TASKINDEX_t AliQAv1::GetTaskIndex(const char * name) 
{
	// returns the detector index corresponding to a given name
	TString sname(name) ; 
	TASKINDEX_t rv = kNULLTASKINDEX ; 
	for (Int_t tsk = 0; tsk < kNTASKINDEX ; tsk++) {
		if ( GetTaskName(tsk) == sname ) {
			rv = TASKINDEX_t(tsk) ; 
			break ; 
		}
	}
	return rv ; 		
}

//_______________________________________________________________
Bool_t AliQAv1::IsSet(DETECTORINDEX_t det, ALITASK_t tsk, Int_t ies, QABIT_t bit) const 
{
  // Checks is the requested bit is set
   
  const AliRecoParam::EventSpecie_t es = AliRecoParam::Convert(ies) ; 
  return IsSet(det, tsk, es, bit) ; 
  
}  

//_______________________________________________________________
Bool_t AliQAv1::IsSet(DETECTORINDEX_t det, ALITASK_t tsk, AliRecoParam::EventSpecie_t es, QABIT_t bit) const
{
  // Checks is the requested bit is set
	
  CheckRange(det) ; 
  CheckRange(tsk) ;
  CheckRange(bit) ;
  CheckRange(es) ;
	
  ULong_t offset = Offset(tsk) ;
  ULong_t status = GetStatus(det, es) ;
  offset+= bit ;
  status = (status & 1 << offset) != 0 ;
  return status ;
}

//_______________________________________________________________
Bool_t AliQAv1::IsSetAny(DETECTORINDEX_t det, ALITASK_t tsk, AliRecoParam::EventSpecie_t es) const
{
  // Checks is the requested bit is set
	
  CheckRange(det) ; 
  CheckRange(tsk) ;
  CheckRange(es) ;
	
  ULong_t offset = Offset(tsk) ;
  ULong_t status = GetStatus(det, es) ;
	ULong_t st = 0 ; 
	for ( Int_t bit = 0 ; bit < kNBIT ; bit++) {
		offset+= bit ;
		st += (status & 1 << offset) != 0 ;		
	}
	if ( st == 0 ) 
		return kFALSE ; 
	else 
		return kTRUE ;
}
//_______________________________________________________________
Bool_t AliQAv1::IsSetAny(DETECTORINDEX_t det, AliRecoParam::EventSpecie_t es) const
{
  // Checks is the requested bit is set
	
  CheckRange(det) ; 
  CheckRange(es) ; 
	
	ULong_t status = GetStatus(det, es) ;
	ULong_t st = 0 ; 
	for ( Int_t tsk = 0 ; tsk < kNTASK ; tsk++) {
		ULong_t offset = Offset(ALITASK_t(tsk)) ;
		for ( Int_t bit = 0 ; bit < kNBIT ; bit++) {
			offset+= bit ;
			st += (status & 1 << offset) != 0 ;		
		}
	}
	if ( st == 0 ) 
		return kFALSE ; 
	else 
		return kTRUE ;
}

//_______________________________________________________________
AliQAv1 * AliQAv1::Instance()
{
  // Get an instance of the singleton. The only authorized way to call the ctor

  if ( ! fgQA) {
    if (GetQAResultFile()) fgQA = static_cast<AliQAv1 *>(fgQAResultFile->Get("QA")) ; 
    if ( ! fgQA ) 
      fgQA = new AliQAv1() ;
  }
  return fgQA ;
}

//_______________________________________________________________
AliQAv1 * AliQAv1::Instance(const Int_t qalength, ULong_t * qa, const Int_t eslength, Bool_t * es)
{
  // Get an instance of the singleton. The only authorized way to call the ctor
  
  if ( ! fgQA) 
    fgQA = new AliQAv1(qalength, qa, eslength, es) ;
  return fgQA ;
}

//_______________________________________________________________
AliQAv1 * AliQAv1::Instance(const DETECTORINDEX_t det)
{
  // Get an instance of the singleton. The only authorized way to call the ctor
  
  if ( ! fgQA) {
    GetQAResultFile() ; 
    fgQA = static_cast<AliQAv1 *>(fgQAResultFile->Get(GetQAName())) ; 
    if ( ! fgQA ) 
      fgQA = new AliQAv1(det) ;
  }		
  fgQA->Set(det) ;
  return fgQA ;
}

//_______________________________________________________________
AliQAv1 * AliQAv1::Instance(const ALITASK_t tsk)
{
  // Get an instance of the singleton. The only authorized way to call the ctor

  if ( ! fgQA)
    switch (tsk) {
    case kNULLTASK:
      break ;
	case kRAW:
      fgQA = new AliQAv1(tsk) ;
      break ;
	case kSIM:
      fgQA = new AliQAv1(tsk) ;
      break ;
    case kREC:
      AliInfoClass("fgQA = gAlice->GetQA()") ;
      break ;
    case kESD:
      AliInfoClass("fgQA = static_cast<AliQAv1 *> (esdFile->Get(\"QA\")") ;
      break ;
    case kANA:
      AliInfoClass("fgQA = static_cast<AliQAv1 *> (esdFile->Get(\"QA\")") ;
      break ;
    case kNTASK:
      break ;
    }
  if (fgQA) 
    fgQA->Set(tsk) ;
  return fgQA ;
}

//_______________________________________________________________
AliQAv1 *  AliQAv1::Instance(const TASKINDEX_t tsk) 
{
	// get an instance of the singleton.
	ALITASK_t index = kNULLTASK ; 

	if ( tsk == kRAWS )
		index = kRAW ;
	else if (tsk < kDIGITS)
		index = kSIM ;
	else if (tsk < kRECPARTICLES)
		index = kREC ; 
	else if (tsk == kESDS) 
		index = kESD ; 

	return Instance(index) ; 
}

//_______________________________________________________________
Long64_t AliQAv1::Merge(const TCollection * list) {
	// Merge the QA resuls in the list into this single AliQAv1 object
	
  Long64_t nmerge = 0;
  for (Int_t det = 0 ; det < kNDET ; det++) {
    Set(DETECTORINDEX_t(det)) ; 
    for (Int_t task = 0 ; task < kNTASK ; task++) {
      Set(ALITASK_t(task)) ; 
      for (Int_t bit = 0 ; bit < kNBIT ; bit++) {
	TIter next(list) ;
	AliQAv1 * qa ; 
	while ( (qa = (AliQAv1*)next() ) ) {
          for (Int_t es = 0 ; es < fNEventSpecies ; es++) {
	    ++nmerge;
            if (qa->IsSet(DETECTORINDEX_t(det), ALITASK_t(task), es, QABIT_t(bit)))
              Set(QABIT_t(bit), es) ; 
          }
	} // qa list
      } // bit
    } // task
  } // detector
  return nmerge;
}

//_______________________________________________________________
ULong_t AliQAv1::Offset(ALITASK_t tsk) const
{
  // Calculates the bit offset for a given module (SIM, REC, ESD, ANA)

  CheckRange(tsk) ; 

  ULong_t offset = 0 ;
  switch (tsk) {
  case kNULLTASK:
    break ;
  case kRAW:
    offset+= 0 ;
    break ;
  case kSIM:
    offset+= 4 ;
    break ;
  case kREC:
    offset+= 8 ;
    break ;
  case kESD:
    offset+= 12 ;
    break ;
  case kANA:
    offset+= 16 ;
    break ;
  case kNTASK:
    break ;
  }

  return offset ;
}

//_______________________________________________________________
void AliQAv1::Reset(DETECTORINDEX_t det, ALITASK_t tsk, AliRecoParam::EventSpecie_t es)
{
    // resets all the bits for a given tsk and event specie
  CheckRange(det) ; 
  CheckRange(tsk) ;
  CheckRange(es) ;
	
  ULong_t offset = Offset(tsk) ;
  ULong_t status = GetStatus(det, es) ;
	for ( Int_t bit = 0 ; bit < kNBIT ; bit++) {
		offset+= bit ;
		status = status & ~1 << offset ;		
	}  
  SetStatus(det, es, status) ;
}

//_______________________________________________________________
void AliQAv1::ResetStatus(DETECTORINDEX_t det) 
{ 
  // reset the status of det for all event specie
  for (Int_t es = 0 ; es < fNEventSpecies ; es++)
    fQA[det*fNdet+es] = 0 ; 
}

//_______________________________________________________________
void AliQAv1::Set(QABIT_t bit, Int_t ies)
{
  // Set the status bit of the current detector in the current module and for the current event specie 
   Set(bit, AliRecoParam::Convert(ies)) ;
}

//_______________________________________________________________
void AliQAv1::Set(QABIT_t bit, AliRecoParam::EventSpecie_t es)
{
  // Set the status bit of the current detector in the current module and for the current event specie 
  
  SetStatusBit(fDet, fTask, es, bit) ;
}

//_____________________________________________________________________________
void AliQAv1::SetQARefStorage(const char * name)
{
	// Set the root directory where the QA reference data are stored

	fgQARefDirName = name ; 
	if ( fgQARefDirName.Contains(fgkLabLocalFile) )
		fgQARefFileName =  fgkRefFileName ; 
	else if ( fgQARefDirName.Contains(fgkLabLocalOCDB) )
		fgQARefFileName =  fgkQAName ; 
	else if ( fgQARefDirName.Contains(fgkLabAliEnOCDB) )
		fgQARefFileName =  fgkQAName ; 

  else {
	  AliErrorClass(Form("ERROR: %s is an invalid storage definition\n", name)) ; 
	  fgQARefDirName  = "" ; 
	  fgQARefFileName = "" ; 
  }	
	TString tmp(fgQARefDirName) ; // + fgQARefFileName) ;
	AliInfoClass(Form("AliQAv1::SetQARefDir: QA references are in  %s\n", tmp.Data() )) ;
}

//_____________________________________________________________________________
void AliQAv1::SetQAResultDirName(const char * name)
{
  // Set the root directory where to store the QA status object

  fgQAResultDirName.Prepend(name) ; 
  AliInfoClass(Form("AliQAv1::SetQAResultDirName: QA results are in  %s\n", fgQAResultDirName.Data())) ;
  if ( fgQAResultDirName.Contains(fgkLabLocalFile)) 
    fgQAResultDirName.ReplaceAll(fgkLabLocalFile, "") ;
  fgQAResultFileName.Prepend(fgQAResultDirName) ;
}

//_______________________________________________________________
void AliQAv1::SetStatusBit(DETECTORINDEX_t det, ALITASK_t tsk, AliRecoParam::EventSpecie_t es, QABIT_t bit)
{
 // Set the status bit for a given detector and a given task

  CheckRange(det) ;
  CheckRange(tsk) ;
  CheckRange(bit) ;
  CheckRange(es) ;
  
  Reset(det, tsk, es) ; 
  
  ULong_t offset = Offset(tsk) ;
  ULong_t status = GetStatus(det, es) ;
  offset+= bit ;
  status = status | 1 << offset ;
  SetStatus(det, es, status) ;
}

//_______________________________________________________________
void AliQAv1::Show(DETECTORINDEX_t det) const 
{ 
  // dispplay the QA status word
  if ( det == kNULLDET) 
    det = fDet ;  
  for (Int_t ies = 0 ; ies < fNEventSpecies ; ies++) {
    if ( IsEventSpecieSet(ies) )
      ShowStatus(det, kNULLTASK, AliRecoParam::ConvertIndex(ies)) ; 
  }
}

//_______________________________________________________________
void AliQAv1::ShowAll() const 
{
  // dispplay the QA status word
  Int_t index ;
  for (index = 0 ; index < kNDET ; index++) {
		for (Int_t tsk = kRAW ; tsk < kNTASK ; tsk++) {
      for (Int_t ies = 0 ; ies < fNEventSpecies ; ies++) {
        if ( IsEventSpecieSet(ies) )
          ShowStatus(DETECTORINDEX_t(index), ALITASK_t(tsk), AliRecoParam::ConvertIndex(ies)) ;
      }
    }
	}
}

//_______________________________________________________________
void AliQAv1::ShowStatus(DETECTORINDEX_t det, ALITASK_t tsk, AliRecoParam::EventSpecie_t es) const
{
	// Prints the full QA status of a given detector
	CheckRange(det) ;
	CheckRange(es) ;
	ULong_t status = GetStatus(det, es) ;
	ULong_t tskStatus[kNTASK] ; 
	tskStatus[kRAW] = status & 0x0000f ;
	tskStatus[kSIM] = status & 0x000f0 ;
	tskStatus[kREC] = status & 0x00f00 ;
	tskStatus[kESD] = status & 0x0f000 ;
	tskStatus[kANA] = status & 0xf0000 ;

	AliInfo(Form("====> QA Status for %8s %8s raw =0x%lx, sim=0x%lx, rec=0x%lx, esd=0x%lx, ana=0x%lx", GetDetName(det).Data(), AliRecoParam::GetEventSpecieName(es), 
				 tskStatus[kRAW], tskStatus[kSIM], tskStatus[kREC], tskStatus[kESD], tskStatus[kANA] )) ;
	if (tsk == kNULLTASK) {
		for (Int_t itsk = kRAW ; itsk < kNTASK ; itsk++) {
			ShowASCIIStatus(es, det, ALITASK_t(itsk), tskStatus[itsk]) ; 
		} 
	} else {
			ShowASCIIStatus(es, det, tsk, tskStatus[tsk]) ; 
	}
}

//_______________________________________________________________
void AliQAv1::ShowASCIIStatus(AliRecoParam::EventSpecie_t es, DETECTORINDEX_t det, ALITASK_t tsk, const ULong_t status) const 
{
	// print the QA status in human readable format
  const QABIT_t bit = GetQAStatusBit(es, det, tsk) ; 
  if ( bit != kNULLBit ) {
          AliInfoClass(Form("           %8s %8s %4s  \n", AliRecoParam::GetEventSpecieName(es), GetDetName(det).Data(), GetAliTaskName(tsk))) ; 
          AliInfoClass(Form("           %8s %8s %4s 0x%4lx, Problem signalled: %8s \n", AliRecoParam::GetEventSpecieName(es), GetDetName(det).Data(), GetAliTaskName(tsk), status, GetBitName(bit))) ; 
  }
}

//_______________________________________________________________
void AliQAv1::UnSet(QABIT_t bit, Int_t ies)
{
	// UnSet the status bit of the current detector in the current module
		UnSet(bit, AliRecoParam::Convert(ies)) ;
}

//_______________________________________________________________
void AliQAv1::UnSet(QABIT_t bit, AliRecoParam::EventSpecie_t es)
{
	// UnSet the status bit of the current detector in the current module
	
	UnSetStatusBit(fDet, fTask, es, bit) ;
}

//_______________________________________________________________
void AliQAv1::UnSetStatusBit(DETECTORINDEX_t det, ALITASK_t tsk, AliRecoParam::EventSpecie_t es, QABIT_t bit)
{
	// UnSet the status bit for a given detector and a given task
	
	CheckRange(det) ;
	CheckRange(tsk) ;
	CheckRange(bit) ;
	CheckRange(es) ;
	
	ULong_t offset = Offset(tsk) ;
	ULong_t status = GetStatus(det, es) ;
	offset+= bit ;
	status = status & 0 << offset ;
	SetStatus(det, es, status) ;
}
 AliQAv1.cxx:1
 AliQAv1.cxx:2
 AliQAv1.cxx:3
 AliQAv1.cxx:4
 AliQAv1.cxx:5
 AliQAv1.cxx:6
 AliQAv1.cxx:7
 AliQAv1.cxx:8
 AliQAv1.cxx:9
 AliQAv1.cxx:10
 AliQAv1.cxx:11
 AliQAv1.cxx:12
 AliQAv1.cxx:13
 AliQAv1.cxx:14
 AliQAv1.cxx:15
 AliQAv1.cxx:16
 AliQAv1.cxx:17
 AliQAv1.cxx:18
 AliQAv1.cxx:19
 AliQAv1.cxx:20
 AliQAv1.cxx:21
 AliQAv1.cxx:22
 AliQAv1.cxx:23
 AliQAv1.cxx:24
 AliQAv1.cxx:25
 AliQAv1.cxx:26
 AliQAv1.cxx:27
 AliQAv1.cxx:28
 AliQAv1.cxx:29
 AliQAv1.cxx:30
 AliQAv1.cxx:31
 AliQAv1.cxx:32
 AliQAv1.cxx:33
 AliQAv1.cxx:34
 AliQAv1.cxx:35
 AliQAv1.cxx:36
 AliQAv1.cxx:37
 AliQAv1.cxx:38
 AliQAv1.cxx:39
 AliQAv1.cxx:40
 AliQAv1.cxx:41
 AliQAv1.cxx:42
 AliQAv1.cxx:43
 AliQAv1.cxx:44
 AliQAv1.cxx:45
 AliQAv1.cxx:46
 AliQAv1.cxx:47
 AliQAv1.cxx:48
 AliQAv1.cxx:49
 AliQAv1.cxx:50
 AliQAv1.cxx:51
 AliQAv1.cxx:52
 AliQAv1.cxx:53
 AliQAv1.cxx:54
 AliQAv1.cxx:55
 AliQAv1.cxx:56
 AliQAv1.cxx:57
 AliQAv1.cxx:58
 AliQAv1.cxx:59
 AliQAv1.cxx:60
 AliQAv1.cxx:61
 AliQAv1.cxx:62
 AliQAv1.cxx:63
 AliQAv1.cxx:64
 AliQAv1.cxx:65
 AliQAv1.cxx:66
 AliQAv1.cxx:67
 AliQAv1.cxx:68
 AliQAv1.cxx:69
 AliQAv1.cxx:70
 AliQAv1.cxx:71
 AliQAv1.cxx:72
 AliQAv1.cxx:73
 AliQAv1.cxx:74
 AliQAv1.cxx:75
 AliQAv1.cxx:76
 AliQAv1.cxx:77
 AliQAv1.cxx:78
 AliQAv1.cxx:79
 AliQAv1.cxx:80
 AliQAv1.cxx:81
 AliQAv1.cxx:82
 AliQAv1.cxx:83
 AliQAv1.cxx:84
 AliQAv1.cxx:85
 AliQAv1.cxx:86
 AliQAv1.cxx:87
 AliQAv1.cxx:88
 AliQAv1.cxx:89
 AliQAv1.cxx:90
 AliQAv1.cxx:91
 AliQAv1.cxx:92
 AliQAv1.cxx:93
 AliQAv1.cxx:94
 AliQAv1.cxx:95
 AliQAv1.cxx:96
 AliQAv1.cxx:97
 AliQAv1.cxx:98
 AliQAv1.cxx:99
 AliQAv1.cxx:100
 AliQAv1.cxx:101
 AliQAv1.cxx:102
 AliQAv1.cxx:103
 AliQAv1.cxx:104
 AliQAv1.cxx:105
 AliQAv1.cxx:106
 AliQAv1.cxx:107
 AliQAv1.cxx:108
 AliQAv1.cxx:109
 AliQAv1.cxx:110
 AliQAv1.cxx:111
 AliQAv1.cxx:112
 AliQAv1.cxx:113
 AliQAv1.cxx:114
 AliQAv1.cxx:115
 AliQAv1.cxx:116
 AliQAv1.cxx:117
 AliQAv1.cxx:118
 AliQAv1.cxx:119
 AliQAv1.cxx:120
 AliQAv1.cxx:121
 AliQAv1.cxx:122
 AliQAv1.cxx:123
 AliQAv1.cxx:124
 AliQAv1.cxx:125
 AliQAv1.cxx:126
 AliQAv1.cxx:127
 AliQAv1.cxx:128
 AliQAv1.cxx:129
 AliQAv1.cxx:130
 AliQAv1.cxx:131
 AliQAv1.cxx:132
 AliQAv1.cxx:133
 AliQAv1.cxx:134
 AliQAv1.cxx:135
 AliQAv1.cxx:136
 AliQAv1.cxx:137
 AliQAv1.cxx:138
 AliQAv1.cxx:139
 AliQAv1.cxx:140
 AliQAv1.cxx:141
 AliQAv1.cxx:142
 AliQAv1.cxx:143
 AliQAv1.cxx:144
 AliQAv1.cxx:145
 AliQAv1.cxx:146
 AliQAv1.cxx:147
 AliQAv1.cxx:148
 AliQAv1.cxx:149
 AliQAv1.cxx:150
 AliQAv1.cxx:151
 AliQAv1.cxx:152
 AliQAv1.cxx:153
 AliQAv1.cxx:154
 AliQAv1.cxx:155
 AliQAv1.cxx:156
 AliQAv1.cxx:157
 AliQAv1.cxx:158
 AliQAv1.cxx:159
 AliQAv1.cxx:160
 AliQAv1.cxx:161
 AliQAv1.cxx:162
 AliQAv1.cxx:163
 AliQAv1.cxx:164
 AliQAv1.cxx:165
 AliQAv1.cxx:166
 AliQAv1.cxx:167
 AliQAv1.cxx:168
 AliQAv1.cxx:169
 AliQAv1.cxx:170
 AliQAv1.cxx:171
 AliQAv1.cxx:172
 AliQAv1.cxx:173
 AliQAv1.cxx:174
 AliQAv1.cxx:175
 AliQAv1.cxx:176
 AliQAv1.cxx:177
 AliQAv1.cxx:178
 AliQAv1.cxx:179
 AliQAv1.cxx:180
 AliQAv1.cxx:181
 AliQAv1.cxx:182
 AliQAv1.cxx:183
 AliQAv1.cxx:184
 AliQAv1.cxx:185
 AliQAv1.cxx:186
 AliQAv1.cxx:187
 AliQAv1.cxx:188
 AliQAv1.cxx:189
 AliQAv1.cxx:190
 AliQAv1.cxx:191
 AliQAv1.cxx:192
 AliQAv1.cxx:193
 AliQAv1.cxx:194
 AliQAv1.cxx:195
 AliQAv1.cxx:196
 AliQAv1.cxx:197
 AliQAv1.cxx:198
 AliQAv1.cxx:199
 AliQAv1.cxx:200
 AliQAv1.cxx:201
 AliQAv1.cxx:202
 AliQAv1.cxx:203
 AliQAv1.cxx:204
 AliQAv1.cxx:205
 AliQAv1.cxx:206
 AliQAv1.cxx:207
 AliQAv1.cxx:208
 AliQAv1.cxx:209
 AliQAv1.cxx:210
 AliQAv1.cxx:211
 AliQAv1.cxx:212
 AliQAv1.cxx:213
 AliQAv1.cxx:214
 AliQAv1.cxx:215
 AliQAv1.cxx:216
 AliQAv1.cxx:217
 AliQAv1.cxx:218
 AliQAv1.cxx:219
 AliQAv1.cxx:220
 AliQAv1.cxx:221
 AliQAv1.cxx:222
 AliQAv1.cxx:223
 AliQAv1.cxx:224
 AliQAv1.cxx:225
 AliQAv1.cxx:226
 AliQAv1.cxx:227
 AliQAv1.cxx:228
 AliQAv1.cxx:229
 AliQAv1.cxx:230
 AliQAv1.cxx:231
 AliQAv1.cxx:232
 AliQAv1.cxx:233
 AliQAv1.cxx:234
 AliQAv1.cxx:235
 AliQAv1.cxx:236
 AliQAv1.cxx:237
 AliQAv1.cxx:238
 AliQAv1.cxx:239
 AliQAv1.cxx:240
 AliQAv1.cxx:241
 AliQAv1.cxx:242
 AliQAv1.cxx:243
 AliQAv1.cxx:244
 AliQAv1.cxx:245
 AliQAv1.cxx:246
 AliQAv1.cxx:247
 AliQAv1.cxx:248
 AliQAv1.cxx:249
 AliQAv1.cxx:250
 AliQAv1.cxx:251
 AliQAv1.cxx:252
 AliQAv1.cxx:253
 AliQAv1.cxx:254
 AliQAv1.cxx:255
 AliQAv1.cxx:256
 AliQAv1.cxx:257
 AliQAv1.cxx:258
 AliQAv1.cxx:259
 AliQAv1.cxx:260
 AliQAv1.cxx:261
 AliQAv1.cxx:262
 AliQAv1.cxx:263
 AliQAv1.cxx:264
 AliQAv1.cxx:265
 AliQAv1.cxx:266
 AliQAv1.cxx:267
 AliQAv1.cxx:268
 AliQAv1.cxx:269
 AliQAv1.cxx:270
 AliQAv1.cxx:271
 AliQAv1.cxx:272
 AliQAv1.cxx:273
 AliQAv1.cxx:274
 AliQAv1.cxx:275
 AliQAv1.cxx:276
 AliQAv1.cxx:277
 AliQAv1.cxx:278
 AliQAv1.cxx:279
 AliQAv1.cxx:280
 AliQAv1.cxx:281
 AliQAv1.cxx:282
 AliQAv1.cxx:283
 AliQAv1.cxx:284
 AliQAv1.cxx:285
 AliQAv1.cxx:286
 AliQAv1.cxx:287
 AliQAv1.cxx:288
 AliQAv1.cxx:289
 AliQAv1.cxx:290
 AliQAv1.cxx:291
 AliQAv1.cxx:292
 AliQAv1.cxx:293
 AliQAv1.cxx:294
 AliQAv1.cxx:295
 AliQAv1.cxx:296
 AliQAv1.cxx:297
 AliQAv1.cxx:298
 AliQAv1.cxx:299
 AliQAv1.cxx:300
 AliQAv1.cxx:301
 AliQAv1.cxx:302
 AliQAv1.cxx:303
 AliQAv1.cxx:304
 AliQAv1.cxx:305
 AliQAv1.cxx:306
 AliQAv1.cxx:307
 AliQAv1.cxx:308
 AliQAv1.cxx:309
 AliQAv1.cxx:310
 AliQAv1.cxx:311
 AliQAv1.cxx:312
 AliQAv1.cxx:313
 AliQAv1.cxx:314
 AliQAv1.cxx:315
 AliQAv1.cxx:316
 AliQAv1.cxx:317
 AliQAv1.cxx:318
 AliQAv1.cxx:319
 AliQAv1.cxx:320
 AliQAv1.cxx:321
 AliQAv1.cxx:322
 AliQAv1.cxx:323
 AliQAv1.cxx:324
 AliQAv1.cxx:325
 AliQAv1.cxx:326
 AliQAv1.cxx:327
 AliQAv1.cxx:328
 AliQAv1.cxx:329
 AliQAv1.cxx:330
 AliQAv1.cxx:331
 AliQAv1.cxx:332
 AliQAv1.cxx:333
 AliQAv1.cxx:334
 AliQAv1.cxx:335
 AliQAv1.cxx:336
 AliQAv1.cxx:337
 AliQAv1.cxx:338
 AliQAv1.cxx:339
 AliQAv1.cxx:340
 AliQAv1.cxx:341
 AliQAv1.cxx:342
 AliQAv1.cxx:343
 AliQAv1.cxx:344
 AliQAv1.cxx:345
 AliQAv1.cxx:346
 AliQAv1.cxx:347
 AliQAv1.cxx:348
 AliQAv1.cxx:349
 AliQAv1.cxx:350
 AliQAv1.cxx:351
 AliQAv1.cxx:352
 AliQAv1.cxx:353
 AliQAv1.cxx:354
 AliQAv1.cxx:355
 AliQAv1.cxx:356
 AliQAv1.cxx:357
 AliQAv1.cxx:358
 AliQAv1.cxx:359
 AliQAv1.cxx:360
 AliQAv1.cxx:361
 AliQAv1.cxx:362
 AliQAv1.cxx:363
 AliQAv1.cxx:364
 AliQAv1.cxx:365
 AliQAv1.cxx:366
 AliQAv1.cxx:367
 AliQAv1.cxx:368
 AliQAv1.cxx:369
 AliQAv1.cxx:370
 AliQAv1.cxx:371
 AliQAv1.cxx:372
 AliQAv1.cxx:373
 AliQAv1.cxx:374
 AliQAv1.cxx:375
 AliQAv1.cxx:376
 AliQAv1.cxx:377
 AliQAv1.cxx:378
 AliQAv1.cxx:379
 AliQAv1.cxx:380
 AliQAv1.cxx:381
 AliQAv1.cxx:382
 AliQAv1.cxx:383
 AliQAv1.cxx:384
 AliQAv1.cxx:385
 AliQAv1.cxx:386
 AliQAv1.cxx:387
 AliQAv1.cxx:388
 AliQAv1.cxx:389
 AliQAv1.cxx:390
 AliQAv1.cxx:391
 AliQAv1.cxx:392
 AliQAv1.cxx:393
 AliQAv1.cxx:394
 AliQAv1.cxx:395
 AliQAv1.cxx:396
 AliQAv1.cxx:397
 AliQAv1.cxx:398
 AliQAv1.cxx:399
 AliQAv1.cxx:400
 AliQAv1.cxx:401
 AliQAv1.cxx:402
 AliQAv1.cxx:403
 AliQAv1.cxx:404
 AliQAv1.cxx:405
 AliQAv1.cxx:406
 AliQAv1.cxx:407
 AliQAv1.cxx:408
 AliQAv1.cxx:409
 AliQAv1.cxx:410
 AliQAv1.cxx:411
 AliQAv1.cxx:412
 AliQAv1.cxx:413
 AliQAv1.cxx:414
 AliQAv1.cxx:415
 AliQAv1.cxx:416
 AliQAv1.cxx:417
 AliQAv1.cxx:418
 AliQAv1.cxx:419
 AliQAv1.cxx:420
 AliQAv1.cxx:421
 AliQAv1.cxx:422
 AliQAv1.cxx:423
 AliQAv1.cxx:424
 AliQAv1.cxx:425
 AliQAv1.cxx:426
 AliQAv1.cxx:427
 AliQAv1.cxx:428
 AliQAv1.cxx:429
 AliQAv1.cxx:430
 AliQAv1.cxx:431
 AliQAv1.cxx:432
 AliQAv1.cxx:433
 AliQAv1.cxx:434
 AliQAv1.cxx:435
 AliQAv1.cxx:436
 AliQAv1.cxx:437
 AliQAv1.cxx:438
 AliQAv1.cxx:439
 AliQAv1.cxx:440
 AliQAv1.cxx:441
 AliQAv1.cxx:442
 AliQAv1.cxx:443
 AliQAv1.cxx:444
 AliQAv1.cxx:445
 AliQAv1.cxx:446
 AliQAv1.cxx:447
 AliQAv1.cxx:448
 AliQAv1.cxx:449
 AliQAv1.cxx:450
 AliQAv1.cxx:451
 AliQAv1.cxx:452
 AliQAv1.cxx:453
 AliQAv1.cxx:454
 AliQAv1.cxx:455
 AliQAv1.cxx:456
 AliQAv1.cxx:457
 AliQAv1.cxx:458
 AliQAv1.cxx:459
 AliQAv1.cxx:460
 AliQAv1.cxx:461
 AliQAv1.cxx:462
 AliQAv1.cxx:463
 AliQAv1.cxx:464
 AliQAv1.cxx:465
 AliQAv1.cxx:466
 AliQAv1.cxx:467
 AliQAv1.cxx:468
 AliQAv1.cxx:469
 AliQAv1.cxx:470
 AliQAv1.cxx:471
 AliQAv1.cxx:472
 AliQAv1.cxx:473
 AliQAv1.cxx:474
 AliQAv1.cxx:475
 AliQAv1.cxx:476
 AliQAv1.cxx:477
 AliQAv1.cxx:478
 AliQAv1.cxx:479
 AliQAv1.cxx:480
 AliQAv1.cxx:481
 AliQAv1.cxx:482
 AliQAv1.cxx:483
 AliQAv1.cxx:484
 AliQAv1.cxx:485
 AliQAv1.cxx:486
 AliQAv1.cxx:487
 AliQAv1.cxx:488
 AliQAv1.cxx:489
 AliQAv1.cxx:490
 AliQAv1.cxx:491
 AliQAv1.cxx:492
 AliQAv1.cxx:493
 AliQAv1.cxx:494
 AliQAv1.cxx:495
 AliQAv1.cxx:496
 AliQAv1.cxx:497
 AliQAv1.cxx:498
 AliQAv1.cxx:499
 AliQAv1.cxx:500
 AliQAv1.cxx:501
 AliQAv1.cxx:502
 AliQAv1.cxx:503
 AliQAv1.cxx:504
 AliQAv1.cxx:505
 AliQAv1.cxx:506
 AliQAv1.cxx:507
 AliQAv1.cxx:508
 AliQAv1.cxx:509
 AliQAv1.cxx:510
 AliQAv1.cxx:511
 AliQAv1.cxx:512
 AliQAv1.cxx:513
 AliQAv1.cxx:514
 AliQAv1.cxx:515
 AliQAv1.cxx:516
 AliQAv1.cxx:517
 AliQAv1.cxx:518
 AliQAv1.cxx:519
 AliQAv1.cxx:520
 AliQAv1.cxx:521
 AliQAv1.cxx:522
 AliQAv1.cxx:523
 AliQAv1.cxx:524
 AliQAv1.cxx:525
 AliQAv1.cxx:526
 AliQAv1.cxx:527
 AliQAv1.cxx:528
 AliQAv1.cxx:529
 AliQAv1.cxx:530
 AliQAv1.cxx:531
 AliQAv1.cxx:532
 AliQAv1.cxx:533
 AliQAv1.cxx:534
 AliQAv1.cxx:535
 AliQAv1.cxx:536
 AliQAv1.cxx:537
 AliQAv1.cxx:538
 AliQAv1.cxx:539
 AliQAv1.cxx:540
 AliQAv1.cxx:541
 AliQAv1.cxx:542
 AliQAv1.cxx:543
 AliQAv1.cxx:544
 AliQAv1.cxx:545
 AliQAv1.cxx:546
 AliQAv1.cxx:547
 AliQAv1.cxx:548
 AliQAv1.cxx:549
 AliQAv1.cxx:550
 AliQAv1.cxx:551
 AliQAv1.cxx:552
 AliQAv1.cxx:553
 AliQAv1.cxx:554
 AliQAv1.cxx:555
 AliQAv1.cxx:556
 AliQAv1.cxx:557
 AliQAv1.cxx:558
 AliQAv1.cxx:559
 AliQAv1.cxx:560
 AliQAv1.cxx:561
 AliQAv1.cxx:562
 AliQAv1.cxx:563
 AliQAv1.cxx:564
 AliQAv1.cxx:565
 AliQAv1.cxx:566
 AliQAv1.cxx:567
 AliQAv1.cxx:568
 AliQAv1.cxx:569
 AliQAv1.cxx:570
 AliQAv1.cxx:571
 AliQAv1.cxx:572
 AliQAv1.cxx:573
 AliQAv1.cxx:574
 AliQAv1.cxx:575
 AliQAv1.cxx:576
 AliQAv1.cxx:577
 AliQAv1.cxx:578
 AliQAv1.cxx:579
 AliQAv1.cxx:580
 AliQAv1.cxx:581
 AliQAv1.cxx:582
 AliQAv1.cxx:583
 AliQAv1.cxx:584
 AliQAv1.cxx:585
 AliQAv1.cxx:586
 AliQAv1.cxx:587
 AliQAv1.cxx:588
 AliQAv1.cxx:589
 AliQAv1.cxx:590
 AliQAv1.cxx:591
 AliQAv1.cxx:592
 AliQAv1.cxx:593
 AliQAv1.cxx:594
 AliQAv1.cxx:595
 AliQAv1.cxx:596
 AliQAv1.cxx:597
 AliQAv1.cxx:598
 AliQAv1.cxx:599
 AliQAv1.cxx:600
 AliQAv1.cxx:601
 AliQAv1.cxx:602
 AliQAv1.cxx:603
 AliQAv1.cxx:604
 AliQAv1.cxx:605
 AliQAv1.cxx:606
 AliQAv1.cxx:607
 AliQAv1.cxx:608
 AliQAv1.cxx:609
 AliQAv1.cxx:610
 AliQAv1.cxx:611
 AliQAv1.cxx:612
 AliQAv1.cxx:613
 AliQAv1.cxx:614
 AliQAv1.cxx:615
 AliQAv1.cxx:616
 AliQAv1.cxx:617
 AliQAv1.cxx:618
 AliQAv1.cxx:619
 AliQAv1.cxx:620
 AliQAv1.cxx:621
 AliQAv1.cxx:622
 AliQAv1.cxx:623
 AliQAv1.cxx:624
 AliQAv1.cxx:625
 AliQAv1.cxx:626
 AliQAv1.cxx:627
 AliQAv1.cxx:628
 AliQAv1.cxx:629
 AliQAv1.cxx:630
 AliQAv1.cxx:631
 AliQAv1.cxx:632
 AliQAv1.cxx:633
 AliQAv1.cxx:634
 AliQAv1.cxx:635
 AliQAv1.cxx:636
 AliQAv1.cxx:637
 AliQAv1.cxx:638
 AliQAv1.cxx:639
 AliQAv1.cxx:640
 AliQAv1.cxx:641
 AliQAv1.cxx:642
 AliQAv1.cxx:643
 AliQAv1.cxx:644
 AliQAv1.cxx:645
 AliQAv1.cxx:646
 AliQAv1.cxx:647
 AliQAv1.cxx:648
 AliQAv1.cxx:649
 AliQAv1.cxx:650
 AliQAv1.cxx:651
 AliQAv1.cxx:652
 AliQAv1.cxx:653
 AliQAv1.cxx:654
 AliQAv1.cxx:655
 AliQAv1.cxx:656
 AliQAv1.cxx:657
 AliQAv1.cxx:658
 AliQAv1.cxx:659
 AliQAv1.cxx:660
 AliQAv1.cxx:661
 AliQAv1.cxx:662
 AliQAv1.cxx:663
 AliQAv1.cxx:664
 AliQAv1.cxx:665
 AliQAv1.cxx:666
 AliQAv1.cxx:667
 AliQAv1.cxx:668
 AliQAv1.cxx:669
 AliQAv1.cxx:670
 AliQAv1.cxx:671
 AliQAv1.cxx:672
 AliQAv1.cxx:673
 AliQAv1.cxx:674
 AliQAv1.cxx:675
 AliQAv1.cxx:676
 AliQAv1.cxx:677
 AliQAv1.cxx:678
 AliQAv1.cxx:679
 AliQAv1.cxx:680
 AliQAv1.cxx:681
 AliQAv1.cxx:682
 AliQAv1.cxx:683
 AliQAv1.cxx:684
 AliQAv1.cxx:685
 AliQAv1.cxx:686
 AliQAv1.cxx:687
 AliQAv1.cxx:688
 AliQAv1.cxx:689
 AliQAv1.cxx:690
 AliQAv1.cxx:691
 AliQAv1.cxx:692
 AliQAv1.cxx:693
 AliQAv1.cxx:694
 AliQAv1.cxx:695
 AliQAv1.cxx:696
 AliQAv1.cxx:697
 AliQAv1.cxx:698
 AliQAv1.cxx:699
 AliQAv1.cxx:700
 AliQAv1.cxx:701
 AliQAv1.cxx:702
 AliQAv1.cxx:703
 AliQAv1.cxx:704
 AliQAv1.cxx:705
 AliQAv1.cxx:706
 AliQAv1.cxx:707
 AliQAv1.cxx:708
 AliQAv1.cxx:709
 AliQAv1.cxx:710
 AliQAv1.cxx:711
 AliQAv1.cxx:712
 AliQAv1.cxx:713
 AliQAv1.cxx:714
 AliQAv1.cxx:715
 AliQAv1.cxx:716
 AliQAv1.cxx:717
 AliQAv1.cxx:718
 AliQAv1.cxx:719
 AliQAv1.cxx:720
 AliQAv1.cxx:721
 AliQAv1.cxx:722
 AliQAv1.cxx:723
 AliQAv1.cxx:724
 AliQAv1.cxx:725
 AliQAv1.cxx:726
 AliQAv1.cxx:727
 AliQAv1.cxx:728
 AliQAv1.cxx:729
 AliQAv1.cxx:730
 AliQAv1.cxx:731
 AliQAv1.cxx:732
 AliQAv1.cxx:733
 AliQAv1.cxx:734
 AliQAv1.cxx:735
 AliQAv1.cxx:736
 AliQAv1.cxx:737
 AliQAv1.cxx:738
 AliQAv1.cxx:739
 AliQAv1.cxx:740
 AliQAv1.cxx:741
 AliQAv1.cxx:742
 AliQAv1.cxx:743
 AliQAv1.cxx:744
 AliQAv1.cxx:745
 AliQAv1.cxx:746
 AliQAv1.cxx:747
 AliQAv1.cxx:748
 AliQAv1.cxx:749
 AliQAv1.cxx:750
 AliQAv1.cxx:751
 AliQAv1.cxx:752
 AliQAv1.cxx:753
 AliQAv1.cxx:754
 AliQAv1.cxx:755
 AliQAv1.cxx:756
 AliQAv1.cxx:757
 AliQAv1.cxx:758
 AliQAv1.cxx:759
 AliQAv1.cxx:760
 AliQAv1.cxx:761
 AliQAv1.cxx:762
 AliQAv1.cxx:763
 AliQAv1.cxx:764
 AliQAv1.cxx:765
 AliQAv1.cxx:766
 AliQAv1.cxx:767
 AliQAv1.cxx:768
 AliQAv1.cxx:769
 AliQAv1.cxx:770
 AliQAv1.cxx:771
 AliQAv1.cxx:772
 AliQAv1.cxx:773
 AliQAv1.cxx:774
 AliQAv1.cxx:775
 AliQAv1.cxx:776
 AliQAv1.cxx:777
 AliQAv1.cxx:778
 AliQAv1.cxx:779
 AliQAv1.cxx:780
 AliQAv1.cxx:781
 AliQAv1.cxx:782
 AliQAv1.cxx:783
 AliQAv1.cxx:784
 AliQAv1.cxx:785
 AliQAv1.cxx:786
 AliQAv1.cxx:787
 AliQAv1.cxx:788
 AliQAv1.cxx:789
 AliQAv1.cxx:790
 AliQAv1.cxx:791
 AliQAv1.cxx:792
 AliQAv1.cxx:793
 AliQAv1.cxx:794
 AliQAv1.cxx:795
 AliQAv1.cxx:796
 AliQAv1.cxx:797
 AliQAv1.cxx:798
 AliQAv1.cxx:799
 AliQAv1.cxx:800
 AliQAv1.cxx:801
 AliQAv1.cxx:802
 AliQAv1.cxx:803
 AliQAv1.cxx:804
 AliQAv1.cxx:805
 AliQAv1.cxx:806
 AliQAv1.cxx:807
 AliQAv1.cxx:808
 AliQAv1.cxx:809
 AliQAv1.cxx:810
 AliQAv1.cxx:811
 AliQAv1.cxx:812
 AliQAv1.cxx:813
 AliQAv1.cxx:814
 AliQAv1.cxx:815
 AliQAv1.cxx:816
 AliQAv1.cxx:817
 AliQAv1.cxx:818
 AliQAv1.cxx:819
 AliQAv1.cxx:820
 AliQAv1.cxx:821
 AliQAv1.cxx:822
 AliQAv1.cxx:823
 AliQAv1.cxx:824
 AliQAv1.cxx:825
 AliQAv1.cxx:826
 AliQAv1.cxx:827
 AliQAv1.cxx:828
 AliQAv1.cxx:829
 AliQAv1.cxx:830
 AliQAv1.cxx:831
 AliQAv1.cxx:832
 AliQAv1.cxx:833
 AliQAv1.cxx:834
 AliQAv1.cxx:835
 AliQAv1.cxx:836
 AliQAv1.cxx:837
 AliQAv1.cxx:838
 AliQAv1.cxx:839
 AliQAv1.cxx:840
 AliQAv1.cxx:841
 AliQAv1.cxx:842
 AliQAv1.cxx:843
 AliQAv1.cxx:844
 AliQAv1.cxx:845
 AliQAv1.cxx:846
 AliQAv1.cxx:847
 AliQAv1.cxx:848
 AliQAv1.cxx:849
 AliQAv1.cxx:850
 AliQAv1.cxx:851
 AliQAv1.cxx:852
 AliQAv1.cxx:853
 AliQAv1.cxx:854
 AliQAv1.cxx:855
 AliQAv1.cxx:856
 AliQAv1.cxx:857
 AliQAv1.cxx:858
 AliQAv1.cxx:859
 AliQAv1.cxx:860
 AliQAv1.cxx:861
 AliQAv1.cxx:862
 AliQAv1.cxx:863
 AliQAv1.cxx:864
 AliQAv1.cxx:865
 AliQAv1.cxx:866
 AliQAv1.cxx:867
 AliQAv1.cxx:868
 AliQAv1.cxx:869
 AliQAv1.cxx:870
 AliQAv1.cxx:871
 AliQAv1.cxx:872
 AliQAv1.cxx:873
 AliQAv1.cxx:874
 AliQAv1.cxx:875
 AliQAv1.cxx:876
 AliQAv1.cxx:877
 AliQAv1.cxx:878
 AliQAv1.cxx:879
 AliQAv1.cxx:880
 AliQAv1.cxx:881
 AliQAv1.cxx:882
 AliQAv1.cxx:883
 AliQAv1.cxx:884
 AliQAv1.cxx:885
 AliQAv1.cxx:886
 AliQAv1.cxx:887
 AliQAv1.cxx:888
 AliQAv1.cxx:889
 AliQAv1.cxx:890
 AliQAv1.cxx:891
 AliQAv1.cxx:892
 AliQAv1.cxx:893
 AliQAv1.cxx:894
 AliQAv1.cxx:895
 AliQAv1.cxx:896
 AliQAv1.cxx:897
 AliQAv1.cxx:898
 AliQAv1.cxx:899
 AliQAv1.cxx:900
 AliQAv1.cxx:901
 AliQAv1.cxx:902
 AliQAv1.cxx:903
 AliQAv1.cxx:904
 AliQAv1.cxx:905
 AliQAv1.cxx:906
 AliQAv1.cxx:907
 AliQAv1.cxx:908
 AliQAv1.cxx:909
 AliQAv1.cxx:910
 AliQAv1.cxx:911
 AliQAv1.cxx:912
 AliQAv1.cxx:913
 AliQAv1.cxx:914
 AliQAv1.cxx:915
 AliQAv1.cxx:916
 AliQAv1.cxx:917
 AliQAv1.cxx:918
 AliQAv1.cxx:919
 AliQAv1.cxx:920
 AliQAv1.cxx:921
 AliQAv1.cxx:922
 AliQAv1.cxx:923
 AliQAv1.cxx:924
 AliQAv1.cxx:925
 AliQAv1.cxx:926
 AliQAv1.cxx:927
 AliQAv1.cxx:928
 AliQAv1.cxx:929
 AliQAv1.cxx:930
 AliQAv1.cxx:931
 AliQAv1.cxx:932
 AliQAv1.cxx:933
 AliQAv1.cxx:934
 AliQAv1.cxx:935
 AliQAv1.cxx:936