molstar
Version:
A comprehensive macromolecular library.
480 lines • 30.1 kB
JavaScript
"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