Rivet analyses
Baryon-antibaryon correlations at the Υ(1S) and nearby continuum
Experiment: ARGUS (DORIS)
Inspire ID: 266892
Status: VALIDATED NOHEPDATA
Authors: - Peter Richardson
References: - Z.Phys.C 43 (1989) 45
Beams: e+ e-
Beam energies: (4.7, 4.7); (5.0, 5.0)GeV
Run details: - e+e− analysis in the 10 GeV CMS energy range
Correlations in the production of pp̄ and hyperon-antihyperon pairs.
Source
code:ARGUS_1988_I266892.cc
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/Thrust.hh"
#include "Rivet/Projections/UnstableParticles.hh"
namespace Rivet {
/// @brief baryon correlations
class ARGUS_1988_I266892 : public Analysis {
public:
/// Constructor
RIVET_DEFAULT_ANALYSIS_CTOR(ARGUS_1988_I266892);
/// @name Analysis methods
/// @{
/// Book histograms and initialise projections before the run
void init() {
// projections
const FinalState fs;
declare(fs, "FS");
declare(UnstableParticles(), "UFS");
declare(Thrust(fs), "Thrust");
// histos
for (unsigned int ix = 0; ix < 3; ++ix) {
book(_nBB2[ix], "TMP/nBB2_" + toString(ix + 1),
refData<YODA::BinnedEstimate<string>>(4 + 2 * ix, 1, 1));
book(_n[ix], "TMP/n_" + toString(ix + 1), refData<YODA::BinnedEstimate<string>>(4 + 2 * ix, 1, 1));
book(_nBB[ix], 3 + 2 * ix, 1, 1);
book(_c[ix], "TMP/c_" + toString(ix + 1));
if (ix == 2) continue;
book(_h_pt[ix], 1, 1, 1 + ix);
}
book(_h_pt[2], 2, 1, 1);
}
/// Recursively walk the decay tree to find the stable decay products of @a p
void findDecayProducts(const Particle& mother,
Particles& final,
Particles& protons,
Particles& lambda,
Particles& xi,
Particles& l1520) {
for (const Particle& p : mother.children()) {
if (p.abspid() == 3122)
lambda.push_back(p);
else if (p.abspid() == 3312)
xi.push_back(p);
else if (p.abspid() == 102134)
l1520.push_back(p);
if (!p.children().empty()) {
findDecayProducts(p, final, protons, lambda, xi, l1520);
}
else {
final.push_back(p);
if (p.abspid() == 2212) protons.push_back(p);
}
}
}
/// Perform the per-event analysis
void analyze(const Event& event) {
if (_edges.empty()) _edges = _nBB2[1]->xEdges();
// Find the Upsilons among the unstables
const UnstableParticles& ufs = apply<UnstableParticles>(event, "UFS");
Particles upsilons = ufs.particles(Cuts::pid == 553);
if (upsilons.empty()) {
_c[1]->fill();
_c[2]->fill();
Thrust thrust = apply<Thrust>(event, "Thrust");
Vector3 axis = thrust.thrustAxis();
Particles protons = apply<FinalState>(event, "FS").particles(Cuts::abspid == 2212);
for (unsigned int ix = 0; ix < protons.size(); ++ix) {
double d1 = protons[ix].mom().p3().dot(axis);
Vector3 pt1 = protons[ix].mom().p3() - d1 * axis;
for (unsigned int iy = ix + 1; iy < protons.size(); ++iy) {
if (protons[ix].pid() * protons[iy].pid() > 0) continue;
double d2 = protons[iy].mom().p3().dot(axis);
Vector3 pt2 = protons[iy].mom().p3() - d2 * axis;
double phi = pt1.angle(pt2);
if (phi < 0.) phi += M_PI;
phi *= 180. / M_PI;
if (phi == 180.) phi = phi - 1e-10;
if (d1 * d2 > 0)
_h_pt[0]->fill(phi);
else
_h_pt[2]->fill(phi);
}
}
Particles lambda = ufs.particles(Cuts::abspid == 3122);
for (unsigned int ix = 0; ix < lambda.size(); ++ix) {
_n[0]->fill(_edges[1]);
for (unsigned int iy = ix + 1; iy < lambda.size(); ++iy) {
if (lambda[ix].pid() * lambda[iy].pid() < 0) {
_nBB[0]->fill(_edges[1]);
_nBB2[0]->fill(_edges[1]);
}
}
}
Particles xi = ufs.particles(Cuts::abspid == 3312);
for (unsigned int ix = 0; ix < xi.size(); ++ix) {
_n[1]->fill(_edges[1]);
_n[1]->fill(_edges[2]);
for (unsigned int iy = 0; iy < lambda.size(); ++iy) {
if (xi[ix].pid() * lambda[iy].pid() < 0) {
_nBB[1]->fill(_edges[1]);
_nBB2[1]->fill(_edges[1]);
_nBB2[1]->fill(_edges[2]);
}
}
}
Particles l1520 = ufs.particles(Cuts::abspid == 102134);
for (unsigned int ix = 0; ix < l1520.size(); ++ix) {
_n[2]->fill(_edges[1]);
_n[2]->fill(_edges[2]);
for (unsigned int iy = 0; iy < lambda.size(); ++iy) {
if (l1520[ix].pid() * lambda[iy].pid() < 0) {
_nBB[2]->fill(_edges[1]);
_nBB2[2]->fill(_edges[1]);
_nBB2[2]->fill(_edges[2]);
}
}
}
}
else {
for (const Particle& ups : upsilons) {
_c[0]->fill();
_c[2]->fill();
LorentzTransform boost;
if (ups.p3().mod() > 1 * MeV) {
boost = LorentzTransform::mkFrameTransformFromBeta(ups.mom().betaVec());
}
Particles final, protons, lambda, xi, l1520;
findDecayProducts(ups, final, protons, lambda, xi, l1520);
vector<FourMomentum> mom;
mom.reserve(final.size());
for (const Particle& p : final) {
mom.push_back(boost.transform(p.mom()));
}
Thrust thrust;
thrust.calc(mom);
Vector3 axis = thrust.thrustAxis();
for (unsigned int ix = 0; ix < protons.size(); ++ix) {
double d1 = protons[ix].mom().p3().dot(axis);
Vector3 pt1 = protons[ix].mom().p3() - d1 * axis;
for (unsigned int iy = ix + 1; iy < protons.size(); ++iy) {
if (protons[ix].pid() * protons[iy].pid() > 0) continue;
double d2 = protons[iy].mom().p3().dot(axis);
Vector3 pt2 = protons[iy].mom().p3() - d2 * axis;
double phi = pt1.angle(pt2);
if (phi < 0.) phi += M_PI;
phi *= 180. / M_PI;
if (phi == 180.) phi = phi - 1e-10;
if (d1 * d2 > 0) _h_pt[1]->fill(phi);
}
}
for (unsigned int ix = 0; ix < lambda.size(); ++ix) {
_n[0]->fill(_edges[0]);
for (unsigned int iy = ix + 1; iy < lambda.size(); ++iy) {
if (lambda[ix].pid() * lambda[iy].pid() < 0) {
_nBB[0]->fill(_edges[0]);
_nBB2[0]->fill(_edges[0]);
}
}
}
for (unsigned int ix = 0; ix < xi.size(); ++ix) {
_n[1]->fill(_edges[0]);
_n[1]->fill(_edges[2]);
for (unsigned int iy = 0; iy < lambda.size(); ++iy) {
if (xi[ix].pid() * lambda[iy].pid() < 0) {
_nBB[1]->fill(_edges[0]);
_nBB2[1]->fill(_edges[0]);
_nBB2[1]->fill(_edges[2]);
}
}
}
for (unsigned int ix = 0; ix < l1520.size(); ++ix) {
_n[2]->fill(_edges[0]);
_n[2]->fill(_edges[2]);
for (unsigned int iy = 0; iy < lambda.size(); ++iy) {
if (l1520[ix].pid() * lambda[iy].pid() < 0) {
_nBB[2]->fill(_edges[0]);
_nBB2[2]->fill(_edges[0]);
_nBB2[2]->fill(_edges[2]);
}
}
}
}
}
}
/// Normalise histograms etc., after the run
void finalize() {
normalize(_h_pt, 1.0, false);
for (unsigned int ix = 0; ix < 3; ++ix) {
for (unsigned int iy = 0; iy < _nBB[ix]->numBins(); ++iy)
_nBB[ix]->bin(iy + 1).scaleW(1. / _c[iy]->val());
BinnedEstimatePtr<string> tmp;
book(tmp, 4 + 2 * ix, 1, 1);
divide(_nBB2[ix], _n[ix], tmp);
if (ix == 0) scale(tmp, 2.);
}
}
/// @}
/// @name Histograms
/// @{
Histo1DPtr _h_pt[3];
BinnedHistoPtr<string> _nBB[3], _nBB2[3], _n[3];
CounterPtr _c[3];
vector<string> _edges;
/// @}
};
RIVET_DECLARE_PLUGIN(ARGUS_1988_I266892);
}