@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
@@ -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
+ })
@@ -0,0 +1,251 @@
1
+ import { CramRecord } from '@gmod/cram'
2
+
3
+ type ReadFeatures = CramRecord['readFeatures']
4
+
5
+ export interface Mismatch {
6
+ qual?: number
7
+ start: number
8
+ length: number
9
+ type: string
10
+ base: string | undefined
11
+ altbase?: string
12
+ seq?: string
13
+ cliplen?: number
14
+ }
15
+
16
+ export function readFeaturesToMismatches(
17
+ readFeatures: ReadFeatures,
18
+ start: number,
19
+ qual?: number[] | null,
20
+ ) {
21
+ if (!readFeatures) {
22
+ return []
23
+ }
24
+ const mismatches: Mismatch[] = new Array(readFeatures.length)
25
+ let j = 0
26
+ let insLen = 0
27
+ let refPos = 0
28
+ let sublen = 0
29
+ let lastPos = start
30
+
31
+ for (let i = 0; i < readFeatures.length; i++) {
32
+ const f = readFeatures[i]
33
+ const { code, pos, data, sub, ref } = f
34
+ sublen = refPos - lastPos
35
+ lastPos = refPos
36
+
37
+ if (sublen && insLen > 0) {
38
+ mismatches[j++] = {
39
+ start: refPos,
40
+ type: 'insertion',
41
+ base: `${insLen}`,
42
+ length: 0,
43
+ }
44
+ insLen = 0
45
+ }
46
+ refPos = f.refPos - 1 - start
47
+
48
+ if (code === 'X') {
49
+ // substitution
50
+ mismatches[j++] = {
51
+ start: refPos,
52
+ length: 1,
53
+ base: sub,
54
+ qual: qual?.[pos - 1],
55
+ altbase: ref?.toUpperCase(),
56
+ type: 'mismatch',
57
+ }
58
+ } else if (code === 'I') {
59
+ // insertion
60
+ mismatches[j++] = {
61
+ start: refPos,
62
+ type: 'insertion',
63
+ base: `${data.length}`,
64
+ length: 0,
65
+ }
66
+ } else if (code === 'N') {
67
+ // reference skip
68
+ mismatches[j++] = {
69
+ type: 'skip',
70
+ length: data,
71
+ start: refPos,
72
+ base: 'N',
73
+ }
74
+ } else if (code === 'S') {
75
+ // soft clip
76
+ const len = data.length
77
+ mismatches[j++] = {
78
+ start: refPos,
79
+ type: 'softclip',
80
+ base: `S${len}`,
81
+ cliplen: len,
82
+ length: 1,
83
+ }
84
+ } else if (code === 'P') {
85
+ // padding
86
+ } else if (code === 'H') {
87
+ // hard clip
88
+ const len = data
89
+ mismatches[j++] = {
90
+ start: refPos,
91
+ type: 'hardclip',
92
+ base: `H${len}`,
93
+ cliplen: len,
94
+ length: 1,
95
+ }
96
+ } else if (code === 'D') {
97
+ // deletion
98
+ mismatches[j++] = {
99
+ type: 'deletion',
100
+ length: data,
101
+ start: refPos,
102
+ base: '*',
103
+ }
104
+ } else if (code === 'b') {
105
+ // stretch of bases
106
+ } else if (code === 'q') {
107
+ // stretch of qual scores
108
+ } else if (code === 'B') {
109
+ // a pair of [base, qual]
110
+ } else if (code === 'i') {
111
+ // single-base insertion, we collect these if there are multiple in a row
112
+ // into a single insertion entry
113
+ insLen++
114
+ } else if (code === 'Q') {
115
+ // single quality value
116
+ }
117
+ }
118
+
119
+ if (sublen && insLen > 0) {
120
+ mismatches[j++] = {
121
+ start: refPos,
122
+ type: 'insertion',
123
+ base: `${insLen}`,
124
+ length: 0,
125
+ }
126
+ insLen = 0
127
+ }
128
+
129
+ return mismatches.slice(0, j)
130
+ }
131
+
132
+ export function readFeaturesToCIGAR(
133
+ readFeatures: ReadFeatures,
134
+ alignmentStart: number,
135
+ readLen: number,
136
+ refRegion?: { seq: string; start: number },
137
+ ) {
138
+ let seq = ''
139
+ let cigar = ''
140
+ let op = 'M'
141
+ let oplen = 0
142
+ if (!refRegion) {
143
+ return ''
144
+ }
145
+
146
+ // not sure I should access these, but...
147
+ const ref = refRegion.seq
148
+ const refStart = refRegion.start
149
+ let lastPos = alignmentStart
150
+ let sublen = 0
151
+ let insLen = 0
152
+ if (readFeatures !== undefined) {
153
+ for (let i = 0; i < readFeatures.length; i++) {
154
+ const { code, refPos, sub, data } = readFeatures[i]
155
+ sublen = refPos - lastPos
156
+ seq += ref.substring(lastPos - refStart, refPos - refStart)
157
+ lastPos = refPos
158
+
159
+ if (insLen > 0 && sublen) {
160
+ cigar += `${insLen}I`
161
+ insLen = 0
162
+ }
163
+ if (oplen && op !== 'M') {
164
+ cigar += oplen + op
165
+ oplen = 0
166
+ }
167
+ if (sublen) {
168
+ op = 'M'
169
+ oplen += sublen
170
+ }
171
+
172
+ if (code === 'b') {
173
+ // An array of bases stored verbatim
174
+ const ret = data.split(',')
175
+ const added = String.fromCharCode(...ret)
176
+ seq += added
177
+ lastPos += added.length
178
+ oplen += added.length
179
+ } else if (code === 'B') {
180
+ // Single base (+ qual score)
181
+ seq += sub
182
+ lastPos++
183
+ oplen++
184
+ } else if (code === 'X') {
185
+ // Substitution
186
+ seq += sub
187
+ lastPos++
188
+ oplen++
189
+ } else if (code === 'D' || code === 'N') {
190
+ // Deletion or Ref Skip
191
+ lastPos += data
192
+ if (oplen) {
193
+ cigar += oplen + op
194
+ }
195
+ cigar += data + code
196
+ oplen = 0
197
+ } else if (code === 'I' || code === 'S') {
198
+ // Insertion or soft-clip
199
+ seq += data
200
+ if (oplen) {
201
+ cigar += oplen + op
202
+ }
203
+ cigar += data.length + code
204
+ oplen = 0
205
+ } else if (code === 'i') {
206
+ // Single base insertion
207
+ // seq += data
208
+ if (oplen) {
209
+ cigar += oplen + op
210
+ }
211
+ insLen++
212
+ seq += data
213
+ oplen = 0
214
+ } else if (code === 'P') {
215
+ // Padding
216
+ if (oplen) {
217
+ cigar += oplen + op
218
+ }
219
+ cigar += `${data}P`
220
+ } else if (code === 'H') {
221
+ // Hard clip
222
+ if (oplen) {
223
+ cigar += oplen + op
224
+ }
225
+ cigar += `${data}H`
226
+ oplen = 0
227
+ } // else q or Q
228
+ }
229
+ } else {
230
+ sublen = readLen - seq.length
231
+ }
232
+ if (seq.length !== readLen) {
233
+ sublen = readLen - seq.length
234
+ seq += ref.substring(lastPos - refStart, lastPos - refStart + sublen)
235
+
236
+ if (oplen && op !== 'M') {
237
+ cigar += oplen + op
238
+ oplen = 0
239
+ }
240
+ op = 'M'
241
+ oplen += sublen
242
+ }
243
+ if (sublen && insLen > 0) {
244
+ cigar += `${insLen}I`
245
+ }
246
+ if (oplen) {
247
+ cigar += oplen + op
248
+ }
249
+
250
+ return cigar
251
+ }
@@ -1,8 +1,10 @@
1
1
  import React from 'react'
2
2
  import { observer } from 'mobx-react'
3
+ import { makeStyles } from 'tss-react/mui'
3
4
  import { getConf } from '@jbrowse/core/configuration'
4
5
  import { ResizeHandle } from '@jbrowse/core/ui'
5
- import { makeStyles } from 'tss-react/mui'
6
+
7
+ // locals
6
8
  import { AlignmentsDisplayModel } from '../models/model'
7
9
 
8
10
  const useStyles = makeStyles()(() => ({
@@ -203,27 +203,28 @@ function stateModelFactory(
203
203
  /**
204
204
  * #action
205
205
  */
206
- setSNPCoverageDisplay(displayConfig: AnyConfigurationModel) {
206
+ setSNPCoverageDisplay(configuration: AnyConfigurationModel) {
207
207
  self.SNPCoverageDisplay = {
208
208
  type: 'LinearSNPCoverageDisplay',
209
- configuration: displayConfig,
209
+ configuration,
210
210
  height: self.snpCovHeight,
211
211
  }
212
212
  },
213
213
  /**
214
214
  * #action
215
215
  */
216
- setUserFeatureScreenDensity(limit: number) {
217
- self.PileupDisplay.setUserFeatureScreenDensity(limit)
218
- self.SNPCoverageDisplay.setUserFeatureScreenDensity(limit)
216
+ updateStatsLimit(stats: unknown) {
217
+ self.PileupDisplay.updateStatsLimit(stats)
218
+ self.SNPCoverageDisplay.updateStatsLimit(stats)
219
219
  },
220
+
220
221
  /**
221
222
  * #action
222
223
  */
223
- setPileupDisplay(displayConfig: AnyConfigurationModel) {
224
+ setPileupDisplay(configuration: AnyConfigurationModel) {
224
225
  self.PileupDisplay = {
225
226
  type: 'LinearPileupDisplay',
226
- configuration: displayConfig,
227
+ configuration,
227
228
  }
228
229
  },
229
230
  /**
@@ -8,7 +8,7 @@ import PluginManager from '@jbrowse/core/PluginManager'
8
8
  */
9
9
  function x() {} // eslint-disable-line @typescript-eslint/no-unused-vars
10
10
 
11
- function PileupConfigFactory(pluginManager: PluginManager) {
11
+ function configSchemaF(pluginManager: PluginManager) {
12
12
  // modify config schema to take in a sub coverage display
13
13
  return ConfigurationSchema(
14
14
  'LinearPileupDisplay',
@@ -64,8 +64,6 @@ function PileupConfigFactory(pluginManager: PluginManager) {
64
64
  )
65
65
  }
66
66
 
67
- export type LinearPileupDisplayConfigModel = ReturnType<
68
- typeof PileupConfigFactory
69
- >
67
+ export type LinearPileupDisplayConfigModel = ReturnType<typeof configSchemaF>
70
68
  export type LinearPileupDisplayConfig = Instance<LinearPileupDisplayConfigModel>
71
- export default PileupConfigFactory
69
+ export default configSchemaF
@@ -17,3 +17,8 @@ export default function register(pluginManager: PluginManager) {
17
17
  })
18
18
  })
19
19
  }
20
+
21
+ export {
22
+ modelFactory as linearPileupDisplayStateModelFactory,
23
+ configSchemaFactory as linearPileupDisplayConfigSchemaFactory,
24
+ }
@@ -55,6 +55,7 @@ type LGV = LinearGenomeViewModel
55
55
 
56
56
  /**
57
57
  * #stateModel LinearPileupDisplay
58
+ * extends `BaseLinearDisplay`
58
59
  */
59
60
  function stateModelFactory(configSchema: LinearPileupDisplayConfigModel) {
60
61
  return types
@@ -117,6 +118,10 @@ function stateModelFactory(configSchema: LinearPileupDisplayConfigModel) {
117
118
  extra: types.frozen(),
118
119
  }),
119
120
  ),
121
+
122
+ /**
123
+ * #property
124
+ */
120
125
  filterBy: types.optional(
121
126
  types.model({
122
127
  flagInclude: types.optional(types.number, 0),
@@ -134,6 +139,7 @@ function stateModelFactory(configSchema: LinearPileupDisplayConfigModel) {
134
139
  colorTagMap: observable.map<string, string>({}),
135
140
  modificationTagMap: observable.map<string, string>({}),
136
141
  featureUnderMouseVolatile: undefined as undefined | Feature,
142
+ currSortBpPerPx: 0,
137
143
  ready: false,
138
144
  }))
139
145
  .actions(self => ({
@@ -143,6 +149,12 @@ function stateModelFactory(configSchema: LinearPileupDisplayConfigModel) {
143
149
  setReady(flag: boolean) {
144
150
  self.ready = flag
145
151
  },
152
+ /**
153
+ * #action
154
+ */
155
+ setCurrSortBpPerPx(n: number) {
156
+ self.currSortBpPerPx = n
157
+ },
146
158
  /**
147
159
  * #action
148
160
  */
@@ -288,7 +300,7 @@ function stateModelFactory(configSchema: LinearPileupDisplayConfigModel) {
288
300
  ...self.renderProps(),
289
301
  })
290
302
  self.setReady(true)
291
- self.setCurrBpPerPx(bpPerPx)
303
+ self.setCurrSortBpPerPx(bpPerPx)
292
304
  } else {
293
305
  self.setReady(true)
294
306
  }
@@ -302,6 +314,8 @@ function stateModelFactory(configSchema: LinearPileupDisplayConfigModel) {
302
314
  )
303
315
 
304
316
  // autorun synchronizes featureUnderMouse with featureIdUnderMouse
317
+ // asynchronously. this is needed due to how we do not serialize all
318
+ // features from the BAM/CRAM over the rpc
305
319
  addDisposer(
306
320
  self,
307
321
  autorun(async () => {
@@ -567,7 +581,7 @@ function stateModelFactory(configSchema: LinearPileupDisplayConfigModel) {
567
581
  colorBy,
568
582
  filterBy,
569
583
  rpcDriverName,
570
- currBpPerPx,
584
+ currSortBpPerPx,
571
585
  ready,
572
586
  } = self
573
587
 
@@ -578,7 +592,7 @@ function stateModelFactory(configSchema: LinearPileupDisplayConfigModel) {
578
592
  notReady:
579
593
  superProps.notReady ||
580
594
  !ready ||
581
- (sortedBy && currBpPerPx !== view.bpPerPx),
595
+ (sortedBy && currSortBpPerPx !== view.bpPerPx),
582
596
  rpcDriverName,
583
597
  displayModel: self,
584
598
  sortedBy,
@@ -707,39 +721,31 @@ function stateModelFactory(configSchema: LinearPileupDisplayConfigModel) {
707
721
  subMenu: [
708
722
  {
709
723
  label: 'Normal',
710
- onClick: () => {
711
- self.setColorScheme({ type: 'normal' })
712
- },
724
+ onClick: () => self.setColorScheme({ type: 'normal' }),
713
725
  },
714
726
  {
715
727
  label: 'Mapping quality',
716
- onClick: () => {
717
- self.setColorScheme({ type: 'mappingQuality' })
718
- },
728
+ onClick: () =>
729
+ self.setColorScheme({ type: 'mappingQuality' }),
719
730
  },
720
731
  {
721
732
  label: 'Strand',
722
- onClick: () => {
723
- self.setColorScheme({ type: 'strand' })
724
- },
733
+ onClick: () => self.setColorScheme({ type: 'strand' }),
725
734
  },
726
735
  {
727
736
  label: 'Pair orientation',
728
- onClick: () => {
729
- self.setColorScheme({ type: 'pairOrientation' })
730
- },
737
+ onClick: () =>
738
+ self.setColorScheme({ type: 'pairOrientation' }),
731
739
  },
732
740
  {
733
741
  label: 'Per-base quality',
734
- onClick: () => {
735
- self.setColorScheme({ type: 'perBaseQuality' })
736
- },
742
+ onClick: () =>
743
+ self.setColorScheme({ type: 'perBaseQuality' }),
737
744
  },
738
745
  {
739
746
  label: 'Per-base lettering',
740
- onClick: () => {
741
- self.setColorScheme({ type: 'perBaseLettering' })
742
- },
747
+ onClick: () =>
748
+ self.setColorScheme({ type: 'perBaseLettering' }),
743
749
  },
744
750
  {
745
751
  label: 'Modifications or methylation',
@@ -752,15 +758,12 @@ function stateModelFactory(configSchema: LinearPileupDisplayConfigModel) {
752
758
  },
753
759
  {
754
760
  label: 'Insert size',
755
- onClick: () => {
756
- self.setColorScheme({ type: 'insertSize' })
757
- },
761
+ onClick: () => self.setColorScheme({ type: 'insertSize' }),
758
762
  },
759
763
  {
760
764
  label: 'Stranded paired-end',
761
- onClick: () => {
762
- self.setColorScheme({ type: 'reverseTemplate' })
763
- },
765
+ onClick: () =>
766
+ self.setColorScheme({ type: 'reverseTemplate' }),
764
767
  },
765
768
  {
766
769
  label: 'Color by tag...',
@@ -805,9 +808,7 @@ function stateModelFactory(configSchema: LinearPileupDisplayConfigModel) {
805
808
  label: 'Fade mismatches by quality',
806
809
  type: 'checkbox',
807
810
  checked: self.mismatchAlphaSetting,
808
- onClick: () => {
809
- self.toggleMismatchAlpha()
810
- },
811
+ onClick: () => self.toggleMismatchAlpha(),
811
812
  },
812
813
  ]
813
814
  },
@@ -1,11 +1,12 @@
1
- import { getAdapter } from '@jbrowse/core/data_adapters/dataAdapterCache'
2
1
  import RpcMethodType from '@jbrowse/core/pluggableElementTypes/RpcMethodType'
2
+ import { getAdapter } from '@jbrowse/core/data_adapters/dataAdapterCache'
3
+ import { renameRegionsIfNeeded, Region } from '@jbrowse/core/util'
3
4
  import { RenderArgs } from '@jbrowse/core/rpc/coreRpcMethods'
4
- import { renameRegionsIfNeeded } from '@jbrowse/core/util'
5
- import { Region } from '@jbrowse/core/util/types'
6
5
  import { RemoteAbortSignal } from '@jbrowse/core/rpc/remoteAbortSignals'
7
- import { toArray } from 'rxjs/operators'
8
6
  import { BaseFeatureDataAdapter } from '@jbrowse/core/data_adapters/BaseAdapter'
7
+ import { toArray } from 'rxjs/operators'
8
+
9
+ // locals
9
10
  import { getTagAlt } from '../util'
10
11
  import { getModificationTypes } from '../BamAdapter/MismatchParser'
11
12
 
@@ -41,14 +42,11 @@ export class PileupGetGlobalValueForTag extends RpcMethodType {
41
42
  },
42
43
  rpcDriverClassName: string,
43
44
  ) {
44
- const deserializedArgs = await this.deserializeArguments(
45
- args,
46
- rpcDriverClassName,
47
- )
48
- const { adapterConfig, sessionId, regions, tag } = deserializedArgs
49
- const dataAdapter = (
50
- await getAdapter(this.pluginManager, sessionId, adapterConfig)
51
- ).dataAdapter as BaseFeatureDataAdapter
45
+ const pm = this.pluginManager
46
+ const deArgs = await this.deserializeArguments(args, rpcDriverClassName)
47
+ const { adapterConfig, sessionId, regions, tag } = deArgs
48
+ const dataAdapter = (await getAdapter(pm, sessionId, adapterConfig))
49
+ .dataAdapter as BaseFeatureDataAdapter
52
50
 
53
51
  const features = dataAdapter.getFeaturesInMultipleRegions(regions)
54
52
  const featuresArray = await features.pipe(toArray()).toPromise()
@@ -96,14 +94,11 @@ export class PileupGetVisibleModifications extends RpcMethodType {
96
94
  },
97
95
  rpcDriverClassName: string,
98
96
  ) {
99
- const deserializedArgs = await this.deserializeArguments(
100
- args,
101
- rpcDriverClassName,
102
- )
103
- const { adapterConfig, sessionId, regions } = deserializedArgs
104
- const dataAdapter = (
105
- await getAdapter(this.pluginManager, sessionId, adapterConfig)
106
- ).dataAdapter as BaseFeatureDataAdapter
97
+ const pm = this.pluginManager
98
+ const deArgs = await this.deserializeArguments(args, rpcDriverClassName)
99
+ const { adapterConfig, sessionId, regions } = deArgs
100
+ const dataAdapter = (await getAdapter(pm, sessionId, adapterConfig))
101
+ .dataAdapter as BaseFeatureDataAdapter
107
102
 
108
103
  const features = dataAdapter.getFeaturesInMultipleRegions(regions)
109
104
  const featuresArray = await features.pipe(toArray()).toPromise()