]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Updated macros for physics selection QA
authorekryshen <evgeny.kryshen@cern.ch>
Thu, 20 Nov 2014 07:55:28 +0000 (08:55 +0100)
committerekryshen <evgeny.kryshen@cern.ch>
Thu, 20 Nov 2014 07:55:28 +0000 (08:55 +0100)
PWGPP/EVS/periodLevelQA.C
PWGPP/EVS/runLevelEventStatQA.C
PWGPP/EVS/triggerInfo.C

index 8cf3ab3ae1806acc8bda0f5d1c98e90a9e0e502a..1cc3eaabfbadec1450db1505f2ac1fb2e5210670 100644 (file)
@@ -1,12 +1,17 @@
+#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",
@@ -21,14 +26,14 @@ TString bitNames[NBITS] = {
 "kEMC7",
 "kMUS7",
 "kPHI1",
-"kPHI7/kPHI8",
+"kPHI78",
 "kEMCEJE",
 "kEMCEGA",
 "kCentral",
 "kSemiCentral",
 "kDG5",
 "kZED",
-"kSPI7/kSPI8",
+"kSPI78",
 "kINT8",
 "kMuonSingleLowPt8",
 "kMuonSingleHighPt8",
@@ -40,78 +45,282 @@ TString bitNames[NBITS] = {
 };
 
 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");
-  Int_t run;
-  Int_t fill = 0;
-  Int_t nBCsPerOrbit = 0;
-  Double_t duration = 0;
-  Double_t mu = 0;
-  Double_t lumi_seen = 0;
-  UInt_t l0b = 0;
-  Int_t all[NBITS];
-  Int_t accepted[NBITS];
+  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("duration",&duration);
+  t->SetBranchAddress("run_duration",&run_duration);
   t->SetBranchAddress("mu",&mu);
-  t->SetBranchAddress("l0b",&l0b);
-  t->SetBranchAddress("all",&all);
-  t->SetBranchAddress("accepted",&accepted);
+  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();
-  map<Int_t,Int_t> fills;
-  TH1D* hAll[NBITS];
-  TH1D* hAccepted[NBITS] = {0x0};
-  TH1D* hRejected[NBITS] = {0x0};
-  TH1D* hAcceptedFraction[NBITS] = {0x0};
-  TH1D* hRejectedFraction[NBITS] = {0x0};
+  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]);
+    }
+  }
   
-  gStyle->SetOptStat(0);
-  gStyle->SetLineScalePS(1.5);
-  gStyle->SetPadGridX(0);
-  gStyle->SetPadGridY(1);
-  TCanvas* dummy = new TCanvas("dummy","dummy",1800,500);
-  gPad->SetMargin(0.05,0.01,0.18,0.06);
-  gPad->Print("global_properties.pdf[");
-  gPad->Print("accepted_event_statistics.pdf[");
-  gPad->Print("accepted_fraction.pdf[");
-  gPad->Print("rejected_fraction.pdf[");
+  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,duration);
-    hLumiSeen->SetBinContent(r+1,lumi_seen/1000.);
+    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");
@@ -125,76 +334,131 @@ void periodLevelQA(TString inputFileName ="trending.root"){
 
   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= %.0f",hLumiSeen->Integral()));
+  hLumiSeen->SetTitle(Form("Luminosity seen [1/ub]: total= %.0g",hLumiSeen->Integral()));
   hLumiSeen->Draw("h");
   AddFillSeparationLines(hLumiSeen,fills);
-  gPad->Print("global_properties.pdf");
+  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[");
 
-  dummy->Print("global_properties.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++) {
-    printf("bit=%i\n",ibit);
     const char* bitName = bitNames[ibit];
-    hAll[ibit]      = new TH1D(Form("hAll%02i"     ,ibit),Form("All: %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);
+
+    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);
-      hAll[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));
-      hAll[ibit]->SetBinContent(r+1,all[ibit]);
-      if (all[ibit]) hAccepted[ibit]->SetBinContent(r+1,accepted[ibit]);
-      if (all[ibit]) hRejected[ibit]->SetBinContent(r+1,all[ibit]-accepted[ibit]);
+      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 (hAll[ibit]->Integral()<1) continue;
-    SetHisto(hAll[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]);
-    hAll[ibit]->Sumw2();
+    SetHisto(hLumiRecorded[ibit]);
+    SetHisto(hLumiReconstructed[ibit]);
+    SetHisto(hLumiAccepted[ibit]);
+    hRecorded[ibit]->Sumw2();
+    hReconstructed[ibit]->Sumw2();
     hAccepted[ibit]->Sumw2();
     hRejected[ibit]->Sumw2();
-    hAll[ibit]->SetLineColor(kBlue);
-    hAll[ibit]->SetFillColor(kBlue);
+    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);
-    hAcceptedFraction[ibit] = (TH1D*) hAll[ibit]->Clone(Form("hAcceptedFraction%02i",ibit));
+    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],hAll[ibit],1,1,"B");
+    hAcceptedFraction[ibit]->Divide(hAccepted[ibit],hReconstructed[ibit],1,1,"B");
     hAcceptedFraction[ibit]->SetFillColor(0);
     hAcceptedFraction[ibit]->SetLineWidth(2);
-    hRejectedFraction[ibit] = (TH1D*) hAll[ibit]->Clone(Form("hRejectedFraction%02i",ibit));
+    hRejectedFraction[ibit] = (TH1D*) hReconstructed[ibit]->Clone(Form("hRejectedFraction%02i",ibit));
     hRejectedFraction[ibit]->SetTitle(Form("Rejected fraction: %s",bitName));
-    hRejectedFraction[ibit]->Divide(hRejected[ibit],hAll[ibit],1,1,"B");
+    hRejectedFraction[ibit]->Divide(hRejected[ibit],hReconstructed[ibit],1,1,"B");
     hRejectedFraction[ibit]->SetFillColor(0);
     hRejectedFraction[ibit]->SetLineWidth(2);
-    
-    TCanvas* cAll = new TCanvas(Form("all_%s",bitName),Form("All: %s",bitName),1800,500);
-    cAll->SetMargin(0.05,0.01,0.18,0.06);
-    hAll[ibit]->SetTitle(Form("%s: total=%.0f accepted=%.0f",bitName,hAll[ibit]->Integral(),hAccepted[ibit]->Integral()));
-    hAll[ibit]->Draw("h");
-    hAccepted[ibit]->Draw("h same");
-    AddFillSeparationLines(hAccepted[ibit],fills);
-    gPad->RedrawAxis();
-    gPad->Print("accepted_event_statistics.pdf");
-    
-    TCanvas* cAcceptedFraction = new TCanvas(Form("accepted_fraction_%s",bitName),Form("Accepted Fraction: %s",bitName),1800,500);
-    cAcceptedFraction->SetMargin(0.05,0.01,0.18,0.06);
-    hAcceptedFraction[ibit]->SetTitle(Form("%s: average accepted fraction = %.3f",bitName,hAccepted[ibit]->Integral()/hAll[ibit]->Integral()));
+
+    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");
     
-    TCanvas* cRejectedFraction = new TCanvas(Form("rejected_fraction_%s",bitName),Form("Rejected Fraction: %s",bitName),1800,500);
-    cRejectedFraction->SetMargin(0.05,0.01,0.18,0.06);
-    hRejectedFraction[ibit]->SetTitle(Form("%s: average rejected fraction = %.3f",bitName,hRejected[ibit]->Integral()/hAll[ibit]->Integral()));
+    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("accepted_event_statistics.pdf]");
+  dummy->Print("alias_event_statistics.pdf]");
+  dummy->Print("alias_lumi_statistics.pdf]");
   dummy->Print("accepted_fraction.pdf]");
   dummy->Print("rejected_fraction.pdf]");
 
@@ -207,14 +471,15 @@ void periodLevelQA(TString inputFileName ="trending.root"){
 
   TFile* fstat = new TFile("accepted_event_statistics.root","recreate");
   for (Int_t ibit=0;ibit<NBITS;ibit++) {
-    if (hAll[ibit]) hAll[ibit]->Write();
-    if (hAccepted[ibit]) hAccepted[ibit]->Write();
+    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 (hRejectedFraction[ibit]) hRejectedFraction[ibit]->Write();
+    if (hAcceptedFraction[ibit]) hAcceptedFraction[ibit]->Write();
   }
   faccepted->Close();
 
@@ -238,8 +503,29 @@ void SetHisto(TH1D* h){
   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);
 }
index 60816e52776eacff90c5b3297b086ad9862a2129..601d673bc89fa9261493c23912598c18377337ee 100644 (file)
@@ -7,6 +7,7 @@
 
 // TODO read number of bits from AliVEvent?
 #define NBITS 29
+#define NMAXCLASSES 100
 TString bitNames[NBITS] = {
 "kMB",
 "kINT7",
@@ -21,14 +22,14 @@ TString bitNames[NBITS] = {
 "kEMC7",
 "kMUS7",
 "kPHI1",
-"kPHI7/kPHI8",
+"kPHI78",
 "kEMCEJE",
 "kEMCEGA",
 "kCentral",
 "kSemiCentral",
 "kDG5",
 "kZED",
-"kSPI7/kSPI8",
+"kSPI78",
 "kINT8",
 "kMuonSingleLowPt8",
 "kMuonSingleHighPt8",
@@ -40,7 +41,16 @@ TString bitNames[NBITS] = {
 };
 
 
-Int_t runLevelEventStatQA(TString qafilename="/data/alice/2010/LHC10b/000114783/pass4/QA_merge_archive.zip#event_stat.root", Int_t run=114783, TString ocdbStorage = "raw://"){
+//Int_t runLevelEventStatQA(TString qafilename="/data/alice/2013/LHC13f/000197348/pass2/QA_merge_archive.zip#event_stat.root", Int_t run=197348, TString ocdbStorage = "local:///data/alice/OCDB"){
+//Int_t runLevelEventStatQA(TString qafilename="/data/alice/2011/LHC11a/000146805/pass4_with_SDD/QA_merge_archive.zip#event_stat.root", Int_t run=146805, TString ocdbStorage = "local:///data/alice/OCDB"){
+//Int_t runLevelEventStatQA(TString qafilename="/data/alice/2013/LHC13g/000197584/pass1/QA_merge_archive.zip#event_stat.root", Int_t run=114783, TString ocdbStorage = "raw://"){
+//Int_t runLevelEventStatQA(TString qafilename="/data/alice/2012/LHC12b/000177789/pass1/QA_merge_archive.zip#event_stat.root", Int_t run=177789, TString ocdbStorage = "local:///data/alice/OCDB"){
+//Int_t runLevelEventStatQA(TString qafilename="/data/alice/2010/LHC10b/000114751/pass4/QA_merge_archive.zip#event_stat.root", Int_t run=114751, TString ocdbStorage = "local:///data/alice/OCDB"){
+//Int_t runLevelEventStatQA(TString qafilename="/data/alice/2012/LHC12d/000184719/pass1/QA_merge_archive.zip#event_stat.root", Int_t run=184719, TString ocdbStorage = "local:///data/alice/OCDB"){
+//Int_t runLevelEventStatQA(TString qafilename="/data/alice/2012/LHC12h/000189694/pass1/QA_merge_archive.zip#event_stat.root", Int_t run=189694, TString ocdbStorage = "local:///data/alice/OCDB"){
+//Int_t runLevelEventStatQA(TString qafilename="/data/alice/sim/2014/LHC14j5/138192/QA_merge_archive.zip#event_stat.root", Int_t run=138192, TString ocdbStorage = "local:///data/alice/OCDB"){
+//  Int_t runLevelEventStatQA(TString qafilename="/alice/data/2010/LHC10d/000124360/pass4/QA_merge_archive.zip#event_stat.root", Int_t run=124360, TString ocdbStorage = "local:///alice/data/OCDB"){
+  Int_t runLevelEventStatQA(TString qafilename="/alice/data/2010/LHC10f/000133007/pass4/QA_merge_archive.zip#event_stat.root", Int_t run=133007, TString ocdbStorage = "local:///alice/data/OCDB"){
   printf("runLevelEventStatQA %s %i\n",qafilename.Data(),run);
   gStyle->SetOptStat(0);
   gStyle->SetLineScalePS(1.5);
@@ -50,88 +60,145 @@ Int_t runLevelEventStatQA(TString qafilename="/data/alice/2010/LHC10b/000114783/
   gStyle->SetPadLeftMargin(0.07);
 
   TFile* fin = new TFile(qafilename);
-  fin->ls();
-  fin->cd("trigger_histograms_+CINT1B-ABCE-NOPF-ALL,CINT1-B-NOPF-ALLNOTRD &1 *0");
-  fin->ls();
-//  TH1F* fHistV0A = (TH1F*) gDirectory->Get("fHistV0A");
-//  fHistV0A->Draw();
-//  return 0;
   TH2D* h = (TH2D*) fin->Get("fHistStatistics");
   if (!h) { printf("fHistStatistics not found\n"); return 1; }
 
   // tree variables
-  Int_t all[NBITS]      = {0};
-  Int_t accepted[NBITS] = {0};
-  Int_t fill=0;
-  Double_t duration=0;
-  UInt_t l0b=0;
-  Int_t nBCsPerOrbit=0;
-  Double_t mu=0;
-  Double_t lumi_seen=0;
+  TObjArray classes = TObjArray();
+  TObjString activeDetectors = TObjString();
+  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};
 
   TString refClass="";
   Double_t refSigma=-1;
-  if      (               run<=118501) { refSigma=  62.; refClass = "CINT1B-ABCE-NOPF-ALL";   } // pp_7.00: 62mb=54.3mb*1.15=sigma(VBAND)*R(INT1/VBAND) (Martino,2012-03-12,RunCond)
-  else if (run>=118502 && run<=121040) { refSigma=  47.; refClass = "CINT1B-ABCE-NOPF-ALL";   } // pp_0.90: 47mb=52 mb *0.91=sigma(INEL)*R(INT1/INEL) (arxiv: 1208.4968, fig.10 + table 3)
-  else if (run>=121041 && run<=126437) { refSigma=  62.; refClass = "CINT1B-ABCE-NOPF-ALL";   } // pp_7.00: 62mb=54.3mb*1.15=sigma(VBAND)*R(INT1/VBAND) (Martino,2012-03-12,RunCond)
-  else if (run>=126438 && run<=127718) { refSigma=  62.; refClass = "CINT1-B-NOPF-ALLNOTRD";  } // pp_7.00: 62mb=54.3mb*1.15=sigma(VBAND)*R(INT1/VBAND) (Martino,2012-03-12,RunCond)
-  else if (run>=127719 && run<=127730) { refSigma=  62.; refClass = "CINT1B-ABCE-NOPF-ALL";   } // pp_7.00: 62mb=54.3mb*1.15=sigma(VBAND)*R(INT1/VBAND) (Martino,2012-03-12,RunCond)
-  else if (run>=127731 && run<=136848) { refSigma=  62.; refClass = "CINT1-B-NOPF-ALLNOTRD";  } // pp_7.00: 62mb=54.3mb*1.15=sigma(VBAND)*R(INT1/VBAND) (Martino,2012-03-12,RunCond)
-  else if (run>=136849 && run<=139316) { refSigma=5970.; refClass = "C0SMH-B-NOPF-ALL";       } // PbPb_2.76: (Oyama,2011-05-20,RunCond)
-  else if (run>=139328 && run<=139517) { refSigma=5970.; refClass = "C0SMH-B-NOPF-ALLNOTRD";  } // PbPb_2.76: (Oyama,2011-05-20,RunCond)
-  else if (run>=145289 && run<=146860) { refSigma=  57.; refClass = "CINT1-B-NOPF-ALLNOTRD";  } // pp_2.76: 57mb=47.7mb*1.20=sigma(VBAND)*R(INT1/VBAND) (Martino,2012-03-12,RunCond)
-  else if (run>=146808 && run<=146814) { refSigma=  57.; refClass = "CINT1-B-NOPF-ALL";       } // pp_2.76: 57mb=47.7mb*1.20=sigma(VBAND)*R(INT1/VBAND) (Martino,2012-03-12,RunCond)
-  else if (run>=145815 && run<=146856) { refSigma=  57.; refClass = "CINT1-B-NOPF-ALLNOTRD";  } // pp_2.76: 57mb=47.7mb*1.20=sigma(VBAND)*R(INT1/VBAND) (Martino,2012-03-12,RunCond)
-  else if (run>=146857 && run<=146857) { refSigma=  57.; refClass = "CINT1-B-NOPF-ALL";       } // pp_2.76: 57mb=47.7mb*1.20=sigma(VBAND)*R(INT1/VBAND) (Martino,2012-03-12,RunCond)
-  else if (run>=146858 && run<=146860) { refSigma=  57.; refClass = "CINT1-B-NOPF-ALLNOTRD";  } // pp_2.76: 57mb=47.7mb*1.20=sigma(VBAND)*R(INT1/VBAND) (Martino,2012-03-12,RunCond)
-  else if (run>=148370 && run<=157078) { refSigma=  54.; refClass = "CVBAND-B-NOPF-ALLNOTRD"; } // pp_7.00: 54.3mb (Martino,2012-03-12,RunCond)
-  else if (run>=157079 && run<=165746) { refSigma=  24.; refClass = "C0TVX-B-NOPF-ALLNOTRD";  } // pp_7.00: 24mb=54.3mb*0.44=sigma(VBAND)*R(0TVX/VBAND) (Martino,2012-03-12,RunCond)
-  else if (run>=166477 && run<=170593) { refSigma=4100.; refClass = "CVLN-B-NOPF-ALLNOTRD";   } // PbPb_2.76: (Martino,2013-03-15,RunCond)
-  else if (run>=176658 && run<=177143) { refSigma=  25.; refClass = "C0TVX-B-NOPF-ALLNOTRD";  } // pp_8.00: (Artem, 2013-10-04,RunCond)
-  else if (run>=177146 && run<=177147) { refSigma=  25.; refClass = "C0TVX-B-NOPF-CENTNOTRD"; } // pp_8.00: (Artem, 2013-10-04,RunCond)
-  else if (run>=177148 && run<=177149) { refSigma=  25.; refClass = "C0TVX-B-NOPF-ALLNOTRD";  } // pp_8.00: (Artem, 2013-10-04,RunCond)
-  else if (run>=177150 && run<=177506) { refSigma=  25.; refClass = "C0TVX-B-NOPF-CENTNOTRD"; } // pp_8.00: (Artem, 2013-10-04,RunCond)
-  else if (run>=177580 && run<=178220) { refSigma=  25.; refClass = "C0TVX-B-NOPF-ALLNOTRD";  } // pp_8.00: (Artem, 2013-10-04,RunCond)
-  else if (run>=179444 && run<=193692) { refSigma=  25.; refClass = "C0TVX-S-NOPF-ALLNOTRD";  } // pp_8.00: (Artem, 2013-10-04,RunCond)
-  else if (run>=193693 && run<=193766) { refSigma=  25.; refClass = "C0TVX-B-NOPF-ALLNOTRD";  } // pp_8.00: (Artem, 2013-10-04,RunCond)
-  else if (run>=195344 && run<=197388) { refSigma=1590.; refClass = "C0TVX-B-NOPF-ALLNOTRD";  } // pPb_5.02: arxiv:1405.1849
-  else if (run>=197470 && run<=197692) { refSigma=  18.; refClass = "C0TVX-B-NOPF-ALLNOTRD";  } // pp_2.76: 18mb=47.7mb*0.39=sigma(VBAND)*R(0TVX/VBAND) (Martino,2012-03-12,RunCond)
+  Double_t refEff = 1.;
+  if      (               run<=118501) { refSigma=  62.; refEff = 1.00; refClass = "CINT1B-ABCE-NOPF-ALL";   } // pp_7.00: 62mb=54.3mb*1.15=sigma(VBAND)*R(INT1/VBAND) (Martino,2012-03-12,RunCond)
+  else if (run>=118502 && run<=118561) { refSigma=  47.; refEff = 1.00; refClass = "CINT1B-ABCE-NOPF-ALL";   } // pp_0.90: 47mb=52 mb *0.91=sigma(INEL)*R(INT1/INEL) (arxiv: 1208.4968, fig.10 + table 3)
+  else if (run>=118903 && run<=120829) { refSigma=  62.; refEff = 1.00; refClass = "CINT1B-ABCE-NOPF-ALL";   } // pp_7.00: 62mb=54.3mb*1.15=sigma(VBAND)*R(INT1/VBAND) (Martino,2012-03-12,RunCond)
+  else if (run>=121039 && run<=121040) { refSigma=  47.; refEff = 1.00; refClass = "CINT1B-ABCE-NOPF-ALL";   } // pp_0.90: 47mb=52 mb *0.91=sigma(INEL)*R(INT1/INEL) (arxiv: 1208.4968, fig.10 + table 3)
+  else if (run>=121041 && run<=126437) { refSigma=  62.; refEff = 1.00; refClass = "CINT1B-ABCE-NOPF-ALL";   } // pp_7.00: 62mb=54.3mb*1.15=sigma(VBAND)*R(INT1/VBAND) (Martino,2012-03-12,RunCond)
+  else if (run>=126438 && run<=127718) { refSigma=  62.; refEff = 1.00; refClass = "CINT1-B-NOPF-ALLNOTRD";  } // pp_7.00: 62mb=54.3mb*1.15=sigma(VBAND)*R(INT1/VBAND) (Martino,2012-03-12,RunCond)
+  else if (run>=127719 && run<=127730) { refSigma=  62.; refEff = 1.00; refClass = "CINT1B-ABCE-NOPF-ALL";   } // pp_7.00: 62mb=54.3mb*1.15=sigma(VBAND)*R(INT1/VBAND) (Martino,2012-03-12,RunCond)
+  else if (run>=127731 && run<=136848) { refSigma=  62.; refEff = 1.00; refClass = "CINT1-B-NOPF-ALLNOTRD";  } // pp_7.00: 62mb=54.3mb*1.15=sigma(VBAND)*R(INT1/VBAND) (Martino,2012-03-12,RunCond)
+  else if (run>=136849 && run<=139316) { refSigma=5970.; refEff = 0.78; refClass = "C0SMH-B-NOPF-ALL";       } // PbPb_2.76: (Oyama,2011-05-20,RunCond), sigma_hardronic = 7.64 b
+  else if (run>=139328 && run<=139517) { refSigma=5970.; refEff = 0.78; refClass = "C0SMH-B-NOPF-ALLNOTRD";  } // PbPb_2.76: (Oyama,2011-05-20,RunCond), sigma_hardronic = 7.64 b
+  else if (run>=145289 && run<=146860) { refSigma=  57.; refEff = 1.00; refClass = "CINT1-B-NOPF-ALLNOTRD";  } // pp_2.76: 57mb=47.7mb*1.20=sigma(VBAND)*R(INT1/VBAND) (Martino,2012-03-12,RunCond)
+  else if (run>=146808 && run<=146814) { refSigma=  57.; refEff = 1.00; refClass = "CINT1-B-NOPF-ALL";       } // pp_2.76: 57mb=47.7mb*1.20=sigma(VBAND)*R(INT1/VBAND) (Martino,2012-03-12,RunCond)
+  else if (run>=145815 && run<=146856) { refSigma=  57.; refEff = 1.00; refClass = "CINT1-B-NOPF-ALLNOTRD";  } // pp_2.76: 57mb=47.7mb*1.20=sigma(VBAND)*R(INT1/VBAND) (Martino,2012-03-12,RunCond)
+  else if (run>=146857 && run<=146857) { refSigma=  57.; refEff = 1.00; refClass = "CINT1-B-NOPF-ALL";       } // pp_2.76: 57mb=47.7mb*1.20=sigma(VBAND)*R(INT1/VBAND) (Martino,2012-03-12,RunCond)
+  else if (run>=146858 && run<=146860) { refSigma=  57.; refEff = 1.00; refClass = "CINT1-B-NOPF-ALLNOTRD";  } // pp_2.76: 57mb=47.7mb*1.20=sigma(VBAND)*R(INT1/VBAND) (Martino,2012-03-12,RunCond)
+  else if (run>=148370 && run<=157078) { refSigma=  54.; refEff = 1.00; refClass = "CVBAND-B-NOPF-ALLNOTRD"; } // pp_7.00: 54.3mb (Martino,2012-03-12,RunCond)
+  else if (run>=157079 && run<=165746) { refSigma=  24.; refEff = 0.44; refClass = "C0TVX-B-NOPF-ALLNOTRD";  } // pp_7.00: 24mb=54.3mb*0.44=sigma(VBAND)*R(0TVX/VBAND) (Martino,2012-03-12,RunCond)
+  else if (run>=166477 && run<=170593) { refSigma=4100.; refEff = 0.54; refClass = "CVLN-B-NOPF-ALLNOTRD";   } // PbPb_2.76: (Martino,2013-03-15,RunCond)
+  else if (run>=176658 && run<=177143) { refSigma=  25.; refEff = 0.45; refClass = "C0TVX-B-NOPF-ALLNOTRD";  } // pp_8.00: (Artem, 2013-10-04,RunCond)
+  else if (run>=177146 && run<=177147) { refSigma=  25.; refEff = 0.45; refClass = "C0TVX-B-NOPF-CENTNOTRD"; } // pp_8.00: (Artem, 2013-10-04,RunCond)
+  else if (run>=177148 && run<=177149) { refSigma=  25.; refEff = 0.45; refClass = "C0TVX-B-NOPF-ALLNOTRD";  } // pp_8.00: (Artem, 2013-10-04,RunCond)
+  else if (run>=177150 && run<=177506) { refSigma=  25.; refEff = 0.45; refClass = "C0TVX-B-NOPF-CENTNOTRD"; } // pp_8.00: (Artem, 2013-10-04,RunCond)
+  else if (run>=177580 && run<=178220) { refSigma=  25.; refEff = 0.45; refClass = "C0TVX-B-NOPF-ALLNOTRD";  } // pp_8.00: (Artem, 2013-10-04,RunCond)
+  else if (run>=179444 && run<=188229) { refSigma=  25.; refEff = 0.45; refClass = "C0TVX-S-NOPF-ALLNOTRD";  } // pp_8.00: (Artem, 2013-10-04,RunCond)
+  else if (run>=188230 && run<=188366) { refSigma=1590.; refEff = 0.76; refClass = "C0TVX-B-NOPF-ALLNOTRD";  } // pPb_5.02: pilot. arxiv:1405.1849
+  else if (run>=188367 && run<=193692) { refSigma=  25.; refEff = 0.45; refClass = "C0TVX-S-NOPF-ALLNOTRD";  } // pp_8.00: (Artem, 2013-10-04,RunCond)
+  else if (run>=193693 && run<=193766) { refSigma=  25.; refEff = 0.45; refClass = "C0TVX-B-NOPF-ALLNOTRD";  } // pp_8.00: (Artem, 2013-10-04,RunCond)
+  else if (run>=195344 && run<=197388) { refSigma=1590.; refEff = 0.76; refClass = "C0TVX-B-NOPF-ALLNOTRD";  } // pPb_5.02: arxiv:1405.1849
+  else if (run>=197470 && run<=197692) { refSigma=  18.; refEff = 0.39; refClass = "C0TVX-B-NOPF-ALLNOTRD";  } // pp_2.76: 18mb=47.7mb*0.39=sigma(VBAND)*R(0TVX/VBAND) (Martino,2012-03-12,RunCond)
+
   Double_t par[5] = {0};
-  triggerInfo(run,refClass,ocdbStorage,par);
-  fill         = TMath::Nint(par[0]);
-  duration     = par[1];
-  l0b          = TMath::Nint(par[2]);
-  nBCsPerOrbit = TMath::Nint(par[3]);
-  mu           = par[4];
-  if (refSigma>0) lumi_seen = l0b/refSigma;
+  TString det;
+  triggerInfo(run,refClass,ocdbStorage,det,par);
+  fill          = TMath::Nint(par[0]);
+  run_duration   = par[1];
+  refl0b         = par[2];
+  nBCsPerOrbit   = TMath::Nint(par[3]);
+  mu             = par[4];
+  activeDetectors.SetString(det.Data());
+
+  interactionRate = (run_duration>1e-10) ? refl0b/run_duration/refEff : 0;
+  if (refSigma>1.e-10) lumi_seen = refl0b/refSigma/1000; //[ub-1]
+  if (mu>1.e-10) lumi_seen*=mu/(1-TMath::Exp(-mu)); // pile-up correction
 
+  classes = GetClasses(run,ocdbStorage,class_l0b,class_l0a,class_l1b,class_l1a,class_l2b,class_l2a);
+  for (Int_t i=0;i<classes.GetEntriesFast();i++){
+    // printf("%30s %12lli %10lli %10lli %10lli %10lli %10lli\n",classes.At(i)->GetName(),class_l0b[i],class_l0a[i],class_l1b[i],class_l1a[i],class_l2b[i],class_l2a[i]);
+    class_lifetime[i] = class_l0b[i]>0 ? Double_t(class_l0a[i])/class_l0b[i]: 0;
+    class_lifetime[i]*= class_l1b[i]>0 ? Double_t(class_l1a[i])/class_l1b[i]: 0;
+    class_lifetime[i]*= class_l2b[i]>0 ? Double_t(class_l2a[i])/class_l2b[i]: 0;
+    class_lumi[i] = lumi_seen*class_lifetime[i];
+  }
+  
+
+  TFile* fout = new TFile("trending.root","recreate");
   TTree* t = new TTree("trending","tree of trending variables");
   t->Branch("run",&run);
   t->Branch("fill",&fill);
   t->Branch("bcs",&nBCsPerOrbit);
-  t->Branch("duration",&duration);
+  t->Branch("run_duration",&run_duration);
   t->Branch("mu",&mu);
-  t->Branch("l0b",&l0b);
+  t->Branch("interactionRate",&interactionRate);
+  t->Branch("refl0b",&refl0b);
   t->Branch("lumi_seen",&lumi_seen);
-  t->Branch("all",&all,Form("all[%i]/I",NBITS));
-  t->Branch("accepted",&accepted,Form("accepted[%i]/I",NBITS));
-
-  TFile* fout = new TFile("trending.root","recreate");
-
+  t->Branch("classes",&classes);
+  t->Branch("class_l0b",&class_l0b,Form("class_l0b[%i]/l",NMAXCLASSES));
+  t->Branch("class_l0a",&class_l0a,Form("class_l0a[%i]/l",NMAXCLASSES));
+  t->Branch("class_l1b",&class_l1b,Form("class_l1b[%i]/l",NMAXCLASSES));
+  t->Branch("class_l1a",&class_l1a,Form("class_l1a[%i]/l",NMAXCLASSES));
+  t->Branch("class_l2b",&class_l2b,Form("class_l2b[%i]/l",NMAXCLASSES));
+  t->Branch("class_l2a",&class_l2a,Form("class_l2a[%i]/l",NMAXCLASSES));
+  t->Branch("class_lifetime",&class_lifetime,Form("class_lifetime[%i]/D",NMAXCLASSES));
+  t->Branch("class_lumi",&class_lumi,Form("class_lumi[%i]/D",NMAXCLASSES));
+  t->Branch("alias_recorded",&alias_recorded,Form("alias_recorded[%i]/l",NBITS));
+  t->Branch("alias_reconstructed",&alias_reconstructed,Form("alias_reconstructed[%i]/l",NBITS));
+  t->Branch("alias_accepted",&alias_accepted,Form("alias_accepted[%i]/l",NBITS));
+  t->Branch("alias_l0b_rate",&alias_lifetime,Form("alias_l0b_rate[%i]/D",NBITS));
+  t->Branch("alias_lifetime",&alias_lifetime,Form("alias_lifetime[%i]/D",NBITS));
+  t->Branch("alias_lumi_recorded",&alias_lumi_recorded,Form("alias_lumi_recorded[%i]/D",NBITS));
+  t->Branch("alias_lumi_reconstructed",&alias_lumi_reconstructed,Form("alias_lumi_reconstructed[%i]/D",NBITS));
+  t->Branch("alias_lumi_accepted",&alias_lumi_accepted,Form("alias_lumi_accepted[%i]/D",NBITS));
+  t->Branch("activeDetectors",&activeDetectors);
+  
   for (Int_t j=1;j<=h->GetNbinsY();j++){
     TString label = h->GetYaxis()->GetBinLabel(j);
-
     // skip background triggers
     // TODO introduce identifier to filter-out background triggers
-    if (!label.Contains("-B-") && !label.Contains("-S-") && !(label.Contains("-ABCE-") && label.Contains("1B-"))) continue;
+    if      (label.Contains("-A-"))      continue;
+    else if (label.Contains("-C-"))      continue;
+    else if (label.Contains("-E-"))      continue;
+    else if (label.Contains("-AC-"))     continue;
+    else if (label.Contains("-ACE-"))    continue;
+    else if (label.Contains("-GA-"))     continue;
+    else if (label.Contains("-GC-"))     continue;
+    else if (label.Contains("1A-ABCE-")) continue;
+    else if (label.Contains("1C-ABCE-")) continue;
+    else if (label.Contains("C0LSR-ABCE-")) continue;
 
-    printf("%s\n",label.Data());
     // Read mask
     // TODO think how to propagate mask with TBit aliases
     UInt_t mask = 0;
+    TString classList = ""; // list of classes for given PS bit
     TObjArray* array = label.Tokenize(" ");
     for (Int_t itoken=0;itoken<array->GetEntries();itoken++){
       TString token = array->At(itoken)->GetName();
+      if (itoken==0) classList = token; 
       if (token[0]!='&') continue;
       token.Remove(0,1);
       mask = token.Atoi();
@@ -139,92 +206,132 @@ Int_t runLevelEventStatQA(TString qafilename="/data/alice/2010/LHC10b/000114783/
     }
     array->Delete();
     delete array;
+    printf("%s\n",label.Data());
+    printf("%i\n",mask);
     if (!mask) continue;
-    // Fill all and accepted counters for active bits
-    // TODO can we accidentally double count events?
-    for (Int_t ibit=0;ibit<NBITS;ibit++) {
-      if (!(mask & 1<<ibit)) continue; // to be changed with TBits
-      all[ibit]      += Int_t(h->GetBinContent(1             ,j)); 
-      accepted[ibit] += Int_t(h->GetBinContent(h->GetNbinsX(),j));
+    // Fill all and accepted counters for the most significant bit
+    Int_t ibit = TMath::Nint(TMath::Log2(mask));
+    if (ibit>=NBITS) continue;
+    if (alias_recorded[ibit]) break; 
+
+    alias_reconstructed[ibit] = Int_t(h->GetBinContent(1             ,j));
+    alias_accepted[ibit]      = Int_t(h->GetBinContent(h->GetNbinsX(),j));
+    
+//    printf("%4i %8i %8i\n",ibit,alias_reconstructed[ibit],alias_accepted[ibit]);
+    
+    classList.Remove(0,1); // remove +
+    array = classList.Tokenize(",");
+    // if trigger bit corresponds to several active classes, just take the last one
+    // example: kTRD
+    // TODO think about more elegant solution
+    for (Int_t i=0;i<array->GetEntriesFast();i++){
+      TString token = array->At(i)->GetName();
+      AliTriggerClass* cl = (AliTriggerClass*) classes.FindObject(token.Data());
+      if (!cl) continue;
+      Int_t iclass = classes.IndexOf(cl);
+      printf(" %30s",token.Data());
+      printf(" %12lli",class_l0b[iclass]);
+      printf(" %12lli",class_l0a[iclass]);
+      printf(" %12lli",class_l1b[iclass]);
+      printf(" %12lli",class_l1a[iclass]);
+      printf(" %12lli",class_l2b[iclass]);
+      printf(" %12lli",class_l2a[iclass]);
+      printf("\n");
+      alias_recorded[ibit]      = class_l2a[iclass];
+      alias_lifetime[ibit]      = class_lifetime[iclass];
+      alias_lumi_recorded[ibit] = class_lumi[iclass];
+      if (!alias_recorded[ibit]) continue;
+      alias_lumi_reconstructed[ibit] = alias_lumi_recorded[ibit]/alias_recorded[ibit]*alias_reconstructed[ibit];
+      alias_lumi_accepted[ibit]      = alias_lumi_recorded[ibit]/alias_recorded[ibit]*alias_accepted[ibit];
     }
-    if (h->GetBinContent(1,j)<1) continue;
-    TH1F* fHistV0A = (TH1F*) fin->Get(Form("trigger_histograms_%s/fHistV0A",label.Data()));
-    TH1F* fHistV0C = (TH1F*) fin->Get(Form("trigger_histograms_%s/fHistV0C",label.Data()));
-    TH1F* fHistFiredBitsSPD = (TH1F*) fin->Get(Form("trigger_histograms_%s/fHistFiredBitsSPD",label.Data()));
-    TH2F* fHistBitsSPD      = (TH2F*) fin->Get(Form("trigger_histograms_%s/fHistBitsSPD",label.Data()));
-    TH1F* fHistTDCZDC       = (TH1F*) fin->Get(Form("trigger_histograms_%s/fHistTDCZDC",label.Data()));
-    TH2F* fHistTimeZDC      = (TH2F*) fin->Get(Form("trigger_histograms_%s/fHistTimeZDC",label.Data()));
-    TH2F* fHistTimeCorrZDC  = (TH2F*) fin->Get(Form("trigger_histograms_%s/fHistTimeCorrZDC",label.Data()));
-
-    const char* bitName = bitNames[j-1].Data();
-    TCanvas* cHistV0A = new TCanvas(Form("cHistV0A",j),Form("cHistV0A_%s",bitName),1000,800);
+    array->Delete();
+    delete array;
+
+    // Fill run QA histograms
+    const char* bitName = bitNames[ibit].Data();
+    TH1F* hV0A          = (TH1F*) fin->Get(Form("trigger_histograms_%s/fHistV0A"         ,label.Data()));
+    TH1F* hV0C          = (TH1F*) fin->Get(Form("trigger_histograms_%s/fHistV0C"         ,label.Data()));
+    TH1F* hFiredBitsSPD = (TH1F*) fin->Get(Form("trigger_histograms_%s/fHistFiredBitsSPD",label.Data()));
+    TH2F* hBitsSPD      = (TH2F*) fin->Get(Form("trigger_histograms_%s/fHistBitsSPD"     ,label.Data()));
+    TH1F* hTDCZDC       = (TH1F*) fin->Get(Form("trigger_histograms_%s/fHistTDCZDC"      ,label.Data()));
+    TH2F* hTimeZDC      = (TH2F*) fin->Get(Form("trigger_histograms_%s/fHistTimeZDC"     ,label.Data()));
+    TH2F* hTimeCorrZDC  = (TH2F*) fin->Get(Form("trigger_histograms_%s/fHistTimeCorrZDC" ,label.Data()));
+    if (!hV0A)          { printf("QA histogram not found\n"); return 1; }
+    if (!hV0C)          { printf("QA histogram not found\n"); return 1; }
+    if (!hFiredBitsSPD) { printf("QA histogram not found\n"); return 1; }
+    if (!hBitsSPD)      { printf("QA histogram not found\n"); return 1; }
+    if (!hTDCZDC)       { printf("QA histogram not found\n"); return 1; }
+    if (!hTimeZDC)      { printf("QA histogram not found\n"); return 1; }
+    if (!hTimeCorrZDC)  { printf("QA histogram not found\n"); return 1; }
+
+    TCanvas* cV0A = new TCanvas(Form("cV0A_%s",bitName),Form("cV0A_%s",bitName),1000,800);
     gPad->SetLogy();
-    fHistV0A->SetTitle(Form("%s: V0A",bitName));
-    fHistV0A->SetLineWidth(2);
-    fHistV0A->SetLineColor(kBlue);
-    fHistV0A->Draw();
-    gPad->Print(Form("%s_histV0A.pdf",bitName));
-    fHistV0A->Write(Form("%s_histV0A",bitName));
-
-    TCanvas* cHistV0C = new TCanvas(Form("cHistV0C",j),Form("cHistV0C_%s",bitName),1000,800);
+    hV0A->SetTitle(Form("%s: V0A",bitName));
+    hV0A->SetLineWidth(2);
+    hV0A->SetLineColor(kBlue);
+    hV0A->Draw();
+    gPad->Print(Form("%s_V0A.pdf",bitName));
+    hV0A->Write(Form("%s_V0A",bitName));
+
+    TCanvas* cV0C = new TCanvas(Form("cV0C_%s",bitName),Form("cV0C_%s",bitName),1000,800);
     gPad->SetLogy();
-    fHistV0C->SetTitle(Form("%s: V0C",bitName));
-    fHistV0C->SetLineWidth(2);
-    fHistV0C->SetLineColor(kBlue);
-    fHistV0C->Draw();
-    gPad->Print(Form("%s_histV0C.pdf",bitName));
-    fHistV0C->Write(Form("%s_histV0C",bitName));
-
-    TCanvas* cHistFiredBitsSPD = new TCanvas(Form("cHistFiredBitsSPD",j),Form("cHistFiredBitsSPD_%s",bitName),1800,500);
+    hV0C->SetTitle(Form("%s: V0C",bitName));
+    hV0C->SetLineWidth(2);
+    hV0C->SetLineColor(kBlue);
+    hV0C->Draw();
+    gPad->Print(Form("%s_V0C.pdf",bitName));
+    hV0C->Write(Form("%s_V0C",bitName));
+
+    TCanvas* cFiredBitsSPD = new TCanvas(Form("cFiredBitsSPD_%s",bitName),Form("cFiredBitsSPD_%s",bitName),1800,500);
     gPad->SetLogy();
     gPad->SetMargin(0.05,0.01,0.12,0.06);
-    fHistFiredBitsSPD->SetTitle(Form("%s: hardware FO",bitName));
-    fHistFiredBitsSPD->SetTitleFont(43);
-    fHistFiredBitsSPD->SetTitleSize(25);
-    fHistFiredBitsSPD->GetYaxis()->SetTitleFont(43);
-    fHistFiredBitsSPD->GetXaxis()->SetLabelFont(43);
-    fHistFiredBitsSPD->GetYaxis()->SetLabelFont(43);
-    fHistFiredBitsSPD->GetYaxis()->SetTitleSize(25);
-    fHistFiredBitsSPD->GetXaxis()->SetLabelSize(25);
-    fHistFiredBitsSPD->GetYaxis()->SetLabelSize(25);
-    fHistFiredBitsSPD->GetYaxis()->SetTickLength(0.01);
-    fHistFiredBitsSPD->GetYaxis()->SetTitleOffset(0.5);
-    fHistFiredBitsSPD->GetYaxis()->SetDecimals(1);
-    fHistFiredBitsSPD->SetLineWidth(2);
-    fHistFiredBitsSPD->SetLineColor(kBlue);
-    fHistFiredBitsSPD->Draw();
-    gPad->Print(Form("%s_histFiredBitsSPD.pdf",bitName));
-    fHistFiredBitsSPD->Write(Form("%s_histFiredBitsSPD",bitName));
-
-    TCanvas* cHistBitsSPD = new TCanvas(Form("cHistBitsSPD",j),Form("cHistBitsSPD_%s",bitName),800,800);
+    hFiredBitsSPD->SetTitle(Form("%s: hardware FO",bitName));
+    hFiredBitsSPD->SetTitleFont(43);
+    hFiredBitsSPD->SetTitleSize(25);
+    hFiredBitsSPD->GetYaxis()->SetTitleFont(43);
+    hFiredBitsSPD->GetXaxis()->SetLabelFont(43);
+    hFiredBitsSPD->GetYaxis()->SetLabelFont(43);
+    hFiredBitsSPD->GetYaxis()->SetTitleSize(25);
+    hFiredBitsSPD->GetXaxis()->SetLabelSize(25);
+    hFiredBitsSPD->GetYaxis()->SetLabelSize(25);
+    hFiredBitsSPD->GetYaxis()->SetTickLength(0.01);
+    hFiredBitsSPD->GetYaxis()->SetTitleOffset(0.5);
+    hFiredBitsSPD->GetYaxis()->SetDecimals(1);
+    hFiredBitsSPD->SetLineWidth(2);
+    hFiredBitsSPD->SetLineColor(kBlue);
+    hFiredBitsSPD->Draw();
+    gPad->Print(Form("%s_FiredBitsSPD.pdf",bitName));
+    hFiredBitsSPD->Write(Form("%s_FiredBitsSPD",bitName));
+
+    TCanvas* cBitsSPD = new TCanvas(Form("cBitsSPD_%s",bitName),Form("cBitsSPD_%s",bitName),800,800);
     gPad->SetLogz();
     gPad->SetMargin(0.12,0.12,0.10,0.06);
-    fHistBitsSPD->SetTitle(Form("%s: hardware FO vs offline FO",bitName));
-    fHistBitsSPD->GetXaxis()->SetTitleOffset(1.3);
-    fHistBitsSPD->GetYaxis()->SetTitleOffset(1.6);
-    fHistBitsSPD->Draw("colz");
-    gPad->Print(Form("%s_histBitsSPD.pdf",bitName));
-    fHistBitsSPD->Write(Form("%s_histBitsSPD",bitName));
-
-    TCanvas* cHistTimeZDC = new TCanvas(Form("cHistTimeZDC",j),Form("cHistTimeZDC_%s",bitName),800,800);
+    hBitsSPD->SetTitle(Form("%s: hardware FO vs offline FO",bitName));
+    hBitsSPD->GetXaxis()->SetTitleOffset(1.3);
+    hBitsSPD->GetYaxis()->SetTitleOffset(1.6);
+    hBitsSPD->Draw("colz");
+    gPad->Print(Form("%s_BitsSPD.pdf",bitName));
+    hBitsSPD->Write(Form("%s_BitsSPD",bitName));
+
+    TCanvas* cTimeZDC = new TCanvas(Form("cTimeZDC_%s",bitName),Form("cTimeZDC_%s",bitName),800,800);
     gPad->SetLogz();
     gPad->SetMargin(0.12,0.12,0.10,0.06);
-    fHistTimeZDC->SetTitle(Form("%s: ZDC timing;TDC timing C-A;TDC timing C+A",bitName));
-    fHistTimeZDC->GetXaxis()->SetTitleOffset(1.3);
-    fHistTimeZDC->GetYaxis()->SetTitleOffset(1.6);
-    fHistTimeZDC->Draw("colz");
-    gPad->Print(Form("%s_histTimeZDC.pdf",bitName));
-    fHistTimeZDC->Write(Form("%s_histTimeZDC",bitName));
-
-    TCanvas* cHistTimeCorrZDC = new TCanvas(Form("cHistTimeCorrZDC",j),Form("cHistTimeCorrZDC_%s",bitName),800,800);
+    hTimeZDC->SetTitle(Form("%s: ZDC timing;TDC timing C-A;TDC timing C+A",bitName));
+    hTimeZDC->GetXaxis()->SetTitleOffset(1.3);
+    hTimeZDC->GetYaxis()->SetTitleOffset(1.6);
+    hTimeZDC->Draw("colz");
+    gPad->Print(Form("%s_TimeZDC.pdf",bitName));
+    hTimeZDC->Write(Form("%s_TimeZDC",bitName));
+
+    TCanvas* cTimeCorrZDC = new TCanvas(Form("cTimeCorrZDC_%s",bitName),Form("cTimeCorrZDC_%s",bitName),800,800);
     gPad->SetLogz();
     gPad->SetMargin(0.12,0.12,0.10,0.06);
-    fHistTimeCorrZDC->SetTitle(Form("%s: corrected ZDC timing;TDC timing C-A;TDC timing C+A",bitName));
-    fHistTimeCorrZDC->GetXaxis()->SetTitleOffset(1.3);
-    fHistTimeCorrZDC->GetYaxis()->SetTitleOffset(1.6);
-    fHistTimeCorrZDC->Draw("colz");
-    gPad->Print(Form("%s_histTimeCorrZDC.pdf",bitName));
-    fHistTimeCorrZDC->Write(Form("%s_histTimeCorrZDC",bitName));
+    hTimeCorrZDC->SetTitle(Form("%s: corrected ZDC timing;TDC timing C-A;TDC timing C+A",bitName));
+    hTimeCorrZDC->GetXaxis()->SetTitleOffset(1.3);
+    hTimeCorrZDC->GetYaxis()->SetTitleOffset(1.6);
+    hTimeCorrZDC->Draw("colz");
+    gPad->Print(Form("%s_TimeCorrZDC.pdf",bitName));
+    hTimeCorrZDC->Write(Form("%s_TimeCorrZDC",bitName));
   }
   
   t->Fill();
@@ -232,3 +339,5 @@ Int_t runLevelEventStatQA(TString qafilename="/data/alice/2010/LHC10b/000114783/
   fout->Close();
   return 0;
 }
+
+
index b071a66fe5780a828c76c94263e2d607e9e13943..831f2a6f2baf6f00584640ccc415f6732f01d612 100644 (file)
@@ -20,70 +20,126 @@ UInt_t dif(UInt_t stop, UInt_t start){
   return d;
 };
 
-Int_t triggerInfo(Int_t run, TString refClassName, TString ocdbStorage, Double_t* par){
+TObjArray GetClasses(Int_t run, TString ocdbStorage, ULong64_t* L0B, ULong64_t* L0A, ULong64_t* L1B, ULong64_t* L1A, ULong64_t* L2B, ULong64_t* L2A){
   AliCDBManager* man = AliCDBManager::Instance();
   man->SetDefaultStorage(ocdbStorage.Data());
   man->SetRun(run);
-  AliLHCData* lhc = (AliLHCData*) man->Get("GRP/GRP/LHCData")->GetObject();
-  par[0] = lhc->GetFillNumber();
+  // Get scalers 
+  AliTriggerConfiguration* cfg = (AliTriggerConfiguration*) man->Get("GRP/CTP/Config")->GetObject();
+  if (!cfg) { printf("No GRP/CTP/Config object for run %i\n",run); return TObjArray(); }
+
+  TObjArray classes = cfg->GetClasses();
+  AliTriggerRunScalers* scalers = (AliTriggerRunScalers*) man->Get("GRP/CTP/Scalers")->GetObject();
+  if (!scalers) { printf("No GRP/CTP/Scalers object for run %i\n",run); return TObjArray(); }
+  Int_t nEntries = scalers->GetScalersRecords()->GetEntriesFast();
+  
+  for (Int_t r=0;r<nEntries-1;r++){
+    // Get SOR and EOR scaler records
+    AliTriggerScalersRecord* record1 = scalers->GetScalersRecord(r);
+    AliTriggerScalersRecord* record2 = scalers->GetScalersRecord(r+1);
+    if (!record1) { printf("Null pointer to scalers record\n"); return TObjArray(); }
+    if (!record2) { printf("Null pointer to scalers record\n"); return TObjArray(); }
+    for (Int_t i=0;i<classes.GetEntriesFast();i++){
+      // Extract SOR and EOR trigger counts
+      Int_t classId = cfg->GetClassIndexFromName(classes.At(i)->GetName());
+      const AliTriggerScalers* scaler1 = record1->GetTriggerScalersForClass(classId);
+      const AliTriggerScalers* scaler2 = record2->GetTriggerScalersForClass(classId);
+      if (!scaler1) { printf("Null pointer to scalers for class\n"); return TObjArray(); }
+      if (!scaler2) { printf("Null pointer to scalers for class\n"); return TObjArray(); }
+      L0B[i] += dif(scaler2->GetLOCB(),scaler1->GetLOCB());
+      L0A[i] += dif(scaler2->GetLOCA(),scaler1->GetLOCA());
+      L1B[i] += dif(scaler2->GetL1CB(),scaler1->GetL1CB());
+      L1A[i] += dif(scaler2->GetL1CA(),scaler1->GetL1CA());
+      L2B[i] += dif(scaler2->GetL2CB(),scaler1->GetL2CB());
+      L2A[i] += dif(scaler2->GetL2CA(),scaler1->GetL2CA());
+    }
+  }
+  return classes;
+}
+
+
+Int_t triggerInfo(Int_t run, TString refClassName, TString ocdbStorage, TString &activeDetectors, Double_t* par){
+  AliCDBManager* man = AliCDBManager::Instance();
+  man->SetDefaultStorage(ocdbStorage.Data());
+  man->SetRun(run);
+  if (run!=189694) { // No GRP/GRP/LHCData for this run
+    AliLHCData* lhc = (AliLHCData*) man->Get("GRP/GRP/LHCData")->GetObject();
+    if (!lhc) { printf("No GRP/GRP/LHCData object for run %i\n",run); return 1; }
+    par[0] = lhc->GetFillNumber();
+  }
   
   AliTriggerConfiguration* cfg = (AliTriggerConfiguration*) man->Get("GRP/CTP/Config")->GetObject();
+  if (!cfg) { printf("No GRP/CTP/Config object for run %i\n",run); return 1; }
+  activeDetectors = cfg->GetActiveDetectors().Data();
 
   // Get scalers 
   AliTriggerRunScalers* scalers = (AliTriggerRunScalers*) man->Get("GRP/CTP/Scalers")->GetObject();
+  if (!scalers) { printf("No GRP/CTP/Scalers object for run %i\n",run); return 1; }
   Int_t nEntries = scalers->GetScalersRecords()->GetEntriesFast();
-  
-  // Get SOR and EOR scaler records
-  AliTriggerScalersRecord* record1 = scalers->GetScalersRecord(0);
-  AliTriggerScalersRecord* record2 = scalers->GetScalersRecord(nEntries-1);
-  if (!record1) { printf("Null pointer to start scalers record\n"); return 1; }
-  if (!record2) { printf("Null pointer to  stop scalers record\n"); return 1; }
 
-  // Extract SOR and EOR times
-  const AliTimeStamp* stemp1 = record1->GetTimeStamp();
-  const AliTimeStamp* stemp2 = record2->GetTimeStamp();
-  if (!stemp1) { printf("Null pointer to start timestemp\n"); return 1; }
-  if (!stemp2) { printf("Null pointer to stop timestemp\n");  return 1; }
-  Double_t duration = stemp2->GetSeconds()-stemp1->GetSeconds();
-  par[1] = duration;
-  if (TMath::Abs(duration)<1) return 2;
+  Double_t run_duration   = 0;
+  ULong64_t l0b      = 0;
+  ULong64_t l0bempty = 0;
+  Int_t classId      = cfg->GetClassIndexFromName(refClassName);
+  Int_t emptyclassid = cfg->GetClassIndexFromName("CBEAMB-ABCE-NOPF-ALL");
+  for (Int_t r=0;r<nEntries-1;r++){
+    // Get SOR and EOR scaler records
+    AliTriggerScalersRecord* record1 = scalers->GetScalersRecord(r);
+    AliTriggerScalersRecord* record2 = scalers->GetScalersRecord(r+1);
+    if (!record1) { printf("Null pointer to scalers record\n"); return 2; }
+    if (!record2) { printf("Null pointer to scalers record\n"); return 2; }
+    const AliTimeStamp*      stamp1  = record1->GetTimeStamp();
+    const AliTimeStamp*      stamp2  = record2->GetTimeStamp();
+    const AliTriggerScalers* scaler1 = record1->GetTriggerScalersForClass(classId);
+    const AliTriggerScalers* scaler2 = record2->GetTriggerScalersForClass(classId);
+    if (!stamp1 ) { printf("Null pointer to start timestamp\n");   return 2; }
+    if (!stamp2 ) { printf("Null pointer to stop timestamp\n");    return 2; }
+    if (!scaler1) { printf("Null pointer to scalers for class %s\n",refClassName.Data()); return 2; }
+    if (!scaler2) { printf("Null pointer to scalers for class %s\n",refClassName.Data()); return 2; }
+//    run_duration += dif(stamp2->GetSeconds(),stamp1->GetSeconds());
+    l0b          += dif(scaler2->GetLOCB()  ,scaler1->GetLOCB());
+    if (emptyclassid<0) continue;
+    const AliTriggerScalers* emptyScaler1 = record1->GetTriggerScalersForClass(emptyclassid);
+    const AliTriggerScalers* emptyScaler2 = record2->GetTriggerScalersForClass(emptyclassid);
+    if (!emptyScaler1) { printf("Null pointer to scalers for empty class\n"); return 2; }
+    if (!emptyScaler2) { printf("Null pointer to scalers for empty class\n");  return 2; }
+    l0bempty+=dif(emptyScaler2->GetLOCB(),emptyScaler1->GetLOCB());
+  }
+  UInt_t t1 = scalers->GetScalersRecord(0         )->GetTimeStamp()->GetSeconds();
+  UInt_t t2 = scalers->GetScalersRecord(nEntries-1)->GetTimeStamp()->GetSeconds();
+  run_duration = dif(t2,t1);
+  
+  for (Int_t r=0;r<nEntries-1;r++){
+    // Get SOR and EOR scaler records
+    AliTriggerScalersRecord* record1 = scalers->GetScalersRecord(r);
+    const AliTimeStamp*      stamp1  = record1->GetTimeStamp();
+    Int_t period = stamp1->GetPeriod();
+    Int_t orbit = stamp1->GetOrbit();
+    printf("%5i %5i %5i %ll\n",r,period,orbit);
+  }
 
-  // Extract SOR and EOR trigger counts
-  Int_t classid = cfg->GetClassIndexFromName(refClassName);
-  const AliTriggerScalers* scaler1 = record1->GetTriggerScalersForClass(classid);
-  const AliTriggerScalers* scaler2 = record2->GetTriggerScalersForClass(classid);
-  if (!scaler1) { printf("Null pointer to start scalers for reference class\n"); return 1; }
-  if (!scaler2) { printf("Null pointer to stop scalers for reference class\n");  return 1; }
-  UInt_t l0b = dif(scaler2->GetLOCB(),scaler1->GetLOCB());
+  
+  par[1] = run_duration;
   par[2] = l0b;
+  if (TMath::Abs(run_duration)<1) return 3;
 
   // Get number of colliding bunches per orbit
-  Double_t orbitRate = 11245.; // Hz
   Double_t nBCsPerOrbit = -1;
+  Double_t orbitRate = 11245.;
   if (refClassName.Contains("1B-ABCE-")){
     nBCsPerOrbit = lhc->GetNInteractingBunchesMeasured();
     Printf("Number of BCs from LHC data=%i",nBCsPerOrbit);
-    if (nBCsPerOrbit<0) {
-      Int_t emptyclassid = cfg->GetClassIndexFromName("CBEAMB-ABCE-NOPF-ALL");
-      if (emptyclassid<0) return 3;
-      const AliTriggerScalers* emptyScaler1 = record1->GetTriggerScalersForClass(emptyclassid);
-      const AliTriggerScalers* emptyScaler2 = record2->GetTriggerScalersForClass(emptyclassid);
-      if (!scaler1) { printf("Null pointer to start scalers for reference class\n"); return 1; }
-      if (!scaler2) { printf("Null pointer to stop scalers for reference class\n");  return 1; }
-      UInt_t l0bempty = dif(emptyScaler2->GetLOCB(),emptyScaler1->GetLOCB());
-      if (l0bempty==0) return 4;
-      nBCsPerOrbit = l0bempty/orbitRate/duration;
-    }
-  }
-  else {
+    if (nBCsPerOrbit<0 && l0bempty>0) nBCsPerOrbit = Double_t(l0bempty)/orbitRate/run_duration;
+  } else {
     // Extract number of bunches per orbit
-    AliTriggerClass* cl = cfg->GetTriggerClass(classid);
+    AliTriggerClass* cl = cfg->GetTriggerClass(classId);
     AliTriggerBCMask* mask = cl->GetBCMask();
     nBCsPerOrbit = mask->GetNUnmaskedBCs();
   }
   par[3] = nBCsPerOrbit;
   
-  Double_t totalBCs = duration*orbitRate*nBCsPerOrbit;
-  par[4] = -TMath::Log(1-l0b/totalBCs); // mu
+  Double_t totalBCs = orbitRate*run_duration*nBCsPerOrbit;
+  if (totalBCs<1 || l0b<1) return 4;
+  par[4] = -TMath::Log(1-Double_t(l0b)/totalBCs); // mu
   return 0;
 }