Rivet analyses referenceBABAR_2007_I748372Measurement of angular distributions in $B\to K^* + J/\psi, \psi(2S)$ and $\chi_{c1}$ decaysExperiment: BABAR (PEP-II) Inspire ID: 748372 Status: VALIDATED NOHEPDATA Authors:
Beam energies: ANY Run details:
Measurement of the $K^*$ helicity angle and transversality angles in the charmonium decay for $B\to K^* + J/\psi, \psi(2S)$ and $\chi_{c1}$ decays. The data were read from Figure 2 in the paper which are corrected for efficiency/acceptance. Source code: BABAR_2007_I748372.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/UnstableParticles.hh"
4
5namespace Rivet {
6
7
8 /// @brief B -> K* J/psi, psi(2S) and chi_c1
9 class BABAR_2007_I748372 : public Analysis {
10 public:
11
12 /// Constructor
13 RIVET_DEFAULT_ANALYSIS_CTOR(BABAR_2007_I748372);
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 UnstableParticles ufs = UnstableParticles(Cuts::abspid==511 or
23 Cuts::abspid==521);
24 declare(ufs, "UFS");
25 // histograms
26 for(unsigned int ix=0;ix<3;++ix)
27 for(unsigned int iy=0;iy<3;++iy)
28 for(unsigned int iz=0;iz<3;++iz)
29 book(_h[ix][iy][iz],1+ix,1+iy,1+iz);
30 }
31
32 bool isOnium(int pid) const {
33 return pid==443 || pid==100443 || pid==20443;
34 }
35
36 bool isKstar(int pid) const {
37 return pid==313 || pid==323;
38 }
39
40 bool isK(int pid) const {
41 return pid==130 || pid==310 || pid==311 || pid==321;
42 }
43
44 bool isPi(int pid) const {
45 return pid==211 || pid==111;
46 }
47
48 /// Perform the per-event analysis
49 void analyze(const Event& event) {
50 UnstableParticles ufs = apply<UnstableParticles>(event, "UFS");
51 for(const Particle & B : ufs.particles()) {
52 if(B.children().size()!=2) continue;
53 Particle onium,Kstar;
54 if(isOnium(B.children()[0].abspid()) &&
55 isKstar(B.children()[1].abspid())) {
56 onium = B.children()[0];
57 Kstar = B.children()[1];
58 }
59 else if(isOnium(B.children()[1].abspid()) &&
60 isKstar(B.children()[0].abspid())) {
61 onium = B.children()[1];
62 Kstar = B.children()[0];
63 }
64 else
65 continue;
66 if(onium.children().size()!=2) continue;
67 // find Kstar decay products
68 Particle K;
69 if(isK (Kstar.children()[0].abspid()) &&
70 isPi(Kstar.children()[1].abspid())) {
71 K = Kstar.children()[0];
72 }
73 else if(isK (Kstar.children()[1].abspid()) &&
74 isPi(Kstar.children()[0].abspid())) {
75 K = Kstar.children()[1];
76 }
77 else
78 continue;
79 int iK=-1;
80 if(B.abspid()==511) {
81 if(K.abspid()==321) iK=0;
82 else continue;
83 }
84 else {
85 if(K.abspid()==321) iK=2;
86 else iK=1;
87 }
88 // find onium decay products
89 Particle oDec;
90 if(onium.pid()==20443) {
91 if(onium.children()[0].pid()==443 &&
92 onium.children()[1].pid()==22) {
93 oDec = onium.children()[0];
94 }
95 else if(onium.children()[1].pid()==443 &&
96 onium.children()[0].pid()==22) {
97 oDec = onium.children()[1];
98 }
99 else
100 continue;
101 }
102 else {
103 if(onium.children()[0].pid()==-13 &&
104 onium.children()[1].pid()== 13) {
105 oDec = onium.children()[1];
106 }
107 else if(onium.children()[1].pid()==-13 &&
108 onium.children()[0].pid()== 13) {
109 oDec = onium.children()[0];
110 }
111 else if(onium.children()[0].pid()==-11 &&
112 onium.children()[1].pid()== 11) {
113 oDec = onium.children()[1];
114 }
115 else if(onium.children()[1].pid()==-11 &&
116 onium.children()[0].pid()== 11) {
117 oDec = onium.children()[0];
118 }
119 else
120 continue;
121 }
122 // boost to B rest frame
123 LorentzTransform boost = LorentzTransform::mkFrameTransformFromBeta(B.momentum().betaVec());
124 FourMomentum pOnium = boost.transform(onium.momentum());
125 FourMomentum pKstar = boost.transform(Kstar.momentum());
126 FourMomentum pK = boost.transform(K .momentum());
127 FourMomentum pOdec = boost.transform(oDec .momentum());
128 // axes
129 Vector3 axisX = pOnium.p3().unit();
130 Vector3 axisY = (pK.p3()-axisX.dot(pK.p3())*axisX).unit();
131 Vector3 axisZ = axisX.cross(axisY).unit();
132 // kaon helicity angle
133 LorentzTransform boostK = LorentzTransform::mkFrameTransformFromBeta(pKstar.betaVec());
134 double cosK = -axisX.dot(boostK.transform(pK).p3().unit());
135 // transversality angles
136 LorentzTransform boostL = LorentzTransform::mkFrameTransformFromBeta(pOnium.betaVec());
137 Vector3 axisL = boostL.transform(pOdec).p3().unit();
138 double cosL = axisL.dot(axisZ);
139 double phiL = atan2(axisL.dot(axisY),axisL.dot(axisX));
140 if(phiL<0.) phiL +=2.*M_PI;
141 // fill hists
142 int iloc = onium.pid()==443 ? 0 : (onium.pid()==100443 ? 1 : 2);
143 _h[0][iloc][iK]->fill(cosK);
144 _h[1][iloc][iK]->fill(cosL);
145 _h[2][iloc][iK]->fill(phiL);
146 }
147 }
148
149
150 /// Normalise histograms etc., after the run
151 void finalize() {
152 for(unsigned int ix=0;ix<3;++ix)
153 for(unsigned int iy=0;iy<3;++iy)
154 for(unsigned int iz=0;iz<3;++iz)
155 normalize(_h[ix][iy][iz],1.,false);
156 }
157
158 /// @}
159
160
161 /// @name Histograms
162 /// @{
163 Histo1DPtr _h[3][3][3];
164 /// @}
165
166
167 };
168
169
170 RIVET_DECLARE_PLUGIN(BABAR_2007_I748372);
171
172}
|