Page MenuHomeHEPForge

D92.1759178848.diff
No OneTemporary

Size
11 KB
Referenced Files
None
Subscribers
None

D92.1759178848.diff

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

Mime Type
text/plain
Expires
Mon, Sep 29, 9:47 PM (22 h, 35 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
6558105
Default Alt Text
D92.1759178848.diff (11 KB)

Event Timeline