]> git.donarmstrong.com Git - samtools.git/commitdiff
fixed a bug in indexing
authorHeng Li <lh3@live.co.uk>
Fri, 17 Sep 2010 01:36:01 +0000 (01:36 +0000)
committerHeng Li <lh3@live.co.uk>
Fri, 17 Sep 2010 01:36:01 +0000 (01:36 +0000)
bcftools/bcf.h
bcftools/call1.c
bcftools/index.c

index d0f9b02bb5b554df977c2202902605c0642cf223..b52f36721d66a248530eef27c37d8881f1543a6a 100644 (file)
@@ -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);
index 08d759d453e92fc907e03431ccb3120a012f7ebf..6b5c47bff1aecaa3d5eeefa1b865cbcdd8979ff3 100644 (file)
@@ -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);
                        }
index 768519cb170c2663c5b1b0e6d88c0bf43eaa7751..014856d2dd560cc288c9bdc3afbd3bf600ba1ea6 100644 (file)
@@ -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;
 }