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: (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:
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}
|