Rivet analyses referenceARGUS_1990_I278933$\pi^0$ and $\eta$ spectra for $e^+e^-$ collisions in the continuum at 9.46 GeV and at $\Upsilon_{1,2}$Experiment: ARGUS (DORIS) Inspire ID: 278933 Status: VALIDATED Authors:
Beam energies: (4.7, 4.7); (5.0, 5.0) GeV Run details:
Measurement of the inclusive production of the $\pi^0$ and $\eta$ mesons in $e^+e^-$ annihilation in the Upsilon region. Data are taken on the $\Upsilon(1S)$, $\Upsilon(2S)$ and in the nearby continuum. Source code: ARGUS_1990_I278933.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/UnstableParticles.hh"
4
5namespace Rivet {
6
7
8 /// @brief pi0 and eta at Upsilon 1,2 and continuum
9 class ARGUS_1990_I278933 : public Analysis {
10 public:
11
12 /// Constructor
13 RIVET_DEFAULT_ANALYSIS_CTOR(ARGUS_1990_I278933);
14
15
16 /// @name Analysis methods
17 /// @{
18
19 /// Book histograms and initialise projections before the run
20 void init() {
21 // Initialise and register projections
22 declare(UnstableParticles(), "UFS");
23 // Book histograms
24 book(_n_Pi[0] , 1, 1, 1);
25 book(_n_Pi[1] , 1, 1, 2);
26 book(_n_Pi[2] , 1, 1, 3);
27 book(_n_Eta[0], 2, 1, 1);
28 book(_n_Eta[1], 2, 1, 2);
29 book(_n_Eta[2], 2, 1, 3);
30 book(_h_cont_pi1 ,3, 1, 1);
31 book(_h_cont_pi2 ,3, 1, 2);
32 book(_h_ups1_pi ,4, 1, 1);
33 book(_h_ups2_pi ,4, 1, 2);
34 book(_h_cont_eta1,5, 1, 1);
35 book(_h_cont_eta2,5, 1, 2);
36 book(_h_ups1_eta ,6, 1, 1);
37 book(_h_ups2_eta ,6, 1, 2);
38 book(_weightSum_cont,"/TMP/weightSum_cont");
39 book(_weightSum_Ups1,"/TMP/weightSum_Ups1");
40 book(_weightSum_Ups2,"/TMP/weightSum_Ups2");
41
42 }
43
44 /// Recursively walk the decay tree to find decay products of @a p
45 void findDecayProducts(Particle mother, Particles& unstable) {
46 for (const Particle & p: mother.children()) {
47 const int id = p.pid();
48 if(id == 111 or id == 221) {
49 unstable.push_back(p);
50 }
51 if(!p.children().empty()) {
52 findDecayProducts(p, unstable);
53 }
54 }
55 }
56
57 /// Perform the per-event analysis
58 void analyze(const Event& event) {
59 // Find the Upsilons among the unstables
60 const UnstableParticles& ufs = apply<UnstableParticles>(event, "UFS");
61 Particles upsilons = ufs.particles(Cuts::pid==553 or Cuts::pid==100553);
62 // Continuum
63 if (upsilons.empty()) {
64 MSG_DEBUG("No Upsilons found => continuum event");
65 _weightSum_cont->fill();
66 for (const Particle& p : ufs.particles(Cuts::pid==111 or Cuts::pid==221)) {
67 const int id = p.pid();
68 const double xp = 2.*p.E()/sqrtS();
69 const double beta = p.p3().mod() / p.E();
70 if(id==111) {
71 _n_Pi[0]->fill(10);
72 _h_cont_pi1->fill(xp,1./beta);
73 _h_cont_pi2->fill(xp,1./beta);
74 }
75 else {
76 _n_Eta[0]->fill(10);
77 _h_cont_eta1->fill(xp,1./beta);
78 _h_cont_eta2->fill(xp,1./beta);
79 }
80 }
81 }
82 // Upsilon(s) found
83 else {
84 MSG_DEBUG("Upsilons found => resonance event");
85 for (const Particle& ups : upsilons) {
86 const int parentId = ups.pid();
87 if(parentId==553) {
88 _weightSum_Ups1->fill();
89 }
90 else {
91 _weightSum_Ups2->fill();
92 }
93 Particles unstable;
94 // Find the decay products we want
95 findDecayProducts(ups, unstable);
96 LorentzTransform cms_boost;
97 if (ups.p3().mod() > 1*MeV)
98 cms_boost = LorentzTransform::mkFrameTransformFromBeta(ups.momentum().betaVec());
99 const double mass = ups.mass();
100 // loop over decay products
101 for(const Particle& p : unstable) {
102 const int id = p.pid();
103 const FourMomentum p2 = cms_boost.transform(p.momentum());
104 const double xp = 2.*p2.E()/mass;
105 const double beta = p2.p3().mod()/p2.E();
106 if (id==111) {
107 if (parentId==553) {
108 _n_Pi[1]->fill(10);
109 _h_ups1_pi->fill(xp,1./beta);
110 }
111 else {
112 _n_Pi[2]->fill(10);
113 _h_ups2_pi->fill(xp,1./beta);
114 }
115 }
116 else if(id==221) {
117 if (parentId==553) {
118 _n_Eta[1]->fill(10);
119 _h_ups1_eta->fill(xp,1./beta);
120 }
121 else {
122 _n_Eta[2]->fill(10);
123 _h_ups2_eta->fill(xp,1./beta);
124 }
125 }
126 }
127 }
128 }
129 }
130
131
132 /// Normalise histograms etc., after the run
133 void finalize() {
134
135 // Scale histos
136 if (_weightSum_cont->val() > 0.) {
137 scale(_h_cont_pi1, 1./ *_weightSum_cont);
138 scale(_h_cont_pi2, sqr(sqrtS())*crossSection()/microbarn/sumOfWeights());
139 scale(_h_cont_eta1, 1./ *_weightSum_cont);
140 scale(_h_cont_eta2, sqr(sqrtS())*crossSection()/microbarn/sumOfWeights());
141 }
142 if (_weightSum_Ups1->val() > 0.) {
143 scale(_h_ups1_pi, 1./ *_weightSum_Ups1);
144 scale(_h_ups1_eta, 1./ *_weightSum_Ups1);
145 }
146 if (_weightSum_Ups2->val() > 0.) {
147 scale(_h_ups2_pi, 1./ *_weightSum_Ups2);
148 scale(_h_ups2_eta, 1./ *_weightSum_Ups2);
149 }
150 // Counters
151 vector<CounterPtr> scales = {_weightSum_cont,_weightSum_Ups1,_weightSum_Ups2};
152 for (unsigned int ix=0; ix<3; ++ix) {
153 scale(_n_Pi[ix], 1./ *scales[ix]);
154 scale(_n_Eta[ix], 1./ *scales[ix]);
155 }
156 }
157
158 /// @}
159
160
161 /// @name Histograms
162 /// @{
163 Histo1DPtr _h_cont_pi1 , _h_cont_pi2 , _h_ups1_pi , _h_ups2_pi ;
164 Histo1DPtr _h_cont_eta1, _h_cont_eta2, _h_ups1_eta, _h_ups2_eta;
165 BinnedHistoPtr<int> _n_Eta[3],_n_Pi[3];
166 CounterPtr _weightSum_cont,_weightSum_Ups1,_weightSum_Ups2;
167 /// @}
168
169
170 };
171
172
173 RIVET_DECLARE_PLUGIN(ARGUS_1990_I278933);
174
175
176}
|