rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BESIII_2019_I1623214

Cross section for $e^+e^-\to \eta Y(2175)$ for energies above 3.7 GeV
Experiment: BESIII (BEPC)
Inspire ID: 1623214
Status: VALIDATED NOHEPDATA
Authors:
  • Peter Richardson
References:
  • Phys.Rev.D 99 (2019) 1, 012014
Beams: e+ e-
Beam energies: (1.8, 1.8); (1.9, 1.9); (2.0, 2.0); (2.1, 2.1); (2.1, 2.1); (2.2, 2.2); (2.2, 2.2); (2.3, 2.3) GeV
Run details:
  • e+ e- to hadrons

Measurement of the cross section for $e^+e^-\to \eta Y(2175)$ times the branching ratio $Y(2175)\to\phi f_0(f_0\to\pi^+\pi^-)$ for energies above 3.7 GeV. The PDG code for the $Y(2175)$ is not defined but the most probable assignment is that it is the $\phi$ member of the $^3D_1$ multiplet so we take its PDG code to be 30333, although this can be changed using the PID option if a different code is used by the event generator performing the simulation. Beam energy must be specified as analysis option "ENERGY" when rivet-merging samples.

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