bioinfo:참조_서열에_대한_매핑_reference_mapping_및_시각화
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
bioinfo:참조_서열에_대한_매핑_reference_mapping_및_시각화 [2023/06/21 14:41] – [Low (or zero) coverage region 찾아내기] hyjeong | bioinfo:참조_서열에_대한_매핑_reference_mapping_및_시각화 [2024/07/05 10:04] (current) – [Mapping의 실제] hyjeong | ||
---|---|---|---|
Line 6: | Line 6: | ||
===== Mapping의 실제 ===== | ===== Mapping의 실제 ===== | ||
- | 샘플로 사용할 Illumina sequencing read는 [[https:// | + | 샘플로 사용할 Illumina sequencing read는 |
# 실습용 raw data의 설명은 https:// | # 실습용 raw data의 설명은 https:// | ||
Line 26: | Line 26: | ||
$ samtools view -b -S -o BL21.bam BL21.sam | $ samtools view -b -S -o BL21.bam BL21.sam | ||
| | ||
- | SAM 파일의 대부분을 구성하는 read alignment 필드에서 두 번째 필드(flag, | + | SAM 파일의 대부분을 구성하는 read alignment 필드에서 두 번째 필드(flag, |
$ samtools flagstat BL21.bam | $ samtools flagstat BL21.bam | ||
Line 44: | Line 44: | ||
$ smalt map –f bam –o mapping.bam referencek11s1 read_1.fq read_2.fq | $ 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 L/G를 산출하는 것이다. Read mapping을 통하여 SAM/BAM 파일이 만들어진 상태라면 samtools를 사용하여 보다 정확한 계산을 할 수 있다. 이를 위해서는 read alignment를 reference 서열 내에서의 mapping position으로 정렬하는 일(samtools sort)이 선행되어야 한다. samtools sort –n은 read name을 기준으로 정렬한다. | + | 다음으로 평균적인 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 | $ samtools sort -o BL21_sorted.bam BL21.bam | ||
Line 59: | Line 59: | ||
$ samtools idxstats mapping_sorted.bam | $ samtools idxstats mapping_sorted.bam | ||
| | ||
- | [[https:// | + | 뒤에서 소개할 |
===== Mapping 결과의 시각화 ===== | ===== Mapping 결과의 시각화 ===== | ||
Read alignment의 시각화에는 [[https:// | Read alignment의 시각화에는 [[https:// | ||
Line 84: | Line 84: | ||
===== Low (or zero) coverage region 찾아내기 ===== | ===== 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이다. | + | Samtools depth는 reference의 각 염기 위치 혹은 구간에 대한 read depth 정보를 라인 단위로 출력한다. 따라서 read depth가 일정 기준을 만족하지 않는 위치를 구간으로 묶어서 출력하려면 |
+ | |||
+ | 다음의 예제는 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를 산출하는 사례이다([[https:// | ||
+ | |||
+ | $ zero=$(bedtools genomecov -ibam infile.bam -g reference.fasta -bga | awk '$4==0 {bpCountZero+=($3-$2)} {print bpCountZero}' | ||
+ | $ nonzero=$(bedtools genomecov -ibam infile.bam -g reference.fasta -bga | awk ' | ||
+ | # Round up to 6 decimal places and print | ||
+ | $ percent=$(bc <<< | ||
+ | $ echo $percent | ||
+ | | ||
===== SAM/ | ===== SAM/ | ||
+ | Quality가 좋지 않거나 sample에만 특이적인 부분에서 유래한 read 및 오염에서 유래한 read는 unmapped read로 남게 된다. 이것만을 별도로 추려내면 sample의 상태를 파악할 수 있는 자료로 쓸 수 있다. Samtools를 이용하여 BAM file로부터 unmapped read를 fastq 파일로 추출하는 방법을 알아본다. | ||
+ | $ samtools view –bf 0x04 BL21.bam > unmapped.bam | ||
+ | $ samtools bam2fq unmapped.bam > unmapped.fq | ||
+ | # unmapped.bam을 경유하지 않고 원본 BAM file에서 직접 추출하기 | ||
+ | $ samtools bam2fq –f 0x04 BL21.bam > unmapped.fq | ||
+ | | ||
+ | unmapped.fq 파일에는 쌍을 이룬 read와 그렇지 않은 것들이 한데 섞여있는 상태이다. 만약 pair를 이룬 read와 그렇지 않은 것(singleton)을 별도의 파일로 분리하고 싶다면 khmer package의 split-paired-reads.py를 이용하면 된다. | ||
+ | |||
+ | $ split-paired-reads.py -0 orphan.fq -1 unmmaped_1.fq -2 unmapped_2.fq unmapped.fq | ||
+ | |||
+ | Fastq 파일 내의 read 순서가 뒤섞였거나 pair 관계가 깨진 것을 고치려면 BBmap package의 repair.sh를 사용해도 된다. 다음 두 명령어의 결과는 같다. | ||
+ | |||
+ | $ repair.sh in=unmapped.fq out=fixed.fq outs=singletons.fq repair | ||
+ | $ bbsplitpairs.sh in=unmapped.fq out=fixed.fq outs=singletons.fq fint | ||
+ | | ||
+ | Unmapped read pair를 추출하려면 어떻게 하는 것이 좋을까? 바로 위에 보인 사례에서는 일단 모든 unmapped read를 뽑아낸 다음 이를 수선하여 pair를 이룬 것만을 최종적으로 얻었다. 다른 방법으로는 BAM 파일에서부터 unmapped read pair를 직접 꺼내는 것도 가능하다. 0x04(segment unmmaed)와 0x08(next segment in the template unmapped)를 합쳐서 십진수 12(0x0c)를 flag로 주면 read와 그 mate가 전부 unmapped 상태인 것을 골라서 추출하게 된다. | ||
+ | |||
+ | $ samtools view –bf 12 BL21.bam > unmapped_pair.bam | ||
+ | $ samtools bam2fq -1 paired1.fq -2 paired2.fq -0 /dev/null –s /dev/null unmapped_pair.bam | ||
+ | # 또는 중간 BAM 파일을 경유하지 않고 한번에 실행 | ||
+ | $ samtools bam2fq -1 paired1.fq -2 paired2.fq -0 /dev/null –s /dev/null –f 12 BL21.bam | ||
+ | | ||
+ | 자료에 따라서는 -f 12 -F 256으로 설정하기도 한다. 256(0x100)은 not primary alignment라는 뜻이므로 -F 256은 이를 부정하여 primary alignment가 된다. 그러나 unmapped read에게는 이것이 의미가 없고, 실제로 테스트한 결과 –f 12 단독으로 실행하거나 –f 12 –F 256 복합으로 실행한 경우에 차이는 없었다. | ||
===== SAM/ | ===== SAM/ | ||
+ | Read unmapped에 대한 SAM flag이 4(samtools view -f 0x04)이므로 이 조건에 반대되는 모든 read(-F 0x04)가 mapped read에 해당한다. 그러나 properly mapped reads, 즉 mapping된 mate의 거리와 간격이 라이브러리의 크기의 평균적 분포를 만족하는 것을 고르려면 -f 0x03(0x01 for read paired; 0x02 for read mapped in proper pair; paired read의 경우 두 flag는 동시에 쓰여야 함)을 적용해야 한다. 후속 분석 작업의 목적에 따라서는 mate 중 어느 하나만 mapping이 되었어도 read pair를 전부 추출하고 싶은 경우도 있을 것이다. SAM 및 BAM 필터링의 사례에 대해서는 [[https:// | ||
+ | |||
+ | ^ **SAM flag** | ||
+ | | [1] -f 0x04 | Unmapped | ||
+ | | [2] -F 0x04 | Mapped | ||
+ | | [3] -F 12 | Read and mate mapped | ||
+ | | [4] -f 0x03 | Properly mapped \\ (-f 99/147 및 -f 83/ | ||
+ | | [5] -f 0x04 -F 0x08 | Reads that did not map, but whose mates mapped \\ (-f 4 -F 264로 표현한 자료도 있음) | ||
+ | | [6] -f 0x08 -F 0x04 | Reads that map, but whose mates not mapped \\ (-f 8 -F 260으로 표현한 자료도 있음) | ||
+ | |||
+ | 여러 조건을 이용하여 복수의 BAM 파일을 추출하였다면 samtools merge 명령을 이용하여 하나로 합친 뒤 samtools bam2fq 명령을 이용하여 fastq 파일로 추출하면 된다. 위의 표에서 보인 사례에서 [5]와 [6]는 paired read까지 만들어 놓으면 같은 결과가 되므로 어떤 flag을 쓰든 관계가 없다. 다음의 사례는 BAM 파일을 탐색하여 mate 중 어느 한쪽만 mapping이 되었더라도 read pair를 추출하여 한 쌍의 fastq 파일로 출력하는 방법을 보이고 있다. | ||
+ | |||
+ | $ samtools view -b -F 12 BL21.bam > mapped_paired.bam | ||
+ | $ samtools view -b -f 4 -F 8 BL21.bam > unmap_map.bam | ||
+ | $ samtools view -b -f 8 -F 4 BL21.bam > map_unmap.bam | ||
+ | $ samtools merge at_least_one_mapped.bam mapped_paired.bam unmap_map.bam map_unmap.bam mapped_paired.bam | ||
+ | # Read name을 기준으로 정렬을 해야(-n) 나중에 read pair를 별도의 파일로 잘 분리해 낼 수 있다. | ||
+ | $ samtools sort -n at_least_one_mapped.bam -o at_least_one_mapped_sorted.bam | ||
+ | # -N 옵션은 read name에 /1 또는 /2를 추가한다. | ||
+ | $ samtools bam2fq –N -1 paired_1.fq -2 paired_2.fq at_least_one_mapped_sorted.bam | ||
+ | | ||
+ | 추출할 read의 목록을 먼저 만든 다음에 원본 fastq 파일로부터 추출해 내는 방법도 가능하다. 이때에는 seqtk가 필요하다. | ||
+ | |||
+ | $ samtools view -F 12 BL21.bam | cut -f1 | sort | uniq > list_both | ||
+ | # 다음 명령어에서는 -f 4 -F 8로 실행해도 무방하다. | ||
+ | $ samtools view -f 8 -F 4 BL21.bam | cut -f1 | sort | uniq > list_single | ||
+ | $ cat list_both list_single > list_all | ||
+ | $ cp list_all list_1 | ||
+ | $ cp list_all list_2 | ||
+ | $ sed -i ' | ||
+ | $ seqtk subseq reads_1.fq list_1 > pairedNew_1.fq | ||
+ | $ sed -i ' | ||
+ | $ seqtk subseq reads_2.fq list_2 > pairedNew_2.fq | ||
===== SRA data를 다운로드하는 방법(상세) ===== | ===== SRA data를 다운로드하는 방법(상세) ===== | ||
+ | 본 장의 시작 부분에서 fastq-dump를 이용한 SRA data 다운로드 방법을 간략하게 설명하였다. 만약 SRA와 연계된 메타데이터 파일이 필요하거나 웹브라우저 환경의 Run Selector를 이용해야 하는 경우, 또는 아마존 웹 서비스(Amazon Web Service, AWS)를 통한 다운로드가 필요하다면 NCBI의 공식 문서인 [[https:// | ||
+ | |||
+ | Single run에 대한 데이터를 열람하여 다운로드하려면 우선 [[https:// | ||
+ | |||
+ | 복수의 SRA Experiment(예: | ||
+ | |||
+ | $ PATH=/ | ||
+ | $ parallel -j 1 prefetch {} ::: $(cat SRR_Acc_List.txt) | ||
+ | $ parallel -j 1 fastq-dump --skip-technical -F --split-files -O fastq {} ::: $(cat SRR_Acc_List.txt) | ||
+ | |||
+ | SRA의 Run Browser에서 Data access 탭을 선택한 다음 URL을 클릭하여 직접 다운로드를 할 수도 있다. 아래 그림처럼 NCBI Location 오른쪽의 [[https:// | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | 이를 ~/ | ||
+ | |||
+ | $ fastq-dump --split-files SRR8981517 | ||
+ | Read 1431064 spots for SRR8981517 | ||
+ | Written 1431064 spots for SRR8981517 | ||
+ | |||
+ | 사실은 앞서 설명했듯이 ‘fastq-dump %%--%%split-files SRR8981517’라고만 입력하여 실행을 해도 .sra 파일 다운로드와 fastq 추출 작업이 자동으로 연이어서 진행된다. | ||
+ | |||
===== 참고 자료 ===== | ===== 참고 자료 ===== |
bioinfo/참조_서열에_대한_매핑_reference_mapping_및_시각화.1687326060.txt.gz · Last modified: by hyjeong