2015년 11월 28일 토요일

1호기 스피커 시스템(풀레인지)의 개조

저역이 탄탄하지 못하고 동굴 속에서 소리가 울려나오는 느낌을 어떻게 개선할까? 드라이버 크기에 비해 통의 용적이 다소 크고 재료의 두께(MDF 12 mm)가 얇아 통 자체가 울린다는 것이 내가 내린 나름대로의 결론이었다. 모서리에 각재를 대서 강도를 보강하고 내부에 자투리 목재를 채워서 용적을 줄여보기로 하였다. 아울러서 저음이 빠져나가는 통로의 면적을 줄여 보았다.


윗 사진에서 보이는 좌우 가장자리의 각재(나사못 구멍이 이미 난) 외에는 원래 전혀 보강이 되지 않은 상태였다.

용적을 줄이기 위한 자투리 목재는 60 x 60 x 160 mm 정도의 크기이다. 하나의 용적은 약 560 cc가 된다. 내부가 좁아서 쓰러질 일은 없으므로 바닥에 고정하지 않고 그냥 세워두어도 된다. 내부에 채운 목재의 최적 갯수는 1개일까, 2개일까? 그것까지는 아직 모르겠다.


뒷뚜껑을 닫고 음악을 들어보았다. 전면 개구부에는 솜을 채운 상태이다. 개조를 하기 전과 비교하여 확실하게 변한 것은 전체 무게가 제법 늘어났다는 것... 좀 더 밀도있는 소리가 나는 것 같다. 개조를 했으니 소리가 더 나아졌다는 '믿음'으로 귀를 익숙하게 만드는 중이다.


2015년 11월 27일 금요일

내가 파이썬에 아직 익숙해지지 않은 이유


  1. 아직은 Perl이 편하고
  2. 본성이 게으르기도 하고
  3. 패키지 설치 방법이 혼동스러워서
Perl 모듈의 설치 방법은 비교적 단순하다. 널리 쓰이는 모듈은 리눅스 패키지로 존재하는 경우가 많아서 이를 yum이나 apt-get으로 설치하면 된다. 이제 rpm을 직접 쓰는 경우는 무척 드물어졌다. 일상적이지 않은 위치에 모듈을 두고 쓰려면 스크립트를 실행할 때 perl -I 인자를 주거나 혹은 스크립트 내에서 use lib... 등을 쓰면 된다.

그런데 파이썬에서 모듈을 설치하는 방법은 pip, setuptools, easy_install 등 여러가지가 있다. 기초 수준의 파이썬 교육을 받은 적은 있으나 주로 프로그램 작성 기법에 관한 것이었지 이처럼 내게 꼭 필요한 모듈 설치에 대한 실용적인 팁은 접할 수 없었다. 한술 더 떠서 아예 다른 버전의 파이썬을 설치하여 필요에 따라 각각을 운용하는 것도 가능하다. 사실 내가 파이썬에 대해 갖는 가장 큰 불만은 이것이다. 왜 하나의 컴퓨터 시스템에 2.x과 3.x이 동시에 있어야 하는가? 하위 호환성이 그만큼 보장이 되지 않는다는 것인지?

어쨌든 작정하고 앉아서 조금만 공부하면 충분히 익히고도 남을 지식이건만 아직도 이러한 상태로 머물러 있다는 것은 부끄러운 일이다. 다음주에는 공부를 시작해 보도록 하자.

어제 구입한 물건 두 가지

역시나 음악과 관련된 것이다.

음반: Harvey Mason Trios 2 "Changing Partners"


시내 중고서적 판매점 알라딘에서 구입한 중고 CD이다. 이곳에서 눈에 뜨이는 음반을 사기는 참 어렵다. 다른 사람에게도 팔리기 어려운 가요 CD가 대부분이기 때문이다. 한참을 골라서 보석같은 음반을 하나 찾아냈다. 여러 재즈 피아니스트와 함께 서로 다른 곡을 녹음했기에 앨범의 제목도 Changing Partners이다. 밤에 듣기 좋은 재즈 음악들이 수록되어있다.

나무: 60x60mm 자투리 집성목과 19x19mm 스프루스 각재 


어설픈 스피커 1호기를 보강하고자 아이베란다에서 구입하였다. 각재로는 12T MDF로 만든 인클로저의 모서리를 보강하고, 자투리 집성목(사진)은 내부 용적을 줄이기 위함이다. 사진에 보인 스피커는 개조 대상이 아니다. 향긋하고 부드러운 나무의 질감이 좋아서 하나를 힐링용(?)으로 사무실에 들고 나온 것이다.

5인치급 스피커 유닛용으로는 1호기 통이 너무 크다는 자체 진단에 따라 이러한 개조를 준비하였다. 요청한 길이보다 조금씩 길어서 자르느라 애를 먹었다. 워낙 부드러운 나무(스프루스)라서 큰 힘은 들지 않았지만. 아직 뒷판 근처의 각재는 다 붙이지를 못했다. 보강목 덕분에 스피커통은 전체적으로 많이 무거워졌다.

올해의 오디오 DIY 목표는 거의 다 달성하였다. 주말에는 스피커통 개조를 완료하고, 케이벨 KB20W 앰프에 음량 조절용 포텐셔미터를 달아주어야겠다. 

HiSeq 결과물 들여다보기(파일의 크기와 k-mer abundance 분포)

HiSeq 2x00 장비에서 생산된 whole-genome sequencing 결과물(fastq 파일)의 크기에 대해 점점 무감각해지는 것이 요즘의 현실이다. 지난 3주 동안 파일 크기가 100 GB에 육박하는 결과물을 다루면서 이러한 수치에 대한 확실한 '감'을 잡고 있는 것이 좋겠다는 생각이 들었다. 예전 대학원생 시절에는 1 kb ds DNA 1 마이크로그램 안에는 DNA 갯수가 대략 몇 개 들어있다는 것(몰 단위로서)을 암기하고 있지 않았던가?

혼동을 줄이기 위하여 염기는 b, 바이트는 B로 표시하겠다. 컴퓨터 세상에서는 1 KB = 1024 B(byte)이지만 나머지 세상에서는 1 K = 1000이다. 좀 더 솔직하게 말하자면 컴퓨터 세상에서도 1 K = 1,000, 1 M = 1,000 K로 표시할 때가 있다. 바로 HDD 용량을 말할 때. 그래야 조금이라도 더 크게 보이기 때문이다.

pair end sequencing 결과 파일이 있을때 압축을 하지 않은 상태로 파일의 크기는 얼마인지, 포함된 read와 염기쌍의 수는 얼마인지, 마지막으로 target genome의 추정 크기에 대한 시퀀싱 배수는 얼마인지에 대한 감을 잡아보도록 하자. 우선 오래전에 생산한 HiSeq 101 x 2 결과물을 하나 꺼내어 보자. fastq 파일의 수치를 뽑는 도구는 여러가지가 있겠지만 khmer 패키지의 readstats.py가 요즘 마음에 든다.
$ du -sh *fastq
5.8G BL21TKR_1.fastq
5.8G BL21TKR_2.fastq
파일 크기가 제법 크다. 
$ readstats.py BL21TKR_1.fastq  BL21TKR_2.fastq
(화면 표시 과정 중간 생략)
... BL21TKR_2.fastq 23400000
... BL21TKR_2.fastq 23500000
... found 2379737962 bps / 23561762 seqs; 101.0 average length -- BL21TKR_2.fastq
---------------
2379737962 bp / 23561762 seqs; 101.0 average length -- BL21TKR_1.fastq
2379737962 bp / 23561762 seqs; 101.0 average length -- BL21TKR_2.fastq
---------------
4759475924 bp / 47123524 seqs; 101.0 average length -- total
파일 하나에 대하여 2.38 Gb를 수록하고 있다. 파일 쌍 전체로는 4.76 Gb, 2천4백만 read pair이다. 이 시퀀싱 결과물은 대장균 BL21에서 유래한 것이니 sequencing coverage는 1,000x 정도가 되겠다.

따라서 단일 fastq 파일에 대하여 5.8 GB(기가바이트)의 크기라면 2.4 Gb(기가베이스페어)라는 뜻이다. 요즘의 미생물 시퀀싱 서비스에서는 보통 1개 샘플에 대해서 1 Gb 생산, 즉 5 Mb 게놈에 대해 200X를 목표로 하고 있으니 지나치게 많은 분량을 시퀀싱한 셈이 된다.

다음으로는 이 데이터를 가지고 k-mer abundance 분포를 그리는 방법에 대해서 알아보겠다. 게놈 서열 자체가 아니라 충분히(과하게!) 오버샘플링이 된 read임을 염두에 두도록 한다. 메타게놈 데이터를 이용하는 것이 더욱 바람직하겠지만, 갖고 있는 데이터는 너무 분량이 커서 분석에 시간이 많이 걸린다. 사용하는 프로그램 패키지는 요즘 집중적으로 공부하고있는 khmer이다. 우선 위에서 다룬 fastq 파일 쌍을 하나의 interleaved file로 바꾸어보자. 예전에는 velvet distribution에 포함된 shuffleSequences_fastq.pl을 주로 사용했었다. 
$ interleave-reads.py -o BL21TKR.fastq.pe BL21TKR_1.fastq  BL21TKR_2.fastq
역시 이런 종류의 작업은 시간이 많이 걸린다. 솔직하게 말하자면 khmer의 유용성과 개발 철학에는 동의하지만 소요시간이 너무 길다는 것이 불만이다. 물론 비슷한 부류의 다른 프로그램을 전부 테스트해보고 하는 말은 아니지만... unique k-mer의 수는 322919167였다.
$ load-into-counting.py -k 20 -N 4 -x 4e9 BL21.count.ct BL21TKR.fastq.pe
$ abundance-dist.py BL21.count.ct BL21TKR.fastq.pe BL21.count.hist
만들어진 k-mer abundance histogram을 한번 열어보자.
$ head -5 BL21.count.hist
abundance,count,cumulative,cumulative_fraction
0,0,0,0.0
1,268607656,268607656,0.832
2,33381122,301988778,0.935
3,9908255,311897033,0.966
첫번째 컬럼은 abundance이다. 즉 주어진 read에 대해서 단 1번 출현한 길이 20-mer가 무려 2억6860개나 된다는 뜻이다. 5 Mb 게놈을 20-mer로 나누는(1-bp shift) 경우를 상상해 보자. 모든 위치에서 얻어지는 20-mer가 전부 다 다르다고 가정하고(실제 repeat에서 유래하는 것도 있으니 그럴 수는 없다), complementary sequence까지 감안을 해도 천만개 정도에 불과하다. 그런데 단 1번 출현하는 20-mer가 2억하고도 거의 7천만개? 이는 바로 일루미나 특유의 시퀀싱 에러에서 기인하는 것이다. 즉 실제 genome에는 존재하지 않는 서열인 것이다.

자, 그럼 이걸 가지고 gnuplot에서 그림을 그려보자. 필드 구분자가 공백이 아닌 콤마이니 gnuplot 내에서 set datafile separator ','를 실행해야 한다.
gnuplot> set datafile separator ','
gnuplot> plot 'BL21.count.hist' using 1:2 with lines
플롯 창이 열렸지만 아무것도 안보인다. 왜? 극단적인 값들 때문에 그렇다. 각 스케일을 로그로 변환하여 다시 그리자.
gnuplot> set logscale x
gnuplot> replot

바로 왼쪽의 파랑색 상자로 둘러싼 low abundance 영역 내의 read가 바로 error에서 기인한 것이다. abundance ~750 근처에 나타난 피크가 바로 실제 시퀀싱 커버리지가 된다. 그보다 더 빈도가 높게 나타나는 피크는 repeat에서 유래한 것들이다. 만약 다른 피크가 더 있다면 타 샘플로 오염이 일어났음을 증명하는 셈이 되겠다. 만약 시퀀싱 리드가 아니라 완성본 게놈 서열을 가지고 에러가 전혀 없는 시퀀싱 리드를 시뮬레이션하여 k-mer 분포를 조사하면 저 왼쪽 영역의 수치는 나오지 않을 것이다. 내가 가끔 사용한 NGS read simulator ART는 너무 충실하게 데이터를 생성해주는 바람에 error-free data를 만들지는 못하는 것 같다. 

다음으로 생각해 볼 것은 히스토그램의 끝부분에는 어떤 데이터가 있느냐 하는 것이다. 이 히스토그램 파일의 길이는 무려 65537 라인이나 된다. abundance가 수천을 넘는 것은 손가락에 꼽을 수준으로 매우 적게 존재한다. 그런데 히스토그램의 마지막 줄을 보니 65535회 존재하는 20-mer가 53종류나 있다. 이건 뭘까? 이건 틀림없이 어댑터 서열에서 유래한 20-mer일 것이다.

그런데 이상의 분석은 kmerspectrumanalyzer로 전부 가능한 것이 아닐까?

2015년 11월 25일 수요일

FASTQ 파일 처리 도구의 단편화?

다양성이라는 것은 생태계에서 보편적으로 관찰되는 현상이고 늘 지켜져야하는 미덕이기도 하다. 표준화 또는 산업화라는 틀에서 보면 평균에서 벗어나는 존재들이 늘 성가실 수도 있다. 요즘 리눅스나 안드로이드의 단편화라는 개념이 종종 보인다. 각자 나름대로의 철학과 하드웨어에 맞춘 최적화(특히 휴대폰의 경우)를 거쳐 리눅스 기반의 OS가 조금씩 변해가는데, 이러한 현실은 개발자에게는 골칫거리인 모양이다.

FASTQ 파일을 다루는 엇비슷한 도구가 너무 많아지는 현실에 대해서 불평을 해야할까? GitHub에는 FASTQ 파일의 처리에 쓰이는 다양한 소프트웨어 프로젝트가 꽤 많이 존재한다. 간단하게는 awk 스크립트 몇 줄로 해결이 되겠지만, 좀 더 수준이 높은 조작을 하려면 이것만으로는 부족하다. 어떤 것은 논문을 통해 발표되기도 하지만, SeqAnswers를 아예 프로그램 소개의 공간으로 사용하는 개발자도 있다.

전에는 FASTQ file 2개로 이루어진 paired end sequencing 결과물을 하나의 interleaved file로 전환하려면 Velvet에 포함된 shuffleSequence_fastq.pl을 사용했었는데, 이제는 다른 프로그램 패키지에 들어있는 스크립트를 쓰는 것이 더 편하다.

내가 즐겨쓰는 도구 위주로 정리를 해 보겠다.

일반적인 QC

  1. FastQC 전체 read 수는 나오지만 bp는 출력되지 않는다. 트림/필터를 거쳐서 길이가 균일하지 않은 파일에 대해서는 좀 불편하다. 
  2. PRINSEQ 평소에 잘 쓰지는 않는다.

Extended QC, trimming, filtering 등

  1. FASTX-Toolkit 꽤 역사가 깊은 소프트웨어.
  2. SolexaQA quality에 의한 트리밍을 거친 뒤 최소 길이 조건을 충족하는 read의 pair를 다시 수립할 때 종종 사용하던 소프트웨어.
  3. Trimmomatic 어댑터 서열 제거 용도로 요즘 즐겨쓴다. 가끔 cutadapt를 쓰기도 했다.

일반적인 조작

  1. seqtk 백문이 불여일견. 웹사이트에 나온 사용례를 참조할 것.

전처리 종합 도구

  1. khmer 요즘 집중적으로탐구하는 중이다. Metagenomic read처럼 coverage가 불균일하고 분량이 많은 일루미나 데이터를 위한 전처리를 목적으로 한다(digital normalization 및 abundance 기반의 필터링). Read statistics 계산, file pair <-> interleaved file이 전환, paired read의 추출 등 일반 용도의 유틸리티가 포함되어있다.
  2. BBMap 설치만 해 두고 아직 쓰지는 않았다.

2015년 11월 22일 일요일

스피커 개조는 계속된다

어설픈 스피커 시스템의 제작은 이제 그만 두기로 마음먹었다. 그러나 이미 만든 것을 개선하는 것을 그만 두겠다고 하지는 않았다. 5인치급 풀레인지 유닛(Toptone F120U73-3) 하나를 이용한 나의 스피커 1호기는 산만한 저역과 '동굴속 울림' 같은 소리로 인하여 만족을 할 수 없었다. 홧김에 앰프에서 분리하여 옷장 위에 팽개쳐 두었다가 다시 한번 손을 대기로 하였다.


내부에 채워진 솜을 전면 아래쪽의 개구부로 옮겨서 채우니 동굴 효과는 다소 줄어들었다. 동굴 효과는 내부에서 중역대의 소리가 너무 많이 빠져나오기 때문이라는 나름대로의 진단에 의한 것이다.

다음으로는 내부에 고정된 스피커 유닛을 빼내어 배플 바깥쪽에 달기로 했다. 그러려면 유닛 사양표에 따라서 배플 구멍을 108 mm보다 조금 크게 파내야 한다. 파워포인트로 109 mm의 원을 그려서 인쇄한 뒤 칼로 도려낸 다음 배플에 대고 네임펜으로 제거할 부분을 표시하였다. 구멍의 직경을 3 mm 정도 키우는 가장 경제적인 방법은 무엇을까? 처음에는 둥근줄을 이용하여 갈아낼 생각이었지만 목곡용 줄 세트는 의외로 가격이 비쌌다. 사포로 갈아내려면 너무 힘들것이 뻔하고... 최종적으로 생각한 것은 교재용 조각도였다. 근처 대형 문구점에 가서 학생용 조각도를 구입하였다. 실제 구입 가격은 3천원을 조금 넘는 수준이었다.


12 mm MDF를 조각도로 파내는 것은 매우 쉬웠다. 둥근칼과 창칼을 이용하여 공작을 시작하였다. 초등학교때의 고무판화, 그리고 중학교때의 석고조각을 마지막으로 조각도를 잡아 본 일이 없다. 사포로 대충 마무리를 하고 배플 전면에서 유닛을 고정하였다.


유닛을 내부에서 고정했을 때보다 외관은 훨씬 시원스러워졌다. 통 크기에 비해서 유닛이 너무 왜소해 보였었다. 기분 탓인가? 오늘의 개조 후 소리도 좀 더 바람직한 쪽으로 변한 것처럼 느껴진다. 개조는 아직 끝나지 않았다. 내부를 길게 잘라낸 18T 합판(폭 100 mm)으로 보강하고, 자투리 목재를 사용하여 용적을 줄이는 테스트를 할 계획이다.

2015년 11월 21일 토요일

리 릿나워의


리 릿나워의 앨범 을 대학때 LP로 갖고 있다가 어느날 분실한 이후로 들을 기회가 없었다. 한동안 테이프에 복사해 둔 것을 듣기도 했지만 열악한 음질은 비길데가 없었다. 오늘 오랜만에 멜론에서 리 릿나워의 음악을 들으려고 했더니 Earth Run 앨범이 최신앨범으로 올라와 있었다. 이제와서 재발매를 했을리는 없는데... 멜론이 뒤늦은 음원 계약을 했는지도 모른다. 

이 앨범의 표지를 장식한 기타의 모습은 매우 독특하다. 아마도 기타 형식을 취한 MIDI controller인 것으로 생각된다. 요즘의 리 릿나워 음악에 비해 꽤 실험적인 사운드를 들려주고 있다고 느끼는 앨범이다. 지금의 모습과 비교하면 너무나 젊은 리 릿나워의 모습을 보라. 데뷔때와 달리 가장 극적으로 변한 기타리스트는 조 새트리아니가 아닐까...(죄송!)

이 앨범에서 내가 특히 좋아하는 곡은 6번째 트랙의 Butterfly이다. 허비 행콕의 원곡을 여러 가수가 부른 것으로 알고있다. 언제 기회가 되면 허비 행콕의 원곡을 듣고싶다.