有时候我们需要采取C++处理bam文件,比如取出read1或者read2等符合特定条件的队列,遵照cigar值对队列指定地方的碱基举行统计或者对队列进行处理并出口等,这时大家可以利用htslib库。htslib可以用来处理SAM,
BAM,CRAM 和VCF文件,是samtools、bcftools的核心库。

31–round(),floor()和ceiling()

  • round()四舍五入取整
  • floor()向下取整
  • ceiling()向上取整

> round(3.5)
[1] 4
> floor(3.5)
[1] 3
> ceiling(3.5)
[1] 4
#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);
}

32–factorial( )

factorial()为阶乘函数

> factorial(3)
[1] 6

cigar值存储格局

32位int,通过bam_get_cigar得到地点,aln->core.n_cigar返回cigar
operation的个数

  • 低 4位存储cigar operation;通过函数bam_cigar_op()获得operation
    图片 1
  • 高28位存储cigar值的长度;通过函数,bam_cigar_oplen获得

33–nlm( )

nlm()用来求函数的最小值

> nlm(function(x) return(x^2-sin(x)), 8)
$minimum
[1] -0.2324656

$estimate
[1] 0.4501831

$gradient
[1] 4.024558e-09

$code
[1] 1

$iterations
[1] 5

seq存储情势

8位int,4位存储一个碱基,1,2,4,8,15独家代表A、C、G、T、N,高四位存储坐标数较小的碱基,可通过bam_seqi(seq,i)遍历。

34–总结分布函数

  • d 对应概率密度函数
  • p 对应累积分布函数
  • q 对应遍布的分位数
  • r 对应随意数生成函数

> dnorm(0)
[1] 0.3989423
> pnorm(0)
[1] 0.5
> rnorm(10)
 [1]  0.23687896 -0.06802170 -0.08102438  0.63635970
 [5]  0.17326884  0.20388754  0.62996081  1.74229465
 [9]  0.12313148 -0.37888588
> qnorm(0.5)
[1] 0

参考资料

htslib
sam.h文件:https://github.com/samtools/htslib/blob/develop/htslib/sam.h
htslib
sam文件格式表达:https://github.com/samtools/hts-specs/blob/master/SAMv1.pdf

35–crossprod( )

crossprod( )用来总括几个向量的内积

> crossprod(1:3, c(5, 12, 13))
     [,1]
[1,]   68

以此函数统计的是1*5+2*12+3*13=68