Rivet analyses referenceBESIII_2023_I2643786Cross section for $e^+e^-\to\omega\pi^+\pi^-$ between 4 and 4.6 GeVExperiment: BESIII (BEPC) Inspire ID: 2643786 Status: VALIDATED NOHEPDATA Authors:
Beam energies: ANY Run details:
Measurement of the cross section for $e^+e^-\to\omega\pi^+\pi^-$ between 4 and 4.6 GeV by the BESIII collaboration. The cross section for a number of resonant intermediate states are also measured. Source code: BESIII_2023_I2643786.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- -> omega pi+ pi-
10 class BESIII_2023_I2643786 : public Analysis {
11 public:
12
13 /// Constructor
14 RIVET_DEFAULT_ANALYSIS_CTOR(BESIII_2023_I2643786);
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 for (unsigned int ix=0; ix<7; ++ix) {
26 book(_n[ix], "TMP/n_"+toString(ix+1));
27 }
28 }
29
30 void findChildren(const Particle& p, map<long,int>& nRes, int& ncount) {
31 for(const Particle& child : p.children()) {
32 if (child.children().empty()) {
33 --nRes[child.pid()];
34 --ncount;
35 }
36 else {
37 findChildren(child,nRes,ncount);
38 }
39 }
40 }
41
42 /// Perform the per-event analysis
43 void analyze(const Event& event) {
44 const FinalState& fs = apply<FinalState>(event, "FS");
45 map<long,int> nCount;
46 int ntotal(0);
47 for (const Particle& p : fs.particles()) {
48 nCount[p.pid()] += 1;
49 ++ntotal;
50 }
51 const FinalState& ufs = apply<FinalState>(event, "UFS");
52 bool hasOmegaPiPi=false, hasResonance=false;
53 for (const Particle& p : ufs.particles(Cuts::pid==223)) {
54 if (p.children().empty()) continue;
55 map<long,int> nRes = nCount;
56 int ncount = ntotal;
57 findChildren(p,nRes,ncount);
58 // first the omega pi pi final state
59 if (ncount==2) {
60 hasOmegaPiPi=true;
61 for (const auto& val : nRes) {
62 if (abs(val.first)==211) {
63 if (val.second !=1) {
64 hasOmegaPiPi = false;
65 break;
66 }
67 }
68 else if(val.second!=0) {
69 hasOmegaPiPi = false;
70 break;
71 }
72 }
73 if (hasOmegaPiPi) _n[0]->fill();
74 }
75 if (!hasOmegaPiPi) continue;
76 // now omega + second resonance
77 for (const Particle& p2 : ufs.particles(Cuts::pid==9000221 ||
78 Cuts::pid==9010221 ||
79 Cuts::pid==10221 ||
80 Cuts::pid==225)) {
81 if (p2.children().empty()) continue;
82 map<long,int> nRes2 = nRes;
83 int ncount2 = ncount;
84 findChildren(p2,nRes2,ncount2);
85 hasResonance=true;
86 if (ncount2!=0) continue;
87 for (const auto& val : nRes2) {
88 if (val.second!=0) {
89 hasResonance = false;
90 break;
91 }
92 }
93 if (hasResonance) {
94 if (p2.pid()==9000221 ) _n[1]->fill();
95 else if (p2.pid()==9010221 ) _n[2]->fill();
96 else if (p2.pid()==10221 ) _n[3]->fill();
97 else if (p2.pid()==225 ) _n[4]->fill();
98 break;
99 }
100 }
101 if (hasOmegaPiPi) break;
102 }
103 if (hasResonance || !hasOmegaPiPi) return;
104 // b_1 pi
105 for (const Particle& p : ufs.particles(Cuts::abspid==10213 || Cuts::abspid==100213)) {
106 if (p.children().empty()) continue;
107 map<long,int> nRes = nCount;
108 int ncount = ntotal;
109 findChildren(p,nRes,ncount);
110 if (ncount!=1) continue;
111 int ipi = -p.pid()/p.abspid()*211;
112 hasResonance=true;
113 for (const auto& val : nRes) {
114 if (val.first==ipi) {
115 if (val.second !=1) {
116 hasOmegaPiPi = false;
117 break;
118 }
119 }
120 else if (val.second!=0) {
121 hasResonance = false;
122 break;
123 }
124 }
125 if (hasResonance) {
126 if (p.abspid()==10213) _n[5]->fill();
127 else _n[6]->fill();
128 break;
129 }
130 }
131 }
132
133
134 /// Normalise histograms etc., after the run
135 void finalize() {
136 for (unsigned int ix=0; ix<7; ++ix) {
137 scale(_n[ix], crossSection()/ sumOfWeights() /picobarn);
138 unsigned int ih=2, iy=ix;
139 if (ix==0) {
140 ih=1;
141 iy=1;
142 }
143 Estimate1DPtr mult;
144 book(mult, ih, 1, iy);
145 for (auto& b : mult->bins()) {
146 if (inRange(sqrtS()/GeV, b.xMin(), b.xMax())) {
147 b.set(_n[ix]->val(), _n[ix]->err());
148 }
149 }
150 }
151 }
152
153 /// @}
154
155
156 /// @name Histograms
157 /// @{
158 CounterPtr _n[7];
159 /// @}
160
161
162 };
163
164
165 RIVET_DECLARE_PLUGIN(BESIII_2023_I2643786);
166
167}
|