rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BESIII_2019_I1756876

Cross section for $e^+e^-\to D^+D^-\pi^+\pi^-$ for $E_{\text{CMS}}=4.36\to4.60$ GeV
Experiment: BESIII (BEPC)
Inspire ID: 1756876
Status: VALIDATED
Authors:
  • Peter Richardson
References: Beams: e- e+
Beam energies: (2.2, 2.2); (2.2, 2.2); (2.2, 2.2); (2.2, 2.2); (2.3, 2.3); (2.3, 2.3); (2.3, 2.3) GeV
Run details:
  • e+e- to hadrons

Cross section for $e^+e^-\to D^+D^-\pi^+\pi^-$ for $E_{\text{CMS}}=4.36\to4.60$ GeV. The cross sections for the subprocesses $e^+e^-\to D_1(2420)^\pm D^\mp$ and $e^+e^-\to \psi(3770) \pi^+\pi^-$ are measured.

Source code: BESIII_2019_I1756876.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 Cross section for D+D- pi+ pi- (D1 D and psi(3770) pi+pi- subprocesses)
 10  class BESIII_2019_I1756876 : public Analysis {
 11  public:
 12
 13    /// Constructor
 14    RIVET_DEFAULT_ANALYSIS_CTOR(BESIII_2019_I1756876);
 15
 16
 17    /// @name Analysis methods
 18    /// @{
 19
 20    /// Book histograms and initialise projections before the run
 21    void init() {
 22      // Initialise and register projections
 23      declare(FinalState(), "FS");
 24      declare(UnstableParticles(), "UFS");
 25      // Book histograms
 26      book(_nD1D, "/TMP/nD1D");
 27      book(_nPsi, "/TMP/nPsi");
 28
 29    }
 30
 31    void findChildren(const Particle & p,map<long,int> & nRes, int &ncount) {
 32      for(const Particle &child : p.children()) {
 33        if(child.children().empty()) {
 34          nRes[child.pid()]-=1;
 35          --ncount;
 36        }
 37        else
 38          findChildren(child,nRes,ncount);
 39      }
 40    }
 41
 42    /// Perform the per-event analysis
 43    void analyze(const Event& event) {
 44      const FinalState& fs = apply<FinalState>(event, "FS");
 45
 46      map<long,int> nCount;
 47      int ntotal(0);
 48      for (const Particle& p : fs.particles()) {
 49        nCount[p.pid()] += 1;
 50        ++ntotal;
 51      }
 52      const FinalState& ufs = apply<FinalState>(event, "UFS");
 53      bool matched=false;
 54      for(const Particle& p1 : ufs.particles(Cuts::abspid==411)) {
 55        int sign = p1.pid()/411;
 56        map<long,int> nRes = nCount;
 57        int ncount = ntotal;
 58        findChildren(p1,nRes,ncount);
 59        matched=false;
 60        for(const Particle& p2 : ufs.particles(Cuts::pid==-sign*411)) {
 61          map<long,int> nRes2 = nRes;
 62          int ncount2 = ncount;
 63          findChildren(p2,nRes2,ncount2);
 64          if(ncount2!=1) continue;
 65          matched=true;
 66          for(auto const & val : nRes2) {
 67            if(abs(val.first)==211) {
 68              if(val.second!=1) {
 69                matched = false;
 70                break;
 71              }
 72            }
 73            else if(val.second!=0) {
 74              matched = false;
 75              break;
 76            }
 77          }
 78          if(matched) break;
 79        }
 80        if(matched)
 81          break;
 82      }
 83      if(!matched) vetoEvent;
 84      // psi(3770) pi+pi-
 85      for(const Particle& p1 : ufs.particles(Cuts::abspid==30443)) {
 86        if(p1.children().empty()) continue;
 87        map<long,int> nRes = nCount;
 88        int ncount = ntotal;
 89        findChildren(p1,nRes,ncount);
 90        // psi(3770) pi+pi-
 91        if(ncount!=2) continue;
 92        bool matched = true;
 93        for(auto const & val : nRes) {
 94          if(abs(val.first)==211) {
 95            if(val.second !=1) {
 96              matched = false;
 97              break;
 98            }
 99          }
100          else if(val.second!=0) {
101            matched = false;
102            break;
103          }
104        }
105        if(matched) {
106          _nPsi->fill();
107          break;
108        }
109      }
110      // D1 D
111      for(const Particle& p1 : ufs.particles(Cuts::abspid==10413)) {
112        if(p1.children().empty()) continue;
113        int sign = p1.pid()/10413;
114        map<long,int> nRes = nCount;
115        int ncount = ntotal;
116        findChildren(p1,nRes,ncount);
117        matched=false;
118        for(const Particle& p2 : ufs.particles(Cuts::pid==-sign*411)) {
119          map<long,int> nRes2 = nRes;
120          int ncount2 = ncount;
121          findChildren(p2,nRes2,ncount2);
122          if(ncount2!=1) continue;
123          matched=true;
124          for(auto const & val : nRes2) {
125            if(abs(val.first)==211) {
126              if(val.second!=1) {
127                matched = false;
128                break;
129              }
130            }
131            else if(val.second!=0) {
132              matched = false;
133              break;
134            }
135          }
136          if(matched) break;
137        }
138        if(matched) {
139          _nD1D->fill();
140          break;
141        }
142      }
143    }
144
145    /// Normalise histograms etc., after the run
146    void finalize() {
147      double fact = crossSection()/ sumOfWeights()/picobarn;
148      for(unsigned int iy=9;iy<11;++iy) {
149        double sigma,error;
150        if(iy==9) {
151          sigma = _nD1D->val()*fact;
152          error = _nD1D->err()*fact;
153        }
154        else if(iy==10) {
155          sigma = _nPsi->val()*fact;
156          error = _nPsi->err()*fact;
157        }
158        Estimate1DPtr mult;
159        book(mult,1,1,iy);
160        for (auto& b : mult->bins()) {
161          if (inRange(sqrtS()/GeV, b.xMin(), b.xMax())) {
162            b.set(sigma, error);
163          }
164        }
165      }
166
167    }
168
169    /// @}
170
171    /// @name Histograms
172    /// @{
173    CounterPtr _nD1D, _nPsi;
174    /// @}
175
176  };
177
178
179  RIVET_DECLARE_PLUGIN(BESIII_2019_I1756876);
180
181}