2020년 3월 31일 화요일

텍스트 파일을 위치 기준으로 자르기(cut 명령어 사용)

KEGG Pathway 정보를 활용할 일이 생겼다. 5자리 숫자의 pathway 번호와 그 이름이 간결하게 텍스트 파일로 정리된 곳이 있다면 참으로 좋겠지만, 내 상식 수준에서는 https://www.kegg.jp/kegg/pathway.html의 내용을 마우스로 긁어서 가져오는 것 말고는 마땅한 방법을 찾지 못하였다. Subscription 기반으로 바뀐 다음부터는 KEGG DB를 적극적으로 이용하지를 않았으니 말이다.

텍스트를 복사해 놓으니 이런 꼴이다. 에휴...

012102-Oxocarboxylic acid metabolism
01212Fatty acid metabolism
01230Biosynthesis of amino acids

앞에서부터 다섯자리의 숫자가 끝난 다음에 탭을 집어넣으면 좋겠는데, 이를 위해서 스크립트를 짜자니 너무 성가시고, vim에서 치환 기능을 잘 쓰면 될 것도 같은데 방법이 잘 찾아지지 않는다. Perl에서 치환을 위해 쓰는 정규표현식과 vim에서 쓰는 것이 완벽하게 호환되지는 않는다. 그리고 vim에서 복잡한 검색 및 치환을 하는 데에는 익숙하지가 않다.

paste 명령어를 위치 기준으로 활용할 수는 없을까? cut -c 6-라고 입력하면 여섯번째 캐릭터부터 끝까지만 선택하여 출력하는 것이라고 한다. 그러면 라인의 처음부터 다섯번째 캐릭터까지를 선택하려면? 상상력을 발휘해 보자. cut -c -5가 된다. 말 그대로 5번째와 6번째 캐릭터 사이를 칼로 썰듯이 파일 전체를 두 조각으로 자르는 것이다.

그러면 이 명령어를 paste와 조합하면 되겠다. 위에 보인 내용이 infile.txt에 들어있다고 가정하자.

$ paste <(cut -c -5 infile.txt) <(cut -c 6- infile.txt) > outfile.txt

그렇지!  cut도 그렇지만 paste는 정말로 신비롭고도 유용한 명령어이다.  명령행 인수를 만들기 위해 파일(infile) 안의 목록을 쉼표로 구분하여 한 줄로 붙여야 할 경우가 있다. 이럴 때 $(paste -sd, infile)라는 표현이 얼마나 유용한지는 설명할 필요조차 없다. paste - - - < file은 또 어떠한가?

요즘은 업무를 위해 점점 저수준의 유틸리티나 bash 자체의 기능을 활용하는 일이 많아지고 있다. 간결하고 효율적이며 심지어 아름답기까지 하기 때문이다. 또한 치매 예방에도 좋다고 믿는다...

[2020년도 6LQ8 푸시풀 앰프 `티라미수` 리모델링] 1. 얼떨결에 시작한 작업

43 싱글앰프만 리모델링을 하고 당분간은 좀 자제하려 했는데 한번 재미를 들이니 자꾸 퇴근시간이 기다려진다. 완성도가 높은 앰프는 듣기에도 좋고 보기에도 좋아야 한다! 기왕 시작한 김에 작년 여름에 만들었던 6LQ8 PP 앰프도 손을 대기로 했다.

개성을 살리기 위해 기존의 다이소 수납함을 그대로 쓰기로 하였고, 상판은 6 mm MDF를 가공하여 진공관을 상판 아래로 내리기로 하였다. 벌써 기억 속에서 사라져가는 LibreCAD 사용법을 되살려서 PCB의 그림을 1:1로 그려서 종이에 인쇄하여 오린 뒤 주말에 구입한 MDF 판 위에 올려놓고 구멍을 뚫었다.

MDF라서 30 mm 홀쏘로 구멍을 뚫기가 아주 편했다.

상판 도색 전 가조립 상태.

MDF 상판을 그대로 두자니 보기에도 안좋고 습기를 머금으면 가장자리부터 들고 일어날 것 같아서 도색을 하기로 결정하였다. 43 앰프 리모델링 때 쓰던 수성 스테인과 바니쉬를 젯소(gesso, 프라이머 또는 하도재 또는 단순히 밑칠) 없이 그냥 몇차례 발랐다. 원래 MDF는 프라이머를 칠하지 않고 도색을 하는 것이 쉽지 않다고 하는데, 그냥 무지막지하게 발랐다. 도색은 그 자체가 별도의 기술 분야라고 보는 것이 맞다. 얼룩이 지지 않게 바르는 것이 참 어렵다.


자세히 보면 엉망이지만 칠하지 않은 것에 비하면 훨씬 낫다.

보통 나무로 만든 상자 모양의 통 위에 금속 상판을 올리는 것이 DIY 앰프의 정석인데, 이는 기존의 상식을 깨는 모습이 되었다. 플라스틱 통 위에 MDF 상판, 그것도 배색이 절묘하게 어우러져 어디선가 본 것 같은 느낌을 받는다. 뭘 닮았지?

그렇다! 티라미수 케이크를 닮았다!! 앞으로 이 6LQ8 PP 앰프를 `티라미수(Tiramisu)`라는 애칭으로 부르겠다.

출처: 나무위키(링크)

오늘 퇴근 후에는 어떠한 일이 있어도 마지막 배선 작업을 마치려 한다. 어제 전원부의 재배선은 마친 상태라서 아마도 두어 시간이면 끝나지 않을까 기대하고 있다. 아래의 사진은 어제 저녁까지의 작업 결과물이다.


조명을 달리하여...


내부 공간이 협소해져서 히터 점화용 12V 어댑터는 바깥으로 나왔다. 티라미수가 등짐을 지고 있다.

국내 스피커 제조 역사의 산 증인이신 박병윤 선생님께서 네이버 카페 빈티지 마을을 통해 근황을 알리셨다(링크). 얼마 전 3인치 풀레인지 스피커를 개발하여 화제를 모으기도 하였다. 저음이 아무래도 부족하다는 의견에 따라 구경을 키우기로 하였고, 이에 따라 만들어진 5 x 7 인치 타원형 풀레인지 시스템의 개발을 마쳤음을 알리기 위함이다. 올해 상반기에 이것과 더불어 6.5인치 및 8인치 급 스피커 시스템의 본격 생산이 이루어진다면 나도 이것을 하나 소장하고 싶다.


2020년 3월 27일 금요일

AWK를 사용한 FASTA file의 조작(서열 펼치기, 한 줄로 만들기..등등)

컴퓨터가 좋아하는 파일의 포맷과 사람이 눈으로 보기에 편한 파일의 포맷은 분명히 다르다. '컴퓨터가 좋아하는 포맷'이란 프로그래머(결국은 사람)가 다루기 편한 포맷이라는 뜻도 된다. 줄바꿈이 되어 있는 FASTA 파일이야말로 정말 괴로움이라는 글을 본 일도 있으니 말이다.

일반적으로 FASTA 형태의 파일이라 하면 서열 데이터를 60 문자 단위로 끊어서 줄바꿈을 한다. 이를 wrapping이라 한다. Pacific Biosciences의 웹사이트에 나온 FASTA file format의 best practice에는 다음과 같은 항목이 있다.
Sequences in FASTA files should be wrapped at a uniform line length, to enable indexing. A common convention is to wrap lines at 60 characters.
Wrapping이 인덱싱을 용이하게 하는 측면도 있었구나... 어쩐지 어떤 프로그램은 60 글자 단위를 지키지 않으면 에러를 토해 내더라니.

만약 FASTA 파일이 서열 ID 한 줄, 서열 자료는 줄바꿈 없이 한 줄로 구성되어 있다면 이를 다루는 후속 프로그램을 짜는 일도 무척 간편해진다. EZBioCloud에서 세균 유전체 파일을 받아서 열어보라. 바로 이런 unwrapped FASTA 형식으로 되어 있음을 알 수 있다. 아마도 데이터베이스 서버 내에 문자형 데이터로 저장되어 있어서 그런 것은 아닌지 모르겠다.

FASTA file의 wrapping 및 unwrapping을 할 수 있는 '생명정보학용' 유틸리티가 당연히 지구상 어딘가에 존재하겠지만(예: BBMap의 reformat.sh), Bash 환경과 이를 바탕으로 기본적으로 설치된 일반 유틸리티를 이용할 수 있다면 더욱 좋지 않겠는가? 오늘은 그 방법에 대해서 정리해 보려고 한다. 여기에서 소개하는 방법은 유일한 것이 아니다. 더 간단하고 유려한 방법이 있다면 그것을 쓰면 된다.

FASTA file unwrapping

줄바꿈이 적용된 FASTA file의 서열 데이터를 한 줄로 펼쳐보자. BioStars를 빛내는 Pierre Lindenbaum의 글에서 많은 영감을 받았다. N이라는 변수를 활용하는 트릭이 멋지다.

$ awk '/^>/ {printf("%s%s\n",(N>0?"\n":""),$0);N++;next;} {printf("%s",$0);} END {printf("\n");}' infile.fa

맨 마지막의 END{..} block을 빼먹으면 출력물을 파일로 저장하여 나중에 vi로 열었을 때 [noeol], 즉 이 파일이 개행문제로 끝나지 않았음을 표시하는 경고 문자가 뜬다. Unwrapped FASTA file은 하나의 서열이 정확하게 2 줄로 이루어지므로 파일을 쪼개는 등 다른 작업을 하기에 매우 편리하다.

FASTA to tab-delimited file

FASTA file을 unwrap하는 것에서 더욱 나아가서 아예 서열 ID를 비롯한 모른 자료를 한 줄로 표현해 보자. 이때 sequence description에 해당하는 것을 처리하는 것이 약간 성가신 일이 된다. 편의상 description 필드에 있는 첫번째 단어만을 취하여 하나의 컬럼으로 삼기로 하자. 즉 FASTA file로부터 서열 ID, description, 그리고 줄바꿈 없는 서열이라는 세 개의 컬럼이 탭으로 구분된 텍스트 파일을 만드는 것이다.

$ awk '/^>/ {printf("%s%s\t%s\t",(N>0?"\n":""),$1,$2);N++;next;} {printf("%s",$0);} END {printf("\n");}' infile.fa

그러나 이 방법은 아직 완벽하지 않다. 실행을 해 보면 알겠지만, 서열 ID 앞의 '>'가 그대로 출력되기 때문이다. 이를 해결하려면 sub() 함수를 써야 한다. sub() 함수 자체를 printf() 함수의 인자로 공급하면 제대로 작동이 안되므로, 해당되는 블록의 맨 앞에서 실행하여 패턴에 따르는 치환을 먼저 실시해야 한다. sub() 함수 내에 포함된 필드 번호는 $0과 $1 무엇을 쓰더라도 결과는 같다.

$ awk '/^>/ {sub(/^>/,"",$1); printf("%s%s\t%s\t",(N>0?"\n":""),$1,$2);N++;next;} {printf("%s",$0);} END {printf("\n");}' infile.fa

이번에는 서열의 일련번호를 첫번째 컬럼에 삽입해 보자. 즉 일련번호, 서열 ID, description 및 서열 데이터라는 네 개의 컬럼을 갖는 출력물을 만들어 내는 것이다. N+1을 인쇄하게 만든 이유는 일련번호를 1부터 시작하게 만들기 위함이다. 전산 전공자라면 0부터 시작하는 것을 더 좋아할 수도 있겠다.

$ awk '/^>/ {sub(/^>/,"",$1); printf("%s%d\t%s\t%s\t",(N>0?"\n":""),N+1,$1,$2);N++;next;} {printf("%s",$0);} END {printf("\n");}' infile.fa

FASTA file wrapping

서열 데이터가 한 줄로 펼쳐진 FASTA file을 다시 wrapping하려면 EMBOSS 패키지의 seqret을 쓰는 것이 편하다. awk로 처리하려면 상당히 귀찮다. 읽어서 그냥 출력하게 만들면 wrapping이 되어 나온다. 그러면 tab-delimted file로 풀어헤쳐진 것을 wrapped FASTA file로 만들어 보자. 다음과 같이 먼저 awk를 써서 unwrapped FASTA로 만든 다음 seqret에게 보내면 된다. EMBOSS의 매뉴얼은 이러한 용법을 쉽게 알 수 있도록 작성되지를 않았다는 것이 문제이다.


$ awk '{printf(">%s %s\n%s\n",$1,$2,$3)}' tab-delimited-file | seqret fasta::stdin fasta:outfile.fa

응용: Multi-FASTA description을 기준으로 특정 서열을 추출하기

FASTA file(infile.fa)의 description field에 gene 이름이 담겨 있다고 가정하자. gene list가 별도의 파일(list.txt)에 담겨 있으며, 이에 해당하는 서열을 FASTA file에서 추출하고 싶다. 어떻게 하면 좋을까? 우선 FASTA file을 tab-delimited file로 분해한 다음, gene 목록 파일과 join을 시킨 뒤 다시 FASTA로 전환하면 된다. join 전에는 공통 키를 기준으로 먼저 sort를 해 놓아야 한다. '>'를 떼었다 붙이는 번거로운 작업은 하지 않았다. list.txt 파일에 추출하고 싶은 서열의 ID가 들어있는 상태라면 '>'를 떼는 작업이 필요할 것이다. Process substitution을 사용하면 전체를 one-liner로 만들어 버릴 수 있지만 그렇게 되면 코드의 가독성이 떨어지니 오늘은 중간 단계 파일을 만들어서 다음 명령어에 인수로 공급하는 방법을 쓰기로 하겠다.

$ awk '/^>/ {printf("%s%s\t%s\t",(N>0?"\n":""),$1,$2);N++;next;} {printf("%s",$0);} END {printf("\n");}' infile.fa | sort -t $'\t' -k2,2 > infile.tsv.sorted
$ sort -t $'\t' -k1,1 list.txt > list.txt.sorted
$ join -t $'\t' -1 2 -2 1 -o 1.1,1.2,1.3 infile.tsv.sorted list.txt.sorted > extracted_sequences.tsv
$ awk '{printf("%s %s\n%s\n", $1, $2, $3)}' extracted_sequences.tsv | seqret fasta::stdin fasta:outfile.fa

마지막에 소개한 응용편에서 약간 어렵지만 꽤 유용한 것은 join 명령어였다. 물론 list.txt에는 gene 정보가 있지만 infile.fa에는 없다면 어떻게 할 것인가? 이러한 예외적인 조건까지 다루도록 설계하지는 않았다. 하지만 옵션에 따라서 outer join도 가능하니 관심이 있다면 join 유틸리티의 사용법을 공부하면 된다.

6LQ8 푸시풀 앰프의 전원부 단순화, 그리고 전압 강하용 저항의 방열 대책

작년에 만든 6LQ8 푸시풀 앰프는 최근의 43 싱글 앰프 리모델링 직전까지 약 9개월 동안 파견근무지 숙소에서 내 귀를 즐겁게 하였었다. 플라스틱 바구니 몸체에 나무 도마, 그리고 아무렇게나 뒤엉킨 전선.. 언젠가는 개작이 필요하겠지만 저 지저분한 모습을 바라보고 있노라면 만드는 과정에서 겪은 즐거움과 노고가 유쾌하게 떠오르게 되어서 그렇게 나쁘지만은 않다.

43 싱글 앰프(왼쪽)와 6LQ8 PP 앰프(오른쪽).

원래 이 6LQ8 PP 앰프는 1N4007 다이오드 브리지에 RC 평활회로만 달린 단순한 전원회로로 시작하였다. 그러나 험(hum)이 참을 수 없는 수준이어서 2SK1119라는 FET를 이용한 리플 제거용 필터 보드를 구입하여 기존의 RC 평활회로 바로 뒤에 삽입하게 되었다. 그 효과는 매우 만족스러워서, 43 앰프 보드에도 이 필터를 쓰고 있다.

리플 제거 보드는 아직도 eBay에서 판매된다("Tube preamp/amplifier high voltage FET AC noise electronic filter board 400V 2A"). SMPS 실험을 하느라 구입한 MOSFET인 IRF740이 여러 개 남아 있어서 마음만 먹으면 노이즈 제거 필터를 직접 만드는 것도 가능하지만, 방열판이나 대용량 전해 캐패시터의 가격을 생각하면 eBay에서 7.09 달러를 주고 구입하는게 낫겠다.

인터넷에서 검색을 해 보니 이러한 타입의 리플 제거 필터를 쓰는 경우 전단에는 다이오드 브리지만 있으면 충분하다는 결론을 얻게 되었다. 그래서 단순화를 추구하기 위하여 기존에 사용하던 정류 기판을 빼내고 IN4007 네 개를 연결하여 만든 브리지를 삽입하여 보았다.

아래 왼쪽에 보인 것이 앰프에서 빼낸 기존의 전원회로부이다.

약 9개월 동안 사용한 전원회로는 정상적인 모습이 아니었다. 평소에도 발열이 심하다고 생각했는데 전압 강하단에 쓰인 저항 주변부가 약간 탄 모습을 하고 있었다.


만능기판의 뒷면을 공개하는 것은 상당한 용기가 필요하다. 왜? 늘 부끄러우니까.. 소리전자 판매장터에서는 자작앰프를 판매하려는 사람에게 내부를 공개하라는 글과 그에 대한 공방이 가끔 벌어진다. 바둑판처럼 자로 잰 듯한 질서정연한 배선을 할 수만 있다면 참으로 좋겠다.

문제는 이 회로기판을 제거한 다음에 일어났다. 다이오드 브리지와 FET 리플 필터를 직결하고 나서 최종 전압을 측정하니 평소보다 거의 40V 정도가 높다. 약간 과도한 조건이 아닐까 생각을 하면서 앰프를 작동시켜 보았다. 얼마나 시간이 흘렀을까, 왼쪽 채널의 소리가 약해지면서 '웅-'하는 소리가 점점 커졌다. 왼쪽 채널을 담당하는 6LQ8 중 하나가 마치 멜트다운 직전의 용광로처럼 평소와는 다른 모습으로 시뻘겋게 달아오르는 것이 아닌가? 이것이 말로만 듣던 진공관의 열폭주 현상이로구나! 일단 전원을 내리고 전압 강하용 저항을 삽입하여 6LQ8 작동에 필요한 198 ~ 202 V 수준으로 내리기로 했다.

전원 전압을 원하는 수준으로 내리려면 평활회로 이후에 저항을 다는 것보다 전원트랜스 2차와 정류용 다이오드 사이에 넣는 것이 더욱 유리하다. 가지고 있는 5와트 시멘트 저항을 조합하여 원하는 전압이 나오도록 하였다. 100옴 3개를 직렬로 연결하니 195 V 정도가 나와서 이대로 납땜을 하였다. 다행스러운 것은 진공관의 열폭주가 다시는 일어나지 않는다는 점이다.

시멘트 저항에서는 상당한 수준의 열이 나고 있었다. 도대체 얼마나 전력을 소모하는 것일까? 300옴 전체에 대해서 27 V 가까운 전압 강하가 일어나고 있으니 전체적으로는 2.43 W에 해당한다. 저항 하나에 대해서는 0.81 W를 소모하고 있는 것이다. 하지만 손을 대기 어려울 정도로 뜨겁다. 이대로는 앰프 케이스(플라스틱)이 녹을지도 모른다는 생각이 들어서 철판 조각 위에 저항을 올려놓기로 하였다. 방열판 목적이라고 보아도 무방하다. 여기에는 가구 DIY용 평철을 사용하였다.



시멘트 저항에서는 열이 얼마나 나는가? 아래에 인용한 그래프를 보자. 5 W 저항의 경우 100% 수준으로 작동하면 그 온도는 170도에 이르게 된다. 이 제품의 권장 사용 온도는 -40℃~+155℃라 한다. 70~80% 이내의 load 조건에서 쓰는 것이 안전하다.

출처: 대림전자(링크)

결론을 맺자면 X 와트급 저항에서 X 와트에 해당하는 전력 소모가 일어나게 해서는 안되겠다는 것이다. 방열판과 같은 적극적인 대책을 쓰지 않는다면 1/3에서 최대 1/2 정도 수준이 안전할 것이다. 이번 실험처럼 방열판에 해당하는 것을 사용하는 것도 좋은 아이디어이다. 시멘트 저항 고정용 방열 브라켓이라는 부품도 존재한다. 기존에 사용하던 전원회로 내의 전압강하용 저항은 1~2 와트급이었던 것으로 기억하는데, 아마 이 한계치에 다다를 정도의 전압강하를 하고 있었을 것이다. 시멘트 저항이 아니니 크기가 작은 일반 저항에서는 더욱 높은 열이 나게 되고, 가까이 위치한 다른 부품에도 영향을 미치고 있었을 것이다.

전자 회로의 안전하고도 안정적인 작동을 위해 방열 대책이 얼마나 중요한지를 깨닫게 된 유익한 경험이었다.

2020년 3월 20일 금요일

ABRicate는 무엇에 쓰는 물건인가?

3월 들어서 올린 글의 대부분은 진공관 앰프 리모델링 작업에 관한 것이었다. 식구들이 하나씩 늘어 파견근무지 숙소에서 벌써 세 대의 진공관 앰프를 굴리게 되었으니.. 그래서 활용도가 떨어지는 것 하나는 다른 사람에게 넘기기로 하였다.

왼쪽부터 6LQ8 푸시풀, 6J6  푸시풀(이것은 이영건 선생님 2018년 제작), 그리고 6N2P + 43 싱글.

이번에는 오랜만에 본업과 관계된 글을 좀 써보려 한다. 인간의 각 장기에 존재한 microbial signature가 다르다는 논문을 읽어보고 이에 대해서 뭔가 글을 쓰려는 강력한 동기에 사로잡혔으나 당장 급한 일 때문에 일단 소개만 해 두고 나중을 노려야 되겠다. Nature의 자매지가 하도 많아서 이제는 다 외지 못할 지경이 되었다.

Type 2 diabetes influences bacterial tissue compartmentalisation in human obesity. Nature Metabolism volume 2, pages 233–242(2020) 링크(전문 공개)

Akkermansia muciniphila의 연구로 유명한 Patice D. Cani가 이 저널의 News & Views에서 이 논문을 함축적으로 소개하였으므로 그것을 살펴보는 것도 도움이 된다. 제목은 'Microbial signatures in metabolic tissues: a novel paradigm for obesity and diabetes'(링크)이다. 3월 9일에 게재되었으니 정말 최신 연구이다. 해당 기사의 요약을 그대로 인용한다.

By analysing microbial profiles in three adipose tissue depots and the liver and plasma of morbidly obese individuals, a new study uncovers a unique organ-specific microbial signature, or potential internal ‘tissue microbiota’, in obese people with diabetes.

출처: Nature Metabolism

건강 상태가 나빠지면 gut barrier가 느슨해지면서 장내 미생물이 혈류를 타고 전신을 돌게 된다. Anhê 등은 혈장과 대사 조직에서 이러한 미생물의 '잔해'를 매우 정밀하게 측정하여 서로 다르게 분포한다는 것을 밝혔다. 여기서 잔해라 함은 16S rRNA를 뜻한다. 조직 내에 존재하는 미생물이 물론 살아있는 것은 아니다. 그리고 장 이외의 원천에서 유입된 것도 적지 않다고 한다. 지금까지의 마이크로바이옴 연구의 방향을 근본적으로 뒤흔드는 이야기가 될 수도 있겠다.

서론이 지나치게 길었다. 사실 오늘 블로그 편집창을 연 것은 abricate라는 생소한 프로그램에 관해 알아보게 된 경위를 쓰려는 것이었다. TORMES 메인 스크립트를 좀 고쳐서 쓸 일이 생겼다. Python이 아니라 shell script라서 다행이었다. abricate라는 명령어가 항생제 내성 및 병원성 인자 유전자를 탐색하는 명령행에서 계속 나타나길래 도대체 이것이 뭔가 싶어서 구글에서 검색을 해 보았다. 여러 균주 샘플에서 나온 결과 파일을 한데 합치는 데에도 같은 프로그램이 쓰인다는 것이 흥미로웠다.

ABRicate

Mass screening of contigs for antimicrobial resistance or virulence genes. It comes bundled with multiple databases: NCBI, CARD, ARG-ANNOT, Resfinder, MEGARES, EcOH, PlasmidFinder, Ecoli_VF and VFDB.
ABRicate는 호주 멜버른 대학교의 Torsten Seemann의 작품이었다. Prokka, snippy 등 미생물 유전체를 다루는 사람이라면 밥 먹듯이 쓰는 프로그램의 개발자 아닌가. GitHub 사이트에서도 밝혔듯이 ABRicate의 첫 세글자는 Anti-Biotic Resistance에서 유래했다고 한다. 내가 특히 흥미를 느꼈던 것은 여러 샘플의 결과 리포트를 병합하여 매트릭스를 만들어주는 기능이 포함되어 있는 점이다('Combining reports across samples'). 만약 이를 셸 스크립트나 R로 하려면 얼마나 성가시겠는가? 커스텀 DB를 만들어 쓸 수도 있다는 점도 이 프로그램의 유용성을 잘 보여준다.

Seemann의 블로그 The Genome Factory를 종종 방문하여 유용한 정보가 있는지 알아봐야 되겠다. 흠, 올린 글은 그렇게 많지 않다. 하지만 그는 GitHub를 통해서 더욱 왕성한 활동을 하고 있으니 내가 도움을 받을 일은 앞으로도 많을 것이다.

2020년 3월 17일 화요일

[2020년도 43 5극관 싱글앰프 리모델링] 8. 완성 - 뚜껑을 닫으며



핀바이스로 나무틀에 구멍을 뚫고 총 10 개의 나사못을 박아서 상판을 드디어 고정하였다. 전동 드릴이 없으면 어려운 일이라고 생각했었는데 막상 해 보니 그렇지도 않다. 고정을 마치고 정면에서 잘 살펴보니 상판이 완벽하게 가운데에 위치하지를 못하여 아주 미세한 차이가 발생하였다. 제작자가 아니라면 인지하기 어려운 수준이지만, 항상 아쉬움과 찜찜함 가운데 일을 마무리하게 된다. 나사를 다시 절반쯤 풀고 상판을 움직여 보았지만, 상판에 가공한 구멍이 워낙 딱 맞는 직경을 하고 있어서 조정할 여지가 별로 없다. 하기는 상판으로 가린 내부 배선의 복잡함은 남에게 보이기 싫은 사연이기도 하다. 배선이 비록 보기에 좋지 않다고는 하나 납땜 불량이나 단락이 발생하지 않았고 험(hum)이나 기타 잡음도 문제가 될 수준이 아니며 회로도를 암기하고 있을 수준이면 된 것 아니겠는가?





2020년 1분기에 이룬 개인적인 성과 중에서 가장 큰 의미를 지닌 일이 바로 43 앰프 리모델링 작업이 아닌가 싶다. 이제는 나도 허름하게 대충 만드는 것을 지양하고, 누구에게 내어 놓아도 부끄럼이 없는 모습이 되도록 완성도를 갖추어 나가는 데 주력해야 되겠다. 회로도까지 CAD로 남겨 놓으면 금상첨화가 될 것이다.

처음 만든 작품은 원형 그대로 두는 것도 기념이 되겠지만.


2019년에 만든 6LQ8 푸시풀 앰프(왼쪽)와 올해 리모델링한 43 싱글 앰프(오른쪽)의 비교. 왼쪽 앰프의 뒤엉킨 배선을 보면 머리가 아프다. 잘 만들어진 '상자'는 객체지향 프로그래밍에서 말하는 캡슐화와 흡사하다. 앰프의 사용자는 사실 내부에서 어떤 원리로 음성 신호의 증폭이 일어나는지는 몰라도 된다. 단지 조작법을 잘 이해하고 있으면 된다. 물론 불리함을 감추기 위한 포장에 급급해서는 안된다. 첫 작품의 보존과 개량의 기로에 서서 이제 어떻게 할 것인가? 


나사못에 담긴 의미를 잊지 말자. 완벽의 추구, 마무리, 그리고 다음 단계로 나아가기.





2020년 3월 13일 금요일

[2020년도 43 5극관 싱글앰프 리모델링] 7. 납땜 후 소리 듣기

가공된 상판을 입수한 후 삼일 연속으로 작업을 진행하여 드디어 소리를 내는 단계까지 왔다. 출력관 접속은 울트라리니어(UL)로 해 놓았다. 나중에 6P 토글 스위치를 달아서 5극관 접속과 UL 접속을 전환할 수 있게 만들 예정이다.

아직 상판을 닫을 단계가 아니라서 각재를 사용하여 띄워 놓았다. 43 오극관의 히터 점화용 24V 어댑터도 상자 안으로 들어가야 한다. 샤시 그라운드 연결도 아직 못했다.


찬란하게(?) 빛나는 43 오극관. 나름의 얼짱 각도에서 찍은 사진이다.



전원 전압은 부하를 걸지 않은 상태에서 160 V를 조금 넘는다. 아마도 43 출력관의 캐소드-애노드 사이에는 135 V 정도가 걸릴 것이다. 최대 출력은 기껏해야 1.5 와트 정도나 될까? 소리는 당연히 6LQ8 푸시풀 앰프보다는 작다. 볼륨 놉을 12시~2시 정도로 돌려야 6옴 87dB /W(1m) 스피커에서 듣기 좋은 소리가 난다. 최대 음량에서 험도 느껴지지 않는다.

이 앰프에 대해서는 정말 많은 의미를 부여할 수 있다. 회로 선정부터 섀시까지 전부 내 손으로 이룩한 앰프, 전통적인 진공관 앰프 전원과 SMPS의 혼용, 최초의 CAD 활용, 1940년대에 만들어진 빈티지 출력관 사용 등등... 전원회로와 드라이브단 구성에서 정말 많은 실험을 했었다. 2014년 유성 시외버스 터미널에서 내 생애 최초의 진공관 앰프(주문 제작)를 받아 들었을 때보다 더 큰 보람과 애착이 느껴진다. 측정을 통해서 왜곡이나 출력에 대한 객관적인 수치를 얻을 수도 있겠으나, 아직은 그 방법을 잘 모른다. 일단 내 귀에 듣기 편안한 소리를 낸다면 그것으로 된 것 아니겠는가?

2020년 3월 12일 목요일

[2020년도 43 5극관 싱글앰프 리모델링] 6. 배선 시작

가공관 상판만 입수되면 하룻저녁에 납땜을 모두 끝내고 43 싱글 앰프에서 울려 퍼지는 음악을 들을 수 있을 것이라 기대했는데 현실은 그렇지가 않다. 어제와 그제, 총 이틀에 걸쳐서 매일 세 세간 혹은 그 이상의 시간을 투자했는데 아직도 완성의 길은 끝이 나지 않았다.

회로 기판을 쓰지 않고 직접 선재를 하나씩 부품에 납땜하여 조립을 하는 방식을 흔히들 '하드 와이어링(hard wiring) 방식'이라 하는데, 영문쪽 웹사이트를 찾아보면 point-to-point construction(위키피디아)라고 부르는 것이 올바른 것 같다. 하드 와이어링은 나중에 배선 패턴을 바꿀 수 있는 '소프트 와이어링'의 반대 개념으로 이해하는 것이 맞다.


첫날에는 전원과 스피커 단자, 그리고 초단의 히터 배선을 대충 끝냈다.

어제 작업한 사진을 이 자리에 올렸다가
오배선을 발견하고 도로 내렸다...

부품의 다리를 구부려서 좁은 공간에 욱여넣고 납땜을 하는 것이 왜 이렇게 불편하고 어색한 것일까? 내가 뭘 잘못했나? 소리전자의 키트 제작서(6L6GC-350A SE 앰프 '귀래')를 찾아보았다. 아, 그렇구나! 소켓에 모든 부품을 직접 납땜하여 붙인 것이 아니라 일단 러그판 쪽으로 선을 연결하여 뽑아낸 다음에 부품을 연결하고 있었다. 이런 방식의 배선을 하려면 단선을 쓰는 것이 훨씬 유리함은 당연하다. 자작인들이라면 누구나 느끼겠지만 와이어 스트리퍼로 연선의 피복을 벗겨낼 때 심선 한 두 가닥이 끊어져서 떨어지면 여간 찜찜한 것이 아니다.


출처: 소리전자


앞으로 이틀은 더 투자를 해야 얼추 마무리가 될 것 같다. 출력관의 접속을 5극관  UL로 전환할 6P 스위치는 아직 구입하지도 못했다. 정 귀찮아지면 UL로 임시로 고정한 다음 나중에 전환용 스위치를 달면 된다. 상판을 고정할 나사못 구멍도 나무틀에 뚫어야 하는데 현재 작업 중인 숙소에는 전동 드릴이 없다. 핀바이스로? 허허... 구멍은 무려 10개를 뚫어야 된다! 트랜스포머까지 얹은 상태의 상판은 워낙 무거워서 나사못을 당장 박아서 고정하지 않아도 사고를 칠 염려는 없다.

서두르느라 일을 그르치지 말고, 시간이 걸리더라도 단계별로 완벽을 추구하면서 진행하도록 하자.


2020년 3월 10일 화요일

[2020년도 43 5극관 싱글앰프 리모델링] 5. 섀시 가조립

약 한 달에 걸쳐서 LibreCAD를 익힌 뒤 앰프 상판(300  x 200 mm, 2.5T) 설계도를 만들어 냈다. 지난 월요일, 네이버 카페 사운드머신에 DXF 파일을 보내어 가공을 의로하였고, 드디어 일주일이 지난 어제 예쁘게 완성된 상판을 받았다. 글씨에 입혀진 검정색은 새겨진 틈에 아크릴 물감을 직접 밀어 넣어서 만든 것이다.


샌딩이나 헤어라인 마감보다는 원판의 느낌을 그대로 살리는 것이 좋다고 한다. 헤어라인은 값싼 샤시에서 흠집을 가리기 위한 용도로 보는 것이 타당하다.


상판에 고정할 부품을 올려놓으면서 확인을 해보니 애초에 도면이 잘못 그려진 곳이 있음을 발견하였다. 그러나 치명적인 실수는 아니라서 그대로 사용해도 별 문제는 없는 상태이다. 부품을 대충 고정하고 사진을 찍어 보았다.



트랜스포머의 전선을 통과시키는 구멍의 위치를 잘못 잡아서 전원트랜스포머가 출력트랜스포머와 같은 방향으로 자리를 잡았다. 원래 계획은 전원트랜스포머만 90도 틀어서 고정하는 것이었다. 만약 유도험이 발생한다면 방향을 바꾸는 보수 작업이 필요하다.


스스로 내 자랑을 하기는 우습지만 처음 설계한 것 치고는 참 잘 만들었다는 생각이 든다. 설계를 할 때에는 스위치와 노브 및 단자류를 상판에 올려놓을지 혹은 나무 밑틀쪽으로 뺄지 무척 고민을 많이 했었다. 지금은 최종안에 만족한다.

내부 배선 작업은 오늘 저녁부터 시작할 것이다. Ultralinear 접속-오극관 접속을 전환할 토글 스위치를 아직 구입하지 못했다. 이미 이러한 회로 구성으로 음악을 들어 보았으므로 기대한 것과 다른 결과가 나오지는 않을 것이다.

2020년 3월 9일 월요일

bioBakery 공부하기

HomebrewLinuxbrew니 하는 '양조장' 시리즈를 거쳐서 이제는 빵집인가! 2월 말부터 내가 푹 빠져있는 bioBakery는 mata'omics, 즉 metagenomics와 metatranscriptomics 분석을 위한 종합 환경으로서 그 규모가 매우 방대하다. 하바드 대학교 공중보건대학 생물통계학과의 Curtis Huttenhower(1981년생) 그룹이 주축이 되어 개발 및 배포를 진행하고 있다. 메타게놈의 계통분석학적 분석 도구인 MetaPhlAn도 여기에 포함된다. MetaPhlAn의 개발자 Nicola Segata(1982년생)는 현재 이탈리아 University of Trento Laboratory of Computational Metagenomics를 이끄는 부교수인데, Huttenhower 연구실에서 Post doc 연수를 하였다. 다들 젊구나!

bioBakery: a meta'omic analysis environment. Bioinformatics, 34(7), 2018, 1235-1237

설치부터 테스트 자료 분석에 이르기까지 들인 공은 MetAmos 못지 않았다. 그러나 기능, 사용자 지원, 포럼의 활성화 등을 따진다면 당연히 bioBakery가 우세하다고 생각한다. 

bioBaker는 다양한 형태로 배포되고 있어서 초심자가 익숙해지기에는 약간 어려움이 따른다. Conda package로 제공되는 workflows는 --bypass-strain-profiling을 설정하지 않으면 아직까지 해결하지 못한 에러가 발생하고, Vagrant 가상 머신도 상당히 곤혹스러우며(이것 때문에 mercurialvagrant를 설치하고 이해하느라 아주 애를 먹었음, 참조 사이트), 결국 최종적으로 택한 환경은 아마존웹서비스(AWS)의 미국 동부 리전에 생성한 EC2 인스턴스였다. 이것도 사실은 완벽한 환경은 아니었다. samtools와 bcftools를 0.1.19로 다시 설치해야 했으며(strainphlan 실행에 필요), 최종적으로 hclust2도 다시 깔아야만 했다. 뿐만 아니라 R과 vegan pacakge도 설치해야 한다. 아마존웹서비스(AWS) EC2 인스턴스로 즉시 설치할 수 있는 머신 이미지(AMI)를 제공한다고 해서 여기에 모든 것이 다 깔려 있을 것이라고 기대하지는 않는 것이 좋겠다. bioBakery workflows를 구동하기 위한 prerequisite에 대한 것은 여기를 참조해 보라.

다음은 metagenome profiling workflow의 설명 그림이다.

출처 링크. HUMAnN2과 StrainPhlAn 등 개별 모듈의 기능을 공부하는 데에도 많은 노력을 기울여야 한다.


biobakery_workflows 16s_vis 명령을 이용하여 16S rRNA 서열 기반의 메타게놈 분석을 실시하였다고 가정하자. 그러면 텍스트 파일로 결과가 만들어진다. 이를 도표와 함께 최종 리포트를 만들고자 한다면, biobakery_workflows 16s_vis 명령을 실행해야 된다. 그런데 리포트에는 일부 그림이 제대로 표시되지 않았다. Standard error나 anadama.log 파일을 봐서는 무엇이 문제인지 알기가 어렵다. 그래서 visualization에 필요한 사전 요구 사항이 무엇인지 점검해 보았다. NumPy, SciPy, Matplotlib... 당연히 알아서 설치된 것이 아닌가? 그런데 어쩐지 hclust2가 찜찜해 보인다. '$ conda install -c biobakery hclust2'로 설치를 하라는데 그런 패키지는 없다고 한다. hclust2를 biobakery에서 배포할 이유는 없다. 채널 정보가 미심쩍다고 생각하여 '$ conda install -c bioconda hclust2'를 실행하니 외견상 별 문제는 없었다. 다시 biobakery_workflows 16s_vis를 실행하니 약간의 경고 메시지는 나오지만 정상적인 PDF 리포트가 만들어졌음을 확인하였다. 16S rRNA amplicon sequencing을 이용한 taxonomic profiling data의 분석 최종 리포트 사례는 여기를 참고하라. bioBakery를 이용하여 high-impact journal에 실린 최근 논문을 한번 찾아보았다.

Multi-omics of the gut microbial ecosystem in inflammatory bowel diseases. Nature 569, 655-622(201) 원문 링크

샘플 데이터의 분석을 통해 나온 리포트를 보면서 느낀 점은, 과연 QIIME이나 Mothur에 비하여 무엇이 못할까 하는 점이다. 두 애플리케이션의 성능 비교는 해묵은 논쟁거리이기도 하다. Shotgun metagenome의 분석이라면 당연히 bioBakery가 더 우위에 있을 것이라고 생각한다.

[예] Comparison of Mothur and QIIME for the Analysis of Rumen Microbiota Composition Based on 16S rRNA Amplicon Sequences. Front. Microbiol., 13 December 2018 링크

특히 reference DB의 설치가 제대로 되었는지를 잘 점검해야 실행에 문제가 없을 것이다. 일례로써 metaphlan2_env와 workflows_env에서 각각 필요로하는 MetaPhlAn DB의 위치가 서로 다르다. 이는 전혀 예상치 못했던 일이다.

가장 바람직하게는 로컬 서버에 conda package로 설치한 biobakery_workflows를 성공적으로 돌리는 것이지만 아직까지 잘 되지 않는다.

2020년 3월 4일 수요일

Ferenc Snétberger와 Markus Stockhausen의 앨범 [Streams]

아무런 계획이나 사전 정보 없이 중고 CD 진열대 앞을 서성인다. 마일스 데이비스의 CD('Kind of Blue')를 집어들었다가 커버 디자인이 낯이 익어서 아들에게 연락을 해 보니 최근에 LP로 구입했다고 한다. 지금 찾아보니 이 앨범은 재즈 역사상 가장 많이 팔린 음반이라고 한다. 아이고 부끄러워라... 아니다, 부끄러워할 이유는 없다. 퇴근 후 집에서 음악을 듣는 시간은 거의 네 시간에 이른다. 그렇게 시간을 쏟아도 아직 모르는 음악이 더 많다.

구입 기준은 아주 간단하다. 내가 잘 모르는 음악가의 음반일 것. 값이 저렴하면 금상첨화. 지난 주말, 대전 은행동 알라딘에서 이렇게 고른 음반이 바로 Streams(알라딘 음반 소개 링크)이다.


뒷쪽의 Russ Freeman도 재즈 기타리스트라고 한다.



CD 플레이어에 음반을 삽입하고 음악을 들어보았다. 고요하면서도 격정적인 기타와 트럼펫(그리고 플루겔혼)의 어우러짐... 요즘 관악기에 관심이 많아서 더욱 귀를 기울이고 듣게 되었다. 마르쿠스 슈토크하우젠이라는 이름이 눈길을 끌었다. 현대 전위 음악의 대가인 카를하인츠 슈토크하우젠과 관계가 있을까? 과연 그러했다. 마르쿠스 슈토크하우젠(1957~)은 그의 아들이었다. 흠, 카를하인츠 슈토크하우젠에 대해서는 책에서만 보았지 실제로 그의 음악을 아직까지 들어본 일은 없다.
유튜브에서 마르쿠스 슈토크하우젠의 음악 동영상을 찾아보니 '직관적 음악(intuitive music)'이라는 것이 많이 보인다. 이는 그의 아버지가 창안한 개념인데, 일상적인 악보의 표기 없이 작곡가가 표기한 새로운 기보에 따라 연주자들이 그들의 직관으로 연주해 나가는 음악을 말한다. 재즈에서 흔히 말하는 즉흥 연주(improvisation)과 무엇이 다른지 음악 이론적인 측면에서 파고 들 생각까지는 없다. 마르쿠스 슈토크하우젠의 웹사이트에 소개된 직관 음악에 관한 문서(intuitive music and more)를 보는 것이 도움이 될 것이다.

마르쿠스 슈토크하우젠은 독일어로 소개하자면 "Trompeter-Musiker-Komponist"이다.

2020년 3월 2일 월요일

"영어에서 'Good job'보다 나쁜 말은 없지"

There are no two words in the English language more harmful than "good job"
영화 위플래쉬(2014)에서 테렌스 플레처 교수가 한 무서운 말이다. '잘 했어, 그만하면 됐어'라는 말은 더 잘 할 수 있는 능력을 중도에 주저앉게 만드는 나쁜 말이라는 뜻이 되겠다. 사실 이 영화에서 더 무서운 대사는 'Rushing or dragging?'이었지만 말이다.

이만하면 됐다! 맨 얼굴보다 화장이 나은 이유. 바니쉬를 바르기 전의 모습이다.

가르쳐 줄 스승도, 곁에서 의견을 줄 동료도 없는 상태에서 하는 취미란 혼자 궁리하고 고민하고 좌절하다가도 또 만족하는 것 아니겠는가? 퇴근 후 숙소에서 손에 수성 스테인 얼룩을 만들어 가면서 진공관 앰프 바닥 틀로 쓸 나무 상자에 색을 입히고 있다. 냄새도 없고 빨리 말라서 몇 번이고 바르면서 깊은 색을 내 보려고 애를 쓰는 중이다. 중간에 사포질도 해 가면서. 최종 마감용으로 바르려고 소용량(60 ml) 투명유광 바니쉬도 다이소에서 한 병 사왔다. 스테인 칠은 마찬가지로 다이소에서 구입한 매직 스폰지를 잘라서 사용 중이다. 이 스폰지는 표면을 약간 깎아내는 특징이 있어서 도료를 바르는 용도로는 썩 좋지는 않다.

투명유광 바니쉬를 1회 바른 후. 광택이 있음을 보이기 위한 연출이다.

약 2주에 걸쳐서 열심히 LibreCAD를 익혀서 앰프 상판용 도면도 만들어서 가공 업체에 보냈다. 잘못되었으니 고쳐서 다시 보내라는 연락이 올까봐 노심초사했는데 사장님으로부터 'Good job'에 해당하는 답변을 받았다. 이번주 안에 완성품을 받아 볼 수 있을 것이다.



LibreCAD의 DXF 파일을 gmail이 그림으로 친절하게 표시해 주었다.

그래봐야 취미에 불과한 일인데 결과에 연연할 필요가 뭐가 있겠느냐만, 그래도 한번 하려면 제대로 하는 것이 낫지 않겠는가? 요즘 하는 일 중에서 가장 성취감을 느끼게 하는 일이기도 하거니와 메이커(maker) 시대를 맞아서 익혀두면 도움이 될 소소한 기능이기도 하다.

자기 전에 한번 더 덧칠을 해야 되겠다.

2020년 3월 4일 업데이트

전원부 일부를 꾸며 넣었다. 전원 트랜스를 두 개 직렬로 연결하는 해괴망측한 조합은 그럴 수밖에 없었던 많은 사연을 갖고 있다.






서툴게 칠한 흔적이 고스란히 남아 있지만 윤기가 흐르는 나무통을 어루만지면서 강한 애착을 느꼈다. 그래, 이런 재미로 앰프를 직접 만드는 거다.