ROOT logo
#ifndef __CINT__
#include "TFile.h"
#include "TTree.h"
#include "TH1D.h"
#include "TCanvas.h"
#include "TStyle.h"
#include "AliDAQ.h"
#endif
#include "map"
using namespace std;
// TODO read number of bits from AliVEvent?
#define NBITS 29
#define NMAXCLASSES 100

TString bitNames[NBITS] = {
"kMB",
"kINT7",
"kMUON",
"kHighMult",
"kEMC1",
"kCINT5",
"kCMUS5",
"kMUSH7",
"kMUL7",
"kMUU7",
"kEMC7",
"kMUS7",
"kPHI1",
"kPHI78",
"kEMCEJE",
"kEMCEGA",
"kCentral",
"kSemiCentral",
"kDG5",
"kZED",
"kSPI78",
"kINT8",
"kMuonSingleLowPt8",
"kMuonSingleHighPt8",
"kMuonLikeLowPt8",
"kMuonUnlikeLowPt8",
"kMuonUnlikeLowPt0",
"kUserDefined",
"kTRD"
};

void SetHisto(TH1D* h);
void SetHisto(TH2D* h);
void AddFillSeparationLines(TH1D* h, map<Int_t,Int_t> &fills);

//void periodLevelQA(TString inputFileName ="/afs/cern.ch/work/a/aliqaevs/www/data/2012/LHC12h/pass1/trending.root"){
void periodLevelQA(TString inputFileName ="trending.root"){
  gStyle->SetOptStat(0);
  gStyle->SetLineScalePS(1.5);
  gStyle->SetPadGridX(0);
  gStyle->SetPadGridY(1);

  TFile* f = new TFile(inputFileName.Data());
  TTree* t = (TTree*) f->Get("trending");
  TObjArray* classes = new TObjArray();
  TObjString* activeDetectors = new TObjString();
  Int_t run                = 0;
  Int_t fill               = 0;
  Double_t run_duration    = 0;
  Int_t nBCsPerOrbit       = 0;
  Double_t refl0b          = 0;
  Double_t mu              = 0;
  Double_t lumi_seen       = 0;
  Double_t interactionRate = 0;
  ULong64_t class_l0b[NMAXCLASSES]         = {0};
  ULong64_t class_l0a[NMAXCLASSES]         = {0};
  ULong64_t class_l1b[NMAXCLASSES]         = {0};
  ULong64_t class_l1a[NMAXCLASSES]         = {0};
  ULong64_t class_l2b[NMAXCLASSES]         = {0};
  ULong64_t class_l2a[NMAXCLASSES]         = {0};
  Double_t  class_lifetime[NMAXCLASSES]    = {0};
  Double_t  class_lumi[NMAXCLASSES]        = {0};
  ULong64_t alias_recorded[NBITS]          = {0};
  ULong64_t alias_reconstructed[NBITS]     = {0};
  ULong64_t alias_accepted[NBITS]          = {0};
  Double_t alias_l0b_rate[NBITS]           = {0};
  Double_t alias_lifetime[NBITS]           = {0};
  Double_t alias_lumi_recorded[NBITS]      = {0};
  Double_t alias_lumi_reconstructed[NBITS] = {0};
  Double_t alias_lumi_accepted[NBITS]      = {0};
  
  t->SetBranchAddress("run",&run);
  t->SetBranchAddress("fill",&fill);
  t->SetBranchAddress("bcs",&nBCsPerOrbit);
  t->SetBranchAddress("run_duration",&run_duration);
  t->SetBranchAddress("mu",&mu);
  t->SetBranchAddress("interactionRate",&interactionRate);
  t->SetBranchAddress("refl0b",&refl0b);
  t->SetBranchAddress("lumi_seen",&lumi_seen);
  t->SetBranchAddress("classes",&classes);
  t->SetBranchAddress("class_l0b",&class_l0b);
  t->SetBranchAddress("class_l0a",&class_l0a);
  t->SetBranchAddress("class_l1b",&class_l1b);
  t->SetBranchAddress("class_l1a",&class_l1a);
  t->SetBranchAddress("class_l2b",&class_l2b);
  t->SetBranchAddress("class_l2a",&class_l2a);
  t->SetBranchAddress("class_lifetime",&class_lifetime);
  t->SetBranchAddress("class_lumi",&class_lumi);
  t->SetBranchAddress("alias_recorded",&alias_recorded);
  t->SetBranchAddress("alias_reconstructed",&alias_reconstructed);
  t->SetBranchAddress("alias_accepted",&alias_accepted);
  t->SetBranchAddress("alias_l0b_rate",&alias_lifetime);
  t->SetBranchAddress("alias_lifetime",&alias_lifetime);
  t->SetBranchAddress("alias_lumi_recorded",&alias_lumi_recorded);
  t->SetBranchAddress("alias_lumi_reconstructed",&alias_lumi_reconstructed);
  t->SetBranchAddress("alias_lumi_accepted",&alias_lumi_accepted);
  t->SetBranchAddress("activeDetectors",&activeDetectors);

  Int_t nRuns = t->GetEntries();
  TH2D* hClassL0BvsRun      = new TH2D("hClassL0BVsRun","Class L0B vs run",nRuns,0,nRuns,1,0,1);
  TH2D* hClassL2AvsRun      = new TH2D("hClassL2AVsRun","Class L2A vs run",nRuns,0,nRuns,1,0,1);
  TH2D* hClassLifetimeVsRun = new TH2D("hClassLifetimeVsRun","Lifetime class-by-class vs run",nRuns,0,nRuns,1,0,1);
  TH2D* hClassLumiVsRun     = new TH2D("hClassLumiVsRun","Luminosity class-by-class vs run",nRuns,0,nRuns,1,0,1);
  hClassL0BvsRun->SetBit(TH1::kCanRebin);
  hClassL2AvsRun->SetBit(TH1::kCanRebin);
  hClassLifetimeVsRun->SetBit(TH1::kCanRebin);
  hClassLumiVsRun->SetBit(TH1::kCanRebin);
  for (Int_t r=0;r<nRuns;r++){
    t->GetEntry(r);
    printf("run=%i\n",run);
    hClassL0BvsRun->GetXaxis()->SetBinLabel(r+1,Form("%i",run));
    hClassL2AvsRun->GetXaxis()->SetBinLabel(r+1,Form("%i",run));
    hClassLifetimeVsRun->GetXaxis()->SetBinLabel(r+1,Form("%i",run));
    hClassLumiVsRun->GetXaxis()->SetBinLabel(r+1,Form("%i",run));
    for (Int_t i=0;i<classes->GetEntriesFast();i++){
      TString className = classes->At(i)->GetName();
      if      (className.Contains("-A-"))      continue;
      else if (className.Contains("-C-"))      continue;
      else if (className.Contains("-E-"))      continue;
      else if (className.Contains("-AC-"))     continue;
      else if (className.Contains("-ACE-"))    continue;
      else if (className.Contains("-GA-"))     continue;
      else if (className.Contains("-GC-"))     continue;
      else if (className.Contains("1A-ABCE-")) continue;
      else if (className.Contains("1C-ABCE-")) continue;
      else if (className.Contains("C0LSR-ABCE-")) continue;
//      printf("%30s %12lli %10lli %10lli %10lli %10lli %10lli\n",className.Data(),L0B[i],L0A[i],L1B[i],L1A[i],L2B[i],L2A[i]);
      hClassL0BvsRun->Fill(Form("%i",run),className.Data(),Double_t(class_l0b[i]));
      hClassL2AvsRun->Fill(Form("%i",run),className.Data(),Double_t(class_l2a[i]));
      hClassLifetimeVsRun->Fill(Form("%i",run),className.Data(),class_lifetime[i]);
      hClassLumiVsRun    ->Fill(Form("%i",run),className.Data(),class_lumi[i]);
    }
  }
  
  hClassL0BvsRun->LabelsDeflate("Y");
  hClassL2AvsRun->LabelsDeflate("Y");
  hClassLifetimeVsRun->LabelsDeflate("Y");
  hClassLumiVsRun->LabelsDeflate("Y");

  map<Int_t,Int_t> fills;
  TH1D* hRecorded[NBITS]          = {0x0};
  TH1D* hReconstructed[NBITS]     = {0x0};
  TH1D* hAccepted[NBITS]          = {0x0};
  TH1D* hRejected[NBITS]          = {0x0};
  TH1D* hAcceptedFraction[NBITS]  = {0x0};
  TH1D* hRejectedFraction[NBITS]  = {0x0};
  TH1D* hLumiRecorded[NBITS]      = {0x0};
  TH1D* hLumiReconstructed[NBITS] = {0x0};
  TH1D* hLumiAccepted[NBITS]      = {0x0};
  
  TH2D* hActiveDetectors = new TH2D("hActiveDetectors","Active detectors",nRuns,0,nRuns,AliDAQ::kNDetectors,0,AliDAQ::kNDetectors);
  TH1D* hInteractionRate = new TH1D("hInteractionRate","Minimum bias interaction rate [Hz]",nRuns,0,nRuns);
  TH1D* hMu       = new TH1D("hMu","Average number of minimum bias collisions per BC",nRuns,0,nRuns);
  TH1D* hBCs      = new TH1D("hBCs","Number of colliding bunches",nRuns,0,nRuns);
  TH1D* hDuration = new TH1D("hDuration","Duration, s",nRuns,0,nRuns);
  TH1D* hLumiSeen = new TH1D("hLumiSeen","Luminosity seen, nb-1",nRuns,0,nRuns);

  for (Int_t iDet=0;iDet<AliDAQ::kNDetectors;iDet++) {
//    if      (!TString(AliDAQ::DetectorName(iDet)).CompareTo("HLT")) continue;
//    else if (!TString(AliDAQ::DetectorName(iDet)).CompareTo("TRG")) continue;
//    else if (!TString(AliDAQ::DetectorName(iDet)).CompareTo("MFT")) continue;
//    else if (!TString(AliDAQ::DetectorName(iDet)).CompareTo("FIT")) continue;
//    else if (!TString(AliDAQ::DetectorName(iDet)).CompareTo("CPV")) continue;
//    else if (!TString(AliDAQ::DetectorName(iDet)).CompareTo("DAQ_TEST")) continue;
    hActiveDetectors->GetYaxis()->SetBinLabel(iDet+1,AliDAQ::DetectorName(iDet));
  }
  
  for (Int_t r=0;r<nRuns;r++){
    t->GetEntry(r);
    hActiveDetectors->GetXaxis()->SetBinLabel(r+1,Form("%i",run));
    hInteractionRate->GetXaxis()->SetBinLabel(r+1,Form("%i",run));
    hMu->GetXaxis()->SetBinLabel(r+1,Form("%i",run));
    hBCs->GetXaxis()->SetBinLabel(r+1,Form("%i",run));
    hDuration->GetXaxis()->SetBinLabel(r+1,Form("%i",run));
    hLumiSeen->GetXaxis()->SetBinLabel(r+1,Form("%i",run));
    for (Int_t iDet=0;iDet<AliDAQ::kNDetectors;iDet++) {
//      if      (!TString(AliDAQ::DetectorName(iDet)).CompareTo("HLT")) continue;
//      else if (!TString(AliDAQ::DetectorName(iDet)).CompareTo("TRG")) continue;
//      else if (!TString(AliDAQ::DetectorName(iDet)).CompareTo("MFT")) continue;
//      else if (!TString(AliDAQ::DetectorName(iDet)).CompareTo("FIT")) continue;
//      else if (!TString(AliDAQ::DetectorName(iDet)).CompareTo("CPV")) continue;
//      else if (!TString(AliDAQ::DetectorName(iDet)).CompareTo("DAQ_TEST")) continue;
     hActiveDetectors->Fill(Form("%i",run),AliDAQ::DetectorName(iDet),activeDetectors->String().Contains(AliDAQ::DetectorName(iDet)));
    }
    hInteractionRate->SetBinContent(r+1,interactionRate);
    hMu->SetBinContent(r+1,mu);
    hBCs->SetBinContent(r+1,nBCsPerOrbit);
    hDuration->SetBinContent(r+1,run_duration);
    hLumiSeen->SetBinContent(r+1,lumi_seen);
    fills[run]=fill;
  }
  
  TFile* fclassL0B = new TFile("class_L0B_counts.root","recreate");
  TCanvas* cClassL0B = new TCanvas("cClassL0B","Class L0B vs run",1800,900);
  gPad->SetMargin(0.15,0.01,0.08,0.06);
  SetHisto(hClassL0BvsRun);
  hClassL0BvsRun->Draw("col");
  gPad->Print("class_L0B_counts.pdf(");
  hClassL0BvsRun->Write();
  TCanvas* cL0B = new TCanvas("cL0B","L0B vs run",1800,500);
  cL0B->SetMargin(0.05,0.01,0.18,0.06);
  for (Int_t i=1;i<=hClassL0BvsRun->GetNbinsY();i++){
    TH1D* h = (TH1D*) hClassL0BvsRun->ProjectionX(Form("hClassL0BvsRun_%02i",i),i,i);
    h->SetTitle(Form("%s L0B counts: %.0f",hClassL0BvsRun->GetYaxis()->GetBinLabel(i),h->Integral()));
    SetHisto(h);
    h->Draw();
    AddFillSeparationLines(h,fills);
    gPad->Print("class_L0B_counts.pdf");
    h->Write();
  }
  gPad->Print("class_L0B_counts.pdf]");
  fclassL0B->Close();
  
  TFile* fclassL2A = new TFile("class_L2A_counts.root","recreate");
  TCanvas* cClassL2A = new TCanvas("cClassL2A","Class L2A vs run",1800,900);
  gPad->SetMargin(0.15,0.01,0.08,0.06);
  SetHisto(hClassL2AvsRun);
  hClassL2AvsRun->Draw("col");
  gPad->Print("class_L2A_counts.pdf(");
  hClassL2AvsRun->Write();
  TCanvas* cL2A = new TCanvas("cL2A","L2A vs run",1800,500);
  cL2A->SetMargin(0.05,0.01,0.18,0.06);
  for (Int_t i=1;i<=hClassL2AvsRun->GetNbinsY();i++){
    TH1D* h = (TH1D*) hClassL2AvsRun->ProjectionX(Form("hClassL2AvsRun_%02i",i),i,i);
    h->SetTitle(Form("%s L2A counts: %.0f",hClassL2AvsRun->GetYaxis()->GetBinLabel(i),h->Integral()));
    SetHisto(h);
    h->Draw();
    AddFillSeparationLines(h,fills);
    gPad->Print("class_L2A_counts.pdf");
    h->Write();
  }
  gPad->Print("class_L2A_counts.pdf]");
  fclassL2A->Close();
  
  TFile* fclassLifetime = new TFile("class_lifetime.root","recreate");
  TCanvas* cClassLifetime = new TCanvas("cClassLifetime","Lifetime class-by-class vs run",1800,900);
  gPad->SetMargin(0.15,0.01,0.08,0.06);
  SetHisto(hClassLifetimeVsRun);
  hClassLifetimeVsRun->Draw("col");
  gPad->Print("class_lifetime.pdf(");
  hClassLifetimeVsRun->Write();
  TCanvas* cL2A = new TCanvas("cLifetime","Lifetime vs run",1800,500);
  cL2A->SetMargin(0.05,0.01,0.18,0.06);
  for (Int_t i=1;i<=hClassLifetimeVsRun->GetNbinsY();i++){
    TH1D* h = (TH1D*) hClassLifetimeVsRun->ProjectionX(Form("hClassLifetimeVsRun_%02i",i),i,i);
    h->SetTitle(Form("%s lifetime",hClassLifetimeVsRun->GetYaxis()->GetBinLabel(i)));
    SetHisto(h);
    h->SetFillColor(0);
    h->Draw("");
    AddFillSeparationLines(h,fills);
    gPad->Print("class_lifetime.pdf");
    h->Write();
  }
  gPad->Print("class_lifetime.pdf]");
  fclassLifetime->Close();
  
  TFile* fclassLumi = new TFile("class_lumi.root","recreate");
  TCanvas* cClassLumi = new TCanvas("cClassLumi","Luminosity class-by-class vs run",1800,900);
  gPad->SetMargin(0.15,0.01,0.08,0.06);
  SetHisto(hClassLumiVsRun);
  hClassLumiVsRun->Draw("col");
  gPad->Print("class_lumi.pdf(");
  TCanvas* clumi = new TCanvas("clumi","lumi vs run",1800,500);
  clumi->SetMargin(0.05,0.01,0.18,0.06);
  
  for (Int_t i=1;i<=hClassLumiVsRun->GetNbinsY();i++){
    TH1D* h = (TH1D*) hClassLumiVsRun->ProjectionX(Form("hClassLumiVsRun_%02i",i),i,i);
    h->SetTitle(Form("%s luminosity [ub-1]: %.0g",hClassLumiVsRun->GetYaxis()->GetBinLabel(i),h->Integral()));
    SetHisto(h);
    h->Draw();
    AddFillSeparationLines(h,fills);
    gPad->Print("class_lumi.pdf");
  }
  gPad->Print("class_lumi.pdf]");
  fclassLumi->Close();
  
  SetHisto(hActiveDetectors);
  SetHisto(hInteractionRate);
  SetHisto(hMu);
  SetHisto(hBCs);
  SetHisto(hDuration);
  SetHisto(hLumiSeen);

  TCanvas* cActiveDetectors = new TCanvas("active_detectors","Active Detectors",1800,500);
  cActiveDetectors->SetMargin(0.05,0.01,0.18,0.06);
  hActiveDetectors->GetYaxis()->SetLabelOffset(0.001);
  hActiveDetectors->SetMaximum(2);
  hActiveDetectors->Draw("col");
  AddFillSeparationLines(hMu,fills);
  gPad->Print("global_properties.pdf(");

  TCanvas* cInteractionRate = new TCanvas("cInteractionRate","Interaction Rate",1800,500);
  cInteractionRate->SetMargin(0.05,0.01,0.18,0.06);
  hInteractionRate->SetFillColor(0);
  hInteractionRate->Draw();
  AddFillSeparationLines(hMu,fills);
  gPad->Print("global_properties.pdf");

  TCanvas* cMu = new TCanvas("mu","mu",1800,500);
  cMu->SetMargin(0.05,0.01,0.18,0.06);
  hMu->SetFillColor(0);
  hMu->Draw("h");
  AddFillSeparationLines(hMu,fills);
  gPad->Print("global_properties.pdf");

  TCanvas* cBCs = new TCanvas("bcs","bcs",1800,500);
  cBCs->SetMargin(0.05,0.01,0.18,0.06);
  hBCs->SetFillColor(0);
  hBCs->Draw("h");
  AddFillSeparationLines(hBCs,fills);
  gPad->Print("global_properties.pdf");
  
  TCanvas* cDuration = new TCanvas("duration","duration",1800,500);
  cDuration->SetMargin(0.05,0.01,0.18,0.06);
  hDuration->SetTitle(Form("Duration in seconds: total= %.0f s = %.0f h",hDuration->Integral(),hDuration->Integral()/3600));
  hDuration->Draw("h");
  AddFillSeparationLines(hDuration,fills);
  gPad->Print("global_properties.pdf");

  TCanvas* cLumiSeen = new TCanvas("lumiseen","lumi seen",1800,500);
  cLumiSeen->SetMargin(0.05,0.01,0.18,0.06);
  hLumiSeen->SetTitle(Form("Luminosity seen [1/ub]: total= %.0g",hLumiSeen->Integral()));
  hLumiSeen->Draw("h");
  AddFillSeparationLines(hLumiSeen,fills);
  gPad->Print("global_properties.pdf)");

  TCanvas* dummy = new TCanvas("dummy","dummy",1800,500);
  gPad->SetMargin(0.05,0.01,0.18,0.06);
  gPad->Print("alias_event_statistics.pdf[");
  gPad->Print("alias_lumi_statistics.pdf[");
  gPad->Print("accepted_fraction.pdf[");
  gPad->Print("rejected_fraction.pdf[");

  TCanvas* cCounts           = new TCanvas("c_alias_counts"   ,"c_alias_counts"   ,1800,500);
  TCanvas* cLumi             = new TCanvas("c_lumi"           ,"c_lumi"           ,1800,500);
  TCanvas* cAcceptedFraction = new TCanvas("accepted_fraction","accepted fraction",1800,500);
  TCanvas* cRejectedFraction = new TCanvas("rejected_fraction","rejected fraction",1800,500);
  cCounts          ->SetMargin(0.05,0.01,0.18,0.06);
  cLumi            ->SetMargin(0.05,0.01,0.18,0.06);
  cAcceptedFraction->SetMargin(0.05,0.01,0.18,0.06);
  cRejectedFraction->SetMargin(0.05,0.01,0.18,0.06);
  cRejectedFraction->SetLogy();

  for (Int_t ibit=0;ibit<NBITS;ibit++) {
    const char* bitName = bitNames[ibit];

    hRecorded[ibit]          = new TH1D(Form("hRecorded%02i"         ,ibit),Form("Recorded: %s"          ,bitName),nRuns,0,nRuns);
    hReconstructed[ibit]     = new TH1D(Form("hReconstructed%02i"    ,ibit),Form("Reconstructed: %s"     ,bitName),nRuns,0,nRuns);
    hAccepted[ibit]          = new TH1D(Form("hAccepted%02i"         ,ibit),Form("Accepted: %s"          ,bitName),nRuns,0,nRuns);
    hRejected[ibit]          = new TH1D(Form("hRejected%02i"         ,ibit),Form("Rejected: %s"          ,bitName),nRuns,0,nRuns);
    hLumiRecorded[ibit]      = new TH1D(Form("hLumiRecorded%02i"     ,ibit),Form("Lumi recorded: %s"     ,bitName),nRuns,0,nRuns);
    hLumiReconstructed[ibit] = new TH1D(Form("hLumiReconstructed%02i",ibit),Form("Lumi reconstructed: %s",bitName),nRuns,0,nRuns);
    hLumiAccepted[ibit]      = new TH1D(Form("hLumiAccepted%02i"     ,ibit),Form("Lumi accepted: %s"     ,bitName),nRuns,0,nRuns);
    
    for (Int_t r=0;r<nRuns;r++){
      t->GetEntry(r);
      hRecorded[ibit]         ->GetXaxis()->SetBinLabel(r+1,Form("%i",run));
      hReconstructed[ibit]    ->GetXaxis()->SetBinLabel(r+1,Form("%i",run));
      hAccepted[ibit]         ->GetXaxis()->SetBinLabel(r+1,Form("%i",run));
      hRejected[ibit]         ->GetXaxis()->SetBinLabel(r+1,Form("%i",run));
      hLumiRecorded[ibit]     ->GetXaxis()->SetBinLabel(r+1,Form("%i",run));
      hLumiReconstructed[ibit]->GetXaxis()->SetBinLabel(r+1,Form("%i",run));
      hLumiAccepted[ibit]     ->GetXaxis()->SetBinLabel(r+1,Form("%i",run));
//      printf("recorded = %i",alias_recorded[ibit]);
//      printf("reconstructed = %i",alias_reconstructed[ibit]);
      hRecorded[ibit]         ->SetBinContent(r+1,alias_recorded[ibit]);
      hReconstructed[ibit]    ->SetBinContent(r+1,alias_reconstructed[ibit]);
      hAccepted[ibit]         ->SetBinContent(r+1,alias_accepted[ibit]);
      hRejected[ibit]         ->SetBinContent(r+1,alias_reconstructed[ibit]-alias_accepted[ibit]);
      hLumiRecorded[ibit]     ->SetBinContent(r+1,alias_lumi_recorded[ibit]);
      hLumiReconstructed[ibit]->SetBinContent(r+1,alias_lumi_reconstructed[ibit]);
      hLumiAccepted[ibit]     ->SetBinContent(r+1,alias_lumi_accepted[ibit]);
    }
    if (hRecorded[ibit]->Integral()<1) continue;
    printf("bit=%i %s\n",ibit,bitName);

    SetHisto(hRecorded[ibit]);
    SetHisto(hReconstructed[ibit]);
    SetHisto(hAccepted[ibit]);
    SetHisto(hRejected[ibit]);
    SetHisto(hLumiRecorded[ibit]);
    SetHisto(hLumiReconstructed[ibit]);
    SetHisto(hLumiAccepted[ibit]);
    hRecorded[ibit]->Sumw2();
    hReconstructed[ibit]->Sumw2();
    hAccepted[ibit]->Sumw2();
    hRejected[ibit]->Sumw2();
    hRecorded[ibit]->SetLineColor(kRed+2);
    hRecorded[ibit]->SetFillColor(kRed+2);
    hReconstructed[ibit]->SetLineColor(kBlue);
    hReconstructed[ibit]->SetFillColor(kBlue);
    hAccepted[ibit]->SetLineColor(kGreen+2);
    hAccepted[ibit]->SetFillColor(kGreen+2);
    hLumiRecorded[ibit]->SetLineColor(kRed+2);
    hLumiRecorded[ibit]->SetFillColor(kRed+2);
    hLumiReconstructed[ibit]->SetLineColor(kBlue);
    hLumiReconstructed[ibit]->SetFillColor(kBlue);
    hLumiAccepted[ibit]->SetLineColor(kGreen+2);
    hLumiAccepted[ibit]->SetFillColor(kGreen+2);
    
    cCounts->cd();
    hRecorded[ibit]->SetTitle(Form("%s trigger counts: recorded=%0.f, total=%.0f, accepted=%.0f",bitName,hRecorded[ibit]->Integral(),hReconstructed[ibit]->Integral(),hAccepted[ibit]->Integral()));
    hRecorded[ibit]->Draw("h");
    hReconstructed[ibit]->Draw("h same");
    hAccepted[ibit]->Draw("h same");
    AddFillSeparationLines(hAccepted[ibit],fills);
    gPad->RedrawAxis();
    gPad->Print("alias_event_statistics.pdf");

    cLumi->cd();
    hLumiRecorded[ibit]->SetTitle(Form("%s luminosity [ub-1]: recorded=%.0g, total=%.0g, accepted=%.0g",bitName,hLumiRecorded[ibit]->Integral(),hLumiReconstructed[ibit]->Integral(),hLumiAccepted[ibit]->Integral()));
    hLumiRecorded[ibit]->Draw("h");
    hLumiReconstructed[ibit]->Draw("h same");
    hLumiAccepted[ibit]->Draw("h same");
    AddFillSeparationLines(hLumiAccepted[ibit],fills);
    gPad->RedrawAxis();
    gPad->Print("alias_lumi_statistics.pdf");

    if (hReconstructed[ibit]->Integral()<1) continue;
    hAcceptedFraction[ibit] = (TH1D*) hReconstructed[ibit]->Clone(Form("hAcceptedFraction%02i",ibit));
    hAcceptedFraction[ibit]->SetTitle(Form("Accepted fraction: %s",bitName));
    hAcceptedFraction[ibit]->Divide(hAccepted[ibit],hReconstructed[ibit],1,1,"B");
    hAcceptedFraction[ibit]->SetFillColor(0);
    hAcceptedFraction[ibit]->SetLineWidth(2);
    hRejectedFraction[ibit] = (TH1D*) hReconstructed[ibit]->Clone(Form("hRejectedFraction%02i",ibit));
    hRejectedFraction[ibit]->SetTitle(Form("Rejected fraction: %s",bitName));
    hRejectedFraction[ibit]->Divide(hRejected[ibit],hReconstructed[ibit],1,1,"B");
    hRejectedFraction[ibit]->SetFillColor(0);
    hRejectedFraction[ibit]->SetLineWidth(2);

    cAcceptedFraction->cd();
    hAcceptedFraction[ibit]->SetTitle(Form("%s: average accepted fraction = %.3f",bitName,hAccepted[ibit]->Integral()/hReconstructed[ibit]->Integral()));
    hAcceptedFraction[ibit]->Draw();
    AddFillSeparationLines(hAcceptedFraction[ibit],fills);
    gPad->Print("accepted_fraction.pdf");
    
    cRejectedFraction->cd();
    hRejectedFraction[ibit]->SetMaximum(1);
    hRejectedFraction[ibit]->SetTitle(Form("%s: average rejected fraction = %.3f",bitName,hRejected[ibit]->Integral()/hReconstructed[ibit]->Integral()));
    hRejectedFraction[ibit]->Draw();
    AddFillSeparationLines(hRejectedFraction[ibit],fills);
    gPad->Print("rejected_fraction.pdf");

  }
  dummy->Print("alias_event_statistics.pdf]");
  dummy->Print("alias_lumi_statistics.pdf]");
  dummy->Print("accepted_fraction.pdf]");
  dummy->Print("rejected_fraction.pdf]");

  TFile* fglobal = new TFile("global_properties.root","recreate");
  hMu->Write();
  hBCs->Write();
  hDuration->Write();
  hLumiSeen->Write();
  fglobal->Close();

  TFile* fstat = new TFile("accepted_event_statistics.root","recreate");
  for (Int_t ibit=0;ibit<NBITS;ibit++) {
    if (hRecorded[ibit])      hRecorded[ibit]->Write();
    if (hReconstructed[ibit]) hReconstructed[ibit]->Write();
    if (hAccepted[ibit])      hAccepted[ibit]->Write();
  }
  fstat->Close();

  TFile* faccepted = new TFile("accepted_fraction.root","recreate");
  for (Int_t ibit=0;ibit<NBITS;ibit++) {
    if (hAcceptedFraction[ibit]) hAcceptedFraction[ibit]->Write();
  }
  faccepted->Close();

  TFile* frejected = new TFile("rejected_fraction.root","recreate");
  for (Int_t ibit=0;ibit<NBITS;ibit++) {
    if (hRejectedFraction[ibit]) hRejectedFraction[ibit]->Write();
  }
  frejected->Close();

}

void SetHisto(TH1D* h){
  h->SetTitleFont(43);
  h->SetTitleSize(25);
  h->GetYaxis()->SetTitleFont(43);
  h->GetXaxis()->SetLabelFont(43);
  h->GetYaxis()->SetLabelFont(43);
  h->GetYaxis()->SetTitleSize(25);
  h->GetXaxis()->SetLabelSize(15);
  h->GetYaxis()->SetLabelSize(25);
  h->GetYaxis()->SetTickLength(0.01);
  h->GetYaxis()->SetTitleOffset(0.6);
  h->GetYaxis()->SetDecimals(1);
  h->SetLineColor(kBlue);
  h->SetFillColor(kBlue);
  h->LabelsOption("av");
  h->SetLineWidth(2);
  h->SetMinimum(0);
}

void SetHisto(TH2D* h){
  h->SetTitleFont(43);
  h->SetTitleSize(15);
  h->GetYaxis()->SetTitleFont(43);
  h->GetXaxis()->SetLabelFont(43);
  h->GetYaxis()->SetLabelFont(43);
  h->GetZaxis()->SetLabelFont(43);
  h->GetYaxis()->SetTitleSize(25);
  h->GetXaxis()->SetLabelSize(15);
  h->GetYaxis()->SetLabelSize(15);
  h->GetZaxis()->SetLabelSize(15);
  h->GetYaxis()->SetTickLength(0.01);
  h->GetYaxis()->SetDecimals(1);
  h->GetXaxis()->LabelsOption("av");
  h->GetYaxis()->LabelsOption("a");
  h->SetLineWidth(2);
  h->SetLineColor(kBlue);
  h->SetMinimum(0);
}

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