Rivet analyses referenceALICE_2021_I1848990Measurement of beauty and charm production at 5 TeVExperiment: ALICE (LHC) Inspire ID: 1848990 Status: VALIDATED Authors:
Beam energies: (2510.0, 2510.0) GeV Run details:
The $p_\text{T}$-differential production cross sections of prompt and non-prompt (produced in beauty-hadron decays) D mesons were measured by the ALICE experiment at midrapidity ($|y|<0.5$) in proton-proton collisions at $\sqrt{s}$=5.02 TeV. The data sample used in the analysis corresponds to an integrated luminosity of $(19.3\pm0.4)$ nb${}^{-1}$. D mesons were reconstructed from their decays $D^0 \to K^-\pi^+$, $D^+\to K^-\pi^+\pi^+$, and $D^+_\text{s} \to \varphi\pi^+\to K^-K^+\pi^+$ and their charge conjugates. Compared to previous measurements in the same rapidity region, the cross sections of prompt $D^+$ and $D^+_\text{s}$ mesons have an extended $p_\text{T}$ coverage and total uncertainties reduced by a factor ranging from 1.05 to 1.6, depending on $p_\text{T}$, allowing for a more precise determination of their $p_\text{T}$-integrated cross sections. The results are well described by perturbative QCD calculations. The fragmentation fraction of heavy quarks to strange mesons divided by the one to non-strange mesons, $f_\text{s}/(f_\text{u}+f_\text{d})$, is compatible for charm and beauty quarks and with previous measurements at different centre-of-mass energies and collision systems. The $b\bar{b}$ production cross section per rapidity unit at midrapidity, estimated from non-prompt $D$-meson measurements, is $\text{d}\sigma_{b\bar{b}} / \text{d} y_{|y|<0.5}$ = 34.5 $\pm$ 2.4 (stat) ${}^{+4.7}_{-2.9}$ (tot. syst.) $\mu$b${}^{-1}$. It is compatible with previous measurements at the same centre-of-mass energy and with the cross section predicted by perturbative QCD calculations. Source code: ALICE_2021_I1848990.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/UnstableParticles.hh"
4
5namespace Rivet {
6
7 /// @brief Measurement of beauty and charm production iat 5 TeV
8 class ALICE_2021_I1848990 : public Analysis {
9 public:
10
11 RIVET_DEFAULT_ANALYSIS_CTOR(ALICE_2021_I1848990);
12
13 void init() {
14
15 const UnstableParticles fs(Cuts::absrap < 0.5);
16 declare(fs, "fs");
17
18 book(_h["npmD0"], 1, 1, 1); // non-prompt D0 production cross section
19 book(_h["npmDplus"], 2, 1, 1); // non-prompt D+ production cross section
20 book(_h["npmDS"], 3, 1, 1); // non-prompt DS+ production cross section
21 book(_h["pmD0"], 4, 1, 1); // prompt D0 production cross section
22 book(_h["pmDplus"], 5, 1, 1); // prompt D+ production cross section
23 book(_h["pmDS"], 6, 1, 1); // prompt DS+ production cross section
24
25 book(_e["npmD0_pmD0"], 7, 1, 1); // ratio between non-prompt D0 and prompt D0
26 book(_e["npmDplus_pmDplus"], 8, 1, 1); // ratio between non-prompt D+ and prompt D+
27 book(_e["npmDS_pmDS"], 9, 1, 1); // ratio between non-prompt DS+ and prompt DS+
28 book(_e["pmDplus_pmD0"], 10, 1, 1); // ratio between prompt D+ and prompt D0
29 book(_e["npmDplus_npmD0"], 11, 1, 1); // ratio between non-prompt D+ and non-prompt D0
30 book(_e["pmDS_pmDplusD0sum"], 12, 1, 1); // ratio between prompt DS+ and sum of prompt D0 and prompt D+
31 book(_e["npmDS_npmDplusD0sum"], 13, 1, 1); // ratio between non-prompt DS+ and sum of non-prompt D0 and non-prompt D+
32
33 book(_h["pmDplusD0sum"], "TMP/_pmDplusD0sum", refData(12,1,1));
34 book(_h["npmDplusD0sum"], "TMP/_npmDplusD0sum", refData(13,1,1));
35
36 book(_e_frag["pmDS_pmDpD0"], 14, 1, 1); // c-quark fragmentation-fraction ratio
37 book(_h_frag["pmDS"], "TMP/_fpmDS", refData<YODA::BinnedEstimate<string>>(14,1,1));
38 book(_h_frag["pmDpD0"], "TMP/_fpmDpD0", refData<YODA::BinnedEstimate<string>>(14,1,1));
39
40 book(_e_frag["npmDS_npmDpD0"], 15, 1, 1); // b-quark fragmentation-fraction ratio
41 book(_h_frag["npmDS"], "TMP/_npmDS", refData<YODA::BinnedEstimate<string>>(15,1,1));
42 book(_h_frag["npmDpD0"], "TMP/_npmDpD0", refData<YODA::BinnedEstimate<string>>(15,1,1));
43
44 }
45
46 void analyze(const Event& event) {
47
48 const UnstableParticles& fs = apply<UnstableParticles>(event, "fs");
49
50 for (const Particle& p : fs.particles()) {
51 if (p.fromBottom()) {
52 if (p.abspid() == PID::D0) {
53 _h["npmD0"]->fill(p.pT()/GeV);
54 _h["npmDplusD0sum"]->fill(p.pT()/GeV);
55 if (p.pT() >= 2*GeV) _h_frag["npmDpD0"]->fill("PP --> D (Q=NON-PROMPT) + X"s);
56 }
57 else if (p.abspid() == PID::DPLUS) {
58 _h["npmDplus"]->fill(p.pT()/GeV);
59 _h["npmDplusD0sum"]->fill(p.pT()/GeV);
60 if (p.pT() >= 2*GeV) _h_frag["npmDpD0"]->fill("PP --> D (Q=NON-PROMPT) + X"s);
61 }
62 else if (p.abspid() == PID::DSPLUS) {
63 _h["npmDS"]->fill(p.pT()/GeV);
64 if (p.pT() >= 2*GeV) _h_frag["npmDS"]->fill("PP --> D (Q=NON-PROMPT) + X"s);
65 }
66 }
67 else {
68 if (p.abspid() == PID::D0) {
69 _h["pmD0"]->fill(p.pT()/GeV);
70 _h["pmDplusD0sum"]->fill(p.pT()/GeV);
71 if (p.pT() >= 1*GeV) _h_frag["pmDpD0"]->fill("PP --> D (Q=PROMPT) + X"s);
72 }
73 else if (p.abspid() == PID::DPLUS) {
74 _h["pmDplus"]->fill(p.pT()/GeV);
75 _h["pmDplusD0sum"]->fill(p.pT()/GeV);
76 if (p.pT() >= 1*GeV) _h_frag["pmDpD0"]->fill("PP --> D (Q=PROMPT) + X"s);
77 }
78 else if (p.abspid() == PID::DSPLUS) {
79 _h["pmDS"]->fill(p.pT()/GeV);
80 if (p.pT() >= 1*GeV) _h_frag["pmDS"]->fill("PP --> D (Q=PROMPT) + X"s);
81 }
82 }
83 }
84 }
85
86 void finalize() {
87
88 const double sf = crossSection() / (microbarn*2*sumOfWeights());
89 scale(_h, sf);
90 scale(_h_frag, 0.5*sf);
91
92 for (auto& item : _e) {
93 size_t delim = item.first.find("_");
94 YODA::Histo1D num = *_h[item.first.substr(0, delim)];
95 if (!item.second->binning().isCompatible(num.binning())) {
96 num = num.clone();
97 num.rebinXTo(item.second->xEdges());
98 }
99 YODA::Histo1D den = *_h[item.first.substr(delim+1)];
100 if (!item.second->binning().isCompatible(den.binning())) {
101 den = den.clone();
102 den.rebinXTo(item.second->xEdges());
103 }
104 divide(num, den, item.second);
105 }
106
107 for (auto& item : _e_frag) {
108 size_t delim = item.first.find("_");
109 divide(_h_frag[item.first.substr(0, delim)],
110 _h_frag[item.first.substr(delim+1)],
111 item.second);
112 }
113 }
114
115 private:
116
117 map<string, Histo1DPtr> _h;
118 map<string, BinnedHistoPtr<string>> _h_frag;
119
120 map<string, Estimate1DPtr> _e;
121 map<string, BinnedEstimatePtr<string>> _e_frag;
122
123 };
124
125 RIVET_DECLARE_PLUGIN(ALICE_2021_I1848990);
126
127}
|