This is an old revision of the document!
Table of Contents
참조 서열에 대한 매핑(reference mapping) 및 시각화
BWA나 bowtie2와 같은 대중적인 short read aligner(mapper)를 써도 좋지만 prokaryotic genome 유래 데이터라면 SSAHA2 또는 smalt도 좋다. Read alignment 결과는 SAM 또는 BAM(specification documentation)으로 출력되고, 이는 SAMtools를 사용하여 서로 전환 가능하다. SAMtools는 alignment file의 편집과 매핑 관련 수치 추출 등 다양한 기능을 수행한다. 이 섹션에서는 NCBI SRA(Short Read Archive)에서 E. coli BL21의 sequence read file 일부를 직접 다운로드하여 이용하는 방법을 설명한다. Reference sequence는 E. coli B str. REL606의 유전체(GCF_000017985.1, ftp)를 사용하였다. 아래에 보인 사례에서는 FASTA file을 다운로드하였지만, GenBank 파일을 받아서 이로부터 FASTA 및 GFF3를 추출하여 사용하는 것도 좋다. FASTA 추출은 seqret(EMBOSS package) 혹은 bp_seqconvert.pl을, GFF 추출은 bp_genbank2gff3.pl을 사용한다. ‘bp_’로 시작하는 Perl 스크립트는 BioPerl(conda base environment로 설치)에서 제공하는 것이다. SRA 데이터를 다운받으려면 SRA-Toolkit 패키지의 fastq-dump가 필요하다.
Mapping의 실제
샘플로 사용할 Illumina sequencing read는 SRX1021661의 run 결과 중 2백만 read(2 x 101 nt cycle)이며, read mapper로는 bowtie2를 사용한다. Bowtie2에는 paired read의 간격이나 방향 설정 등 입출력물의 형식 및 정렬 조건에 대한 다양한 옵션을 줄 수 있는데, 여기에서는 일루미나 paired end read에 해당하는 기본 조건(forward-reverse, no distance constraint)으로 하였다. Alignment의 기본 조건은 –end-to-end인데, 트리밍을 하지 않은 read라면 –local이 더 나을 수도 있다. 파라미터의 조합에 따라서 speed/sensitivity/accuracy이 달라지므로 자세한 사항은 bowtie2 매뉴얼 혹은 'Getting started' 섹션을 참조하라.
# 실습용 raw data의 설명은 https://www.ncbi.nlm.nih.gov/sra/SRR2014531 참조 $ fastq-dump -X 10000000 --split-files SRR2014531 $ wget ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/017/985/GCF_000017985.1_ASM1798v1/GCF_000017985.1_ASM1798v1_genomic.fna.gz # 실습용 reference sequence의 accession은 NC_012967.1 또는 CP000819.1이다. $ gzip -d GCF_000017985.1_ASM1798v1_genomic.fna.gz $ bowtie2-build GCF_000017985.1_ASM1798v1_genomic.fna REL606 # 다음의 명령은 --fr -I 0 -X 500을 기본 조건으로 이용한다. # -S(표준 출력) 또는 –S <SAM file name>을 지정하지 않으면 BAM file로 출력된다. $ bowtie2 -p 8 -x REL606 -1 SRR2014531_1.fastq -2 SRR2014531_2.fastq -S BL21.sam # unpaired read가 있다면 -U fastq_file로 공급한다. # SAM <-> BAM 파일 전환을 위해 samtools view 명령을 사용한다. # samtools에서 -S는 입력 파일의 포맷이 SAM임을 지정하는 것이다. # samtools 1.9에서는 입력 파일 포맷을 자동으로 검출하므로 –S 옵션은 무시된다. # 아래에서는 하위 호환성(버전 0.1.19까지)을 위하여 –S를 삽입하였다. # -b는 출력 파일 포맷이 BAM임을 지정한다. # -o OUTFILE은 samtools 버전 1.9 이상부터 사용 가능하다. $ samtools view -b -S -o BL21.bam BL21.sam
SAM 파일의 대부분을 구성하는 read alignment 필드에서 두 번째 필드(flag, 0-255 범위의 숫자)는 read의 mapping 상태를 비트 단위로 나타낸다. 특정 flag를 만족하는 alignment를 추출하려면 samtools view -f INT를, 만족하지 않는 것을 추출하려면 samtools -view -F INT 명령을 사용하면 된다. Reference에 반복 서열이 존재하면 하나의 read가 여러 곳에 붙어서 각각 별도의 alignment를 생성하게 되므로(primary vs. secondary alignment), mapped read의 수치와 관련된 작업을 하려면 주의가 필요하다. 뿐만 아니라 chimeric alignment인 경우에도 하나의 read가 representative 및 supplementary alignment로 여러 차례 나타날 수 있다. SAM flags를 해독하려면 ‘samtools flags 4’와 같이 입력하거나 Decoding SAM flags 웹사이트를 이용하라. 예를 들어 0x04는 segment unmmaped를 의미한다. ‘0x’는 16진수임을 명시하기 위한 것이다(예: 10 = 0xa). getinsersize.py는 매핑 데이터를 분석하여 라이브러리 크기에 대한 정보를 제공한다.
$ samtools flagstat BL21.bam $ samtools view –f 0x04 BL21.bam | wc -l # unmapped read의 수 $ samtools view –F 0x04 BL21.bam | wc –l # mapped read의 수 # -c 옵션을 주면 해당되는 레코드, 즉 read의 수를 반환한다. $ samtools view –f 0x04 –c BL21.bam # unmapped read의 수 $ samtools view –F 0x40 BL21.bam | cut –f1 | sort | uniq | wc –l # uniquely mapped read의 수 $ samtools view BL21.bam | getinsertsize.py – #library insert size의 측정
getinsertsize.py 스크립트가 출력하는 read span 정보가 정확히 무엇을 의미하는가? SAM definition에 의하면 read span은 매핑된 왼쪽 read의 시작에서 오른쪽 read의 끝까지를 의미한다. 다시 말해서 {paired read의 간격 + (2 x read length)}에 해당한다(출처).
Smalt는 mapping을 하기 전에 reference sequence의 hash table을 만드는 인덱싱을 먼저 해야 한다. Hashed word의 크기를 -k 옵션으로 미리 지정하지 않으면 13을 택하게 된다. Bacterial genome의 인덱싱에는 -k 11 -s 1이 적당하다. -s는 sampling step size를 의미한다. 매핑 단계에서 쓰레드를 지정하려면 –n NUM 옵션을 사용하라.
$ smalt index –k 11 –s 1 referencek11s1 reference.fa # 인덱싱 결과 referencek11s1.sma 및 referencek11s1.smi 파일이 생긴다 $ smalt map –f bam –o mapping.bam referencek11s1 read_1.fq read_2.fq
다음으로 평균적인 read depth(또는 coverage)를 산출하는 방법을 소개한다. Depth란 de novo assembly 또는 read mapping으로 재구성된 염기 서열의 주어진 위치에 몇 개의 read가 정렬하고 있는지를 수치로 나타낸 것이다1. De novo assembly에서 sequencing에 의한 유전체의 평균 coverage를 구하는 가장 간단한 방법은 read 수(N)와 평균 read length(L)를 곱한 것을 유전체 크기(G)로 나눈 것, 즉 N x L/G를 산출하는 것이다. Read mapping을 통하여 SAM/BAM 파일이 만들어진 상태라면 samtools를 사용하여 보다 정확한 계산을 할 수 있다. 이를 위해서는 read alignment를 reference 서열 내에서의 mapping position으로 정렬하는 일(samtools sort)이 선행되어야 한다. samtools sort –n은 read name을 기준으로 정렬한다.
$ samtools sort -o BL21_sorted.bam BL21.bam # mapping부터 sort까지 한번에 실시하기 $ bowtie2 -p 8 -x REL606 -1 SRR2014531_1.fastq -2 SRR2014531_2.fastq | samtools sort > BL21_sorted.bam $ samtools depth -a BL21_sorted.bam | awk '{c++;s+=$3}END{print s/c}' # awk문 안에서 c 변수를 계산하지 말고 '{s+=$3}END{print s/NR}'이라고 해도 된다.
samtools depth의 -a 옵션은 zero coverage를 포함한 reference의 모든 영역을 추출하기 위한 것이다. 위에서 소개한 명령어는 reference sequence가 몇 개의 contig로 나뉘어 있는지 관계 없이 평균 read depth를 출력한다. BBmap 패키지의 pileup.sh 명령어는 reference를 이루는 각 서열에 대한 길이, 평균 fold coverage, covered percent, covered base, mapping된 read의 방향 등 상세한 정보를 tab-delimited format으로 출력한다.
$ pileup.sh in=mapping_sorted.bam out=stats.txt
각 contig에 대하여 몇 개의 read가 mapping되었는지를 간략하게 살펴보고 싶다면 다음 명령어를 사용한다.
$ samtools idxstats mapping_sorted.bam
뒤에서 소개할 bedtools의 genomecov를 사용하면 coverage와 관련한 보다 복잡한 계산을 할 수 있다.
Mapping 결과의 시각화
Read alignment의 시각화에는 IGV(Integrated Genomics Viewer) 또는 tablet을 사용하라.
프로그램에서 열게 될 BAM file은 sort 및 index가 되어 있어야 한다. 또한 reference genome sequence(FASTA file)와 유전자 정보(annotation) 파일도 필요하다. 유전자 정보는 보통 GFF3 파일로 준비해야 한다. IGV에서는 Genomes→Create .genome File… 메뉴에서 FASTA file과 gene file(GFF3)을 입력하여 사용자의 홈 디렉토리에 각 reference에 대한 .genome 파일을 만들게 되며, 이렇게 만들어진 파일은 다른 사용자에게도 공유할 수 있다.
다음 명령어는 다소 복잡해 보이지만 파일의 다운로드, 압축해제 및 전환 과정을 파이프로 연결함으로써 중간 단계에서 파일을 저장하는 과정을 생략한 것이다. Prokaryotic genome이라면 GFF3 파일에서 gene과 CDS feature만 남기는 것이 편리하다. NCBI에서 다운로드한 GenBank 파일을 bp_genbank2gff3.pl로 처리하면 gene/mRNA/CDS/exon feature가 전부 생기는 반면 같은 사이트에서 다운로드한 GFF3 파일에는 CDS feature만 존재한다.
$ curl --output - ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/017/985/GCF_000017985.1_ASM1798v1/GCF_000017985.1_ASM1798v1_genomic.gbff.gz | zcat - | bp_genbank2gff3.pl -in stdin -out stdout > temp.gff3 $ awk '$3!="mRNA" && $3!="exon"' temp.gff3 > REL606.gff3; rm temp.gff3 (또는) $ curl --output - ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/017/985/GCF_000017985.1_ASM1798v1/GCF_000017985.1_ASM1798v1_genomic.gff.gz | zcat - > REL606.gff3 $ samtools index BL21_sorted.bam
Mapping에 사용한 FASTA file(NCBI에서 직접 다운로드)의 서열 ID는 NC_12967.1의 형태이나 GFF3 파일의 첫번째 컬럼에 보이는 서열 ID에서는 버전 번호(.1)가 없으므로 GFF3 파일을 수정하여 이를 서로 일치시키도록 한다. 그러나 GenBank 파일로부터 seqret(EMBOSS)로 만들어낸 FASTA 파일의 서열 ID에는 버전 번호가 없다.
$ sed -r 's/^NC_012967/NC_012967.1/' REL606.gff3 > REL606.mod.gff3
만약 FASTA file에 여러 개의 서열이 포함되어 있다면 위 방법으로는 버전 번호를 한번에 제거하기 어렵다. 따라서 sed에서 좀 더 정교한 치환을 실시해야 한다. 아래의 사례에서는 서열 ID에서 가장 마지막에 오는 점 이후의 모든 문자를 제거한다.
$ sed –r 's/^(/+)\..+$/\1/' file.gff3 > file.mod.gff3
이렇게 만들어진 FASTA file과 GFF3 및 BAM file을 IGV에서 시각화해 본다. tablet에서도 비슷한 방법을 적용할 수 있을 것이다.
Low (or zero) coverage region 찾아내기
Samtools depth는 reference의 각 염기 위치 혹은 구간에 대한 read depth 정보를 라인 단위로 출력한다. 따라서 read depth가 일정 기준을 만족하지 않는 위치를 구간으로 묶어서 출력하려면 bedtools를 사용하는 것이 편리하다. Bedtools는 유전체 분석에서 흔히 다루게 되는 파일인 BAM. BED, GFF/GTF, VCF를 대상으로 하여 구간(genomic interval)에 대한 다양한 조작을 하는 도구이다. 여기에는 intersect, merge, count, complement, shuffle 등이 포함된다. Coverage 관련 계산에 사용되는 bedtools의 명령어는 genomecov이다.
다음의 예제는 BAM file에서 read coverage가 9 미만인 곳을 출력한 다음 병합하여 구간으로 출력하는 방법을 보여주고 있다.
$ bedtools genomecov –bga –ibam infile.bam | > awk ‘$4 < 9’ | bedtools merge –i - > RESULT.bed
Bedtools를 사용하면 참조 서열이 read mapping에 의하여 어느 정도나 cover되었는지를 계산할 수 있다. 다음 명령행은 BAM 파일에서 read depth가 0인 영역(zero)과 그렇지 않은 영역(nonzero)의 길이를 합산한 다음 이로부터 % of reference genome covered를 산출하는 사례이다(Biostars tutorial). BAM 파일이 입력되는 경우 -g reference.fasta 옵션은 필요하지 않다.
$ zero=$(bedtools genomecov -ibam infile.bam -g reference.fasta -bga | awk '$4==0 {bpCountZero+=($3-$2)} {print bpCountZero}' | tail -1) $ nonzero=$(bedtools genomecov -ibam infile.bam -g reference.fasta -bga | awk '$4>0 {bpCountNonZero+=($3-$2)} {print bpCountNonZero}' | tail -1) # Round up to 6 decimal places and print $ percent=$(bc <<< "scale=6; ($nonzero / ($zero + $nonzero))*100") $ echo $percent
SAM/BAM에서 unmapped read 추출하기
SAM/BAM에서 mapped read를 pair 형태로 추출하기
SRA data를 다운로드하는 방법(상세)
참고 자료
Sequencing depth and coverage: key consideration in genomic analysis. Nature Reviews Genetics 15, 121–132 (2014)