Rivet analyses


title: CMS_2017_I1631985

Measurement of differential cross sections in the kinematic angular variable $\phi$* for inclusive Z boson production in pp collisions at 8 TeV

Experiment: CMS (LHC)

Inspire ID: 1631985

Status: VALIDATED

Authors: - cms-pag-conveners-smp@cern.ch - Kyeongpil Lee

References: - arXiv: 1710.07955 - JHEP 03 (2018) 172 - Expt page: CMS-SMP-17-002

Beams: p+ p+

Beam energies: (4000.0, 4000.0)GeV

Run details: - pp to Z interactions at $\sqrt{s} = 8$ TeV. Attention! Unfolded to the born lepton level, requires simulation without QED FSR if used for high-precision studies. Data collected by CMS during the year 2012.

Measurements of differential cross sections d$\sigma$/d$\phi^$ and double-differential cross sections d$\sigma^{2}$/d$\phi^$d|y| for inclusive Z boson production are presented using the dielectron and dimuon final states at the born level. The kinematic observable $\phi$ correlates with the dilepton transverse momentum but has better resolution, and y is the dilepton rapidity. The analysis is based on data collected with the CMS experiment at a centre-of-mass energy of 8 TeV corresponding to an integrated luminosity of 19.7 fb$^{-1}$. The normalised cross section (1/$\sigma$) d$\sigma$/d$\phi^$, within the fiducial kinematic region, is measured with a precision of better than 0.5% for $\phi$* < 1. The measurements are compared to theoretical predictions and they agree, typically, within few percent.

Source code:CMS_2017_I1631985.cc

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

include "Rivet/Analysis.hh"

include "Rivet/Projections/DileptonFinder.hh"

include "Rivet/Projections/FastJets.hh"

include "Rivet/Projections/FinalState.hh"

include "Rivet/Projections/LeptonFinder.hh"

namespace Rivet {

/// @brief Differential Z cross section measurement in phi* at 8 TeV class CMS_2017_I1631985 : public Analysis { public:

/// Constructor
RIVET_DEFAULT_ANALYSIS_CTOR(CMS_2017_I1631985);


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

/// Book histograms and initialise projections before the run
void init() {
  // default to combined ee+mumu
  _mode = 2;
  if (getOption("LMODE") == "EL") _mode = 0;
  if (getOption("LMODE") == "MU") _mode = 1;
  if (getOption("LMODE") == "EMU") _mode = 2;

  _twodim = false;
  if (getOption("TWODIM") == "YES") _twodim = true;

  // The experimental result is unfolded to the 'born' level (pre-FSR), which is discouraged
  // The implementation in Rivet here is using dressed leptons (or disable generator QED FSR)
  Cut cut = Cuts::abseta < 2.4 && Cuts::pT > 20 * GeV;
  DileptonFinder zeeFind(91.2 * GeV, 0.1, cut && Cuts::abspid == PID::ELECTRON,
                         Cuts::massIn(60 * GeV, 120 * GeV));
  declare(zeeFind, "ZeeFind");
  DileptonFinder zmmFind(91.2 * GeV, 0.1, cut && Cuts::abspid == PID::MUON,
                         Cuts::massIn(60 * GeV, 120 * GeV));
  declare(zmmFind, "ZmmFind");

  // Book histograms
  // take binning from reference data using HEPData ID (digits in "d01-x01-y01" etc.)
  book(_h_Zll_phiStar, 1, 1, 1);
  book(_h_Zll_phiStar_norm, 2, 1, 1);
  if (_twodim) {
    book(_h2D_Zll_phiStar_y, 3, 1, 1);
    book(_h2D_Zll_phiStar_y_norm, 4, 1, 1);
  }

  vector<double> edges = {0.0, 0.4, 0.8, 1.2, 1.6, 2.0, 2.4};
  book(_b_Zll_phiStar, edges);
  book(_b_Zll_phiStar_norm, edges);
  for (size_t i = 0; i < _b_Zll_phiStar->numBins(); ++i) {
    book(_b_Zll_phiStar->bin(i + 1), 9, 1, i + 1);
    book(_b_Zll_phiStar_norm->bin(i + 1), 10, 1, i + 1);
  }
}


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

  const DileptonFinder& zeeFS = apply<DileptonFinder>(event, "ZeeFind");
  const DileptonFinder& zmumuFS = apply<DileptonFinder>(event, "ZmmFind");

  const Particles& zees = zeeFS.bosons();
  const Particles& zmumus = zmumuFS.bosons();

  if (zees.size() + zmumus.size() != 1) {
    MSG_DEBUG("Did not find exactly one good Z candidate");
    vetoEvent;
  }
  if (zees.size() == 1 && _mode == 1) vetoEvent;
  if (zmumus.size() == 1 && _mode == 0) vetoEvent;


  bool ee_event = false;
  if (zees.size() == 1) ee_event = true;

  const Particles& theLeptons = ee_event ? zeeFS.constituents() : zmumuFS.constituents();
  const Particle& leadingLepton = theLeptons[0].pt() > theLeptons[1].pt() ? theLeptons[0] : theLeptons[1];

  // asymmetric cut
  if (leadingLepton.pt() < 30.0) vetoEvent;
  if (leadingLepton.abseta() > 2.1) vetoEvent;

  // calculate phi*
  const Particle& lminus = theLeptons[0].charge() < 0 ? theLeptons[0] : theLeptons[1];
  const Particle& lplus = theLeptons[0].charge() < 0 ? theLeptons[1] : theLeptons[0];
  const double thetaStar = acos(tanh(0.5 * (lminus.eta() - lplus.eta())));
  const double dPhi = M_PI - deltaPhi(lminus, lplus);
  const double phiStar = tan(0.5 * dPhi) * sin(thetaStar);

  const Particle& zcand = ee_event ? zees[0] : zmumus[0];

  _h_Zll_phiStar->fill(phiStar);
  _h_Zll_phiStar_norm->fill(phiStar);

  double absRap = zcand.absrap();
  if (_twodim) {
    _h2D_Zll_phiStar_y->fill(phiStar, absRap);
    _h2D_Zll_phiStar_y_norm->fill(phiStar, absRap);
  }

  _b_Zll_phiStar->fill(absRap, phiStar);
  _b_Zll_phiStar_norm->fill(absRap, phiStar);
}

/// Normalise histograms etc., after the run
void finalize() {
  double norm = (sumOfWeights() != 0) ? crossSection() / picobarn / sumOfWeights() : 1.0;

  // when running for both ee and mm channel, need to average to get lepton xsec
  if (_mode == 2) norm /= 2.;

  scale(_h_Zll_phiStar, norm);
  scale(_b_Zll_phiStar, norm);
  divByGroupWidth(_b_Zll_phiStar);
  normalize(_h_Zll_phiStar_norm);

  if (_twodim) {
    scale(_h2D_Zll_phiStar_y, norm);
    normalize(_h2D_Zll_phiStar_y_norm);
  }

  // normalized using the sum of 2D
  normalizeGroup(_b_Zll_phiStar_norm);
  divByGroupWidth(_b_Zll_phiStar_norm);
}

/// @}

Histo1DPtr _h_Zll_phiStar, _h_Zll_phiStar_norm;
Histo1DGroupPtr _b_Zll_phiStar, _b_Zll_phiStar_norm;
Histo2DPtr _h2D_Zll_phiStar_y, _h2D_Zll_phiStar_y_norm;

size_t _mode;
bool _twodim;

};

RIVET_DECLARE_PLUGIN(CMS_2017_I1631985);

} ```