@jbrowse/plugin-alignments 2.1.7 → 2.2.1

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 (226) hide show
  1. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +12 -13
  2. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js.map +1 -1
  3. package/dist/AlignmentsTrack/index.d.ts +1 -1
  4. package/dist/AlignmentsTrack/index.js +16 -6
  5. package/dist/AlignmentsTrack/index.js.map +1 -1
  6. package/dist/BamAdapter/BamAdapter.d.ts +7 -3
  7. package/dist/BamAdapter/BamAdapter.js +36 -31
  8. package/dist/BamAdapter/BamAdapter.js.map +1 -1
  9. package/dist/BamAdapter/BamSlightlyLazyFeature.js +1 -0
  10. package/dist/BamAdapter/BamSlightlyLazyFeature.js.map +1 -1
  11. package/dist/BamAdapter/MismatchParser.d.ts +2 -2
  12. package/dist/BamAdapter/MismatchParser.js +4 -7
  13. package/dist/BamAdapter/MismatchParser.js.map +1 -1
  14. package/dist/BamAdapter/configSchema.d.ts +2 -2
  15. package/dist/BamAdapter/configSchema.js +27 -2
  16. package/dist/BamAdapter/configSchema.js.map +1 -1
  17. package/dist/BamAdapter/index.js +7 -5
  18. package/dist/BamAdapter/index.js.map +1 -1
  19. package/dist/CramAdapter/CramAdapter.d.ts +13 -7
  20. package/dist/CramAdapter/CramAdapter.js +56 -61
  21. package/dist/CramAdapter/CramAdapter.js.map +1 -1
  22. package/dist/CramAdapter/CramSlightlyLazyFeature.d.ts +15 -23
  23. package/dist/CramAdapter/CramSlightlyLazyFeature.js +10 -217
  24. package/dist/CramAdapter/CramSlightlyLazyFeature.js.map +1 -1
  25. package/dist/CramAdapter/CramTestAdapters.d.ts +1 -1
  26. package/dist/CramAdapter/CramTestAdapters.js +1 -1
  27. package/dist/CramAdapter/CramTestAdapters.js.map +1 -1
  28. package/dist/CramAdapter/configSchema.d.ts +2 -3
  29. package/dist/CramAdapter/configSchema.js +44 -22
  30. package/dist/CramAdapter/configSchema.js.map +1 -1
  31. package/dist/CramAdapter/index.js +7 -5
  32. package/dist/CramAdapter/index.js.map +1 -1
  33. package/dist/CramAdapter/util.d.ts +18 -0
  34. package/dist/CramAdapter/util.js +241 -0
  35. package/dist/CramAdapter/util.js.map +1 -0
  36. package/dist/HtsgetBamAdapter/HtsgetBamAdapter.d.ts +5 -2
  37. package/dist/HtsgetBamAdapter/HtsgetBamAdapter.js +15 -20
  38. package/dist/HtsgetBamAdapter/HtsgetBamAdapter.js.map +1 -1
  39. package/dist/HtsgetBamAdapter/configSchema.d.ts +2 -2
  40. package/dist/HtsgetBamAdapter/configSchema.js +20 -3
  41. package/dist/HtsgetBamAdapter/configSchema.js.map +1 -1
  42. package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.js +1 -1
  43. package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.js.map +1 -1
  44. package/dist/LinearAlignmentsDisplay/models/configSchema.d.ts +2 -2
  45. package/dist/LinearAlignmentsDisplay/models/configSchema.js +23 -6
  46. package/dist/LinearAlignmentsDisplay/models/configSchema.js.map +1 -1
  47. package/dist/LinearAlignmentsDisplay/models/model.d.ts +77 -10
  48. package/dist/LinearAlignmentsDisplay/models/model.js +102 -9
  49. package/dist/LinearAlignmentsDisplay/models/model.js.map +1 -1
  50. package/dist/LinearPileupDisplay/configSchema.d.ts +4 -4
  51. package/dist/LinearPileupDisplay/configSchema.js +22 -5
  52. package/dist/LinearPileupDisplay/configSchema.js.map +1 -1
  53. package/dist/LinearPileupDisplay/index.d.ts +3 -0
  54. package/dist/LinearPileupDisplay/index.js +3 -0
  55. package/dist/LinearPileupDisplay/index.js.map +1 -1
  56. package/dist/LinearPileupDisplay/model.d.ts +100 -6
  57. package/dist/LinearPileupDisplay/model.js +611 -503
  58. package/dist/LinearPileupDisplay/model.js.map +1 -1
  59. package/dist/LinearSNPCoverageDisplay/components/Tooltip.d.ts +1 -1
  60. package/dist/LinearSNPCoverageDisplay/models/configSchema.js +33 -4
  61. package/dist/LinearSNPCoverageDisplay/models/configSchema.js.map +1 -1
  62. package/dist/LinearSNPCoverageDisplay/models/model.d.ts +87 -4
  63. package/dist/LinearSNPCoverageDisplay/models/model.js +240 -159
  64. package/dist/LinearSNPCoverageDisplay/models/model.js.map +1 -1
  65. package/dist/PileupRPC/rpcMethods.d.ts +1 -1
  66. package/dist/PileupRPC/rpcMethods.js +12 -7
  67. package/dist/PileupRPC/rpcMethods.js.map +1 -1
  68. package/dist/PileupRenderer/PileupLayoutSession.d.ts +1 -1
  69. package/dist/PileupRenderer/PileupRenderer.d.ts +1 -1
  70. package/dist/PileupRenderer/PileupRenderer.js +37 -34
  71. package/dist/PileupRenderer/PileupRenderer.js.map +1 -1
  72. package/dist/PileupRenderer/configSchema.d.ts +2 -2
  73. package/dist/PileupRenderer/configSchema.js +37 -2
  74. package/dist/PileupRenderer/configSchema.js.map +1 -1
  75. package/dist/PileupRenderer/index.js +8 -6
  76. package/dist/PileupRenderer/index.js.map +1 -1
  77. package/dist/SNPCoverageAdapter/configSchema.d.ts +2 -3
  78. package/dist/SNPCoverageAdapter/configSchema.js +15 -4
  79. package/dist/SNPCoverageAdapter/configSchema.js.map +1 -1
  80. package/dist/SNPCoverageAdapter/index.d.ts +1 -2
  81. package/dist/SNPCoverageAdapter/index.js +17 -14
  82. package/dist/SNPCoverageAdapter/index.js.map +1 -1
  83. package/dist/SNPCoverageRenderer/configSchema.d.ts +2 -2
  84. package/dist/SNPCoverageRenderer/configSchema.js +21 -1
  85. package/dist/SNPCoverageRenderer/configSchema.js.map +1 -1
  86. package/dist/SNPCoverageRenderer/index.d.ts +0 -1
  87. package/dist/SNPCoverageRenderer/index.js +1 -4
  88. package/dist/SNPCoverageRenderer/index.js.map +1 -1
  89. package/dist/index.d.ts +3 -2
  90. package/dist/index.js +4 -2
  91. package/dist/index.js.map +1 -1
  92. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +12 -13
  93. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js.map +1 -1
  94. package/esm/AlignmentsTrack/index.d.ts +1 -1
  95. package/esm/AlignmentsTrack/index.js +16 -6
  96. package/esm/AlignmentsTrack/index.js.map +1 -1
  97. package/esm/BamAdapter/BamAdapter.d.ts +7 -3
  98. package/esm/BamAdapter/BamAdapter.js +36 -31
  99. package/esm/BamAdapter/BamAdapter.js.map +1 -1
  100. package/esm/BamAdapter/BamSlightlyLazyFeature.js +1 -0
  101. package/esm/BamAdapter/BamSlightlyLazyFeature.js.map +1 -1
  102. package/esm/BamAdapter/MismatchParser.d.ts +2 -2
  103. package/esm/BamAdapter/MismatchParser.js +4 -7
  104. package/esm/BamAdapter/MismatchParser.js.map +1 -1
  105. package/esm/BamAdapter/configSchema.d.ts +2 -2
  106. package/esm/BamAdapter/configSchema.js +27 -2
  107. package/esm/BamAdapter/configSchema.js.map +1 -1
  108. package/esm/BamAdapter/index.js +7 -5
  109. package/esm/BamAdapter/index.js.map +1 -1
  110. package/esm/CramAdapter/CramAdapter.d.ts +13 -7
  111. package/esm/CramAdapter/CramAdapter.js +56 -61
  112. package/esm/CramAdapter/CramAdapter.js.map +1 -1
  113. package/esm/CramAdapter/CramSlightlyLazyFeature.d.ts +15 -23
  114. package/esm/CramAdapter/CramSlightlyLazyFeature.js +10 -217
  115. package/esm/CramAdapter/CramSlightlyLazyFeature.js.map +1 -1
  116. package/esm/CramAdapter/CramTestAdapters.d.ts +1 -1
  117. package/esm/CramAdapter/CramTestAdapters.js +1 -1
  118. package/esm/CramAdapter/CramTestAdapters.js.map +1 -1
  119. package/esm/CramAdapter/configSchema.d.ts +2 -3
  120. package/esm/CramAdapter/configSchema.js +44 -22
  121. package/esm/CramAdapter/configSchema.js.map +1 -1
  122. package/esm/CramAdapter/index.js +8 -6
  123. package/esm/CramAdapter/index.js.map +1 -1
  124. package/esm/CramAdapter/util.d.ts +18 -0
  125. package/esm/CramAdapter/util.js +236 -0
  126. package/esm/CramAdapter/util.js.map +1 -0
  127. package/esm/HtsgetBamAdapter/HtsgetBamAdapter.d.ts +5 -2
  128. package/esm/HtsgetBamAdapter/HtsgetBamAdapter.js +15 -20
  129. package/esm/HtsgetBamAdapter/HtsgetBamAdapter.js.map +1 -1
  130. package/esm/HtsgetBamAdapter/configSchema.d.ts +2 -2
  131. package/esm/HtsgetBamAdapter/configSchema.js +20 -3
  132. package/esm/HtsgetBamAdapter/configSchema.js.map +1 -1
  133. package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.js +1 -1
  134. package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.js.map +1 -1
  135. package/esm/LinearAlignmentsDisplay/models/configSchema.d.ts +2 -2
  136. package/esm/LinearAlignmentsDisplay/models/configSchema.js +23 -6
  137. package/esm/LinearAlignmentsDisplay/models/configSchema.js.map +1 -1
  138. package/esm/LinearAlignmentsDisplay/models/model.d.ts +77 -10
  139. package/esm/LinearAlignmentsDisplay/models/model.js +102 -9
  140. package/esm/LinearAlignmentsDisplay/models/model.js.map +1 -1
  141. package/esm/LinearPileupDisplay/configSchema.d.ts +4 -4
  142. package/esm/LinearPileupDisplay/configSchema.js +22 -5
  143. package/esm/LinearPileupDisplay/configSchema.js.map +1 -1
  144. package/esm/LinearPileupDisplay/index.d.ts +3 -0
  145. package/esm/LinearPileupDisplay/index.js +1 -0
  146. package/esm/LinearPileupDisplay/index.js.map +1 -1
  147. package/esm/LinearPileupDisplay/model.d.ts +100 -6
  148. package/esm/LinearPileupDisplay/model.js +611 -503
  149. package/esm/LinearPileupDisplay/model.js.map +1 -1
  150. package/esm/LinearSNPCoverageDisplay/components/Tooltip.d.ts +1 -1
  151. package/esm/LinearSNPCoverageDisplay/models/configSchema.js +33 -4
  152. package/esm/LinearSNPCoverageDisplay/models/configSchema.js.map +1 -1
  153. package/esm/LinearSNPCoverageDisplay/models/model.d.ts +87 -4
  154. package/esm/LinearSNPCoverageDisplay/models/model.js +240 -159
  155. package/esm/LinearSNPCoverageDisplay/models/model.js.map +1 -1
  156. package/esm/PileupRPC/rpcMethods.d.ts +1 -1
  157. package/esm/PileupRPC/rpcMethods.js +12 -7
  158. package/esm/PileupRPC/rpcMethods.js.map +1 -1
  159. package/esm/PileupRenderer/PileupLayoutSession.d.ts +1 -1
  160. package/esm/PileupRenderer/PileupRenderer.d.ts +1 -1
  161. package/esm/PileupRenderer/PileupRenderer.js +37 -34
  162. package/esm/PileupRenderer/PileupRenderer.js.map +1 -1
  163. package/esm/PileupRenderer/configSchema.d.ts +2 -2
  164. package/esm/PileupRenderer/configSchema.js +37 -2
  165. package/esm/PileupRenderer/configSchema.js.map +1 -1
  166. package/esm/PileupRenderer/index.js +8 -6
  167. package/esm/PileupRenderer/index.js.map +1 -1
  168. package/esm/SNPCoverageAdapter/configSchema.d.ts +2 -3
  169. package/esm/SNPCoverageAdapter/configSchema.js +15 -4
  170. package/esm/SNPCoverageAdapter/configSchema.js.map +1 -1
  171. package/esm/SNPCoverageAdapter/index.d.ts +1 -2
  172. package/esm/SNPCoverageAdapter/index.js +17 -15
  173. package/esm/SNPCoverageAdapter/index.js.map +1 -1
  174. package/esm/SNPCoverageRenderer/configSchema.d.ts +2 -2
  175. package/esm/SNPCoverageRenderer/configSchema.js +21 -1
  176. package/esm/SNPCoverageRenderer/configSchema.js.map +1 -1
  177. package/esm/SNPCoverageRenderer/index.d.ts +0 -1
  178. package/esm/SNPCoverageRenderer/index.js +1 -3
  179. package/esm/SNPCoverageRenderer/index.js.map +1 -1
  180. package/esm/index.d.ts +3 -2
  181. package/esm/index.js +2 -2
  182. package/esm/index.js.map +1 -1
  183. package/package.json +4 -3
  184. package/src/AlignmentsFeatureDetail/AlignmentsFeatureDetail.tsx +17 -16
  185. package/src/AlignmentsFeatureDetail/__snapshots__/index.test.js.snap +41 -513
  186. package/src/AlignmentsFeatureDetail/index.test.js +6 -4
  187. package/src/AlignmentsTrack/index.ts +18 -12
  188. package/src/BamAdapter/BamAdapter.ts +42 -41
  189. package/src/BamAdapter/BamSlightlyLazyFeature.ts +2 -1
  190. package/src/BamAdapter/MismatchParser.test.ts +21 -12
  191. package/src/BamAdapter/MismatchParser.ts +7 -10
  192. package/src/BamAdapter/__snapshots__/BamAdapter.test.ts.snap +135 -135
  193. package/src/BamAdapter/configSchema.ts +57 -29
  194. package/src/BamAdapter/index.ts +7 -8
  195. package/src/CombinationTest.test.ts +107 -0
  196. package/src/CramAdapter/CramAdapter.test.ts +1 -2
  197. package/src/CramAdapter/CramAdapter.ts +83 -84
  198. package/src/CramAdapter/CramSlightlyLazyFeature.ts +18 -218
  199. package/src/CramAdapter/CramTestAdapters.ts +1 -1
  200. package/src/CramAdapter/__snapshots__/CramAdapter.test.ts.snap +31 -31
  201. package/src/CramAdapter/__snapshots__/util.test.ts.snap +14 -0
  202. package/src/CramAdapter/configSchema.ts +54 -30
  203. package/src/CramAdapter/index.ts +8 -9
  204. package/src/CramAdapter/util.test.ts +26 -0
  205. package/src/CramAdapter/util.ts +251 -0
  206. package/src/HtsgetBamAdapter/HtsgetBamAdapter.ts +14 -21
  207. package/src/HtsgetBamAdapter/configSchema.ts +36 -19
  208. package/src/LinearAlignmentsDisplay/components/AlignmentsDisplay.tsx +3 -1
  209. package/src/LinearAlignmentsDisplay/models/configSchema.ts +23 -10
  210. package/src/LinearAlignmentsDisplay/models/model.tsx +107 -11
  211. package/src/LinearPileupDisplay/configSchema.ts +25 -9
  212. package/src/LinearPileupDisplay/index.ts +5 -0
  213. package/src/LinearPileupDisplay/model.ts +151 -34
  214. package/src/LinearSNPCoverageDisplay/models/configSchema.ts +36 -9
  215. package/src/LinearSNPCoverageDisplay/models/model.ts +83 -4
  216. package/src/PileupRPC/rpcMethods.ts +15 -20
  217. package/src/PileupRenderer/{PileupRenderer.tsx → PileupRenderer.ts} +53 -63
  218. package/src/PileupRenderer/configSchema.ts +39 -2
  219. package/src/PileupRenderer/index.ts +8 -9
  220. package/src/SNPCoverageAdapter/configSchema.ts +21 -12
  221. package/src/SNPCoverageAdapter/index.ts +17 -18
  222. package/src/SNPCoverageRenderer/configSchema.ts +23 -1
  223. package/src/SNPCoverageRenderer/index.ts +1 -8
  224. package/src/__snapshots__/index.test.ts.snap +1 -1
  225. package/src/index.ts +11 -4
  226. package/src/declare.d.ts +0 -1
@@ -1,37 +1,65 @@
1
1
  import { ConfigurationSchema } from '@jbrowse/core/configuration'
2
2
  import { types } from 'mobx-state-tree'
3
3
 
4
- export default types.late(() =>
5
- ConfigurationSchema(
6
- 'BamAdapter',
7
- {
8
- bamLocation: {
9
- type: 'fileLocation',
10
- defaultValue: { uri: '/path/to/my.bam', locationType: 'UriLocation' },
4
+ /**
5
+ * #config BamAdapter
6
+ * used to configure BAM adapter
7
+ */
8
+ function x() {} // eslint-disable-line @typescript-eslint/no-unused-vars
9
+
10
+ const configSchema = ConfigurationSchema(
11
+ 'BamAdapter',
12
+ {
13
+ /**
14
+ * #slot
15
+ */
16
+ bamLocation: {
17
+ type: 'fileLocation',
18
+ defaultValue: { uri: '/path/to/my.bam', locationType: 'UriLocation' },
19
+ },
20
+
21
+ index: ConfigurationSchema('BamIndex', {
22
+ /**
23
+ * #slot index.indexType
24
+ */
25
+ indexType: {
26
+ model: types.enumeration('IndexType', ['BAI', 'CSI']),
27
+ type: 'stringEnum',
28
+ defaultValue: 'BAI',
11
29
  },
12
- index: ConfigurationSchema('BamIndex', {
13
- indexType: {
14
- model: types.enumeration('IndexType', ['BAI', 'CSI']),
15
- type: 'stringEnum',
16
- defaultValue: 'BAI',
17
- },
18
- location: {
19
- type: 'fileLocation',
20
- defaultValue: {
21
- uri: '/path/to/my.bam.bai',
22
- locationType: 'UriLocation',
23
- },
30
+ /**
31
+ * #slot index.location
32
+ */
33
+ location: {
34
+ type: 'fileLocation',
35
+ defaultValue: {
36
+ uri: '/path/to/my.bam.bai',
37
+ locationType: 'UriLocation',
24
38
  },
25
- }),
26
- fetchSizeLimit: {
27
- type: 'number',
28
- defaultValue: 5_000_000,
29
- },
30
- sequenceAdapter: {
31
- type: 'frozen',
32
- defaultValue: null,
33
39
  },
40
+ }),
41
+ /**
42
+ * #slot
43
+ */
44
+ fetchSizeLimit: {
45
+ type: 'number',
46
+ description:
47
+ 'size to fetch in bytes over which to display a warning to the user that too much data will be fetched',
48
+ defaultValue: 5_000_000,
34
49
  },
35
- { explicitlyTyped: true },
36
- ),
50
+ /**
51
+ * #slot
52
+ * generally refers to the reference genome assembly's sequence adapter
53
+ * currently needs to be manually added
54
+ */
55
+ sequenceAdapter: {
56
+ type: 'frozen',
57
+ description:
58
+ 'sequence data adapter, used to calculate SNPs when BAM reads lacking MD tags',
59
+ defaultValue: null,
60
+ },
61
+ },
62
+ { explicitlyTyped: true },
37
63
  )
64
+
65
+ export default configSchema
@@ -3,12 +3,11 @@ import AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'
3
3
  import configSchema from './configSchema'
4
4
 
5
5
  export default (pluginManager: PluginManager) => {
6
- pluginManager.addAdapterType(
7
- () =>
8
- new AdapterType({
9
- name: 'BamAdapter',
10
- configSchema,
11
- getAdapterClass: () => import('./BamAdapter').then(r => r.default),
12
- }),
13
- )
6
+ pluginManager.addAdapterType(() => {
7
+ return new AdapterType({
8
+ name: 'BamAdapter',
9
+ configSchema,
10
+ getAdapterClass: () => import('./BamAdapter').then(r => r.default),
11
+ })
12
+ })
14
13
  }
@@ -0,0 +1,107 @@
1
+ import PluginManager from '@jbrowse/core/PluginManager'
2
+ import { toArray } from 'rxjs/operators'
3
+ import { LocalFile } from 'generic-filehandle'
4
+ import { getSubAdapterType } from '@jbrowse/core/data_adapters/dataAdapterCache'
5
+
6
+ import CramAdapter from './CramAdapter/CramAdapter'
7
+ import BamAdapter from './BamAdapter/BamAdapter'
8
+ import { SequenceAdapter } from './CramAdapter/CramTestAdapters'
9
+
10
+ import cramConfigSchema from './CramAdapter/configSchema'
11
+ import bamConfigSchema from './BamAdapter/configSchema'
12
+
13
+ const pluginManager = new PluginManager()
14
+
15
+ const getVolvoxSequenceSubAdapter: getSubAdapterType = async () => {
16
+ return {
17
+ dataAdapter: new SequenceAdapter(
18
+ new LocalFile(require.resolve('../test_data/volvox.fa')),
19
+ ),
20
+ sessionIds: new Set(),
21
+ }
22
+ }
23
+
24
+ async function getFeats(f1: string, f2: string) {
25
+ const cramAdapter = new CramAdapter(
26
+ cramConfigSchema.create({
27
+ cramLocation: {
28
+ localPath: require.resolve(f1),
29
+ },
30
+ craiLocation: {
31
+ localPath: require.resolve(f1 + '.crai'),
32
+ },
33
+ }),
34
+ getVolvoxSequenceSubAdapter,
35
+ pluginManager,
36
+ )
37
+
38
+ const bamAdapter = new BamAdapter(
39
+ bamConfigSchema.create({
40
+ bamLocation: {
41
+ localPath: require.resolve(f2),
42
+ },
43
+ index: {
44
+ location: {
45
+ localPath: require.resolve(f2 + '.bai'),
46
+ },
47
+ },
48
+ }),
49
+ )
50
+ const query = {
51
+ assemblyName: 'volvox',
52
+ refName: 'ctgA',
53
+ start: 1,
54
+ end: 10200,
55
+ }
56
+ const bamFeatures = bamAdapter.getFeatures(query)
57
+ const cramFeatures = cramAdapter.getFeatures(query)
58
+ const bamFeaturesArray = await bamFeatures.pipe(toArray()).toPromise()
59
+ const cramFeaturesArray = await cramFeatures.pipe(toArray()).toPromise()
60
+ return { bamFeaturesArray, cramFeaturesArray }
61
+ }
62
+
63
+ type M = { start: number }
64
+
65
+ async function cigarCheck(f: string) {
66
+ const { cramFeaturesArray, bamFeaturesArray } = await getFeats(
67
+ `../test_data/${f}.cram`,
68
+ `../test_data/${f}.bam`,
69
+ )
70
+ const cramMap = Object.fromEntries(
71
+ cramFeaturesArray.map(f => [f.get('name'), f.get('CIGAR')]),
72
+ )
73
+ const bamMap = Object.fromEntries(
74
+ bamFeaturesArray.map(f => [f.get('name'), f.get('CIGAR')]),
75
+ )
76
+ expect(bamMap).toEqual(cramMap)
77
+ }
78
+
79
+ async function mismatchesCheck(f: string) {
80
+ const { cramFeaturesArray, bamFeaturesArray } = await getFeats(
81
+ `../test_data/${f}.cram`,
82
+ `../test_data/${f}.bam`,
83
+ )
84
+ const cramMap = Object.fromEntries(
85
+ cramFeaturesArray.map(f => [
86
+ f.get('name'),
87
+ f.get('mismatches').sort((a: M, b: M) => b.start - a.start),
88
+ ]),
89
+ )
90
+ const bamMap = Object.fromEntries(
91
+ bamFeaturesArray.map(f => [
92
+ f.get('name'),
93
+ f.get('mismatches').sort((a: M, b: M) => b.start - a.start),
94
+ ]),
95
+ )
96
+ expect(bamMap).toEqual(cramMap)
97
+ }
98
+
99
+ test('match CIGAR across file types', async () => {
100
+ await cigarCheck('volvox-sorted')
101
+ await cigarCheck('volvox-long-reads.fastq.sorted')
102
+ })
103
+
104
+ test('mismatches same across file types', async () => {
105
+ await mismatchesCheck('volvox-sorted')
106
+ await mismatchesCheck('volvox-long-reads.fastq.sorted')
107
+ })
@@ -4,10 +4,9 @@ import PluginManager from '@jbrowse/core/PluginManager'
4
4
  import { getSubAdapterType } from '@jbrowse/core/data_adapters/dataAdapterCache'
5
5
  import Adapter from './CramAdapter'
6
6
  import { SequenceAdapter } from './CramTestAdapters'
7
- import configSchemaF from './configSchema'
7
+ import configSchema from './configSchema'
8
8
 
9
9
  const pluginManager = new PluginManager()
10
- const configSchema = pluginManager.load(configSchemaF)
11
10
 
12
11
  const getVolvoxSequenceSubAdapter: getSubAdapterType = async () => {
13
12
  return {
@@ -1,7 +1,8 @@
1
- import { CraiIndex, IndexedCramFile } from '@gmod/cram'
1
+ import { CraiIndex, IndexedCramFile, CramRecord } from '@gmod/cram'
2
2
  import {
3
3
  BaseFeatureDataAdapter,
4
4
  BaseOptions,
5
+ BaseSequenceAdapter,
5
6
  } from '@jbrowse/core/data_adapters/BaseAdapter'
6
7
  import { checkAbortSignal, Region, Feature } from '@jbrowse/core/util'
7
8
  import { openLocation } from '@jbrowse/core/util/io'
@@ -9,15 +10,10 @@ import { ObservableCreate } from '@jbrowse/core/util/rxjs'
9
10
  import { toArray } from 'rxjs/operators'
10
11
  import CramSlightlyLazyFeature from './CramSlightlyLazyFeature'
11
12
 
12
- interface HeaderLine {
13
- tag: string
14
- value: any // eslint-disable-line @typescript-eslint/no-explicit-any
15
- data: HeaderLine[]
16
- }
17
13
  interface Header {
18
14
  idToName?: string[]
19
15
  nameToId?: Record<string, number>
20
- readGroups?: number[]
16
+ readGroups?: (string | undefined)[]
21
17
  }
22
18
 
23
19
  interface FilterBy {
@@ -32,8 +28,13 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
32
28
 
33
29
  private setupP?: Promise<{
34
30
  samHeader: Header
35
- cram: any // eslint-disable-line @typescript-eslint/no-explicit-any
36
- sequenceAdapter: any // eslint-disable-line @typescript-eslint/no-explicit-any
31
+ cram: IndexedCramFile
32
+ sequenceAdapter: BaseSequenceAdapter
33
+ }>
34
+
35
+ private configureP?: Promise<{
36
+ cram: IndexedCramFile
37
+ sequenceAdapter: BaseSequenceAdapter
37
38
  }>
38
39
 
39
40
  // maps a refname to an id
@@ -42,7 +43,7 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
42
43
  // maps a seqId to original refname, passed specially to render args, to a seqid
43
44
  private seqIdToOriginalRefName: string[] = []
44
45
 
45
- public async configure() {
46
+ public async configurePre() {
46
47
  const cramLocation = this.getConf('cramLocation')
47
48
  const craiLocation = this.getConf('craiLocation')
48
49
  if (!cramLocation) {
@@ -51,48 +52,55 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
51
52
  if (!craiLocation) {
52
53
  throw new Error('missing craiLocation argument')
53
54
  }
55
+ const pm = this.pluginManager
54
56
 
55
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
56
- const cram: any = new IndexedCramFile({
57
- cramFilehandle: openLocation(cramLocation, this.pluginManager),
58
- index: new CraiIndex({
59
- filehandle: openLocation(craiLocation, this.pluginManager),
60
- }),
61
- seqFetch: this.seqFetch.bind(this),
57
+ const cram = new IndexedCramFile({
58
+ cramFilehandle: openLocation(cramLocation, pm),
59
+ index: new CraiIndex({ filehandle: openLocation(craiLocation, pm) }),
60
+ seqFetch: (...args) => this.seqFetch(...args),
62
61
  checkSequenceMD5: false,
63
62
  fetchSizeLimit: 200_000_000, // just make this a large size to avoid hitting it
64
63
  })
65
- // instantiate the sequence adapter
66
- const sequenceAdapterType = this.getConf(['sequenceAdapter', 'type'])
67
64
 
68
65
  if (!this.getSubAdapter) {
69
66
  throw new Error('Error getting subadapter')
70
67
  }
71
68
 
72
69
  const seqConf = this.getConf('sequenceAdapter')
73
- const { dataAdapter: sequenceAdapter } = await this.getSubAdapter(seqConf)
70
+ const subadapter = await this.getSubAdapter(seqConf)
74
71
 
75
- if (!(sequenceAdapter instanceof BaseFeatureDataAdapter)) {
76
- throw new Error(
77
- `CRAM feature adapters cannot use sequence adapters of type '${sequenceAdapterType}'`,
78
- )
72
+ return {
73
+ cram,
74
+ sequenceAdapter: subadapter.dataAdapter as BaseSequenceAdapter,
79
75
  }
76
+ }
80
77
 
81
- return { cram, sequenceAdapter }
78
+ public async configure() {
79
+ if (!this.configureP) {
80
+ this.configureP = this.configurePre().catch(e => {
81
+ this.configureP = undefined
82
+ throw e
83
+ })
84
+ }
85
+ return this.configureP
82
86
  }
83
87
 
84
88
  async getHeader(opts?: BaseOptions) {
85
89
  const { cram } = await this.configure()
86
- return cram.cram.getHeaderText(opts)
90
+ return cram.cram.getHeaderText()
87
91
  }
88
92
 
89
- private async seqFetch(seqId: number, start: number, end: number) {
93
+ private async seqFetch(
94
+ seqId: number,
95
+ start: number,
96
+ end: number,
97
+ ): Promise<string> {
90
98
  start -= 1 // convert from 1-based closed to interbase
91
99
 
92
100
  const { sequenceAdapter } = await this.configure()
93
101
  const refName = this.refIdToOriginalName(seqId) || this.refIdToName(seqId)
94
102
  if (!refName) {
95
- return undefined
103
+ throw new Error('unknown')
96
104
  }
97
105
 
98
106
  const seqChunks = await sequenceAdapter
@@ -132,10 +140,10 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
132
140
 
133
141
  private async setupPre(opts?: BaseOptions) {
134
142
  const { statusCallback = () => {} } = opts || {}
135
- const configured = await this.configure()
143
+ const conf = await this.configure()
136
144
  statusCallback('Downloading index')
137
- const { cram } = configured
138
- const samHeader: HeaderLine[] = await cram.cram.getSamHeader(opts?.signal)
145
+ const { cram } = conf
146
+ const samHeader = await cram.cram.getSamHeader()
139
147
 
140
148
  // use the @SQ lines in the header to figure out the
141
149
  // mapping between ref ID numbers and names
@@ -161,7 +169,7 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
161
169
  const data = { idToName, nameToId, readGroups }
162
170
  statusCallback('')
163
171
  this.samHeader = data
164
- return { samHeader: data, ...configured }
172
+ return { samHeader: data, ...conf }
165
173
  }
166
174
 
167
175
  private async setup(opts?: BaseOptions) {
@@ -197,13 +205,7 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
197
205
  // use info from the SAM header if possible, but fall back to using
198
206
  // the ref seq order from when the browser's refseqs were loaded
199
207
  refIdToName(refId: number) {
200
- if (this.samHeader.idToName) {
201
- return this.samHeader.idToName[refId]
202
- }
203
- if (this.seqIdToRefName) {
204
- return this.seqIdToRefName[refId]
205
- }
206
- return undefined
208
+ return this.samHeader.idToName?.[refId] || this.seqIdToRefName?.[refId]
207
209
  }
208
210
 
209
211
  refIdToOriginalName(refId: number) {
@@ -220,53 +222,48 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
220
222
  const { refName, start, end, originalRefName } = region
221
223
 
222
224
  return ObservableCreate<Feature>(async observer => {
223
- const { cram, sequenceAdapter } = await this.setup(opts)
224
- statusCallback('Downloading alignments')
225
- if (!this.seqIdToRefName) {
226
- this.seqIdToRefName = await sequenceAdapter.getRefNames(opts)
227
- }
225
+ const { cram } = await this.setup(opts)
226
+
228
227
  const refId = this.refNameToId(refName)
229
- if (refId !== undefined) {
230
- if (originalRefName) {
231
- this.seqIdToOriginalRefName[refId] = originalRefName
232
- }
233
- const records = await cram.getRecordsForRange(refId, start, end, opts)
234
- checkAbortSignal(signal)
235
- const {
236
- flagInclude = 0,
237
- flagExclude = 0,
238
- tagFilter,
239
- readName,
240
- } = filterBy || {}
241
-
242
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
243
- let filtered = records.filter((record: any) => {
244
- const flags = record.flags
245
- return (flags & flagInclude) === flagInclude && !(flags & flagExclude)
246
- })
228
+ if (refId === undefined) {
229
+ console.warn('Unknown refName', refName)
230
+ observer.complete()
231
+ return
232
+ }
233
+
234
+ if (originalRefName) {
235
+ this.seqIdToOriginalRefName[refId] = originalRefName
236
+ }
237
+ statusCallback('Downloading alignments')
238
+ const records = await cram.getRecordsForRange(refId, start, end)
239
+ checkAbortSignal(signal)
240
+ const {
241
+ flagInclude = 0,
242
+ flagExclude = 0,
243
+ tagFilter,
244
+ readName,
245
+ } = filterBy || {}
246
+
247
+ let filtered = records.filter(record => {
248
+ const flags = record.flags
249
+ return (flags & flagInclude) === flagInclude && !(flags & flagExclude)
250
+ })
247
251
 
248
- if (tagFilter) {
249
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
250
- filtered = filtered.filter((record: any) => {
251
- const val = record[tagFilter.tag]
252
- return val === '*' ? val !== undefined : val === tagFilter.value
253
- })
254
- }
255
-
256
- if (readName) {
257
- filtered = filtered.filter(
258
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
259
- (record: any) => record.readName === readName,
260
- )
261
- }
262
-
263
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
264
- filtered.forEach((record: any) => {
265
- observer.next(this.cramRecordToFeature(record))
252
+ if (tagFilter) {
253
+ filtered = filtered.filter(record => {
254
+ // @ts-ignore
255
+ const val = record[tagFilter.tag]
256
+ return val === '*' ? val !== undefined : val === tagFilter.value
266
257
  })
267
- } else {
268
- console.warn('Unknown refName', refName)
269
258
  }
259
+
260
+ if (readName) {
261
+ filtered = filtered.filter(record => record.readName === readName)
262
+ }
263
+
264
+ filtered.forEach(record => {
265
+ observer.next(this.cramRecordToFeature(record))
266
+ })
270
267
  statusCallback('')
271
268
  observer.complete()
272
269
  }, signal)
@@ -274,7 +271,7 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
274
271
 
275
272
  freeResources(/* { region } */): void {}
276
273
 
277
- cramRecordToFeature(record: unknown) {
274
+ cramRecordToFeature(record: CramRecord) {
278
275
  return new CramSlightlyLazyFeature(record, this)
279
276
  }
280
277
 
@@ -299,7 +296,9 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
299
296
  regions.map(region => {
300
297
  const { refName, start, end } = region
301
298
  const chrId = this.refNameToId(refName)
302
- return cram.index.getEntriesForRange(chrId, start, end)
299
+ return chrId !== undefined
300
+ ? cram.index.getEntriesForRange(chrId, start, end)
301
+ : [{ sliceBytes: 0 }]
303
302
  }),
304
303
  )
305
304