I have an issue that I think is probably a simple one. I do not know how to use Math::BigFloat::bnok(). I get the following error message "Can't call method "Math::BigInt::bnok" without a package or object reference at hexamer_rarity_codonusage.pl line 67."
Despite reading the Math::BigFloat page and extensive googling, the solution seems beyond my ability to comprehend. Please help. I will post the files that this code uses if necessary, just ask.
#!/usr/bin/perl
use Getopt::Long;
use Math::BigFloat;
use Math::BigInt;
my $codon_fname="codons.txt";
my $n_amer_fname="codon_pair.txt";
my $codon_usage_fname="";
my $mfactor=100;
my $codon_usage_per=100;
GetOptions(
"c=s" => \$codon_usage_fname,
) or die ("Error in command line arguments\n");
open(CODON,'<',$codon_fname)||die "No $codon_fname file available\n";
my %codon_counts;
while (my $line=<CODON>){
chomp $line;
$codon_counts{$line}= 0 ;
}
close CODON;
open(NAMER,'<',$n_amer_fname)||die "No $n_amer_fname file available\n"
+;
my @namer;
while (my $line=<NAMER>){
chomp $line;
push @namer, $line;
}
close NAMER;
my %cd_lookup;
open(CLT,'<',$codon_usage_fname)||die "Cannot find codon score lookup
+table file $codon_usage_fname\n";
while(my $line=<CLT>){
chomp $line;
my @array=split(/\t/,$line);
$cd_lookup{$array[0]}=$array[1];
}
close CLT;
Math::BigFloat->accuracy(40);
my $x=Math::BigFloat->new(40);
my $y=Math::BigFloat->new(40);
my $z=Math::BigFloat->new(40);
my $d=Math::BigFloat->new(40);
for(my $i=0;$i<@namer;++$i){
my $pvalue=0;
my @choose_numerator_array;
my %cchash=%codon_counts;
for(my $j=0;$j<length($namer[$i])-2;++$j){
++$cchash{substr($namer[$i],$j,3)};
}
foreach my $codon(%cchash){
if($cchash{$codon}){
$x=$cchash{$codon};
$y=$cd_lookup{$codon}*$mfactor;
$z=$y->Math::BigInt::bnok($x);
push @choose_numerator_array,$z->copy();
}
}
$x=$choose_numerator_array[0];
for(my $j=1;$j<scalar(@choose_numerator_array);++$j){
$y=$choose_numerator_array[$j];
$x=$x*$y;
}
$y=$codon_usage_per*$mfactor;
$z=scalar(@choose_numerator_array);
$d=$y*$z;
$x=$x/$d;
print $namer[$i],"\t",$x,"\n";
}
If any future perl users want the answer to how I solved this problem, below is the functional code
#!/usr/bin/perl
use Getopt::Long;
use Math::BigFloat;
use Math::BigInt;
my $codon_fname="codons.txt";
my $n_amer_fname="codon_pair.txt";
my $codon_usage_fname="";
my $mfactor=100;
my $codon_usage_per=100;
GetOptions(
"c=s" => \$codon_usage_fname,
) or die ("Error in command line arguments\n");
open(CODON,'<',$codon_fname)||die "No $codon_fname file available\n";
my %codon_counts;
while (my $line=<CODON>){
chomp $line;
$codon_counts{$line}= 0 ;
}
close CODON;
open(NAMER,'<',$n_amer_fname)||die "No $n_amer_fname file available\n"
+;
my @namer;
while (my $line=<NAMER>){
chomp $line;
push @namer, $line;
}
close NAMER;
my %cd_lookup;
open(CLT,'<',$codon_usage_fname)||die "Cannot find codon score lookup
+table file $codon_usage_fname\n";
while(my $line=<CLT>){
chomp $line;
my @array=split(/\t/,$line);
$cd_lookup{$array[0]}=$array[1];
}
close CLT;
use bignum;
my $x,$y,$z,$a,$b,$c;
#Math::BigFloat->accuracy(40);
#$x=Math::BigInt->new($x);
#$y=Math::BigInt->new($y);
#$z=Math::BigInt->new($z);
#$a=Math::BigFloat->new($a);
#$b=Math::BigFloat->new($b);
#$c=Math::BigFloat->new($c);
for(my $i=0;$i<@namer;++$i){
my @choose_numerator_array;
my %cchash=%codon_counts;
my $count=0;
for(my $j=0;$j<length($namer[$i])-2;++$j){
++$cchash{substr($namer[$i],$j,3)};
++$count;
}
foreach my $codon(%cchash){
if($cchash{$codon}){
$x=$cchash{$codon};
$y=$cd_lookup{$codon}*$mfactor;
$z=binomial($y,$x);
push @choose_numerator_array,$z->copy();
}
}
$b=$choose_numerator_array[0];
for(my $j=1;$j<scalar(@choose_numerator_array);++$j){
$a=$choose_numerator_array[$j];
$b=$b*$a;
}
$y=$codon_usage_per*$mfactor;
$a=&binomial($y,$count);
$c=$b/$a;
print $namer[$i],"\t",$c,"\n";
}
sub binomial {
use bigint;
my ($r, $n, $k) = (1, @_);
for (1 .. $k) { $r *= $n--; $r /= $_ }
$r;
}