UNPKG

molstar

Version:

A comprehensive macromolecular library.

109 lines 4.52 kB
/** * Copyright (c) 2019 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> */ import { __assign } from "tslib"; import { Color } from '../../mol-util/color'; import { StructureElement, Bond } from '../../mol-model/structure'; import { ParamDefinition as PD } from '../../mol-util/param-definition'; import { getPaletteParams, getPalette } from '../../mol-util/color/palette'; import { integerDigitCount } from '../../mol-util/number'; import { ColorLists, getColorListFromName } from '../../mol-util/color/lists'; var DefaultList = 'dark-2'; var DefaultColor = Color(0xCCCCCC); var Description = "Assigns a color based on the operator HKL value of a transformed chain."; export var OperatorHklColorThemeParams = __assign({}, getPaletteParams({ type: 'colors', colorList: DefaultList })); export function getOperatorHklColorThemeParams(ctx) { var params = PD.clone(OperatorHklColorThemeParams); if (ctx.structure) { if (getOperatorHklSerialMap(ctx.structure.root).map.size > ColorLists[DefaultList].list.length) { params.palette.defaultValue.name = 'colors'; params.palette.defaultValue.params = __assign(__assign({}, params.palette.defaultValue.params), { list: { kind: 'interpolate', colors: getColorListFromName(DefaultList).list } }); } } return params; } var hklOffset = 10000; function hklKey(hkl) { return hkl.map(function (v) { return ("" + (v + hklOffset)).padStart(5, '0'); }).join(''); } function hklKeySplit(key) { var len = integerDigitCount(hklOffset, 0); var h = parseInt(key.substr(0, len)); var k = parseInt(key.substr(len, len)); var l = parseInt(key.substr(len + len, len)); return [h - hklOffset, k - hklOffset, l - hklOffset]; } function formatHkl(hkl) { return hkl.map(function (v) { return v + 5; }).join(''); } function getOperatorHklSerialMap(structure) { var map = new Map(); var set = new Set(); for (var i = 0, il = structure.units.length; i < il; ++i) { var k = hklKey(structure.units[i].conformation.operator.hkl); set.add(k); } var arr = Array.from(set.values()).sort(); arr.forEach(function (k) { return map.set(k, map.size); }); var min = hklKeySplit(arr[0]); var max = hklKeySplit(arr[arr.length - 1]); return { min: min, max: max, map: map }; } export function OperatorHklColorTheme(ctx, props) { var color; var legend; if (ctx.structure) { var _a = getOperatorHklSerialMap(ctx.structure.root), min = _a.min, max = _a.max, map_1 = _a.map; var labelTable_1 = []; map_1.forEach(function (v, k) { var i = v % map_1.size; var label = formatHkl(hklKeySplit(k)); if (labelTable_1[i] === undefined) labelTable_1[i] = label; else labelTable_1[i] += ", " + label; }); var labelOptions = { minLabel: formatHkl(min), maxLabel: formatHkl(max), valueLabel: function (i) { return labelTable_1[i]; } }; var palette_1 = getPalette(map_1.size, props, labelOptions); legend = palette_1.legend; color = function (location) { var serial = undefined; if (StructureElement.Location.is(location)) { var k = hklKey(location.unit.conformation.operator.hkl); serial = map_1.get(k); } else if (Bond.isLocation(location)) { var k = hklKey(location.aUnit.conformation.operator.hkl); serial = map_1.get(k); } return serial === undefined ? DefaultColor : palette_1.color(serial); }; } else { color = function () { return DefaultColor; }; } return { factory: OperatorHklColorTheme, granularity: 'instance', color: color, props: props, description: Description, legend: legend }; } export var OperatorHklColorThemeProvider = { name: 'operator-hkl', label: 'Operator HKL', category: "Symmetry" /* Symmetry */, factory: OperatorHklColorTheme, getParams: getOperatorHklColorThemeParams, defaultValues: PD.getDefaultValues(OperatorHklColorThemeParams), isApplicable: function (ctx) { return !!ctx.structure; } }; //# sourceMappingURL=operator-hkl.js.map