rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BESIII_2017_I1509920

$\psi(2S)\to e^+e^-\chi_{c(1,2)}$ and $\chi_{c(1,2)}\to e^+e^- J/\psi$ decays
Experiment: BESIII (BEPC)
Inspire ID: 1509920
Status: VALIDATED NOHEPDATA
Authors:
  • Peter Richardson
References:
  • Phys.Rev.Lett. 118 (2017) 22, 221802
Beams: e- e+
Beam energies: (1.8, 1.8) GeV
Run details:
  • e+e- > psi 2s.

Measurement of the $e^+e^-$ mass distribution and the helicity angle in the decays $\psi(2S)\to e^+e^-\chi_{c(1,2)}$ and $\chi_{c(1,2)}\to e^+e^- J/\psi$ decays. Data was read from the plots in the paper and the mass distributions are not corrected, although the angle distributions are

Source code: BESIII_2017_I1509920.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/UnstableParticles.hh"
  4#include "Rivet/Projections/Beam.hh"
  5#include "Rivet/Projections/DecayedParticles.hh"
  6
  7namespace Rivet {
  8
  9
 10  /// @brief psi(2S) -> e+e- chi_c and chi_c  -> e+e- Jpsi$
 11  class BESIII_2017_I1509920 : public Analysis {
 12  public:
 13
 14    /// Constructor
 15    RIVET_DEFAULT_ANALYSIS_CTOR(BESIII_2017_I1509920);
 16
 17
 18    /// @name Analysis methods
 19    /// @{
 20
 21    /// Book histograms and initialise projections before the run
 22    void init() {
 23      // Initialise and register projections
 24      declare(Beam(), "Beams");
 25      UnstableParticles ufs_psi(Cuts::abspid==PID::PSI2S);
 26      DecayedParticles psi(ufs_psi);
 27      psi.addStable(20443);
 28      psi.addStable(445);
 29      declare(psi, "PSI");
 30      UnstableParticles ufs_chi(Cuts::abspid==445 or Cuts::abspid==20443);
 31      DecayedParticles chi(ufs_chi);
 32      chi.addStable(PID::JPSI);
 33      declare(chi, "CHI");
 34
 35      // Histograms
 36      for(unsigned int ix=0;ix<2;++ix)
 37	for(unsigned int iy=0;iy<4;++iy)
 38	  book(_h[ix][iy],1+ix,1,1+iy);
 39    }
 40
 41
 42    /// Perform the per-event analysis
 43    void analyze(const Event& event) {
 44      // get the axis, direction of incoming electron
 45      const ParticlePair& beams = apply<Beam>(event, "Beams").beams();
 46      Vector3 axis;
 47      if(beams.first.pid()>0)
 48	axis = beams.first .momentum().p3().unit();
 49      else
 50	axis = beams.second.momentum().p3().unit();
 51      // decaying particles
 52      static const map<PdgId,unsigned int> & mode1   = { {20443,1},{ 11,1}, { -11,1}};
 53      static const map<PdgId,unsigned int> & mode2   = { {  445,1},{ 11,1}, { -11,1}};
 54      static const map<PdgId,unsigned int> & mode3   = { {  443,1},{ 11,1}, { -11,1}};
 55      unsigned int iproj=0;
 56      for(const DecayedParticles & in : {apply<DecayedParticles>(event, "PSI"),apply<DecayedParticles>(event, "CHI")} ) {
 57	for(unsigned int ix=0;ix<in.decaying().size();++ix) {
 58	  int imode=-1,ichi=0;
 59	  if(iproj==0) {
 60	    if(in.modeMatches(ix,3,mode1)) {
 61	      imode=0;
 62	      ichi=20443;
 63	    }
 64	    else if(in.modeMatches(ix,3,mode2)) {
 65	      imode=1;
 66	      ichi=445;
 67	    }
 68	    else
 69	      continue;
 70	  }
 71	  else {
 72	    if(in.modeMatches(ix,3,mode3)) {
 73	      imode = in.decaying()[ix].pid()==20443 ? 2 : 3;
 74	      ichi=443;
 75	    }
 76	    else
 77	      continue;
 78	  }
 79	  // extract particles
 80	  const Particle & em  = in.decayProducts()[ix].at(  11)[0];
 81	  const Particle & ep  = in.decayProducts()[ix].at( -11)[0];
 82	  const Particle & out = in.decayProducts()[ix].at(ichi)[0];
 83	  FourMomentum qq = ep.momentum()+em.momentum();
 84	  double q = qq.mass();
 85	  _h[0][imode]->fill(q);
 86	  if(iproj==0) {
 87	    _h[1][imode]->fill(axis.dot((em.momentum()+ep.momentum()).p3().unit()));
 88	  }
 89	  else if(iproj==1) {
 90	    // boost everything to decaying particle frame
 91	    LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(in.decaying()[ix].momentum().betaVec());
 92	    FourMomentum pout = boost1.transform(out.momentum());
 93	    FourMomentum pe   = boost1.transform(em.momentum());
 94	    qq = boost1.transform(qq);
 95	    Vector3 axis1 = pout.p3().unit();
 96	    LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(qq.betaVec());
 97	    pe = boost2.transform(pe);
 98	    _h[1][imode]->fill(pe.p3().unit().dot(axis1));
 99	  }
100	}
101	++iproj;
102      }
103    }
104
105
106    /// Normalise histograms etc., after the run
107    void finalize() {
108      for(unsigned int ix=0;ix<2;++ix)
109	for(unsigned int iy=0;iy<4;++iy)
110	  normalize(_h[ix][iy],1.,false);
111    }
112
113    /// @}
114
115
116    /// @name Histograms
117    /// @{
118    Histo1DPtr _h[2][4];
119    /// @}
120
121
122  };
123
124
125  RIVET_DECLARE_PLUGIN(BESIII_2017_I1509920);
126
127}