Changeset View
Changeset View
Standalone View
Standalone View
src/EvtGenBase/EvtCGCoefSingle.cpp
Show All 24 Lines | |||||
#include <assert.h> | #include <assert.h> | ||||
#include <iostream> | #include <iostream> | ||||
#include <math.h> | #include <math.h> | ||||
#include <stdlib.h> | #include <stdlib.h> | ||||
void EvtCGCoefSingle::init( int j1, int j2 ) | void EvtCGCoefSingle::init( int j1, int j2 ) | ||||
{ | { | ||||
_j1 = j1; | m_j1 = j1; | ||||
_j2 = j2; | m_j2 = j2; | ||||
_Jmax = abs( j1 + j2 ); | m_Jmax = abs( j1 + j2 ); | ||||
_Jmin = abs( j1 - j2 ); | m_Jmin = abs( j1 - j2 ); | ||||
_table.resize( ( _Jmax - _Jmin ) / 2 + 1 ); | m_table.resize( ( m_Jmax - m_Jmin ) / 2 + 1 ); | ||||
int J, M; | int J, M; | ||||
int lenmax = j1 + 1; | int lenmax = j1 + 1; | ||||
if ( j2 < j1 ) | if ( j2 < j1 ) | ||||
lenmax = j2 + 1; | lenmax = j2 + 1; | ||||
//set vector sizes | //set vector sizes | ||||
for ( J = _Jmax; J >= _Jmin; J -= 2 ) { | for ( J = m_Jmax; J >= m_Jmin; J -= 2 ) { | ||||
_table[( J - _Jmin ) / 2].resize( J + 1 ); | m_table[( J - m_Jmin ) / 2].resize( J + 1 ); | ||||
for ( M = J; J >= -M; M -= 2 ) { | for ( M = J; J >= -M; M -= 2 ) { | ||||
int len = ( ( _j1 + _j2 ) - abs( M ) ) / 2 + 1; | int len = ( ( m_j1 + m_j2 ) - abs( M ) ) / 2 + 1; | ||||
if ( len > lenmax ) | if ( len > lenmax ) | ||||
len = lenmax; | len = lenmax; | ||||
_table[( J - _Jmin ) / 2][( M + J ) / 2].resize( len ); | m_table[( J - m_Jmin ) / 2][( M + J ) / 2].resize( len ); | ||||
} | } | ||||
} | } | ||||
//now fill the vectors | //now fill the vectors | ||||
for ( J = _Jmax; J >= _Jmin; J -= 2 ) { | for ( J = m_Jmax; J >= m_Jmin; J -= 2 ) { | ||||
//bootstrap with highest M(=J) as a special case | //bootstrap with highest M(=J) as a special case | ||||
if ( J == _Jmax ) { | if ( J == m_Jmax ) { | ||||
cg( J, J, _j1, _j2 ) = 1.0; | cg( J, J, m_j1, m_j2 ) = 1.0; | ||||
} else { | } else { | ||||
int n = ( _Jmax - J ) / 2 + 1; | int n = ( m_Jmax - J ) / 2 + 1; | ||||
std::vector<double>* vectors = new std::vector<double>[n - 1]; | std::vector<double>* vectors = new std::vector<double>[n - 1]; | ||||
int i, k; | int i, k; | ||||
for ( i = 0; i < n - 1; i++ ) { | for ( i = 0; i < n - 1; i++ ) { | ||||
// i corresponds to J=Jmax-2*i | // i corresponds to J=Jmax-2*i | ||||
vectors[i].resize( n ); | vectors[i].resize( n ); | ||||
for ( k = 0; k < n; k++ ) { | for ( k = 0; k < n; k++ ) { | ||||
double tmp = _table[( _Jmax - _Jmin ) / 2 - i] | double tmp = m_table[( m_Jmax - m_Jmin ) / 2 - i] | ||||
[( J + _Jmax - 2 * i ) / 2][k]; | [( J + m_Jmax - 2 * i ) / 2][k]; | ||||
vectors[i][k] = tmp; | vectors[i][k] = tmp; | ||||
} | } | ||||
} | } | ||||
EvtOrthogVector getOrth( n, vectors ); | EvtOrthogVector getOrth( n, vectors ); | ||||
std::vector<double> orth = getOrth.getOrthogVector(); | std::vector<double> orth = getOrth.getOrthogVector(); | ||||
int sign = 1; | int sign = 1; | ||||
if ( orth[n - 1] < 0.0 ) | if ( orth[n - 1] < 0.0 ) | ||||
sign = -1; | sign = -1; | ||||
for ( k = 0; k < n; k++ ) { | for ( k = 0; k < n; k++ ) { | ||||
_table[( J - _Jmin ) / 2][J][k] = sign * orth[k]; | m_table[( J - m_Jmin ) / 2][J][k] = sign * orth[k]; | ||||
} | } | ||||
delete[] vectors; | delete[] vectors; | ||||
} | } | ||||
for ( M = J - 2; M >= -J; M -= 2 ) { | for ( M = J - 2; M >= -J; M -= 2 ) { | ||||
int len = ( ( _j1 + _j2 ) - abs( M ) ) / 2 + 1; | int len = ( ( m_j1 + m_j2 ) - abs( M ) ) / 2 + 1; | ||||
if ( len > lenmax ) | if ( len > lenmax ) | ||||
len = lenmax; | len = lenmax; | ||||
int mmin = M - j2; | int mmin = M - j2; | ||||
if ( mmin < -j1 ) | if ( mmin < -j1 ) | ||||
mmin = -j1; | mmin = -j1; | ||||
int m1; | int m1; | ||||
for ( m1 = mmin; m1 < mmin + len * 2; m1 += 2 ) { | for ( m1 = mmin; m1 < mmin + len * 2; m1 += 2 ) { | ||||
int m2 = M - m1; | int m2 = M - m1; | ||||
double sum = 0.0; | double sum = 0.0; | ||||
float fkwTmp = _j1 * ( _j1 + 2 ) - ( m1 + 2 ) * m1; | float fkwTmp = m_j1 * ( m_j1 + 2 ) - ( m1 + 2 ) * m1; | ||||
//fkw 2/2/2001: changes needed to satisfy KCC | //fkw 2/2/2001: changes needed to satisfy KCC | ||||
//fkw if (m1+2<=_j1) sum+=0.5*sqrt(_j1*(_j1+2)-(m1+2)*m1)*cg(J,M+2,m1+2,m2); | //fkw if (m1+2<=m_j1) sum+=0.5*sqrt(m_j1*(m_j1+2)-(m1+2)*m1)*cg(J,M+2,m1+2,m2); | ||||
//fkw if (m2+2<=_j2) sum+=0.5*sqrt(_j2*(_j2+2)-(m2+2)*m2)*cg(J,M+2,m1,m2+2); | //fkw if (m2+2<=m_j2) sum+=0.5*sqrt(m_j2*(m_j2+2)-(m2+2)*m2)*cg(J,M+2,m1,m2+2); | ||||
//fkw sum/=(0.5*sqrt(J*(J+2)-(M+2)*M)); | //fkw sum/=(0.5*sqrt(J*(J+2)-(M+2)*M)); | ||||
if ( m1 + 2 <= _j1 ) | if ( m1 + 2 <= m_j1 ) | ||||
sum += 0.5 * sqrt( fkwTmp ) * cg( J, M + 2, m1 + 2, m2 ); | sum += 0.5 * sqrt( fkwTmp ) * cg( J, M + 2, m1 + 2, m2 ); | ||||
fkwTmp = _j2 * ( _j2 + 2 ) - ( m2 + 2 ) * m2; | fkwTmp = m_j2 * ( m_j2 + 2 ) - ( m2 + 2 ) * m2; | ||||
if ( m2 + 2 <= _j2 ) | if ( m2 + 2 <= m_j2 ) | ||||
sum += 0.5 * sqrt( fkwTmp ) * cg( J, M + 2, m1, m2 + 2 ); | sum += 0.5 * sqrt( fkwTmp ) * cg( J, M + 2, m1, m2 + 2 ); | ||||
fkwTmp = J * ( J + 2 ) - ( M + 2 ) * M; | fkwTmp = J * ( J + 2 ) - ( M + 2 ) * M; | ||||
sum /= ( 0.5 * sqrt( fkwTmp ) ); | sum /= ( 0.5 * sqrt( fkwTmp ) ); | ||||
cg( J, M, m1, m2 ) = sum; | cg( J, M, m1, m2 ) = sum; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
} | } | ||||
double EvtCGCoefSingle::coef( int J, int M, int j1, int j2, int m1, int m2 ) | double EvtCGCoefSingle::coef( int J, int M, int j1, int j2, int m1, int m2 ) | ||||
{ | { | ||||
assert( j1 == _j1 ); | assert( j1 == m_j1 ); | ||||
_unused( j1 ); | UNUSED( j1 ); | ||||
assert( j2 == _j2 ); | assert( j2 == m_j2 ); | ||||
_unused( j2 ); | UNUSED( j2 ); | ||||
return cg( J, M, m1, m2 ); | return cg( J, M, m1, m2 ); | ||||
} | } | ||||
double& EvtCGCoefSingle::cg( int J, int M, int m1, int m2 ) | double& EvtCGCoefSingle::cg( int J, int M, int m1, int m2 ) | ||||
{ | { | ||||
assert( M == m1 + m2 ); | assert( M == m1 + m2 ); | ||||
_unused( m2 ); | UNUSED( m2 ); | ||||
assert( abs( M ) <= J ); | assert( abs( M ) <= J ); | ||||
assert( J <= _Jmax ); | assert( J <= m_Jmax ); | ||||
assert( J >= _Jmin ); | assert( J >= m_Jmin ); | ||||
assert( abs( m1 ) <= _j1 ); | assert( abs( m1 ) <= m_j1 ); | ||||
assert( abs( m2 ) <= _j2 ); | assert( abs( m2 ) <= m_j2 ); | ||||
//find lowest m1 allowed for the given M | //find lowest m1 allowed for the given M | ||||
int mmin = M - _j2; | int mmin = M - m_j2; | ||||
if ( mmin < -_j1 ) | if ( mmin < -m_j1 ) | ||||
mmin = -_j1; | mmin = -m_j1; | ||||
int n = m1 - mmin; | int n = m1 - mmin; | ||||
return _table[( J - _Jmin ) / 2][( M + J ) / 2][n / 2]; | return m_table[( J - m_Jmin ) / 2][( M + J ) / 2][n / 2]; | ||||
} | } |