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
EvtDDalitz.cpp
Go to the documentation of this file.
1
2/***********************************************************************
3* Copyright 1998-2023 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 <algorithm>
34#include <stdlib.h>
35#include <string>
36#include <utility>
37#include <vector>
38
39using std::endl;
40
41std::string EvtDDalitz::getName() const
42{
43 return "D_DALITZ";
44}
45
47{
48 return new EvtDDalitz;
49}
50
51bool isNeutralKaon( const EvtId& theId )
52{
53 // See if the particle id matches that for a neutral kaon
54 bool result( false );
55
56 static const EvtId K0 = EvtPDL::getId( "K0" );
57 static const EvtId KB = EvtPDL::getId( "anti-K0" );
58 static const EvtId KL = EvtPDL::getId( "K_L0" );
59 static const EvtId KS = EvtPDL::getId( "K_S0" );
60
61 // Compare EvtId integers, which are unique for each particle type,
62 // corresponding to the order particles appear in the "evt.pdl" table.
63 // Aliased particles will have the same ids (but different "alias" values)
64 if ( theId == KB || theId == K0 || theId == KL || theId == KS ) {
65 result = true;
66 }
67
68 return result;
69}
70
71bool compareIds( const std::pair<EvtId, int>& left,
72 const std::pair<EvtId, int>& right )
73{
74 // Compare id numbers to achieve the ordering KB/K0/KS/KL, KM, PIM, PI0, PIP, KP, i.e.
75 // neutral kaon first, then normal PDG id ordering for the other particles.
76
77 // The current 12 decay modes do not use two or more neutral kaons. If in the future
78 // such modes are added, the ordering will be KM, KB, PIM, PI0, KL, PIP, KS, K0, KP
79
80 bool result( false );
81
82 if ( isNeutralKaon( left.first ) == true &&
83 isNeutralKaon( right.first ) == false ) {
84 // Left is a neutral kaon, right is not
85 result = true;
86
87 } else if ( isNeutralKaon( left.first ) == false &&
88 isNeutralKaon( right.first ) == true ) {
89 // Right is a neutral kaon, left is not
90 result = false;
91
92 } else {
93 // Just compare PDG integers to achieve ascending order
94 int leftPDGid = EvtPDL::getStdHep( left.first );
95 int rightPDGid = EvtPDL::getStdHep( right.first );
96
97 if ( leftPDGid < rightPDGid ) {
98 result = true;
99 }
100 }
101
102 return result;
103}
104
106{
107 static const EvtId DM = EvtPDL::getId( "D-" );
108 static const EvtId DP = EvtPDL::getId( "D+" );
109 static const EvtId D0 = EvtPDL::getId( "D0" );
110 static const EvtId D0B = EvtPDL::getId( "anti-D0" );
111 static const EvtId DSP = EvtPDL::getId( "D_s+" );
112 static const EvtId DSM = EvtPDL::getId( "D_s-" );
113 static const EvtId KM = EvtPDL::getId( "K-" );
114 static const EvtId KP = EvtPDL::getId( "K+" );
115
116 static const EvtId PIM = EvtPDL::getId( "pi-" );
117 static const EvtId PIP = EvtPDL::getId( "pi+" );
118 static const EvtId PI0 = EvtPDL::getId( "pi0" );
119
120 static const double MPI = EvtPDL::getMeanMass( PI0 );
121 static const double MKP = EvtPDL::getMeanMass( KP );
122
123 // check that there are 0 arguments and 3 daughters
124 checkNArg( 0 );
125 checkNDaug( 3 );
126
128
132
133 EvtId parnum = getParentId();
134
135 /*
136 * To decide which decay we have, we take the list of daughters (or charge
137 * conjugate of daughters for D-, D0B or Ds-), sort these in the order
138 * KB/K0/KS/KL, KM, PIM, PI0, PIP, KP, keeping track which daughter is which,
139 * and at the end have a single if statement picking up the decay and assigning
140 * the correct order for the daughters (same condition used for charm and anti-charm).
141 * If we have two or more neutral kaons in the daughter list, then the compareIds()
142 * ordering will simply follow ascending PDG ids: KM, KB, PIM, PI0, KL, PIP, KS, K0, KP
143 */
144
145 std::vector<std::pair<EvtId, int>> daughters;
146 if ( parnum == D0 || parnum == DP || parnum == DSP ) {
147 for ( int i = 0; i < 3; ++i ) {
148 daughters.push_back( std::make_pair( getDaug( i ), i ) );
149 }
150 } else {
151 for ( int i = 0; i < 3; ++i ) {
152 daughters.push_back(
153 std::make_pair( EvtPDL::chargeConj( getDaug( i ) ), i ) );
154 }
155 }
156
157 // Sort daughters, they will end up in the order KB/K0/KS/KL, KM, PIM, PI0, PIP, KP
158 // for the current 12 decay modes
159 std::sort( daughters.begin(), daughters.end(), compareIds );
160
161 /*
162 std::cout << "DDALITZ sorting: ";
163 for (int i=0; i<3; ++i ) {
164 std::cout << EvtPDL::getStdHep(daughters[i].first) << " ";
165 }
166 std::cout << std::endl;
167*/
168
169 m_flag = 0;
170
171 // D0 or anti-D0 modes. We only need to check the particle modes, since anti-particle
172 // modes have their ordered daughter ids charged-conjugated above
173
174 if ( parnum == D0 || parnum == D0B ) {
175 // Look for D0 to K- pi+ pi0
176 if ( daughters[0].first == KM && daughters[1].first == PI0 &&
177 daughters[2].first == PIP ) {
178 m_flag = 4;
179 m_d1 = daughters[0].second;
180 m_d2 = daughters[2].second;
181 m_d3 = daughters[1].second;
182 }
183
184 // Look for D0 to KB pi- pi+
185 if ( isNeutralKaon( daughters[0].first ) == true &&
186 daughters[1].first == PIM && daughters[2].first == PIP ) {
187 m_flag = 3;
188 m_d1 = daughters[0].second;
189 m_d2 = daughters[1].second;
190 m_d3 = daughters[2].second;
191 }
192
193 // Look for D0 to KB K+ K-
194 if ( isNeutralKaon( daughters[0].first ) == true &&
195 daughters[1].first == KM && daughters[2].first == KP ) {
196 m_flag = 5;
197 m_d1 = daughters[0].second;
198 m_d2 = daughters[2].second;
199 m_d3 = daughters[1].second;
200 }
201
202 // Look for D0 to pi- pi+ pi0
203 if ( daughters[0].first == PIM && daughters[1].first == PI0 &&
204 daughters[2].first == PIP ) {
205 m_flag = 12;
206 m_d1 = daughters[0].second;
207 m_d2 = daughters[2].second;
208 m_d3 = daughters[1].second;
209 }
210 }
211
212 // D+ (or D-) modes
213 if ( parnum == DP || parnum == DM ) {
214 // Look for D+ to KB pi+ pi0
215 if ( isNeutralKaon( daughters[0].first ) == true &&
216 daughters[1].first == PI0 && daughters[2].first == PIP ) {
217 m_flag = 2;
218 m_d1 = daughters[0].second;
219 m_d2 = daughters[2].second;
220 m_d3 = daughters[1].second;
221 }
222
223 // Look for D+ to K- pi+ pi+
224 if ( daughters[0].first == KM && daughters[1].first == PIP &&
225 daughters[2].first == PIP ) {
226 m_flag = 1;
227 m_d1 = daughters[0].second;
228 m_d2 = daughters[1].second;
229 m_d3 = daughters[2].second;
230 }
231
232 // Look for D+ to K- K+ pi+
233 if ( daughters[0].first == KM && daughters[1].first == PIP &&
234 daughters[2].first == KP ) {
235 m_flag = 7;
236 m_d1 = daughters[0].second;
237 m_d2 = daughters[2].second;
238 m_d3 = daughters[1].second;
239 }
240
241 // Look for D+ to pi- pi+ K+
242 if ( daughters[0].first == PIM && daughters[1].first == PIP &&
243 daughters[2].first == KP ) {
244 m_flag = 8;
245 m_d1 = daughters[0].second;
246 m_d2 = daughters[1].second;
247 m_d3 = daughters[2].second;
248 }
249
250 // Look for D+ to pi- pi+ pi+
251 if ( daughters[0].first == PIM && daughters[1].first == PIP &&
252 daughters[2].first == PIP ) {
253 m_flag = 10;
254 m_d1 = daughters[0].second;
255 m_d2 = daughters[1].second;
256 m_d3 = daughters[2].second;
257 }
258 }
259
260 // Ds+ (or Ds-) modes
261 if ( parnum == DSP || parnum == DSM ) {
262 // Look for Ds+ to K- K+ pi+
263 if ( daughters[0].first == KM && daughters[1].first == PIP &&
264 daughters[2].first == KP ) {
265 m_flag = 6;
266 m_d1 = daughters[0].second;
267 m_d2 = daughters[2].second;
268 m_d3 = daughters[1].second;
269 }
270
271 // Look for Ds+ to pi- pi+ K+
272 if ( daughters[0].first == PIM && daughters[1].first == PIP &&
273 daughters[2].first == KP ) {
274 m_flag = 9;
275 m_d1 = daughters[0].second;
276 m_d2 = daughters[1].second;
277 m_d3 = daughters[2].second;
278 }
279
280 // Look for Ds+ to pi- pi+ pi+
281 if ( daughters[0].first == PIM && daughters[1].first == PIP &&
282 daughters[2].first == PIP ) {
283 m_flag = 11;
284 m_d1 = daughters[0].second;
285 m_d2 = daughters[1].second;
286 m_d3 = daughters[2].second;
287 }
288 }
289
290 if ( m_flag == 6 ) {
291 m_kkpi_params.push_back( EvtFlatteParam( MPI, MPI, 0.406 ) );
292 m_kkpi_params.push_back( EvtFlatteParam( MKP, MKP, 0.800 ) );
293 }
294
295 if ( m_flag == 0 ) {
296 EvtGenReport( EVTGEN_ERROR, "EvtGen" )
297 << "EvtDDaltiz: Invalid mode." << endl;
298 assert( 0 );
299 }
300
301 /*
302 EvtGenReport(EVTGEN_INFO,"EvtGen") << "DDALITZ ordering for " << parnum.getName()
303 << " with mode = " << m_flag << ": "
304 << getDaug(m_d1).getName() << " "
305 << getDaug(m_d2).getName() << " "
306 << getDaug(m_d3).getName() << std::endl;
307 */
308}
309
311{
312 // probmax different for different modes!
313
314 if ( m_flag == 1 ) {
315 setProbMax( 2500.0 );
316 }
317 if ( m_flag == 2 ) {
318 setProbMax( 150.0 );
319 }
320 if ( m_flag == 3 ) {
321 setProbMax( 3000.0 );
322 }
323 if ( m_flag == 4 ) {
324 setProbMax( 600.0 );
325 }
326 if ( m_flag == 5 ) {
327 setProbMax( 2500000.0 );
328 }
329 if ( m_flag == 6 ) {
330 setProbMax( 45000.0 );
331 }
332 if ( m_flag == 7 ) {
333 setProbMax( 35000.0 );
334 }
335 if ( m_flag == 8 ) {
336 setProbMax( 2500.0 );
337 }
338 if ( m_flag == 9 ) {
339 setProbMax( 1700.0 );
340 }
341 if ( m_flag == 10 ) {
342 setProbMax( 1300.0 );
343 }
344 if ( m_flag == 11 ) {
345 setProbMax( 2200.0 );
346 }
347 if ( m_flag == 12 ) {
348 setProbMax( 1000.0 );
349 }
350}
351
353{
354 static const EvtId BP = EvtPDL::getId( "B+" );
355 static const EvtId BM = EvtPDL::getId( "B-" );
356 static const EvtId B0 = EvtPDL::getId( "B0" );
357 static const EvtId B0B = EvtPDL::getId( "anti-B0" );
358
359 static const EvtId D0 = EvtPDL::getId( "D0" );
360
361 double oneby2 = 0.707106782;
362
363 bool isBToDK = false;
364 if ( p->getParent() ) {
365 EvtId parId = p->getParent()->getId();
366 if ( ( BP == parId ) || ( BM == parId ) || ( B0 == parId ) ||
367 ( B0B == parId ) )
369 .getDecayFunc( p->getParent() )
370 ->getName() == "BTODDALITZCPK" )
371 isBToDK = true;
372 }
373
374 //same structure for all of these decays
375
377 EvtVector4R moms1 = p->getDaug( m_d1 )->getP4();
378 EvtVector4R moms2 = p->getDaug( m_d2 )->getP4();
379 EvtVector4R moms3 = p->getDaug( m_d3 )->getP4();
380
381 EvtVector4R p4_p;
382 p4_p.set( p->mass(), 0.0, 0.0, 0.0 );
383
384 EvtComplex amp( 1.0, 0.0 );
385
386 //now determine which D and which decay
387
388 //data from Anjos et al, Phys.Rev.D 1993, v.48,num.1,p.56 (E691 resuls)
389 //for D+ -> K- pi+ pi+, and from Adler et al, Phys.Lett. B196 (1987), 107
390 //(Mark III results) for D+ -> K0bar pi+ pi0.
391 //CLEO results for D0->k-pi+pi0
392
393 if ( m_flag == 1 ) {
394 // D+ -> K- pi+ pi+ decay, or charge conjugate
395
396 // //Anjos etal e691 - Phys Rev D48, 56 (1993)
397 // EvtResonance DplusRes11(p4_p,moms1,moms2,0.78,-60.0,0.0498,0.89610,1);
398 // EvtResonance DplusRes12(p4_p,moms3,moms1,0.78,-60.0,0.0498,0.89610,1);//K*(892)
399
400 // EvtResonance DplusRes21(p4_p,moms1,moms2,0.53,132.0,0.287,1.429,0);
401 // EvtResonance DplusRes22(p4_p,moms3,moms1,0.53,132.0,0.287,1.429,0);//K*(1430)
402
403 // EvtResonance DplusRes31(p4_p,moms1,moms2,0.47,-51.0,0.323,1.714,1);
404 // EvtResonance DplusRes32(p4_p,moms3,moms1,0.47,-51.0,0.323,1.714,1);//K*(1680)
405
406 // amp = amp + oneby2*(-DplusRes11.resAmpl()+DplusRes12.resAmpl()) + oneby2*(DplusRes21.resAmpl() + DplusRes22.resAmpl()) + oneby2*(-DplusRes31.resAmpl()+ DplusRes32.resAmpl());
407
408 // EvtResonance DplusRes11(p4_p,moms1,moms2,amp,phase,width,mass,L);
409 //CLEO-c p15,arxiv:0802.4214v2
410 EvtResonance2 DplusRes11( p4_p, moms1, moms2, 1.0, 0.0, 0.0503, 0.896,
411 1, true );
412 EvtResonance2 DplusRes12( p4_p, moms3, moms1, 1.0, 0.0, 0.0503, 0.896,
413 1, true ); //K*(892)
414 EvtResonance2 DplusRes21( p4_p, moms1, moms2, 3.0, 49.7 - 180.0, 0.164,
415 1.463, 0 );
416 EvtResonance2 DplusRes22( p4_p, moms3, moms1, 3.0, 49.7 - 180.0, 0.164,
417 1.463, 0 ); //K*(1430)
418 EvtResonance2 DplusRes31( p4_p, moms1, moms2, 0.96, -29.9 + 180.0,
419 0.109, 1.4324, 2, true );
420 EvtResonance2 DplusRes32( p4_p, moms3, moms1, 0.96, -29.9 + 180.0,
421 0.109, 1.4324, 2, true ); // K*_2(1430)
422 EvtResonance2 DplusRes41( p4_p, moms1, moms2, 6.5, 29.0, 0.323, 1.717,
423 1, true );
424 EvtResonance2 DplusRes42( p4_p, moms3, moms1, 6.5, 29.0, 0.323, 1.717,
425 1, true ); //K*(1680)
426 EvtResonance2 DplusRes51( p4_p, moms1, moms2, 5.01, -163.7 + 180.0,
427 0.470, 0.809, 0 );
428 EvtResonance2 DplusRes52( p4_p, moms3, moms1, 5.01, -163.7 + 180.0,
429 0.470, 0.809, 0 ); //kappa(800)
430 double pi180inv = 1.0 / EvtConst::radToDegrees;
431 amp = EvtComplex( 7.4 * cos( ( -18.4 + 180.0 ) * pi180inv ),
432 7.4 * sin( ( -18.4 + 180.0 ) * pi180inv ) ) +
433 oneby2 * ( -DplusRes11.resAmpl() + DplusRes12.resAmpl() ) +
434 oneby2 * ( DplusRes21.resAmpl() + DplusRes22.resAmpl() ) +
435 oneby2 * ( DplusRes31.resAmpl() + DplusRes32.resAmpl() ) +
436 oneby2 * ( -DplusRes41.resAmpl() + DplusRes42.resAmpl() ) +
437 oneby2 * ( DplusRes51.resAmpl() + DplusRes52.resAmpl() );
438 //amp = amp+oneby2*(-DplusRes11.resAmpl()+DplusRes12.resAmpl());
439 }
440
441 if ( m_flag == 2 ) {
442 //have a D+ -> K0bar pi+ pi0 decay
443 //adler etal MarkIII - Phys Lett B196, 107 (1987)
444 // Results in this paper:
445 // Kbar rho+ FitFraction = 68+/-8+/-12 Phase 0
446 // Kbar* pi+ 19+/-6+/-6 43+/-23
447 // nonres 13+/-7+/-8 250+/-19
448 // These numbers below seem not to be exactly the same
449 // the phases are equiv to -106=254 and 41
450 //
451 EvtResonance DplusKpipi0Res1( p4_p, moms2, moms3, 1.00, 0.00, 0.1512,
452 0.7699, 1 ); //rho+
453 EvtResonance DplusKpipi0Res2( p4_p, moms3, moms1, 0.8695, 0.7191,
454 0.0498, 0.89159, 1 ); //K*0
455
456 amp = 0.9522 * EvtComplex( cos( -1.8565 ), sin( -1.8565 ) ) +
457 1.00 * DplusKpipi0Res1.relBrWig( 0 ) +
458 0.8695 * EvtComplex( cos( 0.7191 ), sin( 0.7191 ) ) *
459 DplusKpipi0Res2.relBrWig( 1 );
460 }
461
462 if ( m_flag == 3 ) {
463 // D0 -> K0bar pi- pi+ & CC
464 // If it does not come from a B->DK, decay it as D0 or D0bar separately
465 // if p4_p is D0, moms1 is K0, moms2 is pi-, moms3 is pi+
466 // if p4_p is D0bar, moms1 is K0, moms2 is pi+, moms3 is pi-
467
468 if ( isBToDK ) {
469 // Gamma angle in rad.
470 const double gamma = EvtDecayTable::getInstance()
471 .getDecayFunc( p->getParent() )
472 ->getArg( 0 );
473 // Strong phase in rad.
474 const double delta = EvtDecayTable::getInstance()
475 .getDecayFunc( p->getParent() )
476 ->getArg( 1 );
477 // Ratio between B->D0K and B->D0barK
478 const double A = EvtDecayTable::getInstance()
479 .getDecayFunc( p->getParent() )
480 ->getArg( 2 );
481
482 EvtComplex Factor( fabs( A ) * cos( delta ),
483 fabs( A ) * sin( delta ) );
484
485 if ( ( p->getParent()->getId() == BP ) ||
486 ( p->getParent()->getId() == B0 ) ) {
487 // the ratio D/Dbar
488 Factor = Factor * EvtComplex( cos( gamma ), sin( gamma ) );
489 if ( p->getId() == D0 ) {
490 // the flavor of the particle has no meaning. But we need
491 // it to know which daughter is pi+ or pi-
492 // M( B+ or B0 ) = f(Dbar) + factor * f(D)
493 // f(Dbar) = amplDtoK0PiPi(pD, K0, pi+, pi-)
494 // f(D) = amplDtoK0PiPi(pD, K0, pi-, pi+)
495 // Then ...
496 amp = amplDtoK0PiPi( p4_p, moms1, moms3, moms2 ) +
497 Factor * amplDtoK0PiPi( p4_p, moms1, moms2, moms3 );
498 } else {
499 amp = amplDtoK0PiPi( p4_p, moms1, moms2, moms3 ) +
500 Factor * amplDtoK0PiPi( p4_p, moms1, moms3, moms2 );
501 }
502 } else if ( ( p->getParent()->getId() == BM ) ||
503 ( p->getParent()->getId() == B0B ) ) {
504 Factor = Factor * EvtComplex( cos( gamma ), -sin( gamma ) );
505 // here M( B- or B0bar ) = f(D) + factor * f(Dbar) then ...
506 if ( p->getId() == D0 ) {
507 amp = amplDtoK0PiPi( p4_p, moms1, moms2, moms3 ) +
508 Factor * amplDtoK0PiPi( p4_p, moms1, moms3, moms2 );
509 } else {
510 amp = amplDtoK0PiPi( p4_p, moms1, moms3, moms2 ) +
511 Factor * amplDtoK0PiPi( p4_p, moms1, moms2, moms3 );
512 }
513 }
514 } else {
515 amp = amplDtoK0PiPi( p4_p, moms1, moms2, moms3 );
516 }
517 }
518
519 if ( m_flag == 4 ) {
520 // D0 to K- pi+ pi0
521 EvtResonance2 DKpipi0Res1( p4_p, moms2, moms3, 1.0, 0.0, 0.1507, 0.770,
522 1 ); //rho
523 EvtResonance2 DKpipi0Res2( p4_p, moms1, moms2, 0.39, -0.2, 0.0505,
524 0.8961, 1 ); //k*0
525 EvtResonance2 DKpipi0Res3( p4_p, moms1, moms3, 0.44, 163.0, 0.050,
526 0.8915, 1 ); //k*-
527
528 EvtResonance2 DKpipi0Res4( p4_p, moms1, moms3, 0.77, 55.5, 0.294, 1.412,
529 0 ); //k01430-
530 EvtResonance2 DKpipi0Res5( p4_p, moms1, moms2, 0.85, 166.0, 0.294,
531 1.412, 0 ); //k01430bar
532 EvtResonance2 DKpipi0Res6( p4_p, moms2, moms3, 2.5, 171.0, 0.240, 1.700,
533 1 ); //rho1700
534 EvtResonance2 DKpipi0Res7( p4_p, moms1, moms3, 2.5, 103.0, 0.322, 1.717,
535 1 ); //K*1680-
536
537 double pi180inv = 1.0 / EvtConst::radToDegrees;
538
539 amp = EvtComplex( 1.75 * cos( 31.2 * pi180inv ),
540 1.75 * sin( 31.2 * pi180inv ) ) +
541 DKpipi0Res1.resAmpl() + DKpipi0Res2.resAmpl() +
542 DKpipi0Res3.resAmpl() + DKpipi0Res4.resAmpl() +
543 DKpipi0Res5.resAmpl() + DKpipi0Res6.resAmpl() +
544 DKpipi0Res7.resAmpl();
545 }
546
547 if ( m_flag == 5 ) {
548 // D0 -> K0bar K+ K- & CC
549 // If it does not come from a B->DK, decay it as D0 or D0bar separately
550 // if p4_p is D0, moms1 is K0, moms2 is pi-, moms3 is pi+
551 // if p4_p is D0bar, moms1 is K0, moms2 is pi+, moms3 is pi-
552
553 if ( isBToDK ) {
554 // Gamma angle in rad.
555 double gamma = EvtDecayTable::getInstance()
556 .getDecayFunc( p->getParent() )
557 ->getArg( 0 );
558 // Strong phase in rad.
559 double delta = EvtDecayTable::getInstance()
560 .getDecayFunc( p->getParent() )
561 ->getArg( 1 );
562 // Ratio between B->D0K and B->D0barK
563 double A = EvtDecayTable::getInstance()
564 .getDecayFunc( p->getParent() )
565 ->getArg( 2 );
566
567 EvtComplex Factor( fabs( A ) * cos( delta ),
568 fabs( A ) * sin( delta ) );
569
570 if ( ( p->getParent()->getId() == BP ) ||
571 ( p->getParent()->getId() == B0 ) ) {
572 // the ratio D/Dbar
573 Factor = Factor * EvtComplex( cos( gamma ), sin( gamma ) );
574 if ( p->getId() == D0 ) {
575 // the flavor of the particle has no meaning. But we need
576 // it to know which daughter is pi+ or pi-
577 // M( B+ or B0 ) = f(Dbar) + factor * f(D)
578 // f(Dbar) = amplDtoK0PiPi(pD, K0, K+, K-)
579 // f(D) = amplDtoK0PiPi(pD, K0, K-, K+)
580 // Then ...
581 amp = amplDtoK0KK( p4_p, moms1, moms3, moms2 ) +
582 Factor * amplDtoK0KK( p4_p, moms1, moms2, moms3 );
583 } else {
584 amp = amplDtoK0KK( p4_p, moms1, moms2, moms3 ) +
585 Factor * amplDtoK0KK( p4_p, moms1, moms3, moms2 );
586 }
587 } else if ( ( p->getParent()->getId() == BM ) ||
588 ( p->getParent()->getId() == B0B ) ) {
589 Factor = Factor * EvtComplex( cos( gamma ), -sin( gamma ) );
590 // here M( B- or B0bar ) = f(D) + factor * f(Dbar) then ...
591 if ( p->getId() == D0 ) {
592 amp = amplDtoK0KK( p4_p, moms1, moms2, moms3 ) +
593 Factor * amplDtoK0KK( p4_p, moms1, moms3, moms2 );
594 } else {
595 amp = amplDtoK0KK( p4_p, moms1, moms3, moms2 ) +
596 Factor * amplDtoK0KK( p4_p, moms1, moms2, moms3 );
597 }
598 }
599 } else {
600 amp = amplDtoK0KK( p4_p, moms1, moms2, moms3 );
601 }
602 }
603
604 // Ds+ -> K- K+ pi+
605 //Babar, arxiv:1011.4190
606 if ( m_flag == 6 ) {
607 EvtResonance2 DsKKpiRes1( p4_p, moms3, moms1, 1.0, 0.0, 0.0455, 0.8944,
608 1, true ); // K*(892)
609 EvtResonance2 DsKKpiRes2( p4_p, moms3, moms1, 1.48, 138., 0.290, 1.414,
610 0 ); // K*_0(1430)
611 EvtFlatte DsKKpiRes3( p4_p, moms1, moms2, 5.07, 156., 0.965,
612 m_kkpi_params ); // f_0(980)
613 EvtResonance2 DsKKpiRes4( p4_p, moms1, moms2, 1.15, -10., 0.00426,
614 1.019455, 1, true ); // phi(1020)
615 EvtResonance2 DsKKpiRes5( p4_p, moms1, moms2, 1.28, 53., 0.265, 1.350,
616 0 ); // f_0(1370)
617 EvtResonance2 DsKKpiRes6( p4_p, moms1, moms2, 1.19, 87., 0.137, 1.724,
618 0 ); // f_0(1710)
619 amp = DsKKpiRes1.resAmpl() + DsKKpiRes2.resAmpl() + DsKKpiRes3.resAmpl() +
620 DsKKpiRes4.resAmpl() + DsKKpiRes5.resAmpl() + DsKKpiRes6.resAmpl();
621 }
622
623 //D+ -> K- K+ pi+
624 //CLEO PRD 78, 072003 (2008) Fit A
625 if ( m_flag == 7 ) {
626 EvtResonance2 DpKKpiRes1( p4_p, moms3, moms1, 1.0, 0.0, 0.0503, 0.8960,
627 1, true ); // K*(892)
628 EvtResonance2 DpKKpiRes2( p4_p, moms3, moms1, 3.7, 73.0, 0.290, 1.414,
629 0 ); // K*_0(1430)
630 EvtResonance2 DpKKpiRes3( p4_p, moms1, moms2, 1.189, -179.0 + 180.0,
631 0.00426, 1.019455, 1, true ); // phi(1020)
632 EvtResonance2 DpKKpiRes4( p4_p, moms1, moms2, 1.72, 123., 0.265, 1.474,
633 0 ); // a_0(1450)
634 EvtResonance2 DpKKpiRes5( p4_p, moms1, moms2, 1.9, -52.0 + 180.0, 0.15,
635 1.68, 1, true ); // phi(1680)
636 EvtResonance2 DpKKpiRes6( p4_p, moms3, moms1, 6.4, 150., 0.109, 1.4324,
637 2, true ); // K*_2(1430)
638 double pi180inv = 1.0 / EvtConst::radToDegrees;
639 amp = EvtComplex( 5.1 * cos( ( 53.0 ) * pi180inv ),
640 5.1 * sin( ( 53.0 ) * pi180inv ) ) +
641 DpKKpiRes1.resAmpl() + DpKKpiRes2.resAmpl() + DpKKpiRes3.resAmpl() +
642 DpKKpiRes4.resAmpl() + DpKKpiRes5.resAmpl() + DpKKpiRes6.resAmpl();
643 }
644
645 //D+ -> pi- pi+ K+ WS (DCS)
646 //FOCUS PLB 601 10 (2004) ; amplitudes there are individually normalized (although not explicit in the paper)
647 // thus the magnitudes appearing below come from dividing the ones appearing in the paper by the sqrt of the
648 // integral over the DP of the corresponding squared amplitude. Writing as pi- pi+ K+ so pipi resonances are (12)
649 // and Kpi resonances are (31); masses and widths corresponds to PDG 2010
650 if ( m_flag == 8 ) {
651 EvtResonance2 DpKpipiDCSRes1( p4_p, moms1, moms2, 1.0, 0.0, 0.149,
652 0.775, 1, true ); // rho(770)
653 EvtResonance2 DpKpipiDCSRes2( p4_p, moms3, moms1, 1.0971, -167.1,
654 0.0487, 0.896, 1, true ); // K*(890)
655 EvtResonance2 DpKpipiDCSRes3( p4_p, moms1, moms2, 0.4738, -134.5, 0.059,
656 0.972, 0 ); // f0(980) as simple BW
657 EvtResonance2 DpKpipiDCSRes4( p4_p, moms3, moms1, 2.2688, 54.4, 0.109,
658 1.432, 2, true ); // K*2(1430)
659 amp = DpKpipiDCSRes1.resAmpl() + DpKpipiDCSRes2.resAmpl() +
660 DpKpipiDCSRes3.resAmpl() + DpKpipiDCSRes4.resAmpl();
661 }
662
663 //Ds+ -> pi- pi+ K+ WS (CS)
664 //FOCUS PLB 601 10 (2004) ; amplitudes there are individually normalized (although not explicit in the paper)
665 // thus the magnitudes appearing below come from dividing the ones appearing in the paper by the sqrt of the
666 // integral over the DP of the corresponding squared amplitude. Writing as pi- pi+ K+ so pipi resonances are (12)
667 // and Kpi resonances are (31); masses and widths corresponds to PDG 2010
668 // PROBLEM: by simply doing the procedure for D+, the resulting DP and projections do not resemble what is
669 // in the paper; the best model is by adding 180 to the vector Kpi resonances
670 if ( m_flag == 9 ) {
671 EvtResonance2 DsKpipiCSRes1( p4_p, moms1, moms2, 1.0, 0.0, 0.149, 0.775,
672 1, true ); // rho(770)
673 EvtResonance2 DsKpipiCSRes2( p4_p, moms3, moms1, 0.7236, -18.3, 0.0487,
674 0.896, 1, true ); // K*(890)
675 EvtResonance2 DsKpipiCSRes3( p4_p, moms3, moms1, 2.711, 145.2, 0.232,
676 1.414, 1, true ); // K*(1410)
677 EvtResonance2 DsKpipiCSRes4( p4_p, moms3, moms1, 1.7549, 59.3, 0.270,
678 1.425, 0 ); // K*0(1430)
679 EvtResonance2 DsKpipiCSRes5( p4_p, moms1, moms2, 7.0589, -151.7, 0.400,
680 1.465, 1, true ); // rho(1450)
681 double pi180inv = 1.0 / EvtConst::radToDegrees;
682 amp = EvtComplex( 3.98 * cos( 43.1 * pi180inv ),
683 3.98 * sin( 43.1 * pi180inv ) ) +
684 DsKpipiCSRes1.resAmpl() + DsKpipiCSRes2.resAmpl() +
685 DsKpipiCSRes3.resAmpl() + DsKpipiCSRes4.resAmpl() +
686 DsKpipiCSRes5.resAmpl();
687 }
688 // D+ -> pi- pi+ pi+ from E791 [PRL 86 770 (2001)]
689 // masses and widths below correspond to what they used; there, the amplitudes were individually normalized
690 // (although not explicit) so magnitudes here are obtained after correcting for that
691 // Breit-Wigner has a factor of (-1) there which changes the relative phase of the NR wrt to the resonances
692 // thus the NR magnitude is set as negative
693 if ( m_flag == 10 ) {
694 EvtResonance2 DppipipiRes11( p4_p, moms1, moms2, 1.0, 0.0, 0.150, 0.769,
695 1, true ); // rho(770)
696 EvtResonance2 DppipipiRes12( p4_p, moms3, moms1, 1.0, 0.0, 0.150, 0.769,
697 1, true ); // rho(770)
698 EvtResonance2 DppipipiRes21( p4_p, moms1, moms2, 2.2811, 205.7, 0.324,
699 0.478, 0 ); // sigma(500)
700 EvtResonance2 DppipipiRes22( p4_p, moms3, moms1, 2.2811, 205.7, 0.324,
701 0.478, 0 ); // sigma(500)
702 EvtResonance2 DppipipiRes31( p4_p, moms1, moms2, 0.4265, 165.0, 0.044,
703 0.977, 0 ); // f0(980) simple BW
704 EvtResonance2 DppipipiRes32( p4_p, moms3, moms1, 0.4265, 165.0, 0.044,
705 0.977, 0 ); // f0(980) simple BW
706 EvtResonance2 DppipipiRes41( p4_p, moms1, moms2, 2.0321, 57.3, 0.185,
707 1.275, 2, true ); // f2(1270)
708 EvtResonance2 DppipipiRes42( p4_p, moms3, moms1, 2.0321, 57.3, 0.185,
709 1.275, 2, true ); // f2(1270)
710 EvtResonance2 DppipipiRes51( p4_p, moms1, moms2, 0.7888, 105.4, 0.173,
711 1.434, 0 ); // f0(1370)
712 EvtResonance2 DppipipiRes52( p4_p, moms3, moms1, 0.7888, 105.4, 0.173,
713 1.434, 0 ); // f0(1370)
714 EvtResonance2 DppipipiRes61( p4_p, moms1, moms2, 0.7363, 319.1, 0.310,
715 1.465, 1, true ); // rho(1450)
716 EvtResonance2 DppipipiRes62( p4_p, moms3, moms1, 0.7363, 319.1, 0.310,
717 1.465, 1, true ); // rho(1450)
718 double pi180inv = 1.0 / EvtConst::radToDegrees;
719 amp = EvtComplex( -3.98 * cos( 57.3 * pi180inv ),
720 -3.98 * sin( 57.3 * pi180inv ) ) +
721 ( DppipipiRes11.resAmpl() - DppipipiRes12.resAmpl() ) //spin1
722 + ( DppipipiRes21.resAmpl() + DppipipiRes22.resAmpl() ) +
723 ( DppipipiRes31.resAmpl() + DppipipiRes32.resAmpl() ) +
724 ( DppipipiRes41.resAmpl() + DppipipiRes42.resAmpl() ) +
725 ( DppipipiRes51.resAmpl() + DppipipiRes52.resAmpl() ) +
726 ( DppipipiRes61.resAmpl() - DppipipiRes62.resAmpl() ); //spin1
727 }
728 // Ds+ -> pi- pi+ pi+ from E791 [PRL 86 765 (2001)]
729 // masses and widths below correspond to what they used; there, the amplitudes were individually normalized
730 // (although not explicit) so magnitudes here are obtained after correcting for that
731 // Breit-Wigner has a factor of (-1) there which changes the relative phase of the NR wrt to the resonances
732 // thus the NR magnitude is set as negative
733 if ( m_flag == 11 ) {
734 EvtResonance2 DspipipiRes11( p4_p, moms1, moms2, 0.288, 109., 0.150,
735 0.769, 1, true ); // rho(770)
736 EvtResonance2 DspipipiRes12( p4_p, moms3, moms1, 0.288, 109., 0.150,
737 0.769, 1, true ); // rho(770)
738 EvtResonance2 DspipipiRes21( p4_p, moms1, moms2, 1.0, 0.0, 0.044, 0.977,
739 0 ); // f0(980) simple BW
740 EvtResonance2 DspipipiRes22( p4_p, moms3, moms1, 1.0, 0.0, 0.044, 0.977,
741 0 ); // f0(980) simple BW
742 EvtResonance2 DspipipiRes31( p4_p, moms1, moms2, 1.075, 133., 0.185,
743 1.275, 2, true ); // f2(1270)
744 EvtResonance2 DspipipiRes32( p4_p, moms3, moms1, 1.075, 133., 0.185,
745 1.275, 2, true ); // f2(1270)
746 EvtResonance2 DspipipiRes41( p4_p, moms1, moms2, 2.225, 198., 0.173,
747 1.434, 0 ); // f0(1370)
748 EvtResonance2 DspipipiRes42( p4_p, moms3, moms1, 2.225, 198., 0.173,
749 1.434, 0 ); // f0(1370)
750 EvtResonance2 DspipipiRes51( p4_p, moms1, moms2, 1.107, 162., 0.310,
751 1.465, 1, true ); // rho(1450)
752 EvtResonance2 DspipipiRes52( p4_p, moms3, moms1, 1.107, 162., 0.310,
753 1.465, 1, true ); // rho(1450)
754 double pi180inv = 1.0 / EvtConst::radToDegrees;
755 amp = EvtComplex( -0.723 * cos( 181. * pi180inv ),
756 -0.723 * sin( 181. * pi180inv ) ) +
757 ( DspipipiRes11.resAmpl() - DspipipiRes12.resAmpl() ) //spin1
758 + ( DspipipiRes21.resAmpl() + DspipipiRes22.resAmpl() ) +
759 ( DspipipiRes31.resAmpl() + DspipipiRes32.resAmpl() ) +
760 ( DspipipiRes41.resAmpl() + DspipipiRes42.resAmpl() ) +
761 ( DspipipiRes51.resAmpl() - DspipipiRes52.resAmpl() ); //spin1
762 }
763
764 //D0 -> pi- pi+ pi0
765 //PRL 99, 251801 (2007)
766 //arXiv:hep-ex/0703037
767 // Amplitude magnitudes taken from the above paper, but corrected for normalization
768 // For details, see https://phab.hepforge.org/T219
769 if ( m_flag == 12 ) {
770 EvtResonance2 DpipipiRes1p( p4_p, moms2, moms3, 1.0, 0.0, 0.149, 0.775,
771 1, true ); //rho+(770)
772 EvtResonance2 DpipipiRes1( p4_p, moms1, moms2, 0.6237, 16.2, 0.149,
773 0.775, 1, true ); //rho0(770)
774 EvtResonance2 DpipipiRes1m( p4_p, moms3, moms1, 0.7143, -2.0, 0.149,
775 0.775, 1, true ); //rho-(770)
776 EvtResonance2 DpipipiRes2p( p4_p, moms2, moms3, 0.2587, -146.0, 0.400,
777 1.465, 1, true ); //rho+(1450)
778 EvtResonance2 DpipipiRes2( p4_p, moms1, moms2, 0.4258, 10.0, 0.400,
779 1.465, 1, true ); //rho0(1450)
780 EvtResonance2 DpipipiRes2m( p4_p, moms3, moms1, 1.043, 16.0, 0.400,
781 1.465, 1, true ); //rho-(1450)
782 EvtResonance2 DpipipiRes3p( p4_p, moms2, moms3, 4.155, -17.0, 0.250,
783 1.720, 1, true ); //rho+(1700)
784 EvtResonance2 DpipipiRes3( p4_p, moms1, moms2, 4.508, -17.0, 0.250,
785 1.720, 1, true ); //rho0(1700)
786 EvtResonance2 DpipipiRes3m( p4_p, moms3, moms1, 3.670, -50.0, 0.250,
787 1.720, 1, true ); //rho-(1700)
788 EvtResonance2 DpipipiRes4( p4_p, moms1, moms2, 0.07289, -59.0, 0.07,
789 0.980, 0 ); //f0(980)
790 EvtResonance2 DpipipiRes5( p4_p, moms1, moms2, 0.3186, 156.0, 0.350,
791 1.370, 0 ); //f0(1370)
792 EvtResonance2 DpipipiRes6( p4_p, moms1, moms2, 0.2075, 12.0, 0.109,
793 1.505, 0 ); //f0(1500)
794 EvtResonance2 DpipipiRes7( p4_p, moms1, moms2, 0.3823, 51.0, 0.135,
795 1.720, 0 ); //f0(1720)
796 EvtResonance2 DpipipiRes8( p4_p, moms1, moms2, 0.3878, -171.0, 0.185,
797 1.275, 2, true ); //f2(1270)
798 EvtResonance2 DpipipiRes9( p4_p, moms1, moms2, 0.3249, 8.0, 0.600, 0.400,
799 0 ); //sigma(400)
800
801 double pi180inv = 1.0 / EvtConst::radToDegrees;
802 amp = EvtComplex( 0.6087 * cos( -11.0 * pi180inv ),
803 0.6087 * sin( -11.0 * pi180inv ) ) +
804 DpipipiRes1p.resAmpl() + DpipipiRes1.resAmpl() +
805 DpipipiRes1m.resAmpl() + DpipipiRes2p.resAmpl() +
806 DpipipiRes2.resAmpl() + DpipipiRes2m.resAmpl() +
807 DpipipiRes3p.resAmpl() + DpipipiRes3.resAmpl() +
808 DpipipiRes3m.resAmpl() + DpipipiRes4.resAmpl() +
809 DpipipiRes5.resAmpl() + DpipipiRes6.resAmpl() +
810 DpipipiRes7.resAmpl() + DpipipiRes8.resAmpl() +
811 DpipipiRes9.resAmpl();
812 }
813
814 vertex( amp );
815
816 return;
817}
818
820 EvtVector4R moms2, EvtVector4R moms3 )
821{
822 //K*(892)-
823 EvtResonance2 DK2piRes1( p4_p, moms1, moms2, 1.418, -190.0, 0.0508, 0.89166,
824 1 );
825 //K0*(1430)-
826 EvtResonance2 DK2piRes2( p4_p, moms1, moms2, 1.818, -337.0, 0.294, 1.412, 0 );
827 //K2*(1430)-
828 EvtResonance2 DK2piRes3( p4_p, moms1, moms2, 0.909, -5.0, 0.0985, 1.4256, 2 );
829 //K*(1680)-
830 EvtResonance2 DK2piRes4( p4_p, moms1, moms2, 5.091, -166.0, 0.322, 1.717, 1 );
831 //DCS K*(892)+
832 EvtResonance2 DK2piRes5( p4_p, moms1, moms3, 0.100, -19.0, 0.0508, 0.89166,
833 1 );
834
835 //Rho0
836 EvtResonance2 DK2piRes6( p4_p, moms3, moms2, 0.909, -340.0, 0.1502, 0.7693,
837 1 );
838 //Omega
839 EvtResonance2 DK2piRes7( p4_p, moms3, moms2, .0336, -226.0, 0.00844,
840 0.78257, 1 );
841 //f0(980)
842 EvtResonance2 DK2piRes8( p4_p, moms3, moms2, 0.309, -152.0, 0.05, 0.977, 0 );
843 //f0(1370)
844 EvtResonance2 DK2piRes9( p4_p, moms3, moms2, 1.636, -255.0, 0.272, 1.31, 0 );
845 //f2(1270)
846 EvtResonance2 DK2piRes10( p4_p, moms3, moms2, 0.636, -32.0, 0.1851, 1.2754,
847 2 );
848
849 return EvtComplex( 1.0, 0.0 ) + DK2piRes1.resAmpl() + DK2piRes2.resAmpl() +
850 DK2piRes3.resAmpl() + DK2piRes4.resAmpl() + DK2piRes5.resAmpl() +
851 DK2piRes6.resAmpl() + DK2piRes7.resAmpl() + DK2piRes8.resAmpl() +
852 DK2piRes9.resAmpl() + DK2piRes10.resAmpl();
853}
854
855//
856// BaBar decay amplitudes for D0->Ks K+ K-
857//
858// p4_p is D0
859// moms1 is K0s
860// moms2 is K+
861// moms3 is K-
862// Amplitudes and phases are taken from BaBar hep-ex/0207089
863// with convention : Non Resonant = Amp 1. / Phase 0.
864
866 EvtVector4R moms2, EvtVector4R moms3 )
867{
868 //phi
869 EvtResonance DK0KKRes1( p4_p, moms2, moms3, 113.75, -40.0, 0.0043, 1.019456,
870 1 );
871 //a0(980)
872 EvtResonance DK0KKRes2( p4_p, moms2, moms3, 152.25, 69.0, 0.1196, 0.9847, 0 );
873 //f0(980)
874 EvtResonance DK0KKRes3( p4_p, moms2, moms3, 30.5, -201.0, 0.05, 0.980, 0 );
875 //a0(980)+
876 EvtResonance DK0KKRes4( p4_p, moms1, moms2, 85.75, -93.0, 0.1196, 0.9847, 0 );
877 //a0(980)-
878 EvtResonance DK0KKRes5( p4_p, moms3, moms1, 8., -53.0, 0.1196, 0.9847, 0 );
879
880 return EvtComplex( 1.0, 0.0 ) + DK0KKRes1.resAmpl() + DK0KKRes2.resAmpl() +
881 DK0KKRes3.resAmpl() + DK0KKRes4.resAmpl() + DK0KKRes5.resAmpl();
882}
bool isNeutralKaon(const EvtId &theId)
bool compareIds(const std::pair< EvtId, int > &left, const std::pair< EvtId, int > &right)
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=nullptr)
Definition EvtReport.cpp:32
@ EVTGEN_ERROR
Definition EvtReport.hh:49
static const double radToDegrees
Definition EvtConst.hh:28
EvtDecayBase * clone() const override
vector< EvtFlatteParam > m_kkpi_params
Definition EvtDDalitz.hh:49
void init() override
std::string getName() const override
void decay(EvtParticle *p) override
void initProbMax() override
EvtComplex amplDtoK0PiPi(EvtVector4R p4_p, EvtVector4R moms1, EvtVector4R moms2, EvtVector4R moms3)
EvtComplex amplDtoK0KK(EvtVector4R p4_p, EvtVector4R moms1, EvtVector4R moms2, EvtVector4R moms3)
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)
EvtComplex resAmpl()
Definition EvtFlatte.cpp:64
Definition EvtId.hh:27
static int getStdHep(EvtId id)
Definition EvtPDL.cpp:356
static double getMeanMass(EvtId i)
Definition EvtPDL.cpp:306
static EvtId chargeConj(EvtId id)
Definition EvtPDL.cpp:201
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)
double mass() const
EvtParticle * getParent() const
EvtComplex resAmpl() const
EvtComplex relBrWig(int i)
EvtComplex resAmpl()
void set(int i, double d)