]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG2/FORWARD/analysis2/MakeEvaluateTriggers.C
Transition PWG2/FORWARD -> PWGLF
[u/mrichter/AliRoot.git] / PWG2 / FORWARD / analysis2 / MakeEvaluateTriggers.C
diff --git a/PWG2/FORWARD/analysis2/MakeEvaluateTriggers.C b/PWG2/FORWARD/analysis2/MakeEvaluateTriggers.C
deleted file mode 100644 (file)
index bc2a448..0000000
+++ /dev/null
@@ -1,1059 +0,0 @@
-#ifdef BUILD
-#include "AliAnalysisTaskSE.h"
-#include "AliAnalysisManager.h"
-#include "AliAnalysisDataContainer.h"
-#include "AliMCEvent.h"
-#include "AliESDEvent.h"
-#include "AliStack.h"
-#include "AliMultiplicity.h"
-#include "AliFMDMCEventInspector.h"
-#include "AliAODForwardMult.h"
-#include "AliLog.h"
-#include <TH1I.h>
-#include <TH2D.h>
-#include <TAxis.h>
-#include <TList.h>
-#include <TObjArray.h>
-#include <TParameter.h>
-#include <TStopwatch.h>
-#include <TROOT.h>
-#include <THStack.h>
-#include <TStyle.h>
-
-//====================================================================
-/**
- * Task to evaluate trigger bias in pp 
- * 
- */
-class EvaluateTrigger : public AliAnalysisTaskSE
-{
-public:
-  enum { 
-    kNone = 0x0, 
-    kESD  = 0x1, 
-    kMC   = 0x2
-  };
-  enum { 
-    kMaxN = 9
-  };
-  /** 
-   * Constructor
-   */
-  EvaluateTrigger() 
-    : AliAnalysisTaskSE(),
-      fInel(),
-      fInelGt0(),
-      fNSD(),
-      fNClusterGt0(),
-      fInspector(), 
-      fFirstEvent(true),
-      fData(0), 
-      fTriggers(0), 
-      fTrackletRequirement(kESD),
-      fVertexRequirement(kESD), 
-      fVertexAxis(0, 0, 0), 
-      fVertexESD(0),
-      fVertexMC(0), 
-      fM(0)
-  {}
-  /** 
-   * Constructor 
-   */
-  EvaluateTrigger(const char* /*name*/) 
-    : AliAnalysisTaskSE("evaluateTrigger"),
-      fInel(AliAODForwardMult::kInel),
-      fInelGt0(AliAODForwardMult::kInelGt0),
-      fNSD(AliAODForwardMult::kNSD),
-      fNClusterGt0(AliAODForwardMult::kNClusterGt0),
-      fInspector("eventInspector"), 
-      fFirstEvent(true), 
-      fData(0), 
-      fTriggers(0),
-      fTrackletRequirement(kESD),
-      fVertexRequirement(kESD), 
-      fVertexAxis(10, -10, 10), 
-      fVertexESD(0),
-      fVertexMC(0), 
-      fM(0)
-  {
-    DefineOutput(1, TList::Class());
-    DefineOutput(2, TList::Class());
-  }
-  void SetVertexRequirement(UShort_t m) { fVertexRequirement = m; }
-  void SetTrackletRequirement(UShort_t m) { fTrackletRequirement = m; }
-  void SetVertexAxis(Int_t nBins, Double_t low, Double_t high) 
-  {
-    fVertexAxis.Set(nBins, low, high);
-  }
-  /** 
-   * Intialize 
-   */
-  void Init() {}
-  /** 
-   * Create output objects 
-   */
-  void UserCreateOutputObjects()
-  {
-    fList = new TList;
-    fList->SetOwner();
-    fList->SetName("triggerSums");
-
-    // Double_t mb[] = { 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11 };
-    // Int_t    nM   = 10;
-    TAxis eAxis(200, -4, 6);
-    TAxis pAxis(40, 0, 2*TMath::Pi());
-
-    fData = new TH2D("data", "Cache", 
-                    eAxis.GetNbins(), eAxis.GetXmin(), eAxis.GetXmax(), 
-                    pAxis.GetNbins(), pAxis.GetXmin(), pAxis.GetXmax());
-    fData->SetDirectory(0);
-    fData->SetXTitle("#eta");
-    fData->SetYTitle("#varphi [radians]");
-    fData->SetZTitle("N_{ch}(#eta,#varphi)");
-    fData->Sumw2();
-    
-    fM = new TH1D("m", "Distribution of N_{ch}|_{|#eta|<1}", kMaxN+1,0,kMaxN+1);
-    fM->SetXTitle("N_{ch}|_{|#eta|<1}");
-    fM->SetYTitle("Events");
-    fM->SetFillColor(kRed+1);
-    fM->SetFillStyle(3001);
-    fM->SetDirectory(0);
-    fList->Add(fM);
-
-    for (Int_t i = 0; i <= kMaxN; i++) { 
-      TString lbl;
-      if (i == 0)          lbl = "all";
-      else if (i == kMaxN) lbl = Form("%d+",i-1);
-      else                 lbl = Form("<%d",i);
-      fM->GetXaxis()->SetBinLabel(i+1, lbl);
-    }
-
-    fTriggers = new TH1I("triggers", "Triggers", 8, -.5, 7.5);
-    fTriggers->SetDirectory(0);
-    fTriggers->GetXaxis()->SetBinLabel(1, "INEL (MC)");
-    fTriggers->GetXaxis()->SetBinLabel(2, "INEL (ESD)");
-    fTriggers->GetXaxis()->SetBinLabel(3, "INEL & N_{cluster}>0 (MC)");
-    fTriggers->GetXaxis()->SetBinLabel(4, "INEL & N_{cluster}>0 (ESD)");
-    fTriggers->GetXaxis()->SetBinLabel(5, "INEL>0 (MC)");
-    fTriggers->GetXaxis()->SetBinLabel(6, "INEL>0 (ESD)");
-    fTriggers->GetXaxis()->SetBinLabel(7, "NSD (MC)");
-    fTriggers->GetXaxis()->SetBinLabel(8, "NSD (ESD)");
-    fTriggers->SetFillColor(kYellow+1);
-    fTriggers->SetFillStyle(3001);
-    fList->Add(fTriggers);
-
-    fVertexESD = new TH1D("vertexESD", "ESD vertex distribution", 
-                         fVertexAxis.GetNbins(), 
-                         fVertexAxis.GetXmin(), 
-                         fVertexAxis.GetXmax());
-    fVertexESD->SetDirectory(0);
-    fVertexESD->SetFillColor(kRed+1);
-    fVertexESD->SetFillStyle(3001);
-    fVertexESD->SetXTitle("v_{z} [cm]");
-    fVertexESD->SetYTitle("P(v_{z})");
-    fList->Add(fVertexESD);
-
-    fVertexMC = new TH1D("vertexMC", "MC vertex distribution", 
-                         fVertexAxis.GetNbins(), 
-                         fVertexAxis.GetXmin(), 
-                         fVertexAxis.GetXmax());
-    fVertexMC->SetDirectory(0);
-    fVertexMC->SetFillColor(kBlue+1);
-    fVertexMC->SetFillStyle(3001);
-    fVertexMC->SetXTitle("v_{z} [cm]");
-    fVertexMC->SetYTitle("P(v_{z})");
-    fList->Add(fVertexMC);
-
-    fInel.CreateObjects(fList, fM, fData);
-    fInelGt0.CreateObjects(fList, fM, fData);
-    fNSD.CreateObjects(fList, fM, fData);
-    fNClusterGt0.CreateObjects(fList, fM, fData);
-
-
-    fInspector.DefineOutput(fList);
-    fInspector.Init(fVertexAxis);
-
-    PostData(1, fList);
-  }
-  /** 
-   * Event processing 
-   */
-  void UserExec(Option_t*) 
-  {
-    // Get the input data - MC event
-    AliMCEvent*  mcEvent = MCEvent();
-    if (!mcEvent) { 
-      AliWarning("No MC event found");
-      return;
-    }
-    
-    // Get the input data - ESD event
-    AliESDEvent* esd = dynamic_cast<AliESDEvent*>(InputEvent());
-    if (!esd) { 
-      AliWarning("No ESD event found for input event");
-      return;
-    }
-
-    if (fFirstEvent && esd->GetESDRun()) {
-      fInspector.ReadRunDetails(esd);
-
-      AliInfo(Form("Initializing with parameters from the ESD:\n"
-                  "         AliESDEvent::GetBeamEnergy()   ->%f\n"
-                  "         AliESDEvent::GetBeamType()     ->%s\n"
-                  "         AliESDEvent::GetCurrentL3()    ->%f\n"
-                  "         AliESDEvent::GetMagneticField()->%f\n"
-                  "         AliESDEvent::GetRunNumber()    ->%d\n",
-                  esd->GetBeamEnergy(),
-                  esd->GetBeamType(),
-                  esd->GetCurrentL3(),
-                  esd->GetMagneticField(),
-                  esd->GetRunNumber()));
-      
-      fFirstEvent = false;
-    }
-
-    // Get the particle stack 
-    AliStack* stack = mcEvent->Stack();
-
-    // Some variables 
-    UInt_t   triggers; // Trigger bits
-    Bool_t   lowFlux;  // Low flux flag
-    UShort_t iVz;      // Vertex bin from ESD
-    Double_t vZ;       // Z coordinate from ESD
-    Double_t cent;     // Centrality 
-    UShort_t iVzMc;    // Vertex bin from MC
-    Double_t vZMc;     // Z coordinate of IP vertex from MC
-    Double_t b;        // Impact parameter
-    Int_t    nPart;    // Number of participants 
-    Int_t    nBin;     // Number of binary collisions 
-    Double_t phiR;     // Reaction plane from MC
-    UShort_t nClusters;// Number of clisters 
-    // Process the data 
-    Int_t retESD = fInspector.Process(esd, triggers, lowFlux, iVz, vZ, cent,
-                                     nClusters);
-    Int_t retMC  = fInspector.ProcessMC(mcEvent, triggers, iVzMc, 
-                                       vZMc, b, nPart, nBin, phiR);
-
-    Bool_t hasESDVtx = retESD == AliFMDEventInspector::kOk;
-    Bool_t hasMCVtx  = retMC  == AliFMDEventInspector::kOk;
-    if (hasESDVtx) fVertexESD->Fill(vZ);
-    if (hasMCVtx)  fVertexMC->Fill(vZMc);
-
-    Bool_t isMcInel = true; // (triggers & AliAODForwardMult::kB);
-    Bool_t isMcNSD  = (triggers & AliAODForwardMult::kMCNSD);
-
-    Int_t mESD = 0;
-    const AliMultiplicity* spdmult = esd->GetMultiplicity();
-    if (!spdmult) {
-      AliWarning("No SPD multiplicity");
-    }
-    else { 
-      // Check if we have one or more tracklets 
-      // in the range -1 < eta < 1 to set the INEL>0 
-      // trigger flag. 
-      Int_t n = spdmult->GetNumberOfTracklets();
-      for (Int_t j = 0; j < n; j++) 
-       if(TMath::Abs(spdmult->GetEta(j)) < 1) mESD++;
-    }
-
-    // Reset cache 
-    fData->Reset();
-    Int_t mMC = 0; // Number of particles in |eta|<1
-
-    // Loop over all tracks 
-    Int_t nTracks = mcEvent->GetNumberOfTracks();
-    for (Int_t iTr = 0; iTr < nTracks; iTr++) { 
-      AliMCParticle* particle = 
-       static_cast<AliMCParticle*>(mcEvent->GetTrack(iTr));
-    
-      // Check the returned particle 
-      if (!particle) continue;
-
-      // Check if this charged and a primary 
-      Bool_t isCharged = particle->Charge() != 0;
-      Bool_t isPrimary = stack->IsPhysicalPrimary(iTr);
-
-      if (!isCharged || !isPrimary) continue;
-
-      
-      // Fill (eta,phi) of the particle into histograsm for b
-      Double_t eta = particle->Eta();
-      Double_t phi = particle->Phi();
-      
-      fData->Fill(eta, phi);
-      if (TMath::Abs(eta) <= 1) mMC++;
-    }
-    Int_t m = mESD;
-    if (fTrackletRequirement == kMC) m = mMC;
-    fM->Fill(m);
-
-    bool isMcInelGt0 = isMcInel && (mMC > 0);
-    
-    bool hasVertex   = true;
-    if (fVertexRequirement & kMC)  hasVertex = hasVertex && hasMCVtx;
-    if (fVertexRequirement & kESD) hasVertex = hasVertex && hasESDVtx;
-
-    if (isMcInel) {
-      fTriggers->Fill(0);
-      bool triggered = (triggers & AliAODForwardMult::kInel);
-      if (triggered) fTriggers->Fill(1);
-      fInel.AddEvent(triggered, hasVertex, m, fData);
-    }
-    if (isMcInel) { // && nClusters > 0) {
-      fTriggers->Fill(2);
-      bool triggered = (triggers & AliAODForwardMult::kNClusterGt0);
-      if (triggered) fTriggers->Fill(3);
-      fNClusterGt0.AddEvent(triggered, hasVertex, m, fData);
-    }
-    if (isMcInelGt0) {
-      fTriggers->Fill(4);
-      bool triggered = (triggers & AliAODForwardMult::kInelGt0);
-      if (triggered) fTriggers->Fill(5);
-      fInelGt0.AddEvent(triggered, hasVertex, m, fData);
-    }
-    if (isMcNSD) {
-      fTriggers->Fill(6);
-      bool triggered = (triggers & AliAODForwardMult::kNSD);
-      if (triggered) fTriggers->Fill(7);
-      fNSD.AddEvent(triggered, hasVertex, m, fData);
-    }
-    PostData(1, fList);
-  }
-  /** 
-   * End of job processing 
-   */
-  void Terminate(Option_t*)
-  {
-    fList = dynamic_cast<TList*>(GetOutputData(1));
-    if (!fList) {
-      AliError(Form("No output list defined (%p)", GetOutputData(1)));
-      if (GetOutputData(1)) GetOutputData(1)->Print();
-      return;
-    }
-
-
-    TList* output = new TList;
-    output->SetName("triggerResults");
-    output->SetOwner();
-
-    fVertexMC = static_cast<TH1D*>(fList->FindObject("vertexMC"));
-    fVertexESD = static_cast<TH1D*>(fList->FindObject("vertexESD"));
-    fM         = static_cast<TH1D*>(fList->FindObject("m"));
-    if (fVertexMC) { 
-      TH1D* vtxMC = static_cast<TH1D*>(fVertexMC->Clone("vertexMC"));
-      vtxMC->SetDirectory(0);
-      if (vtxMC->GetEntries() > 0)
-       vtxMC->Scale(1. / vtxMC->GetEntries());
-      else 
-       vtxMC->Scale(0);
-      output->Add(vtxMC);
-    }
-    if (fVertexESD) { 
-      TH1D* vtxESD = static_cast<TH1D*>(fVertexESD->Clone("vertexESD"));
-      vtxESD->SetDirectory(0);
-      if (vtxESD->GetEntries() > 0)
-       vtxESD->Scale(1. / vtxESD->GetEntries());
-      else 
-       vtxESD->Scale(0);
-      output->Add(vtxESD);
-    }
-    if (fM) { 
-      TH1D* m = static_cast<TH1D*>(fM->Clone("m"));
-      m->SetDirectory(0);
-      m->SetYTitle("P(N_{ch}|_{|#eta|<1} < X)");
-      if (m->GetBinContent(1) > 0)
-       m->Scale(1. / m->GetBinContent(1));
-      else 
-       m->Scale(0);
-      output->Add(m);
-    }      
-
-    TString vtxReq;
-    if (fVertexRequirement & kMC)  vtxReq.Append("MC ");
-    if (fVertexRequirement & kESD) vtxReq.Append("ESD ");
-    output->Add(new TNamed("vtxReq", vtxReq.Data()));
-    output->Add(new TNamed("trkReq",
-                          fTrackletRequirement == kMC ? "MC" : "ESD"));
-
-    fInel.Finish(fList, output);
-    fInelGt0.Finish(fList, output);
-    fNSD.Finish(fList, output);
-    fNClusterGt0.Finish(fList, output);
-
-    PostData(2, output);
-  }
-    
-protected:
-  //__________________________________________________________________
-  /** 
-   * Structure to hold per trigger type information 
-   */
-  struct TriggerType : public TNamed
-  {
-    //________________________________________________________________
-    /** 
-     * Structure to hold per multiplicity bin information 
-     */
-    struct MBin : public TNamed
-    {
-      TH2D*     fTruth;
-      TH2D*     fTriggered; 
-      TH2D*     fAccepted;
-      TH1I*     fCounts;
-      UShort_t  fLow;
-      UShort_t  fHigh;
-      Bool_t IsAll() const { return fLow > fHigh; }
-      Bool_t IsLast() const { return fHigh >= kMaxN; }
-      /** 
-       * Constructor 
-       */
-      MBin() 
-       : fTruth(0), fTriggered(0), fAccepted(0), 
-         fCounts(0), fLow(0), fHigh(1000) {}
-      /** 
-       * Constructor 
-       * 
-       * @param p      Parent list 
-       * @param low    Low cut 
-       * @param high   High cut 
-       * @param eAxis  Eta axis 
-       * @param pAxis  Phi axis 
-       */
-      MBin(TList* p, UShort_t low, UShort_t high, const TH2D* dHist) 
-       : fTruth(0), 
-         fTriggered(0), 
-         fAccepted(0),
-         fCounts(0), 
-         fLow(low), 
-         fHigh(high)
-      {
-       if (IsAll()) {
-         SetName("all");
-         SetTitle("All");
-       }
-       else if (IsLast()) { 
-         SetName(Form("m%03dplus", fLow));
-         SetTitle(Form("%d #leq N_{tracklets}|_{|#eta|<1}", fLow));
-       }
-       else {
-         SetName(Form("m%03d_%03d", fLow, fHigh));
-         SetTitle(Form("%d #leq N_{tracklets}|_{|#eta|<1} < %d", fLow,fHigh));
-       }
-
-       TList* l = new TList;
-       l->SetOwner();
-       l->SetName(GetName());
-       p->Add(l);
-
-       fTruth = static_cast<TH2D*>(dHist->Clone(("truth")));
-       fTruth->SetTitle("MC truth");
-       fTruth->SetDirectory(0);
-       fTruth->SetZTitle("#sum_i^{N_X} N_{ch}(#eta,#varphi)");
-       // fTruth->Sumw2();
-       fTruth->Reset();
-       l->Add(fTruth);
-
-       fTriggered = static_cast<TH2D*>(fTruth->Clone(("triggered")));
-       fTriggered->SetTitle("Triggered");
-       fTriggered->SetDirectory(0);
-       fTriggered->SetZTitle("#sum_i^{N_T} N_{ch}(#eta,#varphi)");
-       // fTriggered->Sumw2();
-       fTriggered->Reset();
-       l->Add(fTriggered);
-
-       fAccepted = static_cast<TH2D*>(fTruth->Clone(("accepted")));
-       fAccepted->SetTitle("Accepted");
-       fAccepted->SetDirectory(0);
-       fAccepted->SetZTitle("#sum_i^{N_T} N_{ch}(#eta,#varphi)");
-       // fAccepted->Sumw2();
-       fAccepted->Reset();
-       l->Add(fAccepted);
-       
-       fCounts = new TH1I("counts", "Event counts", 3, -.5, 2.5);
-       fCounts->SetDirectory(0);
-       fCounts->GetXaxis()->SetBinLabel(1, "Truth");
-       fCounts->GetXaxis()->SetBinLabel(2, "Triggered");
-       fCounts->GetXaxis()->SetBinLabel(3, "Accepted");
-       fCounts->SetYTitle("# events");
-       l->Add(fCounts);
-      }
-      /** 
-       * Add event observation
-       * 
-       * @param triggered Whether the event was triggered
-       * @param event     Data for this event 
-       */
-      void AddEvent(Bool_t triggered, Bool_t hasVtx, const TH2D* event) 
-      {
-       fCounts->Fill(0);
-       fTruth->Add(event);
-       if (triggered) { 
-         fCounts->Fill(1);
-         fTriggered->Add(event);
-         if (hasVtx) {
-           fCounts->Fill(2);
-           fAccepted->Add(event);
-         }
-       }
-      }
-      /** 
-       * End of job processing 
-       * 
-       * @param p      Parent list
-       * @param o      Output parent list
-       * @param stack  Stack of histograms
-       * 
-       * @return Trigger efficiency
-       */ 
-     Double_t Finish(const TList* p, TList* o, THStack* stack) 
-      {
-       TList* l = dynamic_cast<TList*>(p->FindObject(GetName()));
-       if (!l) { 
-         Warning("Finish", "Cannot find %s in %s", GetName(), p->GetName());
-         return 0;
-       }
-       fTruth     = static_cast<TH2D*>(l->FindObject("truth"));
-       fTriggered = static_cast<TH2D*>(l->FindObject("triggered"));
-       fAccepted  = static_cast<TH2D*>(l->FindObject("accepted"));
-       fCounts    = static_cast<TH1I*>(l->FindObject("counts"));
-       
-       Int_t    nTruth     = fCounts->GetBinContent(1);
-       Int_t    nTriggered = fCounts->GetBinContent(2);
-       Int_t    nAccepted  = fCounts->GetBinContent(3);
-       Double_t eff        = 0;
-       if (nTruth > 0) eff = double(nTriggered) / nTruth;
-       else if (nTriggered == nTruth) eff = 1;
-
-       if (nTruth > 0)     fTruth->Scale(1. / nTruth);
-       if (nTriggered > 0) fTriggered->Scale(1. / nTriggered);
-       if (nAccepted > 0)  fAccepted->Scale(1. / nAccepted);
-
-       if (IsAll()) 
-         Info("Finish", "%-12s  [all]  E_X=N_T/N_X=%9d/%-9d=%f "
-              "E_V=N_A/N_T=%9d/%-9d=%f", 
-              p->GetName(), nTriggered, nTruth, eff, nAccepted, nTriggered, 
-              (nTriggered > 0 ? double(nAccepted) / nTriggered: 0));
-       else if (IsLast()) 
-         Info("Finish", "%-12s  [%2d+]  E_X=N_T/N_X=%9d/%-9d=%f "
-              "E_V=N_A/N_T=%9d/%-9d=%f", 
-              p->GetName(), fLow, nTriggered, nTruth, eff, 
-              nAccepted, nTriggered, 
-              (nTriggered > 0 ? double(nAccepted) / nTriggered: 0));
-       else
-         Info("Finish", "%-12s [%2d-%2d] E_X=N_T/N_X=%9d/%-9d=%f "
-              "E_V=N_A/N_T=%9d/%-9d=%f", 
-              p->GetName(), fLow, fHigh, nTriggered, nTruth, eff, 
-              nAccepted, nTriggered, 
-              (nTriggered > 0 ? double(nAccepted) / nTriggered: 0));
-       
-       TList* out = new TList;
-       out->SetName(GetName());
-       out->SetOwner();
-       o->Add(out);
-       
-       out->Add(fTruth);
-       out->Add(fTriggered);
-       out->Add(new TParameter<double>("eff", eff));
-       
-       TH2D* bias = static_cast<TH2D*>(fAccepted->Clone("bias"));
-       bias->Divide(fTruth);
-       bias->SetDirectory(0);
-       bias->SetZTitle("Trigger bias (accepted/truth)");
-       out->Add(bias);
-
-       TString title = GetTitle();
-       TH1D* truth_px = static_cast<TH1D*>(fTruth->ProjectionX("truth_eta"));
-       truth_px->SetTitle(title);
-       truth_px->Scale(1. / fTruth->GetNbinsY());
-       truth_px->SetDirectory(0);
-       truth_px->SetLineColor(kRed+1);
-       truth_px->SetMarkerColor(kRed+1);
-       truth_px->SetFillColor(kRed+1);
-       truth_px->SetFillStyle(0);
-       out->Add(truth_px);
-
-       TH1D* triggered_px = 
-         static_cast<TH1D*>(fTriggered->ProjectionX("triggered_eta"));
-       triggered_px->SetTitle(title);
-       triggered_px->Scale(1. / fTriggered->GetNbinsY());
-       triggered_px->SetDirectory(0);
-       triggered_px->SetLineColor(kGreen+1);
-       triggered_px->SetMarkerColor(kGreen+1);
-       triggered_px->SetFillColor(kGreen+1);
-       triggered_px->SetFillStyle(0);
-       out->Add(triggered_px);
-
-       TH1D* accepted_px = 
-         static_cast<TH1D*>(fAccepted->ProjectionX("accepted_eta"));
-       accepted_px->SetTitle(title);
-       accepted_px->Scale(1. / fAccepted->GetNbinsY());
-       accepted_px->SetLineColor(kBlue+1);
-       accepted_px->SetMarkerColor(kBlue+1);
-       accepted_px->SetFillColor(kBlue+1);
-       accepted_px->SetDirectory(0);
-       out->Add(accepted_px);
-
-       THStack* data = new THStack("data", "Data distributions");
-       data->Add(truth_px);
-       data->Add(triggered_px);
-       data->Add(accepted_px);
-       out->Add(data);
-
-#if 0
-       TH1D* bias_px = static_cast<TH1D*>(bias->ProjectionX("bias_eta"));
-       bias_px->SetTitle(title);
-       bias_px->Scale(1. / bias->GetNbinsY());
-#else
-       TH1D* bias_px = static_cast<TH1D*>(accepted_px->Clone("bias_px"));
-       bias_px->Divide(truth_px);
-       bias_px->SetYTitle("Trigger bias (triggered/truth)");
-#endif
-       bias_px->SetDirectory(0);
-       bias_px->SetMarkerStyle(20);
-       bias_px->SetFillStyle(0);
-       bias_px->SetMinimum(0);
-       out->Add(bias_px);
-
-       stack->Add(bias_px);
-
-       return eff;
-      }        
-      ClassDef(MBin,1);
-    };
-
-    /** 
-     * Constructor 
-     */
-    TriggerType() 
-      : TNamed(), 
-       fMask(0),
-       fM(0),
-       fBins(0)
-    {}
-    //--- Constructor ------------------------------------------------
-    /** 
-     * Constructor 
-     * 
-     * @param mask  Trigger mask
-     */
-    TriggerType(UShort_t mask) 
-      : TNamed(AliAODForwardMult::GetTriggerString(mask), ""),
-       fMask(mask), 
-       fM(0), 
-       fBins(0)
-    {
-      TString n(GetName());
-      n = n.Strip(TString::kBoth);
-      SetName(n);
-    }
-    /** 
-     * Create objects 
-     * 
-     * @param list   PArent list
-     * @param mAxis  Multiplicity axis 
-     * @param eAxis  Eta axis
-     * @param pAxis  Phi axis
-     */
-    void CreateObjects(TList* list, 
-                      const TH1D* mHist, 
-                      const TH2D* dHist)
-    {
-      TList* ours  = new TList;
-      ours->SetName(GetName());
-      ours->SetOwner();
-      list->Add(ours);
-
-      fM = static_cast<TH1D*>(mHist->Clone("m"));
-      fM->SetDirectory(0);
-      ours->Add(fM);
-      
-      fBins = new TObjArray;
-      fBins->AddAt(new MBin(ours, 1000, 0, dHist), 0);
-      for (Int_t i = 1; i < fM->GetNbinsX(); i++) { 
-       Double_t low  = fM->GetXaxis()->GetBinLowEdge(i);
-       Double_t high = fM->GetXaxis()->GetBinUpEdge(i);
-       Info("CreatePbjects", "Adding bin [%3d,%3d] @ %d", 
-            int(low), int(high), i);
-       fBins->AddAt(new MBin(ours, UShort_t(low), UShort_t(high), dHist), i);
-      }
-    }
-    /** 
-     * Find bin corresponding to m
-     * 
-     * @param m Multiplicity 
-     * 
-     * @return Bin. 
-     */
-    MBin* FindBin(UShort_t m) 
-    { 
-#if 0
-      for (Int_t i = 1; i < fBins->GetEntries(); i++) {
-       MBin* b = static_cast<MBin*>(fBins->At(i));
-       if (m >= b->fLow && m < b->fHigh) return b;
-      }
-      Warning("FindBin", "Found no bin for m=%d", m);
-      return 0;
-#else
-      Int_t b = fM->GetXaxis()->FindBin(m);
-      if (b <= 0) return 0;
-      if (b >= fM->GetNbinsX()+1) b = fM->GetNbinsX();
-      MBin* bin = static_cast<MBin*>(fBins->At(b));
-      return bin;
-#endif
-    }
-    /** 
-     * Add event observation 
-     * 
-     * @param triggered  IF this is triggered
-     * @param m          Multiplicity 
-     * @param data       Observation 
-     */
-    void AddEvent(Bool_t triggered, Bool_t hasVtx, UShort_t m, const TH2D* data)
-    {
-      fM->AddBinContent(1);
-      fM->AddBinContent(TMath::Min(fM->GetNbinsX(), m+2));
-
-      MBin* all = static_cast<MBin*>(fBins->At(0));
-      all->AddEvent(triggered, hasVtx, data);
-      
-      MBin* bin = FindBin(m);
-      if (!bin) return;
-      bin->AddEvent(triggered, hasVtx, data);      
-    }      
-    /** 
-     * End of job processing 
-     * 
-     * @param p Parent list 
-     * @param o Parent output list 
-     */
-    void Finish(const TList* p, TList* o)
-    {
-      TList* l = dynamic_cast<TList*>(p->FindObject(GetName()));
-      if (!l) { 
-       Warning("Finish", "Cannot find %s in %s", GetName(), p->GetName());
-       return;
-      }
-      
-      TList* ours  = new TList;
-      ours->SetName(GetName());
-      ours->SetOwner();
-      o->Add(ours);
-
-      fM = static_cast<TH1D*>(l->FindObject("m"));
-      if (!fM) { 
-       Warning("Finish", "Didn't find object 'm' in %s", l->GetName());
-       return;
-      }
-      TH1D* m = static_cast<TH1D*>(fM->Clone("m"));
-      m->SetDirectory(0);
-      m->SetYTitle("P(N_{ch}|_{|#eta|<1} < X)");
-      if (m->GetBinContent(1) > 0) 
-       m->Scale(1. / m->GetBinContent(1));
-      ours->Add(m);
-
-      Int_t nBin = fM->GetNbinsX();
-      TH1D* effs = static_cast<TH1D*>(fM->Clone("effs"));
-      effs->SetYTitle("#epsilon_{X}");
-      effs->SetFillColor(kRed+1);
-      effs->SetDirectory(0);
-      effs->SetMinimum(0);
-
-      gStyle->SetPalette(1);
-      Int_t   nCol = gStyle->GetNumberOfColors();
-      THStack* stack = new THStack("biases", "Trigger biases");
-      for (Int_t i = 0; i < nBin; i++) { 
-       MBin* bin = static_cast<MBin*>(fBins->At(i));
-       effs->SetBinContent(i+1, bin->Finish(l, ours, stack));
-       TH1* h = static_cast<TH1*>(stack->GetHists()->At(i));
-       Int_t col = kBlack;
-       if (i != 0) { 
-         Int_t icol = TMath::Min(nCol-1,int(double(i)/nBin * nCol + .5));
-         col        = gStyle->GetColorPalette(icol);
-       }
-       h->SetMarkerColor(col);
-       h->SetFillColor(col);
-       h->SetLineColor(col);
-      }
-
-      ours->Add(stack);
-      ours->Add(effs);
-    } 
-    UShort_t   fMask;
-    TH1D*      fM;
-    TObjArray* fBins;
-    ClassDef(TriggerType,1);
-  };
-  TriggerType            fInel;
-  TriggerType            fInelGt0;
-  TriggerType            fNSD;
-  TriggerType            fNClusterGt0;
-  AliFMDMCEventInspector fInspector;
-  TList*                 fList;
-  Bool_t                 fFirstEvent;
-  TH2D*                  fData;
-  TH1I*                  fTriggers;
-  UInt_t                 fTrackletRequirement;
-  UInt_t                 fVertexRequirement;
-  TAxis                  fVertexAxis;
-  TH1D*                  fVertexESD;
-  TH1D*                  fVertexMC;
-  TH1D*                  fM;
-  ClassDef(EvaluateTrigger,1);
-};
-#else 
-//====================================================================
-void MakeEvaluateTriggers(const char* esddir, 
-                         Int_t       nEvents    = -1, 
-                         UInt_t      vtx        = 0x2,
-                         UInt_t      trk        = 0x1,
-                         Int_t       vz         = 10,
-                         Int_t       proof      = 0)
-{
-  // --- Libraries to load -------------------------------------------
-  gROOT->Macro("$ALICE_ROOT/PWG2/FORWARD/analysis2/scripts/LoadLibs.C");
-
-  // --- Check for proof mode, and possibly upload pars --------------
-  if (proof> 0) { 
-    gROOT->LoadMacro("$ALICE_ROOT/PWG2/FORWARD/analysis2/scripts/LoadPars.C");
-    if (!LoadPars(proof)) { 
-      Error("MakeAOD", "Failed to load PARs");
-      return;
-    }
-  }
-  
-  // --- Our data chain ----------------------------------------------
-  gROOT->LoadMacro("$ALICE_ROOT/PWG2/FORWARD/analysis2/scripts/MakeChain.C");
-  TChain* chain = MakeChain("ESD", esddir,true);
-  // If 0 or less events is select, choose all 
-  if (nEvents <= 0) nEvents = chain->GetEntries();
-  
-  // --- Set the macro path ------------------------------------------
-  gROOT->SetMacroPath(Form("%s:$(ALICE_ROOT)/PWG2/FORWARD/analysis2:"
-                          "$ALICE_ROOT/ANALYSIS/macros",
-                          gROOT->GetMacroPath()));
-
-  // --- Creating the manager and handlers ---------------------------
-  AliAnalysisManager *mgr  = new AliAnalysisManager("Triggers", 
-                                                   "Forward multiplicity");
-  AliAnalysisManager::SetCommonFileName("triggers.root");
-
-  // --- ESD input handler -------------------------------------------
-  AliESDInputHandler *esdHandler = new AliESDInputHandler();
-  mgr->SetInputEventHandler(esdHandler);      
-       
-  // --- Monte Carlo handler -----------------------------------------
-  AliMCEventHandler* mcHandler = new AliMCEventHandler();
-  mgr->SetMCtruthEventHandler(mcHandler);
-  mcHandler->SetReadTR(true);    
-
-  // --- Add tasks ---------------------------------------------------
-  // Physics selection 
-  gROOT->Macro(Form("AddTaskPhysicsSelection.C(1,1,0)"));
-
-#if 0
-  // --- Fix up physics selection to give proper A,C, and E triggers -
-  AliInputEventHandler* ih =
-    static_cast<AliInputEventHandler*>(mgr->GetInputEventHandler());
-  AliPhysicsSelection* ps = 
-    static_cast<AliPhysicsSelection*>(ih->GetEventSelection());
-  // Ignore trigger class when selecting events.  This mean that we
-  // get offline+(A,C,E) events too
-  ps->SetSkipTriggerClassSelection(true);
-#endif
-
-  // --- compile our code --------------------------------------------
-  gSystem->AddIncludePath("-I${ALICE_ROOT}/PWG2/FORWARD/analysis2 "
-                         "-I${ALICE_ROOT}/ANALYSIS "
-                         "-I${ALICE_ROOT}/include -DBUILD=1");
-  gROOT->LoadMacro("${ALICE_ROOT}/PWG2/FORWARD/analysis2/MakeEvaluateTriggers.C++g");
-  
-  // --- Make our object ---------------------------------------------
-  EvaluateTrigger* task = new EvaluateTrigger("triggers");
-  mgr->AddTask(task);
-  task->SetVertexRequirement(vtx);
-  task->SetTrackletRequirement(trk);
-  task->SetVertexAxis(10, -vz, vz);
-
-  // --- create containers for input/output --------------------------
-  AliAnalysisDataContainer *sums = 
-    mgr->CreateContainer("triggerSums", TList::Class(), 
-                        AliAnalysisManager::kOutputContainer, 
-                        AliAnalysisManager::GetCommonFileName());
-  AliAnalysisDataContainer *output = 
-    mgr->CreateContainer("triggerResults", TList::Class(), 
-                        AliAnalysisManager::kParamContainer, 
-                        AliAnalysisManager::GetCommonFileName());
-  
-  // --- connect input/output ----------------------------------------
-  mgr->ConnectInput(task, 0, mgr->GetCommonInputContainer());
-  mgr->ConnectOutput(task, 1, sums);
-  mgr->ConnectOutput(task, 2, output);
-  
-  // --- Run the analysis --------------------------------------------
-  TStopwatch t;
-  if (!mgr->InitAnalysis()) {
-    Error("MakeAOD", "Failed to initialize analysis train!");
-    return;
-  }
-  // Skip terminate if we're so requested and not in Proof or full mode
-  mgr->SetSkipTerminate(false);
-  // Some informative output 
-  mgr->PrintStatus();
-  if (proof) mgr->SetDebugLevel(3);
-  if (mgr->GetDebugLevel() < 1 && !proof) 
-    mgr->SetUseProgressBar(kTRUE,100);
-
-  // Run the train 
-  t.Start();
-  Printf("=== RUNNING ANALYSIS on %9d events ==========================",
-        nEvents);
-  mgr->StartAnalysis(proof ? "proof" : "local", chain, nEvents);
-  t.Stop();
-  t.Print();
-}
-//====================================================================
-void DrawEvaluateTriggers(const char* filename="triggers.root")
-{
-  TFile* file = TFile::Open(filename, "READ");
-  if (!file) { 
-    Error("DrawEvaluteTriggers", "Failed to open %s", filename);
-    return;
-  }
-
-  TList* list = static_cast<TList*>(file->Get("triggerResults"));
-  if (!list) { 
-    Error("DrawEvaluateTriggers", "Faield to get triggerResults from %s", 
-         list->GetName());
-    return;
-  }
-
-  TCanvas* c = new TCanvas("c", "c", 1200, 900);
-  c->SetFillColor(0);
-  c->SetBorderSize(0);
-  c->SetBorderMode(0);
-
-  TPad* p = new TPad("top", "Top", 0, .9, 1, 1, 0, 0, 0); 
-  p->SetFillColor(0);
-  p->SetFillStyle(0);
-  p->SetBorderSize(0);
-  p->SetBorderMode(0);
-  c->cd();
-  p->Draw();
-  p->cd();
-  TObject* vtxReq = list->FindObject("vtxReq");
-  TObject* trkReq = list->FindObject("trkReq");
-  if (!vtxReq) vtxReq = new TNamed("vtxReq", "Unknown");
-  if (!trkReq) trkReq = new TNamed("trkReq", "Unknown");
-  TLatex* ltx = new TLatex(0.5, 0.5, 
-                          Form("Trigger bias and efficiency. " 
-                               "Vertex requirement: %s, "
-                               "Tracklet requirement %s",
-                               vtxReq->GetTitle(), trkReq->GetTitle()));
-  ltx->Draw();
-  ltx->SetTextAlign(22);
-  ltx->SetTextSize(0.4);
-
-  const char*  trigs[] = { "INEL", "NCluster>0", "INEL>0", "NSD", 0 };
-  const char** trig    = trigs;
-  Int_t n = 4;
-  Int_t i = 0;
-  while (*trig) { 
-    TList* lt = static_cast<TList*>(list->FindObject(*trig));
-    if (!lt) { 
-      Warning("DrawEvaluteTriggers", "No list for '%s' in '%s'", 
-             *trig, list->GetName());
-      // list->ls();
-      TIter next(triggerResults);
-      TObject* o ;
-      while ((o = next())) Printf("'%s'", o->GetName());
-      trig++;
-      i++;
-      continue;
-    }
-
-    Double_t y1 = 1-double(i+1)/n;
-    Double_t y2 = 1-double(i)/n;
-    Double_t x1 = double(i)/n;
-    Double_t x2 = double(i+1)/n;
-    p = new TPad(Form("p%d", 2*i), Form("%s biases", *trig), 
-                x1, .3, x2, .9, 0, 0);
-    p->SetFillColor(0);
-    p->SetFillStyle(0);
-    p->SetBorderSize(0);
-    p->SetBorderMode(0);
-    p->SetTopMargin(0.01);
-    p->SetBottomMargin(0.05);
-    p->SetRightMargin(0.01);
-    c->cd();
-    p->Draw();
-    p->cd();
-    
-    THStack* biases = static_cast<THStack*>(lt->FindObject("biases"));
-    biases->SetTitle(*trig);
-    TLegend* l = new TLegend(.1, .15, .95, .35, 
-                            Form("1/N_{T}#sum N_{ch}}/"
-                                 "1/N_{X}#sum N_{ch} - %s", *trig));
-    l->SetFillColor(0);
-    l->SetFillStyle(0);
-    l->SetBorderSize(0);
-    l->SetNColumns(2);
-    
-    gStyle->SetOptTitle(0);
-    TIter next(biases->GetHists());
-    TH1*  frame = 0;
-    TH1*  hist = 0;
-    Int_t j = 1;
-    while ((hist = static_cast<TH1*>(next()))) { 
-      if (!frame) { 
-       
-       frame = new TH2D("frame", "", 
-                        hist->GetXaxis()->GetNbins(),
-                        hist->GetXaxis()->GetXmin(),
-                        hist->GetXaxis()->GetXmax(),
-                        100, 0, 4);
-       frame->SetDirectory(0);
-       frame->SetXTitle(hist->GetXaxis()->GetTitle());
-       frame->SetYTitle(hist->GetYaxis()->GetTitle());
-       frame->SetStats(0);
-       frame->Draw();
-      }
-      // hist->Scale(j);
-      // hist->Draw("same p hist");
-      // if (j == 1) hist->SetTitle("all");
-      l->AddEntry(hist, hist->GetTitle(), "p");
-      j++;
-    }
-    // biases->SetMaximum(3.5);
-    biases->Draw("p hist nostack");
-    l->Draw();
-    
-    p = new TPad(Form("p%d", 2*i+1), Form("%s efficiencies", *trig), 
-                x1, 0, x2, .3, 0, 0, 0);
-    p->SetFillColor(0);
-    p->SetFillStyle(0);
-    p->SetBorderSize(0);
-    p->SetBorderMode(0);
-    p->SetTopMargin(0.01);
-    p->SetRightMargin(0.01);
-    c->cd();
-    p->Draw();
-    p->cd();
-    
-    TH1* effs = static_cast<TH1*>(lt->FindObject("effs"));
-    effs->SetTitle(*trig);
-    effs->SetStats(0);
-    effs->SetMinimum(0);
-    effs->SetMaximum(1.4);
-    effs->SetMarkerSize(2.5);
-    effs->Draw("hist text");
-
-
-    i++;
-    trig++;
-  }
-  c->cd();
-
-  c->SaveAs("triggers.png");
-}
-
-#endif