Rivet analyses referenceBELLE_2009_I825222$B\to X_s\gamma$ with different photon energy cutsExperiment: BELLE (KEKB) Inspire ID: 825222 Status: VALIDATED NOHEPDATA SINGLEWEIGHT Authors:
Beam energies: ANY Run details:
Measurement of the branching ratios, average photon energies and photon energy dispersion for $B\to X_s\gamma$ with different photon energy cuts. Source code: BELLE_2009_I825222.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/UnstableParticles.hh"
4
5namespace Rivet {
6
7
8 /// @brief B -> Xs gamma
9 class BELLE_2009_I825222 : public Analysis {
10 public:
11
12 /// Constructor
13 RIVET_DEFAULT_ANALYSIS_CTOR(BELLE_2009_I825222);
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::abspid==521 || Cuts::abspid==511), "UFS");
23 // Book histograms
24 book(_h_br, 1, 1, 1);
25 book(_p_E, 1, 1, 2);
26 book(_p_E2,"TMP/E2",refData<YODA::BinnedEstimate<string>>(1,1,3));
27 book(_nBottom, "TMP/BottomCounter");
28 }
29
30 void findDecayProducts(const Particle& mother,
31 unsigned int& nK0, unsigned int& nKp,
32 unsigned int& nKm) {
33 for (const Particle & p : mother.children()) {
34 int id = p.pid();
35 if ( id == PID::KPLUS ) ++nKp;
36 else if (id == PID::KMINUS ) ++nKm;
37 else if (id == PID::K0S) ++nK0;
38 else if (id == PID::PI0 || id == PID::PIPLUS || id == PID::PIMINUS) {
39 continue;
40 }
41 else if ( !p.children().empty() ) {
42 findDecayProducts(p, nK0, nKp, nKm);
43 }
44 }
45 }
46
47 /// Perform the per-event analysis
48 void analyze(const Event& event) {
49 if(_edges.empty()) {
50 _edges = _h_br->xEdges();
51 for(const string & en : _edges)
52 _eCut.push_back(std::stod(en)*GeV);
53 }
54 // Loop over bottoms
55 for (const Particle& bottom : apply<UnstableParticles>(event, "UFS").particles()) {
56 // remove mixing entries etc
57 if(bottom.children()[0].abspid()==bottom.abspid()) continue;
58 _nBottom->fill();
59 FourMomentum pgamma(0.,0.,0.,0.);
60 unsigned int ngamma = 0;
61 for (const Particle & child : bottom.children()) {
62 if (child.pid() == PID::PHOTON) {
63 ngamma += 1;
64 pgamma += child.momentum();
65 }
66 }
67 if (ngamma != 1) continue;
68 unsigned int nK0(0),nKp(0),nKm(0);
69 FourMomentum p_tot(0,0,0,0);
70 findDecayProducts(bottom, nK0, nKp, nKm);
71 unsigned int nk = nKp-nKm+nK0;
72 if (nk % 2 == 1) {
73 const LorentzTransform boost = LorentzTransform::mkFrameTransformFromBeta(bottom.momentum().betaVec());
74 double eGamma = boost.transform(pgamma).E();
75 for(unsigned int ix=0;ix<_eCut.size();++ix) {
76 if(eGamma>_eCut[ix]) {
77 _h_br->fill(_edges[ix]);
78 _p_E ->fill(_edges[ix],eGamma);
79 _p_E2->fill(_edges[ix],sqr(eGamma));
80 }
81 }
82 }
83 }
84 }
85
86
87 /// Normalise histograms etc., after the run
88 void finalize() {
89 // 1e4 for br ormalization
90 scale(_h_br, 1e4/_nBottom->sumW());
91 // dispersion
92 BinnedEstimatePtr<string> dispersion;
93 book(dispersion,1,1,3);
94 for (auto& b : dispersion->bins()) {
95 const auto& bE = _p_E->bin(b.index());
96 const auto& bE2 = _p_E2->bin(b.index());
97 const double val = bE2.mean(2)-sqr(bE.mean(2));
98 const double err = val*sqrt(sqr(bE2.stdErr(2)/bE2.mean(2))+4.*sqr(bE.stdErr(2)/bE.mean(2)));
99 b.set(val,err);
100 }
101 }
102
103 /// @}
104
105
106 /// @name Histograms
107 /// @{
108 BinnedHistoPtr<string> _h_br;
109 BinnedProfilePtr<string> _p_E,_p_E2;
110 CounterPtr _nBottom;
111 vector<string> _edges;
112 vector<double> _eCut;
113 /// @}
114
115
116 };
117
118
119 RIVET_DECLARE_PLUGIN(BELLE_2009_I825222);
120
121}
|