rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

CLEOII_1998_I467642

$\Upsilon(2S)\to\Upsilon(1S)\pi^+\pi^-$
Experiment: CLEOII (CUSB)
Inspire ID: 467642
Status: VALIDATED
Authors:
  • Peter Richardson
References:
  • Phys.Rev. D58 (1998) 052004
Beams: * *
Beam energies: ANY
Run details:
  • In princple any process producing Upsilon(2S), but e+e- -> Upsilon(2S) needs for some dists

Measurement of the $\pi^+\pi^-$ mass Spectrum and other distributions in $\Upsilon(2S)\to\Upsilon(1S)\pi^+\pi^-$ decays.

Source code: CLEOII_1998_I467642.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/UnstableParticles.hh"
  4
  5namespace Rivet {
  6
  7
  8  /// @brief Upsilon(2S) -> Upsilon(1S) pi+pi-
  9  class CLEOII_1998_I467642 : public Analysis {
 10  public:
 11
 12    /// Constructor
 13    RIVET_DEFAULT_ANALYSIS_CTOR(CLEOII_1998_I467642);
 14
 15
 16    /// @name Analysis methods
 17    /// @{
 18
 19    /// Book histograms and initialise projections before the run
 20    void init() {
 21
 22      // Initialise and register projections
 23      declare(UnstableParticles(),"UFS");
 24      book(_h_charged_ex   ,1,1,1);
 25      book(_h_charged_inc  ,2,1,1);
 26      book(_h_neutral_ex   ,3,1,1);
 27      book( _h_lept_ctheta ,4,1,1);
 28      book(_h_lept_phi     ,4,1,2);
 29      book(_h_piStar_ctheta,5,1,1);
 30      book(_h_piStar_phi   ,5,1,2);
 31      book(_h_pi_ctheta    ,6,1,1);
 32      book(_h_pi_phi       ,6,1,2);
 33
 34    }
 35
 36    void findDecayProducts(const Particle & mother,
 37			   unsigned int & nstable,
 38			   Particles& pip, Particles& pim,
 39			   Particles& pi0, Particles & onium) {
 40      for(const Particle & p : mother.children()) {
 41        int id = p.pid();
 42      	if ( id == PID::PIMINUS) {
 43	  pim.push_back(p);
 44	  ++nstable;
 45	}
 46       	else if (id == PID::PIPLUS) {
 47       	  pip.push_back(p);
 48       	  ++nstable;
 49       	}
 50       	else if (id == PID::PI0) {
 51       	  pi0.push_back(p);
 52       	  ++nstable;
 53       	}
 54	else if (abs(id)%1000==443 || abs(id)%1000==553) {
 55	  onium.push_back(p);
 56	  ++nstable;
 57	}
 58	else if ( !p.children().empty() ) {
 59	  findDecayProducts(p,nstable,pip,pim,pi0,onium);
 60	}
 61	else
 62	  ++nstable;
 63      }
 64    }
 65
 66    void findLeptons(const Particle & mother,
 67		     unsigned int & nstable,
 68		     Particles& lp, Particles& lm) {
 69      for(const Particle & p : mother.children()) {
 70        int id = p.pid();
 71      	if ( id == 11 || id == 13 ) {
 72	  lm.push_back(p);
 73	  ++nstable;
 74	}
 75       	else if (id == -11 || id==-13) {
 76       	  lp.push_back(p);
 77       	  ++nstable;
 78       	}
 79	else if ( !p.children().empty() ) {
 80	  findLeptons(p,nstable,lp,lm);
 81	}
 82	else
 83	  ++nstable;
 84      }
 85    }
 86
 87
 88    /// Perform the per-event analysis
 89    void analyze(const Event& event) {
 90      // loop over unstable particles
 91      for(const Particle& ups : apply<UnstableParticles>(event, "UFS").particles(Cuts::pid==100553)) {
 92	unsigned int nstable(0);
 93	Particles pip, pim, pi0, onium;
 94	findDecayProducts(ups,nstable,pip,pim,pi0,onium);
 95	// check for onium
 96	if(onium.size() !=1 || onium[0].pid()!=553 || nstable !=3) continue;
 97	//pi+pi-
 98	if( pip.size()==1 && pim.size() ==1) {
 99	  FourMomentum q = pip[0].momentum()+pim[0].momentum();
100	  _h_charged_ex->fill(q.mass()/GeV);
101	  _h_charged_inc->fill(q.mass()/GeV);
102	  // leptons from Upsilon(1S) decay
103	  nstable = 0;
104	  Particles lp, lm;
105	  findLeptons(onium[0],nstable,lp,lm);
106	  if(nstable==2&&lp.size()==1&&lm.size()==1) {
107	    _h_lept_ctheta->fill(cos(lp[0].momentum().polarAngle()));
108	    _h_lept_phi   ->fill(lp[0].momentum().azimuthalAngle());
109	  }
110	  // pions in rest frame
111	  LorentzTransform boost = LorentzTransform::mkFrameTransformFromBeta(q.betaVec());
112	  FourMomentum ppi = boost.transform(pip[0].momentum());
113	  Vector3 axis1 = q.p3().unit();
114	  Vector3 axis2 = Vector3(0.,0.,1.).cross(axis1).unit();
115	  Vector3 axis3 = axis1.cross(axis2).unit();
116	  _h_piStar_ctheta->fill(axis1.dot(ppi.p3().unit()));
117	  double phi = atan2(axis3.dot(ppi.p3().unit()),axis2.dot(ppi.p3().unit()));
118	  if(phi<0.) phi+=2.*M_PI;
119	  _h_piStar_phi->fill(phi);
120	  // pions in lab frame
121	  _h_pi_ctheta->fill(cos(q.polarAngle()));
122	  _h_pi_phi   ->fill(q.azimuthalAngle());
123	}
124	// 2pi0
125	else if (pi0.size()==2) {
126	  FourMomentum q = pi0[0].momentum()+pi0[1].momentum();
127	  _h_neutral_ex->fill(q.mass()/GeV);
128	}
129      }
130    }
131
132
133    /// Normalise histograms etc., after the run
134    void finalize() {
135      normalize(_h_charged_ex);
136      normalize(_h_charged_inc);
137      normalize(_h_neutral_ex);
138      normalize( _h_lept_ctheta);
139      normalize(_h_lept_phi);
140      normalize(_h_piStar_ctheta);
141      normalize(_h_piStar_phi);
142      normalize(_h_pi_ctheta);
143      normalize(_h_pi_phi);
144    }
145
146    /// @}
147
148
149    /// @name Histograms
150    /// @{
151    Histo1DPtr _h_charged_ex,_h_charged_inc,_h_neutral_ex;
152    Histo1DPtr _h_lept_ctheta,_h_lept_phi,_h_piStar_ctheta,_h_piStar_phi,_h_pi_ctheta,_h_pi_phi;
153    /// @}
154
155
156  };
157
158
159  RIVET_DECLARE_PLUGIN(CLEOII_1998_I467642);
160
161}