Rivet analyses referenceBELLE_2016_I1454405$J/\psi$ and $\psi(2S)$ spectrum in $\Upsilon(1S)$ decaysExperiment: BELLE (KEKB) Inspire ID: 1454405 Status: VALIDATED NOHEPDATA Authors:
Beam energies: ANY Run details:
Measurement of the scaled momentum of $J/\psi$ and $\psi(2S)$ in $\Upsilon(1S)$ decays Source code: BELLE_2016_I1454405.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/UnstableParticles.hh"
4
5namespace Rivet {
6
7
8 /// @brief J/psi and psi(2S) in Upsilon(1S) decays
9 class BELLE_2016_I1454405 : public Analysis {
10 public:
11
12 /// Constructor
13 RIVET_DEFAULT_ANALYSIS_CTOR(BELLE_2016_I1454405);
14
15
16 /// @name Analysis methods
17 /// @{
18
19 /// Book histograms and initialise projections before the run
20 void init() {
21 // Initialise and register projections
22 declare(UnstableParticles(Cuts::pid==553), "UFS");
23 //histos
24 for(unsigned int ix=0;ix<2;++ix)
25 for(unsigned int iy=0;iy<2;++iy)
26 book(_h[ix][iy],1,1+ix,1+iy);
27 book(_nUps,"TMP/nUps");
28 }
29
30 /// Recursively walk the decay tree to find decay products of @a p
31 void findDecayProducts(Particle mother, Particles& unstable) {
32 for(const Particle & p: mother.children()) {
33 const int id = abs(p.pid());
34 if(id == 443 || id==100443) {
35 unstable.push_back(p);
36 }
37 if(!p.children().empty())
38 findDecayProducts(p, unstable);
39 }
40 }
41
42 /// Perform the per-event analysis
43 void analyze(const Event& event) {
44 // Find the Upsilons among the unstables
45 for(const Particle & ups : apply<UnstableParticles>(event, "UFS").particles()) {
46 _nUps->fill();
47 // boost to rest frame
48 LorentzTransform boost;
49 if (ups.p3().mod() > 1*MeV)
50 boost = LorentzTransform::mkFrameTransformFromBeta(ups.momentum().betaVec());
51 // find psi/psi(2S)
52 Particles unstable;
53 findDecayProducts(ups,unstable);
54 // loop over psi/psi(2S)
55 for(const Particle& psi : unstable) {
56 double Pmax = 0.5*(sqr(ups.mass())-sqr(psi.mass()))/ups.mass();
57 const FourMomentum p2 = boost.transform(psi.momentum());
58 const double xP = p2.p3().mod()/Pmax;
59 if(psi.pid()==443) {
60 _h[0][0]->fill(xP);
61 _h[1][0]->fill(xP);
62 }
63 else {
64 _h[0][1]->fill(xP);
65 _h[1][1]->fill(xP);
66 }
67 }
68 }
69 }
70
71
72 /// Normalise histograms etc., after the run
73 void finalize() {
74 for(unsigned int ix=0;ix<2;++ix)
75 for(unsigned int iy=0;iy<2;++iy)
76 scale(_h[ix][iy],1e4/ *_nUps);
77 }
78
79 /// @}
80
81
82 /// @name Histograms
83 /// @{
84 Histo1DPtr _h[2][2];
85 CounterPtr _nUps;
86 /// @}
87
88
89 };
90
91
92 RIVET_DECLARE_PLUGIN(BELLE_2016_I1454405);
93
94}
|