rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BELLE_2008_I759262

Cross section for $e^+e^-\to J/\psi X(3940), X(4160)$ at $\sqrt{s}=10.6\,$GeV
Experiment: BELLE (KEKB)
Inspire ID: 759262
Status: VALIDATED NOHEPDATA
Authors:
  • Peter Richardson
References:
  • Phys.Rev.Lett. 100 (2008) 202001
Beams: e+ e-
Beam energies: (5.3, 5.3) GeV
Run details:
  • e+e- -> J/psi X(3940) X(4160)

Cross section for $e^+e^-\to J/\psi X(3940)/X(4160)$ at $\sqrt{s}=10.6\,$GeV. The $X(3940)$ is measured using $D^*\bar{D}$ modes while the $X(4160)$ mode is measured using $D^*\bar{D}^*$ modes. The status of the $X(3940)$ is not clear, we take the PDG code to be 9010441, which can be changed using the PID3940 option. For the $X(4160)$ spin, partiy, $2^-$ is favoured and therefore we use 9010445, which can be changed using the PID4160 option.

Source code: BELLE_2008_I759262.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- > J/psi X(3940) or X(4160)
 10  class BELLE_2008_I759262 : public Analysis {
 11  public:
 12
 13    /// Constructor
 14    RIVET_DEFAULT_ANALYSIS_CTOR(BELLE_2008_I759262);
 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[0] = getOption<int>("PID3940", 9010441);
 24      _pid[1] = getOption<int>("PID4160", 9010445);
 25      // projections
 26      declare("FS",FinalState());
 27      declare("UFS",UnstableParticles(Cuts::pid==443 ||
 28                                      Cuts::pid==_pid[0] ||
 29                                      Cuts::pid==_pid[1]));
 30      // histograms
 31      for (unsigned int ix=0; ix<2; ++ix) {
 32        book(_h[ix], 1, 1, 1+ix);
 33      }
 34    }
 35
 36    void findChildren(const Particle & p,map<long,int> & nRes, int &ncount,
 37		      unsigned int & nCharged) {
 38      for (const Particle &child : p.children()) {
 39        if (child.children().empty()) {
 40          --nRes[child.pid()];
 41          --ncount;
 42          if (PID::isCharged(p.pid())) ++nCharged;
 43        }
 44        else {
 45          findChildren(child,nRes,ncount,nCharged);
 46        }
 47      }
 48    }
 49
 50    /// Perform the per-event analysis
 51    void analyze(const Event& event) {
 52      // final state particles
 53      const FinalState& fs = apply<FinalState>(event, "FS");
 54      map<long,int> nCount;
 55      int ntotal(0);
 56      for (const Particle& p : fs.particles()) {
 57      	nCount[p.pid()] += 1;
 58      	++ntotal;
 59      }
 60      // loop over J/psi
 61      const UnstableParticles& ufs = apply<UnstableParticles>(event, "UFS");
 62      bool matched=false;
 63      for (const Particle& p : ufs.particles(Cuts::pid==443)) {
 64      	if (p.children().empty()) continue;
 65      	map<long,int> nRes = nCount;
 66      	int ncount = ntotal;
 67      	unsigned int nCharged=0;
 68      	findChildren(p,nRes,ncount,nCharged);
 69      	// X(3940)/X(4160)
 70       	for (const Particle& p2 : ufs.particles(Cuts::pid!=443)) {
 71          map<long,int> nResB = nRes;
 72          int ncountB = ncount;
 73          unsigned int nChargedB=0;
 74          findChildren(p2,nResB,ncountB,nChargedB);
 75          if (ncountB!=0) continue;
 76          matched = true;
 77          for (const auto& val : nResB) {
 78            if (val.second!=0) {
 79              matched = false;
 80              break;
 81            }
 82          }
 83          if (matched) {
 84            if (p2.children().size()!=2) break;
 85            if (p2.children()[0].pid()*p2.children()[1].pid()>0) break;
 86            if (p2.pid()==_pid[0]) {
 87              if ((p2.children()[0].abspid()==413 && p2.children()[1].abspid()==411) ||
 88                  (p2.children()[1].abspid()==413 && p2.children()[0].abspid()==411) ||
 89                  (p2.children()[0].abspid()==423 && p2.children()[1].abspid()==421) ||
 90                  (p2.children()[1].abspid()==423 && p2.children()[0].abspid()==421))
 91                _h[0]->fill("10.6"s);
 92              }
 93              else {
 94              if (p2.children()[0].pid()==-p2.children()[1].pid() &&
 95                 (p2.children()[0].abspid()==413 || p2.children()[0].abspid()==423))
 96                _h[1]->fill("10.6"s);
 97              }
 98            break;
 99          }
100        }
101        if (matched) break;
102      }
103    }
104
105
106    /// Normalise histograms etc., after the run
107    void finalize() {
108      scale(_h, crossSection()/ sumOfWeights() /femtobarn);
109    }
110
111    /// @}
112
113
114    /// @name Histograms
115    /// @{
116    int _pid[2];
117    BinnedHistoPtr<string> _h[2];
118    /// @}
119
120
121  };
122
123
124  RIVET_DECLARE_PLUGIN(BELLE_2008_I759262);
125
126}