rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BESIII_2011_I894356

Helicity angle distributions in $\chi_{c1}\to \gamma +(\phi,\rho,\omega)$
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 $\chi_{c1}\to \gamma +(\phi,\rho,\omega)$. 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
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/UnstableParticles.hh"
  4
  5namespace Rivet {
  6
  7
  8  /// @brief chi_c1 -> gamma +V
  9  class BESIII_2011_I894356 : public Analysis {
 10  public:
 11
 12    /// Constructor
 13    RIVET_DEFAULT_ANALYSIS_CTOR(BESIII_2011_I894356);
 14
 15
 16    /// @name Analysis methods
 17    /// @{
 18
 19    /// Book histograms and initialise projections before the run
 20    void init() {
 21      // projections
 22      declare(UnstableParticles(Cuts::pid==20443), "UFS");
 23      // histograms
 24      for(unsigned int ix=0;ix<3;++ix)
 25	book(_h[ix],1,1,1+ix);
 26    }
 27    
 28    void findChildren(const Particle & p, Particles & pim, Particles & pip,
 29		      Particles & pi0, unsigned int &ncount) {
 30      for( const Particle &child : p.children()) {
 31	if(child.pid()==PID::PIPLUS) {
 32	  pip.push_back(child);
 33	  ncount+=1;
 34	}
 35	else if(child.pid()==PID::PIMINUS) {
 36	  pim.push_back(child);
 37	  ncount+=1;
 38	}
 39	else if(child.pid()==PID::PI0) {
 40	  pi0.push_back(child);
 41	  ncount+=1;
 42	}
 43	else if(child.children().empty()) {
 44	  ncount+=1;
 45	}
 46    	else
 47    	  findChildren(child,pim,pip,pi0,ncount);
 48      }
 49    }
 50
 51    /// Perform the per-event analysis
 52    void analyze(const Event& event) {
 53      for (const Particle& p :  apply<UnstableParticles>(event, "UFS").particles()) {
 54	if(p.children().size()!=2) continue;
 55	Particle gamma,meson;
 56	// get the photon and the meson
 57	if(p.children()[0].pid()==PID::PHOTON) {
 58	  gamma = p.children()[0];
 59	  meson = p.children()[1];
 60	}
 61	else if(p.children()[1].pid()==PID::PHOTON) {
 62	  gamma = p.children()[1];
 63	  meson = p.children()[0];
 64	}
 65	else
 66	  continue;
 67	// check the meson
 68	int imode=-1;
 69	if(meson.pid()==333)      imode = 0;
 70	else if(meson.pid()==113) imode = 1;
 71	else if(meson.pid()==223) imode = 2;
 72	else continue;
 73	Particle d1,d2,d3;
 74	if(imode==0) {
 75	  if(meson.children().size()!=2) continue;
 76	  if(meson.children()[0].pid()==-meson.children()[1].pid() &&
 77	     meson.children()[0].abspid()==321) {
 78	    d1 = meson.children()[0];
 79	    d2 = meson.children()[0];
 80	  }
 81	  else
 82	    continue;
 83	}
 84	else if(imode==1) {
 85	  if(meson.children().size()!=2) continue;
 86	  if(meson.children()[0].pid()==-meson.children()[1].pid() &&
 87	     meson.children()[0].abspid()==211) {
 88	    d1 = meson.children()[0];
 89	    d2 = meson.children()[0];
 90	  }
 91	  else
 92	    continue;
 93	}
 94	else if(imode==2) {
 95	  unsigned int ncount=0;
 96	  Particles pip,pim,pi0;
 97	  findChildren(meson,pim,pip,pi0,ncount);
 98	  if(ncount==3 && pim.size()==1 && pip.size()==1 && pi0.size()==1) {
 99	    d1=pip[0];
100	    d2=pim[0];
101	    d3=pi0[0];
102	  }
103	  else continue;
104	}
105	if(d1.pid()<0) swap(d1,d2);
106	// boost in chi_c1 frame
107	LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(p.momentum().betaVec());
108	FourMomentum pMeson = boost1.transform(meson.momentum());
109	FourMomentum p1=boost1.transform(d1.momentum());
110	FourMomentum p2=boost1.transform(d2.momentum());
111	Vector3 axis1 = pMeson.p3().unit();
112	LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(pMeson.betaVec());
113	p1=boost2.transform(p1);
114	p2=boost2.transform(p2);
115	// axis in meson rest frame
116	Vector3 axis2;
117	if(imode<2) {
118	  axis2=p1.p3().unit();
119	}
120	else {
121	  FourMomentum p3 = boost1.transform(d3.momentum());
122	  p3 = boost2.transform(p3);
123	  axis2=p1.p3().cross(p2.p3()).unit();
124	}
125	_h[imode]->fill(axis1.dot(axis2));
126      }
127    }
128
129
130    /// Normalise histograms etc., after the run
131    void finalize() {
132      for(unsigned int ix=0;ix<3;++ix)
133	normalize(_h[ix]);
134    }
135
136    /// @}
137
138
139    /// @name Histograms
140    /// @{
141    Histo1DPtr _h[3];
142    /// @}
143
144
145  };
146
147
148  RIVET_DECLARE_PLUGIN(BESIII_2011_I894356);
149
150}