2016년 4월 29일 금요일

유전체 서열을 이용한 세균의 종(species) 동정

인간은 패턴을 인식하고 구별하는데 특화된 시각과 지적 능력을 갖고 있다. 새로운 대상을 만났을 때 이것이 적인지 혹은 우호적인 대상인지를 빨리 찾아내기 위한 능력이 오랜 시간을 거쳐 진화해 오면서 지금에 이르지 않았나 싶다. "생각하는 인간" "노는 인간"과 비슷하게 "구별하는 인간(특히 단순한 이분법적인 구별)"을 희화화하여 표현하는 방법으로 Homo dichotom.. 어쩌구 하는 학명을 만들면 재미있을 것이다. 안타깝게도 나의 라틴어 실력은 사실상 제로 상태라서 어떤 말을 쓰면 좋을지를 모르겠다.

형태적으로 구별이 거의 불가능한 미생물을 연구하는 사람들에게는 이를 정확히 동정하여 편을 나누는 것이 매우 중요한 일이다. 이것은 꽤 오랜 전통과 나름대로의 학문적 체계를 갖춘 분야이다. 2004년 말부터 차세대 염기서열 해독 기술이 눈부시게 발전하여 미생물의 분류학 또는 계통발생학(taxomony - phylogeny - systematics: 이 세 용어를 정확하게 구별하는 일도 쉽지는 않다!)도 데이터의 바다 속에 풍덩 빠져들게 되었다.

나처럼 컴퓨터만 가지고서 생물학을 연구하는 사람에게 전통적인 원핵생물의 종 구분 기술인 DNA-DNA hybridization은 꿈만 같은 이야기이다. 대신 유전체 서열을 이용하여 가지고 놀 거리는 점점 많아지고 있다. 가장 쉽게 미생물의 동정을 위해 택하는 기술은 16S ribosomal RNA gene 염기서열을 이용하는 것이다. 어떤 primer를 쓰는 것이 NGS 시대에 가장 적합한가에 대한 논의는 이미 활발하다. 이렇게 얻은 서열 정보를 가지고 알 수 있는 것은 무엇인가? 대략 97% 이상의 pairwise similarity를 넘지 못하면 서로 다른 종으로 본다는 것이다. 그보다 높은 값은 동일 종일 수도 있고, 그렇지 않을 수도 있다. 16S rRNA 서열을 검색해서 top hit로 나온 것의 종명을 같다 붙이는 경우가 의외로 많은데, 이는 엄밀히 말하자면 옳지 않다. 다만 type strain(표준 균주)가 아닌 경우 그 누구도 문제를 제기하지 않을 뿐이다. 어쨌든 이러한 분석을 하는 데에는 천연구소(Chun Lab)의 ExTaxon이 너무나 유명하다.

여기서 잠깐 사족을 붙여본다. ATGC라는 단지 4가지의 문자로 구성된 DNA 서열을 비교하면서 similarity라는 표현을 쓰는 것은 적합하지 않다고 생각한다. 화학적 특성에 따라 구분 가능한(또 구분, 구별이 나온다) 아미노산 서열이라면 모르겠지만 말이다. 따라서 핵산에 대해서는 identity라고 하는 것이 적합할 것이다.

유전체 정보를 사용해서 가까운 균주를 알아내는 또 다른 방법은 RAST 서버에서 자동 주석화를 실시한 뒤 closest neighbor 목록을 확인하는 것이다. 여기에서는 몇 개의 marker gene을 이용하여 가장 가까운 균주(물론 유전체 염기서열 해독이 된)를 찾아준다. 일종의 MLST에 의한 작업인데, score의 의미 또는 사용된 유전자의 수가 몇 개인지는 잘 모르겠다. PubMLST 사이트를 이용하면 각 종에 대해서 이미 수립된 MLST 데이터베이스를 이용할 수 있다.

다음으로는 specI라는 것이 있다. 모든 미생물에 분포하는 것으로 알려진 40종의 COG를 이용하여 가장 가까운 균주를 찾아주는 것이다. 확장된 MLST라고나 할까? 웹 서버가 있어서 이를 종종 사용하는데, 문제는 급격히 늘어나는 유전체 정보를 지속적으로 추가하여 DB를 업데이트하지 않는다는 것이다. 어쩌면 서비스를 종료할지도 모른다! 오늘은 웹 서버에 공개된 소스를 받아다가 자체적인 DB를 만드는 작업을 시작해 보려고 세팅을 건드리는 작업을 하였다. NCBI의 RefSeq에서 모든 박테리아의 유전체 서열을 지난 4월 초에 약 5일에 거쳐서 받아 두었었다. 약 6만개가 넘는 엔트리를 보유하고 있는데, 이는 계속 늘어나고 있으므로 지속적인 업데이트가 필요하다. 새로 올라온 엔트리만 가져올 수 있도록 일종의 incremental download를 해 주는 스크립트를 짜서 테스트를 완료해 놓았다. 최신 데이터를 사용하여 자체 DB를 만드는 것이 가능한지를 알아보는 중이다.

웹을 뒤져보니 JSpecies 말고 리눅스 환경에서 두 개의 유전체 서열에 대한 ANI 값을 계산하는 펄 스크립트가 있어서 이를 가져다가 활용해 보았다. 요즘은 GitHub에 정말 유용한 프로그램들이 많이 올라와서 일손을 덜게 해준다. FASTA 프로그램도 GitHub에서 다운로드할 수 있을 정도이니....

마지막으로 유전체 서열을 이용한 DDH 값의 추정치를 만들어주는 GGDC라는 서버도 있다. 요즘 내가 매우 자주 쓰는 도구이다. ANI 값으로 종을 구별할 수 있는 경계치는 95~96% 정도로 나타나서 칼로 싹둑 자르듯이 표현하기가 어렵지만, GGDC에서는 실제 DDH에 상응하는 수치가 나와서 활용하기가 매우 편리하다.

이상에서 소개한 도구들의 정확한 사용 목적을 아는 것이 중요하다. 두 개 혹은 그 이상의 미생물 유전체 서열을 제공했을때 동일 종 여부를 가려주는 것인가, 또는 하나의 유전체 서열을 던졌을때 이것이 어디에 속할 가능성이 있는지를 보여주는 서비스인가를 명확히 해야 한다. 결국 구별에서 시작애서 구별로 끝나는 글을 쓰고 있다.

2016년 4월 27일 수요일

1.3 달러짜리 TDA2030A 앰프 보드 주문

Ebay 판매자가 결함 있는 물품을 판매한 것에 대하여 일부 환불해 준 3 달러로 무엇을 할까? 또다시 ebay를 뒤적여 보았다. 1만원 이하의 저가 앰프 보드는 다시 사지 않겠다는 다짐이 또다시 무너지는 순간이다. 잘만 고르면 대단히 만족스런 물건이 걸리기도 하니까. 지금 사무실에서 듣는 LM1876 앰프 보드가 그러하다.

가격 상한선을 3 달러로 제한해 놓고서 물건들을 찾아보았다. 주변 부품을 최소화한 1 달러 내외의 앰프 보드가 꽤 많다. 이번에는 잘 알려진 앰프 칩인 TDA2030A를 이용한 보드를 골랐다. 가격은 무료 배송 조건으로 겨우 1.3 달러. 단일 채널 용도로 만들어진 것이라 2 개를 주문하였다. SMD 부품이 쓰였고 음량 조절은 반고정 저항으로 하는 소형의 매우 소박한 물건이다(제품 링크).

이것 외에도 이미 경험해 본 TDA7297 또는 PAM8610 보드가 눈에 뜨인다. TDA7297 앰프는 꽤 큰 방열판이 달려있어서 일단 젖혀두었고, class D 앰프은 PAM8610은 처음 구입했을 때 잡음에 시달렸었던 기억이 있어서 선택하지 않았다. 아마 내가 운이 없이서 불량품을 받았을 것이다. 최근에 네이버 카페를 방문해 보니 비교적 좋은 물건을 만든다는 Yuan Jing 오디오에서도 납땜이 미처 되지 않은 앰프 보드를 보냈다는 것을 보면 싼 가격에는 마무리가 부실한 물건을 구입하게 될 가능성이 매우 높다는 것을 알 수 있다.

2016년 4월 26일 화요일

TDA7294P 앰프 보드의 op amp 출력핀에서 직접 신호를 꺼내는 것의 문제

op amp NE5532의 출력핀에 선을 직접 납땜하여 외부의 앰프에 연결하여 소리를 들어보는 실험까지를 마친 상태에서 과연 이것이 현명한 일인지 생각해 보았다. 이 앰프 보드는 DC 12V~24V를 공급하도록 되어있다. 사용한 어댑터는 DC 12V짜리이다. 따라서 NE5532는 이를 중간 전압인 6V에서 나누어서 양전압(+6V, 0V, -6V)으로 공급받고 있을 것이다. 그렇다면 전원 그라운드 기준으로 op amp의 출력은 +6V offset을 가진 상태일 것이고, TDA7294P 앰프 칩으로 입력되기 전에는 아마도 캐패시터를 거치면서 DC 성분이 제거될 것이다.

테스터로 찍어보니 정말 그러하다. 전원 그라운드를 기준으로 6V가 더 높다. 이런 상태로 선을 인출하여 외부의 파워앰프에 연결했을 때 무사히 동작했던 것은, 파워앰프의 입력단에 당연히도 커플링 캐패시터가 있었기 때문이었을 것이다. 만약 이 신호를 커플링 캐패시터가 없는 앰프에 연결했다면? DC 신호가 무자비하게 증폭되어 아마 스피커 코일이 날아갔을 것이다.

운이 좋아서 앰프와 스피커를 망가뜨리지 않은 셈이다. 저항을 경유하므로 신호 레벨이 약간 내려가겠지만, 앰프 보드에 이미 장착되어 있는 3.5mm 스테레오 폰잭을 그대로 활용하자. 기판에 고정된 상태의 SMD 부품에 전선을 납땜한 것은 내 실력으로도 함부로 할 일이 아니었다.

ebay 판매자는 3달러를 돌려주었다. 이것으로 TDA2030A 초미니 보드를 2개 주문하였다.

2016년 4월 25일 월요일

TDA7294P 앰프 보드의 AUX 단자에 대한 고찰

지난번 포스팅에서 TDA7294P 블루투스 리시버 앰프 보드에 달린 3.5mm 스테레오잭은 pre-out 기능으로도 쓰일 수 있음을 밝혔다. 이는 보드 내의 프리앰프(NE5532) 출력과 3.5mm 스테레오잭의 신호선이 다음 그림과 비슷하게 저항을 거쳐서 TDA7294P 앰프 칩의 입력으로 들어가기에 그러하다.

아마도 이 보드를 설계한 사람의 의도는 AUX IN 단자로서 이를 구비해 놓은 것이 맞을 것이다. 믹스 회로는 위 사진과 같이 매우 심플한 구성이다. 따라서 input 1으로 들어온 신호(예: 블루투스 신호)가 input 2로 빠져나가는 것을 막을 도리가 없다.

정확히 말하자면 NE5532의 출력핀(1 & 7) 이후의 회로 패턴은 내 실력으로는 정확히 파악하기 어려웠다. 저항 하나를 거쳐 negative input pin으로 피드백되는 것은 확인하였으나, 출력이 TDA7429P의 입력단에 직렬도 접속된 저항까지는 어떻게 연결되는지 구별하기는 사실상 불가능하였다. 한두개의 C/R을 더 거쳐갈지도 모르는 일이다. 저항이 무한대로 나오는 것으로 보아서는 최소한 캐패시터가 하나쯤 있는 것으로 생각된다.

op amp 출력핀에서 나오는 신호가 3.5 mm 단자까지 오려면 몇 개의 저항을 거쳐야 한다. 그렇다면 op amp의 출력핀에서 직접 신호를 뽑으면 어떨까? 어제는 이를 확인하기 위해 난생 처음 가장 세밀한 납땜 작업을 해 보았다. 돋보기 안경을 쓰고 얇은 테프론 와이어를 op amp 다리에 덧붙인 것이다. 이를 별도의 3.5mm 스테레오 폰잭에 연결한 뒤 외부 앰프에 접속해 보았다. 물론 소리는 잘 나온다. 그렇지만 자체 3.5mm 폰잭에서 인출되는 신호에 비해서 레벨이 높은지 낮은지는 쉽사리 구별되지 않았다. 오실로스코프를 써서 정확하게 측정을 해야 알 수 있을 것이다. 실험용 폰잭은 핫멜트를 써서 이제는 무용지물이 된 전해캐패시터 위에 붙였다.


만약 op amp에서 직접 뽑아낸 선의 신호 레벨이 더 높다면 이 배선 상태를 그대로 유지하든지 아니면 op amp 출력에서 기존의 3.5mm 폰잭에 직접 배선하는 방법이 가능하다.

이 실험에 쓰인 외부 앰프는 TDA7266D 칩을 사용한 것이다. 편의상 전원 어댑터 하나를 두 보드에 한꺼번에 연결해 보니 최소 볼륨에서 전기적 잡음이 느껴진다. 어댑터를 별도로 사용하면 그렇지 않다. 일체형 리시버 앰프를 만들고자 생각 중이지만 신호 결합을 어떻게 하는 것이 좋을지, 전원 연결을 개선할 필요는 없는지 또다시 고민이 생긴다.


원래 TDA7266D 앱프 보드에는 볼륨 조절용 포텐셔미터가 없어서 내가 RCA 단자와 폿을 임의로 달아 놓았었다. 이를 거치지 않고 블루투스 출력을 직결하니 잡음이 너무 심해서 도저히 쓰기 어려웠다. 현재 달린 볼퓸 폿으로는 10시-12시 정도 위치에 놉을 두면 가장 적당하다. 만약 블루투스 소스 쪽에서 음량을 전적으로 조절하기를 원한다면(앰프를 다른 용도로는 쓰지 않는다는 가정 하에), 중간에 포텐셔미터를 넣지 않고 적당히 저항을 써서 전압 분배기를 만들면 될 것이다. 

생각이 여기까지 미치니 이제는 커플링 캐패시터가 필요하지 않을까 하는 의문도 생긴다. 아마도 품질은 좋지 않겠지만 TDA7266D 앰프의 전단에는 분명히 캐패시터가 하나쯤 있을 것이다. 아아, 별로 좋지도 않은 블루투스 리시버에 그저그런 앰프 보드를 연결하면서 무슨 커플링 고민이란 말인가!

2016년 4월 22일 금요일

TDA7294P 블루투스 앰프의 3.5mm 스테레오 잭은 입력인가 출력인가?


지금까지는 이 단자가 블루투스로 접속하지 않은 외부 소스기기를 연결하여 보드의 앰프 칩을 이용하여 증폭하기 위한 용도라고 생각했었다. 즉 너무나 당연하게 파워앰프의 입장에서 갖춰진 AUX IN 단자일 것으로 생각한 것이다. ebay에서 동일한 제품을 판매하는 게시글에는 어떻게 설명이 되어있는지 찾아보았다. 어법에 맞지 않는 부분이 있지만 그대로 옮겨보겠다. 괄호 안의 문구는 내가 추가한 것이다.

If you use extral (external일 것이다) audio, you need (to) connect 3.5mm audio line.

여러 판매자가 똑같은 설명을 달아 놓았다. 자, 이게 도대체 무슨 말인가? external audio라 함은 소스인가 앰프인가? 이 문장으로는 정확히 파악하기 어렵다. AUX라고 하면 다른 소스를 연결하기 위한 용도라고 생각하는 것이 당연한데, 이 영문 설명은 매우 애매모호하다.

현재 TDA7294P 칩은 전혀 작동을 하지 않는 상태이다. 휴대폰으로 블루투스 신호를 송신하면서 오실로스코프로 이곳저곳을 찔러 보았다. 어제까지의 실험 결과로는 블루투스 모듈과 op amp 출력은 정상이었다. 그렇다면 음성 신호를 어떻게 해서든 빼내서 다른 앰프에 연결하면 될 것으로 생각했었다. 선을 납땜하기에 좋은 포인트가 어디일지 궁리하면서 기판을 들여다보았다.


그런데 관찰 결과 흥미로운 점을 발견하였다. 3.5mm 스테레오 폰잭(판매자의 글에 의하면 "AUX")의 신호선이 op amp의 출력과 결국은 만나서 TDA7294P의 입력으로 들어가는 것이다. AUX 단자로 들어온 외부 신호가 수동 소자로만 구성된 일종의 passive mixer를 거쳐 op amp의 출력(블루투스 신호)과 섞여 증폭칩으로 가는 것인가, 혹은 op amp의 출력을 외부 증폭기로 보내기 위한 일종의 pre out 역할을 위해 3.5mm 스테레오 폰잭이 있는 것인가?

실험에 착수하였다. 휴대폰에서 블루투스로 음악을 재생하고, TDA7294P의 AUX 단자와 다른 외부 앰프(이번에는 케이벨 TDA7266D 앰프)를 3.5mm 스테레오 케이블로 연결하였다. 앰프로 소리가 출력된다.

TDA7294P 앰프 칩이 정상 작동을 하던 며칠 전, AUX 단자로 외부 입력을 먹였더니 자체 앰프를 통해 소리가 나던 현상은 어떻게 설명해야 한단 말인가? 어차피 수동 소자로 연결되어 있어서 원래 입력 용도로 쓰일 단자에서 출력이 새어 나올 수도 있다는 말인가?

오늘의 실험을 통해서 이 보드의 증폭기는 비록 더 이상 작동을 하지 않지만, 블루투스 수신기로는 충분히 쓸모가 있음을 확인하였다. 새로운 DIY 오디오 프로젝트가 태동할 기미가 보인다. 이 보드와 TDA7266D 보드를 하나의 케이스에 수납하여 일체형 블루투스 리시버 앰프를 만들어 보자. 출력은 다소 부족하지만 4옴 스피커를 연결하면 채널 당 10와트는 나오니 큰 문제는 없다.

TDA7429P 블루투스 앰플리파이어 보드 유감

이베이에서 구입한 블루투스 4.0 클래스 D 앰프 보드가 급격히 상태가 나빠지고 있다. 처음에는 AUX  IN 연결시 한쪽 채널이 들리지 않더니 이내 블루투스 연결에서도 한쪽 소리가 나지 않고, 급기야 이제는 아무런 소리가 나지 않는다. 앰프에 전원만 투입해도 들려야 하는 잡음은커녕 완전한 정적 그 자체이다.

그나마 다행인 것은 CSR8635 블루투스 모듈은 정상적인 동작을 한다는 것이다. 이것과 TDA7492P 앰프 칩 사이에 위치한 op amp NE5532도 제대로 작동한다. 그렇다면 앰플리파이어 칩이 알 수 없는 이유로 완전히 망가졌다는 뜻이 되겠다.

NE5532의 출력 단자(1번 및 7번)를 다른 앰프(TDA7265)에 연결해 보았다. 아직 납땜을 하지는 못하고 래핑용 와이어 피복을 벗겨서 접촉만 시킨 수준이다. 휴대폰에서 송출한 블루투스 음성 신호가 잘 수신되어 NE5532에서 출력됨을 확인하였다. 이 앰프 보드는 어댑터 전원을 사용하므로 아마 보드 내에서 opamp 동작을 위해 가상적인 그라운드를 만들었을 것이다. 전원 그라운드를 기준으로 NE5532의 출력 단자에 걸린 기본 전압을 측정하니 DC offset이 걸림을 알 수 있었다. 아마도 테스트를 위해 연결한 TDA7265 앰프 입력단의 커플링 캐패시터에 의해서 직류 성분이 걸러진 것으로 생각된다. 정말 오랜만에 개인적으로 갖고 있던 오실로스코프가 큰 도움이 되었다.

본 앰프 보드에 쓰인 것과 동일한 블루투스 모듈만을 ebay에서 구입하려 해도 8달러 가까운 돈이 든다. 어찌보면 직접 사용하기 매우 까다로운 모듈에 인터페이스가 갖추어진 상태이니 비록 앰프는 망가졌다 하도 9달러의 가치는 있지 않을까? 작동 불능에 대해서 이의를 제기하니 앰프 보드 판매자는 물건을 보내지 않는 조건으로 1달러를 환불하겠다는 제안을 한 바 있다. 1달러라... 이것이 자기의 마진이고, 환불할 금액도 자기 급여에서 나간다나 뭐라나... 1달러는 좀 심했다.

SMD 부품이 가득한 보드에 손을 대기는 정말 싫다. 나도 이런 수준의 개조 작업을 하게 될 것이라고는 꿈에도 생각하지 못했다. 새로운 경험을 하게 된 것은 좋은 일이지만 말이다.


2016년 4월 16일 토요일

LM1876 앰프 섀시 가공 작업

어제 받은 LM1876 앰프 보드를 집에 가져와서 CD player에 연결을 하였다. 이번에는 아무런 잡음이 들리지 않는다. 같은 칩을 사용한 앰프라 해도 기판의 패턴이나 부품등에 따라 영향을 받는 것으로 보인다. 고장난 외장 HDD 케이스를 재활용하여 뚜껑이 없이 개방형으로 꾸미기로 하였다. 트랜스와 방열판 등 주요 부품이 이미 케이스보다 키가 크기 때문이다.

스피커 단자를 고정할 부품은 문구점에서 구입한 플라스틱 수납 상자의 끝부분을 잘라서 만들었다. 실톱은 이번에 처음으로 사용하는 것이다. 너무 빠른 속도로 톱질을 하면 열이 발생하여 플라스틱이 톱날에 녹아서 들러붙는다. 꿈쩍도 않는 톱날을 어떻게 해 보려다 몇개나 톱날을 끊어먹었는지 모른다. 아래에 보인 실톱대와 톱날은 대전에 위치한 케이스포유에서 예전에 구입해 둔 것이다. 가장 어려운 점은 날이 너무나 가늘어서 도대체 어느쪽에 날이 있는지 알기가 어렵다는 것이다. 손으로 만져서 거친 면을 찾아야 하는데, 4면 중에서 3면에 날이 있는 것처럼 느껴진다. 처음이라 쉽지는 않았지만 이내 요령이 생겼다. 앞으로 판재에 큰 구멍 혹은 부정형 구멍을 가공할 때에는 실톱을 사용하리라.


파워소켓과 스위치도 재활용이다. 이 부품들은 알루미늄 케이스에 에폭시 수지로 붙여버렸다. 동네의 큰 문구점에서 에폭시 '접착제'를 구하고자 하였으나 눈에 뜨이는 것은 음식 미니어쳐의 국물 제작용 에폭시 수지가 전부였다. 이것이 접착제 역할을 할 수 있는지 확신이 없는 상태에서 구입을 하였다. 1시간 경화용이라고 적힌 것과는 달리 배합 비율을 제대로 지키지 못했는지 시간이 지나도 도무지 경화가 되지 않고 자꾸 흘러내려서 걱정을 많이 하였다. 다행히도 하루가 지나니 단단히 붙었다. 파워소켓과 스위치의 접속 부위에는 수축튜브가 이미 된 상태라고는 하지만 그래도 감전에는 조심하자.


기판에 볼륨 폿이 붙은 형태라서 특별히 섀시 전면 패널을 만들지 않았다. 입력 단자는 케이블이 붙은 3.5mm 스테레오 잭을 재활용하였다. 전원 트랜스포머와 기판의 연결은 컴퓨터 파워 서플라이에서 떼어낸 4핀 커넥터를 활용하였다. 트랜스포머를 다른 용도로 쓸 가능성에 대비하여 단자 처리를 한 것이다. 만약 24V 직류 단전원이 필요하다면 2차 단자를 병렬로 연결해 놓은 커넥터를 꽂은 다음 내가 만든 정류 및 평활회로를 연결하면 된다.

이번에도 구멍을 제 위치에 뚫는 것에는 실패하였다. 앰프 보드를 고정할 구멍 4개 중에서 하나의 위치가 잘못되어 결국은 볼트 3개만으로 고정하게 되었다. 스피커 단자의 위치도 마음에 썩 들지는 않는다. 조립을 끝내고 휴대폰을 연결하여 하루 종일 음악을 즐겼다. 음량을 꽤 높여도(정격입력 80W 89dB 스피커) 방열판이 그렇게 뜨거워지지 않는다. 같은 트랜스포머를 TDA7265 앰프에 연결했을 때는 발열이 꽤 심했었다.


앰프 식구들을 모두 한 자리에 모아 보았다. 왼쪽 위 투명 반찬통은 TDA7266D 앰프, 바로 곁에는 오늘 케이스 구성을 완료한 LM1876 앰프, 아래의 검정색 통은  TDA7265 앰프, 그리고 오른쪽은 PCL86 진공관 싱글 앰프이다. 이번의 LM1876 앰프가 기대 이상의 성능을 발휘하고 있어서 당분간 LM375/LM3886 앰프에 대한 업그레이드 욕심을 가질 필요가 없게 되었다.


한가지 안타까운 것은 이 앰프보다 며칠 앞서 구입한 블루투스 리시버 앰프가 시간이 지날수록 급격이 상태가 나빠지고 있다는 것이다. 처음에는 왼쪽 채널이 AUX IN 연결 시에만 소리가 작게 나더니 이윽고 블루투스 연결에도 소리가 나지 않고, 이제는 전원 투입 때 나는 비프음마저 나질 않는다. 말하자면 한쪽 채널이 완전히 죽어서 잡음조차 나질 않는 것이다! 판매자에게 일단 제품에 문제가 있음을 알리기는 했는데 배송료 무료로 해외에서 받은 물건이라서 도대체 어떻게 하는 것이 현명한지를 모르겠다. 환불을 받으려면 물건을 돌려보내는 것이 상식인데, 물건 값이 워낙 저렴하니 반품용 배송료를 들이기가 아깝다. 문제가 있는 제품의 반품이므로 이 경우에는 판매자가 비용을 대는 것이 맞을까?

2016년 4월 15일 금요일

거듭된 지름 - 이번에는 LM1876 앰프 보드가 도착하다

LM1876 앰프를 게인클론의 한 부류로 보아도 타당할까? 보유한 토로이덜 트랜스포머를 적절히 활용하겠다는 일념, 그리고 게인클론이 하나쯤은 있어야 되겠다는 생각을 기어코 주문한 두번째의 LM1876 보드가 긴 기다림 끝에 홍콩으로부터 드디어 내 손에 들어왔다. 앞서 구입했던 LM1876 및 LM1875 보드는 둘 다 만족스럽지 못했었다. 고급품은 아니지만 볼륨 놉과 내부 배선용 스피커선을 넣어 준 것이 고맙다.


사무실-Fi(?)를 구성하는 패시브 스피커를 연결한 다음 휴대폰을 소스 기기로 하여 음악을 재생하여 보았다. 나쁘지 않다. 잡음 수준도 이만하면 적당하다.


아직 결론을 내리기는 이르다. 집에 가지고 가서 CD player를 연결하여 들어본 다음에야 안심을 할 수 있을 것이다. 지난번 LM1876 보드와 마찬가지의 잡음이 발생할는지? 그 다음으로는 단자류를 부착할 방법을 생각해 보자.

2016년 4월 14일 목요일

TDA7492P 블루투스 리시버 앰프에 케이스를 씌우다

이마트에서 구입한 JAJU 브랜드의 리필용 케이스에 앰프 보드를 넣어 보았다. 기판 지지대의 둥근 발이 걸려서 니퍼로 잘라내니 딱 맞게 들어간다. 전원 어댑터와 스피커 케이블 연결을 위해 옆면을 니퍼와 칼로 파서 대략 구멍을 만들었다. 썩 마음에 들게 예쁜


기판 지지대 아랫면에 록타이트를 발랐는데 케이스 내면에 잘 붙지를 않는다. 차라리 핫멜트로 붙이는 것이 나을 것이다.

이 앰프는 자주 옮겨다니지 않고 거의 거실에서 붙박이로 사용하게 될 예정이므로, 스피커선 연결을 위한 별도의 단자 처리 없이 보드에 달린 스크류 터미널만을 그대로 쓸 생각이다. 커넥터를 별도로 달게 되면 케이스가 커지는 것을 막을 방법이 없다.

2016년 4월 13일 수요일

TDA7492P 블루투스 리시버 앰프 도착

3월 27일에 ebay에서 구입한 TDA7292P 블루투스 4.0 리시버 앰프가 4월 12일 비로소 내 손에 들어왔다. 명함 하나 정도의 매우 작은 크기이다. AUX 입력단자(3.5mm 스테레오 폰잭)가 있는 제품으로 구입하였다. 최근의 ebay 및 AliExpress를 도배하고 있는 제품이라 해도 과언이 아니다. 블루투스 칩으로는 CSR8635가 쓰였고 프리앰프로서 NE5532가 들어간 것으로 보인다.



설명서라고 할 것도 없다. 주루룩 늘어선 빨상색의 다섯개 버튼 스위치는 왼쪽부터 play - prev - next - vol (+) - vol (-)이다. 가장 오른쪽에 있는 네모난 스위치는 전원 스위치이다. DIP 스위치로는 게인을 조정할 수 있다. 선택 가능한 값은 21.6, 27.6, 31.1, 그리고 33.6dB이다. 구입시에는 최저 게인으로 설정된 상태이다. 당연한 이야기지만 게인을 올리니 화이트 노이즈가 증가한다.


스피커(AIWA SSX-LZX7; AWP-ZX7에 포함된 것으로 6옴)와 12V 5A DC 어댑터를 연결하였다. 전원 스위치를 잠시 뒤 '디디디디디~' 비프음이 들린다. 휴대폰의 블루투스 기기 목록에서는 SANWU AUDIO라는 이름으로 뜬다. 페어링을 완료하면 비프음이 한번 더 들리고 파랑색 LED가 깜빡거린다. 휴대폰에서 음악을 재생해 보았다. 선 없이 음악을 들을 수 있다는 것이 참으로 편리하다. 


직접 만든 정류회로에서 인출되는 24V를 연결하니 발열이 제법 심하다. 만약 이런 높은 전원 전압을 연결한 상태에서 안전하게 오래 사용하려면 바닥쪽에 적당히 방열판을 연결하는 것이 좋을 것이다. 적당한 크기의 알루미늄판을 방열 양면 테이프로 붙이는 정도면 충분할 것이다. TDA7492P 데이터시트에 의하면 exposed-pad-down (EPD) package를 사용하였으므로 방열판이 필요없다고 한다. 내가 보유한 또다른 칩앰프은 TDA7266D에서는 기판 아래쪽에 금속판을 구부려 만든 간이 방열판이 부착되어 있다.


앰플리파이어 칩 데이터시트에는 25W + 25W dual BTL class D audio amplifier라고 명시되어 있다. 이는 THD 10%, 부하 8옴, 공급전압 20V의 상황이다. 그런데 블루투스 리시버 앰프 보드 판매 글에는 50W + 50W(6옴), 40W + 40W(8옴)이라고 적혀있다. 다소 과장인지? 물론 일반적인 가정용 앰프로는 손색이 없는 출력이다. 와이파이와의 간섭 때문인지 간혹 틱틱거리기는 하지만 음질도 마음에 든다. 전원 on/off를 할 때 팝업 노이즈가 발생하지만 특별히 거슬리지는 않는다.

블루투스로 음악을 재생하는 중에 AUX 단자에 케이블을 꽂아 보았다. 블루투스가 자동으로 끊어질 것으로 생각했는데 여전히 음악이 나온다. 케이블에 연결한 다른 기기에서 음악을 재생하였다. 두 소스의 음악이 섞여서 나온다.  패시브인지 액티브인지는 몰라도 내부에서 믹스를 하는 것으로 생각된다.

지금까지 몇 개의 class D 앰프를 경험해 보았다. TPA3116D2, PAM8610, TPA3125D2, YDA-138E, 그리고 이번의 TDA7492P. 이 중에서 제품의 완성도(정확히 말하자면 보드 조립 상태)가 가장 높다. 음질과 편의성 역시 매우 높다. 케이블 없이 음악을 재생할 수 있다는 것이 이렇게 편리한 줄은 미처 몰랐다. 케이스 만들려고 애쓰지 말고 명함통 정도에나 넣어버리면 될 것이다. 내가 만드는 앰프는 전부 바인딩 포스트를 사용하는데, 이 앰프는 그렇게 하면 부피가 너무 커져버릴 것 같아서 고민이다.

단점


  • 약간 거슬리는 비프음, on/off 시 발생하는 팝업노이즈. 최고 게인에서 약간의 화이트 노이즈.
  • [2016년 4월 14일에 발견한 중대한 단점] AUX IN으로 신호를 입력하면 한쪽 채널의 소리가 거의 들리지 않는다. 아마도 불량?
  • [2016년 4월 16일] 이제는 왼쪽 채널이 완전히 들리지 않는다. Power on  비프음도 나지 않는다. 판매자에게 연락을 취하였다. 1달러를 환불해 주는 것을 제안하는 메일이 왔다. 내 눈을 의심하지 않을 수 없다. 1달러라니?
  • [2016넌 4월 21일] 앰프 칩이 점진적으로 나빠지고 있다. 이제는 양 채널 스피커 전부에서 잡음조차 들리지 않는다! 그나마 다행인 것은 블루투스 모듈의 동작과 NE5532를 통한 음성 출력은 정상적으로 되고 있다. 이 출력을 다른 앰프로 연결하기 위한 작업을 해야 하는가? 

장점

단점을 제외한 모든 것?

2016년 4월 12일 화요일

'인두' 혹은 '인두기(機)'

인두는 불에 달구어서 무엇인가를 지지거나 펴기 위해 사용하는 도구를 일컫는 순우리말이다. 때로는 고문의 목적으로 쓰이기도... 요즘의 인두는 대부분 전기 히터를 내장하고 있어서 전원 콘센트에 연결만 하면 금세 온도가 올라간다. 나를 비롯한 DIY 애호가들은 회로 제작을 위해서 저마다 납땜인두를 하나씩은 갖고 있을 것이다. 다음 사진은 내가 거의 18년 이상 애용해 온 아림전기의 인두이다. 용량은 얼마인지 지워져서 알 수가 없다. 아마 20W급이 아니었나 생각된다.


인터넷을 보면 '인두기'라는 명칭이 흔히 보인다. 나에게 가장 낯익은 이름은 (전기)납땜인두이다. 아마도 기계라는 뜻을 강조하기 위해 '기'라는 접미어를 붙인 것 같다. 인쇄기 사진기 절단기 등등... 이런 의도라면 '납땜기'라고 하는 것이 더 어울리지 않을까? '목적하는 동작' + '機'는 매우 자연스럽다. 그러나 연장의 이름을 가리키는 단어에 '기'를 붙이는 것은 마치 '망치기', '삽기', '괭이기', '송곳기' 처럼 어색하다. '전열기'와 '인두기'는 다른 것이다.

단순한 수공구보다는 다소 복잡한 전기 제품(기구 또는 기계)이니 '기'를 붙인다? 그럼 이건 어떤가?

전동 드라이버기

말이 안된다.

오래 사용한 인두의 용량이 약간 부족해서 커넥터를 납땜하는데 어려움을 겪고 있다. 그래서 60W 정도 되는 저렴한 인두를 추가로 사느냐 혹은 터보 스위치를 눌러서 잠깐동안 고온으로 올릴 수 있는(지나치게 오래 고열로 사용하면 고장나기 쉬움) 인두를 사느냐의 문제로 한참을 알아보다가 온도 조절이 되는 DC 인두가 있다는 것을 발견하였다. 네이버의 어느 카페에서 자작용 키트 형태로 판매한다. 아직 가입한 지 얼마 안되어서 덧글로 구매 의사를 밝힐 수는 없으나, 매우 편리한 물건임에는 틀림이 없다. 어떤 경로로 구입 의사를 밝히는지 알 도리가 없어서 아래 링크를 찾아내느라 꽤나 애를 먹었다.

DIY용 DC 고급온두조절 인두기 키트

2016년 4월 11일 월요일

Illumina read에서 일부분만을 취하기

일루미나 시퀀싱 결과물을 이용하여 de novo genome assembly를 할 때에는 다다익선(多多益善)이 결코 아니다. 과유불급(過猶不及)이라고나 할까? 대략 100x 이상의 depth(or coverage)는 결코 도움이 되지 않고 해가 됨을 너무나 많은 프로젝트를 통해서 직접 경험하였다. Depth가 너무 높으면 우선 컴퓨터가 힘겨워한다. 많은 메모리를 소요하기 때문이다. 그렇다면 Depth가 증가함에 따라 assembly 성적이 나빠지는 이유는 뭘까? 가장 흔한 원인은 - 좀 더 정확히 말하자면 내가 만져본 데이터에 한해서는 - 오염이었다. 라이브러리 제작 이전 단계에 섞인 non-target genome이 문제를 일으키는 것이다. 오염 수준의 genome은 매우 분량이 적으므로 당연히 자잘한 contig를 양산하게 된다.

2013년도 PLoS One에 small genome assembly를 위한 최적의 sequencing depth를 알아본 논문이 출판되었다. 이런 부류의 논문이 과거에 없었던 것은 아니지만 전부 simulated read에 기반한 반면, 이 논문은 실제 시퀀싱 데이터를 사용했다는 것을 장점으로 내세우고 있다. 이논문의 두번째 페이지 왼쪽 단에는 다음과 같은 단락이 있다.
... read depth of 50X is enough to get a ‘‘good’’ genome assembly and sequencing at a depth greater than 100X does not provide any additional benefits. Additionally, we observed that computational resources required for assembling read data of 20 X–100 X depth is between 6–40 GB, for small genomes of E.coli and S. kudriavzevii.
즉 sequencing depth가 어느 수준 이상을 넘어가면 더 많은 데이터를 투입해도 개선되지 않는다고 하였다. 나는 실제로 결과가 더 나빠지는 사례를 무척 많이 경험했다. 단순한 오염 이외에 어떤 systematic한 error가 문제를 더 악화시킨다는 멋진 결론을 한번 내 보려고 무던히 애를 썼지만 그런 일은 아직까지 벌어지지 않았다.

Fastq read에서 subsample을 취하려면 어떻게 하면 가장 좋을까? 원하는 depth에 해당하는 read(line 수 나누기 4)를 계산하여 head 명령어로 앞부분 일부를 취하면 어떤가? 가장 단순한 방법이지만 손으로 계산을 해야 되고 무엇보다도 read file 전체에서 무작위적으로 read가 골라지지 않을 것임이 당연하다. 오늘의 포스팅에서는 이 문제를 다루어 보자.

먼저 fastq/fasta 파일에서 read의 분량을 세는 가장 편리한 방법부터 소개한다. 나는 khmer 패키지의 readstats.py를 가장 좋아한다. Quality trimming을 거쳐서 read의 길이가 일정하지 않아도 상관이 없다.

CLC Genomic Workbench

NGS Core Tools 메뉴에 "Sample Reads"라는 도구가 있다. 클릭만 해 보면 무엇을 하는 기능인지 알 수 있다. read 수 또는 퍼센트 단위로 잘라내는 것이 가능하다.


MyPro의 scripts 중에서...

Preprocess.py를 쓰면 된다. 사용법은 다음과 같다. Trimming을 겸하는 것이 특징이다.
Preprocess.py -read1 [/path/read1.fastq] -read2 [/path/read2.fastq] -g [genomesize] -d [depth] -l [limit] -r [reduce] -min [min length]
-g genomesize. [default:9000000]
-d Int. depth. [default:100]
-l Float. cutoff value for quality trimming. [default:0.01]
-r Int. step size for reducing target length. [default: 10]
-min Int.  Discard reads below length.(defult 50)
-h Help.

Seqtk

sample 명령을 사용한다. 두 개의 파일에 대해서 짝을 맞춘 read를 뽑아내기 위하여 random seed(-s INT)를 일시적으로 저장한다. 다음은 1만개의 read pair를 추출하는 사례이다.
seqtk sample -s100 read1.fq 10000 > sub1.fq
seqtk sample -s100 read2.fq 10000 > sub2.fq

Oneliner

awk, paste 등의 일반적인 유틸리티를 이용하는 재미난 방법으로 Pierre Lindenbaum이 BioStar 커뮤니티에 제안하였다. Lindenbaum은 BioStar를 설립한 사람이기도 하다(BioStar: An Online Question & Answer Resource for the Bioinformatics Community. PLoS One 2011)
그 얼개를 들여다 보자.
  1. 한 쌍의 read 파일을 paste로 붙인다. 이렇게 만들어진 파일의 첫번째 컬럼은 read 1, 두번째 컬럼은 read 2에 해당한다. Field separator로 어떤 문자를 사용했는지 유의하라.
  2. shuf 명령으로 무작위로 라인을 추출한다.
  3. head 명령으로 원하는 만큼의 라인을 취한다.
  4. sed와 awk로 read를 다시 한 쌍의 파일로 나누어 쓴다.
Pipe를 써서 이를 한 줄로 실행하면 다음과 같다. 코멘트가 달려있어서 읽기는 좀 나쁘다. 정말 재미있는 코드 아닌가?

paste f1.fastq f2.fastq |\ #merge the two fastqs
awk '{ printf("%s",$0); n++; if(n%4==0) { printf("\n");} else { printf("\t\t");} }' |\ #merge by group of 4 lines
shuf  |\ #shuffle
head |\ #only 10 records
sed 's/\t\t/\n/g' |\ #restore the delimiters
awk '{print $1 > "file1.fastq"; print $2 > "file2.fatsq"}' #split in two files.

2016년 4월 7일 목요일

오디오 앰프의 파워 서플라이 설계

제목은 거창하지만 웹에서 검색한 자료 링크를 인용하는 것으로 성의없는 글을 결국 마무리하고 말 것이다. 이베이 혹은 알리익스프레스에서 저렴한 어른용 장난감을 주문하는 것은 매우 즐거운 일이지만, 대단히 좋지 않은 부작용도 있다. 바로 배송을 기다리는 시간이 빨리 지나가기를 바라는 마음으로 산다는 것이다! 다른 할 일도 정말 많은데, 시간이 빨리 흐르기를 기대한다는 것은 매우 바람직하지 못하다.

어쨌든 3월 말에 선적된 두 장의 앰프 보드는 아직 내 손에 오지 않았다. 아마 다음 주 정도나 되어야 내 손에 들어올 것이다. Class T 앰프는 딱 기대한 수준의 소리를 들려줄 것으로 생각한다. 그렇다면 채 10달러가 되지 못하는 LM1876 보드는? 알 수 없다.

만약 LM1876 보드가 이번에도 만족스럽지 못하다면, 이제는 과감하게 LM3886 앰프 보드로 건너뛸 생각이다. 과연 내가 소유한 100VA 18V(dual) 출력의 전원 트랜스가 이 앰프와 어울릴까? 다음 링크의 글이 이에 대한 어느 정도의 해답을 제공한다.

Taming the LM3886 Chip Amplifier > Power Supply Design

복잡한 수식은 건너뛰고 맨 끝으로 간다.  순수한 사인파가 아닌 음악을 재생하는 것을 전제로 하면 100VA 20-22V 급 트랜스로 충분하다는 것이다. 내 트랜스의 2차 전압은 18V이긴 하지만 크게 부족하지는 않을 것이다.

아직 주문한 앰프 보드는 손에 들어오지도 않았지만 마음은 벌써 다음 프로젝트를 향해 앞서가고 있다. LM3886? STK4181? SI1540? TDA7293? LM3886이나 TDA7293을 사용한 앰프 보드는 인터넷에 널렸다. 중간의 두 가지는 아세아 전자상가의 은포전자에서 키트 제품을 취급한다. 이를 실제로 구입하여 앰프 완제품을 꾸민 사람들의 의견을 통 볼 수가 없다는 것이 아쉽기는 하다.

virtualenv 환경 정리하기

바로 전 포스팅에서 virtualenv환경에서 파이썬 2.7.11을 사용하는 방법을 기술하였다. 그런데 미처 확인을 하지 못한 것이 있었으니, 바로 파이썬 2.7.10을 이용하여 설치한 khmer의 작동에 오류가 발생하는 것이다. /usr/local/bin/python2.7이라는 동일한 이름을 지니고 있지만 오늘 날짜 직전까지는 2.7.10, 그 이후는 2.7.11로 바뀌었다는 것이 문제이다.

khmer 설치 방법을 찾아보면서 다시 정리를 해 본다.
  1. cd /usr/local/apps/khmer
  2. rm -rf khmerEnv (지우고 다시 설치)
  3. python2.7 -m virtualenv khmerEnv
  4. source khmerEnv/bin/activate
  5. pip install --upgrade pip
  6. pip install khmer
다음 두 명령어는 같을까, 다를까?
$ virtualenv -p /usr/local/bin/python2.7 /path/to/files
$ /usr/local/bin/python2.7 -m virtualenv /path/to/files

CentOS 6.7의 Python 2.6을 업그레이드하는 문제(SGA preqc 실행에 성공하다!)

파이썬은 참 좋은 도구라고 생각한다. 내가 파이썬으로 직접 스크립트를 만들지 않으면서 이런 의견을 낸다는 것은 좀 어울리지 않지만 말이다. 만약 업무를 위해 단 하나의 (스크립트) 언어를 공부해야 한다면 나는 당연히 파이썬을 추천하겠다. 아쉽게도 나의 현실은 언제나 Perl이다...

초급 수준의 파이썬 강좌를 들으면서 느낀 점은 참으로 합리적으로 잘 설계된 도구라는 것이다. 그러나 한가지 불편한 점을 꼽으라면 라이브러리를 설치하고 관리하는 방법이 좀 지저분하다는(?) 것이다. 2.x과 3.x의 버전이 공존한다는 것도 그렇다. easy_install이니 pip니 setuptools니 하는 다양한 설치 및 관리 도구가 나를 혼란스럽게 한다.

더군다나 CenOS 6.7에 설치된 파이썬은 2.6.6이다. SGA preqc를 실행하려면 matplotlib이 필요한데, 최신 라이브러리는 2.6에서는 잘 돌지 않는 것 같다. 그렇다면 파이썬을 최소한 2.7 버전(현재 최신본은 2.7.11)으로 올리는 것을 적극 검토해야 한다.

우선 CentOS 6에서 파이썬 2.6을 상위 버전으로 업그레이드하는 것과 관련한 문서를 찾아보았다. 파이썬은 yum 등 시스템 관리에 필수적인 유틸리티와 연결되어 있어서 매우 주의깊게 업그레이드 과정을 거치지 않으면 안된다. 다음 글에 아주 상세한 과정이 나와 있다.

How to install Python 2.7 and Python 3.3 on CentOS 6

주의해야 할 것은 파이썬 2.7 소스를 받아서 압축을 풀고 컴파일을 할 때, make install 대신 make altinstall을 쓰라는 것이다. 그래야 기존에 있던 파이썬 체계를 덮어쓰면서 혼란을 일으키지 않는다. 이렇게 할 경우 파이썬 인터프리터는 /usr/local/bin/python2.7이라는 이름으로 설치된다. 자, 그러면 시스템에 원래 설치된 파이썬 2.6.6을 건드리지 않고 업그레이드하는 방법을 알아보자.

바로 virtualenv를 사용하는 것이다.


이것은 엄밀히 말하자면 파이썬을 업그레이드하는 것은 아니다. 기존에 설치된 것을 완전히 바꿔치기해야 진정한 의미의 업그레이드이다. 여기서 추구하는 것은 파이썬 ≥ 2.7이 필요한 작업을 할 때에만 이에 맞는 환경으로 전환하는 것이다. 바로 이것을 해 주는 일이 virtualenv이다. 이 도구는 작년말에 short read의 평가를 위한 프로그램 패키지인 khmer를 익히면서 알게 된 것이다. 가령 /path/to/mydata라는 디렉토리에서 작업을 하면서 파이썬 2.7이 필요하다고 가정하자. 반드시 작업 파일들이 이 하위에 있어야 함을 의미하지는 않는다. 시스템에 고유한 파이썬은 2.6이고, 2.7 버전은 make altinstall로 설치하였다고 가정하자. 그러면 다음과 같이 실행하라.
$ virtualenv -p /usr/local/bin/python2.7 /path/to/mydata
그러면 /path/to/mydata/ 하위에 bin/ lib/ include/ 파일이 생성되고 필요한 파일이 복사된다. 다음으로는 이렇게 입력한다.
$ source /path/to/mydata/bin/activate
(mydata) $
프롬프트가 바뀌었다. 이제 python이라고 치면 /path/to/mydata/bin에 복사된 파이썬 인터프리터가 불려진다. 라이브러리도 여기에 새로 복사된 것을 사용한다. 따라서 추가적인 라이브러리 설치도 이 환경 안에서 하면 된다.

SGA preqc 실행에 드디어 성공하다!

내가 파이썬 업그레이드를 심각하게 고민한 이유는 SGA preqc를 실행하고 나서 리포트 생성을 하는 과정에 어려움을 겪었기 때문이다. 만들어진 preqc 파일을 sga-preqc-report.py에 공급하면 다음과 같은 에러가 발생하였다.
  File "/usr/local/apps/sga/src/bin/sga-preqc-report.py", line 17, in
    from mpl_toolkits.axes_grid1 import make_axes_locatable
ImportError: No module named axes_grid1
파이썬 2.6 환경에 설치된 구버전의 matplotlib 라이브러리로는 해결이 되지 않았다. 그래서 위에서 설명한 방법으로 virtualenv 환경을 구축하고 그 안에서 필요한 라이브러리를 설치하였다.
$ pip install --upgrade pip
$ pip install matplotlib
설레는 마음으로 다시 sga-preqc-report.py를 실행하였다. 그랬더니 이번에는 새로운 에러가 발생하였다!
  File "./bin/sga-preqc-report.py", line 331, in plot_legend
    ax.legend(proxy_arts, names, 2, bbox_to_anchor=(0,1), borderaxespad=0.)
  File "/nas/project/39_Drs_Park_Pan_2012_Dec/01_NICEM_121214_SHPark/t_preqc_test/lib/python2.7/site-packages/matplotlib/axes/_axes.py", line 536, in legend
    raise TypeError('Invalid arguments to legend.')
TypeError: Invalid arguments to legend.
어휴, 이건 또 뭐람... 맨 마지막에 나타난 에러 메시지를 가지고 구글링을 하니 놀랍게도 해결책이 나와 있었다. 답변에 따르면 sga-preqc-report.py의 334번 라인을 고치면 된다.

Issue with sga-preqc-report.py: Invalid arguments to legend

드디어 PDF 파일로 된 리포트가 멋지게 만들어졌다. 이렇게하여 기술적 장벽을 또 하나 넘었다. 덕분에 파이썬 버전과 업그레이드에 대한 지식도 아주 조금 축적하게 되었다.

2016년 4월 6일 수요일

Kraken + Krona

존스 홉킨스 대학에서 개발한 Kraken은 NGS로 만들어진 short DNA sequence에 분류학적 표지를 달아주는 도구이다. 보통 서열 정렬(sequence alignment)은 시간이 많이 걸리는 과정으로 알려져 있지만, kraken은 k-mer 정렬과 신규한 분류 알고리즘을 사용하여 실행 시간을 대폭 줄였다.

Kraken에서는 DB를 사용자가 만들 수도 있고, 미리 만들어진 소규모 DB인 MiniKraken DB를 사용할 수도 있다. MiniKraken(4GB)은 RefSeq에 수록된 세균, 고세균 및 바이러스의 complete genome sequence를 기반으로 한 것이다. 최신 업데이트는 2014년 12월 8일이라서 업데이트가 되었으면 한다.

FASTQ file을 kraken 및 kraken-translate로 처리하면 다음과 같은 파일이 생긴다.

HWI-ST1208:245:D1HH3ACXX:1:2308:17477:189823_2:N:0:GTGGCC root;cellular organisms;Bacteria;Firmicutes;Clostridia;Clostridiales;Clostridiaceae;Clostridium;Clostridium kluyveri;Clostridium kluyveri NBRC 12016
HWI-ST1208:245:D1HH3ACXX:1:2206:18877:41229_1:N:0:GTGGCC root;cellular organisms;Bacteria;Firmicutes;Clostridia;Clostridiales;Clostridiaceae;Clostridium;Clostridium kluyveri;Clostridium kluyveri NBRC 12016
...
Kraken 결과물을 시각화하는 데에는 Krona hierarchical data browser가 제격이다. 처음에는 kraken-traslate의 결과물을 krona에 투입해야 하는 것으로 생각했는데 도움말을 찾아보니 그게 아니라 kraken의 최초 결과물에서 2, 3번째 컬럼만 추출한 뒤 KronaTools의 스크립트인 ImportTaxonomy.pl에 제공하여 동적 웹 문서 파일을 얻으면 되는 것이었다. 오늘 처음으로 얻은 Krona의 화면이다.


학회 발표자료를 준비하면서 몇 가지의 플롯을 그리기 위해 gnuplot을 사용하였다. 공식 홈페이지 및 다른 웹사이트의 예제를 참조하여 히스토그램을 그리는데 에러가 발생한다. 문법이 틀렸다는 다소 이해할 수 없는 메시지였다. 검색을 거듭한 결과 내 컴퓨터에 깔린 gnuplot의 버전이 너무 오래된 것이 문제였다. RPM 패키지를 지우고 버전 5.0.3의 tarball을 받아다가 새로 깔았다. 원하는 그림이 얻어짐은 물론 출력물도 이전 버전보다 훨씬 보기에 좋다. 심각한 그림을 그리려면 당연히 R을 사용함이 옳을 것이나, gnuplot은 매우 직관적이라서 사용하기가 좋다.

SGA preqcMetAMOS의 실행 문제도 해결해야 되는데...

2016년 4월 4일 월요일

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

한번에? 만약 이 '한번에'의 의미가 '하나로 이루어진 FASTA 파일 형태로'를 의미하는 것이라면, 대답은 간단하다. 이제 그런 것 없다!

예전에는 다음의 명령어 한 줄을 이용하여 공개된 모든 박테리아의 유전체 염기서열(FASTA)을 하나의 파일로 다운로드할 수 있었다.
wget ftp://ftp.ncbi.nlm.nih.gov/genomes/Bacteria/all.fna.tar.gz
그러나 NCBI ftp 서버 내의 자료 체계가 바뀌면서 이제는 좀 더 복잡한 방법을 거쳐야 한다. 너무나 많은 생명종의 유전체 정보가 넘쳐나면서 계속 한 덩어리의 FASTA file을 업데이트해 나가는 것은 너무나 번거로운 일이 된 관계로 아마 정보를 필요로 하는 사용자가 용도에 맞는 데이터셋을 선택하여 다운로드하라는 정책의 변화라고 생각된다. 물론 NCBI에서는 이에 대한 친절한 사용자 가이드를 제공하고 있다.

이 문제를 해결하는데 도움이 된 웹사이트의 주소는 다음과 같다.

[Biostars] Question: Download All The Bacteria Genomes From NCBI

이에 대한 NCBI의 친절한(?) 가이드는 다음의 PDF 파일에 잘 설명되어 있다. 각 genome에 대한 ftp 주소를 얻어낸 뒤 FASTA 파일을 받아내는 것이 핵심이다. 생각보다 조금 복잡하다.

HowTo - Downloading Genomic Data

앙상블의 박테리아 유전체 정보는 다음의 ftp 사이트에서 받으면 된다.

ftp://ftp.ensemblgenomes.org/pub/current/bacteria/fasta

2016년 4월 1일 금요일

전망 좋은 방

...이라고 쓰고는 싶은데 그만큼 자외선의 공격이 심하다. 새로 옮긴 사무실은 건물의 남동쪽 모서리에 돌출해 있어서 양면으로 들어오는 햇볕이 눈부시다. 상시 블라인드를 내려두지만 이를 뚫고 들어오는 햇볕을 완전히 막을 수는 없는 노릇. 너무 쪼여도 좋지 않고, 반대로 너무 쬐지 않아도 좋지 않은 양날의 칼과 같은 존재가 바로 자외선이다. 일단은 긍정적인 효과를 먼저 생각해 본다. 책상 위 환경을 사진으로 남겨본다. 쓰레기더미(?)에서 주워온 낡은 브리츠 앰프가 현역으로 활동하고 있다.


업무 중에는 주로 인터넷 라디오 '콩'으로 KBS 1 FM을 즐겨 듣는다. 그런데 스트리밍이 간혹 끊기는 일이 발생한다. 집에서 놀고 있는 튜너를 갖고 나와서 쓰는 것을 어떨까? 지난 1년간 지냈던, 창문이 전혀 없던 사무실과 달리 새로 옮긴 방은 남동쪽이 트여 있어서 식장산 중계소에서 날아오는 신호를 기대할 수 있다.

진공관 앰프에 대한 관심은 많이 식은 반면 여전히 칩 앰프에 대해서는 호기심을 유지하고 있다. 웹을 검색하면 일본 Sanken이라는 회사의 트랜지스터를 이용한 class A 앰프 보드가 종종 보인다. 예를 들면 "LJM-MX50 Power amplifier kit Sanken SK2837..."와 같은 것이다. 분명히 플라스틱 패키지에 든 반도체 소자인데 Sanken tube라는 표현을 쓰는 글이 있으니 그 이유를 모르겠다. 요즘은 IC를 사용한 반도체 앰프가 대세라서 이런 고전적인 디스크리트 소자를 이용한 앰프를 보기가 어렵다. 아니, 앰프 자체를 보기가 어려워졌다. 전부 TV, 블루투스 스피커, 휴대폰 속에 숨어버렸으니 말이다. 물론 내가 찾은 Sanken 소자를 이용한 앰프는 아래와 같은 캔 타입의 트랜지스터는 아니다.

http://www.beercityaudio.com/index.php/electrical-parts/other/2sb539-power-amplifier-b539-180-volt-16-amp-transistor.html
이베이에서 주문한 앰프 보드 2개가 아직 내 손에 다다르지도 않은 지금 벌써 다음번 DIY 프로젝트를 논한다는 것은 무리이지만... 또 어떤 것은 양전원이 필요하고 그렇지 않은 것도 있으니 정말 알다가도 모를 일이다. 다음의 DIY 사례를 보자. 요즘 널리 팔리는 50W+50W class D amp 보드는 겨우 명함 한 장의 크기인데, 채널당 5W 출력을 위해서 class A amp는 얼마나 큰 덩치로 다가오는지 한번 살펴보라.

5W MOSFET class-A amplifier single ended project