@jbrowse/plugin-wiggle 2.5.0 → 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 (151) hide show
  1. package/dist/BigWigAdapter/BigWigAdapter.js +2 -1
  2. package/dist/BigWigAdapter/BigWigAdapter.js.map +1 -1
  3. package/dist/CreateMultiWiggleExtension/ConfirmDialog.d.ts +2 -1
  4. package/dist/LinearWiggleDisplay/components/SetColorDialog.d.ts +2 -1
  5. package/dist/LinearWiggleDisplay/components/Tooltip.d.ts +1 -1
  6. package/dist/LinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +2 -1
  7. package/dist/LinearWiggleDisplay/index.js +27 -4
  8. package/dist/LinearWiggleDisplay/index.js.map +1 -1
  9. package/dist/LinearWiggleDisplay/models/configSchema.d.ts +18 -35
  10. package/dist/LinearWiggleDisplay/models/configSchema.js +6 -67
  11. package/dist/LinearWiggleDisplay/models/configSchema.js.map +1 -1
  12. package/dist/LinearWiggleDisplay/models/model.d.ts +147 -342
  13. package/dist/LinearWiggleDisplay/models/model.js +17 -432
  14. package/dist/LinearWiggleDisplay/models/model.js.map +1 -1
  15. package/dist/LinearWiggleDisplay/models/renderSvg.d.ts +4 -0
  16. package/dist/LinearWiggleDisplay/models/renderSvg.js +21 -0
  17. package/dist/LinearWiggleDisplay/models/renderSvg.js.map +1 -0
  18. package/dist/MultiDensityRenderer/MultiDensityRenderer.js +1 -1
  19. package/dist/MultiDensityRenderer/MultiDensityRenderer.js.map +1 -1
  20. package/dist/MultiLineRenderer/MultiLineRenderer.js +1 -1
  21. package/dist/MultiLineRenderer/MultiLineRenderer.js.map +1 -1
  22. package/dist/MultiLinearWiggleDisplay/components/DraggableDialog.d.ts +2 -1
  23. package/dist/MultiLinearWiggleDisplay/components/SetColorDialog.d.ts +2 -1
  24. package/dist/MultiLinearWiggleDisplay/components/SetColorDialog.js +2 -2
  25. package/dist/MultiLinearWiggleDisplay/components/SetColorDialog.js.map +1 -1
  26. package/dist/MultiLinearWiggleDisplay/components/Tooltip.d.ts +1 -1
  27. package/dist/MultiLinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +3 -2
  28. package/dist/MultiLinearWiggleDisplay/index.js +25 -2
  29. package/dist/MultiLinearWiggleDisplay/index.js.map +1 -1
  30. package/dist/MultiLinearWiggleDisplay/models/configSchema.d.ts +24 -44
  31. package/dist/MultiLinearWiggleDisplay/models/configSchema.js +6 -66
  32. package/dist/MultiLinearWiggleDisplay/models/configSchema.js.map +1 -1
  33. package/dist/MultiLinearWiggleDisplay/models/model.d.ts +263 -175
  34. package/dist/MultiLinearWiggleDisplay/models/model.js +335 -508
  35. package/dist/MultiLinearWiggleDisplay/models/model.js.map +1 -1
  36. package/dist/MultiLinearWiggleDisplay/models/renderSvg.d.ts +4 -0
  37. package/dist/MultiLinearWiggleDisplay/models/renderSvg.js +20 -0
  38. package/dist/MultiLinearWiggleDisplay/models/renderSvg.js.map +1 -0
  39. package/dist/MultiRowLineRenderer/MultiRowLineRenderer.js +1 -1
  40. package/dist/MultiRowLineRenderer/MultiRowLineRenderer.js.map +1 -1
  41. package/dist/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js +1 -1
  42. package/dist/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js.map +1 -1
  43. package/dist/MultiWiggleAddTrackWidget/AddTrackWorkflow.d.ts +2 -1
  44. package/dist/MultiWiggleAddTrackWidget/AddTrackWorkflow.js +1 -1
  45. package/dist/MultiWiggleAddTrackWidget/AddTrackWorkflow.js.map +1 -1
  46. package/dist/MultiWiggleRendering.d.ts +2 -1
  47. package/dist/MultiXYPlotRenderer/MultiXYPlotRenderer.js +3 -2
  48. package/dist/MultiXYPlotRenderer/MultiXYPlotRenderer.js.map +1 -1
  49. package/dist/Tooltip.d.ts +1 -1
  50. package/dist/WiggleBaseRenderer.d.ts +1 -1
  51. package/dist/WiggleRendering.d.ts +2 -1
  52. package/dist/index.d.ts +222 -198
  53. package/dist/shared/SetMinMaxDialog.d.ts +2 -1
  54. package/dist/shared/YScaleBar.d.ts +4 -2
  55. package/dist/shared/YScaleBar.js +1 -1
  56. package/dist/shared/YScaleBar.js.map +1 -1
  57. package/dist/shared/configShared.d.ts +85 -0
  58. package/dist/shared/configShared.js +84 -0
  59. package/dist/shared/configShared.js.map +1 -0
  60. package/dist/shared/modelShared.d.ts +576 -0
  61. package/dist/shared/modelShared.js +480 -0
  62. package/dist/shared/modelShared.js.map +1 -0
  63. package/dist/util.d.ts +0 -3
  64. package/dist/util.js +1 -11
  65. package/dist/util.js.map +1 -1
  66. package/esm/BigWigAdapter/BigWigAdapter.js +2 -1
  67. package/esm/BigWigAdapter/BigWigAdapter.js.map +1 -1
  68. package/esm/CreateMultiWiggleExtension/ConfirmDialog.d.ts +2 -1
  69. package/esm/LinearWiggleDisplay/components/SetColorDialog.d.ts +2 -1
  70. package/esm/LinearWiggleDisplay/components/Tooltip.d.ts +1 -1
  71. package/esm/LinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +2 -1
  72. package/esm/LinearWiggleDisplay/index.js +2 -2
  73. package/esm/LinearWiggleDisplay/index.js.map +1 -1
  74. package/esm/LinearWiggleDisplay/models/configSchema.d.ts +18 -35
  75. package/esm/LinearWiggleDisplay/models/configSchema.js +3 -67
  76. package/esm/LinearWiggleDisplay/models/configSchema.js.map +1 -1
  77. package/esm/LinearWiggleDisplay/models/model.d.ts +147 -342
  78. package/esm/LinearWiggleDisplay/models/model.js +20 -435
  79. package/esm/LinearWiggleDisplay/models/model.js.map +1 -1
  80. package/esm/LinearWiggleDisplay/models/renderSvg.d.ts +4 -0
  81. package/esm/LinearWiggleDisplay/models/renderSvg.js +14 -0
  82. package/esm/LinearWiggleDisplay/models/renderSvg.js.map +1 -0
  83. package/esm/MultiDensityRenderer/MultiDensityRenderer.js +1 -1
  84. package/esm/MultiDensityRenderer/MultiDensityRenderer.js.map +1 -1
  85. package/esm/MultiLineRenderer/MultiLineRenderer.js +1 -1
  86. package/esm/MultiLineRenderer/MultiLineRenderer.js.map +1 -1
  87. package/esm/MultiLinearWiggleDisplay/components/DraggableDialog.d.ts +2 -1
  88. package/esm/MultiLinearWiggleDisplay/components/SetColorDialog.d.ts +2 -1
  89. package/esm/MultiLinearWiggleDisplay/components/SetColorDialog.js +1 -1
  90. package/esm/MultiLinearWiggleDisplay/components/SetColorDialog.js.map +1 -1
  91. package/esm/MultiLinearWiggleDisplay/components/Tooltip.d.ts +1 -1
  92. package/esm/MultiLinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +3 -2
  93. package/esm/MultiLinearWiggleDisplay/index.js +2 -2
  94. package/esm/MultiLinearWiggleDisplay/index.js.map +1 -1
  95. package/esm/MultiLinearWiggleDisplay/models/configSchema.d.ts +24 -44
  96. package/esm/MultiLinearWiggleDisplay/models/configSchema.js +3 -66
  97. package/esm/MultiLinearWiggleDisplay/models/configSchema.js.map +1 -1
  98. package/esm/MultiLinearWiggleDisplay/models/model.d.ts +263 -175
  99. package/esm/MultiLinearWiggleDisplay/models/model.js +337 -512
  100. package/esm/MultiLinearWiggleDisplay/models/model.js.map +1 -1
  101. package/esm/MultiLinearWiggleDisplay/models/renderSvg.d.ts +4 -0
  102. package/esm/MultiLinearWiggleDisplay/models/renderSvg.js +13 -0
  103. package/esm/MultiLinearWiggleDisplay/models/renderSvg.js.map +1 -0
  104. package/esm/MultiRowLineRenderer/MultiRowLineRenderer.js +1 -1
  105. package/esm/MultiRowLineRenderer/MultiRowLineRenderer.js.map +1 -1
  106. package/esm/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js +1 -1
  107. package/esm/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js.map +1 -1
  108. package/esm/MultiWiggleAddTrackWidget/AddTrackWorkflow.d.ts +2 -1
  109. package/esm/MultiWiggleAddTrackWidget/AddTrackWorkflow.js +1 -1
  110. package/esm/MultiWiggleAddTrackWidget/AddTrackWorkflow.js.map +1 -1
  111. package/esm/MultiWiggleRendering.d.ts +2 -1
  112. package/esm/MultiXYPlotRenderer/MultiXYPlotRenderer.js +2 -1
  113. package/esm/MultiXYPlotRenderer/MultiXYPlotRenderer.js.map +1 -1
  114. package/esm/Tooltip.d.ts +1 -1
  115. package/esm/WiggleBaseRenderer.d.ts +1 -1
  116. package/esm/WiggleRendering.d.ts +2 -1
  117. package/esm/index.d.ts +222 -198
  118. package/esm/shared/SetMinMaxDialog.d.ts +2 -1
  119. package/esm/shared/YScaleBar.d.ts +4 -2
  120. package/esm/shared/YScaleBar.js +1 -1
  121. package/esm/shared/YScaleBar.js.map +1 -1
  122. package/esm/shared/configShared.d.ts +85 -0
  123. package/esm/shared/configShared.js +81 -0
  124. package/esm/shared/configShared.js.map +1 -0
  125. package/esm/shared/modelShared.d.ts +576 -0
  126. package/esm/shared/modelShared.js +454 -0
  127. package/esm/shared/modelShared.js.map +1 -0
  128. package/esm/util.d.ts +0 -3
  129. package/esm/util.js +0 -9
  130. package/esm/util.js.map +1 -1
  131. package/package.json +3 -3
  132. package/src/BigWigAdapter/BigWigAdapter.ts +2 -4
  133. package/src/LinearWiggleDisplay/index.ts +2 -2
  134. package/src/LinearWiggleDisplay/models/configSchema.ts +4 -73
  135. package/src/LinearWiggleDisplay/models/model.tsx +22 -503
  136. package/src/LinearWiggleDisplay/models/renderSvg.tsx +29 -0
  137. package/src/MultiDensityRenderer/MultiDensityRenderer.ts +1 -2
  138. package/src/MultiLineRenderer/MultiLineRenderer.ts +1 -2
  139. package/src/MultiLinearWiggleDisplay/components/SetColorDialog.tsx +1 -1
  140. package/src/MultiLinearWiggleDisplay/index.ts +2 -2
  141. package/src/MultiLinearWiggleDisplay/models/configSchema.ts +4 -72
  142. package/src/MultiLinearWiggleDisplay/models/model.tsx +132 -371
  143. package/src/MultiLinearWiggleDisplay/models/renderSvg.tsx +26 -0
  144. package/src/MultiRowLineRenderer/MultiRowLineRenderer.ts +1 -2
  145. package/src/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.ts +1 -2
  146. package/src/MultiWiggleAddTrackWidget/AddTrackWorkflow.tsx +1 -1
  147. package/src/MultiXYPlotRenderer/MultiXYPlotRenderer.ts +2 -2
  148. package/src/shared/YScaleBar.tsx +4 -2
  149. package/src/shared/configShared.ts +90 -0
  150. package/src/shared/modelShared.ts +510 -0
  151. package/src/util.ts +1 -10
@@ -0,0 +1,26 @@
1
+ import React from 'react'
2
+ import { getContainingView } from '@jbrowse/core/util'
3
+ import { when } from 'mobx'
4
+ import {
5
+ ExportSvgDisplayOptions,
6
+ LinearGenomeViewModel,
7
+ } from '@jbrowse/plugin-linear-genome-view'
8
+ import { WiggleDisplayModel } from './model'
9
+ import { StatBars } from '../components/WiggleDisplayComponent'
10
+
11
+ export async function renderSvg(
12
+ self: WiggleDisplayModel,
13
+ opts: ExportSvgDisplayOptions,
14
+ superRenderSvg: (opts: ExportSvgDisplayOptions) => Promise<React.ReactNode>,
15
+ ) {
16
+ await when(() => !!self.stats && !!self.regionCannotBeRenderedText)
17
+ const { offsetPx } = getContainingView(self) as LinearGenomeViewModel
18
+ return (
19
+ <>
20
+ <g id="snpcov">{await superRenderSvg(opts)}</g>
21
+ <g transform={`translate(${Math.max(-offsetPx, 0)})`}>
22
+ <StatBars model={self} orientation="left" exportSVG />
23
+ </g>
24
+ </>
25
+ )
26
+ }
@@ -1,5 +1,4 @@
1
- import { Feature } from '@jbrowse/core/util'
2
- import { groupBy } from '../util'
1
+ import { groupBy, Feature } from '@jbrowse/core/util'
3
2
  import { drawLine } from '../drawxy'
4
3
  import WiggleBaseRenderer, {
5
4
  MultiRenderArgsDeserialized as MultiArgs,
@@ -1,5 +1,4 @@
1
- import { Feature } from '@jbrowse/core/util'
2
- import { groupBy } from '../util'
1
+ import { groupBy, Feature } from '@jbrowse/core/util'
3
2
  import { drawXY } from '../drawxy'
4
3
 
5
4
  import WiggleBaseRenderer, {
@@ -77,7 +77,7 @@ export default function MultiWiggleWidget({ model }: { model: AddTrackModel }) {
77
77
  const session = getSession(model)
78
78
 
79
79
  const trackId = [
80
- `${trackName.toLowerCase().replace(/ /g, '_')}-${Date.now()}`,
80
+ `${trackName.toLowerCase().replaceAll(' ', '_')}-${Date.now()}`,
81
81
  `${session.adminMode ? '' : '-sessionTrack'}`,
82
82
  ].join('')
83
83
 
@@ -1,6 +1,6 @@
1
- import { Feature } from '@jbrowse/core/util'
1
+ import { groupBy, Feature } from '@jbrowse/core/util'
2
2
  import { drawXY } from '../drawxy'
3
- import { groupBy, YSCALEBAR_LABEL_OFFSET } from '../util'
3
+ import { YSCALEBAR_LABEL_OFFSET } from '../util'
4
4
 
5
5
  import WiggleBaseRenderer, {
6
6
  MultiRenderArgsDeserialized as MultiArgs,
@@ -3,11 +3,13 @@ import { useTheme } from '@mui/material'
3
3
  import { observer } from 'mobx-react'
4
4
  import { axisPropsFromTickScale, Axis, LEFT, RIGHT } from 'react-d3-axis-mod'
5
5
 
6
- export default observer(function ({
6
+ type Ticks = ReturnType<typeof axisPropsFromTickScale>
7
+
8
+ export default observer(function YScaleBar({
7
9
  model,
8
10
  orientation,
9
11
  }: {
10
- model: { ticks?: ReturnType<typeof axisPropsFromTickScale> }
12
+ model: { ticks?: Ticks }
11
13
  orientation?: string
12
14
  }) {
13
15
  const { ticks } = model
@@ -0,0 +1,90 @@
1
+ import { ConfigurationSchema } from '@jbrowse/core/configuration'
2
+ import { baseLinearDisplayConfigSchema } from '@jbrowse/plugin-linear-genome-view'
3
+ import { types } from 'mobx-state-tree'
4
+
5
+ /**
6
+ * #config SharedWiggleDisplay
7
+ */
8
+ export default function sharedWiggleConfigFactory() {
9
+ return ConfigurationSchema(
10
+ 'MultiLinearWiggleDisplay',
11
+ {
12
+ /**
13
+ * #slot
14
+ */
15
+ autoscale: {
16
+ type: 'stringEnum',
17
+ defaultValue: 'local',
18
+ model: types.enumeration('Autoscale type', [
19
+ 'global',
20
+ 'local',
21
+ 'globalsd',
22
+ 'localsd',
23
+ 'zscore',
24
+ ]),
25
+ description:
26
+ 'global/local using their min/max values or w/ standard deviations (globalsd/localsd)',
27
+ },
28
+
29
+ /**
30
+ * #slot
31
+ */
32
+ minimalTicks: {
33
+ type: 'boolean',
34
+ defaultValue: false,
35
+ description: 'use the minimal amount of ticks',
36
+ },
37
+
38
+ /**
39
+ * #slot
40
+ */
41
+ minScore: {
42
+ type: 'number',
43
+ defaultValue: Number.MIN_VALUE,
44
+ description: 'minimum value for the y-scale',
45
+ },
46
+ /**
47
+ * #slot
48
+ */
49
+ maxScore: {
50
+ type: 'number',
51
+ description: 'maximum value for the y-scale',
52
+ defaultValue: Number.MAX_VALUE,
53
+ },
54
+ /**
55
+ * #slot
56
+ */
57
+ numStdDev: {
58
+ type: 'number',
59
+ description:
60
+ 'number of standard deviations to use for autoscale types globalsd or localsd',
61
+ defaultValue: 3,
62
+ },
63
+ /**
64
+ * #slot
65
+ */
66
+ scaleType: {
67
+ type: 'stringEnum',
68
+ model: types.enumeration('Scale type', ['linear', 'log']), // todo zscale
69
+ description: 'The type of scale to use',
70
+ defaultValue: 'linear',
71
+ },
72
+
73
+ /**
74
+ * #slot
75
+ */
76
+ inverted: {
77
+ type: 'boolean',
78
+ description: 'draw upside down',
79
+ defaultValue: false,
80
+ },
81
+ },
82
+ {
83
+ /**
84
+ * #baseConfiguration
85
+ */
86
+ baseConfiguration: baseLinearDisplayConfigSchema,
87
+ explicitlyTyped: true,
88
+ },
89
+ )
90
+ }
@@ -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
@@ -167,15 +167,6 @@ 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
170
  export async function getQuantitativeStats(
180
171
  self: {
181
172
  adapterConfig: AnyConfigurationModel
@@ -205,7 +196,7 @@ export async function getQuantitativeStats(
205
196
  }
206
197
 
207
198
  if (autoscaleType === 'global' || autoscaleType === 'globalsd') {
208
- const results: QuantitativeStats = (await rpcManager.call(
199
+ const results = (await rpcManager.call(
209
200
  sessionId,
210
201
  'WiggleGetGlobalQuantitativeStats',
211
202
  params,