Rivet analyses referenceBELLE_2008_I756554Mass and angular distributions in B+→D0ˉD0K+Experiment: BELLE (KEKB) Inspire ID: 756554 Status: VALIDATED NOHEPDATA Authors:
Beam energies: ANY Run details:
Measurement of mass and angular distributions in B+→D0ˉD0K+ decays by the BaBar collaboration. The efficiency corrected, background subtracted, data were read from Figures 3 and 4. The PDG code for the Ds(2700) is not defined but we make the assumption it is the vector 2S state with PDG code 100433, although this can b e changed using the PID option. Source code: BELLE_2008_I756554.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+ -> D0 Dbar0 K+
10 class BELLE_2008_I756554 : public Analysis {
11 public:
12
13 /// Constructor
14 RIVET_DEFAULT_ANALYSIS_CTOR(BELLE_2008_I756554);
15
16
17 /// @name Analysis methods
18 /// @{
19
20 /// Book histograms and initialise projections before the run
21 void init() {
22 // set the PDG code
23 _pid = getOption<int>("PID", 100433);
24 // Initialise and register projections
25 UnstableParticles ufs = UnstableParticles(Cuts::abspid==521);
26 declare(ufs, "UFS");
27 DecayedParticles BP(ufs);
28 BP.addStable( 421);
29 BP.addStable(-421);
30 declare(BP, "BP");
31 // histos
32 for (unsigned int ix=0;ix<3;++ix) {
33 book(_h_mass[ix],1,1,1+ix);
34 }
35 book(_h_angle,2,1,1);
36 book(_c,"TMP/c");
37 }
38
39
40 /// Perform the per-event analysis
41 void analyze(const Event& event) {
42 DecayedParticles BP = apply<DecayedParticles>(event, "BP");
43 // loop over particles
44 for (unsigned int ix=0; ix<BP.decaying().size(); ++ix) {
45 int sign=1;
46 if (BP.modeMatches(ix,3,mode )) sign= 1;
47 else if (BP.modeMatches(ix,3,modeCC)) sign=-1;
48 else continue;
49 const Particle & Kp = BP.decayProducts()[ix].at( sign*321)[0];
50 const Particle & D0 = BP.decayProducts()[ix].at( sign*421)[0];
51 const Particle & Dbar0 = BP.decayProducts()[ix].at(-sign*421)[0];
52 _c->fill();
53 FourMomentum pDD = D0.mom()+Dbar0.mom();
54 double mDD = pDD.mass();
55 _h_mass[0]->fill(mDD);
56 FourMomentum pDK = D0.mom()+Kp.mom();
57 if(mDD>3.85) _h_mass[2]->fill(pDK.mass());
58 LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(BP.decaying()[ix].mom().betaVec());
59 pDD = boost1.transform(pDD);
60 // boost to DD frame
61 LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(pDD.betaVec());
62 FourMomentum pD = boost2.transform(boost1.transform(D0.mom()));
63 // helicity angle
64 double cTheta = pDD.p3().unit().dot(pD.p3().unit());
65 if (cTheta>0) _h_mass[1]->fill(mDD);
66 // check for intermediate DS
67 bool Ds2700 = false;
68 for(const Particle & child : BP.decaying()[ix].children()) {
69 Ds2700 |= child.abspid()==_pid;
70 }
71 if (!Ds2700) continue;
72 pDK = boost1.transform(pDK);
73 LorentzTransform boost3 = LorentzTransform::mkFrameTransformFromBeta(pDK.betaVec());
74 FourMomentum pK = boost3.transform(boost1.transform(Kp.mom()));
75 cTheta = pDK.p3().unit().dot(pK.p3().unit());
76 _h_angle->fill(cTheta);
77 }
78 }
79
80
81 /// Normalise histograms etc., after the run
82 void finalize() {
83 scale(_h_mass, 1.0/ *_c);
84 normalize(_h_angle);
85 }
86
87 /// @}
88
89
90 /// @name Histograms
91 /// @{
92 Histo1DPtr _h_mass[3],_h_angle;
93 CounterPtr _c;
94 int _pid;
95 const map<PdgId,unsigned int> mode = { { 421,1}, {-421,1}, { 321,1}};
96 const map<PdgId,unsigned int> modeCC = { { 421,1}, {-421,1}, {-321,1}};
97 /// @}
98
99
100 };
101
102
103 RIVET_DECLARE_PLUGIN(BELLE_2008_I756554);
104
105}
|