MFannot

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

submit_mfannot_basic.sh
#!/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

submit_mfannot_gencode.sh
#!/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

submit_mfannot_similarity.sh
#!/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

submit_mfannot_array.sh
#!/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

parse_mfannot.sh
#!/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

visualize_mfannot.sh
#!/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

Ver também