Rivet analyses
title: H1_1999_I481112
Measurement of D* meson cross-sections at HERA and determination of the gluon density in the proton using NLO QCD
Experiment: H1 (HERA)
Inspire ID: 481112
Status: VALIDATED
Authors: - Luca Marsili - Hannes Jung
References: - Nucl.Phys.B 545 (1999) 21 - DOI: 10.1016/S0550-3213(99)00119-4 - arXiv: hep-ex/9812023 - DESY-98-204
Beams: e+ p+, p+ e+
Beam energies: (27.5, 820.0); (820.0, 27.5)GeV
Run details: none listed
With the H1 detector at the $ep$ collider HERA, $D^$ meson production cross sections have been measured in deep inelastic scattering with four-momentum transfers $Q^2>2$ GeV$^2$ and in photoproduction at energies around $W_{\gamma p} \sim 88$ GeV and 194 GeV. Next-to-Leading Order QCD calculations are found to describe the differential cross sections within theoretical and experimental uncertainties. Using these calculations, the NLO gluon momentum distribution in the proton, $x_g g(x_g)$, has been extracted in the momentum fraction range $7.5 \times 10^{-4}< x_g <4 \times 10^{-2}$ at average scales $mu^2 =25$ to 50 GeV$^2$. The gluon momentum fraction $x_g$ has been obtained from the measured kinematics of the scattered electron and the $D^$ meson in the final state.
Source code:H1_1999_I481112.cc
```c++ // -- C++ --
include "Rivet/Analysis.hh"
include "Rivet/Projections/DISKinematics.hh"
include "Rivet/Projections/FastJets.hh"
include "Rivet/Projections/FinalState.hh"
include "Rivet/Projections/UnstableParticles.hh"
namespace Rivet {
/// @brief Measurement of D* meson cross-sections at HERA class H1_1999_I481112 : public Analysis { public:
/// Constructor
RIVET_DEFAULT_ANALYSIS_CTOR(H1_1999_I481112);
/// @name Analysis methods
///@{
/// Book histograms and initialise projections before the run
void init() {
// Initialise and register projections
// The basic final-state projection:
// all final-state particles within
// the given eta acceptance
const FinalState fs(Cuts::abseta < 1.5);
declare(fs, "fs");
// The final-state particles declared above are clustered using FastJet with
//Initialize quantities needed for cuts
declare(DISKinematics(), "Kinematics");
declare(UnstableParticles(), "DStars");
Histo1DPtr dummy;
book(_h["211"], 2, 1, 1);
book(_h["311"], 3, 1, 1);
book(_h["411"], 4, 1, 1);
book(_h["511"], 5, 1, 1);
book(_h["611"], 6, 1, 1);
book(_h["rap194"], 7, 1, 1);
book(_h["pt194"], 8, 1, 1);
book(_h["rap88"], 9, 1, 1);
book(_h["pt88"], 10, 1, 1);
book(_hpt, {2.5, 3.5, 5.0, 10.0}, {"d11-x01-y01", "d11-x01-y02", "d11-x01-y03"});
book(_h["1211"], 12, 1, 1);
book(_h["1212"], 12, 1, 2);
book(_h["1311"], 13, 1, 1);
}
/// Perform the per-event analysis
void analyze(const Event& event) {
const DISKinematics& dk = apply<DISKinematics>(event, "Kinematics");
bool isDIS = false;
bool ETAG44 = false;
bool ETAG33 = false;
const double y = dk.y();
const double Q2 = dk.Q2();
if (Q2 > 2 && Q2 < 100 && y > 0.05 && y < 0.7) isDIS = true;
if (Q2 < 0.009 && y > 0.02 && y < 0.32) ETAG44 = true;
if (Q2 < 0.01 && y > 0.29 && y < 0.62) ETAG33 = true;
if (isDIS == false && ETAG44 == false && ETAG33 == false) vetoEvent;
//Creating array of D*
Cut cuts = isDIS ? (Cuts::pT > 1.5 * GeV && Cuts::abseta < 1.5)
: (Cuts::pT > 2 * GeV && Cuts::absrap < 1.5);
Particles unstables = apply<ParticleFinder>(event, "DStars").particles(cuts);
const Particles dstars = select(unstables, [](const Particle& p) { return p.abspid() == PID::DSPLUS; });
if (dstars.empty()) vetoEvent;
MSG_DEBUG("D*" << dstars.size());
const Particle& dstar = dstars.front();
// boosting the system
const LorentzTransform hcmboost = dk.boostHCM();
const FourMomentum hcmMom = hcmboost.transform(dstar.momentum());
//discriminate between dis and photoprod, and between ETA33 and ETA 44
//kinematics quantities
const double E = dstar.E();
const double p_z = dstar.pz();
//std::cout<<"y: "<<y<<endl;
if (y < 0.02) vetoEvent;
const double m2 = 2.25; // charm mass^2
const double E_e = dk.beamLepton().E();
const double z = (E - p_z) / (2 * y * E_e);
if (z > 1) {
MSG_DEBUG("Momentum fraction greater than unity! This should not happen. Vetoing event.");
vetoEvent;
}
const double M2 = (1.44 * hcmMom.pT2() + m2) / (z * (1 - z));
const double x_g = (M2 + Q2) / (y * dk.s());
const double y_capp = dstar.rapidity();
const double W = sqrt(dk.W2());
//perform the cuts
if (isDIS == true) {
_h["211"]->fill(dstar.pT());
_h["411"]->fill(dstar.eta());
_h["511"]->fill(Q2);
_h["611"]->fill(log10(x_g));
//boosting to the hcm frame
_h["311"]->fill(hcmMom.pT());
}
if (ETAG33 == true && abs(y_capp) < 1.5 && dstar.pT() > 2.5 * GeV) {
_h["rap194"]->fill(y_capp);
_h["pt194"]->fill(dstar.pT());
_hpt->fill(dstar.pT(), y_capp);
if (W > 173 && W < 273) {
_h["1211"]->fill(log10(x_g));
}
if (W > 130 && W < 230) {
_h["1212"]->fill(log10(x_g));
}
}
if (ETAG44 == true && abs(y_capp) < 1.5 && dstar.pT() > 2) {
_h["pt88"]->fill(dstar.pT());
_h["rap88"]->fill(y_capp);
_h["1311"]->fill(log10(x_g));
}
}
/// Normalise histograms etc., after the run
void finalize() {
// conversion factors from ep to gamma p xsections (as given in publication)
const double F_etag33 = 0.0128;
const double F_etag44 = 0.0838;
double norm = crossSection() / nanobarn / sumW();
scale(_h["211"], norm);
scale(_h["311"], norm);
scale(_h["411"], norm);
scale(_h["511"], norm);
scale(_h["611"], norm);
double norm_mub = crossSection() / microbarn / sumW();
scale(_h["rap194"], norm_mub / F_etag33);
scale(_h["pt194"], norm_mub / F_etag33);
scale(_h["rap88"], norm_mub / F_etag44);
scale(_h["pt88"], norm_mub / F_etag44);
scale(_hpt, norm / F_etag33);
scale(_h["1211"], norm_mub / F_etag33);
scale(_h["1212"], norm_mub / F_etag33);
scale(_h["1311"], norm_mub / F_etag44);
}
///@}
/// @name Histograms
///@{
map<string, Histo1DPtr> _h;
Histo1DGroupPtr _hpt;
///@}
};
RIVET_DECLARE_PLUGIN(H1_1999_I481112);
} ```