溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++使用htslib庫讀入和寫出bam文件的實(shí)例

發(fā)布時(shí)間:2020-10-16 13:50:14 來源:腳本之家 閱讀:259 作者:ywliao 欄目:編程語言

有時(shí)候我們需要使用C++處理bam文件,比如取出read1或者read2等符合特定條件的序列,根據(jù)cigar值對(duì)序列指定位置的堿基進(jìn)行統(tǒng)計(jì)或者對(duì)序列進(jìn)行處理并輸出等,這時(shí)我們可以使用htslib庫。htslib可以用來處理SAM, BAM,CRAM 和VCF文件,是samtools、bcftools的核心庫。

#include <stdio.h>
#include <stdlib.h>
#include <htslib/sam.h>

using namespace std; 

#define bam_is_read1(b) (((b)->core.flag&BAM_FREAD1) != 0)

uint8_t Base[16] = {0,65,67,0,71,0,0,0,84,0,0,0,0,0,0,78};

int main(int argc, char **argv)
{
 bam_hdr_t *header;
 bam1_t *aln = bam_init1();

 samFile *in = sam_open(argv[1], "r");
 htsFile *outR1 = hts_open(argv[2], "wb");
 header = sam_hdr_read(in);
 if (sam_hdr_write(outR1, header) < 0) {
 fprintf(stderr, "Error writing output.\n");
 exit(-1);
 }
 uint8_t *seq;
 int32_t lseq;
 uint32_t *cigar;
 char* qname;
 while (sam_read1(in, header, aln) >= 0) {
 if (bam_is_read1(aln)){
  sam_write1(outR1, header, aln);
 }
 else {
  seq = bam_get_seq(aln);
  lseq = aln->core.l_qseq;
  qname = bam_get_qname(aln);
  printf("%s\n",qname);
  cigar = bam_get_cigar(aln);
  for(int i=0; i < aln->core.n_cigar;++i){
  int icigar = cigar[i];
  printf("%d%d\n",bam_cigar_op(icigar),bam_cigar_oplen(icigar));
  }
  for(int i=0; i < lseq;++i){
  printf("%c", Base[bam_seqi(seq, i)]);
  }
  printf("\n");

 }
 }
 sam_close(in);
 sam_close(outR1);
}

cigar值存儲(chǔ)形式

32位int,通過bam_get_cigar獲得地址,aln->core.n_cigar返回cigar operation的個(gè)數(shù)

•低 4位存儲(chǔ)cigar operation;通過函數(shù)bam_cigar_op()獲得operation

C++使用htslib庫讀入和寫出bam文件的實(shí)例

•高28位存儲(chǔ)cigar值的長(zhǎng)度;通過函數(shù),bam_cigar_oplen獲得

seq存儲(chǔ)形式

8位int,4位存儲(chǔ)一個(gè)堿基,1,2,4,8,15分別代表A、C、G、T、N,高四位存儲(chǔ)坐標(biāo)數(shù)較小的堿基,可通過bam_seqi(seq,i)遍歷。

以上這篇C++使用htslib庫讀入和寫出bam文件的實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持億速云。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI