ROOT logo
#if !defined(__CINT__) || defined(__MAKECINT__) 
#include <Riostream.h>
#include "AliEMCALGeometry.h"
#include <TColor.h>
#include <TStyle.h>
#include <TSystem.h>
#include <TDirectory.h>
#include <TF1.h>
#include <TFile.h>
#include <TH2F.h>
#include <TCanvas.h>
#include <TGraphErrors.h>
#include <TLegend.h>
#include <TTree.h>
#include <TPRegexp.h>
#include <TList.h>
#include <TObjString.h>
#include <TDatime.h>
#include <TError.h>
#include <AliLog.h>
#endif

// This macro produces runLevelQA for EMCAL from a QAresults.root file
// Authors: Y. Mao, A. Mas, M. Germain & A.Shabetai  SUBATECH
// re-factored for automatic QA processing A.SHABETAI

Int_t DrawOccupancy(Long_t run, TString period, TString pass, TString fTrigger, TString system, TFile* f, TFile* fout, AliEMCALGeometry* geom, Int_t SavePlots);
Int_t DrawRun(Long_t run, TString period, TString pass, TString fTrigger, TFile *f, TFile* fout, Int_t SavePlots, Int_t nSM , Bool_t kFilter);
Int_t TrendingEMCALTree(Long_t RunId,TString fCalorimeter,TString system,TString period , TString pass,const int n ,TList* TriggersList,TFile* f,TFile *fout, Int_t SavePlots);

TH2F* FormatRunHisto(TH2F* aHisto,const char* title,const char* YTitle="");
TH2F* HistoPerMod(TH2F* name,const char* title);
TH2F* AutoZoom(TH2F* H,Option_t* aType="all", Int_t EntryMin=0);
int FindNumberOfSM(TFile* f, TString fTrigger,TString period);

TString QAPATH;
TString QAPATHF = "./";
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void set_plot_style()
{
  const Int_t NRGBs = 5;
  const Int_t NCont = 255;

  Double_t stops[NRGBs] = { 0.00, 0.34, 0.61, 0.84, 1.00 };
  Double_t red[NRGBs]   = { 0.00, 0.00, 0.87, 1.00, 0.51 };
  Double_t green[NRGBs] = { 0.00, 0.81, 1.00, 0.20, 0.00 };
  Double_t blue[NRGBs]  = { 0.51, 1.00, 0.12, 0.00, 0.00 };
  TColor::CreateGradientColorTable(NRGBs, stops, red, green, blue, NCont);
  gStyle->SetNumberContours(NCont);

}

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Double_t pi0massP2(Double_t *x, Double_t *par)
{
  Double_t gaus;

  if (par[2] != 0.) gaus = par[0] * TMath::Exp( -(x[0]-par[1])*(x[0]-par[1]) / (2*par[2]*par[2]) );

  else gaus = 99999999.;

  Double_t back = par[3] + par[4]*x[0] + par[5]*x[0]*x[0];

  return gaus+back;

}

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Double_t pi0massP1(Double_t *x, Double_t *par)
{
  Double_t gaus = par[0] * TMath::Exp( -(x[0]-par[1])*(x[0]-par[1]) / (2*par[2]*par[2]) );

  Double_t back = par[3] + par[4]*x[0];

  return gaus+back;

}

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Double_t fitE(Double_t *x, Double_t *par)
{

  Double_t levy;

  levy = par[0] * TMath::Exp( -par[1]/x[0]) * TMath::Power(x[0], -par[2]) ;

  return levy;
} 

//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
int CreateEMCALRunQA(const char* filename, TString RunId, TString period, TString pass, Int_t SavePlots = 0, Bool_t filter=0 , TString fTrigger = "", TString system = "", TString fCalorimeter = "EMCAL")
{   

  QAPATH = TString(gSystem->Getenv("QAPATH"));
  if(QAPATH.IsNull()) QAPATH = QAPATHF;
  if(! QAPATH.BeginsWith("./")) { QAPATH = QAPATH + RunId + "/";} 

  AliLog::SetGlobalLogLevel(AliLog::kError);
  TFile *f = new TFile(filename);
  AliLog::SetGlobalLogLevel(AliLog::kInfo);

  if (f->IsZombie()) {Error(__FUNCTION__,Form("Error openning the input file %s",filename)); return -1;}
 
  TList* TriggersList = new TList(); 

  if (fTrigger=="") 
    {
      TPMERegexp name_re("CaloQA_\\w+");
      TObjLink* link = f->GetListOfKeys()->FirstLink();

      while (link)
        {
	  TString name = link->GetObject()->GetName();
          if (name_re.Match(name))
            {
	      TriggersList->Add(link->GetObject());
	      if(TString(filename).Contains("barrel") && ! name.Contains("default"))  TriggersList->Remove(link->GetObject());
	      if(TString(filename).Contains("outer")  && ! name.Contains("EMC"))      TriggersList->Remove(link->GetObject());
	    } 
          link = link->Next();
	}
    } else {TriggersList->Add(new TObjString(fTrigger.Data()));}
 
  if(!TriggersList->GetEntries()) {Error(__FUNCTION__,"No trigger found!"); return -2;}

  int nSM = FindNumberOfSM(f,((TObjString*)TriggersList->Last())->GetString(),period);
  if (nSM<0) {Error(__FUNCTION__,"Could not find the number of super modules!"); return -3;}
  Info(__FUNCTION__,Form("%i super modules were discuvered",nSM));
  TString GeomName;
  if (nSM <= 6)         { nSM=6;  GeomName = "EMCAL_FIRSTYEARv1";}
  else if (nSM <= 10)   { nSM=10; GeomName = "EMCAL_COMPLETEv1";}
  else if (nSM <= 12)   { nSM=12; GeomName = "EMCAL_COMPLETE12SMv1";}
  else    {nSM = 20;              GeomName = "EMCAL_COMPLETE12SMv1_DCAL_8SM";}

  AliEMCALGeometry *geom = new AliEMCALGeometry(GeomName.Data(),"EMCAL");
  Info(__FUNCTION__,Form("Using %i super modules and the Geometry %s",nSM,GeomName.Data()));

  TFile *fout = new TFile(TString( QAPATH + period+"_"+pass + fTrigger+"_"+ (Long_t)RunId.Atoi() +"_QAplots.root").Data(),"RECREATE");

  if((system.IsNull()) && (period.EndsWith("h"))) {system = "PbPb";}
  
  Int_t ret=0;
  TIter next(TriggersList);
  while (TObject *obj = next())
    {
      fTrigger= TString(obj->GetName());     
      ret -= DrawOccupancy(RunId.Atoi(),period,pass,fTrigger,system,f,fout,geom,SavePlots);
      ret -= DrawRun(RunId.Atoi(),period,pass,fTrigger,f,fout,SavePlots,nSM,filter);
    }
  ret-= TrendingEMCALTree(RunId.Atoi(),fCalorimeter,system,period,pass,nSM,TriggersList,f,fout,SavePlots);
 
  f->Close();
  fout->Close();
  delete f;
  delete geom;

  return ret;
}

//----------------------------------------------------------------------------------------------------------------------------------------------------------
Int_t DrawOccupancy(Long_t  run , TString period, TString pass, TString fTrigger,TString system, TFile* f,TFile* fout, AliEMCALGeometry* geom, Int_t SavePlots)
{

  set_plot_style();
  gStyle->SetOptStat(0);
  TH1::AddDirectory(kFALSE);
  TH2D *hEnergyMapReal = new TH2D("hEnergyMapReal","",96,-48,48,120,-0,120);
  TH2D *hOccupancyMapReal = new TH2D("hOccupancyMapReal","",96,-48,48,120,-0,120);
  hEnergyMapReal->SetXTitle("eta (bin)");
  hEnergyMapReal->SetYTitle("phi (bin)");
  hEnergyMapReal->SetZTitle("E(GeV)/event");
  hEnergyMapReal->GetYaxis()->SetTitleOffset(1.2);
  hEnergyMapReal->GetZaxis()->SetLabelSize(0.02);
  hEnergyMapReal->GetZaxis()->SetTitleOffset(1.36);
 
  hOccupancyMapReal->SetXTitle("eta (bin)");
  hOccupancyMapReal->SetYTitle("phi (bin)"); 
  hOccupancyMapReal->GetYaxis()->SetTitleOffset(1.2);
  hOccupancyMapReal->GetZaxis()->SetLabelSize(0.02);

  Int_t nSupMod, nModule, nIphi, nIeta;
  Int_t iphi, ieta;
  Int_t realbineta=0;
  Int_t realbinphi=0;
  
  //NO MASK
  Int_t mask[1] = {2222222};

  TH2F *hCellAmplitude;
  TH1F *hNEvents;
  Int_t Events;
  Int_t n=0;
  
  TString direct;
  if(!fTrigger.Contains("QA")) {
    direct = "CaloQA_";
  }
  direct += fTrigger;
  Bool_t dirok = f->cd(direct);
  if (!dirok) { Error(__FUNCTION__,Form("No input drectory %s",direct.Data())); return -1;}
  TList *outputList = (TList*)gDirectory->Get(direct); 
  if(!outputList){ Error(__FUNCTION__,"No input list! "); return -1;}
  outputList->SetOwner();
  
  fout->mkdir(Form("%s/%s/%ld/%s/%s",period.Data(),pass.Data(),run,"RunLevelQA",fTrigger.Data()));
  fout->cd();
  fout->Cd(Form("%s/%s/%ld/%s/%s",period.Data(),pass.Data(),run,"RunLevelQA",fTrigger.Data()));
  
  hNEvents =(TH1F *)outputList->FindObject("hNEvents");
  if(!hNEvents){ Error(__FUNCTION__,Form("hNEvent histogram not found for trigger %s ",fTrigger.Data())); return -2;}
  Events = (Int_t)hNEvents->GetEntries();
  if(Events==0){ Error(__FUNCTION__,Form("No event in trigger %s",fTrigger.Data())); return -3;}
 
  Double_t Eth=1;
  if(system=="PbPb"){
    Eth = 5.;
    if (fTrigger.Contains("EMC")) Eth=20.;
  }
  if(system=="pp"){
    Eth = 1.;
    if (fTrigger.Contains("EMC")) Eth=5.;
  }

  hCellAmplitude =(TH2F *)outputList->FindObject("EMCAL_hAmpId");
 
  for(Int_t i = 0; i < geom->GetNCells() ; i++){ 
    Double_t Esum = 0;
    Double_t Nsum = 0;  

    for (Int_t j = 1; j <= hCellAmplitude->GetNbinsX(); j++) 
      {
	Double_t E = hCellAmplitude->GetXaxis()->GetBinCenter(j);
	Double_t N = hCellAmplitude->GetBinContent(j, i+1);
	
	if (E < 0.3) continue; 
	
	if (E <= Eth) {
	  Esum += E*N;
	  Nsum += N;
	}
      }

    Int_t absId = i;
    if(n!=0) {if(mask[n]<=mask[n-1]) Warning(__FUNCTION__,"The list of bad cells is not sorted !!");}
    if(i==mask[n]){n++ ; continue; } // skip bad cells

    geom->GetCellIndex(absId,  nSupMod, nModule, nIphi, nIeta);
    geom->GetCellPhiEtaIndexInSModule(nSupMod,nModule,nIphi,nIeta, iphi,ieta);

    realbinphi = 120-(nSupMod/2)*24 -iphi -1; //
    if (nSupMod%2==0) realbineta= 48-ieta -1;	
    if (nSupMod%2==1) realbineta= -ieta -1;

    hEnergyMapReal->Fill(realbineta,realbinphi,Esum/(Double_t)Events);
    hOccupancyMapReal->Fill(realbineta,realbinphi,Nsum/(Double_t)Events);
  }

  cout <<" Run: " << run << " trigger: " << fTrigger << " N_events: "<<Events<<endl;

  TPMERegexp r("_\\w+");
  TString Energy;   Energy   = QAPATH + "MapEnergy"  + fTrigger(r) + ".pdf";
  TString Energy2;  Energy2  = QAPATH + "MapEnergy"  + fTrigger(r) + ".png";
  TString Entries;  Entries  = QAPATH + "MapEntries" + fTrigger(r) + ".pdf";
  TString Entries2; Entries2 = QAPATH + "MapEntries" + fTrigger(r) + ".png";

  TCanvas *c1 = new TCanvas("Energymap","Energy Map",600,600); 
  c1->SetFillColor(0);
  c1->SetGrid();
  c1->SetRightMargin(0.14); 
  TString title = "run ";
  title += run ;
  if(fTrigger.Contains("EMC")) { title += " EMC ";} else {title += " MB ";}
  title += " Summed energy map";
  hEnergyMapReal->SetTitle(title);
  hEnergyMapReal->DrawCopy("colz");  
  if(SavePlots==2) c1->SaveAs(Energy);
  if(SavePlots) c1->SaveAs(Energy2);
  c1->Write();
  delete c1; 


  TCanvas *c2 = new TCanvas("Occupancy","Occupancy Map",600,600); 
  c2->SetFillColor(0);
  c2->SetGrid();
  c2->SetRightMargin(0.14);  
  TString title2 = "run ";
  title2 += run ;
  if(fTrigger.Contains("EMC")) { title2 += " EMC ";} else { title2 += " MB ";}
  title2 += " Occupancy map";
  hOccupancyMapReal->SetTitle(title2);
  hOccupancyMapReal->DrawCopy("colz");  
  if(SavePlots==2) c2->SaveAs(Entries);
  if(SavePlots) c2->SaveAs(Entries2);
  c2->Write();
  delete c2; 

  if (outputList) {outputList->Delete();} 

  delete hEnergyMapReal;
  delete hOccupancyMapReal;

  return 0; 
}

//-----------------------------------------------------------------------------------------------------------------------
Int_t DrawRun(const Long_t  run, TString period, TString pass, TString fTrigger, TFile *f,TFile *fout, Int_t SavePlots, Int_t nSM, Bool_t kFilter)
{
 
  TString direct;
  if(!fTrigger.Contains("QA")) {
    direct = "CaloQA_";
  }
  direct += fTrigger;

  f->cd(direct);
  if(!direct) { Error(__FUNCTION__,Form("No input directory %s",direct.Data())); return -1;}
  TList *outputList = (TList*)gDirectory->Get(direct);
  if(!outputList){ Error(__FUNCTION__,Form("No input list! %s",direct.Data())); return -2;}
  outputList->SetOwner();
  if (kFilter)
  {
     fout->mkdir(Form("%s/%s/%ld/%s",period.Data(),pass.Data(),run,fTrigger.Data()));
     fout->cd();
     fout->Cd(Form("%s/%s/%ld/%s",period.Data(),pass.Data(),run,fTrigger.Data()));
     outputList->Write();
  }
  fout->cd();
  fout->Cd(Form("%s/%s/%ld/%s/%s",period.Data(),pass.Data(),run,"RunLevelQA",fTrigger.Data()));

 
  set_plot_style();
  gStyle->SetPalette(1);
  TH1::AddDirectory(kFALSE);
  TString outfilename;
  TString outfilename2;
  const char* legend="";
  TPMERegexp r("_\\w+");

  if (fTrigger.Contains("EMC")){ legend = Form(" Run %d EMC ",(int)run);} 
  else legend = Form(" Run %d MB ",(int)run);
 
  TH1F* hNEvents =(TH1F *)outputList->FindObject("hNEvents");
  if(!hNEvents){ Error(__FUNCTION__,Form("hNEvent histogram not found for trigger %s ",fTrigger.Data())); return -3;}
  Int_t Events = (Int_t)hNEvents->GetEntries();
  if(Events==0){ Error(__FUNCTION__,Form("No event in trigger %s",fTrigger.Data())); return -4 ;}

  TCanvas* c1 = new TCanvas("TimeVsE", "Cluster Time Vs Energy", 600, 600);
  c1->SetLogz();
  c1->SetFillColor(0);
  c1->SetBorderSize(0);
  c1->SetFrameBorderMode(0);     

  TH2F*  hClusterTimeEnergy =(TH2F *)outputList->FindObject("EMCAL_hClusterTimeEnergy");
  if(!hClusterTimeEnergy) { Error(__FUNCTION__,Form("EMCAL_hClusterTimeEnergy: Histogram for trigger %s not found!",fTrigger.Data())); return -5;}
  FormatRunHisto(hClusterTimeEnergy,Form("Time Vs Energy%s",legend),"EMCAL ToF(ns)");

  AutoZoom(hClusterTimeEnergy,"maxx")->DrawCopy("colz");
  outfilename =  QAPATH + "TimeRun" + fTrigger(r) + ".pdf" ;
  outfilename2 = QAPATH + "TimeRun" + fTrigger(r) + ".png" ;

  if(SavePlots==2) c1->SaveAs(outfilename);
  if(SavePlots) c1->SaveAs(outfilename2);
  c1->Write();
  delete c1; 

  TCanvas  * c2 = new TCanvas("ClusterVsTrack ","Correlation calo Mult Vs Track Multiplicity", 600, 600);
  c2->SetLogz();
  c2->SetFillColor(0);
  c2->SetBorderSize(0);
  c2->SetFrameBorderMode(0);     

  TH2F* hClusterVsTrack =(TH2F *)outputList->FindObject("EMCAL_hCaloTrackMNClusters");
  FormatRunHisto(hClusterVsTrack,Form("N cluster Vs N track%s",legend));

  AutoZoom(hClusterVsTrack,"maxx,maxy",1)->DrawCopy("colz");
  outfilename = QAPATH + "CaloTrackMult" + fTrigger(r) + ".pdf";
  outfilename2 = QAPATH + "CaloTrackMult" + fTrigger(r) + ".png";
  if(SavePlots==2) c2->SaveAs(outfilename);
  if(SavePlots) c2->SaveAs(outfilename2);
  c2->Write();
  delete c2; 

  TCanvas* c3 = new TCanvas("ClusterEVsTrack ","Correlation E calo Vs Track Multiplicity", 600, 600);
  c3->SetLogz();
  c3->SetFillColor(0);
  c3->SetBorderSize(0);
  c3->SetFrameBorderMode(0);     

  TH2F* hClusterEVsTrack =(TH2F*)outputList->FindObject("EMCAL_hCaloTrackMEClusters");
  FormatRunHisto(hClusterEVsTrack,Form("Sum E cluster Vs N track%s",legend));

  AutoZoom(hClusterEVsTrack,"maxx,maxy",1)->DrawCopy("colz");
  outfilename =  QAPATH + "ETrackMult" + fTrigger(r) + ".pdf";
  outfilename2 = QAPATH + "ETrackMult" + fTrigger(r) + ".png";
  if(SavePlots==2) c3->SaveAs(outfilename);
  if(SavePlots) c3->SaveAs(outfilename2);
  c3->Write();
  delete c3; 
 
  TCanvas* c4 = new TCanvas("ClusterEVsV0 ","Correlation E calo Vs V0 signal", 600, 600);
  c4->SetLogz();
  c4->SetFillColor(0);
  c4->SetBorderSize(0);
  c4->SetFrameBorderMode(0);     

  TH2F* hClusterEVsV0S =(TH2F*)outputList->FindObject("EMCAL_hCaloV0SEClusters");
  FormatRunHisto(hClusterEVsV0S,Form("Sum E cluster Vs V0 signal%s",legend));

  AutoZoom(hClusterEVsV0S,"maxx,maxy",1)->DrawCopy("colz");
  outfilename = QAPATH +"EVsV0s" + fTrigger(r) + ".pdf";
  outfilename2 = QAPATH +"EVsV0s" + fTrigger(r) + ".png";
  if(SavePlots==2) c4->SaveAs(outfilename);
  if(SavePlots) c4->SaveAs(outfilename2);
  c4->Write();
  delete c4;

  TCanvas* c5 = new TCanvas("CellsperCluster","Nb of cells per cluster for each SM", 600, 600);
  c5->SetLogz();
  c5->SetFillColor(0);
  c5->SetBorderSize(0);
  c5->SetFrameBorderMode(0);
  Bool_t mod3=0; if (nSM%3) mod3=1;  
  c5->Divide(3,(nSM/3)+mod3);

  for (int ism = 0; ism < nSM; ism++)
    {
      c5->cd(ism+1);
      gPad->SetLogz();
      if(TString(Form("Nb of cells per cluster%s Mod %d",legend,ism)).Length() > 60) { Error(__FUNCTION__,"Title too long!"); return -6;}
      AutoZoom(HistoPerMod((TH2F*)outputList->FindObject(Form("EMCAL_hNCellsPerCluster_Mod%i",ism)),Form("Nb of cells per cluster%s Mod %d",legend,ism)),"all",1)->DrawCopy("colz");
    }
  
  outfilename =  QAPATH + "CellsperClusterSM" + fTrigger(r) + ".pdf";
  outfilename2 = QAPATH + "CellsperClusterSM" + fTrigger(r) + ".png";
  if(SavePlots==2) c5->SaveAs(outfilename);
  if(SavePlots) c5->SaveAs(outfilename2);
  c5->Write();
  delete c5;

  if (outputList) outputList->Delete();

  return 0;
}

//----------------------------------------------------------------------------------------------------------------------------------
Int_t TrendingEMCALTree(Long_t RunId,TString fCalorimeter,TString system,TString period , TString pass,int n ,TList* TriggersList,TFile* f,TFile *fout, Int_t SavePlots)
{
  
  TString fTrigger="";
  TString aCalorimeter; 
  if (n<=12) {aCalorimeter = fCalorimeter;} else  {aCalorimeter = TString("EMCAL_and_DCAL");}
  TDatime now;

  Double_t Nevent=0 ;
  Double_t xe=0.5;

  Double_t CellMean=0;
  Double_t CellRMS=0;
  Double_t ClusterMean=0;
  Double_t ClusterRMS=0;
  Double_t EtotalMean=0;
  Double_t EtotalRMS=0;

  Double_t CellPerClusterMean=0; //
  Double_t CellPerClusterRMS=0; //

  Double_t mPDG = 134.9766;
  Double_t Npi0=0;
  Double_t Npi0Err=0;
  Double_t MeanPos=0;
  Double_t MeanPosErr=0;
  Double_t Width=0;
  Double_t WidthErr=0;
  Double_t Chi2NdfPi0=0;
  Double_t Ngg=0;
  Double_t NggErr=0;
  Double_t Signif=0; // !S/(S+B)
  Double_t SignifErr=0; // !S/(S+B)

  TFile* ftree = new TFile(Form("%s/trending.root",QAPATH.Data()),"RECREATE");
    
  TTree *tree = new TTree("trending","Trending QA Tree");
  tree->Branch("fDate",&now);
  tree->Branch("fCalorimeter",&aCalorimeter); 
  tree->Branch("system",&system); 
  tree->Branch("period",&period);
  tree->Branch("pass",&pass); 
  tree->Branch("fTrigger",&fTrigger);
  tree->Branch("run",&RunId,"run/I");
  tree->Branch("xe",&xe,"xe/D");

  tree->Branch("Nevent",&Nevent,"Nevent/D");
  tree->Branch("CellMean",&CellMean,"CellMean/D");
  tree->Branch("CellRMS",&CellRMS,"CellRMS/D");	
  tree->Branch("ClusterMean",&ClusterMean,"ClusterMean/D");
  tree->Branch("ClusterRMS",&ClusterRMS,"ClusterRMS/D");
  tree->Branch("EtotalMean",&EtotalMean,"EtotalMean/D");
  tree->Branch("EtotalRMS",&EtotalRMS,"EtotalRMS/D");

  tree->Branch("CellPerClusterMean",&CellPerClusterMean,"CellPerClusterMean/D"); //
  tree->Branch("CellPerClusterRMS",&CellPerClusterRMS,"CellPerClusterRMS/D");  //
  
  tree->Branch("Npi0",&Npi0,"Npi0/D");
  tree->Branch("Npi0Err",&Npi0Err,"Npi0Err/D");
  tree->Branch("MeanPos",&MeanPos,"MeanPos/D");
  tree->Branch("MeanPosErr",&MeanPosErr,"MeanPosErr/D");
  tree->Branch("Width",&Width,"Width/D");
  tree->Branch("WidthErr",&WidthErr,"WidthErr/D");
  tree->Branch("Chi2NdfPi0",&Chi2NdfPi0,"Chi2NdfPi0/D");
  tree->Branch("Ngg",&Ngg,"Ngg/D");
  tree->Branch("NggErr",&NggErr,"NggErr/D");
  tree->Branch("Signif",&Signif,"Signif/D");
  tree->Branch("SignifErr",&SignifErr,"SignifErr/D");
  
  tree->Branch("nSM",&n,"nSM/I");

  int nMax = 22;   
  Double_t CellMeanSM[nMax];
  Double_t CellRMSSM[nMax];
  Double_t ClusterMeanSM[nMax];
  Double_t ClusterRMSSM[nMax];
  Double_t EtotalMeanSM[nMax]; //mean total energy deposited per event
  Double_t EtotalRMSSM[nMax];
  Double_t CellPerClusterMeanSM[nMax];
  Double_t CellPerClusterRMSSM[nMax];
  Double_t ECell1MeanSM[nMax]; //total energy deposited per event without 1 cell clusters
  Double_t ECell1RMSSM[nMax];

  Double_t MeanPosSM[nMax];
  Double_t MeanPosErrSM[nMax];
  Double_t WidthSM[nMax];
  Double_t WidthErrSM[nMax]; 
  Double_t Npi0SM[nMax];
  Double_t Npi0ErrSM[nMax];

  tree->Branch("CellMeanSM",CellMeanSM,TString::Format("CellMeanSM[%i]/D",nMax));
  tree->Branch("CellRMSSM",CellRMSSM,TString::Format("CellRMSSM[%i]/D",nMax));
  tree->Branch("ClusterMeanSM",ClusterMeanSM,TString::Format("ClusterMeanSM[%i]/D",nMax));
  tree->Branch("ClusterRMSSM",ClusterRMSSM,TString::Format("ClusterRMSSM[%i]/D",nMax));
  tree->Branch("EtotalMeanSM",EtotalMeanSM,TString::Format("EtotalMeanSM[%i]/D",nMax));
  tree->Branch("EtotalRMSSM",EtotalRMSSM,TString::Format("EtotalRMSSM[%i]/D",nMax));
  tree->Branch("CellPerClusterMeanSM",CellPerClusterMeanSM,TString::Format("CellPerClusterMeanSM[%i]/D",nMax));
  tree->Branch("CellPerClusterRMSSM",CellPerClusterRMSSM,TString::Format("CellPerClusterRMSSM[%i]/D",nMax));
  tree->Branch("ECell1MeanSM",ECell1MeanSM,TString::Format("ECell1MeanSM[%i]/D",nMax));
  tree->Branch("ECell1RMSSM",ECell1RMSSM,TString::Format("ECell1RMSSM[%i]/D",nMax));

  tree->Branch("MeanPosSM",MeanPosSM,TString::Format("MeanPosSM[%i]/D",nMax));
  tree->Branch("MeanPosErrSM",MeanPosErrSM,TString::Format("MeanPosErrSM[%i]/D",nMax));
  tree->Branch("WidthSM",WidthSM,TString::Format("WidthSM[%i]/D",nMax));
  tree->Branch("WidthErrSM",WidthErrSM,TString::Format("WidthErrSM[%i]/D",nMax));
  tree->Branch("Npi0SM",Npi0SM,TString::Format("Npi0SM[%i]/D",nMax));
  tree->Branch("Npi0ErrSM",Npi0ErrSM,TString::Format("Npi0ErrSM[%i]/D",nMax));

  TF1* fitMass = new TF1("fitMass",pi0massP2,100,250,6);
  fitMass->SetParName(0,"A");
  fitMass->SetParName(1,"m_{0}");
  fitMass->SetParName(2,"sigma");
  fitMass->SetParName(3,"a_{0}");
  fitMass->SetParName(4,"a_{1}");
  fitMass->SetParName(5,"a_{2}");
  fitMass->SetParLimits(0,  1.e-5,1.e5);
  fitMass->SetParLimits(1, 0.11, 0.16); //
  fitMass->SetParLimits(2,  0.001,0.06);
  
  TList* outputList;

  TH1F* fhNEvents;
  TH1F* fhE;
  TH1F* fhNClusters = 0x0;
  TH1F* fhNCells = 0x0;
  
  TH1F* NCells[n];
  TH1F* NClusters[n];
  TH2F* NCellsPerCluster[n];
  TH1F* E[n];

  TH2F* fhIM ;
  TH1F* fhMgg;
  TH2F* IM[n];
  TH1F* MggSM[n];

  TPMERegexp r("_\\w+");
  TIter next(TriggersList);
  int ret = 0; 
  while (TObject *obj = next())
    {
      fTrigger= TString(obj->GetName());
      TString namefile = QAPATH + period + "_" +  pass + fTrigger(r).Data() + "_" + RunId + "_data.txt";
      ofstream QAData(namefile, ios::app); // write checks at the end
  
      Npi0=0;
      Npi0Err=0;
      MeanPos=0;
      MeanPosErr=0;
      Width=0;
      WidthErr=0;
      Chi2NdfPi0=0;
      Ngg=0;
      NggErr=0;
      Signif=0; 
      SignifErr=0; 

      memset (CellMeanSM, 0, sizeof (Double_t) * nMax);
      memset (CellRMSSM, 0, sizeof (Double_t) *  nMax);
      memset (ClusterMeanSM, 0, sizeof (Double_t) * nMax);
      memset (ClusterRMSSM, 0, sizeof (Double_t) * nMax);
      memset (EtotalMeanSM, 0, sizeof (Double_t) * nMax);
      memset (EtotalRMSSM, 0, sizeof (Double_t) * nMax);
      memset (CellPerClusterMeanSM, 0, sizeof (Double_t) * nMax);
      memset (CellPerClusterRMSSM, 0, sizeof (Double_t) * nMax);
      memset (ECell1MeanSM, 0, sizeof (Double_t) * nMax);
      memset (ECell1RMSSM, 0, sizeof (Double_t) * nMax);

      memset (MeanPosSM, 0, sizeof (Double_t) * nMax);
      memset (MeanPosErrSM, 0, sizeof (Double_t) * nMax);
      memset (WidthSM, 0, sizeof (Double_t) * nMax);
      memset (WidthErrSM, 0, sizeof (Double_t) * nMax);
      memset (Npi0SM, 0, sizeof (Double_t) * nMax);
      memset (Npi0ErrSM, 0, sizeof (Double_t) * nMax);
 
      TString dirname;
      if(!fTrigger.Contains("QA")) {
	dirname = "CaloQA_";
      }  
      dirname += fTrigger;
  
      Bool_t dirok = f->cd(dirname);
      if(!dirok) { Error(__FUNCTION__,Form("No input directory %s",dirname.Data())); tree->Fill(); ftree->cd(); tree->Write(); ret= -1; continue;}
      outputList = (TList*)gDirectory->Get(dirname);
      if(!outputList){ Error(__FUNCTION__,Form("No input list! %s",dirname.Data())); tree->Fill();  ftree->cd(); tree->Write(); ret=-2; continue;;} 
      outputList->SetOwner();

      // number of events
      fhNEvents =(TH1F *)outputList->FindObject("hNEvents");
      if(!fhNEvents){ Error(__FUNCTION__,Form("NEvent histogram not found for trigger %s",fTrigger.Data())); tree->Fill();  ftree->cd(); tree->Write();  ret=-3; continue;}
      Nevent=fhNEvents->GetEntries();
      if(Nevent==0) {Error(__FUNCTION__,Form("No event in trigger %s",fTrigger.Data())); tree->Fill();  ftree->cd(); tree->Write(); ret=-4; continue;} 
      if(Nevent<20) {Error(__FUNCTION__,Form("Less than 20 events in trigger %s",fTrigger.Data())); tree->Fill();  ftree->cd(); tree->Write(); ret=-5; continue;}
    
      // first do clusters trending
      fhE = (TH1F *)outputList->FindObject(fCalorimeter+"_hE");
      Double_t energy = 0. ;
   
      for(Int_t ibin = fhE->FindBin(0.6) ; ibin <fhE->FindBin(50.) ; ibin++){ 
	energy+=fhE->GetBinCenter(ibin)*fhE->GetBinContent(ibin);
      }
      if(fhE->Integral(fhE->FindBin(0.6), fhE->FindBin(50.))==0){Error(__FUNCTION__,Form("Not enough events")); tree->Fill(); ftree->cd(); tree->Write(); ret=-6; continue;}
      EtotalMean=energy/fhE->Integral(fhE->FindBin(0.6), fhE->FindBin(50.)) ;
      EtotalRMS=fhE->GetMeanError();
  
      TString nameNCell = Form("%s_hNCells_Mod",fCalorimeter.Data());
      TString nameNCluster = Form("%s_hNClusters_Mod",fCalorimeter.Data());
      TString nameE = Form("%s_hE_Mod",fCalorimeter.Data());
      TH2F* hNCellsMod= (TH2F*)outputList->FindObject(nameNCell.Data()); 
      TH2F* hNClusterMod=(TH2F*)outputList->FindObject(nameNCluster.Data());
      TH2F* hEMod=(TH2F*)outputList->FindObject(nameE.Data());

      if (!hNCellsMod || !hNClusterMod || !hEMod) {Error(__FUNCTION__,"A requiered histogram was not found (the imput QAresult.root might be too old)!"); tree->Fill(); ftree->cd(); tree->Write(); ret=-7; continue;}
    
      TCanvas* c1 = new TCanvas("Pi0InvMassSM","Pi0 Invariant Mass for each SM", 600, 600);
      c1->SetFillColor(0);
      c1->SetBorderSize(0);
      c1->SetFrameBorderMode(0);
      Bool_t mod3=0; if (n%3) mod3=1;  
      c1->Divide(3,n/3+mod3);

      //per sm trending 
      TString nameNCellPerCluster;
      for(Int_t ism = 0 ; ism < n ; ism++){
	cout << "#########################"<< endl;
	cout      << " Super Module " << ism << " Run " << RunId << endl;
        // first do clusters trending
        nameNCellPerCluster = Form("%s_hNCellsPerCluster_Mod%d",fCalorimeter.Data(),ism);
        NCellsPerCluster[ism] = (TH2F*)outputList->FindObject(nameNCellPerCluster.Data());
 if(!  (TH2F*)outputList->FindObject(nameNCellPerCluster.Data()) ) { Error(__FUNCTION__,Form("NCellsPerCluster histogram not found for super module %i",ism));ret=-8; continue;}
   NCellsPerCluster[ism] = (TH2F*)outputList->FindObject(nameNCellPerCluster.Data());

	NCells[ism] = (TH1F*)hNCellsMod->ProjectionX(Form("NCells%d",ism),ism+1,ism+2,"");
	NClusters[ism] = (TH1F*)hNClusterMod->ProjectionX(Form("NClusters%d",ism),ism+1,ism+2,"");
	E[ism] = (TH1F*)hEMod->ProjectionX(Form("E%d",ism),ism+1,ism+2,"");
	CellMeanSM[ism]=NCells[ism]->GetMean();
	CellRMSSM[ism]=NCells[ism]->GetMeanError();
	ClusterMeanSM[ism]=NClusters[ism]->GetMean();
	ClusterRMSSM[ism]=NClusters[ism]->GetMeanError();
	CellPerClusterMeanSM[ism]=NCellsPerCluster[ism]->GetMean(2);
	CellPerClusterRMSSM[ism]=NCellsPerCluster[ism]->GetMeanError(2);

	ECell1MeanSM[ism] =NCellsPerCluster[ism]->ProjectionX("",2,50,"")->Integral(5,50)/(Nevent);
	ECell1RMSSM[ism] =NCellsPerCluster[ism]->ProjectionX("",2,50,"")->GetMeanError();
	Double_t energySM = 0. ;
	for(Int_t ibin = E[ism]->FindBin(0.6) ; ibin <E[ism]->FindBin(50.) ; ibin++){ 
	  energySM+=E[ism]->GetBinCenter(ibin)*(E[ism]->GetBinContent(ibin));
	}
	if(E[ism]->Integral(E[ism]->FindBin(0.6),E[ism]->FindBin(50.))==0){Error(__FUNCTION__,Form("Energy: Not enough events/SM")); continue;}
	EtotalMeanSM[ism]=energySM/(E[ism]->Integral(E[ism]->FindBin(0.6),E[ism]->FindBin(50.)));
      
	EtotalRMSSM[ism]=E[ism]->GetMeanError();

	if(ism==0) {
	  fhNCells = (TH1F*)NCells[ism]->Clone("NCells");
	  fhNClusters = (TH1F*)NClusters[ism]->Clone("NClusters");  
	}
	else {
	  fhNCells->Add(NCells[ism],1);
	  fhNClusters->Add(NClusters[ism],1);
	}

	//Pi0
	c1->cd(ism+1);
	TString namePair = Form("%s_hIM_Mod%d",fCalorimeter.Data(),ism);
	IM[ism] = (TH2F*)outputList->FindObject(namePair.Data());
	IM[ism]->Sumw2();

	TString projname = Form("SM_%d",ism);
	MggSM[ism] = (TH1F *)IM[ism]->ProjectionY(projname.Data(), 2, 150, "") ;


	if(MggSM[ism]->GetEntries()>100) {
	  fitMass->SetParameter(0, MggSM[ism]->GetBinContent(MggSM[ism]->GetMaximumBin()));
          fitMass->SetParameter(1, mPDG); //
	  fitMass->SetParameter(2, 15.);  //
	  fitMass->SetParameter(3,0.); 
	  fitMass->SetParameter(4,MggSM[ism]->GetBinContent(MggSM[ism]->FindBin(0.11)));
	  fitMass->SetParameter(5,MggSM[ism]->GetBinContent(MggSM[ism]->FindBin(0.20)));

	  if(MggSM[ism]->GetEntries()<1000){ MggSM[ism]->Rebin(4);} else {MggSM[ism]->Rebin();}
	  MggSM[ism]->Fit("fitMass", "WL R +","",0.05, 0.30);
	  MggSM[ism]->SetTitle(Form("Pi0 Mass for super module %i",ism));
	  MggSM[ism]->SetTitleSize(0.1);
	  MggSM[ism]->SetXTitle("Pi0 Mass");
	  MggSM[ism]->SetYTitle("Nb of entries");
	  MggSM[ism]->GetXaxis()->SetLabelSize(0.05);
	  MggSM[ism]->GetXaxis()->SetTitleSize(0.07);
	  MggSM[ism]->GetXaxis()->SetTitleOffset(0.68);
	  MggSM[ism]->GetYaxis()->SetLabelSize(0.05);
	  MggSM[ism]->GetYaxis()->SetTitleSize(0.06);
	  MggSM[ism]->GetYaxis()->SetTitleOffset(0.78);
	 
	  MeanPosSM[ism] = MggSM[ism]->GetFunction("fitMass")->GetParameter(1)*1000;
	  MeanPosErrSM[ism] = MggSM[ism]->GetFunction("fitMass")->GetParError(1)*1000;
	  WidthSM[ism] = MggSM[ism]->GetFunction("fitMass")->GetParameter(2)*1000;
	  WidthErrSM[ism] = MggSM[ism]->GetFunction("fitMass")->GetParError(2)*1000;
	  Npi0SM[ism] = MggSM[ism]->GetFunction("fitMass")->GetParameter(0)*(MggSM[ism]->GetFunction("fitMass")->GetParameter(2))*TMath::Sqrt(2*TMath::Pi())/(Nevent*MggSM[ism]->GetBinWidth(1));
	  Npi0ErrSM[ism] = TMath::Sqrt((MggSM[ism]->GetFunction("fitMass")->GetParError(0)/MggSM[ism]->GetFunction("fitMass")->GetParameter(0))*(MggSM[ism]->GetFunction("fitMass")->GetParError(0)/MggSM[ism]->GetFunction("fitMass")->GetParameter(0))
				       +(MggSM[ism]->GetFunction("fitMass")->GetParError(2)/MggSM[ism]->GetFunction("fitMass")->GetParameter(2))*(MggSM[ism]->GetFunction("fitMass")->GetParError(2)/MggSM[ism]->GetFunction("fitMass")->GetParameter(2)));
	  Npi0ErrSM[ism] = 0.; //

	}// end if enough events for Pi0 fit and trending
	else { Info(__FUNCTION__,Form("Not enough events for Pi0 fit and trending for super module %i",ism));} ;   
      } //per SM loop

      // Now Pi0 global trending
      TCanvas* c2 = new TCanvas("Pi0InvMass","Pi0 Invariant Mass", 600, 600);
      c2->SetFillColor(0);
      c2->SetBorderSize(0);
      c2->SetFrameBorderMode(0);
    
      fhIM = (TH2F *)outputList->FindObject(fCalorimeter+"_hIM");
      fhIM->Sumw2();
      fhMgg = (TH1F *)fhIM->ProjectionY("Mgg", 2, 150, "") ;
      if(fhMgg->GetEntries()==0) {Error(__FUNCTION__,"The Pi0 histogram is empty !");  tree->Fill(); ret=-8; continue;} 
      fitMass->SetParameter(0, 4500);
      fitMass->SetParameter(1, mPDG);
      fitMass->SetParameter(2, 0.01);
      fitMass->SetParameter(3,0.);
      fitMass->SetParameter(4,fhMgg->GetBinContent(fhMgg->FindBin(0.11)));
      fitMass->SetParameter(5,fhMgg->GetBinContent(fhMgg->FindBin(0.20)));
   
      if(fhMgg->GetEntries()<5000){
	fhMgg->Rebin(4);}
      else   fhMgg->Rebin();

      fhMgg->Fit("fitMass", "L R +", "", 0.05, 0.20);
  
      fhMgg->SetTitle("Pi0 Mass");
      fhMgg->SetTitleSize(0.1);
      fhMgg->SetXTitle("Pi0 Mass");
      fhMgg->SetYTitle("Nb of entries");      
      fhMgg->GetXaxis()->SetLabelSize(0.03);
      fhMgg->GetXaxis()->SetTitleSize(0.03);
      fhMgg->GetXaxis()->SetTitleOffset(1.3);
      fhMgg->GetYaxis()->SetLabelSize(0.03);
      fhMgg->GetYaxis()->SetTitleSize(0.03);
      fhMgg->GetYaxis()->SetTitleOffset(1.3);
    
      MeanPos = fhMgg->GetFunction("fitMass")->GetParameter(1)*1000;
      MeanPosErr = fhMgg->GetFunction("fitMass")->GetParError(1)*1000;
      Width = fhMgg->GetFunction("fitMass")->GetParameter(2)*1000;
      WidthErr = fhMgg->GetFunction("fitMass")->GetParError(2)*1000;
      Chi2NdfPi0 = fhMgg->GetFunction("fitMass")->GetChisquare()/fhMgg->GetFunction("fitMass")->GetNDF(); 
      Npi0 = fhMgg->GetFunction("fitMass")->GetParameter(0)*fhMgg->GetFunction("fitMass")->GetParameter(2)*TMath::Sqrt(2*TMath::Pi())/(Nevent*fhMgg->GetBinWidth(10));
      Npi0Err = TMath::Sqrt((fhMgg->GetFunction("fitMass")->GetParError(0)/fhMgg->GetFunction("fitMass")->GetParameter(0))*(fhMgg->GetFunction("fitMass")->GetParError(0)/fhMgg->GetFunction("fitMass")->GetParameter(0))+(WidthErr/Width)*(WidthErr/Width));
      Npi0Err = 0.; //
      Ngg = fhMgg->GetFunction("fitMass")->Integral(0.11, 0.16)/(Nevent*fhMgg->GetBinWidth(10));
      NggErr = fhMgg->GetFunction("fitMass")->IntegralError(0.11, 0.16)/(fhMgg->Integral()*fhMgg->GetBinWidth(10));
      Signif = Npi0/Ngg;
      SignifErr = TMath::Sqrt((Npi0Err/Npi0*(Npi0Err/Npi0)+(NggErr/Ngg*(NggErr/Ngg))));
      SignifErr = Signif*SignifErr;
    
      cout<<"******************"<<endl;
      //end of global trending

      ClusterMean=fhNClusters->GetMean();
      ClusterRMS=fhNClusters->GetMeanError();  
      CellMean=fhNCells->GetMean();
      CellRMS=fhNCells->GetMeanError();
      tree->Fill();

      TString outfilename = QAPATH +  "Pi0InvMass" + fTrigger(r) + ".pdf";
      TString outfilename2 = QAPATH + "Pi0InvMass" + fTrigger(r) + ".png";
      if(SavePlots==2) c2->SaveAs(outfilename);
      if(SavePlots) c2->SaveAs(outfilename2);

      outfilename = QAPATH + "Pi0InvMassSM" + fTrigger(r) + ".pdf";
      outfilename2 = QAPATH + "Pi0InvMassSM" + fTrigger(r) + ".png";
      if(SavePlots==2) c1->SaveAs(outfilename);
      if(SavePlots) c1->SaveAs(outfilename2);

      fout->cd();
      fout->Cd(Form("%s/%s/%ld/%s/%s",period.Data(),pass.Data(),RunId,"RunLevelQA",fTrigger.Data()));
      c2->Write();
      c1->Write();
      delete c1;
      delete c2;
      if (outputList) outputList->Delete() ;
    
      QAData  << RunId<<"    "<< Nevent        
	      <<"\n"; 
    
      QAData.close();

    }    
  
  ftree->cd(); 
  tree->Write();
  ftree->Close();

  return ret;

}

//-------------------------------------------------------------------------
TH2F* FormatRunHisto(TH2F* aHisto,const char* title,const char* YTitle)
{

  if(!aHisto) {Error(__FUNCTION__,Form("The histogram with title \"%s\" was not found!",title)); return new TH2F();}
  aHisto->SetStats(kFALSE);
  aHisto->SetTitle(title);
  aHisto->SetStats(kFALSE);
  aHisto->SetYTitle(YTitle);
  aHisto->GetYaxis()->SetTitleOffset(1.2);
  aHisto->GetYaxis()->SetLabelSize(0.03);
  aHisto->GetZaxis()->SetLabelSize(0.02);

  return aHisto;

}

//--------------------------------------------------------------------------------------------------------------
TH2F* HistoPerMod(TH2F* hTmpPerMod,const char* title)
{

  if(!hTmpPerMod) {Error(__FUNCTION__,Form("The histogram with title \"%s\" was not found!",title)); return new TH2F();}
  hTmpPerMod->SetStats(kFALSE);
  hTmpPerMod->SetTitle(title);
  hTmpPerMod->SetTitleSize(0.1);
  hTmpPerMod->GetXaxis()->SetTitleOffset(1.1);
  hTmpPerMod->GetXaxis()->SetTitleSize(0.05);
  hTmpPerMod->GetXaxis()->SetLabelSize(0.06);
  hTmpPerMod->GetYaxis()->SetTitleOffset(1.1);
  hTmpPerMod->GetYaxis()->SetTitleSize(0.05);
  hTmpPerMod->GetYaxis()->SetLabelSize(0.06);
  hTmpPerMod->GetZaxis()->SetLabelSize(0.04);

  return hTmpPerMod;

}

//---------------------------------------------------------------------------------------------------
TH2F* AutoZoom(TH2F* H,Option_t* aType, Int_t EntryMin)
{

  Int_t shiftX = (Int_t)(H->GetNbinsX()/30.);
  Int_t shiftY = (Int_t)(H->GetNbinsY()/30.);

  TString opt = aType;
  opt.ToLower();

  int minX = 0;
  int maxX = H->GetNbinsX();
  int New_minX = minX;
  int New_maxX = maxX;

  int minY = 0;
  int maxY = H->GetNbinsY();
  int New_minY = minY;
  int New_maxY = maxY;

  if (opt.Contains("all")) opt = TString("minx,maxx,miny,maxy");

  if (opt.Contains("maxx"))
    {

      for  (New_maxX = maxX;New_maxX >=minX; New_maxX--)
        {  Stat_t c = 0;
	  for  (int i_y = maxY; i_y >= minY;i_y--)
	    { c = H->GetBinContent(New_maxX,i_y);  if (c>EntryMin) break;}
	  if (c>EntryMin) break;
        }
    }
  
  if (opt.Contains("maxy"))
    {

      for  (New_maxY = maxY;New_maxY >=minY;New_maxY--)
        {  Stat_t c = 0;
	  for  (int i_x=maxX; i_x>=minX;i_x--)
	    { c = H->GetBinContent(i_x, New_maxY );  if (c>EntryMin) break;}
	  if (c>EntryMin) break;
        }

    }

  if (opt.Contains("minx"))
    {

      for  (New_minX = minX;New_minX <=maxX; New_minX++)
        {  Stat_t c = 0;
	  for  (int i_y = minY; i_y <= maxY;i_y++)
	    { c = H->GetBinContent(New_minX,i_y);  if (c>EntryMin) break;}
	  if (c>EntryMin) break;
        }
    }

  if (opt.Contains("miny"))
    {
      for  (New_minY = minY;New_minY <=maxY;New_minY++)
        {  Stat_t c = 0;
	  for  (int i_x=minX; i_x<=maxX;i_x++)
	    { c = H->GetBinContent(i_x, New_minY );  if (c>EntryMin) break;}
	  if (c>EntryMin) break;
        }
    }
 
 if (New_maxX!=-1 && New_maxY!=-1) H->GetXaxis()->SetRange(New_minX - shiftX  , New_maxX + shiftX);
 if (New_maxX!=-1 && New_maxY!=-1) H->GetYaxis()->SetRange(New_minY - shiftY  , New_maxY + shiftY);

  return H;

}

//----------------------------------------------------------------------------------------------------
int FindNumberOfSM(TFile* f, TString fTrigger, TString period) 
{

  TString direct;
  if(!fTrigger.Contains("QA")) {
    direct = "CaloQA_";
  }
  direct += fTrigger; 

  Int_t nSMt=-1;
  Int_t year = 2000 + TString(period(3,2)).Atoi();
  if ( year == 2010 ) { nSMt=6; }
  else if ( year == 2011 || year == 2012 ) { nSMt=10; }
  else if ( year == 2013 || year == 2014 ) { nSMt=12; }
  else { nSMt=20; }

  TList *outputList;	
  Bool_t dirok = f->cd(direct);
  if (!dirok) { Error(__FUNCTION__,Form("No input directory %s, the number SMs will be returned based on the year!",direct.Data()));} 
  else { outputList = (TList*)gDirectory->Get(direct);}
  if(!outputList) { Error(__FUNCTION__,"No input list, the number SMs will be returned based on the year! ");}
  else {
    outputList->SetOwner();
    TH2F* hNSM =(TH2F *)outputList->FindObject("EMCAL_hE_Mod"); 
    if (!hNSM || (!hNSM->GetEntries())) { Error(__FUNCTION__,"hNSM Histogram not found or it is empty, the number SMs will be returned based on the year!");}
    else {
      nSMt = hNSM->GetYaxis()->GetBinUpEdge(hNSM->FindLastBinAbove(0,2)); 
    }
  }
  if (outputList) {outputList->Delete();} 

  return nSMt;

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