Rivet analyses

ZEUS inclusive jet cross sections in DIS

Experiment: ZEUS (HERA)

Inspire ID: 2694205

Status: VALIDATED

Authors: - Christian Gutschow

References: - Eur.Phys.J.C 83 (2023) 11, 1082 - arXiv: 2309.02889

Beams: p+ e+, e+ p+, p+ e-, e- p+

Beam energies: (920.0, 27.5); (27.5, 920.0); (920.0, 27.5); (27.5, 920.0)GeV

Run details: - NC DIS events

A new measurement of inclusive-jet cross sections in the Breit frame in neutral current deep inelastic scattering using the ZEUS detector at the HERA collider is presented. The data were taken in the years 2004 to 2007 at a centre-of-mass energy of 318GeV and correspond to an integrated luminosity of 347pb−1. Massless jets, reconstructed using the kt-algorithm in the Breit reference frame, have been measured as a function of the squared momentum transfer, Q2, and the transverse momentum of the jets in the Breit frame, p⟂,Breit. The measured jet cross sections are compared to previous measurements and to perturbative QCD predictions. The measurement has been used in a next-to-next-to-leading-order QCD analysis to perform a simultaneous determination of parton distribution functions of the proton and the strong coupling, resulting in a value of αs(MZ2) = 0.1142 ± 0.0017 (experimental/fit) +0.0006 − 0.0007 (model/parameterisation) +0.0006 − 0.0004 (scale), whose accuracy is improved compared to similar measurements. In addition, the running of the strong coupling is demonstrated using data obtained at different scales.

Source code:ZEUS_2023_I2694205.cc

// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/FastJets.hh"
#include "Rivet/Projections/DISFinalState.hh"
#include "Rivet/Tools/HistoGroup.hh"

namespace Rivet {


  /// @brief ZEUS inclusive jet cross sections in DIS
  class ZEUS_2023_I2694205 : public Analysis {
  public:

    /// Constructor
    RIVET_DEFAULT_ANALYSIS_CTOR(ZEUS_2023_I2694205);


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

    /// Book histograms and initialise projections before the run
    void init() {

      declare(FinalState(), "full_fs");

      // The final-state particles are clustered in Breit frame
      // using FastJet with the kT algorithm and a jet-radius parameter of 1.
      const DISFinalState DISfs(DISFrame::BREIT);
      declare(DISfs, "fs");

      FastJets jets(DISfs, JetAlg::KT, 1.0);
      declare(jets, "jets");

      // Book histograms.
      // Transverse jet energies separated into pseudorapidity ranges.
      book(_h, {150., 200., 270., 400., 700., 5000., 15000.});
      book(_h_corr, {150., 200., 270., 400., 700., 5000., 15000.});
      for (auto& b : _h->bins()) {
        book(b, 7, 1, 9 + b.index());
      }
      for (auto& b : _h_corr->bins()) {
        book(b, 1, 1, 9 + b.index());
      }
    }

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

      // Lorentz invariant DIS quantities
      const DISKinematics& dis = apply<DISFinalState>(event, "fs").kinematics();
      if (dis.failed())  vetoEvent;
      const double Q2 = dis.Q2();
      const double y  = dis.y();

      // Kinematic cuts on virtuality and inelasticity.
      if ( !inRange(Q2, 150.*GeV2, 15000.*GeV2) )  vetoEvent;
      if ( !inRange(y, 0.2, 0.7) )                 vetoEvent;

      // Lorentz boosts for Breit and lab frames.
      const LorentzTransform breitboost = dis.boostBreit();
      const LorentzTransform labboost = breitboost.inverse();

      // Retrieve clustered jets in Breit frame, sorted by pT.
      Jets alljets = apply<FastJets>(event, "jets").jetsByPt(Cuts::pT > 5*GeV);

      // Cut on Pseurdorapidity in lab frame.
      // 1 if hadron in "conventional" +z direction, -1 if in -z.
      Jets jets;
      const int orientation = dis.orientation();
      for (auto& jet : alljets) {
        jet.transformBy(labboost); // boost to lab frame
        if ( inRange(jet.eta()*orientation, -1., 2.5) ) {
          jet.transformBy(breitboost);
          jets += jet;
        }
      }

      // Calculate value of \sum_particles E - p_z to apply veto in ISR
      // in uncorrected case
      const FinalState& fs = apply<FinalState>(event, "full_fs");
      double E = 0., pz = 0.;
      for ( const auto& p : fs.particles(Cuts::etaIn(orientation * -1.5, orientation * 3))) {
        E += p.E();
        pz += orientation * p.pz();
      }
      const double Empz = E - pz;

      // Fill histograms.
      for (const Jet& jet : jets) {
        if (inRange(Empz/GeV, 38, 65)) {
          _h->fill(Q2/GeV2, jet.pT()/GeV);
        }
        _h_corr->fill(Q2/GeV2, jet.pT()/GeV);
      }
    }

    /// Normalise histograms after the run
    void finalize() {

      scale(_h, crossSection()/picobarn/sumW());
      scale(_h_corr, crossSection()/picobarn/sumW());

    }

    /// @}

  private:

    /// @name Histograms
    /// @{
    Histo1DGroupPtr _h, _h_corr;
    /// @}
  };


  RIVET_DECLARE_PLUGIN(ZEUS_2023_I2694205);

}