文字列形式の (DNA) ゲノム シーケンスの 1 本の鎖から重複するすべての ORF を分離しようとしています (ゲノムの開始 (i) と終了 (j) 位置、および ORF の長さ (l) を含む)。ORF は ATG で始まり、少なくとも 24 個の内部ヌクレオチド [ACGT] を持ち、(TAA|TAG|TGA) で終わる必要があります。
perl 正規表現を使用して 45 塩基の最小サイズの ORFを検索することで、この正規表現が機能しない理由を考えました (微調整が必要でした)。
my $genome = $_[0];
my $ATG_count = 0;
my $ORF_count = 0;
my @i = ();
my @j = ();
my @l = ();
my @frames = ();
while ($genome =~ m/ATG/ig) { ### I need to do this to find every ORF starting with ATG, including ORFs which are located inside other ORFs.
$ATG_count++;
my $start = $-[0]+1;
foreach (substr($genome,$-[0]) =~ m/^ATG(?:[ATGC]{3}){8,}(?:TAA|TAG|TGA)/ig) {
my $length = $+[0];
if ($length%3 == 0) { ### I need to do this because sadly, the above regex DOESN'T recover only Strings are dividable by 3. (Why not?!?)
my $stop = $start+$length;
my $readingframe = ($start%3);
push(@i, $start), push(@j, $stop), push(@l, $length), push (@frames, $readingframe);
$ORF_count++;
}
}
}
さて、上記のコードは、ATG で始まり、(TAA|TAG|TGA) で終わり、>=30 である ORF を回復します - 私はそれを試しました - しかし、回復した ORF には内部停止コドンがあります!
私の質問は、回復した ORF を ATG の後の最初の停止コドンで停止させるにはどうすればよいですか? 私の正規表現の中間部分から (TAA|TAG|TGA) を除外することが1つの可能性だと思います->(?:[ATGC]{3}){8,}
しかし、どうすればそれを行うことができますか?
よろしくお願いします!
編集:
わかりました、以下の提案を試した後、ATG で始まり、内部停止コドンを持たない特定のゲノム配列から >=30 bp のすべてのオーバーラップ ORF を回復するソリューションを思いつきました。
my $genome = $_[0];
my $ATG_count = 0;
my $ORF_count = 0;
my @i = ();
my @j = ();
my @l = ();
my @frames = ();
while ($genome =~ m/ATG/ig) {
$ATG_count++;
my $start = $-[0]+1;
foreach (substr($genome,$-[0]) =~ m/^ATG(?:[ATGC]{3})*?(?:TAA|TAG|TGA)/ig) {
### This was changed so that it matches "ATG - first(lazy) stop-codon".
my $length = $+[0];
if ($length%3 == 0 && $length >=30) {
### This was changed so that the matches must be >=30 in length.
my $stop = $start+$length;
my $readingframe = ($start%3);
push(@i, $start), push(@j, $stop), push(@l, $length), push (@frames, $readingframe);
$ORF_count++;
}
}
}