MFannot
Nesta seção:
Descrição
De acordo com a Documentação do MFannot, MFannot (Mitochondrial/Fungal ANNOTation) é uma ferramenta para anotação de genomas mitocondriais e fúngicos. Utiliza modelos de Markov (HMMs) e similaridade com bancos de dados de proteínas para identificar e anotar genes, introns e outras características em sequências de DNA.
Versões Disponíveis
mfannot/1.37 (default)
Carregando o Módulo
# Carregar MFannot
module load mfannot/1.37
# Verificar instalação
mfannot -h
Arquivos de Entrada Necessários
MFannot requer:
Arquivo de sequência no formato FASTA
Código genético apropriado (padrão: 1 - universal)
Opcional: arquivo de referência para comparação
Submissão de Jobs
#!/bin/bash
#SBATCH -J mfannot
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 12:00:00
#SBATCH --mem=8G
export INPUT="mitogenome.fasta"
export OUTPUT="annotation.out"
module load mfannot/1.37
job-nanny mfannot -g 1 mitogenome.fasta > annotation.out 2> annotation.err
Anotação com Diferentes Códigos Genéticos
#!/bin/bash
#SBATCH -J mfannot_gencode
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 12:00:00
#SBATCH --mem=8G
export INPUT="mitogenome.fasta"
export OUTPUT="annotation_*.out"
module load mfannot/1.37
# Código genético 1: Universal (padrão)
job-nanny mfannot -g 1 mitogenome.fasta > annotation_universal.out
# Código genético 2: Vertebrados mitocondrial
job-nanny mfannot -g 2 mitogenome.fasta > annotation_vert_mt.out
# Código genético 3: Leveduras mitocondrial
job-nanny mfannot -g 3 mitogenome.fasta > annotation_yeast_mt.out
# Código genético 4: Protozoários mitocondrial + Mycoplasma
job-nanny mfannot -g 4 mitogenome.fasta > annotation_protozoa_mt.out
Anotação com Busca por Similaridade
#!/bin/bash
#SBATCH -J mfannot_sim
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 24:00:00
#SBATCH --mem=16G
export INPUT="novel_sequence.fasta"
export OUTPUT="similarity_annotation.out"
module load mfannot/1.37
# Anotação com busca por similaridade em banco de dados
job-nanny mfannot -g 1 -s novel_sequence.fasta > similarity_annotation.out
Job Array para Múltiplas Sequências
#!/bin/bash
#SBATCH -J mfannot_array
#SBATCH --array=1-10
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 12:00:00
#SBATCH --mem=8G
SEQUENCES=($(ls *.fasta))
SEQ=${SEQUENCES[$SLURM_ARRAY_TASK_ID-1]}
BASE=$(basename "$SEQ" .fasta)
export INPUT="$SEQ"
export OUTPUT="${BASE}_annot/"
module load mfannot/1.37
mkdir -p ${BASE}_annot
cd ${BASE}_annot
cp ../$SEQ .
job-nanny mfannot -g 1 $SEQ > ${BASE}_annot.out 2> ${BASE}_annot.err
# Extrair estatísticas básicas
echo "Sequência: $BASE" > stats.txt
grep -c "^>" ../$SEQ >> stats.txt
grep -c "gene" ${BASE}_annot.out >> stats.txt
grep -c "intron" ${BASE}_annot.out >> stats.txt
Interpretação dos Resultados
O arquivo de saída do MFannot contém:
# Anotação para sequência: mitogenome.fasta
# Comprimento: 15894 bp
# Código genético: 1 (Universal)
>Feature: gene
Position: 1..1500
Strand: +
Gene: cox1
Product: cytochrome c oxidase subunit I
>Feature: intron
Position: 1501..2100
Strand: +
Gene: cox1
Type: groupI
>Feature: gene
Position: 2101..3150
Strand: +
Gene: nad1
Product: NADH dehydrogenase subunit 1
Pós-processamento com Python
#!/bin/bash
#SBATCH -J parse_mfannot
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 01:00:00
#SBATCH --mem=2G
cat > parse_mfannot.py << 'EOF'
import re
import csv
from collections import defaultdict
def parse_mfannot_output(filename):
features = []
current_feature = {}
with open(filename, 'r') as f:
for line in f:
if line.startswith('>Feature:'):
if current_feature:
features.append(current_feature)
current_feature = {'type': line.split(':')[1].strip()}
elif line.startswith('Position:'):
current_feature['position'] = line.split(':')[1].strip()
elif line.startswith('Strand:'):
current_feature['strand'] = line.split(':')[1].strip()
elif line.startswith('Gene:'):
current_feature['gene'] = line.split(':')[1].strip()
elif line.startswith('Product:'):
current_feature['product'] = line.split(':')[1].strip()
elif line.startswith('Type:'):
current_feature['intron_type'] = line.split(':')[1].strip()
if current_feature:
features.append(current_feature)
return features
# Processar todos os arquivos de anotação
import glob
import os
for annot_file in glob.glob("*_annot/*.out"):
sample = os.path.basename(annot_file).replace('_annot.out', '')
features = parse_mfannot_output(annot_file)
# Estatísticas por amostra
gene_count = sum(1 for f in features if f.get('type') == 'gene')
intron_count = sum(1 for f in features if f.get('type') == 'intron')
with open(f'{sample}_summary.txt', 'w') as out:
out.write(f"Amostra: {sample}\n")
out.write(f"Genes encontrados: {gene_count}\n")
out.write(f"Íntrons encontrados: {intron_count}\n")
out.write("\nDetalhamento:\n")
for f in features:
out.write(f" {f.get('type')}: {f.get('gene', 'N/A')} "
f"[{f.get('position', 'N/A')}] "
f"({f.get('product', 'N/A')})\n")
EOF
python3 parse_mfannot.py
Visualização de Resultados
#!/bin/bash
#SBATCH -J viz_mfannot
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 01:00:00
#SBATCH --mem=2G
# Necessitar instalar o matplotlib
# Carregue o módulo do Conda
module load miniconda/25.x
# Crie um ambiente Conda
conda create -n matplotlib_env
source activate matplotlib_env
# Instale o matplotlib
conda install matplotlib
cat > plot_annotations.py << 'EOF'
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import glob
import re
def parse_coordinates(pos_str):
"""Extrair coordenadas de posição (ex: '1..1500')"""
match = re.match(r'(\d+)\.\.(\d+)', pos_str)
if match:
return int(match.group(1)), int(match.group(2))
return None, None
# Coletar estatísticas por amostra
samples = []
gene_counts = []
intron_counts = []
for summary in glob.glob("*_summary.txt"):
sample = summary.replace('_summary.txt', '')
with open(summary, 'r') as f:
content = f.read()
# Extrair contagens
genes = re.search(r'Genes encontrados: (\d+)', content)
introns = re.search(r'Íntrons encontrados: (\d+)', content)
if genes and introns:
samples.append(sample)
gene_counts.append(int(genes.group(1)))
intron_counts.append(int(introns.group(1)))
# Gráfico de barras
if samples:
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8))
x = range(len(samples))
ax1.bar(x, gene_counts, color='blue', alpha=0.7)
ax1.set_xlabel('Amostra')
ax1.set_ylabel('Número de genes')
ax1.set_title('Genes anotados por amostra')
ax1.set_xticks(x)
ax1.set_xticklabels(samples, rotation=45, ha='right')
ax2.bar(x, intron_counts, color='red', alpha=0.7)
ax2.set_xlabel('Amostra')
ax2.set_ylabel('Número de íntrons')
ax2.set_title('Íntrons anotados por amostra')
ax2.set_xticks(x)
ax2.set_xticklabels(samples, rotation=45, ha='right')
plt.tight_layout()
plt.savefig('mfannot_summary.png', dpi=150)
print("Gráfico salvo como mfannot_summary.png")
else:
print("Nenhum dado encontrado para plotar")
EOF
python3 plot_annotations.py
Referências
Documentação: https://github.com/BFL-lab/Mfannot
Publicação: https://academic.oup.com/nar/article/35/suppl_2/W620/2920130
Banco de dados: http://megasun.bch.umontreal.ca/People/lang/FMGP/
Ver também
BUSCO - Avaliação de completude
Trinity - Montagem de transcriptomas
Processando Simulações - Como submeter jobs