Rivet analyses
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, Q2, has been studied by measuring dijet cross sections in the range 0 ≲ Q2 < 2000 GeV2 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 ETjet > 7.5 and 6.5 GeV and pseudorapidities in the photon-proton centre-of-mass frame in the range −3 < ηjet < 0. The variable xγobs, a measure of the photon momentum entering the hard process, was used to enhance the sensitivity of the measurement to the photon structure. The Q2 dependence of the ratio of low- to high-xγobs events was measured. Next-to-leading-order QCD predictions were found to generally underestimate the low-xγobs contribution relative to that at high xγobs. Monte Carlo models based on leading-logarithmic parton-showers, using a partonic structure for the photon which falls smoothly with increasing Q2, provide a qualitative description of the data.
Source
code:ZEUS_2004_I649041.cc
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/Beam.hh"
#include "Rivet/Projections/DISKinematics.hh"
#include "Rivet/Projections/FastJets.hh"
#include "Rivet/Projections/DISFinalState.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);
}