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