@gmod/tabix 1.5.0 → 1.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +3 -2
  3. package/dist/chunk.js +34 -62
  4. package/dist/chunk.js.map +1 -0
  5. package/dist/csi.d.ts +0 -1
  6. package/dist/csi.js +329 -533
  7. package/dist/csi.js.map +1 -0
  8. package/dist/index.js +12 -36
  9. package/dist/index.js.map +1 -0
  10. package/dist/indexFile.d.ts +1 -1
  11. package/dist/indexFile.js +113 -174
  12. package/dist/indexFile.js.map +1 -0
  13. package/dist/tabixIndexedFile.d.ts +8 -4
  14. package/dist/tabixIndexedFile.js +477 -774
  15. package/dist/tabixIndexedFile.js.map +1 -0
  16. package/dist/tbi.js +313 -485
  17. package/dist/tbi.js.map +1 -0
  18. package/dist/util.js +133 -148
  19. package/dist/util.js.map +1 -0
  20. package/dist/virtualOffset.js +45 -68
  21. package/dist/virtualOffset.js.map +1 -0
  22. package/esm/chunk.d.ts +18 -0
  23. package/esm/chunk.js +33 -0
  24. package/esm/chunk.js.map +1 -0
  25. package/esm/csi.d.ts +71 -0
  26. package/esm/csi.js +230 -0
  27. package/esm/csi.js.map +1 -0
  28. package/esm/index.d.ts +4 -0
  29. package/esm/index.js +5 -0
  30. package/esm/index.js.map +1 -0
  31. package/esm/indexFile.d.ts +32 -0
  32. package/esm/indexFile.js +40 -0
  33. package/esm/indexFile.js.map +1 -0
  34. package/esm/tabixIndexedFile.d.ts +118 -0
  35. package/esm/tabixIndexedFile.js +398 -0
  36. package/esm/tabixIndexedFile.js.map +1 -0
  37. package/esm/tbi.d.ts +45 -0
  38. package/esm/tbi.js +216 -0
  39. package/esm/tbi.js.map +1 -0
  40. package/esm/util.d.ts +25 -0
  41. package/esm/util.js +91 -0
  42. package/esm/util.js.map +1 -0
  43. package/esm/virtualOffset.d.ts +10 -0
  44. package/esm/virtualOffset.js +37 -0
  45. package/esm/virtualOffset.js.map +1 -0
  46. package/package.json +27 -44
  47. package/src/chunk.ts +52 -0
  48. package/src/csi.ts +277 -0
  49. package/src/declare.d.ts +2 -0
  50. package/src/index.ts +5 -0
  51. package/src/indexFile.ts +79 -0
  52. package/src/tabixIndexedFile.ts +519 -0
  53. package/src/tbi.ts +250 -0
  54. package/src/util.ts +103 -0
  55. package/src/virtualOffset.ts +47 -0
  56. package/dist/declare.d.js +0 -2
package/esm/csi.js ADDED
@@ -0,0 +1,230 @@
1
+ import Long from 'long';
2
+ import { unzip } from '@gmod/bgzf-filehandle';
3
+ import VirtualOffset, { fromBytes } from './virtualOffset';
4
+ import Chunk from './chunk';
5
+ import { longToNumber, optimizeChunks } from './util';
6
+ import IndexFile from './indexFile';
7
+ const CSI1_MAGIC = 21582659; // CSI\1
8
+ const CSI2_MAGIC = 38359875; // CSI\2
9
+ function lshift(num, bits) {
10
+ return num * 2 ** bits;
11
+ }
12
+ function rshift(num, bits) {
13
+ return Math.floor(num / 2 ** bits);
14
+ }
15
+ export default class CSI extends IndexFile {
16
+ constructor(args) {
17
+ super(args);
18
+ this.maxBinNumber = 0;
19
+ this.depth = 0;
20
+ this.minShift = 0;
21
+ }
22
+ async lineCount(refName, opts = {}) {
23
+ const indexData = await this.parse(opts);
24
+ if (!indexData) {
25
+ return -1;
26
+ }
27
+ const refId = indexData.refNameToId[refName];
28
+ const idx = indexData.indices[refId];
29
+ if (!idx) {
30
+ return -1;
31
+ }
32
+ const { stats } = indexData.indices[refId];
33
+ if (stats) {
34
+ return stats.lineCount;
35
+ }
36
+ return -1;
37
+ }
38
+ async indexCov() {
39
+ throw new Error('CSI indexes do not support indexcov');
40
+ return [];
41
+ }
42
+ parseAuxData(bytes, offset, auxLength) {
43
+ if (auxLength < 30) {
44
+ return {
45
+ refIdToName: [],
46
+ refNameToId: {},
47
+ };
48
+ }
49
+ const formatFlags = bytes.readInt32LE(offset);
50
+ const coordinateType = formatFlags & 0x10000 ? 'zero-based-half-open' : '1-based-closed';
51
+ const format = { 0: 'generic', 1: 'SAM', 2: 'VCF' }[formatFlags & 0xf];
52
+ if (!format) {
53
+ throw new Error(`invalid Tabix preset format flags ${formatFlags}`);
54
+ }
55
+ const columnNumbers = {
56
+ ref: bytes.readInt32LE(offset + 4),
57
+ start: bytes.readInt32LE(offset + 8),
58
+ end: bytes.readInt32LE(offset + 12),
59
+ };
60
+ const metaValue = bytes.readInt32LE(offset + 16);
61
+ const metaChar = metaValue ? String.fromCharCode(metaValue) : '';
62
+ const skipLines = bytes.readInt32LE(offset + 20);
63
+ const nameSectionLength = bytes.readInt32LE(offset + 24);
64
+ const { refIdToName, refNameToId } = this._parseNameBytes(bytes.slice(offset + 28, offset + 28 + nameSectionLength));
65
+ return {
66
+ refIdToName,
67
+ refNameToId,
68
+ skipLines,
69
+ metaChar,
70
+ columnNumbers,
71
+ format,
72
+ coordinateType,
73
+ };
74
+ }
75
+ _parseNameBytes(namesBytes) {
76
+ let currRefId = 0;
77
+ let currNameStart = 0;
78
+ const refIdToName = [];
79
+ const refNameToId = {};
80
+ for (let i = 0; i < namesBytes.length; i += 1) {
81
+ if (!namesBytes[i]) {
82
+ if (currNameStart < i) {
83
+ let refName = namesBytes.toString('utf8', currNameStart, i);
84
+ refName = this.renameRefSeq(refName);
85
+ refIdToName[currRefId] = refName;
86
+ refNameToId[refName] = currRefId;
87
+ }
88
+ currNameStart = i + 1;
89
+ currRefId += 1;
90
+ }
91
+ }
92
+ return { refNameToId, refIdToName };
93
+ }
94
+ // fetch and parse the index
95
+ async _parse(opts = {}) {
96
+ const bytes = await unzip((await this.filehandle.readFile(opts)));
97
+ // check TBI magic numbers
98
+ let csiVersion;
99
+ if (bytes.readUInt32LE(0) === CSI1_MAGIC) {
100
+ csiVersion = 1;
101
+ }
102
+ else if (bytes.readUInt32LE(0) === CSI2_MAGIC) {
103
+ csiVersion = 2;
104
+ }
105
+ else {
106
+ throw new Error('Not a CSI file');
107
+ // TODO: do we need to support big-endian CSI files?
108
+ }
109
+ this.minShift = bytes.readInt32LE(4);
110
+ this.depth = bytes.readInt32LE(8);
111
+ this.maxBinNumber = ((1 << ((this.depth + 1) * 3)) - 1) / 7;
112
+ const maxRefLength = 2 ** (this.minShift + this.depth * 3);
113
+ const auxLength = bytes.readInt32LE(12);
114
+ let aux = {
115
+ refIdToName: [],
116
+ refNameToId: {},
117
+ };
118
+ if (auxLength) {
119
+ aux = this.parseAuxData(bytes, 16, auxLength);
120
+ }
121
+ const refCount = bytes.readInt32LE(16 + auxLength);
122
+ // read the indexes for each reference sequence
123
+ let firstDataLine;
124
+ let currOffset = 16 + auxLength + 4;
125
+ const indices = new Array(refCount).fill(0).map(() => {
126
+ // the binning index
127
+ const binCount = bytes.readInt32LE(currOffset);
128
+ currOffset += 4;
129
+ const binIndex = {};
130
+ let stats; // < provided by parsing a pseudo-bin, if present
131
+ for (let j = 0; j < binCount; j += 1) {
132
+ const bin = bytes.readUInt32LE(currOffset);
133
+ if (bin > this.maxBinNumber) {
134
+ // this is a fake bin that actually has stats information
135
+ // about the reference sequence in it
136
+ stats = this.parsePseudoBin(bytes, currOffset + 4);
137
+ currOffset += 4 + 8 + 4 + 16 + 16;
138
+ }
139
+ else {
140
+ const loffset = fromBytes(bytes, currOffset + 4);
141
+ firstDataLine = this._findFirstData(firstDataLine, loffset);
142
+ const chunkCount = bytes.readInt32LE(currOffset + 12);
143
+ currOffset += 16;
144
+ const chunks = new Array(chunkCount);
145
+ for (let k = 0; k < chunkCount; k += 1) {
146
+ const u = fromBytes(bytes, currOffset);
147
+ const v = fromBytes(bytes, currOffset + 8);
148
+ currOffset += 16;
149
+ // this._findFirstData(data, u)
150
+ chunks[k] = new Chunk(u, v, bin);
151
+ }
152
+ binIndex[bin] = chunks;
153
+ }
154
+ }
155
+ return { binIndex, stats };
156
+ });
157
+ return {
158
+ ...aux,
159
+ csi: true,
160
+ refCount,
161
+ maxBlockSize: 1 << 16,
162
+ firstDataLine,
163
+ csiVersion,
164
+ indices,
165
+ depth: this.depth,
166
+ maxBinNumber: this.maxBinNumber,
167
+ maxRefLength,
168
+ };
169
+ }
170
+ parsePseudoBin(bytes, offset) {
171
+ const lineCount = longToNumber(Long.fromBytesLE(Array.prototype.slice.call(bytes, offset + 28, offset + 36), true));
172
+ return { lineCount };
173
+ }
174
+ async blocksForRange(refName, min, max, opts = {}) {
175
+ if (min < 0) {
176
+ min = 0;
177
+ }
178
+ const indexData = await this.parse(opts);
179
+ if (!indexData) {
180
+ return [];
181
+ }
182
+ const refId = indexData.refNameToId[refName];
183
+ const ba = indexData.indices[refId];
184
+ if (!ba) {
185
+ return [];
186
+ }
187
+ // const { linearIndex, binIndex } = indexes
188
+ const overlappingBins = this.reg2bins(min, max); // List of bin #s that overlap min, max
189
+ const chunks = [];
190
+ // Find chunks in overlapping bins. Leaf bins (< 4681) are not pruned
191
+ for (const [start, end] of overlappingBins) {
192
+ for (let bin = start; bin <= end; bin++) {
193
+ if (ba.binIndex[bin]) {
194
+ const binChunks = ba.binIndex[bin];
195
+ for (let c = 0; c < binChunks.length; ++c) {
196
+ chunks.push(new Chunk(binChunks[c].minv, binChunks[c].maxv, bin));
197
+ }
198
+ }
199
+ }
200
+ }
201
+ return optimizeChunks(chunks, new VirtualOffset(0, 0));
202
+ }
203
+ /**
204
+ * calculate the list of bins that may overlap with region [beg,end) (zero-based half-open)
205
+ */
206
+ reg2bins(beg, end) {
207
+ beg -= 1; // < convert to 1-based closed
208
+ if (beg < 1) {
209
+ beg = 1;
210
+ }
211
+ if (end > 2 ** 50) {
212
+ end = 2 ** 34;
213
+ } // 17 GiB ought to be enough for anybody
214
+ end -= 1;
215
+ let l = 0;
216
+ let t = 0;
217
+ let s = this.minShift + this.depth * 3;
218
+ const bins = [];
219
+ for (; l <= this.depth; s -= 3, t += lshift(1, l * 3), l += 1) {
220
+ const b = t + rshift(beg, s);
221
+ const e = t + rshift(end, s);
222
+ if (e - b + bins.length > this.maxBinNumber) {
223
+ throw new Error(`query ${beg}-${end} is too large for current binning scheme (shift ${this.minShift}, depth ${this.depth}), try a smaller query or a coarser index binning scheme`);
224
+ }
225
+ bins.push([b, e]);
226
+ }
227
+ return bins;
228
+ }
229
+ }
230
+ //# sourceMappingURL=csi.js.map
package/esm/csi.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csi.js","sourceRoot":"","sources":["../src/csi.ts"],"names":[],"mappings":"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"}
package/esm/index.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import TabixIndexedFile from './tabixIndexedFile';
2
+ import TBI from './tbi';
3
+ import CSI from './csi';
4
+ export { TabixIndexedFile, TBI, CSI };
package/esm/index.js ADDED
@@ -0,0 +1,5 @@
1
+ import TabixIndexedFile from './tabixIndexedFile';
2
+ import TBI from './tbi';
3
+ import CSI from './csi';
4
+ export { TabixIndexedFile, TBI, CSI };
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,MAAM,oBAAoB,CAAA;AACjD,OAAO,GAAG,MAAM,OAAO,CAAA;AACvB,OAAO,GAAG,MAAM,OAAO,CAAA;AAEvB,OAAO,EAAE,gBAAgB,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA"}
@@ -0,0 +1,32 @@
1
+ import { GenericFilehandle } from 'generic-filehandle';
2
+ import VirtualOffset from './virtualOffset';
3
+ import Chunk from './chunk';
4
+ export interface Options {
5
+ [key: string]: unknown;
6
+ signal?: AbortSignal;
7
+ }
8
+ export default abstract class IndexFile {
9
+ filehandle: GenericFilehandle;
10
+ renameRefSeq: (arg0: string) => string;
11
+ private _parseCache;
12
+ /**
13
+ * @param {filehandle} filehandle
14
+ * @param {function} [renameRefSeqs]
15
+ */
16
+ constructor({ filehandle, renameRefSeqs, }: {
17
+ filehandle: GenericFilehandle;
18
+ renameRefSeqs?: (a: string) => string;
19
+ });
20
+ abstract lineCount(refName: string, args: Options): Promise<number>;
21
+ protected abstract _parse(opts: Options): Promise<{
22
+ refNameToId: {
23
+ [key: string]: number;
24
+ };
25
+ refIdToName: string[];
26
+ }>;
27
+ getMetadata(opts?: Options): Promise<any>;
28
+ abstract blocksForRange(refName: string, start: number, end: number, opts: Options): Promise<Chunk[]>;
29
+ _findFirstData(currentFdl: VirtualOffset | undefined, virtualOffset: VirtualOffset): VirtualOffset;
30
+ parse(opts?: Options): Promise<any>;
31
+ hasRefSeq(seqId: number, opts?: Options): Promise<boolean>;
32
+ }
@@ -0,0 +1,40 @@
1
+ import AbortablePromiseCache from 'abortable-promise-cache';
2
+ import QuickLRU from 'quick-lru';
3
+ export default class IndexFile {
4
+ /**
5
+ * @param {filehandle} filehandle
6
+ * @param {function} [renameRefSeqs]
7
+ */
8
+ constructor({ filehandle, renameRefSeqs = (n) => n, }) {
9
+ this.filehandle = filehandle;
10
+ this.renameRefSeq = renameRefSeqs;
11
+ }
12
+ async getMetadata(opts = {}) {
13
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
14
+ const { indices, ...rest } = await this.parse(opts);
15
+ return rest;
16
+ }
17
+ _findFirstData(currentFdl, virtualOffset) {
18
+ if (currentFdl) {
19
+ return currentFdl.compareTo(virtualOffset) > 0
20
+ ? virtualOffset
21
+ : currentFdl;
22
+ }
23
+ else {
24
+ return virtualOffset;
25
+ }
26
+ }
27
+ async parse(opts = {}) {
28
+ if (!this._parseCache) {
29
+ this._parseCache = new AbortablePromiseCache({
30
+ cache: new QuickLRU({ maxSize: 1 }),
31
+ fill: () => this._parse(opts),
32
+ });
33
+ }
34
+ return this._parseCache.get('index', null, undefined);
35
+ }
36
+ async hasRefSeq(seqId, opts = {}) {
37
+ return !!((await this.parse(opts)).indices[seqId] || {}).binIndex;
38
+ }
39
+ }
40
+ //# sourceMappingURL=indexFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexFile.js","sourceRoot":"","sources":["../src/indexFile.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,MAAM,yBAAyB,CAAA;AAC3D,OAAO,QAAQ,MAAM,WAAW,CAAA;AAWhC,MAAM,CAAC,OAAO,OAAgB,SAAS;IAKrC;;;OAGG;IACH,YAAY,EACV,UAAU,EACV,aAAa,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAIjC;QACC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC5B,IAAI,CAAC,YAAY,GAAG,aAAa,CAAA;IACnC,CAAC;IASM,KAAK,CAAC,WAAW,CAAC,OAAgB,EAAE;QACzC,6DAA6D;QAC7D,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACnD,OAAO,IAAI,CAAA;IACb,CAAC;IASD,cAAc,CACZ,UAAqC,EACrC,aAA4B;QAE5B,IAAI,UAAU,EAAE;YACd,OAAO,UAAU,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC;gBAC5C,CAAC,CAAC,aAAa;gBACf,CAAC,CAAC,UAAU,CAAA;SACf;aAAM;YACL,OAAO,aAAa,CAAA;SACrB;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAgB,EAAE;QAC5B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACrB,IAAI,CAAC,WAAW,GAAG,IAAI,qBAAqB,CAAC;gBAC3C,KAAK,EAAE,IAAI,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;gBACnC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;aAC9B,CAAC,CAAA;SACH;QACD,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,CAAA;IACvD,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAa,EAAE,OAAgB,EAAE;QAC/C,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAA;IACnE,CAAC;CACF"}
@@ -0,0 +1,118 @@
1
+ /// <reference types="node" />
2
+ import { GenericFilehandle } from 'generic-filehandle';
3
+ import { Options } from './indexFile';
4
+ import Chunk from './chunk';
5
+ declare type GetLinesCallback = (line: string, fileOffset: number) => void;
6
+ interface GetLinesOpts {
7
+ [key: string]: unknown;
8
+ signal?: AbortSignal;
9
+ lineCallback: GetLinesCallback;
10
+ }
11
+ export default class TabixIndexedFile {
12
+ private filehandle;
13
+ private index;
14
+ private chunkSizeLimit;
15
+ private renameRefSeq;
16
+ private chunkCache;
17
+ /**
18
+ * @param {object} args
19
+ * @param {string} [args.path]
20
+ * @param {filehandle} [args.filehandle]
21
+ * @param {string} [args.tbiPath]
22
+ * @param {filehandle} [args.tbiFilehandle]
23
+ * @param {string} [args.csiPath]
24
+ * @param {filehandle} [args.csiFilehandle]
25
+ * @param {chunkSizeLimit} default 50MiB
26
+ * @param {function} [args.renameRefSeqs] optional function with sig `string => string` to transform
27
+ * reference sequence names for the purpose of indexing and querying. note that the data that is returned is
28
+ * not altered, just the names of the reference sequences that are used for querying.
29
+ * @param {number} [args.chunkCacheSize] maximum size in bytes of the chunk cache. default 5MB
30
+ * @param {number} [args.blockCacheSize] maximum size in bytes of the block cache. default 5MB
31
+ */
32
+ constructor({ path, filehandle, tbiPath, tbiFilehandle, csiPath, csiFilehandle, chunkSizeLimit, renameRefSeqs, chunkCacheSize, }: {
33
+ path?: string;
34
+ filehandle?: GenericFilehandle;
35
+ tbiPath?: string;
36
+ tbiFilehandle?: GenericFilehandle;
37
+ csiPath?: string;
38
+ csiFilehandle?: GenericFilehandle;
39
+ chunkSizeLimit?: number;
40
+ renameRefSeqs?: (n: string) => string;
41
+ chunkCacheSize?: number;
42
+ });
43
+ /**
44
+ * @param {string} refName name of the reference sequence
45
+ * @param {number} start start of the region (in 0-based half-open coordinates)
46
+ * @param {number} end end of the region (in 0-based half-open coordinates)
47
+ * @param {function|object} lineCallback callback called for each line in the region. can also pass a object param containing obj.lineCallback, obj.signal, etc
48
+ * @returns {Promise} resolved when the whole read is finished, rejected on error
49
+ */
50
+ getLines(refName: string, start: number, end: number, opts: GetLinesOpts | GetLinesCallback): Promise<void>;
51
+ getMetadata(opts?: Options): Promise<any>;
52
+ /**
53
+ * get a buffer containing the "header" region of
54
+ * the file, which are the bytes up to the first
55
+ * non-meta line
56
+ *
57
+ * @returns {Promise} for a buffer
58
+ */
59
+ getHeaderBuffer(opts?: Options): Promise<Buffer>;
60
+ /**
61
+ * get a string containing the "header" region of the
62
+ * file, is the portion up to the first non-meta line
63
+ *
64
+ * @returns {Promise} for a string
65
+ */
66
+ getHeader(opts?: Options): Promise<string>;
67
+ /**
68
+ * get an array of reference sequence names, in the order in which
69
+ * they occur in the file.
70
+ *
71
+ * reference sequence renaming is not applied to these names.
72
+ *
73
+ * @returns {Promise} for an array of string sequence names
74
+ */
75
+ getReferenceSequenceNames(opts?: Options): Promise<any>;
76
+ /**
77
+ * @param {object} metadata metadata object from the parsed index,
78
+ * containing columnNumbers, metaChar, and format
79
+ * @param {string} regionRefName
80
+ * @param {number} regionStart region start coordinate (0-based-half-open)
81
+ * @param {number} regionEnd region end coordinate (0-based-half-open)
82
+ * @param {array[string]} line
83
+ * @returns {object} like `{startCoordinate, overlaps}`. overlaps is boolean,
84
+ * true if line is a data line that overlaps the given region
85
+ */
86
+ checkLine({ columnNumbers, metaChar, coordinateType, format, }: {
87
+ columnNumbers: {
88
+ ref: number;
89
+ start: number;
90
+ end: number;
91
+ };
92
+ metaChar: string;
93
+ coordinateType: string;
94
+ format: string;
95
+ }, regionRefName: string, regionStart: number, regionEnd: number, line: string): {
96
+ overlaps: boolean;
97
+ startCoordinate?: undefined;
98
+ } | {
99
+ startCoordinate: number;
100
+ overlaps: boolean;
101
+ };
102
+ _getVcfEnd(startCoordinate: number, refSeq: string, info: any): number;
103
+ /**
104
+ * return the approximate number of data lines in the given reference sequence
105
+ * @param {string} refSeq reference sequence name
106
+ * @returns {Promise} for number of data lines present on that reference sequence
107
+ */
108
+ lineCount(refName: string, opts?: Options): Promise<number>;
109
+ _readRegion(position: number, compressedSize: number, opts?: Options): Promise<Buffer>;
110
+ /**
111
+ * read and uncompress the data in a chunk (composed of one or more
112
+ * contiguous bgzip blocks) of the file
113
+ * @param {Chunk} chunk
114
+ * @returns {Promise} for a string chunk of the file
115
+ */
116
+ readChunk(chunk: Chunk, opts?: Options): Promise<any>;
117
+ }
118
+ export {};