EvtGen 2.2.0
Monte Carlo generator of particle decays, in particular the weak decays of heavy flavour particles such as B mesons.
Loading...
Searching...
No Matches
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
27#include "EvtGenBase/EvtPDL.hh"
32
33#include <cmath>
34#include <cstdlib>
35#include <string>
36
37// Initialize the static variables.
41
46
52
56
57std::string EvtD0gammaDalitz::getName() const
58{
59 return "D0GAMMADALITZ";
60}
61
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.
81
82 // Get the EvtId of the D0 and its 3 daughters.
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] == m_K0B ) || ( dau[index] == m_KS ) ||
93 ( dau[index] == m_KL ) ) {
94 m_d1 = index;
95 } else if ( ( dau[index] == m_PIP ) || ( dau[index] == m_KP ) ) {
96 m_d2 = index;
97 } else if ( ( dau[index] == m_PIM ) || ( dau[index] == m_KM ) ) {
98 m_d3 = index;
99 } else {
101 }
102 }
103
104 // Check if we're dealing with Ks pi pi or with Ks K K.
105 m_isKsPiPi = false;
106 if ( dau[m_d2] == m_PIP || dau[m_d2] == m_PIM ) {
107 m_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 != nullptr &&
122 EvtDecayTable::getInstance().getDecayFunc( parent )->getName() ==
123 "BTODDALITZCPK" ) {
124 EvtId parId = parent->getId();
125 if ( ( parId == m_BP ) || ( parId == m_BM ) || ( parId == m_B0 ) ||
126 ( parId == m_B0B ) ) {
127 m_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 const double gamma =
139 // Strong phase in rad.
140 const double delta =
142 // Ratio between B->D0K and B->D0barK
143 const double rB =
145
146 // Same structure for all of these decays.
148 const EvtVector4R pA = part->getDaug( m_d1 )->getP4();
149 const EvtVector4R pB = part->getDaug( m_d2 )->getP4();
150 const EvtVector4R pC = part->getDaug( m_d3 )->getP4();
151
152 // Squared invariant masses.
153 const double mSqAB = ( pA + pB ).mass2();
154 const double mSqAC = ( pA + pC ).mass2();
155 const double mSqBC = ( pB + pC ).mass2();
156
157 EvtComplex amp( 1.0, 0.0 );
158
159 // Direct and conjugated amplitudes.
160 EvtComplex ampDir;
161 EvtComplex ampCnj;
162
163 if ( m_isKsPiPi ) {
164 // Direct and conjugated Dalitz points.
165 EvtDalitzPoint pointDir( m_mKs, m_mPi, m_mPi, mSqAB, mSqBC, mSqAC );
166 EvtDalitzPoint pointCnj( m_mKs, m_mPi, m_mPi, mSqAC, mSqBC, mSqAB );
167
168 // Direct and conjugated amplitudes.
169 ampDir = dalitzKsPiPi( pointDir );
170 ampCnj = dalitzKsPiPi( pointCnj );
171 } else {
172 // Direct and conjugated Dalitz points.
173 EvtDalitzPoint pointDir( m_mKs, m_mK, m_mK, mSqAB, mSqBC, mSqAC );
174 EvtDalitzPoint pointCnj( m_mKs, m_mK, m_mK, mSqAC, mSqBC, mSqAB );
175
176 // Direct and conjugated amplitudes.
177 ampDir = dalitzKsKK( pointDir );
178 ampCnj = dalitzKsKK( pointCnj );
179 }
180
181 if ( m_bFlavor == m_BP || m_bFlavor == m_B0 ) {
182 amp = ampCnj + rB * exp( EvtComplex( 0., delta + gamma ) ) * ampDir;
183 } else {
184 amp = ampDir + rB * exp( EvtComplex( 0., delta - gamma ) ) * ampCnj;
185 }
186
187 vertex( amp );
188
189 return;
190}
191
193{
194 static const EvtDalitzPlot plot( m_mKs, m_mPi, m_mPi, m_mD0 );
195
196 EvtComplex amp = 0.;
197
198 // This corresponds to relativistic Breit-Wigner distributions. Not K-matrix.
199 // Defining resonances.
200 static const EvtDalitzReso KStarm( plot, m_BC, m_AC, m_VECTOR, 0.893606,
201 0.0463407, m_RBW );
202 static const EvtDalitzReso KStarp( plot, m_BC, m_AB, m_VECTOR, 0.893606,
203 0.0463407, m_RBW );
204 static const EvtDalitzReso rho0( plot, m_AC, m_BC, m_VECTOR, 0.7758, 0.1464,
205 m_GS );
206 static const EvtDalitzReso omega( plot, m_AC, m_BC, m_VECTOR, 0.78259,
207 0.00849, m_RBW );
208 static const EvtDalitzReso f0_980( plot, m_AC, m_BC, m_SCALAR, 0.975, 0.044,
209 m_RBW );
210 static const EvtDalitzReso f0_1370( plot, m_AC, m_BC, m_SCALAR, 1.434,
211 0.173, m_RBW );
212 static const EvtDalitzReso f2_1270( plot, m_AC, m_BC, m_TENSOR, 1.2754,
213 0.1851, m_RBW );
214 static const EvtDalitzReso K0Starm_1430( plot, m_BC, m_AC, m_SCALAR, 1.459,
215 0.175, m_RBW );
216 static const EvtDalitzReso K0Starp_1430( plot, m_BC, m_AB, m_SCALAR, 1.459,
217 0.175, m_RBW );
218 static const EvtDalitzReso K2Starm_1430( plot, m_BC, m_AC, m_TENSOR, 1.4256,
219 0.0985, m_RBW );
220 static const EvtDalitzReso K2Starp_1430( plot, m_BC, m_AB, m_TENSOR, 1.4256,
221 0.0985, m_RBW );
222 static const EvtDalitzReso sigma( plot, m_AC, m_BC, m_SCALAR, 0.527699,
223 0.511861, m_RBW );
224 static const EvtDalitzReso sigma2( plot, m_AC, m_BC, m_SCALAR, 1.03327,
225 0.0987890, m_RBW );
226 static const EvtDalitzReso KStarm_1680( plot, m_BC, m_AC, m_VECTOR, 1.677,
227 0.205, m_RBW );
228
229 // Adding terms to the amplitude with their corresponding amplitude and phase terms.
230 amp += EvtComplex( .848984, .893618 );
231 amp += EvtComplex( -1.16356, 1.19933 ) * KStarm.evaluate( point );
232 amp += EvtComplex( .106051, -.118513 ) * KStarp.evaluate( point );
233 amp += EvtComplex( 1.0, 0.0 ) * rho0.evaluate( point );
234 amp += EvtComplex( -.0249569, .0388072 ) * omega.evaluate( point );
235 amp += EvtComplex( -.423586, -.236099 ) * f0_980.evaluate( point );
236 amp += EvtComplex( -2.16486, 3.62385 ) * f0_1370.evaluate( point );
237 amp += EvtComplex( .217748, -.133327 ) * f2_1270.evaluate( point );
238 amp += EvtComplex( 1.62128, 1.06816 ) * K0Starm_1430.evaluate( point );
239 amp += EvtComplex( .148802, .0897144 ) * K0Starp_1430.evaluate( point );
240 amp += EvtComplex( 1.15489, -.773363 ) * K2Starm_1430.evaluate( point );
241 amp += EvtComplex( .140865, -.165378 ) * K2Starp_1430.evaluate( point );
242 amp += EvtComplex( -1.55556, -.931685 ) * sigma.evaluate( point );
243 amp += EvtComplex( -.273791, -.0535596 ) * sigma2.evaluate( point );
244 amp += EvtComplex( -1.69720, .128038 ) * KStarm_1680.evaluate( point );
245
246 return amp;
247}
248
250{
251 static const EvtDalitzPlot plot( m_mKs, m_mK, m_mK, m_mD0 );
252
253 // Defining resonances.
254 static const EvtDalitzReso a00_980( plot, m_AC, m_BC, m_SCALAR, 0.999,
255 m_RBW, .550173, .324, m_EtaPic );
256 static const EvtDalitzReso phi( plot, m_AC, m_BC, m_VECTOR, 1.01943,
257 .00459319, m_RBW );
258 static const EvtDalitzReso a0p_980( plot, m_AC, m_AB, m_SCALAR, 0.999,
259 m_RBW, .550173, .324, m_EtaPic );
260 static const EvtDalitzReso f0_1370( plot, m_AC, m_BC, m_SCALAR, 1.350, .265,
261 m_RBW );
262 static const EvtDalitzReso a0m_980( plot, m_AB, m_AC, m_SCALAR, 0.999,
263 m_RBW, .550173, .324, m_EtaPic );
264 static const EvtDalitzReso f0_980( plot, m_AC, m_BC, m_SCALAR, 0.965, m_RBW,
265 .695, .165, m_PicPicKK );
266 static const EvtDalitzReso f2_1270( plot, m_AC, m_BC, m_TENSOR, 1.2754,
267 .1851, m_RBW );
268 static const EvtDalitzReso a00_1450( plot, m_AC, m_BC, m_SCALAR, 1.474,
269 .265, m_RBW );
270 static const EvtDalitzReso a0p_1450( plot, m_AC, m_AB, m_SCALAR, 1.474,
271 .265, m_RBW );
272 static const EvtDalitzReso a0m_1450( plot, m_AB, m_AC, m_SCALAR, 1.474,
273 .265, m_RBW );
274
275 // Adding terms to the amplitude with their corresponding amplitude and phase terms.
276 EvtComplex amp( 0., 0. ); // Phase space amplitude.
277 amp += EvtComplex( 1.0, 0.0 ) * a00_980.evaluate( point );
278 amp += EvtComplex( -.126314, .188701 ) * phi.evaluate( point );
279 amp += EvtComplex( -.561428, .0135338 ) * a0p_980.evaluate( point );
280 amp += EvtComplex( .035, -.00110488 ) * f0_1370.evaluate( point );
281 amp += EvtComplex( -.0872735, .0791190 ) * a0m_980.evaluate( point );
282 amp += EvtComplex( 0., 0. ) * f0_980.evaluate( point );
283 amp += EvtComplex( .257341, -.0408343 ) * f2_1270.evaluate( point );
284 amp += EvtComplex( -.0614342, -.649930 ) * a00_1450.evaluate( point );
285 amp += EvtComplex( -.104629, .830120 ) * a0p_1450.evaluate( point );
286 amp += EvtComplex( 0., 0. ) * a0m_1450.evaluate( point );
287
288 return 2.8 *
289 amp; // Multiply by 2.8 in order to reuse the same probmax as Ks pi pi.
290}
291
293{
294 // Define the EvtIds.
295 m_BP = EvtPDL::getId( "B+" );
296 m_BM = EvtPDL::getId( "B-" );
297 m_B0 = EvtPDL::getId( "B0" );
298 m_B0B = EvtPDL::getId( "anti-B0" );
299 m_D0 = EvtPDL::getId( "D0" );
300 m_D0B = EvtPDL::getId( "anti-D0" );
301 m_KM = EvtPDL::getId( "K-" );
302 m_KP = EvtPDL::getId( "K+" );
303 m_K0 = EvtPDL::getId( "K0" );
304 m_K0B = EvtPDL::getId( "anti-K0" );
305 m_KL = EvtPDL::getId( "K_L0" );
306 m_KS = EvtPDL::getId( "K_S0" );
307 m_PIM = EvtPDL::getId( "pi-" );
308 m_PIP = EvtPDL::getId( "pi+" );
309
310 // Read the relevant masses.
315}
316
318{
319 EvtGenReport( EVTGEN_ERROR, "EvtD0gammaDalitz" )
320 << "EvtD0gammaDalitz: Invalid mode." << std::endl;
321 exit( 1 );
322}
EvtComplex exp(const EvtComplex &c)
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=nullptr)
Definition EvtReport.cpp:32
@ EVTGEN_ERROR
Definition EvtReport.hh:49
std::string getName() const override
static const EvtCyclic3::Pair & m_AC
void decay(EvtParticle *p) override
void reportInvalidAndExit() const
EvtComplex dalitzKsKK(const EvtDalitzPoint &point) const
static const EvtSpinType::spintype & m_SCALAR
static const EvtDalitzReso::NumType & m_RBW
static const EvtDalitzReso::NumType & m_GS
static const EvtCyclic3::Pair & m_AB
EvtComplex dalitzKsPiPi(const EvtDalitzPoint &point) const
static const EvtSpinType::spintype & m_TENSOR
static const EvtDalitzReso::CouplingType & m_PicPicKK
static const EvtDalitzReso::NumType & m_KMAT
void initProbMax() override
static const EvtCyclic3::Pair & m_BC
static const EvtSpinType::spintype & m_VECTOR
EvtDecayBase * clone() const override
void init() override
static const EvtDalitzReso::CouplingType & m_EtaPic
EvtComplex evaluate(const EvtDalitzPoint &p) const
void vertex(const EvtComplex &amp)
void checkSpinDaughter(int d1, EvtSpinType::spintype sp)
EvtDecayBase()=default
int getNDaug() const
void checkSpinParent(EvtSpinType::spintype sp)
double getArg(unsigned int j)
void setProbMax(double prbmx)
EvtId getParentId() const
EvtId getDaug(int i) const
void checkNDaug(int d1, int d2=-1)
void checkNArg(int a1, int a2=-1, int a3=-1, int a4=-1)
const EvtId * getDaugs() const
static EvtDecayTable & getInstance()
EvtDecayBase * getDecayFunc(EvtParticle *p)
Definition EvtId.hh:27
static double getMass(EvtId i)
Definition EvtPDL.cpp:311
static EvtId getId(const std::string &name)
Definition EvtPDL.cpp:283
double initializePhaseSpace(size_t numdaughter, const EvtId *daughters, bool forceResetMasses=false, double poleSize=-1., int whichTwo1=0, int whichTwo2=1)
EvtId getId() const
const EvtVector4R & getP4() const
EvtParticle * getDaug(const int i)
EvtParticle * getParent() const