UNPKG

molstar

Version:

A comprehensive macromolecular library.

92 lines (91 loc) 4.46 kB
/** * Copyright (c) 2018-2022 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Adam Midlik <midlik@gmail.com> */ var _a; import { PluginStateObject as SO } from '../../mol-plugin-state/objects'; import { PluginBehavior } from '../../mol-plugin/behavior'; import { PluginConfigItem } from '../../mol-plugin/config'; import { StateAction } from '../../mol-state'; import { Task } from '../../mol-task'; import { DEFAULT_VOLSEG_SERVER, VolumeApiV2 } from './volseg-api/api'; import { VolsegEntryData, VolsegEntryParamValues, createLoadVolsegParams } from './entry-root'; import { VolsegGlobalState } from './global-state'; import { createEntryId } from './helpers'; import { VolsegEntryFromRoot, VolsegGlobalStateFromRoot, VolsegStateFromEntry } from './transformers'; import { VolsegUI } from './ui'; const DEBUGGING = typeof window !== 'undefined' ? ((_a = window === null || window === void 0 ? void 0 : window.location) === null || _a === void 0 ? void 0 : _a.hostname) === 'localhost' : false; export const VolsegVolumeServerConfig = { // DefaultServer: new PluginConfigItem('volseg-volume-server', DEFAULT_VOLUME_SERVER_V2), DefaultServer: new PluginConfigItem('volseg-volume-server', DEBUGGING ? 'http://localhost:9000/v2' : DEFAULT_VOLSEG_SERVER), }; export const Volseg = PluginBehavior.create({ name: 'volseg', category: 'misc', display: { name: 'Volseg', description: 'Volseg' }, ctor: class extends PluginBehavior.Handler { register() { this.ctx.state.data.actions.add(LoadVolseg); this.ctx.customStructureControls.set('volseg', VolsegUI); this.initializeEntryLists(); // do not await const entries = new Map(); this.subscribeObservable(this.ctx.state.data.events.cell.created, o => { if (o.cell.obj instanceof VolsegEntryData) entries.set(o.ref, o.cell.obj); }); this.subscribeObservable(this.ctx.state.data.events.cell.removed, o => { if (entries.has(o.ref)) { entries.get(o.ref).dispose(); entries.delete(o.ref); } }); } unregister() { this.ctx.state.data.actions.remove(LoadVolseg); this.ctx.customStructureControls.delete('volseg'); } async initializeEntryLists() { var _a; const apiUrl = (_a = this.ctx.config.get(VolsegVolumeServerConfig.DefaultServer)) !== null && _a !== void 0 ? _a : DEFAULT_VOLSEG_SERVER; const api = new VolumeApiV2(apiUrl); const entryLists = await api.getEntryList(10 ** 6); Object.values(entryLists).forEach(l => l.sort()); this.ctx.customState.volsegAvailableEntries = entryLists; } } }); export const LoadVolseg = StateAction.build({ display: { name: 'Load Volume & Segmentation' }, from: SO.Root, params: (a, plugin) => { const res = createLoadVolsegParams(plugin, plugin.customState.volsegAvailableEntries); return res; }, })(({ params, state }, ctx) => Task.create('Loading Volume & Segmentation', taskCtx => { return state.transaction(async () => { const entryParams = VolsegEntryParamValues.fromLoadVolsegParamValues(params); if (entryParams.entryId.trim().length === 0) { alert('Must specify Entry Id!'); throw new Error('Specify Entry Id'); } if (!entryParams.entryId.includes('-')) { // add source prefix if the user omitted it (e.g. 1832 -> emd-1832) entryParams.entryId = createEntryId(entryParams.source, entryParams.entryId); } ctx.behaviors.layout.leftPanelTabName.next('data'); const globalStateNode = ctx.state.data.selectQ(q => q.ofType(VolsegGlobalState))[0]; if (!globalStateNode) { await state.build().toRoot().apply(VolsegGlobalStateFromRoot, {}, { state: { isGhost: !DEBUGGING } }).commit(); } const entryNode = await state.build().toRoot().apply(VolsegEntryFromRoot, entryParams).commit(); await state.build().to(entryNode).apply(VolsegStateFromEntry, {}, { state: { isGhost: !DEBUGGING } }).commit(); if (entryNode.data) { await entryNode.data.loadVolume(); await entryNode.data.loadSegmentations(); } }).runInContext(taskCtx); }));