[Cascavel-pm] Dúvida de Biotecnologia

Luis Campos de Carvalho lechamps em terra.com.br
Sexta Setembro 12 14:25:09 CDT 2003


Adriano Vivan Borro wrote:
> Legal. Vou procurar o Sr. Nicolas com certeza. Tks.

   Bom congresso na Alemanha para você!
   Mande lembranças ao Nick por mim!

> Qto a minha duvida, eh o seguinte. A frase q estou verificando eh na verdade um
> gene. E como todos sabem, um gene eh uma frase em um alfabeto de 4 caracteres (nao
> deem essa definicao a um biologo ou biomedico, cnao eles podem ateh brigar. :-D ).
> Ae, o q acontece... Eu nunca sei qual eh o tamanho dessa frase. E preciso cortar (
> ou como eles tratam... "clivar" ) o gene em pontos especificos. De todos estes
> pedacos de gene, tenho q retirar o ultimo, o penultimo, e assim por diante, ateh
> achar determinada sequencia de caracteres.

   Uau!!! Agora isso parece um problema interessante!! =-]
   Obrigado por perder seu tempo explicando essas coisas!

> Tenho, entao, que quero cortar minha frase em toda sequencia TACA por exemplo. E
> quero achar a seguencia CAGA.
> 
> Vai, entao um "exemplo de gene":
> 
> AGATAATACAATATACAGGCAGACGCATACAGGGATACAGACCTACAATTCGTACACCGCAGATACAGACCAGC
> 
> Entao, executando um split /TACA/,$seq , supondo $seq a variavel em q cologuei meu
> "gene", temos:
> 
> AGATAA       ATA               GGCAGACGCA          GGGA            GACC
> ATTCG          CCGCAGA            GACCAGC

   Eu particularmente acho o split() fraco e caro.
   Provavelmente você poderia tentar uma expressão regular com múltiplos 
matches, e um loop while, assim:

   my @genes;
   my $gene = q.AGATAATACAATATACAGGCA. .
              q.GACGCATACAGGGATACAGAC. .
              q.CTACAATTCGTACACCGCAGA. .
              q.TACAGACCAGC.

   # "Enfileira" os genes encontrados em ordem inversa...
   unshift @genes, $1 while( $gene =~ qr/([ACGT]+?)TACA/g );

   # Seleciona os que interessam, separa o primeiro.
   my $choice = (grep qr/CAGA/, @genes)[0];

   __END__

   Poderia ser feito assim, também:

   my $gene = q.AGATAATACAATATACAGGCA. .
              q.GACGCATACAGGGATACAGAC. .
              q.CTACAATTCGTACACCGCAGA. .
              q.TACAGACCAGC.

   my $choice = ( grep qr/CAGA/, reverse split( qr/TACA/, $genes ) )[0];

   __END__

   E, finalmente, para resolver seu problema para sempre, a gente pode 
criar uma funçãozinha:

   sub clivar{
     my( $Splitter, $LookingFor, $Sequence ) = ( shift, shift, shift );
     return
       (grep qr/$LookingFor/o, reverse split(qr/$Splitter/o, $genes))[0];
   }

> Lembrando q a cada execucao, tenho um gene diferente a ser analizado, que tem o
> tamanho diferente e terao diferentes numeros de clivagem, ou seja, nao sei nunca o
> tamanho e nem o numero de elementos do meu array.

   Ok, sem problemas. Tenho certeza de que a funçãozinha resolve o seu 
"abacaxi"... =-]

> A sequencia procurada estah, entao, em $seq[-2] e em $seq[-6], pois estou contando
> do final para o inicio. Mas a que quero eh a ultima ocorrencia, entao $seq[-2]. A
> saida vai ser entao, o pedaco de gene q tem a sequencia procurada, ou seja, CCGCAGA
> . Com isso, finalizo minha rotina, e serah feita a leitura de outro gene.

   Legal!! =-] Eu gostei deste problema!
   Tem mais assim para resolver?
   A gente poderia começar um projetinho open-source... criar 
bibliotecas de biotecnologia Brasileiras, para o pessoal usar em 
pesquisa...

   Se bem que existe muita coisa pronta no CPAN...

> Espero ter conseguido, desta vez, explicar meu problema.

   Desta vez, eu entendi tudinho, Adriano!
   Foi divertido ajudar.
   Espero que você se divirta também!

> 
> E tb uma coisa... Existe alguma diferenca entre usar $divide[$x] e @divide[$x] ? Pq
> eu testei isso e, ao menos no compilador q uso aki, deu o mesmo resultado....
> 

   Bom, vamos com calma.
   Certifique-se de que você tem uma diretriz

     use strict;
     use warnings;

   No topo de seu programa.

   Agora vamos ver a explicação:

   Quando você diz $divide[$x], está se referindo ao $x-ésimo ESCALAR 
(Exatamente UMA coisa) contido no ARRAY @divide.

   Quando você diz @divide[$x], está se referindo na verdade a um ARRAY 
de escalares (MUITAS coisas) que na pratica tem apenas o elemento de 
índice $x no ARRAY @divide.

   Para efeito de algorítmo, os dois praticamente tem o mesmo 
significado. Mas isso pode mudar MUITO se você não controlar MUITO BEM 
que valores $x pode assumir. Isso pode vir até mesmo a ser perigoso, 
dependendo do restante do seu programa.

   As boas práticas de programação Perl dizem que você deve usar '$' 
como prefixo sempre que se referir a uma variável contendo um escalar, e 
'@' sempre que se referir a uma variável contendo mais de um escalar 
(array).

   Exemplo:

   o array 'divide' (muitos elementos):

   @divide;

   o terceiro elemento do array divide (um elemento só):
   $divide[2];

   o terceiro, quarto e quinto elementos do array divide (muitos elementos):

   @divide[2,3,4];

   Os 5 últimos elementos do array divide (muitos elementos):

   @divide[-5, $#divide];

   Espero que isso deixe claro o que se pode fazer com ARRAYs e ESCALAREs.

   []'z!
-- 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
   Luis Campos de Carvalho is Computer Scientist,
   PerlMonk [SiteDocClan], Cascavel-pm Moderator,
   Unix Sys Admin && Certified Oracle DBA
   http://br.geocities.com/monsieur_champs/
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=




Mais detalhes sobre a lista de discussão Cascavel-pm