@gmod/cram 1.5.9 → 1.6.2
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 +90 -0
- package/README.md +182 -172
- package/dist/craiIndex.d.ts +37 -0
- package/dist/craiIndex.js +196 -301
- package/dist/craiIndex.js.map +1 -0
- package/dist/cram-bundle.js +6 -15
- package/dist/cramFile/codecs/_base.d.ts +6 -0
- package/dist/cramFile/codecs/_base.js +44 -53
- package/dist/cramFile/codecs/_base.js.map +1 -0
- package/dist/cramFile/codecs/beta.d.ts +4 -0
- package/dist/cramFile/codecs/beta.js +38 -48
- package/dist/cramFile/codecs/beta.js.map +1 -0
- package/dist/cramFile/codecs/byteArrayLength.d.ts +8 -0
- package/dist/cramFile/codecs/byteArrayLength.js +58 -78
- package/dist/cramFile/codecs/byteArrayLength.js.map +1 -0
- package/dist/cramFile/codecs/byteArrayStop.d.ts +6 -0
- package/dist/cramFile/codecs/byteArrayStop.js +62 -76
- package/dist/cramFile/codecs/byteArrayStop.js.map +1 -0
- package/dist/cramFile/codecs/external.d.ts +7 -0
- package/dist/cramFile/codecs/external.js +63 -81
- package/dist/cramFile/codecs/external.js.map +1 -0
- package/dist/cramFile/codecs/gamma.d.ts +4 -0
- package/dist/cramFile/codecs/gamma.js +43 -56
- package/dist/cramFile/codecs/gamma.js.map +1 -0
- package/dist/cramFile/codecs/huffman.d.ts +17 -0
- package/dist/cramFile/codecs/huffman.js +126 -199
- package/dist/cramFile/codecs/huffman.js.map +1 -0
- package/dist/cramFile/codecs/index.d.ts +2 -0
- package/dist/cramFile/codecs/index.js +31 -38
- package/dist/cramFile/codecs/index.js.map +1 -0
- package/dist/cramFile/codecs/subexp.d.ts +4 -0
- package/dist/cramFile/codecs/subexp.js +51 -64
- package/dist/cramFile/codecs/subexp.js.map +1 -0
- package/dist/cramFile/constants.d.ts +36 -0
- package/dist/cramFile/constants.js +52 -50
- package/dist/cramFile/constants.js.map +1 -0
- package/dist/cramFile/container/compressionScheme.d.ts +23 -0
- package/dist/cramFile/container/compressionScheme.js +115 -153
- package/dist/cramFile/container/compressionScheme.js.map +1 -0
- package/dist/cramFile/container/index.d.ts +13 -0
- package/dist/cramFile/container/index.js +169 -283
- package/dist/cramFile/container/index.js.map +1 -0
- package/dist/cramFile/file.d.ts +63 -0
- package/dist/cramFile/file.js +440 -766
- package/dist/cramFile/file.js.map +1 -0
- package/dist/cramFile/index.d.ts +2 -0
- package/dist/cramFile/index.js +7 -4
- package/dist/cramFile/index.js.map +1 -0
- package/dist/cramFile/record.d.ts +79 -0
- package/dist/cramFile/record.js +253 -308
- package/dist/cramFile/record.js.map +1 -0
- package/dist/cramFile/sectionParsers.d.ts +18 -0
- package/dist/cramFile/sectionParsers.js +324 -362
- package/dist/cramFile/sectionParsers.js.map +1 -0
- package/dist/cramFile/slice/decodeRecord.d.ts +2 -0
- package/dist/cramFile/slice/decodeRecord.js +278 -298
- package/dist/cramFile/slice/decodeRecord.js.map +1 -0
- package/dist/cramFile/slice/index.d.ts +20 -0
- package/dist/cramFile/slice/index.js +488 -789
- package/dist/cramFile/slice/index.js.map +1 -0
- package/dist/cramFile/util.d.ts +5 -0
- package/dist/cramFile/util.js +158 -144
- package/dist/cramFile/util.js.map +1 -0
- package/dist/errors.d.ts +23 -0
- package/dist/errors.js +66 -103
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +12 -12
- package/dist/index.js.map +1 -0
- package/dist/indexedCramFile.d.ts +39 -0
- package/dist/indexedCramFile.js +213 -315
- package/dist/indexedCramFile.js.map +1 -0
- package/dist/io/bufferCache.d.ts +12 -0
- package/dist/io/bufferCache.js +108 -128
- package/dist/io/bufferCache.js.map +1 -0
- package/dist/io/index.d.ts +5 -0
- package/dist/io/index.js +29 -27
- package/dist/io/index.js.map +1 -0
- package/dist/io/localFile.d.ts +10 -0
- package/dist/io/localFile.js +105 -162
- package/dist/io/localFile.js.map +1 -0
- package/dist/io/remoteFile.d.ts +16 -0
- package/dist/io/remoteFile.js +137 -206
- package/dist/io/remoteFile.js.map +1 -0
- package/dist/rans/constants.d.ts +3 -0
- package/dist/rans/constants.js +6 -6
- package/dist/rans/constants.js.map +1 -0
- package/dist/rans/d04.d.ts +1 -0
- package/dist/rans/d04.js +70 -99
- package/dist/rans/d04.js.map +1 -0
- package/dist/rans/d14.d.ts +1 -0
- package/dist/rans/d14.js +55 -93
- package/dist/rans/d14.js.map +1 -0
- package/dist/rans/decoding.d.ts +30 -0
- package/dist/rans/decoding.js +112 -159
- package/dist/rans/decoding.js.map +1 -0
- package/dist/rans/frequencies.d.ts +2 -0
- package/dist/rans/frequencies.js +110 -119
- package/dist/rans/frequencies.js.map +1 -0
- package/dist/rans/index.d.ts +1 -0
- package/dist/rans/index.js +111 -174
- package/dist/rans/index.js.map +1 -0
- package/dist/sam.d.ts +1 -0
- package/dist/sam.js +16 -41
- package/dist/sam.js.map +1 -0
- package/dist/unzip-pako.d.ts +2 -0
- package/dist/unzip-pako.js +9 -0
- package/dist/unzip-pako.js.map +1 -0
- package/dist/unzip.d.ts +2 -0
- package/dist/unzip.js +6 -0
- package/dist/unzip.js.map +1 -0
- package/errors.js +66 -103
- package/esm/craiIndex.d.ts +37 -0
- package/esm/craiIndex.js +158 -0
- package/esm/craiIndex.js.map +1 -0
- package/esm/cramFile/codecs/_base.d.ts +6 -0
- package/esm/cramFile/codecs/_base.js +42 -0
- package/esm/cramFile/codecs/_base.js.map +1 -0
- package/esm/cramFile/codecs/beta.d.ts +4 -0
- package/esm/cramFile/codecs/beta.js +15 -0
- package/esm/cramFile/codecs/beta.js.map +1 -0
- package/esm/cramFile/codecs/byteArrayLength.d.ts +8 -0
- package/esm/cramFile/codecs/byteArrayLength.js +35 -0
- package/esm/cramFile/codecs/byteArrayLength.js.map +1 -0
- package/esm/cramFile/codecs/byteArrayStop.d.ts +6 -0
- package/esm/cramFile/codecs/byteArrayStop.js +40 -0
- package/esm/cramFile/codecs/byteArrayStop.js.map +1 -0
- package/esm/cramFile/codecs/external.d.ts +7 -0
- package/esm/cramFile/codecs/external.js +40 -0
- package/esm/cramFile/codecs/external.js.map +1 -0
- package/esm/cramFile/codecs/gamma.d.ts +4 -0
- package/esm/cramFile/codecs/gamma.js +20 -0
- package/esm/cramFile/codecs/gamma.js.map +1 -0
- package/esm/cramFile/codecs/huffman.d.ts +17 -0
- package/esm/cramFile/codecs/huffman.js +107 -0
- package/esm/cramFile/codecs/huffman.js.map +1 -0
- package/esm/cramFile/codecs/index.d.ts +2 -0
- package/esm/cramFile/codecs/index.js +30 -0
- package/esm/cramFile/codecs/index.js.map +1 -0
- package/esm/cramFile/codecs/subexp.d.ts +4 -0
- package/esm/cramFile/codecs/subexp.js +28 -0
- package/esm/cramFile/codecs/subexp.js.map +1 -0
- package/esm/cramFile/constants.d.ts +36 -0
- package/esm/cramFile/constants.js +51 -0
- package/esm/cramFile/constants.js.map +1 -0
- package/esm/cramFile/container/compressionScheme.d.ts +23 -0
- package/esm/cramFile/container/compressionScheme.js +123 -0
- package/esm/cramFile/container/compressionScheme.js.map +1 -0
- package/esm/cramFile/container/index.d.ts +13 -0
- package/esm/cramFile/container/index.js +84 -0
- package/esm/cramFile/container/index.js.map +1 -0
- package/esm/cramFile/file.d.ts +63 -0
- package/esm/cramFile/file.js +281 -0
- package/esm/cramFile/file.js.map +1 -0
- package/esm/cramFile/index.d.ts +2 -0
- package/esm/cramFile/index.js +3 -0
- package/esm/cramFile/index.js.map +1 -0
- package/esm/cramFile/record.d.ts +79 -0
- package/esm/cramFile/record.js +297 -0
- package/esm/cramFile/record.js.map +1 -0
- package/esm/cramFile/sectionParsers.d.ts +18 -0
- package/esm/cramFile/sectionParsers.js +347 -0
- package/esm/cramFile/sectionParsers.js.map +1 -0
- package/esm/cramFile/slice/decodeRecord.d.ts +2 -0
- package/esm/cramFile/slice/decodeRecord.js +299 -0
- package/esm/cramFile/slice/decodeRecord.js.map +1 -0
- package/esm/cramFile/slice/index.d.ts +20 -0
- package/esm/cramFile/slice/index.js +364 -0
- package/esm/cramFile/slice/index.js.map +1 -0
- package/esm/cramFile/util.d.ts +5 -0
- package/esm/cramFile/util.js +161 -0
- package/esm/cramFile/util.js.map +1 -0
- package/esm/errors.d.ts +23 -0
- package/esm/errors.js +24 -0
- package/esm/errors.js.map +1 -0
- package/esm/index.d.ts +4 -0
- package/esm/index.js +5 -0
- package/esm/index.js.map +1 -0
- package/esm/indexedCramFile.d.ts +39 -0
- package/esm/indexedCramFile.js +155 -0
- package/esm/indexedCramFile.js.map +1 -0
- package/esm/io/bufferCache.d.ts +12 -0
- package/esm/io/bufferCache.js +54 -0
- package/esm/io/bufferCache.js.map +1 -0
- package/esm/io/index.d.ts +5 -0
- package/esm/io/index.js +24 -0
- package/esm/io/index.js.map +1 -0
- package/esm/io/localFile.d.ts +10 -0
- package/esm/io/localFile.js +31 -0
- package/esm/io/localFile.js.map +1 -0
- package/esm/io/remoteFile.d.ts +16 -0
- package/esm/io/remoteFile.js +64 -0
- package/esm/io/remoteFile.js.map +1 -0
- package/esm/rans/constants.d.ts +3 -0
- package/esm/rans/constants.js +5 -0
- package/esm/rans/constants.js.map +1 -0
- package/esm/rans/d04.d.ts +1 -0
- package/esm/rans/d04.js +67 -0
- package/esm/rans/d04.js.map +1 -0
- package/esm/rans/d14.d.ts +1 -0
- package/esm/rans/d14.js +52 -0
- package/esm/rans/d14.js.map +1 -0
- package/esm/rans/decoding.d.ts +30 -0
- package/esm/rans/decoding.js +118 -0
- package/esm/rans/decoding.js.map +1 -0
- package/esm/rans/frequencies.d.ts +2 -0
- package/esm/rans/frequencies.js +110 -0
- package/esm/rans/frequencies.js.map +1 -0
- package/esm/rans/index.d.ts +1 -0
- package/esm/rans/index.js +195 -0
- package/esm/rans/index.js.map +1 -0
- package/esm/sam.d.ts +1 -0
- package/esm/sam.js +16 -0
- package/esm/sam.js.map +1 -0
- package/esm/unzip-pako.d.ts +2 -0
- package/esm/unzip-pako.js +5 -0
- package/esm/unzip-pako.js.map +1 -0
- package/esm/unzip.d.ts +2 -0
- package/esm/unzip.js +3 -0
- package/esm/unzip.js.map +1 -0
- package/package.json +38 -35
- package/src/craiIndex.js +180 -0
- package/src/cramFile/codecs/_base.js +49 -0
- package/src/cramFile/codecs/beta.js +23 -0
- package/src/cramFile/codecs/byteArrayLength.js +55 -0
- package/src/cramFile/codecs/byteArrayStop.js +50 -0
- package/src/cramFile/codecs/external.js +54 -0
- package/src/cramFile/codecs/gamma.js +30 -0
- package/src/cramFile/codecs/huffman.js +137 -0
- package/src/cramFile/codecs/index.js +38 -0
- package/src/cramFile/codecs/subexp.js +32 -0
- package/src/cramFile/constants.js +55 -0
- package/src/cramFile/container/compressionScheme.js +144 -0
- package/src/cramFile/container/index.js +119 -0
- package/src/cramFile/file.js +347 -0
- package/src/cramFile/index.js +3 -0
- package/src/cramFile/record.js +337 -0
- package/src/cramFile/sectionParsers.js +379 -0
- package/src/cramFile/slice/decodeRecord.js +362 -0
- package/src/cramFile/slice/index.js +497 -0
- package/src/cramFile/util.js +169 -0
- package/src/errors.js +22 -0
- package/src/index.js +5 -0
- package/src/indexedCramFile.js +191 -0
- package/src/io/bufferCache.js +66 -0
- package/src/io/index.js +26 -0
- package/src/io/localFile.js +35 -0
- package/src/io/remoteFile.js +71 -0
- package/src/rans/README.md +1 -0
- package/src/rans/constants.js +5 -0
- package/src/rans/d04.js +83 -0
- package/src/rans/d14.js +59 -0
- package/src/rans/decoding.js +141 -0
- package/src/rans/frequencies.js +121 -0
- package/src/rans/index.js +249 -0
- package/src/sam.js +15 -0
- package/src/unzip-pako.ts +5 -0
- package/src/unzip.ts +2 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export default class CramFile {
|
|
2
|
+
/**
|
|
3
|
+
* @param {object} args
|
|
4
|
+
* @param {object} [args.filehandle] - a filehandle that implements the stat() and
|
|
5
|
+
* read() methods of the Node filehandle API https://nodejs.org/api/fs.html#fs_class_filehandle
|
|
6
|
+
* @param {object} [args.path] - path to the cram file
|
|
7
|
+
* @param {object} [args.url] - url for the cram file. also supports file:// urls for local files
|
|
8
|
+
* @param {function} [args.seqFetch] - a function with signature
|
|
9
|
+
* `(seqId, startCoordinate, endCoordinate)` that returns a promise for a string of sequence bases
|
|
10
|
+
* @param {number} [args.cacheSize] optional maximum number of CRAM records to cache. default 20,000
|
|
11
|
+
* @param {boolean} [args.checkSequenceMD5] - default true. if false, disables verifying the MD5
|
|
12
|
+
* checksum of the reference sequence underlying a slice. In some applications, this check can cause an inconvenient amount (many megabases) of sequences to be fetched.
|
|
13
|
+
*/
|
|
14
|
+
constructor(args: {
|
|
15
|
+
filehandle?: object | undefined;
|
|
16
|
+
path?: object | undefined;
|
|
17
|
+
url?: object | undefined;
|
|
18
|
+
seqFetch?: Function | undefined;
|
|
19
|
+
cacheSize?: number | undefined;
|
|
20
|
+
checkSequenceMD5?: boolean | undefined;
|
|
21
|
+
});
|
|
22
|
+
file: any;
|
|
23
|
+
validateChecksums: boolean;
|
|
24
|
+
fetchReferenceSequenceCallback: Function | undefined;
|
|
25
|
+
options: {
|
|
26
|
+
checkSequenceMD5: boolean;
|
|
27
|
+
cacheSize: number;
|
|
28
|
+
};
|
|
29
|
+
featureCache: any;
|
|
30
|
+
toString(): any;
|
|
31
|
+
read(buffer: any, offset: any, length: any, position: any): any;
|
|
32
|
+
stat(): any;
|
|
33
|
+
getDefinition(): Promise<any>;
|
|
34
|
+
getSamHeader(): Promise<any[]>;
|
|
35
|
+
header: any;
|
|
36
|
+
getHeaderText(): Promise<any>;
|
|
37
|
+
getSectionParsers(): Promise<{
|
|
38
|
+
cramFileDefinition: {
|
|
39
|
+
parser: any;
|
|
40
|
+
maxLength: number;
|
|
41
|
+
};
|
|
42
|
+
cramBlockHeader: {
|
|
43
|
+
parser: any;
|
|
44
|
+
maxLength: number;
|
|
45
|
+
};
|
|
46
|
+
cramBlockCrc32: {
|
|
47
|
+
parser: any;
|
|
48
|
+
maxLength: number;
|
|
49
|
+
};
|
|
50
|
+
}>;
|
|
51
|
+
getContainerById(containerNumber: any): Promise<CramContainer | undefined>;
|
|
52
|
+
checkCrc32(position: any, length: any, recordedCrc32: any, description: any): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* @returns {Promise[number]} the number of containers in the file
|
|
55
|
+
*/
|
|
56
|
+
containerCount(): any;
|
|
57
|
+
getContainerAtPosition(position: any): CramContainer;
|
|
58
|
+
readBlockHeader(position: any): Promise<any>;
|
|
59
|
+
_parseSection(section: any, position: any, size: any, preReadBuffer: any): Promise<any>;
|
|
60
|
+
_uncompress(compressionMethod: any, inputBuffer: any, outputBuffer: any): void;
|
|
61
|
+
readBlock(position: any): Promise<any>;
|
|
62
|
+
}
|
|
63
|
+
import CramContainer from "./container";
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import { unzip } from '../unzip';
|
|
2
|
+
import crc32 from 'buffer-crc32';
|
|
3
|
+
import LRU from 'quick-lru';
|
|
4
|
+
import { CramUnimplementedError, CramMalformedError } from '../errors';
|
|
5
|
+
import ransuncompress from '../rans';
|
|
6
|
+
import { cramFileDefinition as cramFileDefinitionParser, getSectionParsers, } from './sectionParsers';
|
|
7
|
+
import htscodecs from '@jkbonfield/htscodecs';
|
|
8
|
+
import CramContainer from './container';
|
|
9
|
+
import { open } from '../io';
|
|
10
|
+
import { parseItem, tinyMemoize } from './util';
|
|
11
|
+
import { parseHeaderText } from '../sam';
|
|
12
|
+
export default class CramFile {
|
|
13
|
+
/**
|
|
14
|
+
* @param {object} args
|
|
15
|
+
* @param {object} [args.filehandle] - a filehandle that implements the stat() and
|
|
16
|
+
* read() methods of the Node filehandle API https://nodejs.org/api/fs.html#fs_class_filehandle
|
|
17
|
+
* @param {object} [args.path] - path to the cram file
|
|
18
|
+
* @param {object} [args.url] - url for the cram file. also supports file:// urls for local files
|
|
19
|
+
* @param {function} [args.seqFetch] - a function with signature
|
|
20
|
+
* `(seqId, startCoordinate, endCoordinate)` that returns a promise for a string of sequence bases
|
|
21
|
+
* @param {number} [args.cacheSize] optional maximum number of CRAM records to cache. default 20,000
|
|
22
|
+
* @param {boolean} [args.checkSequenceMD5] - default true. if false, disables verifying the MD5
|
|
23
|
+
* checksum of the reference sequence underlying a slice. In some applications, this check can cause an inconvenient amount (many megabases) of sequences to be fetched.
|
|
24
|
+
*/
|
|
25
|
+
constructor(args) {
|
|
26
|
+
this.file = open(args.url, args.path, args.filehandle);
|
|
27
|
+
this.validateChecksums = true;
|
|
28
|
+
this.fetchReferenceSequenceCallback = args.seqFetch;
|
|
29
|
+
this.options = {
|
|
30
|
+
checkSequenceMD5: args.checkSequenceMD5 !== false,
|
|
31
|
+
cacheSize: args.cacheSize !== undefined ? args.cacheSize : 20000,
|
|
32
|
+
};
|
|
33
|
+
// cache of features in a slice, keyed by the
|
|
34
|
+
// slice offset. caches all of the features in a slice, or none.
|
|
35
|
+
// the cache is actually used by the slice object, it's just
|
|
36
|
+
// kept here at the level of the file
|
|
37
|
+
this.featureCache = new LRU({
|
|
38
|
+
maxSize: this.options.cacheSize,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
toString() {
|
|
42
|
+
if (this.file.filename) {
|
|
43
|
+
return this.file.filename;
|
|
44
|
+
}
|
|
45
|
+
if (this.file.url) {
|
|
46
|
+
return this.file.url;
|
|
47
|
+
}
|
|
48
|
+
return '(cram file)';
|
|
49
|
+
}
|
|
50
|
+
// can just read this object like a filehandle
|
|
51
|
+
read(buffer, offset, length, position) {
|
|
52
|
+
return this.file.read(buffer, offset, length, position);
|
|
53
|
+
}
|
|
54
|
+
// can just stat this object like a filehandle
|
|
55
|
+
stat() {
|
|
56
|
+
return this.file.stat();
|
|
57
|
+
}
|
|
58
|
+
// memoized
|
|
59
|
+
async getDefinition() {
|
|
60
|
+
const headbytes = Buffer.allocUnsafe(cramFileDefinitionParser.maxLength);
|
|
61
|
+
await this.file.read(headbytes, 0, cramFileDefinitionParser.maxLength, 0);
|
|
62
|
+
const definition = cramFileDefinitionParser.parser.parse(headbytes).result;
|
|
63
|
+
if (definition.majorVersion !== 2 && definition.majorVersion !== 3) {
|
|
64
|
+
throw new CramUnimplementedError(`CRAM version ${definition.majorVersion} not supported`);
|
|
65
|
+
}
|
|
66
|
+
return definition;
|
|
67
|
+
}
|
|
68
|
+
// memoize
|
|
69
|
+
async getSamHeader() {
|
|
70
|
+
const firstContainer = await this.getContainerById(0);
|
|
71
|
+
if (!firstContainer) {
|
|
72
|
+
throw new CramMalformedError('file contains no containers');
|
|
73
|
+
}
|
|
74
|
+
const { content } = await firstContainer.getFirstBlock();
|
|
75
|
+
// find the end of the trailing zeros in the header text
|
|
76
|
+
const headerLength = content.readInt32LE(0);
|
|
77
|
+
const textStart = 4;
|
|
78
|
+
// let textEnd = content.length - 1
|
|
79
|
+
// while (textEnd >= textStart && !content[textEnd]) textEnd -= 1
|
|
80
|
+
// trim off the trailing zeros
|
|
81
|
+
const text = content.toString('utf8', textStart, textStart + headerLength);
|
|
82
|
+
this.header = text;
|
|
83
|
+
return parseHeaderText(text);
|
|
84
|
+
}
|
|
85
|
+
async getHeaderText() {
|
|
86
|
+
await this.getSamHeader();
|
|
87
|
+
return this.header;
|
|
88
|
+
}
|
|
89
|
+
// memoize
|
|
90
|
+
async getSectionParsers() {
|
|
91
|
+
const { majorVersion } = await this.getDefinition();
|
|
92
|
+
return getSectionParsers(majorVersion);
|
|
93
|
+
}
|
|
94
|
+
async getContainerById(containerNumber) {
|
|
95
|
+
const sectionParsers = await this.getSectionParsers();
|
|
96
|
+
let position = sectionParsers.cramFileDefinition.maxLength;
|
|
97
|
+
const { size: fileSize } = await this.file.stat();
|
|
98
|
+
const { cramContainerHeader1 } = sectionParsers;
|
|
99
|
+
// skip with a series of reads to the proper container
|
|
100
|
+
let currentContainer;
|
|
101
|
+
for (let i = 0; i <= containerNumber; i += 1) {
|
|
102
|
+
// if we are about to go off the end of the file
|
|
103
|
+
// and have not found that container, it does not exist
|
|
104
|
+
if (position + cramContainerHeader1.maxLength + 8 >= fileSize) {
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
currentContainer = this.getContainerAtPosition(position);
|
|
108
|
+
const currentHeader = await currentContainer.getHeader();
|
|
109
|
+
if (!currentHeader) {
|
|
110
|
+
throw new CramMalformedError(`container ${containerNumber} not found in file`);
|
|
111
|
+
}
|
|
112
|
+
// if this is the first container, read all the blocks in the
|
|
113
|
+
// container to determine its length, because we cannot trust
|
|
114
|
+
// the container header's given length due to a bug somewhere
|
|
115
|
+
// in htslib
|
|
116
|
+
if (i === 0) {
|
|
117
|
+
position = currentHeader._endPosition;
|
|
118
|
+
for (let j = 0; j < currentHeader.numBlocks; j += 1) {
|
|
119
|
+
const block = await this.readBlock(position);
|
|
120
|
+
position = block._endPosition;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
// otherwise, just traverse to the next container using the container's length
|
|
125
|
+
position += currentHeader._size + currentHeader.length;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return currentContainer;
|
|
129
|
+
}
|
|
130
|
+
async checkCrc32(position, length, recordedCrc32, description) {
|
|
131
|
+
const b = Buffer.allocUnsafe(length);
|
|
132
|
+
await this.file.read(b, 0, length, position);
|
|
133
|
+
const calculatedCrc32 = crc32.unsigned(b);
|
|
134
|
+
if (calculatedCrc32 !== recordedCrc32) {
|
|
135
|
+
throw new CramMalformedError(`crc mismatch in ${description}: recorded CRC32 = ${recordedCrc32}, but calculated CRC32 = ${calculatedCrc32}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* @returns {Promise[number]} the number of containers in the file
|
|
140
|
+
*/
|
|
141
|
+
async containerCount() {
|
|
142
|
+
const sectionParsers = await this.getSectionParsers();
|
|
143
|
+
const { size: fileSize } = await this.file.stat();
|
|
144
|
+
const { cramContainerHeader1 } = sectionParsers;
|
|
145
|
+
let containerCount = 0;
|
|
146
|
+
let position = sectionParsers.cramFileDefinition.maxLength;
|
|
147
|
+
while (position + cramContainerHeader1.maxLength + 8 < fileSize) {
|
|
148
|
+
const currentHeader = await this.getContainerAtPosition(position).getHeader();
|
|
149
|
+
if (!currentHeader) {
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
// if this is the first container, read all the blocks in the
|
|
153
|
+
// container, because we cannot trust the container
|
|
154
|
+
// header's given length due to a bug somewhere in htslib
|
|
155
|
+
if (containerCount === 0) {
|
|
156
|
+
position = currentHeader._endPosition;
|
|
157
|
+
for (let j = 0; j < currentHeader.numBlocks; j += 1) {
|
|
158
|
+
const block = await this.readBlock(position);
|
|
159
|
+
position = block._endPosition;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
// otherwise, just traverse to the next container using the container's length
|
|
164
|
+
position += currentHeader._size + currentHeader.length;
|
|
165
|
+
}
|
|
166
|
+
containerCount += 1;
|
|
167
|
+
}
|
|
168
|
+
return containerCount;
|
|
169
|
+
}
|
|
170
|
+
getContainerAtPosition(position) {
|
|
171
|
+
return new CramContainer(this, position);
|
|
172
|
+
}
|
|
173
|
+
async readBlockHeader(position) {
|
|
174
|
+
const sectionParsers = await this.getSectionParsers();
|
|
175
|
+
const { cramBlockHeader } = sectionParsers;
|
|
176
|
+
const { size: fileSize } = await this.file.stat();
|
|
177
|
+
if (position + cramBlockHeader.maxLength >= fileSize) {
|
|
178
|
+
return undefined;
|
|
179
|
+
}
|
|
180
|
+
const buffer = Buffer.allocUnsafe(cramBlockHeader.maxLength);
|
|
181
|
+
await this.file.read(buffer, 0, cramBlockHeader.maxLength, position);
|
|
182
|
+
return parseItem(buffer, cramBlockHeader.parser, 0, position);
|
|
183
|
+
}
|
|
184
|
+
async _parseSection(section, position, size = section.maxLength, preReadBuffer) {
|
|
185
|
+
let buffer;
|
|
186
|
+
if (preReadBuffer) {
|
|
187
|
+
buffer = preReadBuffer;
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
const { size: fileSize } = await this.file.stat();
|
|
191
|
+
if (position + size >= fileSize) {
|
|
192
|
+
return undefined;
|
|
193
|
+
}
|
|
194
|
+
buffer = Buffer.allocUnsafe(size);
|
|
195
|
+
await this.file.read(buffer, 0, size, position);
|
|
196
|
+
}
|
|
197
|
+
const data = parseItem(buffer, section.parser, 0, position);
|
|
198
|
+
if (data._size !== size) {
|
|
199
|
+
throw new CramMalformedError(`section read error: requested size ${size} does not equal parsed size ${data._size}`);
|
|
200
|
+
}
|
|
201
|
+
return data;
|
|
202
|
+
}
|
|
203
|
+
_uncompress(compressionMethod, inputBuffer, outputBuffer) {
|
|
204
|
+
if (compressionMethod === 'gzip') {
|
|
205
|
+
const result = unzip(inputBuffer);
|
|
206
|
+
result.copy(outputBuffer);
|
|
207
|
+
}
|
|
208
|
+
else if (compressionMethod === 'bzip2') {
|
|
209
|
+
var bits = bzip2.array(inputBuffer);
|
|
210
|
+
var size = bzip2.header(bits);
|
|
211
|
+
var j = 0;
|
|
212
|
+
do {
|
|
213
|
+
var chunk = bzip2.decompress(bits, size);
|
|
214
|
+
if (chunk != -1) {
|
|
215
|
+
Buffer.from(chunk).copy(outputBuffer, j);
|
|
216
|
+
j += chunk.length;
|
|
217
|
+
size -= chunk.length;
|
|
218
|
+
}
|
|
219
|
+
} while (chunk != -1);
|
|
220
|
+
}
|
|
221
|
+
else if (compressionMethod === 'rans') {
|
|
222
|
+
ransuncompress(inputBuffer, outputBuffer);
|
|
223
|
+
//htscodecs r4x8 is slower, but compatible.
|
|
224
|
+
//htscodecs.r4x8_uncompress(inputBuffer, outputBuffer);
|
|
225
|
+
}
|
|
226
|
+
else if (compressionMethod === 'rans4x16') {
|
|
227
|
+
htscodecs.r4x16_uncompress(inputBuffer, outputBuffer);
|
|
228
|
+
}
|
|
229
|
+
else if (compressionMethod === 'arith') {
|
|
230
|
+
htscodecs.arith_uncompress(inputBuffer, outputBuffer);
|
|
231
|
+
}
|
|
232
|
+
else if (compressionMethod === 'fqzcomp') {
|
|
233
|
+
htscodecs.fqzcomp_uncompress(inputBuffer, outputBuffer);
|
|
234
|
+
}
|
|
235
|
+
else if (compressionMethod === 'tok3') {
|
|
236
|
+
htscodecs.tok3_uncompress(inputBuffer, outputBuffer);
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
throw new CramUnimplementedError(`${compressionMethod} decompression not yet implemented`);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
async readBlock(position) {
|
|
243
|
+
const { majorVersion } = await this.getDefinition();
|
|
244
|
+
const sectionParsers = await this.getSectionParsers();
|
|
245
|
+
const block = await this.readBlockHeader(position);
|
|
246
|
+
const blockContentPosition = block._endPosition;
|
|
247
|
+
block.contentPosition = block._endPosition;
|
|
248
|
+
const uncompressedData = Buffer.allocUnsafe(block.uncompressedSize);
|
|
249
|
+
if (block.compressionMethod !== 'raw') {
|
|
250
|
+
const compressedData = Buffer.allocUnsafe(block.compressedSize);
|
|
251
|
+
await this.read(compressedData, 0, block.compressedSize, blockContentPosition);
|
|
252
|
+
this._uncompress(block.compressionMethod, compressedData, uncompressedData);
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
await this.read(uncompressedData, 0, block.uncompressedSize, blockContentPosition);
|
|
256
|
+
}
|
|
257
|
+
block.content = uncompressedData;
|
|
258
|
+
if (majorVersion >= 3) {
|
|
259
|
+
// parse the crc32
|
|
260
|
+
const crc = await this._parseSection(sectionParsers.cramBlockCrc32, blockContentPosition + block.compressedSize);
|
|
261
|
+
block.crc32 = crc.crc32;
|
|
262
|
+
// check the block data crc32
|
|
263
|
+
if (this.validateChecksums) {
|
|
264
|
+
await this.checkCrc32(position, block._size + block.compressedSize, block.crc32, 'block data');
|
|
265
|
+
}
|
|
266
|
+
// make the endposition and size reflect the whole block
|
|
267
|
+
block._endPosition = crc._endPosition;
|
|
268
|
+
block._size =
|
|
269
|
+
block.compressedSize + sectionParsers.cramBlockCrc32.maxLength;
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
block._endPosition = blockContentPosition + block.compressedSize;
|
|
273
|
+
block._size = block.compressedSize;
|
|
274
|
+
}
|
|
275
|
+
return block;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
'getDefinition getSectionParsers getSamHeader'
|
|
279
|
+
.split(' ')
|
|
280
|
+
.forEach(method => tinyMemoize(CramFile, method));
|
|
281
|
+
//# sourceMappingURL=file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/cramFile/file.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cramFile/index.js"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,QAAQ,CAAA;AAE7B,eAAe,QAAQ,CAAA"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Class of each CRAM record returned by this API.
|
|
3
|
+
*/
|
|
4
|
+
export default class CramRecord {
|
|
5
|
+
tags: {};
|
|
6
|
+
/**
|
|
7
|
+
* @returns {boolean} true if the read is paired, regardless of whether both segments are mapped
|
|
8
|
+
*/
|
|
9
|
+
isPaired(): boolean;
|
|
10
|
+
/** @returns {boolean} true if the read is paired, and both segments are mapped */
|
|
11
|
+
isProperlyPaired(): boolean;
|
|
12
|
+
/** @returns {boolean} true if the read itself is unmapped; conflictive with isProperlyPaired */
|
|
13
|
+
isSegmentUnmapped(): boolean;
|
|
14
|
+
/** @returns {boolean} true if the read itself is unmapped; conflictive with isProperlyPaired */
|
|
15
|
+
isMateUnmapped(): boolean;
|
|
16
|
+
/** @returns {boolean} true if the read is mapped to the reverse strand */
|
|
17
|
+
isReverseComplemented(): boolean;
|
|
18
|
+
/** @returns {boolean} true if the mate is mapped to the reverse strand */
|
|
19
|
+
isMateReverseComplemented(): boolean;
|
|
20
|
+
/** @returns {boolean} true if this is read number 1 in a pair */
|
|
21
|
+
isRead1(): boolean;
|
|
22
|
+
/** @returns {boolean} true if this is read number 2 in a pair */
|
|
23
|
+
isRead2(): boolean;
|
|
24
|
+
/** @returns {boolean} true if this is a secondary alignment */
|
|
25
|
+
isSecondary(): boolean;
|
|
26
|
+
/** @returns {boolean} true if this read has failed QC checks */
|
|
27
|
+
isFailedQc(): boolean;
|
|
28
|
+
/** @returns {boolean} true if the read is an optical or PCR duplicate */
|
|
29
|
+
isDuplicate(): boolean;
|
|
30
|
+
/** @returns {boolean} true if this is a supplementary alignment */
|
|
31
|
+
isSupplementary(): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* @returns {boolean} true if the read is detached
|
|
34
|
+
*/
|
|
35
|
+
isDetached(): boolean;
|
|
36
|
+
/** @returns {boolean} true if the read has a mate in this same CRAM segment */
|
|
37
|
+
hasMateDownStream(): boolean;
|
|
38
|
+
/** @returns {boolean} true if the read contains qual scores */
|
|
39
|
+
isPreservingQualityScores(): boolean;
|
|
40
|
+
/** @returns {boolean} true if the read has no sequence bases */
|
|
41
|
+
isUnknownBases(): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Get the original sequence of this read.
|
|
44
|
+
* @returns {String} sequence basepairs
|
|
45
|
+
*/
|
|
46
|
+
getReadBases(): string;
|
|
47
|
+
readBases: any;
|
|
48
|
+
/**
|
|
49
|
+
* Get the pair orientation of a paired read. Adapted from igv.js
|
|
50
|
+
* @returns {String} of paired orientatin
|
|
51
|
+
*/
|
|
52
|
+
getPairOrientation(): string;
|
|
53
|
+
/**
|
|
54
|
+
* Annotates this feature with the given reference sequence basepair
|
|
55
|
+
* information. This will add a `sub` and a `ref` item to base
|
|
56
|
+
* subsitution read features given the actual substituted and reference
|
|
57
|
+
* base pairs, and will make the `getReadSequence()` method work.
|
|
58
|
+
*
|
|
59
|
+
* @param {object} refRegion
|
|
60
|
+
* @param {number} refRegion.start
|
|
61
|
+
* @param {number} refRegion.end
|
|
62
|
+
* @param {string} refRegion.seq
|
|
63
|
+
* @param {CramContainerCompressionScheme} compressionScheme
|
|
64
|
+
* @returns {undefined} nothing
|
|
65
|
+
*/
|
|
66
|
+
addReferenceSequence(refRegion: {
|
|
67
|
+
start: number;
|
|
68
|
+
end: number;
|
|
69
|
+
seq: string;
|
|
70
|
+
}, compressionScheme: CramContainerCompressionScheme): undefined;
|
|
71
|
+
_refRegion: {
|
|
72
|
+
start: number;
|
|
73
|
+
end: number;
|
|
74
|
+
seq: string;
|
|
75
|
+
} | undefined;
|
|
76
|
+
toJSON(): {
|
|
77
|
+
readBases: string;
|
|
78
|
+
};
|
|
79
|
+
}
|