Rivet analyses referenceCLEOC_2005_I654529Cross sections for exclusive hadronic processes in $e^+e^-$ collisions at $\sqrt{s}=3.67$Experiment: CLEOC (CESR) Inspire ID: 654529 Status: VALIDATED NOHEPDATA Authors:
Beam energies: (1.8, 1.8) GeV Run details:
Cross sections for $e^+e^-\to\pi^+\pi^-\pi^0$, $\rho\pi$, $\omega\pi$, $\phi\pi$, $\rho\eta$, $\omega\eta$, $K^{*0}\bar{K}^0$ and $K^{*+}K^-$ at $\sqrt{s}=3.67$ Source code: CLEOC_2005_I654529.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- > hadrons at 3.67
10 class CLEOC_2005_I654529 : public Analysis {
11 public:
12
13 /// Constructor
14 RIVET_DEFAULT_ANALYSIS_CTOR(CLEOC_2005_I654529);
15
16
17 /// @name Analysis methods
18 /// @{
19
20 /// Book histograms and initialise projections before the run
21 void init() {
22 // projection
23 declare(FinalState(), "FS");
24 declare(UnstableParticles(), "UFS");
25 // histos
26 for (unsigned int ix=0; ix<14; ++ix) {
27 book(_h[ix], 1, 1, 1+ix);
28 }
29 }
30
31 void findChildren(const Particle & p,map<long,int> & nRes, int &ncount) {
32 for (const Particle &child : p.children()) {
33 if (child.children().empty()) {
34 --nRes[child.pid()];
35 --ncount;
36 }
37 else {
38 findChildren(child,nRes,ncount);
39 }
40 }
41 }
42
43 /// Perform the per-event analysis
44 void analyze(const Event& event) {
45 // final state particles
46 const FinalState& fs = apply<FinalState>(event, "FS");
47 map<long,int> nCount;
48 int ntotal(0);
49 for (const Particle& p : fs.particles()) {
50 nCount[p.pid()] += 1;
51 ++ntotal;
52 }
53 if (ntotal==3 && nCount[111]==1 && nCount[211]==1 && nCount[-211]==1) {
54 _h[0]->fill("3.67"s);
55 }
56 // unstable particles
57 const UnstableParticles& ufs = apply<UnstableParticles>(event, "UFS");
58 // first the omega, rho, phi and b_10 pi0 final state
59 bool matched=false;
60 for (const Particle& p : ufs.particles(Cuts::pid==113 ||
61 Cuts::pid==223 ||
62 Cuts::pid==333 ||
63 Cuts::pid==10113)) {
64 if (p.children().empty()) continue;
65 map<long,int> nRes = nCount;
66 int ncount = ntotal;
67 findChildren(p,nRes,ncount);
68 if (ncount==1) {
69 matched=true;
70 for (const auto& val : nRes) {
71 if (val.first==111) {
72 if (val.second !=1) {
73 matched = false;
74 break;
75 }
76 }
77 else if(val.second!=0) {
78 matched = false;
79 break;
80 }
81 }
82 if (matched) {
83 if (p.pid()==113) {
84 _h[1]->fill("3.67"s);
85 _h[2]->fill("3.67"s);
86 }
87 else if (p.pid()==223) _h[4]->fill("3.67"s);
88 else if (p.pid()==333) _h[5]->fill("3.67"s);
89 else if (p.pid()==10113) {
90 _h[11]->fill("3.67"s);
91 _h[12]->fill("3.67"s);
92 }
93 break;
94 }
95 }
96 else if (p.pid()!=10113) {
97 // check for eta
98 for (const Particle& p2 : ufs.particles(Cuts::pid==221)) {
99 map<long,int> nResB = nRes;
100 int ncountB = ncount;
101 findChildren(p2,nResB,ncountB);
102 if (ncountB!=0) continue;
103 matched = true;
104 for (const auto& val : nResB) {
105 if (val.second!=0) {
106 matched = false;
107 break;
108 }
109 }
110 if (matched) {
111 if (p.pid()==113) _h[6]->fill("3.67"s);
112 else if(p.pid()==223) _h[7]->fill("3.67"s);
113 else if(p.pid()==333) _h[8]->fill("3.67"s);
114 break;
115 }
116 }
117 }
118 }
119 if (matched) return;
120 // rho+- b1+- pi-+
121 for (const Particle& p : ufs.particles(Cuts::abspid==213 ||
122 Cuts::abspid==10213)) {
123 if (p.children().empty()) continue;
124 map<long,int> nRes = nCount;
125 int ncount = ntotal;
126 findChildren(p,nRes,ncount);
127 if(ncount!=1) continue;
128 int sign = - p.pid()/p.abspid();
129 matched=true;
130 for (const auto& val : nRes) {
131 if (val.first==sign*211 ) {
132 if (val.second !=1) {
133 matched = false;
134 break;
135 }
136 }
137 else if(val.second!=0) {
138 matched = false;
139 break;
140 }
141 }
142 if (matched) {
143 if (p.abspid()==213) {
144 _h[1]->fill("3.67"s);
145 _h[3]->fill("3.67"s);
146 }
147 else {
148 _h[11]->fill("3.67"s);
149 _h[13]->fill("3.67"s);
150 }
151 break;
152 }
153 }
154 if (matched) return;
155 // K* K
156 for (const Particle& p : ufs.particles(Cuts::abspid==313 || Cuts::abspid==323)) {
157 if (p.children().empty()) continue;
158 map<long,int> nRes = nCount;
159 int ncount = ntotal;
160 findChildren(p,nRes,ncount);
161 if (ncount!=1) continue;
162 int iMeson=0;
163 int iStable=0;
164 for (const auto& val : nRes) {
165 if (val.second==1) {
166 iStable+=1;
167 iMeson=val.first;
168 }
169 else if (val.second!=0) {
170 matched = false;
171 break;
172 }
173 }
174 if (iStable==1) {
175 if (p.abspid()==313 || (iMeson==310 || iMeson==130)) {
176 _h[9]->fill("3.67"s);
177 break;
178 }
179 else if (p.abspid()==323 and abs(iMeson)==321 && p.pid()*iMeson<0) {
180 _h[10]->fill("3.67"s);
181 break;
182 }
183 matched=false;
184 }
185 else {
186 matched=false;
187 }
188 }
189 }
190
191
192 /// Normalise histograms etc., after the run
193 void finalize() {
194 scale(_h, crossSection()/picobarn/sumOfWeights());
195 }
196
197 /// @}
198
199
200 /// @name Histograms
201 /// @{
202 BinnedHistoPtr<string> _h[14];
203 /// @}
204
205
206 };
207
208
209 RIVET_DECLARE_PLUGIN(CLEOC_2005_I654529);
210}
|