2015년 9월 25일 금요일

CEGMA 환경 설정 마무리 및 첫 실행

이전 포스팅에서도 언급했듯이 CEGMA는 유전체 조립의 완결성을 검증하는 도구가 아니고 - 그런 목적으로 사용해도 되지만 - 미리 확정된 ultra-conserved gene의 구조를 새로운 유전체 서열로부터 찾는 것을 기본 목적으로 한다. CEGMA를 실행할 때 옵션으로 넣어주는 단백질 서열은 입력용 서열에서 gene prediction을 통해 찾은 유전자를 번역한 서열을 넣는 것이 아니다. 이것 때문에 초기 실행에서 약간의 혼동이 있었다.

CEGMA를 실행하려면 geneid, wise2(genewise), 그리고 blast+가 필요하다. 예전에는 설치한 프로그램의 바이너리가 있는 디렉토리를 전부 .bash_profile 파일에서 PATH 환경변수에 추가하고는 했는데 이제는 꼭 필요한 것만을 별도의 스크립트에 설정한 뒤 본 프로그램 직전에 실행하는 것이 더 깔끔하다는 생각이 든다.

예를 들어 이런 상황을 가정해 보자. 평소에는 blast+ 2.2.30을 쓰고 있지만 CEGMA를 위해서는 blast+ 2.2.28로 돌아가야 한다. CEGMA를 쓰기 위해 매번 .bash_profile을 수정하는 것은 번거로운 노릇이 아닐 수 없다. 그렇다면 .bash_profile에는 blast+ 2.2.30을 PATH에 추가해 두고, CEGMA 실행 전 스크립트에서 PATH를 재설정하면 된다. CEGMA 설치용 파일은 /usr/local/apps/에 풀었다. geneid는 이미 /usr/local/bin/에 복사해 놓았다.

$ cat pre-cegma.sh
#!/bin/sh
PATH=$(getconf PATH)
PATH=$PATH:/usr/local/bin:$HOME/bin:$HOME/script
PATH=$PATH:/usr/local/apps/wise2.4.1/src/bin
PATH=$PATH:/usr/local/apps/ncbi-blast-2.2.28+/bin
PATH=$PATH:/usr/local/apps/CEGMA_v2/bin
WISECONFIGDIR=/usr/local/apps/wise-2.4.1/src/../wisecfg/
CEGMA=/usr/local/apps/CEGMA_v2
CEGMATMP=./cegmatmp
PERL5LIB=$PERL5LIB:/usr/local/apps/CEGMA_v2/lib
export PATH WISECONFIGDIR CEGMA CEGMATMP PERL5LIB
이상과 같은 스크립트를 만들어두고  CEGMA 실행 직전에 . pre-cegma.sh라고 하면 된다. getconf 명령의 결과는 아주 재미있다.
$ echo $(getconf PATH)
/bin:/usr/bin
그러니 pre-cegma.sh와 CEGMA 실행이 다 끝난 뒤에 getconf로 PATH를 싹 재설정하고 .bash_profile을 다시 실행해도 /usr/local/bin은 PATH에 자동으로 추가되지 않으니 주의하기 바란다. .

CEGMA를 실행해 보자. 임시 디렉토리인 ./cegmatmp는 미리 만들어 두어야 한다. 첫단계인 tblastn은 잘 되었는다 다음 단계인 genewise 실행에서 문제가 생겨서 중단이 되었다고 가정하자. 문제를 해결하고 다시 실행하려면 tblastn 결과는 이미 만들어진 것을 쓰면 된다. 이러한 경우에는 -t 라고 옵션을 주면 된다. 출력 파일의 접두사는 -o 로 지정한다.
$ cegma -g Candida_contigs2.fa -T 20
이제 CEGMA가 잘 실행될 것이다. 결과 파일(output.completness_report)은 다음과 같다.



CEGMA와 BUSCO란? 그리고 WIse2 패키지(genewise) 설치

Genome assembly의 완결성을 점검하기 위하여 모든 유전체라면 능히 가지고 있어야할 핵심 유전자가 assembly 내에 있는지를 확인하는 작업이 종종 필요하다. 특히 novel eukaryotic genome이라면 더 그러하다. 2007년도에 처음 논문으로 나온 CEGMA는 이러한 용도에 적합한 도구였다. CEGMA는 Core Eukaryotic Genes Mapping Approach라는 full name에서 알 수 있듯이, 정확하게 말하자면 core gene의 구조를 예측하는 도구이다.

CEGMA는 GitHub에서 아직까지 배포되고 있다. 그러나 Korf Lab의 홈페이지에서도 밝혔듯이 2015년 중반을 끝으로 이제 더 이상의 개발은 되지 않을 것이라 한다.

Goodbye CEGMA, hello BUSCO!

대신 다른 연구그룹에서 최근에 개발한 BUSCO가 이제 떠오르고 있다. BUSCO는 universal single-copy ortholog를 이용하여 genome assembly와 annotation을 점검하는 도구이다. 여기에서는 중요한 6가지 phylogenetic clade(vertebrates, arthropods, metazoan, fungi and bacteria)에 대한 core protein set를 구축하였고 이를 이용하여 input sequence를 검색하는 스크립트가 제공된다. 파이썬 라이브러리 설치 문제로 아직 제대로 BUSCO를 실행해보지는 않았다. BUSCO의 기반이 되는 것은 같은 연구그룹에서 개발한 OrthoDB이다.

그래서 CEGMA 마지막 버전을 테스트삼아서 효모(Candida의 일종)에 대해서 돌려보려 하였는데, 설치를 완벽하게 하기가 쉽지 않다. 효모는 워낙 genome이 작고 novel genome이라 보기도 어려우니 CEGMA와 같은 도구를 돌리는 것은 약간 넌센스일 수도 있다.

  • genewise를 리눅스에서 설치하는게 어렵고(우분투에서는 sudo apt-get install wise 한 방으로 해결이 된다던데 내 컴퓨터는 CentOS이다!)
  • NCBI BLAST+ v2.2.30은 CEGMA가 요구하는 최소 word size를 수용하지 않으므로 v2.2.29까지만 사용할 수 있다(관련 문서 링크).
  • 환경변수 설정에 대한 설명이 혼동스럽다. 이 문제는 최초의 테스트 런(지금 돌리고 있음)이 성공적으로 끝나면 따로 정리하여 포스팅하겠다.
과거에도 genewise의 설치가 쉽지 않아서 전산인프라팀의 도움을 받은 적이 있다. GitHut의 CEGMA 사이트에는 이를 위한 설치 가이드(우분투 기준)가 실려있다. 그러면 내가 이 설치 가이드를 근거로 실제로 어떻게 하여 CentOS 6.7에서 genewise를 설치했는지 그 과정을 기록해 보겠다.

프로그램 패키지로 EBI의 공식 배포 사이트에 있는 최신판인 Wise2.4.1를 받았다. CEGMA의 GitHub 사이트에서는 v2.2.3rc 및 이를 수정한 버전의 링크를 실어놓았고, 설치 가이드에서는 v2.4.1의 다른 링크를 걸어 놓았다.

압축을 풀고 src 디렉토리에서 make all을, src/dyc 디렉토리에서 make linux(그냥 make라고 하면 에러 발생)를 하면 된다. 만들어진 바이너리를 적당한 위치로 복사하는 것은 사용자가 알아서 하면 된다. 그런데 src에서 make를 하면 이러한 에러를 만나게 된다.

첫번째 에러

sqio.c:232: error: conflicting types for ‘getline’
/usr/include/stdio.h:673: note: previous declaration of ‘getline’ was here
make[1]: *** [sqio.o] 오류 1
make[1]: Leaving directory `/usr/local/apps/wise2.4.1/src/HMMer2'
make: *** [realall] 오류 2

해결책

$ cd wise-2.4.1/src/HMMer2
$ sed 's/getline/getline_new/' sqio.c > a && mv a sqio.c
 이를 해결하고 다시 make all을 하면 또 에러가 발생한다.

두번째 에러

phasemodel.o: In function `Wise2_read_ProteinIntronList':
phasemodel.c:(.text+0x3157): undefined reference to `isnumber'
collect2: ld returned 1 exit status
make[1]: *** [estwise] 오류 1
make[1]: Leaving directory `/usr/local/apps/wise2.4.1/src/models'
make: *** [realall] 오류 2

또 해결책

src/models/phasemodel.c로 이동하여 23번째 라인을 다음과 같이 수정한다.
if( !isnumber(line[0]) ) {     //수정 전
if( !isdigit(line[0]) ) {     // 수정 후
오류 메시지를 복사해 두지 않았지만, make all을 하는 과정에서 헤더 파일이 없다는 오류가 발생하였었다. 이는 yum install glib-devel.x86_64을 하여 해결하였다. 이상과 같이 하여 만들어진 바이너리(dyc 포함)를 PATH에 포함시키고, 마지막으로 WISECONFIGDIR 환경변수만 세팅하면 끝이다.

2015년 9월 24일 목요일

Yeast Genome Annotation Pipeline(YGAP)에 대해 알아보기

가끔 효모 유전체 시퀀싱 결과를 다루어야 할 때가 있다. 이때 내가 종종 이용하는 웹 서비스가 바로 YGAP(Yeast Genome Annotation Pipeline)이다. 이 서비스에서는 주석화가 매우 잘 되어있는 기존의 효모 유전체 정보를 이용하여 새로운 효모 유전체에 대한 annotation을 실시해 준다. 기존의 정보는 바로 YGOB, 즉 Yeast Gene Order Browser에 수록된 종들(Saccharomyces cerevisiaeSaccharomyces bayanusCandida glabrata,Vanderwaltozyma polysporaZygosaccharomyces rouxiiLachancea thermotoleransLachancea waltii,Lachancea kluyveriKluyveromyces lactis and Eremothecium gossypii)의 것에 기반하고 있다. 

나는 효모의 생물학을 잘 모르기에 매번 이 사이트를 대충 이용한다는 느낌을 갖고 있다. 내 genome이 WGD(whole-genome duplication)을 겪은 것인지 아닌지도 판단하기가 쉽지 않다. 곰팡이, 즉 사상균과 효모(맞나?)의 분류는 아직도 완성된 것이 아니라서 나처럼 균학에 대해 잘 모르는 사람에게는 늘 어려운 과제이다.

YGAP에 contig 서열을 제출하면 annotation 결과를 제공함과 동시에 유전체 서열 파일도 살짝 체제를 바꾸어서 반환한다. 만약 cb01.fa라는 파일을 올리면 cb01.genome.txt이라는 fasta 파일을 돌려주는데, 서열 ID의 형식이 바뀌어서 약간의 혼동을 초래하는 것이다. 오늘은 어떤 규칙에 의하여 바뀌는지를 알아보고자 한다.

YGAP에 올린 서열의 ID는 아주 간단하게 contig_1, contig_2...이다. 그러면 .genome.txt 파일은 어떻게 바뀌었나? 원본 파일의 contig 번호는 다음의 Chr_ 또는 Scaffold_ 뒤의 번호로 자리바꿈을 했을 것으로 보인다. Scaffold_#은 서열 ID의 일부가 아니라 description임에 유의하자.
>cb01_Chr_28 Scaffold_1
>cb01_Chr_35 Scaffold_2
>cb01_Chr_36 Scaffold_3
...

실행 전에 YGAP의 파라미터 중에서 "Do you want to order scaffolds by size [default: Y]"를 기정치 그대로 두었다. 이것이 무엇을 의미하는지 도움말을 찾아보았다. YGAP는 입력 서열의 단위를 전부 scaffold로 간주하는데, 가장 큰 것부터 역순으로 chromosome 1, 2, 3...의 번호를 붙인다고 한다. 또한 염색체 1번에 존재하는 유전자의 이름에는 A가 들어가고 염색체 2번 유래 유전자는 B가 들어가는 식이다. 이 파라미터를 N으로 설정하면 입력 파일에 있는 서열 순서대로 염색체 번호가 붙는다고 하였다. 입력 파일의 contig_#는 결국 .genome.txt 파일에서는 Scaffold_#로 자리를 이동하는 것이다. 입력 파일의 서열번호(scaffold 번호), 새로 부여한 염색체 번호 및 유전자에 붙는 코드(A, B, C...)의 관계는 mapping file에 수록된다.

여기에서 YGAP의 귀여운(?) 버그를 하나 발견하였다. 길이가 같은 scaffold는 chromosome 번호도 같아진다는 것이다. 다음을 보라.
SEQ: cb01_Chr_96  124
SEQ: cb01_Chr_101  121
SEQ: cb01_Chr_101  121
SEQ: cb01_Chr_101  121
SEQ: cb01_Chr_101  121
SEQ: cb01_Chr_101  121
어차피 길이가 200 bp에 미치지 못해서 NCBI의 WGS에 올리지도 못하고, 단백질 코딩 유전자를 이로부터 찾기도 어렵다. 

그래도 다행스러운 것은 YGAP가 만들어내는 GenBank file은 scaffold에 따라서 작성된다는 것이다. 만약 새로 부여받은 chromosome 번호만을 이용하여 결과 파일이 만들어진다면 상당히 혼란스러웠을 것이다. 


2015년 9월 23일 수요일

LM1876 앰프 제작을 위한 부품 수급

오늘 알리익스프레스의 판매자가 LM1876 앰프보드(오늘 현재 유효한 링크)의 shipping을 하였다는 메일이 도착하였다. 8일 내에 선적을 한다고 겁을(?) 주었는데 생각보다는 빨리 처리가 되고 있다. 월요일에 아세아전원에 주문한 100VA급 토로이달 트랜스(0-18V 0-18V)도 오늘 배송이 완료되었다. 전원트랜스를 구입한 것은 생전 처음이다. 고정용 원형 철판을 들어내면 도넛처럼 가운데가 뻥 뚫려있다.


많은 국내 사이트에서 '트로이달' 트랜스라고 잘못 쓰고 있지만 토로이달(toroid) 트랜스가 맞다. toroid(원환면)은 아주 어렵게 말하면 "원을 삼차원 공간 상에서 원을 포함하는 평면위의 직선을 축으로 회전하여 만든 회전체"라고 정의된다. 백문이 불여일견이다... 토로이달 트랜스는 제작 비용은 높지만 노이즈 방출량이 적고 효율이 좋아서 '고급' 오디오에 많이 쓰인다.


트랜스의 용량과 2차 전압을 선택하면서 고민을 하지 않을 수 없었다. 
  • 앰프 칩이 요구하는 전원전압(직류)에 따라 출력이 변하고
  • 트랜스의 2차 출력 전압은 정류회로를 거치면서 전압이 더 올라가기도 하고(회로마다 다름)
  • 어느 정도의 여유를 두어야 하는지에 대한 감도 전혀 없었기 때문이다.
내가 구입하는 LM1876 앰프 보드는 최대 30W + 30W의 출력을 낼 수 있다. 제품 설명에 따르자면,
  • dual 12V voltage 공급 -> 20W + 20W
  • dual 15V voltage 공급(권장) -> 25W + 25W
  • dual 24V voltage 공급 -< 30W + 30W (peak 40W + 40W)
아세아전원의 토로이달 트랜스는 50VA 단위로 만들어진다. 혹시 한 등급이라도 높은 앰프보드로 업그레이드를 할 가능성이 아주 조금은 있으니 넉넉하게 dual 18V, 100VA로 결정하였다. 이 트랜스라면 정류회로가 달린 TDA8950(class D) 앰프 보드에 쓸 수도 있을 것이다. LM3875나 LM3886은 약간 부족하나마 작동을 시킬 수 있을 것이다. 물론 작은 실내에서 채널 당 5와트 이상의 출력도 미처 뽑지 못할 것은 당연하지만.

본격적인 제작은 부품이 다 모이는 10월달에나 가능할 것이다. 내가 아주 좋아하는 스크류터미날 타입이라서 조립은 비교적 쉬울 것이다. 볼륨까지 달려있으니 입출력 단자와 전원만 연결하면 소리는 내 볼 수 있을 것이다. 그런데 케이스는 어떻게 한다지? 

만년필과 잉크의 궁합도 있는가?

며칠 전 잉크가 잘 나오지 않는 만년필을 바꿔야 되겠다는 취지의 글을 작성한 적이 있다.

플래티그넘 만년필 사용한지 일 년 만에 작별을 고해야 하는가?

그런데 문득 느낀 바가 있어서 실험을 한가지 해 보기로 하였다. 어쩌면 파커 '큉크' 푸른색 잉크와의 궁합 문제가 아닐까? 약 일년 동안 카트리지(자바펜의 제품)를 쓰는 동안에는 아무런 문제가 없었으므로.

그 결과는...


슬슬슬... 잘 나온다. 도대체 왜 이런 거지. 카트리지 구입 비용을 절감한다는 생각으로 파커 병잉크를 구입했던 것인데, 국산 카트리지가 더 낫다. 아직은 만년필 교체를 고려할 때가 아닌 모양이다. 다행이라 생각한다.


2015년 9월 20일 일요일

FM 안테나 설치 상태 변경

동쪽으로 향하게 잘못 설치한 FM 안테나를 180도 돌려서 서쪽을 향하게 만들었다. 실제로 달라진 것은 도파기(director)의 위치가 바뀐 것에 불과하다. 이제 서쪽 계룡산 송신소에서 송출되는 KBS 대전 FM의 수신이 최적화되었을 것으로 믿는다. 체감상 큰 차이는 없지만 원리에 맞지 않게 설치된 안테나를 보고 있는 것이 늘 마음에 들지 않았다. 이번에는 수평계까지 대 가면서 정확하게 수평을 맞추었다. 작업을 하기에는 아직 햇살이 너무나 따가운 9월 오전이다.

지저분한 유리창 너머로 사진을 찍었더니 사진이 깨끗하지 않다.



붐대의 끝은 U 볼트로 난간에 고정을 하였는데, 볼트를 꽉 조여도 붐대가 꽤 길어서 자꾸 처지기 일쑤였다. 이전에는 스테인레스 화분 받침에 걸쳐 놓았으므로 일정 수준 이상으로 더 처지지는 않았지만 받침 자체가 수평이 아니라 약간 기울어진 형태였다. 이번에는 U 볼트를 화분 받침대의 바닥 부분보다 아래로 가도록 고정 위치를 바꾼 다음, 붐대를 화분 받침대에 케이블 타이로 묶어서 길이를 조정하면서 수평이 되게 만든 것이다.

이제 송신소가 이전을 하지 않는 이상 우리집 환경에서 더 이상으로 안테나 설치 상태를 최적화할 수는 없을 것이다.

2015년 9월 19일 토요일

TDA7297(15 W + 15 W) 앰프를 위한 케이스 구상

반찬통 속에 볼썽사납게 들어있던 TDA7297 앰프 보드는 요즘 부품통 안에 관심을 받지 못한 상태로 담겨있다. 망가진 3.5 mm 스테레오 폰잭을 공들여 수선해 놓고도 다른 칩앰프들에 가려서 빛을 보지 못한다.

이대로 두기는 아까와서 이를 수납할 케이스에 대한 아이디어를 내 보았다. 바로 초콜렛 통이다.



뚜껑에 구멍을 내고 볼륨 포텐셔미터를 너트로 고정하면 보드를 따로 고정할 필요가 없다. 입력잭도 뚜껑에 고정하면 된다. 스피커 단자는 옆면에 달아야 하는데, 일반적인 바인딩 포스트를 쓰면 고정을 위한 면적도 많이 필요하고 내부로도 길게 돌출되어 보드에 닿을 가능성이 크다. 그래서 스피커용으로 잘 쓰이지는 않지만 이런 단자대를 생각하였다. 스피커선을 연결하려면 항상 드라이버를 써야 한다는 점이 불편하지만 공간을 적게 차지한다. 이러한 단자대는 지난 여름에 조립한 샘플전자의 class D 앰프 보드에서 아이디어를 얻은 것이다.

부품통 속에 숨어있던 방열판을 겨우 찾았다. 이것은 배송을 기다리고 있는 LM1876 앰프 보드를 위해 사용할 것이다.


...이렇게 계획을 세우고 결국 오늘 만든 것은 아래 사진과 같다. 온갖 폐품은 다 끌어모아서 만들었다. 스피커 연결용 클립식 단자처럼 보이지만 실제로는 망가진 튜너를 버리면서 떼어둔 안테나 단자이다. TDA7297 칩의 방열판에서 생각보다 열이 많이 나서 밀폐된 통의 바닥에 밀어넣기는 무리가 있다는 결론을 내렸다. 오늘은 모처럼 진공관 오디오가 휴식을 취한 일요일이었다. 이 앰프를 가지고 스피커를 바꾸어 가면서 하루 종일 들은 결과 스피커 2호기와 매칭이 잘 된다는 느낌을 받았다. 케이스도 변변치 않고 성능도 고만고만한 칩 앰프가 하나 둘 늘어만 간다. 마치 여자들이 장신구를 사들이듯이.