2018년 1월 31일 수요일

[하루에 한 R] PhyloSift 결과 종합하기(merge 함수로 tab-delimited CSV 파일의 일괄 입력 및 병합 등)

Species boundary를 살짝 넘어가는 박테리아 유전체 50개 정도를 가지고 whole genome phylogenetic tree를 그려보고자 하였다. Harvest suite로 분석을 하면 MUMi distance cutoff에 미치지 못하는(default = 0.1) 몇 개가 빠져나가고, Roary로는 아예 core gene이 잡히질 않았다(뭘 잘못했나?). 상위 genus에서 폭넓게 분포하는 어떤 마커들의 분포(LS-BSR로 자료 생성)를 시각화하는 것이 목표라서 tree는 아주 정확할 필요가 없다. 다만 모든 샘플을 아우를 정도로만 윤곽을 잡아주면 된다.

16S rRNA gene sequence로는 해상도가 좋은 트리가 나오기 어려울 것이 자명하다. 그래서 택한 도구는 PhyloSift였다. 이 도구는 원래 shotgun metagenomic read로부터 phylogenetic distribution을 알아보기 위하여 개발된 것이지만, 단일 유전체 어셈블리로부터 universal marker(목록; 원래 40개였으나 실제로 쓰이는 것은 37개)를 찾아낼 수 있으므로 미생물 유전체 조립의 완성도를 평가하는데 쓰이기도 한다. 더욱 좋은 것은 alignment까지 된 상태의 서열이 생성되므로 이를 잘 이용하면 tree를 쉽게 그릴 수 있다. PhyloSift가 metagenome sample로부터 만들어내는 tree와는 다른 것이니 주의가 필요하다.

Bacillus_subtilis_168.fa라는 유전체 파일을 이용하여 PhyloSift를 실행했다고 가정하자(search 및 align mode). 그러면 PS_temp/Bacillus_subtilis_168.fa/ 아래에 alignDir 및 blastDir가 생기고, 그 하위에 각 마커에 대한 파일이 쌓인다. marker_summary.txt는 다음과 같이 생겼다.


각 유전체 서열마다 별도로 작성된 이 파일을 병합하여 정리하면 모든 마커가 전부 확인되었는지의 여부를 쉽게 알 수 있을 것이다. 오늘의 고행은 여기서부터 시작되었다. Perl을 사용하면 어떻게 해서든 결과를 얻을 수 있었겠지만, 왠지 R을 쓰고 싶었다. R을 이용하여 코드를 짜 놓으면 재사용성이 높을 것 같았기 때문이었다.

marker_summary.text file의 정리


각 유전체 서열에 대해서 별도의 디렉토리에 나뉜 marker_summary.txt 파일을 한 곳으로 모으되 균주명이 파일의 제목이 되게 바꾸었다. Shell script를 써서 다음과 같이 구현하였다(짧은 코드인데도 공부할 것이 많아서 2019년 3월 8일 설명과 함께 업데이트). 이 스크립트에서는 완벽하지 않다. 털어내야 할 FASTA 파일의 확장자(여기에서는 fasta)를 실제 상황에 맞게 바꾸어야 하고, 출력파일을 저장할 OUTDIR 환경변수를 미리 선언하고 해당 디렉토리도 만들어 두어야 한다. 그리고 for block의 처음에 나오는 <<<도 이해하기가 조금 어렵다. f 변수에는 aaa/bbb/ccc...라는 형태의 값이 저장되는데, 이를 슬래쉬로 구분한 다음 두번째 것인 bbb를 택하겠다는 의미이다. 만약 <<<쓰지 않으면 cut은 f 변수가 가리키는 파일의 내용을 대상으로 작업을 한다. 이 명령행은 FILE=$(echo $f | cut -d'/' -f2)로 바꾸 실행해도 완전히 동일한 결과를 낸다. 16s_reps_bac과 DNGNGWU* 마커에 대한 결과를 같이 출력하고 싶다면 egrep "16s_reps_bac|DNGNGWU" 명령을 써라.
FILES=`find $1 -name marker_summary.txt -type f | grep blastDir`
for f in $FILES
do
        FILE=$(cut -d'/' -f2 <<<$f)
        FILE=${FILE%.fasta}
#        cp $f ${OUTDIR}/${FILE}
        grep DNGNGWU $f > ${OUTDIR}/${FILE}
done
find로 찾아낸 파일명(경로 포함)은 다음과 같다. 빨강색 문자열만을 뽑아내는 것이 포인트이다. cut 명령을 사용하여 슬래쉬(/)를 기준으로 분리한 두번째 문자열을 취한 다음 뒷부분의 .fasta를 제거해야 한다.

PS_temp/Paenibacillus_sp._UNCCL52_GCF_000686825.1.fasta/blastDir/marker_summary.txt

오늘의 시도에서는 파일 내부를 grep으로 뒤져서 DNGNGWU...로 시작하는 표준 마커에 대한 결과만을 모았다. match가 없는 마커의 경우 0이 표시되는 것이 아니라 아예 summary file에 존재하지 않는다. 이것이 나중에 R에서 병합 작업을 하는 것을 약간 어렵게 하였다. 만약 모든 마커에 대한 결과가 다 있었다면, 마커의 순서가 동일한지만 확인한 뒤에 cbind()를 하는 것으로 쉽게 끝났을 것이다.

[R] for loop를 이용한 텍스트 파일의 일괄 입력 및 outer join


이러한 용도의 R 패키지가 이미 개발된 것이 있을지도 모르지만 되도록 R의 기본 기능을 충실하에 이용하여 구현하고자 하였다. 먼저 정리된 파일이 모여있는 디렉토리로 이동하여 R을 실행하였다. 다른 곳에서 R을 실행한 뒤 setwd() 함수를 실행하여 파일 위치를 지정하여도 좋다. 파일의 일괄 입력에서는 Import multiple files to R의 예제를 거의 그대로 따랐다.
list.filenames = list.files()
# 특정 확장자를 지닌 파일만 읽어들이려면 list.files(pattern="*.txt")
# create an empty list
list.data=list()
length(list.filenames)
# create a loop to read in your data
for (i in 1:length(list.filenames))
{
# 이중 대괄호 안에 인덱스를 넣어야 데이터프레임을 부르는 것이 된다.
list.data[[i]] = read.table(list.filenames[i],sep=",",header=F)
colnames(list.data[[i]]) = c("markers", list.filenames[i])
}
# 다음의 두 명령은 결과가 약간 다르다.
# 궁금하면 class() 함수를 써 보라.
list.data[1]
list.data[[1]]
# add the names of your data to the list
names(list.data) = list.filenames
# name으로 사용된 파일명에서 확장자를 제거하려면 방법을 따로 알아보아라.
다음으로는 데이터 프레임을 join해야 한다. 기준이 되는 컬럼은 markers이다. outer join을 하였으므로 값이 없는 경우에는 NA가 채워지고, 이는 나중에 0으로 채우면 된다. R에서의 join 혹은 merge에 대한 개념은 여기를 참고하였다. 국문 페이지로는 "[R Friend] R 데이터프레임 결합: rbind(), cbind(), merge()"가 매우 유용하다. merge 함수는 두 개의 데이터프레임을 대상으로 한다. 만약 인덱스로 접근 가능한 데이터프레임이 있는데 총 50개가 있다면 이를 어떻게 합치겠는가? 1번과 2번을 merge하여 임시 데이터프레임을 거쳐서 2번에 저장한다(한꺼번에 저장하는 것이 더 간단할지도 모른다). 그 다음 인덱스를 1 증기시키고 2번과 3번을 merge하여 3번에 저장한다. 이를 인덱스=(전체 데이터프레임 수 - 1)이 될 때까지 for loop를 돌린 다음 종료하면 된다.

# full outer join
for (i in 1:(length(list.filenames)-1))
{
df = merge(x=list.data[[i]],y=list.data[[i+1]],by="markers",all=TRUE)
list.data[[i+1]] = df
}
df = list.data[[length(list.filenames)]]
df[is.na(df)] = 0
rownames(df) = df[,1]
df = df[,-1]
colnames(df) = list.filenames
# 최종 확인
dim(df)
View(df)

View(df)의 결과 화면(일부).
첫번째 컬럼(markers)를 row name으로 전환하여 새로운 데이터프레임 df.2에 저장하자.
> df.2 = data.frame(df[,-1], row.names=df[,1])
> dim(df.2)  # 컬럼 수가 하나 줄어들었다.

결과 점검하기


단 하나라도 마커가 발견되지 않은 유전체는 어느 것일까? 또 어떤 마커가 발견되지 않았을까? 마커의 총 수가 37개라고 해서 컬럼의 합을 가지고 판단의 기준을 삼을 수는 없다. 왜냐하면 주어진 마커가 2회 발견되는 경우도 있을 수 있기 때문이다. apply()함수를 사용하면 이를 매우 쉽게 찾아낼 수 있다. 

각 row에 대해서 어느 하나라도 0이 존재하는지를 알아보자. 빨강색으로 표시한 마커가 TRUE를 나타내고 있다. 바로 저 row name만을 반환할 수 없을까?


> apply(df.2 == 0, 1, any) # row에 대하여
> apply(df.2 == 0, 2, any) # column에 대하여
위 명령어를 입력한 다음 눈으로 찾을 수는 없는 노릇이다. 정답은 다음과 같다.
> rownames(df.2)[apply(df.2 == 0, 1, any)]
[1] "DNGNGWU00040"
> colnames(df.2)[apply(df.2 == 0, 2, any)]
[1] "Paenibacillus_polymyxa_TD94_GCF_000520775.1"
오늘 하루가 다 지나갔다! 데이터프레임에서 특정 조건을 만족하는 서브셋을 추출하는 것도 중요하지만, 그 조건에 만족하는 column 혹은 row의 이름을 알아내는 것도 중요하다. 

2018년 1월 30일 화요일

또 진공관 앰프?

<성장 없는 번영>이라는 책을 다 읽고 나니 '소비'라는 행위를 뒤돌아보게 되었다. 우리 주위에는 '제발 나를 쇼핑해 달라고' 외치는 갖은 유혹이 얼마나 많은가? 이제는 필요에 의해서 구입을 하는 것이 아니라 이것을 가짐으로 인해서 내 삶이 과시적으로 업그레이드된다는 욕구를 채우기 위하여 구입을 한다. 그 과정 중에 생태계는 자꾸 무너진다. 별도의 독서 기록에서 다루겠지만, 모든 지구 상의 나라가 현재의 미국인처럼 소비할 수 있는 날은 오지 않을 것이다. 이에 대한 대안을 찾자는 것이 이 책의 주제이다.

그럼에도 불구하고 마우스 포인터는 이미 온라인 쇼핑 사이트를 뒤적거리고 있다. '무엇을 살까?'는 고통스런 고민을 하면서 계속 서치를 하는데 들어가는 비용은 어쩌면 일단 무엇인가를 지르는 비용보다 더 클지도 모른다. 그러니 너무 오래 고민을 반복하지 말고 일단 구매를 하자. 이러한 경제적인 자기 합리화를 해 가면서 뭔가를 샀다고 치자.

또 얼마간의 시간이 지나면 커피 찌꺼기에서 곰팡이가 피어나듯(요즘 집에서 늘 겪는 문제) 새로운 욕구는 또 생겨날 것이다.

그래... 웹 서칭이 무슨 큰 잘못이랴. 근무 중에 지나치게 다른 사이트를 들락거리는 것은 물론 옳지 않다... 일단 조사만 해 두자. 중국제 저가 앰프(자작용 키트를 포함하여)를 둘러보면 어떤 유행과 같은 것이 보인다. 일년 전에 잔뜩 쏟아져나온 물건은 어느덧 사라지고 또 새로운 트렌드의 물건이 목록을 차지한다. Class D 앰프가 그랬고, JLH 1969년 class A 앰프가 그러했다.

진공관만으로 이루어진 채널당 3 W 남짓의 그저 그런 앰프는 내가 보유한 저능률 스피커 시스템을 만족스럽게 울리기 어려울 것이다. 그렇다고 하여 출력이 약간 큰 저가의 앰프를 고르면 집에서 2014년 이래 아주 잘 쓰고 있는 12DT8 + 14GW8(=PCL86) 앰프(링크)보다 결코 나을 수가 없을 것이다. 그래서 진공관 프리앰프 + IC를 이용한 이용한 hybrid amplifier를 찾아보았다. 하이브리드 앰프라 하면 요즘 Nobsound의 MS-10D가 단연 인기이다. '진공관은 단지 장식용이다! 아니다, 진공관을 빼면 소리가 안난다! 트랜스 커버를 벗기면 아무것도 없다!' 등 여러 논란에 휘말린 앰프인데 일단 모양새는 그럴싸하다. 게다가 아날로그식 레벨 메터까지 있으니 보는 재미는 좋을 것이다. 처남이 얼마전에 주문을 했다는데 배송이 완료되었는지 궁금하다.



아래에 소개한 앰프 키트는 전부 6J1 진공관(교체관 정보)과 LM1876T를 사용한 것이다. 위의 것은 헤드폰 단자도 갖추고 있다.

인터넷에서 '무단으로' 그림을 퍼 온 뒤에 글씨를 달았다. 그림의 URL을 연결하는 방식으로 블로그에 소개하고 싶었지만(이것도 무단사용에 해당할까?) ebay 등의 상품 주소는 판매기간이 종료되면 더 이상 유효하지 않은 것 같다. 굵은 글씨로 표시한 키워드를 이용하여 검색하면 어떻게든 찾을 수 있다.

아아, 집에도 앰프가 세 개, 사무실에도 세 개나 있는데 뭘 또 만들고 싶어서 이런단 말인가?

2018년 1월 27일 토요일

독서 기록 - <나를 믿어주는 한 사람의 힘> 외 네 권

이번에는 대출 기한을 일주일 연장했음에도 불구하고 대출한 책을 다 읽지 못하였다. <처음 읽는 일본사(전국역사교사모음 지음)>, <불평등의 역사(발터 샤이델 저|조미현 역)>, 그리고 <스트레스는 어떻게 삶을 이롭게 하는가(우르스 빌만 저|장혜경 역)>는 다음 기회에 꼭 읽도록 한다.

사진 퀄리티가 영 좋지 못하다. 거실 바닥에 놓고 찍으면 조명이 늘 문제다

나를 믿어주는 한 사람의 힘

  • 부제: 문화치유전문가 박상미의 인생특강
  • 박상미 지음(더공감 마음학교 링크)
나를 믿고 지지해주는 한 사람의 힘으로 인하여 풍성한 삶을 이어나가는 10 인을 심층 인터뷰하고 쓴 책. '시련을 극복한~', '성공한~' 이라는 수식어를 붙이는 것은 적당하지 않다. 이 척박한 세상에 향기를 드리우며 다른 사람에게 좋은 영향력을 미치는 풍성한 삶을 누리는 사람이라고 하면 딱 좋을 것이다. 참여한 사람은 김혜자, 박동규, 이병복, 표재순, 신경림, 인순이, 황현산, 조벽, 김현영, 그리고 섀넌 두나 화이트. 맨 마지막은 저자 박상미가 자신을 인터뷰하는 형식으로 마무리하였다. 문학평론가 황현산이 현명한 어른이 되는 길에 대하여 말한 것을 인용해 보았다.
나이가 들수록 듣는 연습을 해야 하고, 토론을 해야 합니다... 배우기를 멈추지 말고 참신하게 생각하도록 노력해야 합니다. 가장 중요한 게 책을 읽는 것입니다... 나보다 어린 애들이 쓴 글이라고 생각하는 순간 문제가 시작됩니다... 나이의 향기를 풍길 수 없는 사람들이 나이의 권력을 탐하는 것 같다(박상미) 
교수법 전문가 조벽 교수는 이렇게 말했다
(부부가 이혼에 이르는 가장 큰 문제는) 바로 '말'입니다... 멀어지는 말이 상대의 마음을 아프게 해서 마음 문을 아예 닫아버리게 하죠... 그 말에 네 가지 독이 존재해요. '비난, 경멸, 방어, 담 쌓기'라는 독이에요... 이 독을 마음에 품는 순간 얼굴에 다 나타난대요.

어떻게 바꿀 것인가

  • 부제: 비정상 정치의 정상화를 위한 첫 질문
  • 강원택(서울대 정치외교학부 교수) 지음
긴 고난의 터널을 뚫고 대한민국 민중은 드디어 5년 단임 대통령제를 핵심으로 하는 1987년 체제를 탄생시켰다. 그러나 이제는 강력한 리더십을 지닌 슈퍼맨 대통령에게 강력한 힘을 위임하는 것으로 더 이상 국가의 변혁이 어려움을 설파하고, 제도적 대안으로서 내각제를 주장한 책이다,

미래중독자(The Invention of Tomorrow)

  • 부제: 오늘을 버리고 내일만 사는 별종, 사피엔스
  • 다니엘 S. 밀로 지음
  • 양영란 옮김
"내일 보자!" - 인류가 떠올린 가장 혁명적인 문장.
인류는 '과잉'의 시대에 살고 있다. 저자 역시 인간 사회에 만연한 과잉에 대한 '과잉된 강박'을 가지고 있다고 한다. 정속 주행은 퇴보로 여기고 '가속도'를 추구하는 것이 인간의 본성이 아닐까? 왜 5만 8천년 전 호모 사피엔스는 별안간 아프리카를 떠났을까? 이것은 바로 인간이 발명한 '내일' 때문이라는 것이다. 유발 하라리가 주장했듯이 추상적 개념·상상력이 인류의 협동을 이끌어내어 현재의 문명을 만들어냈다는 것과도 일맥상통한다. 저자의 말에 의하면 이 '빌어먹고도' 찬란한 내일에 중독된 것이 인류이다. 내일을 위해 기꺼이 오늘을 포기하는 유일한 생명체가 인간이다. 기대는 곧 불안·와 동전의 양면과 같은 관계가 아닐까?

현대미술은 처음인데요

  • 부제: 큐레이터가 들려주는 친절한 미술 이야기
  • 안휘경, 제시카 체라시 지음
  • 조경실 지음
예술가의 똥(Artist's Shit; Merda d'artista; 피에로 만초니, 1961)

어떠한 작품이 현대미술인지 아닌지를 구분하는 기준은 단순한 시간이 아니라 작품의 기준이 무엇이냐에 따라 달려 있다. 현재라는 순간을 해석하는 작업은 좀처롬 쉽지 않고, 현대라는 사회를 이해하는 일 역시 혁신적인 기술과 새로운 접근방식을 요구한다(30 쪽). 

화장실에서 흔히 볼 수 있는 기성품 변기를 가져다가 작가의 사인만을 추가한 마르셀 뒤샹의 샘('Fountain', 위키피디아)을 현대미술의 시작으로 보는 견해도 있다. 하지만 이는 '세계 3대 기타리스트'라는 식으로 지나친 단순화라고 생각한다. 현대미술의 이단아 마르셀 뒤샹의 "샘"이야기(링크)를 읽어볼 것을 권한다.

작품은 사라지고 알프레드 스티글리츠가 찍은 사진과 복제품만 남았다.

때로는 어떤 작품은 미적 가치보다 아이디어, 정치적 관심, 감정의 자극으로 주목을 받을 수도 있다(31쪽).
작가 혼자서 공들여 만들여야만 작품이 되는 것이 아니다. 현대 미술은 이미 여러 스태프에 의해 구현되는 것이 일반적이며, 심지어 개념만으로도 작품이 되며, 퍼포먼스 아트도 이미 흔하다. 다음에 현대미술관을 방문하게 되면 좀 더 열린 마음으로 편안하게 감상을 할 수 있으리라 기대해 본다. 현대미술은 항상 변화하고 있는 현대를 보여주는 것이다. 중요한 것은 작품이 아니라 작가이다.

99%를 위한 경제학

  • 부제: 낮은 곳을 향하는 주류 경제학 이야기
  • 저자: 김재수(미국 인디애나퍼듀대학 경제학과 교수) 허핑턴포스트의 김재수 블로그 글목록 링크
보이지 않는 손, 비교우위, 기회비용, 비용-편익 분석, 경제적 인센티브에 반응하여 행동하는 인간... 우리가 알고 있는 주류 경제학은 단지 상위 1%를 위한 것이 아니었을까? 시장은 '기업'과 동의어가 아니다. 시장이 올바르게 작동하려면 모든 경제적 판단을 위한 정보가 전부 투명하게 공개된 상태에서 공정한 경쟁이 이루어져야 한다. 
"우리는 인센티브를 믿사오니, 공공부문과 정부규제에 고난을 받으사 복지 예산에 못박혀 죽으시고, 민영화와 규제완화를 통해 다시 살아나시며, 산 기업과 죽은 기업을 심판하러 오시리라. 성과급을 믿사오며 부자감세와 기업 프렌들리 정책의 효과가 서로 교통하는 것과 영원히 경제성장이 이루어지는 것을 믿사옵나이다. 아멘."(129쪽)
자유시장경제에 대한 옹호·세계화의 파도에 휩쓸려 경제적 약자인 을('乙')의 위치는 날이 갈수록 열악해져만 간다. 효율성을 추구하기 위해 어쩔 수 없다는 논리와 함께 이들은 계속 나락으로 떨어져만 간다. 뭔가 잘못되었다고, 권력과 결탁한 거대 기업의 편이 되어서는 안된다고 주장하고 싶지만, 아직도 주변에는 "박정희 대통령 덕분에 우리가 이정도 먹고 사는거야"라고 소리치는 사람들이 많다.
선택이 야기하는 기회비용을 본다는 것은 경제학도가 반드시 지녀야 할 반골 정신을 의미합니다. 권력과 권위, 또는 관습에 의해 당연하게 여겨지는 것들에게도 잃고 있는 것을 찾아내야 합니다.(11-12쪽)
이번에 읽은 다섯 권의 책 중에서 가장 울림이 큰 책이었다. 

소화전함이 수령한 택배 배달 물건

집에 사람이 없을 때 아주 가끔 소화전함에 물건을 넣어두었다는 문자 메시지를 받을 때가 있다. 바쁜 택배 기사들의 입장을 생각하면 이해하지 못할 일은 아니지만 물건이 없어진 경우 책임 소재의 문제가 따른다. 만약 나쁜 마음을 먹은 사람이 아파트에 들어와서 고층부터 소화전함을 훑으면서 한번씩 다 열어본다면 수십 대 일의 가능성으로 주인을 기다리는 물건을 훔쳐갈 수도 있는 것 아니겠는가? 수령 예정자가 소화전함에 넣어 두는 것을 동의했다고 해서 배송 기사에게 아무런 책임이 없을까?

배송기사: OO택배입니다. OOO님 지금 댁에 안계신가요?
수령인: 네, 지금 집에 없으니 소화전함에 넣어주세요.
배송기사: 그건 규정 상 안됩니다. 부재중이시면 경비실에 맡기거나 내일 다시 오겠습니다.
수령인: 에이, 뭐 별 일 있겠어요. 없어지면 제가 책임질테니 그냥 소화전함에 넣어주세요.

만약 이런 대화가 오갔다면 배송기사의 책임이 없을지도 모르겠다. 법을 다루는 사람들의 해석은 어떨지 모르겠지만 말이다.

오늘 아침, 오후 5~7시 사이에 주문한 케이블이 배송될 예정이라는 메시지를 받았다. 잠시 외출하였다가 집에 돌아온 것은 3시 정도. 침대에서 졸다가 5시쯤 문자 메시지를 받았는데, "소화전"께서 인수를 했다는 내용이었다. 다른 전화 연락은 일절 받은 것이 없었고 심지어 초인종도 울리지 않았다.


우리 아파트는 지은지 오래되어서 인터폰이 고장난 곳이 대다수이다. 인터폰을 걸어보다가 받지 않았다면 최소한 집 전화나 휴대폰으로 연락을 하면 되고, 집까지 와서 문 옆의 소화전에 물건을 넣을 시간이 있었다면 차라리 초인종을 한 번만이라도 눌러보는 것이 더욱 자연스럽지 않겠는가.

인터넷으로 찾아보면 이런 경우가 워낙 많아서 특별히 불만을 표시할만한 일도 아닌 것 같고, 그냥 문 앞에 방치하고 간 것에 비하면 훨씬 나은 상황인 것은 분명하다. 그렇다 해도 약간은 아쉬움이 남는다. 아래 사진은 오늘 받은 물건이다. 사무실에서 USB DAC <-> (진공관 프리앰프) <-> TDA7265 앰프 사이를 연결하기 위한 15 cm짜리 짧은 케이블이다.


낮 시간에는 아내가 필요한 홈패션 부자재를 사러 시내 재래시장에 나갔었다. 시장 안에 있는 분식집에서 호떡을 주문하고 만들어지기를 기다리고 있었는데, 주인 아주머니께서 허리춤으로 와플을 담은 바구니를 건드려서 이를 바닥에 떨어뜨렸다. 난 떨어뜨렸으니 이건 못팔겠다고 할 줄로만 알았다. 그렇게 말하고 나서 우리가 떠난 뒤 이를 모르는 다음 손님에게 판매한다고 해도 어쩔 도리는 없다고 생각했다. 그러나 아주머니께서는 아주 태연하게 와플을 다시 바구니에 담았고, 새로 구운 와플과 함께 진열대에 올려놓는 것 아닌가.

글쎄, 이 광경을 전부 목도하였으니 투철한 소비자 정신에 입각해서 뭐라고 항의했어야 할까. 가장 소극적인 항의는 다음부터 이 분식점에 가지 않는 것이겠지만, 난 특별히 뭐라 하지는 않고 묵묵히 호떡을 들고 그곳을 나왔다.

약간의 아쉬움이 묻어나는 하루였다.

2018년 1월 26일 금요일

NCBI에서 대량의 미생물 유전체 정보 다운로드하는 요령 - 업데이트

몇 번에 걸쳐서 유전체 정보의 일괄 다운로드(전체 혹은 선별된 것) 방법을 블로그에 작성한 적이 있다. 항상 일정한 위치에 업데이트된 상태로 존재하는 assembly summary 파일을 받아서 선택한 유전체의 FTP 주소 base를 얻어낸 다음 이를 wget이나 curl로 내려받는 것을 기본으로 하였다. 좀 더 편리한 방법은 없을까? 검색을 해 보니 ncbi-genome-downlaod라는 파이썬 패키지가 보인다. 이를 오늘의 블로그 포스트 뒷부분에 소개하기로 하고 우선은 NCBI Genome Download (FAQ)를 오랜만에 읽어보았다.

2번 항목(대용량 데이터 셋의 다운로드에 가장 좋은 프로토콜은 무엇인가?)를 살펴보니 rsync를 최우선적으로 권고한다고 하였다.  그 다음은 HTTPS이고, FTP는 가장 나중이다. 솔직히 말해서 wget과 curl의 차이도 잘 모르는 부끄러운 연구자라서 이 정보는 매우 새롭게 느껴졌다. [curl 대 wget] 어느 프로그램이 더 좋을까?를 읽어보는 것도 좋을 것이다.

RefSeq의 complete bacterial genome을 다운로드하는 방법은 15번 항목에서 설명하였다. 오늘 날짜의 bacteria assembly summary file(링크) 무려 31 메가바이트가 넘으며 라인 수만해도 104,704이다! FAQ 페이지에서는 12번째 컬럼에서 최신 어셈블리 여부("latest")를 확인할 수 있다 하였는데, 실제 파일을 열어보면 모든 자료가 latest이다.

ncbi-genome-download(NCBI Genome Downloading Scripts)는 PyPIGitHub에 전부 존재한다. 이 스크립트의 아이디어는 Mick Watson의 Kraken downloader script에서 아이디어를 "훔쳤다"고 솔직하게 고백하였다. 몇 가지 사용례를 살펴보자.
$ ncbi-genome-download bacteria
$ ncbi-genome-download bacteria,viral
$ ncbi-genome-download bacteria --parallel 4
$ ncbi-genome-download --section genbank fungi
대단히 단순명료하다. 이렇게 가려운 곳을 긁어주는 스크립트가 도처에 널려있으니 얼마나 고마운지 모르겠다. 남이 만들어 놓은 도구를 갖다 쓰기만 할 것이 아니라 나도 뭔가 사회에 기여를 해야 하는데 늘 부족하기만 하다. 

2018년 1월 23일 화요일

Adaptive mutations in bacteria

제목을 써 놓고 보니 덜컥 겁이 난다. 내가 과연 이 어려운 제목에 합당한 블로그 포스팅을 성공적으로 마칠 수 있을까? 나 자신이 과연 이 개념을 제대로 이해하고나 있을까? 결국은 '진화'라는 주제로 접근해 가야 하는데, 모든 자연과학의 역사에서 가장 지대한 영향을 미쳤음에도 불구하고 아직까지도 잘못 이해되고 있는 진화라는 개념의 지지자로서 내가 과연 제 역할을 할 수 있을까?

돌연변이란 DNA의 염기(서열)이 여러가지 요인에 의하여 원본(즉 부모)과 달라지는 것을 의미한다. 따라서 후손으로 전파 가능하여야 하고, 이것이 반드시 표현형으로 나타남을 의미하지는 않는다. 돌연변이는 세포 혹은 개체 수준에서 일어나지만, 진화는 집단에 대하여 적용되는 개념이다. 돌연변이는 진화의 가장 중요한 원동력이지만 유전적 부동(genetic drift), 선택(positive or negative)을 거쳐서 집단 안에서의 특정 유전자형을 지닌 개체의 빈도가 변화했을때 비로소 진화가 일어났다고 이야기할 수 있을 것이다.

진화를 설명하는 최초의 이론은 라마르크의 용불용설(用不用說, Lamarckism, Lamarckian inheritance, theory of use and disuse)이다. 획득형질은 유전되지 않는다는 것이 밝혀지면서 현재 라마르크주의는 더 이상 받아들여지지 않는다. 그러나 요즘의 후성유전학 연구에 의하면 어미의 경험이 자손으로 전해지는 흥미로운 결과가 종종 발표되는 것 같다.

진화를 공부하고 싶다면

아래의 링크는 앞으로 계속 업데이트할 생각이다. 이 글에서는 주로 박테리아의 돌연변이와 진화에 한정하여 논할 것이다.

적응진화(adaptive mutation)이란 무엇인가?

돌연변이는 무작위적으로 일어나고, 이 중에서 환경에 의해 선택되는 것만이 살아남는다는 것이 현대 진화학의 핵심 기념일 것이다('Mutation precedes selection'). 그런데 유독 박테리아는 아무리 열악한 환경에 가져다 놓아도 살아남는 돌연변이체가 만들어진다. 그래서 미생물처럼 단순한 생명체는 환경에 맞는 돌연변이를 스스로 만든다는 믿음이 널리 퍼져 있었다. 이를 부정한 유명한 실험이 바로 1943년에 발표된 루리아와 델브뤽의 fluctuation test이다(위키피디아). 이 실험의 결론은 선택압(이 경우에는 phage T1의 감염)이 존재하기 이전에 이미 내성 돌연변이체가 존재한다는 것이었다. 그 내성 돌연변이는 무작위적으로 생긴 것으로서 미생물 세포가 설계하거나 선택한 것은 전혀 아니라는 뜻이다.

그럼에도 불구하고 미생물의 adaptive mutation, 즉 세포가 분열을 하지 못할 극한 상황에서도 이에 맞추어어진 돌연변이가 생겨난다는 가설을 입증하는(것처럼 보이는) 결과가 이따금 발표되었고, 1988년 John Cairns가 이 문제를 학계로 가지고 올라오면서 본격적인 논쟁이 시작되었다(The origin of mutants. Nature 1988). Cairns는 세포가 환경에서 살아남을 수 있는 유용한 돌연변이를 골라낸다고 주장하였다. 항암제에 내성을 지니는 변이 암세포가 생겨나는 것도 adaptive mutation 현상 중의 하나로 보고 있다.

Adaptive mutation을 현대적인 용어로 정의한다면 (1) 선택 과정에 놓여서 분열을 하지 못하는 미생물 집단으로부터 새로운 돌연변이 개체가 계속 만들어져서 성장하는 현상 또는 (2) nonlethal selection 조건 하에서 선택압을 낮출 수 있는 변이 개체가 생거나는 과정(선별되지 못하는 돌연변이 개체가 생기는지의 여부는 관계없이)이라고 말할 수 있다. 좀 더 완곡하게 표현한다면 stationary-phase mutagenesis라고도 부른다. Fluctuation test에서는 가해진 선택압이 정상 세포에게는 치명적인 것이라서 이들을 전부 죽여버리므로, 선택압이 존재하는 조건에서 변이체가 생겨나는 것을 관찰하는 것 자체가 차단되었다. 따라서 nonlethal selection이라는 조건이 중요한 것이다.

Adaptive mutation이 실제로 존재하는지를 완벽하게 증명한 사례는 아직 없는 것 같다(내가 문헌 조사를 철저하게 하지 못해서 빚어진 오해일지도 모른다). 대신 세포분열이 불가능한 조건에서 돌연변이체의 발생 빈도가 높아지는 몇 가지 메커니즘이 밝혀졌다. 이것조차 미생물이 진화를 통해서 선택한 생존 전략이라면 결국 adaptive mutation은 실재하는 것이 아니냐고 부르짖을 수도 있겠다. Patricia L. Foster는 2000년도 논문을 통해서 대장균 FC40 스트레인에서 발견되는 메카니즘을 다음의 세가지로 정리하였다(Cold Spring Harb Symp Quant Biol 65:21 PubMed; Bioessay 22:1067 PubMed).

Recombination-induced DNA replication

The placement of genes on a conjugal plasmid

A transient mutator state

이 연구 내용은 추후에 Roth가 더욱 상세하게 리뷰하였다(Origin of mutations under selection: the adaptive mutation controversy. Ann Rev Microbiol 2006 PubMed). 상세한 내용은 문헌을 참고하면 된다.

대장균 FC40은 염색체의 lac operon에 결실이 있는 반면 이를 F episome에 갖고 있는데, lacZ +1 mutation이 있어서 lactose minimal 배지에서는 자라지 못한다(Lac- phenotype). Nonselective condition에서는 1 per 109 cells per generation 정도의 빈도로 Lac+ revertant cell이 발생한다. 그런데 Lactose minimal medium에서는 1 per 109 cells per hour로 수일 동안 지속해서 발생한다. 물론 이 revertant는 이미 만들어진 Lac+ cell이 자체 분열을 통해서 늘어난 효과는 보정한 것으로 생각한다.

그림 출처: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2929355/

신개념 - Retromutagenesis

선택압이 주어져서 정상 세포는 분열을 하지 못하는 상황을 가정해 보자. DNA의 한쪽 가닥에 발생한 돌연변이가 안정적으로 후대로 전파되려면 어떻게 해서든 최소한의 cell growth가 일어나야 한다. Retromutagenesis는 이를 설명하는 멋진 메커니즘이다(유일한 제안은 아니다). NTG 처리(adenosine -> hypoxanthine) 혹은 산화(guanosine -> 8-oxoguanosine)로 인하여 손상된 유전자로부터 변이 단백질이 만들어져서 변이 유전자가 daughter chromosome으로 복제될 정도의 최소한의 growth가 일어난다는 것이다. 이 현상은 1994년 Bridges가 처음 보고하였으며(Starvation-associated mutation in Escherichia coli: a spontaneous lesion hyporthesis for "directed" mutation. Mutat Res 1994, PubMed), Morreall 등이 보다 정교한 실험을 실시하였다(Evidence for retromutagenesis as a mechanism for adaptive mutation in Escherichia coli. PLoS Genetis 2005, PubMed). Retromutagenesis에서는 변이 단백질의 발현이 선행되어야 하며, transcribed strand에 일어나는 돌연변이가 결과적으로 더 많이 남게 됨이 당연하다.

Transcription bubble에서 노출되는 가닥은 non-transcribed strand이다. 여기에 존재하는 C가 탈아미노화를 거쳐서(ds DNA에 비하여 140배 높다) T로 돌연변이가 된다는 것은 이미 잘 알려져 있으며(Transcription-induced mutations: increase in C to T mutations in the nontranscribed strand during transcription in Escherichia coli. Proc Natl Acad Sci USA 1996, PubMed), tretromutagenesis와는 다른 논지의 이야기이다.

Moreall 등의 실험을 좀 더 자세하게 알아보자. 이들은 LacZ(Am) 돌연변이 세포주를 이용하였다. Amber mutation은 coding (non-transcribed) strand(NTS)에서는 TAG, transcribed strand(TS)에서는 ATG이다. 아질산(nitrous acid, HNO2)은 A에 작용하여 hypoxanthine을 만드는데, 이는 C와 결합을 한다. 따라서 한 라운드의 DNA 복제를 거치면 A:T -> G:C의 transition mutation이 일어난다. 따라서 NTS와 TS의 어느 가닥이 아질산에 의해 수식되는가에 따라서 초래되는 돌연변이가 달라진다. 이것은 DNA sequencing으로 금방 알 수 있다.  즉 NTS에 변이가 일어나면 TGG가 생기는 반면 TS에 변이가 일어나면 CAG가 생긴다. 저자들은 이 LacZ(Am) 돌연변이 대장균을 포도당이 첨가된 LB에서 포화상태까지 키운 다음 세척하여 starvation 상태로 만든 뒤 아질산을 첨가하였다. 그 다음 일부는 락토스 최소 배지에 직접 도말하고, 또 일부는 LB에서 잠시 키운 뒤 락토스 최소 배지에 도말하였다. 각 평판 배지에서 약 48시간 가량 키운 후 생성되는 Lac+ revertant의 lacZ 유전자를 시퀀싱하여 원래 있었던 amber 돌연변이가 CAG와 TGG 중 어느 것으로 더 많이 변했는지를 측정하였다.

왜 첫번째 단계에서 LB에 포도당을 첨가하였을까? 저자들은 사전 단계에서는 보통의 LB 배지를 사용하였다. 아질산을 처리하였을 때 Lac+ revertant의 발생 비율은 20배 상승하였다. 이 중에서 30개의 Lac+ revertant 콜로니를 채취하여 염기서열을 해독하였더니 전부 NTS에서만 변이가 발생한 것이었다. 원래 만들고자 했던 실험 조건은 양 가닥에 균등하게 변이가 발생하도록 하는 것이었다. 이에 대해서는 Davis의 연구결과(Transcriptional bias: a non-Lamarckian mechanism for substrate-induced mutations. Proc Natl Acad Sci USA 1989, PubMed)로 설명이 가능하다. Transcription bubble에서 single strand 형태로 노출된 NTS는 DNA에 손상을 주는 물질에 좀 더 민감하다는 것이다. 이론적으로는 rich medium에서 키웠었으니 lac operon이 발현되지 않았어야 하지만, 실제 세계에서는 그렇지 못했다. 따라서 강한 catabolite repression이 유지되도록 일부러 포도당을 넣어주게 된 것이다. 이렇게 하였더나 NTS에서 revertant가 더 많이 발생하는 편향이 사라졌다.

확정된 실험 계획에 따라 아질산을 가해서 돌연변이를 유발한 뒤 rich medium에 잠시 배양했다가 lactose selective medium으로 옮겨서 생성된 Lac+ revertant에서는 CAG와 TGG가 거의 동일한 수준으로 나타났다. lacZ 유전자가 발현될 기회가 없었으므로 양 가닥에 발생한 손상이 배양을 거치면서 모두 공평하게 염기의 변이로 정착된 것이다. 그런데 돌연변이 유발 직후 lactose selective medium으로 옮긴 경우에는 어떠했는가? CAG가 압도적으로 많았다. 다시 말하자면 TS에 더 많은 변이가 발생한 것이다. 이를 그림으로 설명하면 다음과 같다.

http://journals.plos.org/plosgenetics/article?id=10.1371/journal.pgen.1005477
아직 이 논문을 discussion 끝부분까지 철저하게 읽은 것은 아니라서 transcription-associated mutagenesis(transcriptional mutagenesis와는 구별해야 함)와는 어떻게 다른지, 실험 결과의 다른 해석이 가능하지는 않은지 등은 이 포스팅에서 충분히 다루지 못하였다. 결론으로는 환경이 돌연변이를 맞춤 생산하는 것 같지는 않다는 것이다. 2015년 이 논문의 발표 당시 Science Daily에 이를 소개하는 기사가 실렸었다.

Adaptive mutation mechanism may explain some forms of antibiotic resistance.
Retromutagenesis: Mutation occur in RNA first (2015년 8월 25일 링크)

그런데 이 기사에서는 돌연변이가 RNA에서 먼저 일어난다고 해석을 붙였다. DNA에 일어난 lesion(아질산에 의해 adenosine이 hypoxanthine으로 변한 것)을 주형으로 하여 전사가 일어날 때 RNA에 U 대신 C가 들어간 현상을 돌연변이라고 표현한 것이다. Discussion 둘째줄을 인용해 보자.
Retromutagenesis requires that RNA polymerases bypass lesions in DNA and incorporate mutations analogous to those caused DNA polymerase bypass.
Hypoxanthine은 원래 C와 염기쌍을 이루는 것으로 배우지 않았던가(링크)? RNA polymerase가 template의 hypoxanthine에 대응하여 C를 넣는 것을 왜 bypass라고 표현하는지 잘 모르겠다.

이 PLoS Genetics 논문은 2018년 1월 23일 현재 4회 인용되었다. 생각만큼 널리 관심을 끄는 주제는 아닌가 싶다.

맺음말


기회가 된다면 이 포스팅은 앞으로도 계속 수정 및 업데이트를 거치게 될 것 같다. 다음에 소개할 논문은 Generation of mutation hotspots in ageig bacterial colonies(Sci Rep 2016, PubMed)이다.

업데이트 이력: 2018년 1월 24일, 1월 25일.

감각은 간사하다

왜냐하면 새롭고 참신한 것에 쉽게 빠져들기 때문이다. 그래서 과거부터 믿고 아껴오던 것을 쉽게 내치는 결과를 낳는다. 그래봐야 '한계효용체감의 법칙'에 따라서 다시 평상시와 다름없는 만족도 수준으로 돌아가게 된다. 그것이 인간의 신경 회로가 돌아가는 원리이다.

진공관 앰프에 잘 어울리는 풀레인지 스피커라는 것에 관심을 가지면서 한동안 수준 이하의 스피커 시스템 제작 또는 개조에 몰두를 했었다. 그러다가 JBL의 2-way speaker FE-M2125(JBL이라는 상표에 너무 가치를 부여할 필요는 없을 것이다)를 얻게 되면서 이 스피커가 들려주는 산뜻한 고음에 귀가 반응하기 시작하였다. 사무실에서 듣는 주력 스피커를 바꿔치기해야 되겠다는 간사한 생각이 드디어 들기 시작한 것이다. 보나마나 며칠이 지나면 이러한 산뜻한 소리에 대한 감동도 점차 줄어들 것이 분명하겠지만.

집에서 CD 전집 - BEST RUSSIA CLASSICS GOLD (100장; 예전 블로그 링크) - 을 들고 출근하여 열심히 리핑을 하고 있다. 광학드라이브가 과열될까봐 조금씩 쉬어가면서 CD를 넣는 중이다. 이 전집의 가격은 요즘 더욱 떨어져서 예스24에서 39,000원에 팔린다.

오른쪽 스피커는 이제 퇴출인가?
JBL 스피커 시스템은 책상 위에 직접 올려놓기에는 약간 버거운 크기라서 배치 방법에 대해서는 좀 더 고민이 필요하다.

자신의 의견을 분명히 말하는 것이 중요한 세상을 살고 있다. 그런데 요즘 심리학과 관련한 책을 조금씩 읽으면서 이런 질문을 갖게 된다.

너는 무엇을 원하느냐?

이것이 아니다. 내 마음은 다음과 같은 배배꼬인 질문을 던진다.

너는 무엇을 원한다고 믿고 싶으냐?

생명체는 유전자의 전달 기계라는 입장이 있다. 어쩌면 인간의 경우 다른 동물보다 지나치게 발달한 '뇌'의 전달 기계인지도 모른다. 마음(욕구, 느낌, 기억, 의지 등등)이 동작하는 원리를 이해하는 것이 결국은 모든 학문이 도달하게 될 종착역인지도 모른다. 음악에 대한 욕구, 남자 특유의 기계에 관한 욕구 등등을 어떻게 충족하는 것이 가장 합리적일까? 여기서 합리적이라 함은 최소 비용으로 최대 효과를 얻는 경제학적 원리만에 충실함을 뜻하는 것은 아니다. 요즘 사회에서는 이를 너무 강조하고 있다.