rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BESIII_2019_I1724671

Cross section for $e^+e^-\to\gamma X(3872)$ between 4 and 4.6 GeV
Experiment: BESIII (BEPC)
Inspire ID: 1724671
Status: VALIDATED NOHEPDATA
Authors:
  • Peter Richardson
References:
  • Phys.Rev.Lett. 122 (2019) 23, 232002
Beams: e+ e-
Beam energies: (2.0, 2.0); (2.1, 2.1); (2.1, 2.1); (2.1, 2.1); (2.1, 2.1); (2.1, 2.1); (2.1, 2.1); (2.1, 2.1); (2.1, 2.1); (2.1, 2.1); (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-

Measurement of the cross section for $e^+e^-\to\gamma X(3872)$ times the branching ratio into the $\omega J\psi$ and $J/\psi\pi^+\pi^-$ modes 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_2019_I1724671.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_2019_I1724671 : public Analysis {
 11  public:
 12
 13    /// Constructor
 14    RIVET_DEFAULT_ANALYSIS_CTOR(BESIII_2019_I1724671);
 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      for (unsigned int ix=0;ix<2;++ix) {
 29        book(_sigma[ix],1,1,1+ix);
 30      }
 31
 32      for (const string& en : _sigma[0].binning().edges<0>()) {
 33        const double end = std::stod(en)*GeV;
 34        if (isCompatibleWithSqrtS(end)) {
 35          _ecms = en;
 36          break;
 37        }
 38      }
 39      if (_ecms.empty()) MSG_ERROR("Beam energy incompatible with analysis.");
 40
 41    }
 42
 43    void findChildren(const Particle & p,map<long,int>& nRes, int &ncount) {
 44      for (const Particle &child : p.children()) {
 45        if (child.children().empty()) {
 46          --nRes[child.pid()];
 47          --ncount;
 48        }
 49        else {
 50          findChildren(child,nRes,ncount);
 51        }
 52      }
 53    }
 54
 55    /// Perform the per-event analysis
 56    void analyze(const Event& event) {
 57      const FinalState& fs = apply<FinalState>(event, "FS");
 58      map<long,int> nCount;
 59      int ntotal(0);
 60      for (const Particle& p: fs.particles()) {
 61        nCount[p.pid()] += 1;
 62        ++ntotal;
 63      }
 64      const FinalState& ufs = apply<FinalState>(event, "UFS");
 65      int mode=-1;
 66      for (const Particle & psi : ufs.particles(Cuts::pid==443)) {
 67        if (psi.children().empty()) continue;
 68        map<long,int> nRes = nCount;
 69        int ncount = ntotal;
 70        findChildren(psi,nRes,ncount);
 71        // check for J/psi pi+pi- mode
 72        if (ncount==3) {
 73          bool matched = true;
 74          for (const auto& val : nRes) {
 75            if (abs(val.first)==211 || val.first==PID::GAMMA) {
 76              if (val.second !=1) {
 77                matched = false;
 78                break;
 79              }
 80            }
 81            else if (val.second!=0) {
 82              matched = false;
 83              break;
 84            }
 85          }
 86          if (matched) {
 87            mode=1;
 88            break;
 89          }
 90        }
 91        bool matched = false;
 92        for (const Particle& omega : ufs.particles(Cuts::pid==223)) {
 93          if (omega.children().empty()) continue;
 94          map<long,int> nRes2 = nRes;
 95          int ncount2 = ncount;
 96          findChildren(omega,nRes2,ncount2);
 97          if (ncount2!=1) continue;
 98          matched = true;
 99          for (const auto& val : nRes2) {
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) break;
112        }
113        if (matched) {
114          mode = 0;
115          break;
116        }
117      }
118      if (mode<0) vetoEvent;
119      // find the intermediate
120      for (const Particle& XX : ufs.particles(Cuts::pid==_pid)) {
121        if (XX.children().empty()) continue;
122        map<long,int> nRes = nCount;
123        int ncount = ntotal;
124        findChildren(XX, nRes, ncount);
125        if (ncount!=1) continue;
126        bool matched = true;
127        for (const auto& val : nRes) {
128          if (val.first==PID::GAMMA) {
129            if (val.second !=1) {
130              matched = false;
131              break;
132            }
133          }
134          else if (val.second!=0) {
135            matched = false;
136            break;
137          }
138        }
139        if (matched) {
140          _sigma[mode]->fill(_ecms);
141          break;
142        }
143      }
144    }
145
146
147    /// Normalise histograms etc., after the run
148    void finalize() {
149      scale(_sigma, crossSection()/ sumOfWeights() /picobarn);
150    }
151
152    /// @}
153
154
155    /// @name Histograms
156    /// @{
157    int _pid;
158    BinnedHistoPtr<string> _sigma[2];
159    string _ecms;
160    /// @}
161
162
163  };
164
165
166  RIVET_DECLARE_PLUGIN(BESIII_2019_I1724671);
167
168}