@jbrowse/plugin-wiggle 2.4.2 → 2.5.0
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.d.ts +2 -2
- package/dist/BigWigAdapter/BigWigAdapter.js +2 -2
- package/dist/BigWigAdapter/BigWigAdapter.js.map +1 -1
- package/dist/BigWigAdapter/configSchema.d.ts +20 -1
- package/dist/CreateMultiWiggleExtension/ConfirmDialog.d.ts +0 -1
- package/dist/DensityRenderer/configSchema.d.ts +33 -1
- package/dist/LinePlotRenderer/configSchema.d.ts +44 -1
- package/dist/LinearWiggleDisplay/components/SetColorDialog.d.ts +0 -1
- package/dist/LinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +0 -1
- package/dist/LinearWiggleDisplay/models/configSchema.d.ts +98 -1
- package/dist/LinearWiggleDisplay/models/model.d.ts +82 -35
- package/dist/LinearWiggleDisplay/models/model.js +8 -25
- package/dist/LinearWiggleDisplay/models/model.js.map +1 -1
- package/dist/MultiDensityRenderer/configSchema.d.ts +33 -1
- package/dist/MultiLineRenderer/configSchema.d.ts +51 -1
- package/dist/MultiLinearWiggleDisplay/components/DraggableDialog.d.ts +0 -1
- package/dist/MultiLinearWiggleDisplay/components/SetColorDialog.d.ts +0 -1
- package/dist/MultiLinearWiggleDisplay/components/SetColorDialog.js +36 -37
- package/dist/MultiLinearWiggleDisplay/components/SetColorDialog.js.map +1 -1
- package/dist/MultiLinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +0 -1
- package/dist/MultiLinearWiggleDisplay/models/configSchema.d.ts +107 -1
- package/dist/MultiLinearWiggleDisplay/models/model.d.ts +58 -11
- package/dist/MultiLinearWiggleDisplay/models/model.js +3 -19
- package/dist/MultiLinearWiggleDisplay/models/model.js.map +1 -1
- package/dist/MultiQuantitativeTrack/configSchema.d.ts +73 -1
- package/dist/MultiRowLineRenderer/configSchema.d.ts +51 -1
- package/dist/MultiRowXYPlotRenderer/configSchema.d.ts +68 -1
- package/dist/MultiWiggleAdapter/MultiWiggleAdapter.d.ts +1 -1
- package/dist/MultiWiggleAdapter/MultiWiggleAdapter.js +2 -2
- package/dist/MultiWiggleAdapter/MultiWiggleAdapter.js.map +1 -1
- package/dist/MultiWiggleAdapter/configSchema.d.ts +18 -1
- package/dist/MultiWiggleAddTrackWidget/AddTrackWorkflow.d.ts +0 -1
- package/dist/MultiWiggleRendering.d.ts +0 -1
- package/dist/MultiXYPlotRenderer/configSchema.d.ts +65 -1
- package/dist/QuantitativeTrack/configSchema.d.ts +73 -1
- package/dist/WiggleRPC/MultiWiggleGetSources.d.ts +21 -0
- package/dist/WiggleRPC/MultiWiggleGetSources.js +51 -0
- package/dist/WiggleRPC/MultiWiggleGetSources.js.map +1 -0
- package/dist/WiggleRPC/WiggleGetGlobalQuantitativeStats.d.ts +14 -0
- package/dist/WiggleRPC/WiggleGetGlobalQuantitativeStats.js +37 -0
- package/dist/WiggleRPC/WiggleGetGlobalQuantitativeStats.js.map +1 -0
- package/dist/WiggleRPC/WiggleGetMultiRegionQuantitativeStats.d.ts +20 -0
- package/dist/WiggleRPC/WiggleGetMultiRegionQuantitativeStats.js +54 -0
- package/dist/WiggleRPC/WiggleGetMultiRegionQuantitativeStats.js.map +1 -0
- package/dist/WiggleRPC/rpcMethods.d.ts +3 -47
- package/dist/WiggleRPC/rpcMethods.js +16 -117
- package/dist/WiggleRPC/rpcMethods.js.map +1 -1
- package/dist/WiggleRendering.d.ts +0 -1
- package/dist/XYPlotRenderer/configSchema.d.ts +65 -1
- package/dist/configSchema.d.ts +51 -1
- package/dist/index.d.ts +148 -23
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/shared/SetMinMaxDialog.d.ts +0 -1
- package/dist/shared/YScaleBar.d.ts +0 -1
- package/dist/util.d.ts +9 -6
- package/dist/util.js +13 -12
- package/dist/util.js.map +1 -1
- package/esm/BigWigAdapter/BigWigAdapter.d.ts +2 -2
- package/esm/BigWigAdapter/BigWigAdapter.js +4 -3
- package/esm/BigWigAdapter/BigWigAdapter.js.map +1 -1
- package/esm/BigWigAdapter/configSchema.d.ts +20 -1
- package/esm/CreateMultiWiggleExtension/ConfirmDialog.d.ts +0 -1
- package/esm/DensityRenderer/configSchema.d.ts +33 -1
- package/esm/LinePlotRenderer/configSchema.d.ts +44 -1
- package/esm/LinearWiggleDisplay/components/SetColorDialog.d.ts +0 -1
- package/esm/LinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +0 -1
- package/esm/LinearWiggleDisplay/models/configSchema.d.ts +98 -1
- package/esm/LinearWiggleDisplay/models/model.d.ts +82 -35
- package/esm/LinearWiggleDisplay/models/model.js +10 -27
- package/esm/LinearWiggleDisplay/models/model.js.map +1 -1
- package/esm/MultiDensityRenderer/configSchema.d.ts +33 -1
- package/esm/MultiLineRenderer/configSchema.d.ts +51 -1
- package/esm/MultiLinearWiggleDisplay/components/DraggableDialog.d.ts +0 -1
- package/esm/MultiLinearWiggleDisplay/components/SetColorDialog.d.ts +0 -1
- package/esm/MultiLinearWiggleDisplay/components/SetColorDialog.js +36 -37
- package/esm/MultiLinearWiggleDisplay/components/SetColorDialog.js.map +1 -1
- package/esm/MultiLinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +0 -1
- package/esm/MultiLinearWiggleDisplay/models/configSchema.d.ts +107 -1
- package/esm/MultiLinearWiggleDisplay/models/model.d.ts +58 -11
- package/esm/MultiLinearWiggleDisplay/models/model.js +4 -20
- package/esm/MultiLinearWiggleDisplay/models/model.js.map +1 -1
- package/esm/MultiQuantitativeTrack/configSchema.d.ts +73 -1
- package/esm/MultiRowLineRenderer/configSchema.d.ts +51 -1
- package/esm/MultiRowXYPlotRenderer/configSchema.d.ts +68 -1
- package/esm/MultiWiggleAdapter/MultiWiggleAdapter.d.ts +1 -1
- package/esm/MultiWiggleAdapter/MultiWiggleAdapter.js +3 -2
- package/esm/MultiWiggleAdapter/MultiWiggleAdapter.js.map +1 -1
- package/esm/MultiWiggleAdapter/configSchema.d.ts +18 -1
- package/esm/MultiWiggleAddTrackWidget/AddTrackWorkflow.d.ts +0 -1
- package/esm/MultiWiggleRendering.d.ts +0 -1
- package/esm/MultiXYPlotRenderer/configSchema.d.ts +65 -1
- package/esm/QuantitativeTrack/configSchema.d.ts +73 -1
- package/esm/WiggleRPC/MultiWiggleGetSources.d.ts +21 -0
- package/esm/WiggleRPC/MultiWiggleGetSources.js +44 -0
- package/esm/WiggleRPC/MultiWiggleGetSources.js.map +1 -0
- package/esm/WiggleRPC/WiggleGetGlobalQuantitativeStats.d.ts +14 -0
- package/esm/WiggleRPC/WiggleGetGlobalQuantitativeStats.js +30 -0
- package/esm/WiggleRPC/WiggleGetGlobalQuantitativeStats.js.map +1 -0
- package/esm/WiggleRPC/WiggleGetMultiRegionQuantitativeStats.d.ts +20 -0
- package/esm/WiggleRPC/WiggleGetMultiRegionQuantitativeStats.js +47 -0
- package/esm/WiggleRPC/WiggleGetMultiRegionQuantitativeStats.js.map +1 -0
- package/esm/WiggleRPC/rpcMethods.d.ts +3 -47
- package/esm/WiggleRPC/rpcMethods.js +3 -111
- package/esm/WiggleRPC/rpcMethods.js.map +1 -1
- package/esm/WiggleRendering.d.ts +0 -1
- package/esm/XYPlotRenderer/configSchema.d.ts +65 -1
- package/esm/configSchema.d.ts +51 -1
- package/esm/index.d.ts +148 -23
- package/esm/index.js +3 -3
- package/esm/index.js.map +1 -1
- package/esm/shared/SetMinMaxDialog.d.ts +0 -1
- package/esm/shared/YScaleBar.d.ts +0 -1
- package/esm/util.d.ts +9 -6
- package/esm/util.js +10 -9
- package/esm/util.js.map +1 -1
- package/package.json +3 -3
- package/src/BigWigAdapter/BigWigAdapter.test.ts +8 -3
- package/src/BigWigAdapter/BigWigAdapter.ts +6 -3
- package/src/LinearWiggleDisplay/models/model.tsx +11 -29
- package/src/MultiLinearWiggleDisplay/components/SetColorDialog.tsx +53 -50
- package/src/MultiLinearWiggleDisplay/models/model.tsx +4 -20
- package/src/MultiWiggleAdapter/MultiWiggleAdapter.ts +1 -1
- package/src/WiggleRPC/MultiWiggleGetSources.ts +68 -0
- package/src/WiggleRPC/WiggleGetGlobalQuantitativeStats.ts +44 -0
- package/src/WiggleRPC/WiggleGetMultiRegionQuantitativeStats.ts +73 -0
- package/src/WiggleRPC/rpcMethods.ts +3 -170
- package/src/index.ts +4 -4
- package/src/util.ts +24 -17
|
@@ -129,6 +129,11 @@ export default function SetColorDialog({
|
|
|
129
129
|
)
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
+
interface SortField {
|
|
133
|
+
idx: number
|
|
134
|
+
field: string | null
|
|
135
|
+
}
|
|
136
|
+
|
|
132
137
|
function SourcesGrid({
|
|
133
138
|
rows,
|
|
134
139
|
onChange,
|
|
@@ -143,53 +148,11 @@ function SourcesGrid({
|
|
|
143
148
|
|
|
144
149
|
// @ts-expect-error
|
|
145
150
|
const { name: _name, color: _color, baseUri: _baseUri, ...rest } = rows[0]
|
|
146
|
-
|
|
147
|
-
// similar to BaseFeatureDetail data-grid for auto-measuring columns
|
|
148
|
-
const columns = [
|
|
149
|
-
{
|
|
150
|
-
field: 'color',
|
|
151
|
-
headerName: 'Color',
|
|
152
|
-
renderCell: (params: GridCellParams) => {
|
|
153
|
-
const { value, id } = params
|
|
154
|
-
return (
|
|
155
|
-
<ColorPicker
|
|
156
|
-
color={value || 'blue'}
|
|
157
|
-
onChange={c => {
|
|
158
|
-
const elt = rows.find(f => f.name === id)
|
|
159
|
-
if (elt) {
|
|
160
|
-
elt.color = c
|
|
161
|
-
}
|
|
162
|
-
onChange([...rows])
|
|
163
|
-
}}
|
|
164
|
-
/>
|
|
165
|
-
)
|
|
166
|
-
},
|
|
167
|
-
},
|
|
168
|
-
{
|
|
169
|
-
field: 'name',
|
|
170
|
-
sortingOrder: [null],
|
|
171
|
-
headerName: 'Name',
|
|
172
|
-
width: measureGridWidth(rows.map(r => r.name)),
|
|
173
|
-
},
|
|
174
|
-
...Object.keys(rest).map(val => ({
|
|
175
|
-
field: val,
|
|
176
|
-
sortingOrder: [null],
|
|
177
|
-
renderCell: (params: GridCellParams) => {
|
|
178
|
-
const { value } = params
|
|
179
|
-
return isUriLocation(value) ? <UriLink value={value} /> : getStr(value)
|
|
180
|
-
},
|
|
181
|
-
// @ts-expect-error
|
|
182
|
-
width: measureGridWidth(rows.map(r => r[val])),
|
|
183
|
-
})),
|
|
184
|
-
]
|
|
185
|
-
|
|
186
|
-
// this helps keep track of the selection, even though it is not used
|
|
187
|
-
// anywhere except inside the picker
|
|
188
151
|
const [widgetColor, setWidgetColor] = useState('blue')
|
|
189
|
-
const [currSort, setCurrSort] = useState<{
|
|
190
|
-
idx:
|
|
191
|
-
field:
|
|
192
|
-
}
|
|
152
|
+
const [currSort, setCurrSort] = useState<SortField>({
|
|
153
|
+
idx: 0,
|
|
154
|
+
field: null,
|
|
155
|
+
})
|
|
193
156
|
|
|
194
157
|
return (
|
|
195
158
|
<div>
|
|
@@ -247,12 +210,52 @@ function SourcesGrid({
|
|
|
247
210
|
<DataGrid
|
|
248
211
|
getRowId={row => row.name}
|
|
249
212
|
checkboxSelection
|
|
250
|
-
|
|
251
|
-
|
|
213
|
+
disableRowSelectionOnClick
|
|
214
|
+
onRowSelectionModelChange={arg => setSelected(arg as string[])}
|
|
252
215
|
rows={rows}
|
|
253
216
|
rowHeight={25}
|
|
254
|
-
|
|
255
|
-
columns={
|
|
217
|
+
columnHeaderHeight={33}
|
|
218
|
+
columns={[
|
|
219
|
+
{
|
|
220
|
+
field: 'color',
|
|
221
|
+
headerName: 'Color',
|
|
222
|
+
renderCell: params => {
|
|
223
|
+
const { value, id } = params
|
|
224
|
+
return (
|
|
225
|
+
<ColorPicker
|
|
226
|
+
color={value || 'blue'}
|
|
227
|
+
onChange={c => {
|
|
228
|
+
const elt = rows.find(f => f.name === id)
|
|
229
|
+
if (elt) {
|
|
230
|
+
elt.color = c
|
|
231
|
+
}
|
|
232
|
+
onChange([...rows])
|
|
233
|
+
}}
|
|
234
|
+
/>
|
|
235
|
+
)
|
|
236
|
+
},
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
field: 'name',
|
|
240
|
+
sortingOrder: [null],
|
|
241
|
+
headerName: 'Name',
|
|
242
|
+
width: measureGridWidth(rows.map(r => r.name)),
|
|
243
|
+
},
|
|
244
|
+
...Object.keys(rest).map(val => ({
|
|
245
|
+
field: val,
|
|
246
|
+
sortingOrder: [null],
|
|
247
|
+
renderCell: (params: GridCellParams) => {
|
|
248
|
+
const { value } = params
|
|
249
|
+
return isUriLocation(value) ? (
|
|
250
|
+
<UriLink value={value} />
|
|
251
|
+
) : (
|
|
252
|
+
getStr(value)
|
|
253
|
+
)
|
|
254
|
+
},
|
|
255
|
+
// @ts-ignore
|
|
256
|
+
width: measureGridWidth(rows.map(r => r[val])),
|
|
257
|
+
})),
|
|
258
|
+
]}
|
|
256
259
|
sortModel={
|
|
257
260
|
[
|
|
258
261
|
/* we control the sort as a controlled component using onSortModelChange */
|
|
@@ -30,8 +30,7 @@ import {
|
|
|
30
30
|
import {
|
|
31
31
|
getNiceDomain,
|
|
32
32
|
getScale,
|
|
33
|
-
|
|
34
|
-
statsAutorun,
|
|
33
|
+
quantitativeStatsAutorun,
|
|
35
34
|
YSCALEBAR_LABEL_OFFSET,
|
|
36
35
|
} from '../../util'
|
|
37
36
|
|
|
@@ -110,7 +109,7 @@ const stateModelFactory = (
|
|
|
110
109
|
clearLayout() {
|
|
111
110
|
self.layout = []
|
|
112
111
|
},
|
|
113
|
-
|
|
112
|
+
updateQuantitativeStats(stats: { scoreMin: number; scoreMax: number }) {
|
|
114
113
|
const { scoreMin, scoreMax } = stats
|
|
115
114
|
const EPSILON = 0.000001
|
|
116
115
|
if (!self.stats) {
|
|
@@ -662,27 +661,12 @@ const stateModelFactory = (
|
|
|
662
661
|
type ExportSvgOpts = Parameters<typeof superRenderSvg>[0]
|
|
663
662
|
|
|
664
663
|
return {
|
|
665
|
-
// re-runs stats and refresh whole display on reload
|
|
666
664
|
async reload() {
|
|
667
665
|
self.setError()
|
|
668
|
-
|
|
669
|
-
let stats
|
|
670
|
-
try {
|
|
671
|
-
self.setLoading(aborter)
|
|
672
|
-
stats = await getStats(self, {
|
|
673
|
-
signal: aborter.signal,
|
|
674
|
-
...self.renderProps(),
|
|
675
|
-
})
|
|
676
|
-
if (isAlive(self)) {
|
|
677
|
-
self.updateStats(stats)
|
|
678
|
-
superReload()
|
|
679
|
-
}
|
|
680
|
-
} catch (e) {
|
|
681
|
-
self.setError(e)
|
|
682
|
-
}
|
|
666
|
+
superReload()
|
|
683
667
|
},
|
|
684
668
|
afterAttach() {
|
|
685
|
-
|
|
669
|
+
quantitativeStatsAutorun(self)
|
|
686
670
|
addDisposer(
|
|
687
671
|
self,
|
|
688
672
|
autorun(async () => {
|
|
@@ -106,7 +106,7 @@ export default class MultiWiggleAdapter extends BaseFeatureDataAdapter {
|
|
|
106
106
|
}
|
|
107
107
|
|
|
108
108
|
// always render bigwig instead of calculating a feature density for it
|
|
109
|
-
async
|
|
109
|
+
async getMultiRegionFeatureDensityStats(_regions: Region[]) {
|
|
110
110
|
return { featureDensity: 0 }
|
|
111
111
|
}
|
|
112
112
|
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import RpcMethodType from '@jbrowse/core/pluggableElementTypes/RpcMethodType'
|
|
2
|
+
import SerializableFilterChain from '@jbrowse/core/pluggableElementTypes/renderers/util/serializableFilterChain'
|
|
3
|
+
import { getAdapter } from '@jbrowse/core/data_adapters/dataAdapterCache'
|
|
4
|
+
import { RenderArgs } from '@jbrowse/core/rpc/coreRpcMethods'
|
|
5
|
+
import { renameRegionsIfNeeded, Region } from '@jbrowse/core/util'
|
|
6
|
+
import { RemoteAbortSignal } from '@jbrowse/core/rpc/remoteAbortSignals'
|
|
7
|
+
import { AnyConfigurationModel } from '@jbrowse/core/configuration'
|
|
8
|
+
|
|
9
|
+
export class MultiWiggleGetSources extends RpcMethodType {
|
|
10
|
+
name = 'MultiWiggleGetSources'
|
|
11
|
+
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
13
|
+
async deserializeArguments(args: any, rpcDriverClassName: string) {
|
|
14
|
+
const l = await super.deserializeArguments(args, rpcDriverClassName)
|
|
15
|
+
return {
|
|
16
|
+
...l,
|
|
17
|
+
filters: args.filters
|
|
18
|
+
? new SerializableFilterChain({
|
|
19
|
+
filters: args.filters,
|
|
20
|
+
})
|
|
21
|
+
: undefined,
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async serializeArguments(
|
|
26
|
+
args: RenderArgs & {
|
|
27
|
+
signal?: AbortSignal
|
|
28
|
+
statusCallback?: (arg: string) => void
|
|
29
|
+
},
|
|
30
|
+
rpcDriverClassName: string,
|
|
31
|
+
) {
|
|
32
|
+
const pm = this.pluginManager
|
|
33
|
+
const assemblyManager = pm.rootModel?.session?.assemblyManager
|
|
34
|
+
if (!assemblyManager) {
|
|
35
|
+
return args
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const renamedArgs = await renameRegionsIfNeeded(assemblyManager, {
|
|
39
|
+
...args,
|
|
40
|
+
filters: args.filters?.toJSON().filters,
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
return super.serializeArguments(renamedArgs, rpcDriverClassName)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async execute(
|
|
47
|
+
args: {
|
|
48
|
+
adapterConfig: AnyConfigurationModel
|
|
49
|
+
signal?: RemoteAbortSignal
|
|
50
|
+
sessionId: string
|
|
51
|
+
headers?: Record<string, string>
|
|
52
|
+
regions: Region[]
|
|
53
|
+
bpPerPx: number
|
|
54
|
+
},
|
|
55
|
+
rpcDriverClassName: string,
|
|
56
|
+
) {
|
|
57
|
+
const pm = this.pluginManager
|
|
58
|
+
const deserializedArgs = await this.deserializeArguments(
|
|
59
|
+
args,
|
|
60
|
+
rpcDriverClassName,
|
|
61
|
+
)
|
|
62
|
+
const { regions, adapterConfig, sessionId } = deserializedArgs
|
|
63
|
+
const { dataAdapter } = await getAdapter(pm, sessionId, adapterConfig)
|
|
64
|
+
|
|
65
|
+
// @ts-expect-error
|
|
66
|
+
return dataAdapter.getSources(regions, deserializedArgs)
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import RpcMethodType from '@jbrowse/core/pluggableElementTypes/RpcMethodType'
|
|
2
|
+
import SerializableFilterChain from '@jbrowse/core/pluggableElementTypes/renderers/util/serializableFilterChain'
|
|
3
|
+
import { getAdapter } from '@jbrowse/core/data_adapters/dataAdapterCache'
|
|
4
|
+
import { RemoteAbortSignal } from '@jbrowse/core/rpc/remoteAbortSignals'
|
|
5
|
+
import { QuantitativeStats } from '@jbrowse/core/util/stats'
|
|
6
|
+
import { AnyConfigurationModel } from '@jbrowse/core/configuration'
|
|
7
|
+
|
|
8
|
+
export class WiggleGetGlobalQuantitativeStats extends RpcMethodType {
|
|
9
|
+
name = 'WiggleGetGlobalQuantitativeStats'
|
|
10
|
+
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
|
+
async deserializeArguments(args: any, rpcDriverClassName: string) {
|
|
13
|
+
const l = await super.deserializeArguments(args, rpcDriverClassName)
|
|
14
|
+
return {
|
|
15
|
+
...l,
|
|
16
|
+
filters: args.filters
|
|
17
|
+
? new SerializableFilterChain({
|
|
18
|
+
filters: args.filters,
|
|
19
|
+
})
|
|
20
|
+
: undefined,
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async execute(
|
|
25
|
+
args: {
|
|
26
|
+
adapterConfig: AnyConfigurationModel
|
|
27
|
+
signal?: RemoteAbortSignal
|
|
28
|
+
headers?: Record<string, string>
|
|
29
|
+
sessionId: string
|
|
30
|
+
},
|
|
31
|
+
rpcDriverClassName: string,
|
|
32
|
+
): Promise<QuantitativeStats> {
|
|
33
|
+
const pm = this.pluginManager
|
|
34
|
+
const deserializedArgs = await this.deserializeArguments(
|
|
35
|
+
args,
|
|
36
|
+
rpcDriverClassName,
|
|
37
|
+
)
|
|
38
|
+
const { adapterConfig, sessionId } = deserializedArgs
|
|
39
|
+
const { dataAdapter } = await getAdapter(pm, sessionId, adapterConfig)
|
|
40
|
+
|
|
41
|
+
// @ts-expect-error
|
|
42
|
+
return dataAdapter.getGlobalStats(deserializedArgs)
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import RpcMethodType from '@jbrowse/core/pluggableElementTypes/RpcMethodType'
|
|
2
|
+
import SerializableFilterChain from '@jbrowse/core/pluggableElementTypes/renderers/util/serializableFilterChain'
|
|
3
|
+
import { RenderArgs } from '@jbrowse/core/rpc/coreRpcMethods'
|
|
4
|
+
import { getAdapter } from '@jbrowse/core/data_adapters/dataAdapterCache'
|
|
5
|
+
import { RemoteAbortSignal } from '@jbrowse/core/rpc/remoteAbortSignals'
|
|
6
|
+
import { Region, renameRegionsIfNeeded } from '@jbrowse/core/util'
|
|
7
|
+
import { BaseFeatureDataAdapter } from '@jbrowse/core/data_adapters/BaseAdapter'
|
|
8
|
+
|
|
9
|
+
export class WiggleGetMultiRegionQuantitativeStats extends RpcMethodType {
|
|
10
|
+
name = 'WiggleGetMultiRegionQuantitativeStats'
|
|
11
|
+
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
13
|
+
async deserializeArguments(args: any, rpcDriverClassName: string) {
|
|
14
|
+
const l = await super.deserializeArguments(args, rpcDriverClassName)
|
|
15
|
+
return {
|
|
16
|
+
...l,
|
|
17
|
+
filters: args.filters
|
|
18
|
+
? new SerializableFilterChain({
|
|
19
|
+
filters: args.filters,
|
|
20
|
+
})
|
|
21
|
+
: undefined,
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async serializeArguments(
|
|
26
|
+
args: RenderArgs & {
|
|
27
|
+
signal?: AbortSignal
|
|
28
|
+
statusCallback?: (arg: string) => void
|
|
29
|
+
},
|
|
30
|
+
rpcDriverClassName: string,
|
|
31
|
+
) {
|
|
32
|
+
const pm = this.pluginManager
|
|
33
|
+
const assemblyManager = pm.rootModel?.session?.assemblyManager
|
|
34
|
+
if (!assemblyManager) {
|
|
35
|
+
return args
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const renamedArgs = await renameRegionsIfNeeded(assemblyManager, {
|
|
39
|
+
...args,
|
|
40
|
+
filters: args.filters?.toJSON().filters,
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
return super.serializeArguments(renamedArgs, rpcDriverClassName)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async execute(
|
|
47
|
+
args: {
|
|
48
|
+
adapterConfig: {}
|
|
49
|
+
signal?: RemoteAbortSignal
|
|
50
|
+
sessionId: string
|
|
51
|
+
headers?: Record<string, string>
|
|
52
|
+
regions: Region[]
|
|
53
|
+
bpPerPx: number
|
|
54
|
+
},
|
|
55
|
+
rpcDriverClassName: string,
|
|
56
|
+
) {
|
|
57
|
+
const pm = this.pluginManager
|
|
58
|
+
const deserializedArgs = await this.deserializeArguments(
|
|
59
|
+
args,
|
|
60
|
+
rpcDriverClassName,
|
|
61
|
+
)
|
|
62
|
+
const { regions, adapterConfig, sessionId } = deserializedArgs
|
|
63
|
+
const { dataAdapter } = await getAdapter(pm, sessionId, adapterConfig)
|
|
64
|
+
|
|
65
|
+
if (dataAdapter instanceof BaseFeatureDataAdapter) {
|
|
66
|
+
return dataAdapter.getMultiRegionQuantitativeStats(
|
|
67
|
+
regions,
|
|
68
|
+
deserializedArgs,
|
|
69
|
+
)
|
|
70
|
+
}
|
|
71
|
+
throw new Error('Data adapter not found')
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -1,170 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import { RenderArgs } from '@jbrowse/core/rpc/coreRpcMethods'
|
|
5
|
-
import { renameRegionsIfNeeded, Region } from '@jbrowse/core/util'
|
|
6
|
-
import { RemoteAbortSignal } from '@jbrowse/core/rpc/remoteAbortSignals'
|
|
7
|
-
import { BaseFeatureDataAdapter } from '@jbrowse/core/data_adapters/BaseAdapter'
|
|
8
|
-
import { FeatureStats } from '@jbrowse/core/util/stats'
|
|
9
|
-
|
|
10
|
-
export class WiggleGetGlobalStats extends RpcMethodType {
|
|
11
|
-
name = 'WiggleGetGlobalStats'
|
|
12
|
-
|
|
13
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
14
|
-
async deserializeArguments(args: any, rpcDriverClassName: string) {
|
|
15
|
-
const l = await super.deserializeArguments(args, rpcDriverClassName)
|
|
16
|
-
return {
|
|
17
|
-
...l,
|
|
18
|
-
filters: args.filters
|
|
19
|
-
? new SerializableFilterChain({
|
|
20
|
-
filters: args.filters,
|
|
21
|
-
})
|
|
22
|
-
: undefined,
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
async execute(
|
|
27
|
-
args: {
|
|
28
|
-
adapterConfig: {}
|
|
29
|
-
signal?: RemoteAbortSignal
|
|
30
|
-
headers?: Record<string, string>
|
|
31
|
-
sessionId: string
|
|
32
|
-
},
|
|
33
|
-
rpcDriverClassName: string,
|
|
34
|
-
): Promise<FeatureStats> {
|
|
35
|
-
const pm = this.pluginManager
|
|
36
|
-
const deserializedArgs = await this.deserializeArguments(
|
|
37
|
-
args,
|
|
38
|
-
rpcDriverClassName,
|
|
39
|
-
)
|
|
40
|
-
const { adapterConfig, sessionId } = deserializedArgs
|
|
41
|
-
const { dataAdapter } = await getAdapter(pm, sessionId, adapterConfig)
|
|
42
|
-
|
|
43
|
-
// @ts-expect-error
|
|
44
|
-
return dataAdapter.getGlobalStats(deserializedArgs)
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export class WiggleGetMultiRegionStats extends RpcMethodType {
|
|
49
|
-
name = 'WiggleGetMultiRegionStats'
|
|
50
|
-
|
|
51
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
52
|
-
async deserializeArguments(args: any, rpcDriverClassName: string) {
|
|
53
|
-
const l = await super.deserializeArguments(args, rpcDriverClassName)
|
|
54
|
-
return {
|
|
55
|
-
...l,
|
|
56
|
-
filters: args.filters
|
|
57
|
-
? new SerializableFilterChain({
|
|
58
|
-
filters: args.filters,
|
|
59
|
-
})
|
|
60
|
-
: undefined,
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
async serializeArguments(
|
|
65
|
-
args: RenderArgs & {
|
|
66
|
-
signal?: AbortSignal
|
|
67
|
-
statusCallback?: (arg: string) => void
|
|
68
|
-
},
|
|
69
|
-
rpcDriverClassName: string,
|
|
70
|
-
) {
|
|
71
|
-
const pm = this.pluginManager
|
|
72
|
-
const assemblyManager = pm.rootModel?.session?.assemblyManager
|
|
73
|
-
if (!assemblyManager) {
|
|
74
|
-
return args
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
const renamedArgs = await renameRegionsIfNeeded(assemblyManager, {
|
|
78
|
-
...args,
|
|
79
|
-
filters: args.filters?.toJSON().filters,
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
return super.serializeArguments(renamedArgs, rpcDriverClassName)
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
async execute(
|
|
86
|
-
args: {
|
|
87
|
-
adapterConfig: {}
|
|
88
|
-
signal?: RemoteAbortSignal
|
|
89
|
-
sessionId: string
|
|
90
|
-
headers?: Record<string, string>
|
|
91
|
-
regions: Region[]
|
|
92
|
-
bpPerPx: number
|
|
93
|
-
},
|
|
94
|
-
rpcDriverClassName: string,
|
|
95
|
-
) {
|
|
96
|
-
const pm = this.pluginManager
|
|
97
|
-
const deserializedArgs = await this.deserializeArguments(
|
|
98
|
-
args,
|
|
99
|
-
rpcDriverClassName,
|
|
100
|
-
)
|
|
101
|
-
const { regions, adapterConfig, sessionId } = deserializedArgs
|
|
102
|
-
const { dataAdapter } = await getAdapter(pm, sessionId, adapterConfig)
|
|
103
|
-
|
|
104
|
-
if (dataAdapter instanceof BaseFeatureDataAdapter) {
|
|
105
|
-
return dataAdapter.getMultiRegionStats(regions, deserializedArgs)
|
|
106
|
-
}
|
|
107
|
-
throw new Error('Data adapter not found')
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
export class MultiWiggleGetSources extends RpcMethodType {
|
|
112
|
-
name = 'MultiWiggleGetSources'
|
|
113
|
-
|
|
114
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
115
|
-
async deserializeArguments(args: any, rpcDriverClassName: string) {
|
|
116
|
-
const l = await super.deserializeArguments(args, rpcDriverClassName)
|
|
117
|
-
return {
|
|
118
|
-
...l,
|
|
119
|
-
filters: args.filters
|
|
120
|
-
? new SerializableFilterChain({
|
|
121
|
-
filters: args.filters,
|
|
122
|
-
})
|
|
123
|
-
: undefined,
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
async serializeArguments(
|
|
128
|
-
args: RenderArgs & {
|
|
129
|
-
signal?: AbortSignal
|
|
130
|
-
statusCallback?: (arg: string) => void
|
|
131
|
-
},
|
|
132
|
-
rpcDriverClassName: string,
|
|
133
|
-
) {
|
|
134
|
-
const pm = this.pluginManager
|
|
135
|
-
const assemblyManager = pm.rootModel?.session?.assemblyManager
|
|
136
|
-
if (!assemblyManager) {
|
|
137
|
-
return args
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
const renamedArgs = await renameRegionsIfNeeded(assemblyManager, {
|
|
141
|
-
...args,
|
|
142
|
-
filters: args.filters?.toJSON().filters,
|
|
143
|
-
})
|
|
144
|
-
|
|
145
|
-
return super.serializeArguments(renamedArgs, rpcDriverClassName)
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
async execute(
|
|
149
|
-
args: {
|
|
150
|
-
adapterConfig: {}
|
|
151
|
-
signal?: RemoteAbortSignal
|
|
152
|
-
sessionId: string
|
|
153
|
-
headers?: Record<string, string>
|
|
154
|
-
regions: Region[]
|
|
155
|
-
bpPerPx: number
|
|
156
|
-
},
|
|
157
|
-
rpcDriverClassName: string,
|
|
158
|
-
) {
|
|
159
|
-
const pm = this.pluginManager
|
|
160
|
-
const deserializedArgs = await this.deserializeArguments(
|
|
161
|
-
args,
|
|
162
|
-
rpcDriverClassName,
|
|
163
|
-
)
|
|
164
|
-
const { regions, adapterConfig, sessionId } = deserializedArgs
|
|
165
|
-
const { dataAdapter } = await getAdapter(pm, sessionId, adapterConfig)
|
|
166
|
-
|
|
167
|
-
// @ts-expect-error
|
|
168
|
-
return dataAdapter.getSources(regions, deserializedArgs)
|
|
169
|
-
}
|
|
170
|
-
}
|
|
1
|
+
export * from './MultiWiggleGetSources'
|
|
2
|
+
export * from './WiggleGetMultiRegionQuantitativeStats'
|
|
3
|
+
export * from './WiggleGetGlobalQuantitativeStats'
|
package/src/index.ts
CHANGED
|
@@ -30,8 +30,8 @@ import MultiWiggleAddTrackWidgetF from './MultiWiggleAddTrackWidget'
|
|
|
30
30
|
import * as utils from './util'
|
|
31
31
|
|
|
32
32
|
import {
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
WiggleGetGlobalQuantitativeStats,
|
|
34
|
+
WiggleGetMultiRegionQuantitativeStats,
|
|
35
35
|
MultiWiggleGetSources,
|
|
36
36
|
} from './WiggleRPC/rpcMethods'
|
|
37
37
|
|
|
@@ -101,8 +101,8 @@ export default class WigglePlugin extends Plugin {
|
|
|
101
101
|
},
|
|
102
102
|
)
|
|
103
103
|
|
|
104
|
-
pm.addRpcMethod(() => new
|
|
105
|
-
pm.addRpcMethod(() => new
|
|
104
|
+
pm.addRpcMethod(() => new WiggleGetGlobalQuantitativeStats(pm))
|
|
105
|
+
pm.addRpcMethod(() => new WiggleGetMultiRegionQuantitativeStats(pm))
|
|
106
106
|
pm.addRpcMethod(() => new MultiWiggleGetSources(pm))
|
|
107
107
|
}
|
|
108
108
|
|
package/src/util.ts
CHANGED
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
getSession,
|
|
6
6
|
getContainingView,
|
|
7
7
|
} from '@jbrowse/core/util'
|
|
8
|
-
import {
|
|
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
|
|
|
@@ -176,9 +176,10 @@ export function groupBy<T>(array: T[], predicate: (v: T) => string) {
|
|
|
176
176
|
return result
|
|
177
177
|
}
|
|
178
178
|
|
|
179
|
-
export async function
|
|
179
|
+
export async function getQuantitativeStats(
|
|
180
180
|
self: {
|
|
181
181
|
adapterConfig: AnyConfigurationModel
|
|
182
|
+
configuration: AnyConfigurationModel
|
|
182
183
|
autoscaleType: string
|
|
183
184
|
setMessage: (str: string) => void
|
|
184
185
|
},
|
|
@@ -187,7 +188,7 @@ export async function getStats(
|
|
|
187
188
|
signal?: AbortSignal
|
|
188
189
|
filters?: string[]
|
|
189
190
|
},
|
|
190
|
-
): Promise<
|
|
191
|
+
): Promise<QuantitativeStats> {
|
|
191
192
|
const { rpcManager } = getSession(self)
|
|
192
193
|
const nd = getConf(self, 'numStdDev') || 3
|
|
193
194
|
const { adapterConfig, autoscaleType } = self
|
|
@@ -204,11 +205,11 @@ export async function getStats(
|
|
|
204
205
|
}
|
|
205
206
|
|
|
206
207
|
if (autoscaleType === 'global' || autoscaleType === 'globalsd') {
|
|
207
|
-
const results:
|
|
208
|
+
const results: QuantitativeStats = (await rpcManager.call(
|
|
208
209
|
sessionId,
|
|
209
|
-
'
|
|
210
|
+
'WiggleGetGlobalQuantitativeStats',
|
|
210
211
|
params,
|
|
211
|
-
)) as
|
|
212
|
+
)) as QuantitativeStats
|
|
212
213
|
const { scoreMin, scoreMean, scoreStdDev } = results
|
|
213
214
|
// globalsd uses heuristic to avoid unnecessary scoreMin<0
|
|
214
215
|
// if the scoreMin is never less than 0
|
|
@@ -225,7 +226,7 @@ export async function getStats(
|
|
|
225
226
|
const { dynamicBlocks, bpPerPx } = getContainingView(self) as LGV
|
|
226
227
|
const results = (await rpcManager.call(
|
|
227
228
|
sessionId,
|
|
228
|
-
'
|
|
229
|
+
'WiggleGetMultiRegionQuantitativeStats',
|
|
229
230
|
{
|
|
230
231
|
...params,
|
|
231
232
|
regions: dynamicBlocks.contentBlocks.map(region => {
|
|
@@ -238,7 +239,7 @@ export async function getStats(
|
|
|
238
239
|
}),
|
|
239
240
|
bpPerPx,
|
|
240
241
|
},
|
|
241
|
-
)) as
|
|
242
|
+
)) as QuantitativeStats
|
|
242
243
|
const { scoreMin, scoreMean, scoreStdDev } = results
|
|
243
244
|
|
|
244
245
|
// localsd uses heuristic to avoid unnecessary scoreMin<0 if the
|
|
@@ -255,20 +256,25 @@ export async function getStats(
|
|
|
255
256
|
if (autoscaleType === 'zscale') {
|
|
256
257
|
return rpcManager.call(
|
|
257
258
|
sessionId,
|
|
258
|
-
'
|
|
259
|
+
'WiggleGetGlobalQuantitativeStats',
|
|
259
260
|
params,
|
|
260
|
-
) as Promise<
|
|
261
|
+
) as Promise<QuantitativeStats>
|
|
261
262
|
}
|
|
262
263
|
throw new Error(`invalid autoscaleType '${autoscaleType}'`)
|
|
263
264
|
}
|
|
264
265
|
|
|
265
|
-
export function
|
|
266
|
-
|
|
266
|
+
export function quantitativeStatsAutorun(self: {
|
|
267
|
+
featureDensityStatsReady: boolean
|
|
267
268
|
regionTooLarge: boolean
|
|
269
|
+
error: unknown
|
|
268
270
|
setLoading: (aborter: AbortController) => void
|
|
269
271
|
setError: (error: unknown) => void
|
|
270
|
-
|
|
272
|
+
updateQuantitativeStats: (
|
|
273
|
+
stats: QuantitativeStats,
|
|
274
|
+
statsRegion: string,
|
|
275
|
+
) => void
|
|
271
276
|
renderProps: () => Record<string, unknown>
|
|
277
|
+
configuration: AnyConfigurationModel
|
|
272
278
|
adapterConfig: AnyConfigurationModel
|
|
273
279
|
autoscaleType: string
|
|
274
280
|
setMessage: (str: string) => void
|
|
@@ -284,20 +290,21 @@ export function statsAutorun(self: {
|
|
|
284
290
|
|
|
285
291
|
if (
|
|
286
292
|
!view.initialized ||
|
|
287
|
-
!self.
|
|
288
|
-
self.regionTooLarge
|
|
293
|
+
!self.featureDensityStatsReady ||
|
|
294
|
+
self.regionTooLarge ||
|
|
295
|
+
self.error
|
|
289
296
|
) {
|
|
290
297
|
return
|
|
291
298
|
}
|
|
292
299
|
const statsRegion = JSON.stringify(view.dynamicBlocks)
|
|
293
300
|
|
|
294
|
-
const wiggleStats = await
|
|
301
|
+
const wiggleStats = await getQuantitativeStats(self, {
|
|
295
302
|
signal: aborter.signal,
|
|
296
303
|
...self.renderProps(),
|
|
297
304
|
})
|
|
298
305
|
|
|
299
306
|
if (isAlive(self)) {
|
|
300
|
-
self.
|
|
307
|
+
self.updateQuantitativeStats(wiggleStats, statsRegion)
|
|
301
308
|
}
|
|
302
309
|
} catch (e) {
|
|
303
310
|
if (!isAbortException(e) && isAlive(self)) {
|