biyelunwen/99.scripts/trinity_utils/util/misc/examine_weldmer_halves.pl

109 lines
2.3 KiB
Perl

#!/usr/bin/env perl
use strict;
use warnings;
my $usage = "\n\nusage: $0 weldmer\n\n";
my $weldmer = $ARGV[0] or die $usage;
main: {
if (-f $weldmer) {
open (my $fh, $weldmer) or die $!;
while (<$fh>) {
my $weldmer = $_;
chomp $weldmer;
&check_weldmer($weldmer);
}
close $fh;
}
else {
&check_weldmer($weldmer);
}
exit(0);
}
####
sub check_weldmer {
my ($weldmer) = @_;
my $weldmer_len = length($weldmer);
my $left_substr = substr($weldmer, 0, int($weldmer_len/2));
my $right_substr = substr($weldmer, int($weldmer_len/2));
# &check_per_id($weldmer);
&check_per_id($left_substr);
&check_per_id($right_substr);
return;
}
####
sub check_per_id {
my ($weldmer) = @_;
my $weldmer_len = length($weldmer);
my $half_len = int($weldmer_len/2);
#print "Half_len of " . length($weldmer_len) . " = $half_len\n";
my @chars = split(//, $weldmer);
my $max_ratio = 0;
my $best_left = "";
my $best_right = "";
for (my $i = 0; $i < $half_len; $i++) {
for (my $j = $i + 1; $j <= $half_len; $j++) {
my $ref_pos = $i;
my $other_pos = $j;
my $count_same = 0;
my $count_chars = 0;
my $left_sub = "";
my $right_sub = "";
while ($other_pos <= $j + $half_len - 1) {
$count_chars++;
if ($chars[$ref_pos] eq $chars[$other_pos]) {
$count_same++;
}
$left_sub .= $chars[$ref_pos];
$right_sub .= $chars[$other_pos];
$ref_pos++;
$other_pos++;
}
my $ratio = $count_same/$count_chars;
if ($ratio > $max_ratio) {
$max_ratio = $ratio;
$best_left = $left_sub;
$best_right = $right_sub;
}
}
}
$max_ratio = sprintf("%.3f", $max_ratio);
print "$weldmer\t$best_left\t$best_right\t$max_ratio\n";
return;
}