#!/usr/bin/perl -w

# separaFastaGenes.pl
# 
# Recebe como entrada um arquivo fasta contendo todos os genes de um contig.
# Separa os genes e cria, para cada um, 2 arquivos fasta:
# 	- sequencia em nucleotideos;
# 	- sequencia em aminoacidos.
# Joga para o banco de dados informacoes referentes a:
# 	- contig id;
#	- orf id;
#	- inicio relativo ao contig;
#	- fim relativo ao contig;
# 	- tamanho;
#	- frames.
# 
# Tambem recebe como parametro o contig id e o diretorio onde serao
# gravados os arquivos, nas subpastas n/ e p/


use Bio::Seq;
use Bio::SeqIO;

use DBI;
use DBD::mysql;

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 $genesFasta = shift;
my $contigId = sprintf("%04d", shift);
my $outDir = shift;

if (opendir(my $dh, $outDir)){
	close $dh;
}else{
	mkdir $outDir;
}

mkdir "$outDir/n";
mkdir "$outDir/p";

my $seqFASTA = Bio::SeqIO->new('-file'   => "<$genesFasta",
			       '-format' => 'FASTA');

my $i=1;
while (my $orf = $seqFASTA->next_seq()){
	my $orfId = $contigId.'.'.sprintf("%04d", $i);
	my $orfOutFasta = 'ORF'.$orfId.'.fas';

	my $orfOut_nt = Bio::SeqIO->new('-file'   => ">$outDir/n/$orfOutFasta",
			       		'-format' => 'FASTA');

	my $orfOut_aa = Bio::SeqIO->new('-file'   => ">$outDir/p/$orfOutFasta",
			       		'-format' => 'FASTA');

# 	print "ORF$orfId: length=",$orf->length,"<BR>";

	my $desc = $orf->desc;
	$orf->desc("");

	$orf->display_id("$orfId.n");
	$orfOut_nt->write_seq($orf);

	$orf->display_id("$orfId.p");
	$orfOut_aa->write_seq($orf->translate);

	my ($inicio, $fim, $tam) = ($desc =~ /(\d+)\s(\d+)\s\slen=(\d+)/);

	my $frame = calculaFrame($inicio, $fim);
	my ($bases_a, $bases_c, $bases_t, $bases_g) = calculaNumBases($orf->seq);

	insereBD($dbh, $nomeMontagem, $orfId, $contigId, $inicio, $fim, $tam, $frame, $bases_a, $bases_c, $bases_t, $bases_g);

	my $q = "INSERT INTO anotacao VALUES (
			\'$nomeMontagem\',
			\'$orfId\',
			0,
			\'\',
			\'\',
			\'\',
			\'\',
			\'COG0000\',
			0,
			\'\',
			\'\',
			\'\',
			\'\',
			\'\',
			\'\')";
	$dbh->do($q);

	my $codon = $orf->subseq(1,3);

	$q = "INSERT INTO startCodons VALUES(
			\'$nomeMontagem\',
			\'$orfId\',
			0,
			\'$codon\',
			$inicio,
			$inicio,
			0)
	";
	$dbh->do($q);

	$i++;
}

# $dbh->disconnect;

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

sub calculaFrame{
	my ($inicio, $fim) = @_;

	my $frame;
	my $f = $inicio % 3;

	if ($inicio < $fim){
		$frame = 'F';

		if ($f == 0){
			$f = 3;
		}
		$frame .= $f;
	}else{
		$frame = 'R';

		if ($f == 2){
			$f = 3;
		}elsif($f == 0){
			$f = 2;
		}
		$frame .= $f;
	}

	return $frame;
}

sub calculaNumBases{
	my ($seq) = @_;

	my %hash = ('A' => 0, 'C' => 1 , 'T' => 2, 'G' => 3);
	my @array = (0,0,0,0);
	my @nt = split(//, $seq);

	foreach my $base (@nt){
		my $b = uc($base);
		if ($b =~ /A/ || $b =~ /C/ || $b =~ /G/ || $b =~ /T/){
			$array[$hash{$b}]++;
		}
	}

	return @array;
}

sub insereBD{
	my ($dbh, $nomeMontagem, $orfId, $contigId, $inicio, $fim, $tam, $frame, $bases_a, $bases_c, $bases_t, $bases_g) = @_;

	my $q = "INSERT INTO orf VALUES (\'$nomeMontagem\', \'$orfId\', $contigId, $inicio, $fim, $tam, \'$frame\', $bases_a, $bases_c, $bases_t, $bases_g)";

	$dbh->do($q);
}
	