rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BELLE_2023_I2660525

Cross sections for $e^+e^-\to b\bar{b} \to (D_s^+,D^0)X$ for $\sqrt{s}$ between 10.63 and 11.02 GeV
Experiment: BELLE (KEKB)
Inspire ID: 2660525
Status: VALIDATED NOHEPDATA
Authors:
  • Peter Richardson
References:
  • arxiv:2305.10098 [hep-ex]
Beams: * *
Beam energies: ANY
Run details:
  • Any process producing Upsilon(4,5S) for decays and e+e--> hadrons for the cross sections

The cross sections for $e^+e^-\to b\bar{b} \to (D_s^+,D^0)X$ are measured for $\sqrt{s}$ between 10.63 and 11.02 GeV. The cross sections for $e^+e^-\to b\bar{b} \to B\bar{B}X$ and $e^+e^-\to b\bar{b} \to B_s^0\bar{B}_s^0X$ are then extracted. In addition the $D_s^+$, $D^0$ spectra in $\Upsilon(4,5S)$ decays are measured. There are two modes, one DECAY (the default), for the spectra in the decays and a second SIGMA for the cross sections.

Source code: BELLE_2023_I2660525.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/UnstableParticles.hh"
  4#include "Rivet/Projections/DecayedParticles.hh"
  5
  6namespace Rivet {
  7
  8
  9  /// @brief D_s D0 production in e+e-
 10  class BELLE_2023_I2660525 : public Analysis {
 11  public:
 12
 13    /// Constructor
 14    RIVET_DEFAULT_ANALYSIS_CTOR(BELLE_2023_I2660525);
 15
 16
 17    /// @name Analysis methods
 18    /// @{
 19
 20    /// Book histograms and initialise projections before the run
 21    void init() {
 22
 23      // Initialise and register projections
 24      declare(UnstableParticles(), "UFS");
 25      _mode=0;
 26      if      ( getOption("MODE") == "DECAY" ) _mode=0;
 27      else if ( getOption("MODE") == "SIGMA" ) _mode=1;
 28      // Upsilon decays
 29      if (_mode==0) {
 30        for (unsigned int ix=0;ix<2;++ix) {
 31          book(_c[ix],"TMP/n_Ups_"+toString(ix+4));
 32          book(_h_x [0][ix],3,1,ix+3);
 33          book(_h_x [1][ix],3,1,ix+1);
 34          for (unsigned int iy=0;iy<2;++iy) {
 35            book(_h_br[ix][iy],1,1,2*ix+iy+1);
 36          }
 37        }
 38        book(_h_fs,1,1,5);
 39      }
 40      else {
 41        for (unsigned int ix=0;ix<4;++ix) {
 42          book(_sigma[ix],2,1,1+ix);
 43        }
 44        for (const string& en : _sigma[0].binning().edges<0>()) {
 45          double end = std::stod(en)*GeV;
 46          if (isCompatibleWithSqrtS(end)) {
 47            _ecms = en;
 48            break;
 49          }
 50        }
 51        if(_ecms.empty()) MSG_ERROR("Beam energy incompatible with analysis.");
 52      }
 53    }
 54
 55    void findDecayProducts(const Particle& p, bool& hasBs, Particles& d0, Particles& ds) {
 56      for (const Particle& child : p.children()) {
 57        hasBs |= child.abspid()==531;
 58        if (child.abspid()==431) {
 59          ds.push_back(child);
 60        }
 61        else if (child.abspid()==421) {
 62          d0.push_back(child);
 63        }
 64        else if (!child.children().empty()) {
 65          findDecayProducts(child,hasBs,d0,ds);
 66        }
 67      }
 68    }
 69
 70    /// Perform the per-event analysis
 71    void analyze(const Event& event) {
 72      // Upsilon(4,5S) decay
 73      if (_mode==0) {
 74        const UnstableParticles& ufs = apply<UnstableParticles>(event, "UFS");
 75        Particles upsilons = ufs.particles(Cuts::pid==300553 || Cuts::pid==400553 || Cuts::pid==9000553);
 76        for (const Particle& ups : upsilons) {
 77          unsigned int iups = ups.pid()==300553 ? 0 : 1;
 78          _c[iups]->fill();
 79          LorentzTransform cms_boost;
 80          if (ups.p3().mod() > 1*MeV)
 81            cms_boost = LorentzTransform::mkFrameTransformFromBeta(ups.mom().betaVec());
 82          Particles ds,d0;
 83          bool hasBs=false;
 84          findDecayProducts(ups, hasBs, d0, ds);
 85          if(iups==1&&hasBs) _h_fs->fill();
 86          for (const Particle & p : ds) {
 87            FourMomentum p2 = cms_boost.transform(p.mom());
 88            double x = p2.p3().mod()/sqrt(0.25*ups.mass2()-p2.mass2());
 89            _h_br[iups][0]->fill();
 90            _h_x [iups][0]->fill(x  );
 91
 92          }
 93          for (const Particle & p : d0) {
 94            FourMomentum p2 = cms_boost.transform(p.mom());
 95            double x = p2.p3().mod()/sqrt(0.25*ups.mass2()-p2.mass2());
 96            _h_br[iups][1]->fill();
 97            _h_x [iups][1]->fill(x);
 98          }
 99        }
100      }
101      else {
102        const UnstableParticles& ufs = apply<UnstableParticles>(event, "UFS");
103        Particles B  = ufs.particles(Cuts::abspid==511 || Cuts::abspid==521);
104        Particles Bs = ufs.particles(Cuts::abspid==531);
105        // require B mesons
106        if(B.empty() && Bs.empty()) vetoEvent;
107        if(!B.empty()) _sigma[3]->fill(_ecms);
108        Particles Ds = ufs.particles(Cuts::abspid==431);
109        for (unsigned int ix=0;ix<Ds.size();++ix) {
110          _sigma[0]->fill(_ecms);
111        }
112        Particles D0 = ufs.particles(Cuts::abspid==421);
113        for (unsigned int ix=0;ix<D0.size();++ix) {
114          _sigma[1]->fill(_ecms);
115        }
116        if (!Bs.empty() && !Ds.empty()) {
117          for (const Particle& p : Bs) {
118            if (p.children().size()==1) continue;
119            Particles ds,d0;
120            bool hasBs=false;
121            findDecayProducts(p, hasBs, d0, ds);
122            for (unsigned int ix=0;ix<ds.size();++ix) _sigma[2]->fill(_ecms);
123          }
124        }
125      }
126    }
127
128    /// Normalise histograms etc., after the run
129    void finalize() {
130      if (_mode==0) {
131      	for (unsigned int ix=0;ix<2;++ix) {
132      	  if (_c[ix]->numEntries()==0) continue;
133          scale(_h_x[ix], 1.0/ *_c[ix]);
134          // brs in % and at 4S /2 as br is for B decays
135          if (ix==0) scale(_h_br[ix], 50  / *_c[ix]);
136          else       scale(_h_br[ix], 100./ *_c[ix]);
137      	  if(ix==1) scale(_h_fs,100./ *_c[1]);
138      	}
139      }
140      else {
141        scale(_sigma, crossSection()/ sumOfWeights() /picobarn);
142      }
143    }
144    /// @}
145
146
147    /// @name Histograms
148    /// @{
149    unsigned int _mode;
150    Histo1DPtr _h_x[2][2];
151    CounterPtr _h_br[2][2],_h_fs,_c[2];
152    BinnedHistoPtr<string> _sigma[4];
153    string _ecms;
154    /// @}
155
156
157  };
158
159
160  RIVET_DECLARE_PLUGIN(BELLE_2023_I2660525);
161
162}