Finder & Cutter에 패치가 있었음

Patch note

  1. 공통: 어디 자르는지도 알려줍니다… 아 ㄹㅇ 힘들었음…
  2. Cutter: 일부 제한효소가 목록에서 누락되던 현상을 수정했습니다. (print문으로는 보이는데 write하는 과정에서 날아감) 근데 됐는지는 모름.

Cut site 찾는 코드

def count_func (a,b):
    while a in b:
        global site_count
        global res_loc 
        global res_loc_list
        loc = b.find(a)
        site_count += 1
        b = b[loc+len(a):]
        res_loc = loc + 1
        res_loc_list.append(res_loc)
    return site_count, res_loc
# 이거 통으로 코드에 넣었더니 if 안에 있는데도 시퀀스 없으면 끝내더라... 
# 위치 출력은 되는 것 같은데, 이거 더해야 하는데...

원래 이렇게 정의했었는데 문제가 하나 있다. 저 로직은 제한효소가 인식하는 시퀀스를 찾으면 그 다음부터 슬라이싱을 하기 때문에 find를 계속 돌리게 되면 여러 군데를 자르는 제한효소의 경우

AfaI [167, 150, 167, 53, 70] [830, 677, 507, 451, 378]
# restriction site 위치와 b(시퀀스에서 restriction site가 끝나는 부분부터 슬라이싱한 결과)의 길이

왼쪽처럼 find 결과가 시퀀스 뒤로 갈 수록 작아진다. (오른쪽은 slicing하고 남은 길이) 백준에서 크로아티아 문자 대체했던것처럼 다른걸로(*이나 @같은거) 대체도 안되는 게, 저 코드는 입력받은 시퀀스 가지고 뺑뺑이 돌리는 코드라 시퀀스 데이터를 건드리면 안된다. (finder는 하나 찾아주는거라 상관은 없지만)

def cut_func (a,b):
    while a in b:
        global res_loc
        global res_loc_list
        global length_seq
        global length_list
        loc = b.find(a)
        b = b[loc+len(a):]
        res_loc = loc + 1
        res_loc_list.append(res_loc)
        length_seq = len(b)
        length_list.append(length_seq)
    return res_loc_list,length_list
# 여기가 위치 관련 함수입니다.
# len(a): 인식 시퀀스 길이, len(b): 슬라이싱 하고 남은 시퀀스 길이

저대로 하면 나중에 마른세수 여러 번 할 각이라 일단 함수는 밖으로 뺐다.

AanI [80] [15]
# 결과(AanI의 시퀀스는 TTATAA로 6bp)
# 슬라이싱하고 남은 텍스트의 길이가 15bp이다. 

AanI의 인식 시퀀스는 6bp이다. (len(AanI)=6) 그리고 Aan의 인식 시퀀스 뒤로 15bp가 남는다. 저게 근데 왜 80이냐면 find+1한거라서. (find 그냥 주면 0부터 나온다)

length_list.append(seq_length - (length_seq + len(a))) # slicing 후의 길이 목록

그래서 시퀀스 전체 길이에서 슬라이싱 후 값과 인식 시퀀스 길이를 더한 값을 뺀 다음 1을 더했다. (위 코드의 값에 1을 더하면 된다) find값에 일일이 더하는것보단 낫지… 저렇게 하면 AanI의 경우 100-(15+6)+1이 되므로 80.

def cut_func (a,b):
    while a in b:
        global res_loc # find로 나오는 값
        global res_loc_list
        seq_length = len(sequence)
        loc = b.find(a)
        b = b[loc+len(a):]
        res_loc = len(sequence) - (len(b) + len(a)) + 1
        res_loc_list.append(str(res_loc)) # find로 나오는 위치 목록(slicing에 따른 보정 필요)
    return res_loc_list,length_list
# 여기가 위치 관련 함수입니다.
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))

함수 정리하고(쓸데없는 변수 치워버림) 출력 코드 바꿔주면 끝이다.

결과

Cutter, 100bp

Cutter, 1.5kb

Finder, 100bp

Finder, 1kb