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