@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.
Files changed (258) hide show
  1. package/CHANGELOG.md +90 -0
  2. package/README.md +182 -172
  3. package/dist/craiIndex.d.ts +37 -0
  4. package/dist/craiIndex.js +196 -301
  5. package/dist/craiIndex.js.map +1 -0
  6. package/dist/cram-bundle.js +6 -15
  7. package/dist/cramFile/codecs/_base.d.ts +6 -0
  8. package/dist/cramFile/codecs/_base.js +44 -53
  9. package/dist/cramFile/codecs/_base.js.map +1 -0
  10. package/dist/cramFile/codecs/beta.d.ts +4 -0
  11. package/dist/cramFile/codecs/beta.js +38 -48
  12. package/dist/cramFile/codecs/beta.js.map +1 -0
  13. package/dist/cramFile/codecs/byteArrayLength.d.ts +8 -0
  14. package/dist/cramFile/codecs/byteArrayLength.js +58 -78
  15. package/dist/cramFile/codecs/byteArrayLength.js.map +1 -0
  16. package/dist/cramFile/codecs/byteArrayStop.d.ts +6 -0
  17. package/dist/cramFile/codecs/byteArrayStop.js +62 -76
  18. package/dist/cramFile/codecs/byteArrayStop.js.map +1 -0
  19. package/dist/cramFile/codecs/external.d.ts +7 -0
  20. package/dist/cramFile/codecs/external.js +63 -81
  21. package/dist/cramFile/codecs/external.js.map +1 -0
  22. package/dist/cramFile/codecs/gamma.d.ts +4 -0
  23. package/dist/cramFile/codecs/gamma.js +43 -56
  24. package/dist/cramFile/codecs/gamma.js.map +1 -0
  25. package/dist/cramFile/codecs/huffman.d.ts +17 -0
  26. package/dist/cramFile/codecs/huffman.js +126 -199
  27. package/dist/cramFile/codecs/huffman.js.map +1 -0
  28. package/dist/cramFile/codecs/index.d.ts +2 -0
  29. package/dist/cramFile/codecs/index.js +31 -38
  30. package/dist/cramFile/codecs/index.js.map +1 -0
  31. package/dist/cramFile/codecs/subexp.d.ts +4 -0
  32. package/dist/cramFile/codecs/subexp.js +51 -64
  33. package/dist/cramFile/codecs/subexp.js.map +1 -0
  34. package/dist/cramFile/constants.d.ts +36 -0
  35. package/dist/cramFile/constants.js +52 -50
  36. package/dist/cramFile/constants.js.map +1 -0
  37. package/dist/cramFile/container/compressionScheme.d.ts +23 -0
  38. package/dist/cramFile/container/compressionScheme.js +115 -153
  39. package/dist/cramFile/container/compressionScheme.js.map +1 -0
  40. package/dist/cramFile/container/index.d.ts +13 -0
  41. package/dist/cramFile/container/index.js +169 -283
  42. package/dist/cramFile/container/index.js.map +1 -0
  43. package/dist/cramFile/file.d.ts +63 -0
  44. package/dist/cramFile/file.js +440 -766
  45. package/dist/cramFile/file.js.map +1 -0
  46. package/dist/cramFile/index.d.ts +2 -0
  47. package/dist/cramFile/index.js +7 -4
  48. package/dist/cramFile/index.js.map +1 -0
  49. package/dist/cramFile/record.d.ts +79 -0
  50. package/dist/cramFile/record.js +253 -308
  51. package/dist/cramFile/record.js.map +1 -0
  52. package/dist/cramFile/sectionParsers.d.ts +18 -0
  53. package/dist/cramFile/sectionParsers.js +324 -362
  54. package/dist/cramFile/sectionParsers.js.map +1 -0
  55. package/dist/cramFile/slice/decodeRecord.d.ts +2 -0
  56. package/dist/cramFile/slice/decodeRecord.js +278 -298
  57. package/dist/cramFile/slice/decodeRecord.js.map +1 -0
  58. package/dist/cramFile/slice/index.d.ts +20 -0
  59. package/dist/cramFile/slice/index.js +488 -789
  60. package/dist/cramFile/slice/index.js.map +1 -0
  61. package/dist/cramFile/util.d.ts +5 -0
  62. package/dist/cramFile/util.js +158 -144
  63. package/dist/cramFile/util.js.map +1 -0
  64. package/dist/errors.d.ts +23 -0
  65. package/dist/errors.js +66 -103
  66. package/dist/errors.js.map +1 -0
  67. package/dist/index.d.ts +4 -0
  68. package/dist/index.js +12 -12
  69. package/dist/index.js.map +1 -0
  70. package/dist/indexedCramFile.d.ts +39 -0
  71. package/dist/indexedCramFile.js +213 -315
  72. package/dist/indexedCramFile.js.map +1 -0
  73. package/dist/io/bufferCache.d.ts +12 -0
  74. package/dist/io/bufferCache.js +108 -128
  75. package/dist/io/bufferCache.js.map +1 -0
  76. package/dist/io/index.d.ts +5 -0
  77. package/dist/io/index.js +29 -27
  78. package/dist/io/index.js.map +1 -0
  79. package/dist/io/localFile.d.ts +10 -0
  80. package/dist/io/localFile.js +105 -162
  81. package/dist/io/localFile.js.map +1 -0
  82. package/dist/io/remoteFile.d.ts +16 -0
  83. package/dist/io/remoteFile.js +137 -206
  84. package/dist/io/remoteFile.js.map +1 -0
  85. package/dist/rans/constants.d.ts +3 -0
  86. package/dist/rans/constants.js +6 -6
  87. package/dist/rans/constants.js.map +1 -0
  88. package/dist/rans/d04.d.ts +1 -0
  89. package/dist/rans/d04.js +70 -99
  90. package/dist/rans/d04.js.map +1 -0
  91. package/dist/rans/d14.d.ts +1 -0
  92. package/dist/rans/d14.js +55 -93
  93. package/dist/rans/d14.js.map +1 -0
  94. package/dist/rans/decoding.d.ts +30 -0
  95. package/dist/rans/decoding.js +112 -159
  96. package/dist/rans/decoding.js.map +1 -0
  97. package/dist/rans/frequencies.d.ts +2 -0
  98. package/dist/rans/frequencies.js +110 -119
  99. package/dist/rans/frequencies.js.map +1 -0
  100. package/dist/rans/index.d.ts +1 -0
  101. package/dist/rans/index.js +111 -174
  102. package/dist/rans/index.js.map +1 -0
  103. package/dist/sam.d.ts +1 -0
  104. package/dist/sam.js +16 -41
  105. package/dist/sam.js.map +1 -0
  106. package/dist/unzip-pako.d.ts +2 -0
  107. package/dist/unzip-pako.js +9 -0
  108. package/dist/unzip-pako.js.map +1 -0
  109. package/dist/unzip.d.ts +2 -0
  110. package/dist/unzip.js +6 -0
  111. package/dist/unzip.js.map +1 -0
  112. package/errors.js +66 -103
  113. package/esm/craiIndex.d.ts +37 -0
  114. package/esm/craiIndex.js +158 -0
  115. package/esm/craiIndex.js.map +1 -0
  116. package/esm/cramFile/codecs/_base.d.ts +6 -0
  117. package/esm/cramFile/codecs/_base.js +42 -0
  118. package/esm/cramFile/codecs/_base.js.map +1 -0
  119. package/esm/cramFile/codecs/beta.d.ts +4 -0
  120. package/esm/cramFile/codecs/beta.js +15 -0
  121. package/esm/cramFile/codecs/beta.js.map +1 -0
  122. package/esm/cramFile/codecs/byteArrayLength.d.ts +8 -0
  123. package/esm/cramFile/codecs/byteArrayLength.js +35 -0
  124. package/esm/cramFile/codecs/byteArrayLength.js.map +1 -0
  125. package/esm/cramFile/codecs/byteArrayStop.d.ts +6 -0
  126. package/esm/cramFile/codecs/byteArrayStop.js +40 -0
  127. package/esm/cramFile/codecs/byteArrayStop.js.map +1 -0
  128. package/esm/cramFile/codecs/external.d.ts +7 -0
  129. package/esm/cramFile/codecs/external.js +40 -0
  130. package/esm/cramFile/codecs/external.js.map +1 -0
  131. package/esm/cramFile/codecs/gamma.d.ts +4 -0
  132. package/esm/cramFile/codecs/gamma.js +20 -0
  133. package/esm/cramFile/codecs/gamma.js.map +1 -0
  134. package/esm/cramFile/codecs/huffman.d.ts +17 -0
  135. package/esm/cramFile/codecs/huffman.js +107 -0
  136. package/esm/cramFile/codecs/huffman.js.map +1 -0
  137. package/esm/cramFile/codecs/index.d.ts +2 -0
  138. package/esm/cramFile/codecs/index.js +30 -0
  139. package/esm/cramFile/codecs/index.js.map +1 -0
  140. package/esm/cramFile/codecs/subexp.d.ts +4 -0
  141. package/esm/cramFile/codecs/subexp.js +28 -0
  142. package/esm/cramFile/codecs/subexp.js.map +1 -0
  143. package/esm/cramFile/constants.d.ts +36 -0
  144. package/esm/cramFile/constants.js +51 -0
  145. package/esm/cramFile/constants.js.map +1 -0
  146. package/esm/cramFile/container/compressionScheme.d.ts +23 -0
  147. package/esm/cramFile/container/compressionScheme.js +123 -0
  148. package/esm/cramFile/container/compressionScheme.js.map +1 -0
  149. package/esm/cramFile/container/index.d.ts +13 -0
  150. package/esm/cramFile/container/index.js +84 -0
  151. package/esm/cramFile/container/index.js.map +1 -0
  152. package/esm/cramFile/file.d.ts +63 -0
  153. package/esm/cramFile/file.js +281 -0
  154. package/esm/cramFile/file.js.map +1 -0
  155. package/esm/cramFile/index.d.ts +2 -0
  156. package/esm/cramFile/index.js +3 -0
  157. package/esm/cramFile/index.js.map +1 -0
  158. package/esm/cramFile/record.d.ts +79 -0
  159. package/esm/cramFile/record.js +297 -0
  160. package/esm/cramFile/record.js.map +1 -0
  161. package/esm/cramFile/sectionParsers.d.ts +18 -0
  162. package/esm/cramFile/sectionParsers.js +347 -0
  163. package/esm/cramFile/sectionParsers.js.map +1 -0
  164. package/esm/cramFile/slice/decodeRecord.d.ts +2 -0
  165. package/esm/cramFile/slice/decodeRecord.js +299 -0
  166. package/esm/cramFile/slice/decodeRecord.js.map +1 -0
  167. package/esm/cramFile/slice/index.d.ts +20 -0
  168. package/esm/cramFile/slice/index.js +364 -0
  169. package/esm/cramFile/slice/index.js.map +1 -0
  170. package/esm/cramFile/util.d.ts +5 -0
  171. package/esm/cramFile/util.js +161 -0
  172. package/esm/cramFile/util.js.map +1 -0
  173. package/esm/errors.d.ts +23 -0
  174. package/esm/errors.js +24 -0
  175. package/esm/errors.js.map +1 -0
  176. package/esm/index.d.ts +4 -0
  177. package/esm/index.js +5 -0
  178. package/esm/index.js.map +1 -0
  179. package/esm/indexedCramFile.d.ts +39 -0
  180. package/esm/indexedCramFile.js +155 -0
  181. package/esm/indexedCramFile.js.map +1 -0
  182. package/esm/io/bufferCache.d.ts +12 -0
  183. package/esm/io/bufferCache.js +54 -0
  184. package/esm/io/bufferCache.js.map +1 -0
  185. package/esm/io/index.d.ts +5 -0
  186. package/esm/io/index.js +24 -0
  187. package/esm/io/index.js.map +1 -0
  188. package/esm/io/localFile.d.ts +10 -0
  189. package/esm/io/localFile.js +31 -0
  190. package/esm/io/localFile.js.map +1 -0
  191. package/esm/io/remoteFile.d.ts +16 -0
  192. package/esm/io/remoteFile.js +64 -0
  193. package/esm/io/remoteFile.js.map +1 -0
  194. package/esm/rans/constants.d.ts +3 -0
  195. package/esm/rans/constants.js +5 -0
  196. package/esm/rans/constants.js.map +1 -0
  197. package/esm/rans/d04.d.ts +1 -0
  198. package/esm/rans/d04.js +67 -0
  199. package/esm/rans/d04.js.map +1 -0
  200. package/esm/rans/d14.d.ts +1 -0
  201. package/esm/rans/d14.js +52 -0
  202. package/esm/rans/d14.js.map +1 -0
  203. package/esm/rans/decoding.d.ts +30 -0
  204. package/esm/rans/decoding.js +118 -0
  205. package/esm/rans/decoding.js.map +1 -0
  206. package/esm/rans/frequencies.d.ts +2 -0
  207. package/esm/rans/frequencies.js +110 -0
  208. package/esm/rans/frequencies.js.map +1 -0
  209. package/esm/rans/index.d.ts +1 -0
  210. package/esm/rans/index.js +195 -0
  211. package/esm/rans/index.js.map +1 -0
  212. package/esm/sam.d.ts +1 -0
  213. package/esm/sam.js +16 -0
  214. package/esm/sam.js.map +1 -0
  215. package/esm/unzip-pako.d.ts +2 -0
  216. package/esm/unzip-pako.js +5 -0
  217. package/esm/unzip-pako.js.map +1 -0
  218. package/esm/unzip.d.ts +2 -0
  219. package/esm/unzip.js +3 -0
  220. package/esm/unzip.js.map +1 -0
  221. package/package.json +38 -35
  222. package/src/craiIndex.js +180 -0
  223. package/src/cramFile/codecs/_base.js +49 -0
  224. package/src/cramFile/codecs/beta.js +23 -0
  225. package/src/cramFile/codecs/byteArrayLength.js +55 -0
  226. package/src/cramFile/codecs/byteArrayStop.js +50 -0
  227. package/src/cramFile/codecs/external.js +54 -0
  228. package/src/cramFile/codecs/gamma.js +30 -0
  229. package/src/cramFile/codecs/huffman.js +137 -0
  230. package/src/cramFile/codecs/index.js +38 -0
  231. package/src/cramFile/codecs/subexp.js +32 -0
  232. package/src/cramFile/constants.js +55 -0
  233. package/src/cramFile/container/compressionScheme.js +144 -0
  234. package/src/cramFile/container/index.js +119 -0
  235. package/src/cramFile/file.js +347 -0
  236. package/src/cramFile/index.js +3 -0
  237. package/src/cramFile/record.js +337 -0
  238. package/src/cramFile/sectionParsers.js +379 -0
  239. package/src/cramFile/slice/decodeRecord.js +362 -0
  240. package/src/cramFile/slice/index.js +497 -0
  241. package/src/cramFile/util.js +169 -0
  242. package/src/errors.js +22 -0
  243. package/src/index.js +5 -0
  244. package/src/indexedCramFile.js +191 -0
  245. package/src/io/bufferCache.js +66 -0
  246. package/src/io/index.js +26 -0
  247. package/src/io/localFile.js +35 -0
  248. package/src/io/remoteFile.js +71 -0
  249. package/src/rans/README.md +1 -0
  250. package/src/rans/constants.js +5 -0
  251. package/src/rans/d04.js +83 -0
  252. package/src/rans/d14.js +59 -0
  253. package/src/rans/decoding.js +141 -0
  254. package/src/rans/frequencies.js +121 -0
  255. package/src/rans/index.js +249 -0
  256. package/src/sam.js +15 -0
  257. package/src/unzip-pako.ts +5 -0
  258. 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,2 @@
1
+ export default CramFile;
2
+ import CramFile from "./file";
@@ -0,0 +1,3 @@
1
+ import CramFile from './file';
2
+ export default CramFile;
3
+ //# sourceMappingURL=index.js.map
@@ -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
+ }