UNPKG

molstar

Version:

A comprehensive macromolecular library.

204 lines 11.5 kB
/** * Copyright (c) 2019-2021 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> */ import { __assign, __awaiter, __generator } from "tslib"; import { Structure, StructureSymmetry } from '../../mol-model/structure'; import { stringToWords } from '../../mol-util/string'; import { SpacegroupCell, Spacegroup } from '../../mol-math/geometry'; import { ParamDefinition as PD } from '../../mol-util/param-definition'; import { Vec3 } from '../../mol-math/linear-algebra'; import { Symmetry } from '../../mol-model/structure/model/properties/symmetry'; import { PluginStateObject as SO } from '../objects'; import { ModelSymmetry } from '../../mol-model-formats/structure/property/symmetry'; var CommonStructureParams = { dynamicBonds: PD.Optional(PD.Boolean(false, { description: 'Ensure bonds are recalculated upon model changes. Also enables calculation of inter-unit bonds in water molecules.' })), }; export var RootStructureDefinition; (function (RootStructureDefinition) { function getParams(model, defaultValue) { var symmetry = model && ModelSymmetry.Provider.get(model); var assemblyIds = symmetry ? symmetry.assemblies.map(function (a) { return [a.id, a.id + ": " + stringToWords(a.details)]; }) : []; var showSymm = !symmetry ? true : !SpacegroupCell.isZero(symmetry.spacegroup.cell); var operatorOptions = []; if (symmetry) { var operators = symmetry.spacegroup.operators; for (var i = 0, il = operators.length; i < il; i++) { operatorOptions.push([i, i + 1 + ": " + Spacegroup.getOperatorXyz(operators[i])]); } } var asymIdsOptions = []; if (model) { model.properties.structAsymMap.forEach(function (v) { var label = v.id === v.auth_id ? v.id : v.id + " [auth " + v.auth_id + "]"; asymIdsOptions.push([v.id, label]); }); } var modes = { auto: PD.Group(CommonStructureParams), model: PD.Group(CommonStructureParams), assembly: PD.Group(__assign({ id: PD.Optional(model ? PD.Select(assemblyIds.length ? assemblyIds[0][0] : '', assemblyIds, { label: 'Asm Id', description: 'Assembly Id' }) : PD.Text('', { label: 'Asm Id', description: 'Assembly Id (use empty for the 1st assembly)' })) }, CommonStructureParams), { isFlat: true }), 'symmetry-mates': PD.Group(__assign({ radius: PD.Numeric(5, { min: 0, max: 50, step: 1 }) }, CommonStructureParams), { isFlat: true }), 'symmetry': PD.Group(__assign({ ijkMin: PD.Vec3(Vec3.create(-1, -1, -1), { step: 1 }, { label: 'Min IJK', fieldLabels: { x: 'I', y: 'J', z: 'K' } }), ijkMax: PD.Vec3(Vec3.create(1, 1, 1), { step: 1 }, { label: 'Max IJK', fieldLabels: { x: 'I', y: 'J', z: 'K' } }) }, CommonStructureParams), { isFlat: true }), 'symmetry-assembly': PD.Group(__assign({ generators: PD.ObjectList({ operators: PD.ObjectList({ index: PD.Select(0, operatorOptions), shift: PD.Vec3(Vec3(), { step: 1 }, { label: 'IJK', fieldLabels: { x: 'I', y: 'J', z: 'K' } }) }, function (e) { return e.index + 1 + "_" + e.shift.map(function (a) { return a + 5; }).join(''); }, { defaultValue: [] }), asymIds: PD.MultiSelect([], asymIdsOptions) }, function (e) { return e.asymIds.length + " asym ids, " + e.operators.length + " operators"; }, { defaultValue: [] }) }, CommonStructureParams), { isFlat: true }) }; var options = []; if (defaultValue === 'auto') { options.push(['auto', 'Auto']); } options.push(['model', 'Model']); if (assemblyIds.length > 0) { options.push(['assembly', 'Assembly']); } if (showSymm) { options.push(['symmetry-mates', 'Symmetry Mates']); options.push(['symmetry', 'Symmetry (indices)']); options.push(['symmetry-assembly', 'Symmetry (assembly)']); } return { type: PD.MappedStatic(defaultValue || 'model', modes, { options: options }) }; } RootStructureDefinition.getParams = getParams; function canAutoUpdate(oldParams, newParams) { if (newParams.name === 'symmetry-assembly' || (newParams.name === 'symmetry' && oldParams.name === 'symmetry')) return false; return true; } RootStructureDefinition.canAutoUpdate = canAutoUpdate; function buildAssembly(plugin, ctx, model, id, props) { return __awaiter(this, void 0, void 0, function () { var asm, symmetry, base, label, s, objProps; return __generator(this, function (_a) { switch (_a.label) { case 0: asm = void 0; symmetry = ModelSymmetry.Provider.get(model); // if no id is specified, use the 1st assembly. if (!id && symmetry && symmetry.assemblies.length !== 0) { id = symmetry.assemblies[0].id; } if (!symmetry || symmetry.assemblies.length === 0) { plugin.log.warn("Model '" + model.entryId + "' has no assembly, returning model structure."); } else { asm = Symmetry.findAssembly(model, id || ''); if (!asm) { plugin.log.warn("Model '" + model.entryId + "' has no assembly called '" + id + "', returning model structure."); } } base = Structure.ofModel(model, props); if (!asm) { label = { label: 'Model', description: Structure.elementDescription(base) }; return [2 /*return*/, new SO.Molecule.Structure(base, label)]; } id = asm.id; return [4 /*yield*/, StructureSymmetry.buildAssembly(base, id).runInContext(ctx)]; case 1: s = _a.sent(); objProps = { label: "Assembly " + id, description: Structure.elementDescription(s) }; return [2 /*return*/, new SO.Molecule.Structure(s, objProps)]; } }); }); } function buildSymmetry(ctx, model, ijkMin, ijkMax, props) { return __awaiter(this, void 0, void 0, function () { var base, s, objProps; return __generator(this, function (_a) { switch (_a.label) { case 0: base = Structure.ofModel(model, props); return [4 /*yield*/, StructureSymmetry.buildSymmetryRange(base, ijkMin, ijkMax).runInContext(ctx)]; case 1: s = _a.sent(); objProps = { label: "Symmetry [" + ijkMin + "] to [" + ijkMax + "]", description: Structure.elementDescription(s) }; return [2 /*return*/, new SO.Molecule.Structure(s, objProps)]; } }); }); } function buildSymmetryMates(ctx, model, radius, props) { return __awaiter(this, void 0, void 0, function () { var base, s, objProps; return __generator(this, function (_a) { switch (_a.label) { case 0: base = Structure.ofModel(model, props); return [4 /*yield*/, StructureSymmetry.builderSymmetryMates(base, radius).runInContext(ctx)]; case 1: s = _a.sent(); objProps = { label: "Symmetry Mates", description: Structure.elementDescription(s) }; return [2 /*return*/, new SO.Molecule.Structure(s, objProps)]; } }); }); } function buildSymmetryAssembly(ctx, model, generators, symmetry, props) { return __awaiter(this, void 0, void 0, function () { var base, s, objProps; return __generator(this, function (_a) { switch (_a.label) { case 0: base = Structure.ofModel(model, props); return [4 /*yield*/, StructureSymmetry.buildSymmetryAssembly(base, generators, symmetry).runInContext(ctx)]; case 1: s = _a.sent(); objProps = { label: "Symmetry Assembly", description: Structure.elementDescription(s) }; return [2 /*return*/, new SO.Molecule.Structure(s, objProps)]; } }); }); } function create(plugin, ctx, model, params) { return __awaiter(this, void 0, void 0, function () { var props, symmetry, s, s; return __generator(this, function (_a) { props = params === null || params === void 0 ? void 0 : params.params; symmetry = ModelSymmetry.Provider.get(model); if (!symmetry || !params || params.name === 'model') { s = Structure.ofModel(model, props); return [2 /*return*/, new SO.Molecule.Structure(s, { label: 'Model', description: Structure.elementDescription(s) })]; } if (params.name === 'auto') { if (symmetry.assemblies.length === 0) { s = Structure.ofModel(model, props); return [2 /*return*/, new SO.Molecule.Structure(s, { label: 'Model', description: Structure.elementDescription(s) })]; } else { return [2 /*return*/, buildAssembly(plugin, ctx, model, undefined, props)]; } } if (params.name === 'assembly') { return [2 /*return*/, buildAssembly(plugin, ctx, model, params.params.id, props)]; } if (params.name === 'symmetry') { return [2 /*return*/, buildSymmetry(ctx, model, params.params.ijkMin, params.params.ijkMax, props)]; } if (params.name === 'symmetry-mates') { return [2 /*return*/, buildSymmetryMates(ctx, model, params.params.radius, props)]; } if (params.name === 'symmetry-assembly') { return [2 /*return*/, buildSymmetryAssembly(ctx, model, params.params.generators, symmetry, props)]; } throw new Error("Unknown represetation type: " + params.name); }); }); } RootStructureDefinition.create = create; })(RootStructureDefinition || (RootStructureDefinition = {})); //# sourceMappingURL=root-structure.js.map