Rivet analyses referenceARGUS_2000_I511512γγ→K∗0ˉK∗0 and K∗+K∗− between 1.5 and 3.0 GeVExperiment: ARGUS (DORIS) Inspire ID: 511512 Status: VALIDATED Authors:
Beam energies: ANY Run details:
Measurement of the differential cross section for γγ→K∗0ˉK∗0 andK∗+K∗− for 1.5GeV<W<3.0GeV. The cross section is measured as a function of the centre-of-mass energy of the photonic collision using a range of final states. Source code: ARGUS_2000_I511512.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 gamma gamma -> K*K*
10 class ARGUS_2000_I511512 : public Analysis {
11 public:
12
13 /// Constructor
14 RIVET_DEFAULT_ANALYSIS_CTOR(ARGUS_2000_I511512);
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 // book histos
26 if (inRange(sqrtS()/GeV,1.5,3.0)) {
27 for (unsigned int ix=0; ix<9; ++ix) {
28 book(_nMeson[ix],"TMP/nMeson_"+toString(ix+1));
29 }
30 }
31 else {
32 throw Error("Invalid CMS energy for ARGUS_2000_I511512");
33 }
34 }
35
36 void findChildren(const Particle & p,map<long,int> & nRes, int &ncount) {
37 for (const Particle &child : p.children()) {
38 if (child.children().empty()) {
39 nRes[child.pid()]-=1;
40 --ncount;
41 }
42 else {
43 findChildren(child,nRes,ncount);
44 }
45 }
46 }
47
48
49 /// Perform the per-event analysis
50 void analyze(const Event& event) {
51 const FinalState& fs = apply<FinalState>(event, "FS");
52 // find the final-state particles
53 map<long,int> nCount;
54 int ntotal(0);
55 for (const Particle& p : fs.particles()) {
56 nCount[p.pid()] += 1;
57 ++ntotal;
58 }
59 if(ntotal==4) {
60 if (nCount[PID::KPLUS]==1 && nCount[PID::KMINUS]==1 &&
61 nCount[PID::PIPLUS]==1 && nCount[PID::PIMINUS]==1) {
62 _nMeson[6]->fill();
63 }
64 else if (nCount[PID::K0S]==2 &&
65 nCount[PID::PIPLUS]==1 && nCount[PID::PIMINUS]==1) {
66 _nMeson[8]->fill();
67 }
68 else if (nCount[PID::K0S]==1 && nCount[PID::PI0]==1 &&
69 ((nCount[PID::KPLUS ]==1 && nCount[PID::PIMINUS]==1) ||
70 (nCount[PID::KMINUS]==1 && nCount[PID::PIPLUS ]==1))) {
71 _nMeson[7]->fill();
72 }
73
74 }
75 const UnstableParticles& ufs = apply<UnstableParticles>(event, "UFS");
76 // find any K* mesons
77 Particles Kstar=ufs.particles(Cuts::abspid==313 or Cuts::abspid==323);
78 for (unsigned int ix=0;ix<Kstar.size();++ix) {
79 if(Kstar[ix].children().empty()) continue;
80 map<long,int> nRes=nCount;
81 int ncount = ntotal;
82 findChildren(Kstar[ix],nRes,ncount);
83 int sign = Kstar[ix].pid()/Kstar[ix].abspid();
84 // three body intermediate states
85 if (ncount==2) {
86 // K*0 K- pi+ +ccd
87 if (Kstar[ix].abspid()==313) {
88 bool matched=true;
89 for (const auto& val : nRes) {
90 if (val.first==sign*211 || val.first==-sign*321) {
91 if(val.second!=1) {
92 matched = false;
93 break;
94 }
95 }
96 else {
97 if(val.second!=0) {
98 matched = false;
99 break;
100 }
101 }
102 }
103 if(matched) _nMeson[3]->fill();
104 }
105 else {
106 bool matched=false;
107 // K*+ K0S pi- + cc
108 for(auto const & val : nRes) {
109 if (val.first==-sign*211 || val.first==PID::K0S) {
110 if(val.second!=1) {
111 matched = false;
112 break;
113 }
114 }
115 else {
116 if(val.second!=0) {
117 matched = false;
118 break;
119 }
120 }
121 }
122 if (matched) _nMeson[4]->fill();
123 else {
124 // K*+ K- pi0 +cc
125 matched=false;
126 for (auto const & val : nRes) {
127 if (val.first==-sign*321 || val.first==PID::PI0) {
128 if(val.second!=1) {
129 matched = false;
130 break;
131 }
132 }
133 else {
134 if(val.second!=0) {
135 matched = false;
136 break;
137 }
138 }
139 }
140 if (matched) _nMeson[5]->fill();
141 }
142 }
143 }
144
145 // K*K*
146 for (unsigned int iy=ix+1;iy<Kstar.size();++iy) {
147 if (Kstar[iy].children().empty()) continue;
148 if (Kstar[ix].pid()!=-Kstar[iy].pid()) continue;
149 map<long,int> nRes2=nRes;
150 int ncount2 = ncount;
151 findChildren(Kstar[iy],nRes2,ncount2);
152 if (ncount2 !=0 ) continue;
153 bool matched2 = true;
154 for (auto const & val : nRes2) {
155 if (val.second!=0) {
156 matched2 = false;
157 break;
158 }
159 }
160 if (matched2) {
161 if (Kstar[ix].abspid()==313) {
162 _nMeson[0]->fill();
163 }
164 else {
165 _nMeson[1]->fill();
166 }
167 break;
168 }
169 }
170 }
171 // finally the rho phi intermediate states
172 for (const Particle & p1 : ufs.particles(Cuts::pid==PID::RHO0)) {
173 if(p1.children().empty()) continue;
174 map<long,int> nRes=nCount;
175 int ncount = ntotal;
176 findChildren(p1,nRes,ncount);
177 for (const Particle & p2 : ufs.particles(Cuts::pid==PID::PHI)) {
178 if (p2.children().empty()) continue;
179 map<long,int> nRes2=nRes;
180 int ncount2 = ncount;
181 findChildren(p2,nRes2,ncount2);
182 if (ncount2 !=0 ) continue;
183 bool matched = true;
184 for (auto const & val : nRes2) {
185 if (val.second!=0) {
186 matched = false;
187 break;
188 }
189 }
190 if (matched) {
191 _nMeson[2]->fill();
192 break;
193 }
194 }
195 }
196 }
197
198
199 /// Normalise histograms etc., after the run
200 void finalize() {
201 scale(_nMeson, crossSection()/nanobarn/sumOfWeights());
202 // loop over tables in paper
203 for (unsigned int ih=3; ih<11; ++ih) {
204 unsigned int imax=5;
205 if (ih==6 || ih==9 || ih==10) imax=3;
206 else if (ih==7 || ih==8) imax=4;
207 for (unsigned int iy=1; iy<imax; ++iy) {
208 unsigned int iloc=1000;
209 // K*0 K*bar0
210 if ((iy==1 && (ih==3||ih==4||ih==5||ih==9||ih==10)) ||
211 (iy==2&&ih==6)) {
212 iloc=0;
213 }
214 // K*+ K*-
215 else if ( (iy==1 && (ih==6 || ih==8)) ||
216 (iy==2 && (ih==9 || ih==10))) {
217 iloc=1;
218 }
219 // rho phi
220 else if(iy==3 && (ih>=3&&ih<=5)) {
221 iloc=2;
222 }
223 // K*0 K- pi+ + cc
224 else if(iy==2 && (ih>=3&&ih<=5)) {
225 iloc=3;
226 }
227 // K+K-pi+pi-
228 else if(iy==4 && (ih>=3&&ih<=5)) {
229 iloc=6;
230 }
231 // K*+ K0S pi-+cc
232 else if( (ih==7&&iy==1) || (ih==8&&iy==2)) {
233 iloc=4;
234 }
235 // K*+ K- pi0 +cc
236 else if(ih==7&&iy==2) {
237 iloc=5;
238 }
239 // KS0 K+ pi- pi0 +cc
240 else if(ih==7&&iy==3) {
241 iloc=7;
242 }
243 // KS0 KS0 pi+ pi-
244 else if(ih==8&&iy==3) {
245 iloc=8;
246 }
247 assert(iloc<=8);
248 Estimate1DPtr mult;
249 book(mult, ih, 1, iy);
250 for (auto& b : mult->bins()) {
251 if (inRange(sqrtS(), b.xMin(), b.xMax())) {
252 b.setVal(_nMeson[iloc]->val());
253 b.setErr(_nMeson[iloc]->err());
254 }
255 }
256 }
257 }
258 // finally the ratio K*+/K*0
259 if (_nMeson[0]->numEntries()>0) {
260 Estimate0D R = *_nMeson[1]/ *_nMeson[0];
261 Estimate1DPtr mult;
262 book(mult, 11, 1, 1);
263 for (auto& b : mult->bins()) {
264 if (isCompatibleWithSqrtS(b.xMid())) {
265 b.setVal(R.val());
266 b.setErr(R.err());
267 }
268 }
269 }
270 }
271
272 /// @}
273
274
275 /// @name Histograms
276 /// @{
277 CounterPtr _nMeson[9];
278 /// @}
279
280
281 };
282
283
284 RIVET_DECLARE_PLUGIN(ARGUS_2000_I511512);
285
286}
|