2018년 2월 23일 금요일

감동의 iTOL(Interactive Tree Of Life)

iTOL(http://itol.embl.de/)은 계통수를 시각화, 주석화 및 관리하는 도구이다. 웹 인터페이스로 구성되어 있어서 누구나 tree file을 올린 다음 다채로운 annotation을 할 수 있다. 계통수 곁에 배열할 데이터가 많거나 복잡하다면 데이터셋 파일을 올리면 된다. 탐색기에 있는 텍스트 파일을 마우스로 웹브라우저에 끌어다 넣으면 그만이다. 다중서열정렬부터 phylogenetic inference를 거쳐서 최종적으로 트리 작성까지를 GUI 환경에서 손쉽게 마칠 수 있는 도구로는 MEGA가 대표적이다. 하지만 내가 알기로는 트리 옆에 heatmap을 배열하는 등의 복잡한 시각화는 하기가 어렵다.

극지연구소에 근무하는 K모 박사의 말에 의하면 전문가들은 MEGA를 좋아하지 않는다고 했다. Phylogenetic analysis에 대한 깊은 지식 없이 의미도 모르는 트리를 무작정 그리게 만든다는 비평을 했던 것 같다. 다르게 표현한다면 이 분야에 대한 공부를 하려는 동기를 갖지 못하게 하는 간편한 도구라고나 할까? 그게 옳다고 해도 사전 지식이 너무나 부족한 초보자에게는 일단 어떻게 해서든 계통수를 자기 손으로 만들어 낼 수 있게 한다는 측면에서 충분히 의미가 있는 소프트웨어라고 생각한다.

난 아주 가끔 MEGA를 사용하지만 사용 빈도가 높지 않아서 그런지 사용자 인터페이스가 좀처럼 익숙하게 다가오지 않는다. 세션의 개념도 아직까지 잘 잡히지 않는다. 오히려 서열정렬은 별도로 실행한 뒤 FastTree나 요즘 익히기 시작한 RAxML에서 tree file을 만든 뒤 다른 도구에서 tree visualization을 하는 것이 더욱 편하다. 이렇게 하면서 Newick format 파일에 좀 더 익숙해졌고, 완전한 tree맹(盲)을 벗어나는데 오히려 도움이 된 것 같다.

트리를 그림으로 표현하는 도구로는 FigTree를 주로 사용하였고, Archaeopterix(실행파일은 forester.jar)를 좀 알아보려다가 이제는 iTOL로 완전히 정착하는 과정에 있다. 내가 iTOL을 본격적으로 쓰게 된 것은 다음의 글 때문이다. 능력이 된다면 python이나 R code를 직접 짜서 그려도 되겠지만 iTOL은 별로 어렵지 않게 publication quality의 그림을 만들게 해 준다.

Displaying data associated with phylogenetic trees [멜버른 대학의 Kat Holt가 2012년 작성]

계정을 생성하면 데이터를 보관하고 다른 사용자와 공유할 수도 있다. 그러나 계정을 만들지 않아도 트리를 그리는 데에는 문제가 없다. 단지 서버측에 저장이 되지 않을 뿐이다. 최근에 그린 그림(최종본이 아님)을 살짝 엿보자. 왼쪽의 그림은 Roray가 만든 core genome alignment를 FastTree에 투입하여 얻은 것이고, 오른쪽의 heatmap(정확히는 2 개)는 average nucleotide identity(pyani)와 LS-BSR의 결과물을 R로 처리한 것이다. 아래에서 보인 그림은 root의 위치를 다시 잡아야 하는데, 너무나 당연하지만 reroot를 하면 오른쪽에 보인 데이터도 이에 맞추어서 바뀐다. Tree annotation에 쓰이는 보조 자료를 dataset이라고 한다. 이 그림에서는 ANI와 LS-BSR에서 생성한 heatmap 자료가 두 건의 dataset에 해당한다. Dataset에는 binary, simple or multi-value bar chart, pie chart, text label, colored strip, colored gradient, connection, heatmap, boxplot, protein domain 등 다양한 유형이 있으며, help page에서 제공하는 템플릿 파일을 적용하여 만들면 된다.

웹사이트에는 동영상을 곁들인 사용 설명서가 있어서 익숙해지는데 큰 어려움은 없다. 한가지 힌트를 준다면 Node ID와 label을 별도로 관리하는 것이 좋다. Tree file에 수록된 node ID에 밑줄이 있다면 이는 공백으로 표현되는데, 이렇게 되면 추가할 데이터셋과 연결하기가 나쁘다. 따라서 tree 작성까지는 각자 심플한 문자열을 써서 node ID를 삼되, 나중에 실제로 표현할 label을 다음과 같이 텍스트 파일로 수록해 둔 마우스로 끌어다 놓으면 된다. 다음의 사례에서는 NCBI taxonomy ID를 node ID롤 사용하였다.
167,Escherichia coli
1423,Bacillus subtilis
...
특정 범위(아마도 clade라고 적는 것이 더 적합할 것이다)에 속하는 모든 node에 색을 입히려면 colored range라는 개념을 이해하는 것이 중요하다. 두 node를 같은 range에 포함시키면 아마도 last common ancestor에 속하는 것을 같은 색으로 입히는 것 같은데 아직 확인해 보지는 않았다. 개별 노드 단위로 색을 입히려면 colored strip 유형을 쓰면 된다.

2018년 2월 21일 수요일

[하루에 한 R] ANI 계산 결과 다루기 - column 혹은 row 이름을 통한 조작

R을 이용해서 '4차 산업혁명' '빅데이터' 시대에 걸맞는 거창한 일 - 말하자면 방대한 데이터 속에서 새로운 지혜를 발굴하는 - 을 해야 하는데, 아직까지도 기초 수준의 자료 작성 기법을 익히는데 머물고 있으니 어찌 한심하지 않겠는가!

기본적인 자료 조작을 할 줄 알아야 통계분석, 시각화 등등의 고급스런 일을 비로소 할 수 있다. 앞으로 더 멋진 일을 하기 위한 기초 소양을 쌓아나간다고 생각하고 오늘도 부끄럽지만 [하루에 한 R]을 기록해 나간다.

매트릭스 형태의 자료 파일(csv, txt, tab-delimited...)를 R에서 데이터프레임으로 읽어들인 다음에 어떤 일을 할 수 있을까? 그동안은 각 cell을 채운 자료 자체에 집중을 하는 편이었지만 요즘은 컬럼과 로우(한글로는 '로'인가 '로우'인가? '윈도'가 표준 표기법이니 '로'라고 하는 것이 맞겠지만 어색함을 떨치기 어렵다, '로우'라고 쓰자.)의 이름을 활용하는 것이 더 흥미가 있다.
  • key,value1(value2,value3...) 형태의 파일 여러개를 key 값 기준으로 합치고 싶다(key 값은 동일할 수도 있고 그렇지 않을 수도 있다).
  • 컬럼이나 로우의 이름을 기준으로 재배열하고 싶다.
  • 컬럼이나 로우의 이름을 일괄적으로 바꾸고 싶다(스트링 조작 혹은 외부 데이터 사용).
  • 컬럼이나 로우의 이름을 이용하여 데이터 프레임의 일부를 덜어내고 싶다(slicing).
  • 최대값(혹은 최저값)에 해당하는 컬럼 혹은 로우의 이름을 알아내고 싶다.
  • 특정 로우 그룹의 평균값, 최대값(혹은 최저값)을 추출하고 싶다.
내가 종사하는 생명과학 분야, 특히 유전체학과 관련한 분야에서는 microarray data, RNA-seq (expression value) data, OTL table, BLAST result(tabular format) 등 다양한 종류의 매트릭스 형태 데이터 파일을 접하게 된다. 대개 하나의 로우는 하나의 레코드에 해당하지만 생명과학 분야 데이터에서는 레코드가 컬럼 단위로 기록되는 경우가 많다. 따라서 hclust() 함수를 쓰거나 할 때 트랜스포즈를 미리 하는 등의 변환이 필요함을 염두에 두어야 한다.

아마 과거에 작성한 글에 이미 이에 대한 방법을 일부 기록해 놓은 것이 있을지도 모른다. 오늘 쓰는 글은 최종 정리판이라고 보면 된다. 사용할 데이터 파일은 pyani에서 만든 ANIb_percentage_identity.tab(다운로드 링크)이다. 어떻게 생겼는지 살짝 열어보자. OpenOffice를 사용해서 command line에서 이런 종류의 파일을 한 번에 스프레드시트로 열 수 있다(ooffice --calc ANIb_percentage_identity.tab). 


R에서 읽어들이려면 다음과 같이 하면 된다. 컬럼 및 로우 네임을 정확히 지정하는 것, 그리고 대각선을 중심으로 대칭이 되게 만드는 것이 관건이다. 이 경우에는 컬럼과 로우의 네임 순서가 정확히 같다는 것을 가정하고 있다.
> d = read.table("ANIb_percentage_identity.tab",sep="\t",header=T,row.names=1)
> d2 = t(d)
> d3 = (d + d2)/2
만약 컬럼과 로우의 이름 순서가 일치하지 않는다는 의심이 든다면 다음과 같이 하면 된다. 전처리가 끝난 데이터프레임의 이름은 d3임을 기억해 두자. 자료 유형이 데이터프레임인 경우 colnames()나 names()나 차이가 없다.
> d3 = d3[, order(names(d3))]
> d3 = d3[order(row.names(d3)), ]
다음으로는 컬럼/로우 이름이 너무 길다는 것이 불만이다. 전부 동일 종에서 유래한 서로 다른 스트레인의 유전체 정보를 사용한 것이니 종 이름을 남겨둘 이유가 없다. 이는 사용자 함수를 만들어서 적용하면 된다.
> a = names(d3)
> trim.species = function (x) sub("^Lactobacillus_rhamnosus_","",x)
> names(d3) = trim.species(a)
> rownames(d3) = trim.species(a)
row.names()와 rownames() 함수는 무엇이 다른가? 이것은 천천히 알아보자. colnames() 함수는 있는데 col.names() 함수는 존재하지 않는다(?col.names를 입력하면 아무런 문서도 나오지 않으므로 그렇게 생각하는 것이다). 데이터프레임의 외형을 다듬는 일은 전부 끝났다. 이번에는 특정한 이름을 갖는 컬럼 하나를 뽑아서 어떤 데이터가 들어있는지 보고싶어졌다. 방법은 다음의 두 가지가 가능하다.
> d3[, which(names(d3) == "DSM_20021_GCF_001435405.1")]
> d3[, which(names(d3) == "DSM_20021_GCF_001435405.1"),drop=F]
> d4 = d3[, which(names(d3) == "DSM_20021_GCF_001435405.1"),drop=F]
drop=F 파라미터를 하나 추가하는 것이 훨씬 바람직한 결과를 낳는다. d4의 구조를 살펴보라. 컬럼과 로우의 이름이 전부 지정된 상태이다.

컬럼의 이름을 완벽하게 지정할 필요도 없다. DSM_20021로 시작하는 이름을 갖는 컬럼을 골라내도록 하자.
> d3[, grepl("^DSM_20021",names(d3)),drop=F]
컬럼이 여러 개 선택될 가능성도 염두에 두어야 한다. 다음으로는 뽑아낼 컬럼이 여러개인 경우를 생각해 보자. 해당되는 컬럼의 이름은 벡터에 미리 지정해 둔다. 정규식 패턴을 벡터에 저장하여 적용하는 것은 아마 어려울 것이다.
> vec = c("Pen_GCF_00207655.1","ATCC_8530_GCF_000233755.1","4B15_GCF_002158925.1")
> d3[, which(names(d3) %in% vec)]
다음으로는 특정 컬럼에 대해여 최대값이 들어있는 cell의 로우 네임을 뽑아보는 일을 해 보겠다. 쉽게 해서 특정 유전체에 대하여 ANI가 가장 높게 나오는 것은 누구인지를 찾아내자는 것이다. 그런데 조심할 것은 당연히 자기 자신에 대한 ANI가 가장 높으므로 이것이 출력되는 것을 배제해야 한다. JSpecies에서는 자기 자신에 대해서는 값을 계산하지 않지만 pyani는 정직하게 1을 산출해 놓는다. 이를 전부 NA로 바꾸어 놓자.
> d3[d3 == 1] = NA
각 컬럼에서 최대값을 갖는 것들의 row name을 찾아보자.
> names(d3)[apply(d3,1,which.max)]
이보다 미려한 출력을 만들고 싶다면 좀 더 연구를 해야 한다. 데이터 프레임의 컬럼 혹은 로우 네임을 named vector를 사용하여 일괄적으로 바꾸려면 http://genoglobe.kr/kribb/data_visualization 를 참고하도록 한다.

2018년 2월 19일 월요일

삼미 HA-165B60 스피커통의 개조 - 후면 개방형으로 바꾸어보다

삼미 HA-165B60 스피커 유닛(소위 6.5인치; 삼미스피커 주식회사의 제품소개 링크)는 Hi-Fi와는 거리가 먼 제품이다. 천장에 묻어서 구내 방송용으로 쓰거나, 게임기나 앰프 등에 수납할 용도로 제조되는 유닛이다. 능률이 높고 전 대역을 평탄하게 재생하는 특성이 있어서 적당히 인클로저에 수납하여 진공관 앰프 용도로 쓰는 사람이 간혹 있는 모양이다. 나도 이러한 용도로 쓰려고 이를 아세아전자상가에서 직접 구입했었다. 생애 최초로 주문제작하였던 전면 덕트형 단일 유닛용 스피커용 통은 소소한 개조는 물론 유닛을 이리저리 바꾸어가며 여러 테스트를 거쳤는데, 두번째이자 마지막(?) 시도였던 삼미 HA-165B60 유닛이라고 해서 월등한 소리를 내지는 못하였다.

[2016년 10월] 스피커를 5인치에서 6.5인치(삼미 HA-165B60)로 바꾸다.
[2016년 12월] 스피커 통 개조하기 - 이번에는 성공?

내부에 흡음재를 채우고, 각재를 모서리에 붙여서 보강을 하고, 나무토막을 넣어서 용적을 줄이고, 내벽에 스폰지를 붙이고, 덕트의 면적을 줄이고, 큰 유닛을 고정하기 위해 배플면의 구멍을 넓히고... 유닛 하나로 모든 영역을 재생하려니 고음과 저음이 부족한 것은 당연하게여기고 받아들이겠지만, 마치 동굴 속에서 소리가 울리듯이 나는 증세는 아무리 개조를 거듭하여도 달라지지 않았다. 마침 사무실에서 운용할 스피커가 더 늘어나면서(JBL FE-M2125, 링크) 자작 스피커통에 대한 관심은 더욱 가라앉게 되었다.

그러다가 지난주 이영건 선생님의 6J6 푸시풀 앰프를 주문하게 되면서 이 스피커통을 살려보자는 생각을 하게 되었다. 지금까지 해 보지 않은 개조를 시도하는 것이다. 후면 개방형으로 쓰면 어떨까? 뒷판을 열고 단자의 위치만 바꾸면 되는 매우 간단한 개조이다.  좀 더 완벽하게 개조하려면 통 내의 덕트 입구를 막는 일까지 해야 되겠지만 적당한 재료를 찾지 못해서 아직 여기까지는 시도하지 않았다.

돌아다니는 자작나무 합판 조각(원래는 트위터 거치대로 만든 것을 부수었음)을 통 내부에 고정하여 단자대로 삼았다.



컴퓨터에 연결한 USB DAC을 통하여 LM1876 앰프를 물려 놓았다. 좀 나아졌는가? 으음... 잘 모르겠다. 울림 자체가 많은 음악인 류트 연주곡을 틀어놓고 이에 익숙해지려고 노력하고 있다. 만약 팝이나 락을 재생한다면 아마도 잘 어울리지 않을 것이다.


효과가 진정으로 있는 개조였는지 아닌지 알기가 어렵다. 컴퓨터 바탕화면에서 날 지켜보는 스칼렛 조핸슨에게 위로나 받아야 되겠다. 날 노려보는 건가?

"어이~ 스피커는 그만 갖고 놀고 이제 일이나 하시지?"

2018년 2월 18일 일요일

R 코드를 위한 Syntax Highlighting

드디어 Syntax Highlighting을 사용하여 구글 블로거에서 R code를 예쁘게(?) 표현하는 방법을 찾았다. Perl과 Bash에 대해서는 쓰는 방법을 대충 알아낸 상태였었다.

나에게 도움을 준 페이지는 다음의 것이다.

블로거(blogger, blogspot)에서 R code block 추가 및 syntax highlighting

여기에 소개된 방법 중 두번째의 것인 '좀 더 복잡하지만 두고두고 써먹을 수 있는 방법'을 이용하였다. 블로거 테마 메뉴에서 html 소스 코드가 보이게 만든 다음 <\head> 태그 직전에 약간의 코드를 삽입하는 것이었다. 그 다음에는 HTML 모드에서 다음은 실제로 이를 적용하여 작성한 것이다.

a = c("alpha","bravo","charlie","delta")
a[1]

이상하다. 잘 작동하지 않는다. 다음의 것은 어떤가?
a = c("alpha","bravo","charlie","delta") a[1]
흠, 아직도 잘 모르겠다. 위에서 소개한 '두번째의 복잡한 방법'이라는 것은 Alex Gorbatchev가 개발한 Syntax Highlighter는 아니다. 이것은 코드 블록을 둘러싸는 태그의 형태도 약간 다르다.

my $var = 123;
print STDERR $var, "\n";

실제 코드 블록을 둘러싸는 방법은 다음과 같이 하면 된다. 어느 방법을 쓰든 글 작성 중이나 미리보기에서는 최종적으로 어떻게 보이는지 알 수는 없다.


2018년 2월 15일 목요일

무엇이 옳은가

일제 강점기가 끝나고 군정치하에서 남한이 단독으로 정부 수립을 준비할 때 일제에 부역했던 많은 사람들에 대한 청산이 이루어지지 못했음을 우리는 잘 알고 있다. 이러한 불행한 잔재는 지금까지도 고스란히 남아서 한국 사회 곳곳에서 아직 해소되지 않은 갈등의 불씨가 되고 있다. 정부 수립 과정까지의 복잡하고 짧은 기간 동안의 모든 책임을 당시 군정을 책임진 미군에 물을 수는 없을 것이다. 그러나 바로 직전까지 한국을 지배했던 계급을 그대로 이용한다는 것이 미군 입장에서는 효율면에서 가장 적합해 보였었을지도 모른다.

선진국이 후진국이나 개발도상국을 지원하면서 그 나라를 현실적으로 통치하고 있는 독재 정권과 손을 잡은 사례를 우리는 어렵지 않게 찾을 수 있다. 만약 그 나라의 국민 대다수가 고통을 받고 있고 현 독재 정부를 타도하기 위해 투쟁을 하는 조직이 있다고 하자. 그러면 이 국가를 지원하고자 하는 외국은 어느 경로를 통해서 도움을 주어야 하는가? 독재 정권? 지하에서 투쟁하는 조직?

평창 올림픽을 맞아서 모처럼 남북한 사이에 긴장 완화의 기운이 느껴지고 있다. 우리나라를 찾은 북한의 고위급 인사들은 마치 연예인이나 유명인사처럼 언론과 대중의 관심을 받고 있고, 선정적인 취재거리를 찾는 기자들은 어떻게 해서든 뉴스 거리를 만들어내려고 지나칠 정도의 경쟁을 벌이는 듯하다. 분명히 의미가 있는 사건이지만, <'백두혈통' 김여정이 한국에 온다>는 기사 제목은 좀 불편하다.

어떻게 보면 현재 북한을 통치하는 사람들은 북한 민중들의 고달픈 삶에 대한 큰 책임이 있다(이 고통이 모두 미국의 경제재제 때문이라고 주장할 수도 있을 것이지만). 현재 북한의 정권은 반드시 붕괴될 것이고, 또 그렇게 되어야만 한다고 생각하는 사람들은 우리 정부가 북한의 통치 계급과 협조하는 듯한 모습을 보이는 것이 매우 잘못된 것이라고 - 심지어 역사에 죄를 짓는 것이라고 - 강하게 주장한다.

무엇이 옳은지 나도 잘 모르겠다. 한반도의 긴장 완화를 위해서 할 수 있는 다른 대안이 별로 없다고 느껴진다. 고립이냐 대화냐의 두 가지 선택이라는 단순한 문제로 환원시켜 놓고 생각해 본다면 현재의 북한 지도부와 대화를 모색하는 것이 그나마 나은 방법이라는 것이 나의 생각이다.

냉전과 분단 체제가 너무나 오래 지속되다보니 이 현상을 유지함으로 인하여 이익을 얻는 집단의 목소리가 점점 커지는 것도 사실이다. 이는 옳지 않다고 본다. 군사적 긴장감을 완화하고 상호 협력하는 관계로 나아가야만 한다. 어떤 형태의 통일이어야 하는가에 대해서는 많은 고민이 필요하다. 하지만 정치적 통합을 이루기 전에 문화·경제적으로 협력하고 동질감을 찾는 것이 시급하다고 본다.

언젠가 남북이 화해를 하고, 김정은이 과거 6·25 전쟁을 일으킨 것에 대해서 사과를 하게 된다면 정말 좋을 것이다. 그러나 그게 가능할까? 북한에서는 남한이 먼저 북으로 침공한 것으로 국민들을 가르쳐 왔는데...

이영건 선생님이 제작한 6J6 푸시풀 앰프 앰프를 주문하다

소리전자 판매장터의 자작품 장터 게시판을 구경하다가 이영건 선생님께서 올린 소출력 앰프 판매 글을 접하게 되었다. 마침 사무실 책상 앞에서 잔잔하게 음악을 을려줄 TDA7265-LM1876의 뒤를 이을 '세번째'의 앰프를 찾는 중이었고, 기왕이면 진공관 앰프라면 더욱 분위기가 있을 것이라고 생각하고 있었다. 최근에 올린 글(LM1876 앰프 개조요즘의 책상-Fi 풍경, JBL FE-M2125 스피커를 얻다)에서 볼 수 있듯이 결코 사치를 부리지 않는 수준에서(내 생각일 뿐) 상당히 다채로운 구성으로 음악을 들으며 일을 하고 있다. 여기에 앰프를 또 추가할 생각을 하는 것이다!

출처: 소리전자(으헉, 판매가 완료되자 사진을 내려버리시다니...)

이영건 선생님이 이번에 제작하여 판매하는 앰프는 쌍삼극관인 6J6 4 개를 이용한 푸시풀 앰프로서 판매 수량은 8 대이다. 레벨 미터가 있는 것과 없는 것이 준비된 상태였는데 밤 늦은 시간에 게시판에 글을 올렸음에도 불구하고 문의가 폭주하여 그 다음날 모두 팔리고 말았다. 나는 운좋게도 글이 올라온 직후에 발견하여 빨리 주문을 할 수 있었다.

최근 수년 동안 진공관 오디오가 다시 조금씩 인기를 얻고 있다. 출력이나 수치로 표현되는 여러 측정치들이 반도체 앰프에 비하여 결코 월등하다고는 할 수 없으나 이를 넘어가는 그 '무엇'이 분명히 존재한다. 무겁고, 가끔 진공관을 교체해야 하고(그렇게 흔한 일은 아니다), 열도 많이 나지만 말이다. 중국에서 제조된 염가의 키트 혹은 완제품을 알리익스프레스와 이베이를 통해 누구나 쉽게 구입할 수 있게 된 것도 이러한 추세에 불을 붙였다. 국내에도 많지는 않지만 진공관 앰프 제작자가 있다. 공장에서 대규모로 만들 수가 없는 물건이라서 큰 규모로 사업을 하기는 어렵겠지만 홈페이지를 구축하여 적극적으로 영업을 하는 사람이 있는가 하면 소리전자 판매장터를 통해서만 꾸준히 판매하는 사람도 있다. 그리고 제조자(판매자)와 소비자가 명확하게 구분되지 않는 것도 진공관 앰프의 특징이다. 자작이 비교적 용이하기 때문이다. 

이영건 선생님은 내가 알기로는 별다른 광고를 하지 않고 순전히 알음알음으로만 자작품 오디오를 팔고 계신다. 소리전자 판매 게시판에 이 선생님이 직접 판매글을 올린 것을 본 것도 이번이 처음이다. 매우 드물게 주문을 받는다는 글을 올려서 성황리에 제작 및 판매가 종료되면 글을 지우시는지도 모른다(근거: 2009년에 작성된 글 '그냥 오디오 잡설'). 이번 6J6 앰프처럼 믿기 어려운 파격적인 가격에 제작품을 판매하셔서 나 같은 사람이 얼떨결에 혜택을 입게 만드시기도 한다. 나의 첫번째 진공관 앰프(14GW8 싱글 엔디드 슈퍼트라이오드결선 앰프)도 이영건 선생님의 작품이었다(글 링크). 그러나 이 선생님이 가격대비 성능이 극도로 우수한 입문자용 진공관 앰프를 주로 만드시는 것은 절대로 아니다. 어찌보면 이것은 주머니 사정이 가벼운 사람을 위한 '선물'과 같은 것이고, 요즘에는 고가품 위주로 작업을 하고 있다고 들었다. 아무튼 나에게 진공관 앰프의 세계를 소개하고 이 선생님과의 인연을 만들어준 친구 K가 늘 고맙다.

나의 첫번째 진공관 앰프(2014년 초 구입).

2018년 2월 13일 화요일

왜 GenBank에 존재하는 일부 bacterial genome이 RefSeq에는 존재하지 않는가?

요즘 Paenibacillus genus에 속하는 균주의 comparative genomics 분석을 수행하면서 천랩의 EZBioCloud를 많이 참고하고 있다. 여기에서는 GenBank에 공개된 유전체를 가져다가 자체적으로 QC를 실시하여 특정 species로 할당된 genome을 제공한다. 간단하게 설명하자면 type strain(표준 균주)와 ANI 측면에서 같은 종으로 묶이는 자료를 그 종의 카테고리에 실어 놓는 것이다. 비록 GenBank에 제출하면서 부여한 original label이 Paenibacillus polymyxa strain=XYZ라 하여도 EZBioCloud의 QC 결과에 따라서 다른 species candidate(여기에서는 CP000154_s와 같은 'phylotype'으로 취급)에 넣게 되는 일도 벌어진다는 뜻이다.

이 작업을 하는 도중에 GenBank에는 존재하지만 해당되는 자료가 RefSeq에 없는 것을 세 건 발견하였다. 원칙적으로 NCBI에는 assembly accession에서 접두어(GCA: GenBank, GCF: RefSeq)만 달리한 두 레코드가 존재해야 한다. 다음의 자료는 이에 해당하는 RefSeq 자료가 없다. 아래에 표시한 것은 GenBank assembly에 대한 링크이다. 여기를 클릭해 들어가면 왜 그러한지를 짐작할 수 있다.

https://www.ncbi.nlm.nih.gov/assembly/GCA_001447315.1
Excluded from RefSeq:
  • many frameshifted proteins
RefSeq assembly accession: 
n/a


https://www.ncbi.nlm.nih.gov/assembly/GCA_001874405.2

RefSeq assembly accession: 
GCF_001874405.1 (suppressed)

https://www.ncbi.nlm.nih.gov/assembly/GCA_001874425.2
RefSeq assembly accession: 
GCF_001874425.2 (suppressed)

뒤의 두 자료는 단지 'suppressed'라고만 적혀있다. 어떤 자료가 suppress될 운명에 처하는 것일까? Prokaryotic RefSeq Genome Re-annotation Project에 그 설명이 있었다.

Suppressed genomes: Several hundred RefSeq bacterial genomes that did not pass assembly or annotation quality validation have been suppressed. An FTP report file listing the most recent suppressions will be provided soon in the RefSeq FTP site.

RefSeq FAQ 페이지에서도 상세한 설명을 볼 수 있다. Suppressed accession에 대한 상세한 정보는 두 달에 한번 배포되는 RefSeq release(2018년 2월 현재 release86)의 README 파일을 참조하라. NCBI의 자료를 편하게 다운로드하여 쓸 생각만 했지 accession이 바뀌거나 사라진(임시 혹은 영구적) 경우까지 감안해야 할 줄은 몰랐다. 제출자에 의한 update 이상의 일이 벌어지고 있음을 비로소 깨닫게 되었다.