Rivet analyses referenceBELLE_2004_I623102Mass and angular distributions in $B^-\to D^{(*)+}\pi^-\pi^-$Experiment: BELLE (KEKB) Inspire ID: 623102 Status: VALIDATED NOHEPDATA Authors:
Beam energies: ANY Run details:
Mass and angular distributions in $B^-\to D^{(*)+}\pi^-\pi^-$. The data were read from the figures in the paper and the backgrounds given subtracted. Source code: BELLE_2004_I623102.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 -> D** pi
10 class BELLE_2004_I623102 : public Analysis {
11 public:
12
13 /// Constructor
14 RIVET_DEFAULT_ANALYSIS_CTOR(BELLE_2004_I623102);
15
16
17 /// @name Analysis methods
18 /// @{
19
20 /// Book histograms and initialise projections before the run
21 void init() {
22 // projections
23 UnstableParticles ufs = UnstableParticles(Cuts::abspid==521);
24 declare(ufs, "UFS");
25 DecayedParticles BP(ufs);
26 BP.addStable( 411);
27 BP.addStable(-411);
28 BP.addStable( 413);
29 BP.addStable(-413);
30 declare(BP, "BP");
31 // histograms
32 book(_h_mass[0],1,1,1);
33 book(_h_mass[1],4,1,1);
34 book(_b_mass,{-1.,-0.67,-0.33,0,0.33,0.67,1.});
35 for (unsigned int ix=0; ix<6; ++ix) {
36 book(_b_mass->bin(ix+1), 2, 1, 1+ix);
37 }
38 for (unsigned int iy=0; iy<4; ++iy) {
39 if (iy==0) book(_b_angle[0 ], {0.,5.,5.9,6.2,400});
40 else book(_b_angle[iy], {0.,5.76,5.98,6.15,400});
41 for (unsigned int ix=0; ix<4; ++ix) {
42 if (iy==0) book(_b_angle[0 ]->bin(ix+1),3, 1,1+ix);
43 else book(_b_angle[iy]->bin(ix+1),5,iy,1+ix);
44 }
45 }
46 }
47
48
49 /// Perform the per-event analysis
50 void analyze(const Event& event) {
51 DecayedParticles BP = apply<DecayedParticles>(event, "BP");
52 for (unsigned int ix=0; ix<BP.decaying().size(); ++ix) {
53 int sign = BP.decaying()[ix].pid()/BP.decaying()[ix].abspid();
54 int imode=0;
55 if (sign>0 && BP.modeMatches(ix,3,mode1)) imode=0;
56 else if (sign<0 && BP.modeMatches(ix,3,mode1CC)) imode=0;
57 else if (sign>0 && BP.modeMatches(ix,3,mode2)) imode=1;
58 else if (sign<0 && BP.modeMatches(ix,3,mode2CC)) imode=1;
59 else continue;
60 const Particles& pip = BP.decayProducts()[ix].at( sign*211);
61 const Particle & Dm = BP.decayProducts()[ix].at(-sign*(411+imode*2))[0];
62 // find the mnimum Dpi mass
63 double mDpi[2] = {(Dm.mom()+pip[0].mom()).mass(),
64 (Dm.mom()+pip[1].mom()).mass()};
65 unsigned int iloc=0;
66 if (mDpi[0]>mDpi[1]) {
67 iloc=1;
68 swap(mDpi[0],mDpi[1]);
69 }
70 _h_mass[imode]->fill(mDpi[0]);
71 // compute the helicity angles
72 LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(BP.decaying()[ix].mom().betaVec());
73 // D pi mass and angle
74 FourMomentum pDpi = Dm.mom()+pip[iloc].mom();
75 pDpi = boost1.transform(pDpi);
76 LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(pDpi.betaVec());
77 FourMomentum pPi = boost1.transform(pip[iloc].mom());
78 FourMomentum pPi3 = boost2.transform(pPi);
79 double cDpi = -pPi3.p3().unit().dot(pDpi.p3().unit());
80 // fill histos
81 if (imode==0) {
82 _b_mass->fill(cDpi,mDpi[0]);
83 _b_angle[0]->fill(sqr(mDpi[0]),cDpi);
84 }
85 else {
86 _b_angle[1]->fill(sqr(mDpi[0]),cDpi);
87 // find the pion from the D* decay
88 Particle pi2;
89 if (Dm.children().size()!=2) continue;
90 if ((Dm.children()[0].pid()==-sign*411 ||
91 Dm.children()[0].pid()==-sign*411) &&
92 (Dm.children()[1].pid()==-sign*211 ||
93 Dm.children()[1].pid()== 111)) {
94 pi2 = Dm.children()[1];
95 }
96 else if ((Dm.children()[1].pid()==-sign*411 ||
97 Dm.children()[1].pid()==-sign*411) &&
98 (Dm.children()[0].pid()==-sign*211 ||
99 Dm.children()[0].pid()== 111)) {
100 pi2 = Dm.children()[0];
101 }
102 else {
103 continue;
104 }
105 FourMomentum pPi2 = boost1.transform(pi2.mom());
106 FourMomentum pDm = boost1.transform( Dm.mom());
107 Vector3 axis = pDm.p3().unit();
108 Vector3 trans1 = pPi .p3() - pPi .p3().dot(axis)*axis;
109 Vector3 trans2 = pPi2.p3() - pPi2.p3().dot(axis)*axis;
110 const double chi = atan2(trans1.cross(trans2).dot(axis),trans1.dot(trans2));
111 _b_angle[3]->fill(sqr(mDpi[0]),chi);
112 pDm = boost2.transform(pDm );
113 pPi2 = boost2.transform(pPi2);
114 LorentzTransform boost3 = LorentzTransform::mkFrameTransformFromBeta(pDm.betaVec());
115 pPi2 = boost3.transform(pPi2);
116 const double cTheta = pPi2.p3().unit().dot(pPi3.p3().unit());
117 _b_angle[2]->fill(sqr(mDpi[0]),cTheta);
118 }
119 }
120 }
121
122
123 /// Normalise histograms etc., after the run
124 void finalize() {
125 normalize(_h_mass, 1.0, false);
126 normalize(_b_mass, 1.0, false);
127 normalize(_b_angle, 1.0, false);
128 }
129
130 /// @}
131
132
133 /// @name Histograms
134 /// @{
135 Histo1DPtr _h_mass[2];
136 Histo1DGroupPtr _b_mass, _b_angle[4];
137 const map<PdgId,unsigned int> mode1 = { { 211,2}, {-411,1}};
138 const map<PdgId,unsigned int> mode1CC = { {-211,2}, { 411,1}};
139 const map<PdgId,unsigned int> mode2 = { { 211,2}, {-413,1}};
140 const map<PdgId,unsigned int> mode2CC = { {-211,2}, { 413,1}};
141 /// @}
142 };
143
144
145 RIVET_DECLARE_PLUGIN(BELLE_2004_I623102);
146
147}
|