Rivet analyses
D0, D*±, D± and Ds± meson production at 5.02 and 7 TeV
Experiment: ALICE (LHC)
Inspire ID: 1716440
Status: VALIDATED
Authors: - Peter Richardson
References: - Eur.Phys.J.C 79 (2019) 388, 2019
Beams: p+ p+
Beam energies: (2510.0, 2510.0); (3500.0, 3500.0)GeV
Run details: - D meson production
Measurement of the transverse momentum spectra and ratios for D0, D*±, D± and Ds± meson production at 5.02 TeV by the ALICE collaboration. The 7 TeV results are based on those from ALICE_2017_I1511870 and are mainly used to take ratios between the two energies.
Source
code:ALICE_2019_I1716440.cc
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/UnstableParticles.hh"
namespace Rivet {
/// @brief D meson production at 5.02 and 7 TeV
class ALICE_2019_I1716440 : public Analysis {
public:
/// Constructor
RIVET_DEFAULT_ANALYSIS_CTOR(ALICE_2019_I1716440);
/// @name Analysis methods
/// @{
/// Book histograms and initialise projections before the run
void init() {
// projections
declare(UnstableParticles(Cuts::abspid == 411 || Cuts::abspid == 421 || Cuts::abspid == 431
|| Cuts::abspid == 413),
"UFS");
for (double eVal : allowedEnergies()) {
const string en = toString(round(eVal / GeV));
if (isCompatibleWithSqrtS(eVal)) _sqs = en;
bool is7TeV(en == "7000"s);
size_t offset = is7TeV ? 10 : 6;
for (size_t ix = 0; ix < 4; ++ix) {
const string mode = en + toString(ix);
book(_h[mode + "ratio_num"], "TMP/h_ratio_num_" + mode, refData(offset + ix, 1, 1));
book(_h[mode + "ratio_den"], "TMP/h_ratio_den_" + mode, refData(offset + ix, 1, 1));
book(_h[mode + "energy"], "TMP/h_energy_" + mode, refData(offset + ix, 1, 1));
if (!is7TeV) book(_h[mode + "prompt"], 1 + ix, 1, 1);
}
}
raiseBeamErrorIf(_sqs.empty());
book(_h["incl"], 5, 1, 1);
book(_total, 18, 1, 1);
}
/// Perform the per-event analysis
void analyze(const Event& event) {
// Final state of unstable particles to get particle spectra
const UnstableParticles& ufs = apply<UnstableParticles>(event, "UFS");
for (const Particle& p : ufs.particles()) {
// no mixing and |y|<0.5
if (p.children().size() == 1 || p.absrap() > 0.5) continue;
unsigned int imeson = 0;
if (p.abspid() == 411)
imeson = 1;
else if (p.abspid() == 413)
imeson = 2;
else if (p.abspid() == 431)
imeson = 3;
const double pT = p.perp();
if (p.fromBottom()) {
if (_sqs == "5020"s && imeson == 0) _h["incl"]->fill(pT);
continue;
}
// prompt at 5.02 TeV
if (_sqs == "5020"s) {
_h[_sqs + toString(imeson) + "prompt"]->fill(pT);
_total->fill(_edges[imeson]);
}
if (imeson == 0) {
_h[_sqs + "0ratio_den"]->fill(pT / GeV);
_h[_sqs + "1ratio_den"]->fill(pT / GeV);
_h[_sqs + "2ratio_den"]->fill(pT / GeV);
if (_sqs == "5020"s) _h["incl"]->fill(pT / GeV);
}
else if (imeson == 1) {
_h[_sqs + "0ratio_num"]->fill(pT / GeV);
_h[_sqs + "3ratio_den"]->fill(pT / GeV);
}
else if (imeson == 2) {
_h[_sqs + "1ratio_num"]->fill(pT / GeV);
}
else if (imeson == 3) {
_h[_sqs + "2ratio_num"]->fill(pT / GeV);
_h[_sqs + "3ratio_num"]->fill(pT / GeV);
}
_h[_sqs + toString(imeson) + "energy"]->fill(pT / GeV);
}
}
/// Normalise histograms etc., after the run
void finalize() {
const double factor = crossSection() / microbarn / sumOfWeights();
scale(_total, factor);
scale(_h, factor);
Estimate1DPtr tmp;
for (double eVal : allowedEnergies()) {
const string en = toString(round(eVal / GeV));
for (size_t ix = 0; ix < 4; ++ix) {
const string mode = en + toString(ix);
bool is7TeV(en == "7000"s);
book(tmp, 6 + 4 * is7TeV + ix, 1, 1);
divide(_h[mode + "ratio_num"], _h[mode + "ratio_den"], tmp);
}
}
}
/// @}
/// @name Histograms
/// @{
map<string, Histo1DPtr> _h;
BinnedHistoPtr<string> _total;
vector<string> _edges = {"P P --> D0 (Q=PROMPT) X", "P P --> D+ (Q=PROMPT) X", "P P --> D*+ (Q=PROMPT) X",
"P P --> D/s+ (Q=PROMPT) X"};
string _sqs = "";
/// @}
};
RIVET_DECLARE_PLUGIN(ALICE_2019_I1716440);
}