Rivet analyses

Exclusive WW and Higgs production at 8 TeV

Experiment: ATLAS (LHC)

Inspire ID: 1475477

Status: VALIDATED

Authors: - Peter Meinzinger

References: - Phys.Rev.D 94 (2016) 3, 032011 - arxiv:1607.03745

Beams: p+ p+

Beam energies: (4000.0, 4000.0)GeV

Run details: - Run pp p p pWWp using EPA formalism.

Searches for exclusively produced W boson pairs in the process pp(γγ) → pW+Wp and exclusively produced Higgs boson in the process pp(γγ) → pHp have been performed using e±μ final states. These measurements use 20.2 fb−1 of pp collisions collected by the ATLAS experiment at a center-of-mass energy $\sqrt{s} = 8$ TeV at the LHC. Exclusive production of W+W- consistent with the Standard Model prediction is found with 3.0σ significance. Note that the cross-section is extrapolated to the full phase-space using factors provided in the publication. Similarly, contributions from dissociative production modes are taken into account with another factor.

Source code:ATLAS_2016_I1475477.cc

// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/ChargedFinalState.hh"
#include "Rivet/Projections/LeptonFinder.hh"

namespace Rivet {

  /// @brief Exclusive WW and Higgs production at 8 TeV
  class ATLAS_2016_I1475477 : public Analysis {
  public:

    /// Constructor
    RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2016_I1475477);

    /// @name Analysis methods
    /// @{

    /// Book histograms and initialise projections before the run
    void init() {

      // Final state particles
      const FinalState fs(Cuts::abseta < 2.5);

      // Electrons: pT > 10 GeV, |eta| < 2.47, excluding one region
      const LeptonFinder electrons_fs(fs, 0., Cuts::abspid == PID::ELECTRON &&
                                    Cuts::pT > 20*GeV &&
                                    Cuts::abseta < 2.47 &&
                                    (Cuts::abseta < 1.37 || Cuts::abseta > 1.52));

      // Muons: pT > 10 GeV, |eta| < 2.5
      const LeptonFinder muons_fs(fs, 0., Cuts::abspid == PID::MUON &&
                                Cuts::pT > 20*GeV &&
                                Cuts::abseta < 2.5);

      declare(electrons_fs, "Electrons");
      declare(muons_fs, "Muons");

      // Charged final state for exclusivity veto
      declare(ChargedFinalState(Cuts::pT > 400*MeV && Cuts::abseta < 2.5), "ChargedTracks");

      book(_h_xs, 5, 1, 1);
      book(_h["pte"], "pte", 20, 20, 200);
      book(_h["ptmu"], "ptmu", 20, 20, 200);
      book(_h["pt1"], "pt1", 20, 25, 200);
      book(_h["pt2"], "pt2", 20, 20, 200);
      book(_h["eta1"], "eta1", 20, -2.5, 2.5);
      book(_h["eta2"], "eta2", 20, -2.5, 2.5);
      book(_h["pt_emu"], "pt_emu", 20, 30, 200);
      book(_h["m_emu"], "m_emu", 20, 20, 200);
      book(_h["aco"], "aco", 20, 0, 1);
    }

    /// Perform the per-event analysis
    void analyze(const Event& event) {

      // Get leptons
      const DressedLeptons electrons = apply<LeptonFinder>(event, "Electrons").dressedLeptons();
      const DressedLeptons muons = apply<LeptonFinder>(event, "Muons").dressedLeptons();

      // Combine leptons and sort by pT
      vector<DressedLepton> leptons;
      leptons.insert(leptons.end(), electrons.begin(), electrons.end());
      leptons.insert(leptons.end(), muons.begin(), muons.end());
      leptons = sortByPt(leptons);

      // Require exactly two leptons
      if (electrons.size() != 1 || muons.size() != 1) {
        MSG_DEBUG("Vetoing event: Did not find exactly two leptons.");
        vetoEvent;
      }

      // Require different flavor and opposite charge
      if (leptons[0].pid() == leptons[1].pid() ||
          leptons[0].charge() * leptons[1].charge() != -1) {
        MSG_DEBUG("Vetoing event: Leptons are not different-flavor opposite-charge.");
        vetoEvent;
      }

      // Get all charged tracks
      const Particles tracks = apply<ChargedFinalState>(event, "ChargedTracks").particles();

      // Apply exclusivity veto: require zero additional tracks
      if (tracks.size() != 2) {
        MSG_DEBUG("Vetoing event: Found " << (tracks.size()-2) << " additional tracks.");
        vetoEvent;
      }

      const FourMomentum dilep = leptons[0].mom() + leptons[1].mom();
      const double m_emu = dilep.mass();
      const double pT_emu = dilep.pT();

      // Leading and subleading lepton pT cuts for WW
      if (leptons[0].pT() < 25*GeV || leptons[1].pT() < 20*GeV) vetoEvent;

      // Dilepton mass cut
      if (m_emu < 20*GeV) vetoEvent;

      // Dilepton pT cut for WW
      if (pT_emu < 30*GeV) vetoEvent;

      _h_xs->fill();
      _h["pte"]->fill(electrons[0].pT()/GeV);
      _h["ptmu"]->fill(muons[0].pT()/GeV);
      _h["pt1"]->fill(leptons[0].pT()/GeV);
      _h["pt2"]->fill(leptons[1].pT()/GeV);
      _h["eta1"]->fill(leptons[0].eta());
      _h["eta2"]->fill(leptons[1].eta());
      _h["pt_emu"]->fill(pT_emu/GeV);
      _h["m_emu"]->fill(m_emu/GeV);

      const double aco = 1. - deltaPhi(leptons[0],leptons[1])/M_PI;
      _h["aco"]->fill(aco);
    }

    /// Normalise histograms etc., after the run
    void finalize() {
      // Normalize to fiducial cross-sections in femtobarn
      const double norm = crossSection() / femtobarn / sumW();
      scale(_h_xs, norm);
      scale(_h, norm);
    }

    /// @}


    /// @name Histograms
    /// @{
    CounterPtr _h_xs;
    map<string, Histo1DPtr> _h;

    /// @}

  };

  // The hook for the plugin system
  RIVET_DECLARE_PLUGIN(ATLAS_2016_I1475477);

}