#!/usr/bin/perl -s

###############################################################################
# read_blast 򥳥ԡƺ
# 
#   Database ̾ʪ̾ȤƷ̽Ϥ褦ˤ뤿
#     -addDbName ץɲ
#
###############################################################################

$Delim = "#";

$Dir{'Plus'} = '+';
$Dir{'Minus'} = '-';

while (<>) {
	chop;
	if (/^[ ]*Query=[ ]*([^ ]*)/) {
		$query = $1;
		if ($qdb && $query !~ /:/) {
			$query = "$qdb:$query";
		} elsif ($qdb && $query =~ /gp:(.*)/) {
			$query = "$qdb:$1";
		}
		$qfrom = $qto = $sfrom = $sto = '';
		$rank = 0;
		print "Query=$query\n";
	} elsif (/[ ]*\(([0-9]+) letters\)/) {
		$qlen = $1;
	} elsif (/^Database:\s+(.+)$/) {
		if ($addDbName) {
		    $sdb = $1;
                    $sdb =~ s#.+\/##;
                }
	} elsif (/Sequences producing significant alignments/) {
		$status = 'rank';
		$dmy = <>;
	} elsif ($status eq 'rank') {
		if (/^$/) {
			$status = 'hsp';
			$entname = '';
		} else {
			$enttit = substr($_, 0, 66);
			$enttit =~ s/^ *//;
			($entname, $title) = split(/[ \t]+/, $enttit);
			if ($sdb && $entname !~ /:/) {
				$entname = "$sdb:$entname";
			} elsif ($sdb && $entname =~ /gp:(.*)/) {
				$entname = "$sdb:$1";
			}
			$score_data = substr($_, 67);
			$score_data =~ s/^[ ]+//;
			($hiscore, $evalue, $n) = split(/[ ]+/, $score_data);
			$rank{$entname} =  join($Delim,$hiscore,$evalue,$n);
		}
	} elsif ($status eq 'hsp') {
		if (/^>[ ]*([^ ]+)/) {
			if ($qfrom) {
				&add_hspdata;
				print $hspdata;
				$hspdata = '';
			}
			$entname = $1;
			if ($sdb && $entname !~ /:/) {
				$entname = "$sdb:$entname";
			} elsif ($sdb && $entname =~ /gp:(.*)/) {
				$entname = "$sdb:$1";
			}
		} elsif (/^[ ]*Length = ([0-9]+)/) {
			$len = $1;
			$rank++;
			print "RANK $rank$Delim";
			print join($Delim,$query,$qlen,$entname,$len,$rank{$entname}), "\n";
			$hspnum = 0;
			$qfrom = $qto = $sfrom = $sto = '';

		} elsif (/^[ ]*Score[ ]*=[ ]*([0-9\.]+)[ ]*bits[ ]*\(([0-9\.]+)\),[ ]*Expect[ ]*=[ ]*([0-9\.\-e]+)/) {
			if ($qfrom) {
				&add_hspdata;
				$qfrom = $qto = $sfrom = $sto = '';
			}
			$score = $1;
			$bit = $2;
			$expect = $3;
			$pval = 0;  # blast2 ϡP-value ̵ʤä
			$hspnum++;
		} elsif (/^[ ]*Identities[ ]*=[ ]*([0-9]+)\/([0-9]+)[ ]*\(([0-9]+)\%\),[ ]*Positives[ ]*=[ ]*([0-9]+)\/([0-9]+)[ ]*\(([0-9]+)%\)/) {
			$ident = $1;
			$hsplen = $2;
			$percentident = $3;
			$positive = $4;
			$hsplen2 = $5;
			$percentpositive = $6;
			if (/Strand = ([A-Za-z]+) *\/ *([A-Za-z]+)/) {
				$str1 = $Dir{$1}; $str2 = $Dir{$2};
			}
		} elsif (/^Query:[ ]*([0-9]+)[ ]*[A-Za-z\-\*]+[ ]*([0-9]+)/) {
			$qfrom = $1 if (! $qfrom);
			$qto = $2;
		} elsif (/^Sbjct:[ ]*([0-9]+)[ ]*[A-Za-z\-\*]+[ ]*([0-9]+)/) {
			$sfrom = $1 if (! $sfrom);
			$sto = $2;
		} elsif (/^[ ]+Database:/) {
			&add_hspdata;
			print $hspdata;
			$hspdata = '';
			print "//\n";
		}
	}
}

sub  add_hspdata {
	$hspdata .= join($Delim,
		"HSP $hspnum", "$qfrom-$qto","$sfrom-$sto",
		$score, $bit, $expect, $pval,
		$ident,$hsplen,$percentident,
		$positive,$hsplen2,$percentpositive,$str1,$str2
	) . "\n";
}








