rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BESIII_2017_I1624548

Analysis of $\psi(2S)\to\gamma\chi_{c2}$ decays using $\chi_{c2}\to\gamma\gamma$
Experiment: BESIII (BEPC)
Inspire ID: 1624548
Status: VALIDATED NOHEPDATA
Authors:
  • Peter Richardson
References:
  • Phys.Rev.D 96 (2017) 9, 092007
Beams: e- e+
Beam energies: (1.8, 1.8) GeV
Run details:
  • e+e- > psi(2S)

Analysis of the angular distribution of the photons and leptons produced in $e^+e^-\to \psi(2S) \to \gamma\chi_{c2}$ followed by $\chi_{c2}\to\gamma \gamma$. Gives information about the decay and is useful for testing correlations in charmonium decays. N.B. the data was read from the figures in the paper and is not corrected and should only be used qualatively.

Source code: BESIII_2017_I1624548.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/Beam.hh"
  4#include "Rivet/Projections/FinalState.hh"
  5#include "Rivet/Projections/UnstableParticles.hh"
  6
  7namespace Rivet {
  8
  9
 10  /// @brief psi(2S) -> gamma chi_c1,2
 11  class BESIII_2017_I1624548 : public Analysis {
 12  public:
 13
 14    /// Constructor
 15    RIVET_DEFAULT_ANALYSIS_CTOR(BESIII_2017_I1624548);
 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      declare(UnstableParticles(Cuts::pid==445), "UFS");
 26      declare(FinalState(), "FS");
 27      for(unsigned int ix=0;ix<3;++ix)
 28	book(_h[ix],1,1,1+ix);
 29    }
 30
 31    void findChildren(const Particle & p,map<long,int> & nRes, int &ncount) {
 32      for( const Particle &child : p.children()) {
 33	if(child.children().empty()) {
 34	  nRes[child.pid()]-=1;
 35	  --ncount;
 36	}
 37	else
 38	  findChildren(child,nRes,ncount);
 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      // types of final state particles
 52      const FinalState& fs = apply<FinalState>(event, "FS");
 53      map<long,int> nCount;
 54      int ntotal(0);
 55      for (const Particle& p :  fs.particles()) {
 56	nCount[p.pid()] += 1;
 57	++ntotal;
 58      }
 59      // loop over chi_c states
 60      Particle chi;
 61      bool matched = false;
 62      const UnstableParticles & ufs = apply<UnstableParticles>(event, "UFS");
 63      for (const Particle& p :  ufs.particles()) {
 64       	if(p.children().empty()) continue;
 65       	map<long,int> nRes=nCount;
 66       	int ncount = ntotal;
 67       	findChildren(p,nRes,ncount);
 68	if(ncount==1) {
 69	  matched = true;
 70	  for(auto const & val : nRes) {
 71	    if(val.first==PID::PHOTON) {
 72	      if(val.second!=1) {
 73	      matched = false;
 74	      break;
 75	      }
 76	    }
 77	    else if(val.second!=0) {
 78	      matched = false;
 79	      break;
 80	    }
 81	  }
 82	  if(matched) {
 83	    chi=p;
 84	    break;
 85	  }
 86	}
 87      }
 88      if(!matched) vetoEvent;
 89      // have chi_c find psi2S 
 90      if(chi.parents().empty() || chi.children().size()!=2) vetoEvent;
 91      Particle psi2S = chi.parents()[0];
 92      if(psi2S.pid()!=100443 || psi2S.children().size()!=2) vetoEvent;
 93      // then the first photon
 94      Particle gamma1;
 95      if(psi2S.children()[0].pid()==PID::PHOTON)
 96	gamma1 = psi2S.children()[0];
 97      else if(psi2S.children()[1].pid()==PID::PHOTON)
 98	gamma1 = psi2S.children()[1];
 99      else
100	vetoEvent;
101      // and second photon
102      Particle gamma2;
103      if(chi.children()[0].pid()==PID::PHOTON &&
104	 chi.children()[1].pid()==PID::PHOTON) {
105	gamma2 = chi.children()[0];
106      }
107      else
108	vetoEvent;
109      // first angle of gamma1 w.r.t beam
110      _h[0]->fill(axis.dot(gamma1.momentum().p3().unit()));
111      // axis in the chi frame
112      LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(chi.momentum().betaVec());
113      Vector3 e1z = gamma1.momentum().p3().unit();
114      Vector3 e1y = e1z.cross(axis).unit();
115      Vector3 e1x = e1y.cross(e1z).unit();
116      // cos theta_2 and phi 2 distributions
117      FourMomentum pGamma2 = boost1.transform(gamma2.momentum());
118      Vector3 axis1 = pGamma2.p3().unit();
119      _h[1]->fill(e1z.dot(axis1));
120      double phi2 = atan2(e1y.dot(axis1),e1x.dot(axis1));
121      if(phi2<0) phi2+=2.*M_PI;
122      _h[2]->fill(phi2);
123    }
124
125
126    /// Normalise histograms etc., after the run
127    void finalize() {
128      for(unsigned int ix=0;ix<3;++ix) {
129	normalize(_h[ix],1.,false);
130      }
131    }
132
133    /// @}
134
135
136    /// @name Histograms
137    /// @{
138    Histo1DPtr _h[3];
139    /// @}
140
141
142  };
143
144
145  RIVET_DECLARE_PLUGIN(BESIII_2017_I1624548);
146
147}