Rivet analyses

Lepton spectra and moments in B decays

Experiment: CLEOII (CESR)

Inspire ID: 647288

Status: VALIDATED NOHEPDATA

Authors: - Peter Richardson

References: - Phys.Rev.D 70 (2004) 032003

Beams: * *

Beam energies: ANY

Run details: - Bottom mesons produced at the Upsilon(4S)

Measurement of the primary and secondary lepton spetrum in B decays by CLEO, in additon the momentum of the electron energy are measured. The values of the moments were taken from the tables in the paper and the corrected spectra read from the figures.

Source code:CLEOII_2004_I647288.cc

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

namespace Rivet {


  /// @brief B -> e spectrum
  class CLEOII_2004_I647288 : public Analysis {
  public:

    /// Constructor
    RIVET_DEFAULT_ANALYSIS_CTOR(CLEOII_2004_I647288);


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

    /// Book histograms and initialise projections before the run
    void init() {
      // projections
      declare(UnstableParticles(),"UFS");
      // histograms
      for (unsigned int ix=0; ix<2; ++ix) {
        book(_h[ix],2,1,1+ix);
        book(_p[ix],1,1,1+ix);
      }
      book(_h[2],3,1,1);
      book(_c,"TMP/nb");
    }

    void findDecayProducts(const Particle& parent,
               vector<Particles>&  em, vector<Particles>& ep,
               vector<Particles>& nue, vector<Particles>& nueBar,
               bool& charm, bool secondary) {
      for (const Particle& p : parent.children()) {
        if (PID::isCharmHadron(p.pid())) {
          charm=true;
          findDecayProducts(p,em,ep,nue,nueBar,charm,true);
        }
        else if (p.pid() == PID::EMINUS || p.pid()==PID::MUON) {
          em[secondary].push_back(p);
        }
        else if (p.pid() == PID::EPLUS || p.pid()==PID::ANTIMUON) {
          ep[secondary].push_back(p);
        }
        else if (p.pid() == PID::NU_E  || p.pid()==PID::NU_MU) {
          nue[secondary].push_back(p);
        }
        else if (p.pid() == PID::NU_EBAR || p.pid()==PID::NU_MUBAR) {
          nueBar[secondary].push_back(p);
        }
        else if (PID::isBottomHadron(p.pid())) {
          findDecayProducts(p,em,ep,nue,nueBar,charm,false);
        }
        else if (!PID::isHadron(p.pid())) {
          findDecayProducts(p,em,ep,nue,nueBar,charm,secondary);
        }
      }
    }

    /// Perform the per-event analysis
    void analyze(const Event& event) {
      if(_edges.empty()) _edges = _p[0]->xEdges();
      // find and loop over Upslion(4S)
      const UnstableParticles& ufs = apply<UnstableParticles>(event, "UFS");
      for (const Particle& p : ufs.particles(Cuts::pid==300553)) {
        // boost to rest frame
        LorentzTransform cms_boost;
        if (p.p3().mod() > 1*MeV) {
          cms_boost = LorentzTransform::mkFrameTransformFromBeta(p.momentum().betaVec());
        }
        // loop over decay products
        for (const Particle& p2 : p.children()) {
          if (p2.abspid()==511 || p2.abspid()==521) {
            _c->fill();
            // find decay products
            bool charm = false;
            vector<Particles> em(2),ep(2),nue(2),nueBar(2);
            findDecayProducts(p2,em,ep,nue,nueBar,charm,false);
            for (unsigned int isec=0;isec<2;++isec) {
              FourMomentum pl,pnu;
              if (em[isec].size()==1 && nueBar[isec].size()==1 && em[isec][0].pid()+1==-nueBar[isec][0].pid()) {
                pl  = cms_boost.transform(em[isec][0].momentum());
                pnu = cms_boost.transform(nueBar[isec][0].momentum());
              }
              else if (ep[isec].size()==1 && nue[isec].size()==1 && nue[isec][0].pid()==-ep[isec][0].pid()+1) {
                pl  = cms_boost.transform(ep[isec][0].momentum());
                pnu = cms_boost.transform(nue[isec][0].momentum());
              }
              else {
                continue;
              }
              _h[isec]->fill(pl.p3().mod());
              if (charm && isec==0) {
                _h[2]->fill(pl.p3().mod());
                double Emin=0.6;
                for(size_t i=0; i<_p[0]->numBins();++i) {
                  if(pl.E()>Emin) {
                    _p[0]->fill(_edges[i],pl.E());
                    _p[1]->fill(_edges[i],sqr(pl.E()));
                  }
                  Emin+=0.1;
                }
              }
            }
          }
        }
      }
    }


    /// Normalise histograms etc., after the run
    void finalize() {
      // 0.5 from counting e and mu
      scale(_h, 0.5/ *_c);
      // compute <(el^2-<el>^2>
      BinnedEstimatePtr<string> tmp;
      book(tmp,1,1,3);
      for (const auto& b0 : _p[0]->bins()) {
        const auto& b1 = _p[1]->bin(b0.index());
        const double val = b1.yMean()-sqr(b0.yMean());
        const double err = val*sqrt(sqr(b1.relErrW())+4.*sqr(b0.relErrW()));
        tmp->bin(b0.index()).set(val, err);
      }
    }

    /// @}


    /// @name Histograms
    /// @{
    Histo1DPtr _h[3];
    BinnedProfilePtr<string> _p[2];
    CounterPtr _c;
    vector<string> _edges;
    /// @}


  };


  RIVET_DECLARE_PLUGIN(CLEOII_2004_I647288);

}