UNPKG

@jbrowse/plugin-wiggle

Version:

JBrowse 2 wiggle adapters, tracks, etc.

344 lines (343 loc) 13.9 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = SharedWiggleMixin; const react_1 = require("react"); const configuration_1 = require("@jbrowse/core/configuration"); const util_1 = require("@jbrowse/core/util"); const stopToken_1 = require("@jbrowse/core/util/stopToken"); const plugin_linear_genome_view_1 = require("@jbrowse/plugin-linear-genome-view"); const mobx_state_tree_1 = require("mobx-state-tree"); const util_2 = require("../util"); const SetMinMaxDialog = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./SetMinMaxDialog')))); function SharedWiggleMixin(configSchema) { return mobx_state_tree_1.types .compose(plugin_linear_genome_view_1.BaseLinearDisplay, mobx_state_tree_1.types.model({ selectedRendering: mobx_state_tree_1.types.optional(mobx_state_tree_1.types.string, ''), resolution: mobx_state_tree_1.types.optional(mobx_state_tree_1.types.number, 1), fill: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.boolean), minSize: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.number), color: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.string), posColor: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.string), negColor: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.string), summaryScoreMode: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.string), rendererTypeNameState: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.string), scale: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.string), autoscale: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.string), displayCrossHatches: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.boolean), constraints: mobx_state_tree_1.types.optional(mobx_state_tree_1.types.model({ max: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.number), min: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.number), }), {}), configuration: (0, configuration_1.ConfigurationReference)(configSchema), })) .volatile(() => ({ message: undefined, stats: undefined, statsFetchInProgress: undefined, })) .actions(self => ({ updateQuantitativeStats(stats) { const { currStatsBpPerPx, scoreMin, scoreMax } = stats; const EPSILON = 0.000001; if (!self.stats || Math.abs(self.stats.scoreMax - scoreMax) > EPSILON || Math.abs(self.stats.scoreMin - scoreMin) > EPSILON) { self.stats = { currStatsBpPerPx, scoreMin, scoreMax, }; } }, setColor(color) { self.color = color; }, setPosColor(color) { self.posColor = color; }, setNegColor(color) { self.negColor = color; }, setStatsLoading(arg) { if (self.statsFetchInProgress) { (0, stopToken_1.stopStopToken)(self.statsFetchInProgress); } self.statsFetchInProgress = arg; }, selectFeature(feature) { const session = (0, util_1.getSession)(self); if ((0, util_1.isSelectionContainer)(session)) { session.setSelection(feature); } }, setResolution(res) { self.resolution = res; }, setFill(fill) { if (fill === 0) { self.fill = true; self.minSize = 0; } else if (fill === 1) { self.fill = false; self.minSize = 1; } else if (fill === 2) { self.fill = false; self.minSize = 2; } }, toggleLogScale() { self.scale = self.scale === 'log' ? 'linear' : 'log'; }, setScaleType(scale) { self.scale = scale; }, setSummaryScoreMode(val) { self.summaryScoreMode = val; }, setAutoscale(val) { self.autoscale = val; }, setMaxScore(val) { self.constraints.max = val; }, setRendererType(val) { self.rendererTypeNameState = val; }, setMinScore(val) { self.constraints.min = val; }, toggleCrossHatches() { self.displayCrossHatches = !self.displayCrossHatches; }, setCrossHatches(cross) { self.displayCrossHatches = cross; }, })) .views(self => ({ get adapterTypeName() { return self.adapterConfig.type; }, get rendererTypeNameSimple() { var _a; return ((_a = self.rendererTypeNameState) !== null && _a !== void 0 ? _a : (0, configuration_1.getConf)(self, 'defaultRendering')); }, get filters() { return undefined; }, get scaleType() { var _a; return (_a = self.scale) !== null && _a !== void 0 ? _a : (0, configuration_1.getConf)(self, 'scaleType'); }, get maxScore() { var _a; return (_a = self.constraints.max) !== null && _a !== void 0 ? _a : (0, configuration_1.getConf)(self, 'maxScore'); }, get minScore() { var _a; return (_a = self.constraints.min) !== null && _a !== void 0 ? _a : (0, configuration_1.getConf)(self, 'minScore'); }, })) .views(self => ({ get adapterCapabilities() { const type = self.adapterTypeName; const { pluginManager } = (0, util_1.getEnv)(self); return pluginManager.getAdapterType(type).adapterCapabilities; }, get rendererConfig() { const { color, displayCrossHatches, fill, minSize, negColor, posColor, summaryScoreMode, scaleType, rendererTypeName, } = self; const configBlob = (0, configuration_1.getConf)(self, ['renderers', rendererTypeName]) || {}; return self.rendererType.configSchema.create({ ...configBlob, ...(scaleType ? { scaleType } : {}), ...(fill !== undefined ? { filled: fill } : {}), ...(displayCrossHatches !== undefined ? { displayCrossHatches } : {}), ...(summaryScoreMode !== undefined ? { summaryScoreMode } : {}), ...(color !== undefined ? { color } : {}), ...(negColor !== undefined ? { negColor } : {}), ...(posColor !== undefined ? { posColor } : {}), ...(minSize !== undefined ? { minSize } : {}), }, (0, util_1.getEnv)(self)); }, get autoscaleType() { var _a; return (_a = self.autoscale) !== null && _a !== void 0 ? _a : (0, configuration_1.getConf)(self, 'autoscale'); }, })) .views(self => { let oldDomain = [0, 0]; return { get domain() { const { stats, scaleType, minScore, maxScore } = self; if (!stats) { return undefined; } const ret = (0, util_2.getNiceDomain)({ domain: [stats.scoreMin, stats.scoreMax], bounds: [minScore, maxScore], scaleType, }); if (scaleType === 'log' && ret[1] === Number.MIN_VALUE) { return [0, Number.MIN_VALUE]; } if (JSON.stringify(oldDomain) !== JSON.stringify(ret)) { oldDomain = ret; } return oldDomain; }, }; }) .views(self => ({ get filled() { var _a; return ((_a = self.fill) !== null && _a !== void 0 ? _a : (0, configuration_1.readConfObject)(self.rendererConfig, 'filled')); }, get summaryScoreModeSetting() { var _a; return ((_a = self.summaryScoreMode) !== null && _a !== void 0 ? _a : (0, configuration_1.readConfObject)(self.rendererConfig, 'summaryScoreMode')); }, get scaleOpts() { return { domain: self.domain, stats: self.stats, autoscaleType: self.autoscaleType, scaleType: self.scaleType, inverted: (0, configuration_1.getConf)(self, 'inverted'), }; }, get canHaveFill() { return self.rendererTypeName === 'XYPlotRenderer'; }, get displayCrossHatchesSetting() { var _a; return ((_a = self.displayCrossHatches) !== null && _a !== void 0 ? _a : (0, configuration_1.readConfObject)(self.rendererConfig, 'displayCrossHatches')); }, get hasResolution() { return self.adapterCapabilities.includes('hasResolution'); }, get hasGlobalStats() { return self.adapterCapabilities.includes('hasGlobalStats'); }, })) .views(self => ({ scoreTrackMenuItems() { return [ ...(self.hasResolution ? [ { label: 'Resolution', subMenu: [ { label: 'Finer resolution', onClick: () => { self.setResolution(self.resolution * 5); }, }, { label: 'Coarser resolution', onClick: () => { self.setResolution(self.resolution / 5); }, }, ], }, { label: 'Summary score mode', subMenu: ['min', 'max', 'avg', 'whiskers'].map(elt => ({ label: elt, type: 'radio', checked: self.summaryScoreModeSetting === elt, onClick: () => { self.setSummaryScoreMode(elt); }, })), }, ] : []), { label: self.scaleType === 'log' ? 'Set linear scale' : 'Set log scale', onClick: () => { self.toggleLogScale(); }, }, { label: 'Autoscale type', subMenu: [ ['local', 'Local'], ...(self.hasGlobalStats ? [ ['global', 'Global'], ['globalsd', 'Global ± 3σ'], ] : []), ['localsd', 'Local ± 3σ'], ].map(([val, label]) => ({ label, type: 'radio', checked: self.autoscaleType === val, onClick: () => { self.setAutoscale(val); }, })), }, { label: 'Set min/max score', onClick: () => { (0, util_1.getSession)(self).queueDialog(handleClose => [ SetMinMaxDialog, { model: self, handleClose, }, ]); }, }, ]; }, })) .actions(self => { const { reload: superReload } = self; return { async reload() { self.setError(); superReload(); }, }; }); }