Genome e entradas e saídas binárias

Genome e entradas e saídas binárias

por José Coelho de Pina -
Número de respostas: 0

Salve,

Esse negócio de compressão de dados é outro tópico da hora que veremos nas nossas próximas reuniões.

Para usar classe Genome o arquivo a ser comprimido deve conter apenas os caracteres "ACGT".
O arquivo genome.txt nas notas de aula tem um '\n' no final. Vejam

    % more genome.txt 
    ATAGATGCATAGCGCATAGCTAGATGTGCTAGC
    % more genomeTiny.txt 
    ATAGATGCATAGCGCATAGCTAGATGTGCTAGC
    % file genome.txt 
    genome.txt: ASCII text
    % file genomeTiny.txt
    genomeTiny.txt: ASCII text, with no line terminators
    % wc genome.txt 
     1  1 34 genome.txt
    % wc genomeTiny.txt
     0  1 33 genomeTiny.txt
    % java Genome - < genome.txt 
    Exception in thread "main" java.lang.IllegalArgumentException: Character 
     not in alphabet
        at edu.princeton.cs.algs4.Alphabet.toIndex(Alphabet.java:188)
        at Genome.compress(Genome.java:54)
        at Genome.main(Genome.java:85)
    % java Genome - < genomeTiny.txt | java BinaryDump 32 
    00000000000000000000000000100001
    00110010001110010011001001100100
    11001001110010001110111001110010
    01000000
    104 bits

De fato, '\n' não faz parte do alfabeto "ACGT".

compress() e expand()

Um coisa divertida e que ajuda a verificar se as função compress() e expand() estão ok é fazer

    % java Genome - < genomeTiny.txt | java Genome + > genomeTiny.orig.txt
    % more genomeTiny.txt 
    ATAGATGCATAGCGCATAGCTAGATGTGCTAGC
    % more genomeTiny.orig.txt 
    ATAGATGCATAGCGCATAGCTAGATGTGCTAGC
    % diff genomeTiny.txt genomeTiny.orig.txt 
    % java Genome - < genomeTiny.txt | java Genome + | more
    ATAGATGCATAGCGCATAGCTAGATGTGCTAGC
    % 

Classe Genome

O main() da classe Genome é bem bobo.
Só serve para dizer o que devemos fazer: compress() ou expand().

public class Genome {

    public static void compress() {
        Alphabet DNA = new Alphabet("ACGT");
        ...
    }

    public static void expand() {
        Alphabet DNA = new Alphabet("ACGT");
        ...
    }
    
    public static void main(String[] args) {
        if      (args[0].equals("-")) compress();
        else if (args[0].equals("+")) expand();
        else throw new IllegalArgumentException("Illegal command line argument");
    }

}

Entradas e saídas binárias

Nos próximos encontro usaremos entrade e saída de bits que são fornecidas pelo algs4 através das classes BinaryStdIn, BinaryStdOut, BinaryIn, BinaryOut. Como o Caio notou, a descrição de BinaryStdOut.write() estava errada no slide.
Corrigi, muito obrigado por avisar.
Mais informações podem ser encontrada na página Entrada e saída binárias do professor Paulo Feofiloff tem uma descrição muito boa dessas classes.

As classe BinaryStdIn, BinaryStdOut, BinaryIn e BinaryOut que usaremos tem muito métodos.
As APIs originais estão em BinaryStdIn, BinaryStdOut, BinaryIn, e BinaryOut.

Alphabet

A classe Alphabet que usamos hoje é essencialmente uma tabela. Aqueles e aquelas que estiverem interesados no funcionamento dessa tabela e de seus métodos toIndex() e toChar(), vejam a página Alfabetos (classe Alphabet) do professor Paulo Feofiloff.