52 printf(
"Make %samplitude\n",
conj ?
"CP conjugate" :
"" );
54 for ( i = 0; i < vv.size(); i++ )
55 printf(
"%s\n", vv[i].
c_str() );
59 std::unique_ptr<EvtAmplitude<EvtDalitzPoint>> amp;
60 std::unique_ptr<EvtPdf<EvtDalitzPoint>> pdf;
68 if ( vv[0] ==
"PHASESPACE" ) {
69 pdf = std::make_unique<EvtDalitzFlatPdf>(
m_dp );
70 amp = std::make_unique<EvtFlatAmp<EvtDalitzPoint>>();
72 }
else if ( !vv[0].find(
"NONRES" ) ) {
75 if ( vv[0] ==
"NONRES_LIN" ) {
78 }
else if ( vv[0] ==
"NONRES_EXP" ) {
81 alpha = strtod( vv[2].
c_str(),
nullptr );
84 pdf = std::make_unique<EvtDalitzFlatPdf>(
m_dp );
85 amp = std::make_unique<EvtNonresonantAmp>( &
m_dp, typeNRes, pairRes,
87 }
else if ( vv[0] ==
"LASS" || vv[0] ==
"LASS_ELASTIC" ||
88 vv[0] ==
"LASS_RESONANT" ) {
90 double m0 = strtod( vv[2].
c_str(),
nullptr );
91 double g0 = strtod( vv[3].
c_str(),
nullptr );
92 double a = strtod( vv[4].
c_str(),
nullptr );
93 double r = strtod( vv[5].
c_str(),
nullptr );
94 double cutoff = strtod( vv[6].
c_str(),
nullptr );
95 pdf = std::make_unique<EvtDalitzResPdf>(
m_dp, m0, g0, pairRes );
96 amp = std::make_unique<EvtLASSAmp>( &
m_dp, pairRes, m0, g0, a, r,
103 else if ( vv[0] ==
"RESONANCE" ) {
104 std::unique_ptr<EvtPto3PAmp> partAmp;
114 printf(
"Particles %s form %sresonance %s\n", vv[1].
c_str(),
120 if ( resId.
getId() == -1 ) {
121 switch ( atoi( vv[2].
c_str() ) ) {
148 mR = strtod( vv[3].
c_str(),
nullptr );
149 gR = strtod( vv[4].
c_str(),
nullptr );
162 if ( vv[3] !=
"ANGULAR" ) {
164 printf(
"Setting m(%s)=%s g(%s)=%s\n", vv[2].
c_str(),
167 mR = strtod( vv[3].
c_str(),
nullptr );
168 gR = strtod( vv[4].
c_str(),
nullptr );
175 if ( vv[++i] !=
"ANGULAR" ) {
176 printf(
"%s instead of ANGULAR\n", vv[i].
c_str() );
181 printf(
"Angle is measured between particles %s\n", vv[i].
c_str() );
185 std::string typeName = vv[++i];
186 assert( typeName ==
"TYPE" );
187 std::string type = vv[++i];
189 printf(
"Propagator type %s\n", vv[i].
c_str() );
191 if ( type ==
"NBW" ) {
193 partAmp = std::make_unique<EvtPto3PAmp>(
m_dp, pairAng, pairRes,
196 }
else if ( type ==
"RBW_ZEMACH" ) {
198 partAmp = std::make_unique<EvtPto3PAmp>(
m_dp, pairAng, pairRes,
201 }
else if ( type ==
"RBW_KUEHN" ) {
203 partAmp = std::make_unique<EvtPto3PAmp>(
m_dp, pairAng, pairRes,
206 }
else if ( type ==
"RBW_CLEO" ) {
208 partAmp = std::make_unique<EvtPto3PAmp>(
m_dp, pairAng, pairRes,
211 }
else if ( type ==
"FLATTE" ) {
215 double g2 = strtod( vv[++i].
c_str(),
nullptr );
216 double m2a = strtod( vv[++i].
c_str(),
nullptr );
217 double m2b = strtod( vv[++i].
c_str(),
nullptr );
219 partAmp = std::make_unique<EvtPto3PAmp>(
m_dp, pairAng, pairRes,
227 if ( i < vv.size() - 1 ) {
228 if ( vv[i + 1] ==
"DVFF" ) {
230 if ( vv[++i] ==
"BLATTWEISSKOPF" ) {
231 double R = strtod( vv[++i].
c_str(),
nullptr );
232 partAmp->set_fd( R );
238 if ( i < vv.size() - 1 ) {
239 if ( vv[i + 1] ==
"BVFF" ) {
241 if ( vv[++i] ==
"BLATTWEISSKOPF" ) {
243 printf(
"BVFF=%s\n", vv[i].
c_str() );
244 double R = strtod( vv[++i].
c_str(),
nullptr );
245 partAmp->set_fb( R );
251 const int minwidths = 5;
253 if ( i < vv.size() - 1 ) {
254 if ( vv[i + 1] ==
"CUTOFF" ) {
256 if ( vv[i + 1] ==
"MIN" ) {
258 double min = strtod( vv[++i].
c_str(),
nullptr );
260 std::cout <<
"CUTOFF MIN = " << min <<
" " << minwidths
263 assert( min < ( mR - minwidths * gR ) );
264 partAmp->setmin( min );
265 }
else if ( vv[i + 1] ==
"MAX" ) {
267 double max = strtod( vv[++i].
c_str(),
nullptr );
269 std::cout <<
"CUTOFF MAX = " << max <<
" " << minwidths
272 assert( max > ( mR + minwidths * gR ) );
273 partAmp->setmax( max );
280 if ( i < vv.size() - 1 ) {
281 if ( vv[i + 1] ==
"CUTOFF" ) {
283 if ( vv[i + 1] ==
"MIN" ) {
285 double min = strtod( vv[++i].
c_str(),
nullptr );
287 std::cout <<
"CUTOFF MIN = " << min << std::endl;
289 assert( min < ( mR - minwidths * gR ) );
290 partAmp->setmin( min );
291 }
else if ( vv[i + 1] ==
"MAX" ) {
293 double max = strtod( vv[++i].
c_str(),
nullptr );
295 std::cout <<
"CUTOFF MAX = " << max << std::endl;
297 assert( max > ( mR + minwidths * gR ) );
298 partAmp->setmax( max );
306 pdf = std::make_unique<EvtDalitzResPdf>(
m_dp, mR, gR, pairRes );
307 amp = std::move( partAmp );
316 m_amp->addOwnedTerm( c, std::move( amp ) );
318 m_ampConj->addOwnedTerm( c, std::move( amp ) );
320 m_pc->addOwnedTerm(
abs2( c ) * scale, std::move( pdf ) );
342 double di = (
m_dp.qAbsMax( ipair ) -
m_dp.qAbsMin( ipair ) ) / ( (double)N );
344 double siMin =
m_dp.qAbsMin( ipair );
347 for (
int i = 1; i < N; i++ ) {
348 s[ipair] = siMin + di * i;
349 s[jpair] =
m_dp.q( jpair, 0.9999, ipair, s[ipair] );
350 s[kpair] =
m_dp.bigM() *
m_dp.bigM() - s[ipair] - s[jpair] +
360 double p = point.
p(
other( ipair ), ipair );
361 double q = point.
p(
first( ipair ), ipair );
363 double itg =
abs2( amp.
evaluate( point ) ) * di * 4 * q * p;
367 std::cout <<
"integral = " << Iamp2 <<
" pdf=" << Ipdf << std::endl;
369 assert( Ipdf > 0 && Iamp2 > 0 );