#!/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/pfamseq';
my $outDir = shift;

my $updateInfo = shift;

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

our $TABLE_NAME = "blastp_PFAM";

my $b=5;
my $v=5;
my $e="1E-05";

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

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

my $blastall = "blastall -p blastp -i $orfFile -d $database -o $output -b$b -v$v -e$e -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 ($EC) = ($description =~ /EC=(.*)/);
		my $q = "
			UPDATE anotacao
			SET
				product=\'$description\',
				EC_number=\'$EC\'
			WHERE
				idMontagem='$nomeMontagem'	AND
				id='$orfId'			AND
				product=''
		";
	
		$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);
}
