0

シンプルなシーケンスの繰り返しを見つけて、それぞれの一意の繰り返しをその位置とともに保存する必要があります。私はすでにそれを行うためのperlコードを書いています(五量体までの繰り返しを見つけるためのifとforがたくさんあります)。私の質問は、Javaでこれを行う簡単な方法はありますか?

更新: シンプル シーケンス リピート (SSR) は、二量体 (つまり、2 つの異なる文字が一緒に繰り返される) から始まる、途切れることなく繰り返される文字列です。それは、言葉が文章の中で途切れることなく繰り返されているようなものです。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";}
}
4

2 に答える 2

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 はパターンとしてカウントされず、異なる文字でなければならないと言いました。代わりにこの正規表現を試すことができます:

Pattern pattern = Pattern.compile("(?:([ATGC])(?!\\1)([ATGC])\\1\\2)+");

これには、同じ文字に一致しないことを保証する先読みアサーションがあります。

于 2014-05-09T06:20:19.717 に答える
0

これはLZによく似ています。見てください、それはあなたを助けるかもしれません:

エンコード アルゴリズムの概要を次に示します。

長さ 1 のすべての文字列を含むように辞書を初期化します。
現在の入力に一致する辞書で最長の文字列 W を見つけます。
W の辞書インデックスを発行して出力し、入力から W を削除します。
ディクショナリへの入力の次の記号が続く W を追加します。
ステップ 2 に進みます。

http://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93ウェルチ

修正された Trie を使用することもできます。この場合、単語の表示には繰り返し回数も格納されます。

http://en.wikipedia.org/wiki/Trie

于 2014-05-09T06:34:31.760 に答える