low-complexity regions란 낮은 복잡도 영역으로 일정한 패턴이 연속적으로 나오는 영역을 말한다.
문제:
주어진 FASTA 형식의 DNA 서열 파일에서 낮은 복잡도 영역의 시작 위치를 찾고, 해당 위치를 결과 파일에 저장하며, 코드 실행에 소요된 시간을 마이크로초 단위로 출력합니다.
import sys
import re
import time
# 문자열의 공백과 모든 개행문자(Whitespace)를 제거하고 대문자로 변환
def removeBlank(oneLine):
return re.sub("\s+","",oneLine).upper()
# ATGC 로 이루어진 문자열인지 확인
def checkDnaData(oneLine):
if re.match("^(A|T|G|C)+$", oneLine):
return
else:
print("No DNA sequence.\n" + oneLine)
exit()
# 낮은 복잡도 시작 위치 찾기 with RE
def find_low_complexity(DNA_data):
LC_positions = []
# ?P< > : capture 그룹을 생성
# [ACGT]{2,5}: ACGT로 이루어진 길이가 2이상 5이하인 subString
# (?P=cap){2,} : cap과 일치하는 내용이 2번 이상 연속
# => 2번 이상인 이유는 cap 생성부분에서 이미 하나가 나왔기 때문
pattern = re.compile(r"((?P<cap>[ACGT]{2,5})(?P=cap){2,})")
for match in pattern.finditer(DNA_data):
# 낮은 복잡도 영역의 시작 위치를 low_complexity_positions에 추가
LC_positions.append(match.start())
return LC_positions
# 인수로 파일 주소 받기 ==================================
file_path = sys.argv[1]
txt_list = []
# 파일 확인
try:
with open(file_path, "r") as file:
line = file.readline()
if '#' in line :
while line:
line = removeBlank(file.readline())
if line:
checkDnaData(line)
txt_list.append(line)
else:
print("No correct format\n파일의 시작은 #이여야 합니다.")
exit()
tm_join = "".join(txt_list)
start_time = time.perf_counter()
low_complex_positions = find_low_complexity(tm_join)
required_time = (time.perf_counter() - start_time) * 1e6
str_required_time = f"required time: {required_time} (us)\n"
print(str_required_time)
combined_string = "\n".join([str(i) for i in low_complex_positions])
#결과 파일 저장
with open('output3.txt', 'w') as f:
f.write(combined_string)
print("정상 작동, output3.txt 파일로 저장 완료")
except IOError:
print("파일을 읽을 수 없습니다.")
exit()
- removeBlank: 문자열의 공백과 개행문자를 제거하고 대문자로 변환하는 함수입니다.
- checkDnaData: 문자열이 ATGC로만 이루어진 DNA 서열인지 확인하는 함수입니다. 만약 DNA 서열이 아니라면, "No DNA sequence."를 출력하고 프로그램을 종료합니다.
- find_low_complexity: 정규식을 사용하여 DNA 서열에서 낮은 복잡도 영역의 시작 위치를 찾는 함수입니다.
먼저, 코드는 파일 경로를 명령줄 인수로 받습니다. 그런 다음 파일을 열어 FASTA 형식이 올바른지 확인합니다. 올바른 형식이 아닌 경우, "No correct format"를 출력하고 프로그램을 종료합니다.
FASTA 형식이 올바른 경우, 파일의 각 행에서 공백과 개행문자를 제거하고 대문자로 변환한 후, DNA 서열인지 확인합니다. 모든 행을 처리한 후, txt_list의 모든 문자열을 하나의 문자열로 결합합니다.
낮은 복잡도 영역의 시작 위치를 찾기 위해 find_low_complexity 함수를 호출하고, 이때 소요된 시간을 마이크로초 단위로 출력합니다. 그런 다음 낮은 복잡도 영역의 시작 위치를 문자열로 변환하고, 이를 결과 파일에 저장합니다. 이 과정이 완료되면, "정상 작동, output3.txt 파일로 저장 완료"를 출력합니다.
만약 파일을 읽을 수 없는 경우, "파일을 읽을 수 없습니다."를 출력하고 프로그램을 종료합니다.
'2023 상반기 > 바이오 컴퓨팅' 카테고리의 다른 글
DNA sequence(DNA 시퀀스)에서 dynamic programming(동적 계획법) 이용 Longest Common Subsequences(LCS, 최장 공통 부분 수열) 찾는 python 코드 (0) | 2023.04.04 |
---|---|
dynamic programming (동적 계획법) Manhattan Tourist problem(MTP), Longest Common Subsequences (LCS) (0) | 2023.04.04 |
re (정규표현식) 과제1 (0) | 2023.03.29 |
re(정규 표현식) 과제2 (0) | 2023.03.29 |
Algorithm (0) | 2023.03.29 |
댓글