Rivet analyses
title: ZEUS_2004_I649041
Dijet dependence on photon virtuality in ep
Experiment: ZEUS (HERA)
Inspire ID: 649041
Status: VALIDATED
Authors: - Zain Mahmood
References: - arXiv: 0404033 - Eur.Phys.J.C 35 (2004) 487-500
Beams: p+ e-, p+ e+, e+ p+, e- p+
Beam energies: (820.0, 27.5); (820.0, 27.5); (27.5, 820.0); (27.5, 820.0)GeV
Run details: - 27.5 GeV positrons colliding with 820 GeV protons
The dependence of dijet production on the virtuality of the exchanged photon, $Q^2$, has been studied by measuring dijet cross sections in the range $0 \lesssim Q2 < 2000$ GeV$^2$ with the ZEUS detector at HERA using an integrated luminosity of 38.6 pb$^{-1}$. Dijet cross sections were measured for jets with transverse energy $E^\text{jet}\text{T} > 7.5$ and 6.5 GeV and pseudorapidities in the photon-proton centre-of-mass frame in the range $-3 < \eta^\text{jet} < 0$. The variable $x^\text{obs}\gamma$, a measure of the photon momentum entering the hard process, was used to enhance the sensitivity of the measurement to the photon structure. The $Q^2$ dependence of the ratio of low- to high-$x^\text{obs}\gamma$ events was measured. Next-to-leading-order QCD predictions were found to generally underestimate the low-$x^\mathrm{obs}\gamma$ contribution relative to that at high $x^\mathrm{obs}_\gamma$. Monte Carlo models based on leading-logarithmic parton-showers, using a partonic structure for the photon which falls smoothly with increasing $Q^2$, provide a qualitative description of the data.
Source code:ZEUS_2004_I649041.cc
```c++ // -- C++ --
include "Rivet/Analysis.hh"
include "Rivet/Projections/Beam.hh"
include "Rivet/Projections/DISFinalState.hh"
include "Rivet/Projections/DISKinematics.hh"
include "Rivet/Projections/FastJets.hh"
include "Rivet/Projections/FinalState.hh"
namespace Rivet {
/// @brief Dijet dependence on photon virtuality in ep class ZEUS_2004_I649041 : public Analysis { public:
/// Constructor
RIVET_DEFAULT_ANALYSIS_CTOR(ZEUS_2004_I649041);
// Book projections and histograms
void init() {
// Declare your final-state and jet projections
declare(FastJets(DISFinalState(DISFrame::HCM), fastjet::JetAlgorithm::kt_algorithm,
fastjet::RecombinationScheme::Et_scheme, 1.0),
"DISFSJets");
declare(DISKinematics(), "Kinematics");
// Book single-differential histograms
book(_h_Q2[0], 1, 1, 1);
book(_h_Q2[1], 2, 1, 1);
book(_h_Q2[2], 2, 1, 2);
// Book double-differential vs. Q² and jet Et
book(_h_Q2Et[0], 3, 1, 1);
book(_h_Q2Et[1], 4, 1, 1);
book(_h_Q2Et[2], 5, 1, 1);
book(_h_Q2Et[3], 6, 1, 1);
book(_h_Q2Et[4], 7, 1, 1);
book(_h_Q2Et[5], 8, 1, 1);
book(_h_Q2Et[6], 9, 1, 1);
// Book double-differential vs. Q² and forward-jet eta
book(_h_Q2etaf[0], 10, 1, 1);
book(_h_Q2etaf[1], 11, 1, 1);
book(_h_Q2etaf[2], 12, 1, 1);
book(_h_Q2etaf[3], 13, 1, 1);
book(_h_Q2etaf[4], 14, 1, 1);
book(_h_Q2etaf[5], 15, 1, 1);
book(_h_Q2etaf[6], 16, 1, 1);
}
// Do the analysis for each event
void analyze(const Event& event) {
// Get the DIS kinematics
const DISKinematics& kin = apply<DISKinematics>(event, "Kinematics");
if (kin.failed()) vetoEvent;
const int orientation = kin.orientation();
// Define kinematic variables
double Q2 = kin.Q2();
double y = kin.y();
// Set pseudorapidity cuts in the HCM frame based on orientation:
// If proton is along +z (orientation=+1) we use [-3,0]; if not, flip to [0,3].
double etamin = -3.0;
double etamax = 0.0;
if (orientation < 0) {
etamin = 0.0;
etamax = 3.0;
}
// Basic Q² and inelasticity cuts
if (!inRange(Q2, 0.0, 2000.0)) vetoEvent;
if (!inRange(y, 0.2, 0.55)) vetoEvent;
// Jet selection: use jets clustered in the HCM frame with the adjusted eta range
const Jets jets = apply<FastJets>(event, "DISFSJets")
.jets(Cuts::Et > 6.5 * GeV && Cuts::etaIn(etamin, etamax), cmpMomByEt);
MSG_DEBUG("Jet multiplicity = " << jets.size());
if (jets.size() < 2) vetoEvent;
const Jet& j1 = jets[0];
const Jet& j2 = jets[1];
// Cut on leading jet
if (j1.Et() < 7.5 * GeV) vetoEvent;
// Correct the jet pseudorapidities so they always represent the proton direction.
const double eta1 = orientation * j1.eta();
const double eta2 = orientation * j2.eta();
// Calculate xobs according to the paper
const double xobs = (j1.Et() * exp(-eta1) + j2.Et() * exp(-eta2))
/ (2 * kin.y() * kin.beamLepton().E());
// Fill single-differential histograms
_h_Q2[0]->fill(Q2);
if (xobs < 0.75) _h_Q2[1]->fill(Q2);
if (xobs > 0.75) _h_Q2[2]->fill(Q2);
// Fill double-differential histograms: Q² vs. jet E_T.
if (inRange(Q2, 0.0, 1.0)) _h_Q2Et[0]->fill(j1.Et());
if (inRange(Q2, 0.1, 0.55)) _h_Q2Et[1]->fill(j1.Et());
if (inRange(Q2, 1.0, 4.5)) _h_Q2Et[2]->fill(j1.Et());
if (inRange(Q2, 4.5, 10.5)) _h_Q2Et[3]->fill(j1.Et());
if (inRange(Q2, 10.5, 49.0)) _h_Q2Et[4]->fill(j1.Et());
if (inRange(Q2, 49.0, 120.0)) _h_Q2Et[5]->fill(j1.Et());
if (inRange(Q2, 120.0, 2000.0)) _h_Q2Et[6]->fill(j1.Et());
// For the forward-jet η histograms: select the jet with the larger corrected pseudorapidity
const Jet& fjet = (orientation * j1.eta() > orientation * j2.eta() ? j1 : j2);
double fjetEta = orientation * fjet.eta();
// Fill double-differential histograms: Q² vs. forward jet η.
if (inRange(Q2, 0.0, 1.0)) _h_Q2etaf[0]->fill(fjetEta);
if (inRange(Q2, 0.1, 0.55)) _h_Q2etaf[1]->fill(fjetEta);
if (inRange(Q2, 1.0, 4.5)) _h_Q2etaf[2]->fill(fjetEta);
if (inRange(Q2, 4.5, 10.5)) _h_Q2etaf[3]->fill(fjetEta);
if (inRange(Q2, 10.5, 49.0)) _h_Q2etaf[4]->fill(fjetEta);
if (inRange(Q2, 49.0, 120.0)) _h_Q2etaf[5]->fill(fjetEta);
if (inRange(Q2, 120.0, 2000.0)) _h_Q2etaf[6]->fill(fjetEta);
}
// Finalize: scale histograms by cross section, etc.
void finalize() {
const double sf = crossSection() / picobarn / sumOfWeights();
scale(_h_Q2, sf);
scale(_h_Q2Et, sf);
scale(_h_Q2etaf, sf);
double q2BinWidths[7] = {1, .45, 3, 6, 38.5, 71, 1880};
for (unsigned int ix = 0; ix < 7; ++ix) {
scale(_h_Q2Et[ix], 1. / q2BinWidths[ix]);
scale(_h_Q2etaf[ix], 1. / q2BinWidths[ix]);
}
}
private:
/// name histograms
Histo1DPtr _h_Q2[3];
Histo1DPtr _h_Q2Et[7];
Histo1DPtr _h_Q2etaf[7];
};
RIVET_DECLARE_PLUGIN(ZEUS_2004_I649041);
} ```