Rivet analyses
Mass and angular distributions in the radiative decays Υ(1S) → π+π− and K+K−
Experiment: BABAR (PEP-II)
Inspire ID: 1667191
Status: VALIDATED NOHEPDATA
Authors: - Peter Richardson
References: - Phys.Rev.D 97 (2018) 11, 112006
Beams: * *
Beam energies: ANY
Run details: - Upsilon(1S) produced in the decays Upsilon(2,3S)-> Upsilon(1S) pi+ pi- (need for photon angle dist)
Mass and angular distributions in the radiative decays Υ(1S) → π+π− and K+K−
Source
code:BABAR_2018_I1667191.cc
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/UnstableParticles.hh"
#include "Rivet/Projections/DecayedParticles.hh"
namespace Rivet {
/// @brief Upsilon(1S) -> gamma pi+pi- K+K-
class BABAR_2018_I1667191 : public Analysis {
public:
/// Constructor
RIVET_DEFAULT_ANALYSIS_CTOR(BABAR_2018_I1667191);
/// @name Analysis methods
/// @{
/// Book histograms and initialise projections before the run
void init() {
// projections
UnstableParticles ufs = UnstableParticles(Cuts::abspid==200553 or
Cuts::abspid==100553);
declare(ufs, "UFS");
DecayedParticles UPS(ufs);
UPS.addStable( 553);
declare(UPS, "UPS");
// histograms
for(unsigned int ix=0;ix<2;++ix)
book(_h_mass[ix],1+ix,1,1);
book(_h_pi,3,1,1);
for(unsigned int ix=0;ix<3;++ix)
for(unsigned int iy=0;iy<2;++iy)
book(_h_angle[ix][iy],4+ix,1,1+iy);
}
/// Recursively walk the decay tree to find decay products of @a p
void findDecayProducts(Particle mother, Particles& gamma,
Particles & pip, Particles & pim,
Particles & Kp , Particles & Km,unsigned int & nstable) {
for(const Particle & p: mother.children()) {
if (p.pid()== 211) pip.push_back(p);
else if(p.pid()==-211) pim.push_back(p);
else if(p.pid()== 321) Kp .push_back(p);
else if(p.pid()==-321) Km .push_back(p);
else if(p.pid()==22) gamma.push_back(p);
else if(p.children().empty())
nstable+=1;
else {
findDecayProducts(p, gamma,pip,pim,Kp,Km,nstable);
}
}
}
/// Perform the per-event analysis
void analyze(const Event& event) {
static const map<PdgId,unsigned int> & mode = { { 553,1},{ 211,1}, {-211,1}};
DecayedParticles UPS = apply<DecayedParticles>(event, "UPS");
// loop over particles
for(unsigned int ix=0;ix<UPS.decaying().size();++ix) {
// check pi+pi- upslion(1S) decay mode
if (!UPS.modeMatches(ix,3,mode)) continue;
const Particle & ups1 = UPS.decayProducts()[ix].at( 553)[0];
const Particle & pips = UPS.decayProducts()[ix].at( 211)[0];
const Particle & pims = UPS.decayProducts()[ix].at(-211)[0];
// boost to rest frame
LorentzTransform boost;
if (UPS.decaying()[ix].p3().mod() > 1*MeV)
boost = LorentzTransform::mkFrameTransformFromBeta(UPS.decaying()[ix].momentum().betaVec());
FourMomentum ppipi = boost.transform(pips.momentum()+pims.momentum());
Vector3 axis1 = ppipi.p3().unit();
LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(ppipi);
FourMomentum ppi = boost1.transform(boost.transform(pips.momentum()));
_h_pi->fill(abs(ppi.p3().unit().dot(axis1)));
unsigned int nstable=0;
Particles gamma,pip,pim,Kp,Km;
findDecayProducts(ups1, gamma,pip,pim,Kp,Km,nstable);
if(gamma.size()!=1 || nstable!=0) continue;
// gamma pi+pi-
if(Kp.empty()&&Km.empty()&&pip.size()==1&&pim.size()==1) {
ppipi = pip[0].momentum()+pim[0].momentum();
double mpipi = ppipi.mass();
_h_mass[0]->fill(mpipi);
axis1 *=-1;
LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(boost.transform(ups1.momentum()).betaVec());
FourMomentum pgamma = boost2.transform(boost.transform(gamma[0].momentum()));
Vector3 axis2 = pgamma.p3().unit();
double cGamma = axis2.dot(axis1);
ppipi = boost2.transform(boost1.transform(ppipi));
LorentzTransform boost3 = LorentzTransform::mkFrameTransformFromBeta(ppipi.betaVec());
Vector3 axis3 = boost3.transform(boost2.transform(boost1.transform(pip[0].momentum()))).p3().unit();
double cH = axis3.dot(axis2);
int iloc=-1;
if(mpipi>0.6&&mpipi<1.) iloc=0;
else if(mpipi>1.092&&mpipi<1.46) iloc=1;
if(iloc>=0) {
_h_angle[iloc][0]->fill(cGamma);
_h_angle[iloc][1]->fill(cH);
}
}
// gamma K+K-
else if (pip.empty()&&pim.empty()&&Kp.size()==1&&Km.size()==1) {
FourMomentum pKK = Kp[0].momentum()+Km[0].momentum();
double mKK = pKK.mass();
_h_mass[1]->fill(mKK);
axis1 *=-1;
LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(boost.transform(ups1.momentum()).betaVec());
FourMomentum pgamma = boost2.transform(boost.transform(gamma[0].momentum()));
Vector3 axis2 = pgamma.p3().unit();
double cGamma = axis2.dot(axis1);
pKK = boost2.transform(boost1.transform(pKK));
LorentzTransform boost3 = LorentzTransform::mkFrameTransformFromBeta(pKK.betaVec());
Vector3 axis3 = boost3.transform(boost2.transform(boost1.transform(Kp[0].momentum()))).p3().unit();
double cH = axis3.dot(axis2);
if(mKK>1.424 && mKK<1.62) {
_h_angle[2][0]->fill(cGamma);
_h_angle[2][1]->fill(cH);
}
}
}
}
/// Normalise histograms etc., after the run
void finalize() {
for(unsigned int ix=0;ix<2;++ix)
normalize(_h_mass[ix],1.,false);
normalize(_h_pi,1.,false);
for(unsigned int ix=0;ix<3;++ix)
for(unsigned int iy=0;iy<2;++iy)
normalize(_h_angle[ix][iy],1.,false);
}
/// @}
/// @name Histograms
/// @{
Histo1DPtr _h_mass[2];
Histo1DPtr _h_pi;
Histo1DPtr _h_angle[3][2];
/// @}
};
RIVET_DECLARE_PLUGIN(BABAR_2018_I1667191);
}