Rivet analyses
MC analysis of the Kinematics in Semi-Leptonic Meson decays
Experiment: ()
Status: VALIDATED
Authors: - Peter Richardson
References: none listed
Beams: * *
Beam energies: ANY
Run details: - Any type of process producing mesons which decay semi-leptonically
Analysis of the kinematics in semileptonic meson decays.
Source
code:MC_DECAY_SEMILEPTONIC.cc
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/UnstableParticles.hh"
namespace Rivet {
/// @brief MC Semi-leptonic decay analysis
class MC_DECAY_SEMILEPTONIC : public Analysis {
public:
/// Constructor
RIVET_DEFAULT_ANALYSIS_CTOR(MC_DECAY_SEMILEPTONIC);
/// @name Analysis methods
/// @{
/// Book histograms and initialise projections before the run
void init() {
// Initialise and register projections
declare(UnstableParticles(), "UFS");
// B decays
bookHistos( 511, -413,-11,5.3);
bookHistos(-511, 413, 11,5.3);
bookHistos( 511, -413,-13,5.3);
bookHistos(-511, 413, 13,5.3);
bookHistos( 521, -423,-11,5.3);
bookHistos(-521, 423, 11,5.3);
bookHistos( 521, -423,-13,5.3);
bookHistos(-521, 423, 13,5.3);
bookHistos( 511, -411,-11,5.3);
bookHistos(-511, 411, 11,5.3);
bookHistos( 511, -411,-13,5.3);
bookHistos(-511, 411, 13,5.3);
bookHistos( 521, -421,-11,5.3);
bookHistos(-521, 421, 11,5.3);
bookHistos( 521, -421,-13,5.3);
bookHistos(-521, 421, 13,5.3);
bookHistos( 511, -415,-11,5.3);
bookHistos(-511, 415, 11,5.3);
bookHistos( 511, -415,-13,5.3);
bookHistos(-511, 415, 13,5.3);
bookHistos( 521, -425,-11,5.3);
bookHistos(-521, 425, 11,5.3);
bookHistos( 521, -425,-13,5.3);
bookHistos(-521, 425, 13,5.3);
bookHistos( 511,-10411,-11,5.3);
bookHistos(-511, 10411, 11,5.3);
bookHistos( 511,-10411,-13,5.3);
bookHistos(-511, 10411, 13,5.3);
bookHistos( 521,-10421,-11,5.3);
bookHistos(-521, 10421, 11,5.3);
bookHistos( 521,-10421,-13,5.3);
bookHistos(-521, 10421, 13,5.3);
bookHistos( 511,-10413,-11,5.3);
bookHistos(-511, 10413, 11,5.3);
bookHistos( 511,-10413,-13,5.3);
bookHistos(-511, 10413, 13,5.3);
bookHistos( 521,-10423,-11,5.3);
bookHistos(-521, 10423, 11,5.3);
bookHistos( 521,-10423,-13,5.3);
bookHistos(-521, 10423, 13,5.3);
bookHistos( 511,-20413,-11,5.3);
bookHistos(-511, 20413, 11,5.3);
bookHistos( 511,-20413,-13,5.3);
bookHistos(-511, 20413, 13,5.3);
bookHistos( 521,-20423,-11,5.3);
bookHistos(-521, 20423, 11,5.3);
bookHistos( 521,-20423,-13,5.3);
bookHistos(-521, 20423, 13,5.3);
bookHistos( 511, -213,-11,5.3);
bookHistos(-511, 213, 11,5.3);
bookHistos( 511, -213,-13,5.3);
bookHistos(-511, 213, 13,5.3);
bookHistos( 521, 113,-11,5.3);
bookHistos(-521, 113, 11,5.3);
bookHistos( 521, 113,-13,5.3);
bookHistos(-521, 113, 13,5.3);
bookHistos( 521, 223,-11,5.3);
bookHistos(-521, 223, 11,5.3);
bookHistos( 521, 223,-13,5.3);
bookHistos(-521, 223, 13,5.3);
bookHistos( 511, -211,-11,5.3);
bookHistos(-511, 211, 11,5.3);
bookHistos( 511, -211,-13,5.3);
bookHistos(-511, 211, 13,5.3);
bookHistos( 521, 111,-11,5.3);
bookHistos(-521, 111, 11,5.3);
bookHistos( 521, 111,-13,5.3);
bookHistos(-521, 111, 13,5.3);
bookHistos( 521, 221,-11,5.3);
bookHistos(-521, 221, 11,5.3);
bookHistos( 521, 221,-13,5.3);
bookHistos(-521, 221, 13,5.3);
bookHistos( 521, 331,-11,5.3);
bookHistos(-521, 331, 11,5.3);
bookHistos( 521, 331,-13,5.3);
bookHistos(-521, 331, 13,5.3);
// D decays
bookHistos( 411,-311,-11,1.9);
bookHistos(-411, 311, 11,1.9);
bookHistos( 411,-311,-13,1.9);
bookHistos(-411, 311, 13,1.9);
bookHistos( 421,-321,-11,1.9);
bookHistos(-421, 321, 11,1.9);
bookHistos( 421,-321,-13,1.9);
bookHistos(-421, 321, 13,1.9);
bookHistos( 411,-313,-11,1.9);
bookHistos(-411, 313, 11,1.9);
bookHistos( 411,-313,-13,1.9);
bookHistos(-411, 313, 13,1.9);
bookHistos( 421,-323,-11,1.9);
bookHistos(-421, 323, 11,1.9);
bookHistos( 421,-323,-13,1.9);
bookHistos(-421, 323, 13,1.9);
bookHistos( 411,-10313,-11,1.9);
bookHistos(-411, 10313, 11,1.9);
bookHistos( 411,-10313,-13,1.9);
bookHistos(-411, 10313, 13,1.9);
bookHistos( 421,-10323,-11,1.9);
bookHistos(-421, 10323, 11,1.9);
bookHistos( 421,-10323,-13,1.9);
bookHistos(-421, 10323, 13,1.9);
bookHistos( 411,-315,-11,1.9);
bookHistos(-411, 315, 11,1.9);
bookHistos( 411,-315,-13,1.9);
bookHistos(-411, 315, 13,1.9);
bookHistos( 421,-325,-11,1.9);
bookHistos(-421, 325, 11,1.9);
bookHistos( 421,-325,-13,1.9);
bookHistos(-421, 325, 13,1.9);
bookHistos( 411, 111,-11,1.9);
bookHistos(-411, 111, 11,1.9);
bookHistos( 411, 111,-13,1.9);
bookHistos(-411, 111, 13,1.9);
bookHistos( 411, 221,-11,1.9);
bookHistos(-411, 221, 11,1.9);
bookHistos( 411, 221,-13,1.9);
bookHistos(-411, 221, 13,1.9);
bookHistos( 411, 331,-11,1.9);
bookHistos(-411, 331, 11,1.9);
bookHistos( 411, 331,-13,1.9);
bookHistos(-411, 331, 13,1.9);
bookHistos( 421,-211,-11,1.9);
bookHistos(-421, 211, 11,1.9);
bookHistos( 421,-211,-13,1.9);
bookHistos(-421, 211, 13,1.9);
bookHistos( 411, 113,-11,1.9);
bookHistos(-411, 113, 11,1.9);
bookHistos( 411, 113,-13,1.9);
bookHistos(-411, 113, 13,1.9);
bookHistos( 411, 223,-11,1.9);
bookHistos(-411, 223, 11,1.9);
bookHistos( 411, 223,-13,1.9);
bookHistos(-411, 223, 13,1.9);
bookHistos( 421,-213,-11,1.9);
bookHistos(-421, 213, 11,1.9);
bookHistos( 421,-213,-13,1.9);
bookHistos(-421, 213, 13,1.9);
// D_s decays
bookHistos( 431, 221,-11,1.9);
bookHistos(-431, 221, 11,1.9);
bookHistos( 431, 221,-13,1.9);
bookHistos(-431, 221, 13,1.9);
bookHistos( 431, 331,-11,1.9);
bookHistos(-431, 331, 11,1.9);
bookHistos( 431, 331,-13,1.9);
bookHistos(-431, 331, 13,1.9);
bookHistos( 431, 333,-11,1.9);
bookHistos(-431, 333, 11,1.9);
bookHistos( 431, 333,-13,1.9);
bookHistos(-431, 333, 13,1.9);
bookHistos( 431, 311,-11,1.9);
bookHistos(-431,-311, 11,1.9);
bookHistos( 431, 311,-13,1.9);
bookHistos(-431,-311, 13,1.9);
bookHistos( 431, 313,-11,1.9);
bookHistos(-431,-313, 11,1.9);
bookHistos( 431, 313,-13,1.9);
bookHistos(-431,-313, 13,1.9);
}
void bookHistos(int id1, int id2, int ilep, double mass) {
_incoming.push_back(id1);
_outgoing.push_back(id2);
_outgoingL.push_back(ilep);
std::ostringstream title;
title << "h_" << abs(id1);
if(id1>0) title << "p";
else title << "m";
title << "_" << abs(id2);
if(id2>0) title << "p";
else title << "m";
title << "_" << abs(ilep);
if(ilep>0) title << "p";
else title << "m";
title << "_";
_energy.push_back(Histo1DPtr());
book(_energy.back(), title.str()+"energy",200,0.0,0.5*mass/MeV);
_scale .push_back(Histo1DPtr());
book(_scale.back(), title.str()+"scale" ,200,0.0,mass/MeV);
}
void findDecayProducts(const Particle & mother,
unsigned int & nstable,
Particles& lp, Particles& lm,
Particles& nu, Particles& nub,
Particles& out) {
for(const Particle & p : mother.children()) {
int id = p.pid();
if ( id == PID::EMINUS || id == PID::MUON ) {
lm .push_back(p);
++nstable;
}
else if (id == PID::EPLUS || id == PID::ANTIMUON) {
lp .push_back(p);
++nstable;
}
else if ( id == PID::NU_E || id == PID::NU_EBAR ) {
nu .push_back(p);
++nstable;
}
else if (id == PID::NU_MU || id == PID::NU_MUBAR ) {
nub.push_back(p);
++nstable;
}
else if (PID::isMeson(id)) {
out.push_back(p);
++nstable;
}
else if ( !p.children().empty() ) {
findDecayProducts(p,nstable,lp,lm,nu,nub,out);
}
else
++nstable;
}
}
/// Perform the per-event analysis
void analyze(const Event& event) {
// loop over unstable particles
for(const Particle& meson : apply<UnstableParticles>(event, "UFS").particles()) {
int id = meson.pid();
// spin 0 mesons
if(!PID::isMeson(id)) continue;
if(abs(id)%10!=1) continue;
unsigned int nstable(0);
Particles lp, lm, nu, nub, out;
findDecayProducts(meson,nstable,lp,lm,nu,nub,out);
if(nstable!=3 || out.size()!=1) continue;
int ilep=0;
FourMomentum plep,pmnu=out[0].momentum();
double me2(0.);
if( lp.size()==1 && nu.size()==1 && out.size()==1 ) {
if(nu[0].pid() != -lp[0].pid()+1) continue;
ilep = lp[0].pid();
plep = nu[0].momentum()+lp[0].momentum();
pmnu += nu[0].momentum();
me2 = lp[0].mass2();
}
else if( lm.size()==1 && nub.size()==1 && out.size()==1 ) {
if(nub[0].pid() != -lm[0].pid()-1) continue;
ilep = lm[0].pid();
plep = nub[0].momentum()+lm[0].momentum();
pmnu += nub[0].momentum();
me2 = lm[0].mass2();
}
else
continue;
// check if histos already exist
unsigned int iloc=0;
bool found(false);
while(!found&&iloc<_incoming.size()) {
if(_incoming[iloc] == id &&
_outgoing[iloc] == out[0].pid() &&
ilep==_outgoingL[iloc]) found=true;
else ++iloc;
}
if(!found) {
MSG_WARNING("MC_DECAY_SEMILEPTONIC" << id << " " << out[0].pid() << " " << " " << ilep << " "
<< meson.mass() << "\n");
continue;
}
// add the results to the histogram
_scale[iloc]->fill(plep.mass()/MeV);
double ee = 0.5/meson.mass()*(meson.mass2()-pmnu.mass2()+me2);
_energy[iloc]->fill(ee/MeV);
}
}
/// Normalise histograms etc., after the run
void finalize() {
for(unsigned int ix=0;ix<_energy.size();++ix) {
normalize(_energy);
normalize(_scale );
}
}
/// @}
/// @name Histograms
/// @{
/**
* PDG codes of the decaying mesons
*/
vector<long> _incoming;
/**
* PDG codes of the decay products
*/
vector<long> _outgoing;
/**
* Identidies of the leptons
*/
vector<long> _outgoingL;
/**
* Histograms
*/
/// @{
/**
* The lepton energy
*/
vector<Histo1DPtr> _energy;
/**
* The \f$q\f$ value
*/
vector<Histo1DPtr> _scale;
/// @}
};
RIVET_DECLARE_PLUGIN(MC_DECAY_SEMILEPTONIC);
}