evtgen is hosted by Hepforge, IPPP Durham
EvtGen  2.0.0
Monte Carlo generator of particle decays, in particular the weak decays of heavy flavour particles such as B mesons.
EvtD0gammaDalitz.cpp
Go to the documentation of this file.
1 
2 /***********************************************************************
3 * Copyright 1998-2020 CERN for the benefit of the EvtGen authors *
4 * *
5 * This file is part of EvtGen. *
6 * *
7 * EvtGen is free software: you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation, either version 3 of the License, or *
10 * (at your option) any later version. *
11 * *
12 * EvtGen is distributed in the hope that it will be useful, *
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15 * GNU General Public License for more details. *
16 * *
17 * You should have received a copy of the GNU General Public License *
18 * along with EvtGen. If not, see <https://www.gnu.org/licenses/>. *
19 ***********************************************************************/
20 
22 
23 #include "EvtGenBase/EvtConst.hh"
25 #include "EvtGenBase/EvtFlatte.hh"
26 #include "EvtGenBase/EvtGenKine.hh"
27 #include "EvtGenBase/EvtPDL.hh"
29 #include "EvtGenBase/EvtPatches.hh"
30 #include "EvtGenBase/EvtReport.hh"
33 
34 #include <cmath>
35 #include <cstdlib>
36 #include <string>
37 
38 // Initialize the static variables.
42 
47 
52 
56 
58 {
59  return "D0GAMMADALITZ";
60 }
61 
63 {
64  return new EvtD0gammaDalitz;
65 }
66 
68 {
69  // check that there are 0 arguments
70  checkNArg( 0 );
71 
72  // Check that this model is valid for the specified decay.
73  checkNDaug( 3 );
78 
79  // Get the values of the EvtId objects from the data files.
80  readPDGValues();
81 
82  // Get the EvtId of the D0 and its 3 daughters.
83  getParentId();
84 
85  EvtId dau[3];
86  for ( int index = 0; index < 3; index++ ) {
87  dau[index] = getDaug( index );
88  }
89 
90  // Look for K0bar h+ h-. The order will be K[0SL] h+ h-
91  for ( int index = 0; index < 3; index++ ) {
92  if ( ( dau[index] == _K0B ) || ( dau[index] == _KS ) ||
93  ( dau[index] == _KL ) ) {
94  _d1 = index;
95  } else if ( ( dau[index] == _PIP ) || ( dau[index] == _KP ) ) {
96  _d2 = index;
97  } else if ( ( dau[index] == _PIM ) || ( dau[index] == _KM ) ) {
98  _d3 = index;
99  } else {
101  }
102  }
103 
104  // Check if we're dealing with Ks pi pi or with Ks K K.
105  _isKsPiPi = false;
106  if ( dau[_d2] == _PIP || dau[_d2] == _PIM ) {
107  _isKsPiPi = true;
108  }
109 }
110 
112 {
113  setProbMax( 5200. );
114 }
115 
117 {
118  // Check if the D is from a B+- -> D0 K+- decay with the appropriate model.
119  EvtParticle* parent =
120  part->getParent(); // If there are no mistakes, should be B+ or B-.
121  if ( parent != 0 &&
122  EvtDecayTable::getInstance()->getDecayFunc( parent )->getName() ==
123  "BTODDALITZCPK" ) {
124  EvtId parId = parent->getId();
125  if ( ( parId == _BP ) || ( parId == _BM ) || ( parId == _B0 ) ||
126  ( parId == _B0B ) ) {
127  _bFlavor = parId;
128  } else {
130  }
131  } else {
133  }
134 
135  // Read the D decay parameters from the B decay model.
136  // Gamma angle in rad.
137  double gamma = EvtDecayTable::getInstance()->getDecayFunc( parent )->getArg(
138  0 );
139  // Strong phase in rad.
140  double delta = EvtDecayTable::getInstance()->getDecayFunc( parent )->getArg(
141  1 );
142  // Ratio between B->D0K and B->D0barK
143  double rB = EvtDecayTable::getInstance()->getDecayFunc( parent )->getArg( 2 );
144 
145  // Same structure for all of these decays.
146  part->initializePhaseSpace( getNDaug(), getDaugs() );
147  EvtVector4R pA = part->getDaug( _d1 )->getP4();
148  EvtVector4R pB = part->getDaug( _d2 )->getP4();
149  EvtVector4R pC = part->getDaug( _d3 )->getP4();
150 
151  // Squared invariant masses.
152  double mSqAB = ( pA + pB ).mass2();
153  double mSqAC = ( pA + pC ).mass2();
154  double mSqBC = ( pB + pC ).mass2();
155 
156  EvtComplex amp( 1.0, 0.0 );
157 
158  // Direct and conjugated amplitudes.
159  EvtComplex ampDir;
160  EvtComplex ampCnj;
161 
162  if ( _isKsPiPi ) {
163  // Direct and conjugated Dalitz points.
164  EvtDalitzPoint pointDir( _mKs, _mPi, _mPi, mSqAB, mSqBC, mSqAC );
165  EvtDalitzPoint pointCnj( _mKs, _mPi, _mPi, mSqAC, mSqBC, mSqAB );
166 
167  // Direct and conjugated amplitudes.
168  ampDir = dalitzKsPiPi( pointDir );
169  ampCnj = dalitzKsPiPi( pointCnj );
170  } else {
171  // Direct and conjugated Dalitz points.
172  EvtDalitzPoint pointDir( _mKs, _mK, _mK, mSqAB, mSqBC, mSqAC );
173  EvtDalitzPoint pointCnj( _mKs, _mK, _mK, mSqAC, mSqBC, mSqAB );
174 
175  // Direct and conjugated amplitudes.
176  ampDir = dalitzKsKK( pointDir );
177  ampCnj = dalitzKsKK( pointCnj );
178  }
179 
180  if ( _bFlavor == _BP || _bFlavor == _B0 ) {
181  amp = ampCnj + rB * exp( EvtComplex( 0., delta + gamma ) ) * ampDir;
182  } else {
183  amp = ampDir + rB * exp( EvtComplex( 0., delta - gamma ) ) * ampCnj;
184  }
185 
186  vertex( amp );
187 
188  return;
189 }
190 
192 {
193  static const EvtDalitzPlot plot( _mKs, _mPi, _mPi, _mD0 );
194 
195  EvtComplex amp = 0.;
196 
197  // This corresponds to relativistic Breit-Wigner distributions. Not K-matrix.
198  // Defining resonances.
199  static EvtDalitzReso KStarm( plot, _BC, _AC, _VECTOR, 0.893606, 0.0463407,
200  _RBW );
201  static EvtDalitzReso KStarp( plot, _BC, _AB, _VECTOR, 0.893606, 0.0463407,
202  _RBW );
203  static EvtDalitzReso rho0( plot, _AC, _BC, _VECTOR, 0.7758, 0.1464, _GS );
204  static EvtDalitzReso omega( plot, _AC, _BC, _VECTOR, 0.78259, 0.00849, _RBW );
205  static EvtDalitzReso f0_980( plot, _AC, _BC, _SCALAR, 0.975, 0.044, _RBW );
206  static EvtDalitzReso f0_1370( plot, _AC, _BC, _SCALAR, 1.434, 0.173, _RBW );
207  static EvtDalitzReso f2_1270( plot, _AC, _BC, _TENSOR, 1.2754, 0.1851, _RBW );
208  static EvtDalitzReso K0Starm_1430( plot, _BC, _AC, _SCALAR, 1.459, 0.175,
209  _RBW );
210  static EvtDalitzReso K0Starp_1430( plot, _BC, _AB, _SCALAR, 1.459, 0.175,
211  _RBW );
212  static EvtDalitzReso K2Starm_1430( plot, _BC, _AC, _TENSOR, 1.4256, 0.0985,
213  _RBW );
214  static EvtDalitzReso K2Starp_1430( plot, _BC, _AB, _TENSOR, 1.4256, 0.0985,
215  _RBW );
216  static EvtDalitzReso sigma( plot, _AC, _BC, _SCALAR, 0.527699, 0.511861,
217  _RBW );
218  static EvtDalitzReso sigma2( plot, _AC, _BC, _SCALAR, 1.03327, 0.0987890,
219  _RBW );
220  static EvtDalitzReso KStarm_1680( plot, _BC, _AC, _VECTOR, 1.677, 0.205,
221  _RBW );
222 
223  // Adding terms to the amplitude with their corresponding amplitude and phase terms.
224  amp += EvtComplex( .848984, .893618 );
225  amp += EvtComplex( -1.16356, 1.19933 ) * KStarm.evaluate( point );
226  amp += EvtComplex( .106051, -.118513 ) * KStarp.evaluate( point );
227  amp += EvtComplex( 1.0, 0.0 ) * rho0.evaluate( point );
228  amp += EvtComplex( -.0249569, .0388072 ) * omega.evaluate( point );
229  amp += EvtComplex( -.423586, -.236099 ) * f0_980.evaluate( point );
230  amp += EvtComplex( -2.16486, 3.62385 ) * f0_1370.evaluate( point );
231  amp += EvtComplex( .217748, -.133327 ) * f2_1270.evaluate( point );
232  amp += EvtComplex( 1.62128, 1.06816 ) * K0Starm_1430.evaluate( point );
233  amp += EvtComplex( .148802, .0897144 ) * K0Starp_1430.evaluate( point );
234  amp += EvtComplex( 1.15489, -.773363 ) * K2Starm_1430.evaluate( point );
235  amp += EvtComplex( .140865, -.165378 ) * K2Starp_1430.evaluate( point );
236  amp += EvtComplex( -1.55556, -.931685 ) * sigma.evaluate( point );
237  amp += EvtComplex( -.273791, -.0535596 ) * sigma2.evaluate( point );
238  amp += EvtComplex( -1.69720, .128038 ) * KStarm_1680.evaluate( point );
239 
240  return amp;
241 }
242 
244 {
245  static const EvtDalitzPlot plot( _mKs, _mK, _mK, _mD0 );
246 
247  // Defining resonances.
248  static EvtDalitzReso a00_980( plot, _AC, _BC, _SCALAR, 0.999, _RBW, .550173,
249  .324, _EtaPic );
250  static EvtDalitzReso phi( plot, _AC, _BC, _VECTOR, 1.01943, .00459319, _RBW );
251  static EvtDalitzReso a0p_980( plot, _AC, _AB, _SCALAR, 0.999, _RBW, .550173,
252  .324, _EtaPic );
253  static EvtDalitzReso f0_1370( plot, _AC, _BC, _SCALAR, 1.350, .265, _RBW );
254  static EvtDalitzReso a0m_980( plot, _AB, _AC, _SCALAR, 0.999, _RBW, .550173,
255  .324, _EtaPic );
256  static EvtDalitzReso f0_980( plot, _AC, _BC, _SCALAR, 0.965, _RBW, .695,
257  .165, _PicPicKK );
258  static EvtDalitzReso f2_1270( plot, _AC, _BC, _TENSOR, 1.2754, .1851, _RBW );
259  static EvtDalitzReso a00_1450( plot, _AC, _BC, _SCALAR, 1.474, .265, _RBW );
260  static EvtDalitzReso a0p_1450( plot, _AC, _AB, _SCALAR, 1.474, .265, _RBW );
261  static EvtDalitzReso a0m_1450( plot, _AB, _AC, _SCALAR, 1.474, .265, _RBW );
262 
263  // Adding terms to the amplitude with their corresponding amplitude and phase terms.
264  EvtComplex amp( 0., 0. ); // Phase space amplitude.
265  amp += EvtComplex( 1.0, 0.0 ) * a00_980.evaluate( point );
266  amp += EvtComplex( -.126314, .188701 ) * phi.evaluate( point );
267  amp += EvtComplex( -.561428, .0135338 ) * a0p_980.evaluate( point );
268  amp += EvtComplex( .035, -.00110488 ) * f0_1370.evaluate( point );
269  amp += EvtComplex( -.0872735, .0791190 ) * a0m_980.evaluate( point );
270  amp += EvtComplex( 0., 0. ) * f0_980.evaluate( point );
271  amp += EvtComplex( .257341, -.0408343 ) * f2_1270.evaluate( point );
272  amp += EvtComplex( -.0614342, -.649930 ) * a00_1450.evaluate( point );
273  amp += EvtComplex( -.104629, .830120 ) * a0p_1450.evaluate( point );
274  amp += EvtComplex( 0., 0. ) * a0m_1450.evaluate( point );
275 
276  return 2.8 *
277  amp; // Multiply by 2.8 in order to reuse the same probmax as Ks pi pi.
278 }
279 
281 {
282  // Define the EvtIds.
283  _BP = EvtPDL::getId( "B+" );
284  _BM = EvtPDL::getId( "B-" );
285  _B0 = EvtPDL::getId( "B0" );
286  _B0B = EvtPDL::getId( "anti-B0" );
287  _D0 = EvtPDL::getId( "D0" );
288  _D0B = EvtPDL::getId( "anti-D0" );
289  _KM = EvtPDL::getId( "K-" );
290  _KP = EvtPDL::getId( "K+" );
291  _K0 = EvtPDL::getId( "K0" );
292  _K0B = EvtPDL::getId( "anti-K0" );
293  _KL = EvtPDL::getId( "K_L0" );
294  _KS = EvtPDL::getId( "K_S0" );
295  _PIM = EvtPDL::getId( "pi-" );
296  _PIP = EvtPDL::getId( "pi+" );
297 
298  // Read the relevant masses.
299  _mD0 = EvtPDL::getMass( _D0 );
300  _mKs = EvtPDL::getMass( _KS );
302  _mK = EvtPDL::getMass( _KP );
303 }
304 
306 {
307  EvtGenReport( EVTGEN_ERROR, "EvtD0gammaDalitz" )
308  << "EvtD0gammaDalitz: Invalid mode." << std::endl;
309  exit( 1 );
310 }
static const EvtDalitzReso::CouplingType & _PicPicKK
static const EvtDalitzReso::NumType & _KMAT
static const EvtCyclic3::Pair & _AB
static EvtDecayTable * getInstance()
EvtParticle * getParent() const
Definition: EvtParticle.cpp:96
double getArg(unsigned int j)
EvtComplex evaluate(const EvtDalitzPoint &p)
EvtDecayBase * clone() override
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=0)
Definition: EvtReport.cpp:33
static const EvtSpinType::spintype & _SCALAR
EvtComplex dalitzKsKK(const EvtDalitzPoint &point) const
EvtId getId() const
void init() override
static const EvtCyclic3::Pair & _BC
EvtId * getDaugs()
Definition: EvtDecayBase.hh:66
void setProbMax(double prbmx)
static const EvtCyclic3::Pair & _AC
Definition: EvtId.hh:27
static const EvtDalitzReso::CouplingType & _EtaPic
void decay(EvtParticle *p) override
EvtDecayBase * getDecayFunc(EvtParticle *p)
EvtId getParentId() const
Definition: EvtDecayBase.hh:61
void vertex(const EvtComplex &amp)
Definition: EvtDecayAmp.hh:37
double initializePhaseSpace(unsigned int numdaughter, EvtId *daughters, bool forceResetMasses=false, double poleSize=-1., int whichTwo1=0, int whichTwo2=1)
void checkNDaug(int d1, int d2=-1)
void checkSpinParent(EvtSpinType::spintype sp)
void checkNArg(int a1, int a2=-1, int a3=-1, int a4=-1)
static EvtId getId(const std::string &name)
Definition: EvtPDL.cpp:287
const EvtVector4R & getP4() const
void checkSpinDaughter(int d1, EvtSpinType::spintype sp)
int getNDaug() const
Definition: EvtDecayBase.hh:65
static const EvtSpinType::spintype & _TENSOR
EvtComplex exp(const EvtComplex &c)
Definition: EvtComplex.hh:240
static const EvtDalitzReso::NumType & _RBW
EvtParticle * getDaug(int i)
Definition: EvtParticle.cpp:91
void initProbMax() override
std::string getName() override
static const EvtDalitzReso::NumType & _GS
static double getMass(EvtId i)
Definition: EvtPDL.cpp:319
static const EvtSpinType::spintype & _VECTOR
EvtComplex dalitzKsPiPi(const EvtDalitzPoint &point) const
void reportInvalidAndExit() const
EvtId getDaug(int i) const
Definition: EvtDecayBase.hh:67