molstar
Version:
A comprehensive macromolecular library.
97 lines (96 loc) • 4.27 kB
JavaScript
;
/**
* 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),
};