Cutter & Finder 패치노트

패치 내역

공통

이제 몇 번 자르는지도 세줍니다.

Cutter

Cut수에 따른 효소 리스트 업 기능이 추가되었습니다. 살려줘… (아직 자르는 위치 안했음)

파일 이름 형식이 변경되었습니다. 그래서 이제 시퀀스 이름도 받습니다.

Finder

Cut수 세 주는 기능에 따른 출력 형식 수정이 있었습니다.

기능 추가하는 세부 과정

Cut수 세 주는 기능

(생략)
        if res_find in sequence:
            site_count = 0
            while sequence.find(res_find) != -1:
                loc = sequence.find(res_find)
                site_count += 1
                sequence = sequence[loc+len(res_find):]
                print(enzyme, res_find, sequence.find(res_find))
            f.write("{0}: {1} {2},{3} times cut.\n".format(enzyme,res_find,feature,site_count))
(생략)

전에 백준 풀 때 사용했던 방법(그룹 단어 찾기)을 응용한건데, 이 코드가 단식으로는 되는데 저대로 코드 안에 넣으니까 restriction site가 없는 효소를 만나면 반복문이 중단되어버린다.

def count_site (a,b):
    site_count = 0
    while a in b:
        loc - b.find(a)
        site_count += 1
        b = b[loc+len(a):]
        return site_count

그래서 아예 함수로 빼버렸다.

(마른세수) 아 잠깐만요… 시퀀스 1kb짜리라고…

def count_site (a,b):
    site_count = 0
    while a in b:
        loc = b.find(a)
        site_count += 1
        b = b[loc+len(a):]
        return site_count

응? 네번째 줄에 오타가 있었네? (원래 =가 맞는데 -가 들어감)

(마른세수 2)

def count_func (a,b):
    site_count = 0
    while a in b:
        loc = b.find(a)
        site_count += 1
        b = b[loc+len(a):]
    return site_count
# 이거 통으로 코드에 넣었더니 if 안에 있는데도 시퀀스 없으면 끝내더라... 
print(count_site("GGCC",sequence))

답답해서 직접 해봤더니 이건 잘됐다.

def count_func (a,b):
    while a in b:
        global site_count
        loc = b.find(a)
        site_count += 1
        b = b[loc+len(a):]
    return site_count
# 이거 통으로 코드에 넣었더니 if 안에 있는데도 시퀀스 없으면 끝내더라...
(생략)
        if res_find in sequence:
            site_count = 0
            count_func(res_find,sequence)
            count += 1
            f.write("{0}: {1} {2},{3} times cut.\n".format(enzyme,res_find,feature,site_count))
        else: 
            count += 0
(생략)
# 여러분 드디어 저장기능이 추가되었습니다!!!

site_count라는 변수가 해당 변수인데, 아예 함수 안에서는 전역변수로 선언하고 밖으로 빼버렸다. 그래서 코드를 보면 함수 안에는 global ~가 있고, ~에 해당하는 변수가 if문과 함수 사이에 있다. (if문 바로 아래)

(매우 바람직)

cut수별로 나눠주는 기능

(생략)
        if res_find in sequence:
            site_count = 0
            count_func(res_find,sequence)
            count += 1
            count_nocut += 0
            cut_list.append(enzyme)
            f.write("{0}: {1} {2},{3} times cut.\n".format(enzyme,res_find,feature,site_count))
        else: 
            count += 0
            count_nocut += 1
            nocut_list.append(enzyme)
    cut_list = ', '.join(cut_list)
    nocut_list = ', '.join(nocut_list)
    f.write("Total: {0} enzymes cut input sequence, {1} enzymes never cut this sequence. \n".format(count,count_nocut))
    f.write("Enzyme cuts: {0} \nEmzyme no cuts: {1}".format(cut_list,nocut_list))
    f.close()
# 진짜 세주는거 겨우 추가했습니다...ㅠㅠ

사실 길어서 생략했는데, 코드 윗부분에 0컷이랑 컷 리스트가 있다.

count = 0
count_nocut = 0
cut_list = []
nocut_list = []

저기서 count는 기존에 있던 변수고 밑에 세 개가 신규 변수.

그래서 이렇게 나오는데… 이게 사람이요… 살다보면 1컷 궁금하잖음?

count = 0
count_nocut = 0
once_cut_list = []
multi_cut_list = []
nocut_list = []
(생략)
        if res_find in sequence:
            site_count = 0
            count_func(res_find,sequence)
            count += 1
            count_nocut += 0
            if site_count == 1:
                once_cut_list.append(enzyme)
            else: 
                multi_cut_list.append(enzyme)
            f.write("{0}: {1} {2},{3} times cut.\n".format(enzyme,res_find,feature,site_count))
        else: 
            count += 0
            count_nocut += 1
            nocut_list.append(enzyme)
    once_cut_list = ', '.join(once_cut_list)
    multi_cut_list = ', '.join(multi_cut_list)
    nocut_list = ', '.join(nocut_list)
(생략)

그럼 0컷 1컷 멀티컷 나눠드렸습니다.

근데… 에픽하이도 투컷이 있고… NEB cutter도 2컷 보여주는데… 씁… 아니 진짜 이것만 보여줄거임?

count = 0
count_nocut = 0
once_cut_list = []
two_cut_list = []
multi_cut_list = []
nocut_list = []
(생략)
        if res_find in sequence:
            site_count = 0
            count_func(res_find,sequence)
            count += 1
            count_nocut += 0
            if site_count == 1:
                once_cut_list.append(enzyme)
            elif site_count == 2: 
                two_cut_list.append(enzyme)
            else: 
                multi_cut_list.append(enzyme)
            f.write("{0}: {1} {2},{3} times cut.\n".format(enzyme,res_find,feature,site_count))
        else: 
            count += 0
            count_nocut += 1
            nocut_list.append(enzyme)
(생략)

그래서 나눠드렸습니다^^

with open ('Result_{0}-{1}-{2}_{3}-{4}.txt'.format(year,month,day,enzyme,sequence_name),'w',encoding='utf-8') as f: 
    if sequence.find(res_find) != -1:
        site_count = 0
        cut_count = count_func(res_find,sequence)
        sequence = sequence.replace(res_find,res_site)
        print(enzyme,",",cut_feature)
        print(sequence,cut_count)
        f.write("{0} | {1} | {2} | {3} times cut\n".format(enzyme,res_site,cut_feature,cut_count))
        f.write('Sequence name: {0} \n {1}'.format(sequence_name,sequence))
        f.close()
        # DB에 효소가 있고 일치하는 시퀀스가 있을 때

참고로 위 함수는 Finder에도 적용되었다. 단, Finder의 경우 DB에 효소가 있고 일치하는 시퀀스가 있을 때 cut수를 세 준다.

이런 식. (HaeIII이 6컷인가 그랬음)