#!/usr/bin/perl -w

# runOrfsBlast.pl
# 
# Recebe como entrada o arquivo fasta da ORF e o banco de dados para o BLAST.
# Grava o resultado do BLAST chamamo ORFxxx.yyyy.blast, retirado do nome do arquivo fasta.
# Salva o resultado na pasta passada como parametro.
#
# Faz o parse e joga as informacoes para o Banco de Dados

use DBI;
use DBD::mysql;
use Bio::SearchIO;

use strict;

our $DB_HOST;
our $DB_USER;
our $DB_PASS;
require '../lib/config.pl';

my $DB_NAME = shift;
my $nomeMontagem = shift;

my $dbh = DBI->connect("DBI:mysql:$DB_NAME:$DB_HOST",$DB_USER,$DB_PASS,{RaiseError => 1});

my $orfFile = shift;
my $database = '../BlastDatabases/COG';
my $outDir = shift;

my $updateInfo = shift;

if (!$updateInfo){ $updateInfo = 1; }

our $TABLE_NAME = "blastp_COG";

my $b=5;
my $v=5;

my $sql = "SELECT evalue FROM orgsToBlast o WHERE o.idMontagem='$nomeMontagem' AND o.idOrg = 'COG'";

my $sth = $dbh->prepare($sql) or die "Cannot prepare: " . $dbh->errstr();
$sth->execute() or die "Cannot execute: " . $sth->errstr();

my $e;
while(my @row = $sth->fetchrow_array()) {
	$e = $row[0];
}

unless (-d $outDir."/COG"){
	mkdir $outDir."/COG";
}

my ($orfId) = ($orfFile =~ /(ORF\d{4}\.\d{4})/);
my $output = "$outDir/COG/$orfId.blast";

my $blastall = "blastall -p blastp -i $orfFile -d $database -o $output -b$b -v$v -e$e -F \"m S\" -a4";

system($blastall);

my $in = new Bio::SearchIO(-format => 'blast', 
                           -file   => $output);

my $result = $in->next_result;
my $hit = $result->next_hit;
if ($hit){
	my $hsp = $hit->next_hsp;
	my $subject = $hit->name;
	my $description = $hit->description;
	my $score = $hit->score;
	my $hitStart = $hsp->start('hit');
	my $hitEnd = $hsp->end('hit');
	my $queryStart =  $hsp->start('query');
	my $queryEnd =  $hsp->end('query');

	insereBD($dbh, $nomeMontagem, $orfId, $subject, $description, $score, $hitStart, $hitEnd, $queryStart, $queryEnd);

	if ($updateInfo){
		($orfId) = ($orfId =~ /(\d+\.\d+)/);
		my ($COGid) = ($description =~ /(COG\d{4})/);
		my ($code, $descr) = ($description =~ /\[(.*)\]\sCOG\d{4}\s(.*)/);
	
		my $function = $code." - ".$descr;
	
		my $q = "
			UPDATE anotacao
			SET
				COGid = '$COGid',
				function = '$function'
			WHERE
				idMontagem='$nomeMontagem'	AND
				id='$orfId'			AND
				COGid = 'COG0000'		AND
				function=''
		";
	
		$dbh->do($q);
	}

}else{
# 	my $hsp = $hit->next_hsp;
	my $subject = '';
	my $description = '';
	my $score = 0;
	my $hitStart = 0;
	my $hitEnd = 0;
	my $queryStart =  0;
	my $queryEnd =  0;

	insereBD($dbh, $nomeMontagem, $orfId, $subject, $description, $score, $hitStart, $hitEnd, $queryStart, $queryEnd);
}

# $dbh->disconnect;

#################################################

sub insereBD{
	my ($dbh, $nomeMontagem, $orfId, $subject, $description, $score, $hitStart, $hitEnd, $queryStart, $queryEnd) = @_;

	my ($id) = ($orfId =~ /ORF(.*)/);
	my $q = "INSERT INTO $TABLE_NAME VALUES (\'$nomeMontagem\', \'$id\', \'$subject\', \'$description\', $score, $hitStart, $hitEnd, $queryStart, $queryEnd)";

	$dbh->do($q);
}
