1

こんにちはすべて私は私が助けを借りて行うことができるバイオインフォマティクスの問題を抱えています。かなり長いですが、私はそれをより小さなセクションに分割してみます。どんな助けも素晴らしいです。

4文字のA、U、C、Gで構成されるRNAの長さ「n」のシーケンスがあります。これは文字列としてPythonにインポートされ、折りたたんでループを作成できます。ループは、AがU、CがG、GがUになるようにシーケンスからの文字のペアを一致させることによって作成され、文字列が折り返されます。

キャッチは、ペアを形成する3つ以上の文字が隣り合っている必要があり、3文字以上が連続してペアを形成している必要があり、少なくとも3文字のセクション間にもギャップが必要であるということです。 。

写真を投稿しようとしましたが、評判ポイントが足りません:(

ジャーナルでは、著者がネストされたループメソッドについて話し、これが可能なすべての可能な組み合わせを見つけて、後で呼び出されるグループにそれらを含めることを参照しています。

私の問題は、プログラミングとPythonに慣れていないため、ネストされたループを作成することです。ペアを識別し、場合によってはそれらを一緒に追加できる方法でシーケンスを保存するだけでなく。

繰り返しになりますが、どんな助けでも素晴らしいでしょう。何か不明な点があれば教えてください

編集:

例としては、seq ='aggcuugaguuu'があります。ここで、出力の1つは、seq[0:2]とseq [9:11]のペアを示し、コードがU字型のように形成されていることを意味します。

弦を物理的な弦の一部として想像し、それを3点で保持し、3つの異なる点で保持してから、それらの点を一緒に接触させると、弦がループを形成します。使用した6つのポイントを特定しようとしています。

自分のために書かれるコードを探しているのではなく、コードを作成する方法を知りたいだけです。

seq1=入力コードとseq2=逆入力コードの方法を試し、seq2をseq1に沿って移動して、隣接する3つのペアを探しましたが、正しい出力が得られませんでした。

4

2 に答える 2

4

itertoolsの製品の使用を検討しましたか。次に、結果を繰り返し処理して、好きな結果だけを選択できます。

于 2012-04-24T23:00:44.543 に答える
3

RNAがそれほど長くない場合(数千塩基はおそらくOKですが、数十万塩基は間違いなくOKではありません)、単純なO(n ^ 3)アルゴリズムで逃げることができます。O(n ^ 3)は、実行時間が最悪の場合、塩基数の3乗に比例することを意味します。ネストされたループについて言及している作者は、この単純ではあるがかなり遅い方法を強く示唆しています。

def find_loops(rna, min_pairs=3, min_loop=3):
    n = len(rna)
    result = []
    for loop_start in xrange(min_pairs, n - min_pairs - min_loop + 1):
        for loop_end in xrange(loop_start + min_loop, n - min_pairs):
            if (loop_end - loop_start < min_loop + 2 or 
                    not base_pair(rna[loop_start], rna[loop_end - 1])):
                max_pairs = min(loop_start, n - loop_end)
                for k in xrange(max_pairs):
                    if not base_pair(rna[loop_start - k - 1], rna[loop_end + k]):
                        break
                else:
                    k = max_pairs
                if k >= min_pairs:
                    result.append((loop_start - k, k, loop_end - loop_start))
    return result

def base_pair(x, y):
    return (x == 'A' and y == 'U' or
            x == 'C' and y == 'G' or
            x == 'G' and y == 'C' or
            x == 'U' and y == 'A')

これは、RNAループのすべての可能な開始と終了を繰り返し、次に、塩基がまだペアになっている限り、潜在的なループの終了から両方向に離れます。不一致のベースのペアに到達すると、停止し、少なくともペアの最小数を取得していることを確認します。ある場合は、結果のリストにループを追加します。

1つ目ifは、さらにきつく「圧縮」される可能性のあるループの一覧表示を回避するためです。条件が読み取れるように、ループが短すぎる(5塩基未満)か、ループの端が一致しない場合、ループをきつく締めることはできません。

結果は、形式のタプルのリストです(可能なループごとに1つ)(start_pos, pair_count, loop_length)。これは、pair_count塩基番号から始まる一連の塩基の後に、塩基start_posのループが続きloop_length、その後に逆の相補配列が続くことを意味します。配列のアンチセンスコピーは塩基から始まりますstart_pos + pair_count + loop_length。一塁は1ではなく0です(ここではプログラマーです)。

例はこれをより明確にするかもしれません:print find_loops('GGGGAUUACAGCGUGUAAUCAAUA')returns [(4, 3, 13), (3, 7, 3)]、つまり、2つのループを見つけます:

  • 位置4では、3つの塩基、AUUが13塩基のループを囲み、AAU位置20で結合します。
  • 位置3で、7つの塩基GAUUACA、、が3つの塩基のループを囲み、UGUAAUC位置13でバインドします。

最初のがないifと、関数は(3、6、5)のようなループも返します(つまりGAUUAC、位置3で5塩基のループを囲み、GUAAUC位置14でバインドします)。これは(3、7、3)と同じループです。 )上記では、それが行くほどしっかりと圧縮されていないだけです。

お役に立てれば。より高速なアルゴリズムが必要な場合は、より長い文字列で機能する動的プログラミングソリューションがあると確信しています。私に知らせてください、そして私はそれについて考えます。しかし、理解するのはそれほど簡単ではありません...

于 2012-04-25T00:17:42.523 に答える