X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=code_perl%2FMaasha%2FCalc.pm;h=6f83fd09d06dceb3faa2fece3bdc905b425b73a0;hb=dac27dcade24185a98c6b56f33f308589546a86a;hp=7906b52d6654f32c49d50396d9ced5d863e31738;hpb=54de880e571a403a6a67f83f1edbe222482a1de6;p=biopieces.git diff --git a/code_perl/Maasha/Calc.pm b/code_perl/Maasha/Calc.pm index 7906b52..6f83fd0 100644 --- a/code_perl/Maasha/Calc.pm +++ b/code_perl/Maasha/Calc.pm @@ -28,6 +28,7 @@ package Maasha::Calc; # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +use warnings; use strict; use Data::Dumper; use Storable qw( dclone ); @@ -58,6 +59,27 @@ sub is_a_number } +sub commify +{ + # Martin A. Hansen, October 2009. + + # Insert comma in long numbers. + + my ( $num, # number to commify + ) = @_; + + # Returns a string. + + my ( $copy ); + + $copy = $num; + + $copy =~ s/(^[-+]?\d+?(?=(?>(?:\d{3})+)(?!\d))|\G\d{3}(?=\d))/$1,/g; + + return $copy; +} + + sub dist_point2line { # Martin A. Hansen, June 2004. @@ -175,7 +197,7 @@ sub median $num = scalar @{ $numbers }; if ( $num % 2 == 0 ) { - $median = &mean( [ $numbers->[ $num / 2 ], $numbers->[ $num / 2 + 1 ] ] ); + $median = mean( [ $numbers->[ $num / 2 ], $numbers->[ $num / 2 + 1 ] ] ); } else { $median = $numbers->[ int( $num / 2 ) ]; } @@ -184,6 +206,39 @@ sub median } +sub standard_deviation +{ + # Martin A. Hansen, September 2008 + + # Given a list of numbers calculate and return the standard deviation: + # http://en.wikipedia.org/wiki/Standard_deviation + + my ( $numbers, # list of numbers + ) = @_; + + # Returns a float. + + my ( $mean_num, $num, $dev, $dev_sum, $mean_dev, $std_dev ); + + $mean_num = mean( $numbers ); + + $dev_sum = 0; + + foreach $num ( @{ $numbers } ) + { + $dev = ( $num - $mean_num ) ** 2; + + $dev_sum += $dev; + } + + $mean_dev = $dev_sum / scalar @{ $numbers }; + + $std_dev = sqrt( $mean_dev ); + + return $std_dev; +} + + sub min { # Martin A. Hansen, August 2006. @@ -316,6 +371,48 @@ sub sum } +sub log10 +{ + # Martin A. Hansen, August 2008. + + # Calculate the log10 of a given number. + + my ( $num, # number + ) = @_; + + # Returns a float. + + return log( $num ) / log( 10 ); +} + + +sub interpolate_linear +{ + # Martin A. Hansen, February 2010. + + # Given two data points and an x value returns the + # interpolant (y). + # + # Formula for linear interpolation: + # http://en.wikipedia.org/wiki/Interpolation#Example + + my ( $x1, + $y1, + $x2, + $y2, + $x + ) = @_; + + # Returns a float + + my ( $y ); + + $y = $y1 + ( $x - $x1 ) * ( ( $y2 - $y1 ) / ( $x2 - $x1 ) ); + + return $y; +} + + sub overlap { # Martin A. Hansen, November 2003.