Rivet analyses
Angular distributions in e+e− → ρ+ρ−
Experiment: BABAR (PEP-II)
Inspire ID: 789011
Status: VALIDATED NOHEPDATA
Authors: - Peter Richardson
References: - Phys.Rev.D 78 (2008) 071103
Beams: e+ e-
Beam energies: (5.3, 5.3)GeV
Run details: - e+ e- > hadrons
Measurement of helicty angle distributions in e+e− → ρ+ρ−. The corrected data were read from fgiure 4 in the paper
Source
code:BABAR_2008_I789011.cc
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/Beam.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/UnstableParticles.hh"
namespace Rivet {
/// @brief e+e- > rho+ rho-
class BABAR_2008_I789011 : public Analysis {
public:
/// Constructor
RIVET_DEFAULT_ANALYSIS_CTOR(BABAR_2008_I789011);
/// @name Analysis methods
/// @{
/// Book histograms and initialise projections before the run
void init() {
// Initialise and register projections
declare(Beam(), "Beams");
declare(UnstableParticles(Cuts::abspid == 213), "UFS");
declare(FinalState(), "FS");
// histos
for (unsigned int ix = 0; ix < 5; ++ix) book(_h[ix], 1, 1, 1 + ix);
}
void findChildren(const Particle& p, map<long, int>& nRes, int& ncount) {
for (const Particle& child : p.children()) {
if (child.children().empty()) {
nRes[child.pid()] -= 1;
--ncount;
}
else
findChildren(child, nRes, ncount);
}
}
/// Perform the per-event analysis
void analyze(const Event& event) {
// get the axis, direction of incoming electron
const ParticlePair& beams = apply<Beam>(event, "Beams").beams();
Vector3 axis;
if (beams.first.pid() > 0)
axis = beams.first.momentum().p3().unit();
else
axis = beams.second.momentum().p3().unit();
// types of final state particles
const FinalState& fs = apply<FinalState>(event, "FS");
map<long, int> nCount;
int ntotal(0);
for (const Particle& p : fs.particles()) {
nCount[p.pid()] += 1;
++ntotal;
}
// loop over rho mesons
const UnstableParticles& ufs = apply<UnstableParticles>(event, "UFS");
Particle rhoP, rhoM;
bool matched(false);
for (const Particle& p : ufs.particles()) {
if (p.children().empty()) continue;
map<long, int> nRes = nCount;
int ncount = ntotal;
findChildren(p, nRes, ncount);
matched = false;
// check for antiparticle
for (const Particle& p2 : ufs.particles(Cuts::pid == -p.pid())) {
if (p2.children().empty()) continue;
map<long, int> nRes2 = nRes;
int ncount2 = ncount;
findChildren(p2, nRes2, ncount2);
if (ncount2 == 0) {
matched = true;
for (const auto& val : nRes2) {
if (val.second != 0) {
matched = false;
break;
}
}
// found rho+/-
if (matched) {
if (p.pid() > 0) {
rhoP = p;
rhoM = p2;
}
else {
rhoP = p2;
rhoM = p;
}
break;
}
}
}
if (matched) break;
}
if (!matched) vetoEvent;
Particle piP, piM;
matched = false;
if (rhoP.children().size() != 2) vetoEvent;
if (rhoM.children().size() != 2) vetoEvent;
if (rhoP.children()[0].pid() == 211 && rhoP.children()[1].pid() == 111)
piP = rhoP.children()[0];
else if (rhoP.children()[1].pid() == 211 && rhoP.children()[0].pid() == 111)
piP = rhoP.children()[1];
else
vetoEvent;
if (rhoM.children()[0].pid() == -211 && rhoM.children()[1].pid() == 111)
piM = rhoM.children()[0];
else if (rhoM.children()[1].pid() == -211 && rhoM.children()[0].pid() == 111)
piM = rhoM.children()[1];
else
vetoEvent;
// boost to the rho+ rest frame
LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(rhoP.momentum().betaVec());
Vector3 e1z = rhoP.momentum().p3().unit();
Vector3 e1y = e1z.cross(axis).unit();
Vector3 e1x = e1y.cross(e1z).unit();
Vector3 axis1 = boost1.transform(piP.momentum()).p3().unit();
double n1x(e1x.dot(axis1)), n1y(e1y.dot(axis1)), n1z(e1z.dot(axis1));
_h[0]->fill(n1z);
_h[2]->fill(atan2(n1y, n1x));
// boost to the rho- frame
LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(rhoM.momentum().betaVec());
Vector3 axis2 = boost2.transform(piM.momentum()).p3().unit();
double n2x(e1x.dot(axis2)), n2y(e1y.dot(axis2)), n2z(e1z.dot(axis2));
_h[1]->fill(n2z);
_h[3]->fill(atan2(n2y, n2x));
_h[4]->fill(axis.dot(rhoP.momentum().p3().unit()));
}
/// Normalise histograms etc., after the run
void finalize() {
for (unsigned int ix = 0; ix < 5; ++ix) normalize(_h[ix], 1., false);
}
/// @}
/// @name Histograms
/// @{
Histo1DPtr _h[5];
/// @}
};
RIVET_DECLARE_PLUGIN(BABAR_2008_I789011);
}