Rivet analyses referenceCMD3_2019_I1740541Cross section for $e^+e^-\to\phi\eta$ for energies below 2 GeVExperiment: CMD3 (VEPP-2M) Inspire ID: 1740541 Status: VALIDATED Authors:
Beam energies: ANY Run details:
Measurement of the cross section for $e^+e^-\to K^+K^-\eta$, which is found to be saturated by the resonant $\phi\eta$ sub-process, and therefore only the cross section for $e^+e^-\to\phi\eta$ for energies below 2 GeV is extracted by the CMD3 experiment Source code: CMD3_2019_I1740541.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 phi eta cross section
10 class CMD3_2019_I1740541 : public Analysis {
11 public:
12
13 /// Constructor
14 RIVET_DEFAULT_ANALYSIS_CTOR(CMD3_2019_I1740541);
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 for(unsigned int ix=0;ix<3;++ix) {
27 book(_c_phi[ix], 1+ix, 1, 6);
28 for (const string& en : _c_phi[ix].binning().edges<0>()) {
29 const double end = std::stod(en)*GeV;
30 if (isCompatibleWithSqrtS(end)) {
31 _ecms[ix] = en;
32 break;
33 }
34 }
35 }
36 if (_ecms[0].empty() && _ecms[1].empty() && _ecms[2].empty())
37 MSG_ERROR("Beam energy incompatible with analysis.");
38 }
39
40 void findChildren(const Particle & p,map<long,int> & nRes, int &ncount) {
41 for(const Particle &child : p.children()) {
42 if(child.children().empty()) {
43 --nRes[child.pid()];
44 --ncount;
45 }
46 else
47 findChildren(child,nRes,ncount);
48 }
49 }
50
51 /// Perform the per-event analysis
52 void analyze(const Event& event) {
53
54 const FinalState& fs = apply<FinalState>(event, "FS");
55
56 map<long,int> nCount;
57 int ntotal(0);
58 for (const Particle& p : fs.particles()) {
59 nCount[p.pid()] += 1;
60 ++ntotal;
61 }
62 const FinalState& ufs = apply<FinalState>(event, "UFS");
63 for (const Particle& p : ufs.particles(Cuts::pid==221)) {
64 if(p.children().empty()) continue;
65 map<long,int> nRes = nCount;
66 int ncount = ntotal;
67 findChildren(p,nRes,ncount);
68 bool matched = false;
69 for (const Particle& p2 : ufs.particles(Cuts::pid==333)) {
70 map<long,int> nResB = nRes;
71 int ncountB = ncount;
72 findChildren(p2,nResB,ncountB);
73 if(ncountB!=0) continue;
74 bool matched = true;
75 for(auto const & val : nResB) {
76 if(val.second!=0) {
77 matched = false;
78 break;
79 }
80 }
81 if(matched) {
82 for(unsigned int ix=0;ix<3;++ix) _c_phi[ix]->fill(_ecms[ix]);
83 break;
84 }
85 }
86 if(matched) break;
87 }
88 }
89
90
91 /// Normalise histograms etc., after the run
92 void finalize() {
93 double fact = crossSection()/nanobarn/sumOfWeights();
94 for(unsigned int ix=0;ix<3;++ix)
95 scale(_c_phi[ix],fact);
96 }
97
98 /// @}
99
100
101 /// @name Histograms
102 /// @{
103 BinnedHistoPtr<string> _c_phi[3];
104 string _ecms[3];
105 /// @}
106
107
108 };
109
110
111 RIVET_DECLARE_PLUGIN(CMD3_2019_I1740541);
112
113
114}
|