molstar
Version:
A comprehensive macromolecular library.
454 lines (453 loc) • 28.7 kB
JavaScript
/**
* Copyright (c) 2019-2025 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>
* @author Adam Midlik <midlik@gmail.com>
*/
import { ParamDefinition as PD } from '../../../mol-util/param-definition';
import { VisualQualityOptions } from '../../../mol-geo/geometry/base';
import { Structure } from '../../../mol-model/structure';
import { StateObjectRef } from '../../../mol-state';
import { StructureSelectionQueries as Q } from '../../helpers/structure-selection-query';
import { PluginConfig } from '../../../mol-plugin/config';
import { StructureFocusRepresentation } from '../../../mol-plugin/behavior/dynamic/selection/structure-focus-representation';
import { createStructureColorThemeParams } from '../../helpers/structure-representation-params';
import { ChainIdColorThemeProvider } from '../../../mol-theme/color/chain-id';
import { OperatorNameColorThemeProvider } from '../../../mol-theme/color/operator-name';
import { IndexPairBonds } from '../../../mol-model-formats/structure/property/bonds/index-pair';
import { StructConn } from '../../../mol-model-formats/structure/property/bonds/struct_conn';
import { assertUnreachable } from '../../../mol-util/type-helpers';
import { Vec3 } from '../../../mol-math/linear-algebra/3d/vec3';
export function StructureRepresentationPresetProvider(repr) { return repr; }
(function (StructureRepresentationPresetProvider) {
StructureRepresentationPresetProvider.CommonParams = {
ignoreHydrogens: PD.Optional(PD.Boolean(false)),
ignoreHydrogensVariant: PD.Optional(PD.Select('all', PD.arrayToOptions(['all', 'non-polar']))),
ignoreLight: PD.Optional(PD.Boolean(false)),
quality: PD.Optional(PD.Select('auto', VisualQualityOptions)),
theme: PD.Optional(PD.Group({
globalName: PD.Optional(PD.Text('')),
globalColorParams: PD.Optional(PD.Value({}, { isHidden: true })),
carbonColor: PD.Optional(PD.Select('chain-id', PD.arrayToOptions(['chain-id', 'operator-name', 'element-symbol']))),
symmetryColor: PD.Optional(PD.Text('')),
symmetryColorParams: PD.Optional(PD.Value({}, { isHidden: true })),
focus: PD.Optional(PD.Group({
name: PD.Optional(PD.Text('')),
params: PD.Optional(PD.Value({}))
}))
}))
};
function getCarbonColorParams(name) {
return name === 'chain-id'
? { name, params: ChainIdColorThemeProvider.defaultValues }
: name === 'operator-name'
? { name, params: OperatorNameColorThemeProvider.defaultValues }
: { name, params: {} };
}
function isSymmetry(structure) {
return structure.units.some(u => !u.conformation.operator.assembly && u.conformation.operator.spgrOp >= 0);
}
function reprBuilder(plugin, params, structure) {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
const update = plugin.state.data.build();
const builder = plugin.builders.structure.representation;
const h = plugin.managers.structure.component.state.options.hydrogens;
const typeParams = {
quality: plugin.managers.structure.component.state.options.visualQuality,
ignoreHydrogens: h !== 'all',
ignoreHydrogensVariant: (h === 'only-polar' ? 'non-polar' : 'all'),
ignoreLight: plugin.managers.structure.component.state.options.ignoreLight,
};
if (params.quality && params.quality !== 'auto')
typeParams.quality = params.quality;
if (params.ignoreHydrogens !== void 0)
typeParams.ignoreHydrogens = !!params.ignoreHydrogens;
if (params.ignoreHydrogensVariant !== void 0)
typeParams.ignoreHydrogensVariant = params.ignoreHydrogensVariant;
if (params.ignoreLight !== void 0)
typeParams.ignoreLight = !!params.ignoreLight;
const color = ((_a = params.theme) === null || _a === void 0 ? void 0 : _a.globalName) ? (_b = params.theme) === null || _b === void 0 ? void 0 : _b.globalName : void 0;
const ballAndStickColor = ((_c = params.theme) === null || _c === void 0 ? void 0 : _c.carbonColor) !== undefined
? { carbonColor: getCarbonColorParams((_d = params.theme) === null || _d === void 0 ? void 0 : _d.carbonColor), ...(_e = params.theme) === null || _e === void 0 ? void 0 : _e.globalColorParams }
: { ...(_f = params.theme) === null || _f === void 0 ? void 0 : _f.globalColorParams };
const symmetryColor = structure && ((_g = params.theme) === null || _g === void 0 ? void 0 : _g.symmetryColor)
? isSymmetry(structure) ? (_h = params.theme) === null || _h === void 0 ? void 0 : _h.symmetryColor : color
: color;
const symmetryColorParams = ((_j = params.theme) === null || _j === void 0 ? void 0 : _j.symmetryColorParams) ? { ...(_k = params.theme) === null || _k === void 0 ? void 0 : _k.globalColorParams, ...(_l = params.theme) === null || _l === void 0 ? void 0 : _l.symmetryColorParams } : { ...(_m = params.theme) === null || _m === void 0 ? void 0 : _m.globalColorParams };
const globalColorParams = ((_o = params.theme) === null || _o === void 0 ? void 0 : _o.globalColorParams) ? { ...(_p = params.theme) === null || _p === void 0 ? void 0 : _p.globalColorParams } : undefined;
return { update, builder, color, symmetryColor, symmetryColorParams, globalColorParams, typeParams, ballAndStickColor };
}
StructureRepresentationPresetProvider.reprBuilder = reprBuilder;
function updateFocusRepr(plugin, structure, themeName, themeParams) {
if (!plugin.state.hasBehavior(StructureFocusRepresentation))
return;
return plugin.state.updateBehavior(StructureFocusRepresentation, p => {
const c = createStructureColorThemeParams(plugin, structure, 'ball-and-stick', themeName || 'element-symbol', themeParams);
p.surroundingsParams.colorTheme = c;
p.targetParams.colorTheme = c;
});
}
StructureRepresentationPresetProvider.updateFocusRepr = updateFocusRepr;
})(StructureRepresentationPresetProvider || (StructureRepresentationPresetProvider = {}));
const CommonParams = StructureRepresentationPresetProvider.CommonParams;
const reprBuilder = StructureRepresentationPresetProvider.reprBuilder;
const updateFocusRepr = StructureRepresentationPresetProvider.updateFocusRepr;
const auto = StructureRepresentationPresetProvider({
id: 'preset-structure-representation-auto',
display: {
name: 'Automatic',
description: 'Show representations based on the size of the structure. Smaller structures are shown with more detail than larger ones, ranging from atomistic display to coarse surfaces.'
},
params: () => CommonParams,
apply(ref, params, plugin) {
var _a, _b;
const structure = (_b = (_a = StateObjectRef.resolveAndCheck(plugin.state.data, ref)) === null || _a === void 0 ? void 0 : _a.obj) === null || _b === void 0 ? void 0 : _b.data;
if (!structure)
return {};
const thresholds = plugin.config.get(PluginConfig.Structure.SizeThresholds) || Structure.DefaultSizeThresholds;
const size = Structure.getSize(structure, thresholds);
const gapFraction = structure.polymerResidueCount / structure.polymerGapCount;
switch (size) {
case Structure.Size.Gigantic:
case Structure.Size.Huge:
return coarseSurface.apply(ref, params, plugin);
case Structure.Size.Large:
return polymerCartoon.apply(ref, params, plugin);
case Structure.Size.Medium:
if (gapFraction > 3) {
return polymerAndLigand.apply(ref, params, plugin);
} // else fall through
case Structure.Size.Small:
// `showCarbohydrateSymbol: true` is nice, e.g., for PDB 1aga
return atomicDetail.apply(ref, { ...params, showCarbohydrateSymbol: true }, plugin);
default:
assertUnreachable(size);
}
}
});
const empty = StructureRepresentationPresetProvider({
id: 'preset-structure-representation-empty',
display: { name: 'Empty', description: 'Removes all existing representations.' },
async apply(ref, params, plugin) {
return {};
}
});
const BuiltInPresetGroupName = 'Basic';
const polymerAndLigand = StructureRepresentationPresetProvider({
id: 'preset-structure-representation-polymer-and-ligand',
display: {
name: 'Polymer & Ligand', group: BuiltInPresetGroupName,
description: 'Shows polymers as Cartoon, ligands as Ball & Stick, carbohydrates as 3D-SNFG and water molecules semi-transparent.'
},
params: () => CommonParams,
async apply(ref, params, plugin) {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
const structureCell = StateObjectRef.resolveAndCheck(plugin.state.data, ref);
if (!structureCell)
return {};
const components = {
polymer: await presetStaticComponent(plugin, structureCell, 'polymer'),
ligand: await presetStaticComponent(plugin, structureCell, 'ligand'),
nonStandard: await presetStaticComponent(plugin, structureCell, 'non-standard'),
branched: await presetStaticComponent(plugin, structureCell, 'branched', { label: 'Carbohydrate' }),
water: await presetStaticComponent(plugin, structureCell, 'water'),
ion: await presetStaticComponent(plugin, structureCell, 'ion'),
lipid: await presetStaticComponent(plugin, structureCell, 'lipid'),
coarse: await presetStaticComponent(plugin, structureCell, 'coarse')
};
const structure = structureCell.obj.data;
// TODO make configurable
const waterType = (((_c = (_b = (_a = components.water) === null || _a === void 0 ? void 0 : _a.obj) === null || _b === void 0 ? void 0 : _b.data) === null || _c === void 0 ? void 0 : _c.elementCount) || 0) > 50000 ? 'line' : 'ball-and-stick';
const lipidType = (((_f = (_e = (_d = components.lipid) === null || _d === void 0 ? void 0 : _d.obj) === null || _e === void 0 ? void 0 : _e.data) === null || _f === void 0 ? void 0 : _f.elementCount) || 0) > 20000 ? 'line' : 'ball-and-stick';
const { update, builder, typeParams, color, symmetryColor, symmetryColorParams, globalColorParams, ballAndStickColor } = reprBuilder(plugin, params, structure);
const representations = {
polymer: builder.buildRepresentation(update, components.polymer, { type: 'cartoon', typeParams, color: symmetryColor, colorParams: symmetryColorParams }, { tag: 'polymer' }),
ligand: builder.buildRepresentation(update, components.ligand, { type: 'ball-and-stick', typeParams, color, colorParams: ballAndStickColor }, { tag: 'ligand' }),
nonStandard: builder.buildRepresentation(update, components.nonStandard, { type: 'ball-and-stick', typeParams, color, colorParams: ballAndStickColor }, { tag: 'non-standard' }),
branchedBallAndStick: builder.buildRepresentation(update, components.branched, { type: 'ball-and-stick', typeParams: { ...typeParams, alpha: 0.3 }, color, colorParams: ballAndStickColor }, { tag: 'branched-ball-and-stick' }),
branchedSnfg3d: builder.buildRepresentation(update, components.branched, { type: 'carbohydrate', typeParams, color, colorParams: globalColorParams }, { tag: 'branched-snfg-3d' }),
water: builder.buildRepresentation(update, components.water, { type: waterType, typeParams: { ...typeParams, alpha: 0.6, visuals: waterType === 'line' ? ['intra-bond', 'element-point'] : undefined }, color, colorParams: { carbonColor: { name: 'element-symbol', params: {} }, ...globalColorParams } }, { tag: 'water' }),
ion: builder.buildRepresentation(update, components.ion, { type: 'ball-and-stick', typeParams, color, colorParams: { carbonColor: { name: 'element-symbol', params: {} }, ...globalColorParams } }, { tag: 'ion' }),
lipid: builder.buildRepresentation(update, components.lipid, { type: lipidType, typeParams: { ...typeParams, alpha: 0.6, visuals: lipidType === 'line' ? ['intra-bond'] : undefined }, color, colorParams: { carbonColor: { name: 'element-symbol', params: {} }, ...globalColorParams } }, { tag: 'lipid' }),
coarse: builder.buildRepresentation(update, components.coarse, { type: 'spacefill', typeParams, color: color || 'chain-id', colorParams: globalColorParams }, { tag: 'coarse' })
};
await update.commit({ revertOnError: false });
await updateFocusRepr(plugin, structure, (_h = (_g = params.theme) === null || _g === void 0 ? void 0 : _g.focus) === null || _h === void 0 ? void 0 : _h.name, (_k = (_j = params.theme) === null || _j === void 0 ? void 0 : _j.focus) === null || _k === void 0 ? void 0 : _k.params);
return { components, representations };
}
});
const proteinAndNucleic = StructureRepresentationPresetProvider({
id: 'preset-structure-representation-protein-and-nucleic',
display: {
name: 'Protein & Nucleic', group: BuiltInPresetGroupName,
description: 'Shows proteins as Cartoon and RNA/DNA as Gaussian Surface.'
},
params: () => CommonParams,
async apply(ref, params, plugin) {
var _a, _b, _c, _d;
const structureCell = StateObjectRef.resolveAndCheck(plugin.state.data, ref);
if (!structureCell)
return {};
const components = {
protein: await presetSelectionComponent(plugin, structureCell, 'protein'),
nucleic: await presetSelectionComponent(plugin, structureCell, 'nucleic'),
};
const structure = structureCell.obj.data;
const gaussianProps = {
radiusOffset: structure.isCoarseGrained ? 2 : 0,
smoothness: structure.isCoarseGrained ? 1.0 : 1.5,
};
const { update, builder, typeParams, symmetryColor, symmetryColorParams } = reprBuilder(plugin, params, structure);
const representations = {
protein: builder.buildRepresentation(update, components.protein, { type: 'cartoon', typeParams, color: symmetryColor, colorParams: symmetryColorParams }, { tag: 'protein' }),
nucleic: builder.buildRepresentation(update, components.nucleic, { type: 'gaussian-surface', typeParams: { ...typeParams, ...gaussianProps }, color: symmetryColor, colorParams: symmetryColorParams }, { tag: 'nucleic' })
};
await update.commit({ revertOnError: true });
await updateFocusRepr(plugin, structure, (_b = (_a = params.theme) === null || _a === void 0 ? void 0 : _a.focus) === null || _b === void 0 ? void 0 : _b.name, (_d = (_c = params.theme) === null || _c === void 0 ? void 0 : _c.focus) === null || _d === void 0 ? void 0 : _d.params);
return { components, representations };
}
});
const coarseSurface = StructureRepresentationPresetProvider({
id: 'preset-structure-representation-coarse-surface',
display: {
name: 'Coarse Surface', group: BuiltInPresetGroupName,
description: 'Shows polymers and lipids as coarse Gaussian Surface.'
},
params: () => CommonParams,
async apply(ref, params, plugin) {
var _a, _b, _c, _d;
const structureCell = StateObjectRef.resolveAndCheck(plugin.state.data, ref);
if (!structureCell)
return {};
const components = {
polymer: await presetStaticComponent(plugin, structureCell, 'polymer'),
lipid: await presetStaticComponent(plugin, structureCell, 'lipid'),
};
const structure = structureCell.obj.data;
const thresholds = plugin.config.get(PluginConfig.Structure.SizeThresholds) || Structure.DefaultSizeThresholds;
const size = Structure.getSize(structure, thresholds);
const gaussianProps = Object.create(null);
if (size === Structure.Size.Gigantic) {
Object.assign(gaussianProps, {
traceOnly: !structure.isCoarseGrained,
radiusOffset: 2,
smoothness: 1,
visuals: ['structure-gaussian-surface-mesh']
});
}
else if (size === Structure.Size.Huge) {
Object.assign(gaussianProps, {
radiusOffset: structure.isCoarseGrained ? 2 : 0,
smoothness: 1,
});
}
else if (structure.isCoarseGrained) {
Object.assign(gaussianProps, {
radiusOffset: 2,
smoothness: 1,
});
}
const { update, builder, typeParams, symmetryColor, symmetryColorParams } = reprBuilder(plugin, params, structure);
const representations = {
polymer: builder.buildRepresentation(update, components.polymer, { type: 'gaussian-surface', typeParams: { ...typeParams, ...gaussianProps }, color: symmetryColor, colorParams: symmetryColorParams }, { tag: 'polymer' }),
lipid: builder.buildRepresentation(update, components.lipid, { type: 'gaussian-surface', typeParams: { ...typeParams, ...gaussianProps }, color: symmetryColor, colorParams: symmetryColorParams }, { tag: 'lipid' })
};
await update.commit({ revertOnError: true });
await updateFocusRepr(plugin, structure, (_b = (_a = params.theme) === null || _a === void 0 ? void 0 : _a.focus) === null || _b === void 0 ? void 0 : _b.name, (_d = (_c = params.theme) === null || _c === void 0 ? void 0 : _c.focus) === null || _d === void 0 ? void 0 : _d.params);
return { components, representations };
}
});
const polymerCartoon = StructureRepresentationPresetProvider({
id: 'preset-structure-representation-polymer-cartoon',
display: {
name: 'Polymer Cartoon', group: BuiltInPresetGroupName,
description: 'Shows polymers as Cartoon.'
},
params: () => CommonParams,
async apply(ref, params, plugin) {
var _a, _b, _c, _d;
const structureCell = StateObjectRef.resolveAndCheck(plugin.state.data, ref);
if (!structureCell)
return {};
const components = {
polymer: await presetStaticComponent(plugin, structureCell, 'polymer'),
};
const structure = structureCell.obj.data;
const { update, builder, typeParams, symmetryColor, symmetryColorParams } = reprBuilder(plugin, params, structure);
const representations = {
polymer: builder.buildRepresentation(update, components.polymer, { type: 'cartoon', typeParams, color: symmetryColor, colorParams: symmetryColorParams }, { tag: 'polymer' })
};
await update.commit({ revertOnError: true });
await updateFocusRepr(plugin, structure, (_b = (_a = params.theme) === null || _a === void 0 ? void 0 : _a.focus) === null || _b === void 0 ? void 0 : _b.name, (_d = (_c = params.theme) === null || _c === void 0 ? void 0 : _c.focus) === null || _d === void 0 ? void 0 : _d.params);
return { components, representations };
}
});
const atomicDetail = StructureRepresentationPresetProvider({
id: 'preset-structure-representation-atomic-detail',
display: {
name: 'Atomic Detail', group: BuiltInPresetGroupName,
description: 'Shows everything in atomic detail.'
},
params: () => ({
...CommonParams,
showCarbohydrateSymbol: PD.Boolean(false)
}),
async apply(ref, params, plugin) {
var _a, _b, _c, _d, _e, _f;
const structureCell = StateObjectRef.resolveAndCheck(plugin.state.data, ref);
if (!structureCell)
return {};
const components = {
all: await presetStaticComponent(plugin, structureCell, 'all'),
branched: undefined
};
const structure = structureCell.obj.data;
const highElementCount = structure.elementCount > 100000; // TODO make configurable
const veryHighElementCount = structure.elementCount > 1000000; // TODO make configurable
const highUnitCount = structure.units.length > 5000; // TODO make configurable
const lowResidueElementRatio = structure.atomicResidueCount &&
structure.elementCount > 1000 &&
structure.atomicResidueCount / structure.elementCount < 3;
const m = structure.models[0];
const bondsGiven = !!IndexPairBonds.Provider.get(m) || StructConn.isExhaustive(m);
let atomicType = 'ball-and-stick';
if (structure.isCoarseGrained || highUnitCount) {
atomicType = veryHighElementCount ? 'point' : 'spacefill';
}
else if (lowResidueElementRatio && !bondsGiven) {
atomicType = 'spacefill';
}
else if (highElementCount) {
atomicType = 'line';
}
const showCarbohydrateSymbol = params.showCarbohydrateSymbol && !highElementCount && !lowResidueElementRatio;
if (showCarbohydrateSymbol) {
Object.assign(components, {
branched: await presetStaticComponent(plugin, structureCell, 'branched', { label: 'Carbohydrate' }),
});
}
const { update, builder, typeParams, color, ballAndStickColor, globalColorParams } = reprBuilder(plugin, params, structure);
const colorParams = lowResidueElementRatio && !bondsGiven
? { carbonColor: { name: 'element-symbol', params: {} }, ...globalColorParams }
: ballAndStickColor;
const representations = {
all: builder.buildRepresentation(update, components.all, { type: atomicType, typeParams, color, colorParams }, { tag: 'all' }),
};
if (showCarbohydrateSymbol) {
Object.assign(representations, {
snfg3d: builder.buildRepresentation(update, components.branched, { type: 'carbohydrate', typeParams: { ...typeParams, alpha: 0.4, visuals: ['carbohydrate-symbol'] }, color, colorParams: globalColorParams }, { tag: 'snfg-3d' }),
});
}
await update.commit({ revertOnError: true });
await updateFocusRepr(plugin, structure, (_c = (_b = (_a = params.theme) === null || _a === void 0 ? void 0 : _a.focus) === null || _b === void 0 ? void 0 : _b.name) !== null && _c !== void 0 ? _c : color, (_f = (_e = (_d = params.theme) === null || _d === void 0 ? void 0 : _d.focus) === null || _e === void 0 ? void 0 : _e.params) !== null && _f !== void 0 ? _f : colorParams);
return { components, representations };
}
});
const illustrative = StructureRepresentationPresetProvider({
id: 'preset-structure-representation-illustrative',
display: {
name: 'Illustrative', group: 'Miscellaneous',
description: 'Show everything in spacefill representation with illustrative colors and ignore light.'
},
params: () => CommonParams,
async apply(ref, params, plugin) {
var _a, _b, _c, _d, _e;
const structureCell = StateObjectRef.resolveAndCheck(plugin.state.data, ref);
if (!structureCell)
return {};
const components = {
all: await presetStaticComponent(plugin, structureCell, 'all'),
branched: undefined
};
const structure = structureCell.obj.data;
const { update, builder, typeParams, color } = reprBuilder(plugin, params, structure);
const representations = {
all: builder.buildRepresentation(update, components.all, {
type: 'spacefill',
typeParams: { ...typeParams, ignoreLight: true },
color: 'illustrative',
colorParams: { style: { name: 'entity-id', params: { overrideWater: true } } },
}, { tag: 'all' }),
};
await update.commit({ revertOnError: true });
await updateFocusRepr(plugin, structure, (_c = (_b = (_a = params.theme) === null || _a === void 0 ? void 0 : _a.focus) === null || _b === void 0 ? void 0 : _b.name) !== null && _c !== void 0 ? _c : color, (_e = (_d = params.theme) === null || _d === void 0 ? void 0 : _d.focus) === null || _e === void 0 ? void 0 : _e.params);
return { components, representations };
}
});
const molecularSurface = StructureRepresentationPresetProvider({
id: 'preset-structure-representation-molecular-surface',
display: {
name: 'Molecular Surface', group: 'Miscellaneous',
description: 'Show everything in molecular surface representation with illustrative colors.'
},
params: () => CommonParams,
async apply(ref, params, plugin) {
var _a, _b, _c, _d, _e;
const structureCell = StateObjectRef.resolveAndCheck(plugin.state.data, ref);
if (!structureCell)
return {};
const components = {
all: await presetStaticComponent(plugin, structureCell, 'all'),
branched: undefined
};
const structure = structureCell.obj.data;
const { update, builder, typeParams, color } = reprBuilder(plugin, params, structure);
const representations = {
all: builder.buildRepresentation(update, components.all, {
type: 'molecular-surface',
typeParams,
color: 'entity-id',
colorParams: { overrideWater: true },
}, { tag: 'all' }),
};
await update.commit({ revertOnError: true });
await updateFocusRepr(plugin, structure, (_c = (_b = (_a = params.theme) === null || _a === void 0 ? void 0 : _a.focus) === null || _b === void 0 ? void 0 : _b.name) !== null && _c !== void 0 ? _c : color, (_e = (_d = params.theme) === null || _d === void 0 ? void 0 : _d.focus) === null || _e === void 0 ? void 0 : _e.params);
return { components, representations };
}
});
const autoLod = StructureRepresentationPresetProvider({
id: 'preset-structure-representation-auto-lod',
display: {
name: 'Automatic Detail', group: 'Miscellaneous',
description: 'Shows more (or less) detailed representations automatically based on camera distance.'
},
params: () => CommonParams,
async apply(ref, params, plugin) {
var _a, _b, _c, _d;
const structureCell = StateObjectRef.resolveAndCheck(plugin.state.data, ref);
if (!structureCell)
return {};
const components = {
all: await presetStaticComponent(plugin, structureCell, 'all'),
};
const structure = structureCell.obj.data;
const { update, builder, typeParams, color, symmetryColor, symmetryColorParams, ballAndStickColor } = reprBuilder(plugin, params, structure);
const representations = {
gaussianSurface: builder.buildRepresentation(update, components.all, { type: 'gaussian-surface', typeParams: { ...typeParams, lod: Vec3.create(30, 10000000, 100) }, color: symmetryColor, colorParams: symmetryColorParams }, { tag: 'gaussian-surface' }),
cartoon: builder.buildRepresentation(update, components.all, { type: 'cartoon', typeParams: { ...typeParams, lod: Vec3.create(-20, 300, 100) }, color: symmetryColor, colorParams: symmetryColorParams }, { tag: 'cartoon' }),
ballAndStick: builder.buildRepresentation(update, components.all, { type: 'ball-and-stick', typeParams: { ...typeParams, lod: Vec3.create(-20, 40, 20) }, color, colorParams: ballAndStickColor }, { tag: 'ball-and-stick' }),
};
await update.commit({ revertOnError: false });
await updateFocusRepr(plugin, structure, (_b = (_a = params.theme) === null || _a === void 0 ? void 0 : _a.focus) === null || _b === void 0 ? void 0 : _b.name, (_d = (_c = params.theme) === null || _c === void 0 ? void 0 : _c.focus) === null || _d === void 0 ? void 0 : _d.params);
return { components, representations };
}
});
export function presetStaticComponent(plugin, structure, type, params) {
return plugin.builders.structure.tryCreateComponentStatic(structure, type, params);
}
export function presetSelectionComponent(plugin, structure, query, params) {
return plugin.builders.structure.tryCreateComponentFromSelection(structure, Q[query], `selection-${query}`, params);
}
export const PresetStructureRepresentations = {
empty,
auto,
'atomic-detail': atomicDetail,
'polymer-cartoon': polymerCartoon,
'polymer-and-ligand': polymerAndLigand,
'protein-and-nucleic': proteinAndNucleic,
'coarse-surface': coarseSurface,
illustrative,
'molecular-surface': molecularSurface,
'auto-lod': autoLod,
};