Rivet analyses referenceBELLE_2013_I1247059$B^0\to\phi K^*$ decaysExperiment: BELLE (KEKB) Inspire ID: 1247059 Status: VALIDATED NOHEPDATA Authors:
Beam energies: ANY Run details:
Measurment of mass and angular distributions in $B^0\to\phi K^*$ decays. The data were read from the figures in the paper and may not be corrected. Source code: BELLE_2013_I1247059.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/UnstableParticles.hh"
4#include "Rivet/Projections/DecayedParticles.hh"
5
6namespace Rivet {
7
8
9 /// @brief B0 -> phi K*
10 class BELLE_2013_I1247059 : public Analysis {
11 public:
12
13 /// Constructor
14 RIVET_DEFAULT_ANALYSIS_CTOR(BELLE_2013_I1247059);
15
16
17 /// @name Analysis methods
18 /// @{
19
20 /// Book histograms and initialise projections before the run
21 void init() {
22 // Initialise and register projections
23 UnstableParticles ufs = UnstableParticles(Cuts::abspid==511);
24 declare(ufs, "UFS");
25 DecayedParticles B0(ufs);
26 B0.addStable(333);
27 declare(B0, "B0");
28 // histograms
29 for(unsigned int ix=0;ix<4;++ix)
30 book(_h[ix],1,1,1+ix);
31 }
32
33
34 /// Perform the per-event analysis
35 void analyze(const Event& event) {
36 static const map<PdgId,unsigned int> & mode = { { 321,1},{-211,1}, { 333,1}};
37 static const map<PdgId,unsigned int> & modeCC = { {-321,1},{ 211,1}, { 333,1}};
38 DecayedParticles B0 = apply<DecayedParticles>(event, "B0");
39 // loop over particles
40 for(unsigned int ix=0;ix<B0.decaying().size();++ix) {
41 int sign = 1;
42 if (B0.decaying()[ix].pid()>0 && B0.modeMatches(ix,3,mode)) {
43 sign=1;
44 }
45 else if (B0.decaying()[ix].pid()<0 && B0.modeMatches(ix,3,modeCC)) {
46 sign=-1;
47 }
48 else
49 continue;
50 const Particle & Kp = B0.decayProducts()[ix].at( 321*sign)[0];
51 const Particle & pim = B0.decayProducts()[ix].at(-211*sign)[0];
52 const Particle & phi = B0.decayProducts()[ix].at( 333 )[0];
53 if(phi.children().size()!=2 || phi.children()[0].pid()!=-phi.children()[1].pid() ||
54 phi.children()[0].abspid()!=321) continue;
55 Particle Kp1 = phi.children()[0];
56 Particle Km1 = phi.children()[1];
57 if(Kp1.pid()<0) swap(Kp1,Km1);
58 // B0 frame
59 LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(B0.decaying()[ix].momentum().betaVec());
60 FourMomentum pKstar = boost1.transform(Kp.momentum()+pim.momentum());
61 FourMomentum pPhi = boost1.transform(phi.momentum());
62 // stuff in K* frame
63 LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(pKstar.betaVec());
64 FourMomentum pKp = boost2.transform(boost1.transform(Kp.momentum()));
65 Vector3 axis1 = pKstar.p3().unit();
66 double cTheta1 = axis1.dot(pKp.p3().unit());
67 if(cTheta1>0.75) continue;
68 Vector3 trans1 = pKp.p3() - cTheta1*pKp.p3().mod()*axis1;
69 // stuff in phi frame
70 LorentzTransform boost3 = LorentzTransform::mkFrameTransformFromBeta(pPhi.betaVec());
71 FourMomentum pKp1 = boost3.transform(boost1.transform(Kp1.momentum()));
72 Vector3 axis2 = pPhi.p3().unit();
73 double cTheta2 = axis2.dot(pKp1.p3().unit());
74 Vector3 trans2 = pKp1.p3() - cTheta2*pKp1.p3().mod()*axis2;
75 // angle between planes
76 double chi = atan2(trans1.cross(trans2).dot(axis1),trans1.dot(trans2));
77 // fill histos
78 _h[0]->fill(pKstar.mass());
79 _h[1]->fill(cTheta1);
80 _h[2]->fill(cTheta2);
81 _h[3]->fill(chi);
82 }
83 }
84
85
86 /// Normalise histograms etc., after the run
87 void finalize() {
88 for(unsigned int ix=0;ix<4;++ix)
89 normalize(_h[ix],1.,false);
90 }
91
92 /// @}
93
94
95 /// @name Histograms
96 /// @{
97 Histo1DPtr _h[4];
98 /// @}
99
100
101 };
102
103
104 RIVET_DECLARE_PLUGIN(BELLE_2013_I1247059);
105
106}
|