我必须找到简单的序列重复,并且必须存储每个独特的重复以及它们的位置。我已经编写了一个perl代码来做到这一点(它确实有大量的if和for for,用于查找重复到pentamers)。我的问题是,是否有一些更简单的方法在java中执行此操作,例如一些正则表达式或搜索字符串的内容并返回连续重复和位置的计数,这不涉及许多控制语句和迭代。< / p>
更新:简单的序列重复(SSR)只是一个不间断的重复字符串,从二聚体开始(即两个不同的字符一起重复)。就像一个单词在一个句子中连续不断地重复。对于DNA,它看起来像
AATTAAAATTTTAAAAAAAAGGGCCCTTTAA[ATATATATATATAT]AAGGGATTTAAGGAATTAAGA[TGATGATGATGATGA]TGGTAG
这里AT和TGA是简单的序列重复,AT是二聚体,TGA是三聚体。 我要找的是序列重复的起始位置,重复的次数(即长度)和它的序列(即AT例如从位置6开始,重复10次,TGA是从第25位开始,依此类推)
我的perl代码:(并且它有点儿错误)
my $i=0;
my $j=0;
my $dna;
my $m2=0;
my $m4=0;
my $m3=0;
my $m5=0;
my $temp1;
my $temp2;
my $min;
print "Please enter DNA sequence : ";
$dna=<>;
my $firstdi;
my $seconddi;
my $thirddi;
my $fourthdi;
my $fifthtet;
my $firsttet;
my $secondtet;
my $thirdtet;
my $fourthtet;
my $fifthtet;
my $firsttri;
my $secondtri;
my $thirdtri;
my $fourttri;
my $fifthtri;
my $firstpent;
my $secondpent;
my $thirdpent;
my $fourtpent;
my $fifthpent;
print "\n";
print "Please enter the length to search for : ";
$motif=<>;
print "\n";
print "Please enter the minimum number of motif repeats : " ;
$min=<>;
chomp($dna);
chomp($motif);
chomp($min);
my @output;
my @codearr = split //, $dna;
print "\n";print @codearr;print "\n";
my $arrsize=@codearr;
print "\nSize : ";
print "\n";print $arrsize; print "\n";
print "Output : ";
my $total=0;
if($motif==2)
{
for($i=0;$i<($arrsize-2);$i=$i+$motif)
{
if($codearr[$i] ne $codearr[$i+1])
{
$temp1 = join( "",$codearr[$i],$codearr[$i+1]);
$temp2 = join( "",$codearr[$i+2],$codearr[$i+3]);
if($temp1 eq $temp2)
{
if($m2==0)
{
$ms1=$i;
}
$total++;
$m2++;
}
}
}
}
if($motif==3)
{
for($i=0;$i<($arrsize-2);$i=$i+$motif)
{if($codearr[$i] ne $codearr[$i+1])
{
$temp1 = join( "",$codearr[$i],$codearr[$i+1]);
$temp2 = join( "",$codearr[$i+2],$codearr[$i+3]);
if($temp1 eq $temp2)
{
if($m2==0)
{
$ms1=$i;
}
$m2++;
$total++;
}
}
}
for($i=0;$i<($arrsize-3);$i=$i+$motif)
{if($codearr[$i] ne $codearr[$i+1])
{
$temp1 = join( "",$codearr[$i],$codearr[$i+1],$codearr[$i+2]);
$temp2 = join( "",$codearr[$i+3],$codearr[$i+4],$codearr[$i+5]);
if($temp1 eq $temp2)
{
if($m3==0)
{
$ms3=$i;
}
$m3++;
$total++;
}
}
}
}
if($motif==4)
{
for($i=0;$i<($arrsize-2);$i=$i+$motif)
{
if($codearr[$i] ne $codearr[$i+1])
{
$temp1 = join( "",$codearr[$i],$codearr[$i+1]);
$temp2 = join( "",$codearr[$i+2],$codearr[$i+3]);
if($temp1 eq $temp2)
{
if($m2==0)
{
$ms1=$i;
}
$m2++;
$total++;
}
}
}
for($i=0;$i<($arrsize-3);$i=$i+$motif)
{
if($codearr[$i] ne $codearr[$i+1])
{
$temp1 = join( "",$codearr[$i],$codearr[$i+1],$codearr[$i+2]);
$temp2 = join( "",$codearr[$i+3],$codearr[$i+4],$codearr[$i+5]);
if($temp1 eq $temp2)
{
if($m3==0)
{
$ms3=$i;
}
$m3++;
$total++;
}
}
}
for($i=0;$i<($arrsize-4);$i=$i+$motif)
{
if($codearr[$i] ne $codearr[$i+1])
{
$temp1 = join( "",$codearr[$i],$codearr[$i+1],$codearr[$i+2],$codearr[$i+3]);
$temp2 = join( "",$codearr[$i+4],$codearr[$i+5],$codearr[$i+6],$codearr[$i+7]);
if($temp1 eq $temp2)
{
if($m4==0)
{
$ms4=$i;
}
$m4++;
$total++;
}
}
}
}
if($motif==5)
{
for($i=0;$i<($arrsize-2);$i=$i+$motif)
{if($codearr[$i] ne $codearr[$i+1])
{
$temp1 = join( "",$codearr[$i],$codearr[$i+1]);
$temp2 = join( "",$codearr[$i+2],$codearr[$i+3]);
if($temp1 eq $temp2)
{
if($m2==0)
{
$ms1=$i;
}
$total++;
$m2++;
}
} }
for($i=0;$i<($arrsize-3);$i=$i+$motif)
{
if($codearr[$i] ne $codearr[$i+1])
{
$temp1 = join( "",$codearr[$i],$codearr[$i+1],$codearr[$i+2]);
$temp2 = join( "",$codearr[$i+3],$codearr[$i+4],$codearr[$i+5]);
if($temp1 eq $temp2)
{
if($m3==0)
{
$ms3=$i;
}
$total++;
$m3++;
}
}
}
for($i=0;$i<($arrsize-4);$i=$i+$motif)
{
if($codearr[$i] ne $codearr[$i+1])
{
$temp1 = join( "",$codearr[$i],$codearr[$i+1],$codearr[$i+2],$codearr[$i+3]);
$temp2 = join( "",$codearr[$i+4],$codearr[$i+5],$codearr[$i+6],$codearr[$i+7]);
if($temp1 eq $temp2)
{
if($m4==0)
{
$ms4=$i;
}
$total++;
$m4++;
}
}
}
for($i=0;$i<($arrsize-5);$i=$i+$motif)
{if($codearr[$i] ne $codearr[$i+1])
{
$temp1 = join( "",$codearr[$i],$codearr[$i+1],$codearr[$i+2],$codearr[$i+3],$codearr[$i+4]);
$temp2 = join( "",$codearr[$i+5],$codearr[$i+6],$codearr[$i+7],$codearr[$i+8],$codearr[$i+9]);
if($temp1 eq $temp2)
{
if($m5==0)
{
$ms5=$i;
}
$total++;
$m5++;
}
}
}
}
if($motif==2)
{
if($min<$total)
{
print"Number of Dimer repeats : ";
print $m2;
print"\n";
print"First position : ";
print $ms1;
print "\n";
print "Sequence Lenght : ";
print $arrsize;
print "\n";
}
else
{
print "No or less than minimum SSRs found";}
}
if($motif==3)
{
if($min<$total)
{
print"Number of Dimer repeats : ";
print $m2;
print"\n";
print"First position : ";
print $ms1;
print "\n";
print "Sequence Lenght : ";
print $arrsize;
print "\n";
print"Number of Trimer repeats : ";
print $m3;
print"\n";
print"First position : ";
print $ms3;
print "\n";
print "Sequence Lenght : ";
print $arrsize;
print "\n";
}
else
{
print "No or less than minimum SSRs found";}
}
if($motif==4)
{
if($min<$total)
{
print"Number of Dimer repeats : ";
print $m2;
print"\n";
print"First position : ";
print $ms1;
print "\n";
print "Sequence Lenght : ";
print $arrsize;
print "\n";
print"Number of Trimer repeats : ";
print $m3;
print"\n";
print"First position : ";
print $ms3;
print "\n";
print "Sequence Lenght : ";
print $arrsize;
print "\n";
print"Number of Tetramer repeats : ";
print $m4;
print"\n";
print"First position : ";
print $ms4;
print "\n";
print "Sequence Lenght : ";
print $arrsize;
print "\n";
}
else
{
print "No or less than minimum SSRs found";}
}
if($motif==5)
{
if($min<$total)
{
print"Number of Dimer repeats : ";
print $m2;
print"\n";
print"First position : ";
print $ms1;
print "\n";
print "Sequence Lenght : ";
print $arrsize;
print "\n";
print"Number of Trimer repeats : ";
print $m3;
print"\n";
print"First position : ";
print $ms3;
print "\n";
print "Sequence Lenght : ";
print $arrsize;
print "\n";
print"Number of Tetramer repeats : ";
print $m4;
print"\n";
print"First position : ";
print $ms4;
print "\n";
print "Sequence Lenght : ";
print $arrsize;
print "\n";
print"Number of Pentamer repeats : ";
print $m5;
print"\n";
print"First position : ";
print $ms5;
print "\n";
print "Sequence Lenght : ";
print $arrsize;
print "\n";
}
else
{
print "No or less than minimum SSRs found";}
}
答案 0 :(得分:2)
像正则表达式这样的东西可以帮助你开始这适用于你在问题中陈述的“二聚体”,并且可以扩展以找到更长的序列。
String s = "AATTAAAATTTTAAAAAAAAGGGCCCTTTAAATATATATATATATAAGGGATTTAAGGAATTAAGATGATGATGATGATGATGGTAG";
Pattern pattern = Pattern.compile("([ATGC][ATGC])\\1+");
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
System.out.print("Start index: " + matcher.start());
System.out.print(" End index: " + matcher.end());
System.out.println(" Found: " + matcher.group());
}
这给出了一个输出:
Start index: 4 End index: 8 Found: AAAA
Start index: 8 End index: 12 Found: TTTT
Start index: 12 End index: 20 Found: AAAAAAAA
Start index: 31 End index: 45 Found: ATATATATATATAT
lexing库可能实际上可以帮助您,因为您可以使用这些正则表达式构建状态机,这有助于识别更复杂的模式。看看JLex。
修改强> 你说AA并不算作一种模式,而且它们必须是不同的角色。 您可以尝试使用this regex:
Pattern pattern = Pattern.compile("(?:([ATGC])(?!\\1)([ATGC])\\1\\2)+");
这有一个先行断言,确保它不匹配相同的字符。
答案 1 :(得分:0)
这看起来很像LZ。看一看,它可能对你有帮助:
此处显示了编码算法的高级视图:
初始化字典以包含长度为1的所有字符串 在字典中找到与当前输入匹配的最长字符串W. 发出W的字典索引以输出并从输入中删除W. 添加W后跟字典输入中的下一个符号 转到第2步。
http://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Welch
您还可以使用修改过的Trie,其中单词指示也会存储重复次数。