rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

H1_1997_I424463

Measurement of charged particle transverse momentum spectra in deep inelastic scattering
Experiment: H1 (HERA)
Inspire ID: 424463
Status: VALIDATED
Authors:
  • Andrii Verbytskyi
References:
  • Nucl.Phys.B 485 (1997) 3-24
  • DOI:10.1016/S0550-3213(96)00675-X
  • arXiv: hep-ex/9610006
Beams: p+ e-
Beam energies: (820.0, 27.5) GeV
    No run details listed

Transverse momentum spectra of charged particles produced in deep inelastic scattering are measured as a function of the kinematic variables $x_B$ and $Q^2$ using the H1 detector at the ep collider HERA. The data are compared to different parton emission models, either with or without ordering of the emissions in transverse momentum. The data provide evidence for a relatively large amount of parton radiation between the current and the remnant systems.

Source code: H1_1997_I424463.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/FinalState.hh"
  4#include "Rivet/Projections/DISKinematics.hh"
  5#include "Rivet/Projections/ChargedFinalState.hh"
  6
  7namespace Rivet {
  8
  9
 10  /// @brief Measurement of charged particle transverse momentum spectra in deep inelastic scattering
 11  class H1_1997_I424463 : public Analysis {
 12  public:
 13
 14    /// Constructor
 15    RIVET_DEFAULT_ANALYSIS_CTOR(H1_1997_I424463);
 16
 17
 18    /// @name Analysis methods
 19    /// @{
 20
 21    /// Book histograms and initialise projections before the run
 22    void init() {
 23
 24      DISLepton dl;
 25      declare(dl, "Lepton");
 26      DISKinematics diskin;
 27      declare(diskin, "Kinematics");
 28      ChargedFinalState cfs(dl.remainingFinalState());
 29      declare(cfs, "CFS");
 30
 31      for (int offset = 0; offset < 10; offset++) {
 32        book(_h_pt[offset], 1 + offset, 1, 1);
 33        book(_h_eta[offset], 29 + offset, 1, 1);
 34        book(_h_pt[offset+10], 11 + offset, 1, 1);
 35      }
 36      book(_h_Q2, "TMP/Q2", 10, 0, 10);
 37    }
 38
 39
 40    /// Perform the per-event analysis
 41    void analyze(const Event& event) {
 42
 43      /// DIS kinematics
 44      const DISKinematics& dk = apply<DISKinematics>(event, "Kinematics");
 45      const double q2  = dk.Q2();
 46      const double x   = dk.x();
 47      const double y   = dk.y();
 48
 49      if (!inRange(q2/GeV2, 5.0, 50.0)) vetoEvent;
 50      if (!inRange(y, 0.05, 1.0)) vetoEvent;
 51      if (!inRange(x, 0.0001, 0.01)) vetoEvent;
 52
 53      const ChargedFinalState& cfs = apply<ChargedFinalState>(event, "CFS");
 54      if (cfs.particles().size() < 2)  vetoEvent;
 55
 56      const DISLepton& dl = apply<DISLepton>(event,"Lepton");
 57      const Vector4 leptonMom = dl.out().momentum();
 58      const double enel = leptonMom.t();
 59      const double thel = leptonMom.angle(dk.beamHadron().mom())/degree;
 60
 61      bool cut = enel/GeV > 12. && thel > 157. && thel < 173;
 62      if (!cut) vetoEvent;
 63
 64      const int of = _getbinQ2x(dk);
 65      if ( of < 0 ) vetoEvent;
 66      const Vector3 gMom = (dl.out().momentum() - dl.in().momentum()).p3().unit();
 67      if ( of > 0 ) _h_Q2->fill(of);
 68      _h_Q2->fill(0);
 69
 70      for (const auto  p: cfs.particles()) {
 71        const double thp = p.momentum().angle(dk.beamHadron().mom())/degree;
 72
 73        if (!( thp > 8. && thp < 155)) continue;
 74
 75        const double costhetastar = dot(p.momentum().p3().unit(),gMom);
 76        const double etastar = -0.5*log(( 1.0 - costhetastar)/(1.0 + costhetastar));
 77        if (inRange(etastar, 0.5, 2.5)) {
 78          int delta = -1;
 79          if (inRange(etastar, 0.5, 1.5)) delta = 0;
 80          if (inRange(etastar, 1.5, 2.5)) delta = 1;
 81          if (delta > -1) {
 82            if (of > 0) {
 83              _h_pt[of + 10*delta]->fill(p.pt()/GeV);
 84            }
 85            _h_pt[10*delta]->fill(p.pt()/GeV);
 86          }
 87        }
 88        if (p.pt()/GeV > 1.0) {
 89          const double eta = p.momentum().p3().eta();//-0.5*log((1-costheta)/(1+costheta));
 90          if ( of > 0 ) _h_eta[of]->fill(eta);
 91          _h_eta[0]->fill(eta);
 92        }
 93
 94      }
 95
 96    }
 97
 98
 99    /// Normalise histograms etc., after the run
100    void finalize() {
101      for (int offset = 0; offset < 10; offset++) {
102        const double st = _h_Q2->binAt(offset).height();
103        scale(_h_eta[offset], 1.0/std::max(1.0, st));
104        scale(_h_pt[offset], 1.0/std::max(1.0, st));
105        scale(_h_pt[offset+10], 1.0/std::max(1.0, st));
106      }
107    }
108
109    /// @}
110
111
112    /// Utility function to get appropriate (Q2,x) bin indices
113    int _getbinQ2x(const DISKinematics& dk) {
114      const double q2 = dk.Q2()/GeV2, x = dk.x();
115      if (inRange(q2, 5.0, 10.0) && inRange(x, 0.0001, 0.0002)) return 1;
116      if (inRange(q2, 6.0, 10.0) && inRange(x, 0.0002, 0.0005)) return 2;
117      if (inRange(q2, 10.0, 20.0)) {
118        if (inRange(x, 0.0002, 0.0005)) return 3;
119        if (inRange(x, 0.0005, 0.0008)) return 4;
120        if (inRange(x, 0.0008, 0.0015)) return 5;
121        if (inRange(x, 0.0015, 0.0040)) return 6;
122      }
123      if (inRange(q2, 20.0, 50.0)) {
124        if (inRange(x, 0.0005, 0.0014)) return 7;
125        if (inRange(x, 0.0014, 0.0030)) return 8;
126        if (inRange(x, 0.0030, 0.010)) return 9;
127      }
128      if (inRange(q2, 5.0, 50.0) && inRange(x, 0.0001, 0.01) ) return 0;
129      return -1;
130    }
131
132
133    /// @name Histograms
134    /// @{
135    Histo1DPtr _h_pt[20];
136    Histo1DPtr _h_eta[10];
137    Histo1DPtr _h_Q2;
138    /// @}
139
140  };
141
142
143  RIVET_DECLARE_PLUGIN(H1_1997_I424463);
144
145}