]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - T0/AliT0QAChecker.cxx
T0 module
[u/mrichter/AliRoot.git] / T0 / AliT0QAChecker.cxx
diff --git a/T0/AliT0QAChecker.cxx b/T0/AliT0QAChecker.cxx
deleted file mode 100644 (file)
index 797c8aa..0000000
+++ /dev/null
@@ -1,883 +0,0 @@
-/**************************************************************************
- * Coyright(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
-//  Skeleton for T0
-//---------------------------------------------
-//checkig without reference data:
-//for RAW QA all histograms should have approximatly the same 
-//number of entries as RefPoint
-//for Rec Points checks 
-//  - amplitude measured by 2 methos
-//  - online and offline T0 measurements
-// for ESD quality of reconstruction ( and measurements):
-// RMS of vertex and T0 less than 75ps
-//
-// Alla.Maevskaya@cern.ch   
-//...
-
-// --- ROOT system ---
-#include <Riostream.h>
-#include <TClass.h>
-#include <TH1F.h> 
-#include <TF1.h> 
-#include <TFitResultPtr.h>
-#include <TH2.h> 
-#include <TIterator.h> 
-#include <TKey.h> 
-#include <TFile.h> 
-#include <TMath.h>
-#include <TString.h>
-#include <TPaveText.h>
-#include <TLegend.h>
-
-// --- Standard library ---
-
-// --- AliRoot header files ---
-#include "AliLog.h"
-#include "AliQAv1.h"
-#include "AliQAChecker.h"
-#include "AliCDBEntry.h"
-#include "AliQAManager.h"
-#include "AliT0QAChecker.h"
-#include "AliQAThresholds.h"
-#include "AliDAQ.h"
-
-ClassImp(AliT0QAChecker)
-//____________________________________________________________________________
-AliT0QAChecker::AliT0QAChecker() :
-  AliQACheckerBase("T0","T0 Quality Assurance Checker"),
-  fCFDErrorThreshold(0),
-  fLEDErrorThreshold(0),
-  fQTCErrorThreshold(0),
-  fRatioCFDEffLEDEffErrorThreshold(1),
-  fQTCEfficiencyErrorThreshold(0),
-  fBCIDPeriodParam(3564),
-  fBCIDOffsetParam(37),
-  fBCIDBandWidthParam(10),
-  fTZeroAPlusCErrorThreshold(2000.0),
-  fTZeroAMinusCErrorThreshold(2000.0)
-{
-  // Standard constructor
-  for(Int_t i=0; i<24; i++){ 
-    fMeanCFDFromGoodRunParam[i]=0; 
-    fMeanLEDFromGoodRunParam[i]=0; 
-    fMeanQTCFromGoodRunParam[i]=0; 
-  }
-
-}
-
-//____________________________________________________________________________
-AliT0QAChecker::AliT0QAChecker(const AliT0QAChecker& qac):
-  AliQACheckerBase(qac.GetName(), qac.GetTitle()),
-  fCFDErrorThreshold(qac.fCFDErrorThreshold),
-  fLEDErrorThreshold(qac.fLEDErrorThreshold),
-  fQTCErrorThreshold(qac.fQTCErrorThreshold),
-  fRatioCFDEffLEDEffErrorThreshold(qac.fRatioCFDEffLEDEffErrorThreshold),
-  fQTCEfficiencyErrorThreshold(qac.fQTCEfficiencyErrorThreshold),
-  fBCIDPeriodParam(qac.fBCIDPeriodParam),
-  fBCIDOffsetParam(qac.fBCIDOffsetParam),
-  fBCIDBandWidthParam(qac.fBCIDBandWidthParam),
-  fTZeroAPlusCErrorThreshold(qac.fTZeroAPlusCErrorThreshold),
-  fTZeroAMinusCErrorThreshold(qac.fTZeroAMinusCErrorThreshold)
-{
-  // copy constructor
-  AliError("Copy should not be used with this class\n");
-  for(Int_t i=0; i<24; i++){ 
-    fMeanCFDFromGoodRunParam[i]=qac.fMeanCFDFromGoodRunParam[i]; 
-    fMeanLEDFromGoodRunParam[i]=qac.fMeanLEDFromGoodRunParam[i]; 
-    fMeanQTCFromGoodRunParam[i]=qac.fMeanQTCFromGoodRunParam[i]; 
-  }
-
-}
-//____________________________________________________________________________
-AliT0QAChecker& AliT0QAChecker::operator=(const AliT0QAChecker& qac){
-  // assignment operator
-  this->~AliT0QAChecker();
-  new(this)AliT0QAChecker(qac);
-  return *this;
-}
-
-
-//____________________________________________________________________________
-AliT0QAChecker::~AliT0QAChecker(){
-  // destructor
-
-}
-
-//__________________________________________________________________
-void AliT0QAChecker::Check(Double_t *  test, AliQAv1::ALITASK_t index, TObjArray ** list, const AliDetectorRecoParam * /*recoParam*/)
-{
-
-  AliCDBManager* man = AliCDBManager::Instance();
-  //man->SetDefaultStorage(gSystem->Getenv("AMORE_CDB_URI"));
-  if(!man) return; 
-  AliCDBEntry* entry = man->Get("GRP/Calib/QAThresholds");
-  if(!entry) return; 
-  TObjArray* t0branch = (TObjArray*) entry->GetObject();
-  if(!list) return;
-  AliQAThresholds*  thresholds = (AliQAThresholds*) t0branch->FindObject("T00");
-  // here you should test that you got a non-null pointer
-
-  if(!thresholds) return;
-  if(AliDAQ::DetectorID("T0")!= thresholds->GetDetectorId()){
-    AliInfo(Form("DETECTOR ID %d DOES NOT MATCH TO TZERO",thresholds->GetDetectorId()));
-    return;
-  }
-
-  int iparam; 
-  for(int ipmt=0; ipmt<24;ipmt++){ 
-    iparam = ipmt + 1; //current consecutive number of parameter
-    if((TParameter<float>*) thresholds->GetThreshold(iparam)){ // mean CFD from a good run 
-      fMeanCFDFromGoodRunParam[ipmt] = ((TParameter<float>*) thresholds->GetThreshold(iparam))->GetVal();
-    }
-
-    iparam = ipmt + 25;
-    if((TParameter<float>*) thresholds->GetThreshold(iparam)){ // mean LED from a good run 
-      fMeanLEDFromGoodRunParam[ipmt] = ((TParameter<float>*) thresholds->GetThreshold(iparam))->GetVal();
-    } 
-    iparam = ipmt + 49;
-    if((TParameter<float>*) thresholds->GetThreshold(iparam)){ // mean QTC from a good run 
-      fMeanQTCFromGoodRunParam[ipmt] = ((TParameter<float>*) thresholds->GetThreshold(iparam))->GetVal();
-    } 
-  }
-  iparam = 73; //CFD threshold
-  if((TParameter<float>*) thresholds->GetThreshold(iparam)){ 
-    fCFDErrorThreshold = ((TParameter<float>*) thresholds->GetThreshold(iparam))->GetVal();
-  }
-  iparam = 74; //LED threshold
-  if((TParameter<float>*) thresholds->GetThreshold(iparam)){ 
-    fLEDErrorThreshold = ((TParameter<float>*) thresholds->GetThreshold(iparam))->GetVal();
-  }
-  iparam = 75; //QTC threshold
-  if((TParameter<float>*) thresholds->GetThreshold(iparam)){ 
-    fQTCErrorThreshold = ((TParameter<float>*) thresholds->GetThreshold(iparam))->GetVal();
-  }
-  iparam = 82; //Error level threshold on CFD efficiency/LED efficiency ratio
-  if((TParameter<float>*) thresholds->GetThreshold(iparam)){ 
-    fRatioCFDEffLEDEffErrorThreshold = ((TParameter<float>*) thresholds->GetThreshold(iparam))->GetVal();
-  }
-  // Super-basic check on the QA histograms on the input list:
-  // look whether they are empty!
-
-  iparam = 83; //Error level threshold on QTC efficiency 
-  if((TParameter<float>*) thresholds->GetThreshold(iparam)){ 
-    fQTCEfficiencyErrorThreshold = ((TParameter<float>*) thresholds->GetThreshold(iparam))->GetVal();
-  }
-
-  iparam = 84; 
-  if((TParameter<int>*) thresholds->GetThreshold(iparam)){ 
-    fBCIDPeriodParam = ((TParameter<int>*) thresholds->GetThreshold(iparam))->GetVal();
-  }
-
-  iparam = 85; 
-  if((TParameter<int>*) thresholds->GetThreshold(iparam)){ 
-    fBCIDOffsetParam = ((TParameter<int>*) thresholds->GetThreshold(iparam))->GetVal();
-  }
-
-  iparam = 86; 
-  if((TParameter<int>*) thresholds->GetThreshold(iparam)){ 
-    fBCIDBandWidthParam = ((TParameter<int>*) thresholds->GetThreshold(iparam))->GetVal();
-  }
-
-  iparam = 87; 
-  if((TParameter<float>*) thresholds->GetThreshold(iparam)){ 
-    fTZeroAPlusCErrorThreshold = ((TParameter<float>*) thresholds->GetThreshold(iparam))->GetVal();
-  }
-
-  iparam = 88; 
-  if((TParameter<float>*) thresholds->GetThreshold(iparam)){ 
-    fTZeroAMinusCErrorThreshold = ((TParameter<float>*) thresholds->GetThreshold(iparam))->GetVal();
-  }
-
-
-  char * detOCDBDir = Form("T0/%s/%s", AliQAv1::GetRefOCDBDirName(), AliQAv1::GetRefDataDirName()) ; 
-
-  AliCDBEntry *QARefRec = AliQAManager::QAManager()->Get(detOCDBDir);
-  //  QARefRec->Dump();
-  if( !QARefRec){
-    AliInfo("QA reference data NOT retrieved for Reconstruction check. No T0 reference distribution");
-  }
-
-    
-  for(Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++){ 
-    test[specie]    = 1.0; //FK//  initiate qa flag for the whole set of histograms as good 
-  }
-
-
-  for(Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
-    if(!(AliQAv1::Instance()->IsEventSpecieSet(specie) && list[specie]) || list[specie]->GetEntries() == 0) {
-      continue;
-    }
-
-    if(index == AliQAv1::kRAW){
-
-      //if(AliRecoParam::ConvertIndex(specie) == AliRecoParam::kCalib){//      if (index == AliQAv1::kRAW )
-        //check laser data efficiencies   
-      //  Double_t qaFlag = CheckLaser(list[specie]);
-      //  if(qaFlag < test[specie]) test[specie] = qaFlag;
-      //}
-
-      //if(//AliRecoParam::ConvertIndex(specie) == AliRecoParam::kCalib   ||
-       //  AliRecoParam::ConvertIndex(specie) == AliRecoParam::kHighMult ||
-      //   AliRecoParam::ConvertIndex(specie) == AliRecoParam::kLowMult){ 
-         //AliRecoParam::ConvertIndex(specie) == AliRecoParam::kDefault ||
-         
-        //check BCID   
-      //  Double_t qaFlag = CheckBCID(list[specie]);
-      //  if(qaFlag < test[specie]) test[specie] = qaFlag;
-      //}
-
-      if(AliRecoParam::ConvertIndex(specie) == AliRecoParam::kHighMult ||
-        AliRecoParam::ConvertIndex(specie) == AliRecoParam::kLowMult){ 
-        //AliRecoParam::ConvertIndex(specie) == AliRecoParam::kDefault ||
-        //check physics 
-        Double_t qaFlag = CheckRaw(list[specie]);
-        if(qaFlag < test[specie]) test[specie] = qaFlag;
-      }
-    }
-
-    if(index == AliQAv1::kESD && AliRecoParam::Convert(specie) != AliRecoParam::kCalib){
-      test[specie] = CheckESD(list[specie]);
-    } 
-  }
-}
-
-//--------------------------------------------------------------------------
-//Double_t AliT0QAChecker::CheckLaser(TObjArray *listrec) const {
-//   
-//  return 1.0; 
-//}
-
-//--------------------------------------------------------------------------
-Double_t AliT0QAChecker::CheckRaw(TObjArray *listrec) const {
-   
-  //Fk Set drawing options for LED and CFD efficiencies from the raw data
-  TH1F *hCFDEffData = (TH1F*) listrec->UncheckedAt(207);//hRawTrigger 
-  TH1F *hLEDEffData = (TH1F*) listrec->UncheckedAt(208);//hRawTrigger 
-
-  //clean objects added at previous checks
-  EraseOldMessages((TH1*) hCFDEffData); 
-  hCFDEffData->GetListOfFunctions()->Add((TH1D*) hLEDEffData->Clone());              
-
-  TLegend leg(0.12,0.76,0.9,0.92," ","brNDC");
-  leg.SetFillStyle(0); leg.SetBorderSize(0); leg.SetTextSize(0.04); leg.SetNColumns(2);
-  leg.AddEntry((TH1D*) hCFDEffData,"CFD","p");
-  leg.AddEntry((TH1D*) hLEDEffData,"LED","p");
-  hCFDEffData->GetListOfFunctions()->Add((TLegend*) leg.Clone());            
-
-
-  //Fk Draw CFD-mean for each PMT
-  TH2F* fhCFD = (TH2F*) listrec->UncheckedAt(210);
-  TH1F* fhCFDSubtrMean = (TH1F*) listrec->UncheckedAt(231);
-
-  EraseOldMessages((TH1*) fhCFDSubtrMean); 
-  for(int ipmt=0; ipmt<24;ipmt++){ 
-    TH1F*  hProjDummy = (TH1F*) fhCFD->ProjectionY("dummy",ipmt+1,ipmt+1);
-    Float_t mean=0.0, rms=0.0;
-    GetMeanAndRmsAroundMainMaximum(mean, rms,  hProjDummy,0);
-
-    Float_t deviation = mean - fMeanCFDFromGoodRunParam[ipmt]; 
-
-    fhCFDSubtrMean->SetBinContent(ipmt+1,deviation);
-    fhCFDSubtrMean->SetBinError(ipmt+1,rms);
-      
-    delete hProjDummy;
-  }
-  TLine linelowredCFD(0, fCFDErrorThreshold, 24, fCFDErrorThreshold);    
-  linelowredCFD.SetLineColor(2);
-  linelowredCFD.SetLineStyle(3);
-  linelowredCFD.SetLineWidth(4);
-  TLine linehighredCFD(0, -fCFDErrorThreshold, 24, -fCFDErrorThreshold);    
-  linehighredCFD.SetLineColor(2);
-  linehighredCFD.SetLineStyle(3);
-  linehighredCFD.SetLineWidth(4);
-  fhCFDSubtrMean->GetListOfFunctions()->Add((TLine*) linelowredCFD.Clone());         
-  fhCFDSubtrMean->GetListOfFunctions()->Add((TLine*) linehighredCFD.Clone());        
-
-  //Fk Draw LED-mean for each PMT
-  TH2F* fhLED = (TH2F*) listrec->UncheckedAt(211);
-  TH1F* fhLEDSubtrMean = (TH1F*) listrec->UncheckedAt(232);
-  EraseOldMessages((TH1*) fhLEDSubtrMean); 
-  for(int ipmt=0; ipmt<24;ipmt++){ 
-    TH1F*  hProjDummy = (TH1F*) fhLED->ProjectionY("dummy",ipmt+1,ipmt+1);
-    Float_t mean=0.0, rms=0.0;
-    GetMeanAndRmsAroundMainMaximum(mean, rms,  hProjDummy,1);
-    Float_t deviation = mean - fMeanLEDFromGoodRunParam[ipmt]; 
-
-    fhLEDSubtrMean->SetBinContent(ipmt+1,deviation);
-    fhLEDSubtrMean->SetBinError(ipmt+1,rms);
-      
-    delete hProjDummy;
-  }
-  TLine linelowredLED(0, fLEDErrorThreshold, 24, fLEDErrorThreshold);    
-  linelowredLED.SetLineColor(2);
-  linelowredLED.SetLineStyle(3);
-  linelowredLED.SetLineWidth(4);
-  TLine linehighredLED(0, -fLEDErrorThreshold, 24, -fLEDErrorThreshold);    
-  linehighredLED.SetLineColor(2);
-  linehighredLED.SetLineStyle(3);
-  linehighredLED.SetLineWidth(4);
-  fhLEDSubtrMean->GetListOfFunctions()->Add((TLine*) linelowredLED.Clone());         
-  fhLEDSubtrMean->GetListOfFunctions()->Add((TLine*) linehighredLED.Clone());        
-
-     
-  //Fk Draw QTC-mean for each PMT
-  TH2F* fhQTC = (TH2F*) listrec->UncheckedAt(212);
-  TH1F* fhQTCSubtrMean = (TH1F*) listrec->UncheckedAt(233);
-   
-  EraseOldMessages((TH1*) fhQTCSubtrMean); 
-  for(int ipmt=0; ipmt<24;ipmt++){ 
-    TH1F*  hProjDummy = (TH1F*) fhQTC->ProjectionY("dummy",ipmt+1,ipmt+1);
-    Float_t mean=0.0, rms=0.0;
-    GetMeanAndRmsAroundMainMaximum(mean, rms,  hProjDummy,2);
-    Float_t deviation = mean - fMeanQTCFromGoodRunParam[ipmt]; 
-
-    fhQTCSubtrMean->SetBinContent(ipmt+1,deviation);
-    fhQTCSubtrMean->SetBinError(ipmt+1,rms);
-      
-    delete hProjDummy;
-  }
-  TLine linelowredQTC(0, fQTCErrorThreshold, 24, fQTCErrorThreshold);    
-  linelowredQTC.SetLineColor(2);
-  linelowredQTC.SetLineStyle(3);
-  linelowredQTC.SetLineWidth(4);
-  TLine linehighredQTC(0, -fQTCErrorThreshold, 24, -fQTCErrorThreshold);    
-  linehighredQTC.SetLineColor(2);
-  linehighredQTC.SetLineStyle(3);
-  linehighredQTC.SetLineWidth(4);
-  fhQTCSubtrMean->GetListOfFunctions()->Add((TLine*) linelowredQTC.Clone());         
-  fhQTCSubtrMean->GetListOfFunctions()->Add((TLine*) linehighredQTC.Clone());        
-
-  //CFD and LED efficiency in range ~2000- ~3000 
-  TH1F* hCFDeffSubRange = (TH1F*) listrec->UncheckedAt(237);
-  TH1F* hEffLEDSubRange = (TH1F*) listrec->UncheckedAt(238);
-  // ratio CDF eff /LEF eff in subragne 
-  TH1F* hRatioCFDLEDeff = (TH1F*) listrec->UncheckedAt(239);//FK   
-  EraseOldMessages((TH1*) hRatioCFDLEDeff); 
-  int npmt = hRatioCFDLEDeff->GetNbinsX();
-  for(int ipmt=1;ipmt<=npmt;ipmt++){
-    Float_t c0 = hCFDeffSubRange->GetBinContent(ipmt); 
-    Float_t c1 = hEffLEDSubRange->GetBinContent(ipmt);
-    if(c1){
-      hRatioCFDLEDeff->SetBinContent(ipmt,c0/c1);  
-    }else{
-      hRatioCFDLEDeff->SetBinContent(ipmt,0);  
-    }  
-  }
-
-  TLine linelowredRatioCFDLEDeff(0, 1+fRatioCFDEffLEDEffErrorThreshold, 24, 1+fRatioCFDEffLEDEffErrorThreshold);    
-  linelowredRatioCFDLEDeff.SetLineColor(2);
-  linelowredRatioCFDLEDeff.SetLineStyle(3);
-  linelowredRatioCFDLEDeff.SetLineWidth(4);
-  TLine linehighredRatioCFDLEDeff(0, 1-fRatioCFDEffLEDEffErrorThreshold, 24, 1-fRatioCFDEffLEDEffErrorThreshold);    
-  linehighredRatioCFDLEDeff.SetLineColor(2);
-  linehighredRatioCFDLEDeff.SetLineStyle(3);
-  linehighredRatioCFDLEDeff.SetLineWidth(4);
-  hRatioCFDLEDeff->GetListOfFunctions()->Add((TLine*) linelowredRatioCFDLEDeff.Clone());             
-  hRatioCFDLEDeff->GetListOfFunctions()->Add((TLine*) linehighredRatioCFDLEDeff.Clone());            
-
-  //        PERFROM CHECKS on HISTOGRAMS
-
-  //-------- triggers -----------
-  Int_t qualityFlagTrigger = kT0Info; //init quality flag for a given histogram; 
-
-  TH1F *hTrigger = (TH1F*) listrec->UncheckedAt(169);//hRawTrigger 
-
-  // clean objects added at previous checks
-  EraseOldMessages((TH1*) hTrigger); 
-
-  if(hTrigger->Integral()>0){
-    //trigger plot does have some counts in it
-    //are Mean, ORA and ORC not empty?  
-    if( hTrigger->GetBinContent(1)<0.001 || hTrigger->GetBinContent(3)<0.001 || hTrigger->GetBinContent(4)<0.001){
-      qualityFlagTrigger = kT0Error; //no entries on diagonal
-      AliDebug(AliQAv1::GetQADebugLevel(), Form("T0: too little ORA and ORC in  %s", hTrigger->GetName() ));
-
-      TPaveText text(0.20,0.50,0.99,0.99,"NDC");   
-      text.AddText(Form("Check ORA and ORC")); 
-      text.AddText(Form("Report problem to the T0 on-call expert")); 
-      text.SetBorderSize(0);
-      text.SetFillStyle(0);
-      hTrigger->GetListOfFunctions()->Add((TPaveText*)text.Clone());         
-    }
-
-  }else{ //Trigger histo empty
-
-    qualityFlagTrigger = kT0Error;
-    AliDebug(AliQAv1::GetQADebugLevel(), Form("T0 histogram  %s has NO entries", hTrigger->GetName() ));
-
-    TPaveText text(0.20,0.50,0.99,0.99,"NDC");   
-    text.AddText(Form("NO ENTRIES!!!")); 
-    text.AddText(Form("If T0 is READY report")); 
-    text.AddText(Form("readout problem to the T0 on-call expert")); 
-    text.SetBorderSize(0);
-    text.SetFillStyle(0);
-    hTrigger->GetListOfFunctions()->Add((TPaveText*)text.Clone());           
-
-  }
-  //---------- CFD eff/LED eff within subrange  -----------
-  Int_t qualityFlagRatioCFDeffLEDeff = kT0Info; //init quality flag for a given histogram;
-  int nPMTs = hRatioCFDLEDeff->GetNbinsX(); 
-
-  for(int ipmt=1; ipmt<=nPMTs; ipmt++){
-    if(TMath::Abs( hRatioCFDLEDeff->GetBinContent(ipmt) -1) > fRatioCFDEffLEDEffErrorThreshold){ //mean is expected to be around 1
-      qualityFlagRatioCFDeffLEDeff = kT0Error;
-    }
-  }
-  if(qualityFlagRatioCFDeffLEDeff == kT0Error){
-    TPaveText text(0.20,0.50,0.99,0.99,"NDC");   
-    text.AddText(Form("Problem with efficiency ratio CFD/LED !!!")); 
-    text.AddText(Form("If T0 is READY and beam is on report")); 
-    text.AddText(Form("the problem to the T0 on-call expert"));
-    text.SetBorderSize(0);
-    text.SetFillStyle(0);
-    hRatioCFDLEDeff->GetListOfFunctions()->Add((TPaveText*)text.Clone());            
-  }
-  
-
-  //---------- CFD -  mean CFD  -----------
-  Int_t qualityFlagCFDSubtr = kT0Info; //init quality flag for a given histogram;
-  nPMTs = fhCFDSubtrMean->GetNbinsX(); 
-
-  for(int ipmt=1; ipmt<=nPMTs; ipmt++){
-    if(TMath::Abs( fhCFDSubtrMean->GetBinContent(ipmt)) > fCFDErrorThreshold){
-      qualityFlagCFDSubtr = kT0Error;
-
-   }
-  }
-  if(qualityFlagCFDSubtr == kT0Error){
-    TPaveText text(0.20,0.50,0.99,0.99,"NDC");   
-    text.AddText(Form("Problem with CFD timing  !!!")); 
-    text.AddText(Form("If T0 is READY and beam is on report")); 
-    text.AddText(Form("the problem to the T0 on-call expert"));
-    text.SetBorderSize(0);
-    text.SetFillStyle(0);
-    fhCFDSubtrMean->GetListOfFunctions()->Add((TPaveText*)text.Clone());             
-  }
-  //--------- QTC efficiency ---------------
-
-  Int_t qualityFlagEffQTC = kT0Info; //init quality flag for a given histogram;
-  TH1F *hEffQTC = (TH1F*) listrec->UncheckedAt(209);//hRawTrigger 
-  
-  EraseOldMessages((TH1*) hEffQTC); // clean objects added at previous checks
-
-  nPMTs = hEffQTC->GetNbinsX(); 
-  for(int ipmt=1; ipmt<=nPMTs; ipmt++){
-    if(TMath::Abs( hEffQTC->GetBinContent(ipmt)) < fQTCEfficiencyErrorThreshold){
-      qualityFlagEffQTC = kT0Error;
-    }
-  }
-  if( qualityFlagEffQTC == kT0Error){
-    TPaveText text(0.20,0.50,0.99,0.99,"NDC");   
-    text.AddText(Form("Problem with QTC efficiency !!!")); 
-    text.AddText(Form("If T0 is READY and beam is on report")); 
-    text.AddText(Form("the problem to the T0 on-call expert"));
-    text.SetBorderSize(0);
-    text.SetFillStyle(0);
-    hEffQTC->GetListOfFunctions()->Add((TPaveText*)text.Clone());            
-  }
-  TLine linehighredQTCeff(0, fQTCEfficiencyErrorThreshold, 24, fQTCEfficiencyErrorThreshold);    
-  linehighredQTCeff.SetLineColor(2);
-  linehighredQTCeff.SetLineStyle(3);
-  linehighredQTCeff.SetLineWidth(4);
-  hEffQTC->GetListOfFunctions()->Add((TLine*) linehighredQTCeff.Clone());            
-  //---------- BCID --------------------
-  Int_t qualityFlagBCID = kT0Info; //init quality flag for a given histogram; 
-  TH2F *hBCID = (TH2F*) listrec->UncheckedAt(236); //BCID versus TRM  BCID
-     
-  // clean objects added at previous checks
-  EraseOldMessages((TH1*)hBCID);
-
-  if(hBCID->Integral()>0){
-    //BCID does have some counts in it
-
-    Int_t nbinsX = hBCID->GetNbinsX();
-    Int_t startX = hBCID->GetXaxis()->FindBin(100); //skip region close to orbit period
-    Int_t nbinsY = hBCID->GetNbinsY();
-    Int_t binWidthX = (Int_t) hBCID->GetXaxis()->GetBinWidth(1);
-    Int_t binWidthY = (Int_t) hBCID->GetYaxis()->GetBinWidth(1);
-    double entriesOnDiagonal  = 0; //count diagonal and off diagonal entries
-    double entriesOffDiagonal = 0;
-
-    for(Int_t itrm=startX; itrm<=nbinsX; itrm++){ //BCID TRM
-      for(Int_t ibcid=1; ibcid<=nbinsY; ibcid++){ //BCID
-        if(TMath::Abs( (itrm*binWidthX - fBCIDOffsetParam) % fBCIDPeriodParam - binWidthY*ibcid) < fBCIDBandWidthParam ){ 
-          entriesOnDiagonal  += hBCID->GetBinContent(itrm,ibcid); //On  Diagonal
-          //hBCID->Fill(itrm*binWidthX,ibcid*binWidthY,0.001); // visualize the diagonal belt
-        }else{
-          entriesOffDiagonal += hBCID->GetBinContent(itrm,ibcid); //Off Diagonal
-        }
-      }
-    }
-    if(entriesOnDiagonal<1 || entriesOffDiagonal>20){
-      qualityFlagBCID = kT0Error; //no entries on diagonal
-      AliDebug(AliQAv1::GetQADebugLevel(), Form("T0   %s is not diagonal", hBCID->GetName() ));
-
-      TPaveText text(0.20,0.50,0.99,0.99,"NDC");   
-      text.AddText(Form("Check if entries are on diagonal")); 
-      text.AddText(Form("Report readout problem to the T0 on-call expert")); 
-      text.SetBorderSize(0);
-      text.SetFillStyle(0);
-      hBCID->GetListOfFunctions()->Add((TPaveText*)text.Clone());            
-    }
-  }else{ //BCID empty
-
-    qualityFlagBCID = kT0Error;
-    AliDebug(AliQAv1::GetQADebugLevel(), Form("T0 :  %s has NO entries", hBCID->GetName() ));
-
-    TPaveText text(0.20,0.50,0.99,0.99,"NDC");   
-    text.AddText(Form("NO ENTRIES!!!")); 
-    text.AddText(Form("If T0 is READY report")); 
-    text.AddText(Form("readout problem to the T0 on-call expert"));
-    text.SetBorderSize(0);
-    text.SetFillStyle(0);
-    hBCID->GetListOfFunctions()->Add((TPaveText*)text.Clone());              
-  }
-
-  //--------- mean versus vertex 1st ---------
-  Int_t qualityFlagMeanVersusVertex1st = kT0Info; //init quality flag for a given histogram;
-  TH2F *hMeanVersusVertex1st  = (TH2F*) listrec->UncheckedAt(220);  //fhMeanBest  time
-  EraseOldMessages((TH1*) hMeanVersusVertex1st); 
-  if(hMeanVersusVertex1st->Integral()<1){
-    qualityFlagMeanVersusVertex1st = kT0Error;
-    AliDebug(AliQAv1::GetQADebugLevel(), Form("T0 histogram  %s has NO entries", hMeanVersusVertex1st->GetName() ));
-
-    TPaveText text(0.20,0.50,0.99,0.99,"NDC");   
-    text.AddText(Form("NO ENTRIES!!!")); 
-    text.AddText(Form("If T0 is READY and beam is on report")); 
-    text.AddText(Form("the problem to the T0 on-call expert"));
-    text.SetBorderSize(0);
-    text.SetFillStyle(0);
-    hMeanVersusVertex1st->GetListOfFunctions()->Add((TPaveText*)text.Clone());       
-  }
-
-
-  //--------- vertex TVDC on ---------
-  Int_t qualityFlagVertex1stTVDCon = kT0Info; //init quality flag for a given histogram;
-  TH1F *hVertex1stTVDCon  = (TH1F*) listrec->UncheckedAt(223);  //fhMeanBest  time
-  EraseOldMessages((TH1*) hVertex1stTVDCon); 
-  if(hVertex1stTVDCon->Integral()<1){
-    qualityFlagVertex1stTVDCon = kT0Error;
-    AliDebug(AliQAv1::GetQADebugLevel(), Form("T0 histogram  %s has NO entries", hVertex1stTVDCon->GetName() ));
-
-    TPaveText text(0.20,0.50,0.99,0.99,"NDC");   
-    text.AddText(Form("NO ENTRIES!!!")); 
-    text.AddText(Form("If T0 is READY and beam is on report")); 
-    text.AddText(Form("the problem to the T0 on-call expert"));
-    text.SetBorderSize(0);
-    text.SetFillStyle(0);
-    hVertex1stTVDCon->GetListOfFunctions()->Add((TPaveText*)text.Clone());           
-  }else{
-    if(TMath::Abs(hVertex1stTVDCon->GetMean()) > fTZeroAMinusCErrorThreshold){ 
-      qualityFlagVertex1stTVDCon = kT0Error;
-
-      TPaveText text(0.20,0.50,0.99,0.99,"NDC");   
-      text.AddText(Form("Displaced vertex")); 
-      text.AddText(Form("If T0 is READY and beam is on report")); 
-      text.AddText(Form("the problem to the T0 on-call expert"));
-      text.SetBorderSize(0);
-      text.SetFillStyle(0);
-      hVertex1stTVDCon->GetListOfFunctions()->Add((TPaveText*)text.Clone());         
-    }
-  }
-
-  //--------- vertex TVDC off ---------
-  Int_t qualityFlagVertex1stTVDCoff = kT0Info; //init quality flag for a given histogram;
-  TH1F *hVertex1stTVDCoff  = (TH1F*) listrec->UncheckedAt(225);  //fhMeanBest  time
-  EraseOldMessages((TH1*) hVertex1stTVDCoff); 
-  if(hVertex1stTVDCoff->Integral()<1){
-    qualityFlagVertex1stTVDCoff = kT0Warning;
-    AliDebug(AliQAv1::GetQADebugLevel(), Form("T0 histogram  %s has NO entries", hVertex1stTVDCoff->GetName() ));
-
-    TPaveText text(0.20,0.50,0.99,0.99,"NDC");   
-    text.AddText(Form("Warning: NO ENTRIES")); 
-    text.SetBorderSize(0);
-    text.SetFillStyle(0);
-    hVertex1stTVDCoff->GetListOfFunctions()->Add((TPaveText*)text.Clone());          
-  }
-
-
-
-  //----------- time TVDC on ---------
-    
-  Int_t qualityFlagMean1stTVDCon = kT0Info; //init quality flag for a given histogram;
-  TH1F *hMean1stTVDCon  = (TH1F*) listrec->UncheckedAt(226);  //fhMeanBest  time
-  EraseOldMessages((TH1*) hMean1stTVDCon); 
-  if(hMean1stTVDCon->Integral()<1){
-    qualityFlagMean1stTVDCon = kT0Error;
-    AliDebug(AliQAv1::GetQADebugLevel(), Form("T0 histogram  %s has NO entries", hMean1stTVDCon->GetName() ));
-
-    TPaveText text(0.20,0.50,0.99,0.99,"NDC");   
-    text.AddText(Form("NO ENTRIES!!!")); 
-    text.AddText(Form("If T0 is READY and beam is on report")); 
-    text.AddText(Form("the problem to the T0 on-call expert"));
-    text.SetBorderSize(0);
-    text.SetFillStyle(0);
-    hMean1stTVDCon->GetListOfFunctions()->Add((TPaveText*)text.Clone());             
-  }else{
-    //cout<<"Mean: "<<TMath::Abs(hMean1stTVDCon->GetMean())<<" threshold "<<fTZeroAPlusCErrorThreshold<<endl;
-    if(TMath::Abs(hMean1stTVDCon->GetMean()) > fTZeroAPlusCErrorThreshold){ 
-      qualityFlagMean1stTVDCon = kT0Error;
-
-      TPaveText text(0.20,0.50,0.99,0.99,"NDC");   
-      text.AddText(Form("Shift of mean time")); 
-      text.AddText(Form("If T0 is READY and beam is on report")); 
-      text.AddText(Form("the problem to the T0 on-call expert"));
-      text.SetBorderSize(0);
-      text.SetFillStyle(0);
-      hMean1stTVDCon->GetListOfFunctions()->Add((TPaveText*)text.Clone());           
-    }
-  }
-
-  //----------- time TVDC off ---------
-    
-  Int_t qualityFlagMean1stTVDCoff = kT0Info; //init quality flag for a given histogram;
-  TH1F *hMean1stTVDCoff  = (TH1F*) listrec->UncheckedAt(227);  //fhMeanBest  time
-  EraseOldMessages((TH1*) hMean1stTVDCoff); 
-  if(hMean1stTVDCoff->Integral()<1){
-    qualityFlagMean1stTVDCoff = kT0Warning;
-    AliDebug(AliQAv1::GetQADebugLevel(), Form("T0 histogram  %s has NO entries", hMean1stTVDCoff->GetName() ));
-
-    TPaveText text(0.20,0.50,0.99,0.99,"NDC");   
-    text.AddText(Form("Warning: NO ENTRIES")); 
-    text.SetBorderSize(0);
-    text.SetFillStyle(0);
-    hMean1stTVDCoff->GetListOfFunctions()->Add((TPaveText*)text.Clone());            
-  }
-
-
-  //----------------------- executive summary ---------------------
-  int lowestQualityFlag = (int) qualityFlagTrigger;
-  if(qualityFlagRatioCFDeffLEDeff   < lowestQualityFlag)  lowestQualityFlag = qualityFlagRatioCFDeffLEDeff;
-  if(qualityFlagCFDSubtr            < lowestQualityFlag)  lowestQualityFlag = qualityFlagCFDSubtr;
-  if(qualityFlagEffQTC              < lowestQualityFlag)  lowestQualityFlag = qualityFlagEffQTC;
-  if(qualityFlagMeanVersusVertex1st < lowestQualityFlag)  lowestQualityFlag = qualityFlagMeanVersusVertex1st;
-  if(qualityFlagBCID                < lowestQualityFlag)  lowestQualityFlag = qualityFlagBCID;
-  if(qualityFlagVertex1stTVDCon     < lowestQualityFlag)  lowestQualityFlag = qualityFlagVertex1stTVDCon;
-  if(qualityFlagVertex1stTVDCoff    < lowestQualityFlag)  lowestQualityFlag = qualityFlagVertex1stTVDCoff;
-  if(qualityFlagMean1stTVDCon       < lowestQualityFlag)  lowestQualityFlag = qualityFlagMean1stTVDCon;
-  if(qualityFlagMean1stTVDCoff      < lowestQualityFlag)  lowestQualityFlag = qualityFlagMean1stTVDCoff;
-  
-
-  return ConvertQualityFlagToDouble(lowestQualityFlag); 
-  
-}
-
-//--------------------------------------------------------------------------
-Double_t AliT0QAChecker::CheckESD(TObjArray *listrec ) const
-{
-  Float_t checkr = 0;
-  TH1 *fhESD;
-  fhESD  = (TH1*) listrec->UncheckedAt(2);
-  if(fhESD){
-    AliDebug(AliQAv1::GetQADebugLevel(), Form("count %s ", fhESD->GetName()) );
-     TF1 *f1 = new TF1("f1","gaus",-1,1);
-    fhESD->Fit("f1","R","Q", -1,1);
-    Double_t par[3];
-    f1->GetParameters(&par[0]);
-    
-    TPaveText text(0.30,0.50,0.99,0.99,"NDC");
-    
-    text.AddText(Form("T0 RUN %d ",AliCDBManager::Instance()->GetRun()));
-    
-    AliDebug(AliQAv1::GetQADebugLevel(), Form("numentries %d mean %f  #sigma %f", (int)fhESD->GetEntries(),par[1], par[2]));
-    
-    
-    if (par[2] > 0.07 && par[2] < 1.) {
-      checkr=0.5;
-       text.AddText(Form("not good resolution :\n %f ns\n", par[2] ));
-       text.SetFillColor(5);
-       printf("T0 detector resolution is not good enouph: %f ns\n",par[2] );
-    }
-    if(TMath::Abs(par[1])>0.05) {
-      checkr = 0.5;
-      text.AddText(Form(" Check clock shift on %f ns", par[1]));
-      text.SetFillColor(5);
-    }
-    if (par[2] >  1. || TMath::Abs(par[1])>0.1) {
-      checkr = 0.25;
-      text.AddText(Form(" Bad resolution:\n mean %f ns sigma %f ns", par[1], par[2]));
-      text.SetFillColor(2);
-      { // RS Clean previous additions
-       TList* lstF = fhESD->GetListOfFunctions();
-       if (lstF) {
-         TObject *stats = lstF->FindObject("stats");
-         lstF->Remove(stats);
-         TObject *obj;
-         while ((obj = lstF->First())) {
-           while(lstF->Remove(obj)) { }
-           delete obj;
-         }
-         if (stats) lstF->Add(stats);
-       } 
-      }
-      fhESD->GetListOfFunctions()->Add((TPaveText*)text.Clone());      
-      AliDebug(AliQAv1::GetQADebugLevel(),
-              Form("Please, check calibration: shift= %f resolution %f test=%f\n",
-                   par[1], par[2], checkr) ) ; 
-    }
-  }
-  else
-    {
-      AliDebug(AliQAv1::GetQADebugLevel(),
-              Form("No ESD QA histogram found, nothing to check"));
-       checkr=0;
-    }
-  
-  
-  return checkr;
-}
-
-
-//--------------------------------------------------------------------------
-void AliT0QAChecker::EraseOldMessages(TH1* h) const 
-{
-  //erase the old captions 
-  TList* lstF = h->GetListOfFunctions();
-  if(lstF){  
-     TObject *stats = lstF->FindObject("stats");
-     lstF->Remove(stats);
-     TObject *obj;
-     while ((obj = lstF->First())) {
-       while(lstF->Remove(obj)) { }
-         delete obj;
-    }
-    if (stats) lstF->Add(stats);
-  }
-}
-//--------------------------------------------------------------------------
-Double_t AliT0QAChecker::ConvertQualityFlagToDouble(int qualityFlag) const 
-{
-  //covert quality flag to double
-  Double_t checkr=1.0;
-
-  switch ( qualityFlag ){
-    case kT0Info:
-        checkr = 1.0; break;
-    case kT0Warning:
-        checkr = 0.75; break;
-    case kT0Error:
-          checkr = 0.25; break;
-    case kT0Fatal:
-        checkr = -1.0; break;
-    default:
-         AliError("Invalid ecc value. FIXME !");
-         checkr = 0.25; break;
-  };
-
-  return checkr; 
-}
-//--------------------------------------------------------------------------
-Float_t AliT0QAChecker::GetMeanAboveThreshold(TH1F* hV, Float_t thr) const{
-  //caculate mean value of histo bins above threshold
-  Int_t nBins = hV->GetNbinsX();
-  Int_t nBinsAboveThr = 0; 
-  Float_t sum = 0;
-
-  for(Int_t ib=1;ib<=nBins;ib++){
-    Float_t val = hV->GetBinContent(ib);
-    if(val<thr){
-      sum+=val;
-      nBinsAboveThr++; 
-    }
-  }
-
-  if(nBinsAboveThr>0) return sum/nBinsAboveThr;
-  else return hV->GetMean();
-}
-    
-//--------------------------------------------------------------------------
-void AliT0QAChecker::GetMeanAndRmsAroundMainMaximum(Float_t &meanHisto,Float_t &rmsHisto, TH1F *histo, int type) const{
-
-  if(!histo){
-    meanHisto=0.0;
-    rmsHisto=0.0;
-    return;
-  }
-  if(histo->Integral()<0.00001){
-    meanHisto=0.0;
-    rmsHisto=0.0;
-    return;
-  }
-
-  double nSigma      = 3.0; //n sigma window around mean and main maximum 
-  double expectedRMS = 13.0; // expected rms of the main peak in case of CFD
-  if(type == 1) expectedRMS = 34.0; //LED
-  if(type == 2) expectedRMS = 34.0; //QTC
-
-  //0) approx of mean is global maximum
-  Int_t   nb     =  histo->GetNbinsX();
-  Int_t   bmax   =  histo->GetMaximumBin();
-  Float_t xmax   =  histo->GetBinCenter(bmax);
-
-  double window = expectedRMS * nSigma;
-  //1) estimate a mean in the nSigma window around main max
-  int nlow = histo->FindBin( xmax - window);
-  int nhigh = histo->FindBin( xmax + window);
-  if(nlow<1)   nlow = 1; 
-  if(nhigh>nb) nhigh = nb;
-
-  Float_t sum=0.0, sumWeight=0.0, sumWeightSqr=0.0;
-  for(int ii=nlow;ii<=nhigh;ii++){
-    sum          += histo->GetBinContent(ii);  
-    sumWeight    += histo->GetBinContent(ii)*histo->GetBinCenter(ii);
-  }  
-  if(sum>0.0){
-    meanHisto = sumWeight/sum; //mean in 1st itteration
-  }else{
-    meanHisto = 0.0;
-    rmsHisto=0.0;
-    return;
-  }
-  
-  //2) recalculte mean and rms in the nSigma window around mean 1)
-  nlow  = histo->FindBin( meanHisto - window);
-  nhigh = histo->FindBin( meanHisto + window);
-  if(nlow<1)   nlow = 1; 
-  if(nhigh>nb) nhigh = nb;
-
-  sum=0.0; sumWeight=0.0; sumWeightSqr=0.0;
-  for(int ii=nlow;ii<=nhigh;ii++){
-    sum          += histo->GetBinContent(ii);  
-    sumWeight    += histo->GetBinContent(ii)*histo->GetBinCenter(ii);
-    sumWeightSqr += histo->GetBinContent(ii)*histo->GetBinCenter(ii)*histo->GetBinCenter(ii);
-  }
-  if(sum>0.0){
-    meanHisto = sumWeight/sum; //mean in 2nd itteration
-    rmsHisto  = sumWeightSqr/sum - meanHisto*meanHisto;//rms square
-    if(rmsHisto > 0.0) rmsHisto = sqrt(rmsHisto); //rms
-    else  rmsHisto = 0.0;
-    return;
-  }else{
-    meanHisto = 0.0;
-    rmsHisto  = 0.0;
-    return;
-  }
-}