46 _pstates = amp._pstates;
47 for ( i = 0; i < _ndaug; i++ )
49 dstates[i] = amp.dstates[i];
50 _dnontrivial[i] = amp._dnontrivial[i];
52 _nontrivial = amp._nontrivial;
56 for ( i = 0; i < _nontrivial; i++ )
58 _nstate[i] = amp._nstate[i];
62 for ( i = 0; i < namp; i++ ) { _amp[i] = amp._amp[i]; }
68 int daug_states[100], parstates;
69 for ( ichild = 0; ichild < ndaugs; ichild++ )
74 setNState( parstates, daug_states );
77void EvtAmp::setNDaug(
int n ) { _ndaug =
n; }
79void EvtAmp::setNState(
int parent_states,
int* daug_states ) {
82 _pstates = parent_states;
86 _nstate[_nontrivial] = _pstates;
92 for ( i = 0; i < _ndaug; i++ )
94 dstates[i] = daug_states[i];
96 if ( daug_states[i] > 1 )
98 _nstate[_nontrivial] = daug_states[i];
99 _dnontrivial[i] = _nontrivial;
104 if ( _nontrivial > 5 )
105 {
report(
ERROR,
"EvtGen" ) <<
"Too many nontrivial states in EvtAmp!" << endl; }
111 int position = ind[0];
113 for (
int i = 1; i < _nontrivial; i++ )
115 nstatepad *= _nstate[i - 1];
116 position += nstatepad * ind[i];
124 int position = ind[0];
126 for (
int i = 1; i < _nontrivial; i++ )
128 nstatepad *= _nstate[i - 1];
129 position += nstatepad * ind[i];
132 return _amp[position];
147 if ( _nontrivial == 0 )
150 rho.
Set( 0, 0, _amp[0] *
conj( _amp[0] ) );
158 for ( i = 0; i < _nontrivial; i++ ) {
n *= _nstate[i]; }
160 for ( i = 0; i <
n; i++ ) { temp += _amp[i] *
conj( _amp[i] ); }
162 rho.
Set( 0, 0, temp );
171 for ( i = 0; i < _pstates; i++ )
173 for ( j = 0; j < _pstates; j++ )
181 for ( kk = 0; kk < ( _nontrivial - 1 ); kk++ ) { allloop *= dstates[kk]; }
183 for ( kk = 0; kk < allloop; kk++ )
184 { temp += _amp[_pstates * kk + i] *
conj( _amp[_pstates * kk + j] ); }
190 rho.
Set( i, j, temp );
213 ampprime = ( *this );
215 for ( k = 0; k < _ndaug; k++ )
218 if ( dstates[k] != 1 )
219 { ampprime = ampprime.
contract( _dnontrivial[k], rho_list[k + 1] ); }
222 return ampprime.
contract( 0, ( *
this ) );
233 if ( dstates[i] == 1 )
243 ampprime = ( *this );
245 if ( _pstates != 1 ) { ampprime = ampprime.
contract( 0, rho_list[0] ); }
247 for ( k = 0; k < i; k++ )
250 if ( dstates[k] != 1 )
251 { ampprime = ampprime.
contract( _dnontrivial[k], rho_list[k + 1] ); }
254 return ampprime.
contract( _dnontrivial[i], ( *
this ) );
262 temp._ndaug = _ndaug;
263 temp._pstates = _pstates;
264 temp._nontrivial = _nontrivial;
266 for ( i = 0; i < _ndaug; i++ )
268 temp.dstates[i] = dstates[i];
269 temp._dnontrivial[i] = _dnontrivial[i];
272 if ( _nontrivial == 0 )
273 {
report(
ERROR,
"EvtGen" ) <<
"Should not be here EvtAmp!" << endl; }
275 for ( i = 0; i < _nontrivial; i++ ) { temp._nstate[i] = _nstate[i]; }
280 for ( i = 0; i < 10; i++ ) { index[i] = 0; }
284 for ( i = 0; i < _nontrivial; i++ ) { allloop *= _nstate[i]; }
286 for ( i = 0; i < allloop; i++ )
290 int tempint = index[k];
291 for ( j = 0; j < _nstate[k]; j++ )
294 c += rho.
Get( j, tempint ) *
getAmp( index );
301 for ( ii = 0; ii < _nontrivial; ii++ )
305 if ( index[ii] == ( _nstate[ii] - 1 ) ) { index[ii] = 0; }
328 for ( i = 0; i < _nontrivial; i++ ) { allloop *= _nstate[i]; }
333 for ( i = 0; i < _nstate[k]; i++ )
336 for ( j = 0; j < _nstate[k]; j++ )
338 if ( _nontrivial == 0 )
340 report(
ERROR,
"EvtGen" ) <<
"Should not be here1 EvtAmp!" << endl;
345 for ( ii = 0; ii < 10; ii++ )
355 for ( l = 0; l < int( allloop / _nstate[k] ); l++ )
360 for ( ii = 0; ii < _nontrivial; ii++ )
366 if ( index[ii] == ( _nstate[ii] - 1 ) )
381 rho.
Set( i, j, temp );
390 assert( a2._pstates > 1 && a2._nontrivial == 1 );
393 report(
DEBUG,
"EvtGen" ) <<
"EvtAmp::contract not written yet" << endl;
401 report(
DEBUG,
"EvtGen" ) <<
"Number of daugthers:" << _ndaug << endl;
402 report(
DEBUG,
"EvtGen" ) <<
"Number of states of the parent:" << _pstates << endl;
403 report(
DEBUG,
"EvtGen" ) <<
"Number of states on daughters:";
404 for ( i = 0; i < _ndaug; i++ ) {
report(
DEBUG,
"EvtGen" ) << dstates[i] <<
" "; }
406 report(
DEBUG,
"EvtGen" ) <<
"Nontrivial index of daughters:";
407 for ( i = 0; i < _ndaug; i++ ) {
report(
DEBUG,
"EvtGen" ) << _dnontrivial[i] <<
" "; }
409 report(
DEBUG,
"EvtGen" ) <<
"number of nontrivial states:" << _nontrivial << endl;
410 report(
DEBUG,
"EvtGen" ) <<
"Nontrivial particles number of states:";
411 for ( i = 0; i < _nontrivial; i++ ) {
report(
DEBUG,
"EvtGen" ) << _nstate[i] <<
" "; }
413 report(
DEBUG,
"EvtGen" ) <<
"Amplitudes:" << endl;
414 if ( _nontrivial == 0 )
422 for ( i = 0; i < _nontrivial; i++ )
424 if ( i == 0 ) { allloop[i] *= _nstate[i]; }
425 else { allloop[i] = allloop[i - 1] * _nstate[i]; }
428 for ( i = 0; i < allloop[_nontrivial - 1]; i++ )
431 if ( i == allloop[index] - 1 )
438 report(
DEBUG,
"EvtGen" ) <<
"-----------------------------------" << endl;
475 _pstates = amp._pstates;
476 for ( i = 0; i < _ndaug; i++ )
478 dstates[i] = amp.dstates[i];
479 _dnontrivial[i] = amp._dnontrivial[i];
481 _nontrivial = amp._nontrivial;
485 for ( i = 0; i < _nontrivial; i++ )
487 _nstate[i] = amp._nstate[i];
491 for ( i = 0; i < namp; i++ ) { _amp[i] = amp._amp[i]; }
Evt3Rank3C conj(const Evt3Rank3C &t2)
ostream & report(Severity severity, const char *facility)
const EvtComplex & getAmp(int *ind) const
EvtSpinDensity contract(int i, const EvtAmp &a)
void setAmp(int *ind, const EvtComplex &)
void vertex(const EvtComplex &)
void init(EvtId p, int ndaug, EvtId *daug)
EvtSpinDensity getBackwardSpinDensity(EvtSpinDensity *rho_list)
EvtSpinDensity getForwardSpinDensity(EvtSpinDensity *rho_list, int k)
EvtSpinDensity getSpinDensity()
EvtAmp & operator=(const EvtAmp &)
static EvtSpinType::spintype getSpinType(EvtId i)
const EvtComplex & Get(int i, int j) const
void Set(int i, int j, const EvtComplex &rhoij)
static int getSpinStates(spintype stype)