Rivet analyses referenceTASSO_1984_I195333Measurements of charged particle multiplicities, $R$ and event shapes between 12 and 43 GeV.Experiment: TASSO (PETRA) Inspire ID: 195333 Status: VALIDATED Authors:
Beam energies: (6.0, 6.0); (7.0, 7.0); (11.0, 11.0); (12.5, 12.5); (13.8, 13.8); (15.1, 15.1); (15.2, 15.2); (15.6, 15.6); (16.6, 16.6); (17.0, 17.0); (17.2, 17.2); (17.4, 17.4); (18.1, 18.1); (20.8, 20.8); (21.5, 21.5) GeV Run details:
Measurement of $R$, charged particle multiplicites and event shapes in $e^+e^-$ collisions for energies between 12 and 43 GeV. The average charged particle multiplicity, thrust and sphericity are measured for a range of energies. The distributions are available for 12, 22 and 34 GeV. The individual hadronic and muonic cross sections are also outputted to the yoda file so that ratio $R$ can be recalculated if runs are combined. Beam energy must be specified as analysis option "ENERGY" when rivet-merging samples. Source code: TASSO_1984_I195333.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/FinalState.hh"
4#include "Rivet/Projections/Sphericity.hh"
5#include "Rivet/Projections/Thrust.hh"
6
7namespace Rivet {
8
9
10 /// @brief Charged-particle multiplicities, R, and event shapes between 12 and 43 GeV
11 class TASSO_1984_I195333 : public Analysis {
12 public:
13
14 /// Constructor
15 RIVET_DEFAULT_ANALYSIS_CTOR(TASSO_1984_I195333);
16
17
18 /// @name Analysis methods
19 /// @{
20
21 /// Book histograms and initialise projections before the run
22 void init() {
23 // Initialise and register projections
24 const FinalState fs;
25 declare(fs, "FS");
26 declare(Sphericity(fs), "Sphericity");
27 declare(Thrust(fs), "Thrust");
28
29 // Counters for R
30 book(_c_hadrons, "sigma_hadrons", refData<YODA::BinnedEstimate<string>>(1,1,1));
31 book(_c_muons, "sigma_muons" , refData<YODA::BinnedEstimate<string>>(1,1,1));
32 for (const string& en : _c_hadrons.binning().edges<0>()) {
33 const size_t idx = en.find("-");
34 if(idx!=std::string::npos) {
35 const double emin = std::stod(en.substr(0,idx));
36 const double emax = std::stod(en.substr(idx+1,string::npos));
37 if(inRange(sqrtS()/GeV, emin, emax)) {
38 _ecms[0] = en;
39 break;
40 }
41 }
42 else {
43 const double end = std::stod(en)*GeV;
44 if (isCompatibleWithSqrtS(end)) {
45 _ecms[0] = en;
46 break;
47 }
48 }
49 }
50 book(_h_weight, "/TMP/HWeight");
51 unsigned int iloc(0);
52 sqs = sqrtS();
53 if (isCompatibleWithSqrtS(14*GeV)) {
54 iloc = 1;
55 sqs = 14.;
56 }
57 else if (isCompatibleWithSqrtS(22*GeV)) {
58 iloc = 2;
59 sqs = 22.;
60 }
61 else if (isCompatibleWithSqrtS(34*GeV)) {
62 iloc = 3;
63 sqs = 34.;
64 }
65 if (iloc!=0) {
66 book(_h_mult, 3,1,iloc);
67 book(_h_p, 5,1,iloc);
68 book(_h_xp, 6,1,iloc);
69 book(_h_pl, 7,1,iloc);
70 book(_h_pt, 8,1,iloc);
71 book(_h_pt2, 9,1,iloc);
72 book(_h_xl, 10,1,iloc);
73 book(_h_xT, 11,1,iloc);
74 book(_h_S, 12,1,iloc);
75 book(_h_T, 13,1,iloc);
76 book(_h_y, 14,1,iloc);
77 }
78 // average event shapes
79 book(_n_charged ,4 ,1, 1);
80 book(_n_total ,"TMP/ntotal",refData<YODA::BinnedEstimate<string>>(4 ,1, 2));
81 book(_sphericity,4 ,1, 4);
82 book(_thrust ,4 ,1, 5);
83 book(_p_total ,4 ,1, 6);
84 book(_p_l ,4 ,1, 7);
85 book(_pt ,4 ,1, 8);
86 book(_pt2 ,4 ,1, 9);
87 book(_pt2_in ,4 ,1, 10);
88 book(_pt2_out ,4 ,1, 11);
89 for (const string& en : _n_charged.binning().edges<0>()) {
90 const size_t idx = en.find("-");
91 if(idx!=std::string::npos) {
92 const double emin = std::stod(en.substr(0,idx));
93 const double emax = std::stod(en.substr(idx+1,string::npos));
94 if(inRange(sqrtS()/GeV, emin, emax)) {
95 _ecms[1] = en;
96 break;
97 }
98 }
99 else {
100 const double end = std::stod(en)*GeV;
101 if (isCompatibleWithSqrtS(end)) {
102 _ecms[1] = en;
103 break;
104 }
105 }
106 }
107 }
108
109
110 /// Perform the per-event analysis
111 void analyze(const Event& event) {
112 const FinalState& fs = apply<FinalState>(event, "FS");
113
114 map<long,int> nCount;
115 double ntotal(0);
116 unsigned int nCharged(0);
117 for (const Particle& p : fs.particles()) {
118 nCount[p.pid()] += 1;
119 if ((p.pid()!=PID::PHOTON && p.abspid()!=PID::ELECTRON) ||
120 p.parents().empty() || p.parents()[0].pid()!=PID::PI0) {
121 ntotal += 1.;
122 }
123 else if (p.pid()==PID::PHOTON) {
124 ntotal += 0.5 ;
125 }
126 else {
127 ntotal += 0.25;
128 nCharged -=1;
129 }
130 if (PID::isCharged(p.pid())) {
131 ++nCharged;
132 }
133 }
134 // mu+mu- + photons
135 if (nCount[-13]==1 and nCount[13]==1 && int(fs.particles().size())==2+nCount[22]) {
136 _c_muons->fill(_ecms[0]);
137 return;
138 }
139 // everything else
140 _c_hadrons->fill(_ecms[0]);
141 _h_weight->fill();
142 _n_charged->fill(_ecms[1],nCharged);
143 _n_total->fill(_ecms[1],ntotal);
144 // thrust
145 const Thrust& thrust = apply<Thrust>(event, "Thrust");
146 _thrust->fill(_ecms[1],thrust.thrust());
147 // sphericity
148 const Sphericity& sphericity = apply<Sphericity>(event, "Sphericity");
149 _sphericity->fill(_ecms[1],sphericity.sphericity());
150 // global distributions
151 if (_h_mult) _h_mult->fill(nCharged);
152 if (_h_S) _h_S ->fill(sphericity.sphericity());
153 if (_h_T) _h_T ->fill(thrust.thrust());
154 // single particle distributions
155 for (const Particle& p : fs.particles()) {
156 if (!PID::isCharged(p.pid())) continue;
157 const Vector3 mom3 = p.p3();
158 double pp = mom3.mod();
159 _p_total->fill(_ecms[1],pp);
160 if (_h_p) _h_p ->fill(pp);
161 if (_h_xp) _h_xp->fill(2.*pp/sqrtS());
162 const double mom = dot(sphericity.sphericityAxis(), mom3);
163 _p_l->fill(_ecms[1],fabs(mom));
164 if (_h_pl) _h_pl->fill(fabs(mom));
165 if (_h_xl) _h_xl->fill(2.*fabs(mom)/sqrtS());
166 const double pTin = dot(mom3, sphericity.sphericityMajorAxis());
167 _pt2_in->fill(_ecms[1],sqr(pTin));
168 const double pTout = dot(mom3, sphericity.sphericityMinorAxis());
169 _pt2_out->fill(_ecms[1],sqr(pTout));
170 double pT = sqr(pTin) + sqr(pTout);
171 _pt2->fill(_ecms[1],pT);
172 if (_h_pt2) _h_pt2->fill(pT);
173 pT=sqrt(pT);
174 _pt->fill(_ecms[1],pT);
175 if (_h_pt) _h_pt->fill(pT);
176 if (_h_xT) _h_xT->fill(2.*pT/sqrtS());
177 if (_h_y) {
178 const double rap = 0.5 * log((p.E() + mom) / (p.E() - mom));
179 _h_y->fill(fabs(rap));
180 }
181 }
182 }
183
184
185 /// Normalise histograms etc., after the run
186 void finalize() {
187 BinnedEstimatePtr<string> mult;
188 book(mult, 1, 1, 1);
189 divide(_c_hadrons,_c_muons,mult);
190 // charged particle multiplicity distribution
191 if (_h_mult) normalize(_h_mult,1.);
192 // charged fraction
193 book(mult,4,1,2);
194 divide(_n_charged,_n_total,mult);
195 book(mult,4,1,3);
196 const auto & b = _n_charged->binAt(_ecms[1]);
197 mult->binAt(_ecms[1]).set(b.stdDev(2),b.stdErr(2));
198 // scale the distributions
199 scale(_h_p ,1./_h_weight->sumW());
200 scale(_h_xp ,1./_h_weight->sumW());
201 scale(_h_pl ,1./_h_weight->sumW());
202 scale(_h_pt ,1./_h_weight->sumW());
203 scale(_h_pt2,1./_h_weight->sumW());
204 scale(_h_xl ,1./_h_weight->sumW());
205 scale(_h_xT ,1./_h_weight->sumW());
206 scale(_h_S ,1./_h_weight->sumW());
207 scale(_h_T ,1./_h_weight->sumW());
208 scale(_h_y ,1./_h_weight->sumW());
209 }
210
211 /// @}
212
213
214 /// @name Histograms
215 /// @{
216 Histo1DPtr _h_p,_h_xp,_h_pl,_h_pt,_h_pt2,_h_xl,_h_xT,_h_S,_h_T,_h_y;
217 BinnedHistoPtr<int> _h_mult;
218 BinnedHistoPtr<string> _c_hadrons, _c_muons;
219 BinnedProfilePtr<string> _n_charged, _n_total,_sphericity, _thrust, _p_total, _p_l, _pt, _pt2, _pt2_in, _pt2_out;
220 CounterPtr _h_weight;
221 double sqs;
222 string _ecms[2];
223 /// @}
224
225 };
226
227
228
229 RIVET_DECLARE_PLUGIN(TASSO_1984_I195333);
230
231}
|