MicroSoftware 2001년 10월호 " Biopython " by [picxenk], picxenk@dreamwiz.com, http://linuxwithme.x-y.net
K군의 연구실 이야기
이른 아침 K군은 K대학원 G연구실로 향했다. 학부의 마지막 여름방학을 보내고 있는 K군은 학부를 마치고 대학원에 진학하기 위해 평소부터 존경하던 L교수님의 G연구실에 연구보조로 나가고 있었다. 아직 대학원생은 아니었지만 연구실의 모두가 K군을 정식 멤버로 인정해주고 많은 가르침을 주기에 항상 책임감을 가지고 모두가 자고 있을 이른 시간에도 K군은 연구실로 향하고 있다.
대학원 주차장에는 벌써 L교수님의 승용차가 주차되어 있었고, 대학원 건물 3층에 위치한 연구실에도 불이 켜져 있었다. '아니.. 밤을 새셨나. 아니면 모두들 이렇게 일찍 나오신 건가?' K군은 앞으로 대학원에 진학해서 이런 고생을 할 생각을 하니 걱정도 되면서도 학부시절엔 느껴보지 못했던 기대감과 흥분에 사로잡혔다. 졸음을 쫓기 위해 커피 한잔을 뽑아 들고 3층으로 올라갔다. 역시 연구실에는 L교수님과 더불어 랩(Lab) 멤버들이 분주히 일을 하고 있었다. K군을 위해 임시로 마련해준 자리에 가방을 벗어두고, 쌓여있는 실험 기기들을 씻으려고 하는데, 연구실의 막내로 있는 P선배가 이상한(?) 미소를 지으며 K군을 불렀다.
- "요즘, 실험이 많아져서 씻을 것들이 많지? 힘들진 않아?"
- "아.. 예, 그래도 제가 해야할 일이니까..."
- "그래. 그래, 그런 태도야.. 원래 소림사에서도 처음엔 설거지에 청소에 물 길러오는 거잖아.. 그리고 나중엔 무림고수가 되지."
연구실에 실험보조로 K군이 오자 가장 기뻐하던 P선배로 평소에도 가장 귀찮고 힘든 일이 생기면 K군을 부려먹었는데, 오늘따라 친절하고 상냥하게 K군을 대하자 약간 불안해지기 시작했다.
- "저.. 혹시 뭐 시키실 일이라도 있나요?"
- "하하.. 별다른 것은 아니고, K군 컴퓨터 잘 다룬다고 했지?"
- "아.. 예.."
- "며칠 전부터 교수님께서 시키신 일이 있는데, 내가 좀 바빠서 미루고 있었거든. 컴퓨터 좀 쓰고, 인터넷 쓸 줄 알면 그리 어려운 일은 아니야. 약간 노가다 작업인데 같이 분담해서 하자구. "
- "예."
노가다 1
PubMed에서 'arabidopsis'와 'transgenic plants'라는 각각의 단어로 검색해서 찾은 논문 중에서 'Plant Molecular Biology'저널 논문의 PubMed ID(이하 PMID)를 모두 구해라.
- 단어설명
PubMed - Medline 데이타베이스를 제작하던 미국국립의학도서관에서 무료로 제공하는 인터넷 상의 의학논문검색서비스이다. PubMed를 통해 Medline을 이용할 수 있으며, 일부자료에 대해서는 원문까지 얻을 수 있다. 그 외 유전자, 단백질 서열정보 등 다양한 생물정보를 이용할 수 있다. (http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed)
- Arabidopsis - 애기장대, Arabidopsis는 십자화과의 초본식물로서 세계적으로 식물학 연구 분야에서 실험재료로 많이 사용되고 있는데 유전학연구에서의 초파리나 미생물학 연구에서의 대장균처럼 널리 이용되고 있는 model plant이다.
- Transgenic plants - 유전자 변형 식물을 말한다.
PubMed에서 각각의 단어로 검색을 해보니 'arabidopsis'의 경우 7480개의 논문이 나왔고, 'transgenic plants'의 경우 4347개의 논문이 나왔다. P선배는 미소를 지으며 자신은 'transgenic plants'논문을 정리하겠다고 말하고는 'arabidopsis'관련 논문은 K군에게 넘겼다.
'7480개를 언제 다 확인하나..' 학부시절엔 논문 한 두개를 검색하기 위?잠시 PubMed를 사용해봤지만, 정확한 사용법을 모르는 K군은 걱정이 되었다. 그러나 걱정도 잠시, 평소부터 관심을 가지고 써 오던 언어인 Python으로 만들어진 라이브러리인 Biopython이 생각이 났다. K군은 Biopython 홈페이지(http://biopython.org)로 찾아가 관련 패키지를 다운 받고 튜토리얼을 읽어보았다.
# 노가다1 해법 from Bio.Medline import PubMed from Bio import Medline term = 'arabidopsis' # 검색어 ara_ids = PubMed.search_for(term) #PubMed에서 검색어와 관련된 PMID를 구해준다. r_parser = Medline.RecordParser() med_dict = PubMed.Dictionary(parser = r_parser) ara_pmid = [] for id in ara_ids: ara_data = med_dict[id] if ara_data.journal_title_code == 'A6O': #Plant Molecular Biology저널을 찾는다. ara_pmid.append(ara_data.pubmed_id)
우선 [NCBI]의 PubMed를 사용하기 위한 모듈이 Bio.Medline 아래에 있었다. 간단히 3줄의 코드로, 웹브라우저를 통해 얻는 것처럼 검색어를 이용해 논문의 PMID를 구할 수 있었다.
from Bio.Medline import PubMed term = 'arabidopsis' ara_ids = PubMed.search_for(term)
PMID는 ara_ids에 리스트 타입으로 저장된다. 그리고 각각의 논문마다 유용한 정보를 얻기 위한 파서가 필요했다. Biopython에서는 Medline의 데이타를 파싱하는 도구가 Bio.Medline 모듈에 있다.
from Bio import Medline r_parser = Medline.RecordParser() med_dict = PubMed.Dictionary(parser = r_parser)
Medline.RecordParser()를 이용해 PubMed.Dictionary인 med_dict을 생성했다. 원하는 논문의 PMID를 key값으로 사용해 논문에 대한 정보를 담은 객체를 얻을 수 있었다. K군은 교수님이 원하시는 PMID를 담을 비어있는 리스트(ara_pmid)를 만들고 for문과 조건문을 이용해 arabidopsis로 검색된 논문 중에 'Plant Molecular Biology'(저널 코드 값으로는 'A6O'이다.)저널이 출처인 논문을 찾는 코드를 작성했다. 소스코드를 실행시킨 후, 리스트에 담긴 값은 나중에 파일로 저장하기로 하고 K군은 실험 기기를 씻으러 갔다. 이때 P 선배는 200번째 논문 PMID에 대해 Drag & Copy & Paste를 하고 있었다.
!! 여기서 잠깐 K군이 작성한 코드로 실행을 해보면 그 이후에는 손이 가지 않는 장점이 있을지는 몰라도 많은 시간이 소요된다. 조건문 검사를 위해 각각의 PMID에 대한 객체를 생성하면서 매번 웹(NCBI)에 (무려 7480번)연결을 하기에, 원하는 결과를 얻기 위해선 많은 인내심이 필요하다. 빠른 결과를 얻기 위해서는 PubMed에 논문검색 질의어를 포함하면 된다.
from Bio.Medline import PubMed term = '"Plant Mol Biol"[Jour] and arabidopsis' #여기서는 질의어에 논문 검색도 포함을 했다. ara_ids = PubMed.search_for(term)
그러면 교수님이 원하시는 논문의 PMID를 단 몇 초만에 구할 수 있게된다. (이 질의어는 물론 웹에서도 사용이 가능하다. 만약 P선배가 웹에서 고급 검색을 사용하고 복사, 붙여 넣기 작업을 한다면 좀 더 고생이 줄어 들 것이다.)
실험 기기를 다 씻고 잠시 휴게실에서 음료수를 뽑아 먹고 있는데, 붉게 상기된 얼굴에 오른 손을 부르르 떨고 있는 P선배가 휴게실로 들어섰다. 푹신한 의자에 앉아 유유히 음료수를 먹고 있는 K군을 발견한 P선배는 놀라는 표정으로 K군에게 다가왔다.
- "K군도 힘들어서 잠시 쉬러 나왔나 보지?"
- "벌써 일 다 끝냈는데요."
- (허억... 이때 P선배는 등 뒤에서 식은 땀이 흐르고..) "아.. 그래? 오... 대... 대단..한데.. 그.. 그럼 일 더 줄테니 해주겠니?"
- "더 있어요?? 예.. 주세요."
노가다 2
seq_data란 디렉토리에 시퀀싱을 해서 얻은 염기 서열을 포함한 수백 개의 파일들이 있다. 각 파일의 시퀀스 데이타를 BLAST(blastn)로 검색을 해보고 E Value가 0.5 이하인 결과물에 대한 시퀀스 정보를 구하라.
- 단어설명
[BLAST] - "Basic Local Alignment Search Tool"의 약자로 생물학 DB와 질의 데이터 간의 단백질이나 DNA서열의 유사성을 검색하는 도구로, 속도가 빠르고 현재로는 가장 유용하게 쓰이는 도구이다.(http://www.ncbi.nlm.nih.gov/BLAST/)
- 시퀀싱(Sequencing) - 생명체의 아미노산 서열이나 DNA 염기 서열 등을 밝히는 작업으로 과거에는 유전학적인 실험을 통해 얻을 수 있었지만 현재에는 자동화된 기계로 짧은 시간에 대량의 정보를 얻을 수 있다.
blastn - [BLAST] 검색의 한 방법으로 뉴클레오타이드 DB에 뉴클레오타이드의 질의 데이터로 검색을 하는 방식이다. (http://www.ncbi.nlm.nih.gov/BLAST/blast_program.html)
- E-Value - "Expect value", 값이 커질수록 유사성이 적은 경우를 나타낸다.
(http://www.ncbi.nlm.nih.gov/BLAST/blast_FAQs.html#Expect)
K군이 파일들을 살펴보니 각 파일들은 1000여 개의 뉴클레오타이드(nucleotide, ATGC) 정보를 담고 있는 텍스트 파일이었다. 그냥 웹에서 작업을 한다면 각 파일의 시퀀스 데이터를 웹 BLAST (http://www.ncbi.nlm.nih.gov/blast/) 검색 창에 붙여 넣기를 하고, 결과물에서 E Value가 0.5 이하인 것들을 찾아 (BLAST 고급검색 기능을 이용해 미리 범위를 지정할 수 있다.) 만족하는 것들의 정보를 따로 모아야 했다. 그러나 바로 전에 Biopython을 사용해 본 K군은 BLAST 검색 역시 Biopython을 사용할 수 있음을 알고 있었다.
# 노가다2 해법 import os from Bio import Fasta from Bio.Blast import NCBIWWW seq_file_lists = os.listdir('c:\\seq_data') # 디렉토리 내의 파일 리스트를 구한다. all_result = open('AllResults', 'w') # 결과가 저장될 파일이다. b_parser = NCBIWWW.BlastParser() e_value = 0.5 for file in seq_file_lists: seq_file = open('c:\\seq_data\\' + file, 'r') f_iter = Fasta.Iterator(seq_file) f_record = f_iter.next() # 파일을 FASTA포맷의 객체로 만든다. b_result = NCBIWWW.blast('blastn', 'nr', f_record) # BLAST 검색을 한다. b_record = b_parser.parse(b_result) # 파싱이 가능한 객체로 변환한다. all_result.write('################# \r') # 파일 이름과 결과를 구분해 준다. all_result.write('File Name:' + file + '\r') # 파일 이름을 출력한다. all_result.write('################# \r') for alignment in b_record.alignments: for hsp in alignment.hsps: if hsp.expect < e_value: all_result.write('seq:' + alignment.title + '\r') all_result.write('e value:' + str(hsp.expect) + '\r') all_result.write('\r') all_result.close()
K군은 우선 seq_data 디렉토리에 있는 파일들을 담고 있는 seq_file_lists 라는 리스트를 만들었다. 디렉토리의 파일명을 구하기 위해 os.listdir()이라는 함수를 사용했고, 여기서는 MS 윈도우즈 운영체제라고 가정하고 경로를 'c:\\seq_data'로 지정했다. 최종적으로 정보가 저장될 파일(AllResults)과 BLAST 파서(b_parser), 조건문에서 사용할 E Value값을 마련했다.
all_result = open('AllResults', 'w') b_parser = NCBIWWW.BlastParser() e_value = 0.5
각 파일이 담고 있는 정보는 일종의 FastaFormat으로 BioPython에서 쉽게 다룰 수 있도록 f_record라는 객체를 만들었고, NCBIWWW.blast()함수에 인수로 전달해서 [BLAST]검색을 수행하였다. (Standard nucleotide-nucleotide BLAST를 사용하기 위해 'blastn'이란 인수를, 사용할 DB를 지정하기 위해 'nr'이란 인수를 사용했다. 자세한 사항은
http://www.ncbi.nlm.nih.gov/BLAST/blast_program.html 와 http://www.ncbi.nlm.nih.gov/BLAST/blast_databases.html를 참고하기 바란다.)
[BLAST]검색 후 얻은 결과물은 b_result 변수에 저장되고, BlastParser를 이용해서 정보를 파싱할 수 있도록 b_record 변수로 변환하였다. b_record에는 결과물에 대한 각각의 인스턴스를 alignments 리스트로 저장하고 있다. 각 인스턴스에서 우리가 얻고자 하는, E Value가 0.5보다 작은 시퀀스들을 찾아내어 시퀀스 이름과 함께 결과 파일에 저장을 했다.
최후에 얻은 파일은 다음의 형식과 같다.(예제에서는 Helicobacter pylori라는 박테리아의 시퀀싱된 데이타 일부분을 사용했다. 많은 사람에게 위장 질환을 일으키는 유해한 박테리아이다.)
################# File Name:1.nt ################# seq:>ref|NC_000921.1| Helicobacter pylori, strain J99 complete genome e value:0.0 seq:>gb|AE001440.1|AE001440 Helicobacter pylori, strain J99 section 1 of 132 of the complete genome e value:0.0 seq:>gb|AE000523.1|AE000523 Helicobacter pylori 26695 section 1 of 134 of the complete genome e value:0.0 .....
작업 할 파일이 많아서 결과물을 얻는데 시간이 좀 걸리겠지만, K군은 소스코드를 실행시키고는 점심을 먹으러 나갈 수 있었다. 이때 P 선배는 400번째 논문 PMID에 대해 Drag & Copy & Paste를 하고 있었다.
(실제로 제대로 된 작업을 위해서는 웹 BLAST가 아닌 직접 Local BLAST를 설치, 운영하고 자체적으로 DB 미러링과 검색 자동화 작업을 해야 한다. 공개된 웹 BLAST를 많이 사용해 본 사람은 알겠지만 동일한 곳에서 반복 사용을 하면 우선 순위가 낮아??검색 속도가 느좋側?검색이 차단되기까지 한다.)
Biopython은..
Biopython(http://www.biopython.org)은 Bioinformatics(생물정보학) 연구, 혹은 그와 유사한 생명과학 연구에 필요한 도구들을 Python으로 만든 Free 소프트웨어이다. 유사한 프로젝트가 'Bio***'(BioPerl, BioXML, BioJAVA, BioCORBA)이란 명칭으로 서로 협동 관계 속에서 진행 중이며, Biopython은 그 중에 하나이다.
처음으로 Bio란 명칭을 달고 시작된 프로젝트는 Bioperl(http://bio.perl.org)이고 현재에 가장 많은 도구를 포함하고, 가장 많은 사용자를 보유하고 있다. 대부분의 생명과학 데이타들이 텍스트로 이뤄져 있기에, 텍스트를 다루는데 가장 강력한 도구 중 毬だ?펄이 널리 사용된 것은 당연한 일이다. 그렇다면 왜 BioPerl을 계속 사용하고, 확장하는데 힘을 쓰지 않고 Python이란 언어로 다시 비슷한 프로젝트를 진행하느냐고 궁금해 할 사람이 있을 것이다. Biopython FAQ(http://www.biopython.org/FAQ.shtml)에서는 Biopython과 Bioperl에 대한 비교로 다음과 같은 우스게 소리를 하지만,
Ummm... We use Python and they use Perl? We don't have any code and they do? They have users and we don't?
진짜 Python을 이용하는 이유는, 앞으로 계속 복잡해지는 생명과학관련 문제들을 다루는데 Perl보다는 객체지향적으로 설계된 Python이 더 효과적일 것이라는 판단에서이다. 물론 Perl보다는 Python이 대부분의 생명과학도나 개발자들에게 배우고 사용하기 쉬운 점도 큰 이유 중 하나가 될 것이다. 간단한 일에 대해서는 Python Command-line(Interactive Mode) 환경에서 쉽게 결과물을 확인하면서 작업을 할 수 있다는 것도 큰 매력이다.
Biopython으로 하는 일..
앞에서도 잠깐 얘기했지만, 생명과학 데이타들은 대부분 텍스트로 이뤄져있다. 최근에 완성되었다는 인간의 Genome도 (A,T,G,C같은)뉴클레오타이드로만 이뤄진 텍스트 파일이 약 3기가바이트에 이른다. 그리고 수많은 생명과학 데이타들이 각기 다른 포맷으로 존재하며, 오늘도 엄청난 양이 추가되고 있다. 이런 데이타들을 효율적으로 이용하기 위해서는 기존의 (마우스, 웹브라우저, 손)도구로는 한계가 있으며 좀 더 전문적인 전산 도구가 필요하게 되었다. 현재 많은 (상용 혹은 공개의)전산 도구들이 있으며, 인터넷을 통하면 손쉽게 구할 수 있다. 공개된 대표적인 전산 도구 중 하나가 Biopython이다.
Biopython은 손쉽게 여러 포맷의 생명과학 데이터들을 파싱하고, Python에서 이용하기 쉽도록 타입을 변환해준다. 다음과 같은 유명한 온라인 DB와 포맷들을 지원해준다.
BLAST output : StandaloneBLAST and WWWBLAST Clustalw FASTA GenBank PubMed and Medline Expasy files, like Enzyme, Prodoc, Prosite SCOP, including 'dom' and 'lin' files Rebase UniGene SwissProt
Biopython에는 위에서 열거된 DB사용과 포맷 파싱을 위한 라이브러리가 마련되어 있으나, 효율적으로 사용하기 위해서는 사용자가 Python이라는 언어를 쓸 줄 알아야 한다. 많은 생명과학도가 완성된 프로그램을 쓰는 정도의 능력이면 되지, 프로그래밍 같은 전산학적인 능력까지 있을 필요는 없다라는 생각을 하기 쉽다. 하지만, 나날이 방대해지고 복잡해질 생명과학 문제를 해결할 도구로써, 그리고 분량의 문제를 해결하면서 얻을 수 있는 새로운 시야를 가질 수 있다는 점에서 앞으로 전산학적인 능력 또한 생명과학도에게 필수가 될 것이다..
앞의 'K군의 이야기'에서는 연구실에서 가장 많이 쓰는 PubMed 검색과 BLAST검색을 예로 들어 가상의 시나리오를 엮어보았지만, 실제로 더 많은 일과 효율적인 작업을 위해서는 Biopython 코드를 직접 살펴보거나 관련 문서를 읽고 많은 공부를 해야 할 것이다. 물론 Python (http://www.python.org) 공부를 겸해서이다.
Biopython 문서 : http://www.biopython.org/wiki/html/BioPython/BioPythonCodeAnalysis.html Biopython API : http://www.bioinformatics.org/bradstuff/bp/api/
우리가 해야 할 일..
Biopython 프로젝트는 아직은 규모가 작다. (Bioperl을 제외한 다른 Bio** 프로젝트도 포함해서이다.) 사용해보면 미흡한 점도 보일 것이고, 버전이 업데이트 되면서 생기는 문제점들과 문서의 부족, 에러들을 많이 발견하게 될 것이다. 그만큼, 사용자가 늘어나는 것도 중요하지만 개발자로서 참여하는 인원도 절실히 필요하다.
앞으로 우리가 해야 할 일로 작게는 문서의 작성, 에러 수정, 번역(필자는 현재 http://bioinfo.sarang.net에서 문서를 한글화하고 관련 문서를 작성하는 프로젝트에 참여 중이다.)에서 더 나아가 기존의 코드를 보완하고 새로운 코드를 작성하는데 도움을 주고, 더 많은 생명과학 관련 일을 하는 사람들이 유용하게 쓸 수 있도록 해야겠다. (이는 Biopython에만 국한된 문제가 아니며 다른 모든 개방된 프로젝트에도 적용된다.)
Reference
http://www.biopython.org - Biopython 프로젝트 홈페이지, 관련 문서와 패키지를 얻을 수 있다.
http://bio.perl.org - Bioperl 프로젝트 홈페이지
http://http://www.ncbi.nlm.nih.gov/ - NCBI 홈페이지, PubMed와 BLAST를 웹을 통해 이용할 수 있다.
http://www.bioinformatics.pe.kr/ - 원세연 박사의 홈페이지, Bioinformatics에 관한 정보와 DB 미러링을 이용할 ?있다.
http://bioinfo.sarang.net/ - Bioinformatics관련 홈페이지로 Biopython 한글 문서화 프로젝트가 진행중이고, Bioinformatics WikiWiki 페이지와 local BLAST를 운영하고 있다.
http://linuxwithme.x-y.net - 필자의 홈페이지로 자료는 미흡하나 앞으로 자주 업데이트 시킬 것이다.