rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BESIII_2013_I1209121

Mass and anglar distributuions in $J/\psi\to\gamma\eta\eta$
Experiment: BESIII (BEPC)
Inspire ID: 1209121
Status: VALIDATED NOHEPDATA
Authors:
  • Peter Richardson
References:
  • Phys.Rev.D 87 (2013) 9, 092009
Beams: e- e+
Beam energies: (1.6, 1.6) GeV
Run details:
  • e+e- > J/psi

Measurement of mass and anglar distributuions in $J/\psi\to\gamma\eta\eta$ by BESIII

Source code: BESIII_2013_I1209121.cc
 1// -*- C++ -*-
 2#include "Rivet/Analysis.hh"
 3#include "Rivet/Projections/Beam.hh"
 4#include "Rivet/Projections/UnstableParticles.hh"
 5#include "Rivet/Projections/DecayedParticles.hh"
 6
 7namespace Rivet {
 8
 9
10  /// @brief J/psi -> gamma eta eta
11  class BESIII_2013_I1209121 : public Analysis {
12  public:
13
14    /// Constructor
15    RIVET_DEFAULT_ANALYSIS_CTOR(BESIII_2013_I1209121);
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      UnstableParticles ufs = UnstableParticles(Cuts::abspid==443);
25      declare(ufs, "UFS");
26      DecayedParticles PSI(ufs);
27      PSI.addStable(PID::ETA);
28      declare(PSI, "PSI");
29      declare(Beam(), "Beams");
30      // book histograms
31      for(unsigned int ix=0;ix<4;++ix)
32	book(_h[ix],1,1,1+ix);
33    }
34
35    // angle cuts due regions of BES calorimeter
36    bool vetoPhoton(const double & cTheta) {
37      return cTheta>0.92 || (cTheta>0.8 && cTheta<0.86);
38    }
39    
40    /// Perform the per-event analysis
41    void analyze(const Event& event) {
42      // get the axis, direction of incoming electron
43      const ParticlePair& beams = apply<Beam>(event, "Beams").beams();
44      Vector3 axis;
45      if(beams.first.pid()>0)
46	axis = beams.first .momentum().p3().unit();
47      else
48	axis = beams.second.momentum().p3().unit();
49      // find the J/psi decays
50      static const map<PdgId,unsigned int> & mode = { { 221,2},{ 22,1}};
51      DecayedParticles PSI = apply<DecayedParticles>(event, "PSI");
52      if( PSI.decaying().size()!=1) vetoEvent;
53      if(!PSI.modeMatches(0,3,mode)) vetoEvent;
54      // particles
55      const Particles & eta = PSI.decayProducts()[0].at(221);
56      const Particle  & gam = PSI.decayProducts()[0].at( 22)[0];
57      _h[0]->fill((eta[0].momentum()+eta[1].momentum()).mass());
58      double cTheta = axis.dot(gam.p3().unit());
59      if(vetoPhoton(abs(cTheta))) vetoEvent;
60      _h[1]->fill(cTheta);
61      // remaining angles
62      LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(PSI.decaying()[0].momentum().betaVec());
63      FourMomentum pGamma = boost1.transform(gam.momentum());
64      FourMomentum pEtaEta= boost1.transform(eta[0].momentum()+eta[1].momentum());
65      Vector3 e1z = pGamma.p3().unit();
66      Vector3 e1y = e1z.cross(axis).unit();
67      Vector3 e1x = e1y.cross(e1z).unit();
68      LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(pEtaEta.betaVec());
69      Vector3 axis2 = boost2.transform(boost1.transform(eta[0].momentum())).p3().unit();
70      _h[2]->fill(e1z.dot(axis2));
71      _h[3]->fill(atan2(e1y.dot(axis2),e1x.dot(axis2)));
72    }
73
74
75    /// Normalise histograms etc., after the run
76    void finalize() {
77      for(unsigned int ix=0;ix<4;++ix)
78	normalize(_h[ix],1.,false);
79    }
80
81    /// @}
82
83
84    /// @name Histograms
85    /// @{
86    Histo1DPtr _h[4];
87    /// @}
88
89
90  };
91
92
93  RIVET_DECLARE_PLUGIN(BESIII_2013_I1209121);
94
95}