Rivet analyses
Cross section for e+e− → γX(3872) between 4.01 and 4.36 GeV
Experiment: BESIII (BEPC)
Inspire ID: 1258603
Status: VALIDATED NOHEPDATA
Authors: - Peter Richardson
References: - Phys.Rev.Lett. 112 (2014) 9, 092001
Beams: e+ e-
Beam energies: (2.0, 2.0); (2.1, 2.1); (2.1, 2.1); (2.2, 2.2)GeV
Run details: - e+ e- to hadrons
Measurement of the cross section for e+e− → γX(3872) times the branching ratio into the J/ψπ+π− mode for X(3872). There is no consensus as to the nature of the X(3872) cc̄ state and therefore we taken its PDG code to be 9030443, i.e. the first unused code for an undetermined spin one cc̄ state. This can be changed using the PID option if a different code is used by the event generator performing the simulation.
Source
code:BESIII_2014_I1258603.cc
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/UnstableParticles.hh"
namespace Rivet {
/// @brief e+ e- -> gamma X(3872)
class BESIII_2014_I1258603 : public Analysis {
public:
/// Constructor
RIVET_DEFAULT_ANALYSIS_CTOR(BESIII_2014_I1258603);
/// @name Analysis methods
/// @{
/// Book histograms and initialise projections before the run
void init() {
// set the PDG code
_pid = getOption<double>("PID", 9030443);
// projections
declare(FinalState(), "FS");
declare(UnstableParticles(), "UFS");
// counters
book(_sigma, 1, 1, 1);
for (const string& en : _sigma.binning().edges<0>()) {
const double eval = stod(en)*GeV;
if (isCompatibleWithSqrtS(eval)) {
_sqs = en; break;
}
}
raiseBeamErrorIf(_sqs.empty());
}
void findChildren(const Particle & p,map<long,int> & nRes, int &ncount) const {
for (const Particle &child : p.children()) {
if (child.children().empty()) {
--nRes[child.pid()];
--ncount;
}
else {
findChildren(child,nRes,ncount);
}
}
}
/// Perform the per-event analysis
void analyze(const Event& event) {
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;
}
const FinalState& ufs = apply<FinalState>(event, "UFS");
bool found = false;
for (const Particle & psi : ufs.particles(Cuts::pid==443)) {
if (psi.children().empty()) continue;
map<long,int> nRes = nCount;
int ncount = ntotal;
findChildren(psi,nRes,ncount);
// check for J/psi pi+pi- mode
if (ncount==3) {
bool matched = true;
for (const auto& val : nRes) {
if (abs(val.first)==211 || val.first==PID::GAMMA) {
if (val.second !=1) {
matched = false;
break;
}
}
else if (val.second!=0) {
matched = false;
break;
}
}
if (matched) {
found = true;
break;
}
}
}
if (!found) vetoEvent;
// find the intermediate
for (const Particle& XX : ufs.particles(Cuts::pid==_pid)) {
if (XX.children().empty()) continue;
map<long,int> nRes = nCount;
int ncount = ntotal;
findChildren(XX,nRes,ncount);
if (ncount!=1) continue;
bool matched = true;
for (const auto& val : nRes) {
if (val.first==PID::GAMMA) {
if (val.second !=1) {
matched = false;
break;
}
}
else if (val.second!=0) {
matched = false;
break;
}
}
if (matched) {
_sigma->fill(_sqs);
break;
}
}
}
/// Normalise histograms etc., after the run
void finalize() {
scale(_sigma,crossSection()/ sumOfWeights() /picobarn);
}
/// @}
/// @name Histograms
/// @{
int _pid;
BinnedHistoPtr<string> _sigma;
string _sqs = "";
/// @}
};
RIVET_DECLARE_PLUGIN(BESIII_2014_I1258603);
}