@jbrowse/plugin-wiggle 1.7.9 → 2.0.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.js +176 -284
- package/dist/BigWigAdapter/BigWigAdapter.js.map +1 -0
- package/dist/BigWigAdapter/configSchema.js +12 -21
- package/dist/BigWigAdapter/configSchema.js.map +1 -0
- package/dist/BigWigAdapter/index.js +8 -14
- package/dist/BigWigAdapter/index.js.map +1 -0
- package/dist/DensityRenderer/index.d.ts +1 -1
- package/dist/DensityRenderer/index.js +152 -133
- package/dist/DensityRenderer/index.js.map +1 -0
- package/dist/LinePlotRenderer/LinePlotRenderer.d.ts +1 -1
- package/dist/LinePlotRenderer/LinePlotRenderer.js +182 -168
- package/dist/LinePlotRenderer/LinePlotRenderer.js.map +1 -0
- package/dist/LinePlotRenderer/index.js +19 -33
- package/dist/LinePlotRenderer/index.js.map +1 -0
- package/dist/LinearWiggleDisplay/components/SetColorDialog.js +95 -105
- package/dist/LinearWiggleDisplay/components/SetColorDialog.js.map +1 -0
- package/dist/LinearWiggleDisplay/components/SetMinMaxDialog.js +86 -107
- package/dist/LinearWiggleDisplay/components/SetMinMaxDialog.js.map +1 -0
- package/dist/LinearWiggleDisplay/components/Tooltip.js +147 -152
- package/dist/LinearWiggleDisplay/components/Tooltip.js.map +1 -0
- package/dist/LinearWiggleDisplay/components/WiggleDisplayComponent.js +44 -50
- package/dist/LinearWiggleDisplay/components/WiggleDisplayComponent.js.map +1 -0
- package/dist/LinearWiggleDisplay/components/YScaleBar.js +24 -31
- package/dist/LinearWiggleDisplay/components/YScaleBar.js.map +1 -0
- package/dist/LinearWiggleDisplay/index.js +13 -42
- package/dist/LinearWiggleDisplay/index.js.map +1 -0
- package/dist/LinearWiggleDisplay/models/configSchema.js +65 -69
- package/dist/LinearWiggleDisplay/models/configSchema.js.map +1 -0
- package/dist/LinearWiggleDisplay/models/model.d.ts +16 -14
- package/dist/LinearWiggleDisplay/models/model.js +585 -694
- package/dist/LinearWiggleDisplay/models/model.js.map +1 -0
- package/dist/WiggleBaseRenderer.d.ts +3 -3
- package/dist/WiggleBaseRenderer.js +119 -129
- package/dist/WiggleBaseRenderer.js.map +1 -0
- package/dist/WiggleRPC/rpcMethods.js +182 -288
- package/dist/WiggleRPC/rpcMethods.js.map +1 -0
- package/dist/WiggleRendering.js +107 -102
- package/dist/WiggleRendering.js.map +1 -0
- package/dist/XYPlotRenderer/XYPlotRenderer.d.ts +1 -1
- package/dist/XYPlotRenderer/XYPlotRenderer.js +250 -194
- package/dist/XYPlotRenderer/XYPlotRenderer.js.map +1 -0
- package/dist/XYPlotRenderer/index.js +30 -33
- package/dist/XYPlotRenderer/index.js.map +1 -0
- package/dist/configSchema.js +47 -74
- package/dist/configSchema.js.map +1 -0
- package/dist/index.d.ts +118 -67
- package/dist/index.js +167 -242
- package/dist/index.js.map +1 -0
- package/dist/util.js +112 -143
- package/dist/util.js.map +1 -0
- package/esm/BigWigAdapter/BigWigAdapter.d.ts +24 -0
- package/esm/BigWigAdapter/BigWigAdapter.js +62 -0
- package/esm/BigWigAdapter/BigWigAdapter.js.map +1 -0
- package/{dist/LinePlotRenderer → esm/BigWigAdapter}/configSchema.d.ts +0 -0
- package/esm/BigWigAdapter/configSchema.js +11 -0
- package/esm/BigWigAdapter/configSchema.js.map +1 -0
- package/esm/BigWigAdapter/index.d.ts +1 -0
- package/esm/BigWigAdapter/index.js +2 -0
- package/esm/BigWigAdapter/index.js.map +1 -0
- package/esm/DensityRenderer/index.d.ts +6 -0
- package/esm/DensityRenderer/index.js +39 -0
- package/esm/DensityRenderer/index.js.map +1 -0
- package/esm/LinePlotRenderer/LinePlotRenderer.d.ts +4 -0
- package/esm/LinePlotRenderer/LinePlotRenderer.js +71 -0
- package/esm/LinePlotRenderer/LinePlotRenderer.js.map +1 -0
- package/esm/LinePlotRenderer/index.d.ts +3 -0
- package/esm/LinePlotRenderer/index.js +12 -0
- package/esm/LinePlotRenderer/index.js.map +1 -0
- package/esm/LinearWiggleDisplay/components/SetColorDialog.d.ts +10 -0
- package/esm/LinearWiggleDisplay/components/SetColorDialog.js +55 -0
- package/esm/LinearWiggleDisplay/components/SetColorDialog.js.map +1 -0
- package/esm/LinearWiggleDisplay/components/SetMinMaxDialog.d.ts +11 -0
- package/esm/LinearWiggleDisplay/components/SetMinMaxDialog.js +46 -0
- package/esm/LinearWiggleDisplay/components/SetMinMaxDialog.js.map +1 -0
- package/esm/LinearWiggleDisplay/components/Tooltip.d.ts +24 -0
- package/esm/LinearWiggleDisplay/components/Tooltip.js +107 -0
- package/esm/LinearWiggleDisplay/components/Tooltip.js.map +1 -0
- package/esm/LinearWiggleDisplay/components/WiggleDisplayComponent.d.ts +8 -0
- package/esm/LinearWiggleDisplay/components/WiggleDisplayComponent.js +29 -0
- package/esm/LinearWiggleDisplay/components/WiggleDisplayComponent.js.map +1 -0
- package/esm/LinearWiggleDisplay/components/YScaleBar.d.ts +7 -0
- package/esm/LinearWiggleDisplay/components/YScaleBar.js +9 -0
- package/esm/LinearWiggleDisplay/components/YScaleBar.js.map +1 -0
- package/esm/LinearWiggleDisplay/index.d.ts +3 -0
- package/esm/LinearWiggleDisplay/index.js +4 -0
- package/esm/LinearWiggleDisplay/index.js.map +1 -0
- package/esm/LinearWiggleDisplay/models/configSchema.d.ts +2 -0
- package/esm/LinearWiggleDisplay/models/configSchema.js +64 -0
- package/esm/LinearWiggleDisplay/models/configSchema.js.map +1 -0
- package/esm/LinearWiggleDisplay/models/model.d.ts +290 -0
- package/esm/LinearWiggleDisplay/models/model.js +495 -0
- package/esm/LinearWiggleDisplay/models/model.js.map +1 -0
- package/esm/WiggleBaseRenderer.d.ts +55 -0
- package/esm/WiggleBaseRenderer.js +34 -0
- package/esm/WiggleBaseRenderer.js.map +1 -0
- package/esm/WiggleRPC/rpcMethods.d.ts +31 -0
- package/esm/WiggleRPC/rpcMethods.js +70 -0
- package/esm/WiggleRPC/rpcMethods.js.map +1 -0
- package/esm/WiggleRendering.d.ts +16 -0
- package/esm/WiggleRendering.js +40 -0
- package/esm/WiggleRendering.js.map +1 -0
- package/esm/XYPlotRenderer/XYPlotRenderer.d.ts +4 -0
- package/esm/XYPlotRenderer/XYPlotRenderer.js +109 -0
- package/esm/XYPlotRenderer/XYPlotRenderer.js.map +1 -0
- package/esm/XYPlotRenderer/index.d.ts +3 -0
- package/esm/XYPlotRenderer/index.js +23 -0
- package/esm/XYPlotRenderer/index.js.map +1 -0
- package/esm/configSchema.d.ts +2 -0
- package/esm/configSchema.js +46 -0
- package/esm/configSchema.js.map +1 -0
- package/esm/index.d.ts +917 -0
- package/esm/index.js +115 -0
- package/esm/index.js.map +1 -0
- package/esm/util.d.ts +41 -0
- package/esm/util.js +123 -0
- package/esm/util.js.map +1 -0
- package/package.json +21 -13
- package/src/DensityRenderer/DensityRenderer.test.js +5 -0
- package/src/DensityRenderer/index.ts +1 -1
- package/src/LinePlotRenderer/LinePlotRenderer.js +1 -1
- package/src/LinePlotRenderer/index.js +7 -1
- package/src/LinearWiggleDisplay/components/SetColorDialog.tsx +10 -13
- package/src/LinearWiggleDisplay/components/SetMinMaxDialog.tsx +13 -11
- package/src/LinearWiggleDisplay/components/Tooltip.tsx +4 -3
- package/src/LinearWiggleDisplay/components/WiggleDisplayComponent.tsx +9 -4
- package/src/LinearWiggleDisplay/models/model.tsx +58 -69
- package/src/WiggleBaseRenderer.tsx +3 -3
- package/src/XYPlotRenderer/XYPlotRenderer.test.js +5 -0
- package/src/XYPlotRenderer/XYPlotRenderer.ts +87 -40
- package/src/XYPlotRenderer/index.ts +19 -2
- package/src/configSchema.ts +0 -23
- package/dist/BigWigAdapter/BigWigAdapter.test.js +0 -157
- package/dist/DensityRenderer/DensityRenderer.test.js +0 -84
- package/dist/LinePlotRenderer/configSchema.js +0 -70
- package/dist/WiggleRendering.test.js +0 -52
- package/dist/XYPlotRenderer/XYPlotRenderer.test.js +0 -83
- package/dist/declare.d.js +0 -1
- package/dist/index.test.js +0 -24
- package/dist/util.test.js +0 -66
- package/src/LinePlotRenderer/configSchema.js +0 -68
|
@@ -201,12 +201,12 @@ const stateModelFactory = (
|
|
|
201
201
|
|
|
202
202
|
get maxScore() {
|
|
203
203
|
const { max } = self.constraints
|
|
204
|
-
return max
|
|
204
|
+
return max ?? getConf(self, 'maxScore')
|
|
205
205
|
},
|
|
206
206
|
|
|
207
207
|
get minScore() {
|
|
208
208
|
const { min } = self.constraints
|
|
209
|
-
return min
|
|
209
|
+
return min ?? getConf(self, 'minScore')
|
|
210
210
|
},
|
|
211
211
|
}))
|
|
212
212
|
.views(self => ({
|
|
@@ -214,16 +214,26 @@ const stateModelFactory = (
|
|
|
214
214
|
const configBlob =
|
|
215
215
|
getConf(self, ['renderers', self.rendererTypeName]) || {}
|
|
216
216
|
|
|
217
|
+
const {
|
|
218
|
+
color,
|
|
219
|
+
posColor,
|
|
220
|
+
negColor,
|
|
221
|
+
summaryScoreMode,
|
|
222
|
+
scaleType,
|
|
223
|
+
displayCrossHatches,
|
|
224
|
+
fill,
|
|
225
|
+
} = self
|
|
226
|
+
|
|
217
227
|
return self.rendererType.configSchema.create(
|
|
218
228
|
{
|
|
219
229
|
...configBlob,
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
displayCrossHatches:
|
|
223
|
-
summaryScoreMode:
|
|
224
|
-
...(
|
|
225
|
-
...(
|
|
226
|
-
...(
|
|
230
|
+
...(scaleType ? { scaleType } : {}),
|
|
231
|
+
...(fill ? { filled: fill } : {}),
|
|
232
|
+
...(displayCrossHatches ? { displayCrossHatches } : {}),
|
|
233
|
+
...(summaryScoreMode ? { summaryScoreMode } : {}),
|
|
234
|
+
...(color ? { color } : {}),
|
|
235
|
+
...(negColor ? { negColor } : {}),
|
|
236
|
+
...(posColor ? { posColor } : {}),
|
|
227
237
|
},
|
|
228
238
|
getEnv(self),
|
|
229
239
|
)
|
|
@@ -233,22 +243,18 @@ const stateModelFactory = (
|
|
|
233
243
|
let oldDomain: [number, number] = [0, 0]
|
|
234
244
|
return {
|
|
235
245
|
get filled() {
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
: readConfObject(self.rendererConfig, 'filled')
|
|
246
|
+
const { fill, rendererConfig: conf } = self
|
|
247
|
+
return fill ?? readConfObject(conf, 'filled')
|
|
239
248
|
},
|
|
240
249
|
get summaryScoreModeSetting() {
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
readConfObject(self.rendererConfig, 'summaryScoreMode')
|
|
244
|
-
)
|
|
250
|
+
const { summaryScoreMode, rendererConfig: conf } = self
|
|
251
|
+
return summaryScoreMode ?? readConfObject(conf, 'summaryScoreMode')
|
|
245
252
|
},
|
|
246
253
|
get domain() {
|
|
247
254
|
const { stats, scaleType, minScore, maxScore } = self
|
|
248
|
-
const { scoreMin, scoreMax } = stats
|
|
249
255
|
|
|
250
256
|
const ret = getNiceDomain({
|
|
251
|
-
domain: [scoreMin, scoreMax],
|
|
257
|
+
domain: [stats.scoreMin, stats.scoreMax],
|
|
252
258
|
bounds: [minScore, maxScore],
|
|
253
259
|
scaleType,
|
|
254
260
|
})
|
|
@@ -287,14 +293,12 @@ const stateModelFactory = (
|
|
|
287
293
|
},
|
|
288
294
|
|
|
289
295
|
get autoscaleType() {
|
|
290
|
-
return self.autoscale
|
|
296
|
+
return self.autoscale ?? getConf(self, 'autoscale')
|
|
291
297
|
},
|
|
292
298
|
|
|
293
299
|
get displayCrossHatchesSetting() {
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
readConfObject(self.rendererConfig, 'displayCrossHatches')
|
|
297
|
-
)
|
|
300
|
+
const { displayCrossHatches: hatches, rendererConfig: conf } = self
|
|
301
|
+
return hatches ?? readConfObject(conf, 'displayCrossHatches')
|
|
298
302
|
},
|
|
299
303
|
}
|
|
300
304
|
})
|
|
@@ -320,18 +324,19 @@ const stateModelFactory = (
|
|
|
320
324
|
return {
|
|
321
325
|
renderProps() {
|
|
322
326
|
const superProps = superRenderProps()
|
|
327
|
+
const { filters, ticks, height, resolution, scaleOpts } = self
|
|
323
328
|
return {
|
|
324
329
|
...superProps,
|
|
325
330
|
notReady: superProps.notReady || !self.statsReady,
|
|
326
331
|
rpcDriverName: self.rpcDriverName,
|
|
327
332
|
displayModel: self,
|
|
328
333
|
config: self.rendererConfig,
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
filters
|
|
334
|
+
displayCrossHatches: self.displayCrossHatchesSetting,
|
|
335
|
+
scaleOpts,
|
|
336
|
+
resolution,
|
|
337
|
+
height,
|
|
338
|
+
ticks,
|
|
339
|
+
filters,
|
|
335
340
|
}
|
|
336
341
|
},
|
|
337
342
|
|
|
@@ -351,6 +356,7 @@ const stateModelFactory = (
|
|
|
351
356
|
})
|
|
352
357
|
.views(self => {
|
|
353
358
|
const { trackMenuItems: superTrackMenuItems } = self
|
|
359
|
+
const hasRenderings = getConf(self, 'defaultRendering')
|
|
354
360
|
return {
|
|
355
361
|
trackMenuItems() {
|
|
356
362
|
return [
|
|
@@ -362,26 +368,20 @@ const stateModelFactory = (
|
|
|
362
368
|
subMenu: [
|
|
363
369
|
{
|
|
364
370
|
label: 'Finer resolution',
|
|
365
|
-
onClick: () =>
|
|
366
|
-
self.setResolution(self.resolution * 5)
|
|
367
|
-
},
|
|
371
|
+
onClick: () => self.setResolution(self.resolution * 5),
|
|
368
372
|
},
|
|
369
373
|
{
|
|
370
374
|
label: 'Coarser resolution',
|
|
371
|
-
onClick: () =>
|
|
372
|
-
self.setResolution(self.resolution / 5)
|
|
373
|
-
},
|
|
375
|
+
onClick: () => self.setResolution(self.resolution / 5),
|
|
374
376
|
},
|
|
375
377
|
],
|
|
376
378
|
},
|
|
377
379
|
{
|
|
378
380
|
label: 'Summary score mode',
|
|
379
|
-
subMenu: ['min', 'max', 'avg', 'whiskers'].map(elt => {
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
}
|
|
384
|
-
}),
|
|
381
|
+
subMenu: ['min', 'max', 'avg', 'whiskers'].map(elt => ({
|
|
382
|
+
label: elt,
|
|
383
|
+
onClick: () => self.setSummaryScoreMode(elt),
|
|
384
|
+
})),
|
|
385
385
|
},
|
|
386
386
|
]
|
|
387
387
|
: []),
|
|
@@ -391,33 +391,26 @@ const stateModelFactory = (
|
|
|
391
391
|
label: self.filled
|
|
392
392
|
? 'Turn off histogram fill'
|
|
393
393
|
: 'Turn on histogram fill',
|
|
394
|
-
onClick: () =>
|
|
395
|
-
self.setFill(!self.filled)
|
|
396
|
-
},
|
|
394
|
+
onClick: () => self.setFill(!self.filled),
|
|
397
395
|
},
|
|
398
396
|
]
|
|
399
397
|
: []),
|
|
400
398
|
{
|
|
401
399
|
label:
|
|
402
400
|
self.scaleType === 'log' ? 'Set linear scale' : 'Set log scale',
|
|
403
|
-
onClick: () =>
|
|
404
|
-
self.toggleLogScale()
|
|
405
|
-
},
|
|
401
|
+
onClick: () => self.toggleLogScale(),
|
|
406
402
|
},
|
|
407
403
|
{
|
|
408
404
|
type: 'checkbox',
|
|
409
405
|
label: 'Draw cross hatches',
|
|
410
406
|
checked: self.displayCrossHatchesSetting,
|
|
411
|
-
onClick: () =>
|
|
412
|
-
self.toggleCrossHatches()
|
|
413
|
-
},
|
|
407
|
+
onClick: () => self.toggleCrossHatches(),
|
|
414
408
|
},
|
|
415
|
-
|
|
416
|
-
...(Object.keys(getConf(self, 'renderers') || {}).length > 1
|
|
409
|
+
...(hasRenderings
|
|
417
410
|
? [
|
|
418
411
|
{
|
|
419
412
|
label: 'Renderer type',
|
|
420
|
-
subMenu: [
|
|
413
|
+
subMenu: ['xyplot', 'density', 'line'].map(key => ({
|
|
421
414
|
label: key,
|
|
422
415
|
onClick: () => self.setRendererType(key),
|
|
423
416
|
})),
|
|
@@ -435,30 +428,26 @@ const stateModelFactory = (
|
|
|
435
428
|
]
|
|
436
429
|
: []),
|
|
437
430
|
['localsd', 'Local ± 3σ'],
|
|
438
|
-
].map(([val, label]) => {
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
self.setAutoscale(val)
|
|
443
|
-
},
|
|
444
|
-
}
|
|
445
|
-
}),
|
|
431
|
+
].map(([val, label]) => ({
|
|
432
|
+
label,
|
|
433
|
+
onClick: () => self.setAutoscale(val),
|
|
434
|
+
})),
|
|
446
435
|
},
|
|
447
436
|
{
|
|
448
437
|
label: 'Set min/max score',
|
|
449
438
|
onClick: () => {
|
|
450
|
-
getSession(self).queueDialog(
|
|
439
|
+
getSession(self).queueDialog(handleClose => [
|
|
451
440
|
SetMinMaxDlg,
|
|
452
|
-
{ model: self, handleClose
|
|
441
|
+
{ model: self, handleClose },
|
|
453
442
|
])
|
|
454
443
|
},
|
|
455
444
|
},
|
|
456
445
|
{
|
|
457
446
|
label: 'Set color',
|
|
458
447
|
onClick: () => {
|
|
459
|
-
getSession(self).queueDialog(
|
|
448
|
+
getSession(self).queueDialog(handleClose => [
|
|
460
449
|
SetColorDlg,
|
|
461
|
-
{ model: self, handleClose
|
|
450
|
+
{ model: self, handleClose },
|
|
462
451
|
])
|
|
463
452
|
},
|
|
464
453
|
},
|
|
@@ -554,9 +543,9 @@ const stateModelFactory = (
|
|
|
554
543
|
async reload() {
|
|
555
544
|
self.setError()
|
|
556
545
|
const aborter = new AbortController()
|
|
557
|
-
|
|
546
|
+
self.setLoading(aborter)
|
|
558
547
|
try {
|
|
559
|
-
stats = await getStats({
|
|
548
|
+
const stats = await getStats({
|
|
560
549
|
signal: aborter.signal,
|
|
561
550
|
...self.renderProps(),
|
|
562
551
|
})
|
|
@@ -574,9 +563,7 @@ const stateModelFactory = (
|
|
|
574
563
|
autorun(
|
|
575
564
|
async () => {
|
|
576
565
|
try {
|
|
577
|
-
const aborter = new AbortController()
|
|
578
566
|
const view = getContainingView(self) as LGV
|
|
579
|
-
self.setLoading(aborter)
|
|
580
567
|
|
|
581
568
|
if (!view.initialized) {
|
|
582
569
|
return
|
|
@@ -588,6 +575,8 @@ const stateModelFactory = (
|
|
|
588
575
|
if (self.regionTooLarge) {
|
|
589
576
|
return
|
|
590
577
|
}
|
|
578
|
+
const aborter = new AbortController()
|
|
579
|
+
self.setLoading(aborter)
|
|
591
580
|
|
|
592
581
|
const wiggleStats = await getStats({
|
|
593
582
|
signal: aborter.signal,
|
|
@@ -8,7 +8,7 @@ import FeatureRendererType, {
|
|
|
8
8
|
ResultsDeserialized,
|
|
9
9
|
} from '@jbrowse/core/pluggableElementTypes/renderers/FeatureRendererType'
|
|
10
10
|
import { renderToAbstractCanvas } from '@jbrowse/core/util/offscreenCanvasUtils'
|
|
11
|
-
import { ThemeOptions } from '@material
|
|
11
|
+
import { ThemeOptions } from '@mui/material'
|
|
12
12
|
import { ScaleOpts } from './util'
|
|
13
13
|
|
|
14
14
|
export interface RenderArgs extends FeatureRenderArgs {
|
|
@@ -22,7 +22,7 @@ export interface RenderArgsDeserialized extends FeatureRenderArgsDeserialized {
|
|
|
22
22
|
scaleOpts: ScaleOpts
|
|
23
23
|
displayCrossHatches: boolean
|
|
24
24
|
ticks: { values: number[] }
|
|
25
|
-
|
|
25
|
+
themeOptions: ThemeOptions
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
export interface RenderArgsDeserializedWithFeatures
|
|
@@ -82,5 +82,5 @@ export default abstract class WiggleBaseRenderer extends FeatureRendererType {
|
|
|
82
82
|
abstract draw<T extends RenderArgsDeserializedWithFeatures>(
|
|
83
83
|
ctx: CanvasRenderingContext2D,
|
|
84
84
|
props: T,
|
|
85
|
-
): void
|
|
85
|
+
): Promise<void>
|
|
86
86
|
}
|
|
@@ -2,6 +2,11 @@ import SimpleFeature from '@jbrowse/core/util/simpleFeature'
|
|
|
2
2
|
import { renderToAbstractCanvas } from '@jbrowse/core/util/offscreenCanvasUtils'
|
|
3
3
|
import XYPlotRenderer, { configSchema, ReactComponent } from '.'
|
|
4
4
|
|
|
5
|
+
import { Image, createCanvas } from 'canvas'
|
|
6
|
+
|
|
7
|
+
global.nodeImage = Image
|
|
8
|
+
global.nodeCreateCanvas = createCanvas
|
|
9
|
+
|
|
5
10
|
test('several features', async () => {
|
|
6
11
|
const pluginManager = {}
|
|
7
12
|
const renderer = new XYPlotRenderer({
|
|
@@ -1,15 +1,36 @@
|
|
|
1
1
|
import { readConfObject } from '@jbrowse/core/configuration'
|
|
2
2
|
import { featureSpanPx } from '@jbrowse/core/util'
|
|
3
|
-
import
|
|
4
|
-
import { Feature } from '@jbrowse/core/util/simpleFeature'
|
|
3
|
+
import { Feature } from '@jbrowse/core/util'
|
|
5
4
|
import { getOrigin, getScale } from '../util'
|
|
6
5
|
import WiggleBaseRenderer, {
|
|
7
6
|
RenderArgsDeserializedWithFeatures,
|
|
8
7
|
} from '../WiggleBaseRenderer'
|
|
9
8
|
import { YSCALEBAR_LABEL_OFFSET } from '../LinearWiggleDisplay/models/model'
|
|
10
9
|
|
|
10
|
+
function fillRect(
|
|
11
|
+
ctx: CanvasRenderingContext2D,
|
|
12
|
+
x: number,
|
|
13
|
+
y: number,
|
|
14
|
+
width: number,
|
|
15
|
+
height: number,
|
|
16
|
+
color?: string,
|
|
17
|
+
) {
|
|
18
|
+
if (color) {
|
|
19
|
+
ctx.fillStyle = String(color)
|
|
20
|
+
}
|
|
21
|
+
if (width < 0) {
|
|
22
|
+
x += width
|
|
23
|
+
width = -width
|
|
24
|
+
}
|
|
25
|
+
if (height < 0) {
|
|
26
|
+
y += height
|
|
27
|
+
height = -height
|
|
28
|
+
}
|
|
29
|
+
ctx.fillRect(x, y, width, height)
|
|
30
|
+
}
|
|
31
|
+
|
|
11
32
|
export default class XYPlotRenderer extends WiggleBaseRenderer {
|
|
12
|
-
draw(
|
|
33
|
+
async draw(
|
|
13
34
|
ctx: CanvasRenderingContext2D,
|
|
14
35
|
props: RenderArgsDeserializedWithFeatures,
|
|
15
36
|
) {
|
|
@@ -23,22 +44,27 @@ export default class XYPlotRenderer extends WiggleBaseRenderer {
|
|
|
23
44
|
ticks,
|
|
24
45
|
displayCrossHatches,
|
|
25
46
|
} = props
|
|
47
|
+
const Color = await import('color').then(f => f.default)
|
|
26
48
|
const [region] = regions
|
|
27
49
|
const width = (region.end - region.start) / bpPerPx
|
|
28
50
|
|
|
51
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
52
|
+
const rc = (s: string, rest?: Record<string, any>) =>
|
|
53
|
+
readConfObject(config, s, rest)
|
|
54
|
+
|
|
29
55
|
// the adjusted height takes into account YSCALEBAR_LABEL_OFFSET from the
|
|
30
56
|
// wiggle display, and makes the height of the actual drawn area add
|
|
31
57
|
// "padding" to the top and bottom of the display
|
|
32
58
|
const offset = YSCALEBAR_LABEL_OFFSET
|
|
33
59
|
const height = unadjustedHeight - offset * 2
|
|
34
60
|
|
|
35
|
-
const pivotValue =
|
|
36
|
-
const negColor =
|
|
37
|
-
const posColor =
|
|
38
|
-
const filled =
|
|
39
|
-
const clipColor =
|
|
40
|
-
const highlightColor =
|
|
41
|
-
const summaryScoreMode =
|
|
61
|
+
const pivotValue = rc('bicolorPivotValue')
|
|
62
|
+
const negColor = rc('negColor')
|
|
63
|
+
const posColor = rc('posColor')
|
|
64
|
+
const filled = rc('filled')
|
|
65
|
+
const clipColor = rc('clipColor')
|
|
66
|
+
const highlightColor = rc('highlightColor')
|
|
67
|
+
const summaryScoreMode = rc('summaryScoreMode')
|
|
42
68
|
|
|
43
69
|
const scale = getScale({ ...scaleOpts, range: [0, height] })
|
|
44
70
|
const originY = getOrigin(scaleOpts.scaleType)
|
|
@@ -48,11 +74,10 @@ export default class XYPlotRenderer extends WiggleBaseRenderer {
|
|
|
48
74
|
const toHeight = (n: number) => toY(originY) - toY(n)
|
|
49
75
|
|
|
50
76
|
const colorCallback =
|
|
51
|
-
|
|
77
|
+
rc('color') === '#f0f'
|
|
52
78
|
? (_: Feature, score: number) =>
|
|
53
79
|
score < pivotValue ? negColor : posColor
|
|
54
|
-
: (feature: Feature, _score: number) =>
|
|
55
|
-
readConfObject(config, 'color', { feature })
|
|
80
|
+
: (feature: Feature, _score: number) => rc('color', { feature })
|
|
56
81
|
|
|
57
82
|
const crossingOrigin = niceMin < pivotValue && niceMax > pivotValue
|
|
58
83
|
for (const feature of features.values()) {
|
|
@@ -69,62 +94,84 @@ export default class XYPlotRenderer extends WiggleBaseRenderer {
|
|
|
69
94
|
|
|
70
95
|
if (summaryScoreMode === 'max') {
|
|
71
96
|
score = summary ? maxr : score
|
|
72
|
-
|
|
73
|
-
|
|
97
|
+
fillRect(
|
|
98
|
+
ctx,
|
|
99
|
+
leftPx,
|
|
100
|
+
toY(score),
|
|
101
|
+
w,
|
|
102
|
+
filled ? toHeight(score) : 1,
|
|
103
|
+
colorCallback(feature, score),
|
|
104
|
+
)
|
|
74
105
|
} else if (summaryScoreMode === 'min') {
|
|
75
106
|
score = summary ? minr : score
|
|
76
|
-
|
|
77
|
-
|
|
107
|
+
fillRect(
|
|
108
|
+
ctx,
|
|
109
|
+
leftPx,
|
|
110
|
+
toY(score),
|
|
111
|
+
w,
|
|
112
|
+
filled ? toHeight(score) : 1,
|
|
113
|
+
colorCallback(feature, score),
|
|
114
|
+
)
|
|
78
115
|
} else if (summaryScoreMode === 'whiskers') {
|
|
79
116
|
const c = colorCallback(feature, score)
|
|
80
117
|
if (summary) {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
: Color(c).lighten(0.6).toString()
|
|
84
|
-
ctx.fillRect(
|
|
118
|
+
fillRect(
|
|
119
|
+
ctx,
|
|
85
120
|
leftPx,
|
|
86
121
|
toY(maxr),
|
|
87
122
|
w,
|
|
88
123
|
filled ? toHeight(maxr) - toHeight(score) : 1,
|
|
124
|
+
crossingOrigin
|
|
125
|
+
? colorCallback(feature, maxr)
|
|
126
|
+
: Color(c).lighten(0.6),
|
|
89
127
|
)
|
|
90
128
|
}
|
|
91
129
|
|
|
92
130
|
// normal
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
? Color(colorCallback(feature, maxr)).mix(
|
|
96
|
-
Color(colorCallback(feature, minr)),
|
|
97
|
-
)
|
|
98
|
-
: c
|
|
99
|
-
ctx.fillRect(
|
|
131
|
+
fillRect(
|
|
132
|
+
ctx,
|
|
100
133
|
leftPx,
|
|
101
134
|
toY(score),
|
|
102
135
|
w,
|
|
103
136
|
filled ? toHeight(score) - (summary ? toHeight(minr) : 0) : 1,
|
|
137
|
+
crossingOrigin && summary
|
|
138
|
+
? Color(colorCallback(feature, maxr)).mix(
|
|
139
|
+
Color(colorCallback(feature, minr)),
|
|
140
|
+
)
|
|
141
|
+
: c,
|
|
104
142
|
)
|
|
105
143
|
|
|
106
144
|
// min
|
|
107
145
|
if (summary) {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
146
|
+
fillRect(
|
|
147
|
+
ctx,
|
|
148
|
+
leftPx,
|
|
149
|
+
toY(minr),
|
|
150
|
+
w,
|
|
151
|
+
filled ? toHeight(minr) : 1,
|
|
152
|
+
crossingOrigin
|
|
153
|
+
? colorCallback(feature, minr)
|
|
154
|
+
: Color(c).darken(0.6),
|
|
155
|
+
)
|
|
112
156
|
}
|
|
113
157
|
} else {
|
|
114
|
-
|
|
115
|
-
|
|
158
|
+
fillRect(
|
|
159
|
+
ctx,
|
|
160
|
+
leftPx,
|
|
161
|
+
toY(score),
|
|
162
|
+
w,
|
|
163
|
+
filled ? toHeight(score) : 1,
|
|
164
|
+
colorCallback(feature, score),
|
|
165
|
+
)
|
|
116
166
|
}
|
|
117
167
|
|
|
118
168
|
if (highClipping) {
|
|
119
|
-
ctx
|
|
120
|
-
ctx.fillRect(leftPx, 0, w, 4)
|
|
169
|
+
fillRect(ctx, leftPx, 0, w, 4, clipColor)
|
|
121
170
|
} else if (lowClipping && scaleOpts.scaleType !== 'log') {
|
|
122
|
-
ctx
|
|
123
|
-
ctx.fillRect(leftPx, unadjustedHeight - 4, w, 4)
|
|
171
|
+
fillRect(ctx, leftPx, unadjustedHeight - 4, w, 4, clipColor)
|
|
124
172
|
}
|
|
125
173
|
if (feature.get('highlighted')) {
|
|
126
|
-
ctx
|
|
127
|
-
ctx.fillRect(leftPx, 0, w, height)
|
|
174
|
+
fillRect(ctx, leftPx, 0, w, height, highlightColor)
|
|
128
175
|
}
|
|
129
176
|
}
|
|
130
177
|
|
|
@@ -1,11 +1,28 @@
|
|
|
1
1
|
import { ConfigurationSchema } from '@jbrowse/core/configuration'
|
|
2
2
|
import ConfigSchema from '../configSchema'
|
|
3
|
-
|
|
3
|
+
import { types } from 'mobx-state-tree'
|
|
4
4
|
export { default as ReactComponent } from '../WiggleRendering'
|
|
5
5
|
export { default } from './XYPlotRenderer'
|
|
6
6
|
|
|
7
7
|
export const configSchema = ConfigurationSchema(
|
|
8
8
|
'XYPlotRenderer',
|
|
9
|
-
{
|
|
9
|
+
{
|
|
10
|
+
filled: {
|
|
11
|
+
type: 'boolean',
|
|
12
|
+
defaultValue: true,
|
|
13
|
+
},
|
|
14
|
+
displayCrossHatches: {
|
|
15
|
+
type: 'boolean',
|
|
16
|
+
description: 'choose to draw cross hatches (sideways lines)',
|
|
17
|
+
defaultValue: false,
|
|
18
|
+
},
|
|
19
|
+
summaryScoreMode: {
|
|
20
|
+
type: 'stringEnum',
|
|
21
|
+
model: types.enumeration('Score type', ['max', 'min', 'avg', 'whiskers']),
|
|
22
|
+
description:
|
|
23
|
+
'choose whether to use max/min/average or whiskers which combines all three into the same rendering',
|
|
24
|
+
defaultValue: 'whiskers',
|
|
25
|
+
},
|
|
26
|
+
},
|
|
10
27
|
{ baseConfiguration: ConfigSchema, explicitlyTyped: true },
|
|
11
28
|
)
|
package/src/configSchema.ts
CHANGED
|
@@ -29,17 +29,6 @@ export default ConfigurationSchema(
|
|
|
29
29
|
description: 'the color of the clipping marker',
|
|
30
30
|
defaultValue: 'red',
|
|
31
31
|
},
|
|
32
|
-
renderType: {
|
|
33
|
-
type: 'stringEnum',
|
|
34
|
-
model: types.enumeration('Rendering type', ['xyplot', 'density', 'line']),
|
|
35
|
-
description: 'The type of rendering for wiggle data to use',
|
|
36
|
-
defaultValue: 'xyplot',
|
|
37
|
-
},
|
|
38
|
-
filled: {
|
|
39
|
-
type: 'boolean',
|
|
40
|
-
description: 'fill in histogram',
|
|
41
|
-
defaultValue: true,
|
|
42
|
-
},
|
|
43
32
|
bicolorPivot: {
|
|
44
33
|
type: 'stringEnum',
|
|
45
34
|
model: types.enumeration('Scale type', [
|
|
@@ -56,18 +45,6 @@ export default ConfigurationSchema(
|
|
|
56
45
|
defaultValue: 0,
|
|
57
46
|
description: 'value to use for bicolor pivot',
|
|
58
47
|
},
|
|
59
|
-
summaryScoreMode: {
|
|
60
|
-
type: 'stringEnum',
|
|
61
|
-
model: types.enumeration('Score type', ['max', 'min', 'avg', 'whiskers']),
|
|
62
|
-
description:
|
|
63
|
-
'choose whether to use max/min/average or whiskers which combines all three into the same rendering',
|
|
64
|
-
defaultValue: 'whiskers',
|
|
65
|
-
},
|
|
66
|
-
displayCrossHatches: {
|
|
67
|
-
type: 'boolean',
|
|
68
|
-
description: 'choose to draw cross hatches (sideways lines)',
|
|
69
|
-
defaultValue: false,
|
|
70
|
-
},
|
|
71
48
|
},
|
|
72
49
|
{ explicitlyTyped: true },
|
|
73
50
|
)
|