func New(path string, n ...int) (*Tbx, error) { if !(xopen.Exists(path) && (xopen.Exists(path+".tbi") || xopen.Exists(path+".csi"))) { return nil, fmt.Errorf("need gz file and .tbi for %s", path) } size := 20 if len(n) > 0 { size = n[0] } t := &Tbx{path: path} cs, mode := C.CString(t.path), C.char('r') defer C.free(unsafe.Pointer(cs)) t.htfs = make(chan *C.htsFile, size) for i := 0; i < cap(t.htfs); i++ { t.htfs <- C.hts_open(cs, &mode) } t.kCache = make(chan C.kstring_t, size*2) for i := 0; i < cap(t.kCache); i++ { t.kCache <- C.kstring_t{} } t.chromCache = make(map[string]C.int) if xopen.Exists(path + ".csi") { csi := C.CString(path + ".csi") defer C.free(unsafe.Pointer(csi)) t.tbx = C.tbx_index_load2(cs, csi) } else { t.tbx = C.tbx_index_load(cs) } runtime.SetFinalizer(t, _close) return t, nil }
// New takes a path to a bgziped (and tabixed file) and returns the tabix struct. func New(path string) (*Tabix, error) { if !(xopen.Exists(path) && xopen.Exists(path+".tbi")) { return nil, fmt.Errorf("need gz file and .tbi for %s", path) } t := &Tabix{path: path} cs := C.CString(t.path) defer C.free(unsafe.Pointer(cs)) mode := C.char('r') t.htf = C.hts_open(cs, &mode) t.tbx = C.tbx_index_load(cs) runtime.SetFinalizer(t, tabixCloser) if strings.HasSuffix(path, ".bed.gz") { t.typ = BED } else if strings.HasSuffix(path, ".vcf.gz") { t.hdr = C.bcf_hdr_read(t.htf) t.typ = VCF } else { t.typ = OTHER } t.original_header = true return t, nil }