Rivet analyses referenceCMD3_2017_I1606078Cross section for $e^+e^-\to\pi^+\pi^-\pi^0\eta$ for energies below 2 GeVExperiment: CMD3 (VEPP-2M) Inspire ID: 1606078 Status: VALIDATED Authors:
Beam energies: ANY Run details:
Measurement of the cross section for $e^+e^-\to\pi^+\pi^-\pi^0\eta$, and the resonant sub-processes $\omega\eta$and $a_0(980)\rho$, for energies below 2 GeV by the CMD3 experiment Source code: CMD3_2017_I1606078.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 CMD3 pi+pi-pi0eta cross section
10 class CMD3_2017_I1606078 : public Analysis {
11 public:
12
13 /// Constructor
14 RIVET_DEFAULT_ANALYSIS_CTOR(CMD3_2017_I1606078);
15
16
17 /// @name Analysis methods
18 /// @{
19
20 /// Book histograms and initialise projections before the run
21 void init() {
22
23 // Initialise and register projections
24 declare(FinalState(), "FS");
25 declare(UnstableParticles(), "UFS");
26
27
28 book(_c_all , "/TMP/all");
29 book(_c_omega, "/TMP/omega");
30 book(_c_rho , "/TMP/rho");
31 book(_c_other, "/TMP/other");
32 }
33
34 void findChildren(const Particle & p,map<long,int> & nRes, int &ncount) {
35 for(const Particle &child : p.children()) {
36 if(child.children().empty()) {
37 --nRes[child.pid()];
38 --ncount;
39 }
40 else
41 findChildren(child,nRes,ncount);
42 }
43 }
44
45 /// Perform the per-event analysis
46 void analyze(const Event& event) {
47 // find the final-state particles
48 const FinalState& fs = apply<FinalState>(event, "FS");
49 map<long,int> nCount;
50 int ntotal(0);
51 for (const Particle& p : fs.particles()) {
52 nCount[p.pid()] += 1;
53 ++ntotal;
54 }
55 // find omega/phi + eta
56 const FinalState& ufs = apply<FinalState>(event, "UFS");
57 bool found = false, foundOmegaPhi = false;
58 for (const Particle& p : ufs.particles()) {
59 if(p.children().empty()) continue;
60 // find the eta
61 if(p.pid()!=221) continue;
62 map<long,int> nRes = nCount;
63 int ncount = ntotal;
64 findChildren(p,nRes,ncount);
65 // eta pi+pi-pi0
66 if(ncount==3) {
67 bool matched = true;
68 for(auto const & val : nRes) {
69 if(abs(val.first)==211 || val.first==111 ) {
70 if(val.second !=1) {
71 matched = false;
72 break;
73 }
74 }
75 else if(val.second!=0) {
76 matched = false;
77 break;
78 }
79 }
80 if(matched) {
81 _c_all->fill();
82 found = true;
83 }
84 }
85 for (const Particle& p2 : ufs.particles()) {
86 if(p2.pid()!=223 && p2.pid()!=333) continue;
87 map<long,int> nResB = nRes;
88 int ncountB = ncount;
89 findChildren(p2,nResB,ncountB);
90 if(ncountB!=0) continue;
91 bool matched2 = true;
92 for(auto const & val : nResB) {
93 if(val.second!=0) {
94 matched2 = false;
95 break;
96 }
97 }
98 if(matched2) {
99 if(p2.pid()==223)
100 _c_omega->fill();
101 foundOmegaPhi=true;
102 }
103 }
104 }
105 // find a_0 rho
106 bool founda0Rho=false;
107 for (const Particle& p : ufs.particles()) {
108 if(p.children().empty()) continue;
109 // find the rho
110 if(p.pid()!=113 && abs(p.pid())!=213)
111 continue;
112 map<long,int> nRes = nCount;
113 int ncount = ntotal;
114 findChildren(p,nRes,ncount);
115 int a1id(0);
116 if(p.pid()==213)
117 a1id = 9000211;
118 else if(p.pid()==-213)
119 a1id =-9000211;
120 else
121 a1id = 9000111;
122 for (const Particle& p2 : ufs.particles()) {
123 if(p2.pid()!=a1id) continue;
124 map<long,int> nResB = nRes;
125 int ncountB = ncount;
126 findChildren(p2,nResB,ncountB);
127 if(ncountB!=0) continue;
128 bool matched = true;
129 for(auto const & val : nResB) {
130 if(val.second!=0) {
131 matched = false;
132 break;
133 }
134 }
135 if(matched) {
136 _c_rho->fill();
137 founda0Rho=true;
138 break;
139 }
140 }
141 if(founda0Rho) break;
142 }
143 if(found && !foundOmegaPhi && ! founda0Rho)
144 _c_other->fill();
145 }
146
147
148 /// Normalise histograms etc., after the run
149 void finalize() {
150 double fact = crossSection()/nanobarn/sumOfWeights();
151 for (unsigned int ix=1;ix<5;++ix) {
152 double sigma(0.),error(0.);
153 if(ix==1) {
154 sigma = _c_all->val()*fact;
155 error = _c_all->err()*fact;
156 }
157 else if(ix==2) {
158 sigma = _c_omega->val()*fact;
159 error = _c_omega->err()*fact;
160 }
161 else if(ix==3) {
162 sigma = _c_rho->val()*fact;
163 error = _c_rho->err()*fact;
164 }
165 else if(ix==4) {
166 sigma = _c_other->val()*fact;
167 error = _c_other->err()*fact;
168 }
169 Estimate1DPtr mult;
170 book(mult, 1, 1, ix);
171 for (auto& b : mult->bins()) {
172 if (inRange(sqrtS()/MeV, b.xMin(), b.xMax())) {
173 b.set(sigma, error);
174 }
175 }
176 }
177 }
178
179 /// @}
180
181
182 /// @name Histograms
183 /// @{
184 CounterPtr _c_all, _c_omega, _c_rho, _c_other;
185 /// @}
186
187
188 };
189
190
191 RIVET_DECLARE_PLUGIN(CMD3_2017_I1606078);
192
193
194}
|