#!/usr/bin/perl -s
################################################################################
#
################################################################################
require "MBGD_Conf.pl";

$ConvUpper = 1;
$| = 1;

if ($ENV{'WWWROOT'}) {
    $HOMEDIR = "$ENV{'WWWROOT'}/..";
} else {
    if ($ENV{'DIR_DATA'}) {
        $HOMEDIR = $ENV{'DIR_DATA'};
    }
    else {
        $curr_dir = `dirname $0`; chop $curr_dir;
        $HOMEDIR = "$curr_dir/..";
    }
}
$ENV{'DBTAB'} = "$ENV{'WWWROOT'}/etc/dbtab" if (! $ENV{'DBTAB'});
$ENV{'PATH'} .= ':' if ($ENV{'PATH'});
$ENV{'PATH'} .= "$HOMEDIR/bin:/home/hitac/home1/uchiyama/bin";

$PVAL_CUTOFF = 1e-2 if (! defined $PVAL_CUTOFF);

$DPOPT = '-l' if (! $DPOPT);   ## Local

$db1 = $sp1 if ($sp1);
$db2 = $sp2 if ($sp2);

#if ($oldfile && -f $oldfile) {
#	&read_oldfile($oldfile);
#}


while (<>) {
	if (/^RANK/) {
		chop;
		($rank, $id1, $len1, $id2, $len2, $score, $pval, $n)
			= split(/#/);
		if (($db1) = ($id1 =~ /^([^:]+):/)) {
		} else {
			$id1 =~ tr/a-z/A-Z/ if ($ConvUpper);
			$id1 = "$sp1:$id1";
		}
		if (($db2) = ($id2 =~ /^([^:]+):/)) {
		} else {
			$id2 =~ tr/a-z/A-Z/ if ($ConvUpper);
			$id2 = "$sp2:$id2";
		}
		$db1 = $sp1 if ($sp1);
		$db2 = $sp2 if ($sp2);

                # E-value κƷ׻
		$pval = &eval_corr($pval);
		if ($pval < $PVAL_CUTOFF) {
			if ($Line{$id1,$id2}) {
				print &replace_pval($Line{$id1,$id2},$pval,0);
				next;
			} elsif ($Line{$id2,$id1}) {
				print &replace_pval($Line{$id2,$id1},$pval,1);
				next;
			}
			$Pvals{$id1,$id2} = $pval;
			$DBent{$id2} = 1;
		}
	} elsif (/^HSP/) {
		($hsp, $region1, $region2, $score, $bit, $eval, $pval,
		  $idt, $idtlen, $idtpct, $pos, $poslen, $pospct) = split(/#/);
	}
}

if ($Qfile) {
	open(Q, $Qfile) || die;
	while (<Q>) {
		if (/^>[ ]*(\S+)/) {
			$id = $1;
		}
		$id = "$qdb:$id" if ($qdb && $id !~ /:/);
		$Qseq{$id} .= $_;
	}
	close(Q);
	@DBent = keys %DBent;
	$DBent = join(' ', @DBent);
	open(BGET, "$cmd_bget -p $ENV{'DBTAB'} $DBent |") || die;
	$i = -1;
	while (<BGET>) {
		if (/^>[ ]*(\S+)/) {
			$id = $1;
			$i++;
		}
		$DBseq{$DBent[$i]} .= $_;
	}
	close(BGET);
}
exit if (! keys %Pvals);

$pid = open(P1, "|-");
if ($pid) {
	&parent_proc;
} else {
	&child_proc;
}
close(P1);

sub parent_proc {
	foreach $ids (keys %Pvals) {
		($id1,$id2) = split(/$;/,$ids);
		if ($Qfile) {
			print P1 "$Qseq{$id1}\n$DBseq{$id2}\n";
		} else {
			print P1 "$id1\n$id2\n";
			print "$id1\n$id2\n";
		}
	}
	print P1 "\n";   # bget λΤ
}

sub child_proc {
	$pid = open(P2, "-|");
	if (! $pid) {
		## Child:  pipe process
		if ($Qfile) {
			exec("$cmd_dp2 -A -s -G -P -w1 $DPOPT -");
		} else {
##print STDERR "$cmd_bget -p $ENV{'DBTAB'} | $cmd_dp2 -A -s -x2 -g12 -P -w1 $DPOPT -";
			$execmd = "$cmd_bget -p $ENV{'DBTAB'} | $cmd_dp2 -A -s -G -P -w1 $DPOPT -";
			exec("$execmd");
		}
	} else {
		## Parent: filtering the output
		while (<P2>) {
			chop;
		($name1, $len1, $name2, $len2, $from1, $to1, $from2, $to2,
		$matchlen, $matchnum, $percent, $bestscore, $mlpam,
		$exppam, $sdpam, $origscore) = split(/\s+/);
			if ($name1 !~ /:/) {
				$name1 =~ tr/a-z/A-Z/ if ($ConvUpper);
				$name1 = "$db1:$name1";
			}
			if ($name2 !~ /:/) {
				$name2 =~ tr/a-z/A-Z/ if ($ConvUpper);
				$name2 = "$db2:$name2";
			}
			$pval = $Pvals{$name1,$name2};
			print "$name1 $name2 $from1 $to1 $len1 $from2 $to2 $len2 $matchlen $matchnum $percent $bestscore $pval $mlpam $exppam $sdpam $origscore\n";
		}
		close(P2);
	}
}

sub eval_corr {
	local($eval) = @_;
	local($N0) = 1000000;		## Normalized dbsize
	local($corr);
	$corr = sprintf("%.2g", $eval * $N0 / $N);
	$corr =~ s/^\s+//;
	$corr;
}

#sub read_oldfile {
#	local($oldfile) = @_;
#	open(O, $oldfile) || die;
#	while (<O>) {
#		($name1,$name2,$from1,$to1,$len1,$from2,$to2,$len2,
#			$matchlen,$matchnum,$ident,$score,$pval,
#			$mlpam,$meanpam,$sdpam)
#				= split(/\s/);
#		$Line{$name1,$name2} = $_;
#	}
#	close(O);
#}

sub replace_pval {
	local($line,$newpval,$rev) = @_;
	local($name1,$name2,$from1,$to1,$len1,$from2,$to2,$len2,
		$matchlen,$matchnum,$percent,$bestscore,$pval,
		$mlpam,$exppam,$sdpam,$origscore)
			= split(/\s/, $line);
	local($out);
	if ($rev) {
		$out = "$name2 $name1";
	} else {
		$out = "$name1 $name2";
	}
	"$out $from1 $to1 $len1 $from2 $to2 $len2 $matchlen $matchnum $percent $bestscore $newpval $mlpam $exppam $sdpam $origscore\n";
}
