BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
EvtCGCoefSingle.cc
Go to the documentation of this file.
1//--------------------------------------------------------------------------
2//
3// Environment:
4// This software is part of the EvtGen package developed jointly
5// for the BaBar and CLEO collaborations. If you use all or part
6// of it, please give an appropriate acknowledgement.
7//
8// Copyright Information: See EvtGen/COPYRIGHT
9// Copyright (C) 2000 Caltech, UCSB
10//
11// Module: EvtCGCoefSingle.cc
12//
13// Description: Evaluates Clebsch-Gordon coef for fixed j1 and j2.
14//
15// Modification history:
16//
17// fkw February 2, 2001 changes to satisfy KCC
18// RYD August 12, 2000 Module created
19//
20//------------------------------------------------------------------------
21//
22#include "EvtCGCoefSingle.hh"
23#include "EvtOrthogVector.hh"
24#include "EvtPatches.hh"
25#include <assert.h>
26#include <iostream>
27#include <math.h>
28#include <stdlib.h>
29
31
32void EvtCGCoefSingle::init( int j1, int j2 ) {
33
34 _j1 = j1;
35 _j2 = j2;
36
37 _Jmax = abs( j1 + j2 );
38 _Jmin = abs( j1 - j2 );
39
40 _table.resize( ( _Jmax - _Jmin ) / 2 + 1 );
41
42 int J, M;
43
44 int lenmax = j1 + 1;
45 if ( j2 < j1 ) lenmax = j2 + 1;
46
47 // set vector sizes
48 for ( J = _Jmax; J >= _Jmin; J -= 2 )
49 {
50 _table[( J - _Jmin ) / 2].resize( J + 1 );
51 for ( M = J; J >= -M; M -= 2 )
52 {
53 int len = ( ( _j1 + _j2 ) - abs( M ) ) / 2 + 1;
54 if ( len > lenmax ) len = lenmax;
55 _table[( J - _Jmin ) / 2][( M + J ) / 2].resize( len );
56 }
57 }
58
59 // now fill the vectors
60 for ( J = _Jmax; J >= _Jmin; J -= 2 )
61 {
62 // bootstrap with highest M(=J) as a special case
63 if ( J == _Jmax ) { cg( J, J, _j1, _j2 ) = 1.0; }
64 else
65 {
66 int n = ( _Jmax - J ) / 2 + 1;
67 std::vector<double>* vectors = new std::vector<double>[n - 1];
68 int i, k;
69 for ( i = 0; i < n - 1; i++ )
70 {
71 // i corresponds to J=Jmax-2*i
72 vectors[i].resize( n );
73 for ( k = 0; k < n; k++ )
74 {
75 double tmp = _table[( _Jmax - _Jmin ) / 2 - i][( J + _Jmax - 2 * i ) / 2][k];
76 vectors[i][k] = tmp;
77 }
78 }
79 EvtOrthogVector getOrth( n, vectors );
80 std::vector<double> orth = getOrth.getOrthogVector();
81 int sign = 1;
82 if ( orth[n - 1] < 0.0 ) sign = -1;
83 for ( k = 0; k < n; k++ ) { _table[( J - _Jmin ) / 2][J][k] = sign * orth[k]; }
84 }
85 for ( M = J - 2; M >= -J; M -= 2 )
86 {
87 int len = ( ( _j1 + _j2 ) - abs( M ) ) / 2 + 1;
88 if ( len > lenmax ) len = lenmax;
89 int mmin = M - j2;
90 if ( mmin < -j1 ) mmin = -j1;
91 int m1;
92 for ( m1 = mmin; m1 < mmin + len * 2; m1 += 2 )
93 {
94 int m2 = M - m1;
95 double sum = 0.0;
96 float fkwTmp = _j1 * ( _j1 + 2 ) - ( m1 + 2 ) * m1;
97 // fkw 2/2/2001: changes needed to satisfy KCC
98 // fkw if (m1+2<=_j1) sum+=0.5*sqrt(_j1*(_j1+2)-(m1+2)*m1)*cg(J,M+2,m1+2,m2);
99 // fkw if (m2+2<=_j2) sum+=0.5*sqrt(_j2*(_j2+2)-(m2+2)*m2)*cg(J,M+2,m1,m2+2);
100 // fkw sum/=(0.5*sqrt(J*(J+2)-(M+2)*M));
101 if ( m1 + 2 <= _j1 ) sum += 0.5 * sqrt( fkwTmp ) * cg( J, M + 2, m1 + 2, m2 );
102 fkwTmp = _j2 * ( _j2 + 2 ) - ( m2 + 2 ) * m2;
103 if ( m2 + 2 <= _j2 ) sum += 0.5 * sqrt( fkwTmp ) * cg( J, M + 2, m1, m2 + 2 );
104 fkwTmp = J * ( J + 2 ) - ( M + 2 ) * M;
105 sum /= ( 0.5 * sqrt( fkwTmp ) );
106 cg( J, M, m1, m2 ) = sum;
107 }
108 }
109 }
110}
111
112double EvtCGCoefSingle::coef( int J, int M, int j1, int j2, int m1, int m2 ) {
113
114 assert( j1 == _j1 );
115 assert( j2 == _j2 );
116
117 return cg( J, M, m1, m2 );
118}
119
120double& EvtCGCoefSingle::cg( int J, int M, int m1, int m2 ) {
121
122 assert( M == m1 + m2 );
123 assert( abs( M ) <= J );
124 assert( J <= _Jmax );
125 assert( J >= _Jmin );
126 assert( abs( m1 ) <= _j1 );
127 assert( abs( m2 ) <= _j2 );
128
129 // find lowest m1 allowed for the given M
130
131 int mmin = M - _j2;
132
133 if ( mmin < -_j1 ) mmin = -_j1;
134
135 int n = m1 - mmin;
136
137 return _table[( J - _Jmin ) / 2][( M + J ) / 2][n / 2];
138}
const Int_t n
double coef(int J, int M, int j1, int j2, int m1, int m2)
double double * m2
Definition qcdloop1.h:83
double * m1
Definition qcdloop1.h:83