Line data Source code
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: EvtdFunctionSingle.cc
12 : //
13 : // Description: Evaluates one Wigner d-Functions.
14 : //
15 : // Modification history:
16 : //
17 : // fkw February 2, 2001 changes to satisfy KCC
18 : // RYD August 10, 2000 Module created
19 : //
20 : //------------------------------------------------------------------------
21 : //
22 : #include "EvtGenBase/EvtPatches.hh"
23 : #include <stdlib.h>
24 : #include <math.h>
25 : #include <iostream>
26 : #include <assert.h>
27 : #include "EvtGenBase/EvtdFunctionSingle.hh"
28 :
29 0 : EvtdFunctionSingle::EvtdFunctionSingle(){
30 0 : _j=0;
31 0 : _m1=0;
32 0 : _m2=0;
33 0 : _coef=0;
34 0 : _kmin=0;
35 0 : _kmax=0;
36 0 : }
37 :
38 :
39 0 : EvtdFunctionSingle::~EvtdFunctionSingle(){
40 0 : if (_coef!=0) delete [] _coef;
41 0 : }
42 :
43 :
44 : void EvtdFunctionSingle::init(int j,int m1,int m2){
45 :
46 0 : assert(abs(m2)>=abs(m1));
47 0 : assert(m2>=0);
48 :
49 0 : _j=j;
50 0 : _m1=m1;
51 0 : _m2=m2;
52 :
53 0 : _kmin=_m2-_m1;
54 0 : _kmax=_j-_m1;
55 :
56 0 : assert(_kmin<=_kmax);
57 :
58 0 : _coef=new double[(_kmax-_kmin)/2+1];
59 :
60 : int k;
61 :
62 0 : for(k=_kmin;k<=_kmax;k+=2){
63 : int sign=1;
64 0 : if ((k-_m2+_m1)%4!=0) sign=-sign;
65 0 : double tmp = fact((_j+_m2)/2)*fact((_j-_m2)/2)
66 0 : *fact((_j+_m1)/2)*fact((_j-_m1)/2);
67 0 : _coef[(k-_kmin)/2]=sign*sqrt(tmp)/
68 0 : (fact((_j+_m2-k)/2)*fact(k/2)*fact((_j-_m1-k)/2)*fact((k-_m2+_m1)/2));
69 :
70 : }
71 :
72 0 : }
73 :
74 :
75 : double EvtdFunctionSingle::d(int j,int m1,int m2, double theta){
76 :
77 0 : assert(j==_j); _unused( j );
78 0 : assert(m1==_m1);
79 0 : assert(m2==_m2);
80 :
81 0 : double c2=cos(0.5*theta);
82 0 : double s2=sin(0.5*theta);
83 :
84 : double d=0.0;
85 :
86 : int k;
87 0 : for(k=_kmin;k<=_kmax;k+=2){
88 0 : d+=_coef[(k-_kmin)/2]*pow(c2,(2*_j-2*k+m2-m1)/2)*pow(s2,(2*k-m2+m1)/2);
89 : }
90 :
91 0 : return d;
92 :
93 : }
94 :
95 :
96 : int EvtdFunctionSingle::fact(int n){
97 :
98 0 : assert(n>=0);
99 :
100 : int f=1;
101 :
102 : int k;
103 0 : for(k=2;k<=n;k++) f*=k;
104 :
105 0 : return f;
106 :
107 : }
108 :
109 :
110 :
|