Changeset View
Changeset View
Standalone View
Standalone View
src/EvtGenBase/EvtPto3PAmpFactory.cpp
Show First 20 Lines • Show All 73 Lines • ▼ Show 20 Lines | if ( vv[0] == "PHASESPACE" ) { | ||||
double alpha = 0; | double alpha = 0; | ||||
EvtPto3PAmp::NumType typeNRes = EvtPto3PAmp::NONRES; | EvtPto3PAmp::NumType typeNRes = EvtPto3PAmp::NONRES; | ||||
if ( vv[0] == "NONRES_LIN" ) { | if ( vv[0] == "NONRES_LIN" ) { | ||||
typeNRes = EvtPto3PAmp::NONRES_LIN; | typeNRes = EvtPto3PAmp::NONRES_LIN; | ||||
pairRes = strToPair( vv[1].c_str() ); | pairRes = strToPair( vv[1].c_str() ); | ||||
} else if ( vv[0] == "NONRES_EXP" ) { | } else if ( vv[0] == "NONRES_EXP" ) { | ||||
typeNRes = EvtPto3PAmp::NONRES_EXP; | typeNRes = EvtPto3PAmp::NONRES_EXP; | ||||
pairRes = strToPair( vv[1].c_str() ); | pairRes = strToPair( vv[1].c_str() ); | ||||
alpha = strtod( vv[2].c_str(), 0 ); | alpha = strtod( vv[2].c_str(), nullptr ); | ||||
} else | } else | ||||
assert( 0 ); | assert( 0 ); | ||||
pdf = std::make_unique<EvtDalitzFlatPdf>( _dp ); | pdf = std::make_unique<EvtDalitzFlatPdf>( _dp ); | ||||
amp = std::make_unique<EvtNonresonantAmp>( &_dp, typeNRes, pairRes, | amp = std::make_unique<EvtNonresonantAmp>( &_dp, typeNRes, pairRes, | ||||
alpha ); | alpha ); | ||||
} else if ( vv[0] == "LASS" || vv[0] == "LASS_ELASTIC" || | } else if ( vv[0] == "LASS" || vv[0] == "LASS_ELASTIC" || | ||||
vv[0] == "LASS_RESONANT" ) { | vv[0] == "LASS_RESONANT" ) { | ||||
pairRes = strToPair( vv[1].c_str() ); | pairRes = strToPair( vv[1].c_str() ); | ||||
double m0 = strtod( vv[2].c_str(), 0 ); | double m0 = strtod( vv[2].c_str(), nullptr ); | ||||
double g0 = strtod( vv[3].c_str(), 0 ); | double g0 = strtod( vv[3].c_str(), nullptr ); | ||||
double a = strtod( vv[4].c_str(), 0 ); | double a = strtod( vv[4].c_str(), nullptr ); | ||||
double r = strtod( vv[5].c_str(), 0 ); | double r = strtod( vv[5].c_str(), nullptr ); | ||||
double cutoff = strtod( vv[6].c_str(), 0 ); | double cutoff = strtod( vv[6].c_str(), nullptr ); | ||||
pdf = std::make_unique<EvtDalitzResPdf>( _dp, m0, g0, pairRes ); | pdf = std::make_unique<EvtDalitzResPdf>( _dp, m0, g0, pairRes ); | ||||
amp = std::make_unique<EvtLASSAmp>( &_dp, pairRes, m0, g0, a, r, cutoff, | amp = std::make_unique<EvtLASSAmp>( &_dp, pairRes, m0, g0, a, r, cutoff, | ||||
vv[0] ); | vv[0] ); | ||||
} | } | ||||
/* | /* | ||||
Resonant amplitudes | Resonant amplitudes | ||||
*/ | */ | ||||
Show All 37 Lines | else if ( vv[0] == "RESONANCE" ) { | ||||
break; | break; | ||||
} | } | ||||
default: { | default: { | ||||
assert( 0 ); | assert( 0 ); | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
mR = strtod( vv[3].c_str(), 0 ); | mR = strtod( vv[3].c_str(), nullptr ); | ||||
gR = strtod( vv[4].c_str(), 0 ); | gR = strtod( vv[4].c_str(), nullptr ); | ||||
i = 4; | i = 4; | ||||
} else { | } else { | ||||
// For a valid particle get spin, mass and width | // For a valid particle get spin, mass and width | ||||
spinR = EvtPDL::getSpinType( resId ); | spinR = EvtPDL::getSpinType( resId ); | ||||
mR = EvtPDL::getMeanMass( resId ); | mR = EvtPDL::getMeanMass( resId ); | ||||
gR = EvtPDL::getWidth( resId ); | gR = EvtPDL::getWidth( resId ); | ||||
i = 2; | i = 2; | ||||
// It's possible to specify mass and width of a particle | // It's possible to specify mass and width of a particle | ||||
// explicitly | // explicitly | ||||
if ( vv[3] != "ANGULAR" ) { | if ( vv[3] != "ANGULAR" ) { | ||||
if ( _verbose ) | if ( _verbose ) | ||||
printf( "Setting m(%s)=%s g(%s)=%s\n", vv[2].c_str(), | printf( "Setting m(%s)=%s g(%s)=%s\n", vv[2].c_str(), | ||||
vv[3].c_str(), vv[2].c_str(), vv[4].c_str() ); | vv[3].c_str(), vv[2].c_str(), vv[4].c_str() ); | ||||
mR = strtod( vv[3].c_str(), 0 ); | mR = strtod( vv[3].c_str(), nullptr ); | ||||
gR = strtod( vv[4].c_str(), 0 ); | gR = strtod( vv[4].c_str(), nullptr ); | ||||
i = 4; | i = 4; | ||||
} | } | ||||
} | } | ||||
// ANGULAR stanza | // ANGULAR stanza | ||||
if ( vv[++i] != "ANGULAR" ) { | if ( vv[++i] != "ANGULAR" ) { | ||||
printf( "%s instead of ANGULAR\n", vv[i].c_str() ); | printf( "%s instead of ANGULAR\n", vv[i].c_str() ); | ||||
Show All 29 Lines | else if ( vv[0] == "RESONANCE" ) { | ||||
EvtPropBreitWignerRel prop( mR, gR ); | EvtPropBreitWignerRel prop( mR, gR ); | ||||
partAmp = std::make_unique<EvtPto3PAmp>( _dp, pairAng, pairRes, | partAmp = std::make_unique<EvtPto3PAmp>( _dp, pairAng, pairRes, | ||||
spinR, prop, | spinR, prop, | ||||
EvtPto3PAmp::RBW_CLEO ); | EvtPto3PAmp::RBW_CLEO ); | ||||
} else if ( type == "FLATTE" ) { | } else if ( type == "FLATTE" ) { | ||||
double m1a = _dp.m( first( pairRes ) ); | double m1a = _dp.m( first( pairRes ) ); | ||||
double m1b = _dp.m( second( pairRes ) ); | double m1b = _dp.m( second( pairRes ) ); | ||||
// 2nd channel | // 2nd channel | ||||
double g2 = strtod( vv[++i].c_str(), 0 ); | double g2 = strtod( vv[++i].c_str(), nullptr ); | ||||
double m2a = strtod( vv[++i].c_str(), 0 ); | double m2a = strtod( vv[++i].c_str(), nullptr ); | ||||
double m2b = strtod( vv[++i].c_str(), 0 ); | double m2b = strtod( vv[++i].c_str(), nullptr ); | ||||
EvtPropFlatte prop( mR, gR, m1a, m1b, g2, m2a, m2b ); | EvtPropFlatte prop( mR, gR, m1a, m1b, g2, m2a, m2b ); | ||||
partAmp = std::make_unique<EvtPto3PAmp>( _dp, pairAng, pairRes, spinR, | partAmp = std::make_unique<EvtPto3PAmp>( _dp, pairAng, pairRes, spinR, | ||||
prop, EvtPto3PAmp::FLATTE ); | prop, EvtPto3PAmp::FLATTE ); | ||||
} else | } else | ||||
assert( 0 ); | assert( 0 ); | ||||
// Optional DVFF, BVFF stanzas | // Optional DVFF, BVFF stanzas | ||||
if ( i < vv.size() - 1 ) { | if ( i < vv.size() - 1 ) { | ||||
if ( vv[i + 1] == "DVFF" ) { | if ( vv[i + 1] == "DVFF" ) { | ||||
i++; | i++; | ||||
if ( vv[++i] == "BLATTWEISSKOPF" ) { | if ( vv[++i] == "BLATTWEISSKOPF" ) { | ||||
double R = strtod( vv[++i].c_str(), 0 ); | double R = strtod( vv[++i].c_str(), nullptr ); | ||||
partAmp->set_fd( R ); | partAmp->set_fd( R ); | ||||
} else | } else | ||||
assert( 0 ); | assert( 0 ); | ||||
} | } | ||||
} | } | ||||
if ( i < vv.size() - 1 ) { | if ( i < vv.size() - 1 ) { | ||||
if ( vv[i + 1] == "BVFF" ) { | if ( vv[i + 1] == "BVFF" ) { | ||||
i++; | i++; | ||||
if ( vv[++i] == "BLATTWEISSKOPF" ) { | if ( vv[++i] == "BLATTWEISSKOPF" ) { | ||||
if ( _verbose ) | if ( _verbose ) | ||||
printf( "BVFF=%s\n", vv[i].c_str() ); | printf( "BVFF=%s\n", vv[i].c_str() ); | ||||
double R = strtod( vv[++i].c_str(), 0 ); | double R = strtod( vv[++i].c_str(), nullptr ); | ||||
partAmp->set_fb( R ); | partAmp->set_fb( R ); | ||||
} else | } else | ||||
assert( 0 ); | assert( 0 ); | ||||
} | } | ||||
} | } | ||||
const int minwidths = 5; | const int minwidths = 5; | ||||
//Optional resonance minimum and maximum | //Optional resonance minimum and maximum | ||||
if ( i < vv.size() - 1 ) { | if ( i < vv.size() - 1 ) { | ||||
if ( vv[i + 1] == "CUTOFF" ) { | if ( vv[i + 1] == "CUTOFF" ) { | ||||
i++; | i++; | ||||
if ( vv[i + 1] == "MIN" ) { | if ( vv[i + 1] == "MIN" ) { | ||||
i++; | i++; | ||||
double min = strtod( vv[++i].c_str(), 0 ); | double min = strtod( vv[++i].c_str(), nullptr ); | ||||
if ( _verbose ) | if ( _verbose ) | ||||
std::cout << "CUTOFF MIN = " << min << " " << minwidths | std::cout << "CUTOFF MIN = " << min << " " << minwidths | ||||
<< std::endl; | << std::endl; | ||||
//ensure against cutting off too close to the resonance | //ensure against cutting off too close to the resonance | ||||
assert( min < ( mR - minwidths * gR ) ); | assert( min < ( mR - minwidths * gR ) ); | ||||
partAmp->setmin( min ); | partAmp->setmin( min ); | ||||
} else if ( vv[i + 1] == "MAX" ) { | } else if ( vv[i + 1] == "MAX" ) { | ||||
i++; | i++; | ||||
double max = strtod( vv[++i].c_str(), 0 ); | double max = strtod( vv[++i].c_str(), nullptr ); | ||||
if ( _verbose ) | if ( _verbose ) | ||||
std::cout << "CUTOFF MAX = " << max << " " << minwidths | std::cout << "CUTOFF MAX = " << max << " " << minwidths | ||||
<< std::endl; | << std::endl; | ||||
//ensure against cutting off too close to the resonance | //ensure against cutting off too close to the resonance | ||||
assert( max > ( mR + minwidths * gR ) ); | assert( max > ( mR + minwidths * gR ) ); | ||||
partAmp->setmax( max ); | partAmp->setmax( max ); | ||||
} else | } else | ||||
assert( 0 ); | assert( 0 ); | ||||
} | } | ||||
} | } | ||||
//2nd iteration in case min and max are both specified | //2nd iteration in case min and max are both specified | ||||
if ( i < vv.size() - 1 ) { | if ( i < vv.size() - 1 ) { | ||||
if ( vv[i + 1] == "CUTOFF" ) { | if ( vv[i + 1] == "CUTOFF" ) { | ||||
i++; | i++; | ||||
if ( vv[i + 1] == "MIN" ) { | if ( vv[i + 1] == "MIN" ) { | ||||
i++; | i++; | ||||
double min = strtod( vv[++i].c_str(), 0 ); | double min = strtod( vv[++i].c_str(), nullptr ); | ||||
if ( _verbose ) | if ( _verbose ) | ||||
std::cout << "CUTOFF MIN = " << min << std::endl; | std::cout << "CUTOFF MIN = " << min << std::endl; | ||||
//ensure against cutting off too close to the resonance | //ensure against cutting off too close to the resonance | ||||
assert( min < ( mR - minwidths * gR ) ); | assert( min < ( mR - minwidths * gR ) ); | ||||
partAmp->setmin( min ); | partAmp->setmin( min ); | ||||
} else if ( vv[i + 1] == "MAX" ) { | } else if ( vv[i + 1] == "MAX" ) { | ||||
i++; | i++; | ||||
double max = strtod( vv[++i].c_str(), 0 ); | double max = strtod( vv[++i].c_str(), nullptr ); | ||||
if ( _verbose ) | if ( _verbose ) | ||||
std::cout << "CUTOFF MAX = " << max << std::endl; | std::cout << "CUTOFF MAX = " << max << std::endl; | ||||
//ensure against cutting off too close to the resonance | //ensure against cutting off too close to the resonance | ||||
assert( max > ( mR + minwidths * gR ) ); | assert( max > ( mR + minwidths * gR ) ); | ||||
partAmp->setmax( max ); | partAmp->setmax( max ); | ||||
} else | } else | ||||
assert( 0 ); | assert( 0 ); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 71 Lines • Show Last 20 Lines |