rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

CLEO_2009_I832707

Analysis of $\psi(2S)\to\gamma\chi_{c(1,2)}$ decays using $\chi_{c(1,2)}\to J/\psi\gamma$
Experiment: CLEO (CESR)
Inspire ID: 832707
Status: VALIDATED NOHEPDATA
Authors:
  • Peter Richardson
References:
  • Phys.Rev.D 80 (2009) 112003
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_{c(1,2)}$ followed by $\chi_{c(1,2)}\to\gamma J/\psi$ and $J/\psi\to\ell^+\ell^-$ 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: CLEO_2009_I832707.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 CLEO_2009_I832707 : public Analysis {
 12  public:
 13
 14    /// Constructor
 15    RIVET_DEFAULT_ANALYSIS_CTOR(CLEO_2009_I832707);
 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==20443 || Cuts::pid==445), "UFS");
 26      declare(FinalState(), "FS");
 27      for(unsigned int ix=0;ix<2;++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      // then the J/psi and second photon
102      Particle JPsi,gamma2;
103      if(chi.children()[0].pid()==PID::PHOTON &&
104	 chi.children()[1].pid()==443) {
105	gamma2 = chi.children()[0];
106	JPsi   = chi.children()[1];
107      }
108      else if(chi.children()[1].pid()==PID::PHOTON &&
109	      chi.children()[0].pid()==443) {
110	gamma2 = chi.children()[1];
111	JPsi   = chi.children()[0];
112      }
113      else
114	vetoEvent;
115      // finally the leptons from J/psi decay
116      if(JPsi.children().size()!=2) vetoEvent;
117      if(JPsi.children()[0].pid()!=-JPsi.children()[1].pid()) vetoEvent;
118      if(JPsi.children()[0].abspid()!=PID::EMINUS &&
119	 JPsi.children()[0].abspid()!=PID::MUON) vetoEvent;
120      Particle lm = JPsi.children()[0];
121      Particle lp = JPsi.children()[1];
122      if(lm.pid()<0) swap(lm,lp);
123      // type chi state
124      unsigned int ichi= chi.pid()==445 ? 1 : 0;
125      // axis in the chi frame
126      LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(chi.momentum().betaVec());
127      FourMomentum pGamma2 = boost1.transform(gamma2.momentum());
128      Vector3 axis1 = pGamma2.p3().unit();
129      // cos thetaxs distributions
130      FourMomentum pJpsi = boost1.transform(JPsi.momentum());
131      FourMomentum plp   = boost1.transform(  lp.momentum());
132      LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(pJpsi.betaVec());
133      Vector3 axis2 = boost2.transform(plp).p3().unit();
134      Vector3 e2z = gamma2.momentum().p3().unit();
135      _h[ichi]->fill(abs(e2z.dot(axis2)));
136    }
137
138
139    /// Normalise histograms etc., after the run
140    void finalize() {
141      for(unsigned int ix=0;ix<2;++ix) {
142	normalize(_h[ix]);
143      }
144    }
145
146    /// @}
147
148
149    /// @name Histograms
150    /// @{
151    Histo1DPtr _h[2];
152    /// @}
153
154
155  };
156
157
158  RIVET_DECLARE_PLUGIN(CLEO_2009_I832707);
159
160}