Rivet analyses

Measurement of differential cross sections in the kinematic angular variable ϕ* 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σ/dϕ* and double-differential cross sections dσ2/dϕ*d|y| for inclusive Z boson production are presented using the dielectron and dimuon final states at the born level. The kinematic observable ϕ* 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/σ) dσ/dϕ*, within the fiducial kinematic region, is measured with a precision of better than 0.5% for ϕ* < 1. The measurements are compared to theoretical predictions and they agree, typically, within few percent.

Source code:CMS_2017_I1631985.cc

// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/FastJets.hh"
#include "Rivet/Projections/LeptonFinder.hh"
#include "Rivet/Projections/DileptonFinder.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);

}