UNPKG

molstar

Version:

A comprehensive macromolecular library.

480 lines 30.1 kB
"use strict"; /** * Copyright (c) 2019 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author David Sehnal <david.sehnal@gmail.com> */ Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var ReactDOM = (0, tslib_1.__importStar)(require("react-dom")); var canvas3d_1 = require("../../mol-canvas3d/canvas3d"); var model_index_1 = require("../../mol-plugin-state/animation/built-in/model-index"); var structure_representation_params_1 = require("../../mol-plugin-state/helpers/structure-representation-params"); var transforms_1 = require("../../mol-plugin-state/transforms"); var mol_plugin_ui_1 = require("../../mol-plugin-ui"); var spec_1 = require("../../mol-plugin-ui/spec"); var transformers_1 = require("../../mol-plugin/behavior/dynamic/volume-streaming/transformers"); var commands_1 = require("../../mol-plugin/commands"); var builder_1 = require("../../mol-script/language/builder"); var mol_state_1 = require("../../mol-state"); var assets_1 = require("../../mol-util/assets"); var color_1 = require("../../mol-util/color"); var names_1 = require("../../mol-util/color/names"); var date_1 = require("../../mol-util/date"); var download_1 = require("../../mol-util/download"); var rx_event_helper_1 = require("../../mol-util/rx-event-helper"); var annotation_1 = require("./annotation"); var coloring_1 = require("./coloring"); var helpers_1 = require("./helpers"); require("./index.html"); var controls_1 = require("./ui/controls"); require('../../mol-plugin-ui/skin/light.scss'); var MolStarProteopediaWrapper = /** @class */ (function () { function MolStarProteopediaWrapper() { var _this = this; this._ev = rx_event_helper_1.RxEventHelper.create(); this.events = { modelInfo: this._ev() }; this.emptyLoadedParams = { url: '', format: 'cif', isBinary: false, assemblyId: '' }; this.loadedParams = { url: '', format: 'cif', isBinary: false, assemblyId: '' }; this.viewport = { setSettings: function (settings) { commands_1.PluginCommands.Canvas3D.SetSettings(_this.plugin, { settings: settings || canvas3d_1.DefaultCanvas3DParams }); } }; this.camera = { toggleSpin: function () { return _this.toggleSpin(); }, resetPosition: function () { return commands_1.PluginCommands.Camera.Reset(_this.plugin, {}); } }; this.animate = { modelIndex: { targetFps: 8, onceForward: function () { _this.plugin.managers.animation.play(model_index_1.AnimateModelIndex, { duration: { name: 'computed', params: { targetFps: _this.animateModelIndexTargetFps() } }, mode: { name: 'once', params: { direction: 'forward' } } }); }, onceBackward: function () { _this.plugin.managers.animation.play(model_index_1.AnimateModelIndex, { duration: { name: 'computed', params: { targetFps: _this.animateModelIndexTargetFps() } }, mode: { name: 'once', params: { direction: 'backward' } } }); }, palindrome: function () { _this.plugin.managers.animation.play(model_index_1.AnimateModelIndex, { duration: { name: 'computed', params: { targetFps: _this.animateModelIndexTargetFps() } }, mode: { name: 'palindrome', params: {} } }); }, loop: function () { _this.plugin.managers.animation.play(model_index_1.AnimateModelIndex, { duration: { name: 'computed', params: { targetFps: _this.animateModelIndexTargetFps() } }, mode: { name: 'loop', params: { direction: 'forward' } } }); }, stop: function () { return _this.plugin.managers.animation.stop(); } } }; this.coloring = { evolutionaryConservation: function (params) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () { var state, tree, colorTheme; return (0, tslib_1.__generator)(this, function (_a) { switch (_a.label) { case 0: if (!(!params || !params.keepStyle)) return [3 /*break*/, 2]; return [4 /*yield*/, this.updateStyle({ sequence: { kind: 'spacefill' } }, true)]; case 1: _a.sent(); _a.label = 2; case 2: state = this.state; tree = state.build(); colorTheme = { name: annotation_1.EvolutionaryConservation.propertyProvider.descriptor.name, params: this.plugin.representation.structure.themes.colorThemeRegistry.get(annotation_1.EvolutionaryConservation.propertyProvider.descriptor.name).defaultValues }; if (!params || !!params.sequence) { tree.to(helpers_1.StateElements.SequenceVisual).update(transforms_1.StateTransforms.Representation.StructureRepresentation3D, function (old) { return ((0, tslib_1.__assign)((0, tslib_1.__assign)({}, old), { colorTheme: colorTheme })); }); } if (params && !!params.het) { tree.to(helpers_1.StateElements.HetVisual).update(transforms_1.StateTransforms.Representation.StructureRepresentation3D, function (old) { return ((0, tslib_1.__assign)((0, tslib_1.__assign)({}, old), { colorTheme: colorTheme })); }); } return [4 /*yield*/, commands_1.PluginCommands.State.Update(this.plugin, { state: state, tree: tree })]; case 3: _a.sent(); return [2 /*return*/]; } }); }); } }; this.experimentalDataElement = void 0; this.experimentalData = { init: function (parent) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () { var asm, params; return (0, tslib_1.__generator)(this, function (_a) { switch (_a.label) { case 0: asm = this.state.select(helpers_1.StateElements.Assembly)[0].obj; params = transformers_1.InitVolumeStreaming.createDefaultParams(asm, this.plugin); params.options.behaviorRef = helpers_1.StateElements.VolumeStreaming; params.defaultView = 'box'; params.options.channelParams['fo-fc(+ve)'] = { wireframe: true }; params.options.channelParams['fo-fc(-ve)'] = { wireframe: true }; return [4 /*yield*/, this.plugin.runTask(this.state.applyAction(transformers_1.InitVolumeStreaming, params, helpers_1.StateElements.Assembly))]; case 1: _a.sent(); this.experimentalDataElement = parent; (0, controls_1.volumeStreamingControls)(this.plugin, parent); return [2 /*return*/]; } }); }); }, remove: function () { var r = _this.state.select(mol_state_1.StateSelection.Generators.ofTransformer(transformers_1.CreateVolumeStreamingInfo))[0]; if (!r) return; commands_1.PluginCommands.State.RemoveObject(_this.plugin, { state: _this.state, ref: r.transform.ref }); if (_this.experimentalDataElement) { ReactDOM.unmountComponentAtNode(_this.experimentalDataElement); _this.experimentalDataElement = void 0; } } }; this.hetGroups = { reset: function () { var update = _this.state.build().delete(helpers_1.StateElements.HetGroupFocusGroup); commands_1.PluginCommands.State.Update(_this.plugin, { state: _this.state, tree: update }); commands_1.PluginCommands.Camera.Reset(_this.plugin, {}); }, focusFirst: function (compId, options) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () { var update, core, surroundings, group, asm, coreSel, waters, exclude, onlySurroundings, focus, sphere, radius, snapshot; return (0, tslib_1.__generator)(this, function (_a) { switch (_a.label) { case 0: if (!this.state.transforms.has(helpers_1.StateElements.Assembly)) return [2 /*return*/]; return [4 /*yield*/, commands_1.PluginCommands.Camera.Reset(this.plugin, {})]; case 1: _a.sent(); update = this.state.build(); update.delete(helpers_1.StateElements.HetGroupFocusGroup); core = builder_1.MolScriptBuilder.struct.filter.first([ builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'residue-test': builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.struct.atomProperty.macromolecular.label_comp_id(), compId]), 'group-by': builder_1.MolScriptBuilder.core.str.concat([builder_1.MolScriptBuilder.struct.atomProperty.core.operatorName(), builder_1.MolScriptBuilder.struct.atomProperty.macromolecular.residueKey()]) }) ]); surroundings = builder_1.MolScriptBuilder.struct.modifier.includeSurroundings({ 0: core, radius: 5, 'as-whole-residues': true }); group = update.to(helpers_1.StateElements.Assembly).group(transforms_1.StateTransforms.Misc.CreateGroup, { label: compId }, { ref: helpers_1.StateElements.HetGroupFocusGroup }); asm = this.state.select(helpers_1.StateElements.Assembly)[0].obj; coreSel = group.apply(transforms_1.StateTransforms.Model.StructureSelectionFromExpression, { label: 'Core', expression: core }, { ref: helpers_1.StateElements.HetGroupFocus }); coreSel.apply(transforms_1.StateTransforms.Representation.StructureRepresentation3D, (0, structure_representation_params_1.createStructureRepresentationParams)(this.plugin, asm.data, { type: 'ball-and-stick' })); coreSel.apply(transforms_1.StateTransforms.Representation.StructureRepresentation3D, (0, structure_representation_params_1.createStructureRepresentationParams)(this.plugin, asm.data, { type: 'label', typeParams: { level: 'element' } }), { tags: ['proteopedia-labels'] }); group.apply(transforms_1.StateTransforms.Model.StructureSelectionFromExpression, { label: 'Surroundings', expression: surroundings }) .apply(transforms_1.StateTransforms.Representation.StructureRepresentation3D, (0, structure_representation_params_1.createStructureRepresentationParams)(this.plugin, asm.data, { type: 'ball-and-stick', color: 'uniform', colorParams: { value: names_1.ColorNames.gray }, size: 'uniform', sizeParams: { value: 0.33 } })); if (!(options === null || options === void 0 ? void 0 : options.hideLabels)) { waters = builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'entity-test': builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.struct.atomProperty.macromolecular.entityType(), 'water']), }); exclude = (options === null || options === void 0 ? void 0 : options.doNotLabelWaters) ? builder_1.MolScriptBuilder.struct.combinator.merge([core, waters]) : core; onlySurroundings = builder_1.MolScriptBuilder.struct.modifier.exceptBy({ 0: surroundings, by: exclude }); group.apply(transforms_1.StateTransforms.Model.StructureSelectionFromExpression, { label: 'Surroundings (only)', expression: onlySurroundings }) .apply(transforms_1.StateTransforms.Representation.StructureRepresentation3D, (0, structure_representation_params_1.createStructureRepresentationParams)(this.plugin, asm.data, { type: 'label', typeParams: { level: 'residue' } }), { tags: ['proteopedia-labels'] }); // the tag can later be used to toggle the labels } return [4 /*yield*/, commands_1.PluginCommands.State.Update(this.plugin, { state: this.state, tree: update })]; case 2: _a.sent(); focus = this.state.select(helpers_1.StateElements.HetGroupFocus)[0].obj.data; sphere = focus.boundary.sphere; radius = Math.max(sphere.radius, 5); snapshot = this.plugin.canvas3d.camera.getFocus(sphere.center, radius); commands_1.PluginCommands.Camera.SetSnapshot(this.plugin, { snapshot: snapshot, durationMs: 250 }); return [2 /*return*/]; } }); }); } }; this.snapshot = { get: function (params) { return _this.plugin.state.getSnapshot(params); }, set: function (snapshot) { return _this.plugin.state.setSnapshot(snapshot); }, download: function (type, params) { if (type === void 0) { type = 'molj'; } return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () { var data; return (0, tslib_1.__generator)(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.plugin.managers.snapshot.serialize({ type: type, params: params })]; case 1: data = _a.sent(); (0, download_1.download)(data, "mol-star_state_" + (0, date_1.getFormattedTime)() + "." + type); return [2 /*return*/]; } }); }); }, fetch: function (url, type) { if (type === void 0) { type = 'molj'; } return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () { var data, e_1; return (0, tslib_1.__generator)(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 3, , 4]); return [4 /*yield*/, this.plugin.runTask(this.plugin.fetch({ url: url, type: 'binary' }))]; case 1: data = _a.sent(); this.loadedParams = (0, tslib_1.__assign)({}, this.emptyLoadedParams); return [4 /*yield*/, this.plugin.managers.snapshot.open(new File([data], "state." + type))]; case 2: return [2 /*return*/, _a.sent()]; case 3: e_1 = _a.sent(); console.log(e_1); return [3 /*break*/, 4]; case 4: return [2 /*return*/]; } }); }); } }; } MolStarProteopediaWrapper.prototype.init = function (target, options) { this.plugin = (0, mol_plugin_ui_1.createPlugin)(typeof target === 'string' ? document.getElementById(target) : target, (0, tslib_1.__assign)((0, tslib_1.__assign)({}, (0, spec_1.DefaultPluginUISpec)()), { animations: [ model_index_1.AnimateModelIndex ], layout: { initial: { isExpanded: false, showControls: false } }, components: { remoteState: 'none' } })); var customColoring = (0, coloring_1.createProteopediaCustomTheme)((options && options.customColorList) || []); this.plugin.representation.structure.themes.colorThemeRegistry.add(customColoring); this.plugin.representation.structure.themes.colorThemeRegistry.add(annotation_1.EvolutionaryConservation.colorThemeProvider); this.plugin.managers.lociLabels.addProvider(annotation_1.EvolutionaryConservation.labelProvider); this.plugin.customModelProperties.register(annotation_1.EvolutionaryConservation.propertyProvider, true); }; Object.defineProperty(MolStarProteopediaWrapper.prototype, "state", { get: function () { return this.plugin.state.data; }, enumerable: false, configurable: true }); MolStarProteopediaWrapper.prototype.download = function (b, url, isBinary) { return b.apply(transforms_1.StateTransforms.Data.Download, { url: assets_1.Asset.Url(url), isBinary: isBinary }); }; MolStarProteopediaWrapper.prototype.model = function (b, format) { var parsed = format === 'cif' ? b.apply(transforms_1.StateTransforms.Data.ParseCif).apply(transforms_1.StateTransforms.Model.TrajectoryFromMmCif) : b.apply(transforms_1.StateTransforms.Model.TrajectoryFromPDB); return parsed .apply(transforms_1.StateTransforms.Model.ModelFromTrajectory, { modelIndex: 0 }, { ref: helpers_1.StateElements.Model }); }; MolStarProteopediaWrapper.prototype.structure = function (assemblyId) { var model = this.state.build().to(helpers_1.StateElements.Model); var props = { type: assemblyId ? { name: 'assembly', params: { id: assemblyId } } : { name: 'model', params: {} } }; var s = model .apply(transforms_1.StateTransforms.Model.StructureFromModel, props, { ref: helpers_1.StateElements.Assembly }); s.apply(transforms_1.StateTransforms.Model.StructureComplexElement, { type: 'atomic-sequence' }, { ref: helpers_1.StateElements.Sequence }); s.apply(transforms_1.StateTransforms.Model.StructureComplexElement, { type: 'atomic-het' }, { ref: helpers_1.StateElements.Het }); s.apply(transforms_1.StateTransforms.Model.StructureComplexElement, { type: 'water' }, { ref: helpers_1.StateElements.Water }); return s; }; MolStarProteopediaWrapper.prototype.visual = function (_style, partial) { var structure = this.getObj(helpers_1.StateElements.Assembly); if (!structure) return; var style = _style || {}; var update = this.state.build(); if (!partial || (partial && style.sequence)) { var root = update.to(helpers_1.StateElements.Sequence); if (style.sequence && style.sequence.hide) { root.delete(helpers_1.StateElements.SequenceVisual); } else { root.applyOrUpdate(helpers_1.StateElements.SequenceVisual, transforms_1.StateTransforms.Representation.StructureRepresentation3D, (0, structure_representation_params_1.createStructureRepresentationParams)(this.plugin, structure, { type: (style.sequence && style.sequence.kind) || 'cartoon', color: (style.sequence && style.sequence.coloring) || 'unit-index' })); } } if (!partial || (partial && style.hetGroups)) { var root = update.to(helpers_1.StateElements.Het); if (style.hetGroups && style.hetGroups.hide) { root.delete(helpers_1.StateElements.HetVisual); } else { if (style.hetGroups && style.hetGroups.hide) { root.delete(helpers_1.StateElements.HetVisual); } else { root.applyOrUpdate(helpers_1.StateElements.HetVisual, transforms_1.StateTransforms.Representation.StructureRepresentation3D, (0, structure_representation_params_1.createStructureRepresentationParams)(this.plugin, structure, { type: (style.hetGroups && style.hetGroups.kind) || 'ball-and-stick', color: style.hetGroups && style.hetGroups.coloring })); } } } if (!partial || (partial && style.snfg3d)) { var root = update.to(helpers_1.StateElements.Het); if (style.hetGroups && style.hetGroups.hide) { root.delete(helpers_1.StateElements.HetVisual); } else { if (style.snfg3d && style.snfg3d.hide) { root.delete(helpers_1.StateElements.Het3DSNFG); } else { root.applyOrUpdate(helpers_1.StateElements.Het3DSNFG, transforms_1.StateTransforms.Representation.StructureRepresentation3D, (0, structure_representation_params_1.createStructureRepresentationParams)(this.plugin, structure, { type: 'carbohydrate' })); } } } if (!partial || (partial && style.water)) { var root = update.to(helpers_1.StateElements.Water); if (style.water && style.water.hide) { root.delete(helpers_1.StateElements.WaterVisual); } else { root.applyOrUpdate(helpers_1.StateElements.WaterVisual, transforms_1.StateTransforms.Representation.StructureRepresentation3D, (0, structure_representation_params_1.createStructureRepresentationParams)(this.plugin, structure, { type: (style.water && style.water.kind) || 'ball-and-stick', typeParams: { alpha: 0.51 }, color: style.water && style.water.coloring })); } } return update; }; MolStarProteopediaWrapper.prototype.getObj = function (ref) { var state = this.state; var cell = state.select(ref)[0]; if (!cell || !cell.obj) return void 0; return cell.obj.data; }; MolStarProteopediaWrapper.prototype.doInfo = function (checkPreferredAssembly) { return (0, tslib_1.__awaiter)(this, void 0, void 0, function () { var model, info; return (0, tslib_1.__generator)(this, function (_a) { switch (_a.label) { case 0: model = this.getObj('model'); if (!model) return [2 /*return*/]; return [4 /*yield*/, helpers_1.ModelInfo.get(this.plugin, model, checkPreferredAssembly)]; case 1: info = _a.sent(); this.events.modelInfo.next(info); return [2 /*return*/, info]; } }); }); }; MolStarProteopediaWrapper.prototype.applyState = function (tree) { return commands_1.PluginCommands.State.Update(this.plugin, { state: this.plugin.state.data, tree: tree }); }; MolStarProteopediaWrapper.prototype.load = function (_a) { var url = _a.url, _b = _a.format, format = _b === void 0 ? 'cif' : _b, _c = _a.assemblyId, assemblyId = _c === void 0 ? '' : _c, _d = _a.isBinary, isBinary = _d === void 0 ? false : _d, representationStyle = _a.representationStyle; return (0, tslib_1.__awaiter)(this, void 0, void 0, function () { var loadType, state, modelTree, info, asmId, structureTree, tree, info, asmId, props_1; return (0, tslib_1.__generator)(this, function (_e) { switch (_e.label) { case 0: loadType = 'full'; state = this.plugin.state.data; if (this.loadedParams.url !== url || this.loadedParams.format !== format) { loadType = 'full'; } else if (this.loadedParams.url === url) { if (state.select(helpers_1.StateElements.Assembly).length > 0) loadType = 'update'; } if (!(loadType === 'full')) return [3 /*break*/, 5]; return [4 /*yield*/, commands_1.PluginCommands.State.RemoveObject(this.plugin, { state: state, ref: state.tree.root.ref })]; case 1: _e.sent(); modelTree = this.model(this.download(state.build().toRoot(), url, isBinary), format); return [4 /*yield*/, this.applyState(modelTree)]; case 2: _e.sent(); return [4 /*yield*/, this.doInfo(true)]; case 3: info = _e.sent(); asmId = (assemblyId === 'preferred' && info && info.preferredAssemblyId) || assemblyId; structureTree = this.structure(asmId); return [4 /*yield*/, this.applyState(structureTree)]; case 4: _e.sent(); return [3 /*break*/, 8]; case 5: tree = state.build(); return [4 /*yield*/, this.doInfo(true)]; case 6: info = _e.sent(); asmId = (assemblyId === 'preferred' && info && info.preferredAssemblyId) || assemblyId; props_1 = { type: assemblyId ? { name: 'assembly', params: { id: asmId } } : { name: 'model', params: {} } }; tree.to(helpers_1.StateElements.Assembly).update(transforms_1.StateTransforms.Model.StructureFromModel, function (p) { return ((0, tslib_1.__assign)((0, tslib_1.__assign)({}, p), props_1)); }); return [4 /*yield*/, this.applyState(tree)]; case 7: _e.sent(); _e.label = 8; case 8: return [4 /*yield*/, this.updateStyle(representationStyle)]; case 9: _e.sent(); this.loadedParams = { url: url, format: format, assemblyId: assemblyId }; return [2 /*return*/]; } }); }); }; MolStarProteopediaWrapper.prototype.updateStyle = function (style, partial) { return (0, tslib_1.__awaiter)(this, void 0, void 0, function () { var tree; return (0, tslib_1.__generator)(this, function (_a) { switch (_a.label) { case 0: tree = this.visual(style, partial); if (!tree) return [2 /*return*/]; return [4 /*yield*/, commands_1.PluginCommands.State.Update(this.plugin, { state: this.plugin.state.data, tree: tree })]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }; MolStarProteopediaWrapper.prototype.setBackground = function (color) { if (!this.plugin.canvas3d) return; var renderer = this.plugin.canvas3d.props.renderer; commands_1.PluginCommands.Canvas3D.SetSettings(this.plugin, { settings: { renderer: (0, tslib_1.__assign)((0, tslib_1.__assign)({}, renderer), { backgroundColor: (0, color_1.Color)(color) }) } }); }; MolStarProteopediaWrapper.prototype.toggleSpin = function () { if (!this.plugin.canvas3d) return; var trackball = this.plugin.canvas3d.props.trackball; commands_1.PluginCommands.Canvas3D.SetSettings(this.plugin, { settings: { trackball: (0, tslib_1.__assign)((0, tslib_1.__assign)({}, trackball), { spin: !trackball.spin }) } }); }; MolStarProteopediaWrapper.prototype.animateModelIndexTargetFps = function () { return Math.max(1, this.animate.modelIndex.targetFps | 0); }; MolStarProteopediaWrapper.VERSION_MAJOR = 5; MolStarProteopediaWrapper.VERSION_MINOR = 5; return MolStarProteopediaWrapper; }()); window.MolStarProteopediaWrapper = MolStarProteopediaWrapper; //# sourceMappingURL=index.js.map