rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BESIII_2023_I2686032

Cross section for $e^+e^-\to\Lambda^0\bar{\Sigma}^0+\text{c.c.}$ for $\sqrt{s}=2.3094\to3.0800\,$GeV
Experiment: BESIII (BEPC)
Inspire ID: 2686032
Status: VALIDATED NOHEPDATA
Authors:
  • Peter Richardson
References: Beams: e+ e-
Beam energies: (1.2, 1.2); (1.2, 1.2); (1.2, 1.2); (1.2, 1.2); (1.3, 1.3); (1.3, 1.3); (1.4, 1.4); (1.4, 1.4); (1.4, 1.4); (1.5, 1.5); (1.5, 1.5); (1.5, 1.5); (1.5, 1.5); (1.5, 1.5) GeV
Run details:
  • e+ e- -> hadrons

Measurement of the cross section for $e^+e^-\to\Lambda^0\bar{\Sigma}^0+\text{c.c.}$ for $\sqrt{s}=2.3094\to3.0800\,$GeV by the BESIII collaboration. Beam energy must be specified as analysis option "ENERGY" when rivet-merging samples.

Source code: BESIII_2023_I2686032.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- > Lambda0 Sigmabar0 + c.c.
 10  class BESIII_2023_I2686032 : public Analysis {
 11  public:
 12
 13    /// Constructor
 14    RIVET_DEFAULT_ANALYSIS_CTOR(BESIII_2023_I2686032);
 15
 16
 17    /// @name Analysis methods
 18    /// @{
 19
 20    /// Book histograms and initialise projections before the run
 21    void init() {
 22      // Initialise and register projections
 23      declare(FinalState(), "FS");
 24      declare(UnstableParticles(), "UFS");
 25      book(_nLS, 1, 1, 1);
 26      for (const string& en : _nLS.binning().edges<0>()) {
 27        const double end = std::stod(en)*GeV;
 28        if (isCompatibleWithSqrtS(end)) {
 29          _ecms = en;
 30          break;
 31        }
 32      }
 33      if(_ecms.empty())
 34        MSG_ERROR("Beam energy incompatible with analysis.");
 35    }
 36
 37    void findChildren(const Particle& p, map<long,int>& nRes, int& ncount) {
 38      for (const Particle& child : p.children()) {
 39        if (child.children().empty()) {
 40          nRes[child.pid()]-=1;
 41          --ncount;
 42        }
 43        else {
 44          findChildren(child,nRes,ncount);
 45        }
 46      }
 47    }
 48
 49    /// Perform the per-event analysis
 50    void analyze(const Event& event) {
 51      const FinalState& fs = apply<FinalState>(event, "FS");
 52      // total hadronic and muonic cross sections
 53      map<long,int> nCount;
 54      int ntotal(0);
 55      for (const Particle& p : fs.particles()) {
 56        nCount[p.pid()] += 1;
 57        ++ntotal;
 58      }
 59
 60      // find the Lambdas and Sigmas
 61      const UnstableParticles& ufs = apply<UnstableParticles>(event, "UFS");
 62      for (const Particle& p1 : ufs.particles(Cuts::abspid==3122)) {
 63      	bool matched = false;
 64      	// check fs
 65      	bool fs = true;
 66      	for (const Particle& child : p1.children()) {
 67      	  if (child.pid()==p1.pid()) {
 68      	    fs = false;
 69      	    break;
 70      	  }
 71      	}
 72      	if (!fs) continue;
 73      	// find the children
 74      	map<long,int> nRes = nCount;
 75      	int ncount = ntotal;
 76      	findChildren(p1, nRes, ncount);
 77        int sign = p1.pid()/3122;
 78       	for (const Particle& p2 : ufs.particles(Cuts::pid==-sign*3212)) {
 79      	  // check fs
 80      	  bool fs = true;
 81      	  for (const Particle& child : p2.children()) {
 82      	    if (child.pid()==p2.pid()) {
 83      	      fs = false;
 84      	      break;
 85      	    }
 86      	  }
 87      	  if (!fs) continue;
 88      	  map<long,int> nRes2 = nRes;
 89      	  int ncount2 = ncount;
 90      	  findChildren(p2,nRes2,ncount2);
 91      	  if (ncount2!=0) continue;
 92      	  matched=true;
 93      	  for (const auto& val : nRes2) {
 94      	    if (val.second!=0) {
 95      	      matched = false;
 96      	      break;
 97      	    }
 98      	  }
 99      	  if (matched) {
100            _nLS->fill(_ecms);
101      	    break;
102      	  }
103       	}
104       	if (matched) break;
105      }
106    }
107
108
109    /// Normalise histograms etc., after the run
110    void finalize() {
111      scale(_nLS, crossSection()/ sumOfWeights() /picobarn);
112      const double mL = 1.115683;
113      const double mS = 1.192642;
114      const double tau  = sqr(sqrtS()/(mL+mS));
115      const double beta = sqrt(1.-2.*(sqr(mS)+sqr(mL))/sqr(sqrtS())+sqr((sqr(mS)-sqr(mL))/sqr(sqrtS())));
116      const double alpha = 7.2973525693e-3;
117      const double GeV2pb = 0.3893793721e9;
118      const double sigma0 = 4.*M_PI*sqr(alpha/sqrtS())*beta*GeV2pb;
119      BinnedEstimatePtr<string> tmp;
120      book(tmp,1,1,2);
121      for(const auto & b : _nLS->bins()) {
122        tmp->bin(b.index()).set(sqrt(3.*b.sumW()*tau/(sigma0*(0.5 + 0.5*tau))),
123                                sqrt(1.5*tau/b.sumW()/sigma0/(1.+2.*tau))*b.errW());
124      }
125    }
126
127    /// @}
128
129
130    /// @name Histograms
131    /// @{
132    BinnedHistoPtr<string> _nLS;
133    string _ecms;
134    /// @}
135
136
137  };
138
139
140  RIVET_DECLARE_PLUGIN(BESIII_2023_I2686032);
141
142}