UNPKG

molstar

Version:

A comprehensive macromolecular library.

301 lines 20.9 kB
"use strict"; /** * Copyright (c) 2018-2020 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author David Sehnal <david.sehnal@gmail.com> * @author Alexander Rose <alexander.rose@weirdbyte.de> */ Object.defineProperty(exports, "__esModule", { value: true }); exports.AddTrajectory = exports.EnableStructureCustomProps = exports.EnableModelCustomProps = exports.UpdateTrajectory = exports.DownloadStructure = exports.PdbDownloadProvider = void 0; var tslib_1 = require("tslib"); var mol_state_1 = require("../../mol-state"); var mol_task_1 = require("../../mol-task"); var param_definition_1 = require("../../mol-util/param-definition"); var representation_preset_1 = require("../builder/structure/representation-preset"); var trajectory_1 = require("../formats/trajectory"); var root_structure_1 = require("../helpers/root-structure"); var objects_1 = require("../objects"); var transforms_1 = require("../transforms"); var model_1 = require("../transforms/model"); var assets_1 = require("../../mol-util/assets"); var config_1 = require("../../mol-plugin/config"); var DownloadModelRepresentationOptions = function (plugin) { return param_definition_1.ParamDefinition.Group({ type: root_structure_1.RootStructureDefinition.getParams(void 0, 'auto').type, representation: param_definition_1.ParamDefinition.Select(representation_preset_1.PresetStructureRepresentations.auto.id, plugin.builders.structure.representation.getPresets().map(function (p) { return [p.id, p.display.name, p.display.group]; }), { description: 'Which representation preset to use.' }), representationParams: param_definition_1.ParamDefinition.Group(representation_preset_1.StructureRepresentationPresetProvider.CommonParams, { isHidden: true }), asTrajectory: param_definition_1.ParamDefinition.Optional(param_definition_1.ParamDefinition.Boolean(false, { description: 'Load all entries into a single trajectory.' })) }, { isExpanded: false }); }; exports.PdbDownloadProvider = { 'rcsb': param_definition_1.ParamDefinition.Group({ encoding: param_definition_1.ParamDefinition.Select('bcif', [['cif', 'cif'], ['bcif', 'bcif']]), }, { label: 'RCSB PDB', isFlat: true }), 'pdbe': param_definition_1.ParamDefinition.Group({ variant: param_definition_1.ParamDefinition.Select('updated-bcif', [['updated-bcif', 'Updated (bcif)'], ['updated', 'Updated'], ['archival', 'Archival']]), }, { label: 'PDBe', isFlat: true }), }; var DownloadStructure = mol_state_1.StateAction.build({ from: objects_1.PluginStateObject.Root, display: { name: 'Download Structure', description: 'Load a structure from the provided source and create its representation.' }, params: function (_, plugin) { var options = DownloadModelRepresentationOptions(plugin); var defaultPdbProvider = plugin.config.get(config_1.PluginConfig.Download.DefaultPdbProvider) || 'pdbe'; return { source: param_definition_1.ParamDefinition.MappedStatic('pdb', { 'pdb': param_definition_1.ParamDefinition.Group({ provider: param_definition_1.ParamDefinition.Group({ id: param_definition_1.ParamDefinition.Text('1tqn', { label: 'PDB Id(s)', description: 'One or more comma/space separated PDB ids.' }), server: param_definition_1.ParamDefinition.MappedStatic(defaultPdbProvider, exports.PdbDownloadProvider), }, { pivot: 'id' }), options: options }, { isFlat: true, label: 'PDB' }), 'pdb-dev': param_definition_1.ParamDefinition.Group({ provider: param_definition_1.ParamDefinition.Group({ id: param_definition_1.ParamDefinition.Text('PDBDEV_00000001', { label: 'PDBDev Id(s)', description: 'One or more comma/space separated ids.' }), encoding: param_definition_1.ParamDefinition.Select('bcif', [['cif', 'cif'], ['bcif', 'bcif']]), }, { pivot: 'id' }), options: options }, { isFlat: true, label: 'PDBDEV' }), 'swissmodel': param_definition_1.ParamDefinition.Group({ id: param_definition_1.ParamDefinition.Text('Q9Y2I8', { label: 'UniProtKB AC(s)', description: 'One or more comma/space separated ACs.' }), options: options }, { isFlat: true, label: 'SWISS-MODEL', description: 'Loads the best homology model or experimental structure' }), 'pubchem': param_definition_1.ParamDefinition.Group({ id: param_definition_1.ParamDefinition.Text('2244,2245', { label: 'PubChem ID', description: 'One or more comma/space separated IDs.' }), options: options }, { isFlat: true, label: 'PubChem', description: 'Loads 3D conformer from PubChem.' }), 'url': param_definition_1.ParamDefinition.Group({ url: param_definition_1.ParamDefinition.Url(''), format: param_definition_1.ParamDefinition.Select('mmcif', param_definition_1.ParamDefinition.arrayToOptions(trajectory_1.BuiltInTrajectoryFormats.map(function (f) { return f[0]; }), function (f) { return f; })), isBinary: param_definition_1.ParamDefinition.Boolean(false), options: options }, { isFlat: true, label: 'URL' }) }) }; } })(function (_a, plugin) { var params = _a.params, state = _a.state; return mol_task_1.Task.create('Download Structure', function (ctx) { return (0, tslib_1.__awaiter)(void 0, void 0, void 0, function () { var src, downloadParams, asTrajectory, format, representationPreset, showUnitcell, structure; return (0, tslib_1.__generator)(this, function (_a) { switch (_a.label) { case 0: plugin.behaviors.layout.leftPanelTabName.next('data'); src = params.source; asTrajectory = false, format = 'mmcif'; switch (src.name) { case 'url': downloadParams = [{ url: src.params.url, isBinary: src.params.isBinary }]; format = src.params.format; break; case 'pdb': downloadParams = src.params.provider.server.name === 'pdbe' ? src.params.provider.server.params.variant === 'updated' ? getDownloadParams(src.params.provider.id, function (id) { return "https://www.ebi.ac.uk/pdbe/static/entry/" + id.toLowerCase() + "_updated.cif"; }, function (id) { return "PDBe: " + id + " (updated cif)"; }, false) : src.params.provider.server.params.variant === 'updated-bcif' ? getDownloadParams(src.params.provider.id, function (id) { return "https://www.ebi.ac.uk/pdbe/entry-files/download/" + id.toLowerCase() + ".bcif"; }, function (id) { return "PDBe: " + id + " (updated cif)"; }, true) : getDownloadParams(src.params.provider.id, function (id) { return "https://www.ebi.ac.uk/pdbe/static/entry/" + id.toLowerCase() + ".cif"; }, function (id) { return "PDBe: " + id + " (cif)"; }, false) : src.params.provider.server.params.encoding === 'cif' ? getDownloadParams(src.params.provider.id, function (id) { return "https://files.rcsb.org/download/" + id.toUpperCase() + ".cif"; }, function (id) { return "RCSB: " + id + " (cif)"; }, false) : getDownloadParams(src.params.provider.id, function (id) { return "https://models.rcsb.org/" + id.toUpperCase() + ".bcif"; }, function (id) { return "RCSB: " + id + " (bcif)"; }, true); asTrajectory = !!src.params.options.asTrajectory; break; case 'pdb-dev': downloadParams = getDownloadParams(src.params.provider.id, function (id) { var nId = id.toUpperCase().startsWith('PDBDEV_') ? id : "PDBDEV_" + id.padStart(8, '0'); return src.params.provider.encoding === 'bcif' ? "https://pdb-dev.wwpdb.org/bcif/" + nId.toUpperCase() + ".bcif" : "https://pdb-dev.wwpdb.org/cif/" + nId.toUpperCase() + ".cif"; }, function (id) { return id.toUpperCase().startsWith('PDBDEV_') ? id : "PDBDEV_" + id.padStart(8, '0'); }, src.params.provider.encoding === 'bcif'); asTrajectory = !!src.params.options.asTrajectory; break; case 'swissmodel': downloadParams = getDownloadParams(src.params.id, function (id) { return "https://swissmodel.expasy.org/repository/uniprot/" + id.toUpperCase() + ".pdb"; }, function (id) { return "SWISS-MODEL: " + id; }, false); asTrajectory = !!src.params.options.asTrajectory; format = 'pdb'; break; case 'pubchem': downloadParams = getDownloadParams(src.params.id, function (id) { return "https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/CID/" + id.trim() + "/record/SDF/?record_type=3d"; }, function (id) { return "PubChem: " + id; }, false); asTrajectory = !!src.params.options.asTrajectory; format = 'mol'; break; default: throw new Error(src.name + " not supported."); } representationPreset = params.source.params.options.representation || representation_preset_1.PresetStructureRepresentations.auto.id; showUnitcell = representationPreset !== representation_preset_1.PresetStructureRepresentations.empty.id; structure = src.params.options.type.name === 'auto' ? void 0 : src.params.options.type; return [4 /*yield*/, state.transaction(function () { return (0, tslib_1.__awaiter)(void 0, void 0, void 0, function () { var blob, trajectory, _i, downloadParams_1, download, data, trajectory; return (0, tslib_1.__generator)(this, function (_a) { switch (_a.label) { case 0: if (!(downloadParams.length > 0 && asTrajectory)) return [3 /*break*/, 4]; return [4 /*yield*/, plugin.builders.data.downloadBlob({ sources: downloadParams.map(function (src, i) { return ({ id: '' + i, url: src.url, isBinary: src.isBinary }); }), maxConcurrency: 6 }, { state: { isGhost: true } })]; case 1: blob = _a.sent(); return [4 /*yield*/, plugin.builders.structure.parseTrajectory(blob, { formats: downloadParams.map(function (_, i) { return ({ id: '' + i, format: 'cif' }); }) })]; case 2: trajectory = _a.sent(); return [4 /*yield*/, plugin.builders.structure.hierarchy.applyPreset(trajectory, 'default', { structure: structure, showUnitcell: showUnitcell, representationPreset: representationPreset, representationPresetParams: params.source.params.options.representationParams })]; case 3: _a.sent(); return [3 /*break*/, 10]; case 4: _i = 0, downloadParams_1 = downloadParams; _a.label = 5; case 5: if (!(_i < downloadParams_1.length)) return [3 /*break*/, 10]; download = downloadParams_1[_i]; return [4 /*yield*/, plugin.builders.data.download(download, { state: { isGhost: true } })]; case 6: data = _a.sent(); return [4 /*yield*/, plugin.builders.structure.parseTrajectory(data, format)]; case 7: trajectory = _a.sent(); return [4 /*yield*/, plugin.builders.structure.hierarchy.applyPreset(trajectory, 'default', { structure: structure, showUnitcell: showUnitcell, representationPreset: representationPreset, representationPresetParams: params.source.params.options.representationParams })]; case 8: _a.sent(); _a.label = 9; case 9: _i++; return [3 /*break*/, 5]; case 10: return [2 /*return*/]; } }); }); }).runInContext(ctx)]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }); }); exports.DownloadStructure = DownloadStructure; function getDownloadParams(src, url, label, isBinary) { var ids = src.split(/[,\s]/).map(function (id) { return id.trim(); }).filter(function (id) { return !!id && (id.length >= 4 || /^[1-9][0-9]*$/.test(id)); }); var ret = []; for (var _i = 0, ids_1 = ids; _i < ids_1.length; _i++) { var id = ids_1[_i]; ret.push({ url: assets_1.Asset.Url(url(id)), isBinary: isBinary, label: label(id) }); } return ret; } exports.UpdateTrajectory = mol_state_1.StateAction.build({ display: { name: 'Update Trajectory' }, params: { action: param_definition_1.ParamDefinition.Select('advance', [['advance', 'Advance'], ['reset', 'Reset']]), by: param_definition_1.ParamDefinition.Optional(param_definition_1.ParamDefinition.Numeric(1, { min: -1, max: 1, step: 1 })) } })(function (_a) { var params = _a.params, state = _a.state; var models = state.selectQ(function (q) { return q.ofTransformer(transforms_1.StateTransforms.Model.ModelFromTrajectory); }); var update = state.build(); if (params.action === 'reset') { for (var _i = 0, models_1 = models; _i < models_1.length; _i++) { var m = models_1[_i]; update.to(m).update({ modelIndex: 0 }); } } else { var _loop_1 = function (m) { var parent_1 = mol_state_1.StateSelection.findAncestorOfType(state.tree, state.cells, m.transform.ref, objects_1.PluginStateObject.Molecule.Trajectory); if (!parent_1 || !parent_1.obj) return "continue"; var traj = parent_1.obj; update.to(m).update(function (old) { var modelIndex = (old.modelIndex + params.by) % traj.data.frameCount; if (modelIndex < 0) modelIndex += traj.data.frameCount; return { modelIndex: modelIndex }; }); }; for (var _b = 0, models_2 = models; _b < models_2.length; _b++) { var m = models_2[_b]; _loop_1(m); } } return state.updateTree(update); }); exports.EnableModelCustomProps = mol_state_1.StateAction.build({ display: { name: 'Custom Model Properties', description: 'Enable parameters for custom properties of the model.' }, from: objects_1.PluginStateObject.Molecule.Model, params: function (a, ctx) { return ctx.customModelProperties.getParams(a === null || a === void 0 ? void 0 : a.data); }, isApplicable: function (a, t, ctx) { return t.transformer !== model_1.CustomModelProperties; } })(function (_a, ctx) { var ref = _a.ref, params = _a.params; return ctx.builders.structure.insertModelProperties(ref, params); }); exports.EnableStructureCustomProps = mol_state_1.StateAction.build({ display: { name: 'Custom Structure Properties', description: 'Enable parameters for custom properties of the structure.' }, from: objects_1.PluginStateObject.Molecule.Structure, params: function (a, ctx) { return ctx.customStructureProperties.getParams(a === null || a === void 0 ? void 0 : a.data); }, isApplicable: function (a, t, ctx) { return t.transformer !== model_1.CustomStructureProperties; } })(function (_a, ctx) { var ref = _a.ref, params = _a.params; return ctx.builders.structure.insertStructureProperties(ref, params); }); exports.AddTrajectory = mol_state_1.StateAction.build({ display: { name: 'Add Trajectory', description: 'Add trajectory from existing model/topology and coordinates.' }, from: objects_1.PluginStateObject.Root, params: function (a, ctx) { var state = ctx.state.data; var models = (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], state.selectQ(function (q) { return q.rootsOfType(objects_1.PluginStateObject.Molecule.Model); }), true), state.selectQ(function (q) { return q.rootsOfType(objects_1.PluginStateObject.Molecule.Topology); }), true); var modelOptions = models.map(function (t) { return [t.transform.ref, t.obj.label]; }); var coords = state.selectQ(function (q) { return q.rootsOfType(objects_1.PluginStateObject.Molecule.Coordinates); }); var coordOptions = coords.map(function (c) { return [c.transform.ref, c.obj.label]; }); return { model: param_definition_1.ParamDefinition.Select(modelOptions.length ? modelOptions[0][0] : '', modelOptions), coordinates: param_definition_1.ParamDefinition.Select(coordOptions.length ? coordOptions[0][0] : '', coordOptions) }; } })(function (_a, ctx) { var params = _a.params, state = _a.state; return mol_task_1.Task.create('Add Trajectory', function (taskCtx) { return state.transaction(function () { return (0, tslib_1.__awaiter)(void 0, void 0, void 0, function () { var dependsOn, model, structure; return (0, tslib_1.__generator)(this, function (_a) { switch (_a.label) { case 0: dependsOn = [params.model, params.coordinates]; model = state.build().toRoot() .apply(model_1.TrajectoryFromModelAndCoordinates, { modelRef: params.model, coordinatesRef: params.coordinates }, { dependsOn: dependsOn }) .apply(transforms_1.StateTransforms.Model.ModelFromTrajectory, { modelIndex: 0 }); return [4 /*yield*/, state.updateTree(model).runInContext(taskCtx)]; case 1: _a.sent(); return [4 /*yield*/, ctx.builders.structure.createStructure(model.selector)]; case 2: structure = _a.sent(); return [4 /*yield*/, ctx.builders.structure.representation.applyPreset(structure, 'auto')]; case 3: _a.sent(); return [2 /*return*/]; } }); }); }).runInContext(taskCtx); }); }); //# sourceMappingURL=structure.js.map