@jbrowse/plugin-alignments 2.2.0 → 2.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) 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 +3 -2
  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/components/ColorByModifications.d.ts +3 -1
  35. package/dist/LinearPileupDisplay/components/ColorByModifications.js +7 -22
  36. package/dist/LinearPileupDisplay/components/ColorByModifications.js.map +1 -1
  37. package/dist/LinearPileupDisplay/components/ColorByTag.js +2 -22
  38. package/dist/LinearPileupDisplay/components/ColorByTag.js.map +1 -1
  39. package/dist/LinearPileupDisplay/components/FilterByTag.js +2 -15
  40. package/dist/LinearPileupDisplay/components/FilterByTag.js.map +1 -1
  41. package/dist/LinearPileupDisplay/components/SetFeatureHeight.js +2 -19
  42. package/dist/LinearPileupDisplay/components/SetFeatureHeight.js.map +1 -1
  43. package/dist/LinearPileupDisplay/components/SetMaxHeight.js +2 -18
  44. package/dist/LinearPileupDisplay/components/SetMaxHeight.js.map +1 -1
  45. package/dist/LinearPileupDisplay/components/SortByTag.js +2 -23
  46. package/dist/LinearPileupDisplay/components/SortByTag.js.map +1 -1
  47. package/dist/LinearPileupDisplay/configSchema.d.ts +4 -4
  48. package/dist/LinearPileupDisplay/configSchema.js +2 -2
  49. package/dist/LinearPileupDisplay/configSchema.js.map +1 -1
  50. package/dist/LinearPileupDisplay/index.d.ts +3 -0
  51. package/dist/LinearPileupDisplay/index.js +3 -0
  52. package/dist/LinearPileupDisplay/index.js.map +1 -1
  53. package/dist/LinearPileupDisplay/model.d.ts +19 -9
  54. package/dist/LinearPileupDisplay/model.js +25 -30
  55. package/dist/LinearPileupDisplay/model.js.map +1 -1
  56. package/dist/LinearSNPCoverageDisplay/components/Tooltip.d.ts +1 -1
  57. package/dist/LinearSNPCoverageDisplay/models/model.d.ts +14 -10
  58. package/dist/LinearSNPCoverageDisplay/models/model.js +8 -6
  59. package/dist/LinearSNPCoverageDisplay/models/model.js.map +1 -1
  60. package/dist/PileupRPC/rpcMethods.d.ts +1 -1
  61. package/dist/PileupRPC/rpcMethods.js +12 -7
  62. package/dist/PileupRPC/rpcMethods.js.map +1 -1
  63. package/dist/PileupRenderer/PileupLayoutSession.d.ts +1 -1
  64. package/dist/PileupRenderer/PileupRenderer.js +32 -28
  65. package/dist/PileupRenderer/PileupRenderer.js.map +1 -1
  66. package/dist/PileupRenderer/configSchema.js +1 -1
  67. package/dist/PileupRenderer/configSchema.js.map +1 -1
  68. package/dist/PileupRenderer/index.js +8 -6
  69. package/dist/PileupRenderer/index.js.map +1 -1
  70. package/dist/SNPCoverageAdapter/SNPCoverageAdapter.d.ts +0 -51
  71. package/dist/SNPCoverageAdapter/SNPCoverageAdapter.js +3 -182
  72. package/dist/SNPCoverageAdapter/SNPCoverageAdapter.js.map +1 -1
  73. package/dist/SNPCoverageAdapter/configSchema.d.ts +2 -3
  74. package/dist/SNPCoverageAdapter/configSchema.js +6 -3
  75. package/dist/SNPCoverageAdapter/configSchema.js.map +1 -1
  76. package/dist/SNPCoverageAdapter/generateCoverageBins.d.ts +53 -0
  77. package/dist/SNPCoverageAdapter/generateCoverageBins.js +185 -0
  78. package/dist/SNPCoverageAdapter/generateCoverageBins.js.map +1 -0
  79. package/dist/SNPCoverageAdapter/index.d.ts +1 -2
  80. package/dist/SNPCoverageAdapter/index.js +17 -14
  81. package/dist/SNPCoverageAdapter/index.js.map +1 -1
  82. package/dist/index.d.ts +3 -2
  83. package/dist/index.js +4 -2
  84. package/dist/index.js.map +1 -1
  85. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +12 -13
  86. package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js.map +1 -1
  87. package/esm/BamAdapter/BamAdapter.d.ts +1 -1
  88. package/esm/BamAdapter/BamAdapter.js +1 -0
  89. package/esm/BamAdapter/BamAdapter.js.map +1 -1
  90. package/esm/BamAdapter/BamSlightlyLazyFeature.js +1 -0
  91. package/esm/BamAdapter/BamSlightlyLazyFeature.js.map +1 -1
  92. package/esm/BamAdapter/MismatchParser.d.ts +2 -2
  93. package/esm/BamAdapter/MismatchParser.js +4 -7
  94. package/esm/BamAdapter/MismatchParser.js.map +1 -1
  95. package/esm/BamAdapter/configSchema.js +1 -1
  96. package/esm/BamAdapter/configSchema.js.map +1 -1
  97. package/esm/BamAdapter/index.js +7 -5
  98. package/esm/BamAdapter/index.js.map +1 -1
  99. package/esm/CramAdapter/CramSlightlyLazyFeature.d.ts +1 -10
  100. package/esm/CramAdapter/CramSlightlyLazyFeature.js +5 -218
  101. package/esm/CramAdapter/CramSlightlyLazyFeature.js.map +1 -1
  102. package/esm/CramAdapter/CramTestAdapters.d.ts +1 -1
  103. package/esm/CramAdapter/CramTestAdapters.js +3 -2
  104. package/esm/CramAdapter/CramTestAdapters.js.map +1 -1
  105. package/esm/CramAdapter/configSchema.js +2 -2
  106. package/esm/CramAdapter/configSchema.js.map +1 -1
  107. package/esm/CramAdapter/index.js +7 -5
  108. package/esm/CramAdapter/index.js.map +1 -1
  109. package/esm/CramAdapter/util.d.ts +18 -0
  110. package/esm/CramAdapter/util.js +236 -0
  111. package/esm/CramAdapter/util.js.map +1 -0
  112. package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.js +1 -1
  113. package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.js.map +1 -1
  114. package/esm/LinearAlignmentsDisplay/models/configSchema.d.ts +1 -1
  115. package/esm/LinearAlignmentsDisplay/models/model.d.ts +5 -5
  116. package/esm/LinearAlignmentsDisplay/models/model.js +7 -7
  117. package/esm/LinearAlignmentsDisplay/models/model.js.map +1 -1
  118. package/esm/LinearPileupDisplay/components/ColorByModifications.d.ts +3 -1
  119. package/esm/LinearPileupDisplay/components/ColorByModifications.js +8 -23
  120. package/esm/LinearPileupDisplay/components/ColorByModifications.js.map +1 -1
  121. package/esm/LinearPileupDisplay/components/ColorByTag.js +3 -20
  122. package/esm/LinearPileupDisplay/components/ColorByTag.js.map +1 -1
  123. package/esm/LinearPileupDisplay/components/FilterByTag.js +3 -13
  124. package/esm/LinearPileupDisplay/components/FilterByTag.js.map +1 -1
  125. package/esm/LinearPileupDisplay/components/SetFeatureHeight.js +3 -17
  126. package/esm/LinearPileupDisplay/components/SetFeatureHeight.js.map +1 -1
  127. package/esm/LinearPileupDisplay/components/SetMaxHeight.js +3 -16
  128. package/esm/LinearPileupDisplay/components/SetMaxHeight.js.map +1 -1
  129. package/esm/LinearPileupDisplay/components/SortByTag.js +3 -21
  130. package/esm/LinearPileupDisplay/components/SortByTag.js.map +1 -1
  131. package/esm/LinearPileupDisplay/configSchema.d.ts +4 -4
  132. package/esm/LinearPileupDisplay/configSchema.js +2 -2
  133. package/esm/LinearPileupDisplay/configSchema.js.map +1 -1
  134. package/esm/LinearPileupDisplay/index.d.ts +3 -0
  135. package/esm/LinearPileupDisplay/index.js +1 -0
  136. package/esm/LinearPileupDisplay/index.js.map +1 -1
  137. package/esm/LinearPileupDisplay/model.d.ts +19 -9
  138. package/esm/LinearPileupDisplay/model.js +25 -30
  139. package/esm/LinearPileupDisplay/model.js.map +1 -1
  140. package/esm/LinearSNPCoverageDisplay/components/Tooltip.d.ts +1 -1
  141. package/esm/LinearSNPCoverageDisplay/models/model.d.ts +14 -10
  142. package/esm/LinearSNPCoverageDisplay/models/model.js +9 -7
  143. package/esm/LinearSNPCoverageDisplay/models/model.js.map +1 -1
  144. package/esm/PileupRPC/rpcMethods.d.ts +1 -1
  145. package/esm/PileupRPC/rpcMethods.js +12 -7
  146. package/esm/PileupRPC/rpcMethods.js.map +1 -1
  147. package/esm/PileupRenderer/PileupLayoutSession.d.ts +1 -1
  148. package/esm/PileupRenderer/PileupRenderer.js +32 -28
  149. package/esm/PileupRenderer/PileupRenderer.js.map +1 -1
  150. package/esm/PileupRenderer/configSchema.js +1 -1
  151. package/esm/PileupRenderer/configSchema.js.map +1 -1
  152. package/esm/PileupRenderer/index.js +8 -6
  153. package/esm/PileupRenderer/index.js.map +1 -1
  154. package/esm/SNPCoverageAdapter/SNPCoverageAdapter.d.ts +0 -51
  155. package/esm/SNPCoverageAdapter/SNPCoverageAdapter.js +4 -183
  156. package/esm/SNPCoverageAdapter/SNPCoverageAdapter.js.map +1 -1
  157. package/esm/SNPCoverageAdapter/configSchema.d.ts +2 -3
  158. package/esm/SNPCoverageAdapter/configSchema.js +6 -3
  159. package/esm/SNPCoverageAdapter/configSchema.js.map +1 -1
  160. package/esm/SNPCoverageAdapter/generateCoverageBins.d.ts +53 -0
  161. package/esm/SNPCoverageAdapter/generateCoverageBins.js +182 -0
  162. package/esm/SNPCoverageAdapter/generateCoverageBins.js.map +1 -0
  163. package/esm/SNPCoverageAdapter/index.d.ts +1 -2
  164. package/esm/SNPCoverageAdapter/index.js +17 -15
  165. package/esm/SNPCoverageAdapter/index.js.map +1 -1
  166. package/esm/index.d.ts +3 -2
  167. package/esm/index.js +2 -2
  168. package/esm/index.js.map +1 -1
  169. package/package.json +4 -3
  170. package/src/AlignmentsFeatureDetail/AlignmentsFeatureDetail.tsx +17 -16
  171. package/src/AlignmentsFeatureDetail/__snapshots__/index.test.js.snap +1 -473
  172. package/src/AlignmentsFeatureDetail/index.test.js +6 -4
  173. package/src/BamAdapter/BamAdapter.ts +3 -2
  174. package/src/BamAdapter/BamSlightlyLazyFeature.ts +2 -1
  175. package/src/BamAdapter/MismatchParser.test.ts +21 -12
  176. package/src/BamAdapter/MismatchParser.ts +7 -10
  177. package/src/BamAdapter/__snapshots__/BamAdapter.test.ts.snap +135 -135
  178. package/src/BamAdapter/configSchema.ts +1 -1
  179. package/src/BamAdapter/index.ts +7 -8
  180. package/src/CombinationTest.test.ts +107 -0
  181. package/src/CramAdapter/CramSlightlyLazyFeature.ts +10 -219
  182. package/src/CramAdapter/CramTestAdapters.ts +2 -1
  183. package/src/CramAdapter/__snapshots__/CramAdapter.test.ts.snap +31 -31
  184. package/src/CramAdapter/__snapshots__/util.test.ts.snap +14 -0
  185. package/src/CramAdapter/configSchema.ts +2 -3
  186. package/src/CramAdapter/index.ts +7 -8
  187. package/src/CramAdapter/util.test.ts +26 -0
  188. package/src/CramAdapter/util.ts +251 -0
  189. package/src/LinearAlignmentsDisplay/components/AlignmentsDisplay.tsx +3 -1
  190. package/src/LinearAlignmentsDisplay/models/model.tsx +8 -7
  191. package/src/LinearPileupDisplay/components/ColorByModifications.tsx +5 -34
  192. package/src/LinearPileupDisplay/components/ColorByTag.tsx +2 -29
  193. package/src/LinearPileupDisplay/components/FilterByTag.tsx +2 -22
  194. package/src/LinearPileupDisplay/components/SetFeatureHeight.tsx +2 -22
  195. package/src/LinearPileupDisplay/components/SetMaxHeight.tsx +2 -24
  196. package/src/LinearPileupDisplay/components/SortByTag.tsx +2 -31
  197. package/src/LinearPileupDisplay/configSchema.ts +3 -5
  198. package/src/LinearPileupDisplay/index.ts +5 -0
  199. package/src/LinearPileupDisplay/model.ts +31 -30
  200. package/src/LinearSNPCoverageDisplay/models/model.ts +12 -8
  201. package/src/PileupRPC/rpcMethods.ts +15 -20
  202. package/src/PileupRenderer/{PileupRenderer.tsx → PileupRenderer.ts} +48 -54
  203. package/src/PileupRenderer/configSchema.ts +1 -1
  204. package/src/PileupRenderer/index.ts +8 -9
  205. package/src/SNPCoverageAdapter/SNPCoverageAdapter.ts +5 -249
  206. package/src/SNPCoverageAdapter/configSchema.ts +14 -13
  207. package/src/SNPCoverageAdapter/generateCoverageBins.ts +245 -0
  208. package/src/SNPCoverageAdapter/index.ts +17 -18
  209. package/src/__snapshots__/index.test.ts.snap +1 -1
  210. package/src/index.ts +11 -4
@@ -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,5 +1,9 @@
1
1
  import { addDisposer, types, cast, getEnv, getSnapshot } from 'mobx-state-tree'
2
- import { observable, autorun } from 'mobx'
2
+ import clone from 'clone'
3
+ import { autorun } from 'mobx'
4
+
5
+ // jbrowse
6
+ import PluginManager from '@jbrowse/core/PluginManager'
3
7
  import {
4
8
  getConf,
5
9
  readConfObject,
@@ -8,7 +12,6 @@ import {
8
12
  } from '@jbrowse/core/configuration'
9
13
  import { linearWiggleDisplayModelFactory } from '@jbrowse/plugin-wiggle'
10
14
  import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'
11
- import PluginManager from '@jbrowse/core/PluginManager'
12
15
  import { getContainingView } from '@jbrowse/core/util'
13
16
 
14
17
  // locals
@@ -75,7 +78,7 @@ function stateModelFactory(
75
78
  }),
76
79
  )
77
80
  .volatile(() => ({
78
- modificationTagMap: observable.map({}),
81
+ modificationTagMap: undefined as Record<string, string> | undefined,
79
82
  }))
80
83
  .actions(self => ({
81
84
  /**
@@ -109,12 +112,14 @@ function stateModelFactory(
109
112
  const colorPalette = ['red', 'blue', 'green', 'orange', 'purple']
110
113
  let i = 0
111
114
 
115
+ const newMap = clone(self.modificationTagMap) || {}
112
116
  uniqueModifications.forEach(value => {
113
- if (!self.modificationTagMap.has(value)) {
117
+ if (!newMap[value]) {
114
118
  const newColor = colorPalette[i++]
115
- self.modificationTagMap.set(value, newColor)
119
+ newMap[value] = newColor
116
120
  }
117
121
  })
122
+ self.modificationTagMap = newMap
118
123
  },
119
124
  }))
120
125
  .views(self => {
@@ -170,8 +175,7 @@ function stateModelFactory(
170
175
  */
171
176
  get modificationsReady() {
172
177
  return self.colorBy?.type === 'modifications'
173
- ? Object.keys(JSON.parse(JSON.stringify(self.modificationTagMap)))
174
- .length > 0
178
+ ? self.modificationTagMap !== undefined
175
179
  : true
176
180
  },
177
181
 
@@ -184,7 +188,7 @@ function stateModelFactory(
184
188
  return {
185
189
  ...superProps,
186
190
  notReady: superProps.notReady || !this.modificationsReady,
187
- modificationTagMap: Object.fromEntries(modificationTagMap.toJSON()),
191
+ modificationTagMap: modificationTagMap,
188
192
 
189
193
  // must use getSnapshot because otherwise changes to e.g. just the
190
194
  // colorBy.type are not read
@@ -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()
@@ -178,9 +178,9 @@ export default class PileupRenderer extends BoxRendererType {
178
178
 
179
179
  // Expand the start and end of feature when softclipping enabled
180
180
  if (showSoftClip) {
181
- const mismatches = feature.get('mismatches') as Mismatch[]
181
+ const mismatches = feature.get('mismatches') as Mismatch[] | undefined
182
182
  const seq = feature.get('seq') as string
183
- if (seq) {
183
+ if (seq && mismatches) {
184
184
  for (let i = 0; i < mismatches.length; i += 1) {
185
185
  const { type, start, cliplen = 0 } = mismatches[i]
186
186
  if (type === 'softclip') {
@@ -849,7 +849,7 @@ export default class PileupRenderer extends BoxRendererType {
849
849
 
850
850
  const pxPerBp = Math.min(1 / bpPerPx, 2)
851
851
  const w = Math.max(minSubfeatureWidth, pxPerBp)
852
- const mismatches: Mismatch[] = feature.get('mismatches')
852
+ const mismatches = feature.get('mismatches') as Mismatch[] | undefined
853
853
  const heightLim = charHeight - 2
854
854
 
855
855
  // extraHorizontallyFlippedOffset is used to draw interbase items, which
@@ -858,6 +858,10 @@ export default class PileupRenderer extends BoxRendererType {
858
858
  ? 1 / bpPerPx + 1
859
859
  : -1
860
860
 
861
+ if (!mismatches) {
862
+ return
863
+ }
864
+
861
865
  // two pass rendering: first pass, draw all the mismatches except wide
862
866
  // insertion markers
863
867
  for (let i = 0; i < mismatches.length; i += 1) {
@@ -1052,7 +1056,7 @@ export default class PileupRenderer extends BoxRendererType {
1052
1056
  const { regions, bpPerPx } = renderArgs
1053
1057
  const [region] = regions
1054
1058
  const minFeatWidth = readConfObject(config, 'minSubfeatureWidth')
1055
- const mismatches: Mismatch[] = feature.get('mismatches')
1059
+ const mismatches = feature.get('mismatches') as Mismatch[] | undefined
1056
1060
  const seq = feature.get('seq')
1057
1061
  const { charWidth, charHeight } = this.getCharWidthHeight()
1058
1062
  const { bases } = theme.palette
@@ -1065,59 +1069,49 @@ export default class PileupRenderer extends BoxRendererType {
1065
1069
  }
1066
1070
 
1067
1071
  // Display all bases softclipped off in lightened colors
1068
- if (seq) {
1069
- mismatches
1070
- .filter(mismatch => mismatch.type === 'softclip')
1071
- .forEach(mismatch => {
1072
- const softClipLength = mismatch.cliplen || 0
1073
- const s = feature.get('start')
1074
- const softClipStart =
1075
- mismatch.start === 0 ? s - softClipLength : s + mismatch.start
1076
-
1077
- for (let k = 0; k < softClipLength; k += 1) {
1078
- const base = seq.charAt(k + mismatch.start)
1079
-
1080
- // If softclip length+start is longer than sequence, no need to
1081
- // continue showing base
1082
- if (!base) {
1083
- return
1084
- }
1085
-
1086
- const [softClipLeftPx, softClipRightPx] = bpSpanPx(
1087
- softClipStart + k,
1088
- softClipStart + k + 1,
1089
- region,
1090
- bpPerPx,
1091
- )
1092
- const softClipWidthPx = Math.max(
1093
- minFeatWidth,
1094
- Math.abs(softClipLeftPx - softClipRightPx),
1095
- )
1072
+ if (!(seq && mismatches)) {
1073
+ return
1074
+ }
1075
+ mismatches
1076
+ .filter(mismatch => mismatch.type === 'softclip')
1077
+ .forEach(mismatch => {
1078
+ const len = mismatch.cliplen || 0
1079
+ const s = feature.get('start')
1080
+ const start = mismatch.start === 0 ? s - len : s + mismatch.start
1081
+
1082
+ for (let k = 0; k < len; k += 1) {
1083
+ const base = seq.charAt(k + mismatch.start)
1084
+
1085
+ // If softclip length+start is longer than sequence, no need to
1086
+ // continue showing base
1087
+ if (!base) {
1088
+ return
1089
+ }
1096
1090
 
1097
- // Black accounts for IUPAC ambiguity code bases such as N that
1098
- // show in soft clipping
1099
- const baseColor = colorForBase[base] || '#000000'
1100
- ctx.fillStyle = baseColor
1101
- fillRect(
1102
- ctx,
1103
- softClipLeftPx,
1104
- topPx,
1105
- softClipWidthPx,
1106
- heightPx,
1107
- canvasWidth,
1108
- )
1091
+ const [leftPx, rightPx] = bpSpanPx(
1092
+ start + k,
1093
+ start + k + 1,
1094
+ region,
1095
+ bpPerPx,
1096
+ )
1097
+ const widthPx = Math.max(minFeatWidth, rightPx - leftPx)
1109
1098
 
1110
- if (softClipWidthPx >= charWidth && heightPx >= charHeight - 5) {
1111
- ctx.fillStyle = theme.palette.getContrastText(baseColor)
1112
- ctx.fillText(
1113
- base,
1114
- softClipLeftPx + (softClipWidthPx - charWidth) / 2 + 1,
1115
- topPx + heightPx,
1116
- )
1117
- }
1099
+ // Black accounts for IUPAC ambiguity code bases such as N that
1100
+ // show in soft clipping
1101
+ const baseColor = colorForBase[base] || '#000000'
1102
+ ctx.fillStyle = baseColor
1103
+ fillRect(ctx, leftPx, topPx, widthPx, heightPx, canvasWidth)
1104
+
1105
+ if (widthPx >= charWidth && heightPx >= charHeight - 5) {
1106
+ ctx.fillStyle = theme.palette.getContrastText(baseColor)
1107
+ ctx.fillText(
1108
+ base,
1109
+ leftPx + (widthPx - charWidth) / 2 + 1,
1110
+ topPx + heightPx,
1111
+ )
1118
1112
  }
1119
- })
1120
- }
1113
+ }
1114
+ })
1121
1115
  }
1122
1116
 
1123
1117
  makeImageData({
@@ -28,7 +28,7 @@ const PileupRenderer = ConfigurationSchema(
28
28
  model: types.enumeration('orientationType', ['fr', 'rf', 'ff']),
29
29
  defaultValue: 'fr',
30
30
  description:
31
- 'read sequencer orienation. fr is normal "reads pointing at each other ---> <--- while some other sequencers can use other options',
31
+ 'read sequencer orientation. fr is normal "reads pointing at each other ---> <--- while some other sequencers can use other options',
32
32
  },
33
33
  /**
34
34
  * #slot
@@ -4,13 +4,12 @@ import ReactComponent from './components/PileupRendering'
4
4
  import configSchema from './configSchema'
5
5
 
6
6
  export default function register(pluginManager: PluginManager) {
7
- pluginManager.addRendererType(
8
- () =>
9
- new PileupRenderer({
10
- name: 'PileupRenderer',
11
- ReactComponent,
12
- configSchema,
13
- pluginManager,
14
- }),
15
- )
7
+ pluginManager.addRendererType(() => {
8
+ return new PileupRenderer({
9
+ name: 'PileupRenderer',
10
+ ReactComponent,
11
+ configSchema,
12
+ pluginManager,
13
+ })
14
+ })
16
15
  }