Angular analysis of B+->K*+(K+pi0)mumu
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

574 lines
25 KiB

  1. //Renata Kopecna
  2. #include "integrals.hh"
  3. #include <Math/Vector4D.h>
  4. #include <Math/Boost.h>
  5. #include <Math/GSLIntegrator.h>
  6. #include <spdlog.h>
  7. #include <funcs.hh>
  8. #include <TMath.h>
  9. double integral_x_to_n(double x, int n){
  10. return pow(x,n+1)/(n+1.0);
  11. }
  12. double integrate_x_to_n(double a, double b, int n){
  13. return integral_x_to_n(b,n) - integral_x_to_n(a,n);
  14. }
  15. //this methods are helpful for the phi integration
  16. //calculates int x^n * sin(x) dx
  17. double integral_x_to_n_times_sin_x(double x, int n){
  18. assert(n >= 0);
  19. if (n == 0) return -cos(x);
  20. else return -pow(x, n)*cos(x) + n*integral_x_to_n_times_cos_x(x, n-1);
  21. }
  22. double integrate_x_to_n_times_sin_x(double a, double b, int n){
  23. return integral_x_to_n_times_sin_x(b, n) - integral_x_to_n_times_sin_x(a, n);
  24. }
  25. //calculates int x^n * cos(x) dx (recursive using per partes)
  26. double integral_x_to_n_times_cos_x(double x, int n){
  27. assert(n >= 0);
  28. if (n == 0) return sin(x);
  29. else return pow(x,n)*sin(x) - n*integral_x_to_n_times_sin_x(x, n-1);
  30. }
  31. double integrate_x_to_n_times_cos_x(double a, double b, int n){
  32. return integral_x_to_n_times_cos_x(b, n)-integral_x_to_n_times_cos_x(a, n);
  33. }
  34. //calculates int x^n * sin(2x) dx (recursive using per partes)
  35. double integral_x_to_n_times_sin_2x(double x, int n){
  36. assert(n >= 0);
  37. if (n == 0) return -0.5*cos(2.0*x);
  38. else return -pow(x,n)*0.5*cos(2.0*x)
  39. +0.5*n*integral_x_to_n_times_cos_2x(x,n-1);
  40. }
  41. double integrate_x_to_n_times_sin_2x(double a, double b, int n){
  42. return integral_x_to_n_times_sin_2x(b, n) - integral_x_to_n_times_sin_2x(a, n);
  43. }
  44. //calculates int x^n * cos(2x) dx (recursive using per partes)
  45. double integral_x_to_n_times_cos_2x(double x, int n){
  46. assert(n >= 0);
  47. if (n == 0) return 0.5*sin(2.0*x);
  48. else return +0.5*pow(x,n)*sin(2.0*x)
  49. -0.5*n*integral_x_to_n_times_sin_2x(x,n-1);
  50. }
  51. double integrate_x_to_n_times_cos_2x(double a, double b, int n){
  52. return integral_x_to_n_times_cos_2x(b, n) - integral_x_to_n_times_cos_2x(a, n);
  53. }
  54. //calculates int x^n * cos(x)^2 dx
  55. double integral_x_to_n_times_cos_x_2(double x, int n){
  56. assert(n >= 0);
  57. return +1.0/(1.0 + n)*pow(x,n+1)*cos(x)*cos(x)
  58. +1.0/(1.0+n)*integral_x_to_n_times_sin_2x(x, n+1);
  59. }
  60. //calculates int x^n * sin(x)^2 dx
  61. double integral_x_to_n_times_sin_x_2(double x, int n){
  62. assert(n >= 0);
  63. return +1.0/(1.0 + n)*pow(x,n+1)*sin(x)*sin(x)
  64. -1.0/(1.0+n)*integral_x_to_n_times_sin_2x(x, n+1);
  65. }
  66. //calculates int x^n * asin(x) dx
  67. double integral_x_to_n_times_asin_x(double x, int n){
  68. assert(n >= 0);
  69. if (n == 0){
  70. return x*asin(x)+sqrt(1-x*x);
  71. }
  72. else{
  73. // return 1.0/(n+1.0)*pow(x,n)*(x*asin(x)+sqrt(1-x*x))
  74. // -n*integral_x_to_n_times_sqrt_1_minus_x2(x, n-1);
  75. //factor 1/(n+1) missing???
  76. //fix below!
  77. return 1.0/(n+1.0)*pow(x,n)*(x*asin(x)+sqrt(1-x*x))
  78. -n/(n+1.0)*integral_x_to_n_times_sqrt_1_minus_x2(x, n-1);
  79. }
  80. }
  81. //calculates int x^n * sqrt(1-x^2) dx (recursive using per partes)
  82. double integral_x_to_n_times_sqrt_1_minus_x2(double x, int n){
  83. assert(n >= 0);
  84. if (n == 0) return 0.5*asin(x)+0.5*x*sqrt(1-x*x);
  85. else return 2.0/(n+2.0)*pow(x, n)*(0.5*asin(x)+0.5*x*sqrt(1-x*x))-n/(n+2.0)*integral_x_to_n_times_asin_x(x, n-1);
  86. }
  87. double integrate_x_to_n_times_sqrt_1_minus_x2(double a, double b, int n){
  88. return integral_x_to_n_times_sqrt_1_minus_x2(b, n)-integral_x_to_n_times_sqrt_1_minus_x2(a, n);
  89. }
  90. double integral_chebyshev(double x, int n){
  91. assert(n >= 0);
  92. if (n == 0) return x;
  93. else if (n == 1) return 0.5*x*x;
  94. else return 0.5*(fcnc::chebyshev(x, n+1)/(n+1) - fcnc::chebyshev(x, n-1)/(n-1));
  95. }
  96. double integrate_gauss(double sigma, double mean, double min, double max){
  97. return 0.5*(TMath::Erf((mean-min)/sqrt(2.0)/sigma) - TMath::Erf((mean-max)/sqrt(2.0)/sigma));
  98. }
  99. double integrate_crystalball(double mean, double sigma, double alpha, double n, double min, double max){
  100. //implementation taken from RooFit: https://root.cern.ch/doc/master/RooCBShape_8cxx_source.html#l00108
  101. static const double sqrtPiOver2 = 1.2533141373;
  102. static const double sqrt2 = 1.4142135624;
  103. double result = 0.0;
  104. bool useLog = false;
  105. if( fabs(n-1.0) < 1.0e-05 )
  106. useLog = true;
  107. double sig = fabs((Double_t)sigma);
  108. //double tmin = (m.min(rangeName)-m0)/sig;
  109. //double tmax = (m.max(rangeName)-m0)/sig;
  110. double tmin = (min - mean ) / sigma;
  111. double tmax = (max - mean ) / sigma;
  112. if(alpha < 0) {
  113. double tmp = tmin;
  114. tmin = -tmax;
  115. tmax = -tmp;
  116. }
  117. double absAlpha = fabs(alpha);
  118. if( tmin >= -absAlpha ) {
  119. result += sig*sqrtPiOver2*( TMath::Erf(tmax/sqrt2)
  120. - TMath::Erf(tmin/sqrt2) );
  121. }
  122. else if( tmax <= -absAlpha ) {
  123. double a = TMath::Power(n/absAlpha,n)*exp(-0.5*absAlpha*absAlpha);
  124. double b = n/absAlpha - absAlpha;
  125. if(useLog) {
  126. result += a*sig*( log(b-tmin) - log(b-tmax) );
  127. }
  128. else {
  129. result += a*sig/(1.0-n)*( 1.0/(TMath::Power(b-tmin,n-1.0))
  130. - 1.0/(TMath::Power(b-tmax,n-1.0)) );
  131. }
  132. }
  133. else {
  134. double a = TMath::Power(n/absAlpha,n)*exp(-0.5*absAlpha*absAlpha);
  135. double b = n/absAlpha - absAlpha;
  136. double term1 = 0.0;
  137. if(useLog) {
  138. term1 = a*sig*( log(b-tmin) - log(n/absAlpha));
  139. }
  140. else {
  141. term1 = a*sig/(1.0-n)*( 1.0/(TMath::Power(b-tmin,n-1.0))
  142. - 1.0/(TMath::Power(n/absAlpha,n-1.0)) );
  143. }
  144. double term2 = sig*sqrtPiOver2*( TMath::Erf(tmax/sqrt2)
  145. - TMath::Erf(-absAlpha/sqrt2) );
  146. result += term1 + term2;
  147. }
  148. return result;
  149. }
  150. double integrate_twotailedcrystalball(double mean, double sigma, double alpha1, double alpha2, double n1, double n2, double min, double max){
  151. double central = 0.0;
  152. double left = 0.0;
  153. double right = 0.0;
  154. double result = 0.0;
  155. assert(alpha1 > 0.0);
  156. assert(alpha2 > 0.0);
  157. //implementation taken from RooFit: RooDoubleCB.cxx
  158. static const double rootPiBy2 = sqrt(atan2(0.0,-1.0)/2.0);
  159. static const double invRoot2 = 1.0/sqrt(2);
  160. double invwidth = 1.0/sigma;
  161. double tmin = (min-mean)*invwidth;
  162. double tmax = (max-mean)*invwidth;
  163. //spdlog::trace("tmin: {0:f}\t tmax: {0:f} ",tmin, tmax);
  164. bool isfullrange = (tmin<-1000. && tmax>1000.);
  165. //compute gaussian (central) contribution
  166. double central_low = std::max(min, mean - alpha1*sigma);
  167. double central_high = std::min(max, mean + alpha2*sigma);
  168. double tcentral_low = (central_low-mean)*invwidth;
  169. double tcentral_high = (central_high-mean)*invwidth;
  170. //spdlog::trace("central_low: {0:f}\t central_high: {0:f} ",central_low, central_high);
  171. //spdlog::trace("tcentral_low: {0:f}\t tcentral_high: {0:f} ",tcentral_low, tcentral_high);
  172. if(central_low < central_high){// is the gaussian part in range?
  173. central = rootPiBy2*sigma*(TMath::Erf(tcentral_high*invRoot2)-TMath::Erf(tcentral_low*invRoot2));
  174. }
  175. //compute left tail;
  176. if(isfullrange && (n1-1.0)>1.e-3) {
  177. left = sigma*TMath::Exp(-0.5*alpha1*alpha1)*n1/(alpha1*(n1-1.));
  178. spdlog::trace("left: {0:f}", left);
  179. }
  180. else{
  181. double left_low = min;
  182. double left_high = std::min(max, mean - alpha1*sigma);
  183. double thigh = (left_high-mean)*invwidth;
  184. if(left_low < left_high){ //is the left tail in range?
  185. double n1invalpha1 = n1/(fabs(alpha1));
  186. if(fabs(n1-1.0)>1.e-3){
  187. double invn1m1 = 1/(n1-1.);
  188. double leftpow = TMath::Power(n1invalpha1,-n1*invn1m1);
  189. assert(leftpow > 0.0);
  190. double left0 = sigma*TMath::Exp(-0.5*alpha1*alpha1)*invn1m1;
  191. double left1, left2;
  192. if(max > (mean-alpha1*sigma))
  193. left1 = n1invalpha1;
  194. else
  195. left1 = TMath::Power( leftpow*(n1invalpha1 - alpha1 - thigh), 1.-n1);
  196. if(tmin<-1000.)
  197. left2 = 0.;
  198. else
  199. left2 = TMath::Power( leftpow*(n1invalpha1 - alpha1 - tmin ), 1.-n1);
  200. left = left0*(left1-left2);
  201. }
  202. else{
  203. double A1 = TMath::Power(n1invalpha1,n1)*TMath::Exp(-0.5*alpha1*alpha1);
  204. double B1 = n1invalpha1-fabs(alpha1);
  205. left = A1*sigma*(TMath::Log(B1-(left_low-mean)*invwidth) - TMath::Log(B1-(left_high-mean)*invwidth) );
  206. }
  207. }
  208. }
  209. //compute right tail;
  210. if(isfullrange && (n2-1.0)>1.e-3) {
  211. right = sigma*TMath::Exp(-0.5*alpha2*alpha2)*n2/(alpha2*(n2-1.));
  212. }
  213. else{
  214. double right_low = std::max(min,mean + alpha2*sigma);
  215. double right_high = max;
  216. double tlow = (right_low - mean)*invwidth;
  217. if(right_low < right_high){ //is the right tail in range?
  218. double n2invalpha2 = n2/(fabs(alpha2));
  219. if(fabs(n2-1.0)>1.e-3) {
  220. double invn2m2 = 1.0/(n2-1.);
  221. double rightpow = TMath::Power(n2invalpha2,-n2*invn2m2);
  222. if (rightpow <= 0.0){
  223. spdlog::error("rightpow < 0.0! Returning NaN");
  224. spdlog::error("TMath::Power(n2invalpha2,-n2*invn2m2) = {0:.30f}",powl(n2/(fabs(alpha2)),-n2*1.0/(n2-1.)));
  225. spdlog::error("n2invalpha2: {0:f}\tn2: {1:f}\tinvn2m2: {2:f}",n2invalpha2,n2,invn2m2);
  226. spdlog::error("mean: {0:f}\tsigma: {1:f}\talpha1: {2:f}\talpha2: {3:f}\tn1: {4:f}\tn2: {5:f}\tmin: {6:f}\tmax: {7:f}", mean, sigma, alpha1, alpha2, n1, n2, min, max);
  227. return nan("");
  228. }
  229. double right0 = sigma*TMath::Exp(-0.5*alpha2*alpha2)*invn2m2;
  230. double right1, right2;
  231. if(min<(mean+alpha2*sigma)) right1 = n2invalpha2;
  232. else right1 = TMath::Power( rightpow*(n2invalpha2 - alpha2 + tlow), 1.-n2);
  233. if(tmax>1000.) right2 = 0.;
  234. else right2 = TMath::Power( rightpow*(n2invalpha2 - alpha2 + tmax), 1.-n2);
  235. right = right0*(right1-right2);
  236. }
  237. else{
  238. double A2 = TMath::Power(n2invalpha2,n2)*TMath::Exp(-0.5*alpha2*alpha2);
  239. double B2 = n2invalpha2-fabs(alpha2);
  240. right = A2*sigma*(TMath::Log(B2+(right_high-mean)*invwidth) - TMath::Log(B2+(right_low-mean)*invwidth) );
  241. }
  242. }
  243. }
  244. result = left + central + right;
  245. if(result <= 0.0){
  246. spdlog::error("left = {0:e}",left);
  247. spdlog::error("central = {0:e}",central);
  248. spdlog::error("right = {0:e}", right);
  249. spdlog::error("sigma = {0:e}", sigma);
  250. spdlog::error("n1 = {0:e}", n1);
  251. spdlog::error("n2 = {0:e}", n2);
  252. spdlog::error("alpha1 = {0:e}", alpha1);
  253. spdlog::error("alpha1 = {0:e}", alpha2);
  254. assert(0);
  255. }
  256. if(std::isnan(result) || std::isinf(result)){
  257. spdlog::critical("Determination of twotailed CB integral failed: {0:f}", result);
  258. spdlog::critical("mean: {1:f}\tsigma: {2:f}\talpha1: {3:f}\talpha2: {4:f}\tn1: {5:f}\tn2: {6:f}", mean, sigma, alpha1, alpha2, n1, n2);
  259. spdlog::critical("left: {0:f}\tcentral: {1:f}\tright: {2:f}", left, central, right);
  260. assert(0);
  261. }
  262. return result;
  263. }
  264. double integral_x_to_n_times_exp_minus_x(double x, double tau, int n){
  265. assert(n>=0);
  266. if (n == 0) return -tau*exp(-x/tau);
  267. else return pow(x, n)*(-tau*exp(-x/tau)) + n * tau * integral_x_to_n_times_exp_minus_x(x, tau, n-1);
  268. }
  269. //-----------------------
  270. // P wave
  271. //-----------------------
  272. //THESE FUNCTIONS NEED TO BE CHECKED
  273. //i correspons to ctl, j to ctk and k to phi
  274. //int[ sin^2(tk) ] for J1s
  275. double integral_f1(double ctl, double ctk, double phi, int n_ctl, int n_ctk, int n_phi){
  276. //Integrate sin^2 d costhetak d costhetal d phi times ctk^n1+ctl^n2*phi^n3
  277. return (integral_x_to_n(ctk,n_ctk)-integral_x_to_n(ctk,n_ctk+2))
  278. *integral_x_to_n(ctl,n_ctl)
  279. *integral_x_to_n(phi,n_phi);
  280. }
  281. double integrate_f1(double ctl_a, double ctl_b, double ctk_a, double ctk_b, double phi_a, double phi_b, int n_ctl, int n_ctk, int n_phi){
  282. return (integrate_x_to_n(ctk_a, ctk_b, n_ctk)-integrate_x_to_n(ctk_a,ctk_b,n_ctk+2))
  283. *integrate_x_to_n(ctl_a, ctl_b, n_ctl)
  284. *integrate_x_to_n(phi_a, phi_b, n_phi);
  285. }
  286. //int[ cos^2(tk) ] for J1c
  287. double integral_f2(double ctl, double ctk, double phi, int n_ctl, int n_ctk, int n_phi){
  288. //Integrate cos^2 thetak d costhetak d costhetal d phi times ctk^n1+ctl^n2*phi^n3
  289. return integral_x_to_n(ctk,n_ctk+2)
  290. *integral_x_to_n(ctl,n_ctl)
  291. *integral_x_to_n(phi,n_phi);
  292. }
  293. double integrate_f2(double ctl_a, double ctl_b, double ctk_a, double ctk_b, double phi_a, double phi_b, int n_ctl, int n_ctk, int n_phi){
  294. return integrate_x_to_n(ctk_a, ctk_b, n_ctk+2)
  295. *integrate_x_to_n(ctl_a, ctl_b, n_ctl)
  296. *integrate_x_to_n(phi_a, phi_b, n_phi);
  297. }
  298. //int[ sin^2(tk) * cos(2tl) ] for J2s
  299. double integral_f3(double ctl, double ctk, double phi, int n_ctl, int n_ctk, int n_phi){
  300. //Integrate sin^2 thetak cos 2thetal d costhetak d costhetal d phi times ctk^n1+ctl^n2*phi^n3
  301. return (integral_x_to_n(ctk,n_ctk)-integral_x_to_n(ctk,n_ctk+2))
  302. *(2*integral_x_to_n(ctl,n_ctl+2)-integral_x_to_n(ctl,n_ctl)) //cos(2x) = 2*cos^2(x)-1
  303. *integral_x_to_n(phi,n_phi);
  304. }
  305. double integrate_f3(double ctl_a, double ctl_b, double ctk_a, double ctk_b, double phi_a, double phi_b, int n_ctl, int n_ctk, int n_phi){
  306. return (integrate_x_to_n(ctk_a, ctk_b, n_ctk)-integrate_x_to_n(ctk_a, ctk_b, n_ctk+2))
  307. *(2*integrate_x_to_n(ctl_a, ctl_b, n_ctl+2)-integrate_x_to_n(ctl_a, ctl_b, n_ctl)) //cos(2x) = 2*cos^2(x)-1
  308. *integrate_x_to_n(phi_a,phi_b,n_phi);
  309. }
  310. //int[ cos^2(tk) * cos(2tl) ] for J2c
  311. double integral_f4(double ctl, double ctk, double phi, int n_ctl, int n_ctk, int n_phi){
  312. //Integrate cos^2 thetak cos 2thetal d costhetak d costhetal d phi times ctk^n1+ctl^n2*phi^n3
  313. return integral_x_to_n(ctk,n_ctk+2)
  314. *(2*integral_x_to_n(ctl,n_ctl+2)-integral_x_to_n(ctl,n_ctl))
  315. *integral_x_to_n(phi,n_phi);
  316. }
  317. double integrate_f4(double ctl_a, double ctl_b, double ctk_a, double ctk_b, double phi_a, double phi_b, int n_ctl, int n_ctk, int n_phi){
  318. //Integrate cos^2 thetak cos 2thetal d costhetak d costhetal d phi times ctk^n1+ctl^n2*phi^n3
  319. return integrate_x_to_n(ctk_a, ctk_b, n_ctk+2)
  320. *(2*integrate_x_to_n(ctl_a, ctl_b, n_ctl+2)-integrate_x_to_n(ctl_a, ctl_b, n_ctl))
  321. *integrate_x_to_n(phi_a,phi_b,n_phi);
  322. }
  323. //int[ sin^2(tk) * sin^2(tl) * cos(2phi) ] for J3
  324. double integral_f5(double ctl, double ctk, double phi, int n_ctl, int n_ctk, int n_phi){
  325. //Integrate sin^2 thetak sin^2 thetal cos 2phi d costhetak d costhetal d phi times ctk^n1+ctl^n2*phi^n3
  326. return (integral_x_to_n(ctk,n_ctk)-integral_x_to_n(ctk,n_ctk+2))
  327. *(integral_x_to_n(ctl,n_ctl)-integral_x_to_n(ctl,n_ctl+2))
  328. *(integral_x_to_n_times_cos_2x(phi,n_phi));
  329. }
  330. double integrate_f5(double ctl_a, double ctl_b, double ctk_a, double ctk_b, double phi_a, double phi_b, int n_ctl, int n_ctk, int n_phi){
  331. //Integrate sin^2 thetak sin^2 thetal cos 2phi d costhetak d costhetal d phi times ctk^n1+ctl^n2*phi^n3
  332. return (integrate_x_to_n(ctk_a, ctk_b, n_ctk)-integrate_x_to_n(ctk_a, ctk_b, n_ctk+2))
  333. *(integrate_x_to_n(ctl_a, ctl_b, n_ctl)-integrate_x_to_n(ctl_a, ctl_b, n_ctl+2))
  334. *(integrate_x_to_n_times_cos_2x(phi_a,phi_b,n_phi));
  335. }
  336. //int[ sin(2tk) * sin(2tl) * cos(phi) ] for J4
  337. double integral_f6(double ctl, double ctk, double phi, int n_ctl, int n_ctk, int n_phi){
  338. //Integrate sin 2thetak sin 2thetal cos phi d costhetak d costhetal d phi times ctk^n1+ctl^n2*phi^n3
  339. return 2*integral_x_to_n_times_sqrt_1_minus_x2(ctk,n_ctk+1)
  340. *2*integral_x_to_n_times_sqrt_1_minus_x2(ctl,n_ctl+1)
  341. *integral_x_to_n_times_cos_x(phi,n_phi);
  342. }
  343. double integrate_f6(double ctl_a, double ctl_b, double ctk_a, double ctk_b, double phi_a, double phi_b, int n_ctl, int n_ctk, int n_phi){
  344. //Integrate sin 2thetak sin 2thetal cos phi d costhetak d costhetal d phi times ctk^n1+ctl^n2*phi^n3
  345. return 2*integrate_x_to_n_times_sqrt_1_minus_x2(ctk_a, ctk_b, n_ctk+1)
  346. *2*integrate_x_to_n_times_sqrt_1_minus_x2(ctl_a, ctl_b,n_ctl+1)
  347. *integrate_x_to_n_times_cos_x(phi_a,phi_b,n_phi);
  348. }
  349. //int [ sin(2tk) * sin(tl) * cos(phi) ] for J5
  350. double integral_f7(double ctl, double ctk, double phi, int n_ctl, int n_ctk, int n_phi){
  351. //Integrate sin 2thetak sin thetal cos phi d costhetak d costhetal d phi times ctk^n1+ctl^n2*phi^n3
  352. return 2*integral_x_to_n_times_sqrt_1_minus_x2(ctk,n_ctk+1)
  353. *integral_x_to_n_times_sqrt_1_minus_x2(ctl,n_ctl)
  354. *integral_x_to_n_times_cos_x(phi,n_phi);
  355. }
  356. double integrate_f7(double ctl_a, double ctl_b, double ctk_a, double ctk_b, double phi_a, double phi_b, int n_ctl, int n_ctk, int n_phi){
  357. //Integrate sin 2thetak sin thetal cos phi d costhetak d costhetal d phi times ctk^n1+ctl^n2*phi^n3
  358. return 2*integrate_x_to_n_times_sqrt_1_minus_x2(ctk_a, ctk_b, n_ctk+1)
  359. *integrate_x_to_n_times_sqrt_1_minus_x2(ctl_a, ctl_b,n_ctl)
  360. *integrate_x_to_n_times_cos_x(phi_a,phi_b,n_phi);
  361. }
  362. //int [ sin^2(tk) * cos(tl) ] for J6s
  363. double integral_f8(double ctl, double ctk, double phi, int n_ctl, int n_ctk, int n_phi){
  364. //Integrate sin^2 thetak cos thetal d costhetak d costhetal d phi times ctk^n1+ctl^n2*phi^n3
  365. return (integral_x_to_n(ctk,n_ctk)-integral_x_to_n(ctk,n_ctk+2))
  366. *integral_x_to_n(ctl,n_ctl+1)
  367. *integral_x_to_n(phi,n_phi);
  368. }
  369. double integrate_f8(double ctl_a, double ctl_b, double ctk_a, double ctk_b, double phi_a, double phi_b, int n_ctl, int n_ctk, int n_phi){
  370. //Integrate sin^2 thetak cos thetal d costhetak d costhetal d phi times ctk^n1+ctl^n2*phi^n3
  371. return (integrate_x_to_n(ctk_a, ctk_b, n_ctk)-integrate_x_to_n(ctk_a, ctk_b, n_ctk+2))
  372. *integrate_x_to_n(ctl_a, ctl_b,n_ctl+1)
  373. *integrate_x_to_n(phi_a,phi_b,n_phi);
  374. }
  375. //int [ cos^2(tk) * cos(tl) ] for J6c
  376. double integral_f9(double ctl, double ctk, double phi, int n_ctl, int n_ctk, int n_phi){
  377. //Integrate sin^2 thetak cos thetal d costhetak d costhetal d phi times ctk^n1+ctl^n2*phi^n3
  378. return integral_x_to_n(ctk,n_ctk+2)
  379. *integral_x_to_n(ctl,n_ctl+1)
  380. *integral_x_to_n(phi,n_phi);
  381. }
  382. double integrate_f9(double ctl_a, double ctl_b, double ctk_a, double ctk_b, double phi_a, double phi_b, int n_ctl, int n_ctk, int n_phi){
  383. //Integrate sin^2 thetak cos thetal d costhetak d costhetal d phi times ctk^n1+ctl^n2*phi^n3
  384. return integrate_x_to_n(ctk_a, ctk_b, n_ctk+2)
  385. *integrate_x_to_n(ctl_a, ctl_b,n_ctl+1)
  386. *integrate_x_to_n(phi_a,phi_b,n_phi);
  387. }
  388. //int [ sin(2tk) * sin(tl) * sin(phi) ] for J7
  389. double integral_f10(double ctl, double ctk, double phi, int n_ctl, int n_ctk, int n_phi){
  390. //Integrate sin 2thetak sin thetal sin phi d costhetak d costhetal d phi times ctk^n1+ctl^n2*phi^n3
  391. return 2*integral_x_to_n_times_sqrt_1_minus_x2(ctk,n_ctk+1)
  392. *integral_x_to_n_times_sqrt_1_minus_x2(ctl,n_ctl+1)
  393. *integral_x_to_n_times_sin_x(phi,n_phi);
  394. }
  395. double integrate_f10(double ctl_a, double ctl_b, double ctk_a, double ctk_b, double phi_a, double phi_b, int n_ctl, int n_ctk, int n_phi){
  396. //Integrate sin 2thetak sin thetal sin phi d costhetak d costhetal d phi times ctk^n1+ctl^n2*phi^n3
  397. return 2*integrate_x_to_n_times_sqrt_1_minus_x2(ctk_a, ctk_b, n_ctk+1)
  398. *integrate_x_to_n_times_sqrt_1_minus_x2(ctl_a, ctl_b,n_ctl+1)
  399. *integrate_x_to_n_times_sin_x(phi_a,phi_b,n_phi);
  400. }
  401. //int [ sin(2tk) * sin(2tl) * sin(phi) ] for J8
  402. double integral_f11(double ctl, double ctk, double phi, int n_ctl, int n_ctk, int n_phi){
  403. //Integrate sin 2thetak sin 2thetal sin phi d costhetak d costhetal d phi times ctk^n1+ctl^n2*phi^n3
  404. return 2*integral_x_to_n_times_sqrt_1_minus_x2(ctk,n_ctk+1)
  405. *2*integral_x_to_n_times_sqrt_1_minus_x2(ctl,n_ctl+1)
  406. *integral_x_to_n_times_sin_x(phi,n_phi);
  407. }
  408. double integrate_f11(double ctl_a, double ctl_b, double ctk_a, double ctk_b, double phi_a, double phi_b, int n_ctl, int n_ctk, int n_phi){
  409. //Integrate sin 2thetak sin 2thetal sin phi d costhetak d costhetal d phi times ctk^n1+ctl^n2*phi^n3
  410. return 2*integrate_x_to_n_times_sqrt_1_minus_x2(ctk_a, ctk_b,n_ctk+1)
  411. *2*integrate_x_to_n_times_sqrt_1_minus_x2(ctl_a, ctl_b,n_ctl+1)
  412. *integrate_x_to_n_times_sin_x(phi_a,phi_b,n_phi);
  413. }
  414. //int [ sin^2(tk) * sin^2(tl) * sin(2phi) ] for J9
  415. double integral_f12(double ctl, double ctk, double phi, int n_ctl, int n_ctk, int n_phi){
  416. //Integrate sin^2 thetak sin^2 thetal sin 2phi d costhetak d costhetal d phi times ctk^n1+ctl^n2*phi^n3
  417. return (integral_x_to_n(ctk,n_ctk)-integral_x_to_n(ctk,n_ctk+2))
  418. *(integral_x_to_n(ctl,n_ctl)-integral_x_to_n(ctl,n_ctl+2))
  419. *(integral_x_to_n_times_sin_2x(phi,n_phi));
  420. }
  421. double integrate_f12(double ctl_a, double ctl_b, double ctk_a, double ctk_b, double phi_a, double phi_b, int n_ctl, int n_ctk, int n_phi){
  422. //Integrate sin^2 thetak sin^2 thetal sin 2phi d costhetak d costhetal d phi times ctk^n1+ctl^n2*phi^n3
  423. return (integrate_x_to_n(ctk_a, ctk_b,n_ctk)-integrate_x_to_n(ctk_a, ctk_b,n_ctk+2))
  424. *(integrate_x_to_n(ctl_a, ctl_b,n_ctl)-integrate_x_to_n(ctl_a, ctl_b,n_ctl+2))
  425. *(integrate_x_to_n_times_sin_2x(phi_a,phi_b,n_phi));
  426. }
  427. //-----------------------
  428. // S wave
  429. //-----------------------
  430. double integral_s_f1(double ctl, double ctk, double phi, int n_ctl, int n_ctk, int n_phi){
  431. return (integral_x_to_n(ctl,n_ctl)-integral_x_to_n(ctl,n_ctl+2))
  432. *integral_x_to_n(ctk,n_ctk)
  433. *integral_x_to_n(phi, n_phi);
  434. }
  435. double integrate_s_f1(double ctl_a, double ctl_b, double ctk_a, double ctk_b, double phi_a, double phi_b, int n_ctl, int n_ctk, int n_phi){
  436. return (integrate_x_to_n(ctl_a,ctl_b,n_ctl)-integrate_x_to_n(ctl_a,ctl_b,n_ctl+2))
  437. *integrate_x_to_n(ctk_a,ctk_b,n_ctk)
  438. *integrate_x_to_n(phi_a,phi_b,n_phi);
  439. }
  440. double integral_s_f2(double ctl, double ctk, double phi, int n_ctl, int n_ctk, int n_phi){
  441. return (integral_x_to_n(ctl,n_ctl)-integral_x_to_n(ctl,n_ctl+2))
  442. *integral_x_to_n(ctk,n_ctk+1)
  443. *integral_x_to_n(phi, n_phi);
  444. }
  445. double integrate_s_f2(double ctl_a, double ctl_b, double ctk_a, double ctk_b, double phi_a, double phi_b, int n_ctl, int n_ctk, int n_phi){
  446. return (integrate_x_to_n(ctl_a,ctl_b,n_ctl)-integrate_x_to_n(ctl_a,ctl_b,n_ctl+2))
  447. *integrate_x_to_n(ctk_a,ctk_b,n_ctk+1)
  448. *integrate_x_to_n(phi_a,phi_b,n_phi);
  449. }
  450. double integral_s_f3(double ctl, double ctk, double phi, int n_ctl, int n_ctk, int n_phi){
  451. return 2*integral_x_to_n_times_sqrt_1_minus_x2(ctl,n_ctl+1)
  452. *integral_x_to_n_times_sqrt_1_minus_x2(ctk,n_ctk)
  453. *integral_x_to_n_times_cos_x(phi, n_phi);
  454. }
  455. double integrate_s_f3(double ctl_a, double ctl_b, double ctk_a, double ctk_b, double phi_a, double phi_b, int n_ctl, int n_ctk, int n_phi){
  456. return 2*integrate_x_to_n_times_sqrt_1_minus_x2(ctl_a,ctl_b,n_ctl+1)
  457. *integrate_x_to_n_times_sqrt_1_minus_x2(ctk_a,ctk_b,n_ctk)
  458. *integrate_x_to_n_times_cos_x(phi_a,phi_b,n_phi);
  459. }
  460. double integral_s_f4(double ctl, double ctk, double phi, int n_ctl, int n_ctk, int n_phi){
  461. return integral_x_to_n_times_sqrt_1_minus_x2(ctl,n_ctl)
  462. *integral_x_to_n_times_sqrt_1_minus_x2(ctk,n_ctk)
  463. *integral_x_to_n_times_cos_x(phi, n_phi);
  464. }
  465. double integrate_s_f4(double ctl_a, double ctl_b, double ctk_a, double ctk_b, double phi_a, double phi_b, int n_ctl, int n_ctk, int n_phi){
  466. return integrate_x_to_n_times_sqrt_1_minus_x2(ctl_a,ctl_b,n_ctl)
  467. *integrate_x_to_n_times_sqrt_1_minus_x2(ctk_a,ctk_b,n_ctk)
  468. *integrate_x_to_n_times_cos_x(phi_a,phi_b,n_phi);
  469. }
  470. double integral_s_f5(double ctl, double ctk, double phi, int n_ctl, int n_ctk, int n_phi){
  471. return integral_x_to_n_times_sqrt_1_minus_x2(ctl,n_ctl)
  472. *integral_x_to_n_times_sqrt_1_minus_x2(ctk,n_ctk)
  473. *integral_x_to_n_times_sin_x(phi, n_phi);
  474. }
  475. double integrate_s_f5(double ctl_a, double ctl_b, double ctk_a, double ctk_b, double phi_a, double phi_b, int n_ctl, int n_ctk, int n_phi){
  476. return integrate_x_to_n_times_sqrt_1_minus_x2(ctl_a,ctl_b,n_ctl)
  477. *integrate_x_to_n_times_sqrt_1_minus_x2(ctk_a,ctk_b,n_ctk)
  478. *integrate_x_to_n_times_sin_x(phi_a,phi_b,n_phi);
  479. }
  480. double integral_s_f6(double ctl, double ctk, double phi, int n_ctl, int n_ctk, int n_phi){
  481. return 2*integral_x_to_n_times_sqrt_1_minus_x2(ctl,n_ctl+1)
  482. *integral_x_to_n_times_sqrt_1_minus_x2(ctk,n_ctk)
  483. *integral_x_to_n_times_sin_x(phi, n_phi);
  484. }
  485. double integrate_s_f6(double ctl_a, double ctl_b, double ctk_a, double ctk_b, double phi_a, double phi_b, int n_ctl, int n_ctk, int n_phi){
  486. return 2*integrate_x_to_n_times_sqrt_1_minus_x2(ctl_a,ctl_b,n_ctl+1)
  487. *integrate_x_to_n_times_sqrt_1_minus_x2(ctk_a,ctk_b,n_ctk)
  488. *integrate_x_to_n_times_sin_x(phi_a,phi_b,n_phi);
  489. }