2016-07-26 11 views
1

私は、Rosalind BioinformaticsのWebサイト(http://rosalind.info/problems/cons/)の "Consensus nd Profile"という問題に取り組んでいます。ウェブサイトのサンプル入力を使用してコードを試しましたが、出力がサンプル出力と一致しています。しかし、大規模なデータセットを試してみると、ウェブサイトは私の出力が間違っていると言いました。私の問題がどこにあるのかを誰かに知らせることができますか?ありがとうございました!Rosalindのコンセンサスとプロフィールpython

サンプル入力:

>Rosalind_1 
ATCCAGCT 
>Rosalind_2 
GGGCAACT 
>Rosalind_3 
ATGGATCT 
>Rosalind_4 
AAGCAACC 
>Rosalind_5 
TTGGAACT 
>Rosalind_6 
ATGCCATT 
>Rosalind_7 
ATGGCACT 

私は、DNAの文字列を抽出して(より大きなデータセットと私の裁判はので、私はここに私のコードを省略し、この段階で正しい)リストと呼ばれる文字列にそれらを保存した:

['ATCCAGCT', 'GGGCAACT', 'ATGGATCT', 'AAGCAACC', 'TTGGAACT', 'ATGCCATT', 'ATGGCACT'] 

その後私のコード:

#convert strings into matrix 
matrix = [] 
for i in strings: 
    matrix.append([j for j in i]) 
M = np.array(matrix).reshape(len(matrix),len(matrix[0])) 

Mサンプル入力のために次のようになります。

その後
[['A' 'T' 'C' 'C' 'A' 'G' 'C' 'T'] 
['G' 'G' 'G' 'C' 'A' 'A' 'C' 'T'] 
['A' 'T' 'G' 'G' 'A' 'T' 'C' 'T'] 
['A' 'A' 'G' 'C' 'A' 'A' 'C' 'C'] 
['T' 'T' 'G' 'G' 'A' 'A' 'C' 'T'] 
['A' 'T' 'G' 'C' 'C' 'A' 'T' 'T'] 
['A' 'T' 'G' 'G' 'C' 'A' 'C' 'T']] 

マイコード:

#convert string matrix into profile matrix 
A = [] 
C = [] 
G = [] 
T = [] 
for i in range(len(matrix[0])): 
    A_count = 0 
    C_count = 0 
    G_count = 0 
    T_count = 0 
    for j in M[:,i]: 
     if j == "A": 
      A_count += 1 
     elif j == "C": 
      C_count += 1 
     elif j == "G": 
      G_count += 1 
     elif j == "T": 
      T_count += 1 
    A.append(A_count) 
    C.append(C_count) 
    G.append(G_count) 
    T.append(T_count) 

profile_matrix = {"A": A, "C": C, "G": G, "T": T} 
for k, v in profile_matrix.items(): 
    print k + ":" + " ".join(str(x) for x in v) 

#get consensus string 
P = [] 
P.append(A) 
P.append(C) 
P.append(G) 
P.append(T) 
profile = np.array(P).reshape(4, len(A)) 
consensus = [] 
for i in range(len(A)): 
    if max(profile[:,i]) == profile[0,i]: 
     consensus.append("A") 
    elif max(profile[:,i]) == profile[1,i]: 
     consensus.append("C") 
    elif max(profile[:,i]) == profile[2,i]: 
     consensus.append("G") 
    elif max(profile[:,i]) == profile[3,i]: 
     consensus.append("T") 
print "".join(consensus) 

は、これらのコードは、正しいサンプル出力与える:

A:5 1 0 0 5 5 0 0 
C:0 0 1 4 2 0 6 1 
T:1 5 0 0 0 1 1 6 
G:1 1 6 3 0 1 0 0 
ATGCAACT 

をしかし、私は、より大きなデータセットをしようとしたときに、ウェブサイトは、私の答えは間違っていたと述べました...誰かが私が間違っているところを指摘できますか? (私は初心者です、あなたの忍耐ありがとう!)

+0

フォーマットがサンプル出力と正確に一致することを確認してください。つまり、各行にコロンの後ろにスペースを追加し、コンセンサス文字列を一番上に置き、ヌクレオチドを「ACGT」の順に並べることを意味します。 –

+0

あなたはこれを見ましたか? http://stackoverflow.com/questions/38586800/python-multiple-consensus-sequences/ –

+0

@C_Z_ああ私はそれを以前に気付かなかった...チップをありがとう! – largecats

答えて

1

あなたのアルゴリズムは完全に上質です。 @C_Z_は "あなたのフォーマットがサンプル出力と正確に一致することを確認しました"と指摘しましたが、残念なことにそうではありません。

print k + ":" + " ".join(str(x) for x in v) 

print k + ": " + " ".join(str(x) for x in v) 

ことと、前ではなく、後のコンセンサス配列を来る必要があります。 注文を変更してスペースを追加すると、回答はrosalindに受け入れられます。


それはあなたの質問への答えは自明なので、ここで同じ問題のための代替ソリューションは、numpyのを使用せずに、次のとおりです。 代わりに各ヌクレオチドのための変数を使用するのでは、辞書を使用しています。 23アミノ酸で同じことをするのは楽しいことではありません。

from collections import defaultdict 
for i in range(len(strings[0])): 
    counter.append(defaultdict(int)) 
    for seq in seqs: 
     counter[i][seq[i]] += 1 
    consensus += max(counter[i], key=counter[i].get) 

counter店舗すべての拠点のためのすべてのカウントで各位置についてdictionary。辞書のキーは現在のベースです。

+0

お返事ありがとうございます(とコード)!私は自分のフォーマットにマッチしてみましたが、ロザリンドはまだそれが間違っていると言います...私の出力に何らかの形で\ nが含まれていて、結果として、行の終わりまで(すなわち、ロザリンドが行内で許す最大文字数)までずっと進むのではなく、私の出力はブロックになります。 。どう思いますか?ありがとうございました! – largecats

+0

辞書はソートされていないので、それを反復すると、キーの順序はランダムになります。 'ACGT ':print k +": "+" "n for profile_matrix [n]"のxに対してstr(x)を試すことで、正しい順序を実行することができます。 –

関連する問題