diff --git a/binarycpython/utils/distribution_functions.py b/binarycpython/utils/distribution_functions.py index 245da9f396098f7ae1e8974914eb4857b76750ea..62f0c15cee6642e220d5b562b61d6c316c21df93 100644 --- a/binarycpython/utils/distribution_functions.py +++ b/binarycpython/utils/distribution_functions.py @@ -149,6 +149,53 @@ def set_opts(opts, newopts): return newopts +def gaussian(x, mean, sigma, gmin, gmax): + """ + Gaussian distribution function. used for e..g Duquennoy + Mayor 1991 + + Input: location, mean, sigma, min and max: + """ + # # location (X value), mean and sigma, min and max range + # my ($x,$mean,$sigma,$gmin,$gmax) = @_; + + if ((x < gmin) or (x > gmax)): + p = 0 + else: + # normalize over given range + # TODO: add loading into global var + normalisation = gaussian_normalizing_const(mean, sigma, gmin, gmax) + p = normalisation * gaussian_func(x, mean, sigma) + + return p + +def gaussian_normalizing_const(mean, sigma, gmin, gmax): + """ + Function to calculate the normalisation constant for the gaussian + """ + + # First time; calculate multipllier for given mean and sigma + ptot = 0 + resolution = 1000 + d = (gmax-gmin)/resolution + + for i in range(resolution): + y = gmin + i*d + ptot += d * gaussian_func(y, mean, sigma) + + + # TODO: Set value in global + return ptot + +def gaussian_func(x, mean, sigma): + """ + Function to evaluate a gaussian at a given point + """ + GAUSSIAN_PREFACTOR = (1.0/math.sqrt(2.0*math.pi)); + + r = 1.0/(sigma) + y = (x - mean) * r + return GAUSSIAN_PREFACTOR * r * math.exp(-0.5 * y**2) + ##### # Mass distributions ##### @@ -208,52 +255,6 @@ def ktg93(): # return ktg93(@_) * $m; # } -# sub gaussian -# { -# # Gaussian distribution function e.g. for Duquennoy + Mayor 1991 - -# # location (X value), mean and sigma, min and max range -# my ($x,$mean,$sigma,$gmin,$gmax) = @_; - -# my $p; -# if($x<$gmin || $x>$gmax) -# { -# $p=0.0; -# } -# else -# { -# # normalize over given range -# my $mult= $gauss_consts{$mean}{$sigma} // -# gaussian_normalizing_const($mean,$sigma,$gmin,$gmax); -# $p = $mult * gaussian_func($x,$mean,$sigma); -# } -# return $p; -# } - -# sub gaussian_normalizing_const -# { -# # first time: calculate multiplier for given $mean, $sigma -# my ($mean,$sigma,$gmin,$gmax) = @_; -# my $ptot=0.0; -# my $d=($gmax-$gmin)/1000.0; -# for(my $y=$gmin;$y<=$gmax;$y+=$d) -# { -# $ptot += $d * gaussian_func($y,$mean,$sigma); -# } -# $gauss_consts{$mean}{$sigma}=$ptot; # save for later -# return $gauss_consts{$mean}{$sigma}; -# } - -# sub gaussian_func -# { -# # local function -# # three args: x, mean, sigma -# my $r=1.0/$_[2]; # 1/sigma -# my $y=($_[0]-$_[1])*$r; -# return(GAUSSIAN_PREFACTOR*$r*exp(-0.5*$y*$y)); -# } - - ## # Binary fractions ## @@ -285,6 +286,8 @@ def raghavan2010_binary_fraction(m): (1.10450e+00) * (m**(4.93670e-01)) + (-6.95630e-01) ) ) +# print(raghavan2010_binary_fraction(2)) + ## # Period distributions ## @@ -329,7 +332,7 @@ def sana12(M1, M2, a, P, amin, amax, x0, x1, p): # TODO: ? wtf. vague input res = 3.0/2.0 * log_ln_converter * A1 * x**p return res -# sana12(10, 2, 10, 100, 1, 1000, math.log(10), math.log(1000), 6) +# print(sana12(10, 2, 10, 100, 1, 1000, math.log(10), math.log(1000), 6)) def flatsections(x, opts): """ @@ -353,4 +356,4 @@ def flatsections(x, opts): y = y * c # print("flatsections gives C={}: y={}\n",c,y) return y -print(flatsections(1, [{'min': 0, 'max': 2, 'height': 3}])) +# print(flatsections(1, [{'min': 0, 'max': 2, 'height': 3}]))