Debo decir que estoy empezando en esto y estoy un poco perdida, espero no hacer preguntas muy tontas (aunque creo que así será de todas formas).
Estoy empezando a hacer un script que tiene como finalidad tomar un archivo de nucleótidos en formato fasta y ordenarlos en una matriz. En realidad la idea es abrir el archivo, seleccionar los nucleótidos cambiar los nucleótidos por números (o caracteres como quieran llamarlo) que dé la ubicación de estos nucleótidos, de esta manera:
(el archivo en formato fasta tiene esta cara):
- Código: Seleccionar todo
>sequence1
ggg---gaag
>sequence2
ggg---gaag
>sequence3
gggcaggaag
>sequence4
ggg------g
>sequence5
ggggaacagg
Y yo transformo estas secuencias en esto (su ubicación):
- Código: Seleccionar todo
A1 A2 A3 A{3-4} A{3-4} A{3-4} A4 A5 A6 A7
B1 B2 B3 B{3-4} B{3-4} B{3-4} B4 B5 B6 B7
C1 C2 C3 C4 C5 C6 C7 C8 C9 C10
D1 D2 D3 D{3-4} D{3-4} D{3-4} D{3-4}D{3-4} D{3-4} D4
E1 E2 E3 E4 E5 E6 E7 E8 E9 E10
Por ejemplo: A1 en la primera línea corresponde a g de la primera secuencia, y A2 a la segunda g y así sucesivamente, y cuando hay un “-“ la idea es decir que esta ausencia de nucleótido está en A entre 3-4 por eso se marca “A{3-4}“ y se repite hasta que nos encontramos con otro nuevo nucleótido y se continua el conteo.
Bueno esto es para que entiendan un poquito lo que quiero hacer.
Tengo un script que hace lo que acabo de decirles; quizás no es lo más óptimo pero me resulta por lo menos jejejeje, si alguien tiene una idea de algo mejor. El script es el siguiente:
Using perl Syntax Highlighting
#!/usr/bin/perl -w
use strict;
#declaración de variables
my ($file, $data, $fastaHeader, $nameSeq, $Seq, $cpt, $substitute, $resultat, $fileName, @data, @substitute, $col, $numCols, @rowMatrix,@matrix, $numRows, $row, @resultat, $rowMatrix );
#función para borrar el fichero con los datos viejos
sub deleteResults {
$file="Results.txt";
unlink ($file);
}
#función para abrir el fichero
sub openFile {
open FD, "$fileName" or die "File not found\n";
@data=<FD>;
close FD;
}
#función para escribir en mi fichero de texto el nombre de la secuencia
sub changeData {
foreach $data (@data) { #para cada valor de @data lo guarda en $data
if ($data =~ /(>.*)/) { #si comienzo por '>', toma el carácter y todo lo que le sigue
$fastaHeader=$1; #guardar en la misma variable $fastaHeader
print $fastaHeader;#imprimir en la consola
open (FH, ">>Results.txt"); #crear el fichero resultado, si no existe (esto depende de la función deleteResult)
print FH $fastaHeader;#imprime en el fichero
close FH;
}
if ($data=~ />(.*)/) { # aquí tomo el título sin el '>' para guardar en mi fichero de texto la posición de las secuencias
$nameSeq=$1;
}
if ($data =~ /([atgc-]*)/) { #busco las secuencias
$Seq=$1;
print "$Seq\t"; #imprime en el fichero
open (FH, ">>Results.txt");#escribo en el fichero de resultados
print FH "$Seq\t"; #imprimo las secuencias en el fichero y bajo el título
close FH;
}
$cpt=0;# contador para las secuencias inicializado a cero
@substitute=split(//, $Seq);#tomo $seq y le divido en mi arreglo $substitute, las // sirven para tomar las secuencias y no los otros caracteres
foreach $substitute (@substitute){ #para cada element0 $substitute del arreglo @substitute...
if ($substitute =~ /([atgc])/) { #si este elemento corresponde a un atgc...
$cpt+=1; #comienzo mi contador a partir de 1 y siguientes 1+1=2+1=3+1...
$resultat=$nameSeq."-".$cpt."; "; #mi resultado = nombre de la secuencia+un guión+le contador+";" como esto: "sequence1-1;"
}
else {
if ($substitute =~ /([-])/) { #pero si encuentro un gap
$resultat=$nameSeq."-{".$cpt."-".($cpt+1)."}; "; #mi resultado = nombre secuencia+un guión+(contador+guión+contador+1)+";".
}
}
print $resultat;
open (FH, ">>Results.txt");# escribir en el fichero resultado los $resultat
print FH "$resultat\t"; #apuntar en el fichero de texto
close FH;
}
print "\n";#esto es para apuntar la segunda secuencia en la segunda línea para el segundo bucle
open (FH, ">>Results.txt");
print FH "\n";
close FH;
}
}
&deleteResults();
$fileName="Alignement1.txt";
&openFile();
&changeData();
use strict;
#declaración de variables
my ($file, $data, $fastaHeader, $nameSeq, $Seq, $cpt, $substitute, $resultat, $fileName, @data, @substitute, $col, $numCols, @rowMatrix,@matrix, $numRows, $row, @resultat, $rowMatrix );
#función para borrar el fichero con los datos viejos
sub deleteResults {
$file="Results.txt";
unlink ($file);
}
#función para abrir el fichero
sub openFile {
open FD, "$fileName" or die "File not found\n";
@data=<FD>;
close FD;
}
#función para escribir en mi fichero de texto el nombre de la secuencia
sub changeData {
foreach $data (@data) { #para cada valor de @data lo guarda en $data
if ($data =~ /(>.*)/) { #si comienzo por '>', toma el carácter y todo lo que le sigue
$fastaHeader=$1; #guardar en la misma variable $fastaHeader
print $fastaHeader;#imprimir en la consola
open (FH, ">>Results.txt"); #crear el fichero resultado, si no existe (esto depende de la función deleteResult)
print FH $fastaHeader;#imprime en el fichero
close FH;
}
if ($data=~ />(.*)/) { # aquí tomo el título sin el '>' para guardar en mi fichero de texto la posición de las secuencias
$nameSeq=$1;
}
if ($data =~ /([atgc-]*)/) { #busco las secuencias
$Seq=$1;
print "$Seq\t"; #imprime en el fichero
open (FH, ">>Results.txt");#escribo en el fichero de resultados
print FH "$Seq\t"; #imprimo las secuencias en el fichero y bajo el título
close FH;
}
$cpt=0;# contador para las secuencias inicializado a cero
@substitute=split(//, $Seq);#tomo $seq y le divido en mi arreglo $substitute, las // sirven para tomar las secuencias y no los otros caracteres
foreach $substitute (@substitute){ #para cada element0 $substitute del arreglo @substitute...
if ($substitute =~ /([atgc])/) { #si este elemento corresponde a un atgc...
$cpt+=1; #comienzo mi contador a partir de 1 y siguientes 1+1=2+1=3+1...
$resultat=$nameSeq."-".$cpt."; "; #mi resultado = nombre de la secuencia+un guión+le contador+";" como esto: "sequence1-1;"
}
else {
if ($substitute =~ /([-])/) { #pero si encuentro un gap
$resultat=$nameSeq."-{".$cpt."-".($cpt+1)."}; "; #mi resultado = nombre secuencia+un guión+(contador+guión+contador+1)+";".
}
}
print $resultat;
open (FH, ">>Results.txt");# escribir en el fichero resultado los $resultat
print FH "$resultat\t"; #apuntar en el fichero de texto
close FH;
}
print "\n";#esto es para apuntar la segunda secuencia en la segunda línea para el segundo bucle
open (FH, ">>Results.txt");
print FH "\n";
close FH;
}
}
&deleteResults();
$fileName="Alignement1.txt";
&openFile();
&changeData();
Coloreado en 0.007 segundos, usando GeSHi 1.0.8.4
Bueno, este script me da lo que les mostré, pero lo que quiero es poner esto en una matriz de 2 dimensiones para poner tener líneas y columnas, porque en este ejemplo les mostré 5 secuencias alineadas (5 secuencias 1 alineamiento) y lo que debo hacer es trabajar con varios alineamientos, ¡¡¡¡¡¡¡y compararlos!!!!!!!!.
Yo había pensado poner, después de obtener mi variable $resultat lo siguiente:
Using perl Syntax Highlighting
for ($col = 0; $col < $numCols; $col++) {
push @rowMatrix, "0";
}
for ($row = 0; $row < $numRows; $row++) {
push @resultat, [ @rowMatrix ];
print @rowMatrix ;
}
print "\n";
}
push @rowMatrix, "0";
}
for ($row = 0; $row < $numRows; $row++) {
push @resultat, [ @rowMatrix ];
print @rowMatrix ;
}
print "\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Pero claro. que no me resulta y por eso mi presencia acá. A lo mejor ni siquiera es una buena idea, pero es que no sé qué hacer ¡¡¡¡y ya estoy volviéndome loca!!!! Seguramente es algo simple, pero yo solo conozco Perl desde hace poco.
Perdón lo largo de mi post pero quería ser lo mas clara posible.
Espero que alguien me pueda ayudar.
¡¡¡¡¡Muchas gracias de antemano!!!!!
P.D.: Ah. lo olvidaba perdón por poner los comentarios, pero están en francés; es que estudio acá en Francia.