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.                  *
 **************************************************************************/

/*
  Checks the quality assurance. 
  By comparing with reference data

  Based on PHOS code written by
  Y. Schutz CERN July 2007

 For the moment we only implement the checking of raw data QA.
 The checked for ESD and RecPoints will be implemented later.
 

 */


// --- ROOT system ---
#include <TClass.h>
#include <TH1.h> 
#include <TF1.h> 
#include <TH1I.h> 
#include <TH2F.h>
#include <TIterator.h> 
#include <TKey.h> 
#include <TFile.h> 
#include <TLine.h>
#include <TText.h>
#include <TPaveText.h>
#include <TMath.h>

// --- Standard library ---

// --- AliRoot header files ---
#include "AliLog.h"
#include "AliCDBManager.h"
#include "AliCDBEntry.h"
#include "AliQAv1.h"
#include "AliQAChecker.h"
#include "AliQAThresholds.h"
#include "AliEMCALQAChecker.h"

ClassImp(AliEMCALQAChecker)

//__________________________________________________________________
AliEMCALQAChecker::AliEMCALQAChecker() : 
AliQACheckerBase("EMCAL","EMCAL Quality Assurance Data Maker"),
fTextSM(new TText*[fgknSM]),
fLineCol(new TLine(47.5,-0.5,47.5,119.5)),
fText(new TPaveText(0.2,0.7,0.8,0.9,"NDC"))
{
  // ctor
  fLineCol->SetLineColor(1);
  fLineCol->SetLineWidth(2);

  fTextSM[0]= new TText(20, 12, "SM A0");
  fTextSM[1]= new TText(20, 36, "SM A1");
  fTextSM[2]= new TText(20, 60, "SM A2");
  fTextSM[3]= new TText(20, 84, "SM A3");
  fTextSM[4]= new TText(20, 108,"SM A4");
  fTextSM[5]= new TText(20, 132,"SM A5");

  fTextSM[6]= new TText(64, 12, "SM C0");
  fTextSM[7]= new TText(64, 36, "SM C1");
  fTextSM[8]= new TText(64, 60, "SM C2");
  fTextSM[9]= new TText(64, 84, "SM C3");
  fTextSM[10]= new TText(64, 108,"SM C4");
  fTextSM[11]= new TText(64, 132,"SM C5");

	for(int i = 0; i < 5; i++) {
		fLineRow[i] = new TLine(-0.5,23.5+(24*i),95.5,23.5+(24*i));
		fLineRow[i]->SetLineColor(1);
		fLineRow[i]->SetLineWidth(2);
	}

	for(int i = 0; i < 3; i++) {
		fTextL1[i] = new TPaveText(0.2,0.8,0.8,0.9,"NDC");
	}


}          

//__________________________________________________________________
AliEMCALQAChecker::~AliEMCALQAChecker() 
{
	/// dtor
  delete [] fTextSM ;
  delete fLineCol ;
  for (Int_t i=0; i<5; ++i) delete fLineRow[i] ;
  delete fText  ; 
}

//______________________________________________________________________________
void AliEMCALQAChecker::Check(Double_t * test, AliQAv1::ALITASK_t index, TObjArray ** list, const AliDetectorRecoParam * /*recoParam*/)
{
	/// Check objects in list
	
	if ( index == AliQAv1::kRAW ) 
	{
    CheckRaws(test, list);
    //printf ("checkers for task %d \n", index) ;		
	}
	
	if ( index == AliQAv1::kREC)
	{
    CheckRecPoints(test, list);
	}
	
	if ( index == AliQAv1::kESD )
	{
    CheckESD(test, list);
	}
	//AliWarning(Form("Checker for task %d not implement for the moment",index));
}

//______________________________________________________________________________
TH1* 
AliEMCALQAChecker::GetHisto(TObjArray* list, const char* hname, Int_t specie) const
{
	/// Get a given histo from the list
	TH1* h = static_cast<TH1*>(list->FindObject(Form("%s_%s",AliRecoParam::GetEventSpecieName(specie),hname)));
	if (!h)
	{
		AliError(Form("Did not find expected histo %s",hname));
	}
	return h;
}

//______________________________________________________________________________
Double_t 
AliEMCALQAChecker::MarkHisto(TH1& histo, Double_t value) const
{
	/// Mark histo as originator of some QA error/warning
	
	if ( value != 1.0 )
	{
		histo.SetBit(AliQAv1::GetQABit());
	}
	
	return value;
}


//______________________________________________________________________________
void AliEMCALQAChecker::CheckRaws(Double_t * test, TObjArray ** list)
{
  //  Check RAW QA histograms	
  //  -- Yaxian Mao, CCNU/CERN/LPSC
  //adding new checking method: 25/04/2010, Yaxian Mao
  //Comparing the amplitude from current run to the reference run, if the ratio in the range [0.8, .12], count as a good tower.
  //If more than 90% towers are good, EMCAL works fine, otherwise experts should be contacted. 


  // Retrieve the thresholds
  Float_t ratioThresh = 0.9;   // threshold for calibration ratio = good towers/all towers (default 0.9)
  Float_t ThreshG     = 0.5;   // threshold for L1 Gamma triggers (default 0.5)
  Float_t ThreshJ     = 0.5;   // threshold for L1 Jet triggers (default 0.5)
  Int_t badLinkThresh = 1;     // threshold for bad links (default 1)

  AliCDBManager* man = AliCDBManager::Instance();
  if(man){
    AliCDBEntry* entry = man->Get("GRP/Calib/QAThresholds");
    if(entry){
      TObjArray* branch = (TObjArray*) entry->GetObject();
      if(branch){
	AliQAThresholds* thresholds = (AliQAThresholds*) branch->FindObject("EMC");
	if(thresholds){
	  TParameter<float>* ParamR  = (TParameter<float>*) thresholds->GetThreshold(0);
	  TParameter<float>* ParamG  = (TParameter<float>*) thresholds->GetThreshold(1);
	  TParameter<float>* ParamJ  = (TParameter<float>*) thresholds->GetThreshold(2);
	  TParameter<int>* ParamL  = (TParameter<int>*) thresholds->GetThreshold(3);
	  if(ParamR)
	    ratioThresh = ParamR->GetVal();
	  if(ParamG)
	    ThreshG = ParamG->GetVal();
	  if(ParamJ)
	    ThreshJ = ParamJ->GetVal();
	  if(ParamL)
	    badLinkThresh = ParamL->GetVal();
	}
      }
    }
  }
  
  Int_t nTowersPerSM = 24*48; // number of towers in a SuperModule; 24x48
  Double_t nTot = fgknSM * nTowersPerSM ;
  TList *lstF = 0;
  Int_t calibSpecieId = (Int_t)TMath::Log2( AliRecoParam::kCalib );
  for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {

    test[specie] = 0.0 ; 
    if ( !AliQAv1::Instance()->IsEventSpecieSet(specie)) continue ; 
    if (list[specie]->GetEntries() == 0) test[specie] = 0. ; // nothing to check
    else {
      //get calib histos
      TH2F * hdata  = (TH2F*)list[specie]->At(k2DRatioAmp) ; 
      TH1F * ratio = (TH1F*)list[specie]->At(kRatioDist) ;
      
      //get L1 histos
      TH2F *hL1GammaPatch = (TH2F*)list[specie]->At(kGL1);
      TH2F *hL1JetPatch = (TH2F*)list[specie]->At(kJL1);
      TH1I *hFrameR = (TH1I*)list[specie]->At(kSTUTRU);
      
      
      // =======================================================================================
      //calib histo checker first:
      if( hdata && ratio ){
	
	// first clean lines, text (functions)
	lstF = hdata->GetListOfFunctions();
	CleanListOfFunctions(lstF);
	lstF = ratio->GetListOfFunctions();
	CleanListOfFunctions(lstF);
	
	if(hdata->GetEntries()!=0 && ratio->GetEntries()!=0) {
	  
	  lstF = hdata->GetListOfFunctions();
	  
	  //adding the lines to distinguish different SMs
	  lstF->Add(fLineCol->Clone()); 
	  for(Int_t iLine = 0; iLine < 5; iLine++) {
	    lstF->Add(fLineRow[iLine]->Clone());
	  } 
	  //Now adding the text to for each SM
	  for(Int_t iSM = 0 ; iSM < fgknSM ; iSM++){  //number of SMs loop start
	    lstF->Add(fTextSM[iSM]->Clone()); 
	  }			
	  
	  
	  //now check the ratio histogram
	  lstF = ratio->GetListOfFunctions();
	  
	  Double_t binContent = 0. ;  
	  Int_t nGoodTower = 0 ;
	  Double_t rv = 0. ;
	  for(Int_t ix = 1; ix <= hdata->GetNbinsX(); ix++) {
	    for(Int_t iy = 1; iy <= hdata->GetNbinsY(); iy++) {
	      binContent = hdata->GetBinContent(ix, iy) ; 
				if (binContent < 1.2 && binContent > 0.8) nGoodTower++ ;
	    }
	  }
	  rv = nGoodTower/nTot ; 
	  //printf("%2.2f %% towers out of range [0.8, 1.2]\n", (1-rv)*100);
	  if(fText){
	    lstF->Add(fText->Clone()) ;
	    fText->Clear() ; 
	    
	    fText->AddText(Form("%2.2f %% towers out of range [0.8, 1.2]", (1-rv)*100));     
	    if (rv < ratioThresh) {
	      test[specie] = ratioThresh;
	      // 2 lines text info for quality         
	      fText->SetFillColor(2) ;
	      fText->AddText(Form("EMCAL = NOK, CALL EXPERTS!!!")); 
	    }
	    else {
	      test[specie] = 1 - ratioThresh;
	      fText->SetFillColor(3) ;
	      fText->AddText(Form("EMCAL = OK, ENJOY...")); 
	    }
	  }//fText
	}//calib histo checking done
      }//histograms NOT NULL
      
      // ========================================================================================
      // now L1 checks:
      
      if( hL1GammaPatch ){
	
	// first clean lines, text (functions)
	lstF = hL1GammaPatch->GetListOfFunctions();
	CleanListOfFunctions(lstF);
	
	if (specie != calibSpecieId) {
	  //if(hL1GammaPatch->GetEntries() !=0 ) {
	  if(hL1GammaPatch->GetEntries() > 10) { // need some statistics for hot spot calculation
	    lstF = hL1GammaPatch->GetListOfFunctions();
	    
	    // Checker for L1GammaPatch 
	    //Double_t dL1GmeanTrig    = 1./2961.; 
	    //Double_t dL1GmeanTrigTRU = 1./32.; 
	    //Int_t sigmaG    = 100; // deviation from mean value (increased to 100)
	    //Int_t sigmaGTRU = 5; // deviation from mean value for TRUs
	    Double_t dL1GEntries = hL1GammaPatch->GetEntries();
	    Int_t badL1G[48][64]   = {{0}} ;
	    Int_t badL1GTRU[2][16] = {{0}} ;
	    Int_t nBadL1G    = 0;
	    Int_t nBadL1GTRU = 0;
	    Double_t binContentTRU[2][16] = {{0.}};
	    for(Int_t ix = 1; ix <=  hL1GammaPatch->GetNbinsX(); ix++) {
	      for(Int_t iy = 1; iy <=  hL1GammaPatch->GetNbinsY(); iy++) {
		Double_t binContent = hL1GammaPatch->GetBinContent(ix, iy) ; 
		if (binContent != 0) {
		  
		  // fill counter for TRUs
		  binContentTRU[(Int_t)((ix-1)/24)][(Int_t)((iy-1)/4)] += binContent;
		  
		  // OLD METHOD (if a patch triggers > sigmaG * mean value (1/#patch positions total) says "hot spot !")
		  // if ((double)binContent/(double)dL1GEntries > sigmaG*dL1GmeanTrig) {
		  // 	badL1G[ix-1][iy-1] += 1;
		  // 	nBadL1G += 1;
		  // }
		  
		  // NEW METHOD (if Rate > Threshold * ( (Number of towers or TRUs * Average rate) - Rate ) --> "hot spot !")
		  // Thresold = how much does the noisy tower/TRU contribute to the rate
		  //            1.0 --> Rate of noisy tower/TRU = Rate of all other towers/TRUs  
		  if (binContent/dL1GEntries > ThreshG / ( 1 + ThreshG )) {
		    badL1G[ix-1][iy-1] += 1;
		    nBadL1G += 1;
		  }
		}
	      }
	    }
	    
	    // check TRUs
	    for(Int_t ix = 1; ix <=  2; ix++) {
	      for(Int_t iy = 1; iy <=  16; iy++) {
		if(binContentTRU[ix-1][iy-1]/dL1GEntries >  ThreshG / ( 1 + ThreshG )) {
		  badL1GTRU[ix-1][iy-1] += 1;
		  nBadL1GTRU += 1;
		}
	      }
	    }
	    
	    if(fTextL1[0]){
	      lstF->Add(fTextL1[0]->Clone()) ;
	      fTextL1[0]->Clear() ; 
	      
	      if (nBadL1G == 0 && nBadL1GTRU == 0 ) {
		fTextL1[0]->SetFillColor(3) ;
		fTextL1[0]->AddText(Form("L1 GAMMA TRIGGER = OK, ENJOY...")); 
	      }
	      else if (nBadL1G == 0){
		fTextL1[0]->SetFillColor(2) ;
		fTextL1[0]->AddText(Form("HOT SPOT IN L1 GAMMA TRIGGER (TRU) = CALL EXPERT!!"));
		
	      }
	      else{
		fTextL1[0]->SetFillColor(2) ;
		fTextL1[0]->AddText(Form("HOT SPOT IN L1 GAMMA TRIGGER = CALL EXPERT!!"));
		/*
		  for(Int_t ix = 1; ix <=  hL1GammaPatch->GetNbinsX(); ix++) {
		  for(Int_t iy = 1; iy <=  hL1GammaPatch->GetNbinsY(); iy++) {
		  if(badL1G[ix-1][iy-1] != 0) printf("L1 Gamma patch with position x = %d, y = %d is out of range\n",ix,iy);
		  }
		  }
		*/
	      }
	    }//fTextL1[0]
	  }// L1 gamma patch checking done
	}// if (specie != calibSpecieId) ..
      }//hL1GammaPatch NOT NULL
      
      if( hL1JetPatch ){
	
	lstF = hL1JetPatch->GetListOfFunctions();
	CleanListOfFunctions(lstF);
	
	if (specie != calibSpecieId) {
	  
	  //if(hL1JetPatch->GetEntries() !=0) {
	  if(hL1JetPatch->GetEntries() > 10) { // need some statistics for hot spot calculation
	    
	    lstF = hL1JetPatch->GetListOfFunctions();
	    
	    // Checker for L1JetPatch
	    //Double_t dL1JmeanTrig = 1/126.;
	    //Int_t sigmaJ = 5; // deviation from  mean value
	    Double_t dL1JEntries = hL1JetPatch->GetEntries();
	    Int_t badL1J[12][16] = {{0}} ;
	    Int_t nBadL1J = 0;
	    for(Int_t ix = 1; ix <=  hL1JetPatch->GetNbinsX(); ix++) {
	      for(Int_t iy = 1; iy <=  hL1JetPatch->GetNbinsY(); iy++) {
		Double_t binContent = hL1JetPatch->GetBinContent(ix, iy) ; 
		if (binContent != 0) {
		  
		  // OLD METHOD  (if a patch triggers > sigmaJ * mean value (1/#patch positions total) says "hot spot !")
		  // if ((double)binContent/(double)dL1JEntries > sigmaJ*dL1JmeanTrig) {
		  // 	badL1J[ix-1][iy-1] += 1 ;
		  // 	nBadL1J += 1;
		  // }
		  
		  // NEW METHOD (if Rate > Threshold * ( (Number of towers or TRUs * Average rate) - Rate ) --> "hot spot !")
		  // Threshold: same definitionas for Gamma
		  if ((double)binContent/(double)dL1JEntries > ThreshJ / ( 1 + ThreshJ )) {
		    badL1J[ix-1][iy-1] += 1 ;
		    nBadL1J += 1;
		  }
		}
	      }
	    }
	    
	    if(fTextL1[1]){
	      lstF->Add(fTextL1[1]->Clone()) ;
	      fTextL1[1]->Clear() ; 
	      
	      if (nBadL1J == 0) {
		fTextL1[1]->SetFillColor(3) ;
		fTextL1[1]->AddText(Form("L1 JET TRIGGER = OK, ENJOY...")); 
	      }
	      else {
		fTextL1[1]->SetFillColor(2) ;
		fTextL1[1]->AddText(Form("HOT SPOT IN L1 JET TRIGGER = CALL EXPERT!!")); 
		/*
		  for(Int_t ix = 1; ix <=  hL1JetPatch->GetNbinsX(); ix++) {
		  for(Int_t iy = 1; iy <=  hL1JetPatch->GetNbinsY(); iy++) {
		  if(badL1J[ix-1][iy-1] != 0) printf("L1 Jet patch with position x = %d, y = %d is out of range\n",(4*ix-4),(4*iy-4));
		  }
		  }
		*/
		
	      }
	    }//fTextL1[1]
	  } // L1 Jet patch checking done
	} // if (specie != calibSpecieId) ..
      }// hL1JetPatch NOT NULL
      
      if(hFrameR){
	
	lstF = hFrameR->GetListOfFunctions();
	CleanListOfFunctions(lstF);
	
	if(hFrameR->GetEntries() !=0) {
	  lstF = hFrameR->GetListOfFunctions();
	  
	  Int_t badLink[32] = {0};
	  Int_t nBadLink = 0;
	  for(Int_t ix = 1; ix <= hFrameR->GetNbinsX(); ix++) {
	    Double_t binContent = hFrameR->GetBinContent(ix) ; 
	    if (binContent == 0) {
	      badLink[ix-1] += 1;
	      nBadLink += 1;
	    }
	  }
	  if(fTextL1[2]){
	    lstF->Add(fTextL1[2]->Clone()) ;
	    fTextL1[2]->Clear() ; 
	    
	    if (nBadLink < badLinkThresh) {
	      fTextL1[2]->SetFillColor(3) ;
	      fTextL1[2]->AddText(Form("LINK TRU-STU = OK, ENJOY...")); 
	    }
	    else {
	      fTextL1[2]->SetFillColor(2) ;
	      fTextL1[2]->AddText(Form("PROBLEM WITH TRU-STU LINK = CALL EXPERT!!"));
	      /*
		for(Int_t ix = 0; ix <= hFrameR->GetNbinsX(); ix++) {
		if(badLink[ix] != 0) printf("STU link with TRU %d is out\n",ix);
		}
	      */
	    }   
	  }//fTextL1[2]
	} // Checker for link TRU-STU done
      }//hFrameR NOT NULL
    } // species processed		
  } // specie
}
//______________________________________________________________________________

void AliEMCALQAChecker::Init(const AliQAv1::DETECTORINDEX_t det) 
{
	/// intialises QA and QA checker settings
	AliQAv1::Instance(det) ; 
	Float_t hiValue[AliQAv1::kNBIT] ; 
	Float_t lowValue[AliQAv1::kNBIT] ;
	lowValue[AliQAv1::kINFO]      = 0.0   ; 
	hiValue[AliQAv1::kINFO]       = 0.1 ; 
	lowValue[AliQAv1::kWARNING]   = 0.1 ; 
  hiValue[AliQAv1::kWARNING]    = 0.5 ; 
	lowValue[AliQAv1::kERROR]     = 0.5   ; 
	hiValue[AliQAv1::kERROR]      = 0.8 ; 
	lowValue[AliQAv1::kFATAL]     = 0.8   ; 
	hiValue[AliQAv1::kFATAL]      = 1.0 ; 
	SetHiLo(&hiValue[0], &lowValue[0]) ; 
}

//______________________________________________________________________________

void AliEMCALQAChecker::CleanListOfFunctions(TList *list)
{ // clean up

	if (list) {
		TObject *stats = list->FindObject("stats"); list->Remove(stats);
		TObject *obj;
		while ((obj = list->First())) { while(list->Remove(obj)) { } delete obj; }
			if (stats) list->Add(stats);
		}
	else {
		AliWarning(Form("Checker : empty list of data functions; returning"));
		return;
	}

}


 AliEMCALQAChecker.cxx:1
 AliEMCALQAChecker.cxx:2
 AliEMCALQAChecker.cxx:3
 AliEMCALQAChecker.cxx:4
 AliEMCALQAChecker.cxx:5
 AliEMCALQAChecker.cxx:6
 AliEMCALQAChecker.cxx:7
 AliEMCALQAChecker.cxx:8
 AliEMCALQAChecker.cxx:9
 AliEMCALQAChecker.cxx:10
 AliEMCALQAChecker.cxx:11
 AliEMCALQAChecker.cxx:12
 AliEMCALQAChecker.cxx:13
 AliEMCALQAChecker.cxx:14
 AliEMCALQAChecker.cxx:15
 AliEMCALQAChecker.cxx:16
 AliEMCALQAChecker.cxx:17
 AliEMCALQAChecker.cxx:18
 AliEMCALQAChecker.cxx:19
 AliEMCALQAChecker.cxx:20
 AliEMCALQAChecker.cxx:21
 AliEMCALQAChecker.cxx:22
 AliEMCALQAChecker.cxx:23
 AliEMCALQAChecker.cxx:24
 AliEMCALQAChecker.cxx:25
 AliEMCALQAChecker.cxx:26
 AliEMCALQAChecker.cxx:27
 AliEMCALQAChecker.cxx:28
 AliEMCALQAChecker.cxx:29
 AliEMCALQAChecker.cxx:30
 AliEMCALQAChecker.cxx:31
 AliEMCALQAChecker.cxx:32
 AliEMCALQAChecker.cxx:33
 AliEMCALQAChecker.cxx:34
 AliEMCALQAChecker.cxx:35
 AliEMCALQAChecker.cxx:36
 AliEMCALQAChecker.cxx:37
 AliEMCALQAChecker.cxx:38
 AliEMCALQAChecker.cxx:39
 AliEMCALQAChecker.cxx:40
 AliEMCALQAChecker.cxx:41
 AliEMCALQAChecker.cxx:42
 AliEMCALQAChecker.cxx:43
 AliEMCALQAChecker.cxx:44
 AliEMCALQAChecker.cxx:45
 AliEMCALQAChecker.cxx:46
 AliEMCALQAChecker.cxx:47
 AliEMCALQAChecker.cxx:48
 AliEMCALQAChecker.cxx:49
 AliEMCALQAChecker.cxx:50
 AliEMCALQAChecker.cxx:51
 AliEMCALQAChecker.cxx:52
 AliEMCALQAChecker.cxx:53
 AliEMCALQAChecker.cxx:54
 AliEMCALQAChecker.cxx:55
 AliEMCALQAChecker.cxx:56
 AliEMCALQAChecker.cxx:57
 AliEMCALQAChecker.cxx:58
 AliEMCALQAChecker.cxx:59
 AliEMCALQAChecker.cxx:60
 AliEMCALQAChecker.cxx:61
 AliEMCALQAChecker.cxx:62
 AliEMCALQAChecker.cxx:63
 AliEMCALQAChecker.cxx:64
 AliEMCALQAChecker.cxx:65
 AliEMCALQAChecker.cxx:66
 AliEMCALQAChecker.cxx:67
 AliEMCALQAChecker.cxx:68
 AliEMCALQAChecker.cxx:69
 AliEMCALQAChecker.cxx:70
 AliEMCALQAChecker.cxx:71
 AliEMCALQAChecker.cxx:72
 AliEMCALQAChecker.cxx:73
 AliEMCALQAChecker.cxx:74
 AliEMCALQAChecker.cxx:75
 AliEMCALQAChecker.cxx:76
 AliEMCALQAChecker.cxx:77
 AliEMCALQAChecker.cxx:78
 AliEMCALQAChecker.cxx:79
 AliEMCALQAChecker.cxx:80
 AliEMCALQAChecker.cxx:81
 AliEMCALQAChecker.cxx:82
 AliEMCALQAChecker.cxx:83
 AliEMCALQAChecker.cxx:84
 AliEMCALQAChecker.cxx:85
 AliEMCALQAChecker.cxx:86
 AliEMCALQAChecker.cxx:87
 AliEMCALQAChecker.cxx:88
 AliEMCALQAChecker.cxx:89
 AliEMCALQAChecker.cxx:90
 AliEMCALQAChecker.cxx:91
 AliEMCALQAChecker.cxx:92
 AliEMCALQAChecker.cxx:93
 AliEMCALQAChecker.cxx:94
 AliEMCALQAChecker.cxx:95
 AliEMCALQAChecker.cxx:96
 AliEMCALQAChecker.cxx:97
 AliEMCALQAChecker.cxx:98
 AliEMCALQAChecker.cxx:99
 AliEMCALQAChecker.cxx:100
 AliEMCALQAChecker.cxx:101
 AliEMCALQAChecker.cxx:102
 AliEMCALQAChecker.cxx:103
 AliEMCALQAChecker.cxx:104
 AliEMCALQAChecker.cxx:105
 AliEMCALQAChecker.cxx:106
 AliEMCALQAChecker.cxx:107
 AliEMCALQAChecker.cxx:108
 AliEMCALQAChecker.cxx:109
 AliEMCALQAChecker.cxx:110
 AliEMCALQAChecker.cxx:111
 AliEMCALQAChecker.cxx:112
 AliEMCALQAChecker.cxx:113
 AliEMCALQAChecker.cxx:114
 AliEMCALQAChecker.cxx:115
 AliEMCALQAChecker.cxx:116
 AliEMCALQAChecker.cxx:117
 AliEMCALQAChecker.cxx:118
 AliEMCALQAChecker.cxx:119
 AliEMCALQAChecker.cxx:120
 AliEMCALQAChecker.cxx:121
 AliEMCALQAChecker.cxx:122
 AliEMCALQAChecker.cxx:123
 AliEMCALQAChecker.cxx:124
 AliEMCALQAChecker.cxx:125
 AliEMCALQAChecker.cxx:126
 AliEMCALQAChecker.cxx:127
 AliEMCALQAChecker.cxx:128
 AliEMCALQAChecker.cxx:129
 AliEMCALQAChecker.cxx:130
 AliEMCALQAChecker.cxx:131
 AliEMCALQAChecker.cxx:132
 AliEMCALQAChecker.cxx:133
 AliEMCALQAChecker.cxx:134
 AliEMCALQAChecker.cxx:135
 AliEMCALQAChecker.cxx:136
 AliEMCALQAChecker.cxx:137
 AliEMCALQAChecker.cxx:138
 AliEMCALQAChecker.cxx:139
 AliEMCALQAChecker.cxx:140
 AliEMCALQAChecker.cxx:141
 AliEMCALQAChecker.cxx:142
 AliEMCALQAChecker.cxx:143
 AliEMCALQAChecker.cxx:144
 AliEMCALQAChecker.cxx:145
 AliEMCALQAChecker.cxx:146
 AliEMCALQAChecker.cxx:147
 AliEMCALQAChecker.cxx:148
 AliEMCALQAChecker.cxx:149
 AliEMCALQAChecker.cxx:150
 AliEMCALQAChecker.cxx:151
 AliEMCALQAChecker.cxx:152
 AliEMCALQAChecker.cxx:153
 AliEMCALQAChecker.cxx:154
 AliEMCALQAChecker.cxx:155
 AliEMCALQAChecker.cxx:156
 AliEMCALQAChecker.cxx:157
 AliEMCALQAChecker.cxx:158
 AliEMCALQAChecker.cxx:159
 AliEMCALQAChecker.cxx:160
 AliEMCALQAChecker.cxx:161
 AliEMCALQAChecker.cxx:162
 AliEMCALQAChecker.cxx:163
 AliEMCALQAChecker.cxx:164
 AliEMCALQAChecker.cxx:165
 AliEMCALQAChecker.cxx:166
 AliEMCALQAChecker.cxx:167
 AliEMCALQAChecker.cxx:168
 AliEMCALQAChecker.cxx:169
 AliEMCALQAChecker.cxx:170
 AliEMCALQAChecker.cxx:171
 AliEMCALQAChecker.cxx:172
 AliEMCALQAChecker.cxx:173
 AliEMCALQAChecker.cxx:174
 AliEMCALQAChecker.cxx:175
 AliEMCALQAChecker.cxx:176
 AliEMCALQAChecker.cxx:177
 AliEMCALQAChecker.cxx:178
 AliEMCALQAChecker.cxx:179
 AliEMCALQAChecker.cxx:180
 AliEMCALQAChecker.cxx:181
 AliEMCALQAChecker.cxx:182
 AliEMCALQAChecker.cxx:183
 AliEMCALQAChecker.cxx:184
 AliEMCALQAChecker.cxx:185
 AliEMCALQAChecker.cxx:186
 AliEMCALQAChecker.cxx:187
 AliEMCALQAChecker.cxx:188
 AliEMCALQAChecker.cxx:189
 AliEMCALQAChecker.cxx:190
 AliEMCALQAChecker.cxx:191
 AliEMCALQAChecker.cxx:192
 AliEMCALQAChecker.cxx:193
 AliEMCALQAChecker.cxx:194
 AliEMCALQAChecker.cxx:195
 AliEMCALQAChecker.cxx:196
 AliEMCALQAChecker.cxx:197
 AliEMCALQAChecker.cxx:198
 AliEMCALQAChecker.cxx:199
 AliEMCALQAChecker.cxx:200
 AliEMCALQAChecker.cxx:201
 AliEMCALQAChecker.cxx:202
 AliEMCALQAChecker.cxx:203
 AliEMCALQAChecker.cxx:204
 AliEMCALQAChecker.cxx:205
 AliEMCALQAChecker.cxx:206
 AliEMCALQAChecker.cxx:207
 AliEMCALQAChecker.cxx:208
 AliEMCALQAChecker.cxx:209
 AliEMCALQAChecker.cxx:210
 AliEMCALQAChecker.cxx:211
 AliEMCALQAChecker.cxx:212
 AliEMCALQAChecker.cxx:213
 AliEMCALQAChecker.cxx:214
 AliEMCALQAChecker.cxx:215
 AliEMCALQAChecker.cxx:216
 AliEMCALQAChecker.cxx:217
 AliEMCALQAChecker.cxx:218
 AliEMCALQAChecker.cxx:219
 AliEMCALQAChecker.cxx:220
 AliEMCALQAChecker.cxx:221
 AliEMCALQAChecker.cxx:222
 AliEMCALQAChecker.cxx:223
 AliEMCALQAChecker.cxx:224
 AliEMCALQAChecker.cxx:225
 AliEMCALQAChecker.cxx:226
 AliEMCALQAChecker.cxx:227
 AliEMCALQAChecker.cxx:228
 AliEMCALQAChecker.cxx:229
 AliEMCALQAChecker.cxx:230
 AliEMCALQAChecker.cxx:231
 AliEMCALQAChecker.cxx:232
 AliEMCALQAChecker.cxx:233
 AliEMCALQAChecker.cxx:234
 AliEMCALQAChecker.cxx:235
 AliEMCALQAChecker.cxx:236
 AliEMCALQAChecker.cxx:237
 AliEMCALQAChecker.cxx:238
 AliEMCALQAChecker.cxx:239
 AliEMCALQAChecker.cxx:240
 AliEMCALQAChecker.cxx:241
 AliEMCALQAChecker.cxx:242
 AliEMCALQAChecker.cxx:243
 AliEMCALQAChecker.cxx:244
 AliEMCALQAChecker.cxx:245
 AliEMCALQAChecker.cxx:246
 AliEMCALQAChecker.cxx:247
 AliEMCALQAChecker.cxx:248
 AliEMCALQAChecker.cxx:249
 AliEMCALQAChecker.cxx:250
 AliEMCALQAChecker.cxx:251
 AliEMCALQAChecker.cxx:252
 AliEMCALQAChecker.cxx:253
 AliEMCALQAChecker.cxx:254
 AliEMCALQAChecker.cxx:255
 AliEMCALQAChecker.cxx:256
 AliEMCALQAChecker.cxx:257
 AliEMCALQAChecker.cxx:258
 AliEMCALQAChecker.cxx:259
 AliEMCALQAChecker.cxx:260
 AliEMCALQAChecker.cxx:261
 AliEMCALQAChecker.cxx:262
 AliEMCALQAChecker.cxx:263
 AliEMCALQAChecker.cxx:264
 AliEMCALQAChecker.cxx:265
 AliEMCALQAChecker.cxx:266
 AliEMCALQAChecker.cxx:267
 AliEMCALQAChecker.cxx:268
 AliEMCALQAChecker.cxx:269
 AliEMCALQAChecker.cxx:270
 AliEMCALQAChecker.cxx:271
 AliEMCALQAChecker.cxx:272
 AliEMCALQAChecker.cxx:273
 AliEMCALQAChecker.cxx:274
 AliEMCALQAChecker.cxx:275
 AliEMCALQAChecker.cxx:276
 AliEMCALQAChecker.cxx:277
 AliEMCALQAChecker.cxx:278
 AliEMCALQAChecker.cxx:279
 AliEMCALQAChecker.cxx:280
 AliEMCALQAChecker.cxx:281
 AliEMCALQAChecker.cxx:282
 AliEMCALQAChecker.cxx:283
 AliEMCALQAChecker.cxx:284
 AliEMCALQAChecker.cxx:285
 AliEMCALQAChecker.cxx:286
 AliEMCALQAChecker.cxx:287
 AliEMCALQAChecker.cxx:288
 AliEMCALQAChecker.cxx:289
 AliEMCALQAChecker.cxx:290
 AliEMCALQAChecker.cxx:291
 AliEMCALQAChecker.cxx:292
 AliEMCALQAChecker.cxx:293
 AliEMCALQAChecker.cxx:294
 AliEMCALQAChecker.cxx:295
 AliEMCALQAChecker.cxx:296
 AliEMCALQAChecker.cxx:297
 AliEMCALQAChecker.cxx:298
 AliEMCALQAChecker.cxx:299
 AliEMCALQAChecker.cxx:300
 AliEMCALQAChecker.cxx:301
 AliEMCALQAChecker.cxx:302
 AliEMCALQAChecker.cxx:303
 AliEMCALQAChecker.cxx:304
 AliEMCALQAChecker.cxx:305
 AliEMCALQAChecker.cxx:306
 AliEMCALQAChecker.cxx:307
 AliEMCALQAChecker.cxx:308
 AliEMCALQAChecker.cxx:309
 AliEMCALQAChecker.cxx:310
 AliEMCALQAChecker.cxx:311
 AliEMCALQAChecker.cxx:312
 AliEMCALQAChecker.cxx:313
 AliEMCALQAChecker.cxx:314
 AliEMCALQAChecker.cxx:315
 AliEMCALQAChecker.cxx:316
 AliEMCALQAChecker.cxx:317
 AliEMCALQAChecker.cxx:318
 AliEMCALQAChecker.cxx:319
 AliEMCALQAChecker.cxx:320
 AliEMCALQAChecker.cxx:321
 AliEMCALQAChecker.cxx:322
 AliEMCALQAChecker.cxx:323
 AliEMCALQAChecker.cxx:324
 AliEMCALQAChecker.cxx:325
 AliEMCALQAChecker.cxx:326
 AliEMCALQAChecker.cxx:327
 AliEMCALQAChecker.cxx:328
 AliEMCALQAChecker.cxx:329
 AliEMCALQAChecker.cxx:330
 AliEMCALQAChecker.cxx:331
 AliEMCALQAChecker.cxx:332
 AliEMCALQAChecker.cxx:333
 AliEMCALQAChecker.cxx:334
 AliEMCALQAChecker.cxx:335
 AliEMCALQAChecker.cxx:336
 AliEMCALQAChecker.cxx:337
 AliEMCALQAChecker.cxx:338
 AliEMCALQAChecker.cxx:339
 AliEMCALQAChecker.cxx:340
 AliEMCALQAChecker.cxx:341
 AliEMCALQAChecker.cxx:342
 AliEMCALQAChecker.cxx:343
 AliEMCALQAChecker.cxx:344
 AliEMCALQAChecker.cxx:345
 AliEMCALQAChecker.cxx:346
 AliEMCALQAChecker.cxx:347
 AliEMCALQAChecker.cxx:348
 AliEMCALQAChecker.cxx:349
 AliEMCALQAChecker.cxx:350
 AliEMCALQAChecker.cxx:351
 AliEMCALQAChecker.cxx:352
 AliEMCALQAChecker.cxx:353
 AliEMCALQAChecker.cxx:354
 AliEMCALQAChecker.cxx:355
 AliEMCALQAChecker.cxx:356
 AliEMCALQAChecker.cxx:357
 AliEMCALQAChecker.cxx:358
 AliEMCALQAChecker.cxx:359
 AliEMCALQAChecker.cxx:360
 AliEMCALQAChecker.cxx:361
 AliEMCALQAChecker.cxx:362
 AliEMCALQAChecker.cxx:363
 AliEMCALQAChecker.cxx:364
 AliEMCALQAChecker.cxx:365
 AliEMCALQAChecker.cxx:366
 AliEMCALQAChecker.cxx:367
 AliEMCALQAChecker.cxx:368
 AliEMCALQAChecker.cxx:369
 AliEMCALQAChecker.cxx:370
 AliEMCALQAChecker.cxx:371
 AliEMCALQAChecker.cxx:372
 AliEMCALQAChecker.cxx:373
 AliEMCALQAChecker.cxx:374
 AliEMCALQAChecker.cxx:375
 AliEMCALQAChecker.cxx:376
 AliEMCALQAChecker.cxx:377
 AliEMCALQAChecker.cxx:378
 AliEMCALQAChecker.cxx:379
 AliEMCALQAChecker.cxx:380
 AliEMCALQAChecker.cxx:381
 AliEMCALQAChecker.cxx:382
 AliEMCALQAChecker.cxx:383
 AliEMCALQAChecker.cxx:384
 AliEMCALQAChecker.cxx:385
 AliEMCALQAChecker.cxx:386
 AliEMCALQAChecker.cxx:387
 AliEMCALQAChecker.cxx:388
 AliEMCALQAChecker.cxx:389
 AliEMCALQAChecker.cxx:390
 AliEMCALQAChecker.cxx:391
 AliEMCALQAChecker.cxx:392
 AliEMCALQAChecker.cxx:393
 AliEMCALQAChecker.cxx:394
 AliEMCALQAChecker.cxx:395
 AliEMCALQAChecker.cxx:396
 AliEMCALQAChecker.cxx:397
 AliEMCALQAChecker.cxx:398
 AliEMCALQAChecker.cxx:399
 AliEMCALQAChecker.cxx:400
 AliEMCALQAChecker.cxx:401
 AliEMCALQAChecker.cxx:402
 AliEMCALQAChecker.cxx:403
 AliEMCALQAChecker.cxx:404
 AliEMCALQAChecker.cxx:405
 AliEMCALQAChecker.cxx:406
 AliEMCALQAChecker.cxx:407
 AliEMCALQAChecker.cxx:408
 AliEMCALQAChecker.cxx:409
 AliEMCALQAChecker.cxx:410
 AliEMCALQAChecker.cxx:411
 AliEMCALQAChecker.cxx:412
 AliEMCALQAChecker.cxx:413
 AliEMCALQAChecker.cxx:414
 AliEMCALQAChecker.cxx:415
 AliEMCALQAChecker.cxx:416
 AliEMCALQAChecker.cxx:417
 AliEMCALQAChecker.cxx:418
 AliEMCALQAChecker.cxx:419
 AliEMCALQAChecker.cxx:420
 AliEMCALQAChecker.cxx:421
 AliEMCALQAChecker.cxx:422
 AliEMCALQAChecker.cxx:423
 AliEMCALQAChecker.cxx:424
 AliEMCALQAChecker.cxx:425
 AliEMCALQAChecker.cxx:426
 AliEMCALQAChecker.cxx:427
 AliEMCALQAChecker.cxx:428
 AliEMCALQAChecker.cxx:429
 AliEMCALQAChecker.cxx:430
 AliEMCALQAChecker.cxx:431
 AliEMCALQAChecker.cxx:432
 AliEMCALQAChecker.cxx:433
 AliEMCALQAChecker.cxx:434
 AliEMCALQAChecker.cxx:435
 AliEMCALQAChecker.cxx:436
 AliEMCALQAChecker.cxx:437
 AliEMCALQAChecker.cxx:438
 AliEMCALQAChecker.cxx:439
 AliEMCALQAChecker.cxx:440
 AliEMCALQAChecker.cxx:441
 AliEMCALQAChecker.cxx:442
 AliEMCALQAChecker.cxx:443
 AliEMCALQAChecker.cxx:444
 AliEMCALQAChecker.cxx:445
 AliEMCALQAChecker.cxx:446
 AliEMCALQAChecker.cxx:447
 AliEMCALQAChecker.cxx:448
 AliEMCALQAChecker.cxx:449
 AliEMCALQAChecker.cxx:450
 AliEMCALQAChecker.cxx:451
 AliEMCALQAChecker.cxx:452
 AliEMCALQAChecker.cxx:453
 AliEMCALQAChecker.cxx:454
 AliEMCALQAChecker.cxx:455
 AliEMCALQAChecker.cxx:456
 AliEMCALQAChecker.cxx:457
 AliEMCALQAChecker.cxx:458
 AliEMCALQAChecker.cxx:459
 AliEMCALQAChecker.cxx:460
 AliEMCALQAChecker.cxx:461
 AliEMCALQAChecker.cxx:462
 AliEMCALQAChecker.cxx:463
 AliEMCALQAChecker.cxx:464
 AliEMCALQAChecker.cxx:465
 AliEMCALQAChecker.cxx:466
 AliEMCALQAChecker.cxx:467
 AliEMCALQAChecker.cxx:468
 AliEMCALQAChecker.cxx:469
 AliEMCALQAChecker.cxx:470
 AliEMCALQAChecker.cxx:471
 AliEMCALQAChecker.cxx:472
 AliEMCALQAChecker.cxx:473
 AliEMCALQAChecker.cxx:474
 AliEMCALQAChecker.cxx:475
 AliEMCALQAChecker.cxx:476
 AliEMCALQAChecker.cxx:477
 AliEMCALQAChecker.cxx:478
 AliEMCALQAChecker.cxx:479
 AliEMCALQAChecker.cxx:480
 AliEMCALQAChecker.cxx:481
 AliEMCALQAChecker.cxx:482
 AliEMCALQAChecker.cxx:483
 AliEMCALQAChecker.cxx:484
 AliEMCALQAChecker.cxx:485
 AliEMCALQAChecker.cxx:486
 AliEMCALQAChecker.cxx:487
 AliEMCALQAChecker.cxx:488
 AliEMCALQAChecker.cxx:489
 AliEMCALQAChecker.cxx:490
 AliEMCALQAChecker.cxx:491
 AliEMCALQAChecker.cxx:492
 AliEMCALQAChecker.cxx:493
 AliEMCALQAChecker.cxx:494
 AliEMCALQAChecker.cxx:495
 AliEMCALQAChecker.cxx:496
 AliEMCALQAChecker.cxx:497
 AliEMCALQAChecker.cxx:498
 AliEMCALQAChecker.cxx:499
 AliEMCALQAChecker.cxx:500
 AliEMCALQAChecker.cxx:501
 AliEMCALQAChecker.cxx:502
 AliEMCALQAChecker.cxx:503
 AliEMCALQAChecker.cxx:504
 AliEMCALQAChecker.cxx:505
 AliEMCALQAChecker.cxx:506