GamR  0.0.0
GammaROOT
Loading...
Searching...
No Matches
AngDist.cc
Go to the documentation of this file.
1
13
14/* C++ */
15#include <cmath>
16#include <complex>
17#include <iostream>
18#include <vector>
19
20/* CERN ROOT */
21#include <Math/SpecFunc.h> /* legendre polynomials, 3j and 6j symbols */
22
23#include "AngDist.hh"
24#include "WignerD.hh"
25
26namespace GamR {
27namespace AngDist {
28
32double Fk(double k, double jf, double lambda, double lambdaPrime, double ji)
33{
34 return pow((-1), -1 + ji + jf) * pow((2 * lambda + 1) * (2 * lambdaPrime + 1) * (2 * ji + 1) * (2 * k + 1), 0.5) *
35 ROOT::Math::wigner_3j((int)(2 * lambda), (int)(2 * lambdaPrime), (int)(2 * k),
36 2, -2, 0) *
37 ROOT::Math::wigner_6j((int)(2 * ji), (int)(2 * ji), (int)(2 * k),
38 (int)(2 * lambdaPrime), (int)(2 * lambda), (int)(2 * jf));
39}
40
52double Fgen(double k, double k2, double k1, double jf, double lambda, double lambdaPrime, double ji)
53{
54 return pow(-1, lambdaPrime + k2 + k1 + 1) *
55 sqrt((2 * ji + 1) * (2 * jf + 1) * (2 * lambda + 1) * (2 * lambdaPrime + 1) * (2 * k1 + 1) * (2 * k2 + 1) *
56 (2 * k + 1)) *
57 ROOT::Math::wigner_3j((int)(2 * lambda), (int)(2 * lambdaPrime), (int)(2 * k), 2, -2, 0) *
58 ROOT::Math::wigner_9j((int)(2 * jf), (int)(2 * lambda), (int)(2 * ji), (int)(2 * jf), (int)(2 * lambdaPrime),
59 (int)(2 * ji), (int)(2 * k2), (int)(2 * k), (int)(2 * k1));
60}
61
66double Ak(double k, double ji, double lambda, double lambdaPrime, double jf, double delta)
67{
68 return 1. / (1. + pow(delta, 2)) *
69 (Fk(k, jf, lambda, lambda, ji) + 2 * delta * Fk(k, jf, lambda, lambdaPrime, ji) +
70 pow(delta, 2) * Fk(k, jf, lambdaPrime, lambdaPrime, ji));
71}
72
76double Agen(double k, double k1, double k2, double jf, double lambda, double lambdaPrime, double ji, double delta)
77{
78 return 1. / (1. + pow(delta, 2)) *
79 (Fgen(k, k2, k1, jf, lambda, lambda, ji) + 2 * delta * Fgen(k, k2, k1, jf, lambda, lambdaPrime, ji) +
80 pow(delta, 2) * Fgen(k, k2, k1, jf, lambdaPrime, lambdaPrime, ji));
81}
82
102double W(double theta, double ji, double lambda, double lambdaPrime, double jf, double delta, StatTensor *rho,
103 SolidAttenuation *Qk, double kmax /*= 4*/)
104{
105 std::complex<double> wtheta = 0;
106 for (int ik = 0; ik <= int(kmax); ++ik) {
107 double k = (double)ik;
108 wtheta = wtheta + Ak(k, ji, lambda, lambdaPrime, jf, delta) * rho->GetBk(k) * Qk->Get()[ik] *
109 ROOT::Math::legendre(ik, cos(theta));
110 }
111 if (abs(wtheta.imag()) >= 1e-15)
112 std::cout << "Warning: imaginary parts of statistical tensor have not cancelled" << std::endl;
113 return wtheta.real();
114}
115
125
126 std::function<std::complex<double>(double, double, double, double, double) >
127 TransFrame(std::complex<double> (&Gk)(double, double, double, double, double), double alpha, double beta, double gamma)
128 {
129 std::function<std::complex<double>(double, double, double, double, double)> newGk;
130
131 newGk = [alpha, beta, gamma, &Gk](double q, double qprime, double k, double kprime, double t) {
132 //std::cout << "Frame transformation" << std::endl;
133 std::complex<double> sum = 0;
134 for (int iQ = 0; iQ < 2*k + 1; ++iQ) {
135 for (int iQprime = 0; iQprime < 2*kprime+1; ++iQprime) {
136 double Q = (double)iQ - k;
137 double Qprime = (double)iQprime - kprime;
138 sum += std::conj(GamR::AngDist::BigD(k, q, Q, alpha, beta, gamma))*
139 std::conj(Gk(Q, Qprime, k, kprime, t))*
140 GamR::AngDist::BigD(kprime, qprime, Qprime, alpha, beta, gamma);
141
142 // if (Q==Qprime && k==kprime) {
143 // std::cout << k << " " << q << " " << Q << " " << std::conj(GamR::AngDist::BigD(k, q, Q, alpha, beta, gamma)) << std::endl;
144 // std::cout << kprime << " " << qprime << " " << Qprime << " " << GamR::AngDist::BigD(kprime, qprime, Qprime, alpha, beta, gamma) << std::endl;
145 //}
146 }
147 }
148 //printf("Gkk = (%15.14f, %15.14f)\n", sum.real(), -sum.imag());
149 return std::conj(sum);
150 };
151
152 return newGk;
153 }
154
175
176std::vector<double> W(std::vector<double> theta, double ji, double lambda, double lambdaPrime, double jf, double delta,
177 StatTensor *rho, SolidAttenuation *Qk, double kmax /*= 4*/)
178{
179 /* equation 2.43 */
180 std::vector<std::complex<double>> Aks;
181 std::vector<double> W;
182 for (int ik = 0; ik <= int(kmax); ++ik) {
183 double k = (double)ik;
184 Aks.push_back(Ak(k, ji, lambda, lambdaPrime, jf, delta) * rho->GetBk(k));
185 }
186 for (int it = 0; it < (int)theta.size(); ++it) {
187 std::complex<double> wtheta = 0;
188 for (int ik = 0; ik <= int(kmax); ++ik) {
189 double k = (double)ik;
190 wtheta = wtheta + Aks[ik] * Qk->Get()[ik] * ROOT::Math::legendre(k, cos(theta[it]));
191 }
192 if (wtheta.imag() != 0)
193 std::cout << "Warning: imaginary parts of statistical tensor have not "
194 "cancelled"
195 << std::endl;
196
197 W.push_back(wtheta.real());
198 }
199 return W;
200}
201
202} /* namespace AngDist */
203} /* namespace GamR */
#define W(a, b)
std::complex< double > GetBk(double k)
std::complex< double > BigD(double j, double m, double mprime, double alpha, double beta, double gamma)
Definition WignerD.cc:66
double W(double theta, double ji, double lambda, double lambdaPrime, double jf, double delta, StatTensor *rho, SolidAttenuation *Qk, double kmax)
Definition AngDist.cc:102
double Ak(double k, double ji, double lambda, double lambdaPrime, double jf, double delta)
Definition AngDist.cc:66
double Fgen(double k, double k2, double k1, double jf, double lambda, double lambdaPrime, double ji)
Definition AngDist.cc:52
std::function< std::complex< double >(double, double, double, double, double) > TransFrame(std::complex< double >(&Gk)(double, double, double, double, double), double alpha, double beta, double gamma)
Definition AngDist.cc:127
double Fk(double k, double jf, double lambda, double lambdaPrime, double ji)
Definition AngDist.cc:32
double Agen(double k, double k1, double k2, double jf, double lambda, double lambdaPrime, double ji, double delta)
Definition AngDist.cc:76
Definition Gain.cc:19