rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BESIII_2014_I1258603

Cross section for $e^+e^-\to\gamma X(3872)$ between 4.01 and 4.36 GeV
Experiment: BESIII (BEPC)
Inspire ID: 1258603
Status: VALIDATED NOHEPDATA
Authors:
  • Peter Richardson
References:
  • Phys.Rev.Lett. 112 (2014) 9, 092001
Beams: e+ e-
Beam energies: (2.0, 2.0); (2.1, 2.1); (2.1, 2.1); (2.2, 2.2) GeV
Run details:
  • e+ e- to hadrons

Measurement of the cross section for $e^+e^-\to\gamma X(3872)$ times the branching ratio into the $J/\psi\pi^+\pi^-$ mode for $X(3872)$. There is no consensus as to the nature of the $X(3872)$ $c\bar{c}$ state and therefore we taken its PDG code to be 9030443, i.e. the first unused code for an undetermined spin one $c\bar{c}$ state. 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_2014_I1258603.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- -> gamma X(3872)
 10  class BESIII_2014_I1258603 : public Analysis {
 11  public:
 12
 13    /// Constructor
 14    RIVET_DEFAULT_ANALYSIS_CTOR(BESIII_2014_I1258603);
 15
 16
 17    /// @name Analysis methods
 18    /// @{
 19
 20    /// Book histograms and initialise projections before the run
 21    void init() {
 22      // set the PDG code
 23      _pid = getOption<double>("PID", 9030443);
 24      // projections
 25      declare(FinalState(), "FS");
 26      declare(UnstableParticles(), "UFS");
 27      // counters
 28      book(_sigma,1,1,1);
 29      for (const string& en : _sigma.binning().edges<0>()) {
 30        const double end = std::stod(en)*GeV;
 31        if (isCompatibleWithSqrtS(end)) {
 32          _ecms = en;
 33          break;
 34        }
 35      }
 36      if (_ecms.empty()) {
 37        MSG_ERROR("Beam energy incompatible with analysis.");
 38      }
 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      bool found = false;
 64      for (const Particle & psi : ufs.particles(Cuts::pid==443)) {
 65        if (psi.children().empty()) continue;
 66        map<long,int> nRes = nCount;
 67        int ncount = ntotal;
 68        findChildren(psi,nRes,ncount);
 69        // check for J/psi pi+pi- mode
 70        if (ncount==3) {
 71          bool matched = true;
 72          for (const auto& val : nRes) {
 73            if (abs(val.first)==211 || val.first==PID::GAMMA) {
 74              if (val.second !=1) {
 75                matched = false;
 76                break;
 77              }
 78            }
 79            else if (val.second!=0) {
 80              matched = false;
 81              break;
 82            }
 83          }
 84          if (matched) {
 85            found = true;
 86            break;
 87          }
 88        }
 89      }
 90      if (!found) vetoEvent;
 91      // find the intermediate
 92      for (const Particle& XX : ufs.particles(Cuts::pid==_pid)) {
 93        if (XX.children().empty()) continue;
 94        map<long,int> nRes = nCount;
 95        int ncount = ntotal;
 96        findChildren(XX,nRes,ncount);
 97        if (ncount!=1) continue;
 98        bool matched = true;
 99        for (const auto& val : nRes) {
100          if (val.first==PID::GAMMA) {
101            if (val.second !=1) {
102              matched = false;
103              break;
104            }
105          }
106          else if (val.second!=0) {
107            matched = false;
108            break;
109          }
110        }
111        if (matched) {
112          _sigma->fill(_ecms);
113          break;
114        }
115      }
116    }
117
118
119    /// Normalise histograms etc., after the run
120    void finalize() {
121      scale(_sigma,crossSection()/ sumOfWeights() /picobarn);
122    }
123
124    /// @}
125
126
127    /// @name Histograms
128    /// @{
129    int _pid;
130    BinnedHistoPtr<string> _sigma;
131    string _ecms;
132    /// @}
133
134
135  };
136
137
138  RIVET_DECLARE_PLUGIN(BESIII_2014_I1258603);
139
140}