rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

ATLAS_2018_I1677498

WWbb at 13 TeV
Experiment: ATLAS (LHC)
Inspire ID: 1677498
Status: VALIDATED
Authors:
  • Christian Herwig
  • Christian Gutschow
References:
  • Phys.Rev.Lett. 121 (2018) no.15, 152002
  • arXiv: 1806.04667
Beams: p+ p+
Beam energies: (6500.0, 6500.0) GeV
Run details:
  • dileptonic WWbb production at 13 TeV

This Letter presents a normalized differential cross-section measurement in a fiducial phase-space region where interference effects between top-quark pair production and associated production of a single top quark with a $W$ boson and a $b$-quark are significant. Events with exactly two leptons ($ee$, $\mu\mu$, or $e\mu$) and two $b$-tagged jets that satisfy a multiparticle invariant mass requirement are selected from 36.1 fb$^{-1}$ of proton-proton collision data taken at $\sqrt{s}=13$ TeV with the ATLAS detector at the LHC in 2015 and 2016. The results are compared with predictions from simulations using various strategies for the interference. The standard prescriptions for interference modeling are significantly different from each other but are within $2\sigma$ of the data. State-of-the-art predictions that naturally incorporate interference effects provide the best description of the data in the measured region of phase space most sensitive to these effects. These results provide an important constraint on interference models and will guide future model development and tuning.

Source code: ATLAS_2018_I1677498.cc
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/PromptFinalState.hh"
#include "Rivet/Projections/DressedLeptons.hh"
#include "Rivet/Projections/FastJets.hh"

namespace Rivet {


  /// WWbb at 13 TeV
  class ATLAS_2018_I1677498 : public Analysis {
  public:

    /// Constructor
    DEFAULT_RIVET_ANALYSIS_CTOR(ATLAS_2018_I1677498);


    /// Book cuts and projections
    void init() {

      // All final state particles
      FinalState fs(Cuts::abseta < 5.0);

      PromptFinalState photons(Cuts::abspid == PID::PHOTON, true); // true accepts tau decays

      PromptFinalState bare_el(Cuts::abspid == PID::ELECTRON, true); // true accepts tau decays
      DressedLeptons elecs(photons, bare_el, 0.1, Cuts::pT > 7*GeV && Cuts::abseta < 2.47);
      declare(elecs, "elecs");

      PromptFinalState bare_mu(Cuts::abspid == PID::MUON, true); // accepts tau decays
      DressedLeptons muons(photons, bare_mu, 0.1, Cuts::pT > 6*GeV && Cuts::abseta < 2.5);
      declare(muons, "muons");

      FastJets jets(fs, FastJets::ANTIKT, 0.4, JetAlg::NO_MUONS, JetAlg::NO_INVISIBLES);
      declare(jets, "jets");

      _h = bookHisto1D(3, 1, 1);
    }


    void analyze(const Event& event) {

      // Identify bjets (signal), light jets (OR) and soft b-jets (veto)
      size_t soft_bjets = 0;
      Jets bjets, lightjets;
      for (const Jet& jet : apply<FastJets>(event, "jets").jetsByPt(Cuts::pT > 5*GeV)) {
        bool isBjet = jet.bTagged(Cuts::pT > 5*GeV);
        if (isBjet) soft_bjets += 1;
        if (jet.abseta() < 2.5) {
          if ( isBjet && jet.pT() > 25*GeV) bjets += jet;
          if (!isBjet && jet.pT() > 20*GeV) lightjets += jet;
        }
      }
      if (soft_bjets != 2) vetoEvent;
      if (bjets.size() != 2) vetoEvent;

      // Get dressed leptons
      vector<DressedLepton> leptons;
      for (auto& lep : apply<DressedLeptons>(event, "muons").dressedLeptons()) { leptons.push_back(lep); }
      for (auto& lep : apply<DressedLeptons>(event, "elecs").dressedLeptons()) { leptons.push_back(lep); }

      // 1. Find which light jets survive OR
      for (const auto& lep : leptons) {
        ifilter_discard(lightjets, [&](const Jet& jet) {
          return deltaR(jet, lep) < 0.2 && (lep.abspid() == PID::ELECTRON || lep.pT()/jet.pT() > 0.7);
        });
      }

      // 2. Find which leptons survive the OR and apply signal selection
      for (const auto& jet : (lightjets + bjets)) {
        ifilter_discard(leptons, [&](const DressedLepton& lep) {
          return lep.pT() < 28*GeV || deltaR(jet, lep) < min(0.4, 0.04+10*GeV/lep.pT());
        });
      }

      if (leptons.size() != 2) vetoEvent;
      std::sort(leptons.begin(), leptons.end(), cmpMomByPt);

      // Z veto
      const size_t nEl = count(leptons, [](const DressedLepton& lep) { return  lep.abspid() == PID::ELECTRON; });
      const double mll = (leptons[0].mom() + leptons[1].mom()).mass();
      if (nEl != 1 && !(fabs(mll - 91*GeV) > 15*GeV && mll > 10*GeV)) vetoEvent;

      const double m00 = (leptons[0].mom() + bjets[0].mom()).mass();
      const double m10 = (leptons[1].mom() + bjets[0].mom()).mass();
      const double m01 = (leptons[0].mom() + bjets[1].mom()).mass();
      const double m11 = (leptons[1].mom() + bjets[1].mom()).mass();
      const double minimax = min( max(m00,m11), max(m10,m01) );
      _h->fill(minimax/GeV, event.weight());
    }


    /// Finalise
    void finalize() {
      normalize(_h);
    }


  private:

    /// Histogram
    Histo1DPtr _h;

  };


  DECLARE_RIVET_PLUGIN(ATLAS_2018_I1677498);

}