molstar
Version:
A comprehensive macromolecular library.
185 lines • 6.44 kB
JavaScript
/**
* Copyright (c) 2018-2021 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.getQualityProps = exports.getStructureQuality = exports.DefaultQualityThresholds = exports.VisualUpdateState = void 0;
var tslib_1 = require("tslib");
var mol_util_1 = require("../mol-util");
var structure_1 = require("../mol-model/structure");
var geometry_1 = require("../mol-math/geometry");
var symmetry_1 = require("../mol-model-formats/structure/property/symmetry");
var volume_1 = require("../mol-model/volume");
var VisualUpdateState;
(function (VisualUpdateState) {
function create() {
return {
updateTransform: false,
updateMatrix: false,
updateColor: false,
updateSize: false,
createGeometry: false,
createNew: false,
info: {}
};
}
VisualUpdateState.create = create;
function reset(state) {
state.updateTransform = false;
state.updateMatrix = false;
state.updateColor = false;
state.updateSize = false;
state.createGeometry = false;
state.createNew = false;
}
VisualUpdateState.reset = reset;
})(VisualUpdateState = exports.VisualUpdateState || (exports.VisualUpdateState = {}));
exports.DefaultQualityThresholds = {
lowestElementCount: 1000000,
lowerElementCount: 500000,
lowElementCount: 100000,
mediumElementCount: 20000,
highElementCount: 2000,
coarseGrainedFactor: 10,
elementCountFactor: 1
};
function getStructureQuality(structure, tresholds) {
if (tresholds === void 0) { tresholds = {}; }
var t = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, exports.DefaultQualityThresholds), tresholds);
var score = structure.elementCount * t.elementCountFactor;
if (structure.isCoarseGrained)
score *= t.coarseGrainedFactor;
if (score > t.lowestElementCount) {
return 'lowest';
}
else if (score > t.lowerElementCount) {
return 'lower';
}
else if (score > t.lowElementCount) {
return 'low';
}
else if (score > t.mediumElementCount) {
return 'medium';
}
else if (score > t.highElementCount) {
return 'high';
}
else {
return 'higher';
}
}
exports.getStructureQuality = getStructureQuality;
/**
* Uses cell volume to avoid costly boundary calculation if
* - single model
* - non-empty 'P 1' spacegroup
*/
function getRootVolume(structure) {
if (structure.root.models.length === 1) {
var sym = symmetry_1.ModelSymmetry.Provider.get(structure.root.model);
if (sym && sym.spacegroup.name === 'P 1' && !geometry_1.SpacegroupCell.isZero(sym.spacegroup.cell)) {
return sym.spacegroup.cell.volume;
}
}
return geometry_1.Box3D.volume(structure.root.boundary.box);
}
function getQualityProps(props, data) {
var quality = (0, mol_util_1.defaults)(props.quality, 'auto');
var detail = (0, mol_util_1.defaults)(props.detail, 1);
var radialSegments = (0, mol_util_1.defaults)(props.radialSegments, 12);
var linearSegments = (0, mol_util_1.defaults)(props.linearSegments, 8);
var resolution = (0, mol_util_1.defaults)(props.resolution, 2);
var probePositions = (0, mol_util_1.defaults)(props.probePositions, 12);
var doubleSided = (0, mol_util_1.defaults)(props.doubleSided, true);
var volume = 0;
if (quality === 'auto') {
if (data instanceof structure_1.Structure) {
quality = getStructureQuality(data.root);
volume = getRootVolume(data);
}
else if (volume_1.Volume.is(data)) {
var _a = data.grid.cells.space.dimensions, x = _a[0], y = _a[1], z = _a[2];
volume = x * y * z;
quality = volume < 10000000 ? 'medium' : 'low';
}
}
switch (quality) {
case 'highest':
detail = 3;
radialSegments = 36;
linearSegments = 18;
resolution = 0.1;
probePositions = 72;
doubleSided = true;
break;
case 'higher':
detail = 3;
radialSegments = 28;
linearSegments = 14;
resolution = 0.3;
probePositions = 48;
doubleSided = true;
break;
case 'high':
detail = 2;
radialSegments = 20;
linearSegments = 10;
resolution = 0.5;
probePositions = 36;
doubleSided = true;
break;
case 'medium':
detail = 1;
radialSegments = 12;
linearSegments = 8;
resolution = 0.8;
probePositions = 24;
doubleSided = true;
break;
case 'low':
detail = 0;
radialSegments = 8;
linearSegments = 3;
resolution = 1.3;
probePositions = 24;
doubleSided = false;
break;
case 'lower':
detail = 0;
radialSegments = 4;
linearSegments = 2;
resolution = 3;
probePositions = 12;
doubleSided = false;
break;
case 'lowest':
detail = 0;
radialSegments = 2;
linearSegments = 1;
resolution = 8;
probePositions = 12;
doubleSided = false;
break;
case 'custom':
// use defaults or given props as set above
break;
}
// max resolution based on volume (for 'auto' quality)
resolution = Math.max(resolution, volume / 500000000);
resolution = Math.min(resolution, 20);
if ((props.alpha !== undefined && props.alpha < 1) || !!props.xrayShaded) {
doubleSided = false;
}
return {
detail: detail,
radialSegments: radialSegments,
linearSegments: linearSegments,
resolution: resolution,
probePositions: probePositions,
doubleSided: doubleSided
};
}
exports.getQualityProps = getQualityProps;
//# sourceMappingURL=util.js.map
;