2022년 4월 1일 금요일

다중서열정렬(multiple sequence alignment)를 다루는 여러 프로그램 정리 - 최근의 경험을 중심으로

진작 이에 대한 글을 쓰려고 했지만 바쁜 일이 줄을 잇는 바람에 일주일이 지나고 말았다. 주말을 앞두고 큰 일들이 대략 마무리가 되어서 생각해 두었던 글을 쓰려고 한다.

'큰 일들'이라 써 놓고 보니 원래 단·복수를 엄격하게 구별하지 않는 우리말의 특성과는 다른 표현이 되었다. 요즘 '-들'을 붙여서 사용하는 말과 글을 많이 본다. 처음으로 외국어(보통은 영어)를 배우게 되면서 문법이라는 것을 익히게 된다. 모국어를 자연스럽게 습득할 때에는 규칙부터 먼저 배우지도 않고, 그럴 필요도 없다. 그런데 외국어 학습을 위해 어쩔 수 없이 문법이라는 것에 길들여 지면서, 그 외국어의 규칙에 자꾸 국어를 맞추려고 하는 일이 생기는 것 같다.

나는 스케이트가 있다.

전혀 이상할 것이 없는 문장이다. 그런데 이를 '나는 스케이트를 갖고 있다'라고 써야만 할 것 같은 느낌이 든다. '스케이트를'이라고 해야 확실한 목적어가 되니까? 초등학교 다니던 시절, 주어의 개념을 알지 못해서 무척 애를 먹었었다. 위 문장에서는 '나는'이 주어임이 명백하다. 하지만 다음은 어떨까?

스케이트가 집에 있니?

이 문장의 주어는 무엇일까? 묻는 말이니 '너는'이라는 주어가 생략된 것으로 보아야 할까? 오히려 '스케이트가'를 주어로 봐야 하는 것이 아닐까? 영어식 문법으로 생각하면 모든 것이 이상하다. 우리말의 서술부에 있는 말들을 동사라고 틀에 찍듯이 말하기는 참 어렵다고 본다. 그렇다고 해서 우리말이 느슨한 문법체계를 갖는다고 할 수도 없다. 문법은 올바른 말글살이를 위한 일종의 규칙인가, 혹은 현실 말글살이를 설명하는 최소한도의 방법인가? 나도 모르겠다.

맞춤법도 문법의 한 요소라고 할 수 있을까? 영어와 국문을 섞어서 글을 쓰는 것은 요즘 피할 수 없는 일이다. 자, 그러면 단어와 괄호 사이에 공백을 넣어야 하겠는가? '오늘 10 primer set 주문했어요'라고 하는 것이 옳은가, '오늘 10 primer sets 주문했어요'라고 하는 것이 옳은가.

이야기가 너무 딴 길로 샜다. 원래의 주제로 돌아가도록 하자. Clustal-Omega, MAFFT, MUSCLE, PRANK... 무엇을 써서 만들었든 다중서열정렬(MSA)은 내 스크립트 작성 실력으로는 다루기가 좀 까다롭다. 그저 tabular format으로 BLAST 결과를 얻어서 awk나 R로 적당히 처리하고는 한다. 이 수준에서는 MSA라고 하기도 어렵다.

대규모의 MSA를 적절히 트리밍하는 방법으로 나는 trimAlClipKIT를 즐겨 사용한다. trimAl 패키지에는 MS를 html 파일로도 예쁘게 만들어 주는(포맷 전환도 기능도 포함하여) readAl도 포함되어 있어서 쓸모가 많다. trimAl을 그냥 구글에서 검색하면 v1.2의 공식 웹사이트로 가게 된다. GitHub 사이트를 방문해야 v1.4를 만나게 된다.

MSA로부터 Shannon 엔트로피를 편하게 그리는 방법을 찾다가 ANDES라는 도구를 알게 되었다. ANDES란 Statistical tools for the ANalyses of DEep Sequencing의 약자이다. SourceForge 사이트에서 프로그램을 배포하는 걸 보면 개발된지 꽤 오래되었을 것이라는 느낌이 오지 않는가? 그렇다. 논문은 2010년에 나왔다.

최근 Bacillus 계열 미생물 1077개의 유전체에서 특정 유전자를 찾다가 또다시 MSA의 문제에 빠져들었다. 두 세 가지의 marker 유전자가 각 genome에서 얼마나 유사한 정도로 존재하는지를 확인하여 최종적으로 이를 검출할 수 있는 PCR primer 설계 위치를 실험자에게 제공하는 것이 직면한 과제였다. 마커 유전자를 query로 하여 1077개 genome에 대해서 BLAST를 해 놓은 뒤, 이로부터 hit 염기서열을 뽑아야 했다. BLAST를 결과를 tabular format으로 출력한 뒤에 위치 정보를 이용하여 subject genome file에서 오려낼까? 어휴, 스크립트를 짜려니 생각보다 지겹다. EMBOSS의 primersearch를 이용하여 amplimer 정보를 만든 뒤 이로부터 염기서열을 뽑는 Perl 스크립트는 만들어 봤지만, BLAST 결과를 이용하려니 왠지 자판을 두들기기가 싫어졌다. Perl이든 python이든 AlignIO를 잘 쓰면 가능할 것도 같았으나, 그러려면 매뉴얼을 보고 공부부터 해야 한다.

이미 만들어진 '바퀴'가 없을까? 검색을 거듭하니 Nigel Brown의 MView라는 소프트웨어가 튀어나왔다. GitHub의 소개 글을 그대로 인용해 본다.

MView is a command line utility that extracts and reformats the results of a sequence database search or a multiple alignment, optionally adding HTML markup for web page layout. It can also be used as a filter to extract and convert searches or alignments to common formats.

친근한 Perl로 짜여져 있으면서 2020년까지 업데이트가 되고 있었으니 현실적으로 사용하는 데에도 문제가 없을 것으로 생각했다. 논문은 언제 나왔을까? GitHub 웹사이트를 스크롤하여 아래로 내려가 보니... 세상에! 1999년이다(PubMed 링크). 2000년에 Trends in Genetics에 논문으로 실렸던 EMBOSS 패키지보다 더 이른 시절에 나온 형님인 셈이다. 삼가 경의를 표하는 바이다!

MView는 BLAST+의 '-outfmt 7' 포맷 결과를 입력할 수 있다고 한다(input formats). 이건 좀 이상하지 않은가? tabular format output file에는 서열 정보가 없는데 무슨 수로? Alignment가 다 나타나는 일반적인 출력 결과를 넣으니 HSP에 해당하는 subject의 서열이 잘 나왔다. 그런데 결과를 찬찬히 살펴보니 많이 부족하다. BLAST DB는 천개가 넘는 서열로 이루어져 있고 거의 모든 서열에 대해서 높은 수준으로 hit가 나왔는데 MView에서는 정확히 250개에 대해서만 출력을 하였다. 매뉴얼을 아무리 뒤져 보아도 한 query에 대하여 최대 250개의 hit만 처리한다는 말은 없는데 왜 그런 것일까? 

하긴 alignment를 눈으로 보기에 편하도록 전환하려고 MView를 쓰면서 1천개가 넘는 서열을 투입하는 것은 너무 과하지 않은가. DB를 250개 단위로 끊어서 BLAST를 나누어 진행하고, MView로 추출한 서열을 도로 합쳐서 MAFFT로 재정렬하는 것으로 원하는 목표를 이루었다. 좀더 시간을 갖고 MView의 세계를 탐험해 봐야 되겠다. 

아직 테스트는 하지 않았지만 AMAS(a fast tool for alignment manipulation and computing of summary statistics)라는 것도 알게 되었다. 2016년에 논문이 나왔으니 ClipKIT(2020년)만큼이나 젊은 프로그램이다. 논문의 표 1에서는 다른 유사 소프트웨어와 특성을 비교해 놓았다. FASconCAT-G까지는 잠깐 써 보았었다. 아이구, 이제 이런 프로그램을 더 이상 조사하는 것은 그만 두도록 하고, 알고 있는 것이나 잘 써야 되겠다.

BioPerl이나 BioPython 등을 이용하여 내 입맛에 딱 맞는 스크립트를 만드는 것도 보람이 가득한 일이겠으나, 이미 개발된 도구를 잘 찾아서 매뉴얼을 숙독해 나가면서 사용법을 익히는 것이 훨씬 생산성이 높다는 것은 이미 여러 차례 경험하였다. bedtools도 그런 것 중의 하나이다.

다중서열정렬의 실용적인 목표(보통은 프라이머 설계로 끝나고는 하였다)에 관심을 갖게 된 것은 바로 신종코로나바이러스에서 비롯되었다. 힘들여 논문을 하나 써서 제출하고 major revision 판정을 받아 놓으니 정말 만감이 교차한다. 그 후로는 비슷한 일에 대한 요청이 계속 생기니 우연이라고 할 수도 없고...

댓글 없음: