Friday, April 29, 2011

comparison of coverage between Exome Capture Kits

아.. 난 metagenome 논문 보고 싶었는데.. 급하게 exome capture kit 비교 했던거 정리하란다. 해야지. 목표는 단순하다. 3가지의 exome capture kit의 coverage를 비교하는 것. 결코 이 표에 대한 accuracy는 보증하지 않는다. confidential 한 문제도 있고 해서리.. 


하려는 걸 단순화 해보자. 
exome capture kit들을 (SeqCap EZ Human Exome Library v2.0,  SureSelect , TruSeq Exome Enrichment Kit )의 genome coverage를 비교하자. exome capture kit이니까 특히 exon 부분의 coverage를 유념해서 본다. 그럼 exome region의 definition은 뭘로 할거냐. 여러가지가 있겠지만 refseq과 ccds로 한다.


<결과> 


%이 표에서 단순 coverage는 probe design position 과 exon의 position 만 단순하게 비교. 그렇기 때문에 한 probe가 genome 상의 한 위치에서 디자인 됐지만 똑같은 시퀀스가 genome 상의 다른 위치에 존재할 때 원리적으로는 다른 곳도 커버하는 것이지만 그것까지 카운트 하지 않음.


<출처 >
1.SeqCap EZ Human Exome Library v2.0 : Roche 홈피에 오픈
2.SureSelect : 이는 agilent errary인가에 오픈되어 있는걸로 알고 있는데 아직 확실치 않다.
3.TruSeq Exome Enrichment Kit :  이는 web에 오픈되지 않음.
4.exome region : UCSC의 table에서 가져옴. 






< 이번 작업을 하면서 알게 된것 혹의 주의 할점 >
1.bed 파일과 UCSC의 데이터의 모든 좌표의 start position은 0-based고 end position은 아니다.
2.refseq과 ccds의 특정 gene들에 대한 record가 여러번 나오는데, 다시 말하면 동일 유전자가 genome 상의 서로 다른 위치에 존재 할수 있기 때문에 같은 gene accession id 를 갖는 record가 있을 수 있다(ccds의 경우 23개, refseq의 경우 2991개). 
그런데 하나 이상한건.. refseq. 동일한 gene acc가 여러개의 record가 나온다는 걸 난 동일 유전자가 서로다른 genome상에 위치 하기에 그렇다고 해석했는데.. 그렇다면 동일한 gene acc를 갖는 record들은 최소한 exon 의 갯수와 그 genome size가 동일해야 하는데 refseq의 경우 다수 record를 갖는 gene acc가 2991인데 그중에 613개의 gene acc의 record는 그것이 다르다는 것(ccds의 경우 23개 모두 record가 동일). 이게 어찌된 일인지.. 누가 알려주세요.. 

Wednesday, April 27, 2011

Enterotypes of the human gut microbiome

metagenome pipeline 1차로다가 만들고 난 후 요즘 genome NCBI에 submission 할려고 그것에 정신없느라 거의 논문이나 관련된 것들을 못봤다. 오늘은 metagenome 논문 하나 보고 그 담에 고걸 가지고 ppt를 만드는데 Prezi를 써볼련다. 아.. 떨려.. 과연 오늘 안에 다 할련지, 저녁에 회식도 있는데.. 딱 오늘까지만 할려고 하는데 해봐야지.
일단 metagenome 손 놓고 있으니 점점 맘이 떠나 갔는데 박사님이 던져준 논문 하나와 그 의도가 나를 그냥 바짝 interested in 하게 만들었다. 요즘 아니지.. 쫌 됐지.. 사람 똥으로다가 metagenome논문이 종종 나오는데(내가 알기로 이거 무슨 society가 있다) 특히 obesity 에 관해서 논문이 꽤 있다. 이번 논문도 그런건데(아직 확실치 않다. 읽어보지 않아서).. 여튼 그 의도가 뭐냐? 이거 사업성이 있다. 단순히 metagenome분석 해준다 하면 pipeline 만들고 돌려서 결과 report 해준다고 생각했는데.. 이거 진단으로도 갈 수도 있겠다. 이럼 이야기가 달라진다. 아니.. 나에 대한 자극도가 달라진다. 재밌겠다란 생각 든다. 함 보자.


일단 논문은 여기





Prezi

오늘 회사 월례회. 월례회가 어떻고 저쩌고 이야기 하고 싶었으나 건 생략하고 걍 포스팅 하고자 하는 내용만 이야기 한다. 일단은 왜 프리젠테이션에 대한거냐? 오늘 팀별 소개로다가 이선욱 부서장이 발표를 했는데 ms office 가 아닌 adobe flash(?) 로 발표를 했다. 오.. 신선하다. 차별화다. 음.. 실험팀인데 이런 것도 도입하다니.. 쫌 부끄러운데.. 해서 일단 한번 대충이라도 알아보자는 차원으로 포스팅 하고.. 담번에 프리젠테이션 만들 때는 반드시 꼭 MS office가 아닌것으로 해보리라.


처음 찾은 것은 여기
음 여기서 보게 된것이 Prezi, Adobe Acrobat을 이용한 프리젠테이션. 아하 보아하니 이선욱 부서장이 Prezi를 이용해서 만든거 같군. 한번 Prezi를 알아보자.


<Prezi>
일단 사이트는 요기. 아.. 영어다.. 아무리 아무리 영어는 많이 봐도 그 거부감은 어쩔수 없다. 해서 다른 리뷰 사이트를 찾아보자. 한국 Prezi 사용자 카페도 있다.. 헐.. 프레지 책 영역을 보면 어떤 훌륭하신 분이 초보자를 위한 manual도 만들어 놨다. 헐.. 이런 봉사 정신을 봤나.. 아 근데 Prezi 돈내는거 갑다. 아.. 아카데믹하게는 공짜로다가 쓸 수 있는거 같긴 한데. 괜찮다 난 아직도 배우고 있는 학생이라고 평소에 생각하니 죄책감 없이 그냥 아카데믹으로 써봐야 겠다. 아 manual의 Prezi의 history를 보니 TED에서 투자한다네. 그래서 그런지 홈피 첫 화면에 TED가 있었군. 


사용 방법은 manual 참조. 너무너무 잘 만들어놨다.

Wednesday, April 20, 2011

submission of genome - 4

NCBI submit 하면서 Q&A 와 최종 정리


genbank에 있는 genome의 annotation은 정해진 규칙이 없다. 곧 각자 어느정도의 로직을 가지고 annotation을 한것이며 NCBI에서 체크하는 것은 각 sequence의 id가 겹치지 않게끔 체계를 갖게 하는것 뿐이다. 


protein_id 는 locus tag를 따르기를 권유한다. genome submit하고 나면 나중에 protein들에 대한 accession number가 NCBI로 부터 할당되어 통보된다.


<Sequin 프로그램에서 주의 사항>
1. topology 변경
2. codon table 변경
3. protein page랑 annotation page는 넘겨도 된다. 나중에 sequin feature table로 로드하면 됨.
4. gene이 reverse strand 일때 annotation input 파일에서 end position이 start position보다 앞에 나와야 한다.
5.다 만들었다 싶으면 search에서 validate를 실행.


Sequin 프로그램이 오작동 하면 이건 input 파일이 잘못 된거다(내가 겪은 예로 genome 이 circular 인데 orf가 -strand로 genome 끝에서 다시 처음으로 연결된 orf가 있었다. 이때 위의 3번 주의 사항으로다가 아무 생각없이 annotation input file을 만들었더니 계속 오류가 나더라. 결국 다시 genome 셋팅하고 annotation position 다 바꿈).

Monday, April 18, 2011

submission of genome - 3

아직 NCBI에 submit 하는걸 완벽히 다 안거는 아니지만(특히 sequin 프로그램 사용법이 아직 약하다) 이번에는 journal of bacteriology 의 genome announcement 에 대해 좀 자세히 알아 보고 거기에 나온 논문 두개 정도 읽어보면서 어떤 내용을 넣어야 할지 정해보려 한다.


일단 뭔가를 읽기 전에 checklist를 생각해보자면..
1. 반드시 NCBI 등이 데이터베이스에 등록이 된 genome만 publish가 가능한가 확인
2. 500 words 안으로 써야 하는데 어떤걸 써야 하는가
3. annotation의 reference를 어떻게 처리 했나?




<genome announcement 논문 훓어보기>
뭐 어떤 균주냐 이런건 안 중요하고 
review 첫번째 논문
1.균주에 대한 intro: genus부터 소개, 왜 중요한지, source가 어딘지, 어떤 특성을 갖는지 등등
2.de novo assembly 전체적인 소개 및 annotation 방식 소개: 무슨 기계로 얼마만큼의 데이터를 만들어 냈는지 그리고 assembler로 뭘 썻는지,  CRITICA와 glimmer2를 이용해서 cds를 prediction했고, 그담이 이해가 안가는데 GO로 분류했고 상용 프로그램인 뭐를 썻다네.
3.genome에 대한 overview : 게놈 사이즈가 어떤지, ORF 갯수, 그리고 같은 genus 의 다른 species와의 길이 및 orf 갯수 비교. GC content.
4.orf annotation에 대한 overview : nr,cog blast 결과 보고. 다른 species에 없는 기능을 하는 유전자 소개


review 두번째 논문 
1.균주에 대한 intro : 이 균주는 beneficial 한 균주다 뭐 이런 내용.
2.또 균주 소개
3.시퀀싱 방법과 annotation 에 대한 내용: 이거 특이하게도 AB3700 DNA analyzer를 이용했다. 물론 solexa로 confirm을 하긴 했지만. 여튼 Yacop으로 orf  prediction했고 Uniprot, COG, KEGG, TIGRFAMs을 이용해 annotation했단다.
4.genome 에 대한 설명 : genome size, GC content, structural RNA 갯수, 몇개의 유전자가 putative function이 있는지, 


음 보아하니 유전자에 대한 comment 가 있어야 할 듯 하다. 다른 species와의 비교로 어떤 유전자가 더 있었다 이정도.. 


<genome announcement 논문 들어가야 할 list>
실험 방식(FLX+ sanger 3730), FLX 데이터 양(read, depth, paired-end), de novo assembler(GS De Novo Assembler version), 첫 de novo assembly 했을시 scaffold 갯수 및 양, sanger 3730으로 gap closing 시 read 양과 bp 길이, 어떤 프로그램 (phred/phrap/consed), annotation tool(glimmer3, rnammer, trnascan,) 및 방식(nr blastp, cog rpsblast, signalp, pfam) 




reference list도 10~15 개 정도로 하고, 쓸데 없는 말은 전부 배제하기로 한다. 논문 본연의 목적에 맞게 쓰도록 한다. 딱 지금 한 것만 쓰자.

Sunday, April 17, 2011

submission of genome - 2

여행 다녀왔는데.. 봄이라.. 아.. 몸살인지 감기인지.. 거의 좀비 상태다. 아.. 힘들어 죽을거 같어.. 휴가를 내고 싶지만 벌써 놀러 갔다 오느라 이틀을 쓴 상태라 최대한 아끼려는 생각에.. 버텨볼려 했다가 탈수에 병원 응급실까지가서 드러누워버리는 바람에.. 내 태어나서 이리 고생해보긴 첨인듯. 아직도 머리가 어지럽지만.. 집에서 드러누워 티비보면 뭐할쏘냐.. 병이 낫는것도 아니고, 빅토르 위고는 억지로라도 글쓸려고 하인시켜서 가운가지고 가게 했다는데 같은 심정으로다가 회사에 일단 왔으니 뭐라도 좀 하고 가자..


일단 저번에 포스팅하면서 genome project 등록했고 locus tag prefix 까지 등록을 했으니 annotation 부분을 좀더 자세하게 읽어보고 Sequin 사용법을 알아봐야 할 것이다.


<annotation>
http://www.ncbi.nlm.nih.gov/genbank/genomesubmit_annotation.html#disrupted_genes
일단 annotation 에 들어갈 feature들(gene, CDS, 등등)은 feature table(five-column tab-delimited table) 파일 안에 다 들어가 있어야 한다. 이 feature table 파일이란게 뭐냐 그럼. 이게 Sequin이나 tbl2asn 프로그램의 input 파일인 듯 싶다. 그럼 컬럼이 5개라고 했는데 뭐가 들어가냐? 1.start location of feature, 2.stop location of feature, 3.feature key, 4.qualifier key, 5.qualifier value.
딴건 별내용 없고.. 아 중요한거 하나 feature table에 맨 첫줄에 >하고 나서 seqid를 넣어야 하는데 이는 fasta 파일의 seqid와 동일해야 한다. 그런데 뭘 seqid로 정하냐? 아하.. 이거 임시다. 아무거나 정해도 된다. NCBI staff가 review 할때 accession number로 바꿔준단다.  protein id는 locus id랑 동일하게 하면 될것 같고, CDS 가 반드시 product qualifier (protein name)이 있어야 하는거 같은데.. naming 에 대해서는 주의해야 할건.. function, cellular location 같은 정보를 이름에 담지 말아햐 한다(이는 note feature에 넣을 것). protein의 unkown 일때 hypothetical protein이라는 용어를 쓸것. 여차함 gene symbol이랑 같은거 쓰는데 단 첫글자는 대문자로 할것. multigene family에 속하는 것들(이게 좀 이상한데 multigene family 에 대한 항목과 sequence similarity나 function share에 의한 homology 항목을 분리 시켰는데 같은 의미 아닌가?) 숫자로 구분하고 복수형 단어는 사용하지 말것. 기능이 알려지지 않은 protein인데 defined domain을 갖었을 때 -containing protein 이라고 명명할 수 있다.
notes feature에는 데이터베이스의 entry와의 sequence similarity 를 넣는것을 피하란다.
tRNA의 경우 어떤 amino acid에 해당하는것인지 명시하고 잘 모르겠으면 tRNA-Xxx 라고 하란다. 
글고 2005년 미팅으로 /experimental과 /inference 라는 항목이 정해졌다는데 이 설명은 여기.
해석해보자면.. 2005년에 INSD, DDBJ, EMBL, GenBank 모여서 회의했을 때 feature의 evidence 항목에 대해서 새로히 뭔가 정했다는데..기존의 evidence=expermental이라는 항목을 대체해서 /experimental=text 라는 항목과 /inference=TYPE:text 라는 항목을 넣자고 정했단다. text는 규격화된 text(곧 설명한다)를 TYPE에는 정해진 list에서 뽑아서 선택하는거. experimental 항목은 말그대로 실험한 내용쓰는거, 단 간단하게. inference는 non-experimental evidence를 명시하는것. TYPE은  11가지중 하난데.(이건 직접 링크 따라가서 보자) 


??궁극적으로 의문이 드는건.. 그렇다면 annotation의 제한은 없다는 건가? 누구는 이런식으로 ORF를 prediction하고 또 prediction한 ORF의 protein을 특정 방식으로, 그러니까 sequence similarity로 만 따져서 protein naming을 해도 되는 것인가? 아.. 이거 그냥 inference 항목으로 사용한 프로그램 명시하면 되는건가? 뭐.. 관리자한테 메일 보냈으니 답장오겠지..근데 전에 COG 관련 해서 질문했다가 씹힌거 같은데.. 제대로 올려나 모르겠네. 


<Sequin>
http://www.ncbi.nlm.nih.gov/Sequin/QuickGuide/sequin.htm
사실 이 프로그램 별거 아니다(아.. 다만 내가 하려는거에 한해서만 이야기 하자면). 위의 feature table을 genbank format으로 바꿔주는건데.. (내가 만든 파이프 라인 돌아가면 biopython을 이용해서 genbank 파일 만들어주긴 하지만 아무래도 혹시나 라는 생각에 그냥 이거 쓰기로 한다) 뭐 여튼.. 
fasta 파일을 일단 읽어들이는데 의문점 하나가.. nucleotide sequence가 하나 이상의 protein product를 endoing 하면 2개의 파일, 그러니까 하나는 nucleotides, 다른 하나는 protein 을 위한 파일이 필요하다는데.. 이건 뭔소린지.. 더 읽어봐야 알듯. 글고 fasta 파일의 title 그러니까 첫줄( > 있는 라인) 에 각종 modifier를 이용해서 정보를 넣을 수 있는데 어떤 modifier를 써야 할지 모르겠다면 그냥 note 라는modifier를 써라(staff이 바꿔준단다). 

Monday, April 11, 2011

submission of genome

음.. 점점 1년 반동안 회사에서 했던 일들을 마무리 해야 겠다는 생각이 든다. 너무 한곳에 오래 있었던 거 같기도 하고 이제는 제자리 걸음을 하는게 아닌가 하는 생각이 든다. 해서 얼마전에 genome assembly를 끝낸 2 개의 균주에 대해 논문을 써볼려고 한다. 

계획하고 있는 논문은 journal of bacteriology의 genome announcements(http://jb.asm.org/misc/about.dtl). 음.. 이런 걸 논문이냐라고 할수 있을 정도의 것. 이 feature의 목적은 다만 genbank에 genome을 올리고 인증하는 정도하라고 할  수 있겠다(이 글이 이 논문의 목적을 가장 잘 설명하는 듯).

일단은 지금 해야 할 일은 두가지. NCBI에 어떻게 bacterial genome을 submit 하는지와 타겟 저널의 report 형식을 보고 writing 하는 것.


<NCBI submission instruction>
우선 NCBI submission instructions 부터 보자. 
Register your Project
일단 genbank에 올리기에 앞서 genome project에 등록을 해야 한다. 이때 locus_tag의 prefix도 정해 줘야 하는데 그 proposal은 다음과 같다. 요약하자면 locus_tag prefix는 3개 이상의 문자와 숫자(symbol은 사용 금지), 첫글자는 반드시 문자, 모든 유전자(structural RNA 포함, repeat region은 제외)는 고유의 locus_tag를 갖으며, 한 유전자의 여러 feature는 같은 locus_tag를 갖는다.
nucleotide sequence는 FASTA format을 따른다.
Annotation
complete genome 일때는 annotation은 필수. gene name(biological name) 은 standard bacterial nomenclature rule (three lower case letters)를 따르고 다른 loci는 대문자 suffix를 붙여 구분한다. 같은 genome project에 있는 genome이라면 동일한 locus_tag prefix를 사용해야 하고 유전자마다는 unique한 locus_tag(systematic identifier)를 사용해야 한다. 
CDS는 protein coding region으로 반드시 product qualifier(protein name)이 필요하며 여차하면 그냥 gene name이랑 같은 걸 써라(단, 첫글자는 대문자). 그리고 protein이 안알려진거면 hypothetical protein이라고 써라. 그래서 나중에 release 되고 검색하면 locus_tag로 대신 나타내게 하기 위해.
CDS의 한 qualifier 중 중요한게 protein id 인데 음.. (이것 좀더 자세히 읽어봐야 겠다)
structural RNA는 tRNA, rRNA만을 의미. 이것 역시 locus_tag 필요(그 위의 proposal에서 보면 RNA던 CDS 던 같은 locus_tag numbering 방식을 사용할것을 권장하나 굳이 locus_tag에 그런 정보를 넣고 싶다면 _t112 식으로 underscore 뒤에 쓸라고 한다).
자세한 내용은 다음을 참조한다.
Create your submission
submission file을 만드는데 Sequin과 tbl2asn 이렇게 두 개의 프로그램이 있다. 정확하게 아직 이 프로그램의 정체를 모르겠으나 여기서 말하기를 두 프로그램의 가장 큰 차이가 2개인데 Sequin은 GUI고 tbl2asn은 command line이라는거, 그렇기 때문에 아직 assembly가 미완이라 contig가 많거나 아니면 chromosome이 많을 경우 tbl2asn을 사용하는게 용이하단다, 아.. 그리고 assembly가 아직 완성되지 않았으면 WGS 에 submit해야 한다. 난 게놈 completion이 된거라 Sequin을 사용해본다. 아래의 것을 봐야 할것(뭐이리 볼게 많다냐.. 에이..).
Sequin Quick Guide


submitting 
FTP를 이용하거나 아니면 Genomes Submission Tool을 사용한다. 자주 submission을 한다면 NCBI에서 FTP account를 만들어 준다고 한다니 Email 보내란다. 
What happens next
일단 submission하면 NCBI 쪽에서 review하고 별문제 없으면 accession number를 보내준다. 그 뒤 다시 annotation에 대한 review가 들어간다.public release는 바로 할수도 있고 publication문제가 있다면 특정 기간 동안 release를 보류할 수 있다고 한다.


요약하자면
1.genome project에 등록하기 (locus_tag prefix 도 등록)
2.Sequin이나 tbl2asn 프로그램을 사용하여 submission file(.sqn) 생성
3.discrepancy ReportGenome submission check tool 로 annotation 파일에 에러가 있는지 체크
4.genomes submission tool을 이용해서 NCBI에 등록.




<Instructions to authors (journal of bacteriology) >
아 요거.. genome announcements가 July에 없어진단다. 시간이 없다.

Tuesday, April 5, 2011

approximate string matching

전에 이야기 했던 당착한 문제점 중 하나. read에서 특정 문자열이 포함된 substring을 찾아서 이를 clipping 하는 일. 사실 바로 전 포스팅, sff 파일 파싱도 그 작업의 일환으로다가 찾아본것. 
그럼 최종적으로 해야 하는 일이 뭐냐. sff 파일에서 MID 별로 분류한 뒤 adaptor 시퀀스를 찾아서 clipping point를 변형해서 MID 별 각각의 sff들을 생성하는것. 
그럼 Roche에서는 이런 프로그램이 없냐? 있단다. 그런데 듣기로 adaptor clipping인가를 5' 쪽만 한다고 했나 뭐래냐. 여튼 필요하단다.

규칙은 간단하다. 
1.MID는 perfect matching으로 찾고 
2.adaptor clipping을 위한 string matching은 n 개의 mismatch (insertion, deletion, mismatch) 를 허용해서 찾는다.

2번 항목을 어떻게 할 것이냐.. 알고리즘에 심하게 취약한 나로서 검색, 이해, 적용을 해보기로 한다.

검색,이해,적용
역시 위키다. 기부금 내길 잘했다. 이런걸 approximate string matching이라고 하는군. edit distance는 몇번 고쳐야 exact match가 되느냐, 고치는 횟수를 의미(여기서 고치기 위한 primitive operation중  swap 이라는 방식은 나에겐 필요 없을 것).
완전 노가다로 찾는 brute-force 방식은 아닌거 같고, 그 다음으로 언급되는 것이 dynamic programming을 이용한 것. 이건 preprocessing이 필요없는 on-line 방식이란다. 그리고 다음에 언급하는 것이 suffix tree. 아.. 역시나.. 진짜 내가 이거 공부하고 만다.

그래서 선택한 것은 bitap algorithm.
요건 levenshtein distance term으로다가 pattern 이 text에 있는지 확인한다. 그러니까 levenshtein distance는 두 string을 줬을때 거리가 얼마인지 그 값(아마도 insertion, deletion, mismatch 갯수를 세는게 아닐까 싶은데) return 하고 ... 아 근데 결정적으로 fuzzy searching의 c 코드를 이해 할수가 없다. 망했다. 


http://en.wikipedia.org/wiki/Levenshtein_distance
이건 그냥 insertion, deletion, substitution까지 고려해서(transposition 까지 포함하고 싶다면 Damerau-Levenshtein distance 참고) 문자열 A와 B의 거리를 판별하는 알고리즘. dynamic programming으로 하는건데 이해는 쉬우나 내 아쉬운 능력으로는 원하는 걸(문자열 A에서 pattern B를 error k 까지 허용했을때 match 되는 substring 모두 찾기) 만들기 위해 변형하기가 힘들다(생각하는 능력이 많이 모자람). 


아 근데 왠걸.. 
http://www-igm.univ-mlv.fr/~lecroq/seqcomp/node3.html
최고다. 요거다. 딱. 한줄기의 빛이 되는 사이트. 아 근데 이거 그냥 Levenshtein distance랑 같다. 다만 text의 -1 index들을 전부 0으로 놔서 시작의 insertion 값을 안줬다는 차이만 있을 뿐. 역시 똑같은 걸 봐도 이해도에 따라 응용도가 달라진다. 다만 이 사이트에서 이해가 안되는건 back trace. 7개의 결과가 나오는데 첫 3개랑 마지막 꺼는 이해가 되는데 가운데 3개는 어떻게 해서 나온건지.. 아.. 이것 참.. 여튼 중요한건 clipping point를 찾는거기 때문에 Levenshtein distance로 나온 matrix의 마지막 행에서 cutoff 보다 작은 최소 값을 찾아서 그 곳을 clipping point로 해주면 될 것같다. 

sff 파일 파싱해보기(?)

바이너리 파일 핸들링 두번째 시간으로(첫번째는 여기) 저번에 어떻게 binary file 핸들링 하는지 대충 감잡았으니까 이번에는 실전으로다가 지금 필요한 일을 하면서 적용해 보려한다.


이번 미션의 목표 : FLX의 sff 파일을 변경하기. 정확하게 이야기 하자면.. sff 라 함은 the Standard Flowgram File의 약자인데 여기에는 GS FLX 기기의 read와 그것의 trace data가 들어 있다. 보통 read를 trim할때 sff 파일을 fastq 파일로다가 전환해서 quality trimming을 하는데, 회사 과장님 말씀으로는 fastq 파일로 newbler로 assembly 한거랑 sff 파일로 assembly 한거랑은 결과가 다르다는데(fastq가 아닌가.. 그냥 fasta 파일로 했을 때 다르다는건가. 음 근데 다르다면 sff 파일에 뭔가 더 들어 있어서 그 정보를 이용한다는 건데.. 음).. 해서 sff 파일의 format을 이해하고 원하는 방향(trimming)으로다가 변형을 하고자 한다.


sff file format 
http://sequence.otago.ac.nz/download/GS_FLX_Software_Manual.pdf page 528부터
여기에 따르면 sff 파일에는 각 homopolymer의 길이에 대한 측정값이 있단다(이건 좀 더 뒷 내용을 봐야 할 것 같다).
일단 sff 파일은 3 section으로 구성
1. common header section : 파일에 한번 나옴, byte size는 31 + number_of_flows_per_read + key_length보다 크거나 같은 가장 가까운 8의 배수. number_of_flows_per_read 가 800이고 flow_char를 보면 TACG가 200번씩 있는걸 보아하니.. 이 flow 라는게 read 그러니까 emulsion PCR이 된 bead를 시퀀싱 할때 TACG 순서대로 각각 200 번씩 nucleotide를 보내줬다는 의미. 
2. read header section : byte size는 16 + name_length 보다 크거나 같은 최소의 8배수, 이 section에서 나타내는 position 숫자는 1-based indexing.
3. read data section : byte size는 2*number_of_flows + 3*number_of_bases 보다 크거나 같은 최소의 8배수, number_of_flows는 common header section에 number_of_bases는 read header section에 있다.


% uint8_t, uint16_t, uint32_t, uint64_t 는 각 각 1,2,4,8 byte numeric value를 뜻함, big endian byteorder, character field는 sinlge-byte ASCII character임, 모든 section은 "eight_byte_padding" 이라는 field로 끝난다(이 필드는 0 to 7 bytes of padding, 이게 뭔소리냐, 각 section의 byte가 8 배수가 되게끔 8배수가 되기에 모자라는 byte 만큼 0 으로 padding이 되어 있다.. 뭐 이런 소리). 나머지는 pdf의 표 참조.


보니까 각 section별로 byte size 만큼 읽어 들여서 필요한 정보만 빼오는데.. 내가 원하는게 read clipping(manual 보니까 trimming이란 용어보다 clipping이란 용어를 사용하는거 같다) 이므로 건드려야 할 부분이  read header section의 clip_qual_left, clip_qual_right, clip_adapter_left, clip_adapter_right 부분이다.

Saturday, April 2, 2011

iphone 개발 수업 4주차-2

4/2
<frame work>
frameworks 는 라이브러리다. 프레임 워크를 사용하려면 이를 프로젝트에 add 해야 한다(라이브라러파일을 같은 폴더에 넣어야 한다).


<UITable View 다시 보기>
UITableViewDataSource; 내용관리, 관련 메소드는 교재 159p
UITableViewDelegate; 이벤트 관리(셀선택, 셀 내용편집 및 삭제), 관련 메소드는 교재 167p


UIApplication 객체가 이벤트를 감시하고 있는데 화면의 셀을 선택하면 UIApplication 객체가 UITableViewDelegate 객체의 didSelectRowAtIndexPath 메소드를 호출한다. 이때 넘겨주는 인자가 NSIndexPath 객체, 이 객체는 속성으로 section(선택된 센션 인덱스)와 row(선택줄의 인덱스)를 가지고 있다.


프로토콜은 자바의 인터페이스와 동일, 속성은 없고 구현을 하지 않은 메소드만 존재, 대표적으로 UItableDelegate와 DataSource.




<ViewController 하나 더 만들기>
navigation based application 을 만들면 하나의 ViewController 만 생기는데 하나의 화면을 더 만들고 싶으면 classes에서 우클릭해서 add , new File, 거기서 UIViewController subclass를 선택(UIViewController 클래스를 상속받는 클래스). 옵션도 선택(iPad용이냐, UITableViewController 를 상속 받을 것이냐, xib 즉 xml 파일을 만들 것이냐).
그리고 UInavigation Bar 에 right 버튼을 생성하거나 back 버튼 대신 다른걸 만들고 싶을 때 Bar Button Item 클래스(버튼 클래스와 비슷한데 다만 단순화 시킨것, 곧 클릭했을때의 이벤트만 메소드로 가지고 있음)를 가져오는데 interface builder에다가 navigation bar 위치에 넣을려면 안되고 xib 에다가 넣는다. 이것들을 UIViewController의 UIBarButtonItem 클래스의 변수에 연결시키고 또 이것이 선택되어졌을 때(이벤트가 발생했을때) 진행되어야 할 메소드를 연결시킨다.


UIViewController 의 initWithNibName 메소드(이때 인자가 xib 파일의 이름과 그 파일의 경로(bundle의 인자, nil이면 현재 경로))를 사용하면 xib 파일과 객체를 연결시켜준다.  




<셀의 UI 바꾸기>
xib 를 하나 생성하는데 user interface 에서 View xib를 선택. 그러면 View 에 관한 interface가 생기는데 이걸 생성하려는게 아니기 때문에 이 View 를 지운다음에 Table View Cell 을 라이브러리에서 xib로 가져온다. 그런다음에 그 UI, 즉 Table View Cell에 넣을 UI 를 라이브러리에서 가져다가 Table View Cell 안에 드레그 한다. 그리고 이것들(Table View Cell 안의 다른 UI들, 즉 UIImage나 UILabel들)의 객체를 리턴 받아야 하는데 이때 사용하는 것이 tag. 그 다음에 이 변형된 table View cell을 갖을 delegate(여기서는 RootViewController)로 가서 cellForRowAtIndexPath메소드를 바꿔준다. NSArray * topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"PhotoTableCell" owner:self options:nil] ; 이렇게 하면 topLevelObjects에는 DOM(Document Object Model) 형식의 객체가 리턴된다. 이 DOM에는 PhotoTableCell.xib의 객체들이 트리 형태로 들어 있게 된다. 이 DOM 객체를 가르키는 topLevelObjects는 index로 DOM 안의 객체(Table View Cell, UIImage, UILabel)로 접근하거나 아니면 앞에서의 tag로 접근 가능하다.


결론은 특정 UI를 바꿀려면 UI 안에 UI를 넣은 xib 파일(그러니까 변형된 UI)을 만들고 NSBundle mainBundle로 가져온다.
---------------------------------------------------------------------------------------------


<메모리 관리>
저장 장치, 그러니까 하드디스크에 저장된 것은 클래스, 이것을 메모리에 올리면 객체가 된다(메모리에 올려야 작동). 메모리에 올리려면 사용하는 메서드가 alloc 제거하려면 사용하는 메서드가 dealloc 이는 둘다 NSObejct클래스가 가지고 있는 메소들이다. 그런데 dealloc은 잘 사용하지 않음(다른 변수가 참조 할때 dealloc 해서 메모리에서 지우면 다른 변수가 참조시 에러가 나기 때문). 그래서 이때 사용하는 것이 NSObject의 retainCount라는 속성. retainCount는 몇개의 포인터에서 이 객체를 참조하는가 하는 카운트 값을 가지고 있다. 초기값, 그러니까 처음 생성되면 1을 갖는다. 이 retainCount 값은 NSArray, NSSet, NSDictionary, UITableView등에 삽입시 1 증가.  또 retain 메소드 호출시 1 증가. 반대로 NSArray등에서 빼거나 release 메소드를 호출하면 1 감소. retainCount가 0이 되면 자동으로 그 객체는 자동으로 삭제된다.


A *a = [[A alloc] init]; 이렇게 하면 반드시 release를 해야 한다.
A *a = [[[A alloc]init] autorelease]; 구현된 메서드 init()이 끝나면 자동으로 [a release]를 호출.


autorelease는 문제점이 하나 있는데 특정 메소드에서 객체를 생성해서 그 객체를 return 할때 autorelease를 하면 객체를 리턴받을때 삭제되어 있는 상태기 때문에 에러가 난다. 그래서 이럴때 autorelease를 사용하면 반드시 retain 메소드를 호출해야 한다. 


즉 상황에 따라 autorelease 를 사용하는 것이 좋을때도 있고 나쁠 때도 있는데 한 메소드 안에서 잠시 사용하는 것은 autorelease를 사용하는 것이 좋다.


autorelease모드인 경우 : 1.객체 생성이 autorelease 명시시, 2. alloc을 안해준 객체 생성, 예를 들어 [NSDictionary initWithArray:array]
-------------------------------------------------------------------------------------------------


<데이터 저장>
1.파일에 저장: NSFileManager사용
2.메모리의 저장 : 어플 종료시 내용 사라짐
3.코어 데이터 : sqlite 사용. 저장, 로드, 검색이 가능. ORM(객체 지향 DB); 직접 query를 이용하는것이 아니라 객체를 통해서 query를 던지다.


NSPersistentStoreCoordinator ; 파일(바이너리)을 읽어서 내용을 꺼내줌, 즉 파일에 있는 정보를  NSPersistentStoreCoordinator에 query를 던지면 관련 entity를 NSManagedObjectContext에 NSManagedObject 객체 형태로 메모리에 올린다. 이때 query를 던지는 클래스는 NSFetchRequest. 

Friday, April 1, 2011

iphone 개발 수업 4주차

4/1
<UI table view>
보통 서버에서 UI table view 의 리스트를 10~20 정도씩 받아온다(한꺼번에 다 받아 오는게 아니라).  그리고 아이폰은 터치해서 리스트 스크롤을 올리면 윗 셀이 없어지고 아래 셀이 생기는데, 이것은 없어지는 셀이 재사용 큐에 들어갔다가 내용이 바뀌어서 다시 UI table view 에 보이는 것이다. 그런데 table view에 여러개의 섹션이 있을때 각 섹션에서 없어지는 셀이 재사용큐에 들어갔다가 다시 재사용되는데 이때 어떻게 셀들을 구분하느냐, 식별자를 이용해서 이를 구별한다.
--------------------------------------------------------------------------------------------------


<Navigation 기반 application의 구조(World photos 예) > 
WorldPhotosAppDelegate ; 시스템 이벤트를 처리
   UINavigationController *navigationController; 화면 전환하는 객체(화면을 구성(backButton(혹은 leftButton), text, rightButton(이를 UINavigationBar라 함) 과 View가 있다), stack을 가지고 있어서 그 안에 UIviewController들이 있다. 이중에 하나를 선택헤서 View에 나타냄)


RootViewController ; RootViewController 객체가 생기면 RootViewController.xib xml에 안에 있는 내용을 나타냄(이벤트도 관리) , 이것이 첫 화면인데 이는 navigationController 의 stack에 첫화면으로 저장되어 있어서 이를 view 에 나타내기 때문이다.


RootViewController 의 UINavigationItem ; UINavigation Bar의 내용 설정, RootViewController가 이를 속성으로 가지고 있다.


PhotoDetailViewController ; photoDetailViewController.xib 이름의 xml 파일(이것은 interface builder로 만듬)의 객체를 생성하고 그 화면의 이벤트를 처리.


PhotoDetailViewController 의 UINavigationItem ; UINavigation Bar의 내용 설정


%%WorldPhotosAppDelegate와 navigationController는 RootViewController와 PhotoDetailViewController 에 의해 공유된다.%%
%%[[UIApplication sharedApplication]delegate]; 하면 UIApplication에서 공유하고 있는 것중 delegate를 return, 그러니까 WorldPhotosAppDelegate 를  return.%%


처음 시작하면 navigationController stack에는 RootViewController만이 들어 있다. 그래서 그것이 화면에 보이게 됨. RootViewController의 didSelectRowAtIndexPath 메소드 안에서 [self.navigationController pushViewController:detailViewController animated:YES]; 처럼 공유하고 있는 navigationController의 pushViewController메소드를 이용해서 화면에 보이고자하는 viewController, 즉 여기서는 detailViewController를 stack에 넣어서 화면 전환이 일어나게 한다(animated 는 화면을 자연스럽게 바꿀것인지, 아니면 확 바꿀 것이지를 나타냄). 이렇게 해서 detailViewController가 화면에 나타나게 되는데 이때는 UInavigation Bar 에는 backButton이 생기는데(RootViewController 화면에서는 이 버튼이 없다, 첫화면이라) 이 버튼을 누르면 다시 뒤 화면, 즉 RootViewController의 화면이 나타나게 되는데 이는  [self.navigationController [popViewController]]; 를 실행해서 stack 안에 detailViewController를 제거했기때문이다.

EstimateS and something others

두가지에 막혀 있다. 어쩌면 세가지. 하나는 taxonomic rank에 대한 이해가 부족하다. rank term. 어떤건 kingdom, phylum, class, order등의 정보가 다 있는데, 어떤건 그러하지 않고, 그러하지 않는건지 아니면 내가 그 tern을 제대로 특정 rank에 놓지 못한것이지도 판단이 되지 않는다. 다른 하나는 통계학적 접근. 다른 하나는 aligner에 대한 것. 어찌보면 핵심부에 속하는 것들에 지금 막혀있다. 힘빠져.
하나씩 해야지. 이번에 통계적인 것에 대한 내용을 들여다 보려 한다. 시작은 EstimatS라는 프로그램의 설명부터 해서 species richness, 그리고 두 community 간에 shared species를 계산하는 논문까지(항상 그렇듯 계획은 좋다. 시작은 창대하나 끝이 미약해서..).

<EstimateS>
http://viceroy.eeb.uconn.edu/EstimateSPages/AboutEstimateS.htm
일단 뭔지는 모르나 EstimateS가 하는 일부터 알아보자. 


-rarefaction and species accumulation curves
일단은 expected spcies accumulation curves(=sample-based rarefaction curve)를 구한단다. 이건 resampling technique이 아니라네. 그리고 individual-based rarefaction curves를 구한다.


-species richness estimators and diversity indices
non-parametric species richness를 구한다. 그런데 sample-based data와 abundance-based data에 대해서. 음.. log-linear confidence interval을 구한다. sample-based rarefaction curve의 aymptotic function에 기초한 species richness estimator를 구한다.


-shared species estimation and biotic similarity indices, with estimators
sample pairs에 대해 Chao's estimator of total shared species를 구한다.




아.. 전혀 알아들을수 없다. 좀더 자세한 user guide를 봐보자.
http://viceroy.eeb.uconn.edu/EstimateSPages/EstSUsersGuide/EstimateSUsersGuide.htm

-Introduction
일단 용어 정리부터 한다. 
sample 이라 함은 특정 지역, 면적, 내지는 시간 단위의 list of species 또는 OTU를 의미. 
species abundance data(=abundance data)는 counts로 sample 안에 각 species의 counts, 즉 수를 의미.
incidence data라 함은 presence/absence(=occurrence) data 으로 sample 안에 각 species가 있냐 없냐를 의미하는 데이터. 
마지막 말은 좀 이해 안되네. abundance data랑 summed incidence data랑 같은거 아닌가. summed incidence data가 frequencies of occurence 라면 어짜피 count인데.. 요건 음 패스. 여튼 이로써 뭐에 대해 뭘 구한다라는 말에서 뭐에 대해가 좀 이해가 되는듯.
아 이 뒤의 내용은 아무래도 Gotelli & Colwell (2001) 를 봐야 할거 같아서 급선회 한다.


<Quantifying biodiversity: procedures and pigfalls in the measurement and comparison of species richness>
-Taxon sampling curves
species richness가 중요한 measurement이긴 한데 정확히 측정하기 어렵다. 왜? 다양한 taxa가 있는 곳에서는 sampling을 많이 할수록 species가 많은걸로 나올테니까.
근데 speices 
taxon sampling curve를 4가지로 분류. 기준은 1. sampling protocol(individual-based 냐 sample based냐), 과 2. accumulation curves냐 rarefaction curves냐 .
첫번째 기준의 individual based라 함은 그냥 두특정 locality의 species를 비교할때 individual based 방식은 특정 locality에서 랜덤하게 sampling해서 species를 카운트 하는것이고 sample based는 특정 locality를 quadrat으로 구획해서 나눠진 quadrat중 계산되어진  quadrat의 species를 축적해서 더하는것. 
두번째 기준의 accumulation curve는 말그대로 데이터 collection과정중에 생기는 species 값을 축적해서 curve를 그리는것. 반면 rarefaction curve는 1부터 N 까지 random sampling을 반복적으로 해서 나오는 average species count를 그린것.
accumulation curve는 왼쪽에서 오른쪽으로, 반면에 rarefaction curve 오른쪽에서 왼쪽으로 그려지는데. 이는 rarefaction curve가 accumulation curve의 right end를 기준으로 sampling 사이즈를 변화하면서 반복적으로 sampling해서 나온 average species count를 기록하기 때문. 
그리고 sample-based curve가 individual-based curve보다 아래 있는데 이는 spatial or temporal autocorrelation 에 의한것.


-Comparing assemblages using taxon sampling curves
두 communities가 측정된 species richness가 다를수 있는데, 이는 진짜 생물학적으로다가 다를 수도 있는것이고 아니면 sampling effort나 condition의 차이에 의한 것일수도 있다. 그렇기에 그냥 raw taxon count를 비교하는건 문제가 있다.
만약 accumulation curves가 asymptote에 닿으면 raw count를 비교하는게 의미 있을수도 있으나 거의 그럴 일은 없다. 그러나 appropriate scaling을 통해서 accumulation curve를 비교하는게 가능. individual-based dataset의 경우 현실적인 문제(individual을 조사할때 보통 순서 까지 recording 하지 않기 때문)에서 accumulation curve를 구하는것이 문제가 있는데 이럴땐 rarefaction 을 이용.   individual의 경우 individual-based rarefraction만 사용 가능.하지만 sample-bassed 데이터의 경우 individual-based, sample-based rarefraction을 둘다 사용가능. 근데 sample-based을 사용(patchiness 때문에 individual-based rarefaction은 overestimate된다). sample-based rarefaction curve를 사용한다고 하더라도 taxa의 수를 plot 할 때는 individual의 accumulate의 수로 해야 한다(sample당 individual의 갯수가 다르므로).




-Computing rarefaction curves
1.individual-based rarefaction
randomize를 위한 re-sampling 말고 combinatoric theory에 근거한 mathematical expression이 있다. Sanders이야기 하는데 여튼 이건 틀린거고 hypergeometric sampling distribution에 근거한 derivation model이 있다. 그리고 Coleman의 random placement curve를 이용하면 빠른 계산이 가능하다
2.sample-based rarefaction


-Category-subcategory ratios and their pitfalls
1.individuals and species
2.species and genera


-Species richness VS. species density


-Asymptotic estimators of species richness

http://www.vsni.co.uk/products/genstat/htmlhelp/ecology/AccumulationCurve.htm
그럼 species accumulation curve는 어따 쓰냐? species richness를 추정하는데 사용한다. asymptotic line이 species richness가 되는건가.. 
그리고 rarefaction이라 함은 sampling effect가 특정 level까지 떨어질때의 species의 갯수를 추정하는데 사용하는 method.