Rivet analyses referenceBESIII_2019_I1724671Cross section for $e^+e^-\to\gamma X(3872)$ between 4 and 4.6 GeVExperiment: BESIII (BEPC) Inspire ID: 1724671 Status: VALIDATED NOHEPDATA Authors:
Beam energies: (2.0, 2.0); (2.1, 2.1); (2.1, 2.1); (2.1, 2.1); (2.1, 2.1); (2.1, 2.1); (2.1, 2.1); (2.1, 2.1); (2.1, 2.1); (2.1, 2.1); (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\gamma X(3872)$ times the branching ratio into the $\omega J\psi$ and $J/\psi\pi^+\pi^-$ modes for $X(3872)$. There is no consensus as to the nature of the $X(3872)$ $c\bar{c}$ state and therefore we taken its PDG code to be 9030443, i.e. the first unused code for an undetermined spin one $c\bar{c}$ state. 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_I1724671.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- -> gamma X(3872)
10 class BESIII_2019_I1724671 : public Analysis {
11 public:
12
13 /// Constructor
14 RIVET_DEFAULT_ANALYSIS_CTOR(BESIII_2019_I1724671);
15
16
17 /// @name Analysis methods
18 /// @{
19
20 /// Book histograms and initialise projections before the run
21 void init() {
22 // set the PDG code
23 _pid = getOption<double>("PID", 9030443);
24 // projections
25 declare(FinalState(), "FS");
26 declare(UnstableParticles(), "UFS");
27 // counters
28 for (unsigned int ix=0;ix<2;++ix) {
29 book(_sigma[ix],1,1,1+ix);
30 }
31
32 for (const string& en : _sigma[0].binning().edges<0>()) {
33 const double end = std::stod(en)*GeV;
34 if (isCompatibleWithSqrtS(end)) {
35 _ecms = en;
36 break;
37 }
38 }
39 if (_ecms.empty()) MSG_ERROR("Beam energy incompatible with analysis.");
40
41 }
42
43 void findChildren(const Particle & p,map<long,int>& nRes, int &ncount) {
44 for (const Particle &child : p.children()) {
45 if (child.children().empty()) {
46 --nRes[child.pid()];
47 --ncount;
48 }
49 else {
50 findChildren(child,nRes,ncount);
51 }
52 }
53 }
54
55 /// Perform the per-event analysis
56 void analyze(const Event& event) {
57 const FinalState& fs = apply<FinalState>(event, "FS");
58 map<long,int> nCount;
59 int ntotal(0);
60 for (const Particle& p: fs.particles()) {
61 nCount[p.pid()] += 1;
62 ++ntotal;
63 }
64 const FinalState& ufs = apply<FinalState>(event, "UFS");
65 int mode=-1;
66 for (const Particle & psi : ufs.particles(Cuts::pid==443)) {
67 if (psi.children().empty()) continue;
68 map<long,int> nRes = nCount;
69 int ncount = ntotal;
70 findChildren(psi,nRes,ncount);
71 // check for J/psi pi+pi- mode
72 if (ncount==3) {
73 bool matched = true;
74 for (const auto& val : nRes) {
75 if (abs(val.first)==211 || val.first==PID::GAMMA) {
76 if (val.second !=1) {
77 matched = false;
78 break;
79 }
80 }
81 else if (val.second!=0) {
82 matched = false;
83 break;
84 }
85 }
86 if (matched) {
87 mode=1;
88 break;
89 }
90 }
91 bool matched = false;
92 for (const Particle& omega : ufs.particles(Cuts::pid==223)) {
93 if (omega.children().empty()) continue;
94 map<long,int> nRes2 = nRes;
95 int ncount2 = ncount;
96 findChildren(omega,nRes2,ncount2);
97 if (ncount2!=1) continue;
98 matched = true;
99 for (const auto& val : nRes2) {
100 if (val.first==PID::GAMMA) {
101 if (val.second !=1) {
102 matched = false;
103 break;
104 }
105 }
106 else if(val.second!=0) {
107 matched = false;
108 break;
109 }
110 }
111 if (matched) break;
112 }
113 if (matched) {
114 mode = 0;
115 break;
116 }
117 }
118 if (mode<0) vetoEvent;
119 // find the intermediate
120 for (const Particle& XX : ufs.particles(Cuts::pid==_pid)) {
121 if (XX.children().empty()) continue;
122 map<long,int> nRes = nCount;
123 int ncount = ntotal;
124 findChildren(XX, nRes, ncount);
125 if (ncount!=1) continue;
126 bool matched = true;
127 for (const auto& val : nRes) {
128 if (val.first==PID::GAMMA) {
129 if (val.second !=1) {
130 matched = false;
131 break;
132 }
133 }
134 else if (val.second!=0) {
135 matched = false;
136 break;
137 }
138 }
139 if (matched) {
140 _sigma[mode]->fill(_ecms);
141 break;
142 }
143 }
144 }
145
146
147 /// Normalise histograms etc., after the run
148 void finalize() {
149 scale(_sigma, crossSection()/ sumOfWeights() /picobarn);
150 }
151
152 /// @}
153
154
155 /// @name Histograms
156 /// @{
157 int _pid;
158 BinnedHistoPtr<string> _sigma[2];
159 string _ecms;
160 /// @}
161
162
163 };
164
165
166 RIVET_DECLARE_PLUGIN(BESIII_2019_I1724671);
167
168}
|