Rivet analyses


title: ATLAS_2016_I1475477

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 \to p \gamma \gamma p \to pWWp using EPA formalism.

Searches for exclusively produced W boson pairs in the process $pp(\gamma\gamma)\to p W^+ W^- p$ and exclusively produced Higgs boson in the process $pp(\gamma\gamma) \to pHp$ have been performed using $e^\pm\mu^\mp$ 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$\sigma$ 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++ // -- C++ --

include "Rivet/Analysis.hh"

include "Rivet/Projections/ChargedFinalState.hh"

include "Rivet/Projections/FinalState.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);

} ```