#include <getopt.h>
#include <unistd.h>
#include <htslib/sam.h>
static void print_usage(FILE *fp)
{
fprintf(fp, "Usage: read_bam infile\n\
Shows the alignment data from file\n");
}
int main(int argc, char *argv[])
{
const char *inname = NULL, *tidname = NULL, *flags = NULL;
int ret = EXIT_FAILURE;
sam_hdr_t *in_samhdr = NULL;
samFile *infile = NULL;
int ret_r = 0, i = 0;
bam1_t *bamdata = NULL;
uint8_t *data = NULL;
uint32_t *cigar = NULL;
if (argc != 2) {
print_usage(stderr);
goto end;
}
inname = argv[1];
if (!(bamdata = bam_init1())) {
printf("Failed to allocate data memory!\n");
goto end;
}
if (!(infile = sam_open(inname, "r"))) {
printf("Could not open %s\n", inname);
goto end;
}
if (!(in_samhdr = sam_hdr_read(infile))) {
printf("Failed to read header from file!\n");
goto end;
}
while ((ret_r = sam_read1(infile, in_samhdr, bamdata)) >= 0)
{
printf("NAME: %s\n", bam_get_qname(bamdata)); flags = bam_flag2str(bamdata->core.flag); printf("FLG: %d - %s\n", bamdata->core.flag, flags); free((void*)flags);
tidname = sam_hdr_tid2name(in_samhdr, bamdata->core.tid);
printf("RNAME/TID: %d - %s\n", bamdata->core.tid, tidname? tidname: "" ); printf("POS: %"PRIhts_pos"\n", bamdata->core.pos + 1); printf("MQUAL: %d\n", bamdata->core.qual);
cigar = bam_get_cigar(bamdata); printf("CGR: ");
for (i = 0; i < bamdata->core.n_cigar; ++i) { printf("%d%c", bam_cigar_oplen(cigar[i]), bam_cigar_opchr(cigar[i])); }
printf("\nTLEN/ISIZE: %"PRIhts_pos"\n", bamdata->core.isize);
data = bam_get_seq(bamdata); if (bamdata->core.l_qseq != bam_cigar2qlen(bamdata->core.n_cigar, cigar)) { printf("\nLength doesnt matches to cigar data\n");
goto end;
}
printf("SEQ: ");
for (i = 0; i < bamdata->core.l_qseq ; ++i) { printf("%c", seq_nt16_str[bam_seqi(data, i)]); }
printf("\nQUAL: ");
for (int i = 0; i < bamdata->core.l_qseq ; ++i) {
printf("%c", bam_get_qual(bamdata)[i]+33); }
printf("\n\n");
}
if (ret_r == -1) {
ret = EXIT_SUCCESS;
}
else {
printf("Failed to read data\n");
}
end:
if (in_samhdr) {
sam_hdr_destroy(in_samhdr);
}
if (infile) {
sam_close(infile);
}
if (bamdata) {
bam_destroy1(bamdata);
}
return ret;
}