Rivet analyses referenceBESIII_2019_I1623214Cross section for $e^+e^-\to \eta Y(2175)$ for energies above 3.7 GeVExperiment: BESIII (BEPC) Inspire ID: 1623214 Status: VALIDATED NOHEPDATA Authors:
Beam energies: (1.8, 1.8); (1.9, 1.9); (2.0, 2.0); (2.1, 2.1); (2.1, 2.1); (2.2, 2.2); (2.2, 2.2); (2.3, 2.3) GeV Run details:
Measurement of the cross section for $e^+e^-\to \eta Y(2175)$ times the branching ratio $Y(2175)\to\phi f_0(f_0\to\pi^+\pi^-)$ for energies above 3.7 GeV. The PDG code for the $Y(2175)$ is not defined but the most probable assignment is that it is the $\phi$ member of the $^3D_1$ multiplet so we take its PDG code to be 30333, although this can be changed using the PID option if a different code is used by the event generator performing the simulation. Beam energy must be specified as analysis option "ENERGY" when rivet-merging samples. Source code: BESIII_2019_I1623214.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/FinalState.hh"
4#include "Rivet/Projections/FinalState.hh"
5#include "Rivet/Projections/UnstableParticles.hh"
6
7namespace Rivet {
8
9
10 /// @brief e+ e- > eta Y(2175)
11 class BESIII_2019_I1623214 : public Analysis {
12 public:
13
14 /// Constructor
15 RIVET_DEFAULT_ANALYSIS_CTOR(BESIII_2019_I1623214);
16
17
18 /// @name Analysis methods
19 /// @{
20
21 /// Book histograms and initialise projections before the run
22 void init() {
23 // set the PDG code
24 _pid = getOption<double>("PID", 30333);
25 // projections
26 declare(FinalState(), "FS");
27 declare(UnstableParticles(), "UFS");
28 // counter
29 book(_sigma,1,1,1);
30
31 for (const string& en : _sigma.binning().edges<0>()) {
32 const double end = std::stod(en)*GeV;
33 if (isCompatibleWithSqrtS(end)) {
34 _ecms = en;
35 break;
36 }
37 }
38 if (_ecms.empty()) MSG_ERROR("Beam energy incompatible with analysis.");
39 }
40
41 void findChildren(const Particle & p,map<long,int> & nRes, int &ncount) {
42 for (const Particle &child : p.children()) {
43 if(child.children().empty()) {
44 --nRes[child.pid()];
45 --ncount;
46 }
47 else {
48 findChildren(child,nRes,ncount);
49 }
50 }
51 }
52
53 /// Perform the per-event analysis
54 void analyze(const Event& event) {
55 const FinalState& fs = apply<FinalState>(event, "FS");
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 // loop over any eta mesons
64 for (const Particle & eta : ufs.particles(Cuts::pid==221)) {
65 bool matched = false;
66 if(eta.children().empty()) continue;
67 map<long,int> nRes = nCount;
68 int ncount = ntotal;
69 findChildren(eta,nRes,ncount);
70 for (const Particle & phi : ufs.particles(Cuts::pid==333)) {
71 if (phi.children().empty()) continue;
72 map<long,int> nRes2 = nRes;
73 int ncount2 = ncount;
74 findChildren(phi,nRes2,ncount2);
75 matched = true;
76 // required eta phi pi+ pi- final state
77 for (auto const & val : nRes2) {
78 if (abs(val.first)==211) {
79 if (val.second !=1) {
80 matched = false;
81 break;
82 }
83 }
84 else if (val.second!=0) {
85 matched = false;
86 break;
87 }
88 }
89 if (!matched) continue;
90 matched = false;
91 // finally check we have f0
92 for (const Particle & f0 : ufs.particles(Cuts::pid==9010221)) {
93 if (f0.children().empty()) continue;
94 map<long,int> nRes3 = nRes2;
95 int ncount3 = ncount2;
96 findChildren(f0,nRes3,ncount3);
97 matched = true;
98 for (const auto& val : nRes3) {
99 if (val.second!=0) {
100 matched = false;
101 break;
102 }
103 }
104 if (matched) break;
105 }
106 if (matched) break;
107 }
108 if (!matched) continue;
109 // finally check phi(3D1) present
110 for (const Particle & phi : ufs.particles(Cuts::pid==_pid)) {
111 if (phi.children().empty()) continue;
112 map<long,int> nRes2 = nRes;
113 int ncount2 = ncount;
114 findChildren(phi,nRes2,ncount2);
115 matched = true;
116 // required eta phi(3D1) final state
117 for (const auto& val : nRes2) {
118 if (val.second!=0) {
119 matched = false;
120 break;
121 }
122 }
123 if (matched) break;
124 }
125 if (matched) {
126 _sigma->fill(_ecms);
127 break;
128 }
129 }
130 }
131
132
133 /// Normalise histograms etc., after the run
134 void finalize() {
135 scale(_sigma,crossSection()/ sumOfWeights() /picobarn);
136 }
137
138 /// @}
139
140
141 /// @name Histograms
142 /// @{
143 int _pid;
144 BinnedHistoPtr<string> _sigma;
145 string _ecms;
146 /// @}
147
148
149 };
150
151
152 RIVET_DECLARE_PLUGIN(BESIII_2019_I1623214);
153
154}
|