Materials i mètodes
A continuació tenim una explicació detallada del procediment que hem seguit per estudiar la presència de selenoproteïnes en genomes de protistes seqüenciats recentment. El format dels paths de les comandes que trobareu al llarg de la pàgina, està expressat de la mateixa manera que en el script d'automització que podeu trobar a l'apartat corresponent. La pipeline que hem utilitzat és semblant a la de Selenoprofiles.[9][10][11][12][13][14]
1. Obtenció de les queries
Hem estudiat la presència de la seqüència proteica de les selenoproteïnes GPx i FrnE en diferents organismes protistes.
Per obtenir la seqüència proteica de GPx hem utilitzat la base de dades SelenoDB. Hem obtingut la seqüència d'aquesta proteïna d'H. sapiens perquè aquest és l'organisme on s'han descrit més selenoproteïnes de la família Glutathione Peroxidase (GP), tot i que el criteri teòric generlament emprat per comparar seqüències és usar un organisme que sigui filogenèticament proper.
La seqüència de la proteïna FrnE ens l'han proporcionat els professors, i correspon a Ciona intestinalis, un urocordat.
2. Obtenció de genomes de protistes
Els genomes a investigar, seqüenciats recentment, van ser facilitats pels professors de l'assignatura de bioinformàtica i pertanyen a les següents espècies: A. albachii, A. rara, C. fasciculata, D. discoideum, D. fasciculatum, F. cylindrus, G. niphandrodes, I. multifiliis, L. donovani, L. tarentolae, P. capsici, P. polycephalum, S. artica, T. congolense.
3. Cerca de similaritat: BLAST i tBLASTn
El BLAST (Basic Local Aligment Search Tool) és un programa que utilitza un algorisme heurístic per tal d'obtenir alineaments locals de seqüències. Hi ha diferents tipus de BLAST, nosaltres hem utilitzat tBLASTn, que permet comparar seqüències proteiques (query) contra bases de dades nucleotídiques. Per fer-ho, el programa tradueix les seqüències nucleotídiques a seqüències proteiques en els sis possibles marcs de lectura (tres forward i tres reverse) i els alinea amb la nostra query. [10] La comanda que hem utilitzar per realitzar el BLAST és:
on,
-p: indica el tipus de BLAST que estem utilitzat (en el nostre cas tblastn).
-i: indica quina query estem utilitzant.
-d: indica contra quin genoma o base de dades de genomes comparem la nostra query.
-o: indica l'output.
-F F: serveix per eliminar les regions de baixa complexitat i permet augmentar la qualitat de l'alineament.
-m 9: que permet visualitzar la informació d'una forma alternativa.
4. Anàlisi del BLAST
Hem acceptat com a vàlids hits amb un e-value menor a 0.0001, que indica el nombre de hits igual o més bons que l'obtingut que esperariem trobar per atzar a la nostra base de dades.
5. Extracció de la regió genòmica del hit a estudiar: fastasubseq
Per poder extreure la regió genòmica primer hem d'indexar el fitxer fasta de la base de dades (genoma del protista):
Seguidament obtenim una seqüència del fitxer fasta indexat, on es troba la regió que conté el hit, mitjançant la comanda fastafetch:
Finalment podem realitzar el fastasubseq que consisteix en l'obtenció d'una subseqüència de la regió que acabem d'extreure.
Per defecte, start és l'inici del hit 20kb abans, i la longitud de la seqüència extreta és de 50kb.
6. Predicció de gens: Exonerate i Genewise
Per predir l'estructura genòmica de les seqüències d'interès obtingudes hem utilitzat exonerate i genewise. Ambdos programes serveixen per obtenir la mateixa informació, però utilitzen algorismes diferents, per tant, pot ser útil comparar els resultats obtinguts mitjançant algorismes diferents, ja que en algun cas un programa podria ometre un hit.
6.1. Exonerate
-m: especifica el model d'alineament (en aquest cas p2g “protein to gene”).
--showtargetgff: indica que els resultats incloguin el format gff.
-q: especifica la query que estem usant.
-t: especifica el target contra el que comparem la nostra query.
Aleshores extraiem la seqüència a partir de les coordenades que ens dóna el fitxer en format gff amb la comanda següent:
Seguidament traduïm la seqüència obtinguda:
Com que el resultat de l'exonerate ens dóna la seqüència codificant, hem utilitzat el primer marc de lectura (després d'haver parlat amb els tutors).
6.2. GeneWise
-pep: mostra la seqüència traduïda
-both: mostra ambdós sentits de traducció (forward i reverse).
-pretty: és una opció de visualització estètica
-gff: que inclogui el format gff
-cdna: que inclogui la seqüència de cDNA.
Com que del Genewise obtenim dues seqüències, hem utilitzat un programa (anomenat llarg.pl) que ens selecciona la seqüència més llarga.
Utilitzarem l'anotació de exonerate perquè, en general, s'obtenen scores més elevats. No obstant, també s'ha utilitzat el GeneWise per tots els genomes, per si en algun dels casos exonerate no donava bons resultats. Per tant, en algun dels casos haurem fet servir el GeneWise i el T-Coffee haurà estat basat en aquest. També és important tenir en compte que el T-Coffee no diferencia els gap dels codons stop, de manera que quan la selenocisteïna de la query estigui alineada amb un gap, el més probable és que es tracti d'una selenocisteïna en el genoma del protista.
7. T-Coffee
El programa T-Coffee permet realitzar alineaments globals entre seqüències similars, en aquest cas s'alinea la query i la seqüència predita.
8. Cerca de SECIS
Hem utilitzat SECIS Search que és un programa que permet predir els elements SECIS en la regió 3' UTR.9. Automatització
blast_exonerate_genewise_tcoffee_secissearch.sh
És un script que automàticament executa tots els passos mencionats a l'enunciat (blast, exonerate, genewise, tcoffe i secisserach.sh). Aquest programa realitza un blast de totes les seqüències fasta /query_proteins/ contra tots els genomes. Aleshores, el script automàticament produeix una estructura de carpetes i guarda tots els resultats intermedis (de cada pas), de manera que cada annotació es pot reconstruir manualment.
El programa realitza un tblastn de totes les queries contra tots genomes en el mode normal així com amb l'opció m9. L'opció m9 s'utilitza per extreure hits significatius (e-value menor a 0,0001), és a dir, el programa guarda cada fila del ouput de m9 que conté un hit significatiu com un arxiu de text propi per al seu processament posterior. Després de indexar el genoma amb fastaindex, els “arxius hit” s'utilitzen per extreure una subregió de 50kb al voltant de la regió on es troba aquest hit mitjançant el fastasubseq. En el cas que el hit es trobi massa a prop de l'inici o del final del contig i per això, no es puguin extreure 50kb, el script automàticament reajusta les coordenades per ser capaç d'extreure una subregió.
Amb la subregió extreta es duen a terme exonerate, genewise i secissearch. Els outputs de genewise apareixen en mode “pretty” i “fasta”. El fitxer sortida de fasta es tradueix en sentit forward i reverse. L'annotació més llarga es selecciona mitjançant el script de perl llarg.pl. Els fitxers de sortida de exonerate venen amb un “gff-dump” inclòs. El fastaseqfromGFF s'executa en aquest arxiu per extreure una seqüència fasta de les coordenaes gff i es tradueixen mitjançant fastatranslate. Aquestes anotacions (exonerate i genewise) després són sotmeses a un alineament global mitjançant T-Coffee.
Els scripts uni.pl, llarg.pl i substitucio.pl els hem obtingut de les pàgines web dels grups de l'any passat. (link)
#!/bin/bash
#
# script to automaticaly blast different querys against diferent database
# script adaptet/modified from original found at http://bioinformatica.upf.edu/2011/projectes11/Bx/web/materialsimetodes.html
#
# The directory "query_protein" must exist and contain the query proteins in fasta-format
# The perl-scripts uni.pl llarg.pl substitucion.pl must be present
mkdir output_blast
mkdir output_blast_detailed
mkdir genomes
mkdir regions
mkdir subseq
mkdir exonerate_output
mkdir cDNA
mkdir translations
mkdir t_coffee_output_exonerate
mkdir t_coffee_output_genewise
mkdir output_genewise
mkdir output_genewise/pretty
mkdir output_genewise/fasta
mkdir output_genewise/fasta/whole
mkdir output_genewise/fasta/longer/
mkdir output_secissearch
#specify genome paths
genome_path="/cursos/BI/genomes/protists/2012"
#read in proteins, cut away pathname
for proteins_fa in ./query_proteins/*; do {
basename_fa=`basename $proteins_fa`
protein=${basename_fa%.fa}
proteins=$proteins" $protein"
} done
#Two loops to combine genomes and proteins, extract query header
rm results_blast.txt 2>> error.txt
for protein in $proteins ; do {
for genomes in A.laibachii_Nc14 A.rara C.fasciculata D.discoideum_AX4 D.fasciculatum F.cylindrus G.niphandrodes I.multifiliis_strain_G5 L.donovani_BPK282A1 L.tarentolae P.capsici P.polycephalum S.arctica T.congolense ; do {
echo $genomes
pattern=`cat ./query_proteins/$protein.fa | egrep ^">"`
pattern=${pattern#*>}
echo $pattern > temppattern
pattern=`cut -f 1 -d " " temppattern`
rm temppattern
echo fasta-header is $pattern
#blasts standard and -m9 option
blastall -p tblastn -i ./query_proteins/$protein.fa -d $genome_path/$genomes/genome.fa -o ./output_blast/$protein.$genomes.txt -m 9 -F F
blastall -p tblastn -i ./query_proteins/$protein.fa -d $genome_path/$genomes/genome.fa -o ./output_blast_detailed/$protein.$genomes.txt -F F
#Directory and hit-file structure, extract target header to
echo ${protein}_$genomes: >> results_blast.txt
egrep "$pattern" output_blast/$protein.$genomes.txt | egrep e- >> results_blast.txt
egrep "$pattern" output_blast/$protein.$genomes.txt | egrep e- > temp
x=`egrep "$pattern" output_blast/$protein.$genomes.txt | egrep e-`
if [ "$x" != "" ]; then
mkdir hits 2>> error.txt
mkdir hits/$protein 2>> error.txt
mkdir hits/$protein/$genomes 2>> error.txt
egrep -v '^#' temp > temp_stripped
./uni.pl $protein $genomes > temp_stripped
fi
echo ${protein}_$genomes ready
} done
} done
echo "###BLAST READY" >> error.txt
echo "#################"
echo "###BLAST READY###"
echo "#################"
#automaticaly anotate various blast -m9 hits with exonerate
# Genome indexing with fastaindex
for genome in /cursos/BI/genomes/protists/2012/* ; do {
stripped=`basename $genome`
mkdir ./genomes/$stripped
echo $genome
fastaindex $genome_path/$stripped/genome.fa genomes/$stripped/$stripped.index
} done
# select if exonerate should run in exhaustive mode
if [ "$1" = "-exhaustive" ]; then
exhaustive="--exhaustive yes"
fi
for proteins in hits/* ; do {
for genome in $proteins/* ; do {
for hit in $genome/*; do {
#chop of pathname-part from filenames
proteins=`basename $proteins`
genome=`basename $genome`
hit=`basename $hit`
hit=${hit%.txt}
echo ${proteins}_${genome}_${hit}
# detection of fasta-header to extract multifasta fragment from -m9 blast
header_pattern=`cat ./hits/$proteins/$genome/$hit.txt | egrep ^">"`
header_pattern=${header_pattern#*>}
echo $header_pattern > tempheader
header_pattern=`cut -f 1 -d " " tempheader`
rm tempheader 2>> error.txt
# extract header and perform fastafetch
region=`cat $header_pattern ./hits/$proteins/$genome/$hit.txt | cut -f 2`
fastafetch $genome_path/$genome/genome.fa ./genomes/$genome/$genome.index $region > ./regions/$region.fa
# extract beginning and end of hit from -m9 blast
beg=`cat $header_pattern ./hits/$proteins/$genome/$hit.txt | cut -f 9`
ending=`cat $header_pattern ./hits/$proteins/$genome/$hit.txt | cut -f 10`
if [ "$beg" -gt "$ending" ]; then
beg="$ending"
fi
start=$(( $beg - 20000 ))
length="50000"
# perform fastasubseq on fetched fragment, various conditions
fastasubseq ./regions/$region.fa $start $length > ./subseq/${proteins}_${genome}_${hit}_genomic.fa 2> error_msg.temp
# variable scenarios in case sequence is not long enough/too short...
error=`cat error_msg.temp`
if [ "$error" != "" ]; then
error_long=`cat error_msg.temp | egrep "before end"`
error_short=`cat error_msg.temp | egrep "Unknown flag"`
# if ending is too near chop of lenght to max lenght
if [ "$error_long" != "" ]; then
long=$error_long
long=${long##*(}
long=${long%)}
length=$(( $long - $start))
fastasubseq ./regions/$region.fa $start $length > ./subseq/${proteins}_${genome}_${hit}_genomic.fa
fi
# If beginning is too near set start to 0
if [ "$error_short" != "" ]; then
start="0"
fastasubseq ./regions/$region.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_long=`cat error_msg_2.temp | egrep "before end"`
if [ "$error_2_long" != "" ]; then
long=$error_2_long
long=${long##*(}
long=${long%)}
long=$(( $long - $start))
fastasubseq ./regions/$region.fa $start $length > ./subseq/${proteins}_${genome}_${hit}_genomic.fa 2> error_msg_3.temp
fi
fi
fi
fi
#
# perform genprediciton with exonerate
#
echo "performing: exonerate"
exonerate -m p2g --showtargetgff -q ./query_proteins/$proteins.fa -t ./subseq/${proteins}_${genome}_${hit}_genomic.fa $exhaustive > ./exonerate_output/exonerate_${proteins}_${genome}_${hit}.gff 2> error_de_substitucio.temp
# run perl program "substitucion.pl" in case there are selenocysteins marked as U in the sequence
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
./substitucion.pl < ./query_proteins/$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} : >> results_exonerate.txt
fi
echo "performing: GFF-extraction and translation"
# extract and translate cDNA from predictet gene-structure with fastaseqfromGFF.pl and fastatranslate in frame 1
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 --frame 1 ./cDNA/cDNA_${proteins}_${genome}_${hit}.fa > ./translations/aa_${proteins}_${genome}_${hit}.fa
fi
echo exonerate ${proteins}_${genome}_${hit} ready
# for each subseq of a hit, realize genewise annotations in "pretty" and fasta mode (check options)
echo "*** performing : genewise "
genewise -pep -both query_proteins/$proteins.fa subseq/${proteins}_${genome}_${hit}_genomic.fa > output_genewise/fasta/whole/genewise_fasta_${proteins}_${genome}_${hit}
genewise -pep -both -pretty -gff -cdna query_proteins/$proteins.fa subseq/${proteins}_${genome}_${hit}_genomic.fa > output_genewise/pretty/genewise_pretty_${proteins}_${genome}_${hit}
} done
} done
} done
rm *.temp
echo "##################################"
echo "###EXONERATE AND GENEWISE READY###"
echo "##################################"
#select longer genewise annotation
for genewise_out in ./output_genewise/fasta/whole/* ; do {
temp_strp=`basename $genewise_out`
echo selecting longer hit from $temp_strp
./llarg.pl < $genewise_out > ./output_genewise/fasta/longer/$temp_strp.fa
} done
# perform global alignment with t_coffee & secissearch
#chop of pathname part from filesnames
for proteins in hits/* ; do {
for genome in $proteins/* ; do {
for hit in $genome/*; do {
proteins=`basename $proteins`
genome=`basename $genome`
hit=`basename $hit`
hit=${hit%.txt}
echo "performing: tcoffee"
#perform global alignment with t_coffee
if [ -f ./translations/aa_${proteins}_${genome}_${hit}.fa ]; then
t_coffee query_proteins/$proteins.fa ./translations/aa_${proteins}_${genome}_${hit}.fa > t_coffee_output_exonerate/gloaln_${proteins}_${genome}_${hit}.txt
fi
if [ -f ./output_genewise/fasta/longer/genewise_fasta_${proteins}_${genome}_${hit}.fa ]; then
t_coffee query_proteins/$proteins.fa ./output_genewise/fasta/longer/genewise_fasta_${proteins}_${genome}_${hit}.fa > t_coffee_output_genewise/gloaln_${proteins}_${genome}_${hit}.txt
fi
echo "*** performing SECISearch of subseq of $hit , from $proteins in $genome"
cd output_secissearch
SECISearch.pl -p s -T -H -x ../subseq/${proteins}_${genome}_${hit}_genomic.fa
cd ..
} done
echo tcoffee of $genome ready
} done
echo tcoffee of $proteins ready
} done
echo "###SECISSEARCH READY###"
echo "##################################"
echo "###T-COFFEE FOR EXONERATE READY###"
echo "##################################"
echo NAME / EXONERATE / GENEWISE >>exonerate_genewise_compare.list
for proteins in hits/* ; do {
for genome in $proteins/* ; do {
for hit in $genome/*; do {
proteins=`basename $proteins`
genome=`basename $genome`
hit=`basename $hit`
if [[ "$hit" = "*" ]] ; then
echo shit ; else
hit=${hit%.txt}
if [ -f ./t_coffee_output_exonerate/gloaln_${proteins}_${genome}_${hit}.txt ]; then
ali_exo=`head -n 1 ./t_coffee_output_exonerate/gloaln_${proteins}_${genome}_${hit}.txt | cut -d ',' -f 3,5` ; else
ali_exo="NONE"
fi
if [ -f ./t_coffee_output_genewise/gloaln_${proteins}_${genome}_${hit}.txt ]; then
ali_gen=`head -n 1 ./t_coffee_output_genewise/gloaln_${proteins}_${genome}_${hit}.txt | cut -d ',' -f 3,5` ; else
ali_gen="NONE"
fi
echo $proteins $genome $hit / $ali_exo / $ali_gen >> exonerate_genewise_compare.list
fi
} done
} done
} done
echo "lei lei!"
uni.pl
#!/usr/bin/perl use warnings; use strict; my $contador=0; while () { open (OUT,">hits/$ARGV[0]/$ARGV[1]/hit$contador.txt"); print OUT $_; close OUT; $contador++; }
substitution.pl
#!/usr/bin/perl 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;
llarg.pl
#!/usr/bin/perl #CAL QUE L'INPUT SIGUI EN FORMAT GENEWISE use strict; my @v; my $inici=0; my $longv=0; my $c1=0; my $par1=0; my $par2=0; my $temp1=""; my $temp2=""; while () { @v=split(//,$_); $longv=scalar(@v); $c1=0; while ($c1 < $longv){ if ($v[$c1] eq ">"){ $inici++; } if ($inici==2){ $temp2.=$v[$c1]; $par2++; } else{ $temp1.=$v[$c1]; $par1++; } $c1++; } } if ($par1 > $par2){ print $temp1; } else{ print $temp2; }