61 <<
"_nA,_nB,_nC:" << _nA <<
"," << _nB <<
"," << _nC << endl;
71 <<
"_JA2,_JB2,_JC2:" << _JA2 <<
"," << _JB2 <<
"," << _JC2 << endl;
75 int* _lambdaA2 =
new int[_nA];
76 int* _lambdaB2 =
new int[_nB];
77 int* _lambdaC2 =
new int[_nC];
81 for ( ib = 0; ib < _nB; ib++ ) {
94 <<
"Helicity states of particle A:" << endl;
95 for ( i = 0; i < _nA; i++ ) {
100 <<
"Helicity states of particle B:" << endl;
101 for ( i = 0; i < _nB; i++ ) {
106 <<
"Helicity states of particle C:" << endl;
107 for ( i = 0; i < _nC; i++ ) {
112 <<
"Will now figure out the valid (M_LS) states:" << endl;
115 int Lmin = std::max( _JA2 - _JB2 - _JC2,
116 std::max( _JB2 - _JA2 - _JC2, _JC2 - _JA2 - _JB2 ) );
120 int Lmax = _JA2 + _JB2 + _JC2;
124 int _nPartialWaveAmp = 0;
129 for ( L = Lmin; L <= Lmax; L += 2 ) {
130 int Smin =
abs( L - _JA2 );
131 if ( Smin <
abs( _JB2 - _JC2 ) )
132 Smin =
abs( _JB2 - _JC2 );
134 if ( Smax >
abs( _JB2 + _JC2 ) )
135 Smax =
abs( _JB2 + _JC2 );
137 for ( S = Smin; S <= Smax; S += 2 ) {
138 _nL[_nPartialWaveAmp] = L;
139 _nS[_nPartialWaveAmp] = S;
144 <<
"M[" << L <<
"][" << S <<
"]" << endl;
155 double partampsqtot = 0.0;
157 for ( i = 0; i < _nPartialWaveAmp; i++ ) {
158 _M[i] =
getArg( argcounter ) *
162 partampsqtot +=
abs2( _M[i] );
165 <<
"M[" << _nL[i] <<
"][" << _nS[i] <<
"]=" << _M[i] << endl;
171 double helampsqtot = 0.0;
173 for ( ib = 0; ib < _nB; ib++ ) {
174 for ( ic = 0; ic < _nC; ic++ ) {
176 if (
abs( _lambdaB2[ib] - _lambdaC2[ic] ) <= _JA2 ) {
177 for ( i = 0; i < _nPartialWaveAmp; i++ ) {
180 int lambda2 = _lambdaB2[ib];
181 int lambda3 = _lambdaC2[ic];
185 int m1 = lambda2 - lambda3;
191 <<
"s2,lambda2:" << s2 <<
" " << lambda2 << endl;
194 double fkwTmp = ( L + 1.0 ) / ( s1 + 1.0 );
196 if ( S >=
abs( m1 ) ) {
198 c1.
coef( S, m1, s2, s3, lambda2,
200 c2.
coef( s1, m1, L, S, 0, m1 ) * _M[i];
206 <<
"_HBC[" << ib <<
"][" << ic <<
"]=" << _HBC[ib][ic]
210 helampsqtot +=
abs2( _HBC[ib][ic] );
214 if ( fabs( helampsqtot - partampsqtot ) / ( helampsqtot + partampsqtot ) >
221 for ( i = 0; i * 2 <
getNArg(); i++ ) {
223 <<
"M(" << _nL[i] <<
"," << _nS[i]
226 << _M[i] << std::endl;
229 <<
"The total probability in the partwave basis is: " << partampsqtot
232 <<
"The total probability in the helamp basis is: " << helampsqtot
235 <<
"Most likely this is because the specified partwave amplitudes " 238 <<
"project onto unphysical helicities of photons or neutrinos. " 241 <<
"Seriously consider if your specified amplitudes are correct. " 255 <<
"Calculated probmax" << maxprob << endl;
276 if ( n == 2 && J2 == 2 ) {
282 assert( n == J2 + 1 );
284 for ( i = 0; i < n; i++ ) {
285 lambda2[i] = n - i * 2 - 1;
static std::string name(EvtId i)
EvtDecayBase * clone() override
void decay(EvtParticle *p) override
double getArg(unsigned int j)
static EvtSpinType::spintype getSpinType(EvtId i)
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=0)
std::unique_ptr< EvtEvalHelAmp > _evalHelAmp
void fillHelicity(int *lambda2, int n, int J2)
double abs2(const EvtComplex &c)
static int getSpinStates(spintype stype)
std::string getName() override
void setProbMax(double prbmx)
EvtId getParentId() const
double initializePhaseSpace(unsigned int numdaughter, EvtId *daughters, bool forceResetMasses=false, double poleSize=-1., int whichTwo1=0, int whichTwo2=1)
void initProbMax() override
void checkNDaug(int d1, int d2=-1)
double coef(int J, int M, int j1, int j2, int m1, int m2)
void checkNArg(int a1, int a2=-1, int a3=-1, int a4=-1)
double abs(const EvtComplex &c)
static int getSpin2(spintype stype)
EvtComplex exp(const EvtComplex &c)
EvtId getDaug(int i) const