Rivet analyses referenceBABAR_2018_I1700745Cross section for $e^+e^-\to\pi^+\pi^-3\pi^0$ and $\pi^+\pi^-2\pi^0\eta$ between threshold and 4.35 GeVExperiment: BABAR (PEP-II) Inspire ID: 1700745 Status: VALIDATED Authors:
Beam energies: (0.6, 0.6); (0.6, 0.6); (0.6, 0.6); (0.6, 0.6); (0.7, 0.7); (0.7, 0.7); (0.7, 0.7); (0.7, 0.7); (0.8, 0.8); (0.8, 0.8); (0.8, 0.8); (0.8, 0.8); (0.9, 0.9); (0.9, 0.9); (0.9, 0.9); (0.9, 0.9); (1.0, 1.0); (1.0, 1.0); (1.0, 1.0); (1.0, 1.0); (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.2, 1.2); (1.3, 1.3); (1.3, 1.3); (1.3, 1.3); (1.3, 1.3); (1.4, 1.4); (1.4, 1.4); (1.4, 1.4); (1.4, 1.4); (1.5, 1.5); (1.5, 1.5); (1.5, 1.5); (1.5, 1.5); (1.6, 1.6); (1.6, 1.6); (1.6, 1.6); (1.6, 1.6); (1.7, 1.7); (1.7, 1.7); (1.7, 1.7); (1.7, 1.7); (1.8, 1.8); (1.8, 1.8); (1.8, 1.8); (1.8, 1.8); (1.9, 1.9); (1.9, 1.9); (1.9, 1.9); (1.9, 1.9); (2.0, 2.0); (2.0, 2.0); (2.0, 2.0); (2.0, 2.0); (2.1, 2.1); (2.1, 2.1); (2.1, 2.1); (2.1, 2.1); (2.2, 2.2) GeV Run details:
Measurement of the cross section for $e^+e^-\to\pi^+\pi^-3\pi^0$ and $\pi^+\pi^-2\pi^0\eta$ between threshold and 4.35 GeV. The cross sections for the $\pi^+\pi^-\eta$, $\omega\pi^0\pi^0$ and $\omega\pi^0\eta$ resonant contributions are also measured. Beam energy must be specified as analysis option "ENERGY" when rivet-merging samples. Source code: BABAR_2018_I1700745.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- -> pi+pi- and 3pi0 or 2pi0eta
10 class BABAR_2018_I1700745 : public Analysis {
11 public:
12
13 /// Constructor
14 RIVET_DEFAULT_ANALYSIS_CTOR(BABAR_2018_I1700745);
15
16
17 /// @name Analysis methods
18 /// @{
19
20 /// Book histograms and initialise projections before the run
21 void init() {
22
23
24 // Initialise and register projections
25 declare(FinalState(), "FS");
26 declare(UnstableParticles(), "UFS");
27
28 for(unsigned int ix=0;ix<5;++ix)
29 book(_sigma[ix], 1+ix, 1, 1);
30 for (const string& en : _sigma[0].binning().edges<0>()) {
31 const double end = std::stod(en)*GeV;
32 if (isCompatibleWithSqrtS(end)) {
33 _ecms = en;
34 break;
35 }
36 }
37 if (_ecms.empty()) {
38 if(isCompatibleWithSqrtS(1.075))
39 _ecms = "1.075";
40 else
41 MSG_ERROR("Beam energy incompatible with analysis.");
42 }
43 }
44
45 void findChildren(const Particle & p,map<long,int> & nRes, int &ncount) {
46 for(const Particle &child : p.children()) {
47 if(child.children().empty()) {
48 --nRes[child.pid()];
49 --ncount;
50 }
51 else
52 findChildren(child,nRes,ncount);
53 }
54 }
55
56 /// Perform the per-event analysis
57 void analyze(const Event& event) {
58 const FinalState& fs = apply<FinalState>(event, "FS");
59 map<long,int> nCount;
60 int ntotal(0);
61 for (const Particle& p : fs.particles()) {
62 nCount[p.pid()] += 1;
63 ++ntotal;
64 }
65 if(ntotal==5 && nCount[211]==1 && nCount[-211]==1 && nCount[111]==3)
66 _sigma[0]->fill(_ecms);
67 const FinalState& ufs = apply<FinalState>(event, "UFS");
68 for (const Particle& p : ufs.particles()) {
69 if(p.children().empty()) continue;
70 // find eta/omegas
71 if(p.pid()==221 || p.pid()==223 ) {
72 map<long,int> nRes = nCount;
73 int ncount = ntotal;
74 findChildren(p,nRes,ncount);
75 // eta
76 if(p.pid()==221) {
77 // 2 pi eta
78 if(ncount==2) {
79 bool matched = true;
80 for(auto const & val : nRes) {
81 if(abs(val.first)==211) {
82 if(val.second !=1) {
83 matched = false;
84 break;
85 }
86 }
87 else if(val.second!=0) {
88 matched = false;
89 break;
90 }
91 }
92 if(matched)
93 _sigma[1]->fill(_ecms);
94 }
95 // 4 pi eta
96 else if(ncount==4) {
97 bool matched = true;
98 for(auto const & val : nRes) {
99 if(abs(val.first)==211) {
100 if(val.second !=1) {
101 matched = false;
102 break;
103 }
104 }
105 else if(abs(val.first)==111) {
106 if(val.second !=2) {
107 matched = false;
108 break;
109 }
110 }
111 else if(val.second!=0) {
112 matched = false;
113 break;
114 }
115 }
116 if(matched)
117 _sigma[3]->fill(_ecms);
118 }
119 // pi0 omega eta
120 for (const Particle& p2 : ufs.particles()) {
121 if(p2.pid()!=223) continue;
122 map<long,int> nResB = nRes;
123 int ncountB = ncount;
124 findChildren(p2,nResB,ncountB);
125 if(ncountB!=1) continue;
126 bool matched = true;
127 for(auto const & val : nResB) {
128 if(abs(val.first)==111) {
129 if(val.second !=1) {
130 matched = false;
131 break;
132 }
133 }
134 else if(val.second!=0) {
135 matched = false;
136 break;
137 }
138 }
139 if(matched) {
140 _sigma[4]->fill(_ecms);
141 break;
142 }
143 }
144 }
145 else {
146 if(ncount!=2) continue;
147 bool matched = true;
148 for(auto const & val : nRes) {
149 if(abs(val.first)==111) {
150 if(val.second !=2) {
151 matched = false;
152 break;
153 }
154 }
155 else if(val.second!=0) {
156 matched = false;
157 break;
158 }
159 }
160 if(matched)
161 _sigma[2]->fill(_ecms);
162 }
163 }
164 }
165 }
166
167 /// Normalise histograms etc., after the run
168 void finalize() {
169 double fact = crossSection()/ sumOfWeights() /nanobarn;
170 for (unsigned int ix=0;ix<5;++ix)
171 scale(_sigma[ix],fact);
172 }
173 /// @}
174
175
176 /// @name Histograms
177 /// @{
178 BinnedHistoPtr<string> _sigma[5];
179 string _ecms;
180 /// @}
181
182 };
183
184
185 RIVET_DECLARE_PLUGIN(BABAR_2018_I1700745);
186
187
188}
|