rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

CMS_2023_I2709669

WWgamma production in emu final state at 13 TeV
Experiment: CMS (LHC)
Inspire ID: 2709669
Status: VALIDATED
Authors:
  • Zhe Guan
References: 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
 1// -*- C++ -*-
 2#include "Rivet/Analysis.hh"
 3#include "Rivet/Projections/FinalState.hh"
 4#include "Rivet/Projections/LeptonFinder.hh"
 5#include "Rivet/Projections/MissingMomentum.hh"
 6#include "Rivet/Projections/PromptFinalState.hh"
 7
 8namespace Rivet {
 9
10  /// @brief WWgamma production in emu final state at 13 TeV
11  class CMS_2023_I2709669 : public Analysis {
12  public:
13    /// Constructor
14    RIVET_DEFAULT_ANALYSIS_CTOR(CMS_2023_I2709669);
15
16    /// @name Analysis methods
17    /// @{
18    void init() {
19      // Initialise and register projections
20
21      // The basic final-state projection:
22      // all final-state particles within
23      // the given eta acceptance
24
25      const FinalState fs(Cuts::abseta < 4.9);
26
27      // FinalState of prompt photons and bare muons and electrons in the event
28      PromptFinalState photons(Cuts::abspid == PID::PHOTON);
29      PromptFinalState bare_electrons(Cuts::abspid == PID::ELECTRON, TauDecaysAs::PROMPT);
30      PromptFinalState bare_muons(Cuts::abspid == PID::MUON, TauDecaysAs::PROMPT);
31      // Dress the prompt bare leptons with prompt photons within dR < 0.1,
32      // and apply some fiducial cuts on the dressed leptons
33
34      Cut muon_cuts = Cuts::abseta < 2.4 && Cuts::pT > 20 * GeV;
35      Cut electron_cuts = Cuts::abseta < 2.5 && Cuts::pT > 25 * GeV;
36      LeptonFinder dressed_electrons(bare_electrons, photons, 0.1, electron_cuts);
37      LeptonFinder dressed_muons(bare_muons, photons, 0.1, muon_cuts);
38      declare(dressed_electrons, "electrons");
39      declare(dressed_muons, "muons");
40      declare(photons, "photons");
41
42      // Missing momentum
43      declare(MissingMomentum(fs), "MET");
44
45      // Book histograms
46      book(_h_xsec_exp, 1, 1, 1);
47    }
48
49    /// Perform the per-event analysis
50    void analyze(const Event& event) {
51      // Retrieve dressed leptons, sorted by pT
52      Particles muons = apply<LeptonFinder>(event, "muons").particlesByPt();
53      Particles electrons = apply<LeptonFinder>(event, "electrons").particlesByPt();
54
55      Particles photons =
56          apply<PromptFinalState>(event, "photons").particles(Cuts::abseta < 2.5 && Cuts::pT > 20 * GeV);
57      idiscardIfAnyDeltaRLess(photons, muons, 0.5);
58      idiscardIfAnyDeltaRLess(photons, electrons, 0.5);
59      idiscardIfAnyDeltaRLess(electrons, muons, 0.5);
60
61      // Retrieve Etmiss variable
62      const double Etmiss = apply<MissingMomentum>(event, "MET").missingEt();
63
64      if ((muons.size() < 1) || (electrons.size() < 1))  vetoEvent;
65      if (photons.size() != 1)  vetoEvent;
66      Particle muon = muons.at(0);
67      Particle electron = electrons.at(0);
68      if (muon.pid() * electron.pid() > 0)  vetoEvent;
69      Particle photon = photons.at(0);
70      FourMomentum LL = muon.momentum() + electron.momentum();
71      if (LL.mass() < 10 * GeV)  vetoEvent;
72      if (LL.pt() < 15 * GeV)    vetoEvent;
73
74      FourMomentum EtMiss = apply<MissingMomentum>(event, "MET").missingMomentum();
75      const double dphi = deltaPhi(LL, EtMiss);
76      const double mT = sqrt(2 * LL.pT() * EtMiss.pT() * (1 - cos(dphi)));
77
78      if (mT < 10*GeV)      vetoEvent;
79      if (Etmiss < 20*GeV)  vetoEvent;
80      _h_xsec_exp->fill("Results"s);
81    }
82
83    /// Normalise histograms etc., after the run
84    void finalize() {
85      const double norm = crossSection() / femtobarn / sumOfWeights();
86
87      scale(_h_xsec_exp, norm);
88    }
89
90    BinnedHistoPtr<string> _h_xsec_exp;
91  };
92
93  RIVET_DECLARE_PLUGIN(CMS_2023_I2709669);
94
95}  // namespace Rivet