use strict; my @bases; my @list; my @List; my %oligo = (); my %pos = (); my $base; my $list; my $f; my $nomefile; my $line; my $piece; my $query; my $len; my $sequenza; my $i; my $j; my $rev; my $revcomp; my $oligo; my $length = length($sequenza); my $piececomp; print("Insert query:\n"); $query = ; chomp($query); $len = length($query); $query = uc $query; @bases = qw(A G C T); #bases @list = qw(A G C T); #seed for ($i = 0; $i < ($len - 1); $i++) { foreach $base (@bases) { foreach $list (@list) { $oligo{$base.$list} = 1; } @List = keys %oligo; } @list = keys %oligo; %oligo = (); #print "@list xxx \n"; } %oligo = (); @List = sort @List; $nomefile = $ARGV[0]; open $f, "< $nomefile" or die "cannot open $nomefile: $!"; $line = <$f>; chomp($line); if(substr($line,0,1) ne ">") { print STDERR ("Input file $nomefile not in FASTA format\n"); exit; } $sequenza = <$f>; while($line = <$f>) { chomp($line); if(substr($line, 0, 1) ne ">") { $sequenza = $sequenza.$line; } } $sequenza = uc $sequenza; for($i = 0; $i < length($sequenza) - ($len - 1); $i++) # nell'ultimo frame di lettura non deve contare la len intera se no va 'fuori sequenza' e non trova l'oligo corrispondente { $piece = substr($sequenza, $i, $len); if(exists $oligo{$piece}) { $oligo{$piece} = $oligo{$piece} + 1; push(@{$pos{$piece}} , $i ); } else { $oligo{$piece} = 1; push(@{$pos{$piece}} , $i ); } } foreach $piece (sort keys %oligo) { print("$piece\t$oligo{$piece}\t@{$pos{$piece}}\n\n"); } $rev= reverse $query; $rev=~ tr/ACTG/TGAC/; $revcomp = $rev; for($j = $length; $j < $length - $len; $j--) { $revcomp = substr($sequenza, $j, $len); if(exists $oligo{$revcomp}) { push(@{$pos{$revcomp}} , ($length - $j) - ($len - 1)); } } if(exists $oligo{$query} && !exists $oligo{$revcomp}) { print("$query\t compare $oligo{$query} volte\t in posizione @{$pos{$query}} solo sul filamento positivo\n"); } else { if(exists $oligo{$query} && exists $oligo{$revcomp}) { print("$query\t compare $oligo{$query} volte\t in posizione @{$pos{$query}} sul filamento positivo\n\ne compare $oligo{$revcomp} volte\t in posizione @{$pos{$revcomp}}\t sul filamento negativo\n"); } else { if(!exists $oligo{$query} && exists $oligo{$revcomp}) { print("$query compare $oligo{$revcomp} volte\t in posizione @{$pos{$revcomp}}\t sul filamento negativo\n"); } else { print("$query non compare nella sequenza\n"); } } }