2017년 6월 25일 일요일

세상에서 가장 간단한 스피커 지연회로

인켈에서 제조한 P878이라는 미니 컴포넌트 시스템의 리시버 앰프부(RX878)를 3년 전에 중고로 구입했다가 즉시 반품한 일이 있다(당시 올린 글). 출력과 스피커 사이를 연결하는 릴레이가 노후하여 접촉 불량이 있어났던 것이다. 이는 오래된 앰프 기기에서 흔히 발생하는 문제이다. 이 릴레이가 음질을 열화시킨다고 주장하는 사람들도 간혹 있다. 스피커를 연결하는 선재가 음질을 좌우한다는 진지한 논의는 정말 그 기원이 오래되었고, 심지어 전원부의 퓨즈도 중요하다고 한다. 물론 나는 여기에 동의하지는 않는다.

스피커 보호회로의 필요성은 크게 두 가지 정도로 생각할 수 있을 것이다. 하나는 증폭 소자가 망가져서 단락이 일어나면 출력쪽에 갑자기 DC 대전류가 흘러서 스피커의 보이스코일이 파손되므로 이를 감지하며 짧은 시간 안에 스피커쪽으로 가는 연결을 끊는 것이다. 또 하나는 전원이 들어온 뒤 몇 초가 지난 뒤에 스피커가 연결되게 하는 단순한 지연 회로이다. 앰프에 따라서는 전원을 켜거나 끈 직후 스피커에서 '퍽'하는 popping noise를 발생하는 것이 있다. PC용 증폭 스피커를 사용하는 사람은 아주 흔하게 경험하는 현상이다. 이 잡음이 실제로 스피커를 망가뜨리게 되는 일은 없지만,  분명히 기분 좋은 소리는 아니다. 발생 원인이 의외로 매우 다양하여 이를 근본적으로 없애기는 어렵다. 대신 스피커측 연결을 단순히 지연시키는 회로를 추가하여 해결할 수 있다.

출력 트랜스포머를 사용하는 앰프에서는 증폭부에서 심각한 고장이 발생해도 스피커까지 영향을 미치는 일은 거의 생기지 않는다. 그리고 칩앰프의 증폭 소자는 다양한 오류 상황에 대처할 수 있는 자체 보호회로를 내장하고 있는 경우가 많다. 하지만 팝 노이즈까지 항상 없애주는 것은 아니다.

집에서 사용하는 자작 앰프(산켄 SI-1525HD 칩 사용)는 팝 노이즈가 꽤 크다.  책상위에서 쓰는 소출력 스피커에서는 참을 수 있을 정도이지만 대출력 스피커를 연결하여 전원을 넣으면 상당한 타격감의 큰 소리가 우퍼에서 발생한다. 시판되는 스피커 보호회로 또는 지연회로 보드(예: FK650; 알리엑스프레스에는 훨씬 다양한 제품이 있음)를 구입하여 사용할 것을 여러번 고민해 보았으나 전원을 인가할 적당한 방법이 없다는 것이 문제였다. 스피커 보호회로 보드는 보통 정류회로를 내장하고 있어서 12~16 V 정도의 교류 전압을 연결하면 된다. 그러나 내 앰프에 들어있는 파워 트랜스포머는 두 조의 0-18 V 출력 단자만 제공하기에  스피커 보호회로를 구동하기에 적당하지 않다. 무엇이 문제인가? 앰프보드에서는 양전원이 필요하므로 파워트랜스포머의 출력을 직렬로 연결하여 +18 V 0 V -18 V를 만들었으니 이중에서 한쪽 절반만에서 선을 뽑아서 18 V를 만들면 양전원의 균형이 깨질 것이다. 만약 이 문제가 해결된다고 해도 18 V를 스피커 보호회로 구동에 맞게 강하시키는 것도 쉬운 일이 아니다. 오히려 스피커 보호회로를 위한 파워 트랜스포머를 하나 더 다는 것이 더 나을 수도 있다.

그래서 아주 단순한 방법을 택하였다. 스피커로 가는 출력선측에 4P 스위치를 달아버리는 것이었다. 아래 사진에서 보였듯이 볼륨 조절 놉 바로 왼쪽에 보이는 검정색 로커 스위치가 바로 그것이다. 망가진 외장 HDD의 전원부에서 적출한 파워 스위치를 재활용하였다.


이보다 더 간단한 - 그러나 성가신 - 스피커 지연회로는 있을 수가 없다. 


2017년 6월 20일 화요일

Oxford Nanopore sequencing, 기껏 조립을 했더니 박테리오파지 람다였다

어제 세 번째의 ONT(Oxford Nanopore Technologies) 시퀀싱을 실시하였다. 최초의 두 번은 lambda control DNA에 대한 것이었고 이번에는 실제 세균 유전체 DNA를 가지고 만든 라이브러리였(다고 믿었)다. 어제 오후 3시쯤에 러닝을 시작하였으니 48시간의 표준 러닝을 마치려면 하루를 더 기다려야 한다.

MinKNOW 실행 화면을 보면 실제로 DNA가 통과하는 구멍, 즉 'strand'로 표시되는 nanopore의 수가 그렇게 많지 않다. 특히 하루를 넘어가면서 얻어지는 read의 수가 줄어드는 것이 확연히 드러났다. 48시간 러닝에 대한 전형적인 read의 수 혹은 염기쌍의 수는 얼마라고 이야기하는 것이 가능할까? 초창기에 나온 어떤 논문에서는 매 4시간마다 라이브러리를 리필하라는 말까지 있지만 ONT community에서 아직 이와 관련한 정보를 찾지는 아니하였다.

러닝 수 22시간쯤이 경과했을 때, fast5 파일을 다른 위치에 복사하여 base calling을 한 뒤 reference mapping을 실시하였다. 이 샘플은 예전에 일루미나로 시퀀싱을 한 적이 있어서 200개 수준의 contig 서열을 확보한 상태이다. 플라스미드와 트랜스포존 등이 많아서 contig의 수가 불가피하게 많다.

 Mapping 및 QC는 NanoOK를 사용하였다. PDF report를 열어보니 성적이 너무 나쁘다. 어떻게 된 것일까? 내가 알고 있는 세균의 유전체 염기서열이 맞나? 2 kb짜리 read를 아무거나 하나 선택하여 NCBI에서 BLASTN을 해 보았다. 결과는 전혀 예상하지 못한 것이었다. 박테리오파지 람다의 유전체 서열이 나오는 것 아닌가?  Percent identity는 93% 수준이었다.

De novo assembly를 하면 정확한 진단이 될 것 같았다. Canu를 사용하여 조립을 하니 약 47 kb 크기의 contig가 떡하니 나왔다. 같이 만들어진 3 kb 짜리 contig는 depth도 낮고 서열 자체도 GTT의 반복이라서 의미 없는 서열로 판단된다.

이번에는 람다 DNA 서열을 reference로 하여 다시 NanoOK을 실행해 보았다.  Reference  전체가 depth > 30 수준으로 잘 매핑되었다. 아마도 라이브러리를 만든 연구원이 실제 세균 샘플 DNA와 람다 콘트롤 DNA를 혼동하여 서로 바꾸어서 실험을 한 것 같다.

어떻게 해야 하나의 flowcell에서 러닝을 하여 좀 더 많은 read를 얻을 수 있을까? ONT community에 잠복하여 다른 사용자들이 올린 글과 답변을 전부 읽어봐야 되겠다.

2017년 6월 18일 일요일

영화 <악녀>를 보다

흥행의 보증수표, 톰 형이 주연하는 미이라를 볼 것인가, 새로운 여전사(실사 영화로 말하자면)인 원더우먼을 볼 것인가? 최종 선택은 한국 영화인 '악녀'였다. 잔혹한 싸움 장면이 워낙 많아서 옆자리의 아내는 보는 내내 고개를 돌리고 있다시피 하였다. 영화는 낮 1시가 조금 지나서 끝났는데, 점심으로 무엇을 먹어야 할지 약간은 고민이 되기도 하였다. 여담이지만 식욕을 떨어뜨리는 영화라면 '곡성(2016)'이 더하면 더했지 덜하지는 않았다.


김옥빈이 연기한 킬러 '숙희'는 최소한 시각적으로는 여러모로 스칼렛 요한슨이 연기한 블랙 위도우를 떠올리게 한다. 일부러 그런 효과를 노린 것인지는 알 수 없다. 밀라 요보비치(영화 '레지던트 이블')을 연상하는 사람도 있겠으나 나는 그 영화를 제대로 본 적이 없어서 뭐라고 말하기는 어렵다. 권력 기관의 철저한 훈련을 통해 만들어진 여성 킬러로서 그저 지시에 의해서 충실하게 살인을 행하는 인간 병기라면 물론 '니키타(1990)'가 원조의 자리를 차지할 것이다.


영화의 시작 부분에서 악녀 '숙희'가 혼자 건물로 침투해 들어가서 수십명의 남자들을 해치우는 장면은 정말 대단했다. 5분 동안 약 70명을 죽였다고 하던가? 마지막 한 사람을 끝장내면서 건물 밖으로 떨어져 사뿐히(그건 아니고 아마 기진맥진했다고 보는 것이 맞을듯) 착지하는 장면 역시 블랙 위도우의 전투 장면을 연상하게 하였다.


아마 이 영화를 본 많은 사람들은 다른 유명한 영화의 여러 장면들을 떠올릴 것이다. 죽을 운명이나 다름없다가 정부 비밀 조직에 의해 킬러로 다시 태어나는 장면은 뤽 베송의 '니키타'를, 긴 칼을 이용한 거침없는 액션신은 쿠엔틴 타란티노의 '킬 빌'을, 초반 1인칭 시점의 장면은 비교적 최근 영화인 '하드코에 헨리'를. 이 영화들과 다른 점은 멜로적인 요소가 상당히 많이 섞였다는 것이다. 겉으로 풍기는 이미지 - 검은색 타이트한 복장 - 은 분명히 블랙 위도우를 떠올리게 하지만 섹시함은 그다지 강조되지 않았다.

롯데 시네마의 영화 평점은 오늘 현재 7.5(10점 만점), 예매율은 4위이다. 일부 조연급 배우들의 연기가 약간 어색하고, 스토리 자체도 완벽하지는 않다. 냉혹한 살인기계인 숙희를 움직인 원동력은 복수와 딸을 지키기 위한 모성애, 그리고 사랑으로 위장하여 자기를 한갖 수단으로만 취급한 중상(신하균 분)에 대한 배신감을 오간다. 그녀를 둘러싼 인물 중 진실된 남자는 단 한사람이었다. 더 언급하면 스포일러가 될지 모르니.. 마지막 장면은 결국 개인적 차원의 복수를 마무리하는 것으로 끝나지만, 기왕이면 자기를 이용하여 이렇게 만든 국가적 권력에 대한 응징까지 이어졌더라면 좋았을 것이다. 중상의 조직이 개인적인 것인지 국가 차원의 것인지는 잘 알기 어렵지만, 이것도 포함해서다.

여러가지로 아쉬운 점도 있고 기성 영화의 장면이 자꾸 떠오르는 것은 피할 수 없으나 정성들여 만든 액션 신이 모든 것을 용서하게 만든다. 이만하면 잘 만든 영화라고 평한다.

2017년 6월 17일 토요일

CentOS 7의 첫경험

CentOS 7이 처음 나온 것은 2014년 7월이니 벌써 만으로 3년 가까운 시간이 흘렀다. ISO 파일을 내려받아 DVD-ROM을 구운 것은 바로 어제이고, 이를 컴퓨터에 처음으로 설치한 것은 오늘 오전이다(글을 쓰는 동안 자정이 지났으니 하루씩을 더해야 정확할 것이다). 나는 그동안 몇 대의 서버에서 CentOS 6을 주력으로 사용해 왔다. OS를 재설치하고 숙달하기 위해 노력하는 것은 상당히 번거로운 일이라서 CentOS 7을 접하는 것을 계속 미루고만 있었다.  귀찮음 이외에도 CentOS 7에서 달라진 것이 꽤 많아서(비교표) 관리자 입장에서는 신경을 쓸 것이 많다는 소문을 들어온 터라 지레 겁을 먹고 있었던 것도 사실이다. 엄밀하게 말하자면 나 혼자서 쓰는 서버들이고 복잡한 설정이 필요한 서비스를 하는 것도 아니기에 이 부분은 그렇게 마음에 담아둘 일은 아니었다.

OS의 업그레이드를 처음으로 생각하게 된 것은 일년쯤 전에 맞닥뜨렸던 python과 gcc의 버전 문제였다. 생명정보학쪽에서는 상당히 많은 유틸리티들이 파이썬으로 제공되는데, CentOS 6에 기본으로 따라오는 파이썬 2.6으로는 돌아가지 않는 것들이 점점 많아지는 추세이다. Linuxbrew 혹은 pyenv를 설치하면 상위 버전의 파이썬을 설치할 수는 있다.

하지만 최근 일주일 동안  nanopore sequencing 데이터의 분석용 프로그램을 검토하다가 이제는 CentOS를 버전 7로 올려야 되겠다고 결심을 하게 되었다.  Nanopore sequencing raw data(.fast5 file)를 직접 다루는 poretools가 제대로 작동하지 않는 것을 알게 된 것이다.  이 프로그램은 파이썬 2.7 이상에서 돌아가므로, pyenv를 통해서 먼저 해당 버전의 파이썬을 갖춘 다음 poretools를 실행해 보았다.  Basecalling(Albacore를 먼저 실행해서 .fast5 내부에 baseball 정보를)이나 기타 다른 수치 추출은 잘 되지만, QC와 관련한 plot을 그려내는 명령을 실행하면 파이썬의  Tk configuration이 제대로 되지 않았다는 에러 메시지가 나온다.

구글을 검색해 보고 인실리코젠 김형용 수석 개발자에게도 문의하여  tcl-devel/tc-devel(우분투에서는 다른 이름) 및 tkinter라는 패키지를 설치하면 된다는 정보를 접하여 몇 번 이를 그대로 따라서 해 보았지만 파이썬은 여전히 똑같은 메시지를 출력하였다. 한동안 시행착오를 겪으면서 알아낸 것은 yum은 시스템에 기본적으로 설치된 파이썬 버전과 동일한 tkinter만을 설치한다는 것이었다. 즉 내가 아무리 pyenv를 통해서 파이썬 2.7을 설치해 봐야 CentOS 6에서는 tkinter-2.7을 깔 수가 없는 것이었다.  tkinter-2.7은 CentOS 7용 패키지이고, 당연히 파이썬 2.7을 요구한다.

사실은 어제 DVD-ROM을 들고 서버를 숨겨둔(?) 방에 갔다가 기기에서 발생하는 열기로 너무 더워서 일단은 포기하고 사무실에 있는 다른 컴퓨터에 CentOS 7을 설치하여 테스트를 하는 것으로 전략을 수정하였다. 집에서 사용하다가 최근에 퇴역한 Dell Inspiron 660s가 테스트를 위한 희생양이 되었다. CentOS 7을 설치한 뒤 뒤이어 필요한 rpm과 poretools를 깔았다.  poretools 설치 과정에서 의존성 패키지를 자동으로 다 깔아주지를 못해서 간간이 pip를 돌려야 했다. 최종 결과는 성공적이어서 poretools를 이용하여 QC plot들이 잘 만들어졌다.  pyenv로 약간 높은 버전의 파이썬을 설치한 뒤 이를 배경으로 poretools를 깔았다. 여기서도 그림을 잘 만들어 냄을 확인하였다.

우분투나  Mac에 비교할 바는 아니지만  CentOS의 Genome Desktop 환경도 꽤 쓸만하다고 느꼈다. 아무리 선호하는 리눅스가 있다고 해도 다른 배포판(Ubuntu vs. CentOS)과 버전(CentOS 6 vs. CentOS 7)을 조금씩은 다 같이 다루어 보는 것이 유리함을 알게 해 준 경험이었다.

서버실 - 원래 용도와는 거리가 있지만 - 에는 냉방 시설이 없음에도 불구하고 올해 초에 한 대의 서버를 옮겨두었으니 컴퓨터들이 벌써 시작된 더위를 잘 버텨낼지 걱정이 된다. 온도 체크용으로 디지털 온도계를 하나 갖다 두었다.

2017년 6월 15일 목요일

Oxford Nanopore sequencing 매핑 및 시각화 연습

Real data로 매핑한 결과를 보이면 정말 좋겠으나 첫 nanopore sequencing 경험은 이를 도저히 시퀀싱이라고 부를 수 없는 처참한 결과로 끝나고 말았다. 그래서 안타깝지만 PoreCamp2016에서 사용한 에볼라바이러스 교육자료를 가지고 연습을 해 보았다.

처음으로 만들어낸 .fast5 파일에서 basecalling을 하는 것부터 쉽지 않았다. Metrichor(EPI2ME desktop agent를 통한)의 basecalling을 이제 별로 의미가 없는 것 같다. ONT 고객상담실에서도 Albacore를 사용하라고 했으니 말이다. 이것이 nanopore sequencing의 공식적인 basecaller가 되어가는 느낌이다. MinKNOW에서는 live basecallig을 하지 않는 이상(1D sequencing에서만 가능) fast5 파일 내에 염기서열 정보가 존재하지 않는다. Albacore는 이를 읽어들여서 fastq 형태의 파일을 만들기도 하고, 염기서열 정보를 새겨넣은 fast5 파일을 만들기도 한다. poretools로 QC를 하려면 염기서열 정보가 들어간 fast5 파일이 필요하다.

poretools는 매우 감동적인 도구이다. 다양한 diagnostic plot을 만들어내는 것은 물론이거니와 각종 집계와 fastq/fasta 파일 추출(basecall 결과가 수록된 fast5로부터)도 가능하기 때문이다. 그렇지만 진단용 그림을 뽑아내려면 Tcl/Tk 및 tkinter라는 것과 관련한 파이썬 설치 문제가 보통 복잡한 것이 아니다. CentOS 6.x에서 어떻게 해서든 설치를 해 보고 싶었지만(pyenv 환경) 결국은 실패하고 MinKNOW가 깔린 우분투 서버에서 겨우 성공하였다. 이것은 추후에 다시 한번 진지하게 도전해 볼 영역으로 남겨두겠다. 어쩌면 poretools을 계기로 하여 CentOS 7로 넘어가거나 혹은 Docker를 쓰는 단계로 넘어가게 될지도 모른다. Docker의 기본 개념은 여기에서 잘 설명하고 있다.

PoreCamp 교육 자료에 나온대로 ENA에서 자이레 에볼라바이러스의 MinION raw data를 몇 개 다운로드하였다. 임의로 하나를 골라서 pass 서브디렉토리 아래의 fast5 파일로부터 fasta 서열을 뽑아내었다. 다음은 poretools stats의 결과이다.
total reads 20787total base pairs 21,929,768mean 1054.98median 1013min 288max 3711N25 1060N50 1019N75 981
이를  bwa로 매핑을 하여 bam 파일로 출력, 소팅과 인덱싱을 한다. samtools 0.1.18과 1.2를 번갈아 사용하였지만 다음의 명령이 소팅 단계에서 도무지 먹지를 않는다.
bwa mem -x ont2d EM_079517.fasta Ebola2D.fasta | samtools view -bS - | samtools sort -o Ebola2D.sorted.bam -
samtools sort의 용법이 내가 알던 것과 약간 다르다. 구글을 열심히 뒤져서 이해해보려고 무던히 노력을 했지만 속 시원한 설명은 별로 없고 samtools sort 명령어 문법은 기괴하다('bizarre')는 글과 이를 수정하겠다는 개발자의 글만 발견할 수 있었다. samtools를 1.4.1로 업그레이드하여 모든 문제를 해결하게 되었다.

다음으로는 매핑 결과를 직접 눈으로 살펴보았다. tablet이나 IGV 등 몇 가지 솔루션이 있지만 나는 CLC Genomics Workbench를 이용하였다. track으로 전환한 다음 reference sequence(역시 track으로 전환)과 함께 track list를 만들어서 확대해 보았다. ONT 특유의 insertion error가 많이 보이지만 reference와 잘 맞는 consensus sequence를 볼 수 있다.
이번주 안에 실제 데이터를 이용한 성공적인 nanopore sequencing 결과를 보고 싶었는데 벌써 목요일이 다 지나가고 있다.

개발도구와 라이브러리의 버전 문제로 인하여 CentOS 7의 도입을 정말 진지하게 고민해 볼 시점이 되었다. 피할 수는 없는 대세이지만, 관리자 측면에서 너무나 많은 것이 변해서 공부를 하려면 또 얼마나 애를 먹게 될지...

2017년 6월 13일 화요일

GRUB를 이용한 리눅스 멀티부팅 꼼수 부리기

멀티부팅은 일반적으로 서로 다른 OS(예: 리눅스와 윈도우즈)를 하나의 컴퓨터에서 운영하기 위해서 쓰인다. 때로는 동일한 OS를 서로 다른 버전으로 각자 설치해 놓고 이를 선택하여 부팅하는 용도로 쓸 수도 있다.

멀티부팅을 능수능란하게 쓰려면 OS의 설치 순서가 매우 중요하다. 특히 리눅스와 윈도우를 선택적으로 부팅하려면 윈도우를 먼저 깔고 나서 리눅스를 나중에 설치한 뒤, 리눅스의 GRUB를 통해서 OS를 선택하는 것이 불문율로 여겨지고는 한다.

오늘 나는 매우 엉뚱한 시도를 해 보았다. 지난 5년간 사무용(윈도우 7)으로 쓰이다가 일선에서 물러난 데스크탑 컴퓨터가 하나 있다. 오래된 Xeon CPU에 수퍼마이크로 마더보드로 구성된, 나름대로 서버급의 컴퓨터이다. 여기에는 우분투 12.04를 설치하여 이따금 PhyloPythiaS+(PPSP) 구동용으로 사용하였다. PPSP 또는 PPS+는 metagenomic read의 taxonomic binning 프로그램이다. 최신 우분투를 기반으로 한다면 모니터의 해상도를 최적화하여 훨씬 편리하게 컴퓨터를 쓸 수 있겠지만 우분투 12.04에서 PPSP를 설치하는 것이 가장 편리하기에 개발자가 권장하는 환경을 그대로 맞추어 사용한 것이다.

얼마 전부터 Oxford Nanopore sequencing을 접하게 되면서 MinION 구동을 위한 컴퓨터가 필요하게 되었다. 바로 어제까지는 노트북 컴퓨터(윈도우 10)에 필요한 프로그램들을 깔아서 연습삼아 사용을 해 오고 있었으나 화면도 너무 작고 약간 답답한 감이 없지 않아서 우분투가 깔린 데스크탑을 사용할 생각을 조금씩 하던 중이었다. MinION 구동 프로그램은 컴퓨터의 하드웨어 성능을 좀 가리는 편이다. 그래서 Xeon CPU에 메모리 16 GB가 장착된 데스크탑에 눈이 가기 시작하였다. 여기에는 이미 우분투 12.04가 설치된 상태이고, MinION을 구동하려면 14.04가 필요하다. 어찌할 것인가? 이미 우분투 12.04가 설치된 디스크에 상위버전의 우분투를 덮어쓰지 않는 조건으로 설치를 하려니 파티션 등 문제가 복잡해진다. 아예 속 편하게 하드 디스크를 분리한 다음 새 디스크(사실은 쓰던 것)을 단독으로 연결하여 우분투 14.04를 설치하였다. 그 다음 MinION 구동에 필요한 프로그램(MinKNOW, EPI2ME Desktop Agent, Albacore basecaller)를 설치하고 configuration test를 성공적으로 진행하였다.

MinION이 연결된 모습.
그러면 필요한 OS 버전에 따라서 하드 디스크 연결을 바꾸어가면서 부팅을 할 것인가? 불가능하지는 않지만 너무나 번거로운 일이다. 디스크 두 개를 전부 연결하고 Grub 설정을 어떻게든 하면 일반적인 멀티부팅과 같은 환경이 조성될 것으로 기대하고 AskUbuntu 사이트를 뒤져서 나와 비슷한 상황에 대한 질문과 대답을 검색하여 보았다.

두 개의 하드디스크를 연결하고 무작정 어느 한쪽 우분투로 부팅을 한 뒤 sudo grub-update라고만 입력하면 될 것만 같은 생각이 들기 시작하였다.

그래, 한번 해 보는 거야. 디스크가 망가질 일은 없으니.

기대는 완벽하게 들어맞았다. 커넥터 연결, 부팅, 그리고 명령어 한줄로 모든 것이 끝났다. 기본 부팅은 우분투 14.04로 되었고, grub를 업데이트한 뒤 재부팅을 하니 너무나 낯익은 grub 화면이 뜨는 것이었다. 오늘도 이렇게 잔기술 하나를 익혔다.

실험 진화에서 유래한 여러 분리균주(동일 조상 유래)의 연구를 NCBI BioProject에 등록하는 요령

가톨릭대학교와 중앙대학교에 근무하는 동료들과 같이 수행한 공동 연구 성과가 최근 Microbial Cell Factories 저널에 게재 승인을 받았다. 대장균 W3110에 어떤 외래 유전자를 도입하여 chemostat에서 장기간 배양하여 얻은 변이주의 특성을 유전체 서열 해독을 포함하여 탐구한 것이 주된 내용이다. 대장균을 매일 플라스크에서 계대배양하면서 진화의 궤적을 추적하는 이른바 long-term experimental evolution(LTEE)은 미국 미시건주립대의 리처드 렌스키 교수로부터 시작되어 많은 생명과학자들에게 영감을 주었다. 프로젝트의 공식 웹사이트는 여기이다. 우리 연구 그룹에서는 chemostat라는 멋진 장비를 사용하고 있지만 아직도 많은 연구실에서는 50 ml 들이 삼각 플라스크(배지는 10 ml이 들어있음)에 1:100(v/v)으로 이전 배양액을 옮기는 고전적인 방법으로 실험을 진행하고 있다. 이렇게 하면 하루에 약 6.67 세대가 진척되는 것으로 계산이 된다. 물론 플라스크는 하나만 쓰는 것이 아니다. REL606(Ara-)과 REL607(Ara+) 2개의 클론을 각각 6개의 플라스크에 나누어 계대배양을 시작했으니 총 12개의 집단이 각자 다른 방식으로 진화를 해 나가는 것이다. 1980년대에 실험을 시작하여 40,000 세대에 이르렀을때 막 대중화의 길로 접어든 next-generation sequencing 기법을 접목하여 실제 유전체 서열 상의 변화와 fitness의 변화가 보조를 맞추어 나가지 않는다는 논문이 2009년 Nature에 실렸었다(Genome evolution and adaptation in a long-term experiment with Escherichia coli). 나도 이 논문에 공저자로 참여하였던 것을 매우 기쁘게 생각하고 있다.

그러면 글 도입부에서 소개한 원래의 이야기로 돌아가보자. 진화 실험을 개시한 원균주와 변이균주의 유전체 시퀀싱 raw data를 NCBI의 SRA(sequence read archive)에 등록하려 한다. 하나의 원균주에서 유래한 여러 샘플의 데이터를 어떻게 등록하는 것이 현명한지를 논하려는 것이 오늘 포스팅의 주제이다. 나는 지금까지 단일 미생물 유전체 프로젝트(monoisolate)만을 NCBI에 등록해 왔었다. 하지만 실험 진화에서는 서로 '직계' 혹은 '사촌' 관계에 있는 여러 isolate에 대한 유전체 시퀀싱을 하게 된다. 이를 하나의 BioProject로 묶는 것이 자연스럽지 않을까?

우선 서열 데이터베이스와 논문의 연결 관계를 간단하게 적어보도록 한다. 생물학적 서열을 새로 발견하여 이를 논문에서 다루려면(예: 신종 미생물의 유전체 해독 논문) 서열 자료가 DDBJ/ENA/GenBank와 같은 공공 데이터베이스에 등록이 되어 발급받은 accession number를 논문에 적시해야 한다. Microarray나 RNA-seq과 같은 발현 관련 데이터는 GEO에 등록을 해야 한다. 그러나 이번 연구의 경우는 일종의 resequencing 개념으로서 contig나 scaffold 형태로 서열을 제공할 필요는 없고 다만 논문의 본문에서 표 형태로 어떤 변이가 발생했는지를 언급하는 것으로 충분하다. 대신 sequencing raw data를 등록하여 공개하면 이를 활용하려는 다른 연구자에게 도움이 될 것이다.

렌스키 교수는 작년에 50,000 세대째를 맞는 대장균의 유전체 진화를 다룬 대규모 연구tjd과를 Nature에 발표하였다(Temp and mode of genome evolution in a 50,000-generation experiment). 2016년은 렌스키 교수가 환갑을 맞는 해이기도 하니 그 의미가 남달랐을 것이다. 12개의 집단에서 뽑은 총 264개나 되는 변이균주을 일루미나 장비로 시퀀싱을 하여 분석을 하고 또 이를 전부 NCBI에 등록을 하려니 정말 손이 많이 가는 일이었을 것이다. 우선 BioProject는 어떻게 등록이 되어있는지를 찾아보았다. 논문에서는 long-term evolution experiment with E. coli(PRJNA294072)를 언급하였는데 이는 실제로는 umbrella project이고 그 아래에 총 11개의 정규 BioProject가 존재한다. 가장 많은 데이터(224개의 SRA experiments와 BioSample)을 포함하는 PRJNA295605가 바로 작년의 Nature 논문에 직접적으로 관련된 것으로 보인다. Project scope는 monoisolate이지만 200개가 넘는 균주의 유전체 시퀀싱 데이터가 하나의 프로젝트 아래에 개별적인 biosample과 SRA experiment로 존재하는 것이다.

다음으로는 연세대학교에서 등록한 Acinetobacter baumannii 유전체 시퀀싱 데이터를 살펴보자. 이 연구는 실험 진화와는 무관하며, 환자에서 개별적으로 분리한 blaOXA-23 함유 Acinetobacter 균주에 대한 유전체 시퀀싱 결과를 등록한 것이다. BioProject PRJNA380857의 scope는 multisolate로 선언되어 있고 총 13개의 assembly가 각자 별도의 BioSample 정보화 함께 보여진다. 그렇다면 multiisolate는 어떤 경우에 선택하는 것이 옳은가? BioProject FAQ에서는 다음과 같이 설명하였다.

  • 단일 종에서 유래한 여러 개체 혹은 스트레인을 비교하는 것이 목적이라면 multiisolate를 선택하라.
  • 서로 다른 종을 연구하는 것이라면 multispecies를 선택하라.
  • DNA 혹은 RNA source가 여러 개체에서 온 것이라 해도 그 목적이 단일 genome 혹은 transcriptome의 assembly라면 monisolate를 선택하라.
이 지시를 충실히 따르자면 렌스키의 50,000 세대 유전체 연구를 위한 BioProject는 monoisolate가 아니라 multiisolate가 되는 것이 맞다. 그러면 이 글의 맨 처음에서 소개한 우리 연구 그룹의 시퀀싱 데이터는? Multiisolate로 정의한 단일 BioProject 아래에서 두 개의 BioSample과 SRA experiment(조상 균주 및 변이 균주 각각에 해당)을 선언하여 SRA 데이터 파일을 등록하면 되는 것이었다. 그러나 나는 완전히 두 개의 BioProject를 만들고 말았다. 하나의 BioProject에 복수의 BioSample이 연결될 수 있다는 것을 미처 몰랐기 때문이다. NCBI에 일단 등록한 데이터는 그 어떤 요청을 해도 수정을 해 주므로 일단은 이것을 믿어보지만, 처음부터 단일 바이오프로젝트로 묶었다면 연구의 개요 전체를 좀 더 쉽게 파악할 수 있었을 것이다. 각 균주에 대한 시퀀싱 프로젝트를 개별 바이오프로젝트로 등록할 당시에는 나중에 umbrella bioproject로 묶어줄 것을 요청할 생각을 했었던 것이 사실이다. 하지만 단일 유형(raw sequencing data)의 소량 데이터로만 구성된 바이오프로젝트를 umbrella로 묶는다는 것은 격이 맞지 않는 일이다.






2017년 6월 9일 금요일

CLC Genomics Workbench - Microbial Genomics Module의 유용한 기능(workflow)

MGM이라고도 줄여서 부르는 CLC Genomics Workbench의 microbial genomics module(매뉴얼)은 꽤 가격이 나가는 유료 모듈이다. 평소에 이 모듈이 제공하는 몇가지 툴을 이용하여 분석을 진행해 오다가 오늘부터 본격적으로 workflow를 이용한 분석 작업에 빠져들게 되었다. 연속적으로 수행해야 하는 도구의 입력과 출력을 서로 연결하여 입력물과 출력물을 정의하는 것으로 만들어지는 워크플로우는 잘만 다루면 번거로운 작업을 정말 편하게 할 수 있다. 이미 만들어진 워크플로우를 쓰는 것은 매우 쉬우나, 사용자의 요구에 맞추어 새로 작성려면 익숙해지기까지 약간의 노력을 필요로 한다. 이번의 분석 작업을 계기로 워크플로우의 신규 작성과 수정에 관한 경험을 쌓지 않을까 기대를 하고 있다.

물론 이런 마음가짐을 갖기 직전에는 '왜 이렇게 편한 것을 진작에 익혀서 쓸 생각을 하지 못했을까!'하는 안타까운 마음이 있었다.

100건이 넘는 어떤 감염성 세균 유전체의 MiSeq sequencing data를 가지고서 트리를 그리고 여기에 메타데이터를 입혀서 적당히 장식을 하는 것이 이번 과업의 목표이다. 늘상 하듯이 mapping을 하고 variant를 추출하여 SNP tree를 그려 놓은지는 꽤 시간이 지났다. 메타데이터를 CLC에서 다루는 것이 아직 익숙하지 않아서 이를 가장 나중에 해야 할 일로 미루어 놓은 것이 현명하지 못한 선택이었다. CLC의 기능을 이리저리 살펴보니 메타데이터 테이블을 잘 정의하여 놓은 뒤 분석 작업을 시작하는 것이 훨씬 현명하다는 생각이 들었다.

이러한 분석 기능은 NGS core tools를 제외하면 전부 MGM의 Typing and Epidemiology(beta) 섹션에 포함되어 있다. 구글을 뒤지면서 적당한 튜토리얼이 없는지를 찾아보았다. Typing and epidemiological clustering of common pathogens (beta)이라는 튜토리얼을 찾아서 천천히 읽어보았다. 아니? 필요한 모든 작업 컴포넌트를 한번에 실행할 수 있는 워크플로우가 이미 존재하는 것 아닌가?


Type Among Multiple Species를 쓰면 되는 것이었다. 시퀀싱 샘플이 다양한 종으로 이루어진 것은 아니니 몇 개 종의 representative genome만을 골라서 reference DB를 만들고, 필요한 MLST scheme과 resistance gene을 받아 놓은 다음 튜토리얼에 나온 그대로 설정만 하면 간단하게 모든 작업이 이루어진다. 단, 트리를 그리는 것은 이 결과를 가지고 따로 실행하면 된다. 그리고 설명과는 다르게 Type a Known Species 워크플로우를 실제로 열어보면 de novo assembly - find resistance로 이어지는 가지는 포함되지 않았다. 이는 내가 직접 수정하면 될 것이다. 다음 그림은 Type Among Multiple Species 워크플로우 전체의 다이어그램이다. 상당히 복잡한 모습이 마치 DB schema를 보는 듯하다. 그 존재를 전혀 모르고 있었던 Local Realignment(in NGS core tools)가 두번이나 연속하여 실행된다. InDel & Structural Variant를 먼저 찾은 뒤 이를 참조하여 두번째의 alignment를 하는 것이다. 만약 내가 재래식(?) 작업 방법만 고집했다면 이러한 탁월한 기능이 존재하는지를 아예 모르고 살았을지도 모른다.



30분 정도 작업이 진행된 지금 5개째의 샘플에 대한 분석이 진행되는 중이다. Result metadata table에 결과가 차곡차곡 쌓여 나가는 것이 재미있다. 주말이 지나면 모든 샘플에 대한 결과가 나올 것으로 예상한다. 오염된 샘플에 대한 사전 정보를 이미 갖고 있으므로 실제 워크플로우의 결과를 비교해 보면 흥미로울 것이다.

Oxford Nanopore sequencing 첫 시도는 실패로 끝나다

오랜 기간 준비를 하여 큰 기대를 갖고서 첫 샘플을 올렸다. 그러나 결과는 처참한 실패였다. 2D lambda control experiment kit(SQK-LSK208)로 만든 것이라서 소중한 실제 샘플을 허무하게 낭비하지는 않았다. 모든 여건이 최적의 상태는 아니었다. 필요한 반응액과 소모품 등이 Oxford Nanopore에서 권장하는 '바로 그것'은 아니었다. 그렇다 하더라도 데이터 처리 쪽에서는 나름대로 오래 공부를 하여 준비하느라고 애를 썼는데 아직도 그 과정에서 아리송함을 갖고 있다는 것이 내 자존심을 많이 건드렸다.

Oxford Nanopore Technologies라는 회사명을 줄여서 ONT라고 부른다. 실험 노트 파일을 열어보니 OTN으로 잘못 타이프를 한 것이 눈에 뜨였다. OTN, OTZ, OTz. OTL... 어디서 많이 본 약자이다. 아, 그렇구나! 좌절한 모습을 영문자로 표현한 것이었다. 바로 지금 나의 모습을 그대로 보여주는 문자열이다.

다양한 배리에이션은 여기에서: http://moyaa44.blogspot.kr/2011/02/otl.html
EPI2ME desktop agent가 돌아가는 방식도 아직 완벽하게 이해하지 못한 상태이다. 처음에 Input Directory를 개별적인 run folder로 설정하는 바람에 새로운 시퀀싱 결과가 생성되어도 이를 자동적으로 업로드하지 못하는 우스꽝스런 상황이 되고 말았다. 문제는 이것을 고칠 방법을 모르겠다는 것이다. 그저 단순하게 C:\data\reads로만 해 두면 될 것을.

Live basecall은 1D 시퀀싱에서만 지원한다고 하여 basecall 없이 fast5 파일을 만들었다. Metrichor(EPI2ME) 서비스를 통한 basecall을 하지 않았다 해도 다른 방법으로 어떻게든 될 것이라 생각을 했던 것이다. 그래서 third party basecaller로는 잘 알려진 poretools를 리눅스에 설치하여 fast5 파일을 공급하니 유효한 시퀀스가 전혀 없다고 나온다. 이런? 프로그램 설치를 잘못했나? 패키지에 포함된 샘플 read에 대해서는 결과가 잘 나오니 그렇게 말하기는 어려웠다. 이번에는 ONT 커뮤니티 사이트에서 보급하는 basecaller인 Albacore를 설치하여 MinION을 구동한 윈도우 10 컴퓨터에서 실행을 하여 fastq 파일을 뽑아내었다. 하나의 pore를 DNA 가닥 하나가 통과하면서 얻어진 염기서열 정보에 해당하는 하나씩의 fast5 파일 여러개를 묶어서 fastq file하나가 만들어지는 것은 꽤 마음에 든다. 얻어진 Fastq file을 CLC로 임포트하여 read length 분포와 quality를 보았다. 처참하다! Lambda DNA sequence에 대한 매핑 결과는 물론 말할 것도 없다. Nanopore sequencing read에 좀 더 특화된 mapper를 쓰지 못한 탓도 있겠지만 근본적으로 이건 시퀀싱이 아니다!

다음으로는 EPI2ME에 업로드한 결과가 어떻게 되었는지를 살펴보았다. 웹사이트에서는 아예 리포트가 나오질 않았고, 다운로드한 read는 전부 fail 디렉토리에 존재한다. 이걸 보면 input directory를 띨띨하게 만들긴 했어도 클라우드쪽이 분석 작업은 잘 돌았다는 뜻이다. 그러나 결과는 매우 좋지 않다! poretools를 이용하여 fast5 파일 내에서 염기서열 이전의 정보를 뽑아내 보았으나 아무것도 반환되는 값이 없다. 

Albacore가 사기를 치지는 않았을 것이니 분명히 미약하나마 염기서열 신호가 나온 것으로 여겨진다. 다만 멀고 먼 최적화의 길이 앞에 펼쳐져있을 따름이다. 좀 더 경험이 쌓이면 MinKNOW 작동 화면만 보고서도 '아, 이번 러닝은 망했구나!'하고 판단이 될 것이다. 국내에는 대리점도 아직 없고, Nanopore community에 직접 질문을 올려서 다른 사용자가 답을 주기를 기다려야 하는 현실에서 troubleshooting을 하기란 참으로 난감하다. 이러한 여건에서 어떻게 KAIST 조병관 교수팀에서는 이미 1년 전 Scientific Reports에 Analysis of the mouse gut microbiome using full-length 16S rRNA amplicon sequencing이라는 논문을 냈는지 신기하기만 하다. 

수십년 전 대학원생 시절로 돌아가서 최초의 plasmid prep을 하다가 깨진 염색체 DNA만 길게 끌린 전기영동 사진을 얻은 기억을 되살리자. 누구나 실수는 할 수 있는 법이니...

2017년 6월 12일에 추가한 글


양질의 시퀀싱 결과를 만들어냈다는 자랑스런 글을 보니 배가 아프다! 이러다가 long read 만들기 경연대회라도 열리는 것은 아닌지?

2017년 6월 4일 일요일

건반을 고치고 싶다(6) - 부품의 배송이 늦어지다

Korg X2 music workstation의 LCD 표시창에 맞게 절단된 EL 백라이트를 구매하면서 예비용으로 10x10cm의 EL sheet를 구동 회로와 함께 알리익스프레스에서 구매하였다(링크).  만약 먼저 구매한 백라이트에 문제가 있으면 이것을 크기에 맞게 잘라서 사용할 생각이었다. 배송이 너무 늦어서 혹시 분실된 것이 아닌지 걱정이 들 무렵에 겨우 배달이 되었다. 다음의 배송 추적 기록을 보자.


5월 17일에 셴젠 우체국(코드명 CNSZXA, 전체 코드는 여기 참조)에 도착한 물품은 5월 31이 되어서야 한국에 들어왔다. 우편물이 비행기 안에서 14일씩 있었을 것 같지는 않다. 아마 Shenzhen 우체국 창고 어딘가에서 한동안 대기하고 있다가 뒤늦게 비행기를 타고 온 것이 아닐까 한다.

그러면 Fatar keyboard controller를 고치기 위한 rubber key contact(링크)는 비슷한 시기에 ebay에서 주문을 넣었음에도 불구하고 아직도 오질 않는다. 나의 ebay 경험으로는 아무리 길어도 18일 정도면 물건이 도착하였었다. 이 물품은 5월 10일 미국 아리조나 세도나의 USPS 사무실에 접수되어 5월 13일에 LA까지 온 것으로 되어있다. 배송 상태는 여전히 IN TRANSIT이다. 예상 배송 기한은 이미 지난지 오래되었다.

아직 LA의 USPS 사무실에 처박혀 있는지, 아니면 비행기를 타고 오는 중인지, 혹은 재수가 없어서 선편으로 오는 것인지 알 수가 없다. 우편물 등급은 가장 싸지만 매우 느린 First-Class Package International Service 되겠다. 판매자에게 배달이 너무 늦다고 불평을 했더니 최대 4-6주 정도 기다려 달라는 답장을 받기는 했었다.

혹시 분실된 것은 아닐까? 인터넷을 뒤지면 터키, 독일, 폴란드 등 다양한 국가에서 비슷한 물품을 판매한다. 분실된 것이 확실하면 환불을 요청하고 차라리 다른 곳에 다시 주문을 내고 싶은 마음이 굴뚝같다.

누구를 위한 의전(儀典)인가?

의전(儀典, protocol)이란 네이버 사전에 의하면 '행사를 치르는 일정한 법식'을 말한다. 일상생활에서는 무엇인가를 의전에 맞추어 할 일도 없고, 의전이라는 낱말을 쓸 일도 별로 없다. 내가 영단어로서 protocol이란 말을 처음 접한 것은 대학교에 들어와서 전공(생물학) 실험 과목을 수강하면서부터이다. 생물학에는 실험 단계에서 어떤 조작을 해야 하는지 그 순서와 방법을 상세하게 적어놓은 것을 실험 프로토콜이라고 부른다. 예를 들자면 이런 것이다.

  1. 시료를 상온에서 3,500 rpm으로 원심분리한다.
  2. 상등액을 새 시험관으로 옮긴다.
  3. Reagent A를 15 ml 가하여 vortex mixer에서 혼합한다.
적어놓고 보니 요즘 널리 쓰이는 '레시피', 즉 조리법과 거의 같은 성격의 문서가 된다. 이는 생물학 실험이 일종의 요리를 만드는 것과 유사하기 때문이다. 컴퓨터 공학을 전공하는 사람에게 프로토콜이란 전혀 조리법이라는 느낌이 들지 않을 것이 분명하다. 무술인이 대련을 준비하면서 합을 맞추는 것도 프로토콜이라는 말로 표현할 수 있을지 모르겠다.

정치와 권력이 오고가는 세계에서 의전이란 말은 그 딱딱한 본연의 뜻을 발위하게 된다. 손님이 오면 어떤 방식으로 맞이하여 어떤 동선으로 이동하도록 안내하고, 어떤 자리에 앉히고(상석이 어디인가?)... 이런 것과 관련한 절차 또는 양식을 의전이라고 부른다. 법률로 규정된 것은 아니지만 외교 현장에서는 매우 중요한 문제가 된다. 

정치 또는 외교와 관련이 없는 분야라 하더라도 권력에 따른 위계질서가 중요시되는 사회에서는 의전 역시 중요하다. 우리가 흔히 예절 또는 에티켓이라고 생각하는 것이 극단으로 치달아서 '갑질'로 막 넘어가려는 그 경계에 바로 의전 문제가 존재한다. 흔히 의전이라 하면, 행사를 준비하는 사람들이 윗분들을 모시고 대하는 순서 또는 방식에 관한 것이라 생각하기 쉽다. 하지만 소위 윗분들이 관례라는 것을 내세워서 어떤 정형화된 행동을 한다면 그것 역시 의전화된 양식으로 - 물론 부정적인 의미이다 - 보아도 무방할 것이다. 대학 교수로 근무하는 어느 친구에게 들은 이야기이다. 어떤 행사가 열리면 내외빈이 축사를 한다(축사는 대개 행사 진행하는 곳에서 알아서 준비한다). 그러고 나서 본 행사가 시작되기 전, 그 내외빈은 누구나 알아볼 수 있게 벌떡 일어나서 퇴장한다. 아무나 그렇게 할 수 있는 것은 아니고, 그 자리에 초청된 내외빈 중에서 가장 높은 사람만 가능하다. 따라서 행사를 준비하는 입장에서는 격이 맞는 손님들을 초청하고, 그 중에서도 누가 가장 높으냐에 대해서 다툼이 벌어지지 않도록 미리 조정을 해 놓아야 능력이 있는 사람으로 인정을 받는다. 워낙 바쁘고 높으신 분이니 초청한 자리에 와서 축사 한마디 하시는 것만으로도 감지덕지이고, 이제 다음 일정을 위해서 부득이하게 자리를 떠야 한다. 일반인이라면 행사에 방해가 되지않게 조용히 퇴장하는 것이 당연하겠으나, 이 높으신 분들은 '중요한 이 몸이 나가는 것'을 온 청중에게 보여야 한다. 아니, 아주 선명하게 과시하고 떠나야 한다. 이렇게 하는 것이 관행이라고 한다.

새로운 정부가 출범하면서 격식을 차리지 않는 문재인 대통령의 모습이 신선한 바람을 일으키고 있다. 노무현 정권 당시에는 대통령의 격에 어울리지 않는 언행을 한다고 그렇게 비난을 받던 일들이 이제는 당연하게 받아들여진다. 그만큼 시민들의 의식이 바뀌었다고 볼 수 있다. 요즘 경향신문에서는 [의전공화국]의 그늘진 단면을 보여주는 기획 기사를 연재하는 중이다(링크). 의전은 국가간 외교 의례와 관련한 영역에서만 엄격히 지키는 것으로 충분하다. 중요한 것은 의전이란 당사자가 갖고 있는 권한(정치적 영역이라면 국민으로부터 위임된)을 위해 주어지는 것이지 사람 자체를 위해 존재하는 것이 아니라는 것이다. A라는 공화국 대통령을 대하는 의전은 A라는 공화국 국민을 위한 것이지 대통령 개인을 위함이 아니라는 것이다. 이것을 이해한다면 과도한 의전을 둘러싸고 벌어지는 갈등은 대폭 줄어들 것이다. 그리고 일반 단체나 개인을 대상으로 하는 영역에서는 더 이상 의전을 운운하지 말고 상식과 에티켓 수준에 따라서 행동하는 것이 합리적일 것이다.