Rivet analyses

Flavour separated spectra for π±, K±, p,  production in hadronic Z0 decays

Experiment: DELPHI (LEP)

Inspire ID: 473409

Status: VALIDATED

Authors: - Peter Richardson

References: - Nucl.Phys. B444 (1995) 3-26, 1995

Beams: e+ e-

Beam energies: (45.6, 45.6)GeV

Run details: - Hadronic Z decay events generated on the Z pole ($\sqrt{s} = 91.2$ GeV)

DELPHI results for the spectra ^$, K±, p,  production in hadronic Z0 decays. The results are separated in light and bottom quark initiated events.

Source code:DELPHI_1998_I473409.cc

// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/Beam.hh"
#include "Rivet/Projections/ChargedFinalState.hh"
#include "Rivet/Projections/FinalState.hh"

#define I_KNOW_THE_INITIAL_QUARKS_PROJECTION_IS_DODGY_BUT_NEED_TO_USE_IT
#include "Rivet/Projections/InitialQuarks.hh"

namespace Rivet {


  /// @brief flavour seperate pi,K,p spectra
  class DELPHI_1998_I473409 : public Analysis {
  public:

    /// Constructor
    RIVET_DEFAULT_ANALYSIS_CTOR(DELPHI_1998_I473409);


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

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

      // Initialise and register projections
      declare(Beam(), "Beams");
      declare(ChargedFinalState(), "FS");
      declare(InitialQuarks(), "IQF");
      // Book histograms
      book(_h_all_pi, "TMP/h_all_pi", refData(4, 1, 1));
      book(_h_all_K, "TMP/h_all_K ", refData(5, 1, 1));
      book(_h_all_p, "TMP/h_all_p ", refData(6, 1, 1));
      book(_h_all_Kp, "TMP/h_all_Kp", refData(7, 1, 1));
      book(_d_all, "TMP/d_all   ", refData(4, 1, 1));

      book(_h_bot_pi, "TMP/h_bot_pi", refData(8, 1, 1));
      book(_h_bot_K, "TMP/h_bot_K ", refData(9, 1, 1));
      book(_h_bot_p, "TMP/h_bot_p ", refData(10, 1, 1));
      book(_h_bot_Kp, "TMP/h_bot_Kp", refData(11, 1, 1));
      book(_d_bot, "TMP/d_bot   ", refData(8, 1, 1));

      book(_h_lgt_pi, "TMP/h_lgt_pi", refData(12, 1, 1));
      book(_h_lgt_K, "TMP/h_lgt_K ", refData(13, 1, 1));
      book(_h_lgt_p, "TMP/h_lgt_p ", refData(14, 1, 1));
      book(_h_lgt_Kp, "TMP/h_lgt_Kp", refData(15, 1, 1));
      book(_d_lgt, "TMP/d_lgt   ", refData(12, 1, 1));

      book(_h_all_ch_p, 16, 1, 1);
      book(_h_all_ch_x, 17, 1, 1);
      book(_h_all_pi_p, 18, 1, 1);
      book(_h_all_pi_x, 19, 1, 1);
      book(_h_all_K_p, 20, 1, 1);
      book(_h_all_k_x, 21, 1, 1);
      book(_h_all_p_p, 22, 1, 1);
      book(_h_all_p_x, 23, 1, 1);

      book(_h_bot_ch_p, 24, 1, 1);
      book(_h_bot_ch_x, 25, 1, 1);
      book(_h_bot_pi_p, 26, 1, 1);
      book(_h_bot_pi_x, 27, 1, 1);
      book(_h_bot_K_p, 28, 1, 1);
      book(_h_bot_k_x, 29, 1, 1);
      book(_h_bot_p_p, 30, 1, 1);
      book(_h_bot_p_x, 31, 1, 1);

      book(_h_lgt_ch_p, 32, 1, 1);
      book(_h_lgt_ch_x, 33, 1, 1);
      book(_h_lgt_pi_p, 34, 1, 1);
      book(_h_lgt_pi_x, 35, 1, 1);
      book(_h_lgt_K_p, 36, 1, 1);
      book(_h_lgt_k_x, 37, 1, 1);
      book(_h_lgt_p_p, 38, 1, 1);
      book(_h_lgt_p_x, 39, 1, 1);

      for (unsigned int ix = 0; ix < 3; ++ix) {
        for (unsigned int iy = 0; iy < 5; ++iy) {
          book(_mult[ix][iy], ix + 1, 1, iy + 1);
        }
      }
      book(_wLgt, "TMP/wLgt");
      book(_wBot, "TMP/wBot");
      book(_wAll, "TMP/wAll");
    }


    /// Perform the per-event analysis
    void analyze(const Event& event) {

      // First, veto on leptonic events by requiring at least 4 charged FS particles
      const FinalState& fs = apply<ChargedFinalState>(event, "FS");
      const size_t numParticles = fs.particles().size();

      // Even if we only generate hadronic events, we still need a cut on numCharged >= 2.
      if (numParticles < 2) {
        MSG_DEBUG("Failed leptonic event cut");
        vetoEvent;
      }
      MSG_DEBUG("Passed leptonic event cut");


      int flavour = 0;
      const InitialQuarks& iqf = apply<InitialQuarks>(event, "IQF");

      // If we only have two quarks (qqbar), just take the flavour.
      // If we have more than two quarks, look for the highest energetic q-qbar pair.
      if (iqf.particles().size() == 2) {
        flavour = iqf.particles().front().abspid();
      }
      else {
        map<int, double> quarkmap;
        for (const Particle& p : iqf.particles()) {
          if (quarkmap[p.pid()] < p.E()) {
            quarkmap[p.pid()] = p.E();
          }
        }
        double maxenergy = 0.;
        for (int i = 1; i <= 5; ++i) {
          if (quarkmap[i] + quarkmap[-i] > maxenergy) {
            flavour = i;
          }
        }
      }

      // Get event weight for histo filling
      _wAll->fill();
      if (flavour <= 3)
        _wLgt->fill();
      else if (flavour == 5)
        _wBot->fill();

      // Get beams and average beam momentum
      const ParticlePair& beams = apply<Beam>(event, "Beams").beams();
      const double meanBeamMom = (beams.first.p3().mod() + beams.second.p3().mod()) / 2.0;
      MSG_DEBUG("Avg beam momentum = " << meanBeamMom);
      // loop over the charged particles
      for (const Particle& p : fs.particles()) {
        double modp = p.p3().mod();
        double xp = modp / meanBeamMom;
        int id = abs(p.pid());
        _d_all->fill(modp);
        _mult[0][0]->fill(Ecm);
        _h_all_ch_p->fill(modp);
        _h_all_ch_x->fill(xp);
        if (flavour <= 3) {
          _d_lgt->fill(modp);
          _mult[2][0]->fill(Ecm);
          _h_lgt_ch_p->fill(modp);
          _h_lgt_ch_x->fill(xp);
        }
        else if (flavour == 5) {
          _d_bot->fill(modp);
          _mult[1][0]->fill(Ecm);
          _h_bot_ch_p->fill(modp);
          _h_bot_ch_x->fill(xp);
        }
        if (id == 211) {
          _h_all_pi->fill(modp);
          _mult[0][1]->fill(Ecm);
          _h_all_pi_p->fill(modp);
          _h_all_pi_x->fill(xp);
          if (flavour <= 3) {
            _h_lgt_pi->fill(modp);
            _mult[2][1]->fill(Ecm);
            _h_lgt_pi_p->fill(modp);
            _h_lgt_pi_x->fill(xp);
          }
          else if (flavour == 5) {
            _h_bot_pi->fill(modp);
            _mult[1][1]->fill(Ecm);
            _h_bot_pi_p->fill(modp);
            _h_bot_pi_x->fill(xp);
          }
        }
        else if (id == 321) {
          _h_all_K->fill(modp);
          _h_all_Kp->fill(modp);
          _mult[0][2]->fill(Ecm);
          _mult[0][4]->fill(Ecm);
          _h_all_K_p->fill(modp);
          _h_all_k_x->fill(xp);
          if (flavour <= 3) {
            _h_lgt_K->fill(modp);
            _h_lgt_Kp->fill(modp);
            _mult[2][2]->fill(Ecm);
            _mult[2][4]->fill(Ecm);
            _h_lgt_K_p->fill(modp);
            _h_lgt_k_x->fill(xp);
          }
          else if (flavour == 5) {
            _h_bot_K->fill(modp);
            _h_bot_Kp->fill(modp);
            _mult[1][2]->fill(Ecm);
            _mult[1][4]->fill(Ecm);
            _h_bot_K_p->fill(modp);
            _h_bot_k_x->fill(xp);
          }
        }
        else if (id == 2212) {
          _h_all_p->fill(modp);
          _h_all_Kp->fill(modp);
          _mult[0][3]->fill(Ecm);
          _mult[0][4]->fill(Ecm);
          _h_all_p_p->fill(modp);
          _h_all_p_x->fill(xp);
          if (flavour <= 3) {
            _h_lgt_p->fill(modp);
            _h_lgt_Kp->fill(modp);
            _mult[2][3]->fill(Ecm);
            _mult[2][4]->fill(Ecm);
            _h_lgt_p_p->fill(modp);
            _h_lgt_p_x->fill(xp);
          }
          else if (flavour == 5) {
            _h_bot_p->fill(modp);
            _h_bot_Kp->fill(modp);
            _mult[1][3]->fill(Ecm);
            _mult[1][4]->fill(Ecm);
            _h_bot_p_p->fill(modp);
            _h_bot_p_x->fill(xp);
          }
        }
      }
    }


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


      // // Book histograms
      scale(_h_all_pi, 100.);
      scale(_h_all_K, 100.);
      scale(_h_all_p, 100.);
      scale(_h_all_Kp, 100.);
      Estimate1DPtr temp;
      book(temp, 4, 1, 1);
      divide(_h_all_pi, _d_all, temp);
      book(temp, 5, 1, 1);
      divide(_h_all_K, _d_all, temp);
      book(temp, 6, 1, 1);
      divide(_h_all_p, _d_all, temp);
      book(temp, 7, 1, 1);
      divide(_h_all_Kp, _d_all, temp);

      scale(_h_bot_pi, 100.);
      scale(_h_bot_K, 100.);
      scale(_h_bot_p, 100.);
      scale(_h_bot_Kp, 100.);
      book(temp, 8, 1, 1);
      divide(_h_bot_pi, _d_bot, temp);
      book(temp, 9, 1, 1);
      divide(_h_bot_K, _d_bot, temp);
      book(temp, 10, 1, 1);
      divide(_h_bot_p, _d_bot, temp);
      book(temp, 11, 1, 1);
      divide(_h_bot_Kp, _d_bot, temp);

      scale(_h_lgt_pi, 100.);
      scale(_h_lgt_K, 100.);
      scale(_h_lgt_p, 100.);
      scale(_h_lgt_Kp, 100.);
      book(temp, 12, 1, 1);
      divide(_h_lgt_pi, _d_lgt, temp);
      book(temp, 13, 1, 1);
      divide(_h_lgt_K, _d_lgt, temp);
      book(temp, 14, 1, 1);
      divide(_h_lgt_p, _d_lgt, temp);
      book(temp, 15, 1, 1);
      divide(_h_lgt_Kp, _d_lgt, temp);

      scale(_h_all_ch_p, 1. / *_wAll);
      scale(_h_all_ch_x, 1. / *_wAll);
      scale(_h_all_pi_p, 1. / *_wAll);
      scale(_h_all_pi_x, 1. / *_wAll);
      scale(_h_all_K_p, 1. / *_wAll);
      scale(_h_all_k_x, 1. / *_wAll);
      scale(_h_all_p_p, 1. / *_wAll);
      scale(_h_all_p_x, 1. / *_wAll);

      scale(_h_bot_ch_p, 1. / *_wBot);
      scale(_h_bot_ch_x, 1. / *_wBot);
      scale(_h_bot_pi_p, 1. / *_wBot);
      scale(_h_bot_pi_x, 1. / *_wBot);
      scale(_h_bot_K_p, 1. / *_wBot);
      scale(_h_bot_k_x, 1. / *_wBot);
      scale(_h_bot_p_p, 1. / *_wBot);
      scale(_h_bot_p_x, 1. / *_wBot);

      scale(_h_lgt_ch_p, 1. / *_wLgt);
      scale(_h_lgt_ch_x, 1. / *_wLgt);
      scale(_h_lgt_pi_p, 1. / *_wLgt);
      scale(_h_lgt_pi_x, 1. / *_wLgt);
      scale(_h_lgt_K_p, 1. / *_wLgt);
      scale(_h_lgt_k_x, 1. / *_wLgt);
      scale(_h_lgt_p_p, 1. / *_wLgt);
      scale(_h_lgt_p_x, 1. / *_wLgt);

      // multiplicities
      vector<CounterPtr> scales = {_wAll, _wBot, _wLgt};
      for (unsigned int ix = 0; ix < 3; ++ix) {
        if (scales[ix]->effNumEntries() <= 0.) continue;
        scale(_mult[ix], 1. / *scales[ix]);
      }
    }

    /// @}


    /// @name Histograms
    /// @{
    Histo1DPtr _h_all_pi, _h_all_K, _h_all_p, _h_all_Kp, _d_all;
    Histo1DPtr _h_bot_pi, _h_bot_K, _h_bot_p, _h_bot_Kp, _d_bot;
    Histo1DPtr _h_lgt_pi, _h_lgt_K, _h_lgt_p, _h_lgt_Kp, _d_lgt;
    Histo1DPtr _h_all_ch_p, _h_all_ch_x, _h_all_pi_p, _h_all_pi_x;
    Histo1DPtr _h_all_K_p, _h_all_k_x, _h_all_p_p, _h_all_p_x;
    Histo1DPtr _h_bot_ch_p, _h_bot_ch_x, _h_bot_pi_p, _h_bot_pi_x;
    Histo1DPtr _h_bot_K_p, _h_bot_k_x, _h_bot_p_p, _h_bot_p_x;
    Histo1DPtr _h_lgt_ch_p, _h_lgt_ch_x, _h_lgt_pi_p, _h_lgt_pi_x;
    Histo1DPtr _h_lgt_K_p, _h_lgt_k_x, _h_lgt_p_p, _h_lgt_p_x;
    BinnedHistoPtr<string> _mult[3][5];
    const string Ecm = "91.2";

    CounterPtr _wLgt, _wBot, _wAll;
    /// @}
  };


  RIVET_DECLARE_PLUGIN(DELPHI_1998_I473409);


}