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);

}