molstar
Version:
A comprehensive macromolecular library.
818 lines (817 loc) • 67.5 kB
JavaScript
"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.StructureSelectionsOrientation3D = exports.StructureSelectionsLabel3D = exports.StructureSelectionsDihedral3D = exports.StructureSelectionsAngle3D = exports.StructureSelectionsDistance3D = exports.StructureBoundingBox3D = exports.ModelUnitcell3D = exports.ShapeRepresentation3D = exports.VolumeRepresentation3DHelpers = exports.VolumeRepresentation3D = exports.ClippingStructureRepresentation3DFromBundle = exports.ClippingStructureRepresentation3DFromScript = exports.TransparencyStructureRepresentation3DFromBundle = exports.TransparencyStructureRepresentation3DFromScript = exports.OverpaintStructureRepresentation3DFromBundle = exports.OverpaintStructureRepresentation3DFromScript = exports.UnwindStructureAssemblyRepresentation3D = exports.SpinStructureRepresentation3D = exports.ExplodeStructureRepresentation3D = exports.StructureRepresentation3D = void 0;
var tslib_1 = require("tslib");
var structure_1 = require("../../mol-model/structure");
var volume_1 = require("../../mol-model/volume");
var mol_state_1 = require("../../mol-state");
var mol_task_1 = require("../../mol-task");
var theme_1 = require("../../mol-theme/theme");
var param_definition_1 = require("../../mol-util/param-definition");
var objects_1 = require("../objects");
var names_1 = require("../../mol-util/color/names");
var representation_1 = require("../../mol-repr/shape/representation");
var unit_transforms_1 = require("../../mol-model/structure/structure/util/unit-transforms");
var helpers_1 = require("../animation/helpers");
var color_1 = require("../../mol-util/color");
var overpaint_1 = require("../../mol-theme/overpaint");
var transparency_1 = require("../../mol-theme/transparency");
var base_1 = require("../../mol-geo/geometry/base");
var script_1 = require("../../mol-script/script");
var unitcell_1 = require("../../mol-repr/shape/model/unitcell");
var distance_1 = require("../../mol-repr/shape/loci/distance");
var helpers_2 = require("./helpers");
var label_1 = require("../../mol-repr/shape/loci/label");
var orientation_1 = require("../../mol-repr/shape/loci/orientation");
var angle_1 = require("../../mol-repr/shape/loci/angle");
var dihedral_1 = require("../../mol-repr/shape/loci/dihedral");
var symmetry_1 = require("../../mol-model-formats/structure/property/symmetry");
var clipping_1 = require("../../mol-theme/clipping");
var type_helpers_1 = require("../../mol-util/type-helpers");
var mesh_1 = require("../../mol-geo/geometry/mesh/mesh");
var shape_1 = require("./shape");
var shape_2 = require("../../mol-model/shape");
var StructureRepresentation3D = objects_1.PluginStateTransform.BuiltIn({
name: 'structure-representation-3d',
display: '3D Representation',
from: objects_1.PluginStateObject.Molecule.Structure,
to: objects_1.PluginStateObject.Molecule.Structure.Representation3D,
params: function (a, ctx) {
var _a = ctx.representation.structure, registry = _a.registry, themeCtx = _a.themes;
var type = registry.get(registry.default.name);
if (!a) {
var colorThemeInfo_1 = {
help: function (value) {
var name = value.name, params = value.params;
var p = themeCtx.colorThemeRegistry.get(name);
var ct = p.factory({}, params);
return { description: ct.description, legend: ct.legend };
}
};
return {
type: param_definition_1.ParamDefinition.Mapped(registry.default.name, registry.types, function (name) { return param_definition_1.ParamDefinition.Group(registry.get(name).getParams(themeCtx, structure_1.Structure.Empty)); }),
colorTheme: param_definition_1.ParamDefinition.Mapped(type.defaultColorTheme.name, themeCtx.colorThemeRegistry.types, function (name) { return param_definition_1.ParamDefinition.Group(themeCtx.colorThemeRegistry.get(name).getParams({ structure: structure_1.Structure.Empty })); }, colorThemeInfo_1),
sizeTheme: param_definition_1.ParamDefinition.Mapped(type.defaultSizeTheme.name, themeCtx.sizeThemeRegistry.types, function (name) { return param_definition_1.ParamDefinition.Group(themeCtx.sizeThemeRegistry.get(name).getParams({ structure: structure_1.Structure.Empty })); })
};
}
var dataCtx = { structure: a.data };
var colorThemeInfo = {
help: function (value) {
var name = value.name, params = value.params;
var p = themeCtx.colorThemeRegistry.get(name);
var ct = p.factory(dataCtx, params);
return { description: ct.description, legend: ct.legend };
}
};
return ({
type: param_definition_1.ParamDefinition.Mapped(registry.default.name, registry.getApplicableTypes(a.data), function (name) { return param_definition_1.ParamDefinition.Group(registry.get(name).getParams(themeCtx, a.data)); }),
colorTheme: param_definition_1.ParamDefinition.Mapped(type.defaultColorTheme.name, themeCtx.colorThemeRegistry.getApplicableTypes(dataCtx), function (name) { return param_definition_1.ParamDefinition.Group(themeCtx.colorThemeRegistry.get(name).getParams(dataCtx)); }, colorThemeInfo),
sizeTheme: param_definition_1.ParamDefinition.Mapped(type.defaultSizeTheme.name, themeCtx.sizeThemeRegistry.types, function (name) { return param_definition_1.ParamDefinition.Group(themeCtx.sizeThemeRegistry.get(name).getParams(dataCtx)); })
});
}
})({
canAutoUpdate: function (_a) {
var a = _a.a, oldParams = _a.oldParams, newParams = _a.newParams;
// TODO: other criteria as well?
return a.data.elementCount < 10000 || (oldParams.type.name === newParams.type.name && newParams.type.params.quality !== 'custom');
},
apply: function (_a, plugin) {
var _this = this;
var a = _a.a, params = _a.params, cache = _a.cache;
return mol_task_1.Task.create('Structure Representation', function (ctx) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () {
var propertyCtx, provider, data, repr, props;
var _a, _b;
return (0, tslib_1.__generator)(this, function (_c) {
switch (_c.label) {
case 0:
propertyCtx = { runtime: ctx, assetManager: plugin.managers.asset };
provider = plugin.representation.structure.registry.get(params.type.name);
data = ((_a = provider.getData) === null || _a === void 0 ? void 0 : _a.call(provider, a.data, params.type.params)) || a.data;
if (!provider.ensureCustomProperties) return [3 /*break*/, 2];
return [4 /*yield*/, provider.ensureCustomProperties.attach(propertyCtx, data)];
case 1:
_c.sent();
_c.label = 2;
case 2:
repr = provider.factory((0, tslib_1.__assign)({ webgl: (_b = plugin.canvas3d) === null || _b === void 0 ? void 0 : _b.webgl }, plugin.representation.structure.themes), provider.getParams);
return [4 /*yield*/, theme_1.Theme.ensureDependencies(propertyCtx, plugin.representation.structure.themes, { structure: data }, params)];
case 3:
_c.sent();
repr.setTheme(theme_1.Theme.create(plugin.representation.structure.themes, { structure: data }, params));
props = params.type.params || {};
return [4 /*yield*/, repr.createOrUpdate(props, data).runInContext(ctx)];
case 4:
_c.sent();
return [2 /*return*/, new objects_1.PluginStateObject.Molecule.Structure.Representation3D({ repr: repr, sourceData: a.data }, { label: provider.label })];
}
});
}); });
},
update: function (_a, plugin) {
var _this = this;
var a = _a.a, b = _a.b, oldParams = _a.oldParams, newParams = _a.newParams, cache = _a.cache;
return mol_task_1.Task.create('Structure Representation', function (ctx) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () {
var provider, data, propertyCtx, props;
var _a, _b;
return (0, tslib_1.__generator)(this, function (_c) {
switch (_c.label) {
case 0:
if (newParams.type.name !== oldParams.type.name)
return [2 /*return*/, mol_state_1.StateTransformer.UpdateResult.Recreate];
provider = plugin.representation.structure.registry.get(newParams.type.name);
if ((_a = provider.mustRecreate) === null || _a === void 0 ? void 0 : _a.call(provider, oldParams.type.params, newParams.type.params))
return [2 /*return*/, mol_state_1.StateTransformer.UpdateResult.Recreate];
data = ((_b = provider.getData) === null || _b === void 0 ? void 0 : _b.call(provider, a.data, newParams.type.params)) || a.data;
propertyCtx = { runtime: ctx, assetManager: plugin.managers.asset };
if (!provider.ensureCustomProperties) return [3 /*break*/, 2];
return [4 /*yield*/, provider.ensureCustomProperties.attach(propertyCtx, data)];
case 1:
_c.sent();
_c.label = 2;
case 2:
// TODO: if themes had a .needsUpdate method the following block could
// be optimized and only executed conditionally
theme_1.Theme.releaseDependencies(plugin.representation.structure.themes, { structure: b.data.sourceData }, oldParams);
return [4 /*yield*/, theme_1.Theme.ensureDependencies(propertyCtx, plugin.representation.structure.themes, { structure: data }, newParams)];
case 3:
_c.sent();
b.data.repr.setTheme(theme_1.Theme.create(plugin.representation.structure.themes, { structure: data }, newParams));
props = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, b.data.repr.props), newParams.type.params);
return [4 /*yield*/, b.data.repr.createOrUpdate(props, data).runInContext(ctx)];
case 4:
_c.sent();
b.data.sourceData = a.data;
return [2 /*return*/, mol_state_1.StateTransformer.UpdateResult.Updated];
}
});
}); });
},
dispose: function (_a, plugin) {
var b = _a.b, params = _a.params;
if (!b || !params)
return;
var structure = b.data.sourceData;
var provider = plugin.representation.structure.registry.get(params.type.name);
if (provider.ensureCustomProperties)
provider.ensureCustomProperties.detach(structure);
theme_1.Theme.releaseDependencies(plugin.representation.structure.themes, { structure: structure }, params);
},
interpolate: function (src, tar, t) {
if (src.colorTheme.name !== 'uniform' || tar.colorTheme.name !== 'uniform') {
return t <= 0.5 ? src : tar;
}
var from = src.colorTheme.params.value, to = tar.colorTheme.params.value;
var value = color_1.Color.interpolate(from, to, t);
return {
type: t <= 0.5 ? src.type : tar.type,
colorTheme: { name: 'uniform', params: { value: value } },
sizeTheme: t <= 0.5 ? src.sizeTheme : tar.sizeTheme,
};
}
});
exports.StructureRepresentation3D = StructureRepresentation3D;
var UnwindStructureAssemblyRepresentation3D = objects_1.PluginStateTransform.BuiltIn({
name: 'unwind-structure-assembly-representation-3d',
display: 'Unwind Assembly 3D Representation',
from: objects_1.PluginStateObject.Molecule.Structure.Representation3D,
to: objects_1.PluginStateObject.Molecule.Structure.Representation3DState,
params: { t: param_definition_1.ParamDefinition.Numeric(0, { min: 0, max: 1, step: 0.01 }) }
})({
canAutoUpdate: function () {
return true;
},
apply: function (_a) {
var a = _a.a, params = _a.params;
var structure = a.data.sourceData;
var unitTransforms = new unit_transforms_1.StructureUnitTransforms(structure);
(0, helpers_1.unwindStructureAssembly)(structure, unitTransforms, params.t);
return new objects_1.PluginStateObject.Molecule.Structure.Representation3DState({
state: { unitTransforms: unitTransforms },
initialState: { unitTransforms: new unit_transforms_1.StructureUnitTransforms(structure) },
info: structure,
repr: a.data.repr
}, { label: "Unwind T = " + params.t.toFixed(2) });
},
update: function (_a) {
var a = _a.a, b = _a.b, newParams = _a.newParams, oldParams = _a.oldParams;
var structure = b.data.info;
if (a.data.sourceData !== structure)
return mol_state_1.StateTransformer.UpdateResult.Recreate;
if (a.data.repr !== b.data.repr)
return mol_state_1.StateTransformer.UpdateResult.Recreate;
if (oldParams.t === newParams.t)
return mol_state_1.StateTransformer.UpdateResult.Unchanged;
var unitTransforms = b.data.state.unitTransforms;
(0, helpers_1.unwindStructureAssembly)(structure, unitTransforms, newParams.t);
b.label = "Unwind T = " + newParams.t.toFixed(2);
b.data.repr = a.data.repr;
return mol_state_1.StateTransformer.UpdateResult.Updated;
}
});
exports.UnwindStructureAssemblyRepresentation3D = UnwindStructureAssemblyRepresentation3D;
var ExplodeStructureRepresentation3D = objects_1.PluginStateTransform.BuiltIn({
name: 'explode-structure-representation-3d',
display: 'Explode 3D Representation',
from: objects_1.PluginStateObject.Molecule.Structure.Representation3D,
to: objects_1.PluginStateObject.Molecule.Structure.Representation3DState,
params: { t: param_definition_1.ParamDefinition.Numeric(0, { min: 0, max: 1, step: 0.01 }) }
})({
canAutoUpdate: function () {
return true;
},
apply: function (_a) {
var a = _a.a, params = _a.params;
var structure = a.data.sourceData;
var unitTransforms = new unit_transforms_1.StructureUnitTransforms(structure);
(0, helpers_1.explodeStructure)(structure, unitTransforms, params.t, structure.root.boundary.sphere);
return new objects_1.PluginStateObject.Molecule.Structure.Representation3DState({
state: { unitTransforms: unitTransforms },
initialState: { unitTransforms: new unit_transforms_1.StructureUnitTransforms(structure) },
info: structure,
repr: a.data.repr
}, { label: "Explode T = " + params.t.toFixed(2) });
},
update: function (_a) {
var a = _a.a, b = _a.b, newParams = _a.newParams, oldParams = _a.oldParams;
var structure = a.data.sourceData;
if (b.data.info !== structure)
return mol_state_1.StateTransformer.UpdateResult.Recreate;
if (a.data.repr !== b.data.repr)
return mol_state_1.StateTransformer.UpdateResult.Recreate;
if (oldParams.t === newParams.t)
return mol_state_1.StateTransformer.UpdateResult.Unchanged;
var unitTransforms = b.data.state.unitTransforms;
(0, helpers_1.explodeStructure)(structure, unitTransforms, newParams.t, structure.root.boundary.sphere);
b.label = "Explode T = " + newParams.t.toFixed(2);
b.data.repr = a.data.repr;
return mol_state_1.StateTransformer.UpdateResult.Updated;
}
});
exports.ExplodeStructureRepresentation3D = ExplodeStructureRepresentation3D;
var SpinStructureRepresentation3D = objects_1.PluginStateTransform.BuiltIn({
name: 'spin-structure-representation-3d',
display: 'Spin 3D Representation',
from: objects_1.PluginStateObject.Molecule.Structure.Representation3D,
to: objects_1.PluginStateObject.Molecule.Structure.Representation3DState,
params: (0, tslib_1.__assign)({ t: param_definition_1.ParamDefinition.Numeric(0, { min: 0, max: 1, step: 0.01 }) }, helpers_1.SpinStructureParams)
})({
canAutoUpdate: function () {
return true;
},
apply: function (_a) {
var a = _a.a, params = _a.params;
var structure = a.data.sourceData;
var unitTransforms = new unit_transforms_1.StructureUnitTransforms(structure);
var _b = (0, helpers_1.getSpinStructureAxisAndOrigin)(structure.root, params), axis = _b.axis, origin = _b.origin;
(0, helpers_1.spinStructure)(structure, unitTransforms, params.t, axis, origin);
return new objects_1.PluginStateObject.Molecule.Structure.Representation3DState({
state: { unitTransforms: unitTransforms },
initialState: { unitTransforms: new unit_transforms_1.StructureUnitTransforms(structure) },
info: structure,
repr: a.data.repr
}, { label: "Spin T = " + params.t.toFixed(2) });
},
update: function (_a) {
var a = _a.a, b = _a.b, newParams = _a.newParams, oldParams = _a.oldParams;
var structure = a.data.sourceData;
if (b.data.info !== structure)
return mol_state_1.StateTransformer.UpdateResult.Recreate;
if (a.data.repr !== b.data.repr)
return mol_state_1.StateTransformer.UpdateResult.Recreate;
if (oldParams.t === newParams.t && oldParams.axis === newParams.axis && oldParams.origin === newParams.origin)
return mol_state_1.StateTransformer.UpdateResult.Unchanged;
var unitTransforms = b.data.state.unitTransforms;
var _b = (0, helpers_1.getSpinStructureAxisAndOrigin)(structure.root, newParams), axis = _b.axis, origin = _b.origin;
(0, helpers_1.spinStructure)(structure, unitTransforms, newParams.t, axis, origin);
b.label = "Spin T = " + newParams.t.toFixed(2);
b.data.repr = a.data.repr;
return mol_state_1.StateTransformer.UpdateResult.Updated;
}
});
exports.SpinStructureRepresentation3D = SpinStructureRepresentation3D;
var OverpaintStructureRepresentation3DFromScript = objects_1.PluginStateTransform.BuiltIn({
name: 'overpaint-structure-representation-3d-from-script',
display: 'Overpaint 3D Representation',
from: objects_1.PluginStateObject.Molecule.Structure.Representation3D,
to: objects_1.PluginStateObject.Molecule.Structure.Representation3DState,
params: function () { return ({
layers: param_definition_1.ParamDefinition.ObjectList({
script: param_definition_1.ParamDefinition.Script((0, script_1.Script)('(sel.atom.all)', 'mol-script')),
color: param_definition_1.ParamDefinition.Color(names_1.ColorNames.blueviolet),
clear: param_definition_1.ParamDefinition.Boolean(false)
}, function (e) { return "" + (e.clear ? 'Clear' : color_1.Color.toRgbString(e.color)); }, {
defaultValue: [{
script: (0, script_1.Script)('(sel.atom.all)', 'mol-script'),
color: names_1.ColorNames.blueviolet,
clear: false
}]
}),
}); }
})({
canAutoUpdate: function () {
return true;
},
apply: function (_a) {
var a = _a.a, params = _a.params;
var structure = a.data.sourceData;
var overpaint = overpaint_1.Overpaint.ofScript(params.layers, structure);
return new objects_1.PluginStateObject.Molecule.Structure.Representation3DState({
state: { overpaint: overpaint },
initialState: { overpaint: overpaint_1.Overpaint.Empty },
info: structure,
repr: a.data.repr
}, { label: "Overpaint (" + overpaint.layers.length + " Layers)" });
},
update: function (_a) {
var a = _a.a, b = _a.b, newParams = _a.newParams, oldParams = _a.oldParams;
var oldStructure = b.data.info;
var newStructure = a.data.sourceData;
if (newStructure !== oldStructure)
return mol_state_1.StateTransformer.UpdateResult.Recreate;
if (a.data.repr !== b.data.repr)
return mol_state_1.StateTransformer.UpdateResult.Recreate;
var oldOverpaint = b.data.state.overpaint;
var newOverpaint = overpaint_1.Overpaint.ofScript(newParams.layers, newStructure);
if (overpaint_1.Overpaint.areEqual(oldOverpaint, newOverpaint))
return mol_state_1.StateTransformer.UpdateResult.Unchanged;
b.data.state.overpaint = newOverpaint;
b.data.repr = a.data.repr;
b.label = "Overpaint (" + newOverpaint.layers.length + " Layers)";
return mol_state_1.StateTransformer.UpdateResult.Updated;
}
});
exports.OverpaintStructureRepresentation3DFromScript = OverpaintStructureRepresentation3DFromScript;
var OverpaintStructureRepresentation3DFromBundle = objects_1.PluginStateTransform.BuiltIn({
name: 'overpaint-structure-representation-3d-from-bundle',
display: 'Overpaint 3D Representation',
from: objects_1.PluginStateObject.Molecule.Structure.Representation3D,
to: objects_1.PluginStateObject.Molecule.Structure.Representation3DState,
params: function () { return ({
layers: param_definition_1.ParamDefinition.ObjectList({
bundle: param_definition_1.ParamDefinition.Value(structure_1.StructureElement.Bundle.Empty),
color: param_definition_1.ParamDefinition.Color(names_1.ColorNames.blueviolet),
clear: param_definition_1.ParamDefinition.Boolean(false)
}, function (e) { return "" + (e.clear ? 'Clear' : color_1.Color.toRgbString(e.color)); }, {
defaultValue: [{
bundle: structure_1.StructureElement.Bundle.Empty,
color: names_1.ColorNames.blueviolet,
clear: false
}],
isHidden: true
}),
}); }
})({
canAutoUpdate: function () {
return true;
},
apply: function (_a) {
var a = _a.a, params = _a.params;
var structure = a.data.sourceData;
var overpaint = overpaint_1.Overpaint.ofBundle(params.layers, structure);
return new objects_1.PluginStateObject.Molecule.Structure.Representation3DState({
state: { overpaint: overpaint },
initialState: { overpaint: overpaint_1.Overpaint.Empty },
info: structure,
repr: a.data.repr
}, { label: "Overpaint (" + overpaint.layers.length + " Layers)" });
},
update: function (_a) {
var a = _a.a, b = _a.b, newParams = _a.newParams, oldParams = _a.oldParams;
var oldStructure = b.data.info;
var newStructure = a.data.sourceData;
if (newStructure !== oldStructure)
return mol_state_1.StateTransformer.UpdateResult.Recreate;
if (a.data.repr !== b.data.repr)
return mol_state_1.StateTransformer.UpdateResult.Recreate;
var oldOverpaint = b.data.state.overpaint;
var newOverpaint = overpaint_1.Overpaint.ofBundle(newParams.layers, newStructure);
if (overpaint_1.Overpaint.areEqual(oldOverpaint, newOverpaint))
return mol_state_1.StateTransformer.UpdateResult.Unchanged;
b.data.state.overpaint = newOverpaint;
b.data.repr = a.data.repr;
b.label = "Overpaint (" + newOverpaint.layers.length + " Layers)";
return mol_state_1.StateTransformer.UpdateResult.Updated;
}
});
exports.OverpaintStructureRepresentation3DFromBundle = OverpaintStructureRepresentation3DFromBundle;
var TransparencyStructureRepresentation3DFromScript = objects_1.PluginStateTransform.BuiltIn({
name: 'transparency-structure-representation-3d-from-script',
display: 'Transparency 3D Representation',
from: objects_1.PluginStateObject.Molecule.Structure.Representation3D,
to: objects_1.PluginStateObject.Molecule.Structure.Representation3DState,
params: function () { return ({
layers: param_definition_1.ParamDefinition.ObjectList({
script: param_definition_1.ParamDefinition.Script((0, script_1.Script)('(sel.atom.all)', 'mol-script')),
value: param_definition_1.ParamDefinition.Numeric(0.5, { min: 0, max: 1, step: 0.01 }, { label: 'Transparency' }),
}, function (e) { return "Transparency (" + e.value + ")"; }, {
defaultValue: [{
script: (0, script_1.Script)('(sel.atom.all)', 'mol-script'),
value: 0.5,
}]
})
}); }
})({
canAutoUpdate: function () {
return true;
},
apply: function (_a) {
var a = _a.a, params = _a.params;
var structure = a.data.sourceData;
var transparency = transparency_1.Transparency.ofScript(params.layers, structure);
return new objects_1.PluginStateObject.Molecule.Structure.Representation3DState({
state: { transparency: transparency },
initialState: { transparency: transparency_1.Transparency.Empty },
info: structure,
repr: a.data.repr
}, { label: "Transparency (" + transparency.layers.length + " Layers)" });
},
update: function (_a) {
var a = _a.a, b = _a.b, newParams = _a.newParams, oldParams = _a.oldParams;
var structure = b.data.info;
if (a.data.sourceData !== structure)
return mol_state_1.StateTransformer.UpdateResult.Recreate;
if (a.data.repr !== b.data.repr)
return mol_state_1.StateTransformer.UpdateResult.Recreate;
var oldTransparency = b.data.state.transparency;
var newTransparency = transparency_1.Transparency.ofScript(newParams.layers, structure);
if (transparency_1.Transparency.areEqual(oldTransparency, newTransparency))
return mol_state_1.StateTransformer.UpdateResult.Unchanged;
b.data.state.transparency = newTransparency;
b.data.repr = a.data.repr;
b.label = "Transparency (" + newTransparency.layers.length + " Layers)";
return mol_state_1.StateTransformer.UpdateResult.Updated;
}
});
exports.TransparencyStructureRepresentation3DFromScript = TransparencyStructureRepresentation3DFromScript;
var TransparencyStructureRepresentation3DFromBundle = objects_1.PluginStateTransform.BuiltIn({
name: 'transparency-structure-representation-3d-from-bundle',
display: 'Transparency 3D Representation',
from: objects_1.PluginStateObject.Molecule.Structure.Representation3D,
to: objects_1.PluginStateObject.Molecule.Structure.Representation3DState,
params: function () { return ({
layers: param_definition_1.ParamDefinition.ObjectList({
bundle: param_definition_1.ParamDefinition.Value(structure_1.StructureElement.Bundle.Empty),
value: param_definition_1.ParamDefinition.Numeric(0.5, { min: 0, max: 1, step: 0.01 }, { label: 'Transparency' }),
}, function (e) { return "Transparency (" + e.value + ")"; }, {
defaultValue: [{
bundle: structure_1.StructureElement.Bundle.Empty,
value: 0.5,
}],
isHidden: true
})
}); }
})({
canAutoUpdate: function () {
return true;
},
apply: function (_a) {
var a = _a.a, params = _a.params;
var structure = a.data.sourceData;
var transparency = transparency_1.Transparency.ofBundle(params.layers, structure);
return new objects_1.PluginStateObject.Molecule.Structure.Representation3DState({
state: { transparency: transparency },
initialState: { transparency: transparency_1.Transparency.Empty },
info: structure,
repr: a.data.repr
}, { label: "Transparency (" + transparency.layers.length + " Layers)" });
},
update: function (_a) {
var a = _a.a, b = _a.b, newParams = _a.newParams, oldParams = _a.oldParams;
var structure = b.data.info;
if (a.data.sourceData !== structure)
return mol_state_1.StateTransformer.UpdateResult.Recreate;
if (a.data.repr !== b.data.repr)
return mol_state_1.StateTransformer.UpdateResult.Recreate;
var oldTransparency = b.data.state.transparency;
var newTransparency = transparency_1.Transparency.ofBundle(newParams.layers, structure);
if (transparency_1.Transparency.areEqual(oldTransparency, newTransparency))
return mol_state_1.StateTransformer.UpdateResult.Unchanged;
b.data.state.transparency = newTransparency;
b.data.repr = a.data.repr;
b.label = "Transparency (" + newTransparency.layers.length + " Layers)";
return mol_state_1.StateTransformer.UpdateResult.Updated;
}
});
exports.TransparencyStructureRepresentation3DFromBundle = TransparencyStructureRepresentation3DFromBundle;
var ClippingStructureRepresentation3DFromScript = objects_1.PluginStateTransform.BuiltIn({
name: 'clipping-structure-representation-3d-from-script',
display: 'Clipping 3D Representation',
from: objects_1.PluginStateObject.Molecule.Structure.Representation3D,
to: objects_1.PluginStateObject.Molecule.Structure.Representation3DState,
params: function () { return ({
layers: param_definition_1.ParamDefinition.ObjectList({
script: param_definition_1.ParamDefinition.Script((0, script_1.Script)('(sel.atom.all)', 'mol-script')),
groups: param_definition_1.ParamDefinition.Converted(function (g) { return clipping_1.Clipping.Groups.toNames(g); }, function (n) { return clipping_1.Clipping.Groups.fromNames(n); }, param_definition_1.ParamDefinition.MultiSelect((0, type_helpers_1.ObjectKeys)(clipping_1.Clipping.Groups.Names), param_definition_1.ParamDefinition.objectToOptions(clipping_1.Clipping.Groups.Names))),
}, function (e) { return clipping_1.Clipping.Groups.toNames(e.groups).length + " group(s)"; }, {
defaultValue: [{
script: (0, script_1.Script)('(sel.atom.all)', 'mol-script'),
groups: 0 /* None */,
}]
}),
}); }
})({
canAutoUpdate: function () {
return true;
},
apply: function (_a) {
var a = _a.a, params = _a.params;
var structure = a.data.sourceData;
var clipping = clipping_1.Clipping.ofScript(params.layers, structure);
return new objects_1.PluginStateObject.Molecule.Structure.Representation3DState({
state: { clipping: clipping },
initialState: { clipping: clipping_1.Clipping.Empty },
info: structure,
repr: a.data.repr
}, { label: "Clipping (" + clipping.layers.length + " Layers)" });
},
update: function (_a) {
var a = _a.a, b = _a.b, newParams = _a.newParams, oldParams = _a.oldParams;
var structure = b.data.info;
if (a.data.sourceData !== structure)
return mol_state_1.StateTransformer.UpdateResult.Recreate;
if (a.data.repr !== b.data.repr)
return mol_state_1.StateTransformer.UpdateResult.Recreate;
var oldClipping = b.data.state.clipping;
var newClipping = clipping_1.Clipping.ofScript(newParams.layers, structure);
if (clipping_1.Clipping.areEqual(oldClipping, newClipping))
return mol_state_1.StateTransformer.UpdateResult.Unchanged;
b.data.state.clipping = newClipping;
b.data.repr = a.data.repr;
b.label = "Clipping (" + newClipping.layers.length + " Layers)";
return mol_state_1.StateTransformer.UpdateResult.Updated;
}
});
exports.ClippingStructureRepresentation3DFromScript = ClippingStructureRepresentation3DFromScript;
var ClippingStructureRepresentation3DFromBundle = objects_1.PluginStateTransform.BuiltIn({
name: 'clipping-structure-representation-3d-from-bundle',
display: 'Clipping 3D Representation',
from: objects_1.PluginStateObject.Molecule.Structure.Representation3D,
to: objects_1.PluginStateObject.Molecule.Structure.Representation3DState,
params: function () { return ({
layers: param_definition_1.ParamDefinition.ObjectList({
bundle: param_definition_1.ParamDefinition.Value(structure_1.StructureElement.Bundle.Empty),
groups: param_definition_1.ParamDefinition.Converted(function (g) { return clipping_1.Clipping.Groups.toNames(g); }, function (n) { return clipping_1.Clipping.Groups.fromNames(n); }, param_definition_1.ParamDefinition.MultiSelect((0, type_helpers_1.ObjectKeys)(clipping_1.Clipping.Groups.Names), param_definition_1.ParamDefinition.objectToOptions(clipping_1.Clipping.Groups.Names))),
}, function (e) { return clipping_1.Clipping.Groups.toNames(e.groups).length + " group(s)"; }, {
defaultValue: [{
bundle: structure_1.StructureElement.Bundle.Empty,
groups: 0 /* None */,
}],
isHidden: true
}),
}); }
})({
canAutoUpdate: function () {
return true;
},
apply: function (_a) {
var a = _a.a, params = _a.params;
var structure = a.data.sourceData;
var clipping = clipping_1.Clipping.ofBundle(params.layers, structure);
return new objects_1.PluginStateObject.Molecule.Structure.Representation3DState({
state: { clipping: clipping },
initialState: { clipping: clipping_1.Clipping.Empty },
info: structure,
repr: a.data.repr
}, { label: "Clipping (" + clipping.layers.length + " Layers)" });
},
update: function (_a) {
var a = _a.a, b = _a.b, newParams = _a.newParams, oldParams = _a.oldParams;
var structure = b.data.info;
if (a.data.sourceData !== structure)
return mol_state_1.StateTransformer.UpdateResult.Recreate;
if (a.data.repr !== b.data.repr)
return mol_state_1.StateTransformer.UpdateResult.Recreate;
var oldClipping = b.data.state.clipping;
var newClipping = clipping_1.Clipping.ofBundle(newParams.layers, structure);
if (clipping_1.Clipping.areEqual(oldClipping, newClipping))
return mol_state_1.StateTransformer.UpdateResult.Unchanged;
b.data.state.clipping = newClipping;
b.data.repr = a.data.repr;
b.label = "Clipping (" + newClipping.layers.length + " Layers)";
return mol_state_1.StateTransformer.UpdateResult.Updated;
}
});
exports.ClippingStructureRepresentation3DFromBundle = ClippingStructureRepresentation3DFromBundle;
//
var VolumeRepresentation3DHelpers;
(function (VolumeRepresentation3DHelpers) {
function getDefaultParams(ctx, name, volume, volumeParams) {
var type = ctx.representation.volume.registry.get(name);
var themeDataCtx = { volume: volume };
var colorParams = ctx.representation.volume.themes.colorThemeRegistry.get(type.defaultColorTheme.name).getParams(themeDataCtx);
var sizeParams = ctx.representation.volume.themes.sizeThemeRegistry.get(type.defaultSizeTheme.name).getParams(themeDataCtx);
var volumeDefaultParams = param_definition_1.ParamDefinition.getDefaultValues(type.getParams(ctx.representation.volume.themes, volume));
return ({
type: { name: name, params: volumeParams ? (0, tslib_1.__assign)((0, tslib_1.__assign)({}, volumeDefaultParams), volumeParams) : volumeDefaultParams },
colorTheme: { name: type.defaultColorTheme.name, params: param_definition_1.ParamDefinition.getDefaultValues(colorParams) },
sizeTheme: { name: type.defaultSizeTheme.name, params: param_definition_1.ParamDefinition.getDefaultValues(sizeParams) }
});
}
VolumeRepresentation3DHelpers.getDefaultParams = getDefaultParams;
function getDefaultParamsStatic(ctx, name, volumeParams, colorName, colorParams, sizeName, sizeParams) {
var type = ctx.representation.volume.registry.get(name);
var colorType = ctx.representation.volume.themes.colorThemeRegistry.get(colorName || type.defaultColorTheme.name);
var sizeType = ctx.representation.volume.themes.sizeThemeRegistry.get(sizeName || type.defaultSizeTheme.name);
return ({
type: { name: name, params: volumeParams ? (0, tslib_1.__assign)((0, tslib_1.__assign)({}, type.defaultValues), volumeParams) : type.defaultValues },
colorTheme: { name: type.defaultColorTheme.name, params: colorParams ? (0, tslib_1.__assign)((0, tslib_1.__assign)({}, colorType.defaultValues), colorParams) : colorType.defaultValues },
sizeTheme: { name: type.defaultSizeTheme.name, params: sizeParams ? (0, tslib_1.__assign)((0, tslib_1.__assign)({}, sizeType.defaultValues), sizeParams) : sizeType.defaultValues }
});
}
VolumeRepresentation3DHelpers.getDefaultParamsStatic = getDefaultParamsStatic;
function getDescription(props) {
var _a, _b, _c, _d;
if (props.isoValue) {
return volume_1.Volume.IsoValue.toString(props.isoValue);
}
else if ((_b = (_a = props.renderMode) === null || _a === void 0 ? void 0 : _a.params) === null || _b === void 0 ? void 0 : _b.isoValue) {
return volume_1.Volume.IsoValue.toString((_d = (_c = props.renderMode) === null || _c === void 0 ? void 0 : _c.params) === null || _d === void 0 ? void 0 : _d.isoValue);
}
}
VolumeRepresentation3DHelpers.getDescription = getDescription;
})(VolumeRepresentation3DHelpers = exports.VolumeRepresentation3DHelpers || (exports.VolumeRepresentation3DHelpers = {}));
var VolumeRepresentation3D = objects_1.PluginStateTransform.BuiltIn({
name: 'volume-representation-3d',
display: '3D Representation',
from: objects_1.PluginStateObject.Volume.Data,
to: objects_1.PluginStateObject.Volume.Representation3D,
params: function (a, ctx) {
var _a = ctx.representation.volume, registry = _a.registry, themeCtx = _a.themes;
var type = registry.get(registry.default.name);
if (!a) {
return {
type: param_definition_1.ParamDefinition.Mapped(registry.default.name, registry.types, function (name) { return param_definition_1.ParamDefinition.Group(registry.get(name).getParams(themeCtx, volume_1.Volume.One)); }),
colorTheme: param_definition_1.ParamDefinition.Mapped(type.defaultColorTheme.name, themeCtx.colorThemeRegistry.types, function (name) { return param_definition_1.ParamDefinition.Group(themeCtx.colorThemeRegistry.get(name).getParams({ volume: volume_1.Volume.One })); }),
sizeTheme: param_definition_1.ParamDefinition.Mapped(type.defaultSizeTheme.name, themeCtx.sizeThemeRegistry.types, function (name) { return param_definition_1.ParamDefinition.Group(themeCtx.sizeThemeRegistry.get(name).getParams({ volume: volume_1.Volume.One })); })
};
}
var dataCtx = { volume: a.data };
return ({
type: param_definition_1.ParamDefinition.Mapped(registry.default.name, registry.types, function (name) { return param_definition_1.ParamDefinition.Group(registry.get(name).getParams(themeCtx, a.data)); }),
colorTheme: param_definition_1.ParamDefinition.Mapped(type.defaultColorTheme.name, themeCtx.colorThemeRegistry.getApplicableTypes(dataCtx), function (name) { return param_definition_1.ParamDefinition.Group(themeCtx.colorThemeRegistry.get(name).getParams(dataCtx)); }),
sizeTheme: param_definition_1.ParamDefinition.Mapped(type.defaultSizeTheme.name, themeCtx.sizeThemeRegistry.types, function (name) { return param_definition_1.ParamDefinition.Group(themeCtx.sizeThemeRegistry.get(name).getParams(dataCtx)); })
});
}
})({
canAutoUpdate: function (_a) {
var oldParams = _a.oldParams, newParams = _a.newParams;
return oldParams.type.name === newParams.type.name;
},
apply: function (_a, plugin) {
var _this = this;
var a = _a.a, params = _a.params;
return mol_task_1.Task.create('Volume Representation', function (ctx) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () {
var propertyCtx, provider, repr, props;
var _a;
return (0, tslib_1.__generator)(this, function (_b) {
switch (_b.label) {
case 0:
propertyCtx = { runtime: ctx, assetManager: plugin.managers.asset };
provider = plugin.representation.volume.registry.get(params.type.name);
if (!provider.ensureCustomProperties) return [3 /*break*/, 2];
return [4 /*yield*/, provider.ensureCustomProperties.attach(propertyCtx, a.data)];
case 1:
_b.sent();
_b.label = 2;
case 2:
repr = provider.factory((0, tslib_1.__assign)({ webgl: (_a = plugin.canvas3d) === null || _a === void 0 ? void 0 : _a.webgl }, plugin.representation.volume.themes), provider.getParams);
repr.setTheme(theme_1.Theme.create(plugin.representation.volume.themes, { volume: a.data }, params));
props = params.type.params || {};
return [4 /*yield*/, repr.createOrUpdate(props, a.data).runInContext(ctx)];
case 3:
_b.sent();
return [2 /*return*/, new objects_1.PluginStateObject.Volume.Representation3D({ repr: repr, sourceData: a.data }, { label: provider.label, description: VolumeRepresentation3DHelpers.getDescription(props) })];
}
});
}); });
},
update: function (_a, plugin) {
var _this = this;
var a = _a.a, b = _a.b, oldParams = _a.oldParams, newParams = _a.newParams;
return mol_task_1.Task.create('Volume Representation', function (ctx) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () {
var oldProvider, props;
var _a;
return (0, tslib_1.__generator)(this, function (_b) {
switch (_b.label) {
case 0:
if (newParams.type.name !== oldParams.type.name) {
oldProvider = plugin.representation.volume.registry.get(oldParams.type.name);
(_a = oldProvider.ensureCustomProperties) === null || _a === void 0 ? void 0 : _a.detach(a.data);
return [2 /*return*/, mol_state_1.StateTransformer.UpdateResult.Recreate];
}
props = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, b.data.repr.props), newParams.type.params);
b.data.repr.setTheme(theme_1.Theme.create(plugin.representation.volume.themes, { volume: a.data }, newParams));
return [4 /*yield*/, b.data.repr.createOrUpdate(props, a.data).runInContext(ctx)];
case 1:
_b.sent();
b.data.sourceData = a.data;
b.description = VolumeRepresentation3DHelpers.getDescription(props);
return [2 /*return*/, mol_state_1.StateTransformer.UpdateResult.Updated];
}
});
}); });
}
});
exports.VolumeRepresentation3D = VolumeRepresentation3D;
var ShapeRepresentation3D = objects_1.PluginStateTransform.BuiltIn({
name: 'shape-representation-3d',
display: '3D Representation',
from: objects_1.PluginStateObject.Shape.Provider,
to: objects_1.PluginStateObject.Shape.Representation3D,
params: function (a, ctx) {
return a ? a.data.params : base_1.BaseGeometry.Params;
}
})({
canAutoUpdate: function () {
return true;
},
apply: function (_a, plugin) {
var _this = this;
var a = _a.a, params = _a.params;
return mol_task_1.Task.create('Shape Representation', function (ctx) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () {
var props, repr;
return (0, tslib_1.__generator)(this, function (_a) {
switch (_a.label) {
case 0:
props = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, param_definition_1.ParamDefinition.getDefaultValues(a.data.params)), params);
repr = (0, representation_1.ShapeRepresentation)(a.data.getShape, a.data.geometryUtils);
return [4 /*yield*/, repr.createOrUpdate(props, a.data.data).runInContext(ctx)];
case 1:
_a.sent();
return [2 /*return*/, new objects_1.PluginStateObject.Shape.Representation3D({ repr: repr, sourceData: a.data }, { label: a.data.label })];
}
});
}); });
},
update: function (_a, plugin) {
var _this = this;
var a = _a.a, b = _a.b, oldParams = _a.oldParams, newParams = _a.newParams;
return mol_task_1.Task.create('Shape Representation', function (ctx) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () {
var props;
return (0, tslib_1.__generator)(this, function (_a) {
switch (_a.label) {
case 0:
props = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, b.data.repr.props), newParams);
return [4 /*yield*/, b.data.repr.createOrUpdate(props, a.data.data).runInContext(ctx)];
case 1:
_a.sent();
b.data.sourceData = a.data;
return [2 /*return*/, mol_state_1.StateTransformer.UpdateResult.Updated];
}
});
}); });
}
});
exports.ShapeRepresentation3D = ShapeRepresentation3D;
var ModelUnitcell3D = objects_1.PluginStateTransform.BuiltIn({
name: 'model-unitcell-3d',
display: 'Model Unit Cell',
from: objects_1.PluginStateObject.Molecule.Model,
to: objects_1.PluginStateObject.Shape.Representation3D,
params: function () { return ((0, tslib_1.__assign)({}, unitcell_1.UnitcellParams)); }
})({
isApplicable: function (a) { return !!symmetry_1.ModelSymmetry.Provider.get(a.data); },
canAutoUpdate: function (_a) {
var oldParams = _a.oldParams, newParams = _a.newParams;
return true;
},
apply: function (_a, plugin) {
var _this = this;
var a = _a.a, params = _a.params;
return mol_task_1.Task.create('Model Unit Cell', function (ctx) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () {
var symmetry, data, repr;
var _a;
return (0, tslib_1.__generator)(this, function (_b) {
switch (_b.label) {
case 0:
symmetry = symmetry_1.ModelSymmetry.Provider.get(a.data);
if (!symmetry)
return [2 /*return*/, mol_state_1.StateObject.Null];
data = (0, unitcell_1.getUnitcellData)(a.data, symmetry, params);
repr = (0, unitcell_1.UnitcellRepresentation)((0, tslib_1.__assign)({ webgl: (_a = plugin.canvas3d) === null || _a === void 0 ? void 0 : _a.webgl }, plugin.representation.structure.themes), function () { return unitcell_1.UnitcellParams; });
return [4 /*yield*/, repr.createOrUpdate(params, data).runInContext(ctx)];
case 1:
_b.sent();
return [2 /*return*/, new objects_1.PluginStateObject.Shape.Representation3D({ repr: repr, sourceData: data }, { label: "Unit Cell", description: symmetry.spacegroup.name })];
}
});
}); });
},
update: function (_a) {
var _this = this;
var a = _a.a, b = _a.b, newParams = _a.newParams;
return mol_task_1.Task.create('Model Unit Cell', function (ctx) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () {
var symmetry, props, data;
return (0, tslib_1.__generator)(this, function (_a) {
switch (_a.label) {
case 0:
symmetry = symmetry_1.ModelSymmetry.Provider.get(a.data);
if (!symmetry)
return [2 /*return*/, mol_state_1.StateTransformer.UpdateResult.Null];
props = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, b.data.repr.props), newParams);