Rivet analyses referenceBABAR_2022_I2120528Cross section for $e^+e^-\to K^+K^-3\pi^0$, $K^0_SK^\pm\pi^\mp2\pi^0$ and $K^0_SK^\pm\pi^\mp\pi^+\pi^-$ between threshold and 4.5 GeVExperiment: BABAR (PEP-II) Inspire ID: 2120528 Status: VALIDATED NOHEPDATA Authors:
Beam energies: ANY Run details:
Cross sections for $e^+e^-\to K^+K^-3\pi^0$, $K^0_SK^\pm\pi^\mp2\pi^0$ and $K^0_SK^\pm\pi^\mp\pi^+\pi^-$ between threshold and 4.5 GeV using radiative events. The cross sections for a number of resonant contributions are also measured. Source code: BABAR_2022_I2120528.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- -> KK 3pi
10 class BABAR_2022_I2120528 : public Analysis {
11 public:
12
13 /// Constructor
14 RIVET_DEFAULT_ANALYSIS_CTOR(BABAR_2022_I2120528);
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 for (unsigned int ix=0; ix<10; ++ix) {
26 book(_sigma[ix], "TMP/n" + toString(ix+1), refData(1+ix,1,1));
27 }
28 }
29
30 void findChildren(const Particle & p,map<long,int> & nRes, int &ncount) {
31 for (const Particle &child : p.children()) {
32 if(child.children().empty()) {
33 nRes[child.pid()]-=1;
34 --ncount;
35 }
36 else {
37 findChildren(child,nRes,ncount);
38 }
39 }
40 }
41
42 /// Perform the per-event analysis
43 void analyze(const Event& event) {
44 const FinalState& fs = apply<FinalState>(event, "FS");
45 map<long,int> nCount;
46 int ntotal(0);
47 for (const Particle& p : fs.particles()) {
48 nCount[p.pid()] += 1;
49 ++ntotal;
50 }
51 // stable particles
52 if (ntotal==5) {
53 // K+K- 3pi0
54 if(nCount[-321]==1 && nCount[321]==1 && nCount[111]==3) _sigma[0]->fill(sqrtS());
55 // KS0 Kpi 2pi0
56 else if (nCount[111]==2 &&nCount[310]==1 &&
57 ((nCount[ 321]==1 && nCount[-211]==1) ||
58 (nCount[-321]==1 && nCount[ 211]==1))) _sigma[1]->fill(sqrtS());
59 // KS0 Kpi pi+pi-
60 else if (nCount[310]==1 &&
61 ((nCount[ 321]==1 && nCount[-211]==2 && nCount[ 211]==1) ||
62 (nCount[-321]==1 && nCount[ 211]==2 && nCount[-211]==1))) _sigma[2]->fill(sqrtS());
63 }
64 // now the resonant states
65 // first K+K- eta and phi eta
66 const FinalState& ufs = apply<FinalState>(event, "UFS");
67 for (const Particle& p : ufs.particles(Cuts::pid==PID::ETA)) {
68 if (p.children().empty()) continue;
69 map<long,int> nRes=nCount;
70 int ncount = ntotal;
71 findChildren(p,nRes,ncount);
72 bool matched1 = false;
73 if (ncount==2) {
74 matched1 = true;
75 for (const auto& val : nRes) {
76 if (abs(val.first)==PID::KPLUS) {
77 if (val.second!=1) {
78 matched1 = false;
79 break;
80 }
81 }
82 else if (val.second!=0) {
83 matched1 = false;
84 break;
85 }
86 }
87 if (matched1) {
88 _sigma[3]->fill(sqrtS());
89 }
90 }
91 bool matched2=false;
92 for (const Particle& p2 : ufs.particles(Cuts::pid==PID::PHI)) {
93 if (p2.children().empty()) continue;
94 map<long,int> nRes2 = nRes;
95 int ncount2 = ncount;
96 findChildren(p2,nRes2,ncount2);
97 if (ncount2!=0) continue;
98 matched2=true;
99 for (const auto& val : nRes2) {
100 if (val.second!=0) {
101 matched2 = false;
102 break;
103 }
104 }
105 if (matched2) {
106 _sigma[4]->fill(sqrtS());
107 break;
108 }
109 }
110 if (matched1 || matched2) break;
111 }
112 // states with a K*
113 Particles Kstar = ufs.particles(Cuts::abspid==313 or Cuts::abspid==323);
114 for (unsigned int ix=0; ix<Kstar.size(); ++ix) {
115 if (Kstar[ix].children().empty()) continue;
116 map<long,int> nRes=nCount;
117 int ncount = ntotal;
118 findChildren(Kstar[ix],nRes,ncount);
119 bool matched1=false;
120 if (ncount==3) {
121 int idother=310;
122 if (Kstar[ix].abspid()==323) idother= -321*(Kstar[ix].pid()/Kstar[ix].abspid());
123 for (const auto& val : nRes) {
124 if (val.first==idother) {
125 if (val.second!=1) {
126 matched1 = false;
127 break;
128 }
129 }
130 else if (val.first==PID::PI0) {
131 if(val.second!=2) {
132 matched1 = false;
133 break;
134 }
135 }
136 else if(val.second!=0) {
137 matched1 = false;
138 break;
139 }
140 }
141 if (matched1) {
142 if (Kstar[ix].abspid()==321) _sigma[7]->fill(sqrtS());
143 else _sigma[6]->fill(sqrtS());
144 }
145 // K*+ K*-
146 bool matched2=false;
147 for (unsigned int iy=0;iy<ix+1;++iy) {
148 if (Kstar[iy].children().empty() ||
149 Kstar[iy].abspid()==313 ||
150 Kstar[iy].pid()!=-Kstar[ix].pid()) {
151 continue;
152 }
153 map<long,int> nRes2 = nRes;
154 int ncount2 = ncount;
155 findChildren(Kstar[iy],nRes2,ncount2);
156 if (ncount2!=1) continue;
157 matched2=true;
158 for (const auto& val : nRes2) {
159 if (val.first==PID::PI0) {
160 if (val.second!=1) {
161 matched2 = false;
162 break;
163 }
164 }
165 if (val.second!=0) {
166 matched2 = false;
167 break;
168 }
169 }
170 if (matched2) {
171 _sigma[5]->fill(sqrtS());
172 break;
173 }
174 }
175 }
176 }
177 // finally f_1
178 for (const Particle& p : ufs.particles(Cuts::abspid==PID::RHOPLUS)) {
179 if (p.children().empty()) continue;
180 map<long,int> nRes=nCount;
181 int ncount = ntotal;
182 findChildren(p,nRes,ncount);
183 bool matched1 = false;
184 if (ncount==3) {
185 int idother = -(p.pid()/p.abspid())*321;
186 matched1 = true;
187 for(const auto& val : nRes) {
188 if (val.first==PID::PI0 || val.first==idother || val.first==PID::K0S) {
189 if (val.second!=1) {
190 matched1 = false;
191 break;
192 }
193 }
194 else if (val.second!=0) {
195 matched1 = false;
196 break;
197 }
198 }
199 if (matched1) {
200 _sigma[8]->fill(sqrtS());
201 }
202 }
203 if (matched1) break;
204 }
205 // finally f_1
206 for (const Particle& p : ufs.particles(Cuts::pid==20223)) {
207 if (p.children().empty()) continue;
208 map<long,int> nRes=nCount;
209 int ncount = ntotal;
210 findChildren(p,nRes,ncount);
211 bool matched1 = false;
212 if (ncount==2) {
213 matched1 = true;
214 for (const auto& val : nRes) {
215 if (abs(val.first)==PID::PIPLUS) {
216 if (val.second!=1) {
217 matched1 = false;
218 break;
219 }
220 }
221 else if (val.second!=0) {
222 matched1 = false;
223 break;
224 }
225 }
226 if (matched1) {
227 _sigma[9]->fill(sqrtS());
228 }
229 }
230 if (matched1) break;
231 }
232 }
233
234
235 /// Normalise histograms etc., after the run
236 void finalize() {
237 const double fact = crossSection()/ sumOfWeights() /nanobarn;
238 for(unsigned int ix=0;ix<10;++ix) {
239 scale(_sigma[ix],fact);
240 Estimate1DPtr tmp;
241 book(tmp,1+ix,1,1);
242 barchart(_sigma[ix],tmp);
243 }
244 }
245
246 /// @}
247
248
249 /// @name Histograms
250 /// @{
251 Histo1DPtr _sigma[10];
252 /// @}
253
254
255 };
256
257
258 RIVET_DECLARE_PLUGIN(BABAR_2022_I2120528);
259
260}
|