Rivet analyses referenceLHCB_2021_I1913240Measurement of the Nuclear Modification Factor and Prompt Charged Particle Production in $p$-Pb and $pp$ Collisions at $\sqrt{s_{NN}} = 5$ TeVExperiment: LHCB (LHC) Inspire ID: 1913240 Status: VALIDATED Authors:
Beam energies: (2510.0, 2510.0); (4000.0, 328000.0) GeV Run details:
The production of prompt charged particles in proton-lead collisions and in proton-proton collisions at the nucleon-nucleon center-of-mass energy $\sqrt{s_{NN}} = 5\,\mathrm{TeV}$ is studied at LHCb as a function of pseudorapidity ($\eta$) and transverse momentum ($p_\mathrm{T}$) with respect to the proton beam direction. The nuclear modification factor for charged particles is determined as a function of $\eta$ between $-4.8 < \eta < -2.5$ (backward region) and $2.0 < \eta < 4.8$ (forward region), and $p_\mathrm{T}$ between $0.2 < p_\mathrm{T} < 8.0\,\mathrm{GeV}/c$. The results show a suppression of charged particle production in proton-lead collisions relative to proton-proton collisions in the forward region and an enhancement in the backward region for $p_\mathrm{T}$ larger than $1.5\,\mathrm{GeV}/c$. This measurement constrains nuclear PDFs and saturation models at previously unexplored values of the parton momentum fraction down to $10^{-6}$. Source code: LHCB_2021_I1913240.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/AliceCommon.hh"
4
5namespace Rivet {
6
7 /// @brief nuclear modification factor and prompt charged particle production in pPb and pp at $\sqrt{s_{NN}} = 5$ TeV
8 class LHCB_2021_I1913240 : public Analysis {
9
10 public:
11 RIVET_DEFAULT_ANALYSIS_CTOR(LHCB_2021_I1913240);
12
13 void init() {
14 // Check collision system of input file
15 const ParticlePair &beam_pair = beams();
16 if (beam_pair.first.pid() == PID::PROTON &&
17 beam_pair.second.pid() == PID::PROTON) {
18 _beamConfig = "pp";
19 }
20 else if (beam_pair.first.pid() == PID::PROTON &&
21 beam_pair.second.pid() == PID::LEAD) {
22 _beamConfig = "pPb";
23 }
24 if (_beamConfig == "" && !merging()) {
25 throw BeamError("Invalid beam configuration for " + name() + "\n");
26 }
27
28 // Link histogram to corresponding table of YODA file from HEPData
29 book(_charged_part_eta_pt_hist[0], {2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 4.8},
30 {"d01-x01-y01", "d01-x01-y02", "d01-x01-y03", "d01-x01-y04", "d01-x01-y05", "d01-x01-y06"});
31 // forward and backward histos for pPb below
32 book(_charged_part_eta_pt_hist[1], {1.6, 2.0, 2.5, 3.0, 3.5, 4.0, 4.3},
33 {"d02-x01-y01", "d02-x01-y02", "d02-x01-y03", "d02-x01-y04", "d02-x01-y05", "d02-x01-y06"});
34 book(_charged_part_eta_pt_hist[2], {-5.2, -4.8, -4.5, -4.0, -3.5, -3.0, -2.5},
35 {"d03-x01-y01", "d03-x01-y02", "d03-x01-y03", "d03-x01-y04", "d03-x01-y05", "d03-x01-y06"});
36
37 // Select primary (i.e. prompt long-lived) charged particles
38 declare(ALICE::PrimaryParticles(
39 (Cuts::absetaIn(1.6, 5.2)) &&
40 (Cuts::abscharge == 1)),
41 "PPs");
42 }
43
44 void analyze(const Event &ev) {
45 // Apply PrimaryParticles projection
46 const Particles prompt_charged_parts = apply<ALICE::PrimaryParticles>(ev, "PPs").particles();
47 for (const Particle &part : prompt_charged_parts) {
48 if (part.momentum().p() < 2 * GeV) continue;
49
50 // Double sample size in symmetric proton-proton case by taking absolute value
51 // and then scale by 0.5 due to LHCb being one-sided
52 double eta;
53 if (_beamConfig == "pp") eta = part.abseta();
54 else eta = part.eta();
55 double pt = part.pT();
56
57 if (_beamConfig == "pp") {
58 _charged_part_eta_pt_hist[0]->fill(eta, pt, 0.5);
59 }
60 else {
61 _charged_part_eta_pt_hist[1]->fill(eta, pt);
62 _charged_part_eta_pt_hist[2]->fill(eta, pt);
63 }
64 }
65 }
66
67 void finalize() {
68 // Compute scale factor with inelastic cross-section from input file and sum of
69 // weights (corresponds to number of events in input file)
70 divByGroupWidth(_charged_part_eta_pt_hist);
71 scale(_charged_part_eta_pt_hist, crossSection() / millibarn / sumOfWeights());
72
73 // if both histo groups have filled bins then compute R_pPb
74 Estimate1DPtr _ratio;
75 for (size_t i = 1; i <= 5; ++i) {
76 book(_ratio, 4, 1, i);
77 YODA::Histo1D numer = _charged_part_eta_pt_hist[1]->bin(i+1)->clone();
78 YODA::Histo1D denom = _charged_part_eta_pt_hist[0]->bin(i)->clone();
79 numer.rebinXTo(_ratio->xEdges());
80 denom.rebinXTo(_ratio->xEdges());
81 divide(numer, denom, _ratio);
82 _ratio->scale(1./208.);
83 book(_ratio, 5, 1, i);
84 numer = _charged_part_eta_pt_hist[2]->bin(i+1)->clone();
85 denom = _charged_part_eta_pt_hist[0]->bin(7-i)->clone();
86 numer.rebinXTo(_ratio->xEdges());
87 denom.rebinXTo(_ratio->xEdges());
88 divide(numer, denom, _ratio);
89 _ratio->scale(1./208.);
90 }
91
92 }
93
94 string _beamConfig = "";
95 Histo1DGroupPtr _charged_part_eta_pt_hist[3];
96 };
97
98 RIVET_DECLARE_PLUGIN(LHCB_2021_I1913240);
99}
|