Page Menu
Home
HEPForge
Search
Configure Global Search
Log In
Files
F19224351
D92.1759101803.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Award Token
Flag For Later
Size
11 KB
Referenced Files
None
Subscribers
None
D92.1759101803.diff
View Options
diff --git a/EvtGenModels/EvtSSD_DirectCP.hh b/EvtGenModels/EvtSSD_DirectCP.hh
--- a/EvtGenModels/EvtSSD_DirectCP.hh
+++ b/EvtGenModels/EvtSSD_DirectCP.hh
@@ -38,9 +38,12 @@
void decay( EvtParticle* p ) override;
std::string getParamName( int i ) override;
+ protected:
+ void calcAmp( const EvtParticle& parent, EvtAmp& amp ) const;
+
private:
- bool isB0Mixed( EvtParticle* p );
- bool isBsMixed( EvtParticle* p );
+ bool isB0Mixed( const EvtParticle& p );
+ bool isBsMixed( const EvtParticle& p );
//Arguments
diff --git a/src/EvtGenModels/EvtSSD_DirectCP.cpp b/src/EvtGenModels/EvtSSD_DirectCP.cpp
--- a/src/EvtGenModels/EvtSSD_DirectCP.cpp
+++ b/src/EvtGenModels/EvtSSD_DirectCP.cpp
@@ -27,6 +27,7 @@
#include "EvtGenBase/EvtParticle.hh"
#include "EvtGenBase/EvtRandom.hh"
#include "EvtGenBase/EvtReport.hh"
+#include "EvtGenBase/EvtScalarParticle.hh"
#include "EvtGenBase/EvtTensor4C.hh"
#include "EvtGenBase/EvtVector4C.hh"
@@ -50,8 +51,8 @@
checkNArg( 1 );
checkNDaug( 2 );
- EvtSpinType::spintype d1type = EvtPDL::getSpinType( getDaug( 0 ) );
- EvtSpinType::spintype d2type = EvtPDL::getSpinType( getDaug( 1 ) );
+ const EvtSpinType::spintype d1type = EvtPDL::getSpinType( getDaug( 0 ) );
+ const EvtSpinType::spintype d2type = EvtPDL::getSpinType( getDaug( 1 ) );
if ( ( !( d1type == EvtSpinType::SCALAR || d2type == EvtSpinType::SCALAR ) ) ||
( !( ( d2type == EvtSpinType::SCALAR ) ||
@@ -78,15 +79,89 @@
{
double theProbMax = 1.;
- EvtSpinType::spintype d2type = EvtPDL::getSpinType( getDaug( 1 ) );
- EvtSpinType::spintype d1type = EvtPDL::getSpinType( getDaug( 0 ) );
- if ( d1type == EvtSpinType::TENSOR || d2type == EvtSpinType::TENSOR )
- theProbMax *= 10;
+ const EvtSpinType::spintype d2type = EvtPDL::getSpinType( getDaug( 1 ) );
+ const EvtSpinType::spintype d1type = EvtPDL::getSpinType( getDaug( 0 ) );
+
+ if ( d1type != EvtSpinType::SCALAR || d2type != EvtSpinType::SCALAR ) {
+ // Create a scalar parent at rest and initialize it
+ // Use noLifeTime() cludge to avoid generating random numbers
+
+ EvtScalarParticle parent{};
+ parent.noLifeTime();
+ parent.init( getParentId(),
+ EvtVector4R( EvtPDL::getMass( getParentId() ), 0, 0, 0 ) );
+ parent.setDiagonalSpinDensity();
+
+ // Create daughters and initialize amplitude
+ EvtAmp amp;
+ EvtId daughters[2] = { getDaug( 0 ), getDaug( 1 ) };
+ amp.init( getParentId(), 2, daughters );
+ parent.makeDaughters( 2, daughters );
+
+ const int scalarDaughterIndex = d1type == EvtSpinType::SCALAR ? 0 : 1;
+ const int nonScalarDaughterIndex = d1type == EvtSpinType::SCALAR ? 1 : 0;
+
+ EvtParticle* scalarDaughter = parent.getDaug( scalarDaughterIndex );
+ EvtParticle* nonScalarDaughter = parent.getDaug( nonScalarDaughterIndex );
+
+ scalarDaughter->noLifeTime();
+ nonScalarDaughter->noLifeTime();
+
+ EvtSpinDensity rho;
+ rho.setDiag( parent.getSpinStates() );
+
+ // Momentum of daughters in parent's frame
+ const double m_parent = EvtPDL::getMass( getParentId() );
+ const double m_sd = EvtPDL::getMass( getDaug( scalarDaughterIndex ) );
+ const double m_nd = EvtPDL::getMass( getDaug( nonScalarDaughterIndex ) );
+ const double pstar =
+ sqrt( pow( m_parent, 2 ) - pow( ( m_sd + m_nd ), 2 ) ) *
+ sqrt( pow( m_parent, 2 ) - pow( ( m_nd - m_sd ), 2 ) ) /
+ ( 2 * m_parent );
+
+ EvtVector4R p4_sd, p4_nd;
+
+ const int nsteps = 16;
+
+ double prob_max = 0;
+ double theta_max = 0;
+
+ for ( int i = 0; i <= nsteps; i++ ) {
+ const double theta = i * EvtConst::pi / nsteps;
+
+ p4_sd.set( sqrt( pow( pstar, 2 ) + pow( m_sd, 2 ) ), 0,
+ +pstar * sin( theta ), +pstar * cos( theta ) );
+
+ p4_nd.set( sqrt( pow( pstar, 2 ) + pow( m_nd, 2 ) ), 0,
+ -pstar * sin( theta ), -pstar * cos( theta ) );
+
+ scalarDaughter->init( getDaug( scalarDaughterIndex ), p4_sd );
+ nonScalarDaughter->init( getDaug( nonScalarDaughterIndex ), p4_nd );
+
+ calcAmp( parent, amp );
+
+ const double i_prob = rho.normalizedProb( amp.getSpinDensity() );
+
+ if ( i_prob > prob_max ) {
+ prob_max = i_prob;
+ theta_max = theta;
+ }
+ }
+
+ EvtGenReport( EVTGEN_INFO, "EvtGen" )
+ << " - probability " << prob_max
+ << " found at theta = " << theta_max << std::endl;
+ theProbMax *= 1.01 * prob_max;
+ }
setProbMax( theProbMax );
+
+ EvtGenReport( EVTGEN_INFO, "EvtGen" )
+ << " EvtSSD_DirectCP - set up maximum probability to " << theProbMax
+ << std::endl;
}
-void EvtSSD_DirectCP::decay( EvtParticle* p )
+void EvtSSD_DirectCP::decay( EvtParticle* parent )
{
bool flip = false;
EvtId daugs[2];
@@ -103,97 +178,54 @@
}
if ( flip ) {
- if ( ( isB0Mixed( p ) ) || ( isBsMixed( p ) ) ) {
- p->getParent()->setId( EvtPDL::chargeConj( p->getParent()->getId() ) );
- p->setId( EvtPDL::chargeConj( p->getId() ) );
+ if ( ( isB0Mixed( *parent ) ) || ( isBsMixed( *parent ) ) ) {
+ parent->getParent()->setId(
+ EvtPDL::chargeConj( parent->getParent()->getId() ) );
+ parent->setId( EvtPDL::chargeConj( parent->getId() ) );
} else {
- p->setId( EvtPDL::chargeConj( p->getId() ) );
+ parent->setId( EvtPDL::chargeConj( parent->getId() ) );
}
- }
-
- if ( !flip ) {
- daugs[0] = getDaug( 0 );
- daugs[1] = getDaug( 1 );
- } else {
daugs[0] = EvtPDL::chargeConj( getDaug( 0 ) );
daugs[1] = EvtPDL::chargeConj( getDaug( 1 ) );
- }
-
- EvtParticle* d;
- p->initializePhaseSpace( 2, daugs );
-
- EvtVector4R p4_parent = p->getP4Restframe();
- double m_parent = p4_parent.mass();
-
- EvtSpinType::spintype d2type = EvtPDL::getSpinType( getDaug( 1 ) );
-
- EvtVector4R momv;
- EvtVector4R moms;
-
- if ( d2type == EvtSpinType::SCALAR ) {
- d2type = EvtPDL::getSpinType( getDaug( 0 ) );
- d = p->getDaug( 0 );
- momv = d->getP4();
- moms = p->getDaug( 1 )->getP4();
} else {
- d = p->getDaug( 1 );
- momv = d->getP4();
- moms = p->getDaug( 0 )->getP4();
- }
-
- if ( d2type == EvtSpinType::SCALAR ) {
- vertex( 1. );
- }
-
- if ( d2type == EvtSpinType::VECTOR ) {
- double norm = momv.mass() / ( momv.d3mag() * p->mass() );
-
- vertex( 0, norm * p4_parent * ( d->epsParent( 0 ) ) );
- vertex( 1, norm * p4_parent * ( d->epsParent( 1 ) ) );
- vertex( 2, norm * p4_parent * ( d->epsParent( 2 ) ) );
+ daugs[0] = getDaug( 0 );
+ daugs[1] = getDaug( 1 );
}
- if ( d2type == EvtSpinType::TENSOR ) {
- double norm = d->mass() * d->mass() /
- ( m_parent * d->getP4().d3mag() * d->getP4().d3mag() );
+ parent->initializePhaseSpace( 2, daugs );
- vertex( 0, norm * d->epsTensorParent( 0 ).cont1( p4_parent ) * p4_parent );
- vertex( 1, norm * d->epsTensorParent( 1 ).cont1( p4_parent ) * p4_parent );
- vertex( 2, norm * d->epsTensorParent( 2 ).cont1( p4_parent ) * p4_parent );
- vertex( 3, norm * d->epsTensorParent( 3 ).cont1( p4_parent ) * p4_parent );
- vertex( 4, norm * d->epsTensorParent( 4 ).cont1( p4_parent ) * p4_parent );
- }
+ calcAmp( *parent, _amp2 );
}
-bool EvtSSD_DirectCP::isB0Mixed( EvtParticle* p )
+bool EvtSSD_DirectCP::isB0Mixed( const EvtParticle& p )
{
- if ( !( p->getParent() ) )
+ if ( !( p.getParent() ) )
return false;
- static EvtId B0 = EvtPDL::getId( "B0" );
- static EvtId B0B = EvtPDL::getId( "anti-B0" );
+ static const EvtId B0 = EvtPDL::getId( "B0" );
+ static const EvtId B0B = EvtPDL::getId( "anti-B0" );
- if ( ( p->getId() != B0 ) && ( p->getId() != B0B ) )
+ if ( ( p.getId() != B0 ) && ( p.getId() != B0B ) )
return false;
- if ( ( p->getParent()->getId() == B0 ) || ( p->getParent()->getId() == B0B ) )
+ if ( ( p.getParent()->getId() == B0 ) || ( p.getParent()->getId() == B0B ) )
return true;
return false;
}
-bool EvtSSD_DirectCP::isBsMixed( EvtParticle* p )
+bool EvtSSD_DirectCP::isBsMixed( const EvtParticle& p )
{
- if ( !( p->getParent() ) )
+ if ( !( p.getParent() ) )
return false;
- static EvtId BS0 = EvtPDL::getId( "B_s0" );
- static EvtId BSB = EvtPDL::getId( "anti-B_s0" );
+ static const EvtId BS0 = EvtPDL::getId( "B_s0" );
+ static const EvtId BSB = EvtPDL::getId( "anti-B_s0" );
- if ( ( p->getId() != BS0 ) && ( p->getId() != BSB ) )
+ if ( ( p.getId() != BS0 ) && ( p.getId() != BSB ) )
return false;
- if ( ( p->getParent()->getId() == BS0 ) || ( p->getParent()->getId() == BSB ) )
+ if ( ( p.getParent()->getId() == BS0 ) || ( p.getParent()->getId() == BSB ) )
return true;
return false;
@@ -208,3 +240,53 @@
return "";
}
}
+
+void EvtSSD_DirectCP::calcAmp( const EvtParticle& parent, EvtAmp& amp ) const
+{
+ const EvtSpinType::spintype d1type = EvtPDL::getSpinType(
+ parent.getDaug( 0 )->getId() );
+ const EvtSpinType::spintype d2type = EvtPDL::getSpinType(
+ parent.getDaug( 1 )->getId() );
+
+ if ( d1type == EvtSpinType::SCALAR && d2type == EvtSpinType::SCALAR ) {
+ amp.vertex( 1. );
+ return;
+ }
+
+ const EvtVector4R p4_parent = parent.getP4Restframe();
+
+ const int nonScalarDaughterIndex = d1type == EvtSpinType::SCALAR ? 1 : 0;
+
+ const EvtParticle& daughter = *parent.getDaug( nonScalarDaughterIndex );
+
+ const EvtSpinType::spintype nonScalarType = EvtPDL::getSpinType(
+ daughter.getId() );
+
+ if ( nonScalarType == EvtSpinType::VECTOR ) {
+ const EvtVector4R momv = daughter.getP4();
+ const double norm = momv.mass() / ( momv.d3mag() * parent.mass() );
+
+ amp.vertex( 0, norm * p4_parent * ( daughter.epsParent( 0 ) ) );
+ amp.vertex( 1, norm * p4_parent * ( daughter.epsParent( 1 ) ) );
+ amp.vertex( 2, norm * p4_parent * ( daughter.epsParent( 2 ) ) );
+
+ }
+
+ // This is for the EvtSpinType::TENSOR case.
+ else {
+ const double norm = daughter.mass() * daughter.mass() /
+ ( p4_parent.mass() * daughter.getP4().d3mag() *
+ daughter.getP4().d3mag() );
+
+ amp.vertex( 0, norm * daughter.epsTensorParent( 0 ).cont1( p4_parent ) *
+ p4_parent );
+ amp.vertex( 1, norm * daughter.epsTensorParent( 1 ).cont1( p4_parent ) *
+ p4_parent );
+ amp.vertex( 2, norm * daughter.epsTensorParent( 2 ).cont1( p4_parent ) *
+ p4_parent );
+ amp.vertex( 3, norm * daughter.epsTensorParent( 3 ).cont1( p4_parent ) *
+ p4_parent );
+ amp.vertex( 4, norm * daughter.epsTensorParent( 4 ).cont1( p4_parent ) *
+ p4_parent );
+ }
+}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Sep 29, 12:23 AM (4 h, 16 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
6558105
Default Alt Text
D92.1759101803.diff (11 KB)
Attached To
Mode
D92: Bugfix probmax issue for TENSOR daughter in EvtSSD_DirectCP model.
Attached
Detach File
Event Timeline
Log In to Comment