有時候我們需要使用C++處理bam文件,比如取出read1或者read2等符合特定條件的序列,根據cigar值對序列指定位置的堿基進行統計或者對序列進行處理并輸出等,這時我們可以使用htslib庫。htslib可以用來處理SAM, BAM,CRAM 和VCF文件,是samtools、bcftools的核心庫。
發展壯大離不開廣大客戶長期以來的信賴與支持,我們將始終秉承“誠信為本、服務至上”的服務理念,堅持“二合一”的優良服務模式,真誠服務每家企業,認真做好每個細節,不斷完善自我,成就企業,實現共贏。行業涉及成都紙箱等,在網站建設公司、營銷型網站建設、WAP手機網站、VI設計、軟件開發等項目上具有豐富的設計經驗。
#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值存儲形式
32位int,通過bam_get_cigar獲得地址,aln->core.n_cigar返回cigar operation的個數
•低 4位存儲cigar operation;通過函數bam_cigar_op()獲得operation
•高28位存儲cigar值的長度;通過函數,bam_cigar_oplen獲得
seq存儲形式
8位int,4位存儲一個堿基,1,2,4,8,15分別代表A、C、G、T、N,高四位存儲坐標數較小的堿基,可通過bam_seqi(seq,i)遍歷。
以上這篇C++使用htslib庫讀入和寫出bam文件的實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持創新互聯。
分享名稱:C++使用htslib庫讀入和寫出bam文件的實例
文章出自:http://vcdvsql.cn/article24/pcojje.html
成都網站建設公司_創新互聯,為您提供ChatGPT、靜態網站、網站設計公司、商城網站、自適應網站、服務器托管
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯