2016년 8월 31일 수요일

Linuxbrew에 감동하다!

그림 출처: https://avatars2.githubusercontent.com/u/10321259?v=3&s=400
CentOS 6.X를 쓴다는 것은, 낮은 버전의 파이썬(v2.6)과 gcc 및 glibc의 뒤엉킴으로 인한 문제를 늘 떠안고 살아야 함을 뜻한다. 컴퓨터를 CentOS 7.X로 갈아 엎거나 우분투로 마이그레이션하면 대부분의 문제는 해결된다. 그러나 게으른 컴퓨터 사용자이자 관리자인 나는 이러한 대변혁(?)을 차일피일 미루어 왔는데...

놀랍게도 Linuxbrew는 이러한 고민을 한 방에 해결해 주었다. 어제 설치 작업에서 Perl 버전이 약간 꼬이면서 잠깐이나마 고생을 하였으나, 최신의 프로그램 개발 환경(파이썬을 포함하여)을 일반 유저 권한으로 설정함으로써 생명정보 분석에 필요한 프로그램들을 아주 쉽게 설치할 수 있게 되었다.

원래 pyenv를 써서 파이썬 2.7.8을 설치하면 khmer 설치가 간단히 끝날 것으로 생각했었다. 그러나 C 개발 환경은 그대로 예전 상태로 남아있어서인지 에러가 발생하고 말았다. 그러면 혹시 Linuxbrew가 해답이 되지 않을까 싶어서 이를 활성화시키고 pip install khmer를 실행하니 순식간에 설치가 완료되었다. 이렇게 허무할 데가 있는가.

그동안 나를 혼란에 빠뜨렸던 easy_install, setuptools, virtualenv 등등은 이제 차차 잊어버리도록 하자. 어차피 CentOS 6.X에서 파이썬 2.7 이상을 설치하고, gcc를 업그레이드하는 것은 리눅스 배포판을 바꾸는 것 이상의 완벽한 해결책이 아니었다. 참고로 pip와 virtualenv의 활용에 대한 참고자료로서 김형용님의 글을 링크한다. 어차피 나는 파이썬 버전 환경에 맞추어서 이것저것을 시도할 사람은 아니니, Linuxbrew로 많은 문제를 해결할 수 있으리라 기대한다.

다음번 도전 목표는 어설프게 설치한 metAMOS를 Linuxbrew에서 깔끔하게 재설치해 보는 것이다.

Linuxbrew를 만든 개발자에게 감사를! 페이팔로 기부금이라도 좀 보내고 싶은 마음이 든다.

이것만큼은 주의하자.

su를 실행하면 Linuxbrew 환경이 그대로 이어지므로 yum으로 패키지 업데이트를 하면 시스템이 엉망이 될 수도 있다. CentOS의 yum은 파이썬 환경과 밀접히 연관되어 있어서 문제가 발생한다는 글을 읽은 적이 있다. 관리자 권한으로 패키지를 업데이트하거나 프로그램을 빌드할 일이 있다면 반드시 "su -" 명령을 사용하여 수행하자.

2016년 8월 30일 화요일

오래간만의 독서 기록

요즘은 독서량도 줄고 더군다나 기록도 잘 하지 않는다. 최근 읽은 두 권의 책이 심금을 울리는 바 있어서 이렇게 기록을 남긴다.


1. [회사의 목적은 이익이 아니다] 요코타 이데키 지음/임해성 옮김

13년 연속 고객만족도 1위라는 기록을 세운 넷츠토요타난고쿠(토요타 자동차 딜러)의 비밀을 기록한 책. 누구나 당연히 회사의 목적은 이익의 실현이라 생각하겠지만, 소중한 것을 가장 소중하게 여기는 자세를 가지고 이를 실행에 옮기는 것이 중요하다. 경제로 이어지는 도덕을 추구해야 하고, 목표(이익)보다 목적(사명)을 중요시하며, 아무리 많은 비용이 들어도 채용에 가장 큰 힘을 기울이고 회사를 직원이 성장하는 장으로 만든다는 요코타 창업자의 철학이 잘 드러난 책이다. 이 책은 리더십에 대한 책은 아니다. 그러나 모든 구성원이 행복해하고 승리하는 삶을 만들겠다는 목표로 회사를 운영한다는 것은 결국 매우 바람직한 리더의 자세 아니겠는가?

2. [왜 학교는 질문을 가르치지 않는가] 황주환 지음

지난 봄에 읽은 책에서 정말로 뼈저리게 느낀 점이 있었다. 우리 한국 사회에서 가장 부족한 것은 연대의식이 아닐까? 타인의 어려움에 공감하는 것 역시 소극적인 의미에서 연대의식의 발로라 할 수 있다. 자기 자식이 좋은 학교에 가는 것, 그리고 자기가 소유한 부동산 가격이 오르는 것 말고 과연 한국의 평균적인 시민이 최근 들어서 정의 실현과 공동의 이익을 위해 한 목소리를 내 본 적이 있는가? 광우병 쇠고기 수입 문제나 세월호 사건 등 극히 예외적인 사례가 있지만 말이다. 학교는 더 이상 순수하고 이상적인 집단이 아니며, 우리 사회가 갖고 있는 모든 문제들이 고스란히 녹아있다. 왜 우리는 비판하지 않고, 질문도 하지 않는가? 시골 교사가 써 내려간 사색과 질문들을 정말 가슴 아프게 읽었다.

천국과 지옥을 오가게 했던 Scalar-List-Utils

문제의 발단이 된 오전 포스팅: Genomics 시대에 phylogenetic tree 그리기

윗 글의 마지막 부분에 소개한 Roary를 CentOS 6.8에 설치하는데 문제가 있어서 사무용 컴퓨터(윈도우 7)에 VirtualBox로 우분투 16.04를 설치하고 여기에 Roary를 깔아서 sample data를 성공적으로 분석하였다. 'fast and dirty' FastTree는 메모리 부족으로 돌아가지를 않아서 CentOS 쪽으로 core gene alignment를 보내서 계통수를 그린 후 다시 우분투쪽으로 보내서 그림을 마무리하였다.


CentOS 쪽 서버에서 linuxbrew와 perlbrew를 만지작거리다보니 Perl 작동이 뭔가 심상치않음을 느꼈다.


$ perldoc Bio::Seq
Can't load '/usr/lib64/perl5/auto/List/Util/Util.so' for module List::Util: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /usr/lib64/perl5/auto/List/Util/Util.so) at /usr/lib64/perl5/XSLoader.pm line 70.
 at /usr/lib64/perl5/List/Util.pm line 23.
Compilation failed in require at /usr/lib64/perl5/Scalar/Util.pm line 23.
Compilation failed in require at /usr/local/share/perl5/File/Temp.pm line 18.
BEGIN failed--compilation aborted at /usr/local/share/perl5/File/Temp.pm line 18.
Compilation failed in require at /usr/share/perl5/Pod/Perldoc.pm line 1548.


# perl -MCPAN (원래 -e shell까지 붙여야 정상이다)
Attempt to reload Scalar/Util.pm aborted.
Compilation failed in require at /usr/lib64/perl5/Safe.pm line 4.
BEGIN failed--compilation aborted at /usr/lib64/perl5/Safe.pm line 4.
Compilation failed in require at /usr/local/share/perl5/CPAN.pm line 56.
BEGIN failed--compilation aborted at /usr/local/share/perl5/CPAN.pm line 56.
Compilation failed in require.
BEGIN failed--compilation aborted.

갑자기 웬 GLIBC_2.14 에러가 나는 것일까? /usr/lib64/perl5/auto/List/Util/Util.so 라이브러리의 날짜를 살펴보니 바로 오늘 낮이다. 하반부 에러에서 보이는 Safe.pm 모듈의 네번째 줄에서도 use Scalar::Util이 선언되었다. 아마도 오늘 linuxbrew를 시험삼아 설치하다가 설정이 틀어진 모양이다. 이를 어떻게 하나... Perl을 다시 설치하기도 이상하고, OS를 새로 업그레이드하는 것도 엄두가 안나고...

눈 앞이 캄캄해졌다. 이를 어쩐다. 생각을 해 보자, 생각을... 혹시 List::Utils만 새로 설치하면 되지 않을까? 내 컴퓨터에서는 어차피 GLIBC_2.14를 사용하도록 컴파일이 되지 않으니까 말이다. CPAN에서 Scalar-List-Utils 1.45를 소스로 받아다가 빌드하여고 인스톨하였다. 설치 과정 중에 아무런 문제가 발생하지 않았고, 설치 후에는 Perl 동작도 정상 상태로 되돌아왔다. 

휴! 가슴을 쓸어내린다.

그러면 CentOS에서 Roary 설치 작업을 마무리해 보도록 하자. brew install로 설치하면 에러가 발생하던 blast+ 2.4.0은 rpm 패키지를 직접 받아서 실로 오랜만에 사용하는 rpm -Uvh 명령으로 설치해 버렸다. 항상 yum만 사용하다 보니 rpm을 명령행에서 직접 실행하는 것도 매우 새롭다.

웹사이트에서는 다음 명령으로 Roary 설치를 마치도록 되어 있었다.

sudo cpanm -f Bio::Roary

sudo를 하지 않고 직접 수퍼 유저로 전환한 뒤 .linuxbrew/bin/cpanm -f Bio::Roary를 실행하였다. 외견상으로는 아무런 문제 없이 설치가 끝났다. 자, 그런데 roary 프로그램은 어디로 갔나? 우분투에 설치했을 때에는 /usr/bin/roary로 복사가 되었다. CentOS에서는 어디로 갔을까? root의 .cpanm/build.log까지 뒤져서 겨우 /usr/local/bin/roary로 다른 스크립트와 같이 복사가 되었음을 알아내었다. 

perl -MCAPN -e shell 또는 cpan 유틸리티가 있음에도 불구하고 cpanm을 따로 쓰는 이유가 뭔지를 잘 모르겠다. 

Genomics 시대에 phylogenetic tree 그리기

Next-generation sequencing 시대가 되면서 미생물 연구자들도 큰 수혜를 입게 되었다. 유전체 서열 정보를 이용한 상세하고 정확한 phylogenetic tree를 그리는 것이 그 중 하나다. 나는 원래 phylogenetic analysis에 대해서는 제대로 배운 바가 없다. 생물정보학에서 매우 중요하게 다루는 주제인 것은 부정할 수 없는 현실이니 늦었다 생각할 때가 가장 빠른 때라 생각하고 스스로 공부를 해 나가야 하지 않겠는가?

계통수를 그린다는 것은 여러 phylogenetic level에서 가능한 것이다. Bacillus cereus group(대표적인 구성원으로는 B. cereus, B. thuringiensis and B. anthracis) 처럼 최소한 수십 종의 세균이 서로 제대로 구별이 되지 않는 사례를 생각해 보자. 아래의 논문에서는 whole-genome sequence-based BLAST distance phylogeny(GBDP), 16S rRNA gene analysis 및 새로운 MLSA(논문에서는 a novel variant of multi-locus sequencing analysis, nMLSA라고 부름)을 사용, 224개 스트레인의 유전체 서열을 분석하여 이들이 30개의 클러스터로 분류되며 이 중에서 11개는 알려진 종이지만 일부분은 서로 겹치는 것을 보고하였다.

Genomic insights into the taxonomic status of the Bacillus cereus group. SCIENTIFIC REPORTS | 5:14082 | DOI: 10.1038/srep14082 (PubMed) ... 2015년

이 논문에서는 pXOn 플라스미드와 cry 유전자와 같이 B. cereus 그룹 연구에서 중요한 주제를 역시 다루고 있지만 오늘의 블로그 포스팅에서는 생략하도록 하자. MLSA에는 꼭 이 유전자 세트를 써야 한다고 정해진 것은 없다. Prokaryotic taxonomy에 입각한 MLSA에 관한 다음의 최신 리뷰를 보면 공부가 될 것이다.

Multilocus sequence analysis (MLSA) in prokaryotic taxonomy. Systematic and Applied Microbiology 38(4) 237-45, 2015. (Science Direct)

위에서 언급한 Bacillus cereus group 논문에서는 미생물의 생존에 필수적인 것으로 알려진 최소 유전자 세트(233개의 단일 카피 유전자, 근거 논문은 Determination of the core of a minimal bacterial gene set. Microbiol Mol Biol Rev 68, 518–537 (2004))에서 해상도가 좋은 것으로 생각되는 20개 유전자를 골랐다고 한다. 계통수의 시각화에는 iTOL(interactive tree of life) 웹 서버가 사용되었다.

Intraspecies analysis

동일 종 내에서 서로 다른 스트레인들이 어떻게 진화해 나가는지를 살펴볼 세밀한 계통수를 원한다면 이상의 방법과는 다른 전략을 구사해야 한다. 내가 어제부터 집중적으로 들여다보기 시작한 것도 바로 이 분야이다. 종 내의 비교 분석이라면 SNP을 추출하여 사용하는 것이 가장 바람직할 것이다. 가장 간단하게는 하나의 reference genome을 선정하여 다른 비교 대상으로부터 생산된 short read를 여기에 매핑한 뒤 SNP을 추출하여 계통수를 그리는 것이다. 이를 reference-mapping-based phylogeny reconstruction이라고 부르자. REALPHY(Mol. Biol. Evol. 31(5):1077–1088 doi:10.1093/molbev/msu088 2014년)는 하나의 reference를 설정함으로 인하여 생기는 오류를 감안한 분석 도구이다. 매우 감사하게도, reference와 비교 샘플(genome fragments or sequence reads)를 업로드하여 트리까지 그려주는 웹 서버를 공개하였다.

두번째로 살펴본 논문은 PhyME에 관한 것이다(bioRxiv 2015). 이 프로그램은 read, draft 혹은 complete genome sequence를 입력으로 하여 core genome alignment를 수행하고, SNP를 동정한 뒤 계통수를 작성하고 진화 분석을 실시하는 도구이다. REALPHY나 PhyME 모두 whole-genome SNP를 이용한 계통수 작성 도구라고 보면 된다. PhyME를 사용하기 위해 필요한 외부 프로그램이 꽤 있지만 INSTALL.sh 설치 스크립트를 실행하면 알아서 다운로드하여 하위 디렉토리에 깔아준다. 사전에 필요한 프로그램 설치가 늘 나를 괴롭히는데, metAMOS에서 이미 충분히 경험하였다.

PhyME 패키지에 포함된 샘플 데이터셋을 분석해 보았다. phame.ctl 파일을 편집하여 환경 설정을 하게 되어있다. 레퍼런스 디렉토리에는 총 9개의 에볼라 바이러스 유전체(complete 상태이며 각 19kb)가 들어있는데 이 중에서 annotation(GFF3)을 동반한 KJ660347이 reference로 지정되었다. 비교 샘플은 complete sequence와 contig가 섞인 상태이다. 기본 설정으로는 FastTree를 이용하여 계통수를 그리게 되는데, RAxML도 선택 가능하다. 트리는 whole genome SNP 및 CDS SNP x 2(unrooted & rooted)의 총 4개가 만들어진다. 여기에서 알 수 있듯이 coding 영역에 발생한 SNP를 동정하려면 reference genome sequence와 더불어 GFF3 file이 필요한 것이다.

트리 파일은 newick 포맷이라서 여러가지의 시각화 도구를 이용하여 그림을 그리면 된다. 간단하게 웹 브라우저에서 트리 그림을 볼 수 있는 treeview에 파일 내용을 copy & paste를 해 보았다. 

마지막으로 살펴본 논문은 Roary에 관한 것이다(Bioinformatics, 31(22), 2015, 3691–3693). 이 프로그램은 원래 SNP 분석이 아니라 미생물의 pan genome analysis를 위한 것이다. 즉, 여러 종류의 미생물 유전체를 비교하여 공통적으로 존재하는 유전자를 찾아내는 것이 주된 목적이다. 그렇지만 core gene alignment 파일이 만들어지기 때문에 이를 활용하여 여러가지 다른 분석을 할 수가 있다. 막상 Roary를 설치하려고 보니 Fedora나 CetOS에서는 linuxbrew라는 매우 생소한 패키지 매니저를 사용하도록 되어있다. 그러나 매우 불행하게도 linuxbrew를 이용하여 NCBI blast+를 빌드하다가 에러가 발생하고 말았다. linuxbrew는 루트 권한 없이도 프로그램 환경을 구축해주는 아주 편리한 도구이지만, 이미 깔려 있는 라이브러리와 충돌하는 문제가 발생하는 것으로 보인다. 그래서 임시방편으로 사무용 컴퓨터(윈도 7)에 VirtualBox를 설치하여 우분투 16.04 환경을 구축한 뒤, sudo apt-get install roary 명령어 한 방으로 설치를 모두 끝냈다. 유전체 주석화를 위하여 필수적인 도구인 prokka는 여기를 참조하여 설치하였다. 주로 CentOS에서 작업을 하고는 있으나 '신선하게' Ubuntu를 설치한 시스템이 결국은 필요하다는 생각이 점점 엄습해 온다!

Roary pan genome analysis tutorial은 여기에 있다. 내가 특별히 관심을 갖는 결과물은 각 genome이 공통적으로 가지는 유전자의 여부를 매트릭스 형태로 표현한 gene_presence_absence.csv 파일이다. 이를 core gene alignment 파일과 같이 사용하여 다음과 같은 pan genome matrix 그림을 그릴 수 있다. 이 그림의 작성법은 tutorial에는 없고 여기의 Visualizing Results 항목을 참조해야 한다. Roary 실행에서 tree file이 기본적으로 주어지지는 않으므로, core gene alignment 파일을 FastTree에 투입하여 만들어야 한다.

그림 출처: https://github.com/microgenomics/tutorials/blob/master/pangenome.md

오늘 소개한 것들은 매우 가까운 미생물 유전체들의 비교 분석에 쓰이는 도구들의 일부에 불과하다. 그 배경을 이루는 이론적 지식을 습득해 나가는 것은 앞으로의 숙제가 되겠다. 소프트웨어 도구를 찾는 과정에서 독일 하이델베르크에 위치한 Exelixis 연구실을 알게 된 것도 예상하지 못했던 성과 중 하나이다. "Our Mission - Enable Research in Evolutionary Biology" 멋있지 않은가?

2016년 8월 27일 토요일

SyntaxHighligher test 두번째

이번에는 Perl 코드에 대해서도 제대로 하이라이트가 되는지 살펴보자.

#!/usr/local/bin/perl
 
$name = "Ali";
$age = 10;

$status = ($age > 60 )? "A senior citizen" : "Not a senior citizen";

print "$name is  - $status\n";

잘 된다! 예전에는 텍스트(특히 코드)를 있는 그대로 보이게 하려고 노력을 별로 기울이지 않았다. 그러다보니 저장한 후에 열어보면 의도한 대로 되지 않은 경우가 많았다. 이제는 SyntaxHighlighter의 도입으로 좀 더 세심한 글 작성이 가능할 것이다.

처음에 참조한 사이트의 설명 대로 한번에 성공하지는 못했다. 구글 블로거의 템플릿(html)을 열어서 필요한 코드를 삽입하였더니 script 태그가 닫혀있지 않다는 오류 메시지가 나와서 이를 일일이 넣어주고 Bash와 Perl을 위한 브러쉬를 설정해 주니 비로소 제대로 작동하게 되었다.

이 모두가 지난 3일 동안 참석했던 KOBIC 차세대생명정보학 교육의 부작용이다! 괜히 일 만들어서 도전하기...

SyntaxHighlighter test

package tutorial;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorld extends ActionSupport {
  private String name;
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String execute() {
    name = "Hello, " + name + "!"; 
    return SUCCESS;
  }
}
참조 사이트(예제): blogger(구글 블로그)에서 소스코드 예쁘게 삽입하기(SyntaxHighlighter 사용하기) 또는 Blogger - SyntaxHighlighter HTML Configuration

단, 모바일 기기에서는 제대로 표현되지 않는것 같다.

R용 SyntaxHighlighter brush가 이미 공개되어 있는데 설치하는 방법을 잘 모르겠다.

2016년 8월 26일 금요일

Jupyter로 더듬더듬 플롯을 그려보다


어제의 교육에서는 '내가 이걸 과연 해야 되는가?'하는 혼란스런 생각만 머릿속에 가득했었다. 그런데 오늘 데이터를 이용하여 몇 가지 간단한 플롯을 그려 보면서 약간 생각이 긍정적으로 바뀌었다. 내가 가장 즐겨쓰는 gnuplot으로 multiplot 하나를 그리려면 마진을 조정하는 것부터 시작하여 골치아픈 것이 한두가지가 아니다. R 스타일의 데이터 구조 다루기를 다시 한번 공부할 필요는 있지만 jupyter에서 matplotlib과 pandas를 이용하면 정말 편하게 데이터의 시각화가 가능함을 배웠다. 

파이썬으로 짜여진 수많은 응용 프로그램 중에서 그래프를 출력하는 것은 대부분 matplotlib을 사용한다. R이라면 ggplot2가 있다. 짧은 3일 동안의 교육이지만 다시 직장으로 돌아가서 복습해야 할 것들의 목록이 하나 가득 만들어지고 있다. R을 다시 들여다보는 것에서부터 시작하자. 그리고 텍스트 파일의 입력 방식에서 Perl과 python이 어떻게 다른지를 정리하고, 이를 바탕으로 실무 차원에서의 응용을 위해 노력해 보자.