ROOT logo
//-*- Mode: C++ -*-

// Make Hists for trigger efficiency studies
// Author: Jochen Thaeder <jochen@thaeder.de> 

#include "TROOT.h"
#include "TStyle.h"
#include "TSystem.h"
#include "TFile.h"
#include "TCanvas.h"
#include "TObjArray.h"
#include "TLegend.h"
#include "TH1.h"
#include "TString.h"
#include "TMath.h"
#include "TLine.h"

// ----------------------------------------------------------------------
// --                      Static Variablen                            --
// ----------------------------------------------------------------------
TObjArray* fObjArray = NULL;

Int_t fgImgIdx = 0;

const Int_t fgkNTrigger = 10;

const Double_t fgkTriggerPt[fgkNTrigger] = {1.0, 2.0, 2.5, 3.0, 5.0, 7.0, 10.0, 1000., 1001., 1002.};

Char_t *fgkTrigger[fgkNTrigger] = {
  "p_{t}> 1.0",              "p_{t}> 2.0",              "p_{t}> 2.5",
  "p_{t}> 3.0",              "p_{t}> 5.0",              "p_{t}> 7",
  "p_{t}> 10.",
  "S1",                      "S2",                      "S3"
};

const Int_t fgkNSelectionCuts  = 5;
Char_t *fgkSelectionCuts[fgkNSelectionCuts] = { 
  "All Events", 
  "AliPhysSel", 
  "AliPhysSel - PrimVertex",
  "AliPhysSel - PrimVertex - Track (OFF)",
  "AliPhysSel - PrimVertex - Track (HLT)",
};

Char_t *fgkSelectionCutsMC[fgkNSelectionCuts] = { 
  "AllEvents", 
  "AliPhysSel", 
  "AliPhysSel - PrimVertex - Charged Primary",
  "AliPhysSel - PrimVertex - Track (MC)",
  "AliPhysSel - PrimVertex - Track (MC)",
};

Char_t *fgkSelectionCutsRatioMC[fgkNSelectionCuts] = { 
  "AllEvents", 
  "AliPhysSel", 
  "AliPhysSel - PrimVertex - Charged Primary",
  "AliPhysSel - PrimVertex - Track (OFF)/ Track (MC)",
  "AliPhysSel - PrimVertex - Track (HLT)/ Track (MC)",
};

// ----------------------------------------------------------------------
// --                       Main Function                              --
// ----------------------------------------------------------------------

void readTrigger(const Char_t* folder = "../..");

// ----------------------------------------------------------------------
// --                      Canvas Functions                            --
// ----------------------------------------------------------------------

void CanvasTrigger();
void CanvasTriggerFactors();
void CanvasTriggerFactorsBackup();

void CreateCanvasCuts();

void CreateCanvasDistributions( Int_t maxLayer = 99, Int_t draw = 2, Int_t data = 2, Int_t minLayer=0);
// draw 0 : pt  || draw 1 : mult || draw 2 : both
// data 0 : OFF || data 1 : MC   || data 2 : both

// ----------------------------------------------------------------------
// --                      Helper Functions                            --
// ----------------------------------------------------------------------

void SetHist(TH1F* hist, Int_t hType, Char_t* dataType, Char_t* histType, Float_t minY, Float_t maxY );

void DivideHist(TH1F* h0, TH1F* h1, TH1F* h2);
void FillReduxHistograms( TH1F* hN, TH1F* hRedux);
void FillReduxHistogramsPt( TH1F* hN, TH1F* hRedux, TH1F* hReduxW);

void FillRatioHistograms( TH1F* hN, TH1F* hF, TH1F* hRatio);
void FillRatioHistogramsPt( TH1F* hN, TH1F* hF, TH1F* hRatio);

// ----------------------------------------------------------------------
// --                       Draw Functions                             --
// ----------------------------------------------------------------------

void DrawHistogramTrigger( TCanvas* canvas, Int_t idx, TH1* hist, Int_t iLayer, Bool_t bLogY);
void DrawHistogram( TCanvas* canvas, Int_t idx, TH1* hist, Int_t iLayer, 
		    Bool_t bScale, Bool_t bLogY, Bool_t bLogX);

//#######################################################################
void readTrigger(const Char_t* folder) {

  gStyle->SetPalette(1);
  gROOT->SetStyle("Plain");

  TString path(folder);
  path += "/jthaeder_trigger.root";
  
  TFile *f = new TFile(path.Data());

  // ----------------------------------------------------------------------------

  fObjArray = static_cast<TObjArray*>(f->Get("jthaeder_trigger"));
  
  // == SHOW ===================
  CanvasTriggerFactors();
  CreateCanvasDistributions(  7, 0, 2, 0 );

  // CreateCanvasDistributions( 10, 1, 0, 7 );
  // == SHOW ===================

  // == BACKUP =================
#if 1
  CanvasTriggerFactorsBackup();
  CanvasTrigger();
  CreateCanvasCuts();
#endif
  // == BACKUP =================
}

// ----------------------------------------------------------------------
// --                      Canvas Functions                            --
// ----------------------------------------------------------------------

//#######################################################################
void CanvasTrigger() {
  
  TCanvas *cTrigger = new TCanvas("cTrigger", "Trigger Events", 10, 10, 1400, 800);
  cTrigger->Divide(2,3);

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  TLegend* leg = new TLegend(0.60, 0.12, 0.89, 0.37, "Event Selection");
  leg->AddEntry(static_cast<TH1F*>(fObjArray->FindObject("fNOFFTriggered")),    "OFF Trig - All Events","LP");
  leg->AddEntry(static_cast<TH1F*>(fObjArray->FindObject("fNOFFTriggeredSel")), "OFF Trig - AliPhysSel - OFF PrimVertex","LP");
  leg->AddEntry(static_cast<TH1F*>(fObjArray->FindObject("fNHLTTriggered")),    "HLT Trig - All Events","LP");
  leg->AddEntry(static_cast<TH1F*>(fObjArray->FindObject("fNHLTTriggeredSel")), "HLT Trig - AliPhysSel - HLT PrimVertex","LP");
  leg->AddEntry(static_cast<TH1F*>(fObjArray->FindObject("fNMCTriggered")),     "MC Trig - All Events","LP");
  leg->AddEntry(static_cast<TH1F*>(fObjArray->FindObject("fNMCTriggeredSel")),  "MC Trig - AliPhysSel - MC PrimVertex","LP");
  leg->SetFillColor(kWhite);

  TLegend* legW = new TLegend(0.60, 0.12, 0.89, 0.37, "Event Selection");
  legW->AddEntry(static_cast<TH1F*>(fObjArray->FindObject("fNOFFTriggered")),    "OFF Trig - All Events","LP");
  legW->AddEntry(static_cast<TH1F*>(fObjArray->FindObject("fNOFFTriggeredSel")), "OFF Trig - AliPhysSel - OFF PrimVertex","LP");
  legW->AddEntry(static_cast<TH1F*>(fObjArray->FindObject("fNHLTTriggered")),    "HLT Trig - All Events","LP");
  legW->AddEntry(static_cast<TH1F*>(fObjArray->FindObject("fNHLTTriggeredSel")), "HLT Trig - AliPhysSel - HLT PrimVertex","LP");
  legW->SetFillColor(kWhite);

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
  
  TH1F *hOFF = static_cast<TH1F*>(fObjArray->FindObject("fNOFFTriggered"));

  hOFF->SetTitle("Triggered Events");
  hOFF->SetAxisRange(0,fgkNTrigger);
  hOFF->SetMinimum(1);

  hOFF->GetXaxis()->SetBinLabel(1, "Total N events");  
  hOFF->GetXaxis()->SetBinLabel(fgkNTrigger+2, "Total N events");  
  for ( Int_t ii=2 ; ii <= fgkNTrigger+1 ; ii++ ) {
    hOFF->GetXaxis()->SetBinLabel(ii, fgkTrigger[ii-2]);
    hOFF->GetXaxis()->SetBinLabel(ii+fgkNTrigger+1, fgkTrigger[ii-2]);
  }

  DrawHistogramTrigger(cTrigger, 1, static_cast<TH1F*>(fObjArray->FindObject("fNOFFTriggered")),    0, kTRUE);
  DrawHistogramTrigger(cTrigger, 1, static_cast<TH1F*>(fObjArray->FindObject("fNOFFTriggeredSel")), 1, kTRUE);
  DrawHistogramTrigger(cTrigger, 1, static_cast<TH1F*>(fObjArray->FindObject("fNHLTTriggered")),    2, kTRUE);
  DrawHistogramTrigger(cTrigger, 1, static_cast<TH1F*>(fObjArray->FindObject("fNHLTTriggeredSel")), 3, kTRUE);
  DrawHistogramTrigger(cTrigger, 1, static_cast<TH1F*>(fObjArray->FindObject("fNMCTriggered")),     4, kTRUE);
  DrawHistogramTrigger(cTrigger, 1, static_cast<TH1F*>(fObjArray->FindObject("fNMCTriggeredSel")),  5, kTRUE);
  leg->Draw();

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  TH1F* h1Clone = static_cast<TH1F*>(fObjArray->FindObject("fNOFFTriggered")->Clone());
  h1Clone->SetAxisRange(fgkNTrigger+1,2*(fgkNTrigger+1));
  h1Clone->GetYaxis()->SetTitle("N Events * N Tracks");

  TString title(h1Clone->GetTitle());
  title += " - weighted nTracks";
  h1Clone->SetTitle(title);    

  DrawHistogramTrigger(cTrigger, 2, h1Clone, 0, kTRUE);
  DrawHistogramTrigger(cTrigger, 2, static_cast<TH1F*>(fObjArray->FindObject("fNOFFTriggeredSel")), 1, kTRUE);
  DrawHistogramTrigger(cTrigger, 2, static_cast<TH1F*>(fObjArray->FindObject("fNHLTTriggered")),    2, kTRUE);
  DrawHistogramTrigger(cTrigger, 2, static_cast<TH1F*>(fObjArray->FindObject("fNHLTTriggeredSel")), 3, kTRUE);
  legW->Draw();

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
  // ---------------------------------------------------------------
  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  TLegend* legF = new TLegend(0.65, 0.12, 0.89, 0.32, "Event Selection");
  legF->AddEntry(static_cast<TH1F*>(fObjArray->FindObject("fNHLTFakeToOFF")),
		 "HLT Trig vs OFF - All Events","LP");
  legF->AddEntry(static_cast<TH1F*>(fObjArray->FindObject("fNHLTFakeToOFFSel")),
		 "HLT Trig vs OFF - AliPhysSel - OFF PrimVertex","LP");

  legF->AddEntry(static_cast<TH1F*>(fObjArray->FindObject("fNHLTFakeToMC")),
		 "HLT Trig vs MC - All Events","LP");
  legF->AddEntry(static_cast<TH1F*>(fObjArray->FindObject("fNHLTFakeToMCSel")),
		 "HLT Trig vs MC - AliPhysSel - OFF PrimVertex","LP");

  legF->AddEntry(static_cast<TH1F*>(fObjArray->FindObject("fNOFFFakeToMC")),
		 "OFF Trig vs MC - AllEvents","LP");
  legF->AddEntry(static_cast<TH1F*>(fObjArray->FindObject("fNOFFFakeToMCSel")),
		 "OFF Trig vs MC - AliPhysSel - OFF PrimVertex","LP");

  legF->SetFillColor(kWhite);

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
  
  TH1F* hFake = static_cast<TH1F*>(fObjArray->FindObject("fNHLTFakeToOFF"));
  hFake->SetAxisRange(1,fgkNTrigger);
  hFake->SetAxisRange(1, 1e5,"Y");
  hFake->GetYaxis()->SetTitle("N Events #left(HLT_{Triggered} && ! [OFF|MC]_{Triggered}#right)");

  for ( Int_t ii=2 ; ii <= fgkNTrigger+1 ; ii++ ) {
    hFake->GetXaxis()->SetBinLabel(ii, fgkTrigger[ii-2]);
    hFake->GetXaxis()->SetBinLabel(ii+fgkNTrigger+1, fgkTrigger[ii-2]);
  }

  DrawHistogramTrigger(cTrigger, 3, hFake, 0, kTRUE);
  DrawHistogramTrigger(cTrigger, 3, static_cast<TH1F*>(fObjArray->FindObject("fNHLTFakeToOFFSel")), 1, kTRUE);
  DrawHistogramTrigger(cTrigger, 3, static_cast<TH1F*>(fObjArray->FindObject("fNHLTFakeToMC")),     2, kTRUE);
  DrawHistogramTrigger(cTrigger, 3, static_cast<TH1F*>(fObjArray->FindObject("fNHLTFakeToMCSel")),  3, kTRUE);
  DrawHistogramTrigger(cTrigger, 3, static_cast<TH1F*>(fObjArray->FindObject("fNOFFFakeToMC")),     4, kTRUE);
  DrawHistogramTrigger(cTrigger, 3, static_cast<TH1F*>(fObjArray->FindObject("fNOFFFakeToMCSel")),  5, kTRUE);
  legF->Draw();

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  TH1F* h2Clone = static_cast<TH1F*>(hFake->Clone());
  h2Clone->SetAxisRange(fgkNTrigger+2,2*(fgkNTrigger+1));
  h2Clone->SetAxisRange(1, 1e6, "Y");
  h2Clone->GetYaxis()->SetTitle("N Events * N Tracks");

  TString titleF(h2Clone->GetTitle());
  titleF += " - weighted nTracks";
  h2Clone->SetTitle(titleF);    

  DrawHistogramTrigger(cTrigger, 4, h2Clone, 0, kTRUE);
  DrawHistogramTrigger(cTrigger, 4, static_cast<TH1F*>(fObjArray->FindObject("fNHLTFakeToOFFSel")), 1, kTRUE);
  DrawHistogramTrigger(cTrigger, 4, static_cast<TH1F*>(fObjArray->FindObject("fNHLTFakeToMC")),     2, kTRUE);
  DrawHistogramTrigger(cTrigger, 4, static_cast<TH1F*>(fObjArray->FindObject("fNHLTFakeToMCSel")),  3, kTRUE);
  DrawHistogramTrigger(cTrigger, 4, static_cast<TH1F*>(fObjArray->FindObject("fNOFFFakeToMC")),     4, kTRUE);
  DrawHistogramTrigger(cTrigger, 4, static_cast<TH1F*>(fObjArray->FindObject("fNOFFFakeToMCSel")),  5, kTRUE);

  legF->Draw();

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
  // ---------------------------------------------------------------
  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  TLegend* legM = new TLegend(0.65, 0.12, 0.89, 0.32, "Event Selection");
  legM->AddEntry(static_cast<TH1F*>(fObjArray->FindObject("fNHLTMissToOFF")),
		 "HLT Trig vs OFF - All Events","LP");
  legM->AddEntry(static_cast<TH1F*>(fObjArray->FindObject("fNHLTMissToOFFSel")),
		 "HLT Trig vs OFF - AliPhysSel - OFF PrimVertex","LP");

  legM->AddEntry(static_cast<TH1F*>(fObjArray->FindObject("fNHLTMissToMC")),
		 "HLT Trig vs MC - All Events","LP");
  legM->AddEntry(static_cast<TH1F*>(fObjArray->FindObject("fNHLTMissToMCSel")),
		 "HLT Trig vs MC - AliPhysSel - OFF PrimVertex","LP");

  legM->AddEntry(static_cast<TH1F*>(fObjArray->FindObject("fNOFFMissToMC")),
		 "OFF Trig vs MC - All Events","LP");
  legM->AddEntry(static_cast<TH1F*>(fObjArray->FindObject("fNOFFMissToMCSel")),
		 "OFF Trig vs MC - AliPhysSel - OFF PrimVertex","LP");

  legM->SetFillColor(kWhite);

  // --- --- --- --- --- --- -

  TH1F* hMiss = static_cast<TH1F*>(fObjArray->FindObject("fNHLTMissToOFF"));
  hMiss->SetAxisRange(1,fgkNTrigger);
  hMiss->SetAxisRange(1, 1e4, "Y");
  hMiss->GetYaxis()->SetTitle("N Events #left(!HLT_{Triggered} && [OFF|MC]_{Triggered}#right)");

  for ( Int_t ii=2 ; ii <= fgkNTrigger+1 ; ii++ ) {
    hMiss->GetXaxis()->SetBinLabel(ii, fgkTrigger[ii-2]);
    hMiss->GetXaxis()->SetBinLabel(ii+fgkNTrigger+1, fgkTrigger[ii-2]);
  }

  DrawHistogramTrigger(cTrigger, 5, hMiss, 0, kTRUE);
  DrawHistogramTrigger(cTrigger, 5, static_cast<TH1F*>(fObjArray->FindObject("fNHLTMissToOFFSel")), 1, kTRUE);
  DrawHistogramTrigger(cTrigger, 5, static_cast<TH1F*>(fObjArray->FindObject("fNHLTMissToMC")),     2, kTRUE);
  DrawHistogramTrigger(cTrigger, 5, static_cast<TH1F*>(fObjArray->FindObject("fNHLTMissToMCSel")),  3, kTRUE);
  DrawHistogramTrigger(cTrigger, 5, static_cast<TH1F*>(fObjArray->FindObject("fNOFFMissToMC")),     4, kTRUE);
  DrawHistogramTrigger(cTrigger, 5, static_cast<TH1F*>(fObjArray->FindObject("fNOFFMissToMCSel")),  5, kTRUE);

  legM->Draw();

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  TH1F* h3Clone = static_cast<TH1F*>(fObjArray->FindObject("fNHLTMissToOFF")->Clone());
  h3Clone->SetAxisRange(fgkNTrigger+2,2*(fgkNTrigger+1));
  h3Clone->SetAxisRange(1, 1e6, "Y");
  h3Clone->GetYaxis()->SetTitle("N Events * N Tracks");

  TString titleM(h3Clone->GetTitle());
  titleM += " - weighted nTracks";
  h3Clone->SetTitle(titleM);    

  DrawHistogramTrigger(cTrigger, 6, h3Clone, 0, kTRUE);
  DrawHistogramTrigger(cTrigger, 6, static_cast<TH1F*>(fObjArray->FindObject("fNHLTMissToOFFSel")), 1, kTRUE);
  DrawHistogramTrigger(cTrigger, 6, static_cast<TH1F*>(fObjArray->FindObject("fNHLTMissToMC")),     2, kTRUE);
  DrawHistogramTrigger(cTrigger, 6, static_cast<TH1F*>(fObjArray->FindObject("fNHLTMissToMCSel")),  3, kTRUE);
  DrawHistogramTrigger(cTrigger, 6, static_cast<TH1F*>(fObjArray->FindObject("fNOFFMissToMC")),     4, kTRUE);
  DrawHistogramTrigger(cTrigger, 6, static_cast<TH1F*>(fObjArray->FindObject("fNOFFMissToMCSel")),  5, kTRUE);

  legM->Draw();

  cTrigger->SaveAs(Form("TriggerHists_%d_B.png",++fgImgIdx));
}
// === === === === === === === === === === === === === === === ===
// ===============================================================
// === === === === === === === === === === === === === === === ===

//#######################################################################
void CanvasTriggerFactorsBackup() {

  TCanvas *cTriggerFB = new TCanvas("cTriggerFB", "Reduction - Purity - Efficiency", 10, 10, 1400, 800);
  cTriggerFB->Divide(3,3);
 
  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  Float_t maxLine = 0.9;
  Float_t minLine = 0.8;

  TLine* line1 = new TLine(0.,maxLine,fgkNTrigger,maxLine);
  line1->SetLineStyle(2);
  line1->SetLineColor(kGreen);

  TLine* line2 = new TLine(0.,minLine,fgkNTrigger,minLine);
  line2->SetLineStyle(2);
  line2->SetLineColor(kRed);


  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
  TH1F* hOFFReduxB   = new TH1F("hOFFReduxB", 
			       "Reduction Factors;;Reduction #left(#frac{N Events_{Triggered}}{N Events_{Total}}#right)", 
			       2*fgkNTrigger, 0., static_cast<Double_t>(2*fgkNTrigger));
  TH1F* hOFFReduxBS  = new TH1F("hOFFReduxBS", "",  2*fgkNTrigger, 0., static_cast<Double_t>(2*fgkNTrigger));
  TH1F* hHLTReduxB   = new TH1F("hHLTReduxB", "",  2*fgkNTrigger, 0., static_cast<Double_t>(2*fgkNTrigger));
  TH1F* hHLTReduxBS  = new TH1F("hHLTReduxBS", "", 2*fgkNTrigger, 0., static_cast<Double_t>(2*fgkNTrigger));
  TH1F* hMCReduxB    = new TH1F("hMCReduxB", "",  2*fgkNTrigger, 0., static_cast<Double_t>(2*fgkNTrigger));
  TH1F* hMCReduxBS   = new TH1F("hMCReduxBS", "", 2*fgkNTrigger, 0., static_cast<Double_t>(2*fgkNTrigger));

  FillReduxHistograms(static_cast<TH1F*>(fObjArray->FindObject("fNOFFTriggered")),    hOFFReduxB);
  FillReduxHistograms(static_cast<TH1F*>(fObjArray->FindObject("fNOFFTriggeredSel")), hOFFReduxBS);
  FillReduxHistograms(static_cast<TH1F*>(fObjArray->FindObject("fNHLTTriggered")),    hHLTReduxB);
  FillReduxHistograms(static_cast<TH1F*>(fObjArray->FindObject("fNHLTTriggeredSel")), hHLTReduxBS);
  FillReduxHistograms(static_cast<TH1F*>(fObjArray->FindObject("fNMCTriggered")),     hMCReduxB);
  FillReduxHistograms(static_cast<TH1F*>(fObjArray->FindObject("fNMCTriggeredSel")),  hMCReduxBS);

  TLegend* legR = new TLegend(0.65, 0.12, 0.89, 0.37, "Event Selection");
  legR->AddEntry(hOFFReduxB,  "OFF Trig - All Events","LP");
  legR->AddEntry(hOFFReduxBS, "OFF Trig - AliPhysSel - OFF PrimVertex","LP");
  legR->AddEntry(hHLTReduxB, "HLT Trig - All Events","LP");
  legR->AddEntry(hHLTReduxBS,"HLT Trig - AliPhysSel - OFF PrimVertex","LP");
  legR->AddEntry(hMCReduxB, "MC Trig - All Events","LP");
  legR->AddEntry(hMCReduxBS,"MC Trig - AliPhysSel - OFF PrimVertex","LP");
  legR->SetFillColor(kWhite);

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
  hOFFReduxB->SetAxisRange(0,fgkNTrigger-1);

  for ( Int_t ii=1 ; ii <= fgkNTrigger ; ii++ ) {
    hOFFReduxB->GetXaxis()->SetBinLabel(ii, fgkTrigger[ii-1]);
    hOFFReduxB->GetXaxis()->SetBinLabel(ii+fgkNTrigger, fgkTrigger[ii-1]);
  }

  DrawHistogramTrigger(cTriggerFB, 1, hOFFReduxB,  0, kTRUE);
  DrawHistogramTrigger(cTriggerFB, 1, hOFFReduxBS, 1, kTRUE);
  DrawHistogramTrigger(cTriggerFB, 1, hHLTReduxB,  2, kTRUE);
  DrawHistogramTrigger(cTriggerFB, 1, hHLTReduxBS, 3, kTRUE);
  DrawHistogramTrigger(cTriggerFB, 1, hMCReduxB,   4, kTRUE);
  DrawHistogramTrigger(cTriggerFB, 1, hMCReduxBS,  5, kTRUE);
  legR->Draw();

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  TH1F* hOFFRClone = static_cast<TH1F*>(hOFFReduxB->Clone());
  hOFFRClone->SetAxisRange(fgkNTrigger,2*(fgkNTrigger));

  TString titleR(hOFFRClone->GetTitle());
  titleR += " - weighted nTracks";
  hOFFRClone->SetTitle(titleR);    

  DrawHistogramTrigger(cTriggerFB, 2, hOFFRClone, 0, kTRUE);
  DrawHistogramTrigger(cTriggerFB, 2, hOFFReduxBS, 1, kTRUE);
  DrawHistogramTrigger(cTriggerFB, 2, hHLTReduxB,  2, kTRUE);
  DrawHistogramTrigger(cTriggerFB, 2, hHLTReduxBS, 3, kTRUE);
  DrawHistogramTrigger(cTriggerFB, 2, hMCReduxB,   4, kTRUE);
  DrawHistogramTrigger(cTriggerFB, 2, hMCReduxBS,  5, kTRUE);
  legR->Draw();

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
  // ---------------------------------------------------------------
  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  TH1F* hOFFPurityHLTB  = new TH1F("hOFFPurityHLTB", "HLT Trigger Purity vs OFF", 2*fgkNTrigger, 0., static_cast<Double_t>(2*fgkNTrigger));
  hOFFPurityHLTB->GetYaxis()->SetTitle("Purity #left(#frac{HLT_{Triggered} - HLT_{Fake}}{HLT_{Triggered}}#right)");
  TH1F* hOFFPurityHLTBS = new TH1F("hOFFPurityHLTBS", "", 2*fgkNTrigger, 0., static_cast<Double_t>(2*fgkNTrigger));
  
  TH1F* hMCPurityHLTB  = new TH1F("hMCPurityHLTB", "HLT Trigger Purity vs MC", 2*fgkNTrigger, 0., static_cast<Double_t>(2*fgkNTrigger));
  hMCPurityHLTB->GetYaxis()->SetTitle("Purity #left(#frac{HLT_{Triggered} - HLT_{Fake}}{HLT_{Triggered}}#right)");
  TH1F* hMCPurityHLTBS = new TH1F("hMCPurityHLTBS", "", 2*fgkNTrigger, 0., static_cast<Double_t>(2*fgkNTrigger));

  TH1F* hMCPurityOFFB  = new TH1F("hMCPurityOFFB", "OFF Trigger Purity vs MC", 2*fgkNTrigger, 0., static_cast<Double_t>(2*fgkNTrigger));
  hMCPurityOFFB->GetYaxis()->SetTitle("Purity #left(#frac{OFF_{Triggered} - OFF_{Fake}}{OFF_{Triggered}}#right)");
  TH1F* hMCPurityOFFBS = new TH1F("hMCPurityOFFBS", "", 2*fgkNTrigger, 0., static_cast<Double_t>(2*fgkNTrigger));

  FillRatioHistograms(static_cast<TH1F*>(fObjArray->FindObject("fNHLTTriggered")),    
		      static_cast<TH1F*>(fObjArray->FindObject("fNHLTFakeToOFF")), hOFFPurityHLTB);
  FillRatioHistograms(static_cast<TH1F*>(fObjArray->FindObject("fNHLTTriggeredSel")),
		      static_cast<TH1F*>(fObjArray->FindObject("fNHLTFakeToOFFSel")), hOFFPurityHLTBS);

  FillRatioHistograms(static_cast<TH1F*>(fObjArray->FindObject("fNHLTTriggered")),    
		      static_cast<TH1F*>(fObjArray->FindObject("fNHLTFakeToMC")), hMCPurityHLTB);
  FillRatioHistograms(static_cast<TH1F*>(fObjArray->FindObject("fNHLTTriggeredSel")),
		      static_cast<TH1F*>(fObjArray->FindObject("fNHLTFakeToMCSel")), hMCPurityHLTBS);

  FillRatioHistograms(static_cast<TH1F*>(fObjArray->FindObject("fNOFFTriggered")),    
		      static_cast<TH1F*>(fObjArray->FindObject("fNOFFFakeToMC")), hMCPurityOFFB);
  FillRatioHistograms(static_cast<TH1F*>(fObjArray->FindObject("fNOFFTriggeredSel")),
		      static_cast<TH1F*>(fObjArray->FindObject("fNOFFFakeToMCSel")), hMCPurityOFFBS);

  TLegend* legPH = new TLegend(0.65, 0.72, 0.89, 0.87, "Event Selection");
  legPH->AddEntry(hOFFPurityHLTB, "HLT Trig - All Events","LP");
  legPH->AddEntry(hOFFPurityHLTBS,"HLT Trig - AliPhysSel - OFF PrimVertex","LP");
  legPH->SetFillColor(kWhite);

  TLegend* legPO = new TLegend(0.65, 0.72, 0.89, 0.87, "Event Selection");
  legPO->AddEntry(hMCPurityOFFB, "OFF Trig - All Events","LP");
  legPO->AddEntry(hMCPurityOFFBS,"OFF Trig - AliPhysSel - OFF PrimVertex","LP");
  legPO->SetFillColor(kWhite);

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  hOFFPurityHLTB->SetAxisRange(0,fgkNTrigger-1);
  hOFFPurityHLTB->SetAxisRange(0., 1.2, "Y");

  for ( Int_t ii=1 ; ii <= fgkNTrigger ; ii++ ){
    hOFFPurityHLTB->GetXaxis()->SetBinLabel(ii, fgkTrigger[ii-1]);
    hOFFPurityHLTB->GetXaxis()->SetBinLabel(ii+fgkNTrigger, fgkTrigger[ii-1]);
  }

  DrawHistogramTrigger(cTriggerFB, 4, hOFFPurityHLTB,  0, kFALSE);
  DrawHistogramTrigger(cTriggerFB, 4, hOFFPurityHLTBS, 1, kFALSE);
  line1->Draw();
  line2->Draw();
  legPH->Draw(); 

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  hMCPurityHLTB->SetAxisRange(0,fgkNTrigger-1);
  hMCPurityHLTB->SetAxisRange(0., 1.2, "Y");

  for ( Int_t ii=1 ; ii <= fgkNTrigger ; ii++ ){
    hMCPurityHLTB->GetXaxis()->SetBinLabel(ii, fgkTrigger[ii-1]);
    hMCPurityHLTB->GetXaxis()->SetBinLabel(ii+fgkNTrigger, fgkTrigger[ii-1]);
  }

  DrawHistogramTrigger(cTriggerFB, 5, hMCPurityHLTB,  0, kFALSE);
  DrawHistogramTrigger(cTriggerFB, 5, hMCPurityHLTBS, 1, kFALSE);
  line1->Draw();
  line2->Draw();
  legPH->Draw(); 

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  hMCPurityOFFB->SetAxisRange(0,fgkNTrigger-1);
  hMCPurityOFFB->SetAxisRange(0., 1.2, "Y");

  for ( Int_t ii=1 ; ii <= fgkNTrigger ; ii++ ){
    hMCPurityOFFB->GetXaxis()->SetBinLabel(ii, fgkTrigger[ii-1]);
    hMCPurityOFFB->GetXaxis()->SetBinLabel(ii+fgkNTrigger, fgkTrigger[ii-1]);
  }

  DrawHistogramTrigger(cTriggerFB, 6, hMCPurityOFFB,  0, kFALSE);
  DrawHistogramTrigger(cTriggerFB, 6, hMCPurityOFFBS, 1, kFALSE);
  line1->Draw();
  line2->Draw();
  legPH->Draw(); 

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
  // ---------------------------------------------------------------
  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  TH1F* hOFFEffHLTB  = new TH1F("hOFFEffHLTB", "HLT Trigger Efficiency vs OFF", 2*fgkNTrigger, 0., static_cast<Double_t>(2*fgkNTrigger));
  hOFFEffHLTB->GetYaxis()->SetTitle("Efficiency #left(#frac{OFF_{Triggered} - HLT_{Miss}}{OFF_{Triggered}}#right)");
  TH1F* hOFFEffHLTBS = new TH1F("hOFFEffHLTBS", "", 2*fgkNTrigger, 0., static_cast<Double_t>(2*fgkNTrigger));

  TH1F* hMCEffHLTB  = new TH1F("hMCEffHLTB", "HLT Trigger Efficiency vs MC", 2*fgkNTrigger, 0., static_cast<Double_t>(2*fgkNTrigger));
  hMCEffHLTB->GetYaxis()->SetTitle("Efficiency #left(#frac{MC_{Triggered} - HLT_{Miss}}{MC_{Triggered}}#right)");
  TH1F* hMCEffHLTBS = new TH1F("hMCEffHLTBS", "", 2*fgkNTrigger, 0., static_cast<Double_t>(2*fgkNTrigger));

  TH1F* hMCEffOFFB  = new TH1F("hMCEffOFFB", "OFF Trigger Efficiency vs MC", 2*fgkNTrigger, 0., static_cast<Double_t>(2*fgkNTrigger));
  hMCEffOFFB->GetYaxis()->SetTitle("Efficiency #left(#frac{MC_{Triggered} - OFF_{Miss}}{MC_{Triggered}}#right)");
  TH1F* hMCEffOFFBS = new TH1F("hMCEffOFFBS", "", 2*fgkNTrigger, 0., static_cast<Double_t>(2*fgkNTrigger));

  
  FillRatioHistograms(static_cast<TH1F*>(fObjArray->FindObject("fNOFFTriggered")),    
		      static_cast<TH1F*>(fObjArray->FindObject("fNHLTMissToOFF")), hOFFEffHLTB);
  FillRatioHistograms(static_cast<TH1F*>(fObjArray->FindObject("fNOFFTriggeredSel")),
		      static_cast<TH1F*>(fObjArray->FindObject("fNHLTMissToOFFSel")), hOFFEffHLTBS);
 
  FillRatioHistograms(static_cast<TH1F*>(fObjArray->FindObject("fNMCTriggered")),    
		      static_cast<TH1F*>(fObjArray->FindObject("fNHLTMissToMC")), hMCEffHLTB);
  FillRatioHistograms(static_cast<TH1F*>(fObjArray->FindObject("fNMCTriggeredSel")),
		      static_cast<TH1F*>(fObjArray->FindObject("fNHLTMissToMCSel")), hMCEffHLTBS);

  FillRatioHistograms(static_cast<TH1F*>(fObjArray->FindObject("fNMCTriggered")),    
		      static_cast<TH1F*>(fObjArray->FindObject("fNOFFMissToMC")), hMCEffOFFB);
  FillRatioHistograms(static_cast<TH1F*>(fObjArray->FindObject("fNMCTriggeredSel")),
		      static_cast<TH1F*>(fObjArray->FindObject("fNOFFMissToMCSel")), hMCEffOFFBS);


  TLegend* legEH = new TLegend(0.65, 0.70, 0.89, 0.85, "Event Selection");
  legEH->AddEntry(hOFFEffHLTB, "HLT Trig - All Events","LP");
  legEH->AddEntry(hOFFEffHLTBS,"HLT Trig - AliPhysSel - OFF PrimVertex","LP");
  legEH->SetFillColor(kWhite);

  TLegend* legEO = new TLegend(0.65, 0.70, 0.89, 0.85, "Event Selection");
  legEO->AddEntry(hMCEffOFFB, "OFF Trig - All Events","LP");
  legEO->AddEntry(hMCEffOFFBS,"OFF Trig - AliPhysSel - OFF PrimVertex","LP");
  legEO->SetFillColor(kWhite);

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  hOFFEffHLTB->SetAxisRange(0,fgkNTrigger-1);
  hOFFEffHLTB->SetAxisRange(0., 1.2, "Y");
 
  for ( Int_t ii=1 ; ii <= fgkNTrigger ; ii++ ){
    hOFFEffHLTB->GetXaxis()->SetBinLabel(ii, fgkTrigger[ii-1]);
    hOFFEffHLTB->GetXaxis()->SetBinLabel(ii+fgkNTrigger, fgkTrigger[ii-1]);
  }

  DrawHistogramTrigger(cTriggerFB, 7, hOFFEffHLTB, 0, kFALSE);
  DrawHistogramTrigger(cTriggerFB, 7, hOFFEffHLTBS, 1, kFALSE);
  line1->Draw();
  line2->Draw();
  legEH->Draw(); 

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  hMCEffHLTB->SetAxisRange(0,fgkNTrigger-1);
  hMCEffHLTB->SetAxisRange(0., 1.2, "Y");

  for ( Int_t ii=1 ; ii <= fgkNTrigger ; ii++ ){
    hMCEffHLTB->GetXaxis()->SetBinLabel(ii, fgkTrigger[ii-1]);
    hMCEffHLTB->GetXaxis()->SetBinLabel(ii+fgkNTrigger, fgkTrigger[ii-1]);
  }

  DrawHistogramTrigger(cTriggerFB, 8, hMCEffHLTB,  0, kFALSE);
  DrawHistogramTrigger(cTriggerFB, 8, hMCEffHLTBS, 1, kFALSE);
  line1->Draw();
  line2->Draw();
  legEH->Draw(); 

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  hMCEffOFFB->SetAxisRange(0,fgkNTrigger-1);
  hMCEffOFFB->SetAxisRange(0., 1.2, "Y");

  for ( Int_t ii=1 ; ii <= fgkNTrigger ; ii++ ){
    hMCEffOFFB->GetXaxis()->SetBinLabel(ii, fgkTrigger[ii-1]);
    hMCEffOFFB->GetXaxis()->SetBinLabel(ii+fgkNTrigger, fgkTrigger[ii-1]);
  }

  DrawHistogramTrigger(cTriggerFB, 9, hMCEffOFFB,  0, kFALSE);
  DrawHistogramTrigger(cTriggerFB, 9, hMCEffOFFBS, 1, kFALSE);
  line1->Draw();
  line2->Draw();
  legEO->Draw(); 

  cTriggerFB->SaveAs(Form("TriggerHists_%d_B.png",++fgImgIdx));

  for ( Int_t ii=1 ; ii <= fgkNTrigger ; ii++ ){
    if (fgkTriggerPt[ii-1] > 20. )
      continue;

    printf("=================================\n");
    printf(" Trigger Pt %.2f GeV/c \n", fgkTriggerPt[ii-1]);
    printf("=================================\n");
    printf(" - HLT Redux Factor  : %.2f - %.2f Hz (1500 Hz) - %.2f Hz (800 Hz) \n", 
	   hHLTReduxB->GetBinContent(ii), 1500/hHLTReduxB->GetBinContent(ii), 800/hHLTReduxB->GetBinContent(ii) );
    printf(" - OFF Redux Factor  : %.2f - %.2f Hz (1500 Hz) - %.2f Hz (800 Hz) \n", 
	   hOFFReduxB->GetBinContent(ii), 1500/hOFFReduxB->GetBinContent(ii), 800/hOFFReduxB->GetBinContent(ii) );
    printf(" - MC  Redux Factor  : %.2f - %.2f Hz (1500 Hz) - %.2f Hz (800 Hz) \n", 
	   hMCReduxB->GetBinContent(ii), 1500/hMCReduxB->GetBinContent(ii), 800/hMCReduxB->GetBinContent(ii) );
    printf("---------------------------------\n");
    printf(" - HLT Purity vs OFF : %.3f | HLT Eff vs OFF : %.3f \n", hOFFPurityHLTB->GetBinContent(ii),hOFFEffHLTB->GetBinContent(ii));
    printf(" - HLT Purity vs MC  : %.3f | HLT Eff vs MC  : %.3f \n", hMCPurityHLTB->GetBinContent(ii), hMCEffHLTB->GetBinContent(ii) );
    printf(" - OFF Purity vs MC  : %.3f | OFF Eff vs MC  : %.3f \n", hMCPurityOFFB->GetBinContent(ii), hMCEffOFFB->GetBinContent(ii) );
  }
 
  for ( Int_t ii=1 ; ii <= fgkNTrigger ; ii++ ){
    if (fgkTriggerPt[ii-1] < 20. )
      continue;

    printf("=================================\n");
    printf(" Trigger Scenario %.0f \n", fgkTriggerPt[ii-1]-1000+1);
    printf("=================================\n");
    printf(" - HLT Redux Factor  : %.2f - %.2f Hz (1500 Hz) - %.2f Hz (800 Hz) \n", 
	   hHLTReduxB->GetBinContent(ii), 1500/hHLTReduxB->GetBinContent(ii), 800/hHLTReduxB->GetBinContent(ii) );
    printf(" - OFF Redux Factor  : %.2f - %.2f Hz (1500 Hz) - %.2f Hz (800 Hz) \n", 
	   hOFFReduxB->GetBinContent(ii), 1500/hOFFReduxB->GetBinContent(ii), 800/hOFFReduxB->GetBinContent(ii) );
    printf(" - MC  Redux Factor  : %.2f - %.2f Hz (1500 Hz) - %.2f Hz (800 Hz) \n", 
	   hMCReduxB->GetBinContent(ii), 1500/hMCReduxB->GetBinContent(ii), 800/hMCReduxB->GetBinContent(ii) );
    printf("---------------------------------\n");
    printf(" - HLT Purity vs OFF : %.3f | HLT Eff vs OFF : %.3f \n", hOFFPurityHLTB->GetBinContent(ii),hOFFEffHLTB->GetBinContent(ii));
    printf(" - HLT Purity vs MC  : %.3f | HLT Eff vs MC  : %.3f \n", hMCPurityHLTB->GetBinContent(ii), hMCEffHLTB->GetBinContent(ii) );
    printf(" - OFF Purity vs MC  : %.3f | OFF Eff vs MC  : %.3f \n", hMCPurityOFFB->GetBinContent(ii), hMCEffOFFB->GetBinContent(ii) );
  }


  return;
}

//#######################################################################
void CanvasTriggerFactors() {

  TCanvas *cTriggerR = new TCanvas("cTriggerR", "Reduction Factors", 10, 10, 1400, 800);
  cTriggerR->Divide(1,2);

  TCanvas *cTriggerEP = new TCanvas("cTriggerEP", "Purity - Efficiency", 10, 10, 1400, 800);
  cTriggerEP->Divide(3,2);
 
  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  Float_t ptMin = -0.25;
  Float_t ptMax = 12.75;
  Int_t nBins   = 26;

  Float_t maxLine = 0.9;
  Float_t minLine = 0.8;

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  TLine* line1 = new TLine(0.,maxLine,ptMax,maxLine);
  line1->SetLineStyle(2);
  line1->SetLineColor(kGreen);

  TLine* line2 = new TLine(0.,minLine,ptMax,minLine);
  line2->SetLineStyle(2);
  line2->SetLineColor(kRed);

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  TH1F* hOFFRedux   = new TH1F("hOFFRedux", "Reduction Factors", nBins, ptMin, ptMax); 
  hOFFRedux->GetXaxis()->SetTitle("p_{t} (GeV/c)");
  hOFFRedux->GetYaxis()->SetTitle("Reduction #left(#frac{N Events_{Total}}{N Events_{Triggered}}#right)");

  TH1F* hOFFReduxS  = new TH1F("hOFFReduxS", "", nBins, ptMin, ptMax); 
  TH1F* hHLTRedux   = new TH1F("hHLTRedux",  "", nBins, ptMin, ptMax); 
  TH1F* hHLTReduxS  = new TH1F("hHLTReduxS", "", nBins, ptMin, ptMax); 
  TH1F* hMCRedux    = new TH1F("hMCRedux",   "", nBins, ptMin, ptMax); 
  TH1F* hMCReduxS   = new TH1F("hMCReduxS",  "", nBins, ptMin, ptMax); 

  TH1F* hOFFReduxW   = new TH1F("hOFFReduxW", "Reduction Factors - weighted nTracks", nBins, ptMin, ptMax); 
  hOFFReduxW->GetXaxis()->SetTitle("p_{t} (GeV/c)");
  hOFFReduxW->GetYaxis()->SetTitle("Reduction #left(#frac{N Events_{Total}}{N Events_{Triggered}}#right)");

  TH1F* hOFFReduxWS  = new TH1F("hOFFReduxWS", "", nBins, ptMin, ptMax); 
  TH1F* hHLTReduxW   = new TH1F("hHLTReduxW",  "", nBins, ptMin, ptMax); 
  TH1F* hHLTReduxWS  = new TH1F("hHLTReduxWS", "", nBins, ptMin, ptMax); 
  TH1F* hMCReduxW    = new TH1F("hMCReduxW",   "", nBins, ptMin, ptMax); 
  TH1F* hMCReduxWS   = new TH1F("hMCReduxWS",  "", nBins, ptMin, ptMax); 

  FillReduxHistogramsPt(static_cast<TH1F*>(fObjArray->FindObject("fNOFFTriggered")),    hOFFRedux,  hOFFReduxW);
  FillReduxHistogramsPt(static_cast<TH1F*>(fObjArray->FindObject("fNOFFTriggeredSel")), hOFFReduxS, hOFFReduxWS);
  FillReduxHistogramsPt(static_cast<TH1F*>(fObjArray->FindObject("fNHLTTriggered")),    hHLTRedux,  hHLTReduxW);
  FillReduxHistogramsPt(static_cast<TH1F*>(fObjArray->FindObject("fNHLTTriggeredSel")), hHLTReduxS, hHLTReduxWS);
  FillReduxHistogramsPt(static_cast<TH1F*>(fObjArray->FindObject("fNMCTriggered")),     hMCRedux,   hMCReduxW);
  FillReduxHistogramsPt(static_cast<TH1F*>(fObjArray->FindObject("fNMCTriggeredSel")),  hMCReduxS,  hMCReduxWS);

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  TLegend* legR = new TLegend(0.65, 0.12, 0.89, 0.37, "Event Selection");
  legR->AddEntry(hOFFRedux, "OFF Trig - All Events","LP");
  legR->AddEntry(hOFFReduxS,"OFF Trig - AliPhysSel - OFF PrimVertex","LP");
  legR->AddEntry(hHLTRedux, "HLT Trig - All Events","LP");
  legR->AddEntry(hHLTReduxS,"HLT Trig - AliPhysSel - OFF PrimVertex","LP");
  legR->AddEntry(hMCRedux,  "MC Trig - All Events","LP");
  legR->AddEntry(hMCReduxS, "MC Trig - AliPhysSel - OFF PrimVertex","LP");
  legR->SetFillColor(kWhite);

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  DrawHistogramTrigger(cTriggerR, 1, hOFFRedux,  0, kTRUE);
  DrawHistogramTrigger(cTriggerR, 1, hOFFReduxS, 1, kTRUE);
  DrawHistogramTrigger(cTriggerR, 1, hHLTRedux,  2, kTRUE);
  DrawHistogramTrigger(cTriggerR, 1, hHLTReduxS, 3, kTRUE);
  DrawHistogramTrigger(cTriggerR, 1, hMCRedux,   4, kTRUE);
  DrawHistogramTrigger(cTriggerR, 1, hMCReduxS,  5, kTRUE);
  legR->Draw();

  DrawHistogramTrigger(cTriggerR, 2, hOFFReduxW,  0, kTRUE);
  DrawHistogramTrigger(cTriggerR, 2, hOFFReduxWS, 1, kTRUE);
  DrawHistogramTrigger(cTriggerR, 2, hHLTReduxW,  2, kTRUE);
  DrawHistogramTrigger(cTriggerR, 2, hHLTReduxWS, 3, kTRUE);
  DrawHistogramTrigger(cTriggerR, 2, hMCReduxW,   4, kTRUE);
  DrawHistogramTrigger(cTriggerR, 2, hMCReduxWS,  5, kTRUE);
  legR->Draw();

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
  // ---------------------------------------------------------------
  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  TH1F* hOFFPurityHLT  = new TH1F("hOFFPurityHLT", "HLT Trigger Purity vs OFF", nBins, ptMin, ptMax);
  hOFFPurityHLT->GetXaxis()->SetTitle("p_{t} (GeV/c)");
  hOFFPurityHLT->GetYaxis()->SetTitle("Purity #left(#frac{HLT_{Triggered} - HLT_{Fake}}{HLT_{Triggered}}#right)");
  hOFFPurityHLT->SetMinimum(0.0);
  hOFFPurityHLT->SetMaximum(1.2);
  TH1F* hOFFPurityHLTS = new TH1F("hOFFPurityHLTS", "", nBins, ptMin, ptMax);

  TH1F* hMCPurityHLT  = new TH1F("hMCPurityHLT", "HLT Trigger Purity vs MC", nBins, ptMin, ptMax);
  hMCPurityHLT->GetXaxis()->SetTitle("p_{t} (GeV/c)");
  hMCPurityHLT->GetYaxis()->SetTitle("Purity #left(#frac{HLT_{Triggered} - HLT_{Fake}}{HLT_{Triggered}}#right)");
  hMCPurityHLT->SetMinimum(0.0);
  hMCPurityHLT->SetMaximum(1.2);
  TH1F* hMCPurityHLTS = new TH1F("hMCPurityHLTS", "", nBins, ptMin, ptMax);

  TH1F* hMCPurityOFF  = new TH1F("hMCPurityOFF", "OFF Trigger Purity vs MC", nBins, ptMin, ptMax);
  hMCPurityOFF->GetXaxis()->SetTitle("p_{t} (GeV/c)");
  hMCPurityOFF->GetYaxis()->SetTitle("Purity #left(#frac{OFF_{Triggered} - OFF_{Fake}}{OFF_{Triggered}}#right)");
  hMCPurityOFF->SetMinimum(0.0);
  hMCPurityOFF->SetMaximum(1.2);
  TH1F* hMCPurityOFFS = new TH1F("hMCPurityOFFS", "", nBins, ptMin, ptMax);


  FillRatioHistogramsPt(static_cast<TH1F*>(fObjArray->FindObject("fNHLTTriggered")),    
			static_cast<TH1F*>(fObjArray->FindObject("fNHLTFakeToOFF")), hOFFPurityHLT);

  FillRatioHistogramsPt(static_cast<TH1F*>(fObjArray->FindObject("fNHLTTriggeredSel")),
			static_cast<TH1F*>(fObjArray->FindObject("fNHLTFakeToOFFSel")), hOFFPurityHLTS);

  FillRatioHistogramsPt(static_cast<TH1F*>(fObjArray->FindObject("fNHLTTriggered")),    
			static_cast<TH1F*>(fObjArray->FindObject("fNHLTFakeToMC")), hMCPurityHLT);

  FillRatioHistogramsPt(static_cast<TH1F*>(fObjArray->FindObject("fNHLTTriggeredSel")),
			static_cast<TH1F*>(fObjArray->FindObject("fNHLTFakeToMCSel")), hMCPurityHLTS);

  FillRatioHistogramsPt(static_cast<TH1F*>(fObjArray->FindObject("fNOFFTriggered")),    
			static_cast<TH1F*>(fObjArray->FindObject("fNOFFFakeToMC")), hMCPurityOFF);

  FillRatioHistogramsPt(static_cast<TH1F*>(fObjArray->FindObject("fNOFFTriggeredSel")),
			static_cast<TH1F*>(fObjArray->FindObject("fNOFFFakeToMCSel")), hMCPurityOFFS);

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  TLegend* legPH = new TLegend(0.65, 0.72, 0.89, 0.87, "Event Selection");
  legPH->AddEntry(hOFFPurityHLT, "HLT Trig - All Events","LP");
  legPH->AddEntry(hOFFPurityHLTS,"HLT Trig - AliPhysSel - OFF PrimVertex","LP");
  legPH->SetFillColor(kWhite);

  TLegend* legPO = new TLegend(0.65, 0.72, 0.89, 0.87, "Event Selection");
  legPO->AddEntry(hMCPurityOFF, "OFF Trig - All Events","LP");
  legPO->AddEntry(hMCPurityOFFS,"OFF Trig - AliPhysSel - OFF PrimVertex","LP");
  legPO->SetFillColor(kWhite);

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  DrawHistogramTrigger(cTriggerEP, 1, hOFFPurityHLT,  0, kFALSE);
  DrawHistogramTrigger(cTriggerEP, 1, hOFFPurityHLTS, 1, kFALSE);
  line1->Draw();
  line2->Draw();
  legPH->Draw(); 

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  DrawHistogramTrigger(cTriggerEP, 2, hMCPurityHLT,  0, kFALSE);
  DrawHistogramTrigger(cTriggerEP, 2, hMCPurityHLTS, 1, kFALSE);
  line1->Draw();
  line2->Draw();
  legPH->Draw(); 

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  DrawHistogramTrigger(cTriggerEP, 3, hMCPurityOFF,  0, kFALSE);
  DrawHistogramTrigger(cTriggerEP, 3, hMCPurityOFFS, 1, kFALSE);
  line1->Draw();
  line2->Draw();
  legPO->Draw(); 

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
  // ---------------------------------------------------------------
  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  TH1F* hOFFEffHLT  = new TH1F("hOFFEffHLT", "HLT Trigger Efficiency vs OFF", nBins, ptMin, ptMax);
  hOFFEffHLT->GetXaxis()->SetTitle("p_{t} (GeV/c)");
  hOFFEffHLT->GetYaxis()->SetTitle("Efficiency #left(#frac{OFF_{Triggered} - HLT_{Miss}}{OFF_{Triggered}}#right)");
  hOFFEffHLT->SetMinimum(0.0);
  hOFFEffHLT->SetMaximum(1.2);
  TH1F* hOFFEffHLTS = new TH1F("hOFFEffHLTS", "", nBins, ptMin, ptMax);

  TH1F* hMCEffHLT  = new TH1F("hMCEffHLT","HLT Trigger Efficiency vs MC", nBins, ptMin, ptMax);
  hMCEffHLT->GetXaxis()->SetTitle("p_{t} (GeV/c)");
  hMCEffHLT->GetYaxis()->SetTitle("Efficiency #left(#frac{MC_{Triggered} - HLT_{Miss}}{MC_{Triggered}}#right)");
  hMCEffHLT->SetMinimum(0.0);
  hMCEffHLT->SetMaximum(1.2);
  TH1F* hMCEffHLTS = new TH1F("hMCEffHLTS", "", nBins, ptMin, ptMax);

  TH1F* hMCEffOFF  = new TH1F("hMCEffOFF","OFF Trigger Efficiency vs MC", nBins, ptMin, ptMax);
  hMCEffOFF->GetXaxis()->SetTitle("p_{t} (GeV/c)");
  hMCEffOFF->GetYaxis()->SetTitle("Efficiency #left(#frac{MC_{Triggered} - OFF_{Miss}}{MC_{Triggered}}#right)");
  hMCEffOFF->SetMinimum(0.0);
  hMCEffOFF->SetMaximum(1.2);
  TH1F* hMCEffOFFS = new TH1F("hMCEffOFFS", "", nBins, ptMin, ptMax);

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  FillRatioHistogramsPt(static_cast<TH1F*>(fObjArray->FindObject("fNOFFTriggered")),    
		      static_cast<TH1F*>(fObjArray->FindObject("fNHLTMissToOFF")), hOFFEffHLT);

  FillRatioHistogramsPt(static_cast<TH1F*>(fObjArray->FindObject("fNOFFTriggeredSel")),
		      static_cast<TH1F*>(fObjArray->FindObject("fNHLTMissToOFFSel")), hOFFEffHLTS);

  FillRatioHistogramsPt(static_cast<TH1F*>(fObjArray->FindObject("fNMCTriggered")),    
		      static_cast<TH1F*>(fObjArray->FindObject("fNHLTMissToMC")), hMCEffHLT);

  FillRatioHistogramsPt(static_cast<TH1F*>(fObjArray->FindObject("fNMCTriggeredSel")),
		      static_cast<TH1F*>(fObjArray->FindObject("fNHLTMissToMCSel")), hMCEffHLTS);

  FillRatioHistogramsPt(static_cast<TH1F*>(fObjArray->FindObject("fNMCTriggered")),    
		      static_cast<TH1F*>(fObjArray->FindObject("fNOFFMissToMC")), hMCEffOFF);

  FillRatioHistogramsPt(static_cast<TH1F*>(fObjArray->FindObject("fNMCTriggeredSel")),
		      static_cast<TH1F*>(fObjArray->FindObject("fNOFFMissToMCSel")), hMCEffOFFS);

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  TLegend* legEH = new TLegend(0.65, 0.70, 0.89, 0.85, "Event Selection");
  legEH->AddEntry(hOFFEffHLT, "HLT Trig - All Events","LP");
  legEH->AddEntry(hOFFEffHLTS,"HLT Trig - AliPhysSel - OFF PrimVertex","LP");
  legEH->SetFillColor(kWhite);

  TLegend* legEO = new TLegend(0.65, 0.70, 0.89, 0.85, "Event Selection");
  legEO->AddEntry(hMCEffOFF, "OFF Trig - All Events","LP");
  legEO->AddEntry(hMCEffOFFS,"OFF Trig - AliPhysSel - OFF PrimVertex","LP");
  legEO->SetFillColor(kWhite);

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  DrawHistogramTrigger(cTriggerEP, 4, hOFFEffHLT, 0, kFALSE);
  DrawHistogramTrigger(cTriggerEP, 4, hOFFEffHLTS, 1, kFALSE);
  line1->Draw();
  line2->Draw();
  legEH->Draw(); 

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  DrawHistogramTrigger(cTriggerEP, 5, hMCEffHLT,  0, kFALSE);
  DrawHistogramTrigger(cTriggerEP, 5, hMCEffHLTS, 1, kFALSE);
  line1->Draw();
  line2->Draw();
  legEH->Draw(); 

  // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

  DrawHistogramTrigger(cTriggerEP, 6, hMCEffOFF,  0, kFALSE);
  DrawHistogramTrigger(cTriggerEP, 6, hMCEffOFFS, 1, kFALSE);
  line1->Draw();
  line2->Draw();
  legEO->Draw(); 

  cTriggerR->SaveAs(Form("TriggerHists_%d.png",++fgImgIdx));
  cTriggerEP->SaveAs(Form("TriggerHists_%d.png",++fgImgIdx));

  return;
}

//#######################################################################
void CreateCanvasCuts() {

  Char_t * type[] = {"MC","OFF","HLT","HLT/MC","HLT/OFF","OFF/MC",
		     "MC","OFF","HLT","HLT/MC","HLT/OFF","OFF/MC" };
  Char_t * histType[] = {"Pt","Mult"};

  Float_t ptXMin = 0.3;
  Float_t ptXMax = 20.;
  Float_t ptYMin = 1.;
  Float_t ptYMax = 1e6;

  Float_t multXMin = 3.;
  Float_t multXMax = 50.;
  Float_t multYMin = 1.;
  Float_t multYMax = 1e5;

  Int_t   maxPads = 12;
  Int_t   iMax = 2;

  // ----------------------------------------------------------------------------

  TCanvas *cEvCuts = new TCanvas("cEvCuts", "Pt Event Selection - Cut Studies", 10, 10, 1400, 800);
  cEvCuts->Divide(3,2);

  TCanvas *cTrCuts = new TCanvas("cTrCuts", "Pt Track Selection - Cut Studies", 10, 10, 1400, 800);
  cTrCuts->Divide(3,2);

  TCanvas *cEvCuts2 = new TCanvas("cEvCuts2", "Mult Event Selection - Cut Studies", 10, 10, 1400, 800);
  cEvCuts2->Divide(3,2);

  TCanvas *cTrCuts2 = new TCanvas("cTrCuts2", "Mult Track Selection - Cut Studies", 10, 10, 1400, 800);
  cTrCuts2->Divide(3,2);

  // ----------------------------------------------------------------------------

  TLegend* legEvCuts[maxPads];
  TLegend* legTrCuts[maxPads];

  for ( Int_t idx=0; idx < maxPads; idx++ ) {

    if ( idx < maxPads/2) { // -- Pt
    
      if ( idx >= 3 && idx < 6) { // ratio
	legEvCuts[idx] = new TLegend(0.14, 0.75, 0.55, 0.88, 
				     Form("Event Selection - P_{t} Cut Studies (%s)", type[idx])); 

	legTrCuts[idx] = new TLegend(0.14, 0.75, 0.55, 0.88, 
				     Form("Track Selection - P_{t} Cut Studies (%s)", type[idx])); 
      }
      else {
	legEvCuts[idx] = new TLegend(0.14, 0.16, 0.55, 0.29, 
				     Form("Event Selection - P_{t} Cut Studies (%s)", type[idx])); 
  
	legTrCuts[idx] = new TLegend(0.14, 0.16, 0.55, 0.29, 
				     Form("Track Selection - P_{t} Cut Studies (%s)", type[idx])); 
      }
      
      legEvCuts[idx]->SetFillColor(kWhite);
      legTrCuts[idx]->SetFillColor(kWhite);
    }
    else { // -- Multiplicity
      legEvCuts[idx] = new TLegend(0.48, 0.75, 0.89, 0.88, 
				   Form("Event Selection - Multiplicity Cut Studies (%s)", type[idx])); 
      legEvCuts[idx]->SetFillColor(kWhite);
      
      legTrCuts[idx] = new TLegend(0.48, 0.75, 0.89, 0.88, 
				   Form("Track Selection - Multiplicity Cut Studies (%s)", type[idx])); 
      legTrCuts[idx]->SetFillColor(kWhite);
    }
  }

  // ----------------------------------------------------------------------------

  for ( Int_t hType = 0; hType < 2; hType++ ) {
    
    TCanvas* can = NULL;
    TCanvas* can2 = NULL;
    if ( hType == 0 ) {
      can  = cEvCuts;
      can2 = cEvCuts2;
    }
    else if ( hType == 1 ) {
      can  = cTrCuts;
      can2  = cTrCuts2;
    }

    for ( Int_t ipad=1; ipad <= maxPads; ipad++ ) {

      Int_t pad = ipad;

      // -- Legends
      TLegend* leg = NULL;
      if ( hType == 0 )
	leg  = legEvCuts[pad-1];
      else if ( hType == 1 )
	leg  = legTrCuts[pad-1];

      // -- Pt / Multiplicity
      Bool_t xLog = kTRUE;
      Int_t hIdx = 0;
      Float_t xMin, xMax, yMin, yMax;
      if ( ipad <= maxPads/2 ) { // -- Pt
	hIdx = 0; 
	xLog = kTRUE;
	xMin = ptXMin;
	xMax = ptXMax;
	yMin = ptYMin;
	yMax = ptYMax;
      }
      else { // -- Multiplicity
	hIdx = 1; 
	xLog = kFALSE;
	pad = ipad - maxPads/2;
	can = can2;
	xMin = multXMin;
	xMax = multXMax;
	yMin = multYMin;
	yMax = multYMax;
      }
     
      // ----------------------------------------------------------------------------

      for ( Int_t idx = 0; idx <= iMax; idx++ ) {

	Int_t iIdx = idx;
	if ( hType == 1 ) // -- Track selection
	  iIdx = idx+2;

	TH1F* hO  = static_cast<TH1F*>(fObjArray->FindObject(Form("fHistOFF%s_%d", histType[hIdx],iIdx)));
	TH1F* hH = static_cast<TH1F*>(fObjArray->FindObject(Form("fHistHLT%s_%d", histType[hIdx], iIdx)));
	TH1F* hM = static_cast<TH1F*>(fObjArray->FindObject(Form("fHistMC%s_%d", histType[hIdx], iIdx)));
	
	if ( hType == 0 ) {  // Event selection
	  hO->SetTitle(Form("OFF %s Distribution - Event Selection", histType[hIdx]));
	  hH->SetTitle(Form("HLT %s Distribution - Event Selection", histType[hIdx]));
	  hM->SetTitle(Form("MC %s Distribution - Event Selection", histType[hIdx]));
	}
	else {
	  hO->SetTitle(Form("OFF %s Distribution - Track Selection", histType[hIdx]));
	  hH->SetTitle(Form("HLT %s Distribution - Track Selection", histType[hIdx]));
	  hM->SetTitle(Form("MC %s Distribution - Track Selection", histType[hIdx]));
	}
	
	hO->SetAxisRange(xMin, xMax);
	hH->SetAxisRange(xMin, xMax);
	hM->SetAxisRange(xMin, xMax);
	hO->SetAxisRange(yMin, yMax, "Y");
	hH->SetAxisRange(yMin, yMax, "Y");
	hM->SetAxisRange(yMin, yMax, "Y");

       	if (pad == 1 || pad == 7) {
	  DrawHistogram(can, pad, hM, idx, kFALSE, kTRUE, xLog);
	  leg->AddEntry(hM, fgkSelectionCutsMC[iIdx],"L");
	  leg->Draw();
	}
	else if (pad == 2 || pad == 8 ) {
	  DrawHistogram(can, pad, hO, idx, kFALSE, kTRUE, xLog);
	  leg->AddEntry(hO, fgkSelectionCuts[iIdx],"L");
	  leg->Draw();
	}
	else if (pad == 3 || pad == 9 ) {
	  DrawHistogram(can, pad, hH, idx, kFALSE, kTRUE, xLog);
	  leg->AddEntry(hH, fgkSelectionCuts[iIdx],"L");
	  leg->Draw();
	}
	else if (pad == 4 || pad == 10 ) {

	  TH1F* hClone0= static_cast<TH1F*>(hH->Clone());
	  DivideHist(hClone0, hH, hM);

	  if (hIdx == 0)
	    SetHist(hClone0, hType, type[pad-1], histType[hIdx], 0., 3.);
	  else
	    SetHist(hClone0, hType, type[pad-1], histType[hIdx], 0., 10.);

	  DrawHistogram(can, pad, hClone0, idx, kFALSE, kFALSE, xLog);
	  leg->AddEntry(hClone0, fgkSelectionCutsRatioMC[iIdx],"L");
	  leg->Draw();
	}
	else if (pad == 5 || pad == 11 ) {

	  TH1F* hClone1= static_cast<TH1F*>(hH->Clone());
	  DivideHist(hClone1, hH, hO);
	  
	  if (hIdx == 0)
	    SetHist(hClone1, hType, type[pad-1], histType[hIdx], 0., 3.);
	  else
	    SetHist(hClone1, hType, type[pad-1], histType[hIdx], 0., 10.);

	  DrawHistogram(can, pad, hClone1, idx, kFALSE, kFALSE, xLog);
	  leg->AddEntry(hClone1, fgkSelectionCuts[iIdx],"L");
	  leg->Draw();
	}
	else if (pad == 6 || pad == 12 ) {

	  TH1F* hClone2= static_cast<TH1F*>(hO->Clone());
	  DivideHist(hClone2, hO, hM);

	  if (hIdx == 0)
	    SetHist(hClone2, hType, type[pad-1], histType[hIdx], 0., 3.);
	  else
	    SetHist(hClone2, hType, type[pad-1], histType[hIdx], 0., 10.);
	      
	  DrawHistogram(can, pad, hClone2, idx, kFALSE, kFALSE, xLog);
	  leg->AddEntry(hClone2, fgkSelectionCutsRatioMC[iIdx],"L");
	  leg->Draw();
	}
      } // for ( Int_t idx = 0; idx <=2; idx++ ) {
    } // for ( Int_t pad=1; pad <=4; pad++ ) {
  } // for ( Int_t hType = 0; hType < 4; hType++ ) {
  

  if (cEvCuts)  cEvCuts->SaveAs(Form("TriggerHists_Cuts_%d_B.png",++fgImgIdx));
  if (cEvCuts2) cEvCuts2->SaveAs(Form("TriggerHists_Cuts_%d_B.png",++fgImgIdx));
  if (cTrCuts)  cTrCuts->SaveAs(Form("TriggerHists_Cuts_%d_B.png",++fgImgIdx));
  if (cTrCuts2) cTrCuts2->SaveAs(Form("TriggerHists_Cuts_%d_B.png",++fgImgIdx));

  return;
}

//#######################################################################
void CreateCanvasDistributions( Int_t maxLayer, Int_t draw, Int_t data, Int_t minLayer ) {

  Float_t maxLine = 0.9;
  Float_t minLine = 0.8;

  Int_t compHist = 3;
  Float_t ptMin = 0.3;
  Float_t ptMax = 40.;

  Char_t * type[] = {"MC","OFF","HLT"};
  Char_t * histType[] = {"Pt","Mult"};

  // ----------------------------------------------------------------------------

  TCanvas *cSpectra = NULL;
  TCanvas *cSpectraEff = NULL;
  TCanvas *cMult = NULL;
  TCanvas *cMultEff = NULL;

  TLegend* legPt[6];
  TLegend* legPtEff[6];
  TLegend* legMult[6];
  TLegend* legMultEff[6];

  // ----------------------------------------------------------------------------
  Int_t canvasRows = 1;

  if ( data == 2 )
    canvasRows = 2;

  if ( draw == 0 || draw == 2 ) {
    cSpectra = new TCanvas("cSpectra", "Triggered - P_{t} Distributions", 10, 10, 1400, 800);
    cSpectra->Divide(3,canvasRows);

   cSpectraEff = new TCanvas("cSpectraEff", "Triggered - P_{t} Efficiencies", 10, 10, 1400, 800);
   cSpectraEff->Divide(3,canvasRows);
  }

  if ( draw == 1 || draw == 2 ) {
    cMult = new TCanvas("cMult", "Triggered - Multiplicity Distributions", 10, 10, 1400, 800);
    cMult->Divide(3,canvasRows);

    cMultEff = new TCanvas("cMultEff", "Triggered - Multiplicity Efficiencies", 10, 10, 1400, 800);
    cMultEff->Divide(3,canvasRows);
  }

  // ----------------------------------------------------------------------------
  for ( Int_t hType = 0; hType < 2; hType++ ) {

    if ( hType != draw && draw != 2)
      continue;

    for ( Int_t pad=1; pad <=6; pad++ ) {

      if ( data == 0 && pad > 3 ) 
	continue;

      if ( data == 1 && pad < 4 ) 
	continue;
      
      TCanvas* can = NULL;
      TCanvas* canEff = NULL;

      TLegend* leg = NULL;
      TLegend* legEff = NULL;

      Bool_t xLog = kTRUE;
      Char_t* trigType = "";
      Char_t* dataType = "OFF";

      Int_t iIdx = 0;
      Int_t layer = 0;

      if ( pad == 1 || pad == 4 ) {
	iIdx = 0;
	trigType = "MC";
      }
      else if ( pad == 2 || pad == 5 ) {
	iIdx = 1;
	trigType = "OFF";
      }
      else if ( pad == 3 || pad == 6 ) {
	iIdx = 2;
	trigType = "HLT";
      }
      else
	continue;

      if ( pad > 3 )
	dataType = "MC";
      
      if ( hType == 0 ) {
	can  = cSpectra;
	canEff  = cSpectraEff;
	leg  = legPt[pad-1];
	legEff  = legPtEff[pad-1];
	xLog = kTRUE;
      }
      else if ( hType == 1 ) {
	can  = cMult;
	canEff  = cMultEff;
	leg  = legMult[pad-1];
	legEff  = legMultEff[pad-1];
	xLog = kFALSE;
      }

      TH1F * hcp = static_cast<TH1F*>(fObjArray->FindObject(Form("fHist%s%s_%d", dataType,
								 histType[hType],compHist)));
      
      if ( hType == 0 )
      	hcp->SetAxisRange(ptMin, ptMax);

      hcp->SetMinimum(10);
       
      DrawHistogram(can, pad, hcp, layer, kFALSE, kFALSE, xLog);
      
      leg = new TLegend(0.58, 0.70, 0.88, 0.88, Form("Trigger Selection: %s Tracks",type[iIdx])); 
      leg->AddEntry(hcp, "Track Selection","L");
      leg->SetFillColor(kWhite);

      legEff = new TLegend(0.15, 0.70, 0.45, 0.88, Form("Trigger Selection: %s Tracks",type[iIdx])); 
      legEff->SetFillColor(kWhite);

      // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
      ++layer;

      for ( Int_t idx= 0; idx < fgkNTrigger; idx++ ) { 

	if ( idx >= maxLayer )
	  continue;

	if ( idx < minLayer )
	  continue;
  
	Int_t iter = idx;

	TH1F *hist = static_cast<TH1F*>(fObjArray->FindObject(Form("fHist%s_%sTriggered_%s_%d", 
								   dataType, histType[hType], trigType, iter)));
    
	if ( hType == 0 )
	  hist->SetAxisRange(ptMin, ptMax);
	DrawHistogram(can, pad, hist, layer, kFALSE, kTRUE, xLog);

	leg->AddEntry(hist, fgkTrigger[iter],"L");
	leg->Draw();

	// ------------------------------------------------

	TH1F *eff = static_cast<TH1F*>(hist->Clone()); 
	DivideHist(eff,hist,hcp);
	if ( hType == 0 )
	  eff->SetAxisRange(ptMin, ptMax);

	eff->SetAxisRange(0., 1.4, "Y");
	eff->SetTitle(Form("%s Trigger Efficiency - applied on %s data", type[iIdx], dataType));
	eff->GetYaxis()->SetTitle(Form("%s Trigger Efficiecy", type[iIdx]));

	DrawHistogram(canEff, pad, eff, layer-1, kFALSE, kFALSE, xLog);
	legEff->AddEntry(eff, fgkTrigger[iter],"L");
	legEff->Draw();

	// ------------------------------------------------

	// -- Draw line at maxLine
	if ( idx == minLayer ){

	  Float_t max = 50.;
	  if ( hType == 0)
	    max = ptMax;

	  TLine* line = NULL;
	  line = new TLine(0.,maxLine,max,maxLine);
	  line->SetLineStyle(2);
	  line->SetLineColor(kGreen);
	  line->Draw();

	  TLine* line2 = NULL;
	  line2 = new TLine(0.,minLine,max,minLine);
	  line2->SetLineStyle(2);
	  line2->SetLineColor(kRed);
	  line2->Draw();
	}

	// ------------------------------------------------

	++layer;
      } // for ( Int_t idx= 0; idx < 3; idx++ ) {    

    } // for ( Int_t pad=1; pad <=6; pad++ ) {
  
  } // for ( Int_t hType = 0; hType < 2; hType++ ) {


  if (cSpectra) cSpectra->SaveAs(Form("TriggerHists_Pt_%d.png",++fgImgIdx));
  if (cSpectraEff) cSpectraEff->SaveAs(Form("TriggerHists_PtEff_%d.png",++fgImgIdx));

  if (cMult) cMult->SaveAs(Form("TriggerHists_Mult_%d_B.png",++fgImgIdx));
  if (cMultEff) cMultEff->SaveAs(Form("TriggerHists_MultEff_%d_B.png",++fgImgIdx));

  return;
}

// ----------------------------------------------------------------------
// --                      Helper Functions                            --
// ----------------------------------------------------------------------

//#######################################################################
void SetHist(TH1F* hist, Int_t hType, Char_t* dataType, Char_t* histType, Float_t minY, Float_t maxY ) {

  if (hType == 0)
    hist->SetTitle(Form("Ratio %s - %s Distribution - Event Selection", dataType, histType));
  else
    hist->SetTitle(Form("Ratio %s - %s Distribution - Track Selection", dataType, histType));

  hist->SetAxisRange(minY, maxY, "Y");
  hist->GetYaxis()->SetTitle(Form("Ratio %s", dataType));
}

//#######################################################################
void DivideHist(TH1F* h0, TH1F* h1, TH1F* h2) {
  // Divides h1 / h2, does proper error handling and saves in h0

  for(Int_t iBin=1; iBin < h0->GetXaxis()->GetNbins(); iBin++) {
    Float_t hist1Content = h1->GetBinContent(iBin);
    Float_t hist1Error = h1->GetBinError(iBin);
    Float_t hist2Content = h2->GetBinContent(iBin);
    Float_t hist2Error = h2->GetBinError(iBin);
    
    if ( hist1Content == 0. && hist1Content == 0. ){
      h0->SetBinContent(iBin, 1.);
      h0->SetBinError(iBin, 0.);
    }

    if(hist1Content<=0.0) continue;
    if(hist2Content<=0.0) continue;

    Float_t ratio = hist1Content/hist2Content;
    Float_t relError1 = hist1Error/hist1Content;
    Float_t relError2 = hist2Error/hist2Content;
    Float_t error = ratio*TMath::Sqrt(relError1*relError1+relError2*relError2);

    h0->SetBinContent(iBin, ratio);
    h0->SetBinError(iBin, error);
  }

  return;
}

//#######################################################################
void FillIntegrated(TH1F* hist, TH1F* histInt ) {
  // see header file for class documentation

  Double_t oldBin = 0.;
  for ( Int_t idx = 0; idx < hist->GetNbinsX() ; ++idx ){
    histInt->SetBinContent(idx, hist->GetBinContent(idx) + oldBin);
    oldBin = hist->GetBinContent(idx) + oldBin;
  }
  histInt->SetEntries(hist->GetNbinsX());

  return;
}

//#######################################################################
void FillReduxHistograms( TH1F* hN, TH1F* hRedux ) {

  Float_t base       = hN->GetBinContent(1);
  Float_t baseRelErr = hN->GetBinError(1) / base;

  for ( Int_t idx = 2; idx <= 2*(fgkNTrigger+1) ; ++idx ){

    Int_t bin = idx-1;    
    if ( idx == fgkNTrigger+2 ) {
      base = hN->GetBinContent(fgkNTrigger+2);
      baseRelErr = hN->GetBinError(fgkNTrigger+2) / base;
      continue;
    }
    else if( idx > fgkNTrigger+2 )
      bin = idx-2;

    Float_t cont       = hN->GetBinContent(idx);

    if (cont <=0.) continue;
    Float_t contRelErr = hN->GetBinError(idx) / cont;
    
    Float_t ratio      = base / cont;
    Float_t error      = ratio * TMath::Sqrt(contRelErr*contRelErr + baseRelErr*baseRelErr);
    
    hRedux->SetBinContent(bin, ratio);
    hRedux->SetBinError(bin, error);
  }

  return;
}

//#######################################################################
void FillReduxHistogramsPt( TH1F* hN, TH1F* hRedux, TH1F* hReduxW ) {

  Float_t base       = hN->GetBinContent(1);
  Float_t baseRelErr = hN->GetBinError(1) / base;

  TH1F* hist = hRedux;
  Int_t trgIdx = 0;
 
  for ( Int_t idx = 2; idx <= 2*(fgkNTrigger+1) ; ++idx ){

    if ( idx == fgkNTrigger+2 ) {
      base = hN->GetBinContent(fgkNTrigger+2);
      baseRelErr = hN->GetBinError(fgkNTrigger+2) / base;
      hist = hReduxW;
      trgIdx = 0;
      continue;
    }

    if ( fgkTriggerPt[trgIdx] > 100. ) {
      ++trgIdx;
      continue;
    }

    Int_t   nbin        = hist->FindBin(fgkTriggerPt[trgIdx]);
    ++trgIdx;

    Float_t cont       = hN->GetBinContent(idx);

    if (cont <=0.) continue;
    Float_t contRelErr = hN->GetBinError(idx) / cont;
    
    Float_t ratio      = base / cont;
    Float_t error      = ratio * TMath::Sqrt(contRelErr*contRelErr + baseRelErr*baseRelErr);
    
    hist->SetBinContent(nbin, ratio);
    hist->SetBinError(nbin, error);
  }
    
  return;
}

//#######################################################################
void FillRatioHistograms( TH1F* hN, TH1F* hF, TH1F* hRatio ) {

  for ( Int_t idx = 2; idx <= 2*(fgkNTrigger+1) ; ++idx ){

    Int_t bin = idx-1;    
    if ( idx == fgkNTrigger+2 )
      continue;
    else if( idx > fgkNTrigger+2 )
      bin = idx-2;

    Float_t h1Cont = hF->GetBinContent(idx);
    Float_t h2Cont = hN->GetBinContent(idx);

    if ( h2Cont <= 0. || h1Cont <= 0. ) continue;

    Float_t h1RelErr = hF->GetBinError(idx) / h1Cont;
    Float_t h2RelErr = hN->GetBinError(idx) / h2Cont;

    Float_t ratio    = (h2Cont - h1Cont) / h2Cont ;
    Float_t error    = h1Cont / h2Cont * TMath::Sqrt(h1RelErr*h2RelErr + h1RelErr*h2RelErr);

    hRatio->SetBinContent(bin, ratio);
    hRatio->SetBinError(bin, error);
  }

  return;
}

//#######################################################################
void FillRatioHistogramsPt( TH1F* hN, TH1F* hF, TH1F* hRatio ) {

  Int_t trgIdx = 0;

  for ( Int_t idx = 2; idx < fgkNTrigger+2 ; ++idx ){

    Int_t   nbin = hRatio->FindBin(fgkTriggerPt[trgIdx]);
    ++trgIdx;

    Float_t h1Cont = hF->GetBinContent(idx);
    Float_t h2Cont = hN->GetBinContent(idx);

    if ( h2Cont <= 0. || h1Cont <= 0. ) continue;

    Float_t h1RelErr = hF->GetBinError(idx) / h1Cont;
    Float_t h2RelErr = hN->GetBinError(idx) / h2Cont;

    Float_t ratio    = (h2Cont - h1Cont) / h2Cont ;
    Float_t error    = h1Cont / h2Cont * TMath::Sqrt(h1RelErr*h2RelErr + h1RelErr*h2RelErr);

    hRatio->SetBinContent(nbin, ratio);
    hRatio->SetBinError(nbin, error);
  }

  return;
}

// ----------------------------------------------------------------------
// --                       Draw Functions                             --
// ----------------------------------------------------------------------

//#######################################################################
void DrawHistogramTrigger( TCanvas* canvas, Int_t idx, TH1* hist, Int_t iLayer, Bool_t bLogY) {
  // see header file for class documentation

  if ( hist == NULL )
    return;

  TVirtualPad* pad = canvas->cd(idx);
  
  if ( bLogY && hist->GetEntries() != 0 )
    pad->SetLogy();

  pad->SetGridy();
  pad->SetGridx();

  switch(iLayer) {
  case 0 : 
    hist->SetLineColor(kBlack);
    hist->SetMarkerStyle(20);
    hist->SetMarkerColor(kBlack);
    break;;
  case 1 : 
    hist->SetLineColor(kBlack-6); 
    hist->SetMarkerStyle(24);
    hist->SetMarkerColor(kBlack-6);
    break;;
  case 2 : 
    hist->SetLineColor(kBlue); 
    hist->SetMarkerStyle(21);
    hist->SetMarkerColor(kBlue);
    break;;
  case 3 : 
    hist->SetLineColor(kBlue-6); 
    hist->SetMarkerStyle(25);
    hist->SetMarkerColor(kBlue-6);
    break;;
  case 4 : 
    hist->SetLineColor(kGreen); 
    hist->SetMarkerStyle(22);
    hist->SetMarkerColor(kGreen);
    break;;
  case 5 : 
    hist->SetLineColor(kGreen-6); 
    hist->SetMarkerStyle(26);
    hist->SetMarkerColor(kGreen-6);
    break;;
  }

  hist->SetStats(kFALSE);

  if ( !iLayer )
    hist->Draw("E");
  else 
    hist->Draw("E,SAME");
    
  return;
}

//#######################################################################
void DrawHistogram( TCanvas* canvas, Int_t idx, TH1* hist, Int_t iLayer, 
		    Bool_t bScale, Bool_t bLogY, Bool_t bLogX) {
  // Draw histogram and set pad properties

  if ( hist == NULL )
    return;

  TVirtualPad* pad = canvas->cd(idx);
  
  if ( bScale ) 
    hist->Scale( 1./hist->GetBinWidth(0) );
  
  if ( bLogY && hist->GetEntries() != 0 )
    pad->SetLogy();

  if ( bLogX && hist->GetEntries() != 0 )
    pad->SetLogx();
  
  pad->SetGridy();
  pad->SetGridx();

  if ( !strcmp(canvas->GetName(),"cEvCuts") || !strcmp(canvas->GetName(),"cEvCuts2") ) {
    switch(iLayer) {
    case 0 : hist->SetLineColor(kRed); break;;
    case 1 : hist->SetLineColor(kBlue); break;;
    case 2 : hist->SetLineColor(kBlack); break;;
    case 3 : hist->SetLineColor(kBlack); break;;
    }
  }
  else   if ( !strcmp(canvas->GetName(),"cTrCuts") || !strcmp(canvas->GetName(),"cTrCuts2") ) {
    switch(iLayer) {
    case 0 : hist->SetLineColor(kBlack); break;;
    case 1 : hist->SetLineColor(kBlue); break;;
    case 2 : hist->SetLineColor(kGreen); break;;
    case 3 : hist->SetLineColor(kRed); break;;
    case 4 : hist->SetLineColor(kBlue-6); break;;
    case 5 : hist->SetLineColor(kGreen-6); break;;
    case 6 : hist->SetLineColor(kRed-6); break;;
    }
    
  }
  else {
    switch(iLayer) {
    case 0 : hist->SetLineColor(kBlack); break;;
    case 1 : hist->SetLineColor(kBlue); break;;
    case 2 : hist->SetLineColor(kGreen); break;;
    case 3 : hist->SetLineColor(kRed); break;;
    case 4 : hist->SetLineColor(kOrange); break;;
    case 5 : hist->SetLineColor(kBlue-6); break;;
    case 6 : hist->SetLineColor(kGreen-6); break;;
    case 7 : hist->SetLineColor(kRed-6); break;;
    }
  }
  
  hist->SetStats(kFALSE);

  if ( !iLayer )
    hist->Draw("E");
  else 
    hist->Draw("E,SAME");
  
  return;
}
 readTrigger.C:1
 readTrigger.C:2
 readTrigger.C:3
 readTrigger.C:4
 readTrigger.C:5
 readTrigger.C:6
 readTrigger.C:7
 readTrigger.C:8
 readTrigger.C:9
 readTrigger.C:10
 readTrigger.C:11
 readTrigger.C:12
 readTrigger.C:13
 readTrigger.C:14
 readTrigger.C:15
 readTrigger.C:16
 readTrigger.C:17
 readTrigger.C:18
 readTrigger.C:19
 readTrigger.C:20
 readTrigger.C:21
 readTrigger.C:22
 readTrigger.C:23
 readTrigger.C:24
 readTrigger.C:25
 readTrigger.C:26
 readTrigger.C:27
 readTrigger.C:28
 readTrigger.C:29
 readTrigger.C:30
 readTrigger.C:31
 readTrigger.C:32
 readTrigger.C:33
 readTrigger.C:34
 readTrigger.C:35
 readTrigger.C:36
 readTrigger.C:37
 readTrigger.C:38
 readTrigger.C:39
 readTrigger.C:40
 readTrigger.C:41
 readTrigger.C:42
 readTrigger.C:43
 readTrigger.C:44
 readTrigger.C:45
 readTrigger.C:46
 readTrigger.C:47
 readTrigger.C:48
 readTrigger.C:49
 readTrigger.C:50
 readTrigger.C:51
 readTrigger.C:52
 readTrigger.C:53
 readTrigger.C:54
 readTrigger.C:55
 readTrigger.C:56
 readTrigger.C:57
 readTrigger.C:58
 readTrigger.C:59
 readTrigger.C:60
 readTrigger.C:61
 readTrigger.C:62
 readTrigger.C:63
 readTrigger.C:64
 readTrigger.C:65
 readTrigger.C:66
 readTrigger.C:67
 readTrigger.C:68
 readTrigger.C:69
 readTrigger.C:70
 readTrigger.C:71
 readTrigger.C:72
 readTrigger.C:73
 readTrigger.C:74
 readTrigger.C:75
 readTrigger.C:76
 readTrigger.C:77
 readTrigger.C:78
 readTrigger.C:79
 readTrigger.C:80
 readTrigger.C:81
 readTrigger.C:82
 readTrigger.C:83
 readTrigger.C:84
 readTrigger.C:85
 readTrigger.C:86
 readTrigger.C:87
 readTrigger.C:88
 readTrigger.C:89
 readTrigger.C:90
 readTrigger.C:91
 readTrigger.C:92
 readTrigger.C:93
 readTrigger.C:94
 readTrigger.C:95
 readTrigger.C:96
 readTrigger.C:97
 readTrigger.C:98
 readTrigger.C:99
 readTrigger.C:100
 readTrigger.C:101
 readTrigger.C:102
 readTrigger.C:103
 readTrigger.C:104
 readTrigger.C:105
 readTrigger.C:106
 readTrigger.C:107
 readTrigger.C:108
 readTrigger.C:109
 readTrigger.C:110
 readTrigger.C:111
 readTrigger.C:112
 readTrigger.C:113
 readTrigger.C:114
 readTrigger.C:115
 readTrigger.C:116
 readTrigger.C:117
 readTrigger.C:118
 readTrigger.C:119
 readTrigger.C:120
 readTrigger.C:121
 readTrigger.C:122
 readTrigger.C:123
 readTrigger.C:124
 readTrigger.C:125
 readTrigger.C:126
 readTrigger.C:127
 readTrigger.C:128
 readTrigger.C:129
 readTrigger.C:130
 readTrigger.C:131
 readTrigger.C:132
 readTrigger.C:133
 readTrigger.C:134
 readTrigger.C:135
 readTrigger.C:136
 readTrigger.C:137
 readTrigger.C:138
 readTrigger.C:139
 readTrigger.C:140
 readTrigger.C:141
 readTrigger.C:142
 readTrigger.C:143
 readTrigger.C:144
 readTrigger.C:145
 readTrigger.C:146
 readTrigger.C:147
 readTrigger.C:148
 readTrigger.C:149
 readTrigger.C:150
 readTrigger.C:151
 readTrigger.C:152
 readTrigger.C:153
 readTrigger.C:154
 readTrigger.C:155
 readTrigger.C:156
 readTrigger.C:157
 readTrigger.C:158
 readTrigger.C:159
 readTrigger.C:160
 readTrigger.C:161
 readTrigger.C:162
 readTrigger.C:163
 readTrigger.C:164
 readTrigger.C:165
 readTrigger.C:166
 readTrigger.C:167
 readTrigger.C:168
 readTrigger.C:169
 readTrigger.C:170
 readTrigger.C:171
 readTrigger.C:172
 readTrigger.C:173
 readTrigger.C:174
 readTrigger.C:175
 readTrigger.C:176
 readTrigger.C:177
 readTrigger.C:178
 readTrigger.C:179
 readTrigger.C:180
 readTrigger.C:181
 readTrigger.C:182
 readTrigger.C:183
 readTrigger.C:184
 readTrigger.C:185
 readTrigger.C:186
 readTrigger.C:187
 readTrigger.C:188
 readTrigger.C:189
 readTrigger.C:190
 readTrigger.C:191
 readTrigger.C:192
 readTrigger.C:193
 readTrigger.C:194
 readTrigger.C:195
 readTrigger.C:196
 readTrigger.C:197
 readTrigger.C:198
 readTrigger.C:199
 readTrigger.C:200
 readTrigger.C:201
 readTrigger.C:202
 readTrigger.C:203
 readTrigger.C:204
 readTrigger.C:205
 readTrigger.C:206
 readTrigger.C:207
 readTrigger.C:208
 readTrigger.C:209
 readTrigger.C:210
 readTrigger.C:211
 readTrigger.C:212
 readTrigger.C:213
 readTrigger.C:214
 readTrigger.C:215
 readTrigger.C:216
 readTrigger.C:217
 readTrigger.C:218
 readTrigger.C:219
 readTrigger.C:220
 readTrigger.C:221
 readTrigger.C:222
 readTrigger.C:223
 readTrigger.C:224
 readTrigger.C:225
 readTrigger.C:226
 readTrigger.C:227
 readTrigger.C:228
 readTrigger.C:229
 readTrigger.C:230
 readTrigger.C:231
 readTrigger.C:232
 readTrigger.C:233
 readTrigger.C:234
 readTrigger.C:235
 readTrigger.C:236
 readTrigger.C:237
 readTrigger.C:238
 readTrigger.C:239
 readTrigger.C:240
 readTrigger.C:241
 readTrigger.C:242
 readTrigger.C:243
 readTrigger.C:244
 readTrigger.C:245
 readTrigger.C:246
 readTrigger.C:247
 readTrigger.C:248
 readTrigger.C:249
 readTrigger.C:250
 readTrigger.C:251
 readTrigger.C:252
 readTrigger.C:253
 readTrigger.C:254
 readTrigger.C:255
 readTrigger.C:256
 readTrigger.C:257
 readTrigger.C:258
 readTrigger.C:259
 readTrigger.C:260
 readTrigger.C:261
 readTrigger.C:262
 readTrigger.C:263
 readTrigger.C:264
 readTrigger.C:265
 readTrigger.C:266
 readTrigger.C:267
 readTrigger.C:268
 readTrigger.C:269
 readTrigger.C:270
 readTrigger.C:271
 readTrigger.C:272
 readTrigger.C:273
 readTrigger.C:274
 readTrigger.C:275
 readTrigger.C:276
 readTrigger.C:277
 readTrigger.C:278
 readTrigger.C:279
 readTrigger.C:280
 readTrigger.C:281
 readTrigger.C:282
 readTrigger.C:283
 readTrigger.C:284
 readTrigger.C:285
 readTrigger.C:286
 readTrigger.C:287
 readTrigger.C:288
 readTrigger.C:289
 readTrigger.C:290
 readTrigger.C:291
 readTrigger.C:292
 readTrigger.C:293
 readTrigger.C:294
 readTrigger.C:295
 readTrigger.C:296
 readTrigger.C:297
 readTrigger.C:298
 readTrigger.C:299
 readTrigger.C:300
 readTrigger.C:301
 readTrigger.C:302
 readTrigger.C:303
 readTrigger.C:304
 readTrigger.C:305
 readTrigger.C:306
 readTrigger.C:307
 readTrigger.C:308
 readTrigger.C:309
 readTrigger.C:310
 readTrigger.C:311
 readTrigger.C:312
 readTrigger.C:313
 readTrigger.C:314
 readTrigger.C:315
 readTrigger.C:316
 readTrigger.C:317
 readTrigger.C:318
 readTrigger.C:319
 readTrigger.C:320
 readTrigger.C:321
 readTrigger.C:322
 readTrigger.C:323
 readTrigger.C:324
 readTrigger.C:325
 readTrigger.C:326
 readTrigger.C:327
 readTrigger.C:328
 readTrigger.C:329
 readTrigger.C:330
 readTrigger.C:331
 readTrigger.C:332
 readTrigger.C:333
 readTrigger.C:334
 readTrigger.C:335
 readTrigger.C:336
 readTrigger.C:337
 readTrigger.C:338
 readTrigger.C:339
 readTrigger.C:340
 readTrigger.C:341
 readTrigger.C:342
 readTrigger.C:343
 readTrigger.C:344
 readTrigger.C:345
 readTrigger.C:346
 readTrigger.C:347
 readTrigger.C:348
 readTrigger.C:349
 readTrigger.C:350
 readTrigger.C:351
 readTrigger.C:352
 readTrigger.C:353
 readTrigger.C:354
 readTrigger.C:355
 readTrigger.C:356
 readTrigger.C:357
 readTrigger.C:358
 readTrigger.C:359
 readTrigger.C:360
 readTrigger.C:361
 readTrigger.C:362
 readTrigger.C:363
 readTrigger.C:364
 readTrigger.C:365
 readTrigger.C:366
 readTrigger.C:367
 readTrigger.C:368
 readTrigger.C:369
 readTrigger.C:370
 readTrigger.C:371
 readTrigger.C:372
 readTrigger.C:373
 readTrigger.C:374
 readTrigger.C:375
 readTrigger.C:376
 readTrigger.C:377
 readTrigger.C:378
 readTrigger.C:379
 readTrigger.C:380
 readTrigger.C:381
 readTrigger.C:382
 readTrigger.C:383
 readTrigger.C:384
 readTrigger.C:385
 readTrigger.C:386
 readTrigger.C:387
 readTrigger.C:388
 readTrigger.C:389
 readTrigger.C:390
 readTrigger.C:391
 readTrigger.C:392
 readTrigger.C:393
 readTrigger.C:394
 readTrigger.C:395
 readTrigger.C:396
 readTrigger.C:397
 readTrigger.C:398
 readTrigger.C:399
 readTrigger.C:400
 readTrigger.C:401
 readTrigger.C:402
 readTrigger.C:403
 readTrigger.C:404
 readTrigger.C:405
 readTrigger.C:406
 readTrigger.C:407
 readTrigger.C:408
 readTrigger.C:409
 readTrigger.C:410
 readTrigger.C:411
 readTrigger.C:412
 readTrigger.C:413
 readTrigger.C:414
 readTrigger.C:415
 readTrigger.C:416
 readTrigger.C:417
 readTrigger.C:418
 readTrigger.C:419
 readTrigger.C:420
 readTrigger.C:421
 readTrigger.C:422
 readTrigger.C:423
 readTrigger.C:424
 readTrigger.C:425
 readTrigger.C:426
 readTrigger.C:427
 readTrigger.C:428
 readTrigger.C:429
 readTrigger.C:430
 readTrigger.C:431
 readTrigger.C:432
 readTrigger.C:433
 readTrigger.C:434
 readTrigger.C:435
 readTrigger.C:436
 readTrigger.C:437
 readTrigger.C:438
 readTrigger.C:439
 readTrigger.C:440
 readTrigger.C:441
 readTrigger.C:442
 readTrigger.C:443
 readTrigger.C:444
 readTrigger.C:445
 readTrigger.C:446
 readTrigger.C:447
 readTrigger.C:448
 readTrigger.C:449
 readTrigger.C:450
 readTrigger.C:451
 readTrigger.C:452
 readTrigger.C:453
 readTrigger.C:454
 readTrigger.C:455
 readTrigger.C:456
 readTrigger.C:457
 readTrigger.C:458
 readTrigger.C:459
 readTrigger.C:460
 readTrigger.C:461
 readTrigger.C:462
 readTrigger.C:463
 readTrigger.C:464
 readTrigger.C:465
 readTrigger.C:466
 readTrigger.C:467
 readTrigger.C:468
 readTrigger.C:469
 readTrigger.C:470
 readTrigger.C:471
 readTrigger.C:472
 readTrigger.C:473
 readTrigger.C:474
 readTrigger.C:475
 readTrigger.C:476
 readTrigger.C:477
 readTrigger.C:478
 readTrigger.C:479
 readTrigger.C:480
 readTrigger.C:481
 readTrigger.C:482
 readTrigger.C:483
 readTrigger.C:484
 readTrigger.C:485
 readTrigger.C:486
 readTrigger.C:487
 readTrigger.C:488
 readTrigger.C:489
 readTrigger.C:490
 readTrigger.C:491
 readTrigger.C:492
 readTrigger.C:493
 readTrigger.C:494
 readTrigger.C:495
 readTrigger.C:496
 readTrigger.C:497
 readTrigger.C:498
 readTrigger.C:499
 readTrigger.C:500
 readTrigger.C:501
 readTrigger.C:502
 readTrigger.C:503
 readTrigger.C:504
 readTrigger.C:505
 readTrigger.C:506
 readTrigger.C:507
 readTrigger.C:508
 readTrigger.C:509
 readTrigger.C:510
 readTrigger.C:511
 readTrigger.C:512
 readTrigger.C:513
 readTrigger.C:514
 readTrigger.C:515
 readTrigger.C:516
 readTrigger.C:517
 readTrigger.C:518
 readTrigger.C:519
 readTrigger.C:520
 readTrigger.C:521
 readTrigger.C:522
 readTrigger.C:523
 readTrigger.C:524
 readTrigger.C:525
 readTrigger.C:526
 readTrigger.C:527
 readTrigger.C:528
 readTrigger.C:529
 readTrigger.C:530
 readTrigger.C:531
 readTrigger.C:532
 readTrigger.C:533
 readTrigger.C:534
 readTrigger.C:535
 readTrigger.C:536
 readTrigger.C:537
 readTrigger.C:538
 readTrigger.C:539
 readTrigger.C:540
 readTrigger.C:541
 readTrigger.C:542
 readTrigger.C:543
 readTrigger.C:544
 readTrigger.C:545
 readTrigger.C:546
 readTrigger.C:547
 readTrigger.C:548
 readTrigger.C:549
 readTrigger.C:550
 readTrigger.C:551
 readTrigger.C:552
 readTrigger.C:553
 readTrigger.C:554
 readTrigger.C:555
 readTrigger.C:556
 readTrigger.C:557
 readTrigger.C:558
 readTrigger.C:559
 readTrigger.C:560
 readTrigger.C:561
 readTrigger.C:562
 readTrigger.C:563
 readTrigger.C:564
 readTrigger.C:565
 readTrigger.C:566
 readTrigger.C:567
 readTrigger.C:568
 readTrigger.C:569
 readTrigger.C:570
 readTrigger.C:571
 readTrigger.C:572
 readTrigger.C:573
 readTrigger.C:574
 readTrigger.C:575
 readTrigger.C:576
 readTrigger.C:577
 readTrigger.C:578
 readTrigger.C:579
 readTrigger.C:580
 readTrigger.C:581
 readTrigger.C:582
 readTrigger.C:583
 readTrigger.C:584
 readTrigger.C:585
 readTrigger.C:586
 readTrigger.C:587
 readTrigger.C:588
 readTrigger.C:589
 readTrigger.C:590
 readTrigger.C:591
 readTrigger.C:592
 readTrigger.C:593
 readTrigger.C:594
 readTrigger.C:595
 readTrigger.C:596
 readTrigger.C:597
 readTrigger.C:598
 readTrigger.C:599
 readTrigger.C:600
 readTrigger.C:601
 readTrigger.C:602
 readTrigger.C:603
 readTrigger.C:604
 readTrigger.C:605
 readTrigger.C:606
 readTrigger.C:607
 readTrigger.C:608
 readTrigger.C:609
 readTrigger.C:610
 readTrigger.C:611
 readTrigger.C:612
 readTrigger.C:613
 readTrigger.C:614
 readTrigger.C:615
 readTrigger.C:616
 readTrigger.C:617
 readTrigger.C:618
 readTrigger.C:619
 readTrigger.C:620
 readTrigger.C:621
 readTrigger.C:622
 readTrigger.C:623
 readTrigger.C:624
 readTrigger.C:625
 readTrigger.C:626
 readTrigger.C:627
 readTrigger.C:628
 readTrigger.C:629
 readTrigger.C:630
 readTrigger.C:631
 readTrigger.C:632
 readTrigger.C:633
 readTrigger.C:634
 readTrigger.C:635
 readTrigger.C:636
 readTrigger.C:637
 readTrigger.C:638
 readTrigger.C:639
 readTrigger.C:640
 readTrigger.C:641
 readTrigger.C:642
 readTrigger.C:643
 readTrigger.C:644
 readTrigger.C:645
 readTrigger.C:646
 readTrigger.C:647
 readTrigger.C:648
 readTrigger.C:649
 readTrigger.C:650
 readTrigger.C:651
 readTrigger.C:652
 readTrigger.C:653
 readTrigger.C:654
 readTrigger.C:655
 readTrigger.C:656
 readTrigger.C:657
 readTrigger.C:658
 readTrigger.C:659
 readTrigger.C:660
 readTrigger.C:661
 readTrigger.C:662
 readTrigger.C:663
 readTrigger.C:664
 readTrigger.C:665
 readTrigger.C:666
 readTrigger.C:667
 readTrigger.C:668
 readTrigger.C:669
 readTrigger.C:670
 readTrigger.C:671
 readTrigger.C:672
 readTrigger.C:673
 readTrigger.C:674
 readTrigger.C:675
 readTrigger.C:676
 readTrigger.C:677
 readTrigger.C:678
 readTrigger.C:679
 readTrigger.C:680
 readTrigger.C:681
 readTrigger.C:682
 readTrigger.C:683
 readTrigger.C:684
 readTrigger.C:685
 readTrigger.C:686
 readTrigger.C:687
 readTrigger.C:688
 readTrigger.C:689
 readTrigger.C:690
 readTrigger.C:691
 readTrigger.C:692
 readTrigger.C:693
 readTrigger.C:694
 readTrigger.C:695
 readTrigger.C:696
 readTrigger.C:697
 readTrigger.C:698
 readTrigger.C:699
 readTrigger.C:700
 readTrigger.C:701
 readTrigger.C:702
 readTrigger.C:703
 readTrigger.C:704
 readTrigger.C:705
 readTrigger.C:706
 readTrigger.C:707
 readTrigger.C:708
 readTrigger.C:709
 readTrigger.C:710
 readTrigger.C:711
 readTrigger.C:712
 readTrigger.C:713
 readTrigger.C:714
 readTrigger.C:715
 readTrigger.C:716
 readTrigger.C:717
 readTrigger.C:718
 readTrigger.C:719
 readTrigger.C:720
 readTrigger.C:721
 readTrigger.C:722
 readTrigger.C:723
 readTrigger.C:724
 readTrigger.C:725
 readTrigger.C:726
 readTrigger.C:727
 readTrigger.C:728
 readTrigger.C:729
 readTrigger.C:730
 readTrigger.C:731
 readTrigger.C:732
 readTrigger.C:733
 readTrigger.C:734
 readTrigger.C:735
 readTrigger.C:736
 readTrigger.C:737
 readTrigger.C:738
 readTrigger.C:739
 readTrigger.C:740
 readTrigger.C:741
 readTrigger.C:742
 readTrigger.C:743
 readTrigger.C:744
 readTrigger.C:745
 readTrigger.C:746
 readTrigger.C:747
 readTrigger.C:748
 readTrigger.C:749
 readTrigger.C:750
 readTrigger.C:751
 readTrigger.C:752
 readTrigger.C:753
 readTrigger.C:754
 readTrigger.C:755
 readTrigger.C:756
 readTrigger.C:757
 readTrigger.C:758
 readTrigger.C:759
 readTrigger.C:760
 readTrigger.C:761
 readTrigger.C:762
 readTrigger.C:763
 readTrigger.C:764
 readTrigger.C:765
 readTrigger.C:766
 readTrigger.C:767
 readTrigger.C:768
 readTrigger.C:769
 readTrigger.C:770
 readTrigger.C:771
 readTrigger.C:772
 readTrigger.C:773
 readTrigger.C:774
 readTrigger.C:775
 readTrigger.C:776
 readTrigger.C:777
 readTrigger.C:778
 readTrigger.C:779
 readTrigger.C:780
 readTrigger.C:781
 readTrigger.C:782
 readTrigger.C:783
 readTrigger.C:784
 readTrigger.C:785
 readTrigger.C:786
 readTrigger.C:787
 readTrigger.C:788
 readTrigger.C:789
 readTrigger.C:790
 readTrigger.C:791
 readTrigger.C:792
 readTrigger.C:793
 readTrigger.C:794
 readTrigger.C:795
 readTrigger.C:796
 readTrigger.C:797
 readTrigger.C:798
 readTrigger.C:799
 readTrigger.C:800
 readTrigger.C:801
 readTrigger.C:802
 readTrigger.C:803
 readTrigger.C:804
 readTrigger.C:805
 readTrigger.C:806
 readTrigger.C:807
 readTrigger.C:808
 readTrigger.C:809
 readTrigger.C:810
 readTrigger.C:811
 readTrigger.C:812
 readTrigger.C:813
 readTrigger.C:814
 readTrigger.C:815
 readTrigger.C:816
 readTrigger.C:817
 readTrigger.C:818
 readTrigger.C:819
 readTrigger.C:820
 readTrigger.C:821
 readTrigger.C:822
 readTrigger.C:823
 readTrigger.C:824
 readTrigger.C:825
 readTrigger.C:826
 readTrigger.C:827
 readTrigger.C:828
 readTrigger.C:829
 readTrigger.C:830
 readTrigger.C:831
 readTrigger.C:832
 readTrigger.C:833
 readTrigger.C:834
 readTrigger.C:835
 readTrigger.C:836
 readTrigger.C:837
 readTrigger.C:838
 readTrigger.C:839
 readTrigger.C:840
 readTrigger.C:841
 readTrigger.C:842
 readTrigger.C:843
 readTrigger.C:844
 readTrigger.C:845
 readTrigger.C:846
 readTrigger.C:847
 readTrigger.C:848
 readTrigger.C:849
 readTrigger.C:850
 readTrigger.C:851
 readTrigger.C:852
 readTrigger.C:853
 readTrigger.C:854
 readTrigger.C:855
 readTrigger.C:856
 readTrigger.C:857
 readTrigger.C:858
 readTrigger.C:859
 readTrigger.C:860
 readTrigger.C:861
 readTrigger.C:862
 readTrigger.C:863
 readTrigger.C:864
 readTrigger.C:865
 readTrigger.C:866
 readTrigger.C:867
 readTrigger.C:868
 readTrigger.C:869
 readTrigger.C:870
 readTrigger.C:871
 readTrigger.C:872
 readTrigger.C:873
 readTrigger.C:874
 readTrigger.C:875
 readTrigger.C:876
 readTrigger.C:877
 readTrigger.C:878
 readTrigger.C:879
 readTrigger.C:880
 readTrigger.C:881
 readTrigger.C:882
 readTrigger.C:883
 readTrigger.C:884
 readTrigger.C:885
 readTrigger.C:886
 readTrigger.C:887
 readTrigger.C:888
 readTrigger.C:889
 readTrigger.C:890
 readTrigger.C:891
 readTrigger.C:892
 readTrigger.C:893
 readTrigger.C:894
 readTrigger.C:895
 readTrigger.C:896
 readTrigger.C:897
 readTrigger.C:898
 readTrigger.C:899
 readTrigger.C:900
 readTrigger.C:901
 readTrigger.C:902
 readTrigger.C:903
 readTrigger.C:904
 readTrigger.C:905
 readTrigger.C:906
 readTrigger.C:907
 readTrigger.C:908
 readTrigger.C:909
 readTrigger.C:910
 readTrigger.C:911
 readTrigger.C:912
 readTrigger.C:913
 readTrigger.C:914
 readTrigger.C:915
 readTrigger.C:916
 readTrigger.C:917
 readTrigger.C:918
 readTrigger.C:919
 readTrigger.C:920
 readTrigger.C:921
 readTrigger.C:922
 readTrigger.C:923
 readTrigger.C:924
 readTrigger.C:925
 readTrigger.C:926
 readTrigger.C:927
 readTrigger.C:928
 readTrigger.C:929
 readTrigger.C:930
 readTrigger.C:931
 readTrigger.C:932
 readTrigger.C:933
 readTrigger.C:934
 readTrigger.C:935
 readTrigger.C:936
 readTrigger.C:937
 readTrigger.C:938
 readTrigger.C:939
 readTrigger.C:940
 readTrigger.C:941
 readTrigger.C:942
 readTrigger.C:943
 readTrigger.C:944
 readTrigger.C:945
 readTrigger.C:946
 readTrigger.C:947
 readTrigger.C:948
 readTrigger.C:949
 readTrigger.C:950
 readTrigger.C:951
 readTrigger.C:952
 readTrigger.C:953
 readTrigger.C:954
 readTrigger.C:955
 readTrigger.C:956
 readTrigger.C:957
 readTrigger.C:958
 readTrigger.C:959
 readTrigger.C:960
 readTrigger.C:961
 readTrigger.C:962
 readTrigger.C:963
 readTrigger.C:964
 readTrigger.C:965
 readTrigger.C:966
 readTrigger.C:967
 readTrigger.C:968
 readTrigger.C:969
 readTrigger.C:970
 readTrigger.C:971
 readTrigger.C:972
 readTrigger.C:973
 readTrigger.C:974
 readTrigger.C:975
 readTrigger.C:976
 readTrigger.C:977
 readTrigger.C:978
 readTrigger.C:979
 readTrigger.C:980
 readTrigger.C:981
 readTrigger.C:982
 readTrigger.C:983
 readTrigger.C:984
 readTrigger.C:985
 readTrigger.C:986
 readTrigger.C:987
 readTrigger.C:988
 readTrigger.C:989
 readTrigger.C:990
 readTrigger.C:991
 readTrigger.C:992
 readTrigger.C:993
 readTrigger.C:994
 readTrigger.C:995
 readTrigger.C:996
 readTrigger.C:997
 readTrigger.C:998
 readTrigger.C:999
 readTrigger.C:1000
 readTrigger.C:1001
 readTrigger.C:1002
 readTrigger.C:1003
 readTrigger.C:1004
 readTrigger.C:1005
 readTrigger.C:1006
 readTrigger.C:1007
 readTrigger.C:1008
 readTrigger.C:1009
 readTrigger.C:1010
 readTrigger.C:1011
 readTrigger.C:1012
 readTrigger.C:1013
 readTrigger.C:1014
 readTrigger.C:1015
 readTrigger.C:1016
 readTrigger.C:1017
 readTrigger.C:1018
 readTrigger.C:1019
 readTrigger.C:1020
 readTrigger.C:1021
 readTrigger.C:1022
 readTrigger.C:1023
 readTrigger.C:1024
 readTrigger.C:1025
 readTrigger.C:1026
 readTrigger.C:1027
 readTrigger.C:1028
 readTrigger.C:1029
 readTrigger.C:1030
 readTrigger.C:1031
 readTrigger.C:1032
 readTrigger.C:1033
 readTrigger.C:1034
 readTrigger.C:1035
 readTrigger.C:1036
 readTrigger.C:1037
 readTrigger.C:1038
 readTrigger.C:1039
 readTrigger.C:1040
 readTrigger.C:1041
 readTrigger.C:1042
 readTrigger.C:1043
 readTrigger.C:1044
 readTrigger.C:1045
 readTrigger.C:1046
 readTrigger.C:1047
 readTrigger.C:1048
 readTrigger.C:1049
 readTrigger.C:1050
 readTrigger.C:1051
 readTrigger.C:1052
 readTrigger.C:1053
 readTrigger.C:1054
 readTrigger.C:1055
 readTrigger.C:1056
 readTrigger.C:1057
 readTrigger.C:1058
 readTrigger.C:1059
 readTrigger.C:1060
 readTrigger.C:1061
 readTrigger.C:1062
 readTrigger.C:1063
 readTrigger.C:1064
 readTrigger.C:1065
 readTrigger.C:1066
 readTrigger.C:1067
 readTrigger.C:1068
 readTrigger.C:1069
 readTrigger.C:1070
 readTrigger.C:1071
 readTrigger.C:1072
 readTrigger.C:1073
 readTrigger.C:1074
 readTrigger.C:1075
 readTrigger.C:1076
 readTrigger.C:1077
 readTrigger.C:1078
 readTrigger.C:1079
 readTrigger.C:1080
 readTrigger.C:1081
 readTrigger.C:1082
 readTrigger.C:1083
 readTrigger.C:1084
 readTrigger.C:1085
 readTrigger.C:1086
 readTrigger.C:1087
 readTrigger.C:1088
 readTrigger.C:1089
 readTrigger.C:1090
 readTrigger.C:1091
 readTrigger.C:1092
 readTrigger.C:1093
 readTrigger.C:1094
 readTrigger.C:1095
 readTrigger.C:1096
 readTrigger.C:1097
 readTrigger.C:1098
 readTrigger.C:1099
 readTrigger.C:1100
 readTrigger.C:1101
 readTrigger.C:1102
 readTrigger.C:1103
 readTrigger.C:1104
 readTrigger.C:1105
 readTrigger.C:1106
 readTrigger.C:1107
 readTrigger.C:1108
 readTrigger.C:1109
 readTrigger.C:1110
 readTrigger.C:1111
 readTrigger.C:1112
 readTrigger.C:1113
 readTrigger.C:1114
 readTrigger.C:1115
 readTrigger.C:1116
 readTrigger.C:1117
 readTrigger.C:1118
 readTrigger.C:1119
 readTrigger.C:1120
 readTrigger.C:1121
 readTrigger.C:1122
 readTrigger.C:1123
 readTrigger.C:1124
 readTrigger.C:1125
 readTrigger.C:1126
 readTrigger.C:1127
 readTrigger.C:1128
 readTrigger.C:1129
 readTrigger.C:1130
 readTrigger.C:1131
 readTrigger.C:1132
 readTrigger.C:1133
 readTrigger.C:1134
 readTrigger.C:1135
 readTrigger.C:1136
 readTrigger.C:1137
 readTrigger.C:1138
 readTrigger.C:1139
 readTrigger.C:1140
 readTrigger.C:1141
 readTrigger.C:1142
 readTrigger.C:1143
 readTrigger.C:1144
 readTrigger.C:1145
 readTrigger.C:1146
 readTrigger.C:1147
 readTrigger.C:1148
 readTrigger.C:1149
 readTrigger.C:1150
 readTrigger.C:1151
 readTrigger.C:1152
 readTrigger.C:1153
 readTrigger.C:1154
 readTrigger.C:1155
 readTrigger.C:1156
 readTrigger.C:1157
 readTrigger.C:1158
 readTrigger.C:1159
 readTrigger.C:1160
 readTrigger.C:1161
 readTrigger.C:1162
 readTrigger.C:1163
 readTrigger.C:1164
 readTrigger.C:1165
 readTrigger.C:1166
 readTrigger.C:1167
 readTrigger.C:1168
 readTrigger.C:1169
 readTrigger.C:1170
 readTrigger.C:1171
 readTrigger.C:1172
 readTrigger.C:1173
 readTrigger.C:1174
 readTrigger.C:1175
 readTrigger.C:1176
 readTrigger.C:1177
 readTrigger.C:1178
 readTrigger.C:1179
 readTrigger.C:1180
 readTrigger.C:1181
 readTrigger.C:1182
 readTrigger.C:1183
 readTrigger.C:1184
 readTrigger.C:1185
 readTrigger.C:1186
 readTrigger.C:1187
 readTrigger.C:1188
 readTrigger.C:1189
 readTrigger.C:1190
 readTrigger.C:1191
 readTrigger.C:1192
 readTrigger.C:1193
 readTrigger.C:1194
 readTrigger.C:1195
 readTrigger.C:1196
 readTrigger.C:1197
 readTrigger.C:1198
 readTrigger.C:1199
 readTrigger.C:1200
 readTrigger.C:1201
 readTrigger.C:1202
 readTrigger.C:1203
 readTrigger.C:1204
 readTrigger.C:1205
 readTrigger.C:1206
 readTrigger.C:1207
 readTrigger.C:1208
 readTrigger.C:1209
 readTrigger.C:1210
 readTrigger.C:1211
 readTrigger.C:1212
 readTrigger.C:1213
 readTrigger.C:1214
 readTrigger.C:1215
 readTrigger.C:1216
 readTrigger.C:1217
 readTrigger.C:1218
 readTrigger.C:1219
 readTrigger.C:1220
 readTrigger.C:1221
 readTrigger.C:1222
 readTrigger.C:1223
 readTrigger.C:1224
 readTrigger.C:1225
 readTrigger.C:1226
 readTrigger.C:1227
 readTrigger.C:1228
 readTrigger.C:1229
 readTrigger.C:1230
 readTrigger.C:1231
 readTrigger.C:1232
 readTrigger.C:1233
 readTrigger.C:1234
 readTrigger.C:1235
 readTrigger.C:1236
 readTrigger.C:1237
 readTrigger.C:1238
 readTrigger.C:1239
 readTrigger.C:1240
 readTrigger.C:1241
 readTrigger.C:1242
 readTrigger.C:1243
 readTrigger.C:1244
 readTrigger.C:1245
 readTrigger.C:1246
 readTrigger.C:1247
 readTrigger.C:1248
 readTrigger.C:1249
 readTrigger.C:1250
 readTrigger.C:1251
 readTrigger.C:1252
 readTrigger.C:1253
 readTrigger.C:1254
 readTrigger.C:1255
 readTrigger.C:1256
 readTrigger.C:1257
 readTrigger.C:1258
 readTrigger.C:1259
 readTrigger.C:1260
 readTrigger.C:1261
 readTrigger.C:1262
 readTrigger.C:1263
 readTrigger.C:1264
 readTrigger.C:1265
 readTrigger.C:1266
 readTrigger.C:1267
 readTrigger.C:1268
 readTrigger.C:1269
 readTrigger.C:1270
 readTrigger.C:1271
 readTrigger.C:1272
 readTrigger.C:1273
 readTrigger.C:1274
 readTrigger.C:1275
 readTrigger.C:1276
 readTrigger.C:1277
 readTrigger.C:1278
 readTrigger.C:1279
 readTrigger.C:1280
 readTrigger.C:1281
 readTrigger.C:1282
 readTrigger.C:1283
 readTrigger.C:1284
 readTrigger.C:1285
 readTrigger.C:1286
 readTrigger.C:1287
 readTrigger.C:1288
 readTrigger.C:1289
 readTrigger.C:1290
 readTrigger.C:1291
 readTrigger.C:1292
 readTrigger.C:1293
 readTrigger.C:1294
 readTrigger.C:1295
 readTrigger.C:1296
 readTrigger.C:1297
 readTrigger.C:1298
 readTrigger.C:1299
 readTrigger.C:1300
 readTrigger.C:1301
 readTrigger.C:1302
 readTrigger.C:1303
 readTrigger.C:1304
 readTrigger.C:1305
 readTrigger.C:1306
 readTrigger.C:1307
 readTrigger.C:1308
 readTrigger.C:1309
 readTrigger.C:1310
 readTrigger.C:1311
 readTrigger.C:1312
 readTrigger.C:1313
 readTrigger.C:1314
 readTrigger.C:1315
 readTrigger.C:1316
 readTrigger.C:1317
 readTrigger.C:1318
 readTrigger.C:1319
 readTrigger.C:1320
 readTrigger.C:1321
 readTrigger.C:1322
 readTrigger.C:1323
 readTrigger.C:1324
 readTrigger.C:1325
 readTrigger.C:1326
 readTrigger.C:1327
 readTrigger.C:1328
 readTrigger.C:1329
 readTrigger.C:1330
 readTrigger.C:1331
 readTrigger.C:1332
 readTrigger.C:1333
 readTrigger.C:1334
 readTrigger.C:1335
 readTrigger.C:1336
 readTrigger.C:1337
 readTrigger.C:1338
 readTrigger.C:1339
 readTrigger.C:1340
 readTrigger.C:1341
 readTrigger.C:1342
 readTrigger.C:1343
 readTrigger.C:1344
 readTrigger.C:1345
 readTrigger.C:1346
 readTrigger.C:1347
 readTrigger.C:1348
 readTrigger.C:1349
 readTrigger.C:1350
 readTrigger.C:1351
 readTrigger.C:1352
 readTrigger.C:1353
 readTrigger.C:1354
 readTrigger.C:1355
 readTrigger.C:1356
 readTrigger.C:1357
 readTrigger.C:1358
 readTrigger.C:1359
 readTrigger.C:1360
 readTrigger.C:1361
 readTrigger.C:1362
 readTrigger.C:1363
 readTrigger.C:1364
 readTrigger.C:1365
 readTrigger.C:1366
 readTrigger.C:1367
 readTrigger.C:1368
 readTrigger.C:1369
 readTrigger.C:1370
 readTrigger.C:1371
 readTrigger.C:1372
 readTrigger.C:1373
 readTrigger.C:1374
 readTrigger.C:1375
 readTrigger.C:1376
 readTrigger.C:1377
 readTrigger.C:1378
 readTrigger.C:1379
 readTrigger.C:1380
 readTrigger.C:1381
 readTrigger.C:1382
 readTrigger.C:1383
 readTrigger.C:1384
 readTrigger.C:1385
 readTrigger.C:1386
 readTrigger.C:1387
 readTrigger.C:1388
 readTrigger.C:1389
 readTrigger.C:1390
 readTrigger.C:1391
 readTrigger.C:1392
 readTrigger.C:1393
 readTrigger.C:1394
 readTrigger.C:1395
 readTrigger.C:1396
 readTrigger.C:1397
 readTrigger.C:1398
 readTrigger.C:1399
 readTrigger.C:1400
 readTrigger.C:1401
 readTrigger.C:1402
 readTrigger.C:1403
 readTrigger.C:1404
 readTrigger.C:1405
 readTrigger.C:1406
 readTrigger.C:1407
 readTrigger.C:1408
 readTrigger.C:1409
 readTrigger.C:1410
 readTrigger.C:1411
 readTrigger.C:1412
 readTrigger.C:1413
 readTrigger.C:1414
 readTrigger.C:1415
 readTrigger.C:1416
 readTrigger.C:1417
 readTrigger.C:1418
 readTrigger.C:1419
 readTrigger.C:1420
 readTrigger.C:1421
 readTrigger.C:1422
 readTrigger.C:1423
 readTrigger.C:1424
 readTrigger.C:1425
 readTrigger.C:1426
 readTrigger.C:1427
 readTrigger.C:1428
 readTrigger.C:1429
 readTrigger.C:1430
 readTrigger.C:1431
 readTrigger.C:1432
 readTrigger.C:1433
 readTrigger.C:1434
 readTrigger.C:1435
 readTrigger.C:1436
 readTrigger.C:1437
 readTrigger.C:1438
 readTrigger.C:1439
 readTrigger.C:1440
 readTrigger.C:1441
 readTrigger.C:1442
 readTrigger.C:1443
 readTrigger.C:1444
 readTrigger.C:1445
 readTrigger.C:1446
 readTrigger.C:1447
 readTrigger.C:1448
 readTrigger.C:1449
 readTrigger.C:1450
 readTrigger.C:1451
 readTrigger.C:1452
 readTrigger.C:1453
 readTrigger.C:1454
 readTrigger.C:1455
 readTrigger.C:1456
 readTrigger.C:1457
 readTrigger.C:1458
 readTrigger.C:1459
 readTrigger.C:1460
 readTrigger.C:1461
 readTrigger.C:1462
 readTrigger.C:1463
 readTrigger.C:1464
 readTrigger.C:1465
 readTrigger.C:1466
 readTrigger.C:1467
 readTrigger.C:1468
 readTrigger.C:1469
 readTrigger.C:1470
 readTrigger.C:1471
 readTrigger.C:1472
 readTrigger.C:1473
 readTrigger.C:1474
 readTrigger.C:1475
 readTrigger.C:1476
 readTrigger.C:1477
 readTrigger.C:1478
 readTrigger.C:1479
 readTrigger.C:1480
 readTrigger.C:1481
 readTrigger.C:1482
 readTrigger.C:1483
 readTrigger.C:1484
 readTrigger.C:1485
 readTrigger.C:1486
 readTrigger.C:1487
 readTrigger.C:1488
 readTrigger.C:1489
 readTrigger.C:1490
 readTrigger.C:1491
 readTrigger.C:1492
 readTrigger.C:1493
 readTrigger.C:1494
 readTrigger.C:1495
 readTrigger.C:1496
 readTrigger.C:1497
 readTrigger.C:1498
 readTrigger.C:1499
 readTrigger.C:1500
 readTrigger.C:1501
 readTrigger.C:1502
 readTrigger.C:1503
 readTrigger.C:1504
 readTrigger.C:1505
 readTrigger.C:1506
 readTrigger.C:1507
 readTrigger.C:1508
 readTrigger.C:1509
 readTrigger.C:1510
 readTrigger.C:1511
 readTrigger.C:1512
 readTrigger.C:1513
 readTrigger.C:1514
 readTrigger.C:1515
 readTrigger.C:1516
 readTrigger.C:1517
 readTrigger.C:1518
 readTrigger.C:1519
 readTrigger.C:1520
 readTrigger.C:1521
 readTrigger.C:1522
 readTrigger.C:1523
 readTrigger.C:1524
 readTrigger.C:1525
 readTrigger.C:1526
 readTrigger.C:1527
 readTrigger.C:1528
 readTrigger.C:1529
 readTrigger.C:1530
 readTrigger.C:1531
 readTrigger.C:1532
 readTrigger.C:1533
 readTrigger.C:1534
 readTrigger.C:1535
 readTrigger.C:1536
 readTrigger.C:1537
 readTrigger.C:1538
 readTrigger.C:1539
 readTrigger.C:1540
 readTrigger.C:1541
 readTrigger.C:1542
 readTrigger.C:1543
 readTrigger.C:1544
 readTrigger.C:1545
 readTrigger.C:1546
 readTrigger.C:1547
 readTrigger.C:1548
 readTrigger.C:1549
 readTrigger.C:1550
 readTrigger.C:1551
 readTrigger.C:1552
 readTrigger.C:1553
 readTrigger.C:1554
 readTrigger.C:1555
 readTrigger.C:1556
 readTrigger.C:1557
 readTrigger.C:1558
 readTrigger.C:1559
 readTrigger.C:1560
 readTrigger.C:1561
 readTrigger.C:1562
 readTrigger.C:1563
 readTrigger.C:1564
 readTrigger.C:1565
 readTrigger.C:1566
 readTrigger.C:1567
 readTrigger.C:1568
 readTrigger.C:1569
 readTrigger.C:1570
 readTrigger.C:1571
 readTrigger.C:1572
 readTrigger.C:1573
 readTrigger.C:1574
 readTrigger.C:1575
 readTrigger.C:1576
 readTrigger.C:1577
 readTrigger.C:1578
 readTrigger.C:1579
 readTrigger.C:1580
 readTrigger.C:1581
 readTrigger.C:1582
 readTrigger.C:1583
 readTrigger.C:1584
 readTrigger.C:1585
 readTrigger.C:1586
 readTrigger.C:1587
 readTrigger.C:1588
 readTrigger.C:1589
 readTrigger.C:1590
 readTrigger.C:1591
 readTrigger.C:1592
 readTrigger.C:1593
 readTrigger.C:1594
 readTrigger.C:1595
 readTrigger.C:1596
 readTrigger.C:1597
 readTrigger.C:1598
 readTrigger.C:1599
 readTrigger.C:1600
 readTrigger.C:1601
 readTrigger.C:1602
 readTrigger.C:1603
 readTrigger.C:1604
 readTrigger.C:1605
 readTrigger.C:1606
 readTrigger.C:1607
 readTrigger.C:1608
 readTrigger.C:1609
 readTrigger.C:1610
 readTrigger.C:1611
 readTrigger.C:1612
 readTrigger.C:1613
 readTrigger.C:1614
 readTrigger.C:1615
 readTrigger.C:1616
 readTrigger.C:1617
 readTrigger.C:1618
 readTrigger.C:1619
 readTrigger.C:1620
 readTrigger.C:1621
 readTrigger.C:1622
 readTrigger.C:1623
 readTrigger.C:1624
 readTrigger.C:1625
 readTrigger.C:1626
 readTrigger.C:1627
 readTrigger.C:1628