
Automatització
Per tal d'automatitzar els programes que havíem de fer servir, hem creat uns sèrie de programes en llenguatge bash i en llenguatge perl per tal de facilitar el processament d'un gran volum de dades. Concretament hem creat 5 programes bash i 3 programes perl:
Per tal que algun usuari desitgi fer-los servir hem escrit un tutorial bàsic per a fer-lo servir:
En primer lloc, hem de crear una carpeta al directori dels programes anomenada Llibreria, a on s'han de colocar cada seqüència que s'utilitzarà com a query en un arxiu diferent en format fasta (ex: creatina.fa). Cal col·locar els genomes que volem fer servir en un directori tots junts de la següent manera. S'ha de posar dins d'una carpeta amb el nom de l'organisme el genoma formatejat(link) i indexat(link) de manera que el nom de la base de dades sigui "genoma.fa". Si la direcció no és la mateixa que hem fet servir nosaltres, s'ha de modificar el programa i escriure-la on es defineix la variable "adresa". També cal tenir instal·lats els programes blast, exonerate, genewise i t_coffee.
1. run1_blast.bash: Aquest programa t'executarà un blast de cada proteïna amb cada genoma que estiguin en les carpetes de Llibreria i en la ubicació de genomes.
Requereix:
Codi:
#!/bin/bash
# Programa fet pel grup By de 4t de biologia del curs 2010-2011 de la Pompeu Fabra
# Contacte: marcel.costa01@estudiant.upf.edu
### Aqui definim quina és la ruta pels genomes
adresa="/cursos/BI/genomes/protists/2011"
### Això és per a detectar quines proteines hi ha a la carpeta Llibreria
for proteines_fa in ./Llibreria/*; do {
basename_fa=`basename $proteines_fa`
proteina=${basename_fa%.fa}
proteines=$proteines" $proteina"
} done
### Aquí comença el programa pròpiament dit: dos bucles for per a fer les combinaciones entre proteïnes i genomes
rm resultats_blast.txt 2> error.temp
for protein in $proteines ; do {
for genomes in P.tricornutum B.hominis H.arabidopsidis P.ultimum S.parasitica E.siliculosus C.muris C.parvum A.taiwanensis C.owczarzaki P.pallidum C.merolae T.trahens N.gruberi; do {
patroalfa=`cat ./Llibreria/$protein.fa | egrep ^">"`
patrobeta=${patroalfa#*>}
echo $patrobeta > temppatro
patro=`cut -f 1 -d " " temppatro`
rm temppatro
blastall -p tblastn -i ./Llibreria/$protein.fa -d /cursos/BI/genomes/protists/2011/$genomes/genome.fa -o output_blast/$protein.$genomes.txt -m 9
echo ">${protein}_$genomes:" >> resultats_blast.txt
egrep $patro output_blast/$protein.$genomes.txt | egrep e- >> resultats_blast.txt
x=`egrep $patro ./output_blast/$protein.$genomes.txt | egrep e-`
if [ "$x" != "" ]; then
egrep $patro output_blast/$protein.$genomes.txt | egrep e- > arxiu.temp
mkdir ./blast_selec/$protein 2> error.temp
mkdir ./blast_selec/$protein/$genomes 2> error.temp
./dosificador.pl $protein $genomes < arxiu.temp
fi
echo ${protein}_$genomes fet
} done
} done
rm ./*.temp
Codi "dosificador.pl":
#!/usr/bin/perl # Programa fet pel grup By de 4t de biologia del curs 2010-2011 de la Pompeu Fabra # Contacte: marcel.costa01@estudiant.upf.edu use strict; my $contador=0; while () { open (fitxersortida, ">./blast_selec/$ARGV[0]/$ARGV[1]/hit$contador.txt"); print fitxersortida $_; close fitxersortida; $contador++; }
2. blast_extend.bash (opcional): Aquest programa t'executarà un blast de cada proteïna amb cada genoma que estiguin en les carpetes de Llibreria i en la ubicació de genomes i et mostrarà el resultat de manera extensa (inclou els alineaments).
Requereix:
Codi:
#!/bin/bash
# Programa fet pel grup By de 4t de biologia del curs 2010-2011 de la Pompeu Fabra
# Contacte: marcel.costa01@estudiant.upf.edu
### Aqui definim quina és la ruta pels genomes
adresa="/cursos/BI/genomes/protists/2011"
### Això és per a detectar quines proteines hi ha a la carpeta Llibreria
for proteines_fa in ./Llibreria/*; do {
basename_fa=`basename $proteines_fa`
proteina=${basename_fa%.fa}
proteines=$proteines" $proteina"
} done
### Aquí comença el programa pròpiament dit: dos bucles for per a fer les combinaciones entre proteïnes i genomes
for protein in $proteines ; do {
for genomes in P.tricornutum H.arabidopsidis P.ultimum S.parasitica E.siliculosus C.muris C.parvum A.taiwanensis C.owczarzaki P.pallidum C.merolae T.trahens N.gruberi; do {
blastall -p tblastn -i ./Llibreria/$protein.fa -d /cursos/BI/genomes/protists/2011/$genomes/genome.fa -o output_blast_extend/$protein.$genomes.txt
echo ${protein}_$genomes fet
} done
} done
3. run2_exonerate.bash: Aquest programa executarà l'exonerate per als hits obtinguts amb el programa "run1_blast.bash".
Requereix:
Per saber quins exonerates han estat capaços de predir gens es crea un arxiu anomenat "resultats_exonerate.txt" on només es mostren els exonerates que han predit gens.
Codi:
#!/bin/bash
rm resultats_exonerate.txt 2> error.temp
# Programa fet pel grup By de 4t de biologia del curs 2010-2011 de la Pompeu Fabra
# Contacte: marcel.costa01@estudiant.upf.edu
adresa="/cursos/BI/genomes/protists/2011"
### Això és per poder triar si volem exonerate exhaustiu o no
if [ "$1" = "-exhaustive" ]; then
exhaustive="--exhaustive yes"
fi
for proteins in blast_selec/* ; do {
for genome in $proteins/* ; do {
for hit in $genome/*; do {
### Assignem a les variables els noms sense rutes ni extensions (sense "/exemple/" ni ".etc")
proteins=`basename $proteins`
genome=`basename $genome`
hit=`basename $hit`
hit=${hit%.txt}
echo ${proteins}_${genome}_${hit}:
### Això és per a detectar l'identificador que apareix al fitxer fasta a la primera línea
patroalfa=`cat ./blast_selec/$proteins/$genome/$hit.txt | egrep ^">"`
patrobeta=${patroalfa#*>}
echo $patrobeta > temppatro
patro=`cut -f 1 -d " " temppatro`
rm temppatro
### Per emagatzemar la regió on apareix el hit
regio=`cat $patro ./blast_selec/$proteins/$genome/$hit.txt | cut -f 2`
fastafetch $adresa/$genome/genome.fa ./genomes/$genome/genome.index $regio > ./regions/$regio.fa
### Aquí definim l'inici i el final del hit en la regió
inici=`cat $patro ./blast_selec/$proteins/$genome/$hit.txt | cut -f 9`
final=`cat $patro ./blast_selec/$proteins/$genome/$hit.txt | cut -f 10`
if [ "$inici" -gt "$final" ]; then
inici="$final"
fi
start=$(( $inici - 20000 ))
length="50000"
### FASTASUBSEQ : Retalla una regió al voltant del gen que volem fer servir
fastasubseq ./regions/$regio.fa $start $length > ./subseq/${proteins}_${genome}_${hit}_genomic.fa 2> error_msg.temp
### Això ens servirà per modificar variables en cas que no hi hagi prou bases en la regio o que l'inici estigui massa aprop
error=`cat error_msg.temp`
if [ "$error" != "" ]; then
error_llarg=`cat error_msg.temp | egrep "before end"`
error_curt=`cat error_msg.temp | egrep "Unknown flag"`
### Si es passa de llarg, establim la llargada perquè arribi al final
if [ "$error_llarg" != "" ]; then
llargada=$error_llarg
llargada=${llargada##*(}
llargada=${llargada%)}
length=$(( $llargada - $start))
fastasubseq ./regions/$regio.fa $start $length > ./subseq/${proteins}_${genome}_${hit}_genomic.fa
fi
### Si l'inici està massa aprop establim l'start en 0
if [ "$error_curt" != "" ]; then
start="0"
fastasubseq ./regions/$regio.fa $start $length > ./subseq/${proteins}_${genome}_${hit}_genomic.fa 2> error_msg_2.temp
error_2=`cat error_msg_2.temp`
if [ "$error_2" != "" ]; then
error_2_llarg=`cat error_msg_2.temp | egrep "before end"`
if [ "$error_2_llarg" != "" ]; then
llargada=$error_2_llarg
llargada=${llargada##*(}
llargada=${llargada%)}
length=$(( $llargada - $start))
fastasubseq ./regions/$regio.fa $start $length > ./subseq/${proteins}_${genome}_${hit}_genomic.fa 2> error_msg_3.temp
fi
fi
fi
fi
### EXONERATE : Predicció de gens
echo " Iniciant exonerate:"
exonerate -m p2g --showtargetgff -q ./Llibreria/$proteins.fa -t ./subseq/${proteins}_${genome}_${hit}_genomic.fa $exhaustive > ./exonerate_output/exonerate_${proteins}_${genome}_${hit}.gff 2> error_de_substitucio.temp
### Per si al fasta de sequencia hi ha Us, cal substituir-les per X, però només un cop!
error_substitucio=`cat error_de_substitucio.temp | egrep "Unknown amino acid"`
if [ "$error_substitucio" = "** FATAL ERROR **: Unknown amino acid [U]" ]; then
if [ "$int_UX" = "0" ]; then
./substitucio.pl < ./Llibreria/$proteins.fa > ${protein}_temporal.txt
int_UX="1"
fi
exonerate -m p2g --showtargetgff -q ${proteins}_temporal.txt -t ./subseq/${proteins}_${genome}_${hit}_genomic.fa $exhaustive > ./exonerate_output/exonerate_${proteins}_${genome}_${hit}.gff 2> error_de_substitucio2.temp
fi
gene=`grep gene ./exonerate_output/exonerate_${proteins}_${genome}_${hit}.gff`
if [ "$gene" != "" ]; then
echo ${proteins}_${genome}_${hit} : >> resultats_exonerate.txt
fi
echo " Exonerate acabat"
### Per extreure el cDNA i traduir-lo a proteïnes
echo " Preparant i executant per a t_coffee:"
exon=`grep -w exon ./exonerate_output/exonerate_${proteins}_${genome}_${hit}.gff`
grep -w exon ./exonerate_output/exonerate_${proteins}_${genome}_${hit}.gff > exon.temp
if [ "$exon" != "" ]; then
fastaseqfromGFF.pl ./subseq/${proteins}_${genome}_${hit}_genomic.fa exon.temp > ./cDNA/cDNA_${proteins}_${genome}_${hit}.fa
fastatranslate ./cDNA/cDNA_${proteins}_${genome}_${hit}.fa > ./translations/aa_${proteins}_${genome}_${hit}.fa
fi
echo ${proteins}_${genome}_${hit} fet
} done
} done
} done
rm *.temp
Codi "substitucio.pl":
#!/usr/bin/perl # Programa fet pel grup By de 4t de biologia del curs 2010-2011 de la Pompeu Fabra # Contacte: marcel.costa01@estudiant.upf.edu use strict; my @v; my $string; my $counter = 0; while () { if ($counter == 0) { print $_; } if ($counter > 0) { @v=split(//,$_); while (<@v>) { if ($_ eq "U") { $string.= "X"; } else { $string.=$_; } } } $counter++; $string.="\n"; } print $string;
4. run3_genewise.bash: Aquest programa executarà el genewise per als hits obtinguts amb el programa "run1_blast.bash".
Requereix:
Codi:
#!/bin/bash
# Programa fet pel grup By de 4t de biologia del curs 2010-2011 de la Pompeu Fabra
# Contacte: marcel.costa01@estudiant.upf.edu
for proteins in blast_selec/* ; do {
for genome in $proteins/* ; do {
for hit in $genome/*; do {
proteins=`basename $proteins`
genome=`basename $genome`
hit=`basename $hit`
hit=${hit%.txt}
genewise -pep -pretty -cdna -gff -both Llibreria/$proteins.fa ./subseq/${proteins}_${genome}_${hit}_genomic.fa > genewise/genewise_${proteins}_${genome}_${hit}.txt
./getpepgene.pl < genewise/genewise_${proteins}_${genome}_${hit}.txt > genewise/PEP_g_${proteins}_${genome}_${hit}.fa
echo ${proteins}_${genome}_${hit} fet
} done
} done
} done
Codi "getpepgene.pl":
#!/usr/bin/perl -w # Programa fet pel grup By de 4t de biologia del curs 2010-2011 de la Pompeu Fabra # Contacte: marcel.costa01@estudiant.upf.edu use strict; my $interruptor=0; my $contador=0; my @v; my $cont1=0; my $cont2=0; my $string1; my $string2; my $int2=0; while () { if ($_ =~ /\//) { if ($interruptor == 1) { $int2=1; } $interruptor = 0; } while ($interruptor == 1 && $contador == 0) { if ($int2 == 0 ) { $string1.= $_; @v=split(//,$_); $cont1+=scalar(@v); } if ($int2 == 1 ) { $string2.= $_; @v=split(//,$_); $cont2+=scalar(@v); } $contador=1; } if ($_ =~ /.pep/) { $interruptor=1; if ($int2 == 0 ) { $string1.=$_; } if ($int2 == 1 ) { $string2.=$_; } } $contador=0 } if ($cont1 > $cont2) { print $string1; } else { print $string2; }
5. run4_t_coffee.bash: Aquest programa executarà un alineament amb T-Coffee amb els resultats de l'exonerate i el genewise amb la seva respectiva query.
Requereix:
Codi:
#!/bin/bash
# Programa fet pel grup By de 4t de biologia del curs 2010-2011 de la Pompeu Fabra
# Contacte: marcel.costa01@estudiant.upf.edu
for file in exonerate_output/PEP_e_* ; do {
name=`basename $file`
name=${name%.fa}
name=${name#PEP_e_}
protein=${name%%_*}
echo $name
echo $protein
t_coffee Llibreria/$protein.fa $file > ./t_coffee_e/t_coffee_e_$name.txt 2> error.temp
mv $protein.aln ./t_coffee_e/t_coffee_e_$name.aln
mv $protein.html ./t_coffee_e/t_coffee_e_$name.html
echo $file done
} done
for file in genewise/PEP_g_* ; do {
name=`basename $file`
name=${name%.fa}
name=${name#PEP_g_}
protein=${name%%_*}
echo $name
echo $protein
t_coffee Llibreria/$protein.fa $file > ./t_coffee_g/t_coffee_g_$name.txt 2> error.temp
mv $protein.aln ./t_coffee_g/t_coffee_g_$name.aln
mv $protein.html ./t_coffee_g/t_coffee_g_$name.html
echo $file done
} done
rm *.temp
