@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
@@ -3,25 +3,14 @@ import {
3
3
  Feature,
4
4
  SimpleFeatureSerialized,
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
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
24
- constructor(private record: any, private _store: CramAdapter) {}
13
+ constructor(private record: CramRecord, private _store: CramAdapter) {}
25
14
 
26
15
  _get_name() {
27
16
  return this.record.readName
@@ -32,7 +21,7 @@ export default class CramSlightlyLazyFeature implements Feature {
32
21
  }
33
22
 
34
23
  _get_end() {
35
- return this.record.alignmentStart + this.record.lengthOnRef - 1
24
+ return this.record.alignmentStart + (this.record.lengthOnRef ?? 1) - 1
36
25
  }
37
26
 
38
27
  _get_cram_read_features() {
@@ -119,114 +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
-
127
- // not sure I should access these, but...
128
- const ref = this.record._refRegion.seq
129
- const refStart = this.record._refRegion.start
130
- let last_pos = this.record.alignmentStart
131
- let sublen = 0
132
- if (typeof this.record.readFeatures !== 'undefined') {
133
- // @ts-ignore
134
- for (let i = 0; i < this.record.readFeatures.length; i++) {
135
- const { code, refPos, sub, data } = this.record.readFeatures[i]
136
- sublen = refPos - last_pos
137
- seq += ref.substring(last_pos - refStart, refPos - refStart)
138
- last_pos = refPos
139
-
140
- if (oplen && op !== 'M') {
141
- cigar += oplen + op
142
- oplen = 0
143
- }
144
- if (sublen) {
145
- op = 'M'
146
- oplen += sublen
147
- }
148
-
149
- if (code === 'b') {
150
- // An array of bases stored verbatim
151
- const ret = data.split(',')
152
- const added = String.fromCharCode(...ret)
153
- seq += added
154
- last_pos += added.length
155
- oplen += added.length
156
- } else if (code === 'B') {
157
- // Single base (+ qual score)
158
- seq += sub
159
- last_pos++
160
- oplen++
161
- } else if (code === 'X') {
162
- // Substitution
163
- seq += sub
164
- last_pos++
165
- oplen++
166
- } else if (code === 'D' || code === 'N') {
167
- // Deletion or Ref Skip
168
- last_pos += data
169
- if (oplen) {
170
- cigar += oplen + op
171
- }
172
- cigar += data + code
173
- oplen = 0
174
- } else if (code === 'I' || code === 'S') {
175
- // Insertion or soft-clip
176
- seq += data
177
- if (oplen) {
178
- cigar += oplen + op
179
- }
180
- cigar += data.length + code
181
- oplen = 0
182
- } else if (code === 'i') {
183
- // Single base insertion
184
- seq += data
185
- if (oplen) {
186
- cigar += oplen + op
187
- }
188
- cigar += `${1}I`
189
- oplen = 0
190
- } else if (code === 'P') {
191
- // Padding
192
- if (oplen) {
193
- cigar += oplen + op
194
- }
195
- cigar += `${data}P`
196
- } else if (code === 'H') {
197
- // Hard clip
198
- if (oplen) {
199
- cigar += oplen + op
200
- }
201
- cigar += `${data}H`
202
- oplen = 0
203
- } // else q or Q
204
- }
205
- } else {
206
- sublen = this.record.readLength - seq.length
207
- }
208
- if (seq.length !== this.record.readLength) {
209
- sublen = this.record.readLength - seq.length
210
- seq += ref.substring(last_pos - refStart, last_pos - refStart + sublen)
211
-
212
- if (oplen && op !== 'M') {
213
- cigar += oplen + op
214
- oplen = 0
215
- }
216
- op = 'M'
217
- oplen += sublen
218
- }
219
- if (oplen) {
220
- cigar += oplen + op
221
- }
222
- return cigar
111
+ return readFeaturesToCIGAR(
112
+ this.record.readFeatures,
113
+ this.record.alignmentStart,
114
+ this.record.readLength,
115
+ this.record._refRegion,
116
+ )
223
117
  }
224
118
 
225
119
  tags() {
226
- const properties = Object.getOwnPropertyNames(
227
- CramSlightlyLazyFeature.prototype,
228
- )
229
- return properties
120
+ return Object.getOwnPropertyNames(CramSlightlyLazyFeature.prototype)
230
121
  .filter(
231
122
  prop =>
232
123
  prop.startsWith('_get_') &&
@@ -280,111 +171,20 @@ export default class CramSlightlyLazyFeature implements Feature {
280
171
  }
281
172
 
282
173
  toJSON(): SimpleFeatureSerialized {
283
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
284
- const tags: Record<string, any> = {}
285
- this.tags().forEach((t: string) => {
286
- const val = this.get(t)
287
- if (val !== undefined) {
288
- tags[t] = val
289
- }
290
- })
291
-
292
174
  return {
293
- ...tags,
294
- name: this.get('name'),
295
- type: this.get('type'),
175
+ ...Object.fromEntries(
176
+ this.tags()
177
+ .map(t => [t, this.get(t)])
178
+ .filter(elt => elt[1] !== undefined),
179
+ ),
296
180
  uniqueId: this.id(),
297
181
  }
298
182
  }
299
183
 
300
184
  _get_mismatches(): Mismatch[] {
301
- const readFeatures = this.get('cram_read_features')
185
+ const readFeatures = this.record.readFeatures
302
186
  const qual = this.qualRaw()
303
- if (!readFeatures) {
304
- return []
305
- }
306
187
  const start = this.get('start')
307
- const mismatches: Mismatch[] = new Array(readFeatures.length)
308
- let j = 0
309
- for (let i = 0; i < readFeatures.length; i++) {
310
- const f = readFeatures[i]
311
- const { code, pos, data, sub, ref } = f
312
- const refPos = f.refPos - 1 - start
313
- if (code === 'X') {
314
- // substitution
315
- mismatches[j++] = {
316
- start: refPos,
317
- length: 1,
318
- base: sub,
319
- qual: qual?.[pos],
320
- altbase: ref,
321
- type: 'mismatch',
322
- }
323
- } else if (code === 'I') {
324
- // insertion
325
- mismatches[j++] = {
326
- start: refPos,
327
- type: 'insertion',
328
- base: `${data.length}`,
329
- length: 0,
330
- }
331
- } else if (code === 'N') {
332
- // reference skip
333
- mismatches[j++] = {
334
- type: 'skip',
335
- length: data,
336
- start: refPos,
337
- base: 'N',
338
- }
339
- } else if (code === 'S') {
340
- // soft clip
341
- const len = data.length
342
- mismatches[j++] = {
343
- start: refPos,
344
- type: 'softclip',
345
- base: `S${len}`,
346
- cliplen: len,
347
- length: 1,
348
- }
349
- } else if (code === 'P') {
350
- // padding
351
- } else if (code === 'H') {
352
- // hard clip
353
- const len = data
354
- mismatches[j++] = {
355
- start: refPos,
356
- type: 'hardclip',
357
- base: `H${len}`,
358
- cliplen: len,
359
- length: 1,
360
- }
361
- } else if (code === 'D') {
362
- // deletion
363
- mismatches[j++] = {
364
- type: 'deletion',
365
- length: data,
366
- start: refPos,
367
- base: '*',
368
- }
369
- } else if (code === 'b') {
370
- // stretch of bases
371
- } else if (code === 'q') {
372
- // stretch of qual scores
373
- } else if (code === 'B') {
374
- // a pair of [base, qual]
375
- } else if (code === 'i') {
376
- // single-base insertion
377
- // insertion
378
- mismatches[j++] = {
379
- start: refPos,
380
- type: 'insertion',
381
- base: data,
382
- length: 1,
383
- }
384
- } else if (code === 'Q') {
385
- // single quality value
386
- }
387
- }
388
- return mismatches.slice(0, j)
188
+ return readFeaturesToMismatches(readFeatures, start, qual)
389
189
  }
390
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"`;
@@ -1,33 +1,57 @@
1
- import PluginManager from '@jbrowse/core/PluginManager'
2
1
  import { ConfigurationSchema } from '@jbrowse/core/configuration'
3
- import { types } from 'mobx-state-tree'
4
2
 
5
- export default (pluginManager: PluginManager) => {
6
- return types.late(() =>
7
- ConfigurationSchema(
8
- 'CramAdapter',
9
- {
10
- fetchSizeLimit: {
11
- type: 'number',
12
- defaultValue: 3_000_000,
13
- },
14
- cramLocation: {
15
- type: 'fileLocation',
16
- defaultValue: {
17
- uri: '/path/to/my.cram',
18
- locationType: 'UriLocation',
19
- },
20
- },
21
- craiLocation: {
22
- type: 'fileLocation',
23
- defaultValue: {
24
- uri: '/path/to/my.cram.crai',
25
- locationType: 'UriLocation',
26
- },
27
- },
28
- sequenceAdapter: pluginManager.pluggableConfigSchemaType('adapter'),
3
+ /**
4
+ * #config CramAdapter
5
+ * used to configure CRAM adapter
6
+ */
7
+ function x() {} // eslint-disable-line @typescript-eslint/no-unused-vars
8
+
9
+ const configSchema = ConfigurationSchema(
10
+ 'CramAdapter',
11
+ {
12
+ /**
13
+ * #slot fetchSizeLimit
14
+ */
15
+ fetchSizeLimit: {
16
+ type: 'number',
17
+ description:
18
+ 'size in bytes over which to display a warning to the user that too much data will be fetched',
19
+ defaultValue: 3_000_000,
20
+ },
21
+
22
+ /**
23
+ * #slot cramLocation
24
+ */
25
+ cramLocation: {
26
+ type: 'fileLocation',
27
+ defaultValue: {
28
+ uri: '/path/to/my.cram',
29
+ locationType: 'UriLocation',
29
30
  },
30
- { explicitlyTyped: true },
31
- ),
32
- )
33
- }
31
+ },
32
+
33
+ /**
34
+ * #slot craiLocation
35
+ */
36
+ craiLocation: {
37
+ type: 'fileLocation',
38
+ defaultValue: {
39
+ uri: '/path/to/my.cram.crai',
40
+ locationType: 'UriLocation',
41
+ },
42
+ },
43
+
44
+ /**
45
+ * #slot sequenceAdapter
46
+ * generally refers to the reference genome assembly's sequence adapter
47
+ * currently needs to be manually added
48
+ */
49
+ sequenceAdapter: {
50
+ type: 'frozen',
51
+ description: 'sequence data adapter',
52
+ defaultValue: null,
53
+ },
54
+ },
55
+ { explicitlyTyped: true },
56
+ )
57
+ export default configSchema
@@ -2,15 +2,14 @@ import PluginManager from '@jbrowse/core/PluginManager'
2
2
  import AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'
3
3
 
4
4
  // locals
5
- import configSchemaF from './configSchema'
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: pluginManager.load(configSchemaF),
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
  }
@@ -0,0 +1,26 @@
1
+ import { readFeaturesToCIGAR, readFeaturesToMismatches } from './util'
2
+
3
+ test('cram read features mismatches', () => {
4
+ expect(
5
+ // from ctgA_15140_15565_0:0:1_1:0:0_2e8 in volvox-sorted.cram
6
+ readFeaturesToMismatches(
7
+ [{ code: 'i', data: 'C', pos: 25, refPos: 15164 }],
8
+ 15139,
9
+ ),
10
+ ).toMatchSnapshot()
11
+ })
12
+
13
+ test('cram read features to CIGAR', () => {
14
+ expect(
15
+ // from ctgA_15140_15565_0:0:1_1:0:0_2e8 in volvox-sorted.cram
16
+ readFeaturesToCIGAR(
17
+ [{ code: 'i', data: 'C', pos: 25, refPos: 15164 }],
18
+ 15140,
19
+ 100,
20
+ {
21
+ start: 14998,
22
+ seq: 'agaccacattcagctctcggtaacatgggaggcttgtggttgcaccgtaaaagggggatagcccatccatcctgtaaacctacaatcgcgcgtagcttaatacgctcacattagacattcgatcgagagacctggtttcaagagccttcccttttgctttagtgggccaaatcgcaaccctgctcccctcccttacgccttatacacttcagtgcaaattcatgcgttcagcgaacaactggacttctgttgtacgtagtccacgggggcttattcattatagaaagccccctactgtcaccgttatatggttcacacatgagctgatcacctagagagtcgtcatgcacattcgcctaacaaggacatatgagtaaccg',
23
+ },
24
+ ),
25
+ ).toMatchSnapshot()
26
+ })