rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BELLE_2002_I589587

$\pi\pi$ mass and helicity angle for $B^0\to\rho^\pm\pi^\mp$ and $B^+\to\rho^0\pi^+$
Experiment: BELLE (KEKB)
Inspire ID: 589587
Status: VALIDATED NOHEPDATA
Authors:
  • Peter Richardson
References:
  • Phys.Lett.B 542 (2002) 183-192
Beams: * *
Beam energies: ANY
Run details:
  • Any process producing B mesons, originally Upsilon(4S) decays

Measurement of the $\pi\pi$ mass and helicity angle for $B^0\to\rho^\pm\pi^\mp$ and $B^+\to\rho^0\pi^+$. The background subtracted data were read from figures 2 and 3 in the paper.

Source code: BELLE_2002_I589587.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/UnstableParticles.hh"
  4#include "Rivet/Projections/DecayedParticles.hh"
  5
  6namespace Rivet {
  7
  8
  9  /// @brief B -> rho pi
 10  class BELLE_2002_I589587 : public Analysis {
 11  public:
 12
 13    /// Constructor
 14    RIVET_DEFAULT_ANALYSIS_CTOR(BELLE_2002_I589587);
 15
 16
 17    /// @name Analysis methods
 18    /// @{
 19
 20    /// Book histograms and initialise projections before the run
 21    void init() {
 22      // projections
 23      UnstableParticles ufs = UnstableParticles(Cuts::abspid==511 || Cuts::abspid==521);
 24      declare(ufs, "UFS");
 25      DecayedParticles BB(ufs);
 26      BB.addStable( 111);
 27      declare(BB, "BB");
 28      // histos
 29      for (unsigned int ix=0; ix<2; ++ix) {
 30        book(_h_mass [ix], 1, 1, 1+ix);
 31        book(_h_angle[ix], 2, 1, 1+ix);
 32      }
 33    }
 34
 35
 36    /// Perform the per-event analysis
 37    void analyze(const Event& event) {
 38      DecayedParticles BB = apply<DecayedParticles>(event, "BB");
 39      for(unsigned int ix=0; ix<BB.decaying().size(); ++ix) {
 40      	int sign = BB.decaying()[ix].pid()/BB.decaying()[ix].abspid();
 41        unsigned int imode=0;
 42      	if (BB.modeMatches(ix,3,mode1)) imode=0;
 43        else if(sign== 1 && BB.modeMatches(ix,3,mode2  )) imode=1;
 44        else if(sign==-1 && BB.modeMatches(ix,3,mode2CC)) imode=1;
 45        else continue;
 46        const Particles & pip = BB.decayProducts()[ix].at( sign*211);
 47        const Particles & pim = BB.decayProducts()[ix].at(-sign*211);
 48        bool pipiVeto=false;
 49        Particle pRho[2];
 50        double delta=1e30;
 51        for (const Particle& p1 : pip) {
 52          for(const Particle& p2 : pim) {
 53            double mpipi = (p1.mom()+p2.mom()).mass();
 54            if (abs(mpipi-1.86484)<0.14 ||
 55                abs(mpipi-3.09690)<0.07 ||
 56                abs(mpipi-3.68610)<0.05) {
 57              pipiVeto=true;
 58              break;
 59            }
 60            if (abs(mpipi-.77)<delta) {
 61              delta= abs(mpipi-.77);
 62              pRho[0]=p1;
 63              pRho[1]=p2;
 64            }
 65          }
 66        }
 67        if (pipiVeto) continue;
 68        if (imode==0) {
 69          const Particle & pi0 = BB.decayProducts()[ix].at(111)[0];
 70          delta=1e30;
 71          for (const Particle& p1 : pip) {
 72            double mpipi = (p1.mom()+pi0.mom()).mass();
 73            if (abs(mpipi-1.86966)<0.05) {
 74              pipiVeto=true;
 75              break;
 76            }
 77            if (abs(mpipi-.77)<delta) {
 78              delta= abs(mpipi-.77);
 79              pRho[0]=p1;
 80              pRho[1]=pi0;
 81            }
 82          }
 83          if (pipiVeto) continue;
 84          for (const Particle& p1 : pim) {
 85            double mpipi = (p1.mom()+pi0.mom()).mass();
 86            if (abs(mpipi-1.86966)<0.05) {
 87              pipiVeto=true;
 88              break;
 89            }
 90            if (abs(mpipi-.77)<delta) {
 91              delta= abs(mpipi-.77);
 92              pRho[0]=p1;
 93              pRho[1]=pi0;
 94            }
 95          }
 96          if (pipiVeto) continue;
 97        }
 98        FourMomentum prho = pRho[0].mom()+pRho[1].mom();
 99        double mpipi = prho.mass();
100        _h_mass[imode]->fill(mpipi);
101        // check if we should compute helicty angle
102        if      (imode==0 && (mpipi<.6 || mpipi>0.95)) continue;
103        else if (imode==1 && (mpipi<.62|| mpipi>0.92)) continue;
104        // compute the helicity angle
105        LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(BB.decaying()[ix].mom().betaVec());
106        prho = boost1.transform(prho);
107        FourMomentum ppi  = boost1.transform(pRho[0].mom());
108        LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(prho.betaVec());
109        ppi = boost2.transform(ppi);
110        double cTheta = ppi.p3().unit().dot(prho.p3().unit());
111        _h_angle[imode]->fill(cTheta);
112      }
113    }
114
115
116    /// Normalise histograms etc., after the run
117    void finalize() {
118      normalize(_h_mass, 1.0, false);
119      normalize(_h_angle, 1.0, false);
120    }
121
122    /// @}
123
124
125    /// @name Histograms
126    /// @{
127    Histo1DPtr _h_mass[2], _h_angle[2];
128    const map<PdgId,unsigned int> mode1   = { { 211,1}, {-211,1}, { 111,1} };
129    const map<PdgId,unsigned int> mode2   = { { 211,2}, {-211,1} };
130    const map<PdgId,unsigned int> mode2CC = { {-211,2}, { 211,1} };
131    /// @}
132
133
134  };
135
136
137  RIVET_DECLARE_PLUGIN(BELLE_2002_I589587);
138
139}