UNPKG

molstar

Version:

A comprehensive macromolecular library.

97 lines (96 loc) 4.27 kB
"use strict"; /** * Copyright (c) 2025-2026 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> * @author Gianluca Tomasello <giagitom@gmail.com> */ Object.defineProperty(exports, "__esModule", { value: true }); exports.VolumeValueSizeThemeProvider = exports.VolumeValueSizeThemeParams = void 0; exports.getVolumeValueSizeThemeParams = getVolumeValueSizeThemeParams; exports.VolumeValueSizeTheme = VolumeValueSizeTheme; const param_definition_1 = require("../../mol-util/param-definition.js"); const volume_1 = require("../../mol-model/volume/volume.js"); const location_iterator_1 = require("../../mol-geo/util/location-iterator.js"); const grid_1 = require("../../mol-model/volume/grid.js"); const interpolate_1 = require("../../mol-math/interpolate.js"); const Description = 'Assign size based on the given value of a volume cell.'; exports.VolumeValueSizeThemeParams = { scale: param_definition_1.ParamDefinition.Numeric(1, { min: 0.01, max: 10, step: 0.01 }), transform: param_definition_1.ParamDefinition.Select('linear', [['linear', 'Linear'], ['quadratic', 'Quadratic'], ['cubic', 'Cubic']], { description: 'Linear: value * scale, Quadratic: value * scale^2, Cubic: value * scale^3' }), domain: param_definition_1.ParamDefinition.MappedStatic('auto', { custom: param_definition_1.ParamDefinition.Interval([0, 1], { step: 0.001, min: 0 }), auto: param_definition_1.ParamDefinition.Group({}) }), }; function getVolumeValueSizeThemeParams(ctx) { return exports.VolumeValueSizeThemeParams; // TODO return copy } function VolumeValueSizeTheme(ctx, props) { var _a; if (ctx.volume) { const { min, max } = ctx.volume.grid.stats; const domain = props.domain.name === 'custom' ? props.domain.params : [min, max]; const scaleFactor = props.transform === 'cubic' ? props.scale ** 3 : props.transform === 'quadratic' ? props.scale ** 2 : props.scale; if ((_a = ctx.locationKinds) === null || _a === void 0 ? void 0 : _a.includes('cell-location')) { const { data } = ctx.volume.grid.cells; const isLocation = volume_1.Volume.Cell.isLocation; const size = (location) => { if (isLocation(location)) { const v = (0, interpolate_1.clamp)(Math.abs(data[location.cell]), domain[0], domain[1]); return v * scaleFactor; } else { return 0; } }; return { factory: VolumeValueSizeTheme, granularity: 'group', size, props, description: Description }; } else { const getTrilinearlyInterpolated = grid_1.Grid.makeGetTrilinearlyInterpolated(ctx.volume.grid, 'none'); const size = (location) => { if ((0, location_iterator_1.isPositionLocation)(location)) { const value = getTrilinearlyInterpolated(location.position); if (Number.isNaN(value)) return 0; const v = (0, interpolate_1.clamp)(Math.abs(value), domain[0], domain[1]); return v * scaleFactor; } else { return 0; } }; return { factory: VolumeValueSizeTheme, granularity: 'vertex', size, props, description: Description }; } } else { return { factory: VolumeValueSizeTheme, granularity: 'uniform', size: () => props.scale, props, description: Description }; } } exports.VolumeValueSizeThemeProvider = { name: 'volume-value', label: 'Volume Value', category: '', factory: VolumeValueSizeTheme, getParams: getVolumeValueSizeThemeParams, defaultValues: param_definition_1.ParamDefinition.getDefaultValues(exports.VolumeValueSizeThemeParams), isApplicable: (ctx) => !!ctx.volume && !volume_1.Volume.Segmentation.get(ctx.volume), };