Tuesday, April 5, 2011

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 부분이다.

No comments:

Post a Comment