2020년 1월 31일 금요일

Jvarkit: Java utilities for Bioinformatics

오늘의 글은 jvarkit라는 자바 응용프로그램을 소개하기 위함이 아니다. javakit에 포함된 blastn2snp라는 것을 컴퓨터에서 컴파일하는데 겪었던 어려움과 그 해결 경험을 공유하기 위함이다.

Perl은 가끔 코딩을 하고, python은 기초 수준의 교육만 두어 차례 받은 상태라서 코딩을 직접 할 수준은 아니지만 수도 없이 많은 package와 application을 설치하여 사용하지만, Java에 대해서는 부끄럽게도 지식이 전무하다는 것이 나의 현 상태이다. JRE가 설치된 컴퓨터에서 겨우 Java 응용프로그램을 설치하여 쓰는 정도이다. 정확히 말하자면 설치라기보다는 압축을 푸는 정도의 일이다. 서로 다른 Java 환경을 관리하기 위해 alterenatives 명령어를 쓰는 것도 포함해서이다. JVM(Java Virtual Machine)까지 들어가면 머리가 아파진다. 난 자바 개발자가 아니고 그렇게 되고 싶지도 않다. 그런데 상황은 나를 그렇게 만들지 않는다.

"JDK란 무엇인가" 자바 개발 키트 소개와 설치하기

아주 드물게 Java 소스 코드로 배포되는 것을 사용하려면 골치가 아프다. 최근에 자바 응용프로그램으로서 첫 좌절을 안겨준 것은 Sanger Institute에서 개발하고 배포하는 Artemis의 최신버전이었다(소스코드는 GitHub에 있음). Windows에서는 아주 깔끔하게 잘 돌아간다. 그런데 Git의 최신 버전을 클로닝하여 쓰려고 하면 mvn(Apache Maven)이라는 것을 사용하여 빌드를 해야 되는데, 여기서부터 지식이 부족하여 애를 먹게 된다. 물론 과거에는 .jar 파일을 배포했으니 메이븐이든 뭐든 알 필요가 없었다.
아파치 메이븐(Maven)은 자바용 프로젝트 관리 도구이다. 아파치 앤트의 대안으로 만들어졌다.
뭔 말인지 이해가 잘 안되니 이미 컴파일이 되어 배포되는 artemis-unix-release-18.1.0.tar.gz를 가져다가 테스트해 보자. 실행은 되는데 염기서열 view에서 글꼴 폭이 맞지 않아 아주 보기가 싫다. 윈도우에서는 이렇지 않다. 이건 어떻게 해결해야 하는지 잘 모르겠다.

Fastq file(raw sequencing read)이 아니라 완성된 유전체 서열을 레퍼런스와 비교하여 SNV 관련 정보를 뽑을 일이 생겼다. Fake read를 만들어서 일반적인 variant analysis를 하거나, snippy를 돌리거나(이것도 fake read를 사용하는 점은 마찬가지), 아니면 유전체 서열 그대로 nucmer를 실행하여 SNV 정보를 뽑는 것은 익숙하다. 하지만 비교 대상인 두 유전체 서열(bacterial complete chromosome)이 머리부터 발끝까지 거의 그대로 정렬된다는 것을 알고 있는 상태라서 이런 간접적인 방법은 쓰고 싶지 않았다. BLAST를 실시하여 HSP의 위치를 잘 파악한 다음, 그 결과물에서 SNV 정보를 추출하는 방법이 적당하다고 생각하여 어떠한 도구를 쓰면 되는지 검색을 해 보았다. 개인적으로는 Phil Green의 cross_match를 가장 좋아하지만 alignment 출력물을 처리해주는 Perl 혹은 Python 라이브러리가 없다. 구글 검색을 해 보니 Jvarkit 패키지의 blastn2snp('print indel/mismatch in a blastn stream)가 아주 적당해 보였다. Jvarkit는 누가 만들었나? GitHub 주소에 보이는 'lindenb'이라는 문자열이 왠지 낯설지 않다. 아! BioStar 커뮤니티에서 가장 크게 기여한 Pierre Lindenbaum이었다(구글 스칼라). 내가 2016년에 작성한 글(링크)에서 Pierre Lindenbaum을 잠시 언급한 일이 있다. BLAST 결과물을 XML로 출력하여 blastn2snp에 제공하면 된다. 설치 방법을 알아보자.

$ git clone "https://github.com/lindenb/jvarkit.git"
$ cd jvarkit
$ ./gradlew blastn2snp

gradlew? 이건 또 뭔가? 그레이들(gradle)이라는 프로그램을 돌리는 wrapper 같은데..
Gradle은 Groovy를 이용한 빌드 자동화 시스템이다.
어이쿠, 내가 이것까지 알아야 하나?
gradle이라는 것을 알았을 때 일단 한숨이 나왔다. 이제 겨우 maven에 적응되었는데 또 다른 툴이라니 오 마이 갓! 그런데 권남님의 블로그에서 [maven을 넘어 gradle로 가자]라는 글을 읽고 공감되었다. 출처: 와이케이의 마구잡이 
사실 명령행에서 복사하여 붙여넣기만 할 줄 알면 자바 소스를 컴파일하는데 별 어려움은 없다. maven이든 gradle이든 개발자가 아니라 단순한 사용자 입장에서는 그 깊숙한 얼개를 알 필요는 없는 것이다. 그런데... 문제는 gradlew 실행 시 파일 다운로드가 안된다는 것이다. 파견 근무지에서 1년 가까이 내 속을 썩이던 SSL/HTTPS/인증서 문제가 고스란히 남아있었다. 그래도 솟아날 구멍이 이제는 있으니 바로 아마존 웹 서비스 EC2이다. 시험 삼아 돌리고 있는 인스턴스에서 설치를 하니 아무런 문제가 없다. Lindenbaum이 만든 수많은 자바 응용프로그램을 이제 순조롭게 빌드하여 쓸 수 있게 되었다.

blastn2snp의 사용법은 다음과 같다.

$  java -jar dist/blastn2snp.jar < blast.xml | column -t

생소한 명령어가 또 하나 등장하였다. column? 'man column'을 쳐서 매뉴얼을 읽어봐도 샘플이 없으니 잘 이해가 가질 않는다. Linux column command tutorial for beginners (with examples)라는 글이 도움이 되었다.

여담이지만 무인도에 가지고 가고 싶은 소프트웨어 10개를 꼽으라면 나는 cross_match와 artemis 두 개를 최우선적으로 선택할 것이다.

Phil Green은 1997년 Genome Research에 이런 글을 기고했었다(링크).

Against a Whole-Genome Shotgun


Long read sequencing technology를 이용하여 플라스미드 라이브러리 제작 과정 없이 인간 유전체를 금방 읽어버리는 2020년, Phil Green이 이 글을 읽으면 어떤 생각이 들까? 아주 죄송스런 말이지만 요즘 쓰는 저속한 말로 평가하자면 '꼰대의 뻘글' 정도 취급을 당할지도 모르겠다. 웃자고 쓰는 말이니 이 글을 읽으시는 분은 불쾌하게 생각하지 마시길... 하지만 NGS 시대에도 Phil Green의 유산은 당당하게 남아있다. 지금도 쓰이는 Phred score라는 용어는 1시대 시퀀싱 시대의 basecaller인 phred라는 프로그램에서 온 것이고, phred를 만든 사람이 바로 Phil Green이니까. Phred는 Phil Green's (혹은 Phil's) read editor에서 온 것이다. 지금은 구글을 뒤지면 Phred가 무엇을 의미하는지를 묻고 답한 글이 쉽게 보이지만, 나는 이 정보를 Consed의 개발자 David Gordon에게 직접 이메일로 물어서 알아낸 것이다. Consed와 David Gordon은 내 블로그에 몇 차례 소개되었다. 이러다가 온라인에 '유전체 탑골공원'이라도 만들어서 이 분야의 원로들을 소개하는 것 아닌지 모르겠다.

댓글 없음: