#!/usr/bin/perl -w

#Aquest codi correspon al del FindingSeCys.pl, creat per Mar Costa, Anna González, Clara Mayayo, Mirna Muntal i Isshak Mrabet. Si teniu qualsevol pregunta, no dubteu a enviar-nos un correu a mar.costa01@estudiant.upf.edu o clara.mayayo01@estudiant.upf.edu.

#El codi permet fer alineaments entre una seqüència determinada i l'homòloga que es troba en el genoma que s'està estudiant, que en aquest cas és el de Balaenoptera acutorostrata. Per a fer-ho amb qualsevol genoma, s'ha de modificar el path que ens porta al directory on hi és aquest

#El programa s'executa a través d'un bash, en el qual es realitzen tots els exports necessaris i crida directament aquest programa.

use strict;

my $id; #nom proteïna

my $header; #capçalera del fitxer de la proteïna

my $seq; #seqüència de la proteïna

my @vseq; #vector on s'emmagatzema la seqüència

my $l; #llargada de la seqüència (vector)

my $i = 0; #posicions del vector i comptador llargada

#Aïllament de la seqüència de la proteïna i canvi d'U a X: separa la capçalera i la seqüència del fitxer de la proteïna. Aquesta última l'emmagatzema en un vector que a l'analitzar les diferents posicions, substituirà per una X tant les Us com %, # i @.

while (<STDIN>){

    if (/>(\S+)/){

                $id = $1;

                print "La proteïna que s'està analitzant és $id\n";

    }

    if ($_=~/^>(.*)/){

                $header = $1;

                $seq = '';

    }

    else {

                @vseq = split(//,$_);

                $l = scalar(@vseq);

                for ($i = 0; $i < $l; $i++) {

                               if ($vseq[$i] eq "U"){

                                   $vseq[$i] = "X";

                               }

                               if ($vseq[$i] eq "%"){

                                   $vseq[$i] = "X";

                               }

                               if ($vseq[$i] eq "#"){

                                   $vseq[$i] = "X";

                               }

                               if ($vseq[$i] eq "@"){

                                   $vseq[$i] = "X";

                               }

                }

                $seq= join("",@vseq);

    }

}

 

print "Comprova que no hi hagi cap U a la seqüència: $seq\n";

#Emmagatzema la seqüència en un fitxer

my $seq_fitxer = 'seq_fitxer.fa';

open (FITXER, ">", $seq_fitxer) || die "No es pot crear el fitxer\n";

print FITXER "$seq";

close (FITXER);

my $proteina = 'proteina.fa';

open (PROT, ">", $proteina) || die "No es pot crear el fitxer\n";

print PROT ">$id\n";

print PROT "$seq";

close (PROT);

#Execució del BLAST: es posa el genoma en una variable per tal de poder treballar-hi més fàcilment. Es fa còrrer el programa BLAST simplificat en -m8 per tal d'obtenir els resultats en forma tabular. Agafarem els scaffolds amb un valor de Evalue més petit que 0.0001.

my $genome = "/cursos/BI/genomes/vertebrates/2014/Balaenoptera_acutorostrata/genome.fa";

my $query_file = $id;

my $blast = "";

print "Fent el BLAST...\n";

$blast = "blastall -p tblastn -i 'seq_fitxer.fa' -d '$genome' -o $id.blast -m8 -e 0.0001";

system ($blast);

print "BLAST finalitzat!!\n";

#Indexant genoma: només en el cas que aquest no hagi estat indexat anteriorment.

print "Indexant el genoma...\n";

if (-e "genome.index"){

    print "L'índex ja existeix\n";

}

else {

    system ("fastaindex '$genome' genome.index");

    print "Index creat!\n";

}

#Del document creat en el BLAST, s'extreuen els paràmetres d'interès: nom del scaffold, posició d'inici i posició final. S'analitzen tots els scaffolds possibles, però en el cas que aquest ja s'hagi estudiat anteriorment, no es tornarà a repetir.

my $scaffold = 1; #variable on s'emmagatzema el nom del scaffold

my $oldscaf = 0; #s'emmagatzema el scaffold analitzat prèviament

my @blast; #vector amb els resultats del blast

my $start_pos; #posició d'inici del hit

my $end_pos; #posició final del hit

my $c = 1; #comptador dels diferents scaffolds

my $entrada = "$id.blast";

open (SCAF, '<', $entrada);

while (<SCAF>){

    @blast = split("\t",$_);

    $scaffold = $blast[1];

    $start_pos = $blast[8];

    $end_pos = $blast[9];

    if ($oldscaf eq $scaffold){

                next;

    }

print "$scaffold\n";

#Fastafetch: s'agafa la regió corresponent al scaffold del genoma de l'espècie on s'ha trobat el hit.

print "Realitzant el fastafetch...\n";

system ("fastafetch '$genome' genome.index '$scaffold' > '$id.$c.scaffold.fa' ");

#Es modifiquen les posicions d'inici i final depenent de si el hit està en la cadena positiva o negativa. En cada extrem, s'allarga la regió d'interès 100.000 nucleòtids.

my $length;

my $start;

my $end;

if ($start_pos < $end_pos){

    $start = $start_pos - 100000;

    $end = $end_pos + 100000;

    $length = $end - $start;

}

else {

    $end = $start_pos + 100000;

    $start = $end_pos - 100000;

    $length = $end - $start;

}

print "$start_pos\n";

print "$end_pos\n";

print "$length\n";

#Fastasubseq: s'extreu la part d'interès del scaffold a partir del punt d'inici i la llargada prèviament establerts.

print "Fent fastasubseq..\n";

system ("fastasubseq '$id.$c.scaffold.fa' '$start' '$length' > '$id.$c.subseq.fa'");

#Exonerate: s'extreuen els exons de la seqüència anterior. S'utilitza el programa Exonerate en mode 'exhaustive', per tal d'obtenir millors prediccions.

print "Fent l'exonerate..\n";

system ("exonerate -m p2g --showtargetgff --exhaustive yes -q 'proteina.fa' -t '$id.$c.subseq.fa' > '$id.$c.exonerate.fa' ");

system ("cat '$id.$c.exonerate.fa' |  egrep -w exon > '$id.$c.exons.exonerate.gff' ");

system ("fastaseqfromGFF.pl '$id.$c.subseq.fa' '$id.$c.exons.exonerate.gff' > $id.$c.dna.fa");

#Fastatranslate: es tradueix la regió del DNA d'interès a aminoàcids, resultant en una predicció de la proteïna en l'espècie Balaenoptera acutorostrata.

print "Traduint...\n";

system ("fastatranslate -f '$id.$c.dna.fa' -F 1 > '$id.$c.predicted.fa'");

print "$id";

#Abans de realitzar el T_coffee es necessita canviar l'* del fitxer per una X, sinó el programa no ho podrà llegir. Per tal de fer això, s'emmagatzema la seqüència d'aminoàcids que s'ha predit en un vector, el qual s'analitzen totes les seves posicions i es substitueix per una X en el cas de trobar un *. Un cop fet el canvi, es redirecciona a un nou fitxer.

my $input = "$id.$c.predicted.fa";

my $output = "$id.$c.predicted2.fa";

my @vseq1;

my $t = 0;

my $d = 0;

my $seq1;

open (INPUT, '<', $input) or die 'ERROR: No es pot obrir!';

open (OUTPUT, '>', $output) or die 'ERROR: No es pot crear!';

while (<INPUT>){

                @vseq1 = split(//,$_);

                $t = scalar(@vseq1);

                for ($d = 0; $d < $t; $d++) {

                               if ($vseq1[$d] eq "*"){

                                   $vseq1[$d] = "X";

                               }

                }

                $seq1= join("",@vseq1);

                print OUTPUT $seq1;

}

close (INPUT);

close (OUTPUT);

#Tcoffee: compara la proteïna inicial amb la que s'ha predit.

system ("t_coffee 'proteina.fa' '$id.$c.predicted2.fa' > '$id.$c.tcoffee.fa'");

$oldscaf = $scaffold;

$c = $c + 1;

}

close (SCAF);

#Es crea una carpeta per cada proteïna on es copien tots els fitxers que s'han creat durant el seu anàlisi (es poden moure perquè totes tenen el mateix prefix: el nom de la proteïna).

system("mkdir -p ./$id");

system("mv '$id'* './$id'");

#Durant l'anàlisi es creen alguns fitxers intermediaris que s'han d'eliminar de cara al processament de la següent proteïna.

system ("rm seq_fitxer.fa");

system ("rm proteina*");