.. _mfannot: ======= MFannot ======= .. contents:: Nesta seção: :local: :depth: 2 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 =================== .. code-block:: bash # 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 ================= .. code-block:: bash :caption: 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 ========================================= .. code-block:: bash :caption: 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 =================================== .. code-block:: bash :caption: 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 =================================== .. code-block:: bash :caption: 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: .. code-block:: text # 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 ============================ .. code-block:: bash :caption: 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 ========================== .. code-block:: bash :caption: 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 =========== - 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/ .. seealso:: - :ref:`busco` - Avaliação de completude - :ref:`trinity` - Montagem de transcriptomas - :ref:`processando_simulacoes` - Como submeter jobs