高通量数据BAM格式分析包HTSlib使用方法

举报
benymorre 发表于 2019/03/16 21:54:28 2019/03/16
4.5k+ 0 0
【摘要】 首先安装依赖的包wget tar -zxvf xz-5.2.4.tar.gzcd xz-5.2.4./configuremake && make installwget ftp://ftp.invisible-island.net/ncurses/ncurses-6.0.tar.gztar -zxvf ncurses-6.0.tar.gzcd ncurses-6.0./configurem...

首先安装依赖的包

wget https://tukaani.org/xz/xz-5.2.4.tar.gz
tar -zxvf xz-5.2.4.tar.gz
cd xz-5.2.4
./configure
make && make install

wget ftp://ftp.invisible-island.net/ncurses/ncurses-6.0.tar.gz
tar -zxvf ncurses-6.0.tar.gz
cd ncurses-6.0
./configure
make && make install

其次

htslib和samtools

wget https://github.com/samtools/htslib/releases/download/1.9/htslib-1.9.tar.bz2
tar -vxjf htslib-1.9.tar.bz2
cd htslib-1.9
make

wget https://github.com/samtools/samtools/releases/download/1.9/samtools-1.9.tar.bz2
tar -vxjf samtools-1.9.tar.bz2
cd samtools-1.9
mak

写好测试代码 parseBam.cpp , 进行编译

#include <iostream>
#include <stdio.h>
#include <stdexcept>
#include <sam.h>
#include <hts.h>

using namespace std;

int usage() {
    cerr << "./parse_bam example.bam";
    return 0;
}

int parse_bam(int argc, char* argv[]) {
    if(argc < 2) {
        return usage();
    }

    string bam = string(argv[1]);
    string region_ = ".";
    if(argc > 2) {
        region_ = string(argv[2]);
    }
    if(!bam.empty()) {

        htsFile *in = hts_open(bam.c_str(), "r");
        bam_hdr_t *header = sam_hdr_read(in);
        hts_itr_t *iter = NULL;

        iter  = sam_itr_querys(idx, header, region_.c_str());

        bam1_t *aln = bam_init1();
        while(sam_itr_next(in, iter, aln) >= 0) {
            printf ("Read %s\tChr: %s" , bam_get_qname(aln) , header->target_name[aln->core.tid]);
            printf ("\tPos: %d" , aln->core.pos);
            string seq, qual;
            uint8_t *quali = bam_get_qual(aln);
            uint8_t *seqi = bam_get_seq(aln);
            for (int i = 0; i < aln->core.l_qseq; i++) {
                seq += seq_nt16_str[bam_seqi(seqi, i)];
                qual += 33 + quali[i];
            }

            printf("\tSeq: %s\tQual: %s" , seq.c_str(),  qual.c_str() );
            printf("\n") ;
        }

        hts_itr_destroy(iter);
        bam_destroy1(aln);
        bam_hdr_destroy(header);
        
        sam_close(in);
    }
    return 0;
}

int main(int argc, char* argv[]) {
    try {
        parse_bam(argc, argv);
    } catch (const runtime_error& e) {
        cerr << e.what();
    }
}

假设 htslib和samtools 都安装在root路径下,按照如下命令编译  

g++ parseBam.cpp -o parseBAM -I/root/htslib/htslib -L/root/samtools -lhts -std=c++11

成可执行文件parseBam, 第一个参数是bam文件,第二个参数是chrN:start-end,  最后执行程序如下:

 parseBam example.bam chr9:79327223-79387223

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。