Rivet analyses

Helicity angle distributions in χc1 → γ + (ϕ, ρ, ω)

Experiment: BESIII (BEPC)

Inspire ID: 894356

Status: VALIDATED NOHEPDATA

Authors: - Peter Richardson

References: - Phys.Rev.D 83 (2011) 112005

Beams: * *

Beam energies: ANY

Run details: - Any process producing chi_c1, originally e+e- -> psi(2S)

Measurement of the helicity angles in the decays χc1 → γ + (ϕ, ρ, ω). The data were read from the plots in the paper amnd may not be corrected for efficiency/acceptance, however the backgrounds given in the paper have been subtracted.

Source code:BESIII_2011_I894356.cc

// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/UnstableParticles.hh"

namespace Rivet {


  /// @brief chi_c1 -> gamma +V
  class BESIII_2011_I894356 : public Analysis {
  public:

    /// Constructor
    RIVET_DEFAULT_ANALYSIS_CTOR(BESIII_2011_I894356);


    /// @name Analysis methods
    /// @{

    /// Book histograms and initialise projections before the run
    void init() {
      // projections
      declare(UnstableParticles(Cuts::pid==20443), "UFS");
      // histograms
      for(unsigned int ix=0;ix<3;++ix)
    book(_h[ix],1,1,1+ix);
    }
    
    void findChildren(const Particle & p, Particles & pim, Particles & pip,
              Particles & pi0, unsigned int &ncount) {
      for( const Particle &child : p.children()) {
    if(child.pid()==PID::PIPLUS) {
      pip.push_back(child);
      ncount+=1;
    }
    else if(child.pid()==PID::PIMINUS) {
      pim.push_back(child);
      ncount+=1;
    }
    else if(child.pid()==PID::PI0) {
      pi0.push_back(child);
      ncount+=1;
    }
    else if(child.children().empty()) {
      ncount+=1;
    }
        else
          findChildren(child,pim,pip,pi0,ncount);
      }
    }

    /// Perform the per-event analysis
    void analyze(const Event& event) {
      for (const Particle& p :  apply<UnstableParticles>(event, "UFS").particles()) {
    if(p.children().size()!=2) continue;
    Particle gamma,meson;
    // get the photon and the meson
    if(p.children()[0].pid()==PID::PHOTON) {
      gamma = p.children()[0];
      meson = p.children()[1];
    }
    else if(p.children()[1].pid()==PID::PHOTON) {
      gamma = p.children()[1];
      meson = p.children()[0];
    }
    else
      continue;
    // check the meson
    int imode=-1;
    if(meson.pid()==333)      imode = 0;
    else if(meson.pid()==113) imode = 1;
    else if(meson.pid()==223) imode = 2;
    else continue;
    Particle d1,d2,d3;
    if(imode==0) {
      if(meson.children().size()!=2) continue;
      if(meson.children()[0].pid()==-meson.children()[1].pid() &&
         meson.children()[0].abspid()==321) {
        d1 = meson.children()[0];
        d2 = meson.children()[0];
      }
      else
        continue;
    }
    else if(imode==1) {
      if(meson.children().size()!=2) continue;
      if(meson.children()[0].pid()==-meson.children()[1].pid() &&
         meson.children()[0].abspid()==211) {
        d1 = meson.children()[0];
        d2 = meson.children()[0];
      }
      else
        continue;
    }
    else if(imode==2) {
      unsigned int ncount=0;
      Particles pip,pim,pi0;
      findChildren(meson,pim,pip,pi0,ncount);
      if(ncount==3 && pim.size()==1 && pip.size()==1 && pi0.size()==1) {
        d1=pip[0];
        d2=pim[0];
        d3=pi0[0];
      }
      else continue;
    }
    if(d1.pid()<0) swap(d1,d2);
    // boost in chi_c1 frame
    LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(p.momentum().betaVec());
    FourMomentum pMeson = boost1.transform(meson.momentum());
    FourMomentum p1=boost1.transform(d1.momentum());
    FourMomentum p2=boost1.transform(d2.momentum());
    Vector3 axis1 = pMeson.p3().unit();
    LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(pMeson.betaVec());
    p1=boost2.transform(p1);
    p2=boost2.transform(p2);
    // axis in meson rest frame
    Vector3 axis2;
    if(imode<2) {
      axis2=p1.p3().unit();
    }
    else {
      FourMomentum p3 = boost1.transform(d3.momentum());
      p3 = boost2.transform(p3);
      axis2=p1.p3().cross(p2.p3()).unit();
    }
    _h[imode]->fill(axis1.dot(axis2));
      }
    }


    /// Normalise histograms etc., after the run
    void finalize() {
      for(unsigned int ix=0;ix<3;++ix)
    normalize(_h[ix],1.,false);
    }

    /// @}


    /// @name Histograms
    /// @{
    Histo1DPtr _h[3];
    /// @}


  };


  RIVET_DECLARE_PLUGIN(BESIII_2011_I894356);

}