私は、DNA シーケンスでオープン リーディング フレームを見つけるためのきれいで Pythonic な方法を見つけることに取り組んでいます。索引付け、フラグ、およびその他の醜さを利用する多くの実装をオンラインで見つけました。
正規表現の実装を作成できると確信していますが、正規表現が苦手です。一般的なアイデアは、「ATG」、「TAG」、「TGA」、および「TAA」によって一連の DNA シーケンスを分割したいということです。しかし、重複領域で分割したくありません。たとえば、シーケンス「ATGA」は「ATG」、「A」に分割する必要があります。基本的に、3 つのフレームのいずれかで左から右に進みます。
わかりやすくするために編集: コメントで述べたように、(ゼロ以外のフレームにある)の存在にもかかわらず、 のようなシーケンスは,ATGATTTTGA
に分割する必要がありますATG
TTT
TGA
TGA
edit2:これは、リンクされたリスト内包分割を使用して、正規表現なしで実装した方法です。私はフラグの使用が嫌いです。
def find_orf(seq):
length = 0
stop = ['TAA','TGA','TAG']
for frame in range(3):
orfFlag, thisLen = None, 0
splitSeq = [seq[start+frame:start+frame+3] for start in range(0,len(seq),3)]
for codon in splitSeq:
if codon == 'ATG':
orfFlag = True
thisLen += 1
elif orfFlag and codon in stop:
orfFlag = None
if thisLen > length:
length = thisLen
else:
thisLen += 1
return length