2021년 9월 3일 금요일

똑똑한 다중서열정렬(multiple sequence alignment, MSA) 트리밍 도구, ClipKIT

이발소를 연상하게 하는 ClipKIT의 로고부터 살펴보자. 논문은 2020년 PLoS Biology에 "ClipKIT: A multiple sequence alignment trimming software for accurate phylogenomic inference"라는 제목으로 발표되었다.

계통수를 그리려면 Clustal 시리즈의 소프트웨어, 혹은 muscle, mafft, prank 등의 프로그램이 만든 다중서열정렬(MSA) 결과물을 이용해야 한다. MSA 내부에 존재하는 무의미한 gap 등을 처리하는데 보통 'trimAl -automated1'을 즐겨 사용하였다. 문제는 십만 개가 넘어가는 바이러스 게놈의 MSA를 trimAl에 밀어넣으니 도무지 끝이 날 조짐이 보이지 않는 것이었다. 이 소프트웨어는 다중 쓰레드를 지원하지도 않으므로 그냥 기다리는 것 외에는 방법이 없었다.

대안을 찾기 위하여 검색을 거듭한 결과 몇 달 전에 ClipKIT이라는 소프트웨어를 알게 되었다. 트리밍 전략이 매우 단순하고, 상식적인 시간 안에 결과를 내어놓기 때문에 즐겨 사용하게 되었다. 

MSA를 트리밍하려면 각 컬럼(즉 염기 위치)에 갭이 몇 개인지, 서로 다른 염기가 있는지, 혹은 동일한 염기가 있는지 등을 수치화해야 한다. MSA의 품질을 나쁘게 만드는 가장 중요한 요인은 갭이므로(물론 진화적인 의미가 있는 갭도 있겠지만), 이것이 MSA 트리밍 도구에 제공하는 옵션에서 매우 중요한 역할을 한다.

갭과 관련한 수치는 그 정의를 명확하게 이해하는 것이 중요하다. 이것을 제대로 알지 못해서 초창기에 많은 혼란을 겪었다. 예를 들어서 100개의 염기서열을 정렬하였더니 어느 위치에서 15개는 염기가 있고 85개는 갭이 있다고 하자. trimAl에서 사용하는 gap score는 0.15가 된다. 이 프로그램에서 사용하는 gap score의 정의는 얄궂게도 갭이 없는 것들의 비율이다.
Sg = 1.0 - (number of sequences with a gap / n)

정의를 이렇게 해 놓으니 갭이 많을수록 gap score는 작아진다. 상식적으로 생각해도 이해가 잘 안된다. 갭이 많으면 gap score도 크게 나타나는 것이 자연스럽지 않을까? 어쩌면 'score가 커야 좋은 것'이라는 인식에 맞추어서 이렇게 정의를 내렸는지도 모른다. 이를 트리밍에 적용하려면 'trimal -gt 0.190'과 같이 적용한다. 즉, gap score가 최소한 0.19가 되지 않는 컬럼은 MSA에서 잘라(트림)내라는 뜻이다. 100개의 시퀀스 중에서 19개 혹은 그 이상이 염기를 제시하고 있어야 트리밍을 당하지 않는다는 것이다. '-nogaps'는 '-gt 1'과 동등하며, 어느 한 시퀀스라도 갭이 있으면 그 컬럼을 제거한다는 뜻이다. 반대로 '-noallgaps'는 모든 염기서열이 갭으로만 구성된 컬럼을 제거하게 된다.

CipKIT에서는 gappyness라는 지표를 쓴다. gapyness의 정의는 다음과 같다.

Gappyness = number of gaps / entries in alignment

갭이 많으면 gappyness도 커진다. Gap score보다는 직관적으로 이해하기 더 좋은 지표이다. 그리고 gap score + gappyness = 1.0이 됨을 쉽게 알 수 있다. ClipKIT에서 gappyness를 기준으로 트리밍을 하려면 'clipkit -m gappy 0.8'이라고 옵션을 제공하면 된다. 기본 gappyness는 0.9이다. 

정해진 threshold 값을 옵션으로 주지 않고 프로그램이 스스로 결정하게 만들 수도 있다. CipKIT에서는 smart-gap이라는 방법이 이에 해당한다. 이를 사용하면 일정한 값을 주어서 실행한 것보다 트리밍한 뒤 남는 MSA의 길이가 더 길다고 한다.

ClipKIT의 개발자에게 경의를 표하는 바이다.

댓글 없음: