Rivet analyses


title: ATLAS_2017_I1626105

Dileptonic $t\bar{t}$ at 8 TeV

Experiment: ATLAS (LHC)

Inspire ID: 1626105

Status: VALIDATED

Authors: - Judith Katzy - Christian Gutschow

References: - Expt page: ATLAS-TOPQ-2015-02 - Eur.Phys.J. C77 (2017) no.11, 804 - DOI: 10.1140/epjc/s10052-017-5349-9 - arXiv: 1709.09407

Beams: p+ p+

Beam energies: (4000.0, 4000.0)GeV

Run details: - dileptonic top-quark pair production

This paper presents single lepton and dilepton kinematic distributions measured in dileptonic $t\bar{t}$ events produced in 20.2 fb${}^{-1}$ of $\sqrt{s} = 8$ TeV $pp$ collisions recorded by the ATLAS experiment at the LHC. Both absolute and normalised differential cross-sections are measured, using events with an opposite-charge $e\mu$ pair and one or two $b$-tagged jets. The cross-sections are measured in a fiducial region corresponding to the detector acceptance for leptons, and are compared to the predictions from a variety of Monte Carlo event generators, as well as fixed-order QCD calculations, exploring the sensitivity of the cross-sections to the gluon parton distribution function. Some of the distributions are also sensitive to the top quark pole mass, a combined fit of NLO fixed-order predictions to all the measured distributions yields a top quark mass value of $m_t^\text{pole} = 173.2 \pm 0.9 \pm 0.8 \pm 1.2$ GeV, where the three uncertainties arise from data statistics, experimental systematics, and theoretical sources.

Source code:ATLAS_2017_I1626105.cc

```c++ // -- C++ --

include "Rivet/Analysis.hh"

include "Rivet/Projections/FastJets.hh"

include "Rivet/Projections/IdentifiedFinalState.hh"

include "Rivet/Projections/LeptonFinder.hh"

include "Rivet/Projections/PromptFinalState.hh"

include "Rivet/Projections/VetoedFinalState.hh"

namespace Rivet {

/// @brief Lepton differential ttbar analysis at 8 TeV class ATLAS_2017_I1626105 : public Analysis { public:

RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2017_I1626105);

void init() {

  Cut eta_full = Cuts::abseta < 5.0 && Cuts::pT > 1.0 * MeV;

  // All final state particles
  const FinalState fs;

  // Get photons to dress leptons
  IdentifiedFinalState photons(fs, PID::PHOTON);
  PromptFinalState prompt_photons(photons);

  // Projection to find the electrons
  PromptFinalState prompt_el(Cuts::abspid == PID::ELECTRON, TauDecaysAs::PROMPT);
  LeptonFinder elecs(prompt_el, photons, 0.1, Cuts::abseta < 2.5 && Cuts::pT > 25 * GeV);
  LeptonFinder veto_elecs(prompt_el, prompt_photons, 0.1, eta_full);
  declare(elecs, "elecs");

  // Projection to find the muons
  PromptFinalState prompt_mu(Cuts::abspid == PID::MUON, TauDecaysAs::PROMPT);
  LeptonFinder muons(prompt_mu, photons, 0.1, Cuts::abseta < 2.5 && Cuts::pT > 25 * GeV);
  LeptonFinder veto_muons(prompt_mu, prompt_photons, 0.1, eta_full);
  declare(muons, "muons");

  // Jet clustering.
  VetoedFinalState vfs;
  vfs.addVetoOnThisFinalState(veto_elecs);
  vfs.addVetoOnThisFinalState(veto_muons);
  FastJets jets(vfs, JetAlg::ANTIKT, 0.4);
  jets.useInvisibles();
  declare(jets, "jets");

  // Book histograms
  bookHistos("lep_pt", 1);
  bookHistos("lep_eta", 3);
  bookHistos("dilep_pt", 5);
  bookHistos("dilep_mass", 7);
  bookHistos("dilep_rap", 9);
  bookHistos("dilep_dphi", 11);
  bookHistos("dilep_sumpt", 13);
  bookHistos("dilep_sumE", 15);
}


void analyze(const Event& event) {
  DressedLeptons elecs = sortByPt(apply<LeptonFinder>(event, "elecs").dressedLeptons());
  DressedLeptons muons = sortByPt(apply<LeptonFinder>(event, "muons").dressedLeptons());
  Jets jets = apply<FastJets>(event, "jets").jetsByPt(Cuts::pT > 25 * GeV && Cuts::abseta < 2.5);

  // Check overlap of jets/leptons.
  for (const Jet& jet : jets) {
    idiscard(elecs, deltaRLess(jet, 0.4));
    idiscard(muons, deltaRLess(jet, 0.4));
  }
  if (elecs.empty() || muons.empty()) vetoEvent;
  if (elecs[0].charge() == muons[0].charge()) vetoEvent;

  FourMomentum el = elecs[0].momentum();
  FourMomentum mu = muons[0].momentum();
  FourMomentum ll = elecs[0].momentum() + muons[0].momentum();

  // Fill histograms
  fillHistos("lep_pt", el.pT() / GeV);
  fillHistos("lep_pt", mu.pT() / GeV);
  fillHistos("lep_eta", el.abseta());
  fillHistos("lep_eta", mu.abseta());
  fillHistos("dilep_pt", ll.pT() / GeV);
  fillHistos("dilep_mass", ll.mass() / GeV);
  fillHistos("dilep_rap", ll.absrap());
  fillHistos("dilep_dphi", deltaPhi(el, mu));
  fillHistos("dilep_sumpt", (el.pT() + mu.pT()) / GeV);
  fillHistos("dilep_sumE", (el.E() + mu.E()) / GeV);
}


void finalize() {
  // Normalize to cross-section
  const double sf = crossSection() / femtobarn / sumOfWeights();
  for (auto& hist : _h) {
    const double norm = 1.0 / hist.second->integral();
    // add overflow to last bin
    const size_t nBins = hist.second->numBins();
    const double overflow = hist.second->bin(nBins + 1).effNumEntries();
    hist.second->fill(hist.second->bin(nBins).xMid(), overflow);
    // histogram normalisation
    if (hist.first.find("norm") != string::npos)
      scale(hist.second, norm);
    else
      scale(hist.second, sf);
  }
}

private:

/// @name Histogram helper functions
/// @{
void bookHistos(const std::string name, unsigned int index) {
  book(_h[name], index, 1, 1);
  book(_h["norm_" + name], index + 1, 1, 1);
}

void fillHistos(const std::string name, double value) {
  _h[name]->fill(value);
  _h["norm_" + name]->fill(value);
}

map<string, Histo1DPtr> _h;
/// @}

};

RIVET_DECLARE_PLUGIN(ATLAS_2017_I1626105);

} ```