Processing math: 100%
rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

ZEUS_2010_I875006

ZEUS dijet cross-sections in neutral-current DIS
Experiment: ZEUS (HERA)
Inspire ID: 875006
Status: VALIDATED
Authors:
  • Jacob Shannon
References: 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 pb1. The measurement was performed at large values of the photon virtuality, Q2, between 125 and 20000 GeV2. The jets were reconstructed with the kT cluster algorithm in the Breit reference frame and selected by requiring their transverse energies in the Breit frame, EB,jetT, to be larger than 8 GeV. In addition, the invariant mass of the dijet system, Mjj, 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
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/FinalState.hh"
  4#include "Rivet/Projections/FastJets.hh"
  5#include "Rivet/Projections/DISKinematics.hh"
  6#include "Rivet/Projections/DISFinalState.hh"
  7#include <cmath>
  8
  9namespace Rivet {
 10
 11
 12  /// @brief DIS dijets in the Breit frame
 13  class ZEUS_2010_I875006 : public Analysis {
 14  public:
 15
 16    /// Constructor
 17    RIVET_DEFAULT_ANALYSIS_CTOR(ZEUS_2010_I875006);
 18
 19
 20    /// @name Analysis methods
 21    /// @{
 22
 23    /// Book histograms and initialise projections before the run
 24    void init() {
 25
 26      // Initialise and register projections
 27      declare(DISKinematics(), "Kinematics");
 28
 29      // All final state particles boosted to Breit frame then clustered
 30      //using FastJet KT algorithm with jet radius parameter 1
 31      const DISFinalState DISfs(DISFrame::BREIT);
 32      FastJets DISjetfs(DISfs, JetAlg::KT, 1.0);
 33      declare(DISjetfs, "DISjets");
 34
 35      // Book histograms
 36      // specify custom binning
 37
 38      //Non-Grouped histgrams
 39      book(_h_Q2, 1,1,1);
 40      book(_h_XBj, 2,1,1);
 41      book(_h_Et, 3,1,1);
 42      book(_h_Mjj, 4,1,1);
 43      book(_h_Eta, 5,1,1);
 44      book(_h_Zeta, 6,1,1);
 45
 46      //Zeta values seperated into Q2 ranges
 47      book(_h_ZetaQ2[0], 7,1,1);
 48      book(_h_ZetaQ2[1], 8,1,1);
 49      book(_h_ZetaQ2[2], 9,1,1);
 50      book(_h_ZetaQ2[3], 10,1,1);
 51      book(_h_ZetaQ2[4], 11,1,1);
 52      book(_h_ZetaQ2[5], 12,1,1);
 53
 54      //Transverse jet energy seperated into Q2 ranges
 55      book(_h_EtQ2[0], 13,1,1);
 56      book(_h_EtQ2[1], 14,1,1);
 57      book(_h_EtQ2[2], 15,1,1);
 58      book(_h_EtQ2[3], 16,1,1);
 59      book(_h_EtQ2[4], 17,1,1);
 60      book(_h_EtQ2[5], 18,1,1);
 61    }
 62
 63    /// Perform the per-event analysis
 64    void analyze(const Event& event) {
 65
 66      //First Lorentz invariant quantities in Lab frame
 67      DISKinematics dis = apply<DISKinematics>(event, "Kinematics");
 68      double Q2 = dis.Q2();
 69      double xbj = dis.x();
 70      double y = dis.y();
 71
 72      //Perform required cut on Q2 and y
 73      if (!inRange(Q2, 125*GeV2, 20000*GeV2)) vetoEvent;
 74      if (!inRange(y, 0.2, 0.6)) vetoEvent;
 75
 76      //Get Lorentz transforms for Breit Boost and Lab Boost
 77      const LorentzTransform breitboost = dis.boostBreit();
 78      const LorentzTransform labboost = breitboost.inverse();
 79
 80      //Get jets clustered in Breit frame
 81      Jets jets = apply<FastJets>(event, "DISjets").jetsByPt();
 82
 83      //Boost jets to lab frame
 84      for(std::vector<int>::size_type i=0; i<jets.size(); i++){
 85        jets[i].transformBy(labboost);
 86      }
 87
 88      //Cut on Pseudorapidity in lab frame
 89      const int orientation = dis.orientation();
 90      vector<Jet> cutJets;
 91      for(std::vector<int>::size_type i=0; i<jets.size(); i++){
 92  	double etaJet = jets[i].eta()*orientation;
 93        if(etaJet < 2.5 && etaJet > -1){
 94		cutJets.push_back(jets[i]);
 95	}
 96      }
 97
 98      //veto event if only single jet
 99      if(cutJets.size()<2){
100          vetoEvent;
101      }
102
103      //Boost jets to Breit frame
104      for(std::vector<int>::size_type i=0; i<cutJets.size(); i++){
105      	cutJets[i].transformBy(breitboost);
106      }
107
108      //Sort jets by et in descending order
109      std::sort(cutJets.begin(), cutJets.end(),[](const Jet& j1, const Jet& j2){
110	 return j1.Et()>j2.Et();
111      });
112
113      //Ensure two hardest jets have Et>8GeV in Breit frame
114      const Jet& jet1 = cutJets[0];
115      const Jet& jet2 = cutJets[1];
116
117      if(jet1.Et()<8*GeV || jet2.Et()<8*GeV){
118      	  vetoEvent;
119      }
120
121      //Extract required quantities in Breit frame
122      //Dijet mean transverse energy
123      const double dijetEt = (jet1.Et() + jet2.Et())/2;
124
125      //Invariant dijet mass of hardest transverse jets > 20GeV
126      const double Mjj =  FourMomentum(jet1.momentum() + jet2.momentum()).mass();
127      if(Mjj<20*GeV){
128          vetoEvent;
129      }
130
131      const double eta1 = orientation*jet1.eta();
132      const double eta2 = orientation*jet2.eta();
133      const double etastar = abs(eta1 - eta2)/2;
134
135      const double logZeta = log10(xbj*(1 + pow(Mjj,2)/Q2));
136
137      //Fill histograms
138      _h_Q2->fill(Q2);
139      _h_XBj->fill(xbj);
140      _h_Et->fill(dijetEt);
141      _h_Mjj->fill(Mjj);
142      _h_Eta->fill(etastar);
143      _h_Zeta->fill(logZeta);
144
145      //Fill histograms for different Q2 ranges
146      if(Q2>125*GeV2 && Q2<=250*GeV2){
147          _h_ZetaQ2[0]->fill(logZeta);
148          _h_EtQ2[0]->fill(dijetEt);
149      }else if (Q2>250*GeV2 && Q2<=500*GeV2){
150          _h_ZetaQ2[1]->fill(logZeta);
151          _h_EtQ2[1]->fill(dijetEt);
152      }else if (Q2>500*GeV2 && Q2<=1000*GeV2){
153          _h_ZetaQ2[2]->fill(logZeta);
154          _h_EtQ2[2]->fill(dijetEt);
155      }else if (Q2>1000*GeV2 && Q2<=2000*GeV2){
156          _h_ZetaQ2[3]->fill(logZeta);
157          _h_EtQ2[3]->fill(dijetEt);
158      }else if (Q2>2000*GeV2 && Q2<=5000*GeV2){
159          _h_ZetaQ2[4]->fill(logZeta);
160          _h_EtQ2[4]->fill(dijetEt);
161      }else if (Q2>5000*GeV2 && Q2<=20000*GeV2){
162          _h_ZetaQ2[5]->fill(logZeta);
163          _h_EtQ2[5]->fill(dijetEt);
164      }
165    }
166
167    /// Normalise histograms etc., after the run
168    void finalize() {
169      //Calculate scaling factor from cross section
170      const double sf = crossSection()/picobarn/sumW(); //Scale factor with cuts
171
172      scale(_h_Q2, sf);
173      scale(_h_XBj, sf);
174      scale(_h_Et, sf);
175      scale(_h_Mjj, sf);
176      scale(_h_Eta, sf);
177      scale(_h_Zeta, sf);
178
179      for(int i = 0; i<6;i++){
180          scale(_h_ZetaQ2[i], sf);
181          scale(_h_EtQ2[i],sf);
182      }
183    }
184
185    /// @}
186
187
188    /// @name Histograms
189    /// @{
190    Histo1DPtr _h_Q2;
191    Histo1DPtr _h_XBj;
192    Histo1DPtr _h_Et;
193    Histo1DPtr _h_Mjj;
194    Histo1DPtr _h_Eta;
195    Histo1DPtr _h_Zeta;
196    Histo1DPtr _h_ZetaQ2[6];
197    Histo1DPtr _h_EtQ2[6];
198    /// @}
199
200  };
201
202
203  RIVET_DECLARE_PLUGIN(ZEUS_2010_I875006);
204
205}