#!/usr/bin/perl -s

#$PACK_TEMPL = "A64 A64 i i i i f d i s f f";

# name name from to len from to len ident eval score pam
# A64  A64  i    i  i   i    i  i   f     f    i     i
$PACK_TEMPL = "A64 A64 i i i i i i f f i i";
$PACK_TEMPL = "a64 a64 S S S S S S f f S S";
$PACK_TEMPL = "a32 a32 S S S S f f S S";

while (<>) {
        next if (/^$/);
	($name1,$name2,$from1,$to1,$len1,$from2,$to2,$len2,$alilen,$matchnum,
		$ident,$bestscore,$eval,$mlpam,$meanpam,$sdpam,$origscore) = split;

#	$ovlp1 = sprintf "%.1f", &cal_ovlp1;
#	$ovlp2 = sprintf "%.1f", &cal_ovlp2;

	$data = { name1 => $name1,
                  name2 => $name2,
                  from1 => $from1,        #
                  to1   => $to1,          #
                  from2 => $from2,        #
                  to2   => $to2,          #
##                  ovlp1 => $ovlp1,
##                  ovlp2 => $ovlp2,
		  score => $origscore,
                  pam   => $mlpam,
		  eval  => $eval,
                  ident => $ident};
	push(@data, $data);
}


if ($SCORE){
	$func = by_score;
} elsif ($EVAL){
	$func = by_eval;
} else {
	$func = by_pam;
}

foreach $d (sort $func @data) {
	if ($PACK) {
		print pack $PACK_TEMPL,
			$d->{name1}, $d->{name2},
			$d->{from1}, $d->{to1}, # $d->{len1},    #
			$d->{from2}, $d->{to2}, # $d->{len2},    #
			$d->{ident},
                        $d->{eval},
                        $d->{score},
			$d->{pam};
	} else {
		print "$d->{name1} $d->{name2} ";
                print "$d->{from1} $d->{to1} "; # $d->{len1} ";
                print "$d->{from2} $d->{to2} "; # $d->{len2} ";
                print "$d->{ident} ";
                print "$d->{eval} ";
                print "$d->{score} ";
                print "$d->{pam} ";
                print "\n";
	}
}

sub by_pam {
	$a->{pam} <=> $b->{pam};
}

sub by_eval {
	$a->{eval} <=> $b->{eval};
}
sub by_score {
	$b->{score} <=> $a->{score};
}


sub cal_ovlp1 {
	local($ov1);
	local($ov2);

	$ov1 = ($to1 - $from1) * 100 / $len1;
	$ov2 = ($to2 - $from2) * 100 / $len2;

	$ov2 > $ov1 ? $ov1 : $ov2;
}

sub cal_ovlp2 {
	local($ov1);
	local($ov2);

	$ov1 = ($to1 - $from1) * 100 / $len1;
	$ov2 = ($to2 - $from2) * 100 / $len2;

	$ov2 < $ov1 ? $ov1 : $ov2;
}
