Rivet analyses


title: CMS_2023_I2709669

WWgamma production in emu final state at 13 TeV

Experiment: CMS (LHC)

Inspire ID: 2709669

Status: VALIDATED

Authors: - Zhe Guan

References: - Expt page: CMS-SMP-22-006 - arXiv: 2310.05164 - Phys. Rev. Lett. 132 (2024) 121901

Beams: p+ p+

Beam energies: (6500.0, 6500.0)GeV

Run details: - Production of WWgamma in emu channel.

The observation of $WW\gamma$ production in proton-proton collisions at a center-of-mass energy of 13 TeV with an integrated luminosity of 138 fb$^{-1}$ is presented. The observed (expected) significance is 5.6 (5.1) standard deviations. Events are selected by requiring exactly two leptons (one electron and one muon) of opposite charge, moderate missing transverse momentum, and a photon. The measured fiducial cross section for $WW\gamma$ is 5.9 $\pm$ 0.8 (stat) $\pm$ 0.8 (syst) $\pm$ 0.7 (modeling) fb, in agreement with the next-to-leading order quantum chromodynamics prediction. The analysis is extended with a search for the associated production of the Higgs boson and a photon, which is generated by a coupling of the Higgs boson to light quarks. The result is used to constrain the Higgs boson couplings to light quarks.

Source code:CMS_2023_I2709669.cc

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

include "Rivet/Analysis.hh"

include "Rivet/Projections/FinalState.hh"

include "Rivet/Projections/LeptonFinder.hh"

include "Rivet/Projections/MissingMomentum.hh"

include "Rivet/Projections/PromptFinalState.hh"

namespace Rivet {

/// @brief WWgamma production in emu final state at 13 TeV class CMS_2023_I2709669 : public Analysis { public:

/// Constructor
RIVET_DEFAULT_ANALYSIS_CTOR(CMS_2023_I2709669);

/// @name Analysis methods
/// @{
void init() {
  // Initialise and register projections

  // The basic final-state projection:
  // all final-state particles within
  // the given eta acceptance

  const FinalState fs(Cuts::abseta < 4.9);

  // FinalState of prompt photons and bare muons and electrons in the event
  PromptFinalState photons(Cuts::abspid == PID::PHOTON);
  PromptFinalState bare_electrons(Cuts::abspid == PID::ELECTRON, TauDecaysAs::PROMPT);
  PromptFinalState bare_muons(Cuts::abspid == PID::MUON, TauDecaysAs::PROMPT);
  // Dress the prompt bare leptons with prompt photons within dR < 0.1,
  // and apply some fiducial cuts on the dressed leptons

  Cut muon_cuts = Cuts::abseta < 2.4 && Cuts::pT > 20 * GeV;
  Cut electron_cuts = Cuts::abseta < 2.5 && Cuts::pT > 25 * GeV;
  LeptonFinder dressed_electrons(bare_electrons, photons, 0.1, electron_cuts);
  LeptonFinder dressed_muons(bare_muons, photons, 0.1, muon_cuts);
  declare(dressed_electrons, "electrons");
  declare(dressed_muons, "muons");
  declare(photons, "photons");

  // Missing momentum
  declare(MissingMomentum(fs), "MET");

  // Book histograms
  book(_h_xsec_exp, 1, 1, 1);
}

/// Perform the per-event analysis
void analyze(const Event& event) {
  // Retrieve dressed leptons, sorted by pT
  Particles muons = apply<LeptonFinder>(event, "muons").particlesByPt();
  Particles electrons = apply<LeptonFinder>(event, "electrons").particlesByPt();

  Particles photons = apply<PromptFinalState>(event, "photons")
                          .particles(Cuts::abseta < 2.5 && Cuts::pT > 20 * GeV);
  idiscardIfAnyDeltaRLess(photons, muons, 0.5);
  idiscardIfAnyDeltaRLess(photons, electrons, 0.5);
  idiscardIfAnyDeltaRLess(electrons, muons, 0.5);

  // Retrieve Etmiss variable
  const double Etmiss = apply<MissingMomentum>(event, "MET").missingEt();

  if ((muons.size() < 1) || (electrons.size() < 1)) vetoEvent;
  if (photons.size() != 1) vetoEvent;
  Particle muon = muons.at(0);
  Particle electron = electrons.at(0);
  if (muon.pid() * electron.pid() > 0) vetoEvent;
  Particle photon = photons.at(0);
  FourMomentum LL = muon.momentum() + electron.momentum();
  if (LL.mass() < 10 * GeV) vetoEvent;
  if (LL.pt() < 15 * GeV) vetoEvent;

  FourMomentum EtMiss = apply<MissingMomentum>(event, "MET").missingMomentum();
  const double dphi = deltaPhi(LL, EtMiss);
  const double mT = sqrt(2 * LL.pT() * EtMiss.pT() * (1 - cos(dphi)));

  if (mT < 10 * GeV) vetoEvent;
  if (Etmiss < 20 * GeV) vetoEvent;
  _h_xsec_exp->fill("Results"s);
}

/// Normalise histograms etc., after the run
void finalize() {
  const double norm = crossSection() / femtobarn / sumOfWeights();

  scale(_h_xsec_exp, norm);
}

BinnedHistoPtr<string> _h_xsec_exp;

};

RIVET_DECLARE_PLUGIN(CMS_2023_I2709669);

} // namespace Rivet ```