时间:2021-05-20
有时候我们需要使用C++处理bam文件,比如取出read1或者read2等符合特定条件的序列,根据cigar值对序列指定位置的碱基进行统计或者对序列进行处理并输出等,这时我们可以使用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值存储形式
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文件的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
C/C++如何获取当前系统时间的实例详解C库中与系统时间相关的函数定义在头文件中,C++定义在头文件中。一、time(time_t*)函数函数定义如下:time
本文实例讲述了C++获得文件状态信息的方法。分享给大家供大家参考。具体如下://C++获得文件状态信息源码,//C++获得文件所在磁盘盘符源码,//C++文件创
原理python没有办法直接和c++共享内存交互,需要间接调用c++打包好的库来实现流程C++共享内存打包成库python调用C++库往共享内存存图像数据C++
C++中动态链接库--导入和导出的实例详解__declspec(dllexport)和__declspec(dllimport):__declspec(dlle
本文实例为大家分享了C++连接并使用MySQL数据库的具体代码,供大家参考,具体内容如下1.C++连接MySQL数据库首先在VS里新建C++工程项目,右键工程项