@jbrowse/plugin-wiggle 1.7.10 → 2.0.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 +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 -696
- 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 +23 -15
- 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 +56 -65
- 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
|
@@ -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,20 +243,18 @@ const stateModelFactory = (
|
|
|
233
243
|
let oldDomain: [number, number] = [0, 0]
|
|
234
244
|
return {
|
|
235
245
|
get filled() {
|
|
236
|
-
|
|
246
|
+
const { fill, rendererConfig: conf } = self
|
|
247
|
+
return fill ?? readConfObject(conf, 'filled')
|
|
237
248
|
},
|
|
238
249
|
get summaryScoreModeSetting() {
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
readConfObject(self.rendererConfig, 'summaryScoreMode')
|
|
242
|
-
)
|
|
250
|
+
const { summaryScoreMode, rendererConfig: conf } = self
|
|
251
|
+
return summaryScoreMode ?? readConfObject(conf, 'summaryScoreMode')
|
|
243
252
|
},
|
|
244
253
|
get domain() {
|
|
245
254
|
const { stats, scaleType, minScore, maxScore } = self
|
|
246
|
-
const { scoreMin, scoreMax } = stats
|
|
247
255
|
|
|
248
256
|
const ret = getNiceDomain({
|
|
249
|
-
domain: [scoreMin, scoreMax],
|
|
257
|
+
domain: [stats.scoreMin, stats.scoreMax],
|
|
250
258
|
bounds: [minScore, maxScore],
|
|
251
259
|
scaleType,
|
|
252
260
|
})
|
|
@@ -285,14 +293,12 @@ const stateModelFactory = (
|
|
|
285
293
|
},
|
|
286
294
|
|
|
287
295
|
get autoscaleType() {
|
|
288
|
-
return self.autoscale
|
|
296
|
+
return self.autoscale ?? getConf(self, 'autoscale')
|
|
289
297
|
},
|
|
290
298
|
|
|
291
299
|
get displayCrossHatchesSetting() {
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
readConfObject(self.rendererConfig, 'displayCrossHatches')
|
|
295
|
-
)
|
|
300
|
+
const { displayCrossHatches: hatches, rendererConfig: conf } = self
|
|
301
|
+
return hatches ?? readConfObject(conf, 'displayCrossHatches')
|
|
296
302
|
},
|
|
297
303
|
}
|
|
298
304
|
})
|
|
@@ -318,18 +324,19 @@ const stateModelFactory = (
|
|
|
318
324
|
return {
|
|
319
325
|
renderProps() {
|
|
320
326
|
const superProps = superRenderProps()
|
|
327
|
+
const { filters, ticks, height, resolution, scaleOpts } = self
|
|
321
328
|
return {
|
|
322
329
|
...superProps,
|
|
323
330
|
notReady: superProps.notReady || !self.statsReady,
|
|
324
331
|
rpcDriverName: self.rpcDriverName,
|
|
325
332
|
displayModel: self,
|
|
326
333
|
config: self.rendererConfig,
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
filters
|
|
334
|
+
displayCrossHatches: self.displayCrossHatchesSetting,
|
|
335
|
+
scaleOpts,
|
|
336
|
+
resolution,
|
|
337
|
+
height,
|
|
338
|
+
ticks,
|
|
339
|
+
filters,
|
|
333
340
|
}
|
|
334
341
|
},
|
|
335
342
|
|
|
@@ -349,6 +356,7 @@ const stateModelFactory = (
|
|
|
349
356
|
})
|
|
350
357
|
.views(self => {
|
|
351
358
|
const { trackMenuItems: superTrackMenuItems } = self
|
|
359
|
+
const hasRenderings = getConf(self, 'defaultRendering')
|
|
352
360
|
return {
|
|
353
361
|
trackMenuItems() {
|
|
354
362
|
return [
|
|
@@ -360,26 +368,20 @@ const stateModelFactory = (
|
|
|
360
368
|
subMenu: [
|
|
361
369
|
{
|
|
362
370
|
label: 'Finer resolution',
|
|
363
|
-
onClick: () =>
|
|
364
|
-
self.setResolution(self.resolution * 5)
|
|
365
|
-
},
|
|
371
|
+
onClick: () => self.setResolution(self.resolution * 5),
|
|
366
372
|
},
|
|
367
373
|
{
|
|
368
374
|
label: 'Coarser resolution',
|
|
369
|
-
onClick: () =>
|
|
370
|
-
self.setResolution(self.resolution / 5)
|
|
371
|
-
},
|
|
375
|
+
onClick: () => self.setResolution(self.resolution / 5),
|
|
372
376
|
},
|
|
373
377
|
],
|
|
374
378
|
},
|
|
375
379
|
{
|
|
376
380
|
label: 'Summary score mode',
|
|
377
|
-
subMenu: ['min', 'max', 'avg', 'whiskers'].map(elt => {
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
}
|
|
382
|
-
}),
|
|
381
|
+
subMenu: ['min', 'max', 'avg', 'whiskers'].map(elt => ({
|
|
382
|
+
label: elt,
|
|
383
|
+
onClick: () => self.setSummaryScoreMode(elt),
|
|
384
|
+
})),
|
|
383
385
|
},
|
|
384
386
|
]
|
|
385
387
|
: []),
|
|
@@ -389,33 +391,26 @@ const stateModelFactory = (
|
|
|
389
391
|
label: self.filled
|
|
390
392
|
? 'Turn off histogram fill'
|
|
391
393
|
: 'Turn on histogram fill',
|
|
392
|
-
onClick: () =>
|
|
393
|
-
self.setFill(!self.filled)
|
|
394
|
-
},
|
|
394
|
+
onClick: () => self.setFill(!self.filled),
|
|
395
395
|
},
|
|
396
396
|
]
|
|
397
397
|
: []),
|
|
398
398
|
{
|
|
399
399
|
label:
|
|
400
400
|
self.scaleType === 'log' ? 'Set linear scale' : 'Set log scale',
|
|
401
|
-
onClick: () =>
|
|
402
|
-
self.toggleLogScale()
|
|
403
|
-
},
|
|
401
|
+
onClick: () => self.toggleLogScale(),
|
|
404
402
|
},
|
|
405
403
|
{
|
|
406
404
|
type: 'checkbox',
|
|
407
405
|
label: 'Draw cross hatches',
|
|
408
406
|
checked: self.displayCrossHatchesSetting,
|
|
409
|
-
onClick: () =>
|
|
410
|
-
self.toggleCrossHatches()
|
|
411
|
-
},
|
|
407
|
+
onClick: () => self.toggleCrossHatches(),
|
|
412
408
|
},
|
|
413
|
-
|
|
414
|
-
...(Object.keys(getConf(self, 'renderers') || {}).length > 1
|
|
409
|
+
...(hasRenderings
|
|
415
410
|
? [
|
|
416
411
|
{
|
|
417
412
|
label: 'Renderer type',
|
|
418
|
-
subMenu: [
|
|
413
|
+
subMenu: ['xyplot', 'density', 'line'].map(key => ({
|
|
419
414
|
label: key,
|
|
420
415
|
onClick: () => self.setRendererType(key),
|
|
421
416
|
})),
|
|
@@ -433,30 +428,26 @@ const stateModelFactory = (
|
|
|
433
428
|
]
|
|
434
429
|
: []),
|
|
435
430
|
['localsd', 'Local ± 3σ'],
|
|
436
|
-
].map(([val, label]) => {
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
self.setAutoscale(val)
|
|
441
|
-
},
|
|
442
|
-
}
|
|
443
|
-
}),
|
|
431
|
+
].map(([val, label]) => ({
|
|
432
|
+
label,
|
|
433
|
+
onClick: () => self.setAutoscale(val),
|
|
434
|
+
})),
|
|
444
435
|
},
|
|
445
436
|
{
|
|
446
437
|
label: 'Set min/max score',
|
|
447
438
|
onClick: () => {
|
|
448
|
-
getSession(self).queueDialog(
|
|
439
|
+
getSession(self).queueDialog(handleClose => [
|
|
449
440
|
SetMinMaxDlg,
|
|
450
|
-
{ model: self, handleClose
|
|
441
|
+
{ model: self, handleClose },
|
|
451
442
|
])
|
|
452
443
|
},
|
|
453
444
|
},
|
|
454
445
|
{
|
|
455
446
|
label: 'Set color',
|
|
456
447
|
onClick: () => {
|
|
457
|
-
getSession(self).queueDialog(
|
|
448
|
+
getSession(self).queueDialog(handleClose => [
|
|
458
449
|
SetColorDlg,
|
|
459
|
-
{ model: self, handleClose
|
|
450
|
+
{ model: self, handleClose },
|
|
460
451
|
])
|
|
461
452
|
},
|
|
462
453
|
},
|
|
@@ -552,9 +543,9 @@ const stateModelFactory = (
|
|
|
552
543
|
async reload() {
|
|
553
544
|
self.setError()
|
|
554
545
|
const aborter = new AbortController()
|
|
555
|
-
|
|
546
|
+
self.setLoading(aborter)
|
|
556
547
|
try {
|
|
557
|
-
stats = await getStats({
|
|
548
|
+
const stats = await getStats({
|
|
558
549
|
signal: aborter.signal,
|
|
559
550
|
...self.renderProps(),
|
|
560
551
|
})
|
|
@@ -572,9 +563,7 @@ const stateModelFactory = (
|
|
|
572
563
|
autorun(
|
|
573
564
|
async () => {
|
|
574
565
|
try {
|
|
575
|
-
const aborter = new AbortController()
|
|
576
566
|
const view = getContainingView(self) as LGV
|
|
577
|
-
self.setLoading(aborter)
|
|
578
567
|
|
|
579
568
|
if (!view.initialized) {
|
|
580
569
|
return
|
|
@@ -586,6 +575,8 @@ const stateModelFactory = (
|
|
|
586
575
|
if (self.regionTooLarge) {
|
|
587
576
|
return
|
|
588
577
|
}
|
|
578
|
+
const aborter = new AbortController()
|
|
579
|
+
self.setLoading(aborter)
|
|
589
580
|
|
|
590
581
|
const wiggleStats = await getStats({
|
|
591
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
|
)
|