47 for ( ib = 0; ib < _nB; ib++ ) {
delete[] _HBC[ib]; }
51 for ( ia = 0; ia < _nA; ia++ ) {
delete[] _RA[ia]; }
54 for ( ib = 0; ib < _nB; ib++ ) {
delete[] _RB[ib]; }
57 for ( ic = 0; ic < _nC; ic++ ) {
delete[] _RC[ic]; }
60 for ( ia = 0; ia < _nA; ia++ )
62 for ( ib = 0; ib < _nB; ib++ )
64 delete[] _amp[ia][ib];
65 delete[] _amp1[ia][ib];
66 delete[] _amp3[ia][ib];
92 _lambdaA2 =
new int[_nA];
93 _lambdaB2 =
new int[_nB];
94 _lambdaC2 =
new int[_nC];
98 for ( ib = 0; ib < _nB; ib++ ) { _HBC[ib] =
new EvtComplex[_nC]; }
101 for ( ia = 0; ia < _nA; ia++ ) { _RA[ia] =
new EvtComplex[_nA]; }
103 for ( ib = 0; ib < _nB; ib++ ) { _RB[ib] =
new EvtComplex[_nB]; }
105 for ( ic = 0; ic < _nC; ic++ ) { _RC[ic] =
new EvtComplex[_nC]; }
110 for ( ia = 0; ia < _nA; ia++ )
115 for ( ib = 0; ib < _nB; ib++ )
125 fillHelicity( _lambdaA2, _nA, _JA2 );
126 fillHelicity( _lambdaB2, _nB, _JB2 );
127 fillHelicity( _lambdaC2, _nC, _JC2 );
129 for ( ib = 0; ib < _nB; ib++ )
131 for ( ic = 0; ic < _nC; ic++ ) { _HBC[ib][ic] = HBC[ib][ic]; }
137 double c = 1.0 / sqrt( 4 *
EvtConst::pi / ( _JA2 + 1 ) );
144 double maxprob = 0.0;
146 for ( itheta = -10; itheta <= 10; itheta++ )
148 theta = acos( 0.099999 * itheta );
149 for ( ia = 0; ia < _nA; ia++ )
152 for ( ib = 0; ib < _nB; ib++ )
154 for ( ic = 0; ic < _nC; ic++ )
156 _amp[ia][ib][ic] = 0.0;
157 if (
abs( _lambdaB2[ib] - _lambdaC2[ic] ) <= _JA2 )
161 EvtdFunction::d( _JA2, _lambdaA2[ia], _lambdaB2[ib] - _lambdaC2[ic], theta );
162 prob +=
real( _amp[ia][ib][ic] *
conj( _amp[ia][ib][ic] ) );
167 prob *= sqrt( 1.0 * _nA );
169 if ( prob > maxprob ) maxprob = prob;
196 for ( ia = 0; ia < _nA; ia++ )
198 for ( ib = 0; ib < _nB; ib++ )
200 for ( ic = 0; ic < _nC; ic++ )
202 _amp[ia][ib][ic] = 0.0;
203 if (
abs( _lambdaB2[ib] - _lambdaC2[ic] ) <= _JA2 )
206 EvtdFunction::d( _JA2, _lambdaA2[ia], _lambdaB2[ib] - _lambdaC2[ic], theta );
211 ( _lambdaA2[ia] - _lambdaB2[ib] + _lambdaC2[ic] ) ) ) *
214 prob1 +=
real( _amp[ia][ib][ic] *
conj( _amp[ia][ib][ic] ) );
219 setUpRotationMatrices( p, theta, phi );
221 applyRotationMatrices();
225 for ( ia = 0; ia < _nA; ia++ )
227 for ( ib = 0; ib < _nB; ib++ )
229 for ( ic = 0; ic < _nC; ic++ )
231 prob2 +=
real( _amp[ia][ib][ic] *
conj( _amp[ia][ib][ic] ) );
236 if ( _nC == 1 ) { amp.
vertex( _amp[ia][ib][ic] ); }
237 else { amp.
vertex( ic, _amp[ia][ib][ic] ); }
241 if ( _nC == 1 ) { amp.
vertex( ib, _amp[ia][ib][ic] ); }
244 amp.
vertex( ib, ic, _amp[ia][ib][ic] );
253 if ( _nC == 1 ) { amp.
vertex( ia, _amp[ia][ib][ic] ); }
254 else { amp.
vertex( ia, ic, _amp[ia][ib][ic] ); }
258 if ( _nC == 1 ) { amp.
vertex( ia, ib, _amp[ia][ib][ic] ); }
259 else { amp.
vertex( ia, ib, ic, _amp[ia][ib][ic] ); }
266 if ( fabs( prob1 - prob2 ) > 0.000001 * prob1 )
268 report(
INFO,
"EvtGen" ) <<
"prob1,prob2:" << prob1 <<
" " << prob2 << endl;
275void EvtEvalHelAmp::fillHelicity(
int* lambda2,
int n,
int J2 ) {
280 if (
n == 2 && J2 == 2 )
287 assert(
n == J2 + 1 );
289 for ( i = 0; i <
n; i++ ) { lambda2[i] =
n - i * 2 - 1; }
294void EvtEvalHelAmp::setUpRotationMatrices(
EvtParticle* p,
double theta,
double phi ) {
319 for ( i = 0; i <
n; i++ )
321 for ( j = 0; j <
n; j++ ) { _RA[i][j] =
R.Get( i, j ); }
328 report(
ERROR,
"EvtGen" ) <<
"Spin2(_JA2)=" << _JA2 <<
" not supported!" << endl;
357 for ( i = 0; i <
n; i++ )
359 for ( j = 0; j <
n; j++ ) { _RB[i][j] =
conj(
R.Get( i, j ) ); }
366 report(
ERROR,
"EvtGen" ) <<
"Spin2(_JB2)=" << _JB2 <<
" not supported!" << endl;
396 for ( i = 0; i <
n; i++ )
398 for ( j = 0; j <
n; j++ ) { _RC[i][j] =
conj(
R.Get( i, j ) ); }
405 report(
ERROR,
"EvtGen" ) <<
"Spin2(_JC2)=" << _JC2 <<
" not supported!" << endl;
410void EvtEvalHelAmp::applyRotationMatrices() {
416 for ( ia = 0; ia < _nA; ia++ )
418 for ( ib = 0; ib < _nB; ib++ )
420 for ( ic = 0; ic < _nC; ic++ )
423 for ( i = 0; i < _nC; i++ ) { temp += _RC[i][ic] * _amp[ia][ib][i]; }
424 _amp1[ia][ib][ic] = temp;
429 for ( ia = 0; ia < _nA; ia++ )
431 for ( ic = 0; ic < _nC; ic++ )
433 for ( ib = 0; ib < _nB; ib++ )
436 for ( i = 0; i < _nB; i++ ) { temp += _RB[i][ib] * _amp1[ia][i][ic]; }
437 _amp3[ia][ib][ic] = temp;
442 for ( ib = 0; ib < _nB; ib++ )
444 for ( ic = 0; ic < _nC; ic++ )
446 for ( ia = 0; ia < _nA; ia++ )
449 for ( i = 0; i < _nA; i++ ) { temp += _RA[i][ia] * _amp3[i][ib][ic]; }
450 _amp[ia][ib][ic] = temp;
Evt3Rank3C conj(const Evt3Rank3C &t2)
EvtComplex exp(const EvtComplex &c)
EvtComplex * EvtComplexPtr
EvtComplexPtr * EvtComplexPtrPtr
ostream & report(Severity severity, const char *facility)
void vertex(const EvtComplex &)
EvtEvalHelAmp(EvtSpinType::spintype A, EvtSpinType::spintype B, EvtSpinType::spintype C, EvtComplexPtrPtr HBC)
void evalAmp(EvtParticle *p, EvtAmp &)
const EvtVector4R & getP4() const
virtual EvtSpinDensity rotateToHelicityBasis() const =0
EvtParticle * getDaug(int i)
static int getSpin2(spintype stype)
static int getSpinStates(spintype stype)
static double d(int j, int m1, int m2, double theta)
complex_t R(double Q2, double M2, double G, double Mp2, double Mm2)