BioJava:CookbookPortuguese:Count:Residues
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
```java 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
```java 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();
}
}
} ```