rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BELLE_2020_I1796822

$m_{\pi\pi}$ and $q^2$ distribution in $B^+\to\pi^+\pi^-\ell^+\nu_\ell$
Experiment: BELLE (KEKB)
Inspire ID: 1796822
Status: VALIDATED
Authors:
  • Peter Richardson
References: Beams: * *
Beam energies: ANY
Run details:
  • Any process producing the relevant decay, originally e+e- at the Upsilon(4s)

Measurement of the $m_{\pi\pi}$ and $q^2$ distributions in the $B^+\to\pi^+\pi^-\ell^+\nu_\ell$ decay by the BELLE collaboration

Source code: BELLE_2020_I1796822.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/FinalState.hh"
  4#include "Rivet/Projections/UnstableParticles.hh"
  5
  6namespace Rivet {
  7
  8
  9  /// @brief B->D semileptonic decays
 10  class BELLE_2020_I1796822 : public Analysis {
 11  public:
 12
 13    /// Constructor
 14    RIVET_DEFAULT_ANALYSIS_CTOR(BELLE_2020_I1796822);
 15
 16
 17    /// @name Analysis methods
 18    /// @{
 19
 20    /// Book histograms and initialise projections before the run
 21    void init() {
 22
 23      // Initialise and register projections
 24      declare(UnstableParticles(), "UFS");
 25      // Book histograms
 26      book(_h_mpipi,1,1,1);
 27      book(_h_q2   ,2,1,1);
 28      book(_nB,"/TMP/nB");
 29    }
 30
 31    void findChildren(const Particle & p, unsigned int &ncount,
 32		      Particles & pi, Particles & ell, Particles & nu) {
 33      _nB->fill();
 34      for (const Particle &child : p.children()) {
 35	if(child.children().empty()) {
 36	  if(child.abspid()==211) {
 37	    ++ncount;
 38	    pi.push_back(child);
 39	  }
 40	  else if(child.abspid()==11 || child.abspid()==13) {
 41	    ++ncount;
 42	    ell.push_back(child);
 43	  }
 44	  else if(child.abspid()==12 || child.abspid()==14) {
 45	    ++ncount;
 46	    nu.push_back(child);
 47	  }
 48	  else if(child.pid()!=22)
 49	    ++ncount;
 50	}
 51	// veto gamma gamma decaying mesons and K0
 52	else if(child.pid()==111 || child.pid()==221 || child.pid()==331 ||
 53		child.pid()==130 || child.pid()==310) {
 54	  ++ncount;
 55	}
 56	else
 57	  findChildren(child,ncount,pi,ell,nu);
 58      }
 59    }
 60
 61
 62    /// Perform the per-event analysis
 63    void analyze(const Event& event) {
 64      for(const Particle& p : apply<UnstableParticles>(event, "UFS").particles(Cuts::pid==PID::BPLUS)) {
 65	Particles pi,ell,nu;
 66	unsigned int ncount = 0;
 67	findChildren(p,ncount,pi,ell,nu);
 68	// check the decay
 69	// 4 outgoing
 70	if(ncount!=4) continue;
 71	// including pi+ pi-
 72	if(pi.size()!=2 || pi[0].pid() != -pi[1].pid()) continue;
 73	// and ell- nubar or ell+ nu
 74	if(ell.size()!=1 || nu.size()!=1) continue;
 75	int inu = ell[0].abspid()+1;
 76	if(ell[0].pid()>0) inu *=-1;
 77	if(nu[0].pid()!=inu) continue;
 78	// fill histos
 79	// m pipi
 80	FourMomentum ppi = pi[0].momentum()+pi[1].momentum();
 81	_h_mpipi->fill(ppi.mass());
 82	// q2
 83	FourMomentum q = p.momentum() - ppi;
 84	_h_q2->fill(q.mass2());
 85      }
 86    }
 87
 88
 89    /// Normalise histograms etc., after the run
 90    void finalize() {
 91      scale(_h_mpipi,1e5/ *_nB);
 92      scale(_h_q2   ,1e5/ *_nB);
 93    }
 94
 95    /// @}
 96
 97
 98    /// @name Histograms
 99    /// @{
100    Histo1DPtr _h_mpipi,_h_q2;
101    CounterPtr _nB;
102    /// @}
103
104
105  };
106
107
108  RIVET_DECLARE_PLUGIN(BELLE_2020_I1796822);
109
110}