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+W−p 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);
}