Mi problema es el siguiente:
Tengo que medir la calidad de un conjunto de PDB. En palabras simples, tengo que obtener el porcentaje de completitud de cada uno y corroborar si la numeración de los ATOM es consistente con la numeración del SEQRES.
Concretamente la tarea solicita construir dos subrutinas, una que traduzca los aminoácidos de tres letras a una letra, y otra subrutina que realice la reconstrucción de la proteína a partir de los ATOM, para obtener la completitud y la consistencia.
Con los requerimientos no he tenido problemas, pero al momento de ejecutar me aparece el típico warning "Use of uninitialized value in string eq at", pero resulta que yo he revisado por todos lados el arreglo y no tiene ningún valor nulo.
Sinceramente ya es algo que se me escapa de las manos. Por eso acudí al foro. Aquí adjunto el código que tengo hasta el momento, por si alguien me pudiese echar una mano
De antemano, ¡gracias!
Using perl Syntax Highlighting
- #!/usr/bin/perl
- use strict;
- use warnings;
- my %code=(
- 'ALA' => 'A',
- 'ASX' => 'B',
- 'CYS' => 'C',
- 'ASP' => 'D',
- 'GLU' => 'E',
- 'PHE' => 'F',
- 'GLY' => 'G',
- 'HIS' => 'H',
- 'ILE' => 'I',
- 'LYS' => 'K',
- 'LEU' => 'L',
- 'MET' => 'M',
- 'ASN' => 'N',
- 'PRO' => 'P',
- 'GLN' => 'Q',
- 'ARG' => 'R',
- 'SER' => 'S',
- 'THR' => 'T',
- 'VAL' => 'V',
- 'TRP' => 'W',
- 'XXX' => 'X',
- 'TYR' => 'Y',
- 'GLX' => 'Z',
- 'SEC' => 'U',
- 'PYL' => 'O',
- 'MSE' => 'M',
- 'AGM' => 'R',
- 'MNG' => 'Q',
- 'GL3' => 'G',
- 'SMC' => 'C',
- 'CMT' => 'C',
- 'CSO' => 'C',
- 'TPO' => 'T',
- 'TPR' => 'Y',
- 'ACE' => 'X',
- 'SEP' => 'S',
- 'MHO' => 'M',
- '...' => '.',
- 'END' => '*'
- );
- opendir(my $dh, "/home/Diego/Universidad/bio2/tarea_pdbs/kinasas") || die "Error: can't opendir";
- open(RES, ">res.csv");
- my @osqr;
- #while(readdir $dh) {
- my @pdb= ();
- my @tsqr;
- my $file = "1A06.pdb";#$_;
- open (PRO, "<$file") || die "Error"; #, "/home/Diego/Universidad/bio2/tarea_pdbs/kinasas/$file") || die "Error: can't open file $file\n";
- while(my $line = <PRO>){
- push(@pdb, $line);
- }
- close (PRO);
- my @seqres=grep(/^SEQRES/, @pdb);
- my @atoms = grep(/^ATOM/, @pdb);
- foreach my $line (@seqres){
- my @tmp= split(/\s+/, substr($line, 19, 51));
- push(@tsqr,@tmp);
- }
- @osqr=translate(@tsqr);
- rebuild(@atoms);
- #}
- close(RES);
- # subrutina que traduce aminoácidos de 3 letras a 1 letra
- sub translate{
- my @tseq= @_;
- my @oseq;
- my $i=0;
- foreach my $res (@tseq){
- foreach my $key (keys %code)
- {
- if($res eq $key){
- $oseq[$i]= $code{$key};
- $i++;
- }
- }
- }
- return @oseq;
- }
- # subrutina que reconstruye la proteína con los aminoácidos de ATOM, tomando como referencia seqres
- sub rebuild{
- my @atoms = @_;
- my @tstruct_seq=();
- my @ostruct_seq=();my @rebuild=();my @pos=();
- my $i=0;my $j=0;my $check=0;my $cont=0;
- my $tmp1;my $tmp2;
- #obtener el aminoácido del carbono alfa y su posición, a partir de ATOM.
- foreach my $atom(@atoms){
- if($atom =~m/CA/){
- my @tmp= split(/\s+/,$atom);
- $tstruct_seq[$i]=$tmp[3];
- $pos[$i]=$tmp[5];
- $i++;
- }
- }
- #traducir de proteína de código de 3 letras a 1 letra.
- @ostruct_seq = translate(@tstruct_seq);
- $i=0;
- $j=0;
- #reconstruir la proteína con los aminoácidos de ATOM, tomando como referencia seqres
- while($i<@ostruct_seq){
- while($ostruct_seq[$i] ne $osqr[$j]){
- unless(defined($rebuild[$j])){
- $rebuild[$j]= 'X';
- $j++;
- }
- }
- $tmp1=$i;
- $tmp2=$j;
- $cont=0;
- while($ostruct_seq[$tmp1] eq $osqr[$tmp2]){
- $tmp1++;
- $tmp2++;
- $cont++;
- }
- if($cont>3){
- while($ostruct_seq[$i] eq $osqr[$j]){
- $rebuild[$j]=$ostruct_seq[$i];
- $i++;
- $j++;
- }
- }
- else{
- $tmp1=$i;
- $tmp2=$j;
- while($ostruct_seq[$tmp1] eq $osqr[$tmp2]){
- $rebuild[$j]='X';
- $tmp1++;
- $tmp2++;
- }
- $j++;
- }
- }
- #si la estructura no está completa hasta el final de la proteína, se rellena con X
- if($j<@osqr){
- while($j<@osqr){
- $rebuild[$j] = 'X';
- $j++;
- }
- }
- #comprobar que las posiciones de ATOM coinciden con las de seqres
- $j=0;
- for(my $i=0; $i < @rebuild; $i++){
- next if($rebuild[$i] eq 'X');
- my $tmp=$i+1;
- if($tmp == $pos[$j]){
- $check++;
- }
- $j++;
- }
- print "\nPorcentaje de completitud: ".((@ostruct_seq / @osqr)*100)." %\n";
- if( $check == @ostruct_seq){
- print "La proteína tiene consistencia en la numeración.\n\n";
- }
- }
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4