rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BESIII_2020_I1775344

Cross section for $e^+e^-\to K^+K^-\pi^0\pi^0$ from 2.000 to 2.644 GeV
Experiment: BESIII (BEPC)
Inspire ID: 1775344
Status: VALIDATED
Authors:
  • Peter Richardson
References:
  • Phys.Rev.Lett. 124 (2020) 112001
Beams: e+ e-
Beam energies: (1.0, 1.0); (1.1, 1.1); (1.1, 1.1); (1.1, 1.1); (1.1, 1.1); (1.1, 1.1); (1.2, 1.2); (1.2, 1.2); (1.2, 1.2); (1.3, 1.3) GeV
Run details:
  • e+e- to hadrons. Beam energy must be specified as analysis option "ENERGY" when rivet-merging samples.

Cross section for $e^+e^-\to K^+K^-\pi^0\pi^0$ for centre-of-mass energies from 2.000 to 2.644 GeV measured by BES. The Born cross sections for the subprocesses $e^+e^-\to \phi\pi^0\pi^0$, $K(1460)^+K^-$, $K_1(1400)^+K^-$, $K_1(1270)^+K^-$ and $K^*(892)^+K^*(892)^-$ are also measured. In addition kinematic distributions are measured at the centre-of-mass energies with the highest integrated luminosity, i.e. 2.125 and 2.396 GeV. Beam energy must be specified as analysis option "ENERGY" when rivet-merging samples.

Source code: BESIII_2020_I1775344.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- > K+K- pi0pi0
 10  class BESIII_2020_I1775344 : public Analysis {
 11  public:
 12
 13    /// Constructor
 14    RIVET_DEFAULT_ANALYSIS_CTOR(BESIII_2020_I1775344);
 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      // histograms
 26      for(unsigned int ix=0;ix<6;++ix) {
 27        book(_c[ix], 1+ix,1,1);
 28      }
 29      for (const string& en : _c[0].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()) MSG_ERROR("Beam energy incompatible with analysis.");
 37      if(isCompatibleWithSqrtS(2.125*GeV,1e-3)) {
 38        book(_h_KK   ,7,1,1);
 39        book(_h_pipi ,7,1,2);
 40        book(_h_Kpi  ,7,1,3);
 41        book(_h_KKpi ,7,1,4);
 42        book(_h_Kpipi,7,1,5);
 43      }
 44      else if(isCompatibleWithSqrtS(2.396*GeV,1e-3)) {
 45        book(_h_KK   ,8,1,1);
 46        book(_h_pipi ,8,1,2);
 47        book(_h_Kpi  ,8,1,3);
 48        book(_h_KKpi ,8,1,4);
 49        book(_h_Kpipi,8,1,5);
 50      }
 51    }
 52
 53    void findChildren(const Particle & p,map<long,int> & nRes, int &ncount) {
 54      for (const Particle &child : p.children()) {
 55        if(child.children().empty()) {
 56          nRes[child.pid()]-=1;
 57          --ncount;
 58        }
 59        else
 60          findChildren(child,nRes,ncount);
 61      }
 62    }
 63
 64    /// Perform the per-event analysis
 65    void analyze(const Event& event) {
 66      const FinalState& fs = apply<FinalState>(event, "FS");
 67      // find the final-state particles
 68      map<long,int> nCount;
 69      int ntotal(0);
 70      Particles Kp,pi0;
 71      for (const Particle& p : fs.particles()) {
 72        nCount[p.pid()] += 1;
 73        ++ntotal;
 74        if(p.abspid()==321)
 75          Kp.push_back(p);
 76        else if(p.pid()==111)
 77          pi0.push_back(p);
 78      }
 79      // intermediates
 80      const FinalState& ufs = apply<FinalState>(event, "UFS");
 81      for (const Particle& p : ufs.particles(Cuts::abspid==100321 or
 82                                             Cuts::abspid==10323  or
 83                                             Cuts::abspid==20323  or
 84                                             Cuts::pid   ==333    or
 85                                             Cuts::abspid==323   )) {
 86        if(p.children().empty()) continue;
 87        map<long,int> nRes=nCount;
 88        int ncount = ntotal;
 89        findChildren(p,nRes,ncount);
 90        // X-/+ with K+/-
 91        if((p.abspid()==100321 || p.abspid()== 10323 || p.abspid()==20323) && ncount==1) {
 92          bool matched = true;
 93          int Kid = -p.pid()/p.abspid()*321;
 94          for(auto const & val : nRes) {
 95            if(val.first==Kid) {
 96              if(val.second!=1) {
 97                matched = false;
 98                break;
 99              }
100            }
101            else if(val.second!=0) {
102              matched = false;
103              break;
104            }
105          }
106          if(matched) {
107            if(p.abspid()==100321)
108              _c[2]->fill(_ecms);
109            else if(p.abspid()== 20323)
110              _c[3]->fill(_ecms);
111            else if(p.abspid()==10323)
112              _c[4]->fill(_ecms);
113          }
114        }
115        // phi + 2pi0
116        else if(p.pid()==333 && ncount==2) {
117          bool matched = true;
118          for(auto const & val : nRes) {
119            if(val.first==111) {
120              if(val.second!=2) {
121                matched = false;
122                break;
123              }
124            }
125            else if(val.second!=0) {
126              matched = false;
127              break;
128            }
129          }
130          if(matched)
131            _c[1]->fill(_ecms);
132        }
133        // K*K*
134        else if(p.abspid()==323) {
135          for (const Particle& p2 : ufs.particles(Cuts::pid==-p.pid())) {
136            map<long,int> nResB = nRes;
137            int ncountB = ncount;
138            findChildren(p2,nResB,ncountB);
139            if(ncountB!=0) continue;
140            bool matched = true;
141            for(auto const & val : nResB) {
142              if(val.second!=0) {
143                matched = false;
144                break;
145              }
146            }
147            if(matched)
148              _c[5]->fill(_ecms);
149          }
150        }
151      }
152      // final-state
153      if(ntotal==4 && nCount[321]==1 && nCount[-321]==1 && nCount[111]==2) {
154        _c[0]->fill(_ecms);
155        if(_h_KK) {
156          FourMomentum pKK = Kp[0].momentum()+Kp[1].momentum();
157          _h_KK->fill(pKK.mass());
158          FourMomentum pPi = pi0[0].momentum()+pi0[1].momentum();
159          _h_pipi->fill(pPi.mass());
160          for(unsigned int ix=0;ix<2;++ix) {
161            _h_KKpi ->fill((pKK+pi0[ix].momentum()).mass());
162            _h_Kpipi->fill((pPi+ Kp[ix].momentum()).mass());
163            for(unsigned int iy=0;iy<2;++iy)
164              _h_Kpi->fill((Kp[ix].momentum()+pi0[iy].momentum()).mass());
165          }
166        }
167      }
168    }
169
170
171    /// Normalise histograms etc., after the run
172    void finalize() {
173      double fact = crossSection()/ sumOfWeights() /nanobarn;
174      for(unsigned int ix=0;ix<6;++ix) {
175        scale(_c[ix],fact);
176      }
177      if(_h_KK) {
178        normalize(_h_KK   );
179        normalize(_h_pipi );
180        normalize(_h_Kpi  );
181        normalize(_h_KKpi );
182        normalize(_h_Kpipi);
183      }
184    }
185
186    /// @}
187
188
189    /// @name Histograms
190    /// @{
191    BinnedHistoPtr<string> _c[6];
192    string _ecms;
193    Histo1DPtr _h_KK, _h_pipi, _h_Kpi, _h_KKpi, _h_Kpipi;
194    /// @}
195
196  };
197
198
199  RIVET_DECLARE_PLUGIN(BESIII_2020_I1775344);
200
201}