From 4e4e3fdee9dd2331d38effa3f3af29a0a2c4f268 Mon Sep 17 00:00:00 2001 From: Heng Li Date: Fri, 17 Sep 2010 01:36:01 +0000 Subject: [PATCH] fixed a bug in indexing --- bcftools/bcf.h | 2 +- bcftools/call1.c | 6 +++++- bcftools/index.c | 24 ++++++------------------ 3 files changed, 12 insertions(+), 20 deletions(-) diff --git a/bcftools/bcf.h b/bcftools/bcf.h index d0f9b02..b52f367 100644 --- a/bcftools/bcf.h +++ b/bcftools/bcf.h @@ -75,7 +75,7 @@ extern "C" { void *bcf_str2id_init(); int bcf_idx_build(const char *fn); - uint64_t bcf_idx_query(const bcf_idx_t *idx, int tid, int beg, int end); + uint64_t bcf_idx_query(const bcf_idx_t *idx, int tid, int beg); int bcf_parse_region(void *str2id, const char *str, int *tid, int *begin, int *end); bcf_idx_t *bcf_idx_load(const char *fn); void bcf_idx_destroy(bcf_idx_t *idx); diff --git a/bcftools/call1.c b/bcftools/call1.c index 08d759d..6b5c47b 100644 --- a/bcftools/call1.c +++ b/bcftools/call1.c @@ -277,7 +277,11 @@ int bcfview(int argc, char *argv[]) idx = bcf_idx_load(argv[optind]); if (idx) { uint64_t off; - off = bcf_idx_query(idx, tid, begin, end); + off = bcf_idx_query(idx, tid, begin); + if (off == 0) { + fprintf(stderr, "[%s] no records in the query region.\n", __func__); + return 1; // FIXME: a lot of memory leaks... + } bgzf_seek(bp->fp, off, SEEK_SET); bcf_idx_destroy(idx); } diff --git a/bcftools/index.c b/bcftools/index.c index 768519c..014856d 100644 --- a/bcftools/index.c +++ b/bcftools/index.c @@ -45,17 +45,6 @@ static inline void insert_offset2(bcf_lidx_t *index2, int _beg, int _end, uint64 if (index2->n < end + 1) index2->n = end + 1; } -static void fill_missing(bcf_idx_t *idx) -{ - int i, j; - for (i = 0; i < idx->n; ++i) { - bcf_lidx_t *idx2 = &idx->index2[i]; - for (j = 1; j < idx2->n; ++j) - if (idx2->offset[j] == 0) - idx2->offset[j] = idx2->offset[j-1]; - } -} - bcf_idx_t *bcf_idx_core(bcf_t *bp, bcf_hdr_t *h) { bcf_idx_t *idx; @@ -89,7 +78,6 @@ bcf_idx_t *bcf_idx_core(bcf_t *bp, bcf_hdr_t *h) last_off = bgzf_tell(fp); last_coor = b->pos; } - fill_missing(idx); free(str->s); free(str); bcf_destroy(b); return idx; } @@ -325,14 +313,14 @@ int bcf_parse_region(void *str2id, const char *str, int *tid, int *begin, int *e * retrieve a specified region * *******************************/ -uint64_t bcf_idx_query(const bcf_idx_t *idx, int tid, int beg, int end) +uint64_t bcf_idx_query(const bcf_idx_t *idx, int tid, int beg) { - uint64_t min_off; + uint64_t min_off, *offset; + int i; if (beg < 0) beg = 0; - if (end < beg) return 0xffffffffffffffffull; - min_off = (beg>>TAD_LIDX_SHIFT >= idx->index2[tid].n)? idx->index2[tid].offset[idx->index2[tid].n-1] - : idx->index2[tid].offset[beg>>TAD_LIDX_SHIFT]; - assert(min_off); + offset = idx->index2[tid].offset; + for (i = beg>>TAD_LIDX_SHIFT; i < idx->index2[tid].n && offset[i] == 0; ++i); + min_off = (i == idx->index2[tid].n)? offset[idx->index2[tid].n-1] : offset[i]; return min_off; } -- 2.39.5