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

my ($idOrg) = ($database =~ /\/([0-9]+)$/);

our $TABLE_NAME = "blastp_orgs";

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


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

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];
}

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

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

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, $idOrg);

}else{

	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, $idOrg);
}

$dbh->disconnect;

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

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

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

	$dbh->do($q);
}
