rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BESIII_2024_I2751832

Cross section for $e^+e^-\to\pi^+\pi^-\pi^0$ between 2.00 and 3.08 GeV
Experiment: BESIII (BEPC)
Inspire ID: 2751832
Status: VALIDATED NOHEPDATA
Authors:
  • Peter Richardson
References: Beams: e+ e-
Beam energies: (1.0, 1.0); (1.0, 1.0); (1.1, 1.1); (1.1, 1.1); (1.1, 1.1); (1.1, 1.1); (1.1, 1.1); (1.1, 1.1); (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.5, 1.5); (1.5, 1.5); (1.5, 1.5); (1.5, 1.5); (1.5, 1.5) GeV
Run details:
  • e+ e- to hadrons, pi0 set stable

Cross section for $e^+e^-\to\pi^+\pi^-\pi^0$ between 2.00 and 3.08 GeV measured by BESII. The $\rho\pi$ and $\rho(1450)\pi$ subprocesses are also extracted. Beam energy must be specified as analysis option "ENERGY" when rivet-merging samples.

Source code: BESIII_2024_I2751832.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- -> pi+ pi- pi0
 10  class BESIII_2024_I2751832 : public Analysis {
 11  public:
 12
 13    /// Constructor
 14    RIVET_DEFAULT_ANALYSIS_CTOR(BESIII_2024_I2751832);
 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      for(unsigned int ix=0;ix<3;++ix)
 26	book(_sigma[ix], 1, 1, 1+ix);
 27      
 28      for (const string& en : _sigma[0].binning().edges<0>()) {
 29        double end = std::stod(en)*GeV;
 30        if(isCompatibleWithSqrtS(end)) {
 31          _ecms = en;
 32          break;
 33        }
 34      }
 35      if(_ecms.empty()) MSG_ERROR("Beam energy incompatible with analysis.");
 36    }
 37
 38    void findChildren(const Particle& p, map<long,int>& nRes, int& ncount) {
 39      for (const Particle& child : p.children()) {
 40        if (child.children().empty()) {
 41          --nRes[child.pid()];
 42          --ncount;
 43        }
 44        else {
 45          findChildren(child,nRes,ncount);
 46        }
 47      }
 48    }
 49
 50    /// Perform the per-event analysis
 51    void analyze(const Event& event) {
 52
 53      const FinalState& fs = apply<FinalState>(event, "FS");
 54
 55      map<long,int> nCount;
 56      int ntotal(0);
 57      Particle pip, pim;
 58      for (const Particle& p : fs.particles()) {
 59        nCount[p.pid()] += 1;
 60        ++ntotal;
 61        if (p.pid()     == 211) pip=p;
 62        else if (p.pid()==-211) pim=p;
 63      }
 64      if (ntotal!=3) vetoEvent;
 65      if (nCount[-211]==1&&nCount[211]==1&&nCount[111]==1) {
 66        _sigma[0]->fill(_ecms);
 67      }
 68      else {
 69        vetoEvent;
 70      }
 71      const FinalState& ufs = apply<FinalState>(event, "UFS");
 72      for (const Particle& p : ufs.particles(Cuts::abspid==113 || Cuts::abspid==213 ||
 73                                             Cuts::abspid==100113 || Cuts::abspid==100213)) {
 74        if (p.children().empty()) continue;
 75        map<long,int> nRes = nCount;
 76        int ncount = ntotal;
 77        findChildren(p,nRes,ncount);
 78        if (ncount!=1) continue;
 79        int idOther = 211;
 80        if (p.pid()==113 || p.pid()==100113) {
 81          idOther = 111;
 82        }
 83        else if (p.pid()==213 || p.pid()==100213) {
 84          idOther = -211;
 85        }
 86        bool matched=true;
 87        for (const auto& val : nRes) {
 88          if (val.first==idOther) {
 89            if (val.second !=1) {
 90              matched = false;
 91              break;
 92            }
 93          }
 94          else if (val.second!=0) {
 95            matched = false;
 96            break;
 97          }
 98        }
 99        if (!matched) continue;
100        if (matched) {
101          if (p.pid()==213 || p.pid()==113)
102	    _sigma[1]->fill(_ecms);
103	  else
104	    _sigma[2]->fill(_ecms);
105          break;
106        }
107      }
108    }
109
110
111    /// Normalise histograms etc., after the run
112    void finalize() {
113      double fact = crossSection()/picobarn/sumOfWeights();
114      for(unsigned int ix=0;ix<3;++ix)
115	scale(_sigma[ix],fact);
116    }
117
118    /// @}
119
120
121    /// @name Histograms
122    /// @{
123    BinnedHistoPtr<string> _sigma[3];
124    string _ecms;
125    /// @}
126
127
128  };
129
130
131  RIVET_DECLARE_PLUGIN(BESIII_2024_I2751832);
132
133}