2016년 5월 16일 월요일

Hybrid AF(audio frequency) power amplifier IC 이야기 - Sanken IC를 이용한 앰프 제작

80년대에 서울에서 청소년 시기를 보내면서 가끔 청계천 전자상가 일대를 지나칠 때면 다음 사진처럼 눈길을 끄는 부품이 진열된 것을 보고는 하였다. 마치 큰 초콜렛 조각과 같은 손바닥 반 정도의 검정색 플라스틱 패키지에 단자가 지네발처럼 많이 달린 형태의 IC였다. 지네발과 다른 점은 몸체의 한쪽에만 다리가 달려있다는 점이었다. 그렇다면 오징어나 해파리를 연상하면 더 어울릴까? 당시에는 이것이 무엇에 쓰는 물건인지 전혀 알지 못하였다. 팝&록 음악에는 관심이 많았지만 오디오 기기 자체는 나와 상관이 없다고 생각했었기 때문이다.
출처: http://www.electronic-discount.be/product-details/stk4141ii-san/shop.htm?lng=en

청계천을 왜 지나다녔느냐고? 순전히 전자공작과 음반에 관련된 취미 때문이었다. 인터넷이 없던 당시 그 일대는 각종 음란물 유통의 메카였고, 호기심이 왕성한 소년들은 이를 구입하거나 단순히 눈요기를 할 목적으로 그곳을 찾기도 하였을 것이다. 믿거나 말거나 나는 그런 일에는 관심이 없었고, 현 청계로 위의 구름다리를 지날 때에는 이상한 물건을 팔기 위해 다가서는 호객꾼을 피해서 뛰어다니기도 하였으니...

최근들어 몇년 동안 납땜인두를 드는 일이 많아졌다. 어려서 제대로 누리지 못한 전자 공작 취미를 중년이 되어서 새로 시작했다고나 할까? 완제품 상태의 앰프 보드를 구입하여 배선 작업을 하고, 간단한 스피커 시스템을 만드는 일을 즐기게 되었다. 그러는 중 장사동 아세아전자상가에 위치한 은포전자의 홈페이지에서 흥미로운 제품들을 발견하게 되었다. 바로 글머리에서 소개한 종류의 칩을 사용한 앰프 보드였다. 은포전자는 자작용 앰프 섀시와 셀렉터, 부품등을 판매하는 곳으로 자작인들에게는 꽤 알려진 곳이다. 홈페이지에는 '앰프킷트'로 소개되어 있지만 실제로는 이미 조립이 완료된 기판으로서 대부분 방열판까지 갖추어져있다. 혹시 궁금하면 직접 찾아가거나 전화로 문의하는 것을 권한다. 홈페이지에 게시판이 있기는 하나 그다지 활성화되지는 못한 상태이다.

지금은 Texas Instruments(National Semiconductor가 인수)의 LM 시리즈 앰프 칩이나 SGS-Thomson(현재 STMicroelectronics)의 TDA 시리즈 앰프 칩이 널리 쓰이면서 이런 하이브리드 방식의 오디오 파워 앰프 IC는 자취를 감추었다(참조: [diyAudio] STK series amp modules - any good?). 시중에 돌아다니는 것은 대부분 과거에 풍성히 생산된 재고품인데, 간혹 중국에서는 이를 똑같이 흉내낸 가짜(fake or counterfeit)를 만들어 팔기도 한다. 인터넷으로 검색을 해 보니 이런 방식의 오디오 IC는 1969년 산요에서 처음 만든 것으로 보인다(링크). 지금의 판단 기준으로는 외형이 너무 크고, 공급 전압도 너무 높으며, 필요한 외부 부품도 너무 많다. 음질면에서는 평균 이상은 되었을 것이다. 아마도 많은 가정용 오디오 앰프에서 이러한 앰프 칩을 사용했었을 것으로 추측된다.

STK 시리즈 앰프 칩의 데이터 시트는 지금도 인터넷에서 쉽게 찾을 수 있다. 요즘 추세처럼 최대 출력으로 뻥을 치지 않고 최저 출력을 정직하게 표시해 놓았다. 내가 은포전자에서 실제로 구입한 것은 그러나 산요의 것이 아니라 산켄(Sanken)의 SI-1525HD 칩을 사용한 보드였다(제품 링크). 선택의 이유는 간단하다. 제품 목록 중에서 공급 전압이 가장 낮은 범위에 있는 것을 고른 것이다. 이 앰프를 위해 전원 트랜스를 또 구입할 의사는 전혀 없으니 사무실에서 사용 중인 LM1876 앰프에 달린 18V 듀얼 토로이덜 트랜스를 사용해야만 했다. 페놀 기판 위에 직접 만든 정류 회로를 거쳐 나온 최종 전압은 +/- 24V 수준이니 이를 만족하는 것을 골라야만 했다. 홈페이지에는 공급 전압의 범위가 양전원 22-40V라고 표기되어 있었다. 그렇지만 양전원 18V를 조금 넘는 수준에서도 소리는 약간 작지만 잘 동작하는 것을 확인하였다.

일반인에게 산켄은 매우 생소한 브랜드이다. 열심히 구글을 뒤져 보았지만 산켄의 하이브리드 오디오 앰프 IC는 데이터시트는커녕 정보 자체를 도저히 찾을 길이 없었다. 겨우 다음의 오래된 글을 하나 찾는데 만족해야 했다. 여기에는 SI-1525HD는 나오지 않는다. 은포전자의 제품 소개에는 8옴 부하에서 출력이 25W(RMS)라고 되어있다. 모델명을 구성하는 네 자리 숫자 중에서 뒤의 두 자리가 와트로 표시된 출력으로 생각된다. 이것은 모듈 하나에서 스테레오 채널을 증폭하게 만든 것인데, 두 채널의 정격 출력을 합쳐서 25와트라는 것인지, 혹은 각 채널에서 25와트를 뽑을 수 있다는 것인지 명확하지가 않다.

Sanken Hybrid Audio Power Amplifier Data 2021년 7월 6일 현재 접근 불가.
Sanken Hybrid Audio Power Amplifier Modules Catalog(SI-1000G 시리즈) 모듈 하나가 채널 하나에 해당하는 것으로 보인다. 

주말 저녁을 투자하여 단자와 볼륨 폿을 연결하였다. 케이스는 다이소에서 구입한 수납용 플라스틱 바구니를 사용하였다. 구멍이 이미 뚫려있어서 부품 연결하기가 여간 편리한 것이 아니다. 보통 뒷면에 배치하는 입력 단자를 앞으로 보내서 볼륨 폿과 최단거리로 배선하였다. 볼륨용 놉은 은포전자 바로 앞에 있는 점포에서 이전에 구입했던 것이다. 볼륨 폿은 50K짜리 저가 B형 제품이다. 정중앙 위치에서 걸리게 되어있어서 놉을 고정하기에 매우 좋다^^


하나의 전원 트랜스로 두 개의 앰프를 번갈아 연결해야 하는 실정이라서 컴퓨터의 파워 서플라이에서 떼어낸 전원 커넥터를 연결하였다. 전원부 배선에도 여기에서 나온 두꺼운 연선을 적극 활용하였다.


스크류 터미널이라도 달려있었다면 배선이 좀 더 편했을 것이다. 수직으로 세워진 핀 형태의 단자에 선을 직접 납땜하였다. 근처의 캐패시터가 너무 가까이 위치해 있어서 전원선은 부득이하게 기판 뒷면에서 연결하였다. 전원 그라운드와 신호 및 출력의 그라운드가 전부 연결된 형태의 회로이다.


전원부는 직접 만능기판에 꾸민 것이라서 더욱 애착이 간다. 브리지 다이오드는 개조하다가 망가뜨린 다른 앰프 보드에서 떼어낸 것이다. 다리를 너무 짧게 잘라내는 바람에 기판은 관통시킬 수가 없어서 아랫면에 배치하였다. 각 레일 당 4700uF 35V 전해 캐패시터를 하나씩 달고 바이패스용 필름 캐패시터를 붙인 것이 전부이다.


집에서 사용하는 TDA7265 앰프의 15-0-15V 전원트랜스를 연결하여 작동 테스트를 하였다. 약간의 팝업 노이즈는 있다. 실제 사용할 전원 트랜스는 18V dual, 100VA 규격의 제품이다.


산켄 앰프 칩을 가까이에서 촬영해 보았다. 2016년 중반 기준으로 본다면 정말 희귀한 아이템이이고 앞으로 더욱 희귀해질 것이다. 그러나 일부러 발품을 팔아가면서까지 수집할 가치가 있는 빈티지 아이템은 아니다. 지금은 사무실에 갖고 나와서 전원 트랜스를 새로 연결하여 듣는 중이다. 별다른 불만을 찾기 어려운 소리가 난다.


이번 공작에는 같은 날 구입한 40W 목인두가 크게 기여하였다. 그러나 몇 시간 작업 후의 인두 팁 상태는... ㅠㅠ



2016년 5월 20일에 추가한 글

산켄 전기의 홈페이지에 나온 이메일 주소로 SI-1525HD 칩의 정보를 물어보았다. 얻은 답변은 다음과 같다...

Dear Sir

Thank you very much for your inquiry.

We have searched our database for SI-1525HD. 
Unfortunately, because this is a very old product, we could not find any information of the product in our database.
We are very sorry we cannot support your request.

Product Name / Series
  Hybrid AF power amplifier IC SI-1525HD (discontinued)

2016년 5월 14일 토요일

서울 출장이 남긴 앰프 자작 관련 부품

서울 출장을 마치고 돌아오는 길에 오랜만에 종로로 발길을 돌렸다. 먼저 종로 4가에 있는 세운스퀘어에서 아내 손목시계에 사용할 가죽 밴드를 구입하였고, 길을 건너 세운상가 근처로 가서 몇 가지의 쇼핑을 하였다.


트랜스 단자나 커넥터 등을 납땜하면서 열량이 부족하여 고생을 했었기에 두번째 인두의 구입 필요성을 뼈저리게 느끼고 있었다. 그래서 먼저 아림종합상사에서 40와트 나무손잡이 전기인두와 직경 4mm짜리 국산 인두팁을 구입하였다. 약간 고열량의 최신 세라믹 히터 인두를 구입했다면(덩달아 가격도 비싼) 가장 완벽한 선택이 되었을지도 모르겠지만.. 인두팁은 18년 가까이 사용해 온 인두의 교체용이다. 그리고는 아세아전자상가에 들어가서 은포전자를 들러 25W급 Sanken SI-1525HD 칩을 사용한 앰프 보드와 중국제 RCA 단자 1조를 구입한 다음, 바깥의 골목에서 바인딩 포스트 2조를 구입하였다.

Sanken의 오디오 앰플리파이어 칩에 대한 데이터시트는 구글을 아무리 뒤져도 구할 수가 없었다. 산요 STK 시리즈 앰프는 정보가 꽤 있지만, 내가 갖고 있는 전원회로(23V 양전압)에 딱 맞는 것은 없었다. SI-1525HD의 공급전압 하한선에는 23V가 가까스로 들어간다. 은포전자 사장님 말씀으로는 이 보드가 꽤 팔렸다고 하는데 정작 인터넷에서는 제작기를 찾을 수가 없었다. 다음에 소개하는 것은 SI-1525HD 앰프 칩을 이용한 유일한 제작기인데, 은포전자의 보드를 쓴 것은 아니다.

산켄 IC를 이용한 슬림앰프 제작

앰프 보드의 상세한 사진을 찍어서 기록으로 남긴다. 어떤 소리가 날지 매우 궁금하다. 스크류 터미널이 달려 있었다면 즉시 연결해서 소리를 들어보겠지만 저런 기둥 형태의 단자는 선을 둘둘 말아서 납땜하는 것 말고는 방법이 없다. 간단히 테스트 목적으로 악어 클립을 잠깐 연결하는 목적으로는 편하겠지만.



앰프 보드를 사면서 '내가 이런 물건을 왜 또 사고 있지?'하는 생각을 떨치기 어려웠다. 고만고만한 수준의 앰프들이 이제 너댓개 이상으로 그 수가 불어난 상태에서 또 다른 앰프 보드라니? 결국은 보잘것 없는 변명이지만 재미있는 것을 어쩌란 말인가.

커넥터류는 잘 고르지 않으면 엉뚱한 물건을 사오기 십상이다. 스피커 연결 단자로 쓰려고 바인딩 포스트를 찾다가 평소에 쓰던 것과 다른 것을 골랐더니 현재 사용하는 스피커 케이블 끝에 달린 바나나 플러그가 너무 헐겁게 들어간다. 바인딩 포스트의 구멍 내경 4mm가 표준인 것으로 알고 있지만 제품마다 조금씩 차이가 있어서 너무 뻑뻑하거나 헐거운 경우가 있다. 부품통을 뒤져서 예전에 구입한 일반용 바나나 플러그를 찾아서 끼워보니 꼭 맞는다. 이 바나나 플러그는 예전에 용산에서 케이블이 붙은 형태의 것을 구입 놓았던 것이다. 물론 오디오용 부품은 아니다. 내가 스피커 단자 용도로 즐겨 쓰는 부품은 이런 것이다.  이것 역시 오디오용으로 만들어진 것은 아니다.


이 부품을 고르면서 또 실수를 한 것이 있다. 절연 부싱이 없는 타입이라서 금속 케이스에는 쓰지 못한다! 지난번에 패널용 RCA 단자를 살 때에도 마찬가지 실수를 하였다.

이번에는 케이스 제작에 연연하지 말고 실용적인 형태를 추구해 볼 생각이다. 나무판 위에 몇 장의 보드를 늘어놓고 그때그때 기분에 따라서 연결해서 듣는 것이 어떨까?


2016년 5월 12일 목요일

BioCyc의 운영 방식이 구독자 위주로 전환될 예정이다

미국 정부의 지원이 점차 줄어들면서 BioCyc 개발과 유지에 어려움을 겪던 SRI International의 피터 캅 박사가 드디어 BioCyc를 구독자에게 서비스하는 방식으로 이번 7월부터 운영 방식을 바꾸게 되었다. 즉 비용을 지불하는 유저에게만 서비스하겠다는 의미가 된다. 아마도 많은 고민 끝에 이런 결정을 내렸을 것이다. 그동안 연구비의 지속적인 지원을 촉구하는 supporting letter를 써 달라는 이메일을 종종 받았던 터라 아쉬움이 크다. 앞으로 Phoenix Bioinformatics라는 비영리 기관이 파트너가 되어 BioCyc의 운영을 맡게 된다고 한다.

BioCyc가 도대체 무엇을 하는 서비스인지 알고 싶다면 이 문서를 읽어보라. 7600개의 유전체로 이루어진 BioCyc 버전 20이 공개되었다는 메일을 오늘 받았다.

QIIME 설치(+khmer)

아무리 관심이 가는 연구 및 기술 분야라 해도 정작 내 손에 관련된 데이터가 없으면 기술 습득이 잘 되지 않는다. Metagenomics가 바로 그러한 예이다. 거의 항상 미생물 단일 genome의 분석을 하는데 시간을 쏟고 있는 상황이니 연구의 세계적인 흐름이 microbiome, community sequencing 쪽으로 흘러감에도 불구하고 '관심' 그 이상의 정성을 쏟지 못하였다.

다행스럽게도 같은 연구 조직 안에서 community sequencing 결과물의 분석하는 사람들이 생겨나면서 자연스럽게 교류의 기회가 생겼다. 나는 최우선적으로 내가 관리하는 비교적 고사양의 장비에 QIIME(quantitative insights into microbial ecology의 약자이며 '차임'이라고 발음한다)를 설치하는 일부터 맡았다. Metagenomic shotgun data를 다루는 환경인 MetAMOS를 설치해 본 일은 있지만 완전한 상태가 아니다. 단일 도구인 Kraken 정도만 써 본 것이 전부이다. 여담이지만 deep metagenome sequencing data의 전처리 방편으로 k-mer 분석을 하는 일에 빠져들어서 오히려 미생물 단일 유전체의 시퀀싱 데이터를 평가하고 개선하는데 매우 유용하게 사용하고 있다.

QIIME은 Nature Methods 7:335(2010)에서 소개된바 있으며 공식 웹사이트는 http:.//qiime.org이다. 그 기능을 간략하게 나열해 본다.

  • Network analysis
  • Histogram of within- or between-sample diversity
  • Analysis of of whether 'core' sets of organisms are consistently represented in certain habitats
  • Provides graphical displays that allows users to interact with the data
파이썬으로 만들어진 QIIME은 가상머신을 받아서 쓰거나, 최소 설치 혹은 완전 설치의 세 가지 방법으로 사용할 수 있다. 나는 두번째의 방법을 택하였다. 필요로 하는 파이썬 버전은 2.7.0과 3.0.0 사이여야만 한다. 잘 알려져있다시피 CentOS 6.x 대에 설치된 파이썬은 2.6.x이다. 이를 완전히 제거하지 않고 필요시에만 윗등급의 파이썬을 사용하는 설치 방법을 과거 몇 번의 포스팅으로 단편적으로 소개한 적이 있다. 이번에는 새로운 장비를 써야 하므로 이 과정을 다시 반복해야 한다. 전 과정을 소개해 본다. 가장 먼저 개발과 관련된 도구를 yum으로 설치한다. 그 다음 파이썬 2.7.x 소스코드를 받아서 설치하되 make altinstall 명령을 쓴다는 것에 유의하라. 다음으로는 python2.7 바이너리를 이용하여 distribute(easy_install 제공)을 설치한 다음 이를 이용하여 virtualenv와 pip를 순차적으로 설치한다. 이제 virtualenv를 활성화한 다음 마지막으로 pip를 사용하여 numpy와 qiime을 가져다 설치하면 된다.
# yum groupinstall "Development tools"
# yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel
# wget http://python.org/ftp/python/2.7.3/Python-2.7.3.tar.bz2
# tar xf Python-2.7.3.tar.bz2
# cd Python-2.7.3
# ./configure --prefix=/usr/local
# make
# make altinstall
# cd ..
# wget https://pypi.python.org/packages/source/d/distribute/distribute-0.6.49.tar.gz --no-check-certificate
# tar xvfz distribute-0.6.49.tar.gz
# cd distribute-0.6.49
# python2.7 setup.py install
# easy_install-2.7 virtualenv
# easy_install-2.7 pip
# mkdir /data/qiime
# virtualenv -p python2.7 /data/qiime/
# source /data/qiime/bin/activate
(qiime) # pip install numpy
(qiime) # pip install qiime
# print_qiime_config.py -t 
말하자면 pip를 설치하기 위해 distribute라는 징검다리를 거쳐간 셈이다. 이렇게 하지 않고 pip를 단독으로 설치하는 방법도 찾아보면 어딘가 있을 것이다.

python 2.7이 필요한 모든 스크립트를 실행하기 위해 명령행에서 일일이 python2.7을 타이프할 수는 없으니 아예 virtualenv를 쓰기로 한 것이다. 파이썬 2.7만을 설치해 놓고 virtualenv 없이 qiime을 깔아서 쓰려면 어떻게 하면 될까?
# pip2 install qiime (numpy도 마찬가지)
언제 시간이 되면 다른 머신(가상머신?)에서 테스트를 해 봐야 되겠다.

KHMER 2.0의 설치

QIIME을 실행하기 위해 python 2.7환경을 만들어 놓았으므로, khmer를 새롭게 설치하려면 이를 그대로 이용하면 된다. 즉 이 리눅스 머신에서 python 2.7에 절대적으로 의존하는 유틸리티를 앞으로 설치하려면 이 방법을 계속 활용하라. 단, khmer를 제대로 설치하려면  gcc를 업데이트해야 한다. 그렇지 않으면 "-std=c++11" 옵션을 이해하지 못한다는 에러 메시지가 발생한다. CentOS 6.x에서는 더 이상 높은 버전으로 올라가질 않으니 devtoolset을 이용해야 한다. 이에 대해서는 예전에 이미 포스팅한 일이 있다.
# gcc --version
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-16)
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# wget http://people.centos.org/tru/devtools-1.1/devtools-1.1.repo -P /etc/yum.repos.d
# sh -c 'echo "enabled=1" >> /etc/yum.repos.d/devtools-1.1.repo'
# sudo yum install devtoolset-1.1
# scl enable devtoolset-1.1 bash
# gcc --version
gcc (GCC) 4.7.2 20121015 (Red Hat 4.7.2-5)
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# source /data/qiime/bin/activate
(qiime) # pip install khmer
...

2016년 5월 11일 수요일

gnuplot으로 위 아래가 붙은 그림 그리기

X 축의 데이터가 동일한 두 장의 플롯을 여백 없이 세로로 이어붙이면 큰 면적을 차지하지 않으면서 효과적인 그림을 나타낼 수 있다. 전문적인 용어를 쓰자면 multiplot의 응용 사례중 하나로서 "stacked plots"이 되겠다. 다음 링크를 연구하면 해결 방법이 나온다.

gnuplot demo script: layout.dem (gnuplot 5.0)

CentOS 배포판에서 설치되는 gnuplot은 버전이 너무 구식이다. CentOS 6.7은 아직도 version 4.2 patchlevel 6이다. 이를 version 5.0으로 업그레이드하니 그림도 더욱 예뻐지고 GUI 형식의 조절 창도 열린다. 문제는 업그레이드를 하고 나니 MUMmer에서 만든 스크립트에서 다음의 명령을 이해하지 못한다는 것이다.

set mouse clipboardformat "[%.0f, %.0f]"
          ^
"T.gp", line 94: wrong option
버전 5.0의 매뉴얼에서 set mouse 명령의 유효한 옵션이 어떻게 바뀌었는지 차차 알아보기로 하자. 가장 단순무식한 해결 방법은 gnuplot script에서 해당 라인을 지워버리면 그만이다. 어차피 마우스를 인터랙티브하게 사용할 것은 아니므로.

오늘 그리려는 그림은 single reference genome 서열 위에 query sequence(multiple)을 MUMmer로 정렬하여 순서를 맞춘 그림 2장을 위 아래로 붙여서 표현한 것이다. 다시 말하자면 하나의 reference sequence에 대해서 두 종류의 contig set을 각각 정렬한 결과를 비교하자는 뜻이다. Stacked plots의 기본 트릭은 총 3장의 plot이 필요하다면 4, 1 레이아웃으로 선언을 하되 plot 사이의 마진은 없애고, 4번째 plot이 위치할 곳에 X 축과 설명을 붙이는 것이다. 문제는 query sequence가 많으면 Y축 라벨이 지저분하게 나타나므로 이를 취향에 맞도록 적절히 조절하는 것이다. 이번의 경우에는 ytic을 숫자만 없이 표시하게 하였다. 이것 외에도 몇가지의 트릭이 들어갔다.

  • Y 라벨에서 밑줄(_)을 제대로 표현하기: 이중으로 이스케이프를 하지 않으면 아래첨자가 된다.
  • 특정 위치에 수직선 세우기: reference 서열은 실제로는 염색체 + 플라스미드를 하나로 연결한 것이다. 경계가 되는 곳에 빨강색 세로 화살표(headless)를 세웠다.
  • X축의 표시 단위를 지수형태로 만들었다. (format specifier 참조)
단일 reference에 대하여 multiple query sequence를 정렬하는 스크립트로는 run-mummer4.sh라는 것이 있다. 어디서 났느냐고? 내가 만들었다.


#!/bin/sh
#
# run-mummer4.sh: MUMmer-based shell script for aligning draft sequences #                        to a finished genome.
#
if [ $# = 0 ]
    then
        echo "Usage : run-mummer4.sh [-q]" 1>&2
        echo "The last option is for delta-filter."
        echo "Other nucmer default options: -maxmatch -c 100"
          exit 1
fi
#nucmer --prefix=$1 -mum -c 100 $2 $3
nucmer --prefix=$1 -mum -c 1000 $2 $3
if [ "$4" = "-q" ]
    then
        delta-filter $4 $1.delta > tmp
        mv $1.delta $1.delta.org
        mv tmp $1.delta
fi
show-coords -rcl $1.delta > $1.coords
REFNAME=`awk '$1~/^>/{print $1}' $2 | sed 's/^>//'`
for QRYNAME in `awk '$1~/^>/{print $1}' $3 | sed 's/^>//'`
do
    show-aligns $1.delta $REFNAME $QRYNAME > $1.aligns
done
mummerplot --postscript $1.delta -R $2 -Q $3  --layout --prefix=$1
이를 (reference + query 1), (refernece + query 2)로 각각 실행하여 gnuplot 스크립트를 만든 뒤 이어붙여서 다음과 같이 편집하였다. 위에서 소개한 트릭들이 어떻게 반영되었는지를 잘 확인해 보라. ytics를 선언한 곳은 너무 길어서 적당히 생략하였다.

set multiplot layout 3,1 title "Auto-layout of stacked plots\n" font ",12"
set grid
unset title
unset key
set border
set ylabel "DS1"
set tmargin 0
set bmargin 0
set lmargin 10
set rmargin 3
set xtics format " "
set ytics ( \
 "" 1, \
 "" 36204, \
...
 "" 4969774, \
 "" 4971242 \
)
#set tics scale 1
set xrange [1:5848607]
set yrange [1:4971242]
set style line 1  lt 1 lw 2 pt 6 ps 0.5
set style line 2  lt 3 lw 2 pt 6 ps 0.5
set style line 3  lt 2 lw 2 pt 6 ps 0.5
set arrow from 5461741,0 to 5461741,4971242 nohead lc "red"
plot \
 "DS1.fplot" title "FWD" w lp ls 1, \
 "DS1.rplot" title "REV" w lp ls 2
set ytics ( \
 "" 1, \
 "" 17170, \
...
 "" 5880317, \
 "" 5882187 \
)
set xlabel "Chromosome (bp)"
set ylabel "2\\_A\\_57\\_GC2"
set format x "%.0tx10^%1T"
set xtics
set xrange [1:5848607]
set yrange [1:5882187]
set style line 1  lt 1 lw 2 pt 6 ps 0.5
set style line 2  lt 3 lw 2 pt 6 ps 0.5
set style line 3  lt 2 lw 2 pt 6 ps 0.5
set arrow from 5461741,0 to 5461741,5882178 nohead lc "red"
plot \
 "2_A.fplot" title "FWD" w lp ls 1, \
 "2_A.rplot" title "REV" w lp ls 2
pause -1
결과물은 다음과 같다.







PacBio SMRT analysis의 필터링은 두 단계?

PacBio 데이터를 SMRT analysis에서 직접 다루면서 수치로 표현되는 결과물을 점검하다보면 혼동스러울 때가 있다. Running이 전부 끝나면 나타나는 overview 화면의 "Number of Bases"는 실제 subread filtering 세부 결과창에 나타나는 "Total Number of Bases"보다 약간 크기 때문이다. 이를 확실하게 정리하고자 오늘을 글을 작성한다.

아마도 이러한 오해는 필터링이 실제로 두 단계에 걸쳐서 일어나는 것에서 출발한다. Subread filtering, 즉 SMRTbell 라이브러리의 양 끝에 붙은 단일 가닥의 어댑터 서열을 polymerase read(진정한 raw data)로부터 제거하는 것이 subread filtering의 핵심인데, 이보다 앞서서 기본적인 필터링(아마도 quality에 의존하는?)이 이루어지는 것으로 보인다. Report 탭을 보면 GENERAL 항목 아래에 Overview, Filtering, Subread Filtering이 각각 존재하는 것도 그런 이유일 것이다. 아래 그림에서 보인 리포트는 효모의 HGAP 결과 리포트이다. Total contig length가 12Mb를 넘으므로 SMRT cell 하나로는 시퀀싱 분량이 다소 부족하다고 생각된다. Average reference coverage가 41.8x에 불과하자 않은가? 박테리아 시료는 SMRT cell 하나로 충분하다.


Overview 항목에서 보이는 염기쌍 수는 첫 단계의 필터링을 거친 염기쌍 수와 같다(빨강색 상자). 그리고 Pre-assembly에 투입되는 염기쌍의 수는 subread filtering을 통과한 염기쌍의 수와 같다(연두색 상자).

SMRT analysis와 관련한 정확한 수치를 한눈에 파악하려면 View data 창에서 job을 선택한 다음 웹 브라우저 맨 하단에 나오는 Metrics..를 클릭하여 저장되는 csv 파일을 참조하는 것이 가장 바람직하다. 그런데 정보의 종류가 너무 많다. 무려 64종이나 된다...

  1. jobid - Job ID
  2. jobname - Job Name
  3. overview.ncells - SMRT Cells
  4. overview.nmovies - Movies
  5. filtering_report.mean_read_score_pre_filter - Mean Read Score
  6. filtering_report.base_n_post_filter - Number of Bases
  7. filtering_report.reads_n_post_filter - Number of Reads
  8. filtering_report.mean_read_length_pre_filter - Mean Read Length
  9. filtering_report.mean_read_score_post_filter - Mean Read Score
  10. filtering_report.n50_read_length_post_filter - N50 Read Length
  11. filtering_report.mean_read_length_post_filter - Mean Read Length
  12. filtering_report.n50_read_length_pre_filter - N50 Read Length
  13. filtering_report.reads_n_pre_filter - Number of Reads
  14. filtering_report.base_n_pre_filter - Number of Bases
  15. filter_subread.filter_subread_mean - Mean Subread length
  16. filter_subread.filter_subread_n50 - N50
  17. filter_subread.filter_subread_nbases - Total Number of Bases
  18. filter_subread.filter_subread_nreads - Number of Reads
  19. adapter.adapter_dimers - Adapter Dimers (0-10bp)
  20. adapter.short_inserts - Short Inserts (11-100bp)
  21. adapter.medium_inserts - Medium Inserts
  22. adapter.hq_adapter_dimers - Adapter Dimers
  23. adapter.hq_short_inserts - Short Inserts
  24. adapter.hq_medium_inserts - Medium Inserts
  25. loading.productivity_c1 - Productive ZMWs
  26. loading.productivity_c2 - ZMW Loading Productivity 2
  27. loading.productivity_c3 - ZMW Loading Productivity 3
  28. loading.productivity_c4 - ZMW Loading Productivity 4
  29. mapping_stats.mapped_subreadlength_n50 - Mapped Subread Length N50 (bp)
  30. mapping_stats.mapped_readlength_q95 - Mapped Polymerase Read Length 95% (bp)
  31. mapping_stats.mapped_subread_readlength_mean - Mapped Subread Length Mean (bp)
  32. mapping_stats.mapped_readlength_max - Mapped Polymerase Read Length Max (bp)
  33. mapping_stats.mapped_subread_bases_n - Mapped Subread Bases
  34. mapping_stats.mean_max_subread_readlength - Mapped Read Length of Insert
  35. mapping_stats.pct_first_subreads_ts_lt_100 - Reads Starting Within 100 bp (%)
  36. mapping_stats.number_of_aligned_reads - Number of Aligned Reads
  37. mapping_stats.mapped_reads_n - Mapped Reads
  38. mapping_stats.mapped_bases_n - Mapped Polymerase Bases
  39. mapping_stats.pct_first_subreads_ts_lt_50 - Reads Starting Within 50 bp (%)
  40. mapping_stats.mapped_subread_accuracy_mean - Mapped Subread Accuracy
  41. mapping_stats.mean_first_subread_readlength - First Subread Length
  42. mapping_stats.mapped_readlength_n50 - Mapped N50
  43. mapping_stats.mapped_full_subread_readlength_mean - Mapped Full Subread Length
  44. mapping_stats.mapped_subreads_n - Mapped Subreads
  45. mapping_stats.mapped_readlength_mean - Mapped Polymerase Read Length
  46. coverage.depth_coverage_mean - Mean Coverage
  47. coverage.missing_bases_pct - Missing Bases (%)
  48. preassembly.polymerase_read_bases - Polymerase Read Bases
  49. preassembly.length_cutoff - Length Cutoff
  50. preassembly.seed_bases - Seed Bases
  51. preassembly.preassembled_bases - Pre-Assembled bases
  52. preassembly.preassembled_yield - Pre-Assembled Yield
  53. preassembly.presssembled_reads - Pre-Assembled Reads
  54. preassembly.presssembled_readlength - Pre-Assembled Reads Length
  55. preassembly.preassembled_n50 - Pre-Assembled N50
  56. polished_assembly.polished_contigs - Polished Contigs
  57. polished_assembly.max_contig_length - Max Contig Length
  58. polished_assembly.n_50_contig_length - N50 Contig Length
  59. polished_assembly.sum_contig_lengths - Sum of Contig Lengths
  60. variants.mean_contig_length - Average Reference Length
  61. variants.weighted_mean_bases_called - Average Reference Bases Called
  62. variants.weighted_mean_concordance - Average Reference Consensus Concordance
  63. variants.weighted_mean_coverage - Average Reference Coverage
  64. variants.longest_contig_name - Longest Reference Contig


2016년 5월 3일 화요일

SequenceServer 활용하기(Ruby)

공공기관 웹사이트 정비방안에 따라서 모든 웹사이트는 일몰제를 원칙으로 운영해야 하고, 일정 기준(방문자 수 혹은 데이터 등록 수 등)을 충족하지 않으면 폐쇄를 해야 할 처지에 놓이게 되었다. 또한 개별적인 도메인은 상당한 사유가 있지 아니하면 신규로 생성하거나 유지하지 못하고, 기관의 공식 도메인의 하위 도메인으로 들어가야만 한다. 게다가 사용자 인터페이스까지 통일해야만 한다.

싫든 좋든 이 지침을 따르지 않을 수가 없어서 미생물 유전체 정보 서비스를 위해 운영하던 웹사이트를 폐쇄하고 말았다. 그랬더니 적은 빈도지만 이를 써 오던 사용자가 불편함을 호소하게 되었다.

기존 사용자는 특정 genome에 대한 www blast를 가장 요긴하게 사용해 왔었다. 불편함을 덜어주기 위해 연구소 방화벽 내에서만 돌아가는 www blast site를 임시로 열기로 잠정적으로 결정한 다음 NCBI ftp 사이트에서 blast 바이너리를 찾았다. 그런데 뭔가 좀 이상하다. BLAST+는 다운로드 사이트에서 각 버전별 묶음이 잘 보이는데 www blast가 도대체 보이지 않는다. 이제는 legacy blast에 묻어서 더 이상 눈에 뜨이는 URL에서 배포하지 않게 된 것으로 생각된다.

좀 오래된 글이지만 다음의 SEQanswers 글타래가 한가지 힌트를 제공하였다.

Is there a replacement for wwwblast using new blastx+ toolkit

그것은 바로 Ruby로 만들어진 SequenceServer라는 것이다. 리눅스에서 프로그램을 설치하여 command line으로 실행하면 BLAST+ 바이너리와 DB file의 위치를 묻는다. 이를 차례로 입력하면 웹브라우저에서 http://localhost:4567이라고 입력하는 것만으로 GUI를 갖춘 blast 창이 뜬다. 말하자면 SequenceServer는 GUI 환경에서 NCBI BLAST+를 사용하게 만들어주는 일종의 wrapper인 셈이다. 예전의 www blast는 comman line blast와 완전히 별개의 프로그램이었던 것이다. Python 모듈 설치도 쉽지 않은데 이제는 Ruby라니! gem은 또 무엇을 하는 유틸리티란 말인가? 설치 전 과정을 간단하게 정리해 본다.

SequenceServer 설치(관리자 권한)

  1. https://rubygems.org/rubygems/rubygems-2.6.4.tgz 다운로드
  2. 압축을 풀고 ruby setup.rb 실행
  3. yum install ruby-devel
  4. yum install rdoc
  5. gem install sequenceserver
SequenceServer 웹사이트에는 단지 5번 항목만을 기술해 놓았다. 1-4의 과정은 구글 검색과 시행착오를 거쳐서 알아냈다. 설치가 다 끝났으면 sequenceserver를 실행한다. 우선 BLAST+ 바이너리의 경로를 입력하라는 지시가 뜬다. 그냥 엔터를 치면 없는 것으로 가정하고 다운로드를 받는다. 그 다음에는 DB 생성을 위한 FASTA file을 지정하라는 표시가 뜬다. 여기까지 다 한 뒤에는 SequenceServer 프롬프트를 유지한 상태로 다른 터미널 창을 열고 firefox를 띄운 뒤 주소창에 http://localhost:4567이라고만 넣으면 된다. 127.0.0.1로만 접속이 됨을 유의하라. 즉, 웹 브라우저에서 리눅스 컴퓨터의 IP 주소:4567을 넣으면 접속이 되지 않는다. 쓰레드 등 각종 파라미터 설정은 sequenceserver 명령어의 인수로 제공하면 된다. 간단한 사용법은 sequenceserver -h를 하면 확인할 수 있다.


이러한 방식의 유틸리티가 있을 것이라고는 정말이지 상상도 하지 못했다! 사용자의 요청에 따라 임기응변식으로 blast site를 만들어 주거나 까다로운 CLI blast 사용법을 가르쳐줄 것이 아니라, 이미 갖고 있을 약간의 리눅스 지식을 활용하여 sequenceserver를 쓰도록 유도하는 것이 훨씬 생산성이 높을 것이다.

전혀 계획하고 있지 않던 일을 타인의 요청에 의해서 하는 과정에서 이렇게 예상 외의 기법을 터득하게 된다. 이런 즐거운 경험이 점점 많아진다는 것은 매우 좋은 일이 아닐 수 없다.