Rivet analyses

Measurement of D-meson production at mid-rapidity in pp collisions at $\sqrt{s}=7$ TeV

Experiment: ALICE (LHC)

Inspire ID: 1511870

Status: VALIDATED

Authors: - Marco Giacalone

References: - DOI:10.1140/epjc/s10052-017-5090-4 - arXiv: 1702.00766

Beams: p+ p+

Beam energies: (3500.0, 3500.0)GeV

Run details: - Minimum bias events

CERN-LHC. The production cross sections of the prompt charmed mesons D0, D+, D*+ and Ds were measured at mid-rapidity in proton-proton collisions at a centre-of-mass energy $\sqrt{s_{NN}}=7$ TeV with the ALICE detector at the Large Hadron Collider (LHC). D mesons were reconstructed from their decays D0 → Kπ, D+ → Kππ, D*+ → D0π → Kππ, $D_s KK$, and their charge conjugates. With respect to previous measurements in the same rapidity region, the coverage in transverse momentum pt is extended and the uncertainties are reduced by a factor of about two. The accuracy on the estimated total c-cbar production cross section is likewise improved. The measured pT-differential cross sections are compared with the results of three perturbative QCD calculations.

Source code:ALICE_2017_I1511870.cc

// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/UnstableParticles.hh"

namespace Rivet {


  /// @brief Add a short analysis description here
  class ALICE_2017_I1511870 : public Analysis {
  public:

    /// Constructor
    RIVET_DEFAULT_ANALYSIS_CTOR(ALICE_2017_I1511870);


    /// @name Analysis methods
    /// @{

    /// Book histograms and initialise projections before the run
    void init() {

      // Initialise and register projections
      declare(UnstableParticles(), "UFS");

      // Book histograms
      book(_h_D0, 1, 1, 1);        // production cross section of D0 meson
      book(_h_Dplus, 2, 1, 1);     // production cross section of Dplus meson
      book(_h_Dstar, 3, 1, 1);     // production cross section of Dstar meson
      book(_h_Ds, 4, 1, 1);        // production cross section of Ds meson
      book(_h_DplusonD0, 5, 1, 1); // ratio of production cross section between Dplus and D0
      book(_h_DstaronD0, 6, 1, 1); // ratio of production cross section between Dstar and D0
      book(_h_DsonD0, 7, 1, 1);    // ratio of production cross section between Ds and D0
      book(_h_DsonDplus, 8, 1, 1); // ratio of production cross section between Ds and Dplus
      book(_h_D0int, 9, 1, 1);     // pt-integrated production cross section of D0 meson
      book(_h_Dplusint, 10, 1, 1); // pt-integrated production cross section of Dplus meson
      book(_h_Dstarint, 11, 1, 1); // pt-integrated production cross section of Dstar meson
      book(_h_Dsint, 12, 1, 1);    // pt-integrated production cross section of Ds meson
      book(_h_cc, 13, 1, 1);       // integrated cross section of ccbar
      book(_h_ptd0, 14, 1, 1);     // mean pt of prompt D0
      book(_h_D0full, 15, 1, 1);   // integrated cross section for D0 in full rapidity
      book(_h_ccfull, 16, 1, 1);   // integrated cross section for ccbar in full rapidity
      book(
          _h_wei,
          "_h_wei"); // Counter used to calculate D0 mean pt (necessary to store an integer number for event normalisation, i.e. to still be able to compute <pT> from multiple parallel MC jobs)
      book(_h_D0dummy, "TMP/_h_D0dummy", refData(5, 1, 1));       // used to make DplusonD0
      book(_h_D0dummy1, "TMP/_h_D0dummy1", refData(7, 1, 1));     // used to make DsonD0
      book(_h_Dplusdummy, "TMP/_h_Dplusdummy", refData(8, 1, 1)); // used to make DsonDplus
    }


    /// Perform the per-event analysis
    /*PDG code IDs used inside the foreach cycle: 421 = D0, 411 = D+, 413 = D*+, 431 = Ds+ */
    void analyze(const Event& event) {
      const UnstableParticles& ufs = apply<UnstableParticles>(event, "UFS");

      for (const Particle& p : ufs.particles()) {
        if (p.abspid() == 421) {
          if (not p.fromBottom()) {
            _h_D0full->fill(7.000000e+03 / GeV);
            _h_ccfull->fill(7.000000e+03 / GeV);
          }
        }
        if (p.absrap() < 0.5) {
          if (p.fromBottom())
            continue;
          else {
            if (p.abspid() == 421) {
              _h_D0->fill(p.pT() / GeV);
              _h_D0dummy->fill(p.pT() / GeV);
              _h_D0dummy1->fill(p.pT() / GeV);
              _h_D0int->fill(7.000000e+03 / GeV);
              _h_cc->fill(7.000000e+03 / GeV);
              _h_ptd0->fill(7.000000e+03 / GeV, p.pT() / GeV);
              _h_wei->fill();
            }
            else if (p.abspid() == 411) {
              _h_Dplus->fill(p.pT() / GeV);
              _h_Dplusdummy->fill(p.pT() / GeV);
              _h_Dplusint->fill(7.000000e+03 / GeV);
            }
            else if (p.abspid() == 413) {
              _h_Dstar->fill(p.pT() / GeV);
              _h_Dstarint->fill(7.000000e+03 / GeV);
            }
            else if (p.abspid() == 431) {
              _h_Ds->fill(p.pT() / GeV);
              _h_Dsint->fill(7.000000e+03 / GeV);
            }
          }
        }
      }
    }

    /// Normalise histograms etc., after the run
    void finalize() {

      //normalize(_h_YYYY); // normalize to unity
      //all the histograms are divided by 2 since at this point the results consider both particles and antiparticles
      scale(_h_D0, crossSection() / (microbarn * 2 * sumOfWeights()));         // norm to cross section
      scale(_h_Dplus, crossSection() / (microbarn * 2 * sumOfWeights()));      // norm to cross section
      scale(_h_Dstar, crossSection() / (microbarn * 2 * sumOfWeights()));      // norm to cross section
      scale(_h_Ds, crossSection() / (microbarn * 2 * sumOfWeights()));         // norm to cross section
      scale(_h_D0dummy, crossSection() / (microbarn * 2 * sumOfWeights()));    // norm to cross section
      scale(_h_D0dummy1, crossSection() / (microbarn * 2 * sumOfWeights()));   // norm to cross section
      scale(_h_Dplusdummy, crossSection() / (microbarn * 2 * sumOfWeights())); // norm to cross section

      divide(_h_Dplus, _h_D0dummy, _h_DplusonD0); //ratio plots
      divide(_h_Dstar, _h_D0dummy, _h_DstaronD0);
      divide(_h_Ds, _h_D0dummy1, _h_DsonD0);
      divide(_h_Ds, _h_Dplusdummy, _h_DsonDplus);

      scale(_h_D0int, crossSection() / (microbarn * 2 * sumOfWeights()));    // norm to cross section
      scale(_h_Dplusint, crossSection() / (microbarn * 2 * sumOfWeights())); // norm to cross section
      scale(_h_Dstarint, crossSection() / (microbarn * 2 * sumOfWeights())); // norm to cross section
      scale(_h_Dsint, crossSection() / (microbarn * 2 * sumOfWeights()));    // norm to cross section

      scale(_h_cc, 1.034 * crossSection() / (microbarn * 2 * sumOfWeights() * 0.542));
      // 0.542 accounts for the fraction of charm quarks hadronizing into D0 mesons, the ALICE uncertainty on such a factor (0.542 ± 0.024) is not propagated here.
      // 1.034 is used to include the correction of the different shapes of the rapidity distributions of D0 and ccbar, the ALICE uncertainty on such a factor (1.034 ± 0.015, i.e. 1.5 percentage point of uncertainty) is not propagated here.

      if (_h_wei->effNumEntries() != 0.)
        scale(_h_ptd0, 1 / _h_wei->val()); //scaled for the number of events used to calculate the mean pT

      scale(_h_D0full, crossSection() / (millibarn * 2 * sumOfWeights()));
      // NOTE : for the ALICE data, the y extrapolation from |y|<0.5 to full-y phase space is done with an FONLL-based factor (8.56 +2.51 -0.42). Here in MC we simply use direct MC outcome over full y.

      scale(_h_ccfull, 1.034 * crossSection() / (millibarn * 2 * sumOfWeights() * 0.542));
      // 0.542 accounts for the fraction of charm quarks hadronizing into D0 mesons, the ALICE uncertainty on such a factor (0.542 ± 0.024) is not propagated here.
      // 1.034 is used to include the correction of the different shapes of the rapidity distributions of D0 and ccbar, the ALICE uncertainty on such a factor (1.034 ± 0.016, i.e. 1.5 percentage point of uncertainty) is not propagated here.
    }

    /// @}


    /// @name Histograms
    /// @{
    CounterPtr _h_wei;
    Histo1DPtr _h_D0, _h_Dplus, _h_Dstar, _h_Ds, _h_D0dummy, _h_D0dummy1, _h_Dplusdummy;
    BinnedHistoPtr<int> _h_D0int, _h_Dplusint, _h_Dstarint, _h_Dsint, _h_cc, _h_D0full, _h_ccfull, _h_ptd0;
    Estimate1DPtr _h_DplusonD0, _h_DstaronD0, _h_DsonD0, _h_DsonDplus;
    /// @}
  };


  RIVET_DECLARE_PLUGIN(ALICE_2017_I1511870);

}