Rivet analyses


title: CLEOC_2006_I728043

$\eta$, $\eta^\prime$ and $\phi$ rates and spectra in $D^0$, $D^+$ and $D_s^+$ 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 $\eta$, $\eta^\prime$ and $\phi$ production in $D^0$, $D^+$ and $D_s^+$ decays. In addition the spectra for $\eta$ and $\phi$ 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++ // -- 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);

} ```