rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BESIII_2023_I2695411

Cross section for $e^+e^-\to\Xi^-\bar{\Xi}^+$ for $\sqrt{s}=3.510\to4.843\,$GeV
Experiment: BESIII (BEPC)
Inspire ID: 2695411
Status: VALIDATED NOHEPDATA
Authors:
  • Peter Richardson
References: Beams: e+ e-
Beam energies: (1.8, 1.8); (1.8, 1.8); (1.9, 1.9); (1.9, 1.9); (1.9, 1.9); (1.9, 1.9); (1.9, 1.9); (2.1, 2.1); (2.1, 2.1); (2.1, 2.1); (2.2, 2.2); (2.2, 2.2); (2.2, 2.2); (2.2, 2.2); (2.2, 2.2); (2.3, 2.3); (2.3, 2.3); (2.3, 2.3); (2.3, 2.3); (2.3, 2.3); (2.3, 2.3); (2.4, 2.4); (2.4, 2.4) GeV
Run details:
  • e+ e- -> hadrons

Measurement of the cross section for $e^+e^-\to\Xi^-\bar{\Xi}^+$ for $\sqrt{s}=3.510\to4.843\,$GeV by the BESIII collaboration. Beam energy must be specified as analysis option "ENERGY" when rivet-merging samples.

Source code: BESIII_2023_I2695411.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- > Xi+ Xi-
 10  class BESIII_2023_I2695411 : public Analysis {
 11  public:
 12
 13    /// Constructor
 14    RIVET_DEFAULT_ANALYSIS_CTOR(BESIII_2023_I2695411);
 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(Cuts::abspid==3312), "UFS");
 25      book(_sigmaXi, 1,1,1);
 26
 27      for (const string& en : _sigmaXi.binning().edges<0>()) {
 28        double end = std::stod(en)*GeV;
 29        if(isCompatibleWithSqrtS(end)) {
 30          _ecms = en;
 31          break;
 32        }
 33      }
 34      if(_ecms.empty()) 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()) {
 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       	for (const Particle & p2 : ufs.particles(Cuts::pid==-p1.pid())) {
 78      	  // check fs
 79      	  bool fs = true;
 80      	  for (const Particle& child : p2.children()) {
 81      	    if (child.pid()==p2.pid()) {
 82      	      fs = false;
 83      	      break;
 84      	    }
 85      	  }
 86      	  if (!fs) continue;
 87      	  map<long,int> nRes2 = nRes;
 88      	  int ncount2 = ncount;
 89      	  findChildren(p2,nRes2,ncount2);
 90      	  if (ncount2!=0) continue;
 91      	  matched=true;
 92      	  for (const auto& val : nRes2) {
 93      	    if (val.second!=0) {
 94      	      matched = false;
 95      	      break;
 96      	    }
 97      	  }
 98      	  if(matched) {
 99	    _sigmaXi->fill(_ecms);
100      	    break;
101      	  }
102       	}
103       	if (matched) break;
104      }
105    }
106
107
108    /// Normalise histograms etc., after the run
109    void finalize() {
110      double fact  = crossSection()/ sumOfWeights() /femtobarn;
111      scale(_sigmaXi, fact);
112      double mXi = 1.32171;
113      double tau  = 0.25*sqr(sqrtS()/mXi);
114      double beta = sqrt(1.-1./tau);
115      double alpha = 7.2973525693e-3;
116      double GeV2fb = 0.3893793721e12;
117      double sigma0 = 4.*M_PI*sqr(alpha/sqrtS())*beta*GeV2fb/3.;
118      BinnedEstimatePtr<string> tmp;
119      book(tmp,1,1,2);
120      for(const auto & b :_sigmaXi->bins()) {
121        tmp->bin(b.index()).set(1e3*sqrt(b.sumW()/(sigma0*(1. + 0.5/tau))),
122                               1e3*0.5*sqrt(1./b.sumW()/sigma0/(1. + 0.5/tau))*b.errW());
123      }
124    }
125
126    /// @}
127
128
129    /// @name Histograms
130    /// @{
131    BinnedHistoPtr<string> _sigmaXi;
132    string _ecms;
133    /// @}
134
135
136  };
137
138
139  RIVET_DECLARE_PLUGIN(BESIII_2023_I2695411);
140
141}