@gmod/cram 3.0.7 → 4.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/dist/craiIndex.js +70 -87
- package/dist/craiIndex.js.map +1 -1
- package/dist/cram-bundle.js +1 -1
- package/dist/cramFile/codecs/_base.d.ts +1 -1
- package/dist/cramFile/codecs/beta.d.ts +2 -2
- package/dist/cramFile/codecs/beta.js +1 -1
- package/dist/cramFile/codecs/beta.js.map +1 -1
- package/dist/cramFile/codecs/byteArrayLength.d.ts +2 -2
- package/dist/cramFile/codecs/byteArrayStop.d.ts +4 -4
- package/dist/cramFile/codecs/byteArrayStop.js +1 -1
- package/dist/cramFile/codecs/byteArrayStop.js.map +1 -1
- package/dist/cramFile/codecs/external.d.ts +1 -1
- package/dist/cramFile/codecs/external.js +1 -1
- package/dist/cramFile/codecs/external.js.map +1 -1
- package/dist/cramFile/codecs/gamma.d.ts +1 -1
- package/dist/cramFile/codecs/gamma.js +1 -1
- package/dist/cramFile/codecs/gamma.js.map +1 -1
- package/dist/cramFile/codecs/getBits.d.ts +1 -1
- package/dist/cramFile/codecs/getBits.js.map +1 -1
- package/dist/cramFile/codecs/huffman.d.ts +1 -1
- package/dist/cramFile/codecs/huffman.js +1 -1
- package/dist/cramFile/codecs/huffman.js.map +1 -1
- package/dist/cramFile/codecs/index.d.ts +1 -1
- package/dist/cramFile/codecs/index.js +5 -5
- package/dist/cramFile/codecs/index.js.map +1 -1
- package/dist/cramFile/codecs/subexp.d.ts +2 -2
- package/dist/cramFile/codecs/subexp.js +1 -1
- package/dist/cramFile/codecs/subexp.js.map +1 -1
- package/dist/cramFile/container/compressionScheme.d.ts +2 -2
- package/dist/cramFile/container/compressionScheme.js +1 -1
- package/dist/cramFile/container/compressionScheme.js.map +1 -1
- package/dist/cramFile/container/index.d.ts +1 -2
- package/dist/cramFile/container/index.js +62 -79
- package/dist/cramFile/container/index.js.map +1 -1
- package/dist/cramFile/file.d.ts +9 -13
- package/dist/cramFile/file.js +218 -247
- package/dist/cramFile/file.js.map +1 -1
- package/dist/cramFile/record.js +2 -2
- package/dist/cramFile/record.js.map +1 -1
- package/dist/cramFile/sectionParsers.d.ts +16 -16
- package/dist/cramFile/sectionParsers.js +12 -9
- package/dist/cramFile/sectionParsers.js.map +1 -1
- package/dist/cramFile/slice/decodeRecord.d.ts +3 -3
- package/dist/cramFile/slice/decodeRecord.js +11 -11
- package/dist/cramFile/slice/decodeRecord.js.map +1 -1
- package/dist/cramFile/slice/index.d.ts +2 -2
- package/dist/cramFile/slice/index.js +241 -262
- package/dist/cramFile/slice/index.js.map +1 -1
- package/dist/cramFile/util.d.ts +4 -2
- package/dist/cramFile/util.js +29 -6
- package/dist/cramFile/util.js.map +1 -1
- package/dist/htscodecs/arith_gen.d.ts +9 -17
- package/dist/htscodecs/arith_gen.js +32 -272
- package/dist/htscodecs/arith_gen.js.map +1 -1
- package/dist/htscodecs/fqzcomp.d.ts +1 -2
- package/dist/htscodecs/fqzcomp.js +2 -421
- package/dist/htscodecs/fqzcomp.js.map +1 -1
- package/dist/htscodecs/index.d.ts +5 -5
- package/dist/htscodecs/index.js +10 -10
- package/dist/htscodecs/index.js.map +1 -1
- package/dist/htscodecs/iostream.d.ts +2 -1
- package/dist/htscodecs/iostream.js +3 -2
- package/dist/htscodecs/iostream.js.map +1 -1
- package/dist/htscodecs/rans.d.ts +1 -2
- package/dist/htscodecs/rans.js +3 -270
- package/dist/htscodecs/rans.js.map +1 -1
- package/dist/htscodecs/rans4x16.d.ts +0 -1
- package/dist/htscodecs/rans4x16.js +6 -497
- package/dist/htscodecs/rans4x16.js.map +1 -1
- package/dist/htscodecs/tok3.js +17 -1
- package/dist/htscodecs/tok3.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/indexedCramFile.d.ts +4 -4
- package/dist/indexedCramFile.js +97 -108
- package/dist/indexedCramFile.js.map +1 -1
- package/dist/io/index.d.ts +2 -2
- package/dist/io/index.js +6 -6
- package/dist/io/index.js.map +1 -1
- package/dist/rans/constants.d.ts +1 -1
- package/dist/rans/constants.js +1 -1
- package/dist/rans/constants.js.map +1 -1
- package/dist/rans/d04.js.map +1 -1
- package/dist/rans/decoding.js.map +1 -1
- package/dist/rans/frequencies.js.map +1 -1
- package/dist/rans/index.js +5 -5
- package/dist/rans/index.js.map +1 -1
- package/dist/unzip.d.ts +1 -1
- package/dist/unzip.js +5 -3
- package/dist/unzip.js.map +1 -1
- package/esm/craiIndex.js +10 -12
- package/esm/craiIndex.js.map +1 -1
- package/esm/cramFile/codecs/_base.d.ts +1 -1
- package/esm/cramFile/codecs/beta.d.ts +2 -2
- package/esm/cramFile/codecs/beta.js +1 -1
- package/esm/cramFile/codecs/beta.js.map +1 -1
- package/esm/cramFile/codecs/byteArrayLength.d.ts +2 -2
- package/esm/cramFile/codecs/byteArrayStop.d.ts +4 -4
- package/esm/cramFile/codecs/byteArrayStop.js +1 -1
- package/esm/cramFile/codecs/byteArrayStop.js.map +1 -1
- package/esm/cramFile/codecs/external.d.ts +1 -1
- package/esm/cramFile/codecs/external.js +1 -1
- package/esm/cramFile/codecs/external.js.map +1 -1
- package/esm/cramFile/codecs/gamma.d.ts +1 -1
- package/esm/cramFile/codecs/gamma.js +1 -1
- package/esm/cramFile/codecs/gamma.js.map +1 -1
- package/esm/cramFile/codecs/getBits.d.ts +1 -1
- package/esm/cramFile/codecs/getBits.js.map +1 -1
- package/esm/cramFile/codecs/huffman.d.ts +1 -1
- package/esm/cramFile/codecs/huffman.js +1 -1
- package/esm/cramFile/codecs/huffman.js.map +1 -1
- package/esm/cramFile/codecs/index.d.ts +1 -1
- package/esm/cramFile/codecs/index.js +5 -5
- package/esm/cramFile/codecs/index.js.map +1 -1
- package/esm/cramFile/codecs/subexp.d.ts +2 -2
- package/esm/cramFile/codecs/subexp.js +1 -1
- package/esm/cramFile/codecs/subexp.js.map +1 -1
- package/esm/cramFile/container/compressionScheme.d.ts +2 -2
- package/esm/cramFile/container/compressionScheme.js +1 -1
- package/esm/cramFile/container/compressionScheme.js.map +1 -1
- package/esm/cramFile/container/index.d.ts +1 -2
- package/esm/cramFile/container/index.js +4 -7
- package/esm/cramFile/container/index.js.map +1 -1
- package/esm/cramFile/file.d.ts +9 -13
- package/esm/cramFile/file.js +47 -52
- package/esm/cramFile/file.js.map +1 -1
- package/esm/cramFile/record.js +2 -2
- package/esm/cramFile/record.js.map +1 -1
- package/esm/cramFile/sectionParsers.d.ts +16 -16
- package/esm/cramFile/sectionParsers.js +7 -7
- package/esm/cramFile/sectionParsers.js.map +1 -1
- package/esm/cramFile/slice/decodeRecord.d.ts +3 -3
- package/esm/cramFile/slice/decodeRecord.js +11 -11
- package/esm/cramFile/slice/decodeRecord.js.map +1 -1
- package/esm/cramFile/slice/index.d.ts +2 -2
- package/esm/cramFile/slice/index.js +7 -6
- package/esm/cramFile/slice/index.js.map +1 -1
- package/esm/cramFile/util.d.ts +4 -2
- package/esm/cramFile/util.js +19 -2
- package/esm/cramFile/util.js.map +1 -1
- package/esm/htscodecs/arith_gen.d.ts +9 -17
- package/esm/htscodecs/arith_gen.js +32 -272
- package/esm/htscodecs/arith_gen.js.map +1 -1
- package/esm/htscodecs/fqzcomp.d.ts +1 -2
- package/esm/htscodecs/fqzcomp.js +2 -421
- package/esm/htscodecs/fqzcomp.js.map +1 -1
- package/esm/htscodecs/index.d.ts +5 -5
- package/esm/htscodecs/index.js +10 -10
- package/esm/htscodecs/index.js.map +1 -1
- package/esm/htscodecs/iostream.d.ts +2 -1
- package/esm/htscodecs/iostream.js +3 -2
- package/esm/htscodecs/iostream.js.map +1 -1
- package/esm/htscodecs/rans.d.ts +1 -2
- package/esm/htscodecs/rans.js +3 -270
- package/esm/htscodecs/rans.js.map +1 -1
- package/esm/htscodecs/rans4x16.d.ts +0 -1
- package/esm/htscodecs/rans4x16.js +6 -497
- package/esm/htscodecs/rans4x16.js.map +1 -1
- package/esm/htscodecs/tok3.js +17 -1
- package/esm/htscodecs/tok3.js.map +1 -1
- package/esm/index.d.ts +1 -1
- package/esm/index.js +1 -1
- package/esm/index.js.map +1 -1
- package/esm/indexedCramFile.d.ts +4 -4
- package/esm/indexedCramFile.js +10 -10
- package/esm/indexedCramFile.js.map +1 -1
- package/esm/io/index.d.ts +2 -2
- package/esm/io/index.js +1 -1
- package/esm/io/index.js.map +1 -1
- package/esm/rans/constants.d.ts +1 -1
- package/esm/rans/constants.js +1 -1
- package/esm/rans/constants.js.map +1 -1
- package/esm/rans/d04.js.map +1 -1
- package/esm/rans/decoding.js.map +1 -1
- package/esm/rans/frequencies.js.map +1 -1
- package/esm/rans/index.js +5 -5
- package/esm/rans/index.js.map +1 -1
- package/esm/unzip.d.ts +1 -1
- package/esm/unzip.js +4 -1
- package/esm/unzip.js.map +1 -1
- package/package.json +7 -9
- package/src/craiIndex.ts +17 -16
- package/src/cramFile/codecs/_base.ts +1 -1
- package/src/cramFile/codecs/beta.ts +3 -3
- package/src/cramFile/codecs/byteArrayLength.ts +1 -1
- package/src/cramFile/codecs/byteArrayStop.ts +3 -4
- package/src/cramFile/codecs/external.ts +3 -3
- package/src/cramFile/codecs/gamma.ts +2 -2
- package/src/cramFile/codecs/getBits.ts +1 -1
- package/src/cramFile/codecs/huffman.ts +2 -3
- package/src/cramFile/codecs/index.ts +7 -8
- package/src/cramFile/codecs/subexp.ts +3 -3
- package/src/cramFile/container/compressionScheme.ts +3 -3
- package/src/cramFile/container/index.ts +7 -10
- package/src/cramFile/file.ts +71 -77
- package/src/cramFile/record.ts +3 -3
- package/src/cramFile/sectionParsers.ts +27 -22
- package/src/cramFile/slice/decodeRecord.ts +17 -17
- package/src/cramFile/slice/index.ts +8 -9
- package/src/cramFile/util.ts +24 -5
- package/src/htscodecs/arith_gen.js +33 -296
- package/src/htscodecs/fqzcomp.js +2 -476
- package/src/htscodecs/index.js +9 -11
- package/src/htscodecs/iostream.js +3 -2
- package/src/htscodecs/rans.js +3 -315
- package/src/htscodecs/rans4x16.js +6 -557
- package/src/htscodecs/tok3.js +18 -1
- package/src/index.ts +1 -1
- package/src/indexedCramFile.ts +6 -5
- package/src/io/index.ts +5 -4
- package/src/rans/constants.ts +1 -1
- package/src/rans/d04.ts +0 -1
- package/src/rans/decoding.ts +0 -1
- package/src/rans/frequencies.ts +0 -1
- package/src/rans/index.ts +5 -7
- package/src/unzip.ts +5 -1
- package/dist/cramFile/filehandle.d.ts +0 -1
- package/dist/cramFile/filehandle.js +0 -3
- package/dist/cramFile/filehandle.js.map +0 -1
- package/dist/htscodecs/main_arith_gen.d.ts +0 -1
- package/dist/htscodecs/main_arith_gen.js +0 -86
- package/dist/htscodecs/main_arith_gen.js.map +0 -1
- package/dist/htscodecs/main_fqzcomp.d.ts +0 -1
- package/dist/htscodecs/main_fqzcomp.js +0 -112
- package/dist/htscodecs/main_fqzcomp.js.map +0 -1
- package/dist/htscodecs/main_rans.d.ts +0 -1
- package/dist/htscodecs/main_rans.js +0 -83
- package/dist/htscodecs/main_rans.js.map +0 -1
- package/dist/htscodecs/main_rans4x16.d.ts +0 -1
- package/dist/htscodecs/main_rans4x16.js +0 -82
- package/dist/htscodecs/main_rans4x16.js.map +0 -1
- package/dist/htscodecs/main_tok3.d.ts +0 -1
- package/dist/htscodecs/main_tok3.js +0 -84
- package/dist/htscodecs/main_tok3.js.map +0 -1
- package/dist/unzip-pako.d.ts +0 -2
- package/dist/unzip-pako.js +0 -9
- package/dist/unzip-pako.js.map +0 -1
- package/esm/cramFile/filehandle.d.ts +0 -1
- package/esm/cramFile/filehandle.js +0 -2
- package/esm/cramFile/filehandle.js.map +0 -1
- package/esm/htscodecs/main_arith_gen.d.ts +0 -1
- package/esm/htscodecs/main_arith_gen.js +0 -86
- package/esm/htscodecs/main_arith_gen.js.map +0 -1
- package/esm/htscodecs/main_fqzcomp.d.ts +0 -1
- package/esm/htscodecs/main_fqzcomp.js +0 -112
- package/esm/htscodecs/main_fqzcomp.js.map +0 -1
- package/esm/htscodecs/main_rans.d.ts +0 -1
- package/esm/htscodecs/main_rans.js +0 -83
- package/esm/htscodecs/main_rans.js.map +0 -1
- package/esm/htscodecs/main_rans4x16.d.ts +0 -1
- package/esm/htscodecs/main_rans4x16.js +0 -82
- package/esm/htscodecs/main_rans4x16.js.map +0 -1
- package/esm/htscodecs/main_tok3.d.ts +0 -1
- package/esm/htscodecs/main_tok3.js +0 -84
- package/esm/htscodecs/main_tok3.js.map +0 -1
- package/esm/unzip-pako.d.ts +0 -2
- package/esm/unzip-pako.js +0 -6
- package/esm/unzip-pako.js.map +0 -1
- package/src/cramFile/filehandle.ts +0 -1
- package/src/htscodecs/Makefile +0 -142
- package/src/htscodecs/README.md +0 -64
- package/src/htscodecs/main_arith_gen.js +0 -96
- package/src/htscodecs/main_fqzcomp.js +0 -113
- package/src/htscodecs/main_rans.js +0 -88
- package/src/htscodecs/main_rans4x16.js +0 -87
- package/src/htscodecs/main_tok3.js +0 -86
- package/src/unzip-pako.ts +0 -6
|
@@ -1,24 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
4
|
};
|
|
14
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
6
|
const errors_1 = require("../../errors");
|
|
16
|
-
const
|
|
7
|
+
const getBits_1 = require("../codecs/getBits");
|
|
17
8
|
const constants_1 = __importDefault(require("../constants"));
|
|
18
9
|
const decodeRecord_1 = __importDefault(require("./decodeRecord"));
|
|
19
10
|
const record_1 = __importDefault(require("../record"));
|
|
20
11
|
const sectionParsers_1 = require("../sectionParsers");
|
|
21
|
-
const
|
|
12
|
+
const util_1 = require("../util");
|
|
22
13
|
/**
|
|
23
14
|
* @private
|
|
24
15
|
* Try to estimate the template length from a bunch of interrelated multi-segment reads.
|
|
@@ -143,287 +134,275 @@ class CramSlice {
|
|
|
143
134
|
this.file = container.file;
|
|
144
135
|
}
|
|
145
136
|
// memoize
|
|
146
|
-
getHeader() {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
}
|
|
170
|
-
});
|
|
137
|
+
async getHeader() {
|
|
138
|
+
// fetch and parse the slice header
|
|
139
|
+
const { majorVersion } = await this.file.getDefinition();
|
|
140
|
+
const sectionParsers = (0, sectionParsers_1.getSectionParsers)(majorVersion);
|
|
141
|
+
const containerHeader = await this.container.getHeader();
|
|
142
|
+
if (!containerHeader) {
|
|
143
|
+
throw new Error('no container header detected');
|
|
144
|
+
}
|
|
145
|
+
const header = await this.file.readBlock(containerHeader._endPosition + this.containerPosition);
|
|
146
|
+
if (header === undefined) {
|
|
147
|
+
throw new Error('block header undefined');
|
|
148
|
+
}
|
|
149
|
+
if (header.contentType === 'MAPPED_SLICE_HEADER') {
|
|
150
|
+
const content = (0, util_1.parseItem)(header.content, sectionParsers.cramMappedSliceHeader.parser, 0, containerHeader._endPosition);
|
|
151
|
+
return { ...header, parsedContent: content };
|
|
152
|
+
}
|
|
153
|
+
else if (header.contentType === 'UNMAPPED_SLICE_HEADER') {
|
|
154
|
+
const content = (0, util_1.parseItem)(header.content, sectionParsers.cramUnmappedSliceHeader.parser, 0, containerHeader._endPosition);
|
|
155
|
+
return { ...header, parsedContent: content };
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
throw new errors_1.CramMalformedError(`error reading slice header block, invalid content type ${header.contentType}`);
|
|
159
|
+
}
|
|
171
160
|
}
|
|
172
161
|
// memoize
|
|
173
|
-
getBlocks() {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
throw new Error('block undefined');
|
|
183
|
-
}
|
|
184
|
-
blocks[i] = block;
|
|
185
|
-
blockPosition = blocks[i]._endPosition;
|
|
162
|
+
async getBlocks() {
|
|
163
|
+
const header = await this.getHeader();
|
|
164
|
+
// read all the blocks into memory and store them
|
|
165
|
+
let blockPosition = header._endPosition;
|
|
166
|
+
const blocks = new Array(header.parsedContent.numBlocks);
|
|
167
|
+
for (let i = 0; i < blocks.length; i++) {
|
|
168
|
+
const block = await this.file.readBlock(blockPosition);
|
|
169
|
+
if (block === undefined) {
|
|
170
|
+
throw new Error('block undefined');
|
|
186
171
|
}
|
|
187
|
-
|
|
188
|
-
|
|
172
|
+
blocks[i] = block;
|
|
173
|
+
blockPosition = blocks[i]._endPosition;
|
|
174
|
+
}
|
|
175
|
+
return blocks;
|
|
189
176
|
}
|
|
190
177
|
// no memoize
|
|
191
|
-
getCoreDataBlock() {
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
return blocks[0];
|
|
195
|
-
});
|
|
178
|
+
async getCoreDataBlock() {
|
|
179
|
+
const blocks = await this.getBlocks();
|
|
180
|
+
return blocks[0];
|
|
196
181
|
}
|
|
197
182
|
// memoize
|
|
198
|
-
_getBlocksContentIdIndex() {
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
}
|
|
206
|
-
});
|
|
207
|
-
return blocksByContentId;
|
|
183
|
+
async _getBlocksContentIdIndex() {
|
|
184
|
+
const blocks = await this.getBlocks();
|
|
185
|
+
const blocksByContentId = {};
|
|
186
|
+
blocks.forEach(block => {
|
|
187
|
+
if (block.contentType === 'EXTERNAL_DATA') {
|
|
188
|
+
blocksByContentId[block.contentId] = block;
|
|
189
|
+
}
|
|
208
190
|
});
|
|
191
|
+
return blocksByContentId;
|
|
209
192
|
}
|
|
210
|
-
getBlockByContentId(id) {
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
return blocksByContentId[id];
|
|
214
|
-
});
|
|
193
|
+
async getBlockByContentId(id) {
|
|
194
|
+
const blocksByContentId = await this._getBlocksContentIdIndex();
|
|
195
|
+
return blocksByContentId[id];
|
|
215
196
|
}
|
|
216
|
-
getReferenceRegion() {
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
197
|
+
async getReferenceRegion() {
|
|
198
|
+
// read the slice header
|
|
199
|
+
const sliceHeader = (await this.getHeader()).parsedContent;
|
|
200
|
+
if (!(0, sectionParsers_1.isMappedSliceHeader)(sliceHeader)) {
|
|
201
|
+
throw new Error('slice header not mapped');
|
|
202
|
+
}
|
|
203
|
+
if (sliceHeader.refSeqId < 0) {
|
|
204
|
+
return undefined;
|
|
205
|
+
}
|
|
206
|
+
const compressionScheme = await this.container.getCompressionScheme();
|
|
207
|
+
if (compressionScheme === undefined) {
|
|
208
|
+
throw new Error('compression scheme undefined');
|
|
209
|
+
}
|
|
210
|
+
if (sliceHeader.refBaseBlockId >= 0) {
|
|
211
|
+
const refBlock = await this.getBlockByContentId(sliceHeader.refBaseBlockId);
|
|
212
|
+
if (!refBlock) {
|
|
213
|
+
throw new errors_1.CramMalformedError('embedded reference specified, but reference block does not exist');
|
|
225
214
|
}
|
|
226
|
-
|
|
227
|
-
if (
|
|
228
|
-
|
|
215
|
+
// TODO: we do not read anything named 'span'
|
|
216
|
+
// if (sliceHeader.span > refBlock.uncompressedSize) {
|
|
217
|
+
// throw new CramMalformedError('Embedded reference is too small')
|
|
218
|
+
// }
|
|
219
|
+
// TODO verify
|
|
220
|
+
return {
|
|
221
|
+
seq: refBlock.data.toString('utf8'),
|
|
222
|
+
start: sliceHeader.refSeqStart,
|
|
223
|
+
end: sliceHeader.refSeqStart + sliceHeader.refSeqSpan - 1,
|
|
224
|
+
span: sliceHeader.refSeqSpan,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
if (compressionScheme.referenceRequired ||
|
|
228
|
+
this.file.fetchReferenceSequenceCallback) {
|
|
229
|
+
if (!this.file.fetchReferenceSequenceCallback) {
|
|
230
|
+
throw new Error('reference sequence not embedded, and seqFetch callback not provided, cannot fetch reference sequence');
|
|
229
231
|
}
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
throw new errors_1.CramMalformedError('embedded reference specified, but reference block does not exist');
|
|
234
|
-
}
|
|
235
|
-
// TODO: we do not read anything named 'span'
|
|
236
|
-
// if (sliceHeader.span > refBlock.uncompressedSize) {
|
|
237
|
-
// throw new CramMalformedError('Embedded reference is too small')
|
|
238
|
-
// }
|
|
239
|
-
// TODO verify
|
|
240
|
-
return {
|
|
241
|
-
seq: refBlock.data.toString('utf8'),
|
|
242
|
-
start: sliceHeader.refSeqStart,
|
|
243
|
-
end: sliceHeader.refSeqStart + sliceHeader.refSeqSpan - 1,
|
|
244
|
-
span: sliceHeader.refSeqSpan,
|
|
245
|
-
};
|
|
232
|
+
const seq = await this.file.fetchReferenceSequenceCallback(sliceHeader.refSeqId, sliceHeader.refSeqStart, sliceHeader.refSeqStart + sliceHeader.refSeqSpan - 1);
|
|
233
|
+
if (seq.length !== sliceHeader.refSeqSpan) {
|
|
234
|
+
throw new errors_1.CramArgumentError('seqFetch callback returned a reference sequence of the wrong length');
|
|
246
235
|
}
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
}
|
|
256
|
-
return {
|
|
257
|
-
seq,
|
|
258
|
-
start: sliceHeader.refSeqStart,
|
|
259
|
-
end: sliceHeader.refSeqStart + sliceHeader.refSeqSpan - 1,
|
|
260
|
-
span: sliceHeader.refSeqSpan,
|
|
261
|
-
};
|
|
262
|
-
}
|
|
263
|
-
return undefined;
|
|
264
|
-
});
|
|
236
|
+
return {
|
|
237
|
+
seq,
|
|
238
|
+
start: sliceHeader.refSeqStart,
|
|
239
|
+
end: sliceHeader.refSeqStart + sliceHeader.refSeqSpan - 1,
|
|
240
|
+
span: sliceHeader.refSeqSpan,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
return undefined;
|
|
265
244
|
}
|
|
266
245
|
getAllRecords() {
|
|
267
246
|
return this.getRecords(() => true);
|
|
268
247
|
}
|
|
269
|
-
_fetchRecords() {
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
const
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
}
|
|
248
|
+
async _fetchRecords() {
|
|
249
|
+
const { majorVersion } = await this.file.getDefinition();
|
|
250
|
+
const compressionScheme = await this.container.getCompressionScheme();
|
|
251
|
+
if (compressionScheme === undefined) {
|
|
252
|
+
throw new Error('compression scheme undefined');
|
|
253
|
+
}
|
|
254
|
+
const sliceHeader = await this.getHeader();
|
|
255
|
+
const blocksByContentId = await this._getBlocksContentIdIndex();
|
|
256
|
+
// check MD5 of reference if available
|
|
257
|
+
if (majorVersion > 1 &&
|
|
258
|
+
this.file.options.checkSequenceMD5 &&
|
|
259
|
+
(0, sectionParsers_1.isMappedSliceHeader)(sliceHeader.parsedContent) &&
|
|
260
|
+
sliceHeader.parsedContent.refSeqId >= 0 &&
|
|
261
|
+
sliceHeader.parsedContent.md5?.join('') !== '0000000000000000') {
|
|
262
|
+
const refRegion = await this.getReferenceRegion();
|
|
263
|
+
if (refRegion) {
|
|
264
|
+
const { seq, start, end } = refRegion;
|
|
265
|
+
const seqMd5 = (0, util_1.sequenceMD5)(seq);
|
|
266
|
+
const storedMd5 = sliceHeader.parsedContent.md5
|
|
267
|
+
?.map(byte => (byte < 16 ? '0' : '') + byte.toString(16))
|
|
268
|
+
.join('');
|
|
269
|
+
if (seqMd5 !== storedMd5) {
|
|
270
|
+
throw new errors_1.CramMalformedError(`MD5 checksum reference mismatch for ref ${sliceHeader.parsedContent.refSeqId} pos ${start}..${end}. recorded MD5: ${storedMd5}, calculated MD5: ${seqMd5}`);
|
|
293
271
|
}
|
|
294
272
|
}
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
273
|
+
}
|
|
274
|
+
// tracks the read position within the block. codec.decode() methods
|
|
275
|
+
// advance the byte and bit positions in the cursor as they decode
|
|
276
|
+
// data note that we are only decoding a single block here, the core
|
|
277
|
+
// data block
|
|
278
|
+
const coreDataBlock = await this.getCoreDataBlock();
|
|
279
|
+
const cursors = {
|
|
280
|
+
lastAlignmentStart: (0, sectionParsers_1.isMappedSliceHeader)(sliceHeader.parsedContent)
|
|
281
|
+
? sliceHeader.parsedContent.refSeqStart
|
|
282
|
+
: 0,
|
|
283
|
+
coreBlock: { bitPosition: 7, bytePosition: 0 },
|
|
284
|
+
externalBlocks: {
|
|
285
|
+
map: new Map(),
|
|
286
|
+
getCursor(contentId) {
|
|
287
|
+
let r = this.map.get(contentId);
|
|
288
|
+
if (r === undefined) {
|
|
289
|
+
r = { bitPosition: 7, bytePosition: 0 };
|
|
290
|
+
this.map.set(contentId, r);
|
|
291
|
+
}
|
|
292
|
+
return r;
|
|
315
293
|
},
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
294
|
+
},
|
|
295
|
+
};
|
|
296
|
+
const decodeDataSeries = (dataSeriesName) => {
|
|
297
|
+
const codec = compressionScheme.getCodecForDataSeries(dataSeriesName);
|
|
298
|
+
if (!codec) {
|
|
299
|
+
throw new errors_1.CramMalformedError(`no codec defined for ${dataSeriesName} data series`);
|
|
300
|
+
}
|
|
301
|
+
// console.log(dataSeriesName, Object.getPrototypeOf(codec))
|
|
302
|
+
const decoded = codec.decode(this, coreDataBlock, blocksByContentId, cursors);
|
|
303
|
+
return decoded;
|
|
304
|
+
};
|
|
305
|
+
const records = new Array(sliceHeader.parsedContent.numRecords);
|
|
306
|
+
for (let i = 0; i < records.length; i += 1) {
|
|
307
|
+
try {
|
|
308
|
+
const init = (0, decodeRecord_1.default)(this, decodeDataSeries, compressionScheme, sliceHeader, coreDataBlock, blocksByContentId, cursors, majorVersion, i);
|
|
309
|
+
records[i] = new record_1.default({
|
|
310
|
+
...init,
|
|
311
|
+
uniqueId: sliceHeader.contentPosition +
|
|
312
|
+
sliceHeader.parsedContent.recordCounter +
|
|
313
|
+
i +
|
|
314
|
+
1,
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
catch (e) {
|
|
318
|
+
if (e instanceof getBits_1.CramBufferOverrunError) {
|
|
319
|
+
console.warn('read attempted beyond end of buffer, file seems truncated.');
|
|
320
|
+
break;
|
|
321
321
|
}
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
return decoded;
|
|
325
|
-
};
|
|
326
|
-
const records = new Array(sliceHeader.parsedContent.numRecords);
|
|
327
|
-
for (let i = 0; i < records.length; i += 1) {
|
|
328
|
-
try {
|
|
329
|
-
const init = (0, decodeRecord_1.default)(this, decodeDataSeries, compressionScheme, sliceHeader, coreDataBlock, blocksByContentId, cursors, majorVersion, i);
|
|
330
|
-
records[i] = new record_1.default(Object.assign(Object.assign({}, init), { uniqueId: sliceHeader.contentPosition +
|
|
331
|
-
sliceHeader.parsedContent.recordCounter +
|
|
332
|
-
i +
|
|
333
|
-
1 }));
|
|
334
|
-
}
|
|
335
|
-
catch (e) {
|
|
336
|
-
if (e instanceof getBits_1.CramBufferOverrunError) {
|
|
337
|
-
console.warn('read attempted beyond end of buffer, file seems truncated.');
|
|
338
|
-
break;
|
|
339
|
-
}
|
|
340
|
-
else {
|
|
341
|
-
throw e;
|
|
342
|
-
}
|
|
322
|
+
else {
|
|
323
|
+
throw e;
|
|
343
324
|
}
|
|
344
325
|
}
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
326
|
+
}
|
|
327
|
+
// interpret `recordsToNextFragment` attributes to make standard `mate`
|
|
328
|
+
// objects Resolve mate pair cross-references between records in this slice
|
|
329
|
+
for (let i = 0; i < records.length; i += 1) {
|
|
330
|
+
const { mateRecordNumber } = records[i];
|
|
331
|
+
if (mateRecordNumber !== undefined && mateRecordNumber >= 0) {
|
|
332
|
+
associateIntraSliceMate(records, i, records[i], records[mateRecordNumber]);
|
|
352
333
|
}
|
|
353
|
-
|
|
354
|
-
|
|
334
|
+
}
|
|
335
|
+
return records;
|
|
355
336
|
}
|
|
356
|
-
getRecords(filterFunction) {
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
337
|
+
async getRecords(filterFunction) {
|
|
338
|
+
// fetch the features if necessary, using the file-level feature cache
|
|
339
|
+
const cacheKey = this.container.filePosition + this.containerPosition;
|
|
340
|
+
let recordsPromise = this.file.featureCache.get(cacheKey.toString());
|
|
341
|
+
if (!recordsPromise) {
|
|
342
|
+
recordsPromise = this._fetchRecords();
|
|
343
|
+
this.file.featureCache.set(cacheKey.toString(), recordsPromise);
|
|
344
|
+
}
|
|
345
|
+
const unfiltered = await recordsPromise;
|
|
346
|
+
const records = unfiltered.filter(filterFunction);
|
|
347
|
+
// if we can fetch reference sequence, add the reference sequence to the records
|
|
348
|
+
if (records.length && this.file.fetchReferenceSequenceCallback) {
|
|
349
|
+
const sliceHeader = await this.getHeader();
|
|
350
|
+
if ((0, sectionParsers_1.isMappedSliceHeader)(sliceHeader.parsedContent) &&
|
|
351
|
+
(sliceHeader.parsedContent.refSeqId >= 0 || // single-ref slice
|
|
352
|
+
sliceHeader.parsedContent.refSeqId === -2) // multi-ref slice
|
|
353
|
+
) {
|
|
354
|
+
const singleRefId = sliceHeader.parsedContent.refSeqId >= 0
|
|
355
|
+
? sliceHeader.parsedContent.refSeqId
|
|
356
|
+
: undefined;
|
|
357
|
+
const compressionScheme = await this.container.getCompressionScheme();
|
|
358
|
+
if (compressionScheme === undefined) {
|
|
359
|
+
throw new Error('compression scheme undefined');
|
|
360
|
+
}
|
|
361
|
+
const refRegions = {};
|
|
362
|
+
// iterate over the records to find the spans of the reference
|
|
363
|
+
// sequences we need to fetch
|
|
364
|
+
for (const record of records) {
|
|
365
|
+
const seqId = singleRefId !== undefined ? singleRefId : record.sequenceId;
|
|
366
|
+
let refRegion = refRegions[seqId];
|
|
367
|
+
if (!refRegion) {
|
|
368
|
+
refRegion = {
|
|
369
|
+
id: seqId,
|
|
370
|
+
start: record.alignmentStart,
|
|
371
|
+
end: Number.NEGATIVE_INFINITY,
|
|
372
|
+
seq: null,
|
|
373
|
+
};
|
|
374
|
+
refRegions[seqId] = refRegion;
|
|
375
|
+
}
|
|
376
|
+
const end = record.alignmentStart +
|
|
377
|
+
(record.lengthOnRef || record.readLength) -
|
|
378
|
+
1;
|
|
379
|
+
if (end > refRegion.end) {
|
|
380
|
+
refRegion.end = end;
|
|
381
|
+
}
|
|
382
|
+
if (record.alignmentStart < refRegion.start) {
|
|
383
|
+
refRegion.start = record.alignmentStart;
|
|
380
384
|
}
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
refRegion = {
|
|
389
|
-
id: seqId,
|
|
390
|
-
start: record.alignmentStart,
|
|
391
|
-
end: Number.NEGATIVE_INFINITY,
|
|
392
|
-
seq: null,
|
|
393
|
-
};
|
|
394
|
-
refRegions[seqId] = refRegion;
|
|
395
|
-
}
|
|
396
|
-
const end = record.alignmentStart +
|
|
397
|
-
(record.lengthOnRef || record.readLength) -
|
|
398
|
-
1;
|
|
399
|
-
if (end > refRegion.end) {
|
|
400
|
-
refRegion.end = end;
|
|
401
|
-
}
|
|
402
|
-
if (record.alignmentStart < refRegion.start) {
|
|
403
|
-
refRegion.start = record.alignmentStart;
|
|
404
|
-
}
|
|
385
|
+
}
|
|
386
|
+
// fetch the `seq` for all of the ref regions
|
|
387
|
+
await Promise.all(Object.values(refRegions).map(async (refRegion) => {
|
|
388
|
+
if (refRegion.id !== -1 &&
|
|
389
|
+
refRegion.start <= refRegion.end &&
|
|
390
|
+
this.file.fetchReferenceSequenceCallback) {
|
|
391
|
+
refRegion.seq = await this.file.fetchReferenceSequenceCallback(refRegion.id, refRegion.start, refRegion.end);
|
|
405
392
|
}
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
// now decorate all the records with them
|
|
415
|
-
for (const record of records) {
|
|
416
|
-
const seqId = singleRefId !== undefined ? singleRefId : record.sequenceId;
|
|
417
|
-
const refRegion = refRegions[seqId];
|
|
418
|
-
if (refRegion === null || refRegion === void 0 ? void 0 : refRegion.seq) {
|
|
419
|
-
const seq = refRegion.seq;
|
|
420
|
-
record.addReferenceSequence(Object.assign(Object.assign({}, refRegion), { seq }), compressionScheme);
|
|
421
|
-
}
|
|
393
|
+
}));
|
|
394
|
+
// now decorate all the records with them
|
|
395
|
+
for (const record of records) {
|
|
396
|
+
const seqId = singleRefId !== undefined ? singleRefId : record.sequenceId;
|
|
397
|
+
const refRegion = refRegions[seqId];
|
|
398
|
+
if (refRegion?.seq) {
|
|
399
|
+
const seq = refRegion.seq;
|
|
400
|
+
record.addReferenceSequence({ ...refRegion, seq }, compressionScheme);
|
|
422
401
|
}
|
|
423
402
|
}
|
|
424
403
|
}
|
|
425
|
-
|
|
426
|
-
|
|
404
|
+
}
|
|
405
|
+
return records;
|
|
427
406
|
}
|
|
428
407
|
}
|
|
429
408
|
exports.default = CramSlice;
|