Rivet analyses
Cross section and form factors for e+e− → Λc+Λ̄c− below 4.95 GeV.
Experiment: (BEPC)
Inspire ID: 2677290
Status: VALIDATED NOHEPDATA
Authors: - Peter Richardson
References: - arXiv: 2307.07316
Beams: e+ e-
Beam energies: ANY
Run details: - e+e- to hadrons
Cross section and form factors for e+e− → Λc+Λ̄c− below 4.95 GeV.
Source
code:BESIII_2023_I2677290.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- > Lambda_c+ Lambda_c-
class BESIII_2023_I2677290 : public Analysis {
public:
/// Constructor
RIVET_DEFAULT_ANALYSIS_CTOR(BESIII_2023_I2677290);
/// @name Analysis methods
/// @{
/// Book histograms and initialise projections before the run
void init() {
// Initialise and register projections
declare(Beam(), "Beams");
declare(UnstableParticles(Cuts::abspid==4122), "UFS");
declare(FinalState(), "FS");
// histograms
for (size_t ih=0; ih<5; ++ih) {
book(_est[ih], 1, 1, 1+ih);
}
for (const string& en : _est[0].binning().edges<0>()) {
double eval = stod(en);
if (isCompatibleWithSqrtS(eval)) _sqs = en;
book(_h[en+"cThetaL"], "TMP/cThetaL_"+en, 20,-1.,1.);
}
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()]-=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 .mom().p3().unit();
else axis = beams.second.mom().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;
}
const UnstableParticles& ufs = apply<UnstableParticles>(event, "UFS");
Particle Lambda, LamBar;
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 baryon and antibaryon
if (matched) {
if (p.pid()>0) {
Lambda = p;
LamBar = p2;
}
else {
Lambda = p2;
LamBar = p;
}
break;
}
}
}
if (matched) break;
}
if (!matched) vetoEvent;
const double cosL = axis.dot(Lambda.mom().p3().unit());
_h[_sqs+"cThetaL"]->fill(cosL);
}
pair<double,pair<double,double> > calcAlpha0(const Histo1DPtr& hist) const {
if (hist->numEntries()==0.) return make_pair(0.,make_pair(0.,0.));
const double d = 3./(pow(hist->xMax(),3)-pow(hist->xMin(),3));
const double c = 3.*(hist->xMax()-hist->xMin())/(pow(hist->xMax(),3)-pow(hist->xMin(),3));
double sum1(0.),sum2(0.),sum3(0.),sum4(0.),sum5(0.);
for (const auto& bin : hist->bins()) {
const double Oi = bin.sumW();
if (Oi==0.) continue;
const double a = d*(bin.xMax() - bin.xMin());
const double b = d/3.*(pow(bin.xMax(),3) - pow(bin.xMin(),3));
const double Ei = bin.errW();
sum1 += a*Oi/sqr(Ei);
sum2 += b*Oi/sqr(Ei);
sum3 += sqr(a)/sqr(Ei);
sum4 += sqr(b)/sqr(Ei);
sum5 += a*b/sqr(Ei);
}
// calculate alpha
const double alpha = (-c*sum1 + sqr(c)*sum2 + sum3 - c*sum5)/(sum1 - c*sum2 + c*sum4 - sum5);
// and error
const double cc = -pow((sum3 + sqr(c)*sum4 - 2*c*sum5),3);
const double bb = -2*sqr(sum3 + sqr(c)*sum4 - 2*c*sum5)*(sum1 - c*sum2 + c*sum4 - sum5);
const double aa = sqr(sum1 - c*sum2 + c*sum4 - sum5)*(-sum3 - sqr(c)*sum4 + sqr(sum1 - c*sum2 + c*sum4 - sum5) + 2*c*sum5);
double dis = sqr(bb)-4.*aa*cc;
if (dis>0.) {
dis = sqrt(dis);
return make_pair(alpha,make_pair(0.5*(-bb+dis)/aa,-0.5*(-bb-dis)/aa));
}
else {
return make_pair(alpha,make_pair(0.,0.));
}
}
/// Normalise histograms etc., after the run
void finalize() {
// storage of the values to fill histos
const double mn = 2.28646;
const double alpha = 7.2973525693e-3;
const double GeV2pb = 0.3893793721e9;
for (const string& en : _est[0].binning().edges<0>()) {
if (isZero(_h[en+"cThetaL"]->effNumEntries())) continue;
double eval = stod(en);
const double tau = 4.*sqr(mn/eval);
const double beta = sqrt(1.-tau);
// prefactor and sigma
double sigma0 = 4.*M_PI*sqr(alpha/eval)*beta*GeV2pb;
// calculate alpha0
pair<double,pair<double,double> > alpha0 = calcAlpha0(_h[en+"cThetaL"]);
scale(_h[en+"cThetaL"], crossSection()/ sumOfWeights()/picobarn);
const double wsum = _h[en+"cThetaL"]->integral();
const double werr = _h[en+"cThetaL"]->integralError();
// Geff
pair<double,double> Geff = make_pair(1e2*sqrt(3.*wsum/(sigma0*(1 + 0.5*tau))),
1e2*1.5*wsum/(sigma0*(1 + 0.5*tau)));
// GM
double GMv = 1e2*sqrt(6.*((1+alpha0.first)*wsum)/((3+alpha0.first)*sigma0));
double GMe1 = 1e2*sqrt((3*(sqr(werr)*sqr(1 + alpha0.first)*sqr(3 + alpha0.first) + 4*sqr(alpha0.second.first)*sqr(wsum)))/
(2.*(1 + alpha0.first)*pow(3 + alpha0.first,3)*wsum*sigma0));
double GMe2 = 1e2*sqrt((3*(sqr(werr)*sqr(1 + alpha0.first)*sqr(3 + alpha0.first) + 4*sqr(alpha0.second.second)*sqr(wsum)))/
(2.*(1 + alpha0.first)*pow(3 + alpha0.first,3)*wsum*sigma0));
pair<double,pair<double,double> > GM = make_pair(std::move(GMv), make_pair(std::move(GMe1), std::move(GMe2)));
// ratio
pair<double,pair<double,double>> R;
R.first = sqrt((1 - alpha0.first)/(tau + alpha0.first*tau));
R.second.first = R.first*alpha0.second.first /(1.-sqr(alpha0.first));
R.second.second = R.first*alpha0.second.second/(1.-sqr(alpha0.first));
for (size_t ix=1; ix<6; ++ix) {
double val;
pair<double,double> err;
if (ix==1) {
val = wsum;
err = make_pair(werr, werr);
}
else if (ix==2) {
val = Geff.first;
err = make_pair(Geff.second,Geff.second);
}
else if (ix==3) {
val = alpha0.first;
err = alpha0.second;
}
else if (ix==4) {
val = R.first;
err = R.second;
}
else {
val = GM.first;
err = GM.second;
}
_est[ix-1]->binAt(en).set(val,err);
}
}
}
/// @}
/// @name Histograms
/// @{
map<string,Histo1DPtr> _h;
BinnedEstimatePtr<string> _est[5];
string _sqs = "";
/// @}
};
RIVET_DECLARE_PLUGIN(BESIII_2023_I2677290);
}