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
EvtD0ToKspipi.cpp
Go to the documentation of this file.
2
8
9#include <iostream>
10
11std::string EvtD0ToKspipi::getName() const
12{
13 return "D0TOKSPIPI";
14}
15
17{
18 return new EvtD0ToKspipi;
19}
20
22{
23 // Check that there are 0 arguments
24 checkNArg( 0 );
25
26 // Check parent and daughter types
27 checkNDaug( 3 );
32
33 // Set the particle IDs and PDG masses
35
36 // Set the EvtId of the three D0 daughters
37 const int nDaug = 3;
38 std::vector<EvtId> dau;
39 for ( int index = 0; index < nDaug; index++ ) {
40 dau.push_back( getDaug( index ) );
41 }
42
43 // Look for K0bar h+ h-. The order will be K[0SL] h+ h-
44 for ( int index = 0; index < nDaug; index++ ) {
45 if ( ( dau[index] == m_K0B ) || ( dau[index] == m_KS ) ||
46 ( dau[index] == m_KL ) ) {
47 m_d0 = index;
48 } else if ( dau[index] == m_PIP ) {
49 m_d1 = index;
50 } else if ( dau[index] == m_PIM ) {
51 m_d2 = index;
52 } else {
53 EvtGenReport( EVTGEN_ERROR, "EvtD0ToKspipi" )
54 << "Daughter " << index << " has wrong ID" << std::endl;
55 }
56 }
57
58 // Setup the Dalitz plot resonances and their amplitude coefficients
60}
61
63{
64 setProbMax( 6000.0 );
65}
66
68{
69 // Phase space generation and 4-momenta
71 const EvtVector4R p0 = p->getDaug( m_d0 )->getP4();
72 const EvtVector4R p1 = p->getDaug( m_d1 )->getP4();
73 const EvtVector4R p2 = p->getDaug( m_d2 )->getP4();
74
75 // Squared invariant masses
76 const double mSq01 = ( p0 + p1 ).mass2();
77 const double mSq02 = ( p0 + p2 ).mass2();
78 const double mSq12 = ( p1 + p2 ).mass2();
79
80 // For the decay amplitude
81 EvtComplex amp( 0.0, 0.0 );
82
83 // Direct and conjugated Dalitz points
84 const EvtDalitzPoint pointD0( m_mKs, m_mPi, m_mPi, mSq02, mSq12, mSq01 );
85 const EvtDalitzPoint pointD0b( m_mKs, m_mPi, m_mPi, mSq01, mSq12, mSq02 );
86
87 // Check if the D is from a B+- -> D0 K+- decay with the appropriate model
88 EvtParticle* parent = p->getParent();
89 EvtDecayBase* decayFun = ( parent != nullptr )
90 ? EvtDecayTable::getInstance().getDecayFunc(
91 parent )
92 : nullptr;
93 if ( parent != nullptr && decayFun != nullptr &&
94 decayFun->getName() == "BTODDALITZCPK" ) {
95 const EvtId parId = parent->getId();
96 if ( ( parId == m_BP ) || ( parId == m_BM ) || ( parId == m_B0 ) ||
97 ( parId == m_B0B ) ) {
98 // D0 parent particle is a B meson from the BTODDALITZCPK decay model.
99 // D0 decay amplitude combines the interference of D0 and D0bar.
100 // Read the D decay parameters from the B decay model.
101 // Gamma angle in radians
102 const double gamma = decayFun->getArg( 0 );
103 // Strong phase in radians
104 const double delta = decayFun->getArg( 1 );
105 // Ratio between B -> D0 K and B -> D0bar K
106 const double rB = decayFun->getArg( 2 );
107
108 // Direct and conjugated amplitudes
109 const EvtComplex ampD0 = calcTotAmp( pointD0 );
110 const EvtComplex ampD0b = calcTotAmp( pointD0b );
111
112 if ( parId == m_BP || parId == m_B0 ) {
113 // B+ or B0
114 const EvtComplex iPhase( 0.0, delta + gamma );
115 const EvtComplex expo( exp( iPhase ) );
116 amp = ampD0b + rB * expo * ampD0;
117 } else {
118 // B- or B0bar
119 const EvtComplex iPhase( 0.0, delta - gamma );
120 const EvtComplex expo( exp( iPhase ) );
121 amp = ampD0 + rB * expo * ampD0b;
122 }
123 }
124 } else if ( !parent ) {
125 // D0 has no parent particle. Use direct or conjugated amplitude
126 if ( p->getId() == m_D0 ) {
127 amp = calcTotAmp( pointD0 );
128 } else {
129 amp = calcTotAmp( pointD0b );
130 }
131 }
132
133 // Set the decay vertex amplitude
134 vertex( amp );
135}
136
138{
139 // Initialise the total amplitude
140 EvtComplex totAmp( 0.0, 0.0 );
141 // Check that the Dalitz plot point is OK
142 if ( point.isValid() == false ) {
143 return totAmp;
144 }
145
146 // Add the resonance amplitudes by iterating over the (resonance, coeff) pairs.
147 // This includes the BW and LASS lineshapes, as well as the K-matrix contributions
148 for ( const auto& [res, amp] : m_resonances ) {
149 // Evaluate the resonance amplitude and multiply by the coeff
150 totAmp += res.evaluate( point ) * amp;
151 }
152 // Return the total amplitude
153 return totAmp;
154}
155
157{
158 // Dalitz plot model from combined BaBar and BELLE paper hep-ex/1804.06153
159
160 // Define the Dalitz plot axes
164
165 // Define the particle spin and lineshape types
170
171 // Define the Dalitz plot
172 const EvtDalitzPlot DP( m_mKs, m_mPi, m_mPi, m_mD0, 0, 0 );
173
174 // Clear the internal vector of (resonance, coeff) pairs
175 m_resonances.clear();
176
177 // rho BW
178 const EvtDalitzReso rhoBW( DP, AB, BC, vector, 0.77155, 0.13469, RBW, 5.0,
179 1.5 );
180 const EvtComplex rhoCoeff( 1.0, 0.0 );
181 m_resonances.push_back( std::make_pair( rhoBW, rhoCoeff ) );
182
183 // Omega BW
184 const EvtDalitzReso omegaBW( DP, AB, BC, vector, 0.78265, 0.00849, RBW, 5.0,
185 1.5 );
186 const EvtComplex omegaCoeff( -0.019829903319132, 0.033339785741436 );
187 m_resonances.push_back( std::make_pair( omegaBW, omegaCoeff ) );
188
189 // K*(892)- BW
190 const EvtDalitzReso KstarBW( DP, BC, AB, vector, 0.893709298220334,
191 0.047193287094108, RBW, 5.0, 1.5 );
192 const EvtComplex KstarCoeff( -1.255025021860793, 1.176780750003210 );
193 m_resonances.push_back( std::make_pair( KstarBW, KstarCoeff ) );
194
195 // K*0(1430)- LASS
196 const double LASS_F = 0.955319683174069;
197 const double LASS_phi_F = 0.001737032480754;
198 const double LASS_R = 1.0;
199 const double LASS_phi_R = -1.914503836666840;
200 const double LASS_a = 0.112673863011817;
201 const double LASS_r = -33.799002116066454;
202 const EvtDalitzReso Kstar0_1430LASS = EvtDalitzReso(
203 DP, AB, 1.440549945739415, 0.192611512914605, LASS_a, LASS_r, LASS_F,
204 LASS_phi_F, LASS_R, LASS_phi_R, -1.0, false );
205 const EvtComplex Kstar0_1430Coeff( -0.386469884688245, 2.330315087713914 );
206 m_resonances.push_back( std::make_pair( Kstar0_1430LASS, Kstar0_1430Coeff ) );
207
208 // K*2(1430)- BW
209 const EvtDalitzReso Kstar2_1430BW( DP, BC, AB, tensor, 1.4256, 0.0985, RBW,
210 5.0, 1.5 );
211 const EvtComplex Kstar2_1430Coeff( 0.914470111251261, -0.885129049790117 );
212 m_resonances.push_back( std::make_pair( Kstar2_1430BW, Kstar2_1430Coeff ) );
213
214 // K*(1680)- BW
215 const EvtDalitzReso Kstar_1680BW( DP, BC, AB, vector, 1.717, 0.322, RBW,
216 5.0, 1.5 );
217 const EvtComplex Kstar_1680Coeff( -1.560837188791231, -2.916210561577914 );
218 m_resonances.push_back( std::make_pair( Kstar_1680BW, Kstar_1680Coeff ) );
219
220 // K*(1410)- BW
221 const EvtDalitzReso Kstar_1410BW( DP, BC, AB, vector, 1.414, 0.232, RBW,
222 5.0, 1.5 );
223 const EvtComplex Kstar_1410Coeff( -0.046795079734847, 0.283085379985959 );
224 m_resonances.push_back( std::make_pair( Kstar_1410BW, Kstar_1410Coeff ) );
225
226 // K*(892)+ DCS BW
227 const EvtDalitzReso Kstar_DCSBW( DP, BC, AC, vector, 0.893709298220334,
228 0.047193287094108, RBW, 5.0, 1.5 );
229 const EvtComplex Kstar_DCSCoeff( 0.121693743404499, -0.110206354657867 );
230 m_resonances.push_back( std::make_pair( Kstar_DCSBW, Kstar_DCSCoeff ) );
231
232 // K*0(1430)+ DCS LASS
233 const EvtDalitzReso Kstar0_1430_DCSLASS = EvtDalitzReso(
234 DP, AC, 1.440549945739415, 0.192611512914605, LASS_a, LASS_r, LASS_F,
235 LASS_phi_F, LASS_R, LASS_phi_R, -1.0, false );
236 const EvtComplex Kstar0_1430_DCSCoeff( -0.101484805664368, 0.032368302993344 );
237 m_resonances.push_back(
238 std::make_pair( Kstar0_1430_DCSLASS, Kstar0_1430_DCSCoeff ) );
239
240 // K*2(1430)+ DCS BW
241 const EvtDalitzReso Kstar2_1430_DCSBW( DP, AB, AC, tensor, 1.4256, 0.0985,
242 RBW, 5.0, 1.5 );
243 const EvtComplex Kstar2_1430_DCSCoeff( 0.000699701539252, -0.102571188336701 );
244 m_resonances.push_back(
245 std::make_pair( Kstar2_1430_DCSBW, Kstar2_1430_DCSCoeff ) );
246
247 // K*(1410)+ DCS BW
248 const EvtDalitzReso Kstar_1410_DCSBW( DP, BC, AC, vector, 1.414, 0.232, RBW,
249 5.0, 1.5 );
250 const EvtComplex Kstar_1410_DCSCoeff( -0.181330401419455, 0.103990039950039 );
251 m_resonances.push_back(
252 std::make_pair( Kstar_1410_DCSBW, Kstar_1410_DCSCoeff ) );
253
254 // f2(1270) BW
255 const EvtDalitzReso f2_1270BW( DP, AB, BC, tensor, 1.2751, 0.1842, RBW, 5.0,
256 1.5 );
257 const EvtComplex f2_1270Coeff( 1.151785277682948, -0.845612891825272 );
258 m_resonances.push_back( std::make_pair( f2_1270BW, f2_1270Coeff ) );
259
260 // rho(1450) BW
261 const EvtDalitzReso rho_1450BW( DP, AB, BC, vector, 1.465, 0.400, RBW, 5.0,
262 1.5 );
263 const EvtComplex rho_1450Coeff( -0.597963342540235, 2.787903868470057 );
264 m_resonances.push_back( std::make_pair( rho_1450BW, rho_1450Coeff ) );
265
266 // K-matrix pole 1
267 const double sProd0 = -0.07;
268 const EvtDalitzReso pole1( DP, BC, "Pole1", KMAT, 0, 0, 0, 0, sProd0 );
269 const EvtComplex p1Coeff( 3.122415682166643, 7.928823290976309 );
270 m_resonances.push_back( std::make_pair( pole1, p1Coeff ) );
271
272 // K-matrix pole 2
273 const EvtDalitzReso pole2( DP, BC, "Pole2", KMAT, 0, 0, 0, 0, sProd0 );
274 const EvtComplex p2Coeff( 11.139907856904129, 4.948420661321371 );
275 m_resonances.push_back( std::make_pair( pole2, p2Coeff ) );
276
277 // K-matrix pole 3
278 const EvtDalitzReso pole3( DP, BC, "Pole3", KMAT, 0, 0, 0, 0, sProd0 );
279 const EvtComplex p3Coeff( 29.146102368470210, -0.053588781806890 );
280 m_resonances.push_back( std::make_pair( pole3, p3Coeff ) );
281
282 // K-matrix pole 4
283 const EvtDalitzReso pole4( DP, BC, "Pole4", KMAT, 0, 0, 0, 0, sProd0 );
284 const EvtComplex p4Coeff( 6.631556203215280, -8.455370251307063 );
285 m_resonances.push_back( std::make_pair( pole4, p4Coeff ) );
286
287 // K-matrix pole 5 is not included since its amplitude coefficient is zero
288
289 // K-matrix slowly varying part
290 const EvtComplex fProd11( -4.724094278696236, -6.511009103363590 );
291 const EvtComplex fProd12( -23.289333360304212, -12.215597571354197 );
292 const EvtComplex fProd13( -1.860311896516422, -32.982507366353126 );
293 const EvtComplex fProd14( -13.638752211193912, -22.339804683783186 );
294 const EvtComplex fProd15( 0.0, 0.0 );
295
296 const EvtDalitzReso KMSVP( DP, BC, "f11prod", KMAT, fProd12 / fProd11,
297 fProd13 / fProd11, fProd14 / fProd11,
298 fProd15 / fProd11, sProd0 );
299 m_resonances.push_back( std::make_pair( KMSVP, fProd11 ) );
300}
301
303{
304 // Set the EvtIds
305 m_BP = EvtPDL::getId( "B+" );
306 m_BM = EvtPDL::getId( "B-" );
307 m_B0 = EvtPDL::getId( "B0" );
308 m_B0B = EvtPDL::getId( "anti-B0" );
309 m_D0 = EvtPDL::getId( "D0" );
310 m_D0B = EvtPDL::getId( "anti-D0" );
311 m_KM = EvtPDL::getId( "K-" );
312 m_KP = EvtPDL::getId( "K+" );
313 m_K0 = EvtPDL::getId( "K0" );
314 m_K0B = EvtPDL::getId( "anti-K0" );
315 m_KL = EvtPDL::getId( "K_L0" );
316 m_KS = EvtPDL::getId( "K_S0" );
317 m_PIM = EvtPDL::getId( "pi-" );
318 m_PIP = EvtPDL::getId( "pi+" );
319
320 // Set the particle masses
325}
EvtComplex exp(const EvtComplex &c)
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=nullptr)
Definition EvtReport.cpp:32
@ EVTGEN_ERROR
Definition EvtReport.hh:49
EvtDecayBase * clone() const override
std::string getName() const override
void decay(EvtParticle *parent) override
EvtComplex calcTotAmp(const EvtDalitzPoint &point) const
std::vector< ResAmpPair > m_resonances
void init() override
void initProbMax() override
bool isValid() 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)
virtual std::string getName() const =0
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()
Definition EvtId.hh:27
static double getMeanMass(EvtId i)
Definition EvtPDL.cpp:306
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