@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.
- package/dist/BigWigAdapter/BigWigAdapter.js +2 -1
- package/dist/BigWigAdapter/BigWigAdapter.js.map +1 -1
- package/dist/CreateMultiWiggleExtension/ConfirmDialog.d.ts +2 -1
- package/dist/LinearWiggleDisplay/components/SetColorDialog.d.ts +2 -1
- package/dist/LinearWiggleDisplay/components/Tooltip.d.ts +1 -1
- package/dist/LinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +2 -1
- package/dist/LinearWiggleDisplay/index.js +27 -4
- package/dist/LinearWiggleDisplay/index.js.map +1 -1
- package/dist/LinearWiggleDisplay/models/configSchema.d.ts +18 -35
- package/dist/LinearWiggleDisplay/models/configSchema.js +6 -67
- package/dist/LinearWiggleDisplay/models/configSchema.js.map +1 -1
- package/dist/LinearWiggleDisplay/models/model.d.ts +147 -342
- package/dist/LinearWiggleDisplay/models/model.js +17 -432
- package/dist/LinearWiggleDisplay/models/model.js.map +1 -1
- package/dist/LinearWiggleDisplay/models/renderSvg.d.ts +4 -0
- package/dist/LinearWiggleDisplay/models/renderSvg.js +21 -0
- package/dist/LinearWiggleDisplay/models/renderSvg.js.map +1 -0
- package/dist/MultiDensityRenderer/MultiDensityRenderer.js +1 -1
- package/dist/MultiDensityRenderer/MultiDensityRenderer.js.map +1 -1
- package/dist/MultiLineRenderer/MultiLineRenderer.js +1 -1
- package/dist/MultiLineRenderer/MultiLineRenderer.js.map +1 -1
- package/dist/MultiLinearWiggleDisplay/components/DraggableDialog.d.ts +2 -1
- package/dist/MultiLinearWiggleDisplay/components/SetColorDialog.d.ts +2 -1
- package/dist/MultiLinearWiggleDisplay/components/SetColorDialog.js +2 -2
- package/dist/MultiLinearWiggleDisplay/components/SetColorDialog.js.map +1 -1
- package/dist/MultiLinearWiggleDisplay/components/Tooltip.d.ts +1 -1
- package/dist/MultiLinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +3 -2
- package/dist/MultiLinearWiggleDisplay/index.js +25 -2
- package/dist/MultiLinearWiggleDisplay/index.js.map +1 -1
- package/dist/MultiLinearWiggleDisplay/models/configSchema.d.ts +24 -44
- package/dist/MultiLinearWiggleDisplay/models/configSchema.js +6 -66
- package/dist/MultiLinearWiggleDisplay/models/configSchema.js.map +1 -1
- package/dist/MultiLinearWiggleDisplay/models/model.d.ts +263 -175
- package/dist/MultiLinearWiggleDisplay/models/model.js +335 -508
- package/dist/MultiLinearWiggleDisplay/models/model.js.map +1 -1
- package/dist/MultiLinearWiggleDisplay/models/renderSvg.d.ts +4 -0
- package/dist/MultiLinearWiggleDisplay/models/renderSvg.js +20 -0
- package/dist/MultiLinearWiggleDisplay/models/renderSvg.js.map +1 -0
- package/dist/MultiRowLineRenderer/MultiRowLineRenderer.js +1 -1
- package/dist/MultiRowLineRenderer/MultiRowLineRenderer.js.map +1 -1
- package/dist/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js +1 -1
- package/dist/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js.map +1 -1
- package/dist/MultiWiggleAddTrackWidget/AddTrackWorkflow.d.ts +2 -1
- package/dist/MultiWiggleAddTrackWidget/AddTrackWorkflow.js +1 -1
- package/dist/MultiWiggleAddTrackWidget/AddTrackWorkflow.js.map +1 -1
- package/dist/MultiWiggleRendering.d.ts +2 -1
- package/dist/MultiXYPlotRenderer/MultiXYPlotRenderer.js +3 -2
- package/dist/MultiXYPlotRenderer/MultiXYPlotRenderer.js.map +1 -1
- package/dist/Tooltip.d.ts +1 -1
- package/dist/WiggleBaseRenderer.d.ts +1 -1
- package/dist/WiggleRendering.d.ts +2 -1
- package/dist/index.d.ts +222 -198
- package/dist/shared/SetMinMaxDialog.d.ts +2 -1
- package/dist/shared/YScaleBar.d.ts +4 -2
- package/dist/shared/YScaleBar.js +1 -1
- package/dist/shared/YScaleBar.js.map +1 -1
- package/dist/shared/configShared.d.ts +85 -0
- package/dist/shared/configShared.js +84 -0
- package/dist/shared/configShared.js.map +1 -0
- package/dist/shared/modelShared.d.ts +576 -0
- package/dist/shared/modelShared.js +480 -0
- package/dist/shared/modelShared.js.map +1 -0
- package/dist/util.d.ts +0 -3
- package/dist/util.js +1 -11
- package/dist/util.js.map +1 -1
- package/esm/BigWigAdapter/BigWigAdapter.js +2 -1
- package/esm/BigWigAdapter/BigWigAdapter.js.map +1 -1
- package/esm/CreateMultiWiggleExtension/ConfirmDialog.d.ts +2 -1
- package/esm/LinearWiggleDisplay/components/SetColorDialog.d.ts +2 -1
- package/esm/LinearWiggleDisplay/components/Tooltip.d.ts +1 -1
- package/esm/LinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +2 -1
- package/esm/LinearWiggleDisplay/index.js +2 -2
- package/esm/LinearWiggleDisplay/index.js.map +1 -1
- package/esm/LinearWiggleDisplay/models/configSchema.d.ts +18 -35
- package/esm/LinearWiggleDisplay/models/configSchema.js +3 -67
- package/esm/LinearWiggleDisplay/models/configSchema.js.map +1 -1
- package/esm/LinearWiggleDisplay/models/model.d.ts +147 -342
- package/esm/LinearWiggleDisplay/models/model.js +20 -435
- package/esm/LinearWiggleDisplay/models/model.js.map +1 -1
- package/esm/LinearWiggleDisplay/models/renderSvg.d.ts +4 -0
- package/esm/LinearWiggleDisplay/models/renderSvg.js +14 -0
- package/esm/LinearWiggleDisplay/models/renderSvg.js.map +1 -0
- package/esm/MultiDensityRenderer/MultiDensityRenderer.js +1 -1
- package/esm/MultiDensityRenderer/MultiDensityRenderer.js.map +1 -1
- package/esm/MultiLineRenderer/MultiLineRenderer.js +1 -1
- package/esm/MultiLineRenderer/MultiLineRenderer.js.map +1 -1
- package/esm/MultiLinearWiggleDisplay/components/DraggableDialog.d.ts +2 -1
- package/esm/MultiLinearWiggleDisplay/components/SetColorDialog.d.ts +2 -1
- package/esm/MultiLinearWiggleDisplay/components/SetColorDialog.js +1 -1
- package/esm/MultiLinearWiggleDisplay/components/SetColorDialog.js.map +1 -1
- package/esm/MultiLinearWiggleDisplay/components/Tooltip.d.ts +1 -1
- package/esm/MultiLinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +3 -2
- package/esm/MultiLinearWiggleDisplay/index.js +2 -2
- package/esm/MultiLinearWiggleDisplay/index.js.map +1 -1
- package/esm/MultiLinearWiggleDisplay/models/configSchema.d.ts +24 -44
- package/esm/MultiLinearWiggleDisplay/models/configSchema.js +3 -66
- package/esm/MultiLinearWiggleDisplay/models/configSchema.js.map +1 -1
- package/esm/MultiLinearWiggleDisplay/models/model.d.ts +263 -175
- package/esm/MultiLinearWiggleDisplay/models/model.js +337 -512
- package/esm/MultiLinearWiggleDisplay/models/model.js.map +1 -1
- package/esm/MultiLinearWiggleDisplay/models/renderSvg.d.ts +4 -0
- package/esm/MultiLinearWiggleDisplay/models/renderSvg.js +13 -0
- package/esm/MultiLinearWiggleDisplay/models/renderSvg.js.map +1 -0
- package/esm/MultiRowLineRenderer/MultiRowLineRenderer.js +1 -1
- package/esm/MultiRowLineRenderer/MultiRowLineRenderer.js.map +1 -1
- package/esm/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js +1 -1
- package/esm/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js.map +1 -1
- package/esm/MultiWiggleAddTrackWidget/AddTrackWorkflow.d.ts +2 -1
- package/esm/MultiWiggleAddTrackWidget/AddTrackWorkflow.js +1 -1
- package/esm/MultiWiggleAddTrackWidget/AddTrackWorkflow.js.map +1 -1
- package/esm/MultiWiggleRendering.d.ts +2 -1
- package/esm/MultiXYPlotRenderer/MultiXYPlotRenderer.js +2 -1
- package/esm/MultiXYPlotRenderer/MultiXYPlotRenderer.js.map +1 -1
- package/esm/Tooltip.d.ts +1 -1
- package/esm/WiggleBaseRenderer.d.ts +1 -1
- package/esm/WiggleRendering.d.ts +2 -1
- package/esm/index.d.ts +222 -198
- package/esm/shared/SetMinMaxDialog.d.ts +2 -1
- package/esm/shared/YScaleBar.d.ts +4 -2
- package/esm/shared/YScaleBar.js +1 -1
- package/esm/shared/YScaleBar.js.map +1 -1
- package/esm/shared/configShared.d.ts +85 -0
- package/esm/shared/configShared.js +81 -0
- package/esm/shared/configShared.js.map +1 -0
- package/esm/shared/modelShared.d.ts +576 -0
- package/esm/shared/modelShared.js +454 -0
- package/esm/shared/modelShared.js.map +1 -0
- package/esm/util.d.ts +0 -3
- package/esm/util.js +0 -9
- package/esm/util.js.map +1 -1
- package/package.json +3 -3
- package/src/BigWigAdapter/BigWigAdapter.ts +2 -4
- package/src/LinearWiggleDisplay/index.ts +2 -2
- package/src/LinearWiggleDisplay/models/configSchema.ts +4 -73
- package/src/LinearWiggleDisplay/models/model.tsx +22 -503
- package/src/LinearWiggleDisplay/models/renderSvg.tsx +29 -0
- package/src/MultiDensityRenderer/MultiDensityRenderer.ts +1 -2
- package/src/MultiLineRenderer/MultiLineRenderer.ts +1 -2
- package/src/MultiLinearWiggleDisplay/components/SetColorDialog.tsx +1 -1
- package/src/MultiLinearWiggleDisplay/index.ts +2 -2
- package/src/MultiLinearWiggleDisplay/models/configSchema.ts +4 -72
- package/src/MultiLinearWiggleDisplay/models/model.tsx +132 -371
- package/src/MultiLinearWiggleDisplay/models/renderSvg.tsx +26 -0
- package/src/MultiRowLineRenderer/MultiRowLineRenderer.ts +1 -2
- package/src/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.ts +1 -2
- package/src/MultiWiggleAddTrackWidget/AddTrackWorkflow.tsx +1 -1
- package/src/MultiXYPlotRenderer/MultiXYPlotRenderer.ts +2 -2
- package/src/shared/YScaleBar.tsx +4 -2
- package/src/shared/configShared.ts +90 -0
- package/src/shared/modelShared.ts +510 -0
- package/src/util.ts +1 -10
|
@@ -1,47 +1,34 @@
|
|
|
1
1
|
import React, { lazy } from 'react'
|
|
2
2
|
import { addDisposer, isAlive, types, Instance } from 'mobx-state-tree'
|
|
3
|
-
import { autorun
|
|
3
|
+
import { autorun } from 'mobx'
|
|
4
4
|
import { axisPropsFromTickScale } from 'react-d3-axis-mod'
|
|
5
5
|
import deepEqual from 'fast-deep-equal'
|
|
6
6
|
|
|
7
7
|
// jbrowse imports
|
|
8
8
|
import {
|
|
9
|
-
ConfigurationReference,
|
|
10
9
|
AnyConfigurationSchemaType,
|
|
11
10
|
getConf,
|
|
12
|
-
readConfObject,
|
|
13
11
|
} from '@jbrowse/core/configuration'
|
|
14
|
-
import {
|
|
15
|
-
getSession,
|
|
16
|
-
getEnv,
|
|
17
|
-
getContainingView,
|
|
18
|
-
isSelectionContainer,
|
|
19
|
-
Feature,
|
|
20
|
-
} from '@jbrowse/core/util'
|
|
12
|
+
import { getSession, Feature } from '@jbrowse/core/util'
|
|
21
13
|
import { getRpcSessionId } from '@jbrowse/core/util/tracks'
|
|
22
14
|
import { set1 as colors } from '@jbrowse/core/ui/colors'
|
|
23
15
|
import PluginManager from '@jbrowse/core/PluginManager'
|
|
24
|
-
import {
|
|
25
|
-
BaseLinearDisplay,
|
|
26
|
-
LinearGenomeViewModel,
|
|
27
|
-
} from '@jbrowse/plugin-linear-genome-view'
|
|
16
|
+
import { ExportSvgDisplayOptions } from '@jbrowse/plugin-linear-genome-view'
|
|
28
17
|
|
|
29
18
|
// locals
|
|
30
19
|
import {
|
|
31
|
-
getNiceDomain,
|
|
32
20
|
getScale,
|
|
33
21
|
quantitativeStatsAutorun,
|
|
34
22
|
YSCALEBAR_LABEL_OFFSET,
|
|
35
23
|
} from '../../util'
|
|
36
24
|
|
|
37
25
|
import Tooltip from '../components/Tooltip'
|
|
38
|
-
import
|
|
26
|
+
import SharedWiggleMixin from '../../shared/modelShared'
|
|
39
27
|
|
|
40
28
|
const randomColor = () =>
|
|
41
|
-
'#000000'.
|
|
29
|
+
'#000000'.replaceAll('0', () => (~~(Math.random() * 16)).toString(16))
|
|
42
30
|
|
|
43
|
-
//
|
|
44
|
-
const SetMinMaxDlg = lazy(() => import('../../shared/SetMinMaxDialog'))
|
|
31
|
+
// lazies
|
|
45
32
|
const SetColorDlg = lazy(() => import('../components/SetColorDialog'))
|
|
46
33
|
|
|
47
34
|
// using a map because it preserves order
|
|
@@ -53,239 +40,100 @@ const rendererTypes = new Map([
|
|
|
53
40
|
['multirowline', 'MultiRowLineRenderer'],
|
|
54
41
|
])
|
|
55
42
|
|
|
56
|
-
type LGV = LinearGenomeViewModel
|
|
57
|
-
|
|
58
43
|
interface Source {
|
|
59
44
|
name: string
|
|
60
45
|
color?: string
|
|
61
46
|
group?: string
|
|
62
47
|
}
|
|
63
48
|
|
|
64
|
-
|
|
49
|
+
/**
|
|
50
|
+
* #stateModel MultiLinearWiggleDisplay
|
|
51
|
+
* extends `SharedWiggleMixin`
|
|
52
|
+
*/
|
|
53
|
+
export function stateModelFactory(
|
|
65
54
|
pluginManager: PluginManager,
|
|
66
55
|
configSchema: AnyConfigurationSchemaType,
|
|
67
|
-
)
|
|
68
|
-
types
|
|
56
|
+
) {
|
|
57
|
+
return types
|
|
69
58
|
.compose(
|
|
70
59
|
'MultiLinearWiggleDisplay',
|
|
71
|
-
|
|
60
|
+
SharedWiggleMixin(configSchema),
|
|
72
61
|
types.model({
|
|
62
|
+
/**
|
|
63
|
+
* #property
|
|
64
|
+
*/
|
|
73
65
|
type: types.literal('MultiLinearWiggleDisplay'),
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
minSize: types.maybe(types.number),
|
|
79
|
-
color: types.maybe(types.string),
|
|
80
|
-
posColor: types.maybe(types.string),
|
|
81
|
-
negColor: types.maybe(types.string),
|
|
82
|
-
summaryScoreMode: types.maybe(types.string),
|
|
83
|
-
rendererTypeNameState: types.maybe(types.string),
|
|
84
|
-
scale: types.maybe(types.string),
|
|
85
|
-
autoscale: types.maybe(types.string),
|
|
86
|
-
displayCrossHatches: types.maybe(types.boolean),
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* #property
|
|
69
|
+
*/
|
|
87
70
|
layout: types.optional(types.frozen<Source[]>(), []),
|
|
88
|
-
constraints: types.optional(
|
|
89
|
-
types.model({
|
|
90
|
-
max: types.maybe(types.number),
|
|
91
|
-
min: types.maybe(types.number),
|
|
92
|
-
}),
|
|
93
|
-
{},
|
|
94
|
-
),
|
|
95
71
|
}),
|
|
96
72
|
)
|
|
97
73
|
.volatile(() => ({
|
|
98
|
-
message: undefined as undefined | string,
|
|
99
|
-
stats: undefined as { scoreMin: number; scoreMax: number } | undefined,
|
|
100
|
-
statsRegion: undefined as string | undefined,
|
|
101
|
-
statsFetchInProgress: undefined as undefined | AbortController,
|
|
102
74
|
featureUnderMouseVolatile: undefined as Feature | undefined,
|
|
103
75
|
sourcesVolatile: undefined as Source[] | undefined,
|
|
104
76
|
}))
|
|
105
77
|
.actions(self => ({
|
|
78
|
+
/**
|
|
79
|
+
* #action
|
|
80
|
+
*/
|
|
106
81
|
setLayout(layout: Source[]) {
|
|
107
82
|
self.layout = layout
|
|
108
83
|
},
|
|
84
|
+
/**
|
|
85
|
+
* #action
|
|
86
|
+
*/
|
|
109
87
|
clearLayout() {
|
|
110
88
|
self.layout = []
|
|
111
89
|
},
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
self.stats = { scoreMin, scoreMax }
|
|
117
|
-
} else if (
|
|
118
|
-
Math.abs(self.stats.scoreMax - scoreMax) > EPSILON ||
|
|
119
|
-
Math.abs(self.stats.scoreMin - scoreMin) > EPSILON
|
|
120
|
-
) {
|
|
121
|
-
self.stats = { scoreMin, scoreMax }
|
|
122
|
-
}
|
|
123
|
-
},
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* #action
|
|
93
|
+
*/
|
|
124
94
|
setSources(sources: Source[]) {
|
|
125
95
|
if (!deepEqual(sources, self.sourcesVolatile)) {
|
|
126
96
|
self.sourcesVolatile = sources
|
|
127
97
|
}
|
|
128
98
|
},
|
|
129
|
-
setColor(color: string) {
|
|
130
|
-
self.color = color
|
|
131
|
-
},
|
|
132
|
-
setPosColor(color: string) {
|
|
133
|
-
self.posColor = color
|
|
134
|
-
},
|
|
135
|
-
setNegColor(color: string) {
|
|
136
|
-
self.negColor = color
|
|
137
|
-
},
|
|
138
|
-
|
|
139
|
-
setLoading(aborter: AbortController) {
|
|
140
|
-
const { statsFetchInProgress: statsFetch } = self
|
|
141
|
-
if (statsFetch !== undefined && !statsFetch.signal.aborted) {
|
|
142
|
-
statsFetch.abort()
|
|
143
|
-
}
|
|
144
|
-
self.statsFetchInProgress = aborter
|
|
145
|
-
},
|
|
146
|
-
|
|
147
|
-
// this overrides the BaseLinearDisplayModel to avoid popping up a
|
|
148
|
-
// feature detail display, but still sets the feature selection on the
|
|
149
|
-
// model so listeners can detect a click
|
|
150
|
-
selectFeature(feature: Feature) {
|
|
151
|
-
const session = getSession(self)
|
|
152
|
-
if (isSelectionContainer(session)) {
|
|
153
|
-
session.setSelection(feature)
|
|
154
|
-
}
|
|
155
|
-
},
|
|
156
99
|
|
|
100
|
+
/**
|
|
101
|
+
* #action
|
|
102
|
+
*/
|
|
157
103
|
setFeatureUnderMouse(f?: Feature) {
|
|
158
104
|
self.featureUnderMouseVolatile = f
|
|
159
105
|
},
|
|
160
|
-
setResolution(res: number) {
|
|
161
|
-
self.resolution = res
|
|
162
|
-
},
|
|
163
|
-
|
|
164
|
-
setFill(fill: number) {
|
|
165
|
-
if (fill === 0) {
|
|
166
|
-
self.fill = true
|
|
167
|
-
self.minSize = 0
|
|
168
|
-
} else if (fill === 1) {
|
|
169
|
-
self.fill = false
|
|
170
|
-
self.minSize = 1
|
|
171
|
-
} else if (fill === 2) {
|
|
172
|
-
self.fill = false
|
|
173
|
-
self.minSize = 2
|
|
174
|
-
}
|
|
175
|
-
},
|
|
176
|
-
|
|
177
|
-
toggleLogScale() {
|
|
178
|
-
self.scale = self.scale === 'log' ? 'linear' : 'log'
|
|
179
|
-
},
|
|
180
|
-
|
|
181
|
-
setScaleType(scale?: string) {
|
|
182
|
-
self.scale = scale
|
|
183
|
-
},
|
|
184
|
-
|
|
185
|
-
setSummaryScoreMode(val: string) {
|
|
186
|
-
self.summaryScoreMode = val
|
|
187
|
-
},
|
|
188
|
-
|
|
189
|
-
setAutoscale(val: string) {
|
|
190
|
-
self.autoscale = val
|
|
191
|
-
},
|
|
192
|
-
|
|
193
|
-
setMaxScore(val?: number) {
|
|
194
|
-
self.constraints.max = val
|
|
195
|
-
},
|
|
196
|
-
|
|
197
|
-
setRendererType(val: string) {
|
|
198
|
-
self.rendererTypeNameState = val
|
|
199
|
-
},
|
|
200
|
-
|
|
201
|
-
setMinScore(val?: number) {
|
|
202
|
-
self.constraints.min = val
|
|
203
|
-
},
|
|
204
|
-
|
|
205
|
-
toggleCrossHatches() {
|
|
206
|
-
self.displayCrossHatches = !self.displayCrossHatches
|
|
207
|
-
},
|
|
208
|
-
|
|
209
|
-
setCrossHatches(cross: boolean) {
|
|
210
|
-
self.displayCrossHatches = cross
|
|
211
|
-
},
|
|
212
106
|
}))
|
|
213
107
|
.views(self => ({
|
|
108
|
+
/**
|
|
109
|
+
* #getter
|
|
110
|
+
*/
|
|
214
111
|
get featureUnderMouse() {
|
|
215
112
|
return self.featureUnderMouseVolatile
|
|
216
113
|
},
|
|
114
|
+
/**
|
|
115
|
+
* #getter
|
|
116
|
+
*/
|
|
217
117
|
get TooltipComponent() {
|
|
218
118
|
return Tooltip as unknown as React.FC
|
|
219
119
|
},
|
|
220
120
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
get rendererTypeNameSimple() {
|
|
225
|
-
return self.rendererTypeNameState || getConf(self, 'defaultRendering')
|
|
226
|
-
},
|
|
121
|
+
/**
|
|
122
|
+
* #getter
|
|
123
|
+
*/
|
|
227
124
|
get rendererTypeName() {
|
|
228
|
-
const name =
|
|
125
|
+
const name = self.rendererTypeNameSimple
|
|
229
126
|
const rendererType = rendererTypes.get(name)
|
|
230
127
|
if (!rendererType) {
|
|
231
128
|
throw new Error(`unknown renderer ${name}`)
|
|
232
129
|
}
|
|
233
130
|
return rendererType
|
|
234
131
|
},
|
|
235
|
-
|
|
236
|
-
// subclasses can define these, as snpcoverage track does
|
|
237
|
-
get filters() {
|
|
238
|
-
return undefined
|
|
239
|
-
},
|
|
240
|
-
|
|
241
|
-
get scaleType() {
|
|
242
|
-
return self.scale ?? (getConf(self, 'scaleType') as string)
|
|
243
|
-
},
|
|
244
|
-
|
|
245
|
-
get maxScore() {
|
|
246
|
-
return self.constraints.max ?? (getConf(self, 'maxScore') as number)
|
|
247
|
-
},
|
|
248
|
-
|
|
249
|
-
get minScore() {
|
|
250
|
-
return self.constraints.min ?? (getConf(self, 'minScore') as number)
|
|
251
|
-
},
|
|
252
132
|
}))
|
|
253
133
|
.views(self => ({
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
const {
|
|
259
|
-
color,
|
|
260
|
-
displayCrossHatches,
|
|
261
|
-
fill,
|
|
262
|
-
minSize,
|
|
263
|
-
negColor,
|
|
264
|
-
posColor,
|
|
265
|
-
summaryScoreMode,
|
|
266
|
-
scaleType,
|
|
267
|
-
} = self
|
|
268
|
-
|
|
269
|
-
return self.rendererType.configSchema.create(
|
|
270
|
-
{
|
|
271
|
-
...configBlob,
|
|
272
|
-
...(scaleType ? { scaleType } : {}),
|
|
273
|
-
...(fill !== undefined ? { filled: fill } : {}),
|
|
274
|
-
...(displayCrossHatches !== undefined
|
|
275
|
-
? { displayCrossHatches }
|
|
276
|
-
: {}),
|
|
277
|
-
...(summaryScoreMode !== undefined ? { summaryScoreMode } : {}),
|
|
278
|
-
...(color !== undefined ? { color } : {}),
|
|
279
|
-
...(negColor !== undefined ? { negColor } : {}),
|
|
280
|
-
...(posColor !== undefined ? { posColor } : {}),
|
|
281
|
-
...(minSize !== undefined ? { minSize } : {}),
|
|
282
|
-
},
|
|
283
|
-
getEnv(self),
|
|
284
|
-
)
|
|
285
|
-
},
|
|
286
|
-
}))
|
|
287
|
-
.views(self => ({
|
|
288
|
-
// everything except density gets a numerical scalebar
|
|
134
|
+
/**
|
|
135
|
+
* #getter
|
|
136
|
+
*/
|
|
289
137
|
get needsScalebar() {
|
|
290
138
|
return (
|
|
291
139
|
self.rendererTypeName === 'MultiXYPlotRenderer' ||
|
|
@@ -294,14 +142,18 @@ const stateModelFactory = (
|
|
|
294
142
|
self.rendererTypeName === 'MultiRowLineRenderer'
|
|
295
143
|
)
|
|
296
144
|
},
|
|
297
|
-
|
|
145
|
+
/**
|
|
146
|
+
* #getter
|
|
147
|
+
*/
|
|
298
148
|
get needsFullHeightScalebar() {
|
|
299
149
|
return (
|
|
300
150
|
self.rendererTypeName === 'MultiXYPlotRenderer' ||
|
|
301
151
|
self.rendererTypeName === 'MultiLineRenderer'
|
|
302
152
|
)
|
|
303
153
|
},
|
|
304
|
-
|
|
154
|
+
/**
|
|
155
|
+
* #getter
|
|
156
|
+
*/
|
|
305
157
|
get isMultiRow() {
|
|
306
158
|
return (
|
|
307
159
|
self.rendererTypeName === 'MultiRowXYPlotRenderer' ||
|
|
@@ -309,9 +161,11 @@ const stateModelFactory = (
|
|
|
309
161
|
self.rendererTypeName === 'MultiDensityRenderer'
|
|
310
162
|
)
|
|
311
163
|
},
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
164
|
+
/**
|
|
165
|
+
* #getter
|
|
166
|
+
* can be used to give it a "color scale" like a R heatmap, not
|
|
167
|
+
* implemented like this yet but flag can be used for this
|
|
168
|
+
*/
|
|
315
169
|
get needsCustomLegend() {
|
|
316
170
|
return self.rendererTypeName === 'MultiDensityRenderer'
|
|
317
171
|
},
|
|
@@ -322,22 +176,29 @@ const stateModelFactory = (
|
|
|
322
176
|
self.rendererTypeName === 'MultiRowXYPlotRenderer'
|
|
323
177
|
)
|
|
324
178
|
},
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
179
|
+
/**
|
|
180
|
+
* #getter
|
|
181
|
+
* the multirowxy and multiline don't need to use colors on the legend
|
|
182
|
+
* boxes since their track is drawn with the color. sort of a stylistic
|
|
183
|
+
* choice
|
|
184
|
+
*/
|
|
328
185
|
get renderColorBoxes() {
|
|
329
186
|
return !(
|
|
330
187
|
self.rendererTypeName === 'MultiRowLineRenderer' ||
|
|
331
188
|
self.rendererTypeName === 'MultiRowXYPlotRenderer'
|
|
332
189
|
)
|
|
333
190
|
},
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
191
|
+
/**
|
|
192
|
+
* #getter
|
|
193
|
+
* positions multi-row below the tracklabel even if using overlap
|
|
194
|
+
* tracklabels for everything else
|
|
195
|
+
*/
|
|
337
196
|
get prefersOffset() {
|
|
338
197
|
return this.isMultiRow
|
|
339
198
|
},
|
|
340
|
-
|
|
199
|
+
/**
|
|
200
|
+
* #getter
|
|
201
|
+
*/
|
|
341
202
|
get sources() {
|
|
342
203
|
const sources = Object.fromEntries(
|
|
343
204
|
self.sourcesVolatile?.map(s => [s.name, s]) || [],
|
|
@@ -357,82 +218,34 @@ const stateModelFactory = (
|
|
|
357
218
|
},
|
|
358
219
|
}))
|
|
359
220
|
|
|
360
|
-
.views(self => {
|
|
361
|
-
let oldDomain: [number, number] = [0, 0]
|
|
362
|
-
return {
|
|
363
|
-
get filled(): boolean {
|
|
364
|
-
const { fill, rendererConfig } = self
|
|
365
|
-
return fill ?? readConfObject(rendererConfig, 'filled')
|
|
366
|
-
},
|
|
367
|
-
get summaryScoreModeSetting(): string {
|
|
368
|
-
const { summaryScoreMode: scoreMode, rendererConfig } = self
|
|
369
|
-
return scoreMode ?? readConfObject(rendererConfig, 'summaryScoreMode')
|
|
370
|
-
},
|
|
371
|
-
get domain() {
|
|
372
|
-
const { stats, scaleType, minScore, maxScore } = self
|
|
373
|
-
if (!stats) {
|
|
374
|
-
return undefined
|
|
375
|
-
}
|
|
376
|
-
const { scoreMin, scoreMax } = stats
|
|
377
|
-
|
|
378
|
-
const ret = getNiceDomain({
|
|
379
|
-
domain: [scoreMin, scoreMax],
|
|
380
|
-
bounds: [minScore, maxScore],
|
|
381
|
-
scaleType,
|
|
382
|
-
})
|
|
383
|
-
|
|
384
|
-
// avoid weird scalebar if log value and empty region displayed
|
|
385
|
-
if (scaleType === 'log' && ret[1] === Number.MIN_VALUE) {
|
|
386
|
-
return [0, Number.MIN_VALUE]
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
// avoid returning a new object if it matches the old value
|
|
390
|
-
if (!deepEqual(oldDomain, ret)) {
|
|
391
|
-
oldDomain = ret
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
return oldDomain
|
|
395
|
-
},
|
|
396
|
-
|
|
397
|
-
get scaleOpts() {
|
|
398
|
-
const { scaleType, stats } = self
|
|
399
|
-
return {
|
|
400
|
-
autoscaleType: this.autoscaleType,
|
|
401
|
-
domain: this.domain,
|
|
402
|
-
stats,
|
|
403
|
-
scaleType,
|
|
404
|
-
inverted: getConf(self, 'inverted'),
|
|
405
|
-
}
|
|
406
|
-
},
|
|
407
|
-
|
|
408
|
-
get autoscaleType() {
|
|
409
|
-
return self.autoscale ?? (getConf(self, 'autoscale') as string)
|
|
410
|
-
},
|
|
411
|
-
|
|
412
|
-
get displayCrossHatchesSetting() {
|
|
413
|
-
const { displayCrossHatches, rendererConfig } = self
|
|
414
|
-
return (
|
|
415
|
-
displayCrossHatches ??
|
|
416
|
-
(readConfObject(rendererConfig, 'displayCrossHatches') as boolean)
|
|
417
|
-
)
|
|
418
|
-
},
|
|
419
|
-
get rowHeight() {
|
|
420
|
-
const { sources, height, isMultiRow } = self
|
|
421
|
-
return isMultiRow ? height / (sources?.length || 1) : height
|
|
422
|
-
},
|
|
423
|
-
|
|
424
|
-
get rowHeightTooSmallForScalebar() {
|
|
425
|
-
return this.rowHeight < 70
|
|
426
|
-
},
|
|
427
|
-
|
|
428
|
-
get useMinimalTicks() {
|
|
429
|
-
return (
|
|
430
|
-
getConf(self, 'minimalTicks') || this.rowHeightTooSmallForScalebar
|
|
431
|
-
)
|
|
432
|
-
},
|
|
433
|
-
}
|
|
434
|
-
})
|
|
435
221
|
.views(self => ({
|
|
222
|
+
/**
|
|
223
|
+
* #getter
|
|
224
|
+
*/
|
|
225
|
+
get rowHeight() {
|
|
226
|
+
const { sources, height, isMultiRow } = self
|
|
227
|
+
return isMultiRow ? height / (sources?.length || 1) : height
|
|
228
|
+
},
|
|
229
|
+
/**
|
|
230
|
+
* #getter
|
|
231
|
+
*/
|
|
232
|
+
get rowHeightTooSmallForScalebar() {
|
|
233
|
+
return this.rowHeight < 70
|
|
234
|
+
},
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* #getter
|
|
238
|
+
*/
|
|
239
|
+
get useMinimalTicks() {
|
|
240
|
+
return (
|
|
241
|
+
getConf(self, 'minimalTicks') || this.rowHeightTooSmallForScalebar
|
|
242
|
+
)
|
|
243
|
+
},
|
|
244
|
+
}))
|
|
245
|
+
.views(self => ({
|
|
246
|
+
/**
|
|
247
|
+
* #getter
|
|
248
|
+
*/
|
|
436
249
|
get ticks() {
|
|
437
250
|
const { scaleType, domain, isMultiRow, rowHeight, useMinimalTicks } =
|
|
438
251
|
self
|
|
@@ -454,6 +267,9 @@ const stateModelFactory = (
|
|
|
454
267
|
return useMinimalTicks ? { ...ticks, values: domain } : ticks
|
|
455
268
|
},
|
|
456
269
|
|
|
270
|
+
/**
|
|
271
|
+
* #getter
|
|
272
|
+
*/
|
|
457
273
|
get colors() {
|
|
458
274
|
return [
|
|
459
275
|
'red',
|
|
@@ -468,15 +284,13 @@ const stateModelFactory = (
|
|
|
468
284
|
'pink',
|
|
469
285
|
]
|
|
470
286
|
},
|
|
471
|
-
|
|
472
|
-
get adapterCapabilities() {
|
|
473
|
-
const { adapterTypeName } = self
|
|
474
|
-
return pluginManager.getAdapterType(adapterTypeName).adapterCapabilities
|
|
475
|
-
},
|
|
476
287
|
}))
|
|
477
288
|
.views(self => {
|
|
478
289
|
const { renderProps: superRenderProps } = self
|
|
479
290
|
return {
|
|
291
|
+
/**
|
|
292
|
+
* #method
|
|
293
|
+
*/
|
|
480
294
|
renderProps() {
|
|
481
295
|
const superProps = superRenderProps()
|
|
482
296
|
const {
|
|
@@ -510,14 +324,23 @@ const stateModelFactory = (
|
|
|
510
324
|
}
|
|
511
325
|
},
|
|
512
326
|
|
|
327
|
+
/**
|
|
328
|
+
* #getter
|
|
329
|
+
*/
|
|
513
330
|
get hasResolution() {
|
|
514
331
|
return self.adapterCapabilities.includes('hasResolution')
|
|
515
332
|
},
|
|
516
333
|
|
|
334
|
+
/**
|
|
335
|
+
* #getter
|
|
336
|
+
*/
|
|
517
337
|
get hasGlobalStats() {
|
|
518
338
|
return self.adapterCapabilities.includes('hasGlobalStats')
|
|
519
339
|
},
|
|
520
340
|
|
|
341
|
+
/**
|
|
342
|
+
* #getter
|
|
343
|
+
*/
|
|
521
344
|
get fillSetting() {
|
|
522
345
|
if (self.filled) {
|
|
523
346
|
return 0
|
|
@@ -533,35 +356,17 @@ const stateModelFactory = (
|
|
|
533
356
|
const { trackMenuItems: superTrackMenuItems } = self
|
|
534
357
|
const hasRenderings = getConf(self, 'defaultRendering')
|
|
535
358
|
return {
|
|
359
|
+
/**
|
|
360
|
+
* #method
|
|
361
|
+
*/
|
|
536
362
|
trackMenuItems() {
|
|
537
363
|
return [
|
|
538
364
|
...superTrackMenuItems(),
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
{
|
|
545
|
-
label: 'Finer resolution',
|
|
546
|
-
onClick: () => self.setResolution(self.resolution * 5),
|
|
547
|
-
},
|
|
548
|
-
{
|
|
549
|
-
label: 'Coarser resolution',
|
|
550
|
-
onClick: () => self.setResolution(self.resolution / 5),
|
|
551
|
-
},
|
|
552
|
-
],
|
|
553
|
-
},
|
|
554
|
-
{
|
|
555
|
-
label: 'Summary score mode',
|
|
556
|
-
subMenu: ['min', 'max', 'avg', 'whiskers'].map(elt => ({
|
|
557
|
-
label: elt,
|
|
558
|
-
type: 'radio',
|
|
559
|
-
checked: self.summaryScoreModeSetting === elt,
|
|
560
|
-
onClick: () => self.setSummaryScoreMode(elt),
|
|
561
|
-
})),
|
|
562
|
-
},
|
|
563
|
-
]
|
|
564
|
-
: []),
|
|
365
|
+
{
|
|
366
|
+
label: 'Score',
|
|
367
|
+
subMenu: self.scoreTrackMenuItems(),
|
|
368
|
+
},
|
|
369
|
+
|
|
565
370
|
...(self.canHaveFill
|
|
566
371
|
? [
|
|
567
372
|
{
|
|
@@ -577,11 +382,7 @@ const stateModelFactory = (
|
|
|
577
382
|
},
|
|
578
383
|
]
|
|
579
384
|
: []),
|
|
580
|
-
|
|
581
|
-
label:
|
|
582
|
-
self.scaleType === 'log' ? 'Set linear scale' : 'Set log scale',
|
|
583
|
-
onClick: () => self.toggleLogScale(),
|
|
584
|
-
},
|
|
385
|
+
|
|
585
386
|
...(self.needsScalebar
|
|
586
387
|
? [
|
|
587
388
|
{
|
|
@@ -612,36 +413,6 @@ const stateModelFactory = (
|
|
|
612
413
|
]
|
|
613
414
|
: []),
|
|
614
415
|
|
|
615
|
-
{
|
|
616
|
-
label: 'Autoscale type',
|
|
617
|
-
subMenu: [
|
|
618
|
-
['local', 'Local'],
|
|
619
|
-
...(self.hasGlobalStats
|
|
620
|
-
? [
|
|
621
|
-
['global', 'Global'],
|
|
622
|
-
['globalsd', 'Global ± 3σ'],
|
|
623
|
-
]
|
|
624
|
-
: []),
|
|
625
|
-
['localsd', 'Local ± 3σ'],
|
|
626
|
-
].map(([val, label]) => {
|
|
627
|
-
return {
|
|
628
|
-
label,
|
|
629
|
-
type: 'radio',
|
|
630
|
-
checked: self.autoscaleType === val,
|
|
631
|
-
onClick: () => self.setAutoscale(val),
|
|
632
|
-
}
|
|
633
|
-
}),
|
|
634
|
-
},
|
|
635
|
-
{
|
|
636
|
-
label: 'Set min/max score...',
|
|
637
|
-
onClick: () => {
|
|
638
|
-
const session = getSession(self)
|
|
639
|
-
session.queueDialog(handleClose => [
|
|
640
|
-
SetMinMaxDlg,
|
|
641
|
-
{ model: self, handleClose },
|
|
642
|
-
])
|
|
643
|
-
},
|
|
644
|
-
},
|
|
645
416
|
{
|
|
646
417
|
label: 'Edit colors/arrangement...',
|
|
647
418
|
onClick: () => {
|
|
@@ -656,15 +427,8 @@ const stateModelFactory = (
|
|
|
656
427
|
}
|
|
657
428
|
})
|
|
658
429
|
.actions(self => {
|
|
659
|
-
const {
|
|
660
|
-
|
|
661
|
-
type ExportSvgOpts = Parameters<typeof superRenderSvg>[0]
|
|
662
|
-
|
|
430
|
+
const { renderSvg: superRenderSvg } = self
|
|
663
431
|
return {
|
|
664
|
-
async reload() {
|
|
665
|
-
self.setError()
|
|
666
|
-
superReload()
|
|
667
|
-
},
|
|
668
432
|
afterAttach() {
|
|
669
433
|
quantitativeStatsAutorun(self)
|
|
670
434
|
addDisposer(
|
|
@@ -687,20 +451,17 @@ const stateModelFactory = (
|
|
|
687
451
|
}),
|
|
688
452
|
)
|
|
689
453
|
},
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
<StatBars model={self} orientation="left" exportSVG />
|
|
698
|
-
</g>
|
|
699
|
-
</>
|
|
700
|
-
)
|
|
454
|
+
|
|
455
|
+
/**
|
|
456
|
+
* #action
|
|
457
|
+
*/
|
|
458
|
+
async renderSvg(opts: ExportSvgDisplayOptions) {
|
|
459
|
+
const { renderSvg } = await import('./renderSvg')
|
|
460
|
+
return renderSvg(self, opts, superRenderSvg)
|
|
701
461
|
},
|
|
702
462
|
}
|
|
703
463
|
})
|
|
464
|
+
}
|
|
704
465
|
|
|
705
466
|
export type WiggleDisplayStateModel = ReturnType<typeof stateModelFactory>
|
|
706
467
|
export type WiggleDisplayModel = Instance<WiggleDisplayStateModel>
|