Rivet analyses

Polarization of b-baryons at LEP1

Experiment: OPAL (LEP)

Inspire ID: 474012

Status: VALIDATED

Authors: - Peter Richardson

References: - Phys.Lett. B444 (1998) 539-554

Beams: e- e+

Beam energies: (45.6, 45.6)GeV

Run details: - e+e- > hadrons

Measurement of the polarization of b-baryons, mainly $\Lambda_b$ at LEP1. The result is obtained by measuring the ratio of the neutrino (missing energy) to the charged lepton energy, rather than the more sophisticated fit used in the paper.

Source code:OPAL_1998_I474012.cc

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

namespace Rivet {


  /// @brief b-baryon polarization
  class OPAL_1998_I474012 : public Analysis {
  public:

    /// Constructor
    RIVET_DEFAULT_ANALYSIS_CTOR(OPAL_1998_I474012);


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

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

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

      // Book histograms
      book(_h_El, "El", 45, 0., 45.0);
      book(_h_Ev, "Ev", 45, 0., 45.0);
      book(_h_ratio, "ratio", 20, 0., 10.0);
    }

    void findDecayProducts(Particle p, Particles& lep, Particles& nu) {
      for (const Particle& child : p.children()) {
        if (PID::isHadron(child.pid())) continue;
        if (child.abspid() == 11 or child.abspid() == 13)
          lep.push_back(child);
        else if (child.abspid() == 12 or child.abspid() == 14)
          nu.push_back(child);
        else if (child.abspid() != 15)
          findDecayProducts(child, lep, nu);
      }
    }

    /// Perform the per-event analysis
    void analyze(const Event& event) {
      const FinalState& ufs = apply<UnstableParticles>(event, "UFS");
      // loop over weakly decaying b-baryons
      for (const Particle& p : ufs.particles(Cuts::abspid == 5122)) {
        Particles lep, nu;
        findDecayProducts(p, lep, nu);
        if (lep.size() != 1 || nu.size() != 1) continue;
        _h_El->fill(lep[0].momentum().t());
        _h_Ev->fill(nu[0].momentum().t());
        _h_ratio->fill(nu[0].momentum().t() / lep[0].momentum().t());
      }
    }


    /// Normalise histograms etc., after the run
    void finalize() {
      normalize(_h_El);
      normalize(_h_Ev);
      normalize(_h_ratio);
      if (_h_El->effNumEntries() != 0. and _h_Ev->effNumEntries() != 0.) {
        const double Ev = _h_Ev->xMean();
        const double El = _h_El->xMean();
        const double dEv = _h_Ev->xStdErr();
        const double dEl = _h_El->xStdErr();
        const double ratio = Ev / El;
        const double dr = (El * dEv - Ev * dEl) / sqr(El);
        const double rho = 0.091;
        const double P = 7. - 20. / (2. + ratio) + 10. * rho * ratio * (-4. + 3. * ratio) / sqr(2. + ratio);
        const double dP = (20. * (2. + ratio + rho * (-4. + 8. * ratio))) / pow(2. + ratio, 3) * dr;
        BinnedEstimatePtr<string> h_pol;
        book(h_pol, 1, 1, 1);
        h_pol->bin(1).set(P, dP);
      }
    }

    /// @}


    /// @name Histograms
    /// @{
    Histo1DPtr _h_El, _h_Ev, _h_ratio;
    /// @}
  };


  RIVET_DECLARE_PLUGIN(OPAL_1998_I474012);


}