BioJava:CookbookPortuguese:Count:Residues

From BioJava

Jump to: navigation, search

Como eu posso contar os Residuos em uma Sequence?

Contar os resíduos em uma Sequence é uma tarefa muito comum na bioinformatica. Geralmente você construiria um array de inteiros e usaria algum sistema indexador. Ou ainda, você poderia usar um AlphabetIndex para impor um índice unificado, ou obteria um indice a partir do AlphabetManager usando um de seus métodos getAlphabetIndex().

Por ser uma atividade tão comum o BioJava empacotou estes recursos em uma classe chamada IndexedCount que, nada mais é, uma implementação da interface Count.

O exemplo a seguir lê algum tipo de arquivo de sequencias e conta os resíduos, imprimindo seu resultados para STDOUT. Note que este programa não trabalha com símbolos de ambigüidade.

Solução 1

import java.io.*;
import java.util.*;
 
 
import org.biojava.bio.dist.*;
import org.biojava.bio.seq.*;
import org.biojava.bio.seq.io.*;
import org.biojava.bio.symbol.*;
 
public class CountResidues {
 
  /**
   * Pega 3 argumentos, primeiro é o arquivo da sequencia o segundo é o
   * formato da sequencia (case insensitive) e o terceiro é a sequencia
   * do alphabet (ex DNA, também case insensitive)
   */
  public static void main(String[] args) {
    //referencia para object to manter os contadores
    Count counts = null;
 
    try {
      //abre o arquivo de sequencia
      BufferedReader br = new BufferedReader(new FileReader(args[0]));
 
      //adquire um SequenceIterator para as sequencias no arquivo
      SequenceIterator iter =
          (SequenceIterator)SeqIOTools.fileToBiojava(args[1],args[2],br);
 
      //para cada sequence
      while(iter.hasNext()){
        Sequence seq = iter.nextSequence();
 
        //se necessário, inicializa o contador
        if(counts == null){
          counts = new IndexedCount((FiniteAlphabet)seq.getAlphabet());
        }
 
        //itera através dos Symbols na seq
        for (Iterator i = seq.iterator(); i.hasNext(); ) {
          AtomicSymbol sym = (AtomicSymbol)i.next();
          counts.increaseCount(sym,1.0);
        }
      }
 
      //agora imprime os resultados
      for (Iterator i = ((FiniteAlphabet)counts.getAlphabet()).iterator();
           i.hasNext(); ) {
        AtomicSymbol sym = (AtomicSymbol)i.next();
        System.out.println(sym.getName()+" : "+counts.getCount(sym));
      }
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}

Solução 2

import java.io.*;
import java.util.*;
 
 
import org.biojava.bio.dist.*;
import org.biojava.bio.seq.*;
import org.biojava.bio.seq.io.*;
import org.biojava.bio.symbol.*;
 
public class CountResidues2 {
 
   /**
   * Pega 3 argumentos, primeiro é o arquivo da sequencia o segundo é o
   * formato da sequencia (case insensitive) e o terceiro é a sequencia
   * do alphabet (ex DNA, também case insensitive)
   */
 
  public static void main(String[] args) {
    //referencia o objeto para guardar os contadores
    Count counts = null;
 
    try {
      //abre o arquivo de sequence
      BufferedReader br = new BufferedReader(new FileReader(args[0]));
 
      //adquire um SequenceIterator para as sequencias no arquivo
      SequenceIterator iter =
          (SequenceIterator)SeqIOTools.fileToBiojava(args[1],args[2],br);
 
      //para cada sequence
      while(iter.hasNext()){
        Sequence seq = iter.nextSequence();
 
        //se necessário inicializa os contadores
        if(counts == null){
          counts = new IndexedCount((FiniteAlphabet)seq.getAlphabet());
        }
 
        //iterate através dos Symbols na seq
        for (Iterator i = seq.iterator(); i.hasNext(); ) {
          Symbol sym = (Symbol)i.next();
 
          /*
           * O Símbolo pode ser ambíguo assim soma uma conta parcial para cada Símbolo
           * isso compõe o Símbolo de ambigüidade. Ex a ambigüidade de DNA que n é feito
           * de um Alfabeto de quatro Símbolos, assim soma-se 0.25 ao count de cada um.
           */
          FiniteAlphabet subSymbols = (FiniteAlphabet)sym.getMatches();
          for (Iterator i2 = subSymbols.iterator(); i2.hasNext(); ) {
            AtomicSymbol sym2 = (AtomicSymbol)i2.next();
            counts.increaseCount(sym2, 1.0 / (double)subSymbols.size());
          }
        }
      }
 
      //agora imprime os resultados
      for (Iterator i = ((FiniteAlphabet)counts.getAlphabet()).iterator();
           i.hasNext(); ) {
        AtomicSymbol sym = (AtomicSymbol)i.next();
        System.out.println(sym.getName()+" : "+counts.getCount(sym));
      }
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}
Personal tools