Rivet analyses

LHCb differential cross section measurement of prompt KS0 production in three rapidity windows at $\sqrt{s} = 0.9$ TeV

Experiment: LHCB (LHC 900 GeV)

Inspire ID: 865584

Status: VALIDATED

Authors: - Holger Schulz - Alex Grecu

References: - Phys.Lett.B693:69-80,2010 - arXiv: 1008.3105

Beams: p+ p+

Beam energies: (450.0, 450.0)GeV

Run details: - QCD events. See paper for MC discussion.

The paper presents the cross-section and double differential cross-section measurement for prompt KS0 production in pp collisions at $\sqrt{s} = 0.9~TeV$. The data were taken during the LHCb run in December 2009 and cover a transversal momentum range from 0 to 1.6 GeV/c. The differential production cross-section is calculated for three rapidity windows 2.5 < y < 3.0, 3.0 < y < 3.5 and 3.5 < y < 4.0 as well as the whole rapidity domain 2.5 < y < 4.0.

Source code:LHCB_2010_I865584.cc

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

namespace Rivet {


  class LHCB_2010_I865584 : public Analysis {
  public:

    const double MIN_PT = 0.0001; // [GeV/c]


    /// Constructor
    LHCB_2010_I865584()
        : Analysis("LHCB_2010_I865584"),
          _mode(0),
          sumKs0_all(0),
          sumKs0_outup(0),
          sumKs0_outdwn(0),
          sum_low_pt_loss(0),
          sum_high_pt_loss(0) { }


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

    /// Book histograms and initialise projections before the run
    void init() {
      // only interested in Ks0 particles
      declare(UnstableParticles(Cuts::pid == 310), "UFS");

      if (getOption("DropPlots") == "SIG") _mode = 1;
      if (getOption("DropPlots") == "D2SIG") _mode = 2;

      if ((_mode & 1) == 0) { //SIG
        book(_h_K0s_pt_30, 1, 1, 1);
        book(_h_K0s_pt_35, 1, 1, 2);
        book(_h_K0s_pt_40, 1, 1, 3);
      };

      if ((_mode & 2) == 0) { //D2SIG
        book(_h_K0s_pt_y_30, 2, 1, 1);
        book(_h_K0s_pt_y_35, 2, 1, 2);
        book(_h_K0s_pt_y_40, 2, 1, 3);
      };

      book(_h_K0s_pt_y_all, 3, 1, 1);

      book(sumKs0_30, "TMP/sumKs0_30");
      book(sumKs0_35, "TMP/sumKs0_35");
      book(sumKs0_40, "TMP/sumKs0_40");
    }


    /// Perform the per-event analysis
    void analyze(const Event& event) {
      const UnstableParticles& ufs = apply<UnstableParticles>(event, "UFS");

      // safe to do this as container has only Ks0
      sumKs0_all += ufs.particles().size();

      for (const Particle& p : ufs.particles()) {

        double y = p.absrapidity(); // symmetric LHCb (factor 1/2 in finalize!)
        double pT = p.pT();

        if (pT < MIN_PT) {
          sum_low_pt_loss++; // just for debug since no inferior limit on pT
          MSG_DEBUG("Small pT K^0_S: " << pT << " GeV/c.");
        }
        if (pT > 1.6) {
          sum_high_pt_loss++;
          continue; // no need to flow overflow bin
        }
        if ((y > 2.5) && (y < 4.0)) {
          _h_K0s_pt_y_all->fill(pT);
          if ((y > 2.5) && (y < 3.0)) {
            if ((_mode & 2) == 0) _h_K0s_pt_y_30->fill(pT);
            if ((_mode & 1) == 0) _h_K0s_pt_30->fill(pT);
            sumKs0_30->fill();
          }
          else if ((y > 3.0) && (y < 3.5)) {
            if ((_mode & 2) == 0) _h_K0s_pt_y_35->fill(pT);
            if ((_mode & 1) == 0) _h_K0s_pt_35->fill(pT);
            sumKs0_35->fill();
          }
          else if ((y > 3.5) && (y < 4.0)) {
            if ((_mode & 2) == 0) _h_K0s_pt_y_40->fill(pT);
            if ((_mode & 1) == 0) _h_K0s_pt_40->fill(pT);
            sumKs0_40->fill();
          }
        }
        else if (y < 2.5) {
          sumKs0_outdwn++;
        }
        else if (y > 4.0) {
          sumKs0_outup++;
        }
      }
    }


    /// Normalise histograms etc., after the run
    void finalize() {
      MSG_DEBUG(
          "Total number Ks0: " << sumKs0_all << endl
                               << "Sum of weights: " << sumOfWeights() << endl
                               << "Weight Ks0 (2.5 < y < 3.0): " << sumKs0_30->sumW() << endl
                               << "Weight Ks0 (3.0 < y < 3.5): " << sumKs0_35->sumW() << endl
                               << "Weight Ks0 (3.5 < y < 4.0): " << sumKs0_40->sumW() << endl
                               << "Nb. Ks0 (y > 4.0): " << sumKs0_outup << endl
                               << "Nb. Ks0 (y < 2.5): " << sumKs0_outdwn << endl
                               << "Nb. Ks0 (pT < " << (MIN_PT / MeV) << " MeV/c): " << sum_low_pt_loss << endl
                               << "Nb. Ks0 (pT > 1.6 GeV/c): " << sum_high_pt_loss << endl
                               << "Cross-section [mb]: " << crossSection() / picobarn / millibarn << endl
                               << "Nb. events: " << numEvents());
      // Compute cross-section; multiply by bin width for correct scaling
      // cross-section given by Rivet in pb (symmetric LHCb!)
      double xsection_factor = 0.5 * crossSection() / picobarn / sumOfWeights();
      // Divide by bin area for consistent scaling, xsection in mub
      scale(_h_K0s_pt_30, 0.1 * xsection_factor / microbarn);
      scale(_h_K0s_pt_35, 0.1 * xsection_factor / microbarn);
      scale(_h_K0s_pt_40, 0.1 * xsection_factor / microbarn);
      // Already divided by dy (rapidity window width), xsection in mb
      scale(_h_K0s_pt_y_30, xsection_factor / millibarn);
      scale(_h_K0s_pt_y_35, xsection_factor / millibarn);
      scale(_h_K0s_pt_y_40, xsection_factor / millibarn);
      // factorize to phase-space volume (area)
      scale(_h_K0s_pt_y_all, xsection_factor / 1.5 / 1.6 / millibarn);
    }

    /// @}


    /// Mode switch
    size_t _mode;

    /// @name Histograms
    /// @{
    Histo1DPtr _h_K0s_pt_y_30;  // histogram for 2.5 < y < 3.0 (d2sigma)
    Histo1DPtr _h_K0s_pt_y_35;  // histogram for 3.0 < y < 3.5 (d2sigma)
    Histo1DPtr _h_K0s_pt_y_40;  // histogram for 3.5 < y < 4.0 (d2sigma)
    Histo1DPtr _h_K0s_pt_30;    // histogram for 2.5 < y < 3.0 (sigma)
    Histo1DPtr _h_K0s_pt_35;    // histogram for 3.0 < y < 3.5 (sigma)
    Histo1DPtr _h_K0s_pt_40;    // histogram for 3.5 < y < 4.0 (sigma)
    Histo1DPtr _h_K0s_pt_y_all; // histogram for 2.5 < y < 4.0 (d2sigma)
    CounterPtr sumKs0_30;       // Sum of weights 2.5 < y < 3.0
    CounterPtr sumKs0_35;       // Sum of weights 3.0 < y < 3.5
    CounterPtr sumKs0_40;       // Sum of weights 3.5 < y < 4.0
    // Various counters mainly for debugging and comparisons between different generators
    size_t sumKs0_all;       // Nb of all Ks0 generated
    size_t sumKs0_outup;     // Nb of mesons with y > 4.0
    size_t sumKs0_outdwn;    // Nb of mesons with y < 2.5
    size_t sum_low_pt_loss;  // Nb of mesons with very low pT (indicates when units are mixed-up)
    size_t sum_high_pt_loss; // Nb of mesons with pT > 1.6 GeV/c
    /// @}
  };


  RIVET_DECLARE_ALIASED_PLUGIN(LHCB_2010_I865584, LHCB_2010_S8758301);

}

Aliases: - LHCB_2010_S8758301