X-Git-Url: http://woldlab.caltech.edu/gitweb/?p=samtools.git;a=blobdiff_plain;f=examples%2Fbam2bed.c;fp=examples%2Fbam2bed.c;h=bb937d1f9fa71bd7ec335e5c40569298c957b09f;hp=0000000000000000000000000000000000000000;hb=cb12a866906ec4ac644de0e658679261c82ab098;hpb=3a3b72190c04cb076438f5027e13fcf5ddee77be diff --git a/examples/bam2bed.c b/examples/bam2bed.c new file mode 100644 index 0000000..bb937d1 --- /dev/null +++ b/examples/bam2bed.c @@ -0,0 +1,51 @@ +#include +#include "sam.h" +static int fetch_func(const bam1_t *b, void *data) +{ + samfile_t *fp = (samfile_t*)data; + uint32_t *cigar = bam1_cigar(b); + const bam1_core_t *c = &b->core; + int i, l; + if (b->core.tid < 0) return 0; + for (i = l = 0; i < c->n_cigar; ++i) { + int op = cigar[i]&0xf; + if (op == BAM_CMATCH || op == BAM_CDEL || op == BAM_CREF_SKIP) + l += cigar[i]>>4; + } + printf("%s\t%d\t%d\t%s\t%d\t%c\n", fp->header->target_name[c->tid], + c->pos, c->pos + l, bam1_qname(b), c->qual, (c->flag&BAM_FREVERSE)? '-' : '+'); + return 0; +} +int main(int argc, char *argv[]) +{ + samfile_t *fp; + if (argc == 1) { + fprintf(stderr, "Usage: bam2bed [region]\n"); + return 1; + } + if ((fp = samopen(argv[1], "rb", 0)) == 0) { + fprintf(stderr, "bam2bed: Fail to open BAM file %s\n", argv[1]); + return 1; + } + if (argc == 2) { /* if a region is not specified */ + bam1_t *b = bam_init1(); + while (samread(fp, b) >= 0) fetch_func(b, fp); + bam_destroy1(b); + } else { + int ref, beg, end; + bam_index_t *idx; + if ((idx = bam_index_load(argv[1])) == 0) { + fprintf(stderr, "bam2bed: BAM indexing file is not available.\n"); + return 1; + } + bam_parse_region(fp->header, argv[2], &ref, &beg, &end); + if (ref < 0) { + fprintf(stderr, "bam2bed: Invalid region %s\n", argv[2]); + return 1; + } + bam_fetch(fp->x.bam, idx, ref, beg, end, fp, fetch_func); + bam_index_destroy(idx); + } + samclose(fp); + return 0; +}