@gmod/bam 1.1.17 → 1.1.18
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 +5 -1
- package/README.md +15 -2
- package/dist/bai.js +164 -253
- package/dist/bai.js.map +1 -1
- package/dist/bamFile.js +331 -556
- package/dist/bamFile.js.map +1 -1
- package/dist/chunk.js +12 -14
- package/dist/chunk.js.map +1 -1
- package/dist/csi.js +145 -232
- package/dist/csi.js.map +1 -1
- package/dist/errors.js +12 -57
- package/dist/errors.js.map +1 -1
- package/dist/htsget.js +92 -206
- package/dist/htsget.js.map +1 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/indexFile.js +20 -59
- package/dist/indexFile.js.map +1 -1
- package/dist/record.js +169 -172
- package/dist/record.js.map +1 -1
- package/dist/sam.js +7 -7
- package/dist/sam.js.map +1 -1
- package/dist/util.js +11 -46
- package/dist/util.js.map +1 -1
- package/dist/virtualOffset.js +13 -20
- package/dist/virtualOffset.js.map +1 -1
- package/package.json +13 -13
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
## [1.1.
|
|
1
|
+
## [1.1.18](https://github.com/GMOD/bam-js/compare/v1.1.17...v1.1.18) (2022-12-17)
|
|
2
|
+
|
|
2
3
|
|
|
3
4
|
|
|
5
|
+
- Use es2015 for nodejs build
|
|
6
|
+
|
|
7
|
+
## [1.1.17](https://github.com/GMOD/bam-js/compare/v1.1.16...v1.1.17) (2022-07-18)
|
|
4
8
|
|
|
5
9
|
- Bump devDeps and generic-filehandle to 3.0.0
|
|
6
10
|
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[](https://npmjs.org/package/@gmod/bam)
|
|
2
2
|
[](https://codecov.io/gh/GMOD/bam-js/branch/master)
|
|
3
|
-
[](https://github.com/GMOD/bam-js/actions?query=branch%3Amaster+workflow%3APush+)
|
|
4
4
|
|
|
5
5
|
## Install
|
|
6
6
|
|
|
@@ -15,10 +15,21 @@ const t = new BamFile({
|
|
|
15
15
|
bamPath: 'test.bam',
|
|
16
16
|
})
|
|
17
17
|
|
|
18
|
+
// note: it's required to first run getHeader before any getRecordsForRange
|
|
18
19
|
var header = await t.getHeader()
|
|
19
20
|
|
|
20
21
|
// this would get same records as samtools view ctgA:1-50000
|
|
21
|
-
var records = await t.getRecordsForRange('ctgA', 0,
|
|
22
|
+
var records = await t.getRecordsForRange('ctgA', 0, 50000)
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
The `bamPath` argument only works on nodejs, in the browser, you should pass `bamFilehandle` with a generic-filehandle e.g. RemoteFile
|
|
26
|
+
|
|
27
|
+
```js
|
|
28
|
+
const { RemoteFile } = require('generic-filehandle')
|
|
29
|
+
const bam = new BamFile({
|
|
30
|
+
bamFilehandle: new RemoteFile('yourfile.bam'), // or a full http url
|
|
31
|
+
baiFilehandle: new RemoteFile('yourfile.bam.bai'), // or a full http url
|
|
32
|
+
})
|
|
22
33
|
```
|
|
23
34
|
|
|
24
35
|
Input are 0-based half-open coordinates (note: not the same as samtools view coordinate inputs!)
|
|
@@ -58,6 +69,8 @@ Note: filehandles implement the Filehandle interface from https://www.npmjs.com/
|
|
|
58
69
|
|
|
59
70
|
### async getRecordsForRange(refName, start, end, opts)
|
|
60
71
|
|
|
72
|
+
Note: you must run getHeader before running getRecordsForRange
|
|
73
|
+
|
|
61
74
|
- refName - a string for the chrom to fetch from
|
|
62
75
|
- start - a 0 based half open start coordinate
|
|
63
76
|
- end - a 0 based half open end coordinate
|
package/dist/bai.js
CHANGED
|
@@ -1,30 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __extends = (this && this.__extends) || (function () {
|
|
3
|
-
var extendStatics = function (d, b) {
|
|
4
|
-
extendStatics = Object.setPrototypeOf ||
|
|
5
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
-
return extendStatics(d, b);
|
|
8
|
-
};
|
|
9
|
-
return function (d, b) {
|
|
10
|
-
if (typeof b !== "function" && b !== null)
|
|
11
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
-
extendStatics(d, b);
|
|
13
|
-
function __() { this.constructor = d; }
|
|
14
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
-
};
|
|
16
|
-
})();
|
|
17
|
-
var __assign = (this && this.__assign) || function () {
|
|
18
|
-
__assign = Object.assign || function(t) {
|
|
19
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
20
|
-
s = arguments[i];
|
|
21
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
22
|
-
t[p] = s[p];
|
|
23
|
-
}
|
|
24
|
-
return t;
|
|
25
|
-
};
|
|
26
|
-
return __assign.apply(this, arguments);
|
|
27
|
-
};
|
|
28
2
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
29
3
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
30
4
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -34,209 +8,154 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
34
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
35
9
|
});
|
|
36
10
|
};
|
|
37
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
38
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
39
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
40
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
41
|
-
function step(op) {
|
|
42
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
43
|
-
while (_) try {
|
|
44
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
45
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
46
|
-
switch (op[0]) {
|
|
47
|
-
case 0: case 1: t = op; break;
|
|
48
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
49
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
50
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
51
|
-
default:
|
|
52
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
53
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
54
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
55
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
56
|
-
if (t[2]) _.ops.pop();
|
|
57
|
-
_.trys.pop(); continue;
|
|
58
|
-
}
|
|
59
|
-
op = body.call(thisArg, _);
|
|
60
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
61
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
11
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
65
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
66
13
|
};
|
|
67
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
15
|
+
const long_1 = __importDefault(require("long"));
|
|
16
|
+
const virtualOffset_1 = require("./virtualOffset");
|
|
17
|
+
const chunk_1 = __importDefault(require("./chunk"));
|
|
18
|
+
const indexFile_1 = __importDefault(require("./indexFile"));
|
|
19
|
+
const util_1 = require("./util");
|
|
20
|
+
const BAI_MAGIC = 21578050; // BAI\1
|
|
74
21
|
function roundDown(n, multiple) {
|
|
75
22
|
return n - (n % multiple);
|
|
76
23
|
}
|
|
77
24
|
function roundUp(n, multiple) {
|
|
78
25
|
return n - (n % multiple) + multiple;
|
|
79
26
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
return
|
|
27
|
+
class BAI extends indexFile_1.default {
|
|
28
|
+
parsePseudoBin(bytes, offset) {
|
|
29
|
+
const lineCount = (0, util_1.longToNumber)(long_1.default.fromBytesLE(Array.prototype.slice.call(bytes, offset + 16, offset + 24), true));
|
|
30
|
+
return { lineCount };
|
|
84
31
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
return
|
|
94
|
-
switch (_a.label) {
|
|
95
|
-
case 0: return [4 /*yield*/, this.parse(opts)];
|
|
96
|
-
case 1:
|
|
97
|
-
prom = _a.sent();
|
|
98
|
-
index = prom.indices[refId];
|
|
99
|
-
if (!index) {
|
|
100
|
-
return [2 /*return*/, -1];
|
|
101
|
-
}
|
|
102
|
-
ret = index.stats || {};
|
|
103
|
-
return [2 /*return*/, ret.lineCount === undefined ? -1 : ret.lineCount];
|
|
104
|
-
}
|
|
105
|
-
});
|
|
32
|
+
lineCount(refId, opts = {}) {
|
|
33
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
34
|
+
const prom = yield this.parse(opts);
|
|
35
|
+
const index = prom.indices[refId];
|
|
36
|
+
if (!index) {
|
|
37
|
+
return -1;
|
|
38
|
+
}
|
|
39
|
+
const ret = index.stats || {};
|
|
40
|
+
return ret.lineCount === undefined ? -1 : ret.lineCount;
|
|
106
41
|
});
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
var _this = this;
|
|
110
|
-
if (opts === void 0) { opts = {}; }
|
|
42
|
+
}
|
|
43
|
+
fetchBai(opts = {}) {
|
|
111
44
|
if (!this.baiP) {
|
|
112
|
-
this.baiP = this.filehandle.readFile(opts).catch(
|
|
113
|
-
|
|
45
|
+
this.baiP = this.filehandle.readFile(opts).catch(e => {
|
|
46
|
+
this.baiP = undefined;
|
|
114
47
|
throw e;
|
|
115
48
|
});
|
|
116
49
|
}
|
|
117
50
|
return this.baiP;
|
|
118
|
-
}
|
|
51
|
+
}
|
|
119
52
|
// fetch and parse the index
|
|
120
|
-
|
|
121
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
chunks = new Array(chunkCount);
|
|
162
|
-
for (k = 0; k < chunkCount; k += 1) {
|
|
163
|
-
u = (0, virtualOffset_1.fromBytes)(bytes, currOffset);
|
|
164
|
-
v = (0, virtualOffset_1.fromBytes)(bytes, currOffset + 8);
|
|
165
|
-
currOffset += 16;
|
|
166
|
-
this._findFirstData(data, u);
|
|
167
|
-
chunks[k] = new chunk_1.default(u, v, bin);
|
|
168
|
-
}
|
|
169
|
-
binIndex[bin] = chunks;
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
linearCount = bytes.readInt32LE(currOffset);
|
|
173
|
-
currOffset += 4;
|
|
174
|
-
linearIndex = new Array(linearCount);
|
|
175
|
-
for (k = 0; k < linearCount; k += 1) {
|
|
176
|
-
linearIndex[k] = (0, virtualOffset_1.fromBytes)(bytes, currOffset);
|
|
177
|
-
currOffset += 8;
|
|
178
|
-
this._findFirstData(data, linearIndex[k]);
|
|
179
|
-
}
|
|
180
|
-
data.indices[i] = { binIndex: binIndex, linearIndex: linearIndex, stats: stats };
|
|
53
|
+
_parse() {
|
|
54
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
55
|
+
const data = { bai: true, maxBlockSize: 1 << 16 };
|
|
56
|
+
const bytes = yield this.fetchBai();
|
|
57
|
+
// check BAI magic numbers
|
|
58
|
+
if (bytes.readUInt32LE(0) !== BAI_MAGIC) {
|
|
59
|
+
throw new Error('Not a BAI file');
|
|
60
|
+
}
|
|
61
|
+
data.refCount = bytes.readInt32LE(4);
|
|
62
|
+
const depth = 5;
|
|
63
|
+
const binLimit = ((1 << ((depth + 1) * 3)) - 1) / 7;
|
|
64
|
+
// read the indexes for each reference sequence
|
|
65
|
+
data.indices = new Array(data.refCount);
|
|
66
|
+
let currOffset = 8;
|
|
67
|
+
for (let i = 0; i < data.refCount; i += 1) {
|
|
68
|
+
// the binning index
|
|
69
|
+
const binCount = bytes.readInt32LE(currOffset);
|
|
70
|
+
let stats;
|
|
71
|
+
currOffset += 4;
|
|
72
|
+
const binIndex = {};
|
|
73
|
+
for (let j = 0; j < binCount; j += 1) {
|
|
74
|
+
const bin = bytes.readUInt32LE(currOffset);
|
|
75
|
+
currOffset += 4;
|
|
76
|
+
if (bin === binLimit + 1) {
|
|
77
|
+
currOffset += 4;
|
|
78
|
+
stats = this.parsePseudoBin(bytes, currOffset);
|
|
79
|
+
currOffset += 32;
|
|
80
|
+
}
|
|
81
|
+
else if (bin > binLimit + 1) {
|
|
82
|
+
throw new Error('bai index contains too many bins, please use CSI');
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
const chunkCount = bytes.readInt32LE(currOffset);
|
|
86
|
+
currOffset += 4;
|
|
87
|
+
const chunks = new Array(chunkCount);
|
|
88
|
+
for (let k = 0; k < chunkCount; k += 1) {
|
|
89
|
+
const u = (0, virtualOffset_1.fromBytes)(bytes, currOffset);
|
|
90
|
+
const v = (0, virtualOffset_1.fromBytes)(bytes, currOffset + 8);
|
|
91
|
+
currOffset += 16;
|
|
92
|
+
this._findFirstData(data, u);
|
|
93
|
+
chunks[k] = new chunk_1.default(u, v, bin);
|
|
181
94
|
}
|
|
182
|
-
|
|
95
|
+
binIndex[bin] = chunks;
|
|
96
|
+
}
|
|
183
97
|
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
v = 16384;
|
|
195
|
-
range = start !== undefined;
|
|
196
|
-
return [4 /*yield*/, this.parse(opts)];
|
|
197
|
-
case 1:
|
|
198
|
-
indexData = _b.sent();
|
|
199
|
-
seqIdx = indexData.indices[seqId];
|
|
200
|
-
if (!seqIdx) {
|
|
201
|
-
return [2 /*return*/, []];
|
|
202
|
-
}
|
|
203
|
-
_a = seqIdx.linearIndex, linearIndex = _a === void 0 ? [] : _a, stats = seqIdx.stats;
|
|
204
|
-
if (!linearIndex.length) {
|
|
205
|
-
return [2 /*return*/, []];
|
|
206
|
-
}
|
|
207
|
-
e = end !== undefined ? roundUp(end, v) : (linearIndex.length - 1) * v;
|
|
208
|
-
s = start !== undefined ? roundDown(start, v) : 0;
|
|
209
|
-
if (range) {
|
|
210
|
-
depths = new Array((e - s) / v);
|
|
211
|
-
}
|
|
212
|
-
else {
|
|
213
|
-
depths = new Array(linearIndex.length - 1);
|
|
214
|
-
}
|
|
215
|
-
totalSize = linearIndex[linearIndex.length - 1].blockPosition;
|
|
216
|
-
if (e > (linearIndex.length - 1) * v) {
|
|
217
|
-
throw new Error('query outside of range of linear index');
|
|
218
|
-
}
|
|
219
|
-
currentPos = linearIndex[s / v].blockPosition;
|
|
220
|
-
for (i = s / v, j = 0; i < e / v; i++, j++) {
|
|
221
|
-
depths[j] = {
|
|
222
|
-
score: linearIndex[i + 1].blockPosition - currentPos,
|
|
223
|
-
start: i * v,
|
|
224
|
-
end: i * v + v,
|
|
225
|
-
};
|
|
226
|
-
currentPos = linearIndex[i + 1].blockPosition;
|
|
227
|
-
}
|
|
228
|
-
return [2 /*return*/, depths.map(function (d) {
|
|
229
|
-
return __assign(__assign({}, d), { score: (d.score * stats.lineCount) / totalSize });
|
|
230
|
-
})];
|
|
98
|
+
const linearCount = bytes.readInt32LE(currOffset);
|
|
99
|
+
currOffset += 4;
|
|
100
|
+
// as we're going through the linear index, figure out
|
|
101
|
+
// the smallest virtual offset in the indexes, which
|
|
102
|
+
// tells us where the BAM header ends
|
|
103
|
+
const linearIndex = new Array(linearCount);
|
|
104
|
+
for (let k = 0; k < linearCount; k += 1) {
|
|
105
|
+
linearIndex[k] = (0, virtualOffset_1.fromBytes)(bytes, currOffset);
|
|
106
|
+
currOffset += 8;
|
|
107
|
+
this._findFirstData(data, linearIndex[k]);
|
|
231
108
|
}
|
|
109
|
+
data.indices[i] = { binIndex, linearIndex, stats };
|
|
110
|
+
}
|
|
111
|
+
return data;
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
indexCov(seqId, start, end, opts = {}) {
|
|
115
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
116
|
+
const v = 16384;
|
|
117
|
+
const range = start !== undefined;
|
|
118
|
+
const indexData = yield this.parse(opts);
|
|
119
|
+
const seqIdx = indexData.indices[seqId];
|
|
120
|
+
if (!seqIdx) {
|
|
121
|
+
return [];
|
|
122
|
+
}
|
|
123
|
+
const { linearIndex = [], stats } = seqIdx;
|
|
124
|
+
if (!linearIndex.length) {
|
|
125
|
+
return [];
|
|
126
|
+
}
|
|
127
|
+
const e = end !== undefined ? roundUp(end, v) : (linearIndex.length - 1) * v;
|
|
128
|
+
const s = start !== undefined ? roundDown(start, v) : 0;
|
|
129
|
+
let depths;
|
|
130
|
+
if (range) {
|
|
131
|
+
depths = new Array((e - s) / v);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
depths = new Array(linearIndex.length - 1);
|
|
135
|
+
}
|
|
136
|
+
const totalSize = linearIndex[linearIndex.length - 1].blockPosition;
|
|
137
|
+
if (e > (linearIndex.length - 1) * v) {
|
|
138
|
+
throw new Error('query outside of range of linear index');
|
|
139
|
+
}
|
|
140
|
+
let currentPos = linearIndex[s / v].blockPosition;
|
|
141
|
+
for (let i = s / v, j = 0; i < e / v; i++, j++) {
|
|
142
|
+
depths[j] = {
|
|
143
|
+
score: linearIndex[i + 1].blockPosition - currentPos,
|
|
144
|
+
start: i * v,
|
|
145
|
+
end: i * v + v,
|
|
146
|
+
};
|
|
147
|
+
currentPos = linearIndex[i + 1].blockPosition;
|
|
148
|
+
}
|
|
149
|
+
return depths.map(d => {
|
|
150
|
+
return Object.assign(Object.assign({}, d), { score: (d.score * stats.lineCount) / totalSize });
|
|
232
151
|
});
|
|
233
152
|
});
|
|
234
|
-
}
|
|
153
|
+
}
|
|
235
154
|
/**
|
|
236
155
|
* calculate the list of bins that may overlap with region [beg,end) (zero-based half-open)
|
|
237
156
|
* @returns {Array[number]}
|
|
238
157
|
*/
|
|
239
|
-
|
|
158
|
+
reg2bins(beg, end) {
|
|
240
159
|
end -= 1;
|
|
241
160
|
return [
|
|
242
161
|
[0, 0],
|
|
@@ -246,59 +165,51 @@ var BAI = /** @class */ (function (_super) {
|
|
|
246
165
|
[585 + (beg >> 17), 585 + (end >> 17)],
|
|
247
166
|
[4681 + (beg >> 14), 4681 + (end >> 14)],
|
|
248
167
|
];
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
for (_i = 0, overlappingBins_1 = overlappingBins; _i < overlappingBins_1.length; _i++) {
|
|
274
|
-
_a = overlappingBins_1[_i], start = _a[0], end = _a[1];
|
|
275
|
-
for (bin = start; bin <= end; bin++) {
|
|
276
|
-
if (ba.binIndex[bin]) {
|
|
277
|
-
binChunks = ba.binIndex[bin];
|
|
278
|
-
for (c = 0; c < binChunks.length; ++c) {
|
|
279
|
-
chunks.push(new chunk_1.default(binChunks[c].minv, binChunks[c].maxv, bin));
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
nintv = ba.linearIndex.length;
|
|
285
|
-
lowest = null;
|
|
286
|
-
minLin = Math.min(min >> 14, nintv - 1);
|
|
287
|
-
maxLin = Math.min(max >> 14, nintv - 1);
|
|
288
|
-
for (i = minLin; i <= maxLin; ++i) {
|
|
289
|
-
vp = ba.linearIndex[i];
|
|
290
|
-
if (vp) {
|
|
291
|
-
if (!lowest || vp.compareTo(lowest) < 0) {
|
|
292
|
-
lowest = vp;
|
|
293
|
-
}
|
|
294
|
-
}
|
|
168
|
+
}
|
|
169
|
+
blocksForRange(refId, min, max, opts = {}) {
|
|
170
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
171
|
+
if (min < 0) {
|
|
172
|
+
min = 0;
|
|
173
|
+
}
|
|
174
|
+
const indexData = yield this.parse(opts);
|
|
175
|
+
if (!indexData) {
|
|
176
|
+
return [];
|
|
177
|
+
}
|
|
178
|
+
const ba = indexData.indices[refId];
|
|
179
|
+
if (!ba) {
|
|
180
|
+
return [];
|
|
181
|
+
}
|
|
182
|
+
// List of bin #s that overlap min, max
|
|
183
|
+
const overlappingBins = this.reg2bins(min, max);
|
|
184
|
+
const chunks = [];
|
|
185
|
+
// Find chunks in overlapping bins. Leaf bins (< 4681) are not pruned
|
|
186
|
+
for (const [start, end] of overlappingBins) {
|
|
187
|
+
for (let bin = start; bin <= end; bin++) {
|
|
188
|
+
if (ba.binIndex[bin]) {
|
|
189
|
+
const binChunks = ba.binIndex[bin];
|
|
190
|
+
for (let c = 0; c < binChunks.length; ++c) {
|
|
191
|
+
chunks.push(new chunk_1.default(binChunks[c].minv, binChunks[c].maxv, bin));
|
|
295
192
|
}
|
|
296
|
-
|
|
193
|
+
}
|
|
297
194
|
}
|
|
298
|
-
}
|
|
195
|
+
}
|
|
196
|
+
// Use the linear index to find minimum file position of chunks that could
|
|
197
|
+
// contain alignments in the region
|
|
198
|
+
const nintv = ba.linearIndex.length;
|
|
199
|
+
let lowest = null;
|
|
200
|
+
const minLin = Math.min(min >> 14, nintv - 1);
|
|
201
|
+
const maxLin = Math.min(max >> 14, nintv - 1);
|
|
202
|
+
for (let i = minLin; i <= maxLin; ++i) {
|
|
203
|
+
const vp = ba.linearIndex[i];
|
|
204
|
+
if (vp) {
|
|
205
|
+
if (!lowest || vp.compareTo(lowest) < 0) {
|
|
206
|
+
lowest = vp;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return (0, util_1.optimizeChunks)(chunks, lowest);
|
|
299
211
|
});
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
}(indexFile_1.default));
|
|
212
|
+
}
|
|
213
|
+
}
|
|
303
214
|
exports.default = BAI;
|
|
304
215
|
//# sourceMappingURL=bai.js.map
|
package/dist/bai.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bai.js","sourceRoot":"","sources":["../src/bai.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bai.js","sourceRoot":"","sources":["../src/bai.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,gDAAuB;AACvB,mDAA2C;AAC3C,oDAA2B;AAE3B,4DAAmC;AACnC,iCAA+D;AAE/D,MAAM,SAAS,GAAG,QAAQ,CAAA,CAAC,QAAQ;AAEnC,SAAS,SAAS,CAAC,CAAS,EAAE,QAAgB;IAC5C,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAA;AAC3B,CAAC;AACD,SAAS,OAAO,CAAC,CAAS,EAAE,QAAgB;IAC1C,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,QAAQ,CAAA;AACtC,CAAC;AAED,MAAqB,GAAI,SAAQ,mBAAS;IAGxC,cAAc,CAAC,KAAa,EAAE,MAAc;QAC1C,MAAM,SAAS,GAAG,IAAA,mBAAY,EAC5B,cAAI,CAAC,WAAW,CACd,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,EAC3D,IAAI,CACL,CACF,CAAA;QACD,OAAO,EAAE,SAAS,EAAE,CAAA;IACtB,CAAC;IAEK,SAAS,CAAC,KAAa,EAAE,OAAiB,EAAE;;YAChD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACnC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YACjC,IAAI,CAAC,KAAK,EAAE;gBACV,OAAO,CAAC,CAAC,CAAA;aACV;YACD,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAA;YAC7B,OAAO,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAA;QACzD,CAAC;KAAA;IAED,QAAQ,CAAC,OAAiB,EAAE;QAC1B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACd,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;gBACnD,IAAI,CAAC,IAAI,GAAG,SAAS,CAAA;gBACrB,MAAM,CAAC,CAAA;YACT,CAAC,CAAoB,CAAA;SACtB;QACD,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IAED,4BAA4B;IACtB,MAAM;;YACV,MAAM,IAAI,GAA2B,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CAAA;YACzE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAA;YAEnC,0BAA0B;YAC1B,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE;gBACvC,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAA;aAClC;YAED,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;YACpC,MAAM,KAAK,GAAG,CAAC,CAAA;YACf,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;YAEnD,+CAA+C;YAC/C,IAAI,CAAC,OAAO,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACvC,IAAI,UAAU,GAAG,CAAC,CAAA;YAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE;gBACzC,oBAAoB;gBACpB,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;gBAC9C,IAAI,KAAK,CAAA;gBAET,UAAU,IAAI,CAAC,CAAA;gBACf,MAAM,QAAQ,GAA+B,EAAE,CAAA;gBAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE;oBACpC,MAAM,GAAG,GAAG,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,CAAA;oBAC1C,UAAU,IAAI,CAAC,CAAA;oBACf,IAAI,GAAG,KAAK,QAAQ,GAAG,CAAC,EAAE;wBACxB,UAAU,IAAI,CAAC,CAAA;wBACf,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;wBAC9C,UAAU,IAAI,EAAE,CAAA;qBACjB;yBAAM,IAAI,GAAG,GAAG,QAAQ,GAAG,CAAC,EAAE;wBAC7B,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;qBACpE;yBAAM;wBACL,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;wBAChD,UAAU,IAAI,CAAC,CAAA;wBACf,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,UAAU,CAAC,CAAA;wBACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE;4BACtC,MAAM,CAAC,GAAG,IAAA,yBAAS,EAAC,KAAK,EAAE,UAAU,CAAC,CAAA;4BACtC,MAAM,CAAC,GAAG,IAAA,yBAAS,EAAC,KAAK,EAAE,UAAU,GAAG,CAAC,CAAC,CAAA;4BAC1C,UAAU,IAAI,EAAE,CAAA;4BAChB,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;4BAC5B,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,eAAK,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAA;yBACjC;wBACD,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,CAAA;qBACvB;iBACF;gBAED,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;gBACjD,UAAU,IAAI,CAAC,CAAA;gBACf,sDAAsD;gBACtD,oDAAoD;gBACpD,qCAAqC;gBACrC,MAAM,WAAW,GAAG,IAAI,KAAK,CAAC,WAAW,CAAC,CAAA;gBAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,IAAI,CAAC,EAAE;oBACvC,WAAW,CAAC,CAAC,CAAC,GAAG,IAAA,yBAAS,EAAC,KAAK,EAAE,UAAU,CAAC,CAAA;oBAC7C,UAAU,IAAI,CAAC,CAAA;oBACf,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;iBAC1C;gBAED,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,CAAA;aACnD;YAED,OAAO,IAAI,CAAA;QACb,CAAC;KAAA;IAEK,QAAQ,CACZ,KAAa,EACb,KAAc,EACd,GAAY,EACZ,OAAiB,EAAE;;YAEnB,MAAM,CAAC,GAAG,KAAK,CAAA;YACf,MAAM,KAAK,GAAG,KAAK,KAAK,SAAS,CAAA;YACjC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACxC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YACvC,IAAI,CAAC,MAAM,EAAE;gBACX,OAAO,EAAE,CAAA;aACV;YACD,MAAM,EAAE,WAAW,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,MAAM,CAAA;YAC1C,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;gBACvB,OAAO,EAAE,CAAA;aACV;YACD,MAAM,CAAC,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;YAC5E,MAAM,CAAC,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACvD,IAAI,MAAM,CAAA;YACV,IAAI,KAAK,EAAE;gBACT,MAAM,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;aAChC;iBAAM;gBACL,MAAM,GAAG,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;aAC3C;YACD,MAAM,SAAS,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,aAAa,CAAA;YACnE,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE;gBACpC,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;aAC1D;YACD,IAAI,UAAU,GAAG,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAA;YACjD,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;gBAC9C,MAAM,CAAC,CAAC,CAAC,GAAG;oBACV,KAAK,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,GAAG,UAAU;oBACpD,KAAK,EAAE,CAAC,GAAG,CAAC;oBACZ,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;iBACf,CAAA;gBACD,UAAU,GAAG,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAA;aAC9C;YACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gBACpB,uCAAY,CAAC,KAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,SAAS,IAAE;YACjE,CAAC,CAAC,CAAA;QACJ,CAAC;KAAA;IAED;;;OAGG;IACH,QAAQ,CAAC,GAAW,EAAE,GAAW;QAC/B,GAAG,IAAI,CAAC,CAAA;QACR,OAAO;YACL,CAAC,CAAC,EAAE,CAAC,CAAC;YACN,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;YAClC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;YAClC,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;YACpC,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;YACtC,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;SACzC,CAAA;IACH,CAAC;IAEK,cAAc,CAClB,KAAa,EACb,GAAW,EACX,GAAW,EACX,OAAiB,EAAE;;YAEnB,IAAI,GAAG,GAAG,CAAC,EAAE;gBACX,GAAG,GAAG,CAAC,CAAA;aACR;YAED,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACxC,IAAI,CAAC,SAAS,EAAE;gBACd,OAAO,EAAE,CAAA;aACV;YACD,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YACnC,IAAI,CAAC,EAAE,EAAE;gBACP,OAAO,EAAE,CAAA;aACV;YAED,uCAAuC;YACvC,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;YAC/C,MAAM,MAAM,GAAY,EAAE,CAAA;YAE1B,sEAAsE;YACtE,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,eAAe,EAAE;gBAC1C,KAAK,IAAI,GAAG,GAAG,KAAK,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,EAAE;oBACvC,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;wBACpB,MAAM,SAAS,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;wBAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;4BACzC,MAAM,CAAC,IAAI,CAAC,IAAI,eAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAA;yBAClE;qBACF;iBACF;aACF;YAED,0EAA0E;YAC1E,mCAAmC;YACnC,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,CAAA;YACnC,IAAI,MAAM,GAAG,IAAI,CAAA;YACjB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;YAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;YAC7C,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,MAAM,EAAE,EAAE,CAAC,EAAE;gBACrC,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;gBAC5B,IAAI,EAAE,EAAE;oBACN,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;wBACvC,MAAM,GAAG,EAAE,CAAA;qBACZ;iBACF;aACF;YAED,OAAO,IAAA,qBAAc,EAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QACvC,CAAC;KAAA;CACF;AAlND,sBAkNC"}
|