Rivet analyses

η, η and ϕ rates and spectra in D0, D+ and Ds+ decays

Experiment: CLEOC (CESR)

Inspire ID: 728043

Status: VALIDATED

Authors: - Peter Richardson

References: - Phys.Rev. D74 (2006) 112005

Beams: e+ e-

Beam energies: (1.9, 1.9); (2.1, 2.1)GeV

Run details: - e+e- to hadrons via Psi(3770) for D0,D+ or at 4.17 GeV for D_s

Measurement of the inclusive branching ratios for η, η and ϕ production in D0, D+ and Ds+ decays. In addition the spectra for η and ϕ production are also measured, in the CMS frame of the collision. N.B. The spetral information was really intended as part of the analysis to measure the inclusive branching ratios, not as a measurement, and therefore shoud be used with care. However there are few distrubtions available for D decays and therefore the spectra are still useful.

Source code:CLEOC_2006_I728043.cc

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

namespace Rivet {


  /// @brief eta, eta' and phi in D0, D+, Ds decays
  class CLEOC_2006_I728043 : public Analysis {
  public:

    /// Constructor
    RIVET_DEFAULT_ANALYSIS_CTOR(CLEOC_2006_I728043);


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

    /// Book histograms and initialise projections before the run
    void init() {
      // projection
      declare(UnstableParticles(),"UFS");
      // histograms
      for (double eVal : allowedEnergies()) {
        const string en = toString(round(eVal/MeV));
        if (isCompatibleWithSqrtS(eVal, 1e-3))  _sqs = en;
        size_t imin = 0, imax = 2;
        if (en == "4170"s) {
          imin = 2, imax = 3;
        }
        for (size_t ix=imin; ix<imax; ++ix) {
          const string id = toString(ix);
          book(_n[id], "TMP/n_D_"+id);
          book(_c["eta"+id], 1,1,ix+1);
          book(_c["etaPrime"+id], 2,1,ix+1);
          book(_c["phi"+id], 3,1,ix+1);
          book(_h["eta"+id], 4,1,ix+1);
          book(_h["phi"+id], 5,1,ix+1);
        }
      }
      raiseBeamErrorIf(_sqs.empty());
    }

    void fillHistos(const Particle& Dmeson, const LorentzTransform& boost) {
      Particles ssbar;
      unsigned int iMeson=0;
      if (Dmeson.abspid()==421)      iMeson = 1;
      else if (Dmeson.abspid()==431) iMeson = 2;
      string id = toString(iMeson);
      _n[id]->fill();
      findDecayProducts(Dmeson,ssbar);
      for (const Particle& dec : ssbar) {
        FourMomentum p = boost.transform(dec.mom());
        double mom=p.p3().mod();
        if (dec.pid()==221) {
          _c["eta"+id]->fill();
          _h["eta"+id]->fill(mom);
        }
        else if (dec.pid()==331) {
          _c["etaPrime"+id]->fill();
        }
        else {
          _c["phi"+id]->fill();
          _h["phi"+id] ->fill(mom);
        }
      }
    }

    void findDecayProducts(const Particle& mother, Particles& ssbar) const {
      for (const Particle& p : mother.children()) {
        int id = p.pid();
        if (id==221 || id==331 || id==333) {
          ssbar.push_back(p);
          findDecayProducts(p,ssbar);
        }
        else if ( !p.children().empty() ) {
          findDecayProducts(p,ssbar);
        }
      }
    }

    /// Perform the per-event analysis
    void analyze(const Event& event) {
      // find psi(3770)
      const UnstableParticles& ufs = apply<UnstableParticles>(event, "UFS");
      Particles psi = ufs.particles(Cuts::pid==30443);
      // D_s
      if (psi.empty()) {
        LorentzTransform boost;
        for (const Particle& Dmeson : apply<UnstableParticles>("UFS",event).particles(Cuts::abspid==431)) {
          fillHistos(Dmeson,boost);
        }
      }
      // D0 D+
      else {
        for (const Particle& p : psi) {
          // boost to rest frame
          LorentzTransform boost;
          if (p.p3().mod() > 1*MeV) {
            boost = LorentzTransform::mkFrameTransformFromBeta(p.momentum().betaVec());
          }
          // loop over D0 and D+ children
          for (const Particle& Dmeson : p.children()) {
            if (Dmeson.abspid() != 411 && Dmeson.abspid() != 421) continue;
            fillHistos(Dmeson,boost);
          }
        }
      }
    }


    /// Normalise histograms etc., after the run
    void finalize() {
      for (const auto& item : _n) {
        if (item.second->effNumEntries() <= 0.)  continue;
        const double sf = 100./ item.second->sumW();
        scale(_c["eta"+item.first], sf);
        scale(_c["etaPrime"+item.first], sf);
        scale(_c["phi"+item.first], sf);
        scale(_h["eta"+item.first], sf);
        scale(_h["phi"+item.first], sf);
      }
    }

    /// @}


    /// @name Histograms
    /// @{
    map<string,CounterPtr> _c, _n;
    map<string,Histo1DPtr> _h;

    string _sqs = "";
    /// @}


  };


  RIVET_DECLARE_PLUGIN(CLEOC_2006_I728043);

}