void bcf_sr_destroy(bcf_srs_t *files) { int i; for (i=0; i<files->nreaders; i++) bcf_sr_destroy1(&files->readers[i]); free(files->has_line); free(files->readers); for (i=0; i<files->n_smpl; i++) free(files->samples[i]); free(files->samples); if (files->targets) bcf_sr_regions_destroy(files->targets); if (files->regions) bcf_sr_regions_destroy(files->regions); if ( files->tmps.m ) free(files->tmps.s); free(files); }
void destroy(void) { bcf_sr_regions_destroy(exons); }
int bcf_sr_regions_next(bcf_sr_regions_t *reg) { if ( reg->iseq<0 ) return -1; reg->start = reg->end = -1; reg->nals = 0; // using in-memory regions if ( reg->regs ) { while ( reg->iseq < reg->nseqs ) { reg->regs[reg->iseq].creg++; if ( reg->regs[reg->iseq].creg < reg->regs[reg->iseq].nregs ) break; reg->iseq++; } if ( reg->iseq >= reg->nseqs ) { reg->iseq = -1; return -1; } // no more regions left region1_t *creg = ®->regs[reg->iseq].regs[reg->regs[reg->iseq].creg]; reg->start = creg->start; reg->end = creg->end; return 0; } // reading from tabix char *chr, *chr_end; int ichr = 0, ifrom = 1, ito = 2, is_bed = 0, from, to; if ( reg->tbx ) { ichr = reg->tbx->conf.sc-1; ifrom = reg->tbx->conf.bc-1; ito = reg->tbx->conf.ec-1; if ( ito<0 ) ito = ifrom; is_bed = reg->tbx->conf.preset==TBX_UCSC ? 1 : 0; } int ret = 0; while ( !ret ) { if ( reg->itr ) { // tabix index present, reading a chromosome block ret = tbx_itr_next(reg->file, reg->tbx, reg->itr, ®->line); if ( ret<0 ) { reg->iseq = -1; return -1; } } else { if ( reg->is_bin ) { // Waited for seek which never came. Reopen in text mode and stream // through the regions, otherwise hts_getline would fail hts_close(reg->file); reg->file = hts_open(reg->fname, "r"); if ( !reg->file ) { fprintf(stderr,"[%s:%d %s] Could not open file: %s\n", __FILE__,__LINE__,__FUNCTION__,reg->fname); reg->file = NULL; bcf_sr_regions_destroy(reg); return -1; } reg->is_bin = 0; } // tabix index absent, reading the whole file ret = hts_getline(reg->file, KS_SEP_LINE, ®->line); if ( ret<0 ) { reg->iseq = -1; return -1; } } ret = _regions_parse_line(reg->line.s, ichr,ifrom,ito, &chr,&chr_end,&from,&to); if ( ret<0 ) { fprintf(stderr,"[%s:%d] Could not parse the file %s, using the columns %d,%d,%d\n", __FILE__,__LINE__,reg->fname,ichr+1,ifrom+1,ito+1); return -1; } } if ( is_bed ) from++; *chr_end = 0; if ( khash_str2int_get(reg->seq_hash, chr, ®->iseq)<0 ) { fprintf(stderr,"Broken tabix index? The sequence \"%s\" not in dictionary [%s]\n", chr,reg->line.s); exit(1); } *chr_end = '\t'; reg->start = from - 1; reg->end = to - 1; return 0; }