Rivet analyses

Cross section for e+e → J/ψX(3940) at $\sqrt{s}=10.6\,$GeV

Experiment: BELLE (KEKB)

Inspire ID: 686580

Status: VALIDATED NOHEPDATA

Authors: - Peter Richardson

References: - Phys.Rev.Lett. 98 (2007) 082001

Beams: e+ e-

Beam energies: (5.3, 5.3)GeV

Run details: - e+e- -> J/psi X(3940)

Cross section for e+e → J/ψX(3940) at $\sqrt{s}=10.6\,$GeV. The X(3940) is measure in modes with more than two charged tracks. The status of the X(3940) is not clear, we take the PDG code to be 9010441, which can be changed using the PID option

Source code:BELLE_2007_I686580.cc

// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/UnstableParticles.hh"

namespace Rivet {


  /// @brief e+e- > J/psi X(3940)
  class BELLE_2007_I686580 : public Analysis {
  public:

    /// Constructor
    RIVET_DEFAULT_ANALYSIS_CTOR(BELLE_2007_I686580);


    /// @name Analysis methods
    /// @{

    /// Book histograms and initialise projections before the run
    void init() {
      // set the PDG code
      _pid = getOption<int>("PID", 9010441);
      // projections
      declare("FS",FinalState());
      declare("UFS",UnstableParticles(Cuts::pid==443 || Cuts::pid==_pid));
      // histograms
      book(_h,1,1,1);
    }

    void findChildren(const Particle & p,map<long,int> & nRes, int &ncount,
              unsigned int & nCharged) {
      for( const Particle &child : p.children()) {
        if (child.children().empty()) {
          --nRes[child.pid()];
          --ncount;
          if(PID::isCharged(p.pid())) ++nCharged;
        }
        else {
          findChildren(child,nRes,ncount,nCharged);
        }
      }
    }

    /// Perform the per-event analysis
    void analyze(const Event& event) {
      // final state particles
      const FinalState& fs = apply<FinalState>(event, "FS");
      map<long,int> nCount;
      int ntotal(0);
      for (const Particle& p : fs.particles()) {
        nCount[p.pid()] += 1;
        ++ntotal;
      }
      // loop over J/psi
      const UnstableParticles& ufs = apply<UnstableParticles>(event, "UFS");
      bool matched=false;
      for (const Particle& p : ufs.particles(Cuts::pid==443)) {
        if (p.children().empty()) continue;
        map<long,int> nRes = nCount;
        int ncount = ntotal;
        unsigned int nCharged=0;
        findChildren(p,nRes,ncount,nCharged);
        // X(3940)
        for (const Particle& p2 : ufs.particles(Cuts::pid==_pid)) {
          map<long,int> nResB = nRes;
          int ncountB = ncount;
          unsigned int nChargedB=0;
          findChildren(p2,nResB,ncountB,nChargedB);
          if (ncountB!=0) continue;
          matched = true;
          for (const auto& val : nResB) {
            if (val.second!=0) {
              matched = false;
              break;
            }
          }
          if (matched) {
            if (nCharged>2) _h->fill("10.6"s);
            break;
          }
        }
        if (matched) break;
      }
    }


    /// Normalise histograms etc., after the run
    void finalize() {
      scale(_h, crossSection()/ sumOfWeights() /femtobarn);
    }

    /// @}


    /// @name Histograms
    /// @{
    int _pid;
    BinnedHistoPtr<string> _h;
    /// @}


  };


  RIVET_DECLARE_PLUGIN(BELLE_2007_I686580);

}