@jbrowse/plugin-alignments 2.2.0 → 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 (154) hide show
  1. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +12 -13
  2. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js.map +1 -1
  3. package/dist/BamAdapter/BamAdapter.d.ts +1 -1
  4. package/dist/BamAdapter/BamAdapter.js +1 -0
  5. package/dist/BamAdapter/BamAdapter.js.map +1 -1
  6. package/dist/BamAdapter/BamSlightlyLazyFeature.js +1 -0
  7. package/dist/BamAdapter/BamSlightlyLazyFeature.js.map +1 -1
  8. package/dist/BamAdapter/MismatchParser.d.ts +2 -2
  9. package/dist/BamAdapter/MismatchParser.js +4 -7
  10. package/dist/BamAdapter/MismatchParser.js.map +1 -1
  11. package/dist/BamAdapter/configSchema.js +1 -1
  12. package/dist/BamAdapter/configSchema.js.map +1 -1
  13. package/dist/BamAdapter/index.js +7 -5
  14. package/dist/BamAdapter/index.js.map +1 -1
  15. package/dist/CramAdapter/CramSlightlyLazyFeature.d.ts +1 -10
  16. package/dist/CramAdapter/CramSlightlyLazyFeature.js +5 -218
  17. package/dist/CramAdapter/CramSlightlyLazyFeature.js.map +1 -1
  18. package/dist/CramAdapter/CramTestAdapters.d.ts +1 -1
  19. package/dist/CramAdapter/CramTestAdapters.js +1 -1
  20. package/dist/CramAdapter/CramTestAdapters.js.map +1 -1
  21. package/dist/CramAdapter/configSchema.js +2 -2
  22. package/dist/CramAdapter/configSchema.js.map +1 -1
  23. package/dist/CramAdapter/index.js +7 -5
  24. package/dist/CramAdapter/index.js.map +1 -1
  25. package/dist/CramAdapter/util.d.ts +18 -0
  26. package/dist/CramAdapter/util.js +241 -0
  27. package/dist/CramAdapter/util.js.map +1 -0
  28. package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.js +1 -1
  29. package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.js.map +1 -1
  30. package/dist/LinearAlignmentsDisplay/models/configSchema.d.ts +1 -1
  31. package/dist/LinearAlignmentsDisplay/models/model.d.ts +5 -5
  32. package/dist/LinearAlignmentsDisplay/models/model.js +7 -7
  33. package/dist/LinearAlignmentsDisplay/models/model.js.map +1 -1
  34. package/dist/LinearPileupDisplay/configSchema.d.ts +4 -4
  35. package/dist/LinearPileupDisplay/configSchema.js +2 -2
  36. package/dist/LinearPileupDisplay/configSchema.js.map +1 -1
  37. package/dist/LinearPileupDisplay/index.d.ts +3 -0
  38. package/dist/LinearPileupDisplay/index.js +3 -0
  39. package/dist/LinearPileupDisplay/index.js.map +1 -1
  40. package/dist/LinearPileupDisplay/model.d.ts +19 -9
  41. package/dist/LinearPileupDisplay/model.js +25 -30
  42. package/dist/LinearPileupDisplay/model.js.map +1 -1
  43. package/dist/LinearSNPCoverageDisplay/components/Tooltip.d.ts +1 -1
  44. package/dist/LinearSNPCoverageDisplay/models/model.d.ts +1 -1
  45. package/dist/PileupRPC/rpcMethods.d.ts +1 -1
  46. package/dist/PileupRPC/rpcMethods.js +12 -7
  47. package/dist/PileupRPC/rpcMethods.js.map +1 -1
  48. package/dist/PileupRenderer/PileupLayoutSession.d.ts +1 -1
  49. package/dist/PileupRenderer/PileupRenderer.js +32 -28
  50. package/dist/PileupRenderer/PileupRenderer.js.map +1 -1
  51. package/dist/PileupRenderer/index.js +8 -6
  52. package/dist/PileupRenderer/index.js.map +1 -1
  53. package/dist/SNPCoverageAdapter/configSchema.d.ts +2 -3
  54. package/dist/SNPCoverageAdapter/configSchema.js +6 -3
  55. package/dist/SNPCoverageAdapter/configSchema.js.map +1 -1
  56. package/dist/SNPCoverageAdapter/index.d.ts +1 -2
  57. package/dist/SNPCoverageAdapter/index.js +17 -14
  58. package/dist/SNPCoverageAdapter/index.js.map +1 -1
  59. package/dist/index.d.ts +3 -2
  60. package/dist/index.js +4 -2
  61. package/dist/index.js.map +1 -1
  62. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +12 -13
  63. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js.map +1 -1
  64. package/esm/BamAdapter/BamAdapter.d.ts +1 -1
  65. package/esm/BamAdapter/BamAdapter.js +1 -0
  66. package/esm/BamAdapter/BamAdapter.js.map +1 -1
  67. package/esm/BamAdapter/BamSlightlyLazyFeature.js +1 -0
  68. package/esm/BamAdapter/BamSlightlyLazyFeature.js.map +1 -1
  69. package/esm/BamAdapter/MismatchParser.d.ts +2 -2
  70. package/esm/BamAdapter/MismatchParser.js +4 -7
  71. package/esm/BamAdapter/MismatchParser.js.map +1 -1
  72. package/esm/BamAdapter/configSchema.js +1 -1
  73. package/esm/BamAdapter/configSchema.js.map +1 -1
  74. package/esm/BamAdapter/index.js +7 -5
  75. package/esm/BamAdapter/index.js.map +1 -1
  76. package/esm/CramAdapter/CramSlightlyLazyFeature.d.ts +1 -10
  77. package/esm/CramAdapter/CramSlightlyLazyFeature.js +5 -218
  78. package/esm/CramAdapter/CramSlightlyLazyFeature.js.map +1 -1
  79. package/esm/CramAdapter/CramTestAdapters.d.ts +1 -1
  80. package/esm/CramAdapter/CramTestAdapters.js +1 -1
  81. package/esm/CramAdapter/CramTestAdapters.js.map +1 -1
  82. package/esm/CramAdapter/configSchema.js +2 -2
  83. package/esm/CramAdapter/configSchema.js.map +1 -1
  84. package/esm/CramAdapter/index.js +7 -5
  85. package/esm/CramAdapter/index.js.map +1 -1
  86. package/esm/CramAdapter/util.d.ts +18 -0
  87. package/esm/CramAdapter/util.js +236 -0
  88. package/esm/CramAdapter/util.js.map +1 -0
  89. package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.js +1 -1
  90. package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.js.map +1 -1
  91. package/esm/LinearAlignmentsDisplay/models/configSchema.d.ts +1 -1
  92. package/esm/LinearAlignmentsDisplay/models/model.d.ts +5 -5
  93. package/esm/LinearAlignmentsDisplay/models/model.js +7 -7
  94. package/esm/LinearAlignmentsDisplay/models/model.js.map +1 -1
  95. package/esm/LinearPileupDisplay/configSchema.d.ts +4 -4
  96. package/esm/LinearPileupDisplay/configSchema.js +2 -2
  97. package/esm/LinearPileupDisplay/configSchema.js.map +1 -1
  98. package/esm/LinearPileupDisplay/index.d.ts +3 -0
  99. package/esm/LinearPileupDisplay/index.js +1 -0
  100. package/esm/LinearPileupDisplay/index.js.map +1 -1
  101. package/esm/LinearPileupDisplay/model.d.ts +19 -9
  102. package/esm/LinearPileupDisplay/model.js +25 -30
  103. package/esm/LinearPileupDisplay/model.js.map +1 -1
  104. package/esm/LinearSNPCoverageDisplay/components/Tooltip.d.ts +1 -1
  105. package/esm/LinearSNPCoverageDisplay/models/model.d.ts +1 -1
  106. package/esm/PileupRPC/rpcMethods.d.ts +1 -1
  107. package/esm/PileupRPC/rpcMethods.js +12 -7
  108. package/esm/PileupRPC/rpcMethods.js.map +1 -1
  109. package/esm/PileupRenderer/PileupLayoutSession.d.ts +1 -1
  110. package/esm/PileupRenderer/PileupRenderer.js +32 -28
  111. package/esm/PileupRenderer/PileupRenderer.js.map +1 -1
  112. package/esm/PileupRenderer/index.js +8 -6
  113. package/esm/PileupRenderer/index.js.map +1 -1
  114. package/esm/SNPCoverageAdapter/configSchema.d.ts +2 -3
  115. package/esm/SNPCoverageAdapter/configSchema.js +6 -3
  116. package/esm/SNPCoverageAdapter/configSchema.js.map +1 -1
  117. package/esm/SNPCoverageAdapter/index.d.ts +1 -2
  118. package/esm/SNPCoverageAdapter/index.js +17 -15
  119. package/esm/SNPCoverageAdapter/index.js.map +1 -1
  120. package/esm/index.d.ts +3 -2
  121. package/esm/index.js +2 -2
  122. package/esm/index.js.map +1 -1
  123. package/package.json +3 -2
  124. package/src/AlignmentsFeatureDetail/AlignmentsFeatureDetail.tsx +17 -16
  125. package/src/AlignmentsFeatureDetail/__snapshots__/index.test.js.snap +1 -473
  126. package/src/AlignmentsFeatureDetail/index.test.js +6 -4
  127. package/src/BamAdapter/BamAdapter.ts +3 -2
  128. package/src/BamAdapter/BamSlightlyLazyFeature.ts +2 -1
  129. package/src/BamAdapter/MismatchParser.test.ts +21 -12
  130. package/src/BamAdapter/MismatchParser.ts +7 -10
  131. package/src/BamAdapter/__snapshots__/BamAdapter.test.ts.snap +135 -135
  132. package/src/BamAdapter/configSchema.ts +1 -1
  133. package/src/BamAdapter/index.ts +7 -8
  134. package/src/CombinationTest.test.ts +107 -0
  135. package/src/CramAdapter/CramSlightlyLazyFeature.ts +10 -219
  136. package/src/CramAdapter/CramTestAdapters.ts +1 -1
  137. package/src/CramAdapter/__snapshots__/CramAdapter.test.ts.snap +31 -31
  138. package/src/CramAdapter/__snapshots__/util.test.ts.snap +14 -0
  139. package/src/CramAdapter/configSchema.ts +2 -3
  140. package/src/CramAdapter/index.ts +7 -8
  141. package/src/CramAdapter/util.test.ts +26 -0
  142. package/src/CramAdapter/util.ts +251 -0
  143. package/src/LinearAlignmentsDisplay/components/AlignmentsDisplay.tsx +3 -1
  144. package/src/LinearAlignmentsDisplay/models/model.tsx +8 -7
  145. package/src/LinearPileupDisplay/configSchema.ts +3 -5
  146. package/src/LinearPileupDisplay/index.ts +5 -0
  147. package/src/LinearPileupDisplay/model.ts +31 -30
  148. package/src/PileupRPC/rpcMethods.ts +15 -20
  149. package/src/PileupRenderer/{PileupRenderer.tsx → PileupRenderer.ts} +48 -54
  150. package/src/PileupRenderer/index.ts +8 -9
  151. package/src/SNPCoverageAdapter/configSchema.ts +14 -13
  152. package/src/SNPCoverageAdapter/index.ts +17 -18
  153. package/src/__snapshots__/index.test.ts.snap +1 -1
  154. package/src/index.ts +11 -4
@@ -44,7 +44,7 @@ const configSchema = ConfigurationSchema(
44
44
  fetchSizeLimit: {
45
45
  type: 'number',
46
46
  description:
47
- 'used to determine when to display a warning to the user that too much data will be fetched',
47
+ 'size to fetch in bytes over which to display a warning to the user that too much data will be fetched',
48
48
  defaultValue: 5_000_000,
49
49
  },
50
50
  /**
@@ -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
+ })
@@ -5,22 +5,11 @@ import {
5
5
  } from '@jbrowse/core/util/simpleFeature'
6
6
  import { CramRecord } from '@gmod/cram'
7
7
  import CramAdapter from './CramAdapter'
8
-
9
- export interface Mismatch {
10
- qual?: number
11
- start: number
12
- length: number
13
- type: string
14
- base: string
15
- altbase?: string
16
- seq?: string
17
- cliplen?: number
18
- }
8
+ import { Mismatch, readFeaturesToCIGAR, readFeaturesToMismatches } from './util'
19
9
 
20
10
  export default class CramSlightlyLazyFeature implements Feature {
21
11
  // uses parameter properties to automatically create fields on the class
22
12
  // https://www.typescriptlang.org/docs/handbook/classes.html#parameter-properties
23
-
24
13
  constructor(private record: CramRecord, private _store: CramAdapter) {}
25
14
 
26
15
  _get_name() {
@@ -119,122 +108,16 @@ export default class CramSlightlyLazyFeature implements Feature {
119
108
 
120
109
  // generate a CIGAR, based on code from jkbonfield
121
110
  _get_CIGAR() {
122
- let seq = ''
123
- let cigar = ''
124
- let op = 'M'
125
- let oplen = 0
126
- if (!this.record._refRegion) {
127
- return ''
128
- }
129
-
130
- // not sure I should access these, but...
131
- const ref = this.record._refRegion.seq
132
- const refStart = this.record._refRegion.start
133
- let last_pos = this.record.alignmentStart
134
- let sublen = 0
135
- if (typeof this.record.readFeatures !== 'undefined') {
136
- let insLen = 0
137
- // @ts-ignore
138
- for (let i = 0; i < this.record.readFeatures.length; i++) {
139
- const { code, refPos, sub, data } = this.record.readFeatures[i]
140
- sublen = refPos - last_pos
141
- seq += ref.substring(last_pos - refStart, refPos - refStart)
142
- last_pos = refPos
143
-
144
- if (oplen && op !== 'M') {
145
- cigar += oplen + op
146
- oplen = 0
147
- }
148
- if (sublen) {
149
- op = 'M'
150
- oplen += sublen
151
- }
152
- if (insLen > 0 && code !== 'i') {
153
- cigar += `${insLen}I`
154
- insLen = 0
155
- }
156
-
157
- if (code === 'b') {
158
- // An array of bases stored verbatim
159
- const ret = data.split(',')
160
- const added = String.fromCharCode(...ret)
161
- seq += added
162
- last_pos += added.length
163
- oplen += added.length
164
- } else if (code === 'B') {
165
- // Single base (+ qual score)
166
- seq += sub
167
- last_pos++
168
- oplen++
169
- } else if (code === 'X') {
170
- // Substitution
171
- seq += sub
172
- last_pos++
173
- oplen++
174
- } else if (code === 'D' || code === 'N') {
175
- // Deletion or Ref Skip
176
- last_pos += data
177
- if (oplen) {
178
- cigar += oplen + op
179
- }
180
- cigar += data + code
181
- oplen = 0
182
- } else if (code === 'I' || code === 'S') {
183
- // Insertion or soft-clip
184
- seq += data
185
- if (oplen) {
186
- cigar += oplen + op
187
- }
188
- cigar += data.length + code
189
- oplen = 0
190
- } else if (code === 'i') {
191
- // Single base insertion
192
- // seq += data
193
- if (oplen) {
194
- cigar += oplen + op
195
- }
196
- insLen++
197
- oplen = 0
198
- } else if (code === 'P') {
199
- // Padding
200
- if (oplen) {
201
- cigar += oplen + op
202
- }
203
- cigar += `${data}P`
204
- } else if (code === 'H') {
205
- // Hard clip
206
- if (oplen) {
207
- cigar += oplen + op
208
- }
209
- cigar += `${data}H`
210
- oplen = 0
211
- } // else q or Q
212
- }
213
- } else {
214
- sublen = this.record.readLength - seq.length
215
- }
216
- if (seq.length !== this.record.readLength) {
217
- sublen = this.record.readLength - seq.length
218
- seq += ref.substring(last_pos - refStart, last_pos - refStart + sublen)
219
-
220
- if (oplen && op !== 'M') {
221
- cigar += oplen + op
222
- oplen = 0
223
- }
224
- op = 'M'
225
- oplen += sublen
226
- }
227
- if (oplen) {
228
- cigar += oplen + op
229
- }
230
- return cigar
111
+ return readFeaturesToCIGAR(
112
+ this.record.readFeatures,
113
+ this.record.alignmentStart,
114
+ this.record.readLength,
115
+ this.record._refRegion,
116
+ )
231
117
  }
232
118
 
233
119
  tags() {
234
- const properties = Object.getOwnPropertyNames(
235
- CramSlightlyLazyFeature.prototype,
236
- )
237
- return properties
120
+ return Object.getOwnPropertyNames(CramSlightlyLazyFeature.prototype)
238
121
  .filter(
239
122
  prop =>
240
123
  prop.startsWith('_get_') &&
@@ -299,101 +182,9 @@ export default class CramSlightlyLazyFeature implements Feature {
299
182
  }
300
183
 
301
184
  _get_mismatches(): Mismatch[] {
302
- const readFeatures = this.get('cram_read_features')
185
+ const readFeatures = this.record.readFeatures
303
186
  const qual = this.qualRaw()
304
- if (!readFeatures) {
305
- return []
306
- }
307
187
  const start = this.get('start')
308
- const mismatches: Mismatch[] = new Array(readFeatures.length)
309
- let j = 0
310
- let insLen = 0
311
-
312
- let refPos = 0
313
- for (let i = 0; i < readFeatures.length; i++) {
314
- const f = readFeatures[i]
315
- const { code, pos, data, sub, ref } = f
316
- if (insLen > 0 && code !== 'i') {
317
- mismatches[j++] = {
318
- start: refPos,
319
- type: 'insertion',
320
- base: `${insLen}`,
321
- length: 0,
322
- }
323
- insLen = 0
324
- }
325
- refPos = f.refPos - 1 - start
326
-
327
- if (code === 'X') {
328
- // substitution
329
- mismatches[j++] = {
330
- start: refPos,
331
- length: 1,
332
- base: sub,
333
- qual: qual?.[pos],
334
- altbase: ref,
335
- type: 'mismatch',
336
- }
337
- } else if (code === 'I') {
338
- // insertion
339
- mismatches[j++] = {
340
- start: refPos,
341
- type: 'insertion',
342
- base: `${data.length}`,
343
- length: 0,
344
- }
345
- } else if (code === 'N') {
346
- // reference skip
347
- mismatches[j++] = {
348
- type: 'skip',
349
- length: data,
350
- start: refPos,
351
- base: 'N',
352
- }
353
- } else if (code === 'S') {
354
- // soft clip
355
- const len = data.length
356
- mismatches[j++] = {
357
- start: refPos,
358
- type: 'softclip',
359
- base: `S${len}`,
360
- cliplen: len,
361
- length: 1,
362
- }
363
- } else if (code === 'P') {
364
- // padding
365
- } else if (code === 'H') {
366
- // hard clip
367
- const len = data
368
- mismatches[j++] = {
369
- start: refPos,
370
- type: 'hardclip',
371
- base: `H${len}`,
372
- cliplen: len,
373
- length: 1,
374
- }
375
- } else if (code === 'D') {
376
- // deletion
377
- mismatches[j++] = {
378
- type: 'deletion',
379
- length: data,
380
- start: refPos,
381
- base: '*',
382
- }
383
- } else if (code === 'b') {
384
- // stretch of bases
385
- } else if (code === 'q') {
386
- // stretch of qual scores
387
- } else if (code === 'B') {
388
- // a pair of [base, qual]
389
- } else if (code === 'i') {
390
- // single-base insertion
391
- // insertion
392
- insLen++
393
- } else if (code === 'Q') {
394
- // single quality value
395
- }
396
- }
397
- return mismatches.slice(0, j)
188
+ return readFeaturesToMismatches(readFeatures, start, qual)
398
189
  }
399
190
  }
@@ -37,7 +37,7 @@ export class FetchableSmallFasta {
37
37
  if (!entry) {
38
38
  throw new Error(`no sequence with id ${id} exists`)
39
39
  }
40
- return entry.sequence.substr(start - 1, length)
40
+ return entry.sequence.slice(start, start + length)
41
41
  }
42
42
 
43
43
  async getSequenceList() {
@@ -1,8 +1,8 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
3
  exports[`adapter can fetch features from volvox-sorted.cram 1`] = `
4
- Array [
5
- Object {
4
+ [
5
+ {
6
6
  "CIGAR": "100M",
7
7
  "clipPos": 0,
8
8
  "end": 5540,
@@ -12,11 +12,11 @@ Array [
12
12
  "qual": "17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17",
13
13
  "refName": "ctgA",
14
14
  "score": 37,
15
- "seq": "ATACACTGGTTCGGAGACGGTTGATGACGAGCGCGCTATATGTCGGCATCTGCGCGCCATGAGCGGCCGCTATCCGGCGGCACGCATAATATAGTGCAAG",
15
+ "seq": "TACACTGGTTCGGAGACGGTTCGTGACGAGCGCGCTATATGTCGGCATCTGCGCCGCATGAGCGGCCGCTGACCGGCGGCACGACTAATATAGTGCAAGA",
16
16
  "seq_id": "ctgA",
17
17
  "start": 5440,
18
18
  "strand": -1,
19
- "tags": Object {
19
+ "tags": {
20
20
  "X0": 1,
21
21
  "X1": 0,
22
22
  "XG": 0,
@@ -28,7 +28,7 @@ Array [
28
28
  "type": "match",
29
29
  "uniqueId": "test-1618",
30
30
  },
31
- Object {
31
+ {
32
32
  "CIGAR": "100M",
33
33
  "clipPos": 0,
34
34
  "end": 5541,
@@ -38,11 +38,11 @@ Array [
38
38
  "qual": "17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17",
39
39
  "refName": "ctgA",
40
40
  "score": 37,
41
- "seq": "TACACTGGTTCGGAGACGGTTCATGACGAGCGCGCTATATGTCGGCATCTGCGCCCCATGAGCGGCGGCTGTCCGGCGGCACGAATAATATAGTGCAAGA",
41
+ "seq": "ACACTGGTTCGGAGACGGTTCATGACGAGCGCGCTATATGTCGGCATCTGCGCCCCATGAGCGGCCCCTGTCCGGCGGCACGAATAATATAGTGCAAGAA",
42
42
  "seq_id": "ctgA",
43
43
  "start": 5441,
44
44
  "strand": -1,
45
- "tags": Object {
45
+ "tags": {
46
46
  "X0": 1,
47
47
  "X1": 0,
48
48
  "XG": 0,
@@ -54,7 +54,7 @@ Array [
54
54
  "type": "match",
55
55
  "uniqueId": "test-1619",
56
56
  },
57
- Object {
57
+ {
58
58
  "CIGAR": "100M",
59
59
  "clipPos": 0,
60
60
  "end": 5544,
@@ -64,11 +64,11 @@ Array [
64
64
  "qual": "17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17",
65
65
  "refName": "ctgA",
66
66
  "score": 37,
67
- "seq": "ACTGGTTCGGAGACGGTTCATGACGGGCGCGCTATATGTCGGCATCTGCTCGCCATGAGCGGCCGCTGTCCGGCGGTACGAATAATATAGTGCAAGAAAA",
67
+ "seq": "CTGGTTCGGAGACGGTTCATGACGACCGCGCTATATGTCGGCATCTGCGTCGCATGAGCGGCCGCTGTCCGGCGGCTCGAATAATATAGTGCAAGAAAAA",
68
68
  "seq_id": "ctgA",
69
69
  "start": 5444,
70
70
  "strand": 1,
71
- "tags": Object {
71
+ "tags": {
72
72
  "X0": 1,
73
73
  "X1": 0,
74
74
  "XG": 0,
@@ -80,7 +80,7 @@ Array [
80
80
  "type": "match",
81
81
  "uniqueId": "test-1620",
82
82
  },
83
- Object {
83
+ {
84
84
  "CIGAR": "100M",
85
85
  "clipPos": 0,
86
86
  "end": 5553,
@@ -90,11 +90,11 @@ Array [
90
90
  "qual": "17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17",
91
91
  "refName": "ctgA",
92
92
  "score": 37,
93
- "seq": "GAGACGGTTCATGACGAGCGCGCTATATGTCGGCATCTGCGCGCCATGAGCGGCCGCTGTCCGGCGGCACGAATAATATAGTGCAAGAAAAACCGAAGAC",
93
+ "seq": "AGACGGTTCATGACGAGCGCGCTATATGTCGGCATCTGCGCCGCATGAGCGGCCGCTGTCCGGCGGCACGAATAATATAGTGCAAGAAAAACCGAAGACT",
94
94
  "seq_id": "ctgA",
95
95
  "start": 5453,
96
96
  "strand": 1,
97
- "tags": Object {
97
+ "tags": {
98
98
  "X0": 1,
99
99
  "X1": 0,
100
100
  "XG": 0,
@@ -106,7 +106,7 @@ Array [
106
106
  "type": "match",
107
107
  "uniqueId": "test-1621",
108
108
  },
109
- Object {
109
+ {
110
110
  "CIGAR": "100M",
111
111
  "clipPos": 0,
112
112
  "end": 5554,
@@ -116,11 +116,11 @@ Array [
116
116
  "qual": "17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17",
117
117
  "refName": "ctgA",
118
118
  "score": 37,
119
- "seq": "AGACGGTTCATGACGAGCGCGCTATATGTCGGCATCTGCGCCCCATGAGGGGCCGCTGTCCAGCGGCACGAATAATATAGTGCAAGAAAAACCGAAGACT",
119
+ "seq": "GACGGTTCATGACGAGCGCGCTATATGTCGGCATCTGCGCCCCATGAGCCGCCGCTGTCCGACGGCACGAATAATATAGTGCAAGAAAAACCGAAGACTA",
120
120
  "seq_id": "ctgA",
121
121
  "start": 5454,
122
122
  "strand": 1,
123
- "tags": Object {
123
+ "tags": {
124
124
  "X0": 1,
125
125
  "X1": 0,
126
126
  "XG": 0,
@@ -132,7 +132,7 @@ Array [
132
132
  "type": "match",
133
133
  "uniqueId": "test-1622",
134
134
  },
135
- Object {
135
+ {
136
136
  "CIGAR": "100M",
137
137
  "clipPos": 0,
138
138
  "end": 5559,
@@ -142,11 +142,11 @@ Array [
142
142
  "qual": "17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17",
143
143
  "refName": "ctgA",
144
144
  "score": 37,
145
- "seq": "GTTCATGACGAGCGCGCTATATATCGGCATCTGCGCGCCATGAGCGGCCGCTGTCCGGCGGCACGAATAATATAGTGCAAGAAAAACCGAAGACTACGGT",
145
+ "seq": "TTCATGACGAGCGCGCTATATGACGGCATCTGCGCCGCATGAGCGGCCGCTGTCCGGCGGCACGAATAATATAGTGCAAGAAAAACCGAAGACTACGGTT",
146
146
  "seq_id": "ctgA",
147
147
  "start": 5459,
148
148
  "strand": -1,
149
- "tags": Object {
149
+ "tags": {
150
150
  "X0": 1,
151
151
  "X1": 0,
152
152
  "XG": 0,
@@ -158,7 +158,7 @@ Array [
158
158
  "type": "match",
159
159
  "uniqueId": "test-1623",
160
160
  },
161
- Object {
161
+ {
162
162
  "CIGAR": "100M",
163
163
  "clipPos": 0,
164
164
  "end": 5560,
@@ -168,11 +168,11 @@ Array [
168
168
  "qual": "17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17",
169
169
  "refName": "ctgA",
170
170
  "score": 37,
171
- "seq": "TTCATGACGAGCGCGCTATATGTCGGCATCTGCGCGCCACGAGCGGCCGCTGTCCGGCGGCACGAATAATATAGTGCAAGAAAAACCGAAGACTACGGTT",
171
+ "seq": "TCATGACGAGCGCGCTATATGTCGGCATCTGCGCCGCATCAGCGGCCGCTGTCCGGCGGCACGAATAATATAGTGCAAGAAAAACCGAAGACTACGGTTA",
172
172
  "seq_id": "ctgA",
173
173
  "start": 5460,
174
174
  "strand": 1,
175
- "tags": Object {
175
+ "tags": {
176
176
  "X0": 1,
177
177
  "X1": 0,
178
178
  "XG": 0,
@@ -184,7 +184,7 @@ Array [
184
184
  "type": "match",
185
185
  "uniqueId": "test-1624",
186
186
  },
187
- Object {
187
+ {
188
188
  "CIGAR": "100M",
189
189
  "clipPos": 0,
190
190
  "end": 5568,
@@ -194,11 +194,11 @@ Array [
194
194
  "qual": "17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17",
195
195
  "refName": "ctgA",
196
196
  "score": 37,
197
- "seq": "GAGCGCGCTATATGTCGGCATCTGCGCCCCATGAGCGGCCGCTGTCCGGCGGCACGAATAATATAGTGCAAGAAAAACCGAAGACTACGGTTATATATGA",
197
+ "seq": "AGCGCGCTATATGTCGGCATCTGCGCCCCATGAGCGGCCGCTGTCCGGCGGCACGAATAATATAGTGCAAGAAAAACCGAAGACTACGGTTATATATGAT",
198
198
  "seq_id": "ctgA",
199
199
  "start": 5468,
200
200
  "strand": 1,
201
- "tags": Object {
201
+ "tags": {
202
202
  "X0": 1,
203
203
  "X1": 0,
204
204
  "XG": 0,
@@ -210,7 +210,7 @@ Array [
210
210
  "type": "match",
211
211
  "uniqueId": "test-1625",
212
212
  },
213
- Object {
213
+ {
214
214
  "CIGAR": "100M",
215
215
  "clipPos": 0,
216
216
  "end": 5594,
@@ -220,11 +220,11 @@ Array [
220
220
  "qual": "17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17",
221
221
  "refName": "ctgA",
222
222
  "score": 37,
223
- "seq": "CCCCATGAGCGGCCGCTGTCCGGCGGCACGAATAATATAGTGCAAGAAAAACTGAAGACTACGGTTATATATGATGGAACGGCCCTCACAGCATTCAAAC",
223
+ "seq": "CCCATGAGCGGCCGCTGTCCGGCGGCACGAATAATATAGTGCAAGAAAAACCTAAGACTACGGTTATATATGATGGAACGGCCCTCACAGCATTCTCACA",
224
224
  "seq_id": "ctgA",
225
225
  "start": 5494,
226
226
  "strand": -1,
227
- "tags": Object {
227
+ "tags": {
228
228
  "X0": 1,
229
229
  "X1": 0,
230
230
  "XG": 0,
@@ -236,7 +236,7 @@ Array [
236
236
  "type": "match",
237
237
  "uniqueId": "test-1626",
238
238
  },
239
- Object {
239
+ {
240
240
  "CIGAR": "100M",
241
241
  "clipPos": 0,
242
242
  "end": 5596,
@@ -246,11 +246,11 @@ Array [
246
246
  "qual": "17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17",
247
247
  "refName": "ctgA",
248
248
  "score": 37,
249
- "seq": "CCATGAGCGGCCGCTGTCCGGCGGCACGAATAATATAGTGCAAGAAAAACCGAAGACTACGGTTATATATGATGGAACGGCCCTCACAGCATCCTAACAG",
249
+ "seq": "CATGAGCGGCCGCTGTCCGGCGGCACGAATAATATAGTGCAAGAAAAACCGAAGACTACGGTTATATATGATGGAACGGCCCTCACAGCATTGTAACAGG",
250
250
  "seq_id": "ctgA",
251
251
  "start": 5496,
252
252
  "strand": 1,
253
- "tags": Object {
253
+ "tags": {
254
254
  "X0": 1,
255
255
  "X1": 0,
256
256
  "XG": 0,
@@ -0,0 +1,14 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`cram read features mismatches 1`] = `
4
+ [
5
+ {
6
+ "base": "1",
7
+ "length": 0,
8
+ "start": 24,
9
+ "type": "insertion",
10
+ },
11
+ ]
12
+ `;
13
+
14
+ exports[`cram read features to CIGAR 1`] = `"24M1I75M"`;
@@ -15,7 +15,7 @@ const configSchema = ConfigurationSchema(
15
15
  fetchSizeLimit: {
16
16
  type: 'number',
17
17
  description:
18
- 'used to determine when to display a warning to the user that too much data will be fetched',
18
+ 'size in bytes over which to display a warning to the user that too much data will be fetched',
19
19
  defaultValue: 3_000_000,
20
20
  },
21
21
 
@@ -48,8 +48,7 @@ const configSchema = ConfigurationSchema(
48
48
  */
49
49
  sequenceAdapter: {
50
50
  type: 'frozen',
51
- description:
52
- 'sequence data adapter, used to calculate SNPs when BAM reads lacking MD tags',
51
+ description: 'sequence data adapter',
53
52
  defaultValue: null,
54
53
  },
55
54
  },
@@ -5,12 +5,11 @@ import AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'
5
5
  import configSchema from './configSchema'
6
6
 
7
7
  export default (pluginManager: PluginManager) => {
8
- pluginManager.addAdapterType(
9
- () =>
10
- new AdapterType({
11
- name: 'CramAdapter',
12
- configSchema,
13
- getAdapterClass: () => import('./CramAdapter').then(r => r.default),
14
- }),
15
- )
8
+ pluginManager.addAdapterType(() => {
9
+ return new AdapterType({
10
+ name: 'CramAdapter',
11
+ configSchema,
12
+ getAdapterClass: () => import('./CramAdapter').then(r => r.default),
13
+ })
14
+ })
16
15
  }