Rivet analyses
title: ZEUS_2010_I875006
ZEUS dijet cross-sections in neutral-current DIS
Experiment: ZEUS (HERA)
Inspire ID: 875006
Status: VALIDATED
Authors: - Jacob Shannon
References: - Eur.Phys.J.C70:965-982,2010 - DOI: 10.1140/epjc/s10052-010-1504-2 - arXiv: 1010.6167v1
Beams: p+ e+
Beam energies: ANY
Run details: - Deep Inelastic Scattering events, 125 to 20000 GeV2
Single- and double-differential inclusive dijet cross sections in neutral current deep inelastic ep scattering have been measured with the ZEUS detector using an integrated luminosity of 374 pb$^{-1}$. The measurement was performed at large values of the photon virtuality, Q$^2$, between 125 and 20000 GeV$^2$. The jets were reconstructed with the k$T$ cluster algorithm in the Breit reference frame and selected by requiring their transverse energies in the Breit frame, E$_T^{B,jet}$, to be larger than 8 GeV. In addition, the invariant mass of the dijet system, M${jj}$, was required to be greater than 20 GeV. The cross sections are described by the predictions of next-to-leading-order QCD.
Source code:ZEUS_2010_I875006.cc
```c++ // -- C++ --
include "Rivet/Analysis.hh"
include "Rivet/Projections/DISFinalState.hh"
include "Rivet/Projections/DISKinematics.hh"
include "Rivet/Projections/FastJets.hh"
include "Rivet/Projections/FinalState.hh"
include
namespace Rivet {
/// @brief DIS dijets in the Breit frame class ZEUS_2010_I875006 : public Analysis { public:
/// Constructor
RIVET_DEFAULT_ANALYSIS_CTOR(ZEUS_2010_I875006);
/// @name Analysis methods
/// @{
/// Book histograms and initialise projections before the run
void init() {
// Initialise and register projections
declare(DISKinematics(), "Kinematics");
// All final state particles boosted to Breit frame then clustered
//using FastJet KT algorithm with jet radius parameter 1
const DISFinalState DISfs(DISFrame::BREIT);
FastJets DISjetfs(DISfs, JetAlg::KT, 1.0);
declare(DISjetfs, "DISjets");
// Book histograms
// specify custom binning
//Non-Grouped histgrams
book(_h_Q2, 1, 1, 1);
book(_h_XBj, 2, 1, 1);
book(_h_Et, 3, 1, 1);
book(_h_Mjj, 4, 1, 1);
book(_h_Eta, 5, 1, 1);
book(_h_Zeta, 6, 1, 1);
//Zeta values seperated into Q2 ranges
book(_h_ZetaQ2[0], 7, 1, 1);
book(_h_ZetaQ2[1], 8, 1, 1);
book(_h_ZetaQ2[2], 9, 1, 1);
book(_h_ZetaQ2[3], 10, 1, 1);
book(_h_ZetaQ2[4], 11, 1, 1);
book(_h_ZetaQ2[5], 12, 1, 1);
//Transverse jet energy seperated into Q2 ranges
book(_h_EtQ2[0], 13, 1, 1);
book(_h_EtQ2[1], 14, 1, 1);
book(_h_EtQ2[2], 15, 1, 1);
book(_h_EtQ2[3], 16, 1, 1);
book(_h_EtQ2[4], 17, 1, 1);
book(_h_EtQ2[5], 18, 1, 1);
}
/// Perform the per-event analysis
void analyze(const Event& event) {
//First Lorentz invariant quantities in Lab frame
DISKinematics dis = apply<DISKinematics>(event, "Kinematics");
double Q2 = dis.Q2();
double xbj = dis.x();
double y = dis.y();
//Perform required cut on Q2 and y
if (!inRange(Q2, 125 * GeV2, 20000 * GeV2)) vetoEvent;
if (!inRange(y, 0.2, 0.6)) vetoEvent;
//Get Lorentz transforms for Breit Boost and Lab Boost
const LorentzTransform breitboost = dis.boostBreit();
const LorentzTransform labboost = breitboost.inverse();
//Get jets clustered in Breit frame
Jets jets = apply<FastJets>(event, "DISjets").jetsByPt();
//Boost jets to lab frame
for (std::vector<int>::size_type i = 0; i < jets.size(); i++) {
jets[i].transformBy(labboost);
}
//Cut on Pseudorapidity in lab frame
const int orientation = dis.orientation();
vector<Jet> cutJets;
for (std::vector<int>::size_type i = 0; i < jets.size(); i++) {
double etaJet = jets[i].eta() * orientation;
if (etaJet < 2.5 && etaJet > -1) {
cutJets.push_back(jets[i]);
}
}
//veto event if only single jet
if (cutJets.size() < 2) {
vetoEvent;
}
//Boost jets to Breit frame
for (std::vector<int>::size_type i = 0; i < cutJets.size(); i++) {
cutJets[i].transformBy(breitboost);
}
//Sort jets by et in descending order
std::sort(cutJets.begin(), cutJets.end(),
[](const Jet& j1, const Jet& j2) { return j1.Et() > j2.Et(); });
//Ensure two hardest jets have Et>8GeV in Breit frame
const Jet& jet1 = cutJets[0];
const Jet& jet2 = cutJets[1];
if (jet1.Et() < 8 * GeV || jet2.Et() < 8 * GeV) {
vetoEvent;
}
//Extract required quantities in Breit frame
//Dijet mean transverse energy
const double dijetEt = (jet1.Et() + jet2.Et()) / 2;
//Invariant dijet mass of hardest transverse jets > 20GeV
const double Mjj = FourMomentum(jet1.momentum() + jet2.momentum()).mass();
if (Mjj < 20 * GeV) {
vetoEvent;
}
const double eta1 = orientation * jet1.eta();
const double eta2 = orientation * jet2.eta();
const double etastar = abs(eta1 - eta2) / 2;
const double logZeta = log10(xbj * (1 + pow(Mjj, 2) / Q2));
//Fill histograms
_h_Q2->fill(Q2);
_h_XBj->fill(xbj);
_h_Et->fill(dijetEt);
_h_Mjj->fill(Mjj);
_h_Eta->fill(etastar);
_h_Zeta->fill(logZeta);
//Fill histograms for different Q2 ranges
if (Q2 > 125 * GeV2 && Q2 <= 250 * GeV2) {
_h_ZetaQ2[0]->fill(logZeta);
_h_EtQ2[0]->fill(dijetEt);
}
else if (Q2 > 250 * GeV2 && Q2 <= 500 * GeV2) {
_h_ZetaQ2[1]->fill(logZeta);
_h_EtQ2[1]->fill(dijetEt);
}
else if (Q2 > 500 * GeV2 && Q2 <= 1000 * GeV2) {
_h_ZetaQ2[2]->fill(logZeta);
_h_EtQ2[2]->fill(dijetEt);
}
else if (Q2 > 1000 * GeV2 && Q2 <= 2000 * GeV2) {
_h_ZetaQ2[3]->fill(logZeta);
_h_EtQ2[3]->fill(dijetEt);
}
else if (Q2 > 2000 * GeV2 && Q2 <= 5000 * GeV2) {
_h_ZetaQ2[4]->fill(logZeta);
_h_EtQ2[4]->fill(dijetEt);
}
else if (Q2 > 5000 * GeV2 && Q2 <= 20000 * GeV2) {
_h_ZetaQ2[5]->fill(logZeta);
_h_EtQ2[5]->fill(dijetEt);
}
}
/// Normalise histograms etc., after the run
void finalize() {
//Calculate scaling factor from cross section
const double sf = crossSection() / picobarn / sumW(); //Scale factor with cuts
scale(_h_Q2, sf);
scale(_h_XBj, sf);
scale(_h_Et, sf);
scale(_h_Mjj, sf);
scale(_h_Eta, sf);
scale(_h_Zeta, sf);
for (int i = 0; i < 6; i++) {
scale(_h_ZetaQ2[i], sf);
scale(_h_EtQ2[i], sf);
}
}
/// @}
/// @name Histograms
/// @{
Histo1DPtr _h_Q2;
Histo1DPtr _h_XBj;
Histo1DPtr _h_Et;
Histo1DPtr _h_Mjj;
Histo1DPtr _h_Eta;
Histo1DPtr _h_Zeta;
Histo1DPtr _h_ZetaQ2[6];
Histo1DPtr _h_EtQ2[6];
/// @}
};
RIVET_DECLARE_PLUGIN(ZEUS_2010_I875006);
} ```