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*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}
|