Rivet analyses

Invariant-mass and fractional-energy dependence of inclusive production of di-hadrons at $\sqrt{s}=10.58$ GeV

Experiment: BELLE (KEKB)

Inspire ID: 1607562

Status: VALIDATED

Authors: - Peter Richardson

References: - Phys.Rev. D96 (2017) no.3, 032005

Beams: e+ e-

Beam energies: (5.3, 5.3)GeV

Run details: - e+e- to hadrons

Measurement of the double differential cross section for the production of hadron pairs by BELLE

Source code:BELLE_2017_I1607562.cc

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

namespace Rivet {


  /// @brief BELLE double differential cross section
  class BELLE_2017_I1607562 : public Analysis {
  public:

    /// Constructor
    RIVET_DEFAULT_ANALYSIS_CTOR(BELLE_2017_I1607562);


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

    /// Book histograms and initialise projections before the run
    void init() {
      // projections
      FinalState fs;
      declare(fs, "FS");
      declare(Thrust(fs), "Thrust");
      // histograms
      const vector<double> bins{0.20, 0.25, 0.30, 0.35, 0.40, 0.45, 0.50, 0.55, 0.60,
                                0.65, 0.70, 0.75, 0.80, 0.85, 0.90, 0.95, 1.00};
      for (size_t ip = 0; ip < 6; ++ip) {
        book(_h_all[ip], bins);
        book(_h_strong[ip], bins);
        for (size_t iy = 1; iy < _h_all[ip]->numBins() + 1; ++iy) {
          book(_h_all[ip]->bin(iy), 1, ip + 1, iy);
          book(_h_strong[ip]->bin(iy), 2, ip + 1, iy);
        }
      }
    }

    bool isWeak(const Particle& p) {
      bool weak = false;
      if (p.parents().empty()) return weak;
      Particle parent = p.parents()[0];
      while (!parent.parents().empty()) {
        if (parent.abspid() == 411 || parent.abspid() == 421 || parent.abspid() == 431
            || parent.abspid() == 4122 || parent.abspid() == 4232 || parent.abspid() == 4132
            || parent.abspid() == 4332) {
          weak = true;
          break;
        }
        parent = parent.parents()[0];
      }
      return weak;
    }

    /// Perform the per-event analysis
    void analyze(const Event& event) {
      // get thrust and apply cut
      const Thrust thrust = apply<Thrust>(event, "Thrust");
      if (thrust.thrust() < 0.8) vetoEvent;
      // get thrust axis
      Vector3 axis = thrust.thrustAxis();
      Particles charged = apply<FinalState>(event, "FS")
                              .particles(Cuts::abspid == PID::KPLUS or Cuts::abspid == PID::PIPLUS);
      for (unsigned int ix = 0; ix < charged.size(); ++ix) {
        double dot1 = axis.dot(charged[ix].momentum().p3());
        bool weak1 = isWeak(charged[ix]);
        if (2. * charged[ix].momentum().t() / sqrtS() < 0.1) continue;
        for (unsigned int iy = ix + 1; iy < charged.size(); ++iy) {
          if (2. * charged[iy].momentum().t() / sqrtS() < 0.1) continue;
          double dot2 = axis.dot(charged[iy].momentum().p3());
          bool weak2 = isWeak(charged[iy]);
          if (dot1 * dot2 < 0.) continue;
          FourMomentum p = charged[ix].momentum() + charged[iy].momentum();
          double z12 = 2. * p.t() / sqrtS();
          double m12 = p.mass();
          bool strong = !weak1 && !weak2;
          if (charged[ix].pid() == PID::PIPLUS) {
            if (charged[iy].pid() == PID::PIPLUS) {
              _h_all[1]->fill(z12, m12);
              if (strong) _h_strong[1]->fill(z12, m12);
            }
            else if (charged[iy].pid() == PID::PIMINUS) {
              _h_all[0]->fill(z12, m12);
              if (strong) _h_strong[0]->fill(z12, m12);
            }
            else if (charged[iy].pid() == PID::KPLUS) {
              _h_all[3]->fill(z12, m12);
              if (strong) _h_strong[3]->fill(z12, m12);
            }
            else if (charged[iy].pid() == PID::KMINUS) {
              _h_all[2]->fill(z12, m12);
              if (strong) _h_strong[2]->fill(z12, m12);
            }
          }
          else if (charged[ix].pid() == PID::PIMINUS) {
            if (charged[iy].pid() == PID::PIPLUS) {
              _h_all[0]->fill(z12, m12);
              if (strong) _h_strong[0]->fill(z12, m12);
            }
            else if (charged[iy].pid() == PID::PIMINUS) {
              _h_all[1]->fill(z12, m12);
              if (strong) _h_strong[1]->fill(z12, m12);
            }
            else if (charged[iy].pid() == PID::KPLUS) {
              _h_all[2]->fill(z12, m12);
              if (strong) _h_strong[2]->fill(z12, m12);
            }
            else if (charged[iy].pid() == PID::KMINUS) {
              _h_all[3]->fill(z12, m12);
              if (strong) _h_strong[3]->fill(z12, m12);
            }
          }
          else if (charged[ix].pid() == PID::KPLUS) {
            if (charged[iy].pid() == PID::PIPLUS) {
              _h_all[3]->fill(z12, m12);
              if (strong) _h_strong[3]->fill(z12, m12);
            }
            else if (charged[iy].pid() == PID::PIMINUS) {
              _h_all[2]->fill(z12, m12);
              if (strong) _h_strong[2]->fill(z12, m12);
            }
            else if (charged[iy].pid() == PID::KPLUS) {
              _h_all[5]->fill(z12, m12);
              if (strong) _h_strong[5]->fill(z12, m12);
            }
            else if (charged[iy].pid() == PID::KMINUS) {
              _h_all[4]->fill(z12, m12);
              if (strong) _h_strong[4]->fill(z12, m12);
            }
          }
          else if (charged[ix].pid() == PID::KMINUS) {
            if (charged[iy].pid() == PID::PIPLUS) {
              _h_all[2]->fill(z12, m12);
              if (strong) _h_strong[2]->fill(z12, m12);
            }
            else if (charged[iy].pid() == PID::PIMINUS) {
              _h_all[3]->fill(z12, m12);
              if (strong) _h_strong[3]->fill(z12, m12);
            }
            else if (charged[iy].pid() == PID::KPLUS) {
              _h_all[4]->fill(z12, m12);
              if (strong) _h_strong[4]->fill(z12, m12);
            }
            else if (charged[iy].pid() == PID::KMINUS) {
              _h_all[5]->fill(z12, m12);
              if (strong) _h_strong[5]->fill(z12, m12);
            }
          }
        }
      }
    }


    /// Normalise histograms etc., after the run
    void finalize() {
      // now need width as well
      double fact = crossSection() / nanobarn / sumOfWeights() / 0.05;
      scale(_h_all, fact);
      scale(_h_strong, fact);
    }

    /// @}


    /// @name Histograms
    /// @{
    Histo1DGroupPtr _h_all[6], _h_strong[6];
    /// @}
  };


  RIVET_DECLARE_PLUGIN(BELLE_2017_I1607562);

}