<?php
######################
## SEQUENCIA DE EVENTOS:
## baixar arquivo ".faa" do NCBI
## criar banco com o arq baixado do NCBI
## inserir informacoes na tabela "blastp_feitos"
## criar tabela no BD
## para cada orf **ja anotada**:
########## rodar blast contra o banco
########## inserir informacoes na tabela gerada
##########	newBlast.pl (passando o report gerado e o nome da tabela)
######################

require('../lib/genopar.lib.php');
ob_start();
if(!doAuth(LVLADM)) {
	$genopar->fechaPagina(); exit;
}

$genopar = new Genopar(__FILE__);

$genopar->abrePagina("Realizar novo BLAST");

echo "
<style type='text/css'>
#progress{
font-family:Arial, Helvetica, sans-serif;
font-size:17px;
font-weight:bold;
}
</style>

<SCRIPT type=text/javascript>
var title = document.title;
function atualizaProgress(p){
	document.getElementById(\"progress\").innerHTML = p + '%';
	if(p != 100)
		document.title = Math.floor(p) + '% - ' + title;
	else
		document.title = title;
}

function alerta(a){
	alert(a);
}

window.onload=atualizaProgress('0');

</SCRIPT>
";

echo "<div id=\"progress\"></div>";
echo "<script>atualizaProgress('0')</script>\n"; ob_flush(); flush();

if (!$_POST['newOrg'])
	$genopar->error("ERRO");

verGetPost(array('newOrg', 'nome', 'org'));

echo "Baixando arquivo FASTA referente ao organismo $newOrg do NCBI..."; ob_flush();flush();
$localFile = getFile($genopar, $newOrg, "faa");
if (!$localFile)
	$genopar->error("Nao foi possivel fazer o download do arquivo FASTA");
echo "[feito]<br>"; ob_flush(); flush();

echo "Formatando o Banco de Dados para o BLAST..."; ob_flush();flush();
$blastDB = formatDB($localFile);
echo "[feito]<br>"; ob_flush(); flush();

$genopar->abreBanco('annotV1');
criarTabela($genopar, $nome, $org);

$orfsDir = "fasta/ORFs/p";
$blastp_reports = "blast_report/blastp";
mkdir($blastp_reports."/$nome");
$outDir = "$blastp_reports/$nome";

blastall($nome, $orfsDir, $blastDB, $outDir, $genopar);
$genopar->fechaBanco();

ob_end_flush();

$genopar->fechaPagina();

###############################################
########	FUNCOES		###############
###############################################

# Conecta via FTP ao NCBI e baixa o arquivo "nome.ext"
function getFile($genopar, $nome, $ext){
	$ncbi = "ftp.ncbi.nih.gov";
	$USER = "anonymous";
	$PASS = "nada@lugar.algum";

	$con = ftp_connect($ncbi) or $genopar->error("NCBI indisponível.");
	ftp_login($con, $USER, $PASS);

	ftp_chdir($con, "genbank/genomes/Bacteria/$nome/") or $genopar->error("Nao foi possivel mudar de diretorio.");

	$pattern = "/.$ext$/";
	foreach(ftp_nlist($con, ".") as $file){
		if (preg_match($pattern, $file)){
			$rmtFile = $file;
			break;
		}
	}

	$file = "tmp/$file";
	$handle = fopen($file, "w");

	if (!ftp_fget($con, $handle, $rmtFile, FTP_ASCII, 0)){
		$file = NULL;
	}
	fclose($handle);
	ftp_close($con);

	return $file;
}

function formatDB($file){
	$dbName = substr($file, 0, -4);
	$formatDB = "formatdb -i $file -p T -n $dbName";
	system($formatDB);

	return $dbName;
}

function blastall($nome, $orfsDir, $blastDB, $outDir, $genopar){
	$tableName = "blastp_".$nome;

	$i=0;
	$orfs = array();
	if (is_dir($orfsDir)){
		$validORFs = getValid($genopar);
		$total = count($validORFs);

		echo "Rodando BLAST e inserindo informações no Banco...";
		foreach ($validORFs as $orf){
			$oldP = $p;
			$p = round((++$i/$total)*100, 2) ;

			$orfFile = "ORF$orf";

			$output = "$outDir/$orfFile.blast";
			$blastall = "blastall -p blastp -i $orfsDir/$orfFile -d $blastDB -o $output -a4 -b5 -v5";
//  usleep(90);
			if ($p > ($oldP)){
				echo "<script>atualizaProgress('$p')</script>\n";
				ob_flush();
				flush();
			}

			system("$blastall");
			system("bin/newBlastp.pl $output $tableName");

		}
		echo "[feito]<br>";
		ob_flush();
		flush();
	}
}

function invalid($orf, $genopar){
	$invalid = TRUE;

	$id = substr($orf, 3);

	$q = "SELECT validation FROM annot WHERE id='$id'";

	$r = $genopar->queryBanco($q);

	if ($r > 0){
		$lin = $genopar->getArray();
		if ($lin[0] < 0)
			return $invalid;
		return !$invalid;
	}
	return $invalid;
}

function getValid($genopar){
	$orfs = array();

	$q = "SELECT id FROM annot where validation>'0'";

	$r = $genopar->queryBanco($q);
	if ($r > 0){
		while ($lin = $genopar->getArray())
			$orfs[] = $lin['id'];

		return $orfs;
	}
	return NULL;
}

function criarTabela($genopar, $tableName = '', $org){
	if ($tableName == '')
		$genopar->error("Falta nome da tabela a ser criada.");

	## Insere $tableName na tabela de blastp_feitos
	$q = "INSERT INTO blastp_feitos VALUES ('', 'blastp_$tableName')";
	$genopar->queryBanco($q);

	$q = "INSERT INTO organismos VALUES ('$org', '$tableName')";
	$genopar->queryBanco($q);

	## Gera tabela $tableName
	$q = "CREATE TABLE  `annotV1`.`blastp_$tableName` (
		`orf_id` varchar(8) NOT NULL default '',
		`GI` varchar(15) default NULL,
		`GenBank` varchar(15) default NULL,
		`score` int(5) default NULL,
		`expect` double unsigned default NULL,
		`frame` varchar(15) default NULL,
		`description` varchar(255) default NULL,
		`alignq_start` int(11) default NULL,
		`alignq_end` int(11) default NULL,
		`aligns_start` int(11) default NULL,
		`aligns_end` int(11) default NULL
		) ENGINE=MyISAM DEFAULT CHARSET=latin1";
	$genopar->queryBanco($q);
}

?>