BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
EvtHypNonLepton.cc
Go to the documentation of this file.
1//-----------------------------------------------------------------------------------------------
2//
3// Module: EvtHypNonLepton.cpp
4//
5// Desription: Routine to implement Hyperon(s=1/2) -> Baryon(s=1/2) + Scalar decays accroding
6// to
7// Review Of Particle Physics 2004, Phys.Lett.B, Vol.592, p.864
8//
9// Modification history:
10//
11// 09/02/2009 PR Corrected Delta sign
12// 20/02/2005 PR Module created according to PHSP and Lb2Lll model
13//
14//-----------------------------------------------------------------------------------------------
15
16#ifdef WIN32
17# pragma warning( disable : 4786 )
18// Disable anoying warning about symbol size
19#endif
20
21#include "EvtHypNonLepton.hh"
30
32
34
35void EvtHypNonLepton::getName( std::string& model_name ) { model_name = "HypNonLepton"; }
36
38
39 if ( getNArg() < 2 || getNArg() > 3 )
40 { // alpha phi gamma delta
41 report( ERROR, "EvtGen" )
42 << " ERROR: EvtHypNonLepton generator expected 2 or 3 arguments but found: "
43 << getNArg() << std::endl;
44 report( INFO, "EvtGen" ) << " 1. Decay asymmetry parameter - alpha" << std::endl;
45 report( INFO, "EvtGen" ) << " 2. Parameter phi - in degrees (not radians)" << std::endl;
46 report( INFO, "EvtGen" ) << " 3. Note on every x-th decay" << std::endl;
47 ::abort();
48 }
49
50 if ( getNDaug() != 2 )
51 { // Check that there are 2 daughters only
52 report( ERROR, "EvtGen" )
53 << " ERROR: EvtHypNonLepton generator expected 2 daughters but found: " << getNDaug()
54 << std::endl;
55 ::abort();
56 }
57
58 // Check particles spins
60 {
61 report( ERROR, "EvtGen" )
62 << " ERROR: EvtHypNonLepton generator expected dirac parent particle, but found "
64 << " spin degrees of freedom" << std::endl;
65 ::abort();
66 }
68 {
69 report( ERROR, "EvtGen" ) << " ERROR: EvtHypNonLepton generator expected the first child "
70 "to be dirac particle, but found "
72 << " spin degrees of freedom" << std::endl;
73 ::abort();
74 }
76 {
77 report( ERROR, "EvtGen" ) << " ERROR: EvtHypNonLepton generator expected the second child "
78 "to be scalar particle, but found "
80 << " spin degrees of freedom" << std::endl;
81 ::abort();
82 }
83
84 // Read all parameters
85 m_alpha = getArg( 0 );
86 m_phi = getArg( 1 ) * EvtConst::pi / 180;
87 if ( getNArg() == 3 ) m_noTries = static_cast<long>( getArg( 2 ) );
88 else m_noTries = 0;
89
90 // calculate additional parameters
91 double p, M, m1, m2;
92 double p_to_s, beta, delta, gamma;
93
95 m1 = EvtPDL::getMass( getDaug( 0 ) );
96 m2 = EvtPDL::getMass( getDaug( 1 ) );
97
98 if ( m1 + m2 >= M )
99 {
100 report( ERROR, "EvtGen" ) << " ERROR: EvtHypNonLepton found impossible decay: " << M
101 << " --> " << m1 << " + " << m2 << " GeV\n"
102 << std::endl;
103 ::abort();
104 }
105
106 p = sqrt( M * M - ( m1 + m2 ) * ( m1 + m2 ) ) * sqrt( M * M - ( m1 - m2 ) * ( m1 - m2 ) ) /
107 2. / M;
108
109 beta = sqrt( 1. - m_alpha * m_alpha ) * sin( m_phi );
110 delta = -atan2( beta, m_alpha );
111 gamma = sqrt( 1. - m_alpha * m_alpha - beta * beta );
112 p_to_s = sqrt( ( 1. - gamma ) / ( 1. + gamma ) );
113
114 m_B_to_A =
115 p_to_s * ( m1 + sqrt( p * p + m1 * m1 ) ) / p * EvtComplex( cos( delta ), sin( delta ) );
116}
117
119
120 double maxProb, m1, m2, M, p;
121
123 m1 = EvtPDL::getMass( getDaug( 0 ) );
124 m2 = EvtPDL::getMass( getDaug( 1 ) );
125
126 if ( m1 + m2 >= M )
127 {
128 report( ERROR, "EvtGen" ) << " ERROR: EvtHypNonLepton found impossible decay: " << M
129 << " --> " << m1 << " + " << m2 << " GeV\n"
130 << std::endl;
131 ::abort();
132 }
133
134 p = sqrt( M * M - ( m1 + m2 ) * ( m1 + m2 ) ) * sqrt( M * M - ( m1 - m2 ) * ( m1 - m2 ) ) /
135 2 / M;
136 maxProb = 16 * M *
137 ( sqrt( p * p + m1 * m1 ) + m1 +
138 abs( m_B_to_A ) * abs( m_B_to_A ) * ( sqrt( p * p + m1 * m1 ) - m1 ) );
139 // maxProb *= G_F*M_pi*M_pi;
140
141 setProbMax( maxProb );
142 report( INFO, "EvtGen" ) << " EvtHypNonLepton set up maximum probability to " << maxProb
143 << std::endl;
144}
145
147
148 parent->initializePhaseSpace( getNDaug(), getDaugs() );
149 calcAmp( &_amp2, parent );
150}
151
153
154 static long noTries = 0;
155 int i;
156 EvtComplex Matrix[2][2], B_to_A;
157
158 // G_F = 1.16637e-5;
159 // M_pi = 0.13957;
160
161 for ( i = 0; i < 4; i++ )
162 {
163 // std::cout << "--------------------------------------------------" << std::endl;
164 Matrix[i / 2][i % 2] =
165 EvtLeptonSCurrent( parent->sp( i / 2 ), parent->getDaug( 0 )->spParent( i % 2 ) );
166 // std::cout << "Matrix = " << Matrix[i/2][i%2] << std::endl;
167 Matrix[i / 2][i % 2] -=
168 m_B_to_A *
169 EvtLeptonPCurrent( parent->sp( i / 2 ), parent->getDaug( 0 )->spParent( i % 2 ) );
170 // std::cout << "Matrix = " << Matrix[i/2][i%2] << std::endl;
171 // Matrix[i/2][i%2] *= G_F*M_pi*M_pi;
172 // std::cout << "Matrix = " << Matrix[i/2][i%2] << std::endl;
173 // std::cout << "--------------------------------------------------" << std::endl;
174 amp->vertex( i / 2, i % 2, Matrix[i / 2][i % 2] );
175 }
176
177 if ( m_noTries > 0 )
178 if ( !( ( ++noTries ) % m_noTries ) )
179 report( DEBUG, "EvtGen" ) << " EvtHypNonLepton already finished " << noTries
180 << " matrix element calculations" << std::endl;
181}
EvtComplex EvtLeptonSCurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
EvtComplex EvtLeptonPCurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
ostream & report(Severity severity, const char *facility)
Definition EvtReport.cc:34
@ DEBUG
Definition EvtReport.hh:53
@ ERROR
Definition EvtReport.hh:49
@ INFO
Definition EvtReport.hh:52
void vertex(const EvtComplex &amp)
Definition EvtAmp.cc:441
static const double pi
Definition EvtConst.hh:27
double getArg(int j)
void setProbMax(double prbmx)
EvtId getParentId()
EvtId * getDaugs()
EvtId getDaug(int i)
EvtDecayBase * clone()
void getName(std::string &name)
void calcAmp(EvtAmp *amp, EvtParticle *parent)
void decay(EvtParticle *p)
virtual ~EvtHypNonLepton()
static EvtSpinType::spintype getSpinType(EvtId i)
Definition EvtPDL.hh:66
static double getMass(EvtId i)
Definition EvtPDL.hh:44
virtual EvtDiracSpinor spParent(int) const
EvtParticle * getDaug(int i)
virtual EvtDiracSpinor sp(int) const
double initializePhaseSpace(int numdaughter, EvtId *daughters, double poleSize=-1., int whichTwo1=0, int whichTwo2=1)
static int getSpin2(spintype stype)
double double * m2
Definition qcdloop1.h:83
double * m1
Definition qcdloop1.h:83