Rivet analyses

Dijet photoproduction analysis

Experiment: ZEUS (HERA Run I)

Inspire ID: 568665

Status: VALIDATED

Authors: - Andy Buckley - Ilkka Helenius - Jon Butterworth

References: - Eur.Phys.J.C23:615,2002 - DESY 01/220 - hep-ex/0112029

Beams: p+ e+

Beam energies: (820.0, 27.5)GeV

Run details: - 820 GeV protons colliding with 27.5 GeV positrons; Direct and resolved photoproduction of dijets; Leading jet pT > 14 GeV, second jet pT > 11 GeV; Jet pseudorapidity −1 < |η| < 2.4

ZEUS photoproduction of jets from proton–positron collisions at beam energies of 820~GeV on 27.5~GeV. Photoproduction can either be direct, in which case the photon interacts directly with the parton, or resolved, in which case the photon acts as a source of quarks and gluons. A photon-proton centre of mass energy of between 134~GeV and 227~GeV is probed, with values of xP, the fractional momentum of the partons inside the proton, predominantly in the region between 0.01 and 0.1. The fractional momentum of the partons from the photon, xγ, is in the region 0.1 to 1. Jets are reconstructed in the range −1 < |η| < 2.4 using the k algorithm with an R parameter of 1.0. The minimum p of the leading jet should be greater than 14~GeV, and at least one other jet must have p > 11$~GeV.

Source code:ZEUS_2001_I568665.cc

// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/Beam.hh"
#include "Rivet/Projections/DISKinematics.hh"
#include "Rivet/Projections/FastJets.hh"

namespace Rivet {


  /// @brief ZEUS dijet photoproduction study used in the ZEUS jets PDF fit
  ///
  /// This class is a reproduction of the HZTool routine for the ZEUS
  /// dijet photoproduction paper which was used in the ZEUS jets PDF fit.
  ///
  /// @note Cleaning cuts on event pT/sqrt(Et) and y_e are not needed in MC analysis.
  ///
  /// @author Andy Buckley
  /// @author Ilkka Helenius
  class ZEUS_2001_I568665 : public Analysis {
  public:

    /// Constructor
    RIVET_DEFAULT_ANALYSIS_CTOR(ZEUS_2001_I568665);


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

    // Book projections and histograms
    void init() {

      // Projections
      /// @todo Acceptance
      // checking recombination scheme and radius checked with original code from M.Wing
      FinalState fs;
      declare(FastJets(fs, fastjet::JetAlgorithm::kt_algorithm, fastjet::RecombinationScheme::Et_scheme, 1.0), "Jets");
      declare(DISKinematics(), "Kinematics");

      // Table 1
      book(_h_costh[0] ,1, 1, 1);
      book(_h_costh[1] ,1, 1, 2);
      // Table 2
      book(_h_etjet1[1][0] ,2, 1, 1);
      book(_h_etjet1[1][1] ,3, 1, 1);
      book(_h_etjet1[1][2] ,4, 1, 1);
      book(_h_etjet1[1][3] ,5, 1, 1);
      book(_h_etjet1[1][4] ,6, 1, 1);
      book(_h_etjet1[1][5] ,7, 1, 1);
      // Table 3
      book(_h_etjet1[0][0] ,8, 1, 1);
      book(_h_etjet1[0][1] ,9, 1, 1);
      book(_h_etjet1[0][2] ,10, 1, 1);
      book(_h_etjet1[0][3] ,11, 1, 1);
      book(_h_etjet1[0][4] ,12, 1, 1);
      book(_h_etjet1[0][5] ,13, 1, 1);
      // Table 4
      book(_h_etajet2[1][0] ,14, 1, 1);
      book(_h_etajet2[1][1] ,15, 1, 1);
      book(_h_etajet2[1][2] ,16, 1, 1);
      // Table 5
      book(_h_etajet2[0][0] ,17, 1, 1);
      book(_h_etajet2[0][1] ,18, 1, 1);
      book(_h_etajet2[0][2] ,19, 1, 1);
      // Table 6
      book(_h_xobsy[0] ,20, 1, 1);
      book(_h_xobsy[1] ,21, 1, 1);
      book(_h_xobsy[2] ,22, 1, 1);
      book(_h_xobsy[3] ,23, 1, 1);
    }


    // Do the analysis
    void analyze(const Event& event) {

      // Determine kinematics, including event orientation since ZEUS coord system is for +z = proton direction
      const DISKinematics& kin = apply<DISKinematics>(event, "Kinematics");
      if ( kin.failed() ) vetoEvent;
      const int orientation = kin.orientation();

      // Q2 and inelasticity cuts
      if (kin.Q2() > 1*GeV2) vetoEvent;
      if (!inRange(kin.y(), 0.2, 0.85)) vetoEvent;

      // Jet selection
      const Jets jets = apply<FastJets>(event, "Jets") \
        .jets(Cuts::Et > 11*GeV && Cuts::etaIn(-1*orientation, 2.4*orientation), cmpMomByEt);
      MSG_DEBUG("Jet multiplicity = " << jets.size());
      if (jets.size() < 2) vetoEvent;
      const Jet& j1 = jets[0];
      const Jet& j2 = jets[1];
      if (j1.Et() < 14*GeV) vetoEvent;

      // Jet eta and cos(theta*) computation
      const double eta1 = orientation*j1.eta(), eta2 = orientation*j2.eta();
      const double etabar = (eta1 + eta2)/2;
      const double etadiff = eta1 - eta2;
      const double costhetastar = tanh(etadiff/2);

      // Computation of x_y^obs
      /// @note Assuming Ee is the lab frame positron momentum, not in proton rest frame cf. the ambiguous phrase in the paper
      const double xyobs = (j1.Et() * exp(-eta1) + j2.Et() * exp(-eta2)) / (2*kin.y()*kin.beamLepton().E());
      const size_t i_xyobs = (xyobs < 0.75) ? 0 : 1;

      // Calculate the invariant mass of the dijet as in the paper
      const double mjj = sqrt( 2.*j1.Et()*j2.Et()*( cosh(j1.eta() - j2.eta()) - cos(j1.phi() - j2.phi()) ) );

      // Fill histograms
      // T1
      if (mjj > 42*GeV && inRange(etabar, 0.1, 1.3))
        _h_costh[i_xyobs]->fill(abs(costhetastar));
      // T2, T3: Symmetrize eta selection, each event contribute twice to the cross section
      for (size_t isel = 0; isel < 2; ++isel) {
        double etaJet1 = (isel == 0) ? orientation*j1.eta() : orientation*j2.eta();
        double etaJet2 = (isel == 0) ? orientation*j2.eta() : orientation*j1.eta();
        if (inRange(etaJet1, -1, 0) && inRange(etaJet2, -1, 0))
          _h_etjet1[i_xyobs][0]->fill(j1.Et()/GeV);
        else if (inRange(etaJet1, 0, 1) && inRange(etaJet2, -1, 0))
          _h_etjet1[i_xyobs][1]->fill(j1.Et()/GeV);
        else if (inRange(etaJet1, 0, 1) && inRange(etaJet2, 0, 1))
          _h_etjet1[i_xyobs][2]->fill(j1.Et()/GeV);
        else if (inRange(etaJet1, 1, 2.4) && inRange(etaJet2, -1, 0))
          _h_etjet1[i_xyobs][3]->fill(j1.Et()/GeV);
        else if (inRange(etaJet1, 1, 2.4) && inRange(etaJet2, 0, 1))
          _h_etjet1[i_xyobs][4]->fill(j1.Et()/GeV);
        else if (inRange(etaJet1, 1, 2.4) && inRange(etaJet2, 1, 2.4))
          _h_etjet1[i_xyobs][5]->fill(j1.Et()/GeV);
        // T4, T5
        if (inRange(etaJet1, -1, 0))
          _h_etajet2[i_xyobs][0]->fill(etaJet2);
        else if (inRange(etaJet1, 0, 1))
          _h_etajet2[i_xyobs][1]->fill(etaJet2);
        else if (inRange(etaJet1, 1, 2.4))
          _h_etajet2[i_xyobs][2]->fill(etaJet2);
      }
      // T6
      if (inRange(j1.Et()/GeV, 14, 17))
        _h_xobsy[0]->fill(xyobs);
      else if (inRange(j1.Et()/GeV, 17, 25))
        _h_xobsy[1]->fill(xyobs);
      else if (inRange(j1.Et()/GeV, 25, 35))
        _h_xobsy[2]->fill(xyobs);
      else if (inRange(j1.Et()/GeV, 35, 90))
        _h_xobsy[3]->fill(xyobs);
    }


    // Finalize
    void finalize() {
      const double sf = crossSection()/picobarn/sumOfWeights();
      for (size_t ix = 0; ix < 2; ++ix) {
        scale(_h_costh[ix], sf);
        for (auto& h : _h_etjet1[ix]) scale(h, sf);
        for (auto& h : _h_etajet2[ix]) scale(h, sf);
      }
      for (auto& h : _h_xobsy) scale(h, sf);
    }

    /// @}


  private:

    /// @name Histograms
    /// @{
    Histo1DPtr _h_costh[2], _h_etjet1[2][6], _h_etajet2[2][3], _h_xobsy[4];
    /// @}

  };


  RIVET_DECLARE_ALIASED_PLUGIN(ZEUS_2001_I568665, ZEUS_2001_S4815815);

}

Aliases: - ZEUS_2001_S4815815