Finder는 정규식+찾아바꾸기라 도입이 좀 늦어요.
개선점
정규식 도입
import pandas as pd
import re
from datetime import datetime
enzyme_table = pd.read_csv('/home/koreanraichu/restriction.csv')
enzyme_table2 = pd.read_csv('/home/koreanraichu/restriction_RE.csv')
# 정규식 도입을 위해... 어쩔 수 없이 합쳤음...
enzyme_table = pd.concat([enzyme_table,enzyme_table2])
enzyme_table = enzyme_table.sort_values('Enzyme')
enzyme_table.reset_index(inplace=True)
# 합쳤다...
print(enzyme_table)
파일명 끝에 RE가 들어가는 게 정규식 처리가 필요한 효소들임. (N이나 S, B같은 게 들어가는 효소) 정규식 처리가 없으면 검색 자체가 안돼서(find는 토씨 하나 안 틀리고 일치해야 찾아준다) 따로 빼뒀었다.
class RE_treatment:
def RE_wildcard(self,before_seq):
self.before_seq = before_seq
before_seq = before_seq.replace("N",".")
return before_seq
# Wildcard: 시퀀스 데이터에 N이 있을 경우 Wildcard로 바꾼다.
def RE_or(self,before_seq):
self.before_seq = before_seq
if "B" in before_seq:
before_seq = before_seq.replace("B","[CGT]")
elif "D" in before_seq:
before_seq = before_seq.replace("D","[AGT]")
elif "H" in before_seq:
before_seq = before_seq.replace("H","[ACT]")
elif "K" in before_seq:
before_seq = before_seq.replace("K","[GT]")
elif "M" in before_seq:
before_seq = before_seq.replace("M","[AC]")
elif "R" in before_seq:
before_seq = before_seq.replace("R","[AG]")
elif "S" in before_seq:
before_seq = before_seq.replace("S","[CG]")
elif "V" in before_seq:
before_seq = before_seq.replace("V","[ACG]")
elif "W" in before_seq:
before_seq = before_seq.replace("W","[AT]")
elif "Y" in before_seq:
before_seq = before_seq.replace("Y","[CT]")
return before_seq
# Or: 시퀀스 데이터에 N 말고 ATGC 말고 다른 알파벳이 있을 경우, 해당하는 정규식 문법으로 바꾼다.
클래스. 대충 쿠키틀 해당 클래스는 N, D, B와 같은 알파벳들을 정규식 처리 하는 코드를 담고 있다.
def convert (a):
RE = RE_treatment()
while True:
if "N" in res_find:
res_find_after = RE.RE_wildcard(res_find)
elif "B" in res_find or "D" in res_find or "H" in res_find or "K" in res_find or "M" in res_find or "R" in res_find or "S" in res_find or "V" in res_find or "W" in res_find or "Y" in res_find:
res_find_after = RE.RE_or(res_find)
else:
break
return res_find_after
조건문 겁나 때려박았다… 참고로 While문이 없으면 GHCGDC처럼 알파벳이 서로 다른 게 여러개일 때 하나만 처리한다. (N은 와일드카드라 걍 .으로 바꾸면 된다)
if "N" in res_find or "B" in res_find or "D" in res_find or "H" in res_find or "K" in res_find or "M" in res_find or "R" in res_find or "S" in res_find:
res_find_after = str(convert(res_find))
else:
res_find_after = res_find
# 정규식 처리(문자가 두 개 이상일때에 대한 처리가 필요함)
Findall = re.findall(res_find_after,sequence)
if Findall:
count += 1
site_count = len(Findall)
if site_count == 1:
once_cut_list.append(enzyme)
elif site_count == 2:
two_cut_list.append(enzyme)
else:
multi_cut_list.append(enzyme)
res_loc_list = ', '.join(res_loc_list)
f.write("{0}: {1} {2},{3} times cut. Where(bp): {4} \n".format(enzyme,res_find,feature,site_count,res_loc_list))
(대충 그래서 여기 바꿨음)
Cut하는 데 찾아주는 코드
세 주는거나 이거는 그래도 find보단 쉬운듯.
def cut_func (a,b):
global res_loc_list
locs = re.finditer(a,b)
for i in locs:
loc = i.start()
res_loc_list.append(str(loc))
return res_loc_list
# 여기가 위치 관련 함수입니다.
finditer()를 이용해 찾은 다음, 리스트업 하면 된다. (join이 문자열만 돼서 문자열화 함)
그래서 Cutter는 FASTA 여는 기능만 있으면 된다.
Reply