座標

2016-08-25 11 views
0

に重なるとき、私は、このようなデータセットを持っている最高の行を得る:座標

FBti0018875 2031 2045 - TTCCAGAAACTGTTG hsf 62 0.9763443383736672 
    FBti0018875 2038 2052 + TTCTGGAATGGCAAC hsf 61 0.96581136371138 
    FBti0018925 2628 2642 - GACTGGAACTTTTCA hsf 60 0.9532992561656318 
    FBti0018925 2828 2842 + AGCTGGAAGCTTCTT hsf 63 0.9657036377575696 
    FBti0018949 184 198 - TTCGAGAAACTTAAC hsf 61 0.965931072979605 
    FBti0018986 2036 2050 + TTCTAGCATATTCTT hsf 63 0.9943559469645551 
    FBti0018993 1207 1221 - TTCTAGCATATTCTT hsf 63 0.9943559469645575 
    FBti0018996 2039 2053 + TTCTAGCATATTCTT hsf 63 0.9943559469645575 
    FBti0019092 2985 2999 - TTCTAGCATATTCTT hsf 63 0.9943559469645409 
    FBti0019118 1257 1271 + TTCCAGAATCTTGGA hsf 60 0.9523907773798134 

最初の列は識別子であり、第2および第3の座標です。私は座標の各範囲に対して1つの行を保持したいだけです。それが重複している場合に最良の識別子を保持することを意味します(最善のものは最後の列に基づいて定義され、より高い値=より優れています)。

例えば、識別子FBti0018875の場合、a)2番目の行と重複しており、b)最後の列の値がより高い(0.97> 0.96)ため、最初のものを保持します。

第1行と第2行の間に重複がない場合、私は両方を保持します。時には、各識別子に5行または6行を使うことができるので、現在のものと前のものとを比較するだけでは簡単ではありません。

これまでのところ、このコードは動作しません。

def test(lista, listb): #Compare lists of coordinates 
    a = 0 
    b = 0 
    found = False 
    while a<len(lista) and b<len(listb): 
     result = check(lista[a] , listb[b]) 
     if result < 0: 
      a += 1 
      continue 
     if result > 0: 
      b += 1 
      continue 
     # we found overlapping intervals 
     found = True 
     return (found, a, lista[a], b, listb[b]) 
    return found 

def check((astart, aend) , (bstart, bend)): 
    if aend < bstart: 
     return -1 
    if bend < astart: 
     return 1 
    return 0 

refine = open("tffm/tffm_te_hits95.txt", "r") 
refined = open("tffm/tffm_te_unique_hits95.txt", "w") 
current_TE=[] 
for hit in refine: 
    info=hit.rstrip().split('\t') 
    if len(current_TE)==0 or info[0]==current_TE[0][0]: 
     current_TE.append(info) 
    elif info[0]!=current_TE[0][0]: 
     to_keep=[] 
     i=0 
     if len(current_TE)==1: 
      to_keep.append(0) 
     else: 
      for i in range(len(current_TE)-1): 
       if [current_TE[i][1], current_TE[i][2]] == [current_TE[i+1][1], current_TE[i+1][2]]: 
        if current_TE[i][7]<current_TE[i+1][7]: 
         to_keep.append(i+1) 
       elif test([(current_TE[i][1], current_TE[i][2])], [(current_TE[i+1][1], current_TE[i+1][2])])!='False': 
        if current_TE[i][7]<current_TE[i+1][7]: 
         to_keep.append(i+1) 
         try: 
          to_keep.remove(i) 
         except: 
          pass 
        else: 
         to_keep.append(i) 
      else: 
       to_keep.append(i) 
       if i==len(current_TE)-1: 
        to_keep.append(i+1) 
    for item in set(to_keep): 
     print current_TE[item] 
     current_TE=[] 

同じ識別子を持つ複数の行を含むリストを生成し、解析するために、私は(コードで)しようとしている

FBti0018875 2031 2045 - TTCCAGAAACTGTTG hsf 62 0.9763443383736672 
FBti0018925 2628 2642 - GACTGGAACTTTTCA hsf 60 0.9532992561656318 
FBti0018925 2828 2842 + AGCTGGAAGCTTCTT hsf 63 0.9657036377575696 
FBti0018949 184 198 - TTCGAGAAACTTAAC hsf 61 0.965931072979605 
FBti0018986 2036 2050 + TTCTAGCATATTCTT hsf 63 0.9943559469645551 
FBti0018993 1207 1221 - TTCTAGCATATTCTT hsf 63 0.9943559469645575 
FBti0018996 2039 2053 + TTCTAGCATATTCTT hsf 63 0.9943559469645575 
FBti0019092 2985 2999 - TTCTAGCATATTCTT hsf 63 0.9943559469645409 
FBti0019118 1257 1271 + TTCCAGAATCTTGGA hsf 60 0.9523907773798134 

(一方のみFBti0018875を失う)ことになる。この場合に予想される結果それは座標が重なっているもののためであり、それが最後の列に従って1つを選択する場合です。オーバーラップをチェックするのに成功しましたが、いくつかのバージョンではいくつかの行しか取得できません:

Traceback (most recent call last): 
    File "<stdin>", line 29, in <module> 
IndexError: list index out of range 
+0

はどのように動作しませんか?あなたはあなたが期待しているものと遭遇したエラーとを比較して、あなたが得ている出力を投稿する必要があります。 –

+0

2列目と3列目は 'FBti0018875'の座標と同じですが、'(20、31) 'と'(20,45) 'でしょうか? –

+0

@MadPhysicist申し訳ありませんが、質問を更新するつもりです – biojl

答えて

0

最後に私は解決しました。 FalseではなくFalseで愚かな間違いがありました。ここで

は、ソリューションです:

def test(lista, listb): 
    a = 0 
    b = 0 
    found = False 
    while a<len(lista) and b<len(listb): 
     result = check(lista[a] , listb[b]) 
     if result < 0: 
      a += 1 
      continue 
     if result > 0: 
      b += 1 
      continue 
     # we found overlapping intervals 
     found = True 
     return (found, a, lista[a], b, listb[b]) 
    return found 

def check((astart, aend) , (bstart, bend)): 
    if aend < bstart: 
     return -1 
    if bend < astart: 
     return 1 
    return 0 

def get_unique_sre(current_TE): 
    to_keep = range(0,len(current_TE)) 
    for i in range(len(current_TE)-1): 
     if [current_TE[i][1], current_TE[i][2]] == [current_TE[i+1][1], current_TE[i+1][2]]: 
      if current_TE[i][7]<current_TE[i+1][7]: 
       try: 
        to_keep.remove(i) 
       except: 
        pass 
     elif test([(current_TE[i][1], current_TE[i][2])], [(current_TE[i+1][1], current_TE[i+1][2])])!=False: 
      if current_TE[i][7]<current_TE[i+1][7]: 
       try: 
        to_keep.remove(i) 
       except: 
        pass 
      else: 
       to_keep.remove(i+1) 
    final_TE=[] 
    for i in to_keep: 
     final_TE.append(current_TE[i]) 
    return final_TE 


refine = open("tffm/tffm_te_hits95.txt", "r") 
refined = open("tffm/tffm_te_unique_hits95.txt", "w") 
current_TE=[] 
for hit in refine: 
    info=hit.rstrip().split('\t') 
    if len(current_TE)==0 or info[0]==current_TE[0][0]: 
     current_TE.append(info) 
    else: 
     if len(current_TE)==1: 
      print>>refined, current_TE[0] 
      current_TE=[] 
     else: 
      final_TE = get_unique_sre(current_TE) 
      for item in final_TE: 
       print>>refined, item 
       current_TE=[] 
refined.close()