Rivet analyses referenceBABAR_2016_I1391152Measurement of angular asymmetries in the decays $B\to K^*\ell^+\ell^-$Experiment: BABAR (PEP-II) Inspire ID: 1391152 Status: VALIDATED Authors:
Beam energies: ANY Run details:
Measurement of angular asymmetries in the decays $B\to K^*\ell^+\ell^-$ Source code: BABAR_2016_I1391152.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 B -> K* l+l-
10 class BABAR_2016_I1391152 : public Analysis {
11 public:
12
13 /// Constructor
14 RIVET_DEFAULT_ANALYSIS_CTOR(BABAR_2016_I1391152);
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 || Cuts::abspid==521);
24 declare(ufs, "UFS");
25 DecayedParticles BB(ufs);
26 BB.addStable( 443);
27 BB.addStable(100443);
28 BB.addStable( 313);
29 BB.addStable( 323);
30 BB.addStable(-313);
31 BB.addStable(-323);
32 declare(BB, "BB");
33 // book histograms
34 for (unsigned int ix=0; ix<2; ++ix) {
35 for (unsigned int iy=0;iy<3;++iy) {
36 book(_p_FL[ix][iy], 1, 1+ix, 1+iy);
37 book(_p_FB[ix][iy], 2, 1+ix, 1+iy);
38 book(_p_P2_num[ix][iy],"TMP/P2_num_"+toString(ix+1)+"_"+toString(iy+1),refData(3,1+ix,1+iy));
39 book(_p_P2_den[ix][iy],"TMP/P2_den_"+toString(ix+1)+"_"+toString(iy+1),refData(3,1+ix,1+iy));
40 }
41 }
42 }
43
44
45 /// Perform the per-event analysis
46 void analyze(const Event& event) {
47 static const map<PdgId,unsigned int> & mode1 = { { 323,1},{ 13,1}, {-13,1}};
48 static const map<PdgId,unsigned int> & mode1CC = { {-323,1},{ 13,1}, {-13,1}};
49 static const map<PdgId,unsigned int> & mode2 = { { 313,1},{ 13,1}, {-13,1}};
50 static const map<PdgId,unsigned int> & mode2CC = { {-313,1},{ 13,1}, {-13,1}};
51 static const map<PdgId,unsigned int> & mode3 = { { 323,1},{ 11,1}, {-11,1}};
52 static const map<PdgId,unsigned int> & mode3CC = { {-323,1},{ 11,1}, {-11,1}};
53 static const map<PdgId,unsigned int> & mode4 = { { 313,1},{ 11,1}, {-11,1}};
54 static const map<PdgId,unsigned int> & mode4CC = { {-313,1},{ 11,1}, {-11,1}};
55 DecayedParticles BB = apply<DecayedParticles>(event, "BB");
56 // loop over particles
57 for (unsigned int ix=0; ix < BB.decaying().size(); ++ix) {
58 int imode=0;
59 if ((BB.decaying()[ix].pid()>0 && BB.modeMatches(ix,3,mode1)) ||
60 (BB.decaying()[ix].pid()<0 && BB.modeMatches(ix,3,mode1CC))) imode=0;
61 else if ((BB.decaying()[ix].pid()>0 && BB.modeMatches(ix,3,mode2)) ||
62 (BB.decaying()[ix].pid()<0 && BB.modeMatches(ix,3,mode2CC))) imode=1;
63 else if ((BB.decaying()[ix].pid()>0 && BB.modeMatches(ix,3,mode3)) ||
64 (BB.decaying()[ix].pid()<0 && BB.modeMatches(ix,3,mode3CC))) imode=2;
65 else if ((BB.decaying()[ix].pid()>0 && BB.modeMatches(ix,3,mode4)) ||
66 (BB.decaying()[ix].pid()<0 && BB.modeMatches(ix,3,mode4CC))) imode=3;
67 else continue;
68 int il = imode<2 ? 13 : 11;
69 int sign = BB.decaying()[ix].pid()>0 ? 1 : -1;
70 const Particle & lp = BB.decayProducts()[ix].at(-sign*il)[0];
71 const Particle & lm = BB.decayProducts()[ix].at( sign*il)[0];
72 double qq = (lp.momentum()+lm.momentum()).mass2();
73 int iK = BB.decaying()[ix].abspid()==521 ? 323 : 313;
74 iK *= BB.decaying()[ix].pid()/BB.decaying()[ix].abspid();
75 const Particle & Kstar = BB.decayProducts()[ix].at( iK)[0];
76 if (Kstar.children().size()!=2) continue;
77 Particle KK;
78 if (Kstar.abspid()==313) {
79 if (Kstar.children()[0].abspid()==321 &&
80 Kstar.children()[1].abspid()==211)
81 KK = Kstar.children()[0];
82 else if (Kstar.children()[1].abspid()==321 &&
83 Kstar.children()[0].abspid()==211)
84 KK = Kstar.children()[1];
85 else continue;
86 }
87 else {
88 if (Kstar.children()[0].abspid()==311 &&
89 Kstar.children()[1].abspid()==211)
90 KK = Kstar.children()[0];
91 else if (Kstar.children()[1].abspid()==311 &&
92 Kstar.children()[0].abspid()==211)
93 KK = Kstar.children()[1];
94 else if (Kstar.children()[0].abspid()==310 &&
95 Kstar.children()[1].abspid()==211)
96 KK = Kstar.children()[0];
97 else if (Kstar.children()[1].abspid()==310 &&
98 Kstar.children()[0].abspid()==211)
99 KK = Kstar.children()[1];
100 else if (Kstar.children()[0].abspid()==321 &&
101 Kstar.children()[1].abspid()==111 && il==11)
102 KK = Kstar.children()[0];
103 else if(Kstar.children()[1].abspid()==321 &&
104 Kstar.children()[0].abspid()==111 && il==11)
105 KK = Kstar.children()[1];
106 else continue;
107 if(KK.abspid()==311) {
108 if(KK.children().size()==1 && KK.children()[0].pid()==310)
109 KK = KK.children()[0];
110 else
111 continue;
112 }
113 }
114 // first boost to bottom frame
115 const LorentzTransform boost = LorentzTransform::mkFrameTransformFromBeta(BB.decaying()[ix].momentum().betaVec());
116 FourMomentum plp = boost.transform(lp .momentum());
117 FourMomentum plm = boost.transform(lm .momentum());
118 FourMomentum pKstar = boost.transform(Kstar.momentum());
119 FourMomentum pK = boost.transform(KK .momentum());
120 FourMomentum pB = boost.transform(BB.decaying()[ix].momentum());
121 // lepton stuff
122 const LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta((plp+plm).betaVec());
123 plp = boost2.transform(plp);
124 double cTheta = plp.p3().unit().dot(boost .transform(pB ).p3().unit());
125 double AFB = cTheta>0 ? 1 : -1;
126 // kaon stuff
127 const LorentzTransform boost3 = LorentzTransform::mkFrameTransformFromBeta(pKstar.betaVec());
128 pK = boost3.transform(pK);
129 cTheta = pK.p3().unit().dot(boost .transform(pB ).p3().unit());
130 double FL = .5*(5.*sqr(cTheta)-1.);
131 // fill histograms
132 for (unsigned int iz=0;iz<2;++iz) {
133 for (unsigned int iy=0;iy<3;++iy) {
134 if ( (BB.decaying()[ix].abspid()==511&&iy==0) ||
135 (BB.decaying()[ix].abspid()==521&&iy==1) ) continue;
136 _p_FB [iz][iy]->fill(qq, AFB);
137 _p_FL [iz][iy]->fill(qq, FL);
138 _p_P2_num[iz][iy]->fill(qq, -2./3.*AFB);
139 _p_P2_den[iz][iy]->fill(qq, 1.-FL);
140 }
141 }
142 }
143 }
144
145
146 /// Normalise histograms etc., after the run
147 void finalize() {
148 for (unsigned int ix=0;ix<2;++ix) {
149 for (unsigned int iy=0;iy<3;++iy) {
150 Estimate1DPtr tmp;
151 book(tmp, 3, 1+ix, 1+iy);
152 divide(_p_P2_num[ix][iy], _p_P2_den[ix][iy], tmp);
153 }
154 }
155 }
156
157 /// @}
158
159
160 /// @name Histograms
161 /// @{
162 Profile1DPtr _p_FL[2][3],_p_FB[2][3],_p_P2_num[2][3],_p_P2_den[2][3];
163 /// @}
164
165
166 };
167
168
169 RIVET_DECLARE_PLUGIN(BABAR_2016_I1391152);
170
171}
|