rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BESII_2004_I661567

Cross sections for $e^+e^-\to\omega\pi^0$, $\rho\eta^{(\prime)}$ for $\sqrt{s}=3.65$, $3.686$, and $3.773$
Experiment: BESII (BEPC)
Inspire ID: 661567
Status: VALIDATED NOHEPDATA
Authors:
  • Peter Richardson
References:
  • Phys.Rev.D 70 (2004) 112007
Beams: e+ e-
Beam energies: (1.8, 1.8); (1.8, 1.8); (1.9, 1.9) GeV
Run details:
  • e+ e- > hadrons, pi0 and KS) set stable

The data were taken from Table III in the paper. Beam energy must be specified as analysis option "ENERGY" when rivet-merging samples.

Source code: BESII_2004_I661567.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/FinalState.hh"
  4#include "Rivet/Projections/UnstableParticles.hh"
  5
  6namespace Rivet {
  7
  8
  9  /// @brief e+ e- > omega pi0, rho eta(')
 10  class BESII_2004_I661567 : public Analysis {
 11  public:
 12
 13    /// Constructor
 14    RIVET_DEFAULT_ANALYSIS_CTOR(BESII_2004_I661567);
 15
 16
 17    /// @name Analysis methods
 18    /// @{
 19
 20    /// Book histograms and initialise projections before the run
 21    void init() {
 22      // projection
 23      declare(FinalState(), "FS");
 24      declare(UnstableParticles(), "UFS");
 25      // counter
 26      for(unsigned int ix=0;ix<3;++ix)
 27	book(_sigma[ix],1,1,1+ix);
 28
 29      for (const string& en : _sigma[0].binning().edges<0>()) {
 30        double end = std::stod(en)*GeV;
 31        if(isCompatibleWithSqrtS(end)) {
 32          _ecms = en;
 33          break;
 34        }
 35      }
 36      if(_ecms.empty()) MSG_ERROR("Beam energy incompatible with analysis.");
 37    }
 38
 39    void findChildren(const Particle& p, map<long,int>& nRes, int &ncount) {
 40      for(const Particle& child : p.children()) {
 41        if (child.children().empty()) {
 42          --nRes[child.pid()];
 43          --ncount;
 44        }
 45        else {
 46          findChildren(child,nRes,ncount);
 47        }
 48      }
 49    }
 50
 51    /// Perform the per-event analysis
 52    void analyze(const Event& event) {
 53      // final state particles
 54      const FinalState& fs = apply<FinalState>(event, "FS");
 55      map<long,int> nCount;
 56      int ntotal(0);
 57      for (const Particle& p : fs.particles()) {
 58      	nCount[p.pid()] += 1;
 59      	++ntotal;
 60      }
 61      const UnstableParticles& ufs = apply<UnstableParticles>(event, "UFS");
 62      // first the omega pi0 final state
 63      bool matched=false;
 64      for (const Particle& p : ufs.particles(Cuts::pid==223)) {
 65      	if(p.children().empty()) continue;
 66      	map<long,int> nRes = nCount;
 67      	int ncount = ntotal;
 68      	findChildren(p,nRes,ncount);
 69      	if (ncount==1) {
 70      	  matched=true;
 71      	  for (const auto& val : nRes) {
 72      	    if (val.first==111) {
 73      	      if (val.second !=1) {
 74                matched = false;
 75                break;
 76      	      }
 77      	    }
 78      	    else if (val.second!=0) {
 79      	      matched = false;
 80      	      break;
 81      	    }
 82      	  }
 83      	  if(matched) {
 84      	    _sigma[0]->fill(_ecms);
 85	    break;
 86      	  }
 87      	}
 88      }
 89      if (matched) return;
 90      // rho eta states
 91      for (const Particle& p : ufs.particles(Cuts::pid==113)) {
 92        if (p.children().empty()) continue;
 93        map<long,int> nRes = nCount;
 94        int ncount = ntotal;
 95        findChildren(p,nRes,ncount);
 96        // check for eta/eta'
 97        for (const Particle& p2 : ufs.particles(Cuts::pid==221 || Cuts::pid==331)) {
 98          map<long,int> nResB = nRes;
 99          int ncountB = ncount;
100          findChildren(p2,nResB,ncountB);
101          if (ncountB!=0) continue;
102          matched = true;
103          for (const auto& val : nResB) {
104            if (val.second!=0) {
105              matched = false;
106              break;
107            }
108          }
109          if (matched) {
110	    if(p2.pid()==221) _sigma[1]->fill(_ecms);
111	    else if(_ecms=="3.686") _sigma[2]->fill(_ecms);
112            break;
113          }
114        }
115      }
116    }
117
118
119    /// Normalise histograms etc., after the run
120    void finalize() {
121      double fact = crossSection()/picobarn/sumOfWeights();
122      for(unsigned int ix=0;ix<3; ++ix) scale(_sigma[ix],fact);
123    }
124
125    /// @}
126
127
128    /// @name Histograms
129    /// @{
130    BinnedHistoPtr<string> _sigma[3];
131    string _ecms;
132    /// @}
133
134
135  };
136
137
138  RIVET_DECLARE_PLUGIN(BESII_2004_I661567);
139
140}