The Bioperl toolkit Daniel Guariz Pinheiro
O que é BioPerl ? Projeto de colaboração open-source internacional (1995- …) Biblioteca de módulos Perl Soluções em Bioinformática Tarefas complexas utilizando algumas poucas linhas de código Licenciado sob a Perl Artistic License Introdução Open Bioinformatics Foundation
Referências 1: Stajich JE, Block D, Boulez K, Brenner SE, Chervitz SA, Dagdigian C, Fuellen G, Gilbert JG, Korf I, Lapp H, Lehväslaiho H, Matsalla C, Mungall CJ, Osborne BI, Pocock MR, Schattner P, Senger M, Stein LD, Stupka E, Wilkinson MD, Birney E. The Bioperl toolkit: Perl modules for the life sciences. Genome Res Oct;12(10): : Stein LD, Mungall C, Shu S, Caudy M, Mangone M, Day A, Nickerson E, Stajich JE, Harris TW, Arva A, Lewis S. The generic genome browser: a building block for a model organism system database. Genome Res Oct;12(10): : Stajich JE, Hahn MW. Disentangling the effects of demography and selection in human history. Mol Biol Evol Jan;22(1): Epub 2004 Sep 8. Sendu Bala Christopher Fields Hilmar Lapp Heikki Lehväslaiho Aaron Mackey Brian Osborne Jason Stajich Lincoln Stein Responsáveis BioPerl Principais artigos científicos
Citações 1998 – meados 2008 ~600 (projetos e artigos) ~40 (livros) 3 (patentes)
Paradigma de programação RELACIONAMENTO E TROCA DE MENSAGENS ENTRE OS OBJETOS
Conceitos - I Classe: É a modelagem de um conceito do mundo real (abstração de um objeto). As propriedades associadas ao conceito são representadas por atributos e operações. Objeto ou Instância (de uma classe): É a concretização da classe em uma entidade lógica, que contém dados (atributos) e código para manipulá-los (métodos). Cada objeto pertence a uma classe. Mensagem: Comunicação entre objetos. Se manda uma mensagem a um objeto para pedir a ele executar uma operação particular.
Conceitos - II Herança: (Especialização/generalização) é o mecanismo pelo qual uma classe (sub-classe) pode estender outra classe (super-classe), aproveitando seus métodos e atributos. No modelo a objetos, uma sub-classe possui todos os atributos e todas as operações da super-classe. A sub-classe pode acrescentar alguns atributos e métodos. Ela pode também redefinir alguns métodos da super-classe. Ela não pode tirar nenhuma propriedade da super-classe. Polimorfismo: É o princípio pelo qual duas ou mais classes derivadas de uma mesma superclasse podem invocar métodos que têm a mesma identificação (assinatura) mas comportamentos distinto. Interface: A Interface é uma classe que possui apenas as especificações sem a implementação.
Diagrama de Classes
POO em Perl package Sequence; sub new { my ($class, $id, $seq, $strand) my $self = bless {}, $class; $self->set_sequence($id,$seq,$strand); return $self; } sub set_sequence { my ($self, $id, $seq, $strand) $self->{ ' sequence ' } = { ' id ' => $id, ' seq ' => $seq, ' strand ' => $strand}; } sub display_fasta_sequence { my $self = shift; my $seq = $self->{ ' sequence ' }->{ ' seq ' }; $seq=~s/(.{1,60})/$1\n/g; print ">$self->{ ' sequence ' }->{ ' id ' }\n$seq"; } 1; Sequence.pm use Sequence; my $seq = Sequence->new( ' Seq1 ', ' ACCACGATCACATG ', ' + ' ); $seq->display_fasta_sequence(); seq.pl Definições simplificadas: Um objeto é simplesmente uma referência à classe a qual ele pertence; Uma classe é simplesmente um pacote que provê métodos para lidar com as referências do objeto; Um método é simplesmente uma sub-rotina que espera uma referência ao objeto como primeiro argumento;
CPAN Comprehensive Perl Archive Network Coleção de módulos em Perl e documentação Exemplos: DBD::mysql ; DBI; CGI; GD;
Arquitetura geral do BioPerl Programação Orientada a Objetos (POO) API (Application Programming Interface) Princípios: Separação entre Interface e Implementação; Generalização de rotinas comuns em um único módulo; Utilização de certos padrões de desenvolvimento reconhecidos (Design Patterns);
Separação entre Interface e Implementação Interface (Tipos Abstratos de Dados) Contrato de como os métodos devem ser invocados; I – adicionado ao nome da classe (Ex.: Bio::SeqI e Bio::Seq; Bio::SeqFeatureI e Bio::SeqFeature)
Generalização de rotinas comuns (único módulo) Exemplos: Operações básicas de IO (input/output) – Bio::Root::IO Operações básicas de acesso web – Bio::Root::HTTPget
Utilização de Padrões de Desenvolvimento Factory – adição de módulos responsáveis pela criação automática de objetos Factory – adicionado ao nome da classe (Ex.: Bio::Seq::SeqFactory - Bio::PrimarySeq ou Bio::Seq::Qual) Strategy – seleção dinâmica de algoritmos Ex.: next_seq() da classe Bio::SeqIO (Diferentes implementações, uma para cada um dos parsers) – seleção em tempo de execução
Características Escrito puramente em Perl Padrão de desenvolvimento rigoroso Orientações para a padronização do cógido Testes exaustivos Documentação (POD - Plain Old Documentation) perldoc Requer compilador Perl v5.005 ou superior Plataformas suportadas (Sistemas Operacionais) UNIX-like Linux, Solaris, FreeBSD, … Windows
Principais Módulos Bio::SeqSeqüências e suas propriedades Bio::SeqFeature Anotação de seqüências com seus atributos Bio::DB Acesso a bancos de dados de seqüências Bio::SeqIO Usado para ler e gravar seqüências em diferentes formatos Bio::DB::Query::GenBank Consultas a bancos de dados de seqüências (GenBank) Bio::SearchIOObter dados de resultados (Ex.: blast) Bio::Location Manipulação de coordenadas de seqüências Bio::Graphics Gerar imagens de seqüências e atributos de seqüências
Documentação $ perldoc Bio::SeqIO
Bio::Seq use Bio::Seq; my $sequence_as_string = 'ACGTACAGTACAGTACTAGAAACGTA'; my $seqobj = Bio::Seq->new(-display_id => 'my_id', -seq => $sequence_as_string); print $seqobj->display_id(),"\n"; print $seqobj->seq(),"\n"; print $seqobj->translate()->seq(),"\n"; print $seqobj->trunc(5,10)->revcom()->seq(),"\n"; my $subseqstr = $seqobj->subseq(5,10); print $subseqstr,"\n"; my $revcom = $seqobj->revcom(); print $revcom,"\n"; print $revcom->seq(),"\n"; print $seqobj->desc(),"\n";
Bio::SeqFeature::Generic use Bio::Seq; use Bio::SeqFeature::Generic; my $seqobj = Bio::Seq->new(-display_id => 'my_id', -seq => 'ACGTACAGTACAGTACTAGAAACGTA'); my $feat = new Bio::SeqFeature::Generic (-start => 5, -end => 15,-strand => -1, -primary_tag => 'repeat', -display_name => 'alu family', -tag=>{ test=>[1,2,3], author=>'someone' } ); $seqobj->add_SeqFeature($feat); = $seqobj->get_SeqFeatures(); foreach my $feat ) { print "Feature ",$feat->primary_tag," starts ",$feat->start," ends ", $feat->end," strand ",$feat->strand,"\n"; print "Feature sequence is ",$feat->seq->seq(),"\n"; foreach my $tag ( $feat->get_all_tags() ) { print "\t",$tag,"\n"; foreach my $value ( $feat->each_tag_value($tag) ) { print "\t\t",$value,"\n"; } repeat test author someone primary_tag tagtag valuetagtag value
Bio::DB::GenBank use Bio::DB::GenBank; my $gb = new Bio::DB::GenBank; my $seqobj = $gb->get_Seq_by_acc('J00522'); #my $seqobj = $gb->get_Seq_by_version('J '); #my $seqobj = $gb->get_Seq_by_gi('195052'); = $seqobj->get_SeqFeatures(); foreach my $feat ) { print "Feature ",$feat->primary_tag," starts ",$feat->start," ends ", $feat->end," strand ",$feat->strand,"\n"; print "Feature sequence is ",$feat->seq->seq(),"\n"; foreach my $tag ( $feat->get_all_tags() ) { print "\t",$tag,"\n"; foreach my $value ( $feat->each_tag_value($tag) ) { print "\t\t",$value,"\n"; }
Bio::SeqIO use Bio::SeqIO; my $in = Bio::SeqIO->new( -file => "./NAT2.gbwithparts" ); my $out = Bio::SeqIO->new( -file => ">./NAT2.embl", -format=> 'EMBL' ); while ( my $seq = $in->next_seq() ) { print $seq->display_id(),"\t",$seq->desc(),"\n"; $out->write_seq($seq); }
Bio::DB::Query::GenBank use Bio::DB::Query::GenBank; use Bio::DB::GenBank; # get a stream via a query string my $query = Bio::DB::Query::GenBank->new( -query =>'NAT2[Gene Name] AND Homo sapiens[Organism] AND mRNA[Filter]', -db => 'nucleotide'); my $count = $query->count(); print "Found $count entries\n"; # get a genbank database handle my $gb = new Bio::DB::GenBank; my $stream = $gb->get_Stream_by_query($query); while (my $seq = $stream->next_seq) { print $seq->display_id(),"\t",$seq->desc(),"\n"; }
Bio::Location use Bio::SeqIO; my $in = Bio::SeqIO->new( -file => "./ame_ref_chrLG16.gbk" ); while ( my $seq = $in->next_seq() ) { print $seq->display_id, "\n"; for my $feature ( $seq->get_SeqFeatures ) { next unless ( $feature->primary_tag eq 'mRNA'); if ($feature->has_tag('gene')) { my ($name) = $feature->get_tag_values('gene'); my $exonct = 1; print "\t",$name,"\n"; for my $exon ($feature->location->each_Location ) { # print " ",$exon->start, "..",$exon->end,"\n"; my $exonseq = $seq->trunc($exon); $exonseq->display_id($name.".exon".$exonct++); # print "\t\t",$exonseq->display_id(),"\n"; } print "Exon count: $exonct\n"; my $spliced = $feature- >spliced_seq; print $spliced,"\n; # print $spliced->seq(),"\n"; }
Bio::SearchIO use Bio::SearchIO; my $searchio = new Bio::SearchIO( -format => 'blast', -file => 'blast/blast_output'); while( my $result = $searchio->next_result ) { print $result->query_accession(),"\n"; while( my $hit = $result->next_hit ) { print "\t",$hit->accession(),"\t",$hit->description(),"\n"; while( my $hsp = $hit->next_hsp ) { print "\t\t",'Score: ',$hsp->score(),"\n"; print "\t\t",'Identity: ',$hsp->percent_identity(),"\n"; print "\t\t",'e-value: ',$hsp->evalue(),"\n"; print "\t\t",'Query (start,end): ', $hsp->start('query'),', ',$hsp->end('query'),"\n"; print "\t\t",'Subject (start,end): ', $hsp->start('subject'),', ',$hsp->end('subject'),"\n"; }
Bio::Graphics use Bio::SearchIO; use Bio::Graphics; use Bio::SeqFeature::Generic; my $searchio = new Bio::SearchIO( -format => 'blast', -file => 'blast/blast_output'); while( my $result = $searchio->next_result ) { my $query_accession = $result->query_accession(); my $panel = Bio::Graphics::Panel->new(-length => $result->query_length(),-width => 800, -pad_left=>10, -pad_right=>10); my $full_length = Bio::SeqFeature::Generic->new(-display_name=>$query_accession, -start=>1, -end=>$result->query_length()); $panel->add_track($full_length, -glyph => 'arrow', -tick => 2, -fgcolor => 'black', -double => 1, -label=>1); my $track = $panel->add_track(-glyph => 'graded_segments', -label => 1, -min_score=>0, -max_score=>1000); while( my $hit = $result->next_hit ) { my $hit_accession = $hit->accession(); while( my $hsp = $hit->next_hsp ) { my $feature = Bio::SeqFeature::Generic->new(-display_name=> $hit_accession, -score=> $hsp->score(), -start=> $hsp->start('query'), -end=> $hsp->end('query')); $track->add_feature($feature); } open(OUT, ">".$query_accession.'.png'); binmode OUT; print OUT $panel->png; close(OUT); }
Bibliografia epts/ nfo phics/
Perguntas… Daniel Guariz Pinheiro
Exercícios There s More Than One Way To Do It TIMTOWTDI
Exercício 1 1. Obter e imprimir em um arquivo as seguintes informações do cromossomo 16 de Apis mellifera (ame_ref_chrLG16.gbk): Número de acesso dos contigs genômicos tamanho da seqüência símbolo do gene (Ex.: LOC413891) coordenada do exon (Ex.: ) informação da orientação (strand: plus(1)/minus(-1)) Exemplo: NW_ LOC
Exercício 2 2. Obter e imprimir em um arquivo as seguintes informações do arquivo de mRNAs do gene NAT2 (NAT2.gbwithparts) somente para o número de acesso iniciado por NM_ : Número de acesso GenBank Localização no cromossomo exon número do exon coordenada (start..end) Exemplo: NM_ p22 exon exon
Exercício 3 3. Fazer uma consulta no GenBank das formas alternativas do gene BRCA1 () através da BioPerl, obter as seguintes informações e imprimir na tela: Número de acesso Descrição números dos exons que compõe essa forma alternativa entre ";" Exemplo: NM_ Homo sapiens breast cancer 1, early onset (BRCA1), transcript variant BRCA1-delta b, mRNA. 1b;3;4;5;6;7;8;11a;12;13;14a;15;16;17;18;19;20;21;22;23;24
Exercício Baixar o arquivo (exercises/ex4/NW_ gbk) com esse contig genômico de Apis mellifera extrair a seqüência completa para um outro arquivo (NW_ fas), no formato fasta, e extrair as seqüências dos transcritos após evento de splicing (spliced_seqs) e compor um outro arquivo multi-fasta com essas seqüências (input.fas). 4.2 Após blast entre NW_ fas (database) e input.fas (input). Obter as queries, hits e coordenadas dos hsps, como no exemplo abaixo e imprimir na tela: Query Subject (hit) subject_start..subject_end Exemplo: NW_ _2 NW_