Anotação de genomas de fungos

Thiago Mafra Batista

Published: 2024-06-10 DOI: 10.17504/protocols.io.n92ld8r97v5b/v1

Abstract

Este tutorial guiará estudantes e pesquisadores a realizarem a anotação (estrutural e funcional) de genomas de fungos com o software Maker2. Iniciamos com a identificação e mascaramento das regiões repetitivas com o RepeatModeler e RepeatMasker, respectivamente. Treinamos os preditores SNAP e Augustus para aprimorarmos a predição gênica que é realizada em duas etapas. Então, conduzimos a anotação funcional dos genes codificadores de proteínas a partir da similaridade encontrada com sequências depositadas nos bancos de dados Swissprot e Trembl e com o Interproscan.

Steps

Identificação e mascaramento das regiões repetitivas

1.

Antes de realizar a predição gênica, vamos identificar as famílias de repetições com o RepeatModeler e depois mascará-las no genoma com o RepeatMasker. No exemplo abaixo estou utilizando um arquivo fasta com nome contigs_Y6065_v1.fasta, os softwares instalados em /opt/apps e seus executáveis disponíveis na variável de ambiente.

Criar o banco indexado a partir do genoma montado

$ /opt/apps/RepeatModeler-2.0.3/BuildDatabase -name y6065 contigs_Y6065_v1.fasta

Rodar o RepeatModeler com 32 processadores

$ RepeatModeler -pa 32 -database y6065 -LTRStruct > output.txt

Famílias de repetições identificadas. Hora de mascará-las no genoma

$ RepeatMasker -pa 32 -e rmblast -lib ../repeatmodeler_run/y6065-families.fa -dir . -small -gff contigs_Y6065_v1.fasta 1>log

Predição gênica

2.

A predição gênica será realizada com o software Maker2 . O maker possui um preditor interno e também faz o uso de preditores externos como o SNAP , Augustus e GeneMark. Neste tutorial, vamos utilizar o SNAP e Augustus . Ambos precisam ser treinados. Para treinarmos o SNAP utilizaremos o arquivo gff gerado como output do CEGMA .

2.1.

CEGMA (Core Eukaryotic Genes Mapping Approach)

O CEGMA utiliza um grupo de 458 proteinas altamente conservadas em diferentes espécies. Os softwares de alinhamento identificam as junções exon-intron nos genomas avaliados e seus resultados são uteis para treinar preditores e para avaliar a completude de genomas.

# Cria o diretório cegma_run se ele não existir e entra nele
mkdir -p cegma_run && cd cegma_run || exit 1

# Executa o CEGMA com 64 processadores

$ cegma -T 64 -g genoma.fasta -o Y6065 1>cegma.log 2>cegma.err

```Agora vamos treinar o SNAP a partir do  _gff_  gerado pelo CEGMA. Abaixo todos os comandos necessários para isso.





Cria o diretório snaphmm_run dentro do diretório cegma_run e entra nele

$ mkdir -p snaphmm_run && cd snaphmm_run || exit 1

Gera arquivo hmm de treinamento do SNAP

fathom genome.ann genome.dna -categorize 1000 forge export.ann export.dna $ hmm-assembler.pl genoma.fasta . > Y6065.cegmasnap.hmm

2.2.

Maker (passo 1)

Vamos rodar o maker em duas etapas. Na primeira, habilitamos o SNAP com o arquivo cegmasnap.hmm e utilizamos um conjunto de proteínas de sete leveduras diferentes ( Clavispora lusitaniae , Kluyveromyces lactis , Lodderomyces elongisporus , Metchnikowia bicuspidata , Saccharomyces cerevisiae S288C, Spathaspora passalidarium e Schefferomyces stipitis ) em um único arquivo nomeado seven_yeasts_proteins.faa . Essas proteínas servirão de evidências para a predição gênica. O ideal seria utilizar também dados de transcriptoma, quando disponíveis.

#gerar os arquivos de configuração do maker. Serão gerados quarto arquivos.
$ maker -CTL
```Vamos modificar apenas o arquivo maker_opts.ctl. Abaixo estão as linhas modificadas:



#-----Genome (these are always required) genome=/caminho/para_o_genoma/contigs_Y6065_v1.fasta.masked #arquivo mascarado pelo repeatmasker

#-----Protein Homology Evidence (for best results provide a file for at least one) protein=/caminho/para_o_arquivo/seven_yeast_proteins.faa #arquivo com as proteínas das sete leveduras mencionadas acima #-----Repeat Masking (leave values blank to skip repeat masking) model_org= #apagar a palavra all

#-----Gene Prediction snaphmm=/caminho/para_o_arquivo/Y6065_snap.hmm #SNAP HMM file protein2genome=1 #infer predictions from protein homology, 1 = yes, 0 = no trna=1 #find tRNAs with tRNAscan, 1 = yes, 0 = no pred_stats=1 #report AED and QI statistics for all predictions as well as models min_protein=30 #require at least this many amino acids in predicted proteins alt_splice=1 #Take extra steps to try and find alternative splicing, 1 = yes, 0 = no keep_preds=1 #Concordance threshold to add unsupported gene prediction (bound by 0 and 1)




$ mpiexec.openmpi -n 40 maker -base y6065_pass1 </dev/null> maker_pass1.log 2>&1 &






$ fasta_merge -d y6065_pass1_master_datastore_index.log

$ gff3_merge -n -d y6065_pass1_master_datastore_index.log

2.3.

Treinamento do SNAP

Vamos treinar o SNAP novamente, mas agora, a partir do arquivo gff gerado pelo maker no passo 1.

$ mkdir snap_training && cd snap_training

$ maker2zff -n pass1_all.gff
$ fathom genome.ann genome.dna -categorize 1000
$ fathom genome.ann genome.dna -export 1000 -plus
$ forge export.ann export.dna
$ hmm-assembler.pl genoma.fasta . > Y6065.makersnap.hmm
2.4.

Treinamento do Augustus

O treinamento do Augustus será realizado em duas etapas. Vamos usar de exemplo neste tutorial o código y6065 que deverá ser alterado de acordo com o projeto.

Primeira etapa do treinamento:

$ mkdir augustus_training && cd augustus_training

$ awk '{if ($2=="maker") print }' pass1_all.gff > maker_pass1.gff
$ gff2gbSmallDNA.pl pass1_all.gff genoma.fasta 2000 y6065.gbk 1>gff2gb.log 2>gff2gb.err
$ new_species.pl --species=y6065
$ etraining --species=y6065 y6065.gbk 1>etraining.log 2>etraining.err
$ randomSplit.pl y6065.gbk 200
$ mv y6065.gbk.test y6065.gbk.evaluation
$ augustus --species=y6065 y6065.gbk.evaluation >& first_evaluate.out
```Segunda etapa do treinamento:

optimize_augustus.pl --species=y6065 --kfold=4 --cpus=8 --rounds=5 --onlytrain=y6065.gbk.train y6065.gbk.test >& log augustus --species=y6065 y6065.gbk.evaluation >& second_evaluate.out




$ grep -A 22 Evaluation first_evaluate.out

$ grep -A 22 Evaluation second_evaluate.out

2.5.

Maker passo 2

Vamos realizar uma nova predição modificando alterando apenas as informações para o SNAP e para o Augustus no arquivo maker_opts.ctl

#-----Gene Prediction
snaphmm=/caminho/para_o_arquivo/Y6065.makersnap.hmm #SNAP HMM file
augustus_species=y6065 #Augustus gene prediction species model
```Rodando o maker no passo 2. Tempo estimado: 50 minutos.

$ mpiexec.openmpi -n 40 maker -base y6065_pass2 </dev/null> maker_pass2.log 2>&1 &






$ fasta_merge -d y6065_pass2_master_datastore_index.log

$ gff3_merge -n -d y6065_pass2_master_datastore_index.log


Vamos agora processar os cabeçalhos das sequências, inserindo um código único de cada genoma:



$ maker_map_ids --prefix Y6065_ --justify 4 --iterate 1 y6065_pass2.all.gff > map_ids

$ map_fasta_ids map_ids y6065_pass2.all.maker.proteins.fasta

$ map_fasta_ids map_ids y6065_pass2.all.maker.transcripts.fasta

$ map_gff_ids map_ids y6065_pass2.all.gff


Agora as sequências codificadoras de proteínas preditas no genoma estão prontas para serem anotadas funcionalmente.

Anotação funcional

3.

Vamos anotar as sequências a partir da similaridade encontrada com proteínas depositadas no Swissprot . As sequências que não tiverem correspondência, serão alinhadas no Trembl . Além disso, vamos anotar também com o Interproscan . Por fim, as sequencias que não tiverem correspondência com o Trembl, serão alinhadas no banco Non-redundants (NR), mas não para anotá-las, e sim para verificarmos se há alguma correspondência e verificarmos quantas sequências são desconhecidas, ou seja, sem homologia com qualquer outra já depositada no Genbank.

Vamos utilizar o Diamond/BlastX para as buscas por similaridade entre sequencias nos bancos Swissprot, Trembl e NR. Com o Interproscan utilizaremos todos as análises disponíveis no software. Abaixo segue um script para automatizar todo o processo:

#!/bin/bash

# Caminhos para os arquivos de entrada e bases de dados
query="/caminho/para_maker_run/y6065_pass2.maker.output/y6065_pass2.all.maker.transcripts.fasta"
sprot="/caminho/para_database/uniprot_sprot.fasta.dmnd"
trembl="/caminho/para_database/uniprot_trembl.fasta.dmnd"
nr="/caminho/para_database/nr.dmnd"
sprot_trembl="/caminho/para_database/uniprot_sprot_trembl.fasta" #este arquivo foi gerado com o comando $cat uniprot_sprot.fasta uniprot_trembl.fasta > uniprot_sprot_trembl.fasta

# Busca Diamond/Blastx contra Sprot
echo "Diamond/Blastx vs Sprot"
diamond blastx -q "$query" -p 64 -d "$sprot" -k 1 -e 1e-6 --sensitive --query-cover 0.5 --subject-cover 0.5 -o blastx_y6065_vs_sprot.tab -f 6 >> log.txt 2>> err.txt

# Filtrar hits encontrados e buscar sequências que não deram match
awk '{print $1}' blastx_y6065_vs_sprot.tab | uniq > uniprot_hits.txt 
seqkit grep -v -f uniprot_hits.txt "$query" > uniprot_nohits.fasta

# Busca Diamond/Blastx contra Trembl
echo "Diamond/Blastx vs Trembl"
diamond blastx -q uniprot_nohits.fasta -p 64 -d "$trembl" -k 1 -e 1e-6 --sensitive --query-cover 0.5 --subject-cover 0.5 -o blastx_y6065_vs_trembl.tab -f 6 >> log.txt 2>> err.txt

# Combinar resultados de Sprot e Trembl, e buscar sequências que não deram match
cat blastx_y6065_vs_sprot.tab blastx_y6065_vs_trembl.tab > blastx_y6065_vs_sprot_trembl.tab 
awk '{print $1}' blastx_y6065_vs_sprot_trembl.tab | uniq > sprot_trembl_hits.txt 
seqkit grep -v -f sprot_trembl_hits.txt "$query" > uniprot_trembl_nohits.fasta

# Busca Diamond/Blastx contra NR
echo "Diamond/Blastx vs NR"
diamond blastx -q uniprot_trembl_nohits.fasta -p 64 -d "$nr" -k 1 -e 1e-6 --sensitive --query-cover 0.5 --subject-cover 0.5 -o blastx_y6065_vs_nr.tab -f 6 >> log.txt 2>> err.txt

# Anotar proteínas
echo "Anotando as proteínas"
maker_functional_fasta "$sprot_trembl" blastx_y6065_vs_sprot_trembl.tab ../y6065_pass2.all.maker.proteins.fasta > y6065_proteins_annotated.fasta

# Anotar CDS
echo "Anotando as cds"
maker_functional_fasta "$sprot_trembl" blastx_y6065_vs_sprot_trembl.tab ../y6065_pass2.all.maker.transcripts.fasta > y6065_cds_annotated.fasta

# Anotar GFF
echo "Anotando o GFF"
maker_functional_gff "$sprot_trembl" blastx_y6065_vs_sprot_trembl.tab ../y6065_pass2.all.gff > y6065_annotated.gff 

# Preparação para InterProScan
mkdir -p iprscan_run && cd iprscan_run
perl ~/bin/fasta-splitter.pl --n-parts 5 ../y6065_proteins_annotated.fasta

# Rodar InterProScan
echo "Rodando o Interproscan"
for i in ./*.fasta; do
    echo "/opt/apps/interproscan-5.63-95.0/interproscan.sh -i $i -iprlookup -goterms -pa --cpu 20 -f tsv"
done > interpro_jobs_to_split.txt

split -l 1 interpro_jobs_to_split.txt batch.sh_

for script in batch.sh_*; do
    bash "$script" >> ../log.txt 2>> ../err.txt &
done

# Atualizar o GFF com resultados do InterProScan
echo "Atualizando o GFF com o resultado do interproscan"
cat *.tsv > y6065_iprscan_output.tsv
ipr_update_gff y6065_annotated.gff y6065_iprscan_output.tsv > y6065_final_annotation.gff

wait

echo "Fim"
``` Agora é hora de atribuirmos as anotações aos arquivos  _fasta_  e ao arquivo  _gff._ É neste momento que utilizamos o arquivo  _uniprot_sprot_trembl.fasta._ 





 _Observação_ : o maker_funciontal_fasta consome muita memória RAM. Serão necessários mais de 100GB. Atentem-se a isso e acompanhem o consumo durante essa fase.





$ maker_functional_fasta /caminho/para_database/uniprot_sprot_trembl.fasta blastx_y6065_vs_sprot_trembl.tab ../y6065_pass2.all.maker.proteins.fasta > y6065_proteins_annotated.fasta

$ maker_functional_fasta /caminho/para_database/uniprot_sprot_trembl.fasta blastx_y6065_vs_sprot_trembl.tab ../y6065_pass2.all.maker.transcripts.fasta > y6065_cds_annotated.fasta

$ maker_functional_gff /caminho/para_database/uniprot_sprot_trembl.fasta blastx_y6065_vs_sprot_trembl.tab ../y6065_pass2.all.gff > y6065_annotated.gff


E por fim, vamos adicionar a anotação obtida com o Interproscan ao arquivo  _gff_ 





$ ipr_update_gff y6065_pass2.all.gff y6065_iprscan_output.tsv > y6065_final_annotation.gff


Anotação funcional concluída!

推荐阅读

Nature Protocols
Protocols IO
Current Protocols
扫码咨询