Rivet analyses referenceND_1991_I321108Cross sections for $e^+e^-\to$ exclusive hadronic states between 0.5 and 1.4 GeV.Experiment: ND (VEPP-2M) Inspire ID: 321108 Status: VALIDATED Authors:
Beam energies: ANY Run details:
Measurement of the cross section for $e^+e^-\to \pi^+\pi^-$, $K^+K^-$, $K^0_SK^0_L$, $\pi^+\pi^-\pi^0$, $2\pi^+2\pi^-$, $\pi^+\pi^-2\pi^0$, $\omega\pi^0$, $\eta\pi^+\pi^-$ and $2\pi^+2\pi^-\pi^0$ by ND for energies between 0.5 and 1.4 GeV. Source code: ND_1991_I321108.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 ND measurement of exclusive hadronic final states
10 class ND_1991_I321108 : public Analysis {
11 public:
12
13 /// Constructor
14 RIVET_DEFAULT_ANALYSIS_CTOR(ND_1991_I321108);
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 book(_nOmegaPi, "TMP/OmegaPi");
28 book(_n2Pi, "TMP/2Pi");
29 book(_n3Pi, "TMP/3Pi");
30 book(_n4PiC, "TMP/4PiC");
31 book(_n4PiN, "TMP/4PiN");
32 book(_nEtaPiPi, "TMP/EtaPiPi");
33 book(_nKC, "TMP/KC");
34 book(_nKN, "TMP/KN");
35 book(_n5Pi, "TMP/5Pi");
36 }
37
38
39 void findChildren(const Particle & p,map<long,int> & nRes, int &ncount) {
40 for (const Particle &child : p.children()) {
41 if(child.children().empty()) {
42 --nRes[child.pid()];
43 --ncount;
44 }
45 else
46 findChildren(child,nRes,ncount);
47 }
48 }
49
50 /// Perform the per-event analysis
51 void analyze(const Event& event) {
52
53 const FinalState& fs = apply<FinalState>(event, "FS");
54
55 map<long,int> nCount;
56 int ntotal(0);
57 for (const Particle& p : fs.particles()) {
58 nCount[p.pid()] += 1;
59 ++ntotal;
60 }
61 if(ntotal==2) {
62 if(nCount[211]==1&&nCount[-211]==1)
63 _n2Pi->fill();
64 if(nCount[321]==1&&nCount[-321]==1)
65 _nKC->fill();
66 if(nCount[310]==1&&nCount[130]==1)
67 _nKN->fill();
68 }
69 else if(ntotal==3) {
70 if(nCount[211]==1&&nCount[-211]==1&&nCount[111]==1)
71 _n3Pi->fill();
72 }
73 else if(ntotal==4) {
74 if(nCount[211]==2&&nCount[-211]==2)
75 _n4PiC->fill();
76 else if(nCount[211]==1&&nCount[-211]==1&&nCount[111]==2)
77 _n4PiN->fill();
78 }
79 else if(ntotal==5) {
80 if(nCount[211]==2&&nCount[-211]==2&&nCount[111]==1)
81 _n5Pi->fill();
82 }
83
84 const FinalState& ufs = apply<FinalState>(event, "UFS");
85 for (const Particle& p : ufs.particles()) {
86 if(p.children().empty()) continue;
87 // find the eta
88 if(p.pid()==221) {
89 map<long,int> nRes = nCount;
90 int ncount = ntotal;
91 findChildren(p,nRes,ncount);
92 // eta pi+pi-
93 if(ncount!=2) continue;
94 bool matched = true;
95 for(auto const & val : nRes) {
96 if(abs(val.first)==211) {
97 if(val.second !=1) {
98 matched = false;
99 break;
100 }
101 }
102 else if(val.second!=0) {
103 matched = false;
104 break;
105 }
106 }
107 if(matched)
108 _nEtaPiPi->fill();
109 }
110 else if(p.pid()==223) {
111 map<long,int> nRes = nCount;
112 int ncount = ntotal;
113 findChildren(p,nRes,ncount);
114 // eta pi+pi-
115 if(ncount!=1) continue;
116 bool matched = true;
117 for(auto const & val : nRes) {
118 if(abs(val.first)==111) {
119 if(val.second !=1) {
120 matched = false;
121 break;
122 }
123 }
124 else if(val.second!=0) {
125 matched = false;
126 break;
127 }
128 }
129 if(matched)
130 _nOmegaPi->fill();
131 }
132 }
133 }
134
135
136 /// Normalise histograms etc., after the run
137 void finalize() {
138 for(unsigned int ix=1;ix<15;++ix) {
139 unsigned int ymax=2;
140 double sigma(0.),error(0.);
141 if(ix<=4) {
142 sigma = _nOmegaPi->val();
143 error = _nOmegaPi->err();
144 }
145 else if(ix==5) {
146 sigma = _n3Pi->val();
147 error = _n3Pi->err();
148 }
149 else if(ix==6) {
150 sigma = _nEtaPiPi->val();
151 error = _nEtaPiPi->err();
152 }
153 else if(ix==7) {
154 sigma = _n4PiC->val();
155 error = _n4PiC->err();
156 }
157 else if(ix==8) {
158 sigma = _n4PiN->val();
159 error = _n4PiN->err();
160 }
161 else if(ix==9) {
162 continue;
163 }
164 else if(ix==10) {
165 ymax=5;
166 }
167 else if(ix==11) {
168 sigma = _n2Pi->val();
169 error = _n2Pi->err();
170 }
171 else if(ix==12) {
172 sigma = _nKC->val();
173 error = _nKC->err();
174 }
175 else if(ix==13) {
176 sigma = _nKN->val();
177 error = _nKN->err();
178 }
179 else if(ix==14) {
180 sigma = _n5Pi->val();
181 error = _n5Pi->err();
182 }
183 sigma *= crossSection()/ sumOfWeights() /nanobarn;
184 error *= crossSection()/ sumOfWeights() /nanobarn;
185 for(unsigned int iy=1;iy<ymax;++iy) {
186 if(ix==10) {
187 if(iy==1) {
188 sigma = _n4PiC->val();
189 error = _n4PiC->err();
190 }
191 else if(iy==2) {
192 sigma = _n4PiN->val();
193 error = _n4PiN->err();
194 }
195 else if(iy==3) {
196 sigma = _nOmegaPi->val();
197 error = _nOmegaPi->err();
198 }
199 else {
200 sigma = _n3Pi->val();
201 error = _n3Pi->err();
202 }
203 sigma *= crossSection()/ sumOfWeights() /nanobarn;
204 error *= crossSection()/ sumOfWeights() /nanobarn;
205 }
206 Scatter2D temphisto(refData(ix, 1, iy));
207 Scatter2DPtr mult;
208 book(mult, ix, 1, iy);
209 for (size_t b = 0; b < temphisto.numPoints(); b++) {
210 const double x = temphisto.point(b).x();
211 pair<double,double> ex = temphisto.point(b).xErrs();
212 pair<double,double> ex2 = ex;
213 if(ex2.first ==0.) ex2. first=0.0001;
214 if(ex2.second==0.) ex2.second=0.0001;
215 if (inRange(sqrtS()/GeV, x-ex2.first, x+ex2.second)) {
216 mult->addPoint(x, sigma, ex, make_pair(error,error));
217 }
218 else {
219 mult->addPoint(x, 0., ex, make_pair(0.,.0));
220 }
221 }
222 }
223 }
224 }
225
226 //@}
227
228
229 /// @name Histograms
230 //@{
231 CounterPtr _nOmegaPi,_n2Pi,_n3Pi,_n4PiC,_n4PiN,_nEtaPiPi,_nKC,_nKN,_n5Pi;
232 //@}
233
234
235 };
236
237
238 // The hook for the plugin system
239 RIVET_DECLARE_PLUGIN(ND_1991_I321108);
240
241
242}
|