@jbrowse/plugin-wiggle 2.4.2 → 2.6.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 (220) hide show
  1. package/dist/BigWigAdapter/BigWigAdapter.d.ts +2 -2
  2. package/dist/BigWigAdapter/BigWigAdapter.js +4 -3
  3. package/dist/BigWigAdapter/BigWigAdapter.js.map +1 -1
  4. package/dist/BigWigAdapter/configSchema.d.ts +20 -1
  5. package/dist/CreateMultiWiggleExtension/ConfirmDialog.d.ts +2 -2
  6. package/dist/DensityRenderer/configSchema.d.ts +33 -1
  7. package/dist/LinePlotRenderer/configSchema.d.ts +44 -1
  8. package/dist/LinearWiggleDisplay/components/SetColorDialog.d.ts +2 -2
  9. package/dist/LinearWiggleDisplay/components/Tooltip.d.ts +1 -1
  10. package/dist/LinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +2 -2
  11. package/dist/LinearWiggleDisplay/index.js +27 -4
  12. package/dist/LinearWiggleDisplay/index.js.map +1 -1
  13. package/dist/LinearWiggleDisplay/models/configSchema.d.ts +81 -1
  14. package/dist/LinearWiggleDisplay/models/configSchema.js +6 -67
  15. package/dist/LinearWiggleDisplay/models/configSchema.js.map +1 -1
  16. package/dist/LinearWiggleDisplay/models/model.d.ts +172 -320
  17. package/dist/LinearWiggleDisplay/models/model.js +18 -450
  18. package/dist/LinearWiggleDisplay/models/model.js.map +1 -1
  19. package/dist/LinearWiggleDisplay/models/renderSvg.d.ts +4 -0
  20. package/dist/LinearWiggleDisplay/models/renderSvg.js +21 -0
  21. package/dist/LinearWiggleDisplay/models/renderSvg.js.map +1 -0
  22. package/dist/MultiDensityRenderer/MultiDensityRenderer.js +1 -1
  23. package/dist/MultiDensityRenderer/MultiDensityRenderer.js.map +1 -1
  24. package/dist/MultiDensityRenderer/configSchema.d.ts +33 -1
  25. package/dist/MultiLineRenderer/MultiLineRenderer.js +1 -1
  26. package/dist/MultiLineRenderer/MultiLineRenderer.js.map +1 -1
  27. package/dist/MultiLineRenderer/configSchema.d.ts +51 -1
  28. package/dist/MultiLinearWiggleDisplay/components/DraggableDialog.d.ts +2 -2
  29. package/dist/MultiLinearWiggleDisplay/components/SetColorDialog.d.ts +2 -2
  30. package/dist/MultiLinearWiggleDisplay/components/SetColorDialog.js +37 -38
  31. package/dist/MultiLinearWiggleDisplay/components/SetColorDialog.js.map +1 -1
  32. package/dist/MultiLinearWiggleDisplay/components/Tooltip.d.ts +1 -1
  33. package/dist/MultiLinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +3 -3
  34. package/dist/MultiLinearWiggleDisplay/index.js +25 -2
  35. package/dist/MultiLinearWiggleDisplay/index.js.map +1 -1
  36. package/dist/MultiLinearWiggleDisplay/models/configSchema.d.ts +87 -1
  37. package/dist/MultiLinearWiggleDisplay/models/configSchema.js +6 -66
  38. package/dist/MultiLinearWiggleDisplay/models/configSchema.js.map +1 -1
  39. package/dist/MultiLinearWiggleDisplay/models/model.d.ts +288 -153
  40. package/dist/MultiLinearWiggleDisplay/models/model.js +334 -523
  41. package/dist/MultiLinearWiggleDisplay/models/model.js.map +1 -1
  42. package/dist/MultiLinearWiggleDisplay/models/renderSvg.d.ts +4 -0
  43. package/dist/MultiLinearWiggleDisplay/models/renderSvg.js +20 -0
  44. package/dist/MultiLinearWiggleDisplay/models/renderSvg.js.map +1 -0
  45. package/dist/MultiQuantitativeTrack/configSchema.d.ts +73 -1
  46. package/dist/MultiRowLineRenderer/MultiRowLineRenderer.js +1 -1
  47. package/dist/MultiRowLineRenderer/MultiRowLineRenderer.js.map +1 -1
  48. package/dist/MultiRowLineRenderer/configSchema.d.ts +51 -1
  49. package/dist/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js +1 -1
  50. package/dist/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js.map +1 -1
  51. package/dist/MultiRowXYPlotRenderer/configSchema.d.ts +68 -1
  52. package/dist/MultiWiggleAdapter/MultiWiggleAdapter.d.ts +1 -1
  53. package/dist/MultiWiggleAdapter/MultiWiggleAdapter.js +2 -2
  54. package/dist/MultiWiggleAdapter/MultiWiggleAdapter.js.map +1 -1
  55. package/dist/MultiWiggleAdapter/configSchema.d.ts +18 -1
  56. package/dist/MultiWiggleAddTrackWidget/AddTrackWorkflow.d.ts +2 -2
  57. package/dist/MultiWiggleAddTrackWidget/AddTrackWorkflow.js +1 -1
  58. package/dist/MultiWiggleAddTrackWidget/AddTrackWorkflow.js.map +1 -1
  59. package/dist/MultiWiggleRendering.d.ts +2 -2
  60. package/dist/MultiXYPlotRenderer/MultiXYPlotRenderer.js +3 -2
  61. package/dist/MultiXYPlotRenderer/MultiXYPlotRenderer.js.map +1 -1
  62. package/dist/MultiXYPlotRenderer/configSchema.d.ts +65 -1
  63. package/dist/QuantitativeTrack/configSchema.d.ts +73 -1
  64. package/dist/Tooltip.d.ts +1 -1
  65. package/dist/WiggleBaseRenderer.d.ts +1 -1
  66. package/dist/WiggleRPC/MultiWiggleGetSources.d.ts +21 -0
  67. package/dist/WiggleRPC/MultiWiggleGetSources.js +51 -0
  68. package/dist/WiggleRPC/MultiWiggleGetSources.js.map +1 -0
  69. package/dist/WiggleRPC/WiggleGetGlobalQuantitativeStats.d.ts +14 -0
  70. package/dist/WiggleRPC/WiggleGetGlobalQuantitativeStats.js +37 -0
  71. package/dist/WiggleRPC/WiggleGetGlobalQuantitativeStats.js.map +1 -0
  72. package/dist/WiggleRPC/WiggleGetMultiRegionQuantitativeStats.d.ts +20 -0
  73. package/dist/WiggleRPC/WiggleGetMultiRegionQuantitativeStats.js +54 -0
  74. package/dist/WiggleRPC/WiggleGetMultiRegionQuantitativeStats.js.map +1 -0
  75. package/dist/WiggleRPC/rpcMethods.d.ts +3 -47
  76. package/dist/WiggleRPC/rpcMethods.js +16 -117
  77. package/dist/WiggleRPC/rpcMethods.js.map +1 -1
  78. package/dist/WiggleRendering.d.ts +2 -2
  79. package/dist/XYPlotRenderer/configSchema.d.ts +65 -1
  80. package/dist/configSchema.d.ts +51 -1
  81. package/dist/index.d.ts +329 -180
  82. package/dist/index.js +2 -2
  83. package/dist/index.js.map +1 -1
  84. package/dist/shared/SetMinMaxDialog.d.ts +2 -2
  85. package/dist/shared/YScaleBar.d.ts +4 -3
  86. package/dist/shared/YScaleBar.js +1 -1
  87. package/dist/shared/YScaleBar.js.map +1 -1
  88. package/dist/shared/configShared.d.ts +85 -0
  89. package/dist/shared/configShared.js +84 -0
  90. package/dist/shared/configShared.js.map +1 -0
  91. package/dist/shared/modelShared.d.ts +576 -0
  92. package/dist/shared/modelShared.js +480 -0
  93. package/dist/shared/modelShared.js.map +1 -0
  94. package/dist/util.d.ts +9 -9
  95. package/dist/util.js +13 -22
  96. package/dist/util.js.map +1 -1
  97. package/esm/BigWigAdapter/BigWigAdapter.d.ts +2 -2
  98. package/esm/BigWigAdapter/BigWigAdapter.js +6 -4
  99. package/esm/BigWigAdapter/BigWigAdapter.js.map +1 -1
  100. package/esm/BigWigAdapter/configSchema.d.ts +20 -1
  101. package/esm/CreateMultiWiggleExtension/ConfirmDialog.d.ts +2 -2
  102. package/esm/DensityRenderer/configSchema.d.ts +33 -1
  103. package/esm/LinePlotRenderer/configSchema.d.ts +44 -1
  104. package/esm/LinearWiggleDisplay/components/SetColorDialog.d.ts +2 -2
  105. package/esm/LinearWiggleDisplay/components/Tooltip.d.ts +1 -1
  106. package/esm/LinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +2 -2
  107. package/esm/LinearWiggleDisplay/index.js +2 -2
  108. package/esm/LinearWiggleDisplay/index.js.map +1 -1
  109. package/esm/LinearWiggleDisplay/models/configSchema.d.ts +81 -1
  110. package/esm/LinearWiggleDisplay/models/configSchema.js +3 -67
  111. package/esm/LinearWiggleDisplay/models/configSchema.js.map +1 -1
  112. package/esm/LinearWiggleDisplay/models/model.d.ts +172 -320
  113. package/esm/LinearWiggleDisplay/models/model.js +22 -454
  114. package/esm/LinearWiggleDisplay/models/model.js.map +1 -1
  115. package/esm/LinearWiggleDisplay/models/renderSvg.d.ts +4 -0
  116. package/esm/LinearWiggleDisplay/models/renderSvg.js +14 -0
  117. package/esm/LinearWiggleDisplay/models/renderSvg.js.map +1 -0
  118. package/esm/MultiDensityRenderer/MultiDensityRenderer.js +1 -1
  119. package/esm/MultiDensityRenderer/MultiDensityRenderer.js.map +1 -1
  120. package/esm/MultiDensityRenderer/configSchema.d.ts +33 -1
  121. package/esm/MultiLineRenderer/MultiLineRenderer.js +1 -1
  122. package/esm/MultiLineRenderer/MultiLineRenderer.js.map +1 -1
  123. package/esm/MultiLineRenderer/configSchema.d.ts +51 -1
  124. package/esm/MultiLinearWiggleDisplay/components/DraggableDialog.d.ts +2 -2
  125. package/esm/MultiLinearWiggleDisplay/components/SetColorDialog.d.ts +2 -2
  126. package/esm/MultiLinearWiggleDisplay/components/SetColorDialog.js +37 -38
  127. package/esm/MultiLinearWiggleDisplay/components/SetColorDialog.js.map +1 -1
  128. package/esm/MultiLinearWiggleDisplay/components/Tooltip.d.ts +1 -1
  129. package/esm/MultiLinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +3 -3
  130. package/esm/MultiLinearWiggleDisplay/index.js +2 -2
  131. package/esm/MultiLinearWiggleDisplay/index.js.map +1 -1
  132. package/esm/MultiLinearWiggleDisplay/models/configSchema.d.ts +87 -1
  133. package/esm/MultiLinearWiggleDisplay/models/configSchema.js +3 -66
  134. package/esm/MultiLinearWiggleDisplay/models/configSchema.js.map +1 -1
  135. package/esm/MultiLinearWiggleDisplay/models/model.d.ts +288 -153
  136. package/esm/MultiLinearWiggleDisplay/models/model.js +336 -527
  137. package/esm/MultiLinearWiggleDisplay/models/model.js.map +1 -1
  138. package/esm/MultiLinearWiggleDisplay/models/renderSvg.d.ts +4 -0
  139. package/esm/MultiLinearWiggleDisplay/models/renderSvg.js +13 -0
  140. package/esm/MultiLinearWiggleDisplay/models/renderSvg.js.map +1 -0
  141. package/esm/MultiQuantitativeTrack/configSchema.d.ts +73 -1
  142. package/esm/MultiRowLineRenderer/MultiRowLineRenderer.js +1 -1
  143. package/esm/MultiRowLineRenderer/MultiRowLineRenderer.js.map +1 -1
  144. package/esm/MultiRowLineRenderer/configSchema.d.ts +51 -1
  145. package/esm/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js +1 -1
  146. package/esm/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js.map +1 -1
  147. package/esm/MultiRowXYPlotRenderer/configSchema.d.ts +68 -1
  148. package/esm/MultiWiggleAdapter/MultiWiggleAdapter.d.ts +1 -1
  149. package/esm/MultiWiggleAdapter/MultiWiggleAdapter.js +3 -2
  150. package/esm/MultiWiggleAdapter/MultiWiggleAdapter.js.map +1 -1
  151. package/esm/MultiWiggleAdapter/configSchema.d.ts +18 -1
  152. package/esm/MultiWiggleAddTrackWidget/AddTrackWorkflow.d.ts +2 -2
  153. package/esm/MultiWiggleAddTrackWidget/AddTrackWorkflow.js +1 -1
  154. package/esm/MultiWiggleAddTrackWidget/AddTrackWorkflow.js.map +1 -1
  155. package/esm/MultiWiggleRendering.d.ts +2 -2
  156. package/esm/MultiXYPlotRenderer/MultiXYPlotRenderer.js +2 -1
  157. package/esm/MultiXYPlotRenderer/MultiXYPlotRenderer.js.map +1 -1
  158. package/esm/MultiXYPlotRenderer/configSchema.d.ts +65 -1
  159. package/esm/QuantitativeTrack/configSchema.d.ts +73 -1
  160. package/esm/Tooltip.d.ts +1 -1
  161. package/esm/WiggleBaseRenderer.d.ts +1 -1
  162. package/esm/WiggleRPC/MultiWiggleGetSources.d.ts +21 -0
  163. package/esm/WiggleRPC/MultiWiggleGetSources.js +44 -0
  164. package/esm/WiggleRPC/MultiWiggleGetSources.js.map +1 -0
  165. package/esm/WiggleRPC/WiggleGetGlobalQuantitativeStats.d.ts +14 -0
  166. package/esm/WiggleRPC/WiggleGetGlobalQuantitativeStats.js +30 -0
  167. package/esm/WiggleRPC/WiggleGetGlobalQuantitativeStats.js.map +1 -0
  168. package/esm/WiggleRPC/WiggleGetMultiRegionQuantitativeStats.d.ts +20 -0
  169. package/esm/WiggleRPC/WiggleGetMultiRegionQuantitativeStats.js +47 -0
  170. package/esm/WiggleRPC/WiggleGetMultiRegionQuantitativeStats.js.map +1 -0
  171. package/esm/WiggleRPC/rpcMethods.d.ts +3 -47
  172. package/esm/WiggleRPC/rpcMethods.js +3 -111
  173. package/esm/WiggleRPC/rpcMethods.js.map +1 -1
  174. package/esm/WiggleRendering.d.ts +2 -2
  175. package/esm/XYPlotRenderer/configSchema.d.ts +65 -1
  176. package/esm/configSchema.d.ts +51 -1
  177. package/esm/index.d.ts +329 -180
  178. package/esm/index.js +3 -3
  179. package/esm/index.js.map +1 -1
  180. package/esm/shared/SetMinMaxDialog.d.ts +2 -2
  181. package/esm/shared/YScaleBar.d.ts +4 -3
  182. package/esm/shared/YScaleBar.js +1 -1
  183. package/esm/shared/YScaleBar.js.map +1 -1
  184. package/esm/shared/configShared.d.ts +85 -0
  185. package/esm/shared/configShared.js +81 -0
  186. package/esm/shared/configShared.js.map +1 -0
  187. package/esm/shared/modelShared.d.ts +576 -0
  188. package/esm/shared/modelShared.js +454 -0
  189. package/esm/shared/modelShared.js.map +1 -0
  190. package/esm/util.d.ts +9 -9
  191. package/esm/util.js +10 -18
  192. package/esm/util.js.map +1 -1
  193. package/package.json +4 -4
  194. package/src/BigWigAdapter/BigWigAdapter.test.ts +8 -3
  195. package/src/BigWigAdapter/BigWigAdapter.ts +8 -7
  196. package/src/LinearWiggleDisplay/index.ts +2 -2
  197. package/src/LinearWiggleDisplay/models/configSchema.ts +4 -73
  198. package/src/LinearWiggleDisplay/models/model.tsx +25 -524
  199. package/src/LinearWiggleDisplay/models/renderSvg.tsx +29 -0
  200. package/src/MultiDensityRenderer/MultiDensityRenderer.ts +1 -2
  201. package/src/MultiLineRenderer/MultiLineRenderer.ts +1 -2
  202. package/src/MultiLinearWiggleDisplay/components/SetColorDialog.tsx +54 -51
  203. package/src/MultiLinearWiggleDisplay/index.ts +2 -2
  204. package/src/MultiLinearWiggleDisplay/models/configSchema.ts +4 -72
  205. package/src/MultiLinearWiggleDisplay/models/model.tsx +134 -389
  206. package/src/MultiLinearWiggleDisplay/models/renderSvg.tsx +26 -0
  207. package/src/MultiRowLineRenderer/MultiRowLineRenderer.ts +1 -2
  208. package/src/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.ts +1 -2
  209. package/src/MultiWiggleAdapter/MultiWiggleAdapter.ts +1 -1
  210. package/src/MultiWiggleAddTrackWidget/AddTrackWorkflow.tsx +1 -1
  211. package/src/MultiXYPlotRenderer/MultiXYPlotRenderer.ts +2 -2
  212. package/src/WiggleRPC/MultiWiggleGetSources.ts +68 -0
  213. package/src/WiggleRPC/WiggleGetGlobalQuantitativeStats.ts +44 -0
  214. package/src/WiggleRPC/WiggleGetMultiRegionQuantitativeStats.ts +73 -0
  215. package/src/WiggleRPC/rpcMethods.ts +3 -170
  216. package/src/index.ts +4 -4
  217. package/src/shared/YScaleBar.tsx +4 -2
  218. package/src/shared/configShared.ts +90 -0
  219. package/src/shared/modelShared.ts +510 -0
  220. package/src/util.ts +24 -26
@@ -0,0 +1,510 @@
1
+ import {
2
+ AnyConfigurationSchemaType,
3
+ ConfigurationReference,
4
+ getConf,
5
+ readConfObject,
6
+ } from '@jbrowse/core/configuration'
7
+ import {
8
+ Feature,
9
+ getEnv,
10
+ getSession,
11
+ isSelectionContainer,
12
+ } from '@jbrowse/core/util'
13
+ import { BaseLinearDisplay } from '@jbrowse/plugin-linear-genome-view'
14
+ import { types } from 'mobx-state-tree'
15
+
16
+ // locals
17
+ import { getNiceDomain } from '../util'
18
+ import { lazy } from 'react'
19
+
20
+ // lazies
21
+ const SetMinMaxDlg = lazy(() => import('./SetMinMaxDialog'))
22
+
23
+ /**
24
+ * #stateModel SharedWiggleMixin
25
+ */
26
+ export default function SharedWiggleMixin(
27
+ configSchema: AnyConfigurationSchemaType,
28
+ ) {
29
+ return types
30
+ .compose(
31
+ BaseLinearDisplay,
32
+ types.model({
33
+ /**
34
+ * #property
35
+ */
36
+ selectedRendering: types.optional(types.string, ''),
37
+ /**
38
+ * #property
39
+ */
40
+ resolution: types.optional(types.number, 1),
41
+ /**
42
+ * #property
43
+ */
44
+ fill: types.maybe(types.boolean),
45
+ /**
46
+ * #property
47
+ */
48
+ minSize: types.maybe(types.number),
49
+ /**
50
+ * #property
51
+ */
52
+ color: types.maybe(types.string),
53
+ /**
54
+ * #property
55
+ */
56
+ posColor: types.maybe(types.string),
57
+ /**
58
+ * #property
59
+ */
60
+ negColor: types.maybe(types.string),
61
+ /**
62
+ * #property
63
+ */
64
+ summaryScoreMode: types.maybe(types.string),
65
+ /**
66
+ * #property
67
+ */
68
+ rendererTypeNameState: types.maybe(types.string),
69
+ /**
70
+ * #property
71
+ */
72
+ scale: types.maybe(types.string),
73
+ /**
74
+ * #property
75
+ */
76
+ autoscale: types.maybe(types.string),
77
+ /**
78
+ * #property
79
+ */
80
+ displayCrossHatches: types.maybe(types.boolean),
81
+ /**
82
+ * #property
83
+ */
84
+ constraints: types.optional(
85
+ types.model({
86
+ max: types.maybe(types.number),
87
+ min: types.maybe(types.number),
88
+ }),
89
+ {},
90
+ ),
91
+ /**
92
+ * #property
93
+ */
94
+ configuration: ConfigurationReference(configSchema),
95
+ }),
96
+ )
97
+ .volatile(() => ({
98
+ message: undefined as undefined | string,
99
+ stats: undefined as { scoreMin: number; scoreMax: number } | undefined,
100
+ statsFetchInProgress: undefined as undefined | AbortController,
101
+ }))
102
+ .actions(self => ({
103
+ /**
104
+ * #action
105
+ */
106
+ updateQuantitativeStats(stats: { scoreMin: number; scoreMax: number }) {
107
+ const { scoreMin, scoreMax } = stats
108
+ const EPSILON = 0.000001
109
+ if (!self.stats) {
110
+ self.stats = { scoreMin, scoreMax }
111
+ } else if (
112
+ Math.abs(self.stats.scoreMax - scoreMax) > EPSILON ||
113
+ Math.abs(self.stats.scoreMin - scoreMin) > EPSILON
114
+ ) {
115
+ self.stats = { scoreMin, scoreMax }
116
+ }
117
+ },
118
+ /**
119
+ * #action
120
+ */
121
+ setColor(color?: string) {
122
+ self.color = color
123
+ },
124
+ /**
125
+ * #action
126
+ */
127
+ setPosColor(color?: string) {
128
+ self.posColor = color
129
+ },
130
+ /**
131
+ * #action
132
+ */
133
+ setNegColor(color?: string) {
134
+ self.negColor = color
135
+ },
136
+
137
+ /**
138
+ * #action
139
+ */
140
+ setLoading(aborter: AbortController) {
141
+ const { statsFetchInProgress: statsFetch } = self
142
+ if (statsFetch !== undefined && !statsFetch.signal.aborted) {
143
+ statsFetch.abort()
144
+ }
145
+ self.statsFetchInProgress = aborter
146
+ },
147
+
148
+ /**
149
+ * #action
150
+ * this overrides the BaseLinearDisplayModel to avoid popping up a
151
+ * feature detail display, but still sets the feature selection on the
152
+ * model so listeners can detect a click
153
+ */
154
+ selectFeature(feature: Feature) {
155
+ const session = getSession(self)
156
+ if (isSelectionContainer(session)) {
157
+ session.setSelection(feature)
158
+ }
159
+ },
160
+
161
+ /**
162
+ * #action
163
+ */
164
+ setResolution(res: number) {
165
+ self.resolution = res
166
+ },
167
+
168
+ /**
169
+ * #action
170
+ */
171
+ setFill(fill: number) {
172
+ if (fill === 0) {
173
+ self.fill = true
174
+ self.minSize = 0
175
+ } else if (fill === 1) {
176
+ self.fill = false
177
+ self.minSize = 1
178
+ } else if (fill === 2) {
179
+ self.fill = false
180
+ self.minSize = 2
181
+ }
182
+ },
183
+
184
+ /**
185
+ * #action
186
+ */
187
+ toggleLogScale() {
188
+ self.scale = self.scale === 'log' ? 'linear' : 'log'
189
+ },
190
+
191
+ /**
192
+ * #action
193
+ */
194
+ setScaleType(scale?: string) {
195
+ self.scale = scale
196
+ },
197
+
198
+ /**
199
+ * #action
200
+ */
201
+ setSummaryScoreMode(val: string) {
202
+ self.summaryScoreMode = val
203
+ },
204
+
205
+ /**
206
+ * #action
207
+ */
208
+ setAutoscale(val: string) {
209
+ self.autoscale = val
210
+ },
211
+
212
+ /**
213
+ * #action
214
+ */
215
+ setMaxScore(val?: number) {
216
+ self.constraints.max = val
217
+ },
218
+
219
+ /**
220
+ * #action
221
+ */
222
+ setRendererType(val: string) {
223
+ self.rendererTypeNameState = val
224
+ },
225
+
226
+ /**
227
+ * #action
228
+ */
229
+ setMinScore(val?: number) {
230
+ self.constraints.min = val
231
+ },
232
+
233
+ /**
234
+ * #action
235
+ */
236
+ toggleCrossHatches() {
237
+ self.displayCrossHatches = !self.displayCrossHatches
238
+ },
239
+
240
+ /**
241
+ * #action
242
+ */
243
+ setCrossHatches(cross: boolean) {
244
+ self.displayCrossHatches = cross
245
+ },
246
+ }))
247
+
248
+ .views(self => ({
249
+ /**
250
+ * #getter
251
+ */
252
+ get adapterTypeName() {
253
+ return self.adapterConfig.type
254
+ },
255
+
256
+ /**
257
+ * #getter
258
+ */
259
+ get rendererTypeNameSimple() {
260
+ return self.rendererTypeNameState ?? getConf(self, 'defaultRendering')
261
+ },
262
+
263
+ /**
264
+ * #getter
265
+ * subclasses can define these, as snpcoverage track does
266
+ */
267
+ get filters() {
268
+ return undefined
269
+ },
270
+
271
+ /**
272
+ * #getter
273
+ */
274
+ get scaleType() {
275
+ return self.scale ?? getConf(self, 'scaleType')
276
+ },
277
+
278
+ /**
279
+ * #getter
280
+ */
281
+ get maxScore() {
282
+ return self.constraints.max ?? getConf(self, 'maxScore')
283
+ },
284
+
285
+ /**
286
+ * #getter
287
+ */
288
+ get minScore() {
289
+ return self.constraints.min ?? getConf(self, 'minScore')
290
+ },
291
+ }))
292
+ .views(self => ({
293
+ /**
294
+ * #getter
295
+ */
296
+ get adapterCapabilities() {
297
+ const type = self.adapterTypeName
298
+ const { pluginManager } = getEnv(self)
299
+ return pluginManager.getAdapterType(type).adapterCapabilities
300
+ },
301
+ /**
302
+ * #getter
303
+ */
304
+ get rendererConfig() {
305
+ const {
306
+ color,
307
+ displayCrossHatches,
308
+ fill,
309
+ minSize,
310
+ negColor,
311
+ posColor,
312
+ summaryScoreMode,
313
+ scaleType,
314
+ rendererTypeName,
315
+ } = self
316
+ const configBlob = getConf(self, ['renderers', rendererTypeName]) || {}
317
+ return self.rendererType.configSchema.create(
318
+ {
319
+ ...configBlob,
320
+ ...(scaleType ? { scaleType } : {}),
321
+ ...(fill !== undefined ? { filled: fill } : {}),
322
+ ...(displayCrossHatches !== undefined
323
+ ? { displayCrossHatches }
324
+ : {}),
325
+ ...(summaryScoreMode !== undefined ? { summaryScoreMode } : {}),
326
+ ...(color !== undefined ? { color } : {}),
327
+ ...(negColor !== undefined ? { negColor } : {}),
328
+ ...(posColor !== undefined ? { posColor } : {}),
329
+ ...(minSize !== undefined ? { minSize } : {}),
330
+ },
331
+ getEnv(self),
332
+ )
333
+ },
334
+
335
+ /**
336
+ * #getter
337
+ */
338
+ get autoscaleType() {
339
+ return self.autoscale ?? getConf(self, 'autoscale')
340
+ },
341
+ }))
342
+ .views(self => {
343
+ let oldDomain: [number, number] = [0, 0]
344
+ return {
345
+ /**
346
+ * #getter
347
+ */
348
+ get domain() {
349
+ const { stats, scaleType, minScore, maxScore } = self
350
+ if (!stats) {
351
+ return undefined
352
+ }
353
+
354
+ const ret = getNiceDomain({
355
+ domain: [stats.scoreMin, stats.scoreMax],
356
+ bounds: [minScore, maxScore],
357
+ scaleType,
358
+ })
359
+
360
+ // avoid weird scalebar if log value and empty region displayed
361
+ if (scaleType === 'log' && ret[1] === Number.MIN_VALUE) {
362
+ return [0, Number.MIN_VALUE]
363
+ }
364
+
365
+ // avoid returning a new object if it matches the old value
366
+ if (JSON.stringify(oldDomain) !== JSON.stringify(ret)) {
367
+ oldDomain = ret
368
+ }
369
+
370
+ return oldDomain
371
+ },
372
+ }
373
+ })
374
+ .views(self => ({
375
+ /**
376
+ * #getter
377
+ */
378
+ get filled(): boolean {
379
+ const { fill, rendererConfig } = self
380
+ return fill ?? readConfObject(rendererConfig, 'filled')
381
+ },
382
+ /**
383
+ * #getter
384
+ */
385
+ get summaryScoreModeSetting(): string {
386
+ const { summaryScoreMode: mode, rendererConfig } = self
387
+ return mode ?? readConfObject(rendererConfig, 'summaryScoreMode')
388
+ },
389
+
390
+ /**
391
+ * #getter
392
+ */
393
+ get scaleOpts() {
394
+ return {
395
+ domain: self.domain,
396
+ stats: self.stats,
397
+ autoscaleType: self.autoscaleType,
398
+ scaleType: self.scaleType,
399
+ inverted: getConf(self, 'inverted'),
400
+ }
401
+ },
402
+
403
+ /**
404
+ * #getter
405
+ */
406
+ get canHaveFill() {
407
+ return self.rendererTypeName === 'XYPlotRenderer'
408
+ },
409
+
410
+ /**
411
+ * #getter
412
+ */
413
+ get displayCrossHatchesSetting(): boolean {
414
+ const { displayCrossHatches: hatches, rendererConfig } = self
415
+ return hatches ?? readConfObject(rendererConfig, 'displayCrossHatches')
416
+ },
417
+ /**
418
+ * #getter
419
+ */
420
+ get hasResolution() {
421
+ return self.adapterCapabilities.includes('hasResolution')
422
+ },
423
+
424
+ /**
425
+ * #getter
426
+ */
427
+ get hasGlobalStats() {
428
+ return self.adapterCapabilities.includes('hasGlobalStats')
429
+ },
430
+ }))
431
+ .views(self => ({
432
+ /**
433
+ * #method
434
+ */
435
+ scoreTrackMenuItems() {
436
+ return [
437
+ ...(self.hasResolution
438
+ ? [
439
+ {
440
+ label: 'Resolution',
441
+ subMenu: [
442
+ {
443
+ label: 'Finer resolution',
444
+ onClick: () => self.setResolution(self.resolution * 5),
445
+ },
446
+ {
447
+ label: 'Coarser resolution',
448
+ onClick: () => self.setResolution(self.resolution / 5),
449
+ },
450
+ ],
451
+ },
452
+ {
453
+ label: 'Summary score mode',
454
+ subMenu: ['min', 'max', 'avg', 'whiskers'].map(elt => ({
455
+ label: elt,
456
+ type: 'radio',
457
+ checked: self.summaryScoreModeSetting === elt,
458
+ onClick: () => self.setSummaryScoreMode(elt),
459
+ })),
460
+ },
461
+ ]
462
+ : []),
463
+ {
464
+ label:
465
+ self.scaleType === 'log' ? 'Set linear scale' : 'Set log scale',
466
+ onClick: () => self.toggleLogScale(),
467
+ },
468
+ {
469
+ label: 'Autoscale type',
470
+ subMenu: [
471
+ ['local', 'Local'],
472
+ ...(self.hasGlobalStats
473
+ ? [
474
+ ['global', 'Global'],
475
+ ['globalsd', 'Global ± 3σ'],
476
+ ]
477
+ : []),
478
+ ['localsd', 'Local ± 3σ'],
479
+ ].map(([val, label]) => ({
480
+ label,
481
+ type: 'radio',
482
+ checked: self.autoscaleType === val,
483
+ onClick: () => self.setAutoscale(val),
484
+ })),
485
+ },
486
+ {
487
+ label: 'Set min/max score',
488
+ onClick: () => {
489
+ getSession(self).queueDialog(handleClose => [
490
+ SetMinMaxDlg,
491
+ { model: self, handleClose },
492
+ ])
493
+ },
494
+ },
495
+ ]
496
+ },
497
+ }))
498
+ .actions(self => {
499
+ const { reload: superReload } = self
500
+ return {
501
+ /**
502
+ * #action
503
+ */
504
+ async reload() {
505
+ self.setError()
506
+ superReload()
507
+ },
508
+ }
509
+ })
510
+ }
package/src/util.ts CHANGED
@@ -5,7 +5,7 @@ import {
5
5
  getSession,
6
6
  getContainingView,
7
7
  } from '@jbrowse/core/util'
8
- import { FeatureStats } from '@jbrowse/core/util/stats'
8
+ import { QuantitativeStats } from '@jbrowse/core/util/stats'
9
9
  import { getRpcSessionId } from '@jbrowse/core/util/tracks'
10
10
  import { addDisposer, isAlive } from 'mobx-state-tree'
11
11
 
@@ -167,18 +167,10 @@ export function getNiceDomain({
167
167
  return scale.domain() as [number, number]
168
168
  }
169
169
 
170
- export function groupBy<T>(array: T[], predicate: (v: T) => string) {
171
- const result = {} as { [key: string]: T[] }
172
- for (const value of array) {
173
- const entry = (result[predicate(value)] ||= [])
174
- entry.push(value)
175
- }
176
- return result
177
- }
178
-
179
- export async function getStats(
170
+ export async function getQuantitativeStats(
180
171
  self: {
181
172
  adapterConfig: AnyConfigurationModel
173
+ configuration: AnyConfigurationModel
182
174
  autoscaleType: string
183
175
  setMessage: (str: string) => void
184
176
  },
@@ -187,7 +179,7 @@ export async function getStats(
187
179
  signal?: AbortSignal
188
180
  filters?: string[]
189
181
  },
190
- ): Promise<FeatureStats> {
182
+ ): Promise<QuantitativeStats> {
191
183
  const { rpcManager } = getSession(self)
192
184
  const nd = getConf(self, 'numStdDev') || 3
193
185
  const { adapterConfig, autoscaleType } = self
@@ -204,11 +196,11 @@ export async function getStats(
204
196
  }
205
197
 
206
198
  if (autoscaleType === 'global' || autoscaleType === 'globalsd') {
207
- const results: FeatureStats = (await rpcManager.call(
199
+ const results = (await rpcManager.call(
208
200
  sessionId,
209
- 'WiggleGetGlobalStats',
201
+ 'WiggleGetGlobalQuantitativeStats',
210
202
  params,
211
- )) as FeatureStats
203
+ )) as QuantitativeStats
212
204
  const { scoreMin, scoreMean, scoreStdDev } = results
213
205
  // globalsd uses heuristic to avoid unnecessary scoreMin<0
214
206
  // if the scoreMin is never less than 0
@@ -225,7 +217,7 @@ export async function getStats(
225
217
  const { dynamicBlocks, bpPerPx } = getContainingView(self) as LGV
226
218
  const results = (await rpcManager.call(
227
219
  sessionId,
228
- 'WiggleGetMultiRegionStats',
220
+ 'WiggleGetMultiRegionQuantitativeStats',
229
221
  {
230
222
  ...params,
231
223
  regions: dynamicBlocks.contentBlocks.map(region => {
@@ -238,7 +230,7 @@ export async function getStats(
238
230
  }),
239
231
  bpPerPx,
240
232
  },
241
- )) as FeatureStats
233
+ )) as QuantitativeStats
242
234
  const { scoreMin, scoreMean, scoreStdDev } = results
243
235
 
244
236
  // localsd uses heuristic to avoid unnecessary scoreMin<0 if the
@@ -255,20 +247,25 @@ export async function getStats(
255
247
  if (autoscaleType === 'zscale') {
256
248
  return rpcManager.call(
257
249
  sessionId,
258
- 'WiggleGetGlobalStats',
250
+ 'WiggleGetGlobalQuantitativeStats',
259
251
  params,
260
- ) as Promise<FeatureStats>
252
+ ) as Promise<QuantitativeStats>
261
253
  }
262
254
  throw new Error(`invalid autoscaleType '${autoscaleType}'`)
263
255
  }
264
256
 
265
- export function statsAutorun(self: {
266
- estimatedStatsReady: boolean
257
+ export function quantitativeStatsAutorun(self: {
258
+ featureDensityStatsReady: boolean
267
259
  regionTooLarge: boolean
260
+ error: unknown
268
261
  setLoading: (aborter: AbortController) => void
269
262
  setError: (error: unknown) => void
270
- updateStats: (stats: FeatureStats, statsRegion: string) => void
263
+ updateQuantitativeStats: (
264
+ stats: QuantitativeStats,
265
+ statsRegion: string,
266
+ ) => void
271
267
  renderProps: () => Record<string, unknown>
268
+ configuration: AnyConfigurationModel
272
269
  adapterConfig: AnyConfigurationModel
273
270
  autoscaleType: string
274
271
  setMessage: (str: string) => void
@@ -284,20 +281,21 @@ export function statsAutorun(self: {
284
281
 
285
282
  if (
286
283
  !view.initialized ||
287
- !self.estimatedStatsReady ||
288
- self.regionTooLarge
284
+ !self.featureDensityStatsReady ||
285
+ self.regionTooLarge ||
286
+ self.error
289
287
  ) {
290
288
  return
291
289
  }
292
290
  const statsRegion = JSON.stringify(view.dynamicBlocks)
293
291
 
294
- const wiggleStats = await getStats(self, {
292
+ const wiggleStats = await getQuantitativeStats(self, {
295
293
  signal: aborter.signal,
296
294
  ...self.renderProps(),
297
295
  })
298
296
 
299
297
  if (isAlive(self)) {
300
- self.updateStats(wiggleStats, statsRegion)
298
+ self.updateQuantitativeStats(wiggleStats, statsRegion)
301
299
  }
302
300
  } catch (e) {
303
301
  if (!isAbortException(e) && isAlive(self)) {