rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

ZEUS_2008_I810112

Measurement of $D^{\pm}$ and $D^0$ production in deep inelastic scattering using a lifetime tag at HERA
Experiment: ZEUS (HERA)
Inspire ID: 810112
Status: VALIDATED
Authors:
  • Andrii Verbytskyi andrii.verbytskyi@mpp.mpg.de
References:
  • Eur.Phys.J.C 63 (2009) 171-188
  • DOI:10.1140/epjc/s10052-009-1088-x
  • arXiv: 0812.3775
Beams: e+ p+, p+ e+, e- p+, p+ e-
Beam energies: ANY
Run details:
  • Inclusive DIS

The production of $D^{\pm}$ and $D^{0}$ mesons has been measured with the ZEUS detector at HERA using an integrated luminosity of $133.6 pb^{-1}$. The measurements cover the kinematic range $5 < Q^2 < 1000 GeV^2$, $0.02 < y < 0.7$, $1.5 < p_T^D < 15 GeV$ and $\eta^D < 1.6$. Combinatorial background to the D meson signals is reduced by using the ZEUS microvertex detector to reconstruct displaced secondary vertices. Production cross sections are compared with the predictions of next-to-leading-order QCD which is found to describe the data well. Measurements are extrapolated to the full kinematic phase space in order to obtain the open-charm contribution, $F_2^c\bar{c}$, to the proton structure function, $F_2$.

Source code: ZEUS_2008_I810112.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/UnstableParticles.hh"
  4#include "Rivet/Projections/FinalState.hh"
  5#include "Rivet/Projections/FastJets.hh"
  6#include "Rivet/Projections/DISFinalState.hh"
  7
  8namespace Rivet {
  9
 10
 11/// @brief Measurement of $D^{\pm}$ and $D^0$ production in deep inelastic scattering using a lifetime tag at HERA
 12/// @author Andrii Verbytskyi
 13class ZEUS_2008_I810112 : public Analysis {
 14
 15  public:
 16
 17      /// Constructor
 18      RIVET_DEFAULT_ANALYSIS_CTOR(ZEUS_2008_I810112);
 19
 20      /// @name Analysis methods
 21      ///@{
 22
 23      /// Book histograms and initialise projections before the run
 24      void init() {
 25          /// Initialise and register projections
 26          FinalState fs;
 27          const DISKinematics& diskin = DISKinematics();
 28          declare(diskin,"Kinematics");
 29          declare(UnstableParticles(), "UPS");
 30
 31
 32          book(_h_Dp_q2, 3, 1, 1);
 33          book(_h_Dp_x, 4, 1, 1);
 34          book(_h_Dp_pt, 5, 1, 1);
 35          book(_h_Dp_eta, 6, 1, 1);
 36
 37          book(_h_Dp_yinq2[0], "TMP/Dp0", refData( 11, 1, 1));
 38          book(_h_Dp_yinq2[1], "TMP/Dp1", refData( 11, 1, 2));
 39          book(_h_Dp_yinq2[2], "TMP/Dp2", refData( 11, 1, 3));
 40
 41          book(_s_Dp_yinq2[0], 11, 1, 1);
 42          book(_s_Dp_yinq2[1], 11, 1, 2);
 43          book(_s_Dp_yinq2[2], 11, 1, 3);
 44
 45          book(_h_D0_q2, 7, 1, 1);
 46          book(_h_D0_x, 8, 1, 1);
 47          book(_h_D0_pt, 9, 1, 1);
 48          book(_h_D0_eta, 10, 1, 1);
 49
 50          book(_h_D0_yinq2[0], "TMP/D00", refData( 12, 1, 1));
 51          book(_h_D0_yinq2[1], "TMP/D01", refData( 12, 1, 2));
 52          book(_h_D0_yinq2[2], "TMP/D02", refData( 12, 1, 3));
 53
 54          book(_s_D0_yinq2[0], 12, 1, 1);
 55          book(_s_D0_yinq2[1], 12, 1, 2);
 56          book(_s_D0_yinq2[2], 12, 1, 3);
 57
 58
 59      }
 60  /// A routine that selects the bin in kinematic space
 61      int _getbinQ2_OK(const DISKinematics& dk) {
 62          if (inRange(dk.Q2()/GeV2, 5.0, 9.0)) return 0;
 63          if (inRange(dk.Q2()/GeV2, 9.0, 44.0)) return 1;
 64          if (inRange(dk.Q2()/GeV2, 44.0, 1000.0)) return 2;
 65          return -1;
 66      }
 67
 68      /// Perform the per-event analysis
 69      void analyze(const Event& event) {
 70          /// DIS kinematics
 71          const DISKinematics& dk = apply<DISKinematics>(event, "Kinematics");
 72          double q2  = dk.Q2();
 73          double x   = dk.x();
 74          double y   = dk.y();
 75
 76          ///Assure the event falls into the kinematic range of the measurement.
 77          if (!inRange(q2/GeV2, 5, 1000)) vetoEvent;
 78          if (!inRange(y, 0.02, 0.7)) vetoEvent;
 79
 80          /// Find out in which bin the measurement falls.
 81          int bin = _getbinQ2_OK(dk);
 82          if ( bin < 0 ) vetoEvent;
 83
 84          const UnstableParticles& ufs = apply<UnstableParticles>(event, "UPS");
 85
 86          /// Get \f$D^0$\f particles
 87          for (const Particle& p : filter_select(ufs.particles(), Cuts::abspid == PID::D0)) {
 88              ///But not not from \f$D^{*\pm}$\f decays
 89              if (p.hasAncestor(PID::DSTARPLUS)) continue;
 90              if (p.hasAncestor(PID::DSTARMINUS)) continue;
 91              /// Select particles only in the \f$\eta-p_{T}$\f region
 92              if (!inRange(p.eta(), -1.6, 1.6)) continue;
 93              if (!inRange(p.pt()/GeV, 1.5, 15.0)) continue;
 94              /// Fill the general histograms
 95              _h_D0_pt->fill(p.pt()/GeV);
 96              _h_D0_eta->fill(p.eta());
 97              _h_D0_q2->fill(q2/GeV2);
 98              _h_D0_x->fill(x);
 99              /// Fill the cross-sections in selected kinematic bins
100              _h_D0_yinq2[bin]->fill(y);
101          }
102
103          /// Get \f$D^{\pm}$\f particles
104          for (const Particle& p : filter_select(ufs.particles(), Cuts::abspid == PID::DPLUS)) {
105              /// Select particles only in the \f$\eta-p_{T}$\f region
106              if (!inRange(p.eta(), -1.6, 1.6)) continue;
107              if (!inRange(p.pt()/GeV, 1.5, 15.0)) continue;
108              /// Fill the general histograms
109              _h_Dp_pt->fill(p.pt()/GeV);
110              _h_Dp_eta->fill(p.eta());
111              _h_Dp_q2->fill(q2/GeV2);
112              _h_Dp_x->fill(x);
113              /// Fill the cross-sections in selected kinematic bins
114              _h_Dp_yinq2[bin]->fill(y);
115          }
116      }
117      /// Normalise histograms etc., after the run
118      void finalize() {
119          const double sf = crossSection()/nanobarn/sumOfWeights();
120          /// For CS comparison the MC should be corrected to difference between BR used for data and in MC
121          scale(_h_Dp_pt, sf);
122          scale(_h_Dp_eta, sf);
123          scale(_h_Dp_q2, sf);
124          scale(_h_Dp_x, sf);
125
126          for (size_t i = 0; i < 3; i++) {
127              scale(_h_Dp_yinq2[i], sf);
128              barchart(_h_Dp_yinq2[i], _s_Dp_yinq2[i], false);
129          }
130
131          scale(_h_D0_pt, sf);
132          scale(_h_D0_eta, sf);
133          scale(_h_D0_q2, sf);
134          scale(_h_D0_x, sf);
135          
136          for (size_t i = 0; i < 3; i++) {
137              scale(_h_D0_yinq2[i], sf);
138              barchart(_h_D0_yinq2[i], _s_D0_yinq2[i], false);
139          }
140      }
141      ///@}
142
143    private:
144
145      Histo1DPtr
146      _h_D0_pt,
147      _h_D0_eta,
148      _h_D0_q2,
149      _h_D0_x,
150      _h_D0_yinq2[3];
151      Histo1DPtr
152      _h_Dp_pt,
153      _h_Dp_eta,
154      _h_Dp_q2,
155      _h_Dp_x,
156      _h_Dp_yinq2[3];
157      
158      Scatter2DPtr _s_Dp_yinq2[3];
159      Scatter2DPtr _s_D0_yinq2[3];
160
161  };
162
163  /// The hook for the plugin system
164  RIVET_DECLARE_PLUGIN(ZEUS_2008_I810112);
165}