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
EvtBsMuMuKK.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
26#include "EvtGenBase/EvtKine.hh"
27#include "EvtGenBase/EvtPDL.hh"
35
36const double pi = EvtConst::pi;
37const EvtComplex I = EvtComplex( 0.0, 1.0 );
38const double sq2 = sqrt( 2.0 );
39
40std::string EvtBsMuMuKK::getName() const
41{
42 return "BS_MUMUKK";
43}
44
46{
47 return new EvtBsMuMuKK;
48}
49
51{
52 // DecFile parameters
53 checkNArg( 37 );
54
55 // Non-resonant S wave
56 m_f_S_NR = getArg( 0 );
57 m_delta_S_NR = getArg( 1 );
58 m_phis_S_NR = getArg( 2 );
60
61 // f0 (S wave)
62 m_f_f0 = getArg( 4 );
63 m_delta_f0 = getArg( 5 );
64 m_phis_f0 = getArg( 6 );
66
67 // phi (P wave)
68 m_f_phi = getArg( 8 );
69 m_f_phi_0 = getArg( 9 );
70 m_delta_phi_0 = getArg( 10 );
71 m_phis_phi_0 = getArg( 11 );
73 m_f_phi_perp = getArg( 13 );
74 m_delta_phi_perp = pi - getArg( 14 );
75 m_phis_phi_perp = getArg( 15 );
77 m_delta_phi_par = pi - getArg( 17 );
78 m_phis_phi_par = getArg( 18 );
80
81 // f2' (D wave)
82 m_f_f2p_0 = getArg( 20 );
83 m_delta_f2p_0 = getArg( 21 );
84 m_phis_f2p_0 = getArg( 22 );
86 m_f_f2p_perp = getArg( 24 );
87 m_delta_f2p_perp = pi - getArg( 25 );
88 m_phis_f2p_perp = getArg( 26 );
90 m_delta_f2p_par = pi - getArg( 28 );
91 m_phis_f2p_par = getArg( 29 );
93
94 // Time dependence
95 m_Gamma = getArg( 31 );
96 m_deltaGamma = getArg( 32 );
97 m_deltaMs = getArg( 33 );
98
99 // mKK window
100 m_Mf0 = getArg( 34 );
101 m_kin_lower_limit = getArg( 35 ); // the minimum is approx 2.03*MKp
103
104 // PDG masses
105 m_MBs = EvtPDL::getMass( EvtPDL::getId( "B_s0" ) );
114 m_Mmu = EvtPDL::getMass( EvtPDL::getId( "mu+" ) );
115
116 double MBsSq = m_MBs * m_MBs;
117
118 // Amplitudes and other time parameters
119 m_A_S_NR = sqrt( m_f_S_NR );
120 m_A_f0 = sqrt( m_f_f0 );
121
122 m_A_phi_0 = sqrt( m_f_phi_0 * m_f_phi );
124 // Use fabs to make sure subtractions are >= 0, since subtracting 0 from 0 can give -0
125 m_A_phi_par = sqrt(
127
128 m_f_f2p = fabs( 1.0 - m_f_S_NR - m_f_f0 - m_f_phi );
129 m_A_f2p_0 = sqrt( m_f_f2p_0 * m_f_f2p );
131 m_A_f2p_par = sqrt(
133
134 m_ctau = 1.0 / m_Gamma;
137
139
140 m_int_const_NR = sqrt( Integral( 1.0, 1.0, 0, 1, 1.0, m_kin_lower_limit,
141 m_kin_upper_limit, 0 ) );
142
143 m_int_Flatte_f0 = sqrt( Integral( 1.0, m_Mf0, 0, 1, 1.0, m_kin_lower_limit,
144 m_kin_upper_limit, 1 ) );
145
146 m_p30Kp_mid_CMS = sqrt( ( pow( m_kin_middle, 2 ) - pow( m_MKp + m_MKm, 2 ) ) *
147 ( pow( m_kin_middle, 2 ) - pow( m_MKp - m_MKm, 2 ) ) ) /
148 ( 2.0 * m_kin_middle );
149
151 sqrt( ( pow( m_kin_lower_limit, 2 ) - pow( m_MKp + m_MKm, 2 ) ) *
152 ( pow( m_kin_lower_limit, 2 ) - pow( m_MKp - m_MKm, 2 ) ) ) /
153 ( 2.0 * m_kin_lower_limit );
154
155 m_p30Kp_phi_CMS = sqrt( ( m_Mphi * m_Mphi - pow( m_MKp + m_MKm, 2 ) ) *
156 ( m_Mphi * m_Mphi - pow( m_MKp - m_MKm, 2 ) ) ) /
157 ( 2.0 * m_Mphi );
158
159 m_p30Kp_f2p_CMS = sqrt( ( m_Mf2p * m_Mf2p - pow( m_MKp + m_MKm, 2 ) ) *
160 ( m_Mf2p * m_Mf2p - pow( m_MKp - m_MKm, 2 ) ) ) /
161 ( 2.0 * m_Mf2p );
162
163 m_p30Jpsi_mid_CMS = sqrt( ( MBsSq - pow( m_kin_middle + m_MJpsi, 2 ) ) *
164 ( MBsSq - pow( m_kin_middle - m_MJpsi, 2 ) ) ) /
165 ( 2.0 * m_MBs );
166
167 m_p30Jpsi_ll_CMS = sqrt( ( MBsSq - pow( m_kin_lower_limit + m_MJpsi, 2 ) ) *
168 ( MBsSq - pow( m_kin_lower_limit - m_MJpsi, 2 ) ) ) /
169 ( 2.0 * m_MBs );
170
171 m_p30Jpsi_phi_CMS = sqrt( ( MBsSq - pow( m_Mphi + m_MJpsi, 2 ) ) *
172 ( MBsSq - pow( m_Mphi - m_MJpsi, 2 ) ) ) /
173 ( 2.0 * m_MBs );
174
175 m_p30Jpsi_f2p_CMS = sqrt( ( MBsSq - pow( m_Mf2p + m_MJpsi, 2 ) ) *
176 ( MBsSq - pow( m_Mf2p - m_MJpsi, 2 ) ) ) /
177 ( 2.0 * m_MBs );
178
181
184
185 // 4 daughters
186 checkNDaug( 4 );
187
188 // Spin-0 parent
189 checkSpinParent( EvtSpinType::SCALAR ); // B_s0 (anti-B_s0)
190
191 // Daughters
192 checkSpinDaughter( 0, EvtSpinType::DIRAC ); // mu+ (mu-)
193 checkSpinDaughter( 1, EvtSpinType::DIRAC ); // mu- (mu+)
194 checkSpinDaughter( 2, EvtSpinType::SCALAR ); // K+ (K-)
195 checkSpinDaughter( 3, EvtSpinType::SCALAR ); // K- (K+)
196
197 // B_s0 parent (Parent must be B_s0 or anti-B_s0)
198 const EvtId p = getParentId();
199 if ( p != EvtPDL::getId( "B_s0" ) && p != EvtPDL::getId( "anti-B_s0" ) ) {
200 assert( 0 );
201 }
202
203 // Daughter types and ordering (should be mu+-, mu-+, K+-, K-+)
204 const EvtId d1 = getDaug( 0 );
205 const EvtId d2 = getDaug( 1 );
206 const EvtId d3 = getDaug( 2 );
207 const EvtId d4 = getDaug( 3 );
208 if ( !( ( d1 == EvtPDL::getId( "mu+" ) || d1 == EvtPDL::getId( "mu-" ) ) &&
209 ( d2 == EvtPDL::getId( "mu-" ) || d2 == EvtPDL::getId( "mu+" ) ) &&
210 ( d3 == EvtPDL::getId( "K+" ) || d3 == EvtPDL::getId( "K-" ) ) &&
211 ( d4 == EvtPDL::getId( "K-" ) || d4 == EvtPDL::getId( "K+" ) ) ) ) {
212 assert( 0 );
213 }
214}
215
216// Get ProbMax
218{
219 const EvtComplex term11 = sqrt( m_p30Jpsi_f2p_CMS * m_p30Kp_f2p_CMS );
220
221 const EvtComplex term12 =
222 X_J( 2, m_p30Kp_f2p_CMS, 0 ) * X_J( 1, m_p30Jpsi_f2p_CMS, 1 ) *
224 ( m_A_f2p_0 + 0.3 * m_A_f2p_perp + 0.3 * m_A_f2p_par );
225
226 const EvtComplex term13 = m_f_f2p *
230
231 const EvtComplex term21 = sqrt( m_p30Jpsi_phi_CMS * m_p30Kp_phi_CMS );
232
233 const EvtComplex term22 = X_J( 1, m_p30Kp_phi_CMS, 0 ) * m_p30Kp_phi_CMS *
234 ( 0.65 * m_A_phi_0 + 0.6 * m_A_phi_perp +
235 0.6 * m_A_phi_par );
236
237 const EvtComplex term23 = m_f_phi *
241
242 const EvtComplex term31 = sqrt( m_p30Jpsi_ll_CMS * m_p30Kp_ll_CMS );
243
244 const EvtComplex term32 = X_J( 1, m_p30Jpsi_ll_CMS, 1 ) * m_p30Jpsi_ll_CMS;
245
246 const EvtComplex term33 = m_f_f0 * Flatte( m_Mf0, m_kin_lower_limit ) /
248
249 const EvtComplex term41 = sqrt( m_p30Jpsi_mid_CMS * m_p30Kp_mid_CMS );
250
251 const EvtComplex term42 = X_J( 1, m_p30Jpsi_mid_CMS, 1 ) * m_p30Jpsi_mid_CMS;
252
253 const EvtComplex term43 = 1.2 * m_f_S_NR / m_int_const_NR;
254
255 const EvtComplex hm = term11 * term12 * term13 + term21 * term22 * term23 +
256 term31 * term32 * term33 + term41 * term42 * term43;
257
258 // Increase by 10%
259 setProbMax( 0.5 * abs2( hm ) * 1.1 );
260}
261
262// Decay function
264{
265 EvtId other_b;
266 double time( 0.0 );
267 EvtCPUtil::getInstance()->OtherB( p, time, other_b );
268 time = -log( EvtRandom::Flat() ) *
269 m_ctau; // This overrules the ctau made in OtherB
270
271 if ( EvtCPUtil::getInstance()->isBsMixed( p ) ) {
272 p->getParent()->setLifetime( time * EvtConst::c / 1e12 ); // units: mm
273 } else {
274 p->setLifetime( time * EvtConst::c / 1e12 ); // units: mm
275 }
276
277 double DGtime = 0.25 * m_deltaGamma * time;
278 double DMtime = 0.5 * m_deltaMs * time;
279 double mt = exp( -DGtime );
280 double pt = exp( +DGtime );
281 double cDMt = cos( DMtime );
282 double sDMt = sin( DMtime );
283 EvtComplex termplus = EvtComplex( cDMt, sDMt );
284 EvtComplex terminus = EvtComplex( cDMt, -sDMt );
285
286 EvtComplex gplus = 0.5 * ( mt * termplus + pt * terminus );
287 EvtComplex gminus = 0.5 * ( mt * termplus - pt * terminus );
288
289 EvtId BSB = EvtPDL::getId( "anti-B_s0" );
290
291 // Flavour: first assume B_s0, otherwise choose anti-B_s0
292 int q( 1 );
293 if ( other_b == BSB ) {
294 q = -1;
295 }
296 p->setAttribute( "q", q );
297
298 // Amplitudes
299 EvtComplex a_S_NR = AmpTime( q, gplus, gminus, m_delta_S_NR,
301
302 EvtComplex a_f0 = AmpTime( q, gplus, gminus, m_delta_f0, m_lambda_f0_abs,
303 m_A_f0, m_phis_f0, -1 );
304
305 EvtComplex a0_phi = AmpTime( q, gplus, gminus, m_delta_phi_0,
307
308 EvtComplex aperp_phi = AmpTime( q, gplus, gminus, m_delta_phi_perp,
310 m_phis_phi_perp, -1 );
311
312 EvtComplex apar_phi = AmpTime( q, gplus, gminus, m_delta_phi_par,
314 m_phis_phi_par, 1 );
315
316 EvtComplex a0_f2p = AmpTime( q, gplus, gminus, m_delta_f2p_0,
318 -1 );
319
320 EvtComplex aperp_f2p = AmpTime( q, gplus, gminus, m_delta_f2p_perp,
322 m_phis_f2p_perp, 1 );
323
324 EvtComplex apar_f2p = AmpTime( q, gplus, gminus, m_delta_f2p_par,
326 m_phis_f2p_par, -1 );
327
328 // Generate 4-momenta
330 double mass[10] = { m_MJpsi, mKK, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
331 double Kmass[10] = { m_MKp, m_MKm, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
332 double muMass[10] = { m_Mmu, m_Mmu, 0.0, 0.0, 0.0,
333 0.0, 0.0, 0.0, 0.0, 0.0 };
334
335 EvtVector4R mypV[2], mypK[2], mypmu[2];
336 EvtGenKine::PhaseSpace( 2, mass, mypV, m_MBs );
337 EvtGenKine::PhaseSpace( 2, Kmass, mypK, mKK );
338 EvtGenKine::PhaseSpace( 2, muMass, mypmu, m_MJpsi );
339
340 EvtVector4R p4mup = boostTo( mypmu[0], mypV[0] );
341 EvtVector4R p4mum = boostTo( mypmu[1], mypV[0] );
342 EvtVector4R p4Kp = boostTo( mypK[0], mypV[1] );
343 EvtVector4R p4Km = boostTo( mypK[1], mypV[1] );
344
346
347 EvtParticle* thisparticle;
348 EvtParticle *muplus, *muminus, *Kplus, *Kminus;
349
350 // Check particle ID
351 for ( int k = 0; k <= 3; k++ ) {
352 thisparticle = p->getDaug( k );
353 EvtId pId = thisparticle->getId();
354
355 if ( pId == EvtPDL::getId( "mu+" ) ) {
356 muplus = thisparticle;
357 muplus->init( getDaug( k ), p4mup );
358
359 } else if ( pId == EvtPDL::getId( "mu-" ) ) {
360 muminus = thisparticle;
361 muminus->init( getDaug( k ), p4mum );
362
363 } else if ( pId == EvtPDL::getId( "K+" ) ) {
364 Kplus = thisparticle;
365 Kplus->init( getDaug( k ), p4Kp );
366
367 } else if ( pId == EvtPDL::getId( "K-" ) ) {
368 Kminus = thisparticle;
369 Kminus->init( getDaug( k ), p4Km );
370 }
371 }
372
373 EvtVector4R p4KK = p4Kp + p4Km;
374 EvtVector4R p4mumu = p4mup + p4mum;
375 EvtVector4R p4Bs = p4mumu + p4KK;
376
377 double p4KK_mass2 = p4KK.mass2();
378 double p4KK_mass = p4KK.mass();
379 double p4Bs_mass2 = p4Bs.mass2();
380 double p4Bs_mass = p4Bs.mass();
381
382 // Kp momentum in the KK CMS
383 double p3Kp_KK_CMS = sqrt( ( p4KK_mass2 - pow( m_MKp + m_MKm, 2 ) ) *
384 ( p4KK_mass2 - pow( m_MKp - m_MKm, 2 ) ) ) /
385 ( 2.0 * p4KK_mass );
386
387 // J/psi momentum in the KK CMS
388 double p3Jpsi_KK_CMS = sqrt( ( p4Bs_mass2 - pow( p4KK_mass + m_MJpsi, 2 ) ) *
389 ( p4Bs_mass2 - pow( p4KK_mass - m_MJpsi, 2 ) ) ) /
390 ( 2.0 * p4Bs_mass );
391
392 // Mass lineshapes
393
394 // Non-resonant S wave
395 EvtComplex P_NR = 1.0 / m_int_const_NR;
396
397 // f0 Flatte
398 EvtComplex F_f0 = Flatte( m_Mf0, p4KK_mass ) / m_int_Flatte_f0;
399
400 // phi Breit Wigner
401 EvtComplex BW_phi = Breit_Wigner( m_Gamma0phi, m_Mphi, p4KK_mass, 1,
402 m_p30Kp_phi_CMS, p3Kp_KK_CMS ) /
404
405 // f2' Breit Wigner
406 EvtComplex BW_f2p = Breit_Wigner( m_Gamma0f2p, m_Mf2p, p4KK_mass, 1,
407 m_p30Kp_f2p_CMS, p3Kp_KK_CMS ) /
409
410 // Barrier factors: Always taking the lowest Bs L
411 double X_KK_0 = 1.0;
412 double X_KK_1 = X_J( 1, p3Kp_KK_CMS, 0 );
413 double X_KK_2 = X_J( 2, p3Kp_KK_CMS, 0 );
414 double X_NR_Jpsi_1 = X_J( 1, p3Jpsi_KK_CMS, 1 );
415 double X_f0_Jpsi_1 = X_J( 1, p3Jpsi_KK_CMS, 1 );
416 double X_phi_Jpsi_0 = 1.0;
417 double X_f2p_Jpsi_1 = X_J( 1, p3Jpsi_KK_CMS, 1 );
418
419 // Birth momentum factors: pow(p3(K+),LR)* pow(p3(J/psi),LB)
420 double f_PHSP = sqrt( p3Jpsi_KK_CMS * p3Kp_KK_CMS );
421 double f_BMF_NR = p3Jpsi_KK_CMS;
422 double f_BMF_f0 = p3Jpsi_KK_CMS;
423 double f_BMF_phi = p3Kp_KK_CMS;
424 double f_BMF_f2p = p3Kp_KK_CMS * p3Kp_KK_CMS * p3Jpsi_KK_CMS;
425
426 // Angular distribution and sum over KK states
427 double CosK = EvtDecayAngle( p4Bs, p4KK, p4Kp );
428 double CosMu = EvtDecayAngle( p4Bs, p4mumu, p4mup );
429 double chi = EvtDecayAngleChi( p4Bs, p4mup, p4mum, p4Kp, p4Km );
430
431 // Build helicity amplitudes
432
433 // phi
434 EvtComplex H0_phi = a0_phi;
435 EvtComplex Hp_phi = ( apar_phi + aperp_phi ) / sq2;
436 EvtComplex Hm_phi = ( apar_phi - aperp_phi ) / sq2;
437
438 // f2p
439 EvtComplex H0_f2p = a0_f2p;
440 EvtComplex Hp_f2p = ( apar_f2p + aperp_f2p ) / sq2;
441 EvtComplex Hm_f2p = ( apar_f2p - aperp_f2p ) / sq2;
442
443 // muon polarization +1
444 EvtComplex swaveangdist1 = AngularDist( 0, 0, 1, CosK, CosMu, chi );
445
446 // KK Spin-0 NR
447 EvtComplex mp_hS_NR = a_S_NR * swaveangdist1;
448 EvtComplex Amp_p_NR = P_NR * X_KK_0 * X_NR_Jpsi_1 * f_BMF_NR * mp_hS_NR;
449
450 // KK Spin-0 f0
451 EvtComplex mp_h_f0 = a_f0 * swaveangdist1;
452 EvtComplex Amp_p_f0 = F_f0 * X_KK_0 * X_f0_Jpsi_1 * f_BMF_f0 * mp_h_f0;
453
454 // KK Spin-1
455 EvtComplex mp_h0_phi = H0_phi * AngularDist( 1, 0, 1, CosK, CosMu, chi );
456 EvtComplex mp_hp_phi = Hp_phi * AngularDist( 1, 1, 1, CosK, CosMu, chi );
457 EvtComplex mp_hm_phi = Hm_phi * AngularDist( 1, -1, 1, CosK, CosMu, chi );
458 EvtComplex Amp_p_phi = BW_phi * X_KK_1 * X_phi_Jpsi_0 * f_BMF_phi *
459 ( mp_h0_phi + mp_hp_phi + mp_hm_phi );
460
461 // KK Spin-2
462 EvtComplex mp_h0_f2p = H0_f2p * AngularDist( 2, 0, 1, CosK, CosMu, chi );
463 EvtComplex mp_hp_f2p = Hp_f2p * AngularDist( 2, 1, 1, CosK, CosMu, chi );
464 EvtComplex mp_hm_f2p = Hm_f2p * AngularDist( 2, -1, 1, CosK, CosMu, chi );
465 EvtComplex Amp_p_f2p = BW_f2p * X_KK_2 * X_f2p_Jpsi_1 * f_BMF_f2p *
466 ( mp_h0_f2p + mp_hp_f2p + mp_hm_f2p );
467
468 // muon polarization -1
469 EvtComplex swaveangdist2 = AngularDist( 0, 0, -1, CosK, CosMu, chi );
470
471 // KK Spin-0 NR
472 EvtComplex mm_hS_NR = a_S_NR * swaveangdist2;
473 EvtComplex Amp_m_NR = P_NR * X_KK_0 * X_NR_Jpsi_1 * f_BMF_NR * mm_hS_NR;
474
475 // KK Spin-0
476 EvtComplex mm_h_f0 = a_f0 * swaveangdist2;
477 EvtComplex Amp_m_f0 = F_f0 * X_KK_0 * X_f0_Jpsi_1 * f_BMF_f0 * mm_h_f0;
478
479 // KK Spin-1
480 EvtComplex mm_h0_phi = H0_phi * AngularDist( 1, 0, -1, CosK, CosMu, chi );
481 EvtComplex mm_hp_phi = Hp_phi * AngularDist( 1, +1, -1, CosK, CosMu, chi );
482 EvtComplex mm_hm_phi = Hm_phi * AngularDist( 1, -1, -1, CosK, CosMu, chi );
483 EvtComplex Amp_m_phi = BW_phi * X_KK_1 * X_phi_Jpsi_0 * f_BMF_phi *
484 ( mm_h0_phi + mm_hp_phi + mm_hm_phi );
485
486 // KK Spin-2
487 EvtComplex mm_h0_f2p = H0_f2p * AngularDist( 2, 0, -1, CosK, CosMu, chi );
488 EvtComplex mm_hp_f2p = Hp_f2p * AngularDist( 2, 1, -1, CosK, CosMu, chi );
489 EvtComplex mm_hm_f2p = Hm_f2p * AngularDist( 2, -1, -1, CosK, CosMu, chi );
490 EvtComplex Amp_m_f2p = BW_f2p * X_KK_2 * X_f2p_Jpsi_1 * f_BMF_f2p *
491 ( mm_h0_f2p + mm_hp_f2p + mm_hm_f2p );
492
493 // Total amplitudes
494 EvtComplex Amp_tot_plus = f_PHSP *
495 ( Amp_p_NR + Amp_p_f0 + Amp_p_phi + Amp_p_f2p );
496 EvtComplex Amp_tot_minus = f_PHSP *
497 ( Amp_m_NR + Amp_m_f0 + Amp_m_phi + Amp_m_f2p );
498
499 vertex( 0, 0, 0.0 );
500 vertex( 0, 1, Amp_tot_plus );
501 vertex( 1, 0, Amp_tot_minus );
502 vertex( 1, 1, 0.0 );
503}
504
505// Rho function
506EvtComplex EvtBsMuMuKK::GetRho( const double m0, const double m ) const
507{
508 double rho_sq = 1.0 - ( 4.0 * m0 * m0 / ( m * m ) );
509 EvtComplex rho;
510
511 if ( rho_sq > 0.0 ) {
512 rho = EvtComplex( sqrt( rho_sq ), 0.0 );
513 } else {
514 rho = EvtComplex( 0.0, sqrt( -rho_sq ) );
515 }
516
517 return rho;
518}
519
520// Flatte function
521EvtComplex EvtBsMuMuKK::Flatte( const double m0, const double m ) const
522{
523 double gpipi = 0.167;
524 double gKK = 3.05 * gpipi;
525
526 EvtComplex term1 = ( 2.0 * GetRho( m_Mpip, m ) + GetRho( m_Mpi0, m ) ) / 3.0;
527 EvtComplex term2 = ( GetRho( m_MKp, m ) + GetRho( m_MK0, m ) ) / 2.0;
528
529 EvtComplex w = gpipi * term1 + gKK * term2;
530
531 EvtComplex Flatte_0 = 1.0 / ( m0 * m0 - m * m - I * m0 * w );
532
533 return Flatte_0;
534}
535
536// Breit-Wigner function
537EvtComplex EvtBsMuMuKK::Breit_Wigner( const double Gamma0, const double m0,
538 const double m, const int J,
539 const double q0, const double q ) const
540{
541 double X_J_q0_sq = pow( X_J( J, q0, 0 ), 2 );
542 double X_J_q_sq = pow( X_J( J, q, 0 ), 2 );
543
544 double Gamma = Gamma0 * pow( q / q0, 2 * J + 1 ) * ( m0 / m ) *
545 ( X_J_q_sq / X_J_q0_sq );
546
547 return 1.0 / ( m0 * m0 - m * m - I * m0 * Gamma );
548}
549
550// Integral
551double EvtBsMuMuKK::Integral( const double Gamma0, const double m0, const int JR,
552 const int JB, const double q0, const double M_KK_ll,
553 const double M_KK_ul, const int fcntype ) const
554{
555 const int bins = 1000;
556 const double bin_width = ( M_KK_ul - M_KK_ll ) / static_cast<double>( bins );
557 const double sumMKpKm2 = pow( m_MKp + m_MKm, 2 );
558 const double diffMKpKm2 = pow( m_MKp - m_MKm, 2 );
559 const double MBs2 = pow( m_MBs, 2 );
560
561 EvtComplex integral( 0.0, 0.0 );
562
563 for ( int i = 0; i < bins; i++ ) {
564 const double M_KK_i = M_KK_ll + static_cast<double>( i ) * bin_width;
565 const double M_KK_f = M_KK_ll + static_cast<double>( i + 1 ) * bin_width;
566 const double M_KK_i_sq = M_KK_i * M_KK_i;
567 const double M_KK_f_sq = M_KK_f * M_KK_f;
568
569 const double p3Kp_KK_CMS_i = sqrt( ( M_KK_i_sq - sumMKpKm2 ) *
570 ( M_KK_i_sq - diffMKpKm2 ) ) /
571 ( 2.0 * M_KK_i );
572 const double p3Kp_KK_CMS_f = sqrt( ( M_KK_f_sq - sumMKpKm2 ) *
573 ( M_KK_f_sq - diffMKpKm2 ) ) /
574 ( 2.0 * M_KK_f );
575
576 const double p3Jpsi_Bs_CMS_i =
577 sqrt( ( MBs2 - pow( M_KK_i + m_MJpsi, 2 ) ) *
578 ( MBs2 - pow( M_KK_i - m_MJpsi, 2 ) ) ) /
579 ( 2.0 * m_MBs );
580 const double p3Jpsi_Bs_CMS_f =
581 sqrt( ( MBs2 - pow( M_KK_f + m_MJpsi, 2 ) ) *
582 ( MBs2 - pow( M_KK_f - m_MJpsi, 2 ) ) ) /
583 ( 2.0 * m_MBs );
584
585 const double f_PHSP_i = sqrt( p3Kp_KK_CMS_i * p3Jpsi_Bs_CMS_i );
586 const double f_PHSP_f = sqrt( p3Kp_KK_CMS_f * p3Jpsi_Bs_CMS_f );
587
588 const double f_MBF_KK_i = pow( p3Kp_KK_CMS_i, JR );
589 const double f_MBF_KK_f = pow( p3Kp_KK_CMS_f, JR );
590
591 const double f_MBF_Bs_i = pow( p3Jpsi_Bs_CMS_i, JB );
592 const double f_MBF_Bs_f = pow( p3Jpsi_Bs_CMS_f, JB );
593
594 const double X_JR_i = X_J( JR, p3Kp_KK_CMS_i, 0 );
595 const double X_JR_f = X_J( JR, p3Kp_KK_CMS_f, 0 );
596
597 const double X_JB_i = X_J( JB, p3Jpsi_Bs_CMS_i, 1 );
598 const double X_JB_f = X_J( JB, p3Jpsi_Bs_CMS_f, 1 );
599
600 EvtComplex fcn_i( 1.0, 0.0 ), fcn_f( 1.0, 0.0 );
601
602 if ( fcntype == 1 ) {
603 fcn_i = Flatte( m0, M_KK_i );
604 fcn_f = Flatte( m0, M_KK_f );
605
606 } else if ( fcntype == 2 ) {
607 fcn_i = Breit_Wigner( Gamma0, m0, M_KK_i, JR, q0, p3Kp_KK_CMS_i );
608 fcn_f = Breit_Wigner( Gamma0, m0, M_KK_f, JR, q0, p3Kp_KK_CMS_f );
609 }
610
611 const EvtComplex a_i = f_PHSP_i * f_MBF_KK_i * f_MBF_Bs_i * X_JR_i *
612 X_JB_i * fcn_i;
613 const EvtComplex a_st_i = conj( a_i );
614 const EvtComplex a_f = f_PHSP_f * f_MBF_KK_f * f_MBF_Bs_f * X_JR_f *
615 X_JB_f * fcn_f;
616 const EvtComplex a_st_f = conj( a_f );
617
618 integral += 0.5 * bin_width * ( a_i * a_st_i + a_f * a_st_f );
619 }
620
621 return sqrt( abs2( integral ) );
622}
623
624// Blatt-Weisskopf barrier factors
625double EvtBsMuMuKK::X_J( const int J, const double q, const int isB ) const
626{
627 double r_BW = 1.0;
628
629 if ( isB == 0 ) {
630 r_BW = 1.5;
631 } else if ( isB == 1 ) {
632 r_BW = 5.0;
633 }
634
635 double zsq = pow( r_BW * q, 2 );
636
637 double X_J( 1.0 );
638
639 if ( J == 1 ) {
640 X_J = sqrt( 1.0 / ( 1.0 + zsq ) );
641 } else if ( J == 2 ) {
642 X_J = sqrt( 1.0 / ( zsq * zsq + 3.0 * zsq + 9.0 ) );
643 }
644
645 return X_J;
646}
647
648// EvtGen d matrix: Input is 2J instead of J etc
649double EvtBsMuMuKK::Wignerd( const int J, const int l, const int alpha,
650 const double theta ) const
651{
652 return EvtdFunction::d( 2 * J, 2 * l, 2 * alpha, theta );
653}
654
655// J spin of KK, l spin proj of J/psi, alpha dimuon spin
656EvtComplex EvtBsMuMuKK::AngularDist( const int J, const int l, const int alpha,
657 const double cK, const double cL,
658 const double chi ) const
659{
660 double thetaL = acos( cL );
661 double thetaK = acos( cK );
662
663 EvtComplex out = 0.5 * sqrt( ( 2 * J + 1 ) / pi ) *
664 exp( EvtComplex( 0, -l * chi ) );
665
666 out *= Wignerd( 1, l, alpha, thetaL ) * Wignerd( J, -l, 0, thetaK );
667
668 return out;
669}
670
671// Time-dependent amplitude calculation
672EvtComplex EvtBsMuMuKK::AmpTime( const int q, const EvtComplex& gplus,
673 const EvtComplex& gminus, const double delta,
674 const double lambda_abs, const double Amp,
675 const double phis, const int eta ) const
676{
677 EvtComplex amp_time = Amp * EvtComplex( cos( -delta ), sin( -delta ) );
678 double qphis = q * phis;
679 amp_time *= ( gplus + eta * pow( lambda_abs, -1.0 * q ) *
680 EvtComplex( cos( qphis ), sin( qphis ) ) * gminus );
681
682 if ( q == 1 ) {
683 amp_time *= eta;
684 }
685
686 return amp_time;
687}
const float pi
const EvtComplex I
const double sq2
EvtComplex conj(const EvtComplex &c)
double abs2(const EvtComplex &c)
EvtComplex exp(const EvtComplex &c)
double EvtDecayAngleChi(const EvtVector4R &, const EvtVector4R &, const EvtVector4R &, const EvtVector4R &, const EvtVector4R &)
Definition EvtKine.cpp:48
double EvtDecayAngle(const EvtVector4R &, const EvtVector4R &, const EvtVector4R &)
Definition EvtKine.cpp:32
EvtRaritaSchwinger boostTo(const EvtRaritaSchwinger &rs, const EvtVector4R p4)
double m_phis_phi_0
double m_phis_f2p_perp
double m_kin_middle
EvtDecayBase * clone() const override
double m_delta_phi_par
double m_p30Kp_f2p_CMS
double m_phis_phi_perp
double m_delta_S_NR
void init() override
double m_int_const_NR
double m_int_BW_phi
double m_p30Kp_phi_CMS
double m_delta_f2p_perp
double m_p30Jpsi_ll_CMS
double m_Mphi
double m_lambda_f0_abs
double m_A_f2p_perp
double m_f_f2p_0
double m_lambda_phi_0_abs
double m_f_phi_0
double m_A_f0
double Wignerd(int J, int l, int alpha, double theta) const
double m_Mpi0
double m_A_f2p_0
EvtComplex AmpTime(const int q, const EvtComplex &gplus, const EvtComplex &gminus, const double delta, const double lambda_abs, const double Amp, const double phis, const int eta) const
double m_A_phi_par
double m_Gamma0phi
double m_MJpsi
std::string getName() const override
double m_int_Flatte_f0
EvtComplex Breit_Wigner(const double Gamma0, const double m0, const double m, const int J, const double q0, const double q) const
double m_delta_phi_perp
double m_lambda_f2p_perp_abs
void decay(EvtParticle *p) override
double m_Mf2p
double m_deltaGamma
double m_delta_f2p_par
double m_A_phi_perp
EvtComplex Flatte(const double m0, const double m) const
double m_lambda_phi_perp_abs
double m_int_BW_f2p
double m_Gamma0f2p
double m_delta_f0
double m_kin_upper_limit
double m_phis_f2p_par
double m_delta_phi_0
double m_f_phi_perp
double m_phis_f0
double X_J(const int J, const double q, const int isB) const
double m_A_phi_0
double m_phis_f2p_0
double m_delta_f2p_0
EvtComplex AngularDist(int J, int l, int alpha, double cK, double cL, double chi) const
double m_A_f2p_par
double m_p30Jpsi_f2p_CMS
double m_p30Jpsi_phi_CMS
double m_kin_lower_limit
double m_ctau
double m_f_f0
void initProbMax() override
double m_p30Kp_ll_CMS
double m_lambda_f2p_par_abs
double m_deltaMs
EvtComplex GetRho(const double m0, const double m) const
double m_f_f2p_perp
double m_f_f2p
double m_A_S_NR
double Integral(const double Gamma0, const double m0, const int JR, const int JB, const double q0, const double M_KK_ll, const double M_KK_ul, const int fcntype) const
double m_p30Kp_mid_CMS
double m_f_S_NR
double m_Mpip
double m_lambda_phi_par_abs
double m_phis_S_NR
double m_f_phi
double m_phis_phi_par
double m_lambda_S_NR_abs
double m_lambda_f2p_0_abs
double m_Gamma
double m_p30Jpsi_mid_CMS
static EvtCPUtil * getInstance()
Definition EvtCPUtil.cpp:42
void OtherB(EvtParticle *p, double &t, EvtId &otherb)
static const double c
Definition EvtConst.hh:30
static const double pi
Definition EvtConst.hh:26
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 double PhaseSpace(int ndaug, double mass[30], EvtVector4R p4[30], double mp)
Definition EvtId.hh:27
static double getWidth(EvtId i)
Definition EvtPDL.cpp:346
static double getMass(EvtId i)
Definition EvtPDL.cpp:311
static double getMeanMass(EvtId i)
Definition EvtPDL.cpp:306
static EvtId getId(const std::string &name)
Definition EvtPDL.cpp:283
virtual void init(EvtId part_n, const EvtVector4R &p4)=0
EvtId getId() const
void setAttribute(std::string attName, int attValue)
void setLifetime(double tau)
EvtParticle * getDaug(const int i)
EvtParticle * getParent() const
void makeDaughters(size_t ndaug, const EvtId *id)
static double Flat()
Definition EvtRandom.cpp:95
double mass() const
double mass2() const
static double d(int j, int m1, int m2, double theta)