package Mutual; use strict; require Exporter; our @ISA = qw(Exporter); our @EXPORT = qw(log_2 get_index get_Hx fisher_yates_shuffle); # fisher_yates_shuffle( \@array ) : # generate a random permutation of @array in place sub fisher_yates_shuffle { my $array = shift; my $i; for ($i = @$array; --$i; ) { my $j = int rand ($i+1); next if $i == $j; @$array[$i,$j] = @$array[$j,$i]; } } # fisher_yates_shuffle( \@array ); # permutes @array in place sub log_2 { my $base = 2; my $value = $_[0]; return log($value)/log($base); } sub get_index{ $_[0] lt $_[1] ? ($_[0].$_[1]) : ($_[1].$_[0]) } sub get_Hx{ my $site = $_[0]; my $no_of_sequences =length($site); my $count_A=0 ; my $count_C=0 ; my $count_D=0 ; my $count_E=0 ; my $count_F=0 ; my $count_G=0 ; my $count_H=0 ; my $count_I=0 ; my $count_J=0 ; my $count_K=0 ; my $count_L=0 ; my $count_M=0 ; my $count_N=0 ; my $count_P=0 ; my $count_Q=0 ; my $count_R=0 ; my $count_S=0 ; my $count_T=0 ; my $count_V=0 ; my $count_W=0 ; my $count_Y=0 ; my $count_ =0 ; my $sum1=0; my $sum2=0; my $sum3=0; my $sum4=0; my $sum5=0; my $sum6=0; my $sum7=0; my $sum8=0; my $sum9=0; my $sum10=0; my $sum11=0; my $sum12=0; my $sum13=0; my $sum14=0; my $sum15=0; my $sum16=0; my $sum17=0; my $sum18=0; my $sum19=0; my $sum20=0; my $sum21=0; while($site =~m/A/g){ $count_A++; } while($site =~m/C/g){ $count_C++; } while($site =~m/D/g){ $count_D++; } while($site =~m/E/g){ $count_E++; } while($site =~m/F/g){ $count_F++; } while($site =~m/G/g){ $count_G++; } while($site =~m/H/g){ $count_H++; } while($site =~m/I/g){ $count_I++; } while($site =~m/K/g){ $count_K++; } while($site =~m/L/g){ $count_L++; } while($site =~m/M/g){ $count_M++; } while($site =~m/N/g){ $count_N++; } while($site =~m/P/g){ $count_P++; } while($site =~m/Q/g){ $count_Q++; } while($site =~m/R/g){ $count_R++; } while($site =~m/S/g){ $count_S++; } while($site =~m/T/g){ $count_T++; } while($site =~m/V/g){ $count_V++; } while($site =~m/W/g){ $count_W++; } while($site =~m/Y/g){ $count_Y++; } while($site =~m/\./g){ $count_++; } while($site =~m/\_/g){ $count_++; } #if there is a counter with +ve value in any position of the array, then calculate the mutual information #value and store it there. if ($count_A > 0){ $sum1= -($count_A/$no_of_sequences)*log_2($count_A/$no_of_sequences); } if ($count_C > 0){ $sum2= -($count_C/$no_of_sequences)*log_2($count_C/$no_of_sequences); } if ($count_D > 0){ $sum3= -($count_D/$no_of_sequences)*log_2($count_D/$no_of_sequences); } if ($count_E > 0){ $sum4= -($count_E/$no_of_sequences)*log_2($count_E/$no_of_sequences); } if ($count_F > 0){ $sum5= -($count_F/$no_of_sequences)*log_2($count_F/$no_of_sequences); } if ($count_G > 0){ $sum6= -($count_G/$no_of_sequences)*log_2($count_G/$no_of_sequences); } if ($count_H > 0){ $sum7= -($count_H/$no_of_sequences)*log_2($count_H/$no_of_sequences) ; } if ($count_I > 0){ $sum8= -($count_I/$no_of_sequences)*log_2($count_I/$no_of_sequences) ; } if ($count_J > 0){ $sum9= -($count_J/$no_of_sequences)*log_2($count_J/$no_of_sequences); } if ($count_K > 0){ $sum10= -($count_K/$no_of_sequences)*log_2($count_K/$no_of_sequences); } if ($count_L > 0){ $sum11=-($count_L/$no_of_sequences)*log_2($count_L/$no_of_sequences); } if ($count_M > 0){ $sum12=-($count_M/$no_of_sequences)*log_2($count_M/$no_of_sequences); } if ($count_N > 0){ $sum13= -($count_N/$no_of_sequences)*log_2($count_N/$no_of_sequences); } if ($count_P > 0){ $sum14= -($count_P/$no_of_sequences)*log_2($count_P/$no_of_sequences); } if ($count_R > 0){ $sum15= -($count_R/$no_of_sequences)*log_2($count_R/$no_of_sequences); } if ($count_S > 0){ $sum16= -($count_S/$no_of_sequences)*log_2($count_S/$no_of_sequences); } if ($count_T > 0){ $sum17= -($count_T/$no_of_sequences)*log_2($count_T/$no_of_sequences); } if ($count_V > 0){ $sum18= -($count_V/$no_of_sequences)*log_2($count_V/$no_of_sequences); } if ($count_W > 0){ $sum19= -($count_W/$no_of_sequences)*log_2($count_W/$no_of_sequences); } if ($count_Y > 0){ $sum20= -($count_Y/$no_of_sequences)*log_2($count_Y/$no_of_sequences); } if ($count_ > 0){ $sum21= -($count_/$no_of_sequences)*log_2($count_/$no_of_sequences); } my $Hx = $sum1+$sum2+$sum3+$sum4+$sum5+$sum6+$sum7+$sum8+$sum9+$sum10+$sum11+$sum12+$sum13+$sum14 +$sum15+$sum16+$sum17+$sum18+$sum19+$sum20+$sum21; return $Hx; }#end of foreach 1;