#!/usr/bin/perl -w use strict; my @matriz; my %ft; #############lectura del archivo de matrices############### open(MATRIX, " <$ARGV[0]"); my $n; my @A; my @C; my @G; my @T; my $i=0; my $xxx = 0; my $nom; while (){ @matriz= split (/[\t\s]+/,$_);######ponemos cada linea en un vector######### if ($matriz[0] eq "FA"){######lectura de la linea del nombre######### $nom = $matriz[1]; # print "$nom \n"; $xxx = 1; } if ($matriz[0]=~m/^\d+/){########lectura de la lineas de datos########## $A[$i]=$matriz[1]; $C[$i]=$matriz[2]; $G[$i]=$matriz[3]; $T[$i]=$matriz[4]; $i=$i+1; } if ($matriz[0] eq "//" && $xxx==1 && scalar(@matriz)==1){ $n = 0; while ($n < scalar (@A)){ $ft{"A"}[$n] = $A[$n]; $n=$n+1; } $n = 0; while ($n < scalar (@C)){ $ft{"C"}[$n] = $C[$n]; $n=$n+1; } $n = 0; while ($n < scalar (@G)){ $ft{"G"}[$n] = $G[$n]; $n=$n+1; } $n = 0; while ($n < scalar (@T)){ $ft{"T"}[$n] = $T[$n]; $n=$n+1; } #########creacion del hash########## my %ft = ("A" => [@A], "C" => [@C], "G" => [@G], "T" => [@T]); my $m = keys(%ft); my @k = keys(%ft); my $s = 0; my $a = 0; my $j; my $log; my $nur=""; ##########lectura de las secuencias promotoras######## open(SEQ, " <$ARGV[1]"); while (){ chomp; if (/\>/){ next; } s/a/A/g; s/c/C/g; s/g/G/g; s/t/T/g; $nur = $nur.$_;########todas las lineas de las secuencias promotoras en una variable singular######## } close (SEQ); my $x = 0; my @va; #vector con todas las A de la secuencia; my $pa; #proporcion de A en la secuencia; my @vt; #vector con todas las T de la secuencia; my $pt; #proporcion de T en la secuencia; my @vc; #vector con todas las C de la secuencia; my $pc; #proporcion de C en la secuencia; my @vg; #vector con todas las G de la secuencia; my $pg; #proporcion de G en la secuencia; my $l = length ($nur); #longitud de la secuencia; #########contar el numero de nucleotidos de cada tipo dentro de la secuencia############ while ($x < $l){ @va = ($nur=~m/[aA]/g); @vt = ($nur=~m/[tT]/g); @vc = ($nur=~m/[cC]/g); @vg = ($nur=~m/[gG]/g); $x=$x+1; } $pa = (scalar (@va)/$l); $pt = (scalar (@vt)/$l); $pc = (scalar (@vc)/$l); $pg = (scalar (@vg)/$l); my @mar; @mar=($pa,$pc,$pg,$pt); #########suma del numero total de secuencias utilizadas para crear las matrices############ my $sum=0; my $total=0; my $ss=0; while ($ss < scalar (@k)){ $sum= $ft{$k[$ss]}[0]; $total=$total+$sum; $ss=$ss+1; } ###########generacion de la matriz de pesos############### while ($s < $m){ $j = 0; # print $k[$s]; while ($j < scalar (@A)) { if ($ft{$k[$s]}[$j] == 0){ $ft{$k[$s]}[$j]= -999; } else { $ft{$k[$s]}[$j]= (log (($ft{$k[$s]}[$j]/$total))/log(10)) - (log($mar[$s])/log(10)); } # print "\t$ft{$k[$s]}[$j]"; $j = $j + 1; } # print "\n"; $s= $s + 1; } #############calculo del score en la secuencia promotora############## my $noi=0; #posiciones dentro de la secuencia, recorre; my $score = -99999999999; my $h=0; my @per = split (//,$nur); my @secu; my $suma = 0; my $posmej=-100; while ($noi < $l - scalar(@A)){ my @ventana = (); my $f = 0; while ($f < scalar(@A)){ $ventana[$f] = $per[$noi + $f]; $h = ${$ft{$ventana[$f]}}[$f]; $suma = $suma + $h; $f=$f+1; } if ($suma > $score){ $score = $suma; @secu = @ventana; $posmej = $noi; } $noi=$noi+1; $suma=0; } # print "La mejor posicion es $posmej para la secuencia @secu que tiene un s* de $score \n"; ##############generacion de la secuencia aleatoria################## my $cuenta=0; my $cien=0; my $sumaa = 0; my @aleat = (); while ($cien<101) { @aleat = @per; my $nn = scalar(@per); my $ii = $nn - 1; while ($ii >= 0) { my $jj = int(rand($ii+1)); if ($ii != $jj) { my $tmp = $per[$ii]; $aleat[$ii] = $per[$jj]; $aleat[$jj] = $tmp; } $ii = $ii - 1; } #############calculo del score en la secuencia aleatoria############## my $noii=0; #posiciones dentro de la secuencia, recorre; my $scoree = -99999999999; my @secuu; my $posmejj=-100; my $hh=0; while ($noii < $l - scalar(@A)){ my @ventanaa = (); my $ff = 0; while ($ff < scalar(@A)){ $ventanaa[$ff] = $aleat[$noii + $ff]; $hh = ${$ft{$ventanaa[$ff]}}[$ff]; $sumaa = $sumaa + $hh; $ff=$ff+1; } if ($sumaa > $scoree){ $scoree = $sumaa; } $noii=$noii+1; $sumaa=0; } ###############comparacion del score de la secuencia promotora y el score de la secuencia aleatoria################# if($scoree >= $score) { $cuenta = $cuenta+1; } $cien = $cien+1; } print "La mejor posicion para el factor de transcripcion $nom es $posmej con un s* de $score y un p-value de ", $cuenta/100, "\n"; $i=0; @A =(); @C= (); @G= (); @T= (); } } close (MATRIX);