Rivet analyses
Event shapes in e+e− collisions at 29 GeV
Experiment: HRS (PEP)
Inspire ID: 201482
Status: VALIDATED
Authors: - Peter Richardson
References: - Phys.Rev. D31 (1985) 1, 1985
Beams: e+ e-
Beam energies: (14.5, 14.5)GeV
Run details: - Hadronic e+e- events at $\sqrt{s} = 29.$ GeV
Measurement of a range of event shapes at 29 GeV by the HRS experiment. The event are seperate into two (S ≤ 0.25, A ≤ 0.1) and jet three(S > 0.25, A ≤ 0.1) jet regions. The mean values of event shapes are not implemented.
Source
code:HRS_1985_I201482.cc
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/Beam.hh"
#include "Rivet/Projections/ChargedFinalState.hh"
#include "Rivet/Projections/Sphericity.hh"
#include "Rivet/Projections/Thrust.hh"
namespace Rivet {
/// @brief event shapes at 29 GeV
class HRS_1985_I201482 : public Analysis {
public:
/// Constructor
RIVET_DEFAULT_ANALYSIS_CTOR(HRS_1985_I201482);
/// @name Analysis methods
/// @{
/// Book histograms and initialise projections before the run
void init() {
// Initialise and register projections
declare(Beam(), "Beams");
const ChargedFinalState cfs;
declare(cfs, "FS");
declare(Sphericity(cfs), "Sphericity");
const Thrust thrust(cfs);
declare(thrust, "Thrust");
// Book histograms
book(_histSphericity, 1, 1, 1);
book(_histThrust, 3, 1, 1);
book(_histThrust2Jet, 4, 1, 1);
book(_histAplanarity, 6, 1, 1);
book(_histZ, 10, 1, 1);
book(_histZ2Jet, 11, 1, 1);
book(_histZScale, 12, 1, 1);
book(_histZJet[0], 13, 1, 1);
book(_histZJet[1], 14, 1, 1);
book(_histZJet[2], 15, 1, 1);
book(_histXFeyn, 16, 1, 1);
book(_histXFeyn2Jet, 17, 1, 1);
book(_histRap[0], 19, 1, 1);
book(_histRap[1], 20, 1, 1);
book(_histPtT, 22, 1, 1);
book(_histPtT2Jet, 23, 1, 1);
book(_histPtTIn, 24, 1, 1);
book(_histPtTOut, 25, 1, 1);
book(_wSum, "TMP/wSum");
book(_wSum2, "TMP/wSum2");
_axes[0] = YODA::Axis<double>({-5.0, -4.0, -3.5, -3.0, -2.75, -2.5, -2.3, -2.0, -1.75, -1.5, -1.25,
-1.0, -0.75, -0.5, -0.25, 0.0, 0.25, 0.5, 0.75, 1.0, 1.25, 1.5,
1.75, 2.0, 2.3, 2.5, 2.75, 3.0, 3.5, 4.0, 5.0});
_axes[1] = YODA::Axis<double>({-4.0, -3.5, -3.0, -2.75, -2.5, -2.25, -2.0, -1.75, -1.5, -1.25,
-1.0, -0.75, -0.5, -0.25, 0.0, 0.25, 0.5, 0.75, 1.0, 1.25,
1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.5, 4.0});
}
/// Perform the per-event analysis
void analyze(const Event& event) {
if (_edges[0].empty()) {
_edges[0] = _histRap[0]->xEdges();
_edges[1] = _histRap[1]->xEdges();
}
// require 5 charged particles
const FinalState& fs = apply<FinalState>(event, "FS");
const size_t numParticles = fs.particles().size();
if (numParticles < 5) vetoEvent;
// Get beams and average beam momentum
const ParticlePair& beams = apply<Beam>(event, "Beams").beams();
const double meanBeamMom = (beams.first.p3().mod() + beams.second.p3().mod()) / 2.0;
MSG_DEBUG("Avg beam momentum = " << meanBeamMom);
// calc thrust and sphericity
const Thrust& thrust = apply<Thrust>(event, "Thrust");
Vector3 axis = thrust.thrustAxis();
const Sphericity& sphericity = apply<Sphericity>(event, "Sphericity");
// identify two and three jet regions
bool twoJet = sphericity.sphericity() <= 0.25 && sphericity.aplanarity() <= 0.1;
//bool threeJet = sphericity.sphericity() >0.25 && sphericity.aplanarity()<=0.1;
_wSum->fill();
if (twoJet) _wSum2->fill();
// basic event shapes
_histSphericity->fill(sphericity.sphericity());
_histThrust->fill(thrust.thrust());
_histAplanarity->fill(sphericity.aplanarity());
if (twoJet) _histThrust2Jet->fill(thrust.thrust());
double pTSqIn = 0.;
double pTSqOut = 0.;
unsigned int iPlus(0), iMinus(0);
// single particle dists
for (const Particle& p : sortBy(fs.particles(), cmpMomByP)) {
const double z = p.p3().mod() / meanBeamMom;
const double momT = axis.dot(p.p3());
const double xF = fabs(momT) / meanBeamMom;
const double energy = p.E();
const double rap = 0.5 * std::log((energy + momT) / (energy - momT));
const double pTin = dot(p.p3(), thrust.thrustMajorAxis());
const double pTout = dot(p.p3(), thrust.thrustMinorAxis());
const double pT2 = sqr(pTin) + sqr(pTout);
pTSqIn += sqr(dot(p.p3(), sphericity.sphericityMajorAxis()));
pTSqOut += sqr(dot(p.p3(), sphericity.sphericityMinorAxis()));
_histZ->fill(z);
_histZScale->fill(z);
_histXFeyn->fill(xF, z);
_histRap[0]->fill(map2string(rap, 0));
_histPtT->fill(pT2);
if (twoJet) {
_histZ2Jet->fill(z);
_histXFeyn2Jet->fill(xF, z);
_histRap[1]->fill(map2string(rap, 1));
_histPtT2Jet->fill(pT2);
if (momT > 0. && iPlus < 3) {
_histZJet[iPlus]->fill(z);
iPlus += 1;
}
else if (momT < 0. && iMinus < 3) {
_histZJet[iMinus]->fill(z);
iMinus += 1;
}
}
}
_histPtTIn->fill(pTSqIn / numParticles);
_histPtTOut->fill(pTSqOut / numParticles);
}
/// Normalise histograms etc., after the run
void finalize() {
normalize(_histSphericity);
normalize(_histThrust);
normalize(_histThrust2Jet);
normalize(_histAplanarity);
scale(_histZ, 1. / *_wSum);
scale(_histZScale, sqr(sqrtS()) * crossSection() / microbarn / sumOfWeights());
scale(_histXFeyn, 1. / M_PI / *_wSum);
scale(_histRap[0], 1. / *_wSum);
scale(_histZ2Jet, 1. / *_wSum2);
scale(_histXFeyn2Jet, 1. / M_PI / *_wSum2);
scale(_histRap[1], 1. / *_wSum2);
scale(_histPtT, 1. / *_wSum);
scale(_histPtT2Jet, 1. / *_wSum2);
scale(_histPtTIn, 1. / *_wSum);
scale(_histPtTOut, 1. / *_wSum);
for (size_t i = 0; i < 3; ++i) {
scale(_histZJet[i], 0.5 / *_wSum2);
}
for (unsigned int ix = 0; ix < 2; ++ix) {
for (auto& b : _histRap[ix]->bins()) {
const size_t idx = b.index();
b.scaleW(1. / _axes[ix].width(idx));
}
}
}
/// @}
string map2string(const double value, const size_t k) const {
const size_t idx = _axes[k].index(value);
if (idx && idx <= _edges[k].size()) return _edges[k][idx - 1];
return "OTHER";
}
/// @name Histograms
/// @{
Histo1DPtr _histSphericity, _histThrust, _histThrust2Jet, _histAplanarity, _histZ, _histZ2Jet,
_histZScale, _histXFeyn, _histXFeyn2Jet, _histPtT, _histPtT2Jet, _histPtTIn, _histPtTOut,
_histZJet[3];
BinnedHistoPtr<string> _histRap[2];
CounterPtr _wSum, _wSum2;
YODA::Axis<double> _axes[2];
vector<string> _edges[2];
/// @}
};
RIVET_DECLARE_PLUGIN(HRS_1985_I201482);
}