@gmod/bam 1.1.18 → 2.0.0
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.
- package/CHANGELOG.md +61 -25
- package/README.md +95 -57
- package/dist/bai.d.ts +34 -15
- package/dist/bai.js +87 -91
- package/dist/bai.js.map +1 -1
- package/dist/bamFile.d.ts +33 -27
- package/dist/bamFile.js +127 -121
- package/dist/bamFile.js.map +1 -1
- package/dist/chunk.d.ts +4 -8
- package/dist/chunk.js +2 -8
- package/dist/chunk.js.map +1 -1
- package/dist/csi.d.ts +74 -10
- package/dist/csi.js +78 -90
- package/dist/csi.js.map +1 -1
- package/dist/htsget.d.ts +5 -8
- package/dist/htsget.js +72 -47
- package/dist/htsget.js.map +1 -1
- package/dist/index.d.ts +5 -6
- package/dist/index.js +11 -11
- package/dist/index.js.map +1 -1
- package/dist/indexFile.d.ts +0 -6
- package/dist/indexFile.js +0 -35
- package/dist/indexFile.js.map +1 -1
- package/dist/nullIndex.d.ts +7 -0
- package/dist/nullIndex.js +33 -0
- package/dist/nullIndex.js.map +1 -0
- package/dist/record.d.ts +2 -2
- package/dist/record.js +34 -24
- package/dist/record.js.map +1 -1
- package/dist/sam.js +9 -7
- package/dist/sam.js.map +1 -1
- package/dist/util.d.ts +13 -1
- package/dist/util.js +47 -15
- package/dist/util.js.map +1 -1
- package/esm/bai.d.ts +34 -15
- package/esm/bai.js +86 -91
- package/esm/bai.js.map +1 -1
- package/esm/bamFile.d.ts +33 -27
- package/esm/bamFile.js +124 -120
- package/esm/bamFile.js.map +1 -1
- package/esm/chunk.d.ts +4 -8
- package/esm/chunk.js +2 -8
- package/esm/chunk.js.map +1 -1
- package/esm/csi.d.ts +74 -10
- package/esm/csi.js +85 -93
- package/esm/csi.js.map +1 -1
- package/esm/htsget.d.ts +5 -8
- package/esm/htsget.js +68 -43
- package/esm/htsget.js.map +1 -1
- package/esm/index.d.ts +5 -6
- package/esm/index.js +5 -6
- package/esm/index.js.map +1 -1
- package/esm/indexFile.d.ts +0 -6
- package/esm/indexFile.js +0 -22
- package/esm/indexFile.js.map +1 -1
- package/esm/nullIndex.d.ts +7 -0
- package/esm/nullIndex.js +16 -0
- package/esm/nullIndex.js.map +1 -0
- package/esm/record.d.ts +2 -2
- package/esm/record.js +34 -24
- package/esm/record.js.map +1 -1
- package/esm/sam.js +9 -7
- package/esm/sam.js.map +1 -1
- package/esm/util.d.ts +13 -1
- package/esm/util.js +40 -14
- package/esm/util.js.map +1 -1
- package/package.json +16 -17
- package/src/bai.ts +99 -102
- package/src/bamFile.ts +174 -198
- package/src/chunk.ts +6 -20
- package/src/csi.ts +102 -111
- package/src/htsget.ts +81 -61
- package/src/index.ts +5 -7
- package/src/indexFile.ts +0 -27
- package/src/nullIndex.ts +18 -0
- package/src/record.ts +34 -24
- package/src/sam.ts +9 -7
- package/src/util.ts +54 -13
- package/src/declare.d.ts +0 -2
package/esm/bai.d.ts
CHANGED
|
@@ -1,26 +1,45 @@
|
|
|
1
|
-
|
|
1
|
+
import VirtualOffset from './virtualOffset';
|
|
2
2
|
import Chunk from './chunk';
|
|
3
|
-
import IndexFile from './indexFile';
|
|
4
3
|
import { BaseOpts } from './util';
|
|
4
|
+
import IndexFile from './indexFile';
|
|
5
5
|
export default class BAI extends IndexFile {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
6
|
+
setupP?: ReturnType<BAI['_parse']>;
|
|
7
|
+
lineCount(refId: number, opts?: BaseOpts): Promise<number>;
|
|
8
|
+
_parse(opts?: BaseOpts): Promise<{
|
|
9
|
+
bai: boolean;
|
|
10
|
+
firstDataLine: VirtualOffset | undefined;
|
|
11
|
+
maxBlockSize: number;
|
|
12
|
+
indices: {
|
|
13
|
+
binIndex: {
|
|
14
|
+
[key: string]: Chunk[];
|
|
15
|
+
};
|
|
16
|
+
linearIndex: VirtualOffset[];
|
|
17
|
+
stats?: {
|
|
18
|
+
lineCount: number;
|
|
19
|
+
} | undefined;
|
|
20
|
+
}[];
|
|
21
|
+
refCount: number;
|
|
14
22
|
}>;
|
|
15
23
|
indexCov(seqId: number, start?: number, end?: number, opts?: BaseOpts): Promise<{
|
|
16
24
|
start: number;
|
|
17
25
|
end: number;
|
|
18
26
|
score: number;
|
|
19
27
|
}[]>;
|
|
20
|
-
/**
|
|
21
|
-
* calculate the list of bins that may overlap with region [beg,end) (zero-based half-open)
|
|
22
|
-
* @returns {Array[number]}
|
|
23
|
-
*/
|
|
24
|
-
reg2bins(beg: number, end: number): number[][];
|
|
25
28
|
blocksForRange(refId: number, min: number, max: number, opts?: BaseOpts): Promise<Chunk[]>;
|
|
29
|
+
parse(opts?: BaseOpts): Promise<{
|
|
30
|
+
bai: boolean;
|
|
31
|
+
firstDataLine: VirtualOffset | undefined;
|
|
32
|
+
maxBlockSize: number;
|
|
33
|
+
indices: {
|
|
34
|
+
binIndex: {
|
|
35
|
+
[key: string]: Chunk[];
|
|
36
|
+
};
|
|
37
|
+
linearIndex: VirtualOffset[];
|
|
38
|
+
stats?: {
|
|
39
|
+
lineCount: number;
|
|
40
|
+
} | undefined;
|
|
41
|
+
}[];
|
|
42
|
+
refCount: number;
|
|
43
|
+
}>;
|
|
44
|
+
hasRefSeq(seqId: number, opts?: BaseOpts): Promise<boolean>;
|
|
26
45
|
}
|
package/esm/bai.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import Long from 'long';
|
|
2
1
|
import { fromBytes } from './virtualOffset';
|
|
3
2
|
import Chunk from './chunk';
|
|
3
|
+
import { optimizeChunks, parsePseudoBin, findFirstData } from './util';
|
|
4
4
|
import IndexFile from './indexFile';
|
|
5
|
-
import { longToNumber, optimizeChunks } from './util';
|
|
6
5
|
const BAI_MAGIC = 21578050; // BAI\1
|
|
7
6
|
function roundDown(n, multiple) {
|
|
8
7
|
return n - (n % multiple);
|
|
@@ -10,88 +9,90 @@ function roundDown(n, multiple) {
|
|
|
10
9
|
function roundUp(n, multiple) {
|
|
11
10
|
return n - (n % multiple) + multiple;
|
|
12
11
|
}
|
|
12
|
+
function reg2bins(beg, end) {
|
|
13
|
+
end -= 1;
|
|
14
|
+
return [
|
|
15
|
+
[0, 0],
|
|
16
|
+
[1 + (beg >> 26), 1 + (end >> 26)],
|
|
17
|
+
[9 + (beg >> 23), 9 + (end >> 23)],
|
|
18
|
+
[73 + (beg >> 20), 73 + (end >> 20)],
|
|
19
|
+
[585 + (beg >> 17), 585 + (end >> 17)],
|
|
20
|
+
[4681 + (beg >> 14), 4681 + (end >> 14)],
|
|
21
|
+
];
|
|
22
|
+
}
|
|
13
23
|
export default class BAI extends IndexFile {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
async lineCount(refId, opts = {}) {
|
|
19
|
-
const prom = await this.parse(opts);
|
|
20
|
-
const index = prom.indices[refId];
|
|
21
|
-
if (!index) {
|
|
22
|
-
return -1;
|
|
23
|
-
}
|
|
24
|
-
const ret = index.stats || {};
|
|
25
|
-
return ret.lineCount === undefined ? -1 : ret.lineCount;
|
|
26
|
-
}
|
|
27
|
-
fetchBai(opts = {}) {
|
|
28
|
-
if (!this.baiP) {
|
|
29
|
-
this.baiP = this.filehandle.readFile(opts).catch(e => {
|
|
30
|
-
this.baiP = undefined;
|
|
31
|
-
throw e;
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
return this.baiP;
|
|
24
|
+
async lineCount(refId, opts) {
|
|
25
|
+
var _a, _b;
|
|
26
|
+
const indexData = await this.parse(opts);
|
|
27
|
+
return ((_b = (_a = indexData.indices[refId]) === null || _a === void 0 ? void 0 : _a.stats) === null || _b === void 0 ? void 0 : _b.lineCount) || 0;
|
|
35
28
|
}
|
|
36
29
|
// fetch and parse the index
|
|
37
|
-
async _parse() {
|
|
38
|
-
const
|
|
39
|
-
const bytes = await this.fetchBai();
|
|
30
|
+
async _parse(opts) {
|
|
31
|
+
const bytes = (await this.filehandle.readFile(opts));
|
|
40
32
|
// check BAI magic numbers
|
|
41
33
|
if (bytes.readUInt32LE(0) !== BAI_MAGIC) {
|
|
42
34
|
throw new Error('Not a BAI file');
|
|
43
35
|
}
|
|
44
|
-
|
|
36
|
+
const refCount = bytes.readInt32LE(4);
|
|
45
37
|
const depth = 5;
|
|
46
38
|
const binLimit = ((1 << ((depth + 1) * 3)) - 1) / 7;
|
|
47
39
|
// read the indexes for each reference sequence
|
|
48
|
-
|
|
49
|
-
let
|
|
50
|
-
|
|
40
|
+
let curr = 8;
|
|
41
|
+
let firstDataLine;
|
|
42
|
+
const indices = new Array(refCount);
|
|
43
|
+
for (let i = 0; i < refCount; i++) {
|
|
51
44
|
// the binning index
|
|
52
|
-
const binCount = bytes.readInt32LE(
|
|
45
|
+
const binCount = bytes.readInt32LE(curr);
|
|
53
46
|
let stats;
|
|
54
|
-
|
|
47
|
+
curr += 4;
|
|
55
48
|
const binIndex = {};
|
|
56
49
|
for (let j = 0; j < binCount; j += 1) {
|
|
57
|
-
const bin = bytes.readUInt32LE(
|
|
58
|
-
|
|
50
|
+
const bin = bytes.readUInt32LE(curr);
|
|
51
|
+
curr += 4;
|
|
59
52
|
if (bin === binLimit + 1) {
|
|
60
|
-
|
|
61
|
-
stats =
|
|
62
|
-
|
|
53
|
+
curr += 4;
|
|
54
|
+
stats = parsePseudoBin(bytes, curr + 16);
|
|
55
|
+
curr += 32;
|
|
63
56
|
}
|
|
64
57
|
else if (bin > binLimit + 1) {
|
|
65
58
|
throw new Error('bai index contains too many bins, please use CSI');
|
|
66
59
|
}
|
|
67
60
|
else {
|
|
68
|
-
const chunkCount = bytes.readInt32LE(
|
|
69
|
-
|
|
61
|
+
const chunkCount = bytes.readInt32LE(curr);
|
|
62
|
+
curr += 4;
|
|
70
63
|
const chunks = new Array(chunkCount);
|
|
71
|
-
for (let k = 0; k < chunkCount; k
|
|
72
|
-
const u = fromBytes(bytes,
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
64
|
+
for (let k = 0; k < chunkCount; k++) {
|
|
65
|
+
const u = fromBytes(bytes, curr);
|
|
66
|
+
curr += 8;
|
|
67
|
+
const v = fromBytes(bytes, curr);
|
|
68
|
+
curr += 8;
|
|
69
|
+
firstDataLine = findFirstData(firstDataLine, u);
|
|
76
70
|
chunks[k] = new Chunk(u, v, bin);
|
|
77
71
|
}
|
|
78
72
|
binIndex[bin] = chunks;
|
|
79
73
|
}
|
|
80
74
|
}
|
|
81
|
-
const linearCount = bytes.readInt32LE(
|
|
82
|
-
|
|
83
|
-
// as we're going through the linear index, figure out
|
|
84
|
-
//
|
|
85
|
-
//
|
|
75
|
+
const linearCount = bytes.readInt32LE(curr);
|
|
76
|
+
curr += 4;
|
|
77
|
+
// as we're going through the linear index, figure out the smallest
|
|
78
|
+
// virtual offset in the indexes, which tells us where the BAM header
|
|
79
|
+
// ends
|
|
86
80
|
const linearIndex = new Array(linearCount);
|
|
87
|
-
for (let
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
81
|
+
for (let j = 0; j < linearCount; j++) {
|
|
82
|
+
const offset = fromBytes(bytes, curr);
|
|
83
|
+
curr += 8;
|
|
84
|
+
firstDataLine = findFirstData(firstDataLine, offset);
|
|
85
|
+
linearIndex[j] = offset;
|
|
91
86
|
}
|
|
92
|
-
|
|
87
|
+
indices[i] = { binIndex, linearIndex, stats };
|
|
93
88
|
}
|
|
94
|
-
return
|
|
89
|
+
return {
|
|
90
|
+
bai: true,
|
|
91
|
+
firstDataLine,
|
|
92
|
+
maxBlockSize: 1 << 16,
|
|
93
|
+
indices,
|
|
94
|
+
refCount,
|
|
95
|
+
};
|
|
95
96
|
}
|
|
96
97
|
async indexCov(seqId, start, end, opts = {}) {
|
|
97
98
|
const v = 16384;
|
|
@@ -102,18 +103,14 @@ export default class BAI extends IndexFile {
|
|
|
102
103
|
return [];
|
|
103
104
|
}
|
|
104
105
|
const { linearIndex = [], stats } = seqIdx;
|
|
105
|
-
if (
|
|
106
|
+
if (linearIndex.length === 0) {
|
|
106
107
|
return [];
|
|
107
108
|
}
|
|
108
|
-
const e = end
|
|
109
|
-
const s = start
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
}
|
|
114
|
-
else {
|
|
115
|
-
depths = new Array(linearIndex.length - 1);
|
|
116
|
-
}
|
|
109
|
+
const e = end === undefined ? (linearIndex.length - 1) * v : roundUp(end, v);
|
|
110
|
+
const s = start === undefined ? 0 : roundDown(start, v);
|
|
111
|
+
const depths = range
|
|
112
|
+
? new Array((e - s) / v)
|
|
113
|
+
: new Array(linearIndex.length - 1);
|
|
117
114
|
const totalSize = linearIndex[linearIndex.length - 1].blockPosition;
|
|
118
115
|
if (e > (linearIndex.length - 1) * v) {
|
|
119
116
|
throw new Error('query outside of range of linear index');
|
|
@@ -127,24 +124,10 @@ export default class BAI extends IndexFile {
|
|
|
127
124
|
};
|
|
128
125
|
currentPos = linearIndex[i + 1].blockPosition;
|
|
129
126
|
}
|
|
130
|
-
return depths.map(d => {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* calculate the list of bins that may overlap with region [beg,end) (zero-based half-open)
|
|
136
|
-
* @returns {Array[number]}
|
|
137
|
-
*/
|
|
138
|
-
reg2bins(beg, end) {
|
|
139
|
-
end -= 1;
|
|
140
|
-
return [
|
|
141
|
-
[0, 0],
|
|
142
|
-
[1 + (beg >> 26), 1 + (end >> 26)],
|
|
143
|
-
[9 + (beg >> 23), 9 + (end >> 23)],
|
|
144
|
-
[73 + (beg >> 20), 73 + (end >> 20)],
|
|
145
|
-
[585 + (beg >> 17), 585 + (end >> 17)],
|
|
146
|
-
[4681 + (beg >> 14), 4681 + (end >> 14)],
|
|
147
|
-
];
|
|
127
|
+
return depths.map(d => ({
|
|
128
|
+
...d,
|
|
129
|
+
score: (d.score * ((stats === null || stats === void 0 ? void 0 : stats.lineCount) || 0)) / totalSize,
|
|
130
|
+
}));
|
|
148
131
|
}
|
|
149
132
|
async blocksForRange(refId, min, max, opts = {}) {
|
|
150
133
|
if (min < 0) {
|
|
@@ -159,15 +142,15 @@ export default class BAI extends IndexFile {
|
|
|
159
142
|
return [];
|
|
160
143
|
}
|
|
161
144
|
// List of bin #s that overlap min, max
|
|
162
|
-
const overlappingBins =
|
|
145
|
+
const overlappingBins = reg2bins(min, max);
|
|
163
146
|
const chunks = [];
|
|
164
147
|
// Find chunks in overlapping bins. Leaf bins (< 4681) are not pruned
|
|
165
148
|
for (const [start, end] of overlappingBins) {
|
|
166
149
|
for (let bin = start; bin <= end; bin++) {
|
|
167
150
|
if (ba.binIndex[bin]) {
|
|
168
151
|
const binChunks = ba.binIndex[bin];
|
|
169
|
-
for (
|
|
170
|
-
chunks.push(
|
|
152
|
+
for (const binChunk of binChunks) {
|
|
153
|
+
chunks.push(binChunk);
|
|
171
154
|
}
|
|
172
155
|
}
|
|
173
156
|
}
|
|
@@ -175,18 +158,30 @@ export default class BAI extends IndexFile {
|
|
|
175
158
|
// Use the linear index to find minimum file position of chunks that could
|
|
176
159
|
// contain alignments in the region
|
|
177
160
|
const nintv = ba.linearIndex.length;
|
|
178
|
-
let lowest
|
|
161
|
+
let lowest;
|
|
179
162
|
const minLin = Math.min(min >> 14, nintv - 1);
|
|
180
163
|
const maxLin = Math.min(max >> 14, nintv - 1);
|
|
181
164
|
for (let i = minLin; i <= maxLin; ++i) {
|
|
182
165
|
const vp = ba.linearIndex[i];
|
|
183
|
-
if (vp) {
|
|
184
|
-
|
|
185
|
-
lowest = vp;
|
|
186
|
-
}
|
|
166
|
+
if (vp && (!lowest || vp.compareTo(lowest) < 0)) {
|
|
167
|
+
lowest = vp;
|
|
187
168
|
}
|
|
188
169
|
}
|
|
189
170
|
return optimizeChunks(chunks, lowest);
|
|
190
171
|
}
|
|
172
|
+
async parse(opts = {}) {
|
|
173
|
+
if (!this.setupP) {
|
|
174
|
+
this.setupP = this._parse(opts).catch(e => {
|
|
175
|
+
this.setupP = undefined;
|
|
176
|
+
throw e;
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
return this.setupP;
|
|
180
|
+
}
|
|
181
|
+
async hasRefSeq(seqId, opts = {}) {
|
|
182
|
+
var _a;
|
|
183
|
+
const header = await this.parse(opts);
|
|
184
|
+
return !!((_a = header.indices[seqId]) === null || _a === void 0 ? void 0 : _a.binIndex);
|
|
185
|
+
}
|
|
191
186
|
}
|
|
192
187
|
//# sourceMappingURL=bai.js.map
|
package/esm/bai.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bai.js","sourceRoot":"","sources":["../src/bai.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"bai.js","sourceRoot":"","sources":["../src/bai.ts"],"names":[],"mappings":"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"}
|
package/esm/bamFile.d.ts
CHANGED
|
@@ -1,28 +1,27 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
+
import { Buffer } from 'buffer';
|
|
2
3
|
import { GenericFilehandle } from 'generic-filehandle';
|
|
4
|
+
import BAI from './bai';
|
|
5
|
+
import CSI from './csi';
|
|
3
6
|
import Chunk from './chunk';
|
|
4
7
|
import BAMFeature from './record';
|
|
5
8
|
import { BamOpts, BaseOpts } from './util';
|
|
6
9
|
export declare const BAM_MAGIC = 21840194;
|
|
7
10
|
export default class BamFile {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
11
|
+
renameRefSeq: (a: string) => string;
|
|
12
|
+
bam: GenericFilehandle;
|
|
13
|
+
header?: string;
|
|
14
|
+
chrToIndex?: Record<string, number>;
|
|
15
|
+
indexToChr?: {
|
|
16
|
+
refName: string;
|
|
17
|
+
length: number;
|
|
18
|
+
}[];
|
|
19
|
+
yieldThreadTime: number;
|
|
20
|
+
index?: BAI | CSI;
|
|
21
|
+
htsget: boolean;
|
|
22
|
+
headerP?: ReturnType<BamFile['getHeaderPre']>;
|
|
17
23
|
private featureCache;
|
|
18
|
-
|
|
19
|
-
* @param {object} args
|
|
20
|
-
* @param {string} [args.bamPath]
|
|
21
|
-
* @param {FileHandle} [args.bamFilehandle]
|
|
22
|
-
* @param {string} [args.baiPath]
|
|
23
|
-
* @param {FileHandle} [args.baiFilehandle]
|
|
24
|
-
*/
|
|
25
|
-
constructor({ bamFilehandle, bamPath, bamUrl, baiPath, baiFilehandle, baiUrl, csiPath, csiFilehandle, csiUrl, fetchSizeLimit, chunkSizeLimit, yieldThreadTime, renameRefSeqs, }: {
|
|
24
|
+
constructor({ bamFilehandle, bamPath, bamUrl, baiPath, baiFilehandle, baiUrl, csiPath, csiFilehandle, csiUrl, htsget, yieldThreadTime, renameRefSeqs, }: {
|
|
26
25
|
bamFilehandle?: GenericFilehandle;
|
|
27
26
|
bamPath?: string;
|
|
28
27
|
bamUrl?: string;
|
|
@@ -32,19 +31,25 @@ export default class BamFile {
|
|
|
32
31
|
csiPath?: string;
|
|
33
32
|
csiFilehandle?: GenericFilehandle;
|
|
34
33
|
csiUrl?: string;
|
|
35
|
-
fetchSizeLimit?: number;
|
|
36
|
-
chunkSizeLimit?: number;
|
|
37
34
|
renameRefSeqs?: (a: string) => string;
|
|
38
35
|
yieldThreadTime?: number;
|
|
36
|
+
htsget?: boolean;
|
|
39
37
|
});
|
|
40
|
-
|
|
38
|
+
getHeaderPre(origOpts?: BaseOpts): Promise<{
|
|
41
39
|
tag: string;
|
|
42
40
|
data: {
|
|
43
41
|
tag: string;
|
|
44
42
|
value: string;
|
|
45
43
|
}[];
|
|
46
|
-
}[]>;
|
|
47
|
-
|
|
44
|
+
}[] | undefined>;
|
|
45
|
+
getHeader(opts?: BaseOpts): Promise<{
|
|
46
|
+
tag: string;
|
|
47
|
+
data: {
|
|
48
|
+
tag: string;
|
|
49
|
+
value: string;
|
|
50
|
+
}[];
|
|
51
|
+
}[] | undefined>;
|
|
52
|
+
getHeaderText(opts?: BaseOpts): Promise<string | undefined>;
|
|
48
53
|
_readRefSeqs(start: number, refSeqBytes: number, opts?: BaseOpts): Promise<{
|
|
49
54
|
chrToIndex: {
|
|
50
55
|
[key: string]: number;
|
|
@@ -56,19 +61,20 @@ export default class BamFile {
|
|
|
56
61
|
}>;
|
|
57
62
|
getRecordsForRange(chr: string, min: number, max: number, opts?: BamOpts): Promise<BAMFeature[]>;
|
|
58
63
|
streamRecordsForRange(chr: string, min: number, max: number, opts?: BamOpts): AsyncGenerator<BAMFeature[], void, unknown>;
|
|
59
|
-
_fetchChunkFeatures(chunks: Chunk[], chrId: number, min: number, max: number, opts
|
|
64
|
+
_fetchChunkFeatures(chunks: Chunk[], chrId: number, min: number, max: number, opts?: BamOpts): AsyncGenerator<BAMFeature[], void, unknown>;
|
|
60
65
|
fetchPairs(chrId: number, feats: BAMFeature[][], opts: BamOpts): Promise<BAMFeature[]>;
|
|
66
|
+
_readRegion(position: number, size: number, opts?: BaseOpts): Promise<Buffer>;
|
|
61
67
|
_readChunk({ chunk, opts }: {
|
|
62
68
|
chunk: Chunk;
|
|
63
69
|
opts: BaseOpts;
|
|
64
70
|
}): Promise<{
|
|
65
|
-
data:
|
|
66
|
-
cpositions:
|
|
67
|
-
dpositions:
|
|
71
|
+
data: Buffer;
|
|
72
|
+
cpositions: number[];
|
|
73
|
+
dpositions: number[];
|
|
68
74
|
chunk: Chunk;
|
|
69
75
|
}>;
|
|
70
76
|
readBamFeatures(ba: Buffer, cpositions: number[], dpositions: number[], chunk: Chunk): Promise<BAMFeature[]>;
|
|
71
|
-
hasRefSeq(seqName: string): Promise<boolean>;
|
|
77
|
+
hasRefSeq(seqName: string): Promise<boolean | undefined>;
|
|
72
78
|
lineCount(seqName: string): Promise<number>;
|
|
73
79
|
indexCov(seqName: string, start?: number, end?: number): Promise<{
|
|
74
80
|
start: number;
|