Rivet analyses referenceBESIII_2020_I1775344Cross section for $e^+e^-\to K^+K^-\pi^0\pi^0$ from 2.000 to 2.644 GeVExperiment: BESIII (BEPC) Inspire ID: 1775344 Status: VALIDATED Authors:
Beam energies: ANY Run details:
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}
|