Por favor, requiero su ayuda con esto de Perl, esta es mi duda:
Mi script debe básicamente rescatar algunas partes de este archivo de entrada y ponerlos en uno nuevo con un orden especifico, lo que ya conseguí =D. Mi problema empieza cuando requiero contar el número de veces que una variable tiene el mismo valor o significado, o sea, que el número de átomos (líneas) que tiene cada aminoácido ($temp).
Debo considerar solo las líneas que empiezan con ATOM, luego debería contar hasta que el número del aminoácido cambiara al siguiente. Por ejemplo, el aminoácido 84 (corresponde a la 5ª columna) debería tener 7 átomos (el 84 aparece 7 veces), el aminoácido 86 debería tener 8, etc. Lo que hice fue asignar una variable al número del aminoácido ($temp), entonces la idea es que cuando este número cambie, la cuenta pare y empiece otra vez con el siguiente aminoácido.
Intenté poner en un hash todos los números de los aminoácidos, o sea la variable $temp, pero en los ejemplos que encontré el hash era definido solo con elementos, o sea : 84, 85, 86, etc. y no me servía porque tengo como 300 aminoácidos. Mi otro problema es que los ejemplos que vi siempre indicaban que el conteo paraba cuando la variable (en mi caso $temp) fuera mayor o menor a un número, y en mi caso requiero que el número de aminoácidos sea considerado como una palabra y el conteo pare cuando la palabra sea cambiada por otra.
Ojalá no este muy enredado para entender.
Este es parte de mi input:
- Código: Seleccionar todo
HEADER VIRAL PROTEIN/IMMUNE SYSTEM 23-SEP-05 2B4C
TITLE CRYSTAL STRUCTURE OF HIV-1 JR-FL GP120 CORE PROTEIN
TITLE 2 CONTAINING THE THIRD VARIABLE REGION (V3) COMPLEXED WITH
TITLE 3 CD4 AND THE X5 ANTIBODY
COMPND MOL_ID: 1;
COMPND 2 MOLECULE: ENVELOPE GLYCOPROTEIN;
ATOM 1 N VAL G 84 83.090-158.764 98.727 1.00133.29 N
ATOM 2 CA VAL G 84 84.569-158.842 98.897 1.00133.95 C
ATOM 3 C VAL G 84 85.258-158.165 97.714 1.00134.16 C
ATOM 4 O VAL G 84 85.855-158.828 96.866 1.00134.41 O
ATOM 5 CB VAL G 84 85.039-160.312 98.978 1.00134.07 C
ATOM 6 CG1 VAL G 84 86.507-160.372 99.373 1.00134.72 C
ATOM 7 CG2 VAL G 84 84.181-161.078 99.974 1.00132.76 C
ATOM 8 N VAL G 85 85.169-156.839 97.667 1.00134.17 N
ATOM 9 CA VAL G 85 85.767-156.061 96.587 1.00133.97 C
ATOM 10 C VAL G 85 87.243-155.768 96.832 1.00134.16 C
ATOM 11 O VAL G 85 87.711-155.788 97.971 1.00134.47 O
ATOM 12 CB VAL G 85 85.026-154.715 96.401 1.00133.69 C
ATOM 13 CG1 VAL G 85 85.141-153.883 97.666 1.00133.08 C
ATOM 14 CG2 VAL G 85 85.601-153.958 95.213 1.00133.51 C
ATOM 15 N LEU G 86 87.971-155.505 95.751 1.00134.10 N
ATOM 16 CA LEU G 86 89.392-155.192 95.827 1.00134.30 C
ATOM 17 C LEU G 86 89.724-154.045 94.874 1.00134.27 C
ATOM 18 O LEU G 86 90.077-154.264 93.714 1.00134.21 O
ATOM 19 CB LEU G 86 90.235-156.426 95.483 1.00134.49 C
ATOM 20 CG LEU G 86 90.134-157.616 96.446 1.00134.44 C
ATOM 21 CD1 LEU G 86 88.803-158.331 96.264 1.00134.35 C
ATOM 22 CD2 LEU G 86 91.277-158.581 96.183 1.00134.28 C
ATOM 23 N GLU G 87 89.663-152.780 95.269 1.00136.00 N
ATOM 24 CA GLU G 87 89.975-151.658 94.374 1.00136.69 C
ATOM 25 C GLU G 87 91.472-151.398 94.342 1.00137.59 C
Acá va mi script:
Using perl Syntax Highlighting
print "Enter PDB file name :";
$filename = <STDIN>;
chomp $filename;
unless(open (FILE,$filename)){ print "\n\nFile non found!!!\n\n";}
#open (FILE2,">out");
$i=0;
$count=0;
@pdb=<FILE>;
close FILE;
foreach $line (@pdb){
if ($line=~/^TITLE/){
chomp $line;
print "$line\n"; }
if ($line=~/^.*\ 2 RESOLUTION\.*/){
#print "$line";
$res=substr($line,11,25);
print "\n$res\n";
}
if ($line=~/^HEADER/){
chomp $line;
$date=substr($line,50,10);
print "\nDEPOSIT DATE: $date\n\n";
}
if ($line=~/^ATOM.*\ CA \.*/){
# print "$line";
chomp $line;
$chain=substr($line,20,3);
# print "\n$chain";
$aa=substr($line,17,4);
$naa=substr($line,23,3);
}
#Aca viene la parte del conteo de atomos por aminoacido donde ando perdida
if ($line=~/^ATOM/){
$temp=substr($line,23,3);
while($temp==$temp[$i]){ #quise decir que mientras $temp sea la misma que aumente el conteo
$count{$temp}++;
#print "$count"}
}
$col=("$chain" . "$aa" . "$naa" . "$count\n"); #mi output deberia ser asi, de manera que lo que me ha tomado todo el dia es el valor de la ultima columna
print "$col\n";
}
exit;
$filename = <STDIN>;
chomp $filename;
unless(open (FILE,$filename)){ print "\n\nFile non found!!!\n\n";}
#open (FILE2,">out");
$i=0;
$count=0;
@pdb=<FILE>;
close FILE;
foreach $line (@pdb){
if ($line=~/^TITLE/){
chomp $line;
print "$line\n"; }
if ($line=~/^.*\ 2 RESOLUTION\.*/){
#print "$line";
$res=substr($line,11,25);
print "\n$res\n";
}
if ($line=~/^HEADER/){
chomp $line;
$date=substr($line,50,10);
print "\nDEPOSIT DATE: $date\n\n";
}
if ($line=~/^ATOM.*\ CA \.*/){
# print "$line";
chomp $line;
$chain=substr($line,20,3);
# print "\n$chain";
$aa=substr($line,17,4);
$naa=substr($line,23,3);
}
#Aca viene la parte del conteo de atomos por aminoacido donde ando perdida
if ($line=~/^ATOM/){
$temp=substr($line,23,3);
while($temp==$temp[$i]){ #quise decir que mientras $temp sea la misma que aumente el conteo
$count{$temp}++;
#print "$count"}
}
$col=("$chain" . "$aa" . "$naa" . "$count\n"); #mi output deberia ser asi, de manera que lo que me ha tomado todo el dia es el valor de la ultima columna
print "$col\n";
}
exit;
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
Mi ouput debería ser algo así:
- Código: Seleccionar todo
TITLE CRYSTAL STRUCTURE OF HIV-1 JR-FL GP120 CORE PROTEIN
TITLE 2 CONTAINING THE THIRD VARIABLE REGION (V3) COMPLEXED WITH
TITLE 3 CD4 AND THE X5 ANTIBODY
RESOLUTION. 3.30 ANGSTROMS
DEPOSIT DATE 23 SEP 05
G VAL-84 7
G VAL-85 7
G LEU-86 8
Por favor, alguna idea que me ayude será muy agradecida,
Andrea