molstar
Version:
A comprehensive macromolecular library.
204 lines • 11.5 kB
JavaScript
/**
* 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