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);

}