Sam 파일의 CIGAR string, MD tag에서 돌연변이 (mismatch & indels) 얻기
10109 단어 MDsambioinformaticsCIGAR돌연변이
32 99 chrA 1758 60 100M = 1995 337 CGACCTATTACCCAGCCATAAGTTGACAACCAAATCCCTTAAACGCACTGTCTATAAGCGCATATAGTAGACGGACCGTTATCCTCATTAAGGACCATTA 5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555 NM:i:2 MD:Z:67A21C10
18 147 chrA 1762 60 65M3D35M = 1519 -343 CTATTACCCAGCCATAAGTTGACAACCAAATCCCTTAAACGCACTGTCTATAAGCGCATATAGAAGGACCGTTATCCTCATTCAGGACCATTAATACTGC 5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555 NM:i:3 MD:Z:65^GAC35
sam 파일은 mapping 후 읽기를 유지합니다 spec
참고 1
한 줄에 하나의 리드가 쓰여 있다.
각각의 리드가 레퍼런스와 비교해, 어떤 차이를 가지고 있는지 알고 싶다.
예를 들어, 맨 위의 리드에는 두 개의 돌연변이가 있습니다.
1824-1825, A=>T
1846-1847, C=>A
각 열은 순서대로 seq name,flag(2 bit로 표현됨),chr,pos,map quality,CIGAR,seq name of mate read,pos of mate read, insert size, sequence, basequality, tags. 가 되는 spec 참조.
CIGAR
CIGAR은 insertion, deletion, softclip 등의 위치를 나타낸다.
예를 들어, indel이 없는 경우 100M
(리드 길이=100bp의 경우), 도중에 del이 있는 경우 30M3D70M
또한,
N : skipped bases on reference
S : soft clipping
H : hard clipping
P : padding
도 사용된다. Soft clip은 sequence의 항에 포함되어 있지만 align하지 않은 것, hard clip은 align하지 않고 sequence의 항에도 포함되어 있지 않은 부분을 가리킨다. soft clipped reads는 IGV로 보면 미스매치가 이어져 보인다. (img) https://www.google.co.jp/search?q=soft+clipping+reads&client=safari&rls=en&source=lnms&tbm=isch&sa=X&ei=ml_0UqKrCofYkAWL9oGoDg&ved=0CAkQ_AUoAQ&biw=soft&twd isch
주의점은, pos는 position of left-most aligned base이므로, soft clip 된 부분은 포함하지 않는다. (물론 하드 클립도 포함하지 않음)
그러므로
TCGATCGA
1 2
25M5I70M
의 경우는 pos는 위의 1을 가리키고, 9M
의 경우는 2의 부분을 가리킨다.
MD 태그
MD tag 는 3S6M
와 61G22C15
와 같은 태그로, 참조 배열을 보지 않고, 미스매치나 Deletion 의 배열을 확인할 수 있다. (참고)[ ㅡㅡㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜ bgs포 t. jp / 2012/07 / 데이 ply - 응 rs 단지 g-m-gs. HTML ]
65^GAC35
그렇다면, 61 베이스 레퍼런스와 일치(혹은 Insertion) 후, 레퍼런스에서는 G이지만 read에서는 "무언가"로 바뀌고 있다. 그 후, 22 베이스 일치(혹은 Insertion) 하고, 레퍼런스가 C 의 미스매치가 있고, 그 후 15 베이스 일치(혹은 Insertion) 하고 있다.
61G22C15
의 ^GAC는 참조 서열의 GAC 부분이 deletion이 되어 있음을 나타낸다.
Insertion의 정보는 MD tag에는 포함되지 않는다(빠져 있다). 따라서, 리드의 각 베이스의 레퍼런스 배열에 있어서의 위치를 확인하는 경우는, CIGAR와 조합할 필요가 있다.
덧붙여서, 만약 MD tag가 빠져 있는 경우는 65^GAC35
로 보완해 준다.
1-based 및 0-based
기준 서열에 대한 게놈상의 위치를 나타내는 경우, 1-based 및 0-based position이 있다.
따옴표:
대단히 쉬운 자료
sam file은 1-based position을 사용하고 있다.
이번에는 돌연변이를 나타내는데 0-based position을 사용한다.
MD와 CIGAR를 결합하여 돌연변이 추출
조금 까다롭고, 이런 느낌의 코드가 되었다.
htps : // 기주 b. 코 m/우스야마/ゔぁ리안 t_파르세 r/bぉb/마s테 r/사 m_파르세 r. rb
별로 자신이 없다.
메인 부분은 아래와 같은 느낌.
@variants = []
while cigar_idx < cigar.length and md_idx < md.length
match([current_cigar.type, current_md.type]) do
with _[:soft, _] {
@variants << current_cigar.clone
get_next_cigar.call
}
with _[_, :del] {
current_cigar.ref = current_md.ref
@variants << current_cigar.clone
get_next_cigar.call
get_next_md.call
}
with _[_, :mismatch] {
@variants << Variant.new({:type => :mismatch,
:ref => current_md.ref,
:len => 1})
current_cigar.len -= 1
get_next_md.call
}
with _[:ins, :match] {
@variants << current_cigar.clone
get_next_cigar.call
}
with _[:match, :match] {
if current_cigar.len > current_md.len
@variants << Variant.new({:type => :match, :len => current_md.len })
current_cigar.len -= current_md.len
get_next_md.call
get_next_cigar.call if current_cigar.len == 0
else
@variants << current_cigar.clone
current_md.len -= current_cigar.len
get_next_cigar.call
get_next_md.call if current_md.len == 0
end
}
end
end
C++에서도 구현했습니다. 여기
Reference
이 문제에 관하여(Sam 파일의 CIGAR string, MD tag에서 돌연변이 (mismatch & indels) 얻기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/usuyama/items/2338cb7f75aa9407a1c2
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
TCGATCGA
1 2
MD tag 는
3S6M
와 61G22C15
와 같은 태그로, 참조 배열을 보지 않고, 미스매치나 Deletion 의 배열을 확인할 수 있다. (참고)[ ㅡㅡㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜ bgs포 t. jp / 2012/07 / 데이 ply - 응 rs 단지 g-m-gs. HTML ]65^GAC35
그렇다면, 61 베이스 레퍼런스와 일치(혹은 Insertion) 후, 레퍼런스에서는 G이지만 read에서는 "무언가"로 바뀌고 있다. 그 후, 22 베이스 일치(혹은 Insertion) 하고, 레퍼런스가 C 의 미스매치가 있고, 그 후 15 베이스 일치(혹은 Insertion) 하고 있다.61G22C15
의 ^GAC는 참조 서열의 GAC 부분이 deletion이 되어 있음을 나타낸다.Insertion의 정보는 MD tag에는 포함되지 않는다(빠져 있다). 따라서, 리드의 각 베이스의 레퍼런스 배열에 있어서의 위치를 확인하는 경우는, CIGAR와 조합할 필요가 있다.
덧붙여서, 만약 MD tag가 빠져 있는 경우는
65^GAC35
로 보완해 준다.1-based 및 0-based
기준 서열에 대한 게놈상의 위치를 나타내는 경우, 1-based 및 0-based position이 있다.
따옴표:
대단히 쉬운 자료
sam file은 1-based position을 사용하고 있다.
이번에는 돌연변이를 나타내는데 0-based position을 사용한다.
MD와 CIGAR를 결합하여 돌연변이 추출
조금 까다롭고, 이런 느낌의 코드가 되었다.
htps : // 기주 b. 코 m/우스야마/ゔぁ리안 t_파르세 r/bぉb/마s테 r/사 m_파르세 r. rb
별로 자신이 없다.
메인 부분은 아래와 같은 느낌.
@variants = []
while cigar_idx < cigar.length and md_idx < md.length
match([current_cigar.type, current_md.type]) do
with _[:soft, _] {
@variants << current_cigar.clone
get_next_cigar.call
}
with _[_, :del] {
current_cigar.ref = current_md.ref
@variants << current_cigar.clone
get_next_cigar.call
get_next_md.call
}
with _[_, :mismatch] {
@variants << Variant.new({:type => :mismatch,
:ref => current_md.ref,
:len => 1})
current_cigar.len -= 1
get_next_md.call
}
with _[:ins, :match] {
@variants << current_cigar.clone
get_next_cigar.call
}
with _[:match, :match] {
if current_cigar.len > current_md.len
@variants << Variant.new({:type => :match, :len => current_md.len })
current_cigar.len -= current_md.len
get_next_md.call
get_next_cigar.call if current_cigar.len == 0
else
@variants << current_cigar.clone
current_md.len -= current_cigar.len
get_next_cigar.call
get_next_md.call if current_md.len == 0
end
}
end
end
C++에서도 구현했습니다. 여기
Reference
이 문제에 관하여(Sam 파일의 CIGAR string, MD tag에서 돌연변이 (mismatch & indels) 얻기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/usuyama/items/2338cb7f75aa9407a1c2
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
조금 까다롭고, 이런 느낌의 코드가 되었다.
htps : // 기주 b. 코 m/우스야마/ゔぁ리안 t_파르세 r/bぉb/마s테 r/사 m_파르세 r. rb
별로 자신이 없다.
메인 부분은 아래와 같은 느낌.
@variants = []
while cigar_idx < cigar.length and md_idx < md.length
match([current_cigar.type, current_md.type]) do
with _[:soft, _] {
@variants << current_cigar.clone
get_next_cigar.call
}
with _[_, :del] {
current_cigar.ref = current_md.ref
@variants << current_cigar.clone
get_next_cigar.call
get_next_md.call
}
with _[_, :mismatch] {
@variants << Variant.new({:type => :mismatch,
:ref => current_md.ref,
:len => 1})
current_cigar.len -= 1
get_next_md.call
}
with _[:ins, :match] {
@variants << current_cigar.clone
get_next_cigar.call
}
with _[:match, :match] {
if current_cigar.len > current_md.len
@variants << Variant.new({:type => :match, :len => current_md.len })
current_cigar.len -= current_md.len
get_next_md.call
get_next_cigar.call if current_cigar.len == 0
else
@variants << current_cigar.clone
current_md.len -= current_cigar.len
get_next_cigar.call
get_next_md.call if current_md.len == 0
end
}
end
end
C++에서도 구현했습니다. 여기
Reference
이 문제에 관하여(Sam 파일의 CIGAR string, MD tag에서 돌연변이 (mismatch & indels) 얻기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/usuyama/items/2338cb7f75aa9407a1c2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)