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,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,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	Scatter2D temphisto(refData(ix+1, 1, 1));
171	Scatter2DPtr  mult;
172        book(mult, ix+1, 1, 1);
173	for (size_t b = 0; b < temphisto.numPoints(); b++) {
174	  const double x  = temphisto.point(b).x();
175	  pair<double,double> ex = temphisto.point(b).xErrs();
176	  pair<double,double> ex2 = ex;
177	  if(ex2.first ==0.) ex2. first=0.0001;
178	  if(ex2.second==0.) ex2.second=0.0001;
179	  if (inRange(sqrtS()/GeV, x-ex2.first, x+ex2.second)) {
180	    mult->addPoint(x, sigma, ex, make_pair(error,error));
181	  }
182	  else {
183	    mult->addPoint(x, 0., ex, make_pair(0.,.0));
184	  }
185	}
186      }
187      if(_h_KK) {
188	normalize(_h_KK   );
189	normalize(_h_pipi );
190	normalize(_h_Kpi  );
191	normalize(_h_KKpi );
192	normalize(_h_Kpipi);
193      }
194    }
195
196    ///@}
197
198
199    /// @name Histograms
200    ///@{
201    CounterPtr _c[6];
202    Histo1DPtr _h_KK, _h_pipi, _h_Kpi, _h_KKpi, _h_Kpipi;
203    ///@}
204
205
206  };
207
208
209  RIVET_DECLARE_PLUGIN(BESIII_2020_I1775344);
210
211}