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.

307 lines
19 KiB

  1. /**
  2. * @file funcs.hh
  3. * @author Christoph Langenbruch, Renata Kopecna
  4. * @date 2009-03-18
  5. *
  6. */
  7. #ifndef FUNCS_H
  8. #define FUNCS_H
  9. #include <complex>
  10. #include <TRandom3.h>
  11. #include <Math/Boost.h>
  12. #include <Math/Vector4D.h>
  13. #include <Math/Vector3D.h>
  14. #include <TMatrixDSym.h>
  15. #include <TMatrixD.h>
  16. #include <Math/SpecFuncMathCore.h>
  17. #include <Math/SpecFuncMathMore.h>
  18. namespace fcnc { //Forward declaration, fully defined in options.hh
  19. class options;
  20. class event;
  21. }
  22. namespace fcnc {
  23. typedef ROOT::Math::PxPyPzEVector LorentzVector;
  24. typedef ROOT::Math::Boost LorentzBoost;
  25. typedef ROOT::Math::DisplacementVector3D<ROOT::Math::Cartesian3D<double> > Vector3;
  26. TMatrixDSym get_bsz_invcov();
  27. TMatrixDSym get_bsz_cov();
  28. TMatrixD get_bsz_mu_invcov();
  29. double eff_paper(const double& q2, const double& ctl, const double& ctk, const double& phi);
  30. double get_sliding_error(double xmeas, double xth, double eup, double edown);
  31. double crystalball(double m, double mean, double sigma, double alpha, double n);
  32. double twotailedcrystalball(double m, double mean, double sigma, double alpha1, double alpha2, double n1, double n2);
  33. //blinding
  34. double evaluate_unblind_uniform(double valueSeenByAnalist, const char* blindingString, double scale);
  35. double evaluate_unblind_uniform_angle(double valueSeenByAnalist, const char* blindingString, double scale);
  36. double sqr(double x);
  37. //basic trigonometric functions
  38. double costheta2(double costheta);
  39. double cos2theta(double costheta);
  40. double sintheta2(double costheta);
  41. double sintheta_abs(double costheta);
  42. double sin2theta(double costheta);
  43. double chebyshev(double x, int n);
  44. void chebyshev(double x, int n, std::vector<double>& results);
  45. void chebyshev_to_poly(const std::vector<double>& chebychev, std::vector<double>& poly);
  46. void correct_poly(const std::vector<double>& poly, std::vector<double>& correct, double min, double max);
  47. double legendre(double x, int n);
  48. void legendre(double x, int n, std::vector<double>& results);
  49. void orthonormal_legendre(double x, int n, std::vector<double>& results);
  50. void legendre_to_poly(const std::vector<double>& legendre, std::vector<double>& poly);
  51. ///calculates the associated legendre polynomial for l,m order
  52. double assoc_legendre(unsigned int l, unsigned int m, double x);
  53. ///calculates the real part of the spherical harmonics for l, m
  54. double spherical_harmonic_re(unsigned int l, unsigned int m, double theta, double phi);
  55. ///calculates the imaginary part of the spherical harmonics for l, m
  56. double spherical_harmonic_im(unsigned int l, unsigned int m, double theta, double phi);
  57. ///function calculates the angles in the transversity base using the momenta of the final state particles
  58. void calculate_transversity_angles(const LorentzVector& mu_minus,
  59. const LorentzVector& mu_plus,
  60. const LorentzVector& k_minus,
  61. const LorentzVector& k_plus,
  62. double & cos_theta, double & angle_phi, double & cos_psi);
  63. ///this function calculates the convolution sin(angle) from 0 to pi
  64. double convoluted_sin(double angle, double sigma);
  65. double convoluted_cos_sin(double angle, double sigma);
  66. double convoluted_cos(double angle, double sigma);//not used
  67. double convoluted_cos_2(double angle, double sigma);//not used
  68. double convoluted_sin_2(double angle, double sigma);//used by s wave
  69. double convoluted_2_sin(double angle, double sigma);//used by s wave
  70. double convoluted_2_cos(double angle, double sigma);//not used
  71. double convoluted_cos_2_sin(double angle, double sigma);
  72. double convoluted_2_sin_sin(double angle, double sigma);
  73. double convoluted_sin_3(double angle, double sigma);
  74. //this integrates the above expressions (vonvolution before has been from 0 to pi
  75. double int_convoluted_sin(double angle, double sigma);
  76. double int_convoluted_cos_sin(double angle, double sigma);
  77. double int_convoluted_cos_2_sin(double angle, double sigma);
  78. double int_convoluted_2_sin_sin(double angle, double sigma);
  79. double int_convoluted_sin_3(double angle, double sigma);
  80. double int_convoluted_sin_2(double angle, double sigma);//used by s wave
  81. double int_convoluted_2_sin(double angle, double sigma);//used by s wave
  82. //convolutions for phi. this is easier due to the wraparound at +-pi -> convolution from -int to inf
  83. double inf_convoluted_sin(double angle, double sigma);
  84. double inf_convoluted_cos(double angle, double sigma);
  85. double inf_convoluted_cos_2(double angle, double sigma);
  86. double inf_convoluted_sin_2(double angle, double sigma);
  87. double inf_convoluted_2_sin(double angle, double sigma);
  88. //integral of above
  89. double int_inf_convoluted_const(double angle, double sigma);
  90. double int_inf_convoluted_sin(double angle, double sigma);
  91. double int_inf_convoluted_cos(double angle, double sigma);
  92. double int_inf_convoluted_cos_2(double angle, double sigma);
  93. double int_inf_convoluted_sin_2(double angle, double sigma);
  94. double int_inf_convoluted_2_sin(double angle, double sigma);
  95. //integrals from -inf to inf over the convolution from 0 to pi with acceptance
  96. double int_convoluted_sin_cos_n(int n, double sigma);
  97. double int_convoluted_sin_3_cos_n(int n, double sigma);
  98. double int_convoluted_cos_2_sin_cos_n(int n, double sigma);
  99. double int_convoluted_2_sin_sin_cos_n(int n, double sigma);
  100. double int_convoluted_cos_sin_cos_n(int n, double sigma);
  101. double int_convoluted_sin_2_cos_n(int n, double sigma);
  102. //integrals from 0 to pi over the convolution from -inf to inf with acceptance
  103. double int_inf_convoluted_const_x_n(int n, double sigma);
  104. double int_inf_convoluted_cos_2_x_n(int n, double sigma);
  105. double int_inf_convoluted_sin_2_x_n(int n, double sigma);
  106. double int_inf_convoluted_sin_x_n(int n, double sigma);
  107. double int_inf_convoluted_2_sin_x_n(int n, double sigma);
  108. double int_inf_convoluted_cos_x_n(int n, double sigma);
  109. ///function gives the result of exp(-ct/tau)*sin(delta_m*ct) and exp(-ct/tau)*cos(delta_m*ct) convoluted with a gaussian with width sigma
  110. void convoluted_exp_sincos(double ct, double sigma, double tau, double deltam, double& one, double& two);
  111. ///function gives the norm of the expression exp(-ct/tau)*sin(delta_m*ct) and exp(-ct/tau)*cos(delta_m*ct) convoluted with a gaussian with width sigma
  112. void norm_convoluted_exp_sincos(double tau, double deltam, double& one, double& two);
  113. ///function calculates exp(-ct/tau) convoluted with a gaussian with width sigma
  114. double convoluted_exp(double ct, double sigma_ct, double S);
  115. ///function calculates exp(-ct/tau) depending on the parameters normalized or not
  116. double expdecay(double t, double tau, bool normalized);
  117. ///function calculates 1/(sqrt(2*pi)*exp(-(x-mean)^2/(2*sigma^2)))
  118. double gauss(double x, double sigma, double mean);
  119. ///function calculates a normed gaussian between the values min and max used in the mass pdfs
  120. double normed_gauss(double x, double sigma, double mean, double min, double max);
  121. ///integrate gauss from a to b
  122. double linear(double x, double min, double max, double slope);
  123. ///very important helper function, the error function with complex argument. This is probably one of the performance bottlenecks. Probably much faster with a lookup table and interpolation
  124. double threshold(double x, double thr, double n);
  125. double int_threshold(double a, double b, double thr, double n);
  126. //see arxiv 1207.4004
  127. /*
  128. std::complex<double> bw_kstar_amp(double mkpi_squared, double gammakstar, double mkstar);
  129. std::complex<double> bw_kstarzero_amp(double mkpisquared, double gk_re, double gk_im, double gammak, double mk, double gammakstarzero, double mkstarzero);
  130. double bw_kstar_amp_squared(double mkpisquared, double gammakstar, double mkstar);
  131. std::complex<double> bw_kstar_amp_kstarzero_amp_bar(double mkpisquared, double gammakstar, double mkstar, double gk_re, double gk_im, double gammak, double mk, double gammakstarzero, double mkstarzero);
  132. double bw_kstarzero_amp_squared(double mkpisquared, double gk_re, double gk_im, double gammak, double mk, double gammakstarzero, double mkstarzero);
  133. */
  134. double daughtermom(double m, double m1, double m2);
  135. std::complex<double> mkpi_simple_bw_kstar_amp(double mkpi, double qsquared, double gammakstar, double mkstar);
  136. double mkpi_simple_bw_kstar_amp_squared(double mkpi, double qsquared, double gammakstar, double mkstar);
  137. double gsl_mkpi_simple_bw_kstar_amp_squared(double x, void* par);
  138. double int_mkpi_simple_bw_kstar_amp_squared(const double& mkpia, const double& mkpib, const double& qsquared, const double& gammakstar, const double& mkstar);
  139. std::complex<double> mkpi_simple_kstarzero_amp(double mkpi, double qsquared, double f800mag, double f800phase, double gammaf800, double mf800, double gammakstarzero, double mkstarzero);
  140. double mkpi_simple_kstarzero_amp_squared(double mkpi, double qsquared, double f800mag, double f800phase, double gammaf800, double mf800, double gammakstarzero, double mkstarzero);
  141. double gsl_mkpi_simple_kstarzero_amp_squared(double x, void* par);
  142. double int_mkpi_simple_kstarzero_amp_squared(const double& mkpia, const double& mkpib, const double& qsquared, const double& f800mag, const double& f800phase, const double& gammaf800, const double& mf800, const double& gammakstarzero, const double& mkstarzero);
  143. std::complex<double> mkpi_simple_bw_kstar_amp_kstarzero_amp_bar(double mkpi, double qsquared,
  144. double gammakstar, double mkstar, double asphase,
  145. double f800mag, double f800phase, double gammaf800, double mf800, double gammakstarzero, double mkstarzero);
  146. std::complex<double> mkpi_simple_bw_kstar_amp_bar_kstarzero_amp(double mkpi, double qsquared,
  147. double gammakstar, double mkstar, double asphase,
  148. double f800mag, double f800phase, double gammaf800, double mf800, double gammakstarzero, double mkstarzero);
  149. std::complex<double> int_mkpi_simple_bw_kstar_amp_kstarzero_amp_bar(const double& mkpia, const double& mkpib, const double& qsquared,
  150. const double& gammakstar, const double& mkstar, const double& asphase,
  151. const double& f800mag, const double& f800phase, const double& gammaf800, const double& mf800, const double& gammakstarzero, const double& mkstarzero);
  152. std::complex<double> int_mkpi_simple_bw_kstar_amp_bar_kstarzero_amp(const double& mkpia, const double& mkpib, const double& qsquared,
  153. const double& gammakstar, const double& mkstar, const double& asphase,
  154. const double& f800mag, const double& f800phase, const double& gammaf800, const double& mf800, const double& gammakstarzero, const double& mkstarzero);
  155. double gsl_mkpi_simple_re_bw_kstar_amp_kstarzero_amp_bar(double x, void* par);
  156. double gsl_mkpi_simple_im_bw_kstar_amp_kstarzero_amp_bar(double x, void* par);
  157. double gsl_mkpi_simple_re_bw_kstar_amp_bar_kstarzero_amp(double x, void* par);
  158. double gsl_mkpi_simple_im_bw_kstar_amp_bar_kstarzero_amp(double x, void* par);
  159. std::complex<double> mkpi_bw_kstar_amp(double mkpi, double qsquared, double gammakstar, double mkstar, double R);
  160. std::complex<double> mkpi_kstarzero_lass_amp(double mkpi, double qsquared, double asphase, double a, double r, double gammakstarzero, double mkstarzero, double R);
  161. std::complex<double> mkpi_bw_kstar_amp_kstarzero_lass_amp_bar(double mkpi, double qsquared, double gammakstar, double mkstar, double asphase, double a, double r, double gammakstarzero, double mkstarzero, double R);
  162. std::complex<double> mkpi_bw_kstar_amp_bar_kstarzero_lass_amp(double mkpi, double qsquared, double gammakstar, double mkstar, double asphase, double a, double r, double gammakstarzero, double mkstarzero, double R);
  163. double mkpi_bw_kstar_amp_squared(double mkpi, double qsquared, double gammakstar, double mkstar, double R);
  164. double mkpi_kstarzero_lass_amp_squared(double mkpi, double qsquared, double asphase, double a, double r, double gammakstarzero, double mkstarzero, double R);
  165. std::complex<double> mkpi_kstarzero_isobar_amp(double mkpi, double qsquared, double f800mag, double f800phase, double gammaf800, double mf800, double gammakstarzero, double mkstarzero, double R);
  166. double mkpi_kstarzero_isobar_amp_squared(double mkpi, double qsquared, double f800mag, double f800phase, double gammaf800, double mf800, double gammakstarzero, double mkstarzero, double R);
  167. std::complex<double> mkpi_bw_kstar_amp_kstarzero_isobar_amp_bar(double mkpi, double qsquared,
  168. double gammakstar, double mkstar, double asphase,
  169. double f800mag, double f800phase, double gammaf800, double mf800, double gammakstarzero, double mkstarzero, double R);
  170. std::complex<double> mkpi_bw_kstar_amp_bar_kstarzero_isobar_amp(double mkpi, double qsquared,
  171. double gammakstar, double mkstar, double asphase,
  172. double f800mag, double f800phase, double gammaf800, double mf800, double gammakstarzero, double mkstarzero, double R);
  173. double gsl_mkpi_kstarzero_isobar_amp_squared(double x, void* par);
  174. double gsl_mkpi_re_bw_kstar_amp_kstarzero_isobar_amp_bar(double x, void* par);
  175. double gsl_mkpi_im_bw_kstar_amp_kstarzero_isobar_amp_bar(double x, void* par);
  176. double gsl_mkpi_re_bw_kstar_amp_bar_kstarzero_isobar_amp(double x, void* par);
  177. double gsl_mkpi_im_bw_kstar_amp_bar_kstarzero_isobar_amp(double x, void* par);
  178. double gsl_mkpi_bw_kstar_amp_squared(double x, void* par);
  179. double gsl_mkpi_kstarzero_lass_amp_squared(double x, void* par);
  180. double gsl_mkpi_re_bw_kstar_amp_kstarzero_lass_amp_bar(double x, void* par);
  181. double gsl_mkpi_im_bw_kstar_amp_kstarzero_lass_amp_bar(double x, void* par);
  182. double gsl_mkpi_re_bw_kstar_amp_bar_kstarzero_lass_amp(double x, void* par);
  183. double gsl_mkpi_im_bw_kstar_amp_bar_kstarzero_lass_amp(double x, void* par);
  184. double int_mkpi_bw_kstar_amp_squared(double mkpia, double mkpib, double qsquared, double gammakstar, double mkstar, double R);
  185. double int_mkpi_bw_kstar_amp_squared(double qsquared, double gammakstar, double mkstar, double R);
  186. double int_mkpi_kstarzero_lass_amp_squared(double mkpia, double mkpib, double qsquared, double asphase, double a, double r, double gammakstarzero, double mkstarzero, double R);
  187. double int_mkpi_kstarzero_lass_amp_squared(double qsquared, double asphase, double a, double r, double gammakstarzero, double mkstarzero, double R);
  188. std::complex<double> int_mkpi_bw_kstar_amp_kstarzero_lass_amp_bar(double mkpia, double mkpib, double qsquared, double gammakstar, double mkstar, double asphase, double a, double r, double gammakstarzero, double mkstarzero, double R);
  189. std::complex<double> int_mkpi_bw_kstar_amp_bar_kstarzero_lass_amp(double mkpia, double mkpib, double qsquared, double gammakstar, double mkstar, double asphase, double a, double r, double gammakstarzero, double mkstarzero, double R);
  190. std::complex<double> int_mkpi_bw_kstar_amp_kstarzero_lass_amp_bar(double qsquared, double gammakstar, double mkstar, double asphase, double a, double r, double gammakstarzero, double mkstarzero, double R);
  191. std::complex<double> int_mkpi_bw_kstar_amp_bar_kstarzero_lass_amp(double qsquared, double gammakstar, double mkstar, double asphase, double a, double r, double gammakstarzero, double mkstarzero, double R);
  192. double int_mkpi_kstarzero_isobar_amp_squared(double mkpia, double mkpib, double qsquared, double f800mag, double f800phase, double gammaf800, double mf800, double gammakstarzero, double mkstarzero, double R);
  193. double int_mkpi_kstarzero_isobar_amp_squared(double qsquared, double f800mag, double f800phase, double gammaf800, double mf800, double gammakstarzero, double mkstarzero, double R);
  194. std::complex<double> int_mkpi_bw_kstar_amp_kstarzero_isobar_amp_bar(double mkpia, double mkpib, double qsquared,
  195. double gammakstar, double mkstar, double asphase,
  196. double f800mag, double f800phase, double gammaf800, double mf800, double gammakstarzero, double mkstarzero, double R);
  197. std::complex<double> int_mkpi_bw_kstar_amp_bar_kstarzero_isobar_amp(double mkpia, double mkpib, double qsquared,
  198. double gammakstar, double mkstar, double asphase,
  199. double f800mag, double f800phase, double gammaf800, double mf800, double gammakstarzero, double mkstarzero, double R);
  200. std::complex<double> int_mkpi_bw_kstar_amp_kstarzero_isobar_amp_bar(double qsquared,
  201. double gammakstar, double mkstar, double asphase,
  202. double f800mag, double f800phase, double gammaf800, double mf800, double gammakstarzero, double mkstarzero, double R);
  203. std::complex<double> int_mkpi_bw_kstar_amp_bar_kstarzero_isobar_amp(double qsquared,
  204. double gammakstar, double mkstar, double asphase,
  205. double f800mag, double f800phase, double gammaf800, double mf800, double gammakstarzero, double mkstarzero, double R);
  206. double rndgauss(TRandom3* rnd, double mean, double width, double min, double max);
  207. double rndgauss(TRandom3* rnd, double mean, double widthlo, double widthhi, double min, double max);
  208. void moments_to_observables(TRandom3* rnd,
  209. std::vector<double> mom,
  210. std::vector<double> momcov,
  211. double fsext,
  212. double dfsext,
  213. std::vector<double>& obs,
  214. std::vector<double>& obscov,
  215. bool usefsext = true
  216. );
  217. template<class T> struct NumberGreaterThan
  218. {
  219. bool operator()(const T a, const T b) const
  220. { return std::abs(a) > std::abs(b); }
  221. };
  222. template<typename iterator> typename iterator::value_type add_numbers(iterator begin, iterator end){
  223. typedef typename iterator::value_type T;
  224. if (end == begin) return 0.;
  225. std::make_heap(begin, end, NumberGreaterThan<T>());
  226. for (; begin + 1 < end; ) {
  227. T x = *begin;
  228. std::pop_heap(begin, end--, NumberGreaterThan<T>());
  229. do {
  230. x += *begin;
  231. std::pop_heap(begin, end--, NumberGreaterThan<T>());
  232. } while (std::abs(*begin) >= std::abs(x) && begin < end);
  233. *end++ = x;
  234. std::push_heap(begin, end, NumberGreaterThan<T>());
  235. }
  236. return *begin;
  237. };
  238. std::vector<UInt_t>GetNOutOfM(UInt_t N, UInt_t M, Int_t Seed, bool DoubleCounts, bool PoissonFluctuate);
  239. template<typename iterator> typename iterator::value_type add_numbers(iterator begin, iterator end);
  240. int throw_multivariate_normal(const unsigned int ndim, const unsigned int ntoys, const std::vector<double>& xi, const std::vector<double>& cov, std::vector<std::vector<double> >& results);
  241. int get_mean_cov(const std::vector<std::vector<double> >& meas, std::vector<double>& mean, std::vector<double>& cov);
  242. void sis_to_pis(TRandom3* rnd,
  243. std::vector<double> sis,
  244. std::vector<double> sicorrs,
  245. std::vector<double>& pis,
  246. std::vector<double>& picorrs);
  247. std::complex<double> cErrF(const std::complex<double>& x);
  248. ///implementation 2 of the complex error function
  249. std::complex<double> cErrF_2(const std::complex<double>& x);
  250. std::complex<double> ErrF_2(const std::complex<double>& x);
  251. ///implementation 3 of the complex error function
  252. std::complex<double> cErrF_3(const std::complex<double>& x);
  253. ///the faddeeva function function
  254. std::complex<double> Faddeeva_2 (const std::complex<double>& z);
  255. ///used by cErrF, does the actual calculations
  256. std::complex<double> wErrF(const std::complex<double>& arg);
  257. ///This is another version of the complex error function, used in the newer cdf code
  258. std::complex<double> nwwerf(const std::complex<double> z);
  259. }
  260. #endif