2016년 5월 29일 일요일

램프형 스위치의 올바른 결선법

전원 스위치 중에는 ON 상태를 표시하는 파일럿 램프가 내장된 것이 있다. 이를 보통 램프형 스위치(illuminated swithch) 혹은 조명형 스위치라 부른다. 220V에 직접 연결되는 스위치에서는 전력 소모가 적고 수명이 매우 긴 네온 램프가 들어있는 것이 일반적이다. 결선 방법에 따라서는 항상 램프에 불이 들어오게 할 수도 있고, ON 상태에서만 불이 들어오게 할 수도 있다. 가정용 조명을 켜고 끄기 위해 사용하는 벽면 매입형 램프형 스위치는 어둠 속에서 스위치의 위치를 쉽게 찾을 수 있도록 OFF 상태에서는 파일럿 램프가 켜지고 ON 상태에서는 꺼지도록 되어있다. 오늘의 포스팅에서는 이러한 방식의 스위치는 논외로 한다.

새로 만든 산켄 하이브리드 IC 사용 앰프의 케이스 제작 마무리를 위해서 지마켓에서 램프영 스위치를 2개 구입해 보았다. 예전에도 비슷한 일을 위해서 스위치를 구입하여 완성을 했지만 정확한 결선법을 몰라서 ON-OFF 작동은 되어도 파일럿 램프는 항상 꺼진 상태였다. 인터넷을 종일 뒤져보았지만 국문 페이지에는 속 시원하게 설명된 글이 거의 없다 해도 과언이 아니었다. 영문으로 "How to wire illuminated switch"를 검색하니 겨우 이해할만한 수준의 글이 나타나기 시작했다. 여기에 약간의 실험을 더해서 오늘의 포스팅을 채울 체계적(?)인 지식을 마련하였다.

내가 이번에 구입한 스위치는 다음의 사진과 같다. 초록색 불을 밝힌 3단자 원형 스위치는 이미 가공된 케이스에 들어간 상태이다.


3단자 램프형 스위치의 연결볍은 유튜브 동영상까지 나올 정도이다. 이것은 비교적 이해하기 쉽다. 인터넷에서 그림을 하나 얻어왔다. 두꺼운 선은 이해를 돕기 위해 내가 그린 것이다. 다음과 같이 결선하면 ON 시에 내부의 램프가 점등된다. 그림에서는 LED로 표현되었지만 저항이 직렬로 연결된 네온 램프로 생각하면 된다. SPST(single pole singe throw)는 스위치의 작동 방식을 일컫는 용어이다. 그림과 더불어 좀 더 자세한 설명을 원한다면 여기를 참조하라.

출처: https://www.circuitlab.com/circuit/ud5yzk/

다음으로는 4개의 핀으로 구성된 램프형 스위치의 경우를 알아보자. 맨 위에 실은 그림에 보인 빨강색 스위치가 그 예이다. 6핀용 스위치와 같은 케이스를 쓰고 있어서 1번과 4번 핀 자리는 비어있다. 예전에 만든 앰프에서는 이 스위치가 단지 전원 ON/OFF만 하도록 결선했을 뿐, 램프는 전혀 작동하지 않았다. 그래서 앰프 패널에 LED를 이용한 파일럿 램프를 별도로 달았었다. 제대로 점등한다 해도 앰프 뒷면에 파워 소켓과 같이 조립해 놓아서 어차피 보이지는 않는다. 이 스위치는 DPST(dual pole single throw)의 일종이므로, 아래 그림에서 보였듯이 스위치 동작에 따라 2-3, 그리고 5-6 사이가 이어졌다 떨어졌다를 하는 것으로 생각하여 결선을 하면 기본적인 개폐 동작은 된다. 그런데 이렇게 해서는 램프가 켜지는 모습을 도저히 볼 수가 없다.


도대체 네온 램프는 어느 핀 사이에 연결된 것인가? 220V 파워 케이블에 악어 클립을 달아서 두 핀씩을 연결하는 매우 위험한 실험을 시도하였다. 2번과 3번 핀(혹은 5번과 6번)에 220V를 연결하여 ON으로 올리면? 이는 220V를 그대로 단락시키는 셈이니 한마디로 '미친 짓'이다. 물론 브레이커가 달린 멀티탭을 사용했기에 사고를 치지는 않았다. 실험 결과는 다음과 같았다.

  • 2-6번 핀에 220V 연결: ON 상태에서 점등
  • 3-5번 핀에 220V 연결: ON 상태에서 점등
  • 2-5번 핀에 220V 연결: 항시 점등
그렇구나! 네온 램프는 스위치 내부에서 2번 핀과 5번 핀 사이에 연결된 것이다. 파일럿 램프 동작 방식에 따른 두 가지 결선 방법을 생각해 보았다. 좌우의 핀 쌍을 서로 바꾸어도 동작은 똑같이 될 것이다. 처음에는 6번 핀에 전원을 인가하는 방식으로 그렸더니 상시 점등이 되도록 결선하는 것이 불가능하여 다음의 최종 그림과 같은 형태로 고친 것이다.



이보다 더 복잡한 방식의 스위치도 있다고 한다. 예를 들어서 파일럿 램프가 2개인 것도 있으니 말이다.

더욱 현명한 결선법

열심히 그림을 그려서 올린 뒤 좀 더 구글링을 해 보았다. 국내 스위치 제조업체인 (주)한국오탁스의 제품 설명서에서 더욱 정확한 결선 방법을 찾았기에 소개한다. 아래의 2극 스위치의 그림에서 설명한 제품은 2번과 4번 핀 사이에 내부적으로 네온 램프가 연결되어 있지만 실제적으로는 위에서 소개한 4핀 스위치와 동등하다. 생각해보니 내가 고안한 결선법은 한쪽 접점만을 쓰도록 하였으므로 스위치의 고유 사양보다 적은 전류를 흘려야만 할 것이다. 그리고 이 제품 설명서에서는 3P 스위치의 상시점등 결선법과 심지어는 스위치 OFF 시 점등하는 결선법도 소개하고 있다. 

출처: http://otaxkorea.co.kr/img/product/img/t.pdf

고민하기 전에 검색을 생활하하자...

산켄 앰프 케이스에 뚜껑 씌우기

다이소 수납 바구니에 대충 넣어두었던 산켄 SI-1525HD IC 사용 앰프 보드에 뚜껑을 씌웠다. 고장난 외장 HDD의 케이스를 잘라 가공하여 앰프 케이스 위에 덮은 다음 토로이달 트랜스와 전원 스위치를 고정한 것이다. 평활회로 기판에 쓰인 전해 캐패시터의 높이가 상당해서 전원 트랜스를 내부로 숨기지 못하고 뚜껑 윗면에 붙였다. 전원 스위치 고정 구멍은 먼저 밑그림을 그린 뒤 전동 드릴로 둘레를 따라 구멍을 여러개 뚫은 다음, 실톱으로 잘라내고 줄로 다듬었다. 두께 2mm짜리 알루미늄판이라서 그런지 인접하여 뚫은 구멍 사이를 처음에는 니퍼로 끊으려 했으나 잘 잘리지를 않았다. 실톱이라는 것이 정말로 쓸만한 공구라는 것을 최근에 깨닫게 되었다. 아직은 요령이 좀 부족하지만 말이다.

뚜껑으로 사용판 알루미늄 판의 크기가 충분하지 않아서 앰프 칩이 보인다. 2mm 알루미늄 판에 커터칼로 금을 수도 없이 그어서 꺾어서 자른다는 것이 비록 전혀 불가능한 일은 아니지만 권장할 일도 아니다.

네온 램프가 점등되는 원형 전원 스위치가 포인트이다. 스위치 ON 시에 불이 들어오도록 결선하는 방법을 찾느라 약간의 수고가 필요하였다.




2016년 5월 24일 화요일

NCBI에서 받은 미생물 유전체 정보를 업데이트하기

얼마전에 NCBI에서 미생물 유전체 서열을 한번에 다운로드하는 방법을 소개한 적이 있었다.

NCBI에서 미생물(bacteria) 유전체 서열을 한번에 다운로드하기

지금 와서 돌이켜보니 설명이 많이 부족하였다. 또한 이미 받은 서열 파일 이외에 NCBI에서 추가로 등재된 파일만을 가져오려면 어떻게 하는 것이 좋을까? 지난 4월 초에 총 6만개가 넘는 유전체 서열 파일(*_genomic.fna.gz)를 받는데 거의 5일 가까이 걸렸었다. 만약 ftp 세션을 여러개 열어서 나름대로 최적화를 시도했다면 조금 더 빨리 받을 수도 있었겠지만 ftp가 좋아하지는 않았을 것이다. 데이터 전체를 매번 새로 받을 것이 아니라 새로 등록된 것만 받고, 아울러서 무슨 이유인지는 몰라도 삭제된 것은 제거하는 방식으로 데이터베이스를 유지하는 것이 바람직할 것이다. 오늘의 포스팅에서는 그 실제적인 방법을 정리하고자 한다.

박테리아의 경우 NCBI RefSeq ftp 사이트에 있는 파일 assembly_summary.txt가 가장 핵심적인 파일이다. 박테리아가 아닌 곰팡이나 식물 등 다른 계열의 것을 원한다면 다음 위치에서 해당 디렉토리로 들어가서 assembly_summary.txt를 찾아라.

ftp://ftp.ncbi.nlm.nih.gov/genomes/refseq/

이 파일을 이루는 각 컬럼의 설명이 필요하면 여기를 확인해 보라. assembly_summary.txt의 20번째 필드에 ftp를 위한 기본 path가 수록되어 있다. 이를 awk로 뽑아내어 별도의 파일 bacteria_dir.txt를 만든다. 시험삼아 Paenibacillus polymyxa E681 assembly version 2의 RefSeq ftp 기본 위치를 가 보자. 10여 개의 파일이 있다. 나는 이 중에서 유전체 염기서열 파일(*_genomic.fna.gz)만을 받을 것이다. 그러려면 bacteria_dir.txt 파일을 적절히 가공하여 유전체 염기서열 파일의 전체 다운로드 경로 파일(bacteria_genomic_file)을 만든 뒤 wget으로 받으면 된다. 전체 과정을 하나의 스크립트로 표현하면 다음과 같다.
$ curl 'ftp://ftp.ncbi.nlm.nih.gov/genomes/refseq/bacteria/assembly_summary.txt' > bacteria_assembly_summary.txt
$ awk '{FS="\t"} !/^#/{print $20}' bacteria_assembly_summary.txt > bacteria_dir.txt
$ sed -r 's|(ftp://ftp.ncbi.nlm.nih.gov/genomes/all/)(GCF_.+)|\1\2/\2_genomic.fna.gz|' bacteria_dir.txt > bacteria_genomic_file
$ wget --input bacteria_genomic_file 
첫번째 명령은 wget ftp://ftp.ncbi.nlm.nih.gov/genomes/refseq/bacteria/assembly_summary.txt라고 단순하게 입력해도 된다.

RefSeq가 아니라 GenBank 레코드를 받고 싶다면 파일 경로와 이름이 약간 달라진다. 바뀌어야 하는 곳을 위에서 빨강색으로 표시했으니 이는 숙제로 남긴다. 그러면 약간의 응용을 해 보자. 만약 genus Vibrio의 완성된 유전체에 해당하는 것만을 전체 다운로드하려면 어떻게 하면 좋을까? assembly_summary.txt에서 해당되는 조건의 row만을 뽑아서 좀 더 특화된 다운로드 경로 파일을 만들면 된다. 위에 소개한 명령 세 줄에서 가운데 것만 다음과 같이 바꾸면 된다. awk에서는 따옴표로 둘러친 명령어 내에서 field separator를 탭("\n")으로 지정해도 되고, 명령행 옵션으로(awk -F "\t") 지정해도 된다. 
$ awk '{FS="\t"} $8 ~ /^Vibrio/ && $12 ~ /Complete Genome/ {print $20}' bacteria_assembly_summary_05-24-2016.txt > bacteria_dir.txt

Incremental download 요령

우선 로컬 파일시스템에 다운로드한 기존의 파일 이름을 수록한 목록 파일을 만든 뒤 sort를 해 둔다.

$ ls | grep _genomic.fna.gz | sort > DOWNLOADED_FILES_SORTED

다음으로는 최산 assembly_summary file에서 파일 목록을 만들어 둔다. 다운로드 링크를 붙이지 않은 파일 이름만의 목록을 만들어야 하고, 마찬가지로 sort도 거쳐야 한다.

$ sed -r 's|(ftp://ftp.ncbi.nlm.nih.gov/genomes/all/)(GCF_.+)|\2_genomic.fna.gz|' bacteria_dir.txt | sort  > ALL_FILES_SORTED

이제 comm이라는 놀라운 유틸리티를 구동하자. comm은 두 개의 파일을 라인 단위로 비교하여 첫번쨰 파일에만 있는 라인, 두번쨰 파일에만 있는 라인, 그리고 모든 파일에 공통으로 있는 라인을 각각 별도의 컬럼으로 출력한다. 두 파일은 전부 사전에 sort가 되어있어야 하고, 같은 내용의 라인을 중복해서 갖고 있어서는 안된다. 인수(-1, -2, -3)는 출력이 되지 않도록 하는 컬럼을 지정하는 것이다. 즉 comm -23 file_1 file_2은 첫번째 파일에만 있는 라인을, comm -13 file_1 file_2는 두번째 파일에만 있는 라인을 출력한다.

$ comm -23 DOWNLOADED_FILES_SORTED ALL_FILES_SORTED > FILES_TO_DELETE
$ comm -13 DOWNLOADED_FILES_SORTED ALL_FILES_SORTED > FILES_TO_DOWNLOAD
$ sed -r 's|(^.*)_genomic.fna.gz$|ftp://ftp.ncbi.nlm.nih.gov/genomes/all/\1\/\1_genomic.fna.gz|' FILES_TO_DOWNLOAD > FILES_TO_DOWNLOAD_WITH_LINKS
$ wget --input FILES_TO_DOWNLOAD_WITH_LINKS
$ cat FILES_TO_DELETE | while read f
> do
> rm $f
> done

파일 이름에 생성 날짜를 넣고 싶다면


$ mv bacteria_assembly_summary.txt bacteria_assembly_summary_`date +%m-%d-%Y`.txt

펄 스크립트로 무엇인가를 구현하려고 머리를 쥐어짜다가 조금만 검색을 거치면 이미 그런 용도로 만들어진 리눅스 유틸리티를 발견하고 늘 감탄을 하게된다. 세상은 넓은데 내가 새로이 할 일은 별로 없다!

2016년 5월 21일 토요일

TDA2030A 앰프 보드에 선 연결하기

특별한 단자 처리 없이 핀 헤더만 달린 앰프 보드에 어떻게 배선을 할 것인가? 만능기판 조각에 핀 헤더 소켓과 3.5mm 스테레오 폰잭을 달아서 연결하기로 하였다.


두 장의 보드는 서로 180도 회전 대칭이 되게 연결한다. 따라서 소켓과 헤더를 연결하면서 방향이 잘못될 여지가 없다. 사실은 주변 부품의 간섭으로 이렇게 연결할 수밖에 없다. 5핀 스테레오 폰잭(PJ-307)은 플러그를 연결하지 않았을 때 신호선이 그라운드와 접속되게 배선하였다. 따라서 선이 연결되지 않으면 잡음이 발생하지 않는다. 가격이나 모양으로 보아서는 PJ-306이 조금 더 고급으로 보인다. PJ-306/PJ-307은 전부 샤시 고정 타입이 아님을 참조하라(너트와 나사산이 없다). 스피커 출력선은 악어클립을 통해서 바인딩 포스트를 집어 놓았다. 단락의 위험이 있지만 내가 알기로 TDA2030A 칩은 모든 핀 사이에 short-circuit protection 기능이 있어서 특별히 칩이 망가지는 일은 없을 것이다. 간단한 배선이지만 시력이 예전같지 않아서 애를 먹었다. 오배선이 없도록 수시로 테스터로 점검을 하였다. 전원을 반대로 걸어서 캐패시터와 칩이 터지는 경험을 해 본 일이 있기에...


음량 조절은 각 보드에 있는 반고정 저항으로 해야 된다. 좌우 오차가 적은 오디오형 볼륨 폿에 도저히 비할 바는 아니다. 인켈 SH-950B(89dB/W/M) 스피커와 휴대폰(소스)을 연결한 다음 전원(12V 2A 어댑터)를 연결하였다. 어라? 의외로 좋은 소리가 난다. 이런 저가형 부품과 불리한 배치만으로도 쓸만한 소리가 난다는 것이 정말 놀라웠다.

TDA2030A 칩은 최대 ± 22V까지 인가할 수 있다. 그러나 이 보드는 단전원만 사용 가능하며, 캐패시터의 내압에 16V에 불과하다. 판매자 웹사이트에도 공급 가능 전압은 6-12V로 나와있다.

이것으로 2016년 상반기 오디오 DIY는 마감을 하자. 앞으로 얼마나 만능기판 배선을 할지는 모르겠지만 0.25mm 래핑 와이어는 쓰기가 나쁘다. 주석도금선을 소량으로 구할 수 있으면 얼마나 좋을까? 가끔 랜선의 피복을 벗겨서 배선에 쓰기도 한다. 그러나 도금이 되지 안않은 구리선이라서 납이 썩 잘 붙는 편이 아니고, 만능기판 배선용으로는 조금 두껍다. 카테고리 5  UTP 케이블의 경우 AGW24에 해당하는데, 이는 직경 0.5105mm에 해당한다. 허용 전류는 0.588 암페어이다. 기회가 되면 전선 규격을 좀 공부해야 되겠다.


2016년 5월 20일 금요일

CentOS 6.7에 java 1.8.0 설치하기

요즘 PacBio를 이용한 효모의 de novo assembly 결과(HGAP)를 처음으로 분석하다가 미토콘드리아의 서열이 하나도 없다는 것을 발견하였다. Preassembly를 가져다가 reference sequence(S288c)에 매핑해 보면 미토콘드리아 서열(NC_001224, 86 kb)에 맞는 read들이 고스란히 존재하는데도 말이다.

PacBio로 genome sequencing을 하는 과정에서 길이가 짧은 플라스미드가 잘 재구성되지 않는다는 말은 종종 들은 적이 있다. 라이브러리의 길이가 워낙 길기에, 이보다 짧은 replicon이 라이브러리 제작 과정을 통과하지 못하는 일은 이해할 수 있다. 그런데 길이가 80 kb를 훌쩍 넘는 replicon에게 이러한 일이 생긴다는 것은 받아들이기 어렵다.

HGAP에서 de novo assembly를 담당하는 것은 Celera assembler(stand-alone tool로는 WGA라 불림)이다. 미토콘드리아는 염색체에 비해서 multi-copy로 존재하므로, 비정상적으로 높은 coverage를 나타내는 미토콘드리아 유래 contig를 적극적으로 제거해 버렸나? 그렇다면 이러한 나름대로의 철학을 담은 행동에 대해 WGS의 공식 문서에 설명이 있어야 한다고 생각한다. 그러나 웹을 아무리 뒤져보아도 이와 관련된 글귀를 찾을 수가 없었다. 별의별 질문이 다 올라오는 SEQanswers 같은 커뮤니티에 이런 현상에 대한 문의나 해결책이 한번쯤 있을 법도 한데 예상과 달리 전혀 발견하지 못하였다.

Eukaryotic genome assembly를 하는 사람들은 다 아는 문제를 나만 뒤늦게 발견하여 흥분을 했나? 지금까지 발간된 genome paper를 다 뒤져서 미토콘드리아나 엽록체의 염기서열이 제대로 나왔는지를 일일이 확인할 수는 없는 노릇이다. 이 샘플의 시퀀싱을 담당한 기관, 그리고 유전체 분석 시장에서 잘 알려진 M사를 통해서 문의하니 이러한 일을 이미 경험하였고, de novo assembler의 특성으로 생각하고 있다는 답변을 받았다.

그렇다면 long read를 다루는 다른 de novo assembler는 어떤 결과를 보일까? SMRT portal에서 preassembly를 내려받은 뒤 phrap과 mira 4.9.6을 돌려보았다. CLC Genomics Workbech(9.0)의 genome finishing module에 포함된 PacBio용 de novo assembly pipeline(beta)는 실행 중간에 에러가 발생하였다. phrap과 mira는 미토콘드리아 서열을 잘 재구성하였다. 여담이지만 mira는 성능에 비해 너무 저평가된 assembler라는 의견을 받아들이지 않을 수 없다!

SMRT analysis이외의 PacBio long read를 다룰 수 있는 다른 stand-alone tool을 설치해 놓아야 되겠다는 생각이 이제 들기 시작하였다. mira는 잘 돌아가는 중이고, 다음으로는 좀 미심쩍기는 해도 WGA를 제대로 써 봐야 되겠다고 결심하고 공식 웹사이트를 방문해 보니 이제는 Canu라는 도구에 자리를 넘겨주었다고 한다. Falcon assembler도 diploid genome에 대해서 괜찮은 성능을 보인다고 들었다. GitHub에서 Canu 바이너리를 받아서 corrected PacBio read에 대한 assembly를 하려고 시도하는 순간, java version이 너무 낮다는 메시지가 나온다. CentOS 6.7 상태에서 가장 최신의 java는 1.7.0_101인데, canu는 1.8 이상을 요한다. java, python, gcc 등 프로그램 개발과 실행에 매우 중요한 툴들이 CentOS에서는 너무 낮은 버전이 깔려 있어서 이를 해결하는 방법은 인터넷에 흔하게 널려있다. 해결의 핵심은 기존에 깔린 것을 완전히 삭제하고 윗 버전을 설치하는 것이 아니라, 예전 버전과 상위 버전을 같이 설치해 두고 필요에 따라 환경을 전환해서 사용하는 것이다. 예를 들어서 python에서는 virtualenv를 쓰는 것과 같은 방법이다. Java에서는 alternatives라는 것을 이용한다.

이제서야 본 글의 제목에 어울리는 글을 쓰게 되었다. 참고한 사이트는 다음과 같다.

How to Install Java 8 (JDK/JRE 8u91) on CentOS/RHEL and Fedora

64비트 CentOS에서는 다음과 같이 하면 된다.

# wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u91-b14/jdk-8u91-linux-x64.tar.gz"
# cd jdk1.8.0_91/
# alternatives --install /usr/bin/java java /opt/jdk1.8.0_91/bin/java 2
# alternatives --config java
4 개의 프로그램이 'java'를 제공합니다.
  선택    명령
-----------------------------------------------
*  1           /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
   2           /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java
   3           /usr/lib/jvm/jre-1.5.0-gcj/bin/java
 + 4           /opt/jdk1.8.0_91/bin/java
현재 선택[+]을 유지하려면 엔터키를 누르고, 아니면 선택 번호를 입력하십시오: 4
이러면 끝이다.

Canu의 첫 실행은? 실패다! 1000 bp 미만의 short read가 너무 많다고 불평을 한다. Mira에서는 32760 bp를 넘는 read가 있다고 뭐라 하고, canu에서는 짧은 read가 너무 많다고 불평을 하고... 짧은 read를 제거하는 스크립트를 또 하나 만들어야 되겠다. 어쩌면 miraconvert에 이를 처리하는 기능이 숨어있는지도 모른다.

차량 시거 잭에 대용량 캐패시터를 달아서 블루투스 수신기로 유입되는 엔진 잡음을 줄일 수 있을까?

오늘 오후가 되면 IC114에 주문한 정전압 레귤레이터 7809가 배송될 것이므로 이를 이용하여 완벽한 차량용 DC 9V 공급장치를 만들 수 있다. 이에 앞서서 만약 대용량 전해 캐패시터를 전원에 병렬로 연결하면 잡음이 얼마나 줄어들지를 실험해 보기로 하였다.


개조하다가 완전히 망가뜨린 LM1875 앰프 보드에서 떼어낸 4700 uF 전해 캐패시터를 연결하였다. 약방의 감초 격으로 0.1 uF 마일러 캐패시터도 곁들였다. 결과는 어떤가? 엔진 회전수에 비례하는 '윙~'하는 잡음이 개조 전에 비해서 아주 약간 줄어든 느낌은 있는데, 9V 배터리를 사용한 완벽한 상태에 비교할 수준은 못된다.

7809 IC에 모든 희망을 걸어본다.


2016년 5월 18일 수요일

블루투스 수신기를 차량 오디오에 연결할 때 발생하는 엔진 잡음 줄이기

지난 4월에 구입한 블루투스 리시버 겸 class D(TDA7292P) 앰프 보드의 증폭부가 초기에 고장이 나서 이를 블루투스 리시버 용도로만 쓰기 위해 차량용 오디오의 AUX 단자에 연결을 하였다. 12V 전원은 시거 잭에서 공급받았다. 운전을 하면서 휴대폰에서 송신하는 음악을 재생해 보니 자동차 엔진의 회전수에 비례하는 '윙-'하는 잡음이 같이 재생되는 것을 발견하였다. 발생 원인은 무엇이고, 어떤 경로를 통해 오디오로 유입되는 것일까? 인터넷에서 검색을 해 보니 엔진의 알터네이터에서 발생하는 교류 잡음이 전원을 통해 유입되는 것이라고 한다. 블투투스 수신기가 무선으로 잡아낼 수준의 전자기파 잡음은 아니라는 뜻이 되겠다.

이를 확인하기 위해서 9V 건전지를 연결하여 보았다. 이 앰프 보드(더 이상 앰프는 아니지만)의 작동 전압 범위는 8-25V이므로 당연히 정상적으로 작동을 해야 한다.


가정용 오디오를 이용해서 블루투스 수신 기능이 잘 작동함을 확인하였다. 전원 어댑터를 연결할 때 느껴지던 미세한 잡음도 들리지 않았다. 오늘 아침에는 실제로 차량 오디오에 출력선을 연결한 뒤 휴대폰에서 블루투스 신호를 쏘아 보았다. 이전보다 매우 깨끗하게 출력이 되었으며, 엔진 회전수에 비례하는 잡음도 들리지 않았다.

이 수신기를 차량 내에서 건전지로만 작동시킬 수는 없으니, 시거잭의 DC 전원을 되도록 깨끗하게 만들어서 연결하는 일이 남았다. 가장 간단한 방법은 9볼트를 출려가는 3단자 레귤레이터를 중간에 연결하는 것이다. IC114에서 '7809'로 검색하면 레귤레이터 부품뿐 아니라 방열판과 절연지까지 붙여서 일체화시킨 것을 판매한다(검색 결과 링크). 이를 구입하여 입출력 단자 가까이에  0.1μF발진 방지용 캐패시터를 병렬로 연결하여 사용하면 된다. 간단한 구성 사례를 보자. 아래 그림을 실은 원본 사이트에서는 LM317T를 이용한 가변 전압 변경 회로도 소개하고 있다.

출처: http://www.electronics-tutorials.ws/blog/variable-voltage-power-supply.html

이 보드의 앰프 기능에 문제가 생긴 것을 판매자에게 항의해서 일부를 환불받은 것으로 초소형-초저가의 TDA2030A 앰프 보드를 주문했었다. 거의 3주가 다 지나서 어제야 배송이 완료되었다. 이 보드는 중국의 LC Technology라는 곳에서 만든 것으로 보드 하나에서 한 채널을 출력한다. 공급 전압 범위는 DC 단전원으로 6-12V, 최대 18W 출력이 가능하다. 웹사이트를 방문해 보니 정말 다양한 물품들이 있다.


이것을 마무리하는 것을 마지막으로 당분간 오디오 DIY는 쉬기로 한다. 그런데 이 초소형 앰프 모듈을 가지고 무엇을 하지?

2016년 5월 16일 월요일

JLH 1969 Class A Amplifier라는 물건

[오늘도 오디오 관련 글로 도배질을..]

이베이 또는 알리익스프레스를 뒤져보면 제목과 같은 제품이 꽤 눈에 뜨인다. Musical Fidelity라는 브랜드의 복제품도 상당히 많이 보인다. 나는 오디오와 음악에 관심이 많지만 오디오 기기의 역사에 대해서는 잘 알지 못한다. JLH...이라는 명칭에 대해서 조사를 해 보았다. Nelson Pass(1951~)라는 오디오 앰프 설계자가 있는데, 자신의 회사를 운영함과 동시에 DIY audio community에 큰 도움을 주고 있다 한다.  Pass의 DIY 관련 웹사이트에서 JLH 앰프에 대한 정보를 찾을 수 있었다.

The PLH Amplifier

JLH는 John Linsley-Hood(1922~)라는 원로 전자공학자 및 오디오 설계자 이름의 약자이다. 그는 1969년 Wireless World라는 잡지 148쪽에 "단순한 class A 증폭기"라는 탁월한 성능의 앰프를 제시한 것으로 잘 알려져있다. Linsley-Hood는 1996년에 이르러 이를 개량한 회로를 발표하였고, 몇가지의 변형이 나오게 되었다. 인터넷을 잘 뒤지면 1969년도에 발표된 자료의 PDF 파일이 나온다(링크 1, 추가 자료가 있는 링크 2).

BJT의 조합에서 MOSFET의 사용으로 변천하게 된 것이 JLH class A amp의 개량 차원에서 이루어진 것인지, 혹은 이와는 전혀 관계가 없는 다른 줄기의 노력에서 비롯된 것인지는 잘 모르겠다. 오디오 관련 글을 읽다보면 경박단소로 치닫는 전자기기의 진화 과정에도 불구하고 "열이 펄펄 나는" class A amp, 또는 캔 형태로 만들어진 구형 대전력 파워 트랜지스터를 이용한 앰프에 여전히 매력을 느끼는 매니아가 많은 것 같다. 진공관 앰프도 마찬가지이고. 나 역시 오늘 하루 종일 족히 20여년 전에 단종된 산켄의 하이브리드 오디오 증폭기 IC를 이용한 앰프로 음악을 듣지 않았는가.


아무리 내가 가난한 막귀의 소유자이고 오디오 생활에서 실용 정신이 중요하다 해도 위 그림의 마일러 캐패시터는 조금이라도 품질이 좋은 제품으로 바꾸어야 하지 않을까?

사족


  1. 중국쪽 웹사이트를 보면 2SB1647-2SD2560, 2SA2151-2SC6011, 2SA1494-2SC3858 등의 트랜지스터 조합을 판매하는 글어 버젓이 SANKEN power amplifier tube라고 해 놓았다. 아니, 이것을 왜 tube라고 부르는 것일까? 
  2. 알리익스프레스나 이베이에서는 JHL class A amplifier라는 명칭으로 등록된 제품들이 제법 나온다. 아미도 JLH를 잘못 쓴 것으로 생각된다.

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)라고 되어있다.

Sanken Hybrid Audio Power Amplifier Data

주말 저녁을 투자하여 단자와 볼륨 폿을 연결하였다. 케이스는 다이소에서 구입한 수납용 플라스틱 바구니를 사용하였다. 구멍이 이미 뚫려있어서 부품 연결하기가 여간 편리한 것이 아니다. 보통 뒷면에 배치하는 입력 단자를 앞으로 보내서 볼륨 폿과 최단거리로 배선하였다. 볼륨용 놉은 은포전자 바로 앞에 있는 점포에서 이전에 구입했던 것이다. 볼륨 폿은 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를 쓰도록 유도하는 것이 훨씬 생산성이 높을 것이다.

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