UNPKG

molstar

Version:

A comprehensive macromolecular library.

169 lines (168 loc) 8.44 kB
"use strict"; /** * Copyright (c) 2018-2020 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> */ Object.defineProperty(exports, "__esModule", { value: true }); exports.SpacegroupCell = exports.Spacegroup = void 0; var linear_algebra_1 = require("../../linear-algebra"); var tables_1 = require("./tables"); var geometry_1 = require("../../geometry"); var SpacegroupCell; (function (SpacegroupCell) { /** Create a 'P 1' with cellsize [1, 1, 1] */ SpacegroupCell.Zero = create('P 1', linear_algebra_1.Vec3.create(1, 1, 1), linear_algebra_1.Vec3.create(Math.PI / 2, Math.PI / 2, Math.PI / 2)); /** True if 'P 1' with cellsize [1, 1, 1] */ function isZero(cell) { if (!cell) return true; return cell.index === 0 && cell.size[0] === 1 && cell.size[1] === 1 && cell.size[1] === 1; } SpacegroupCell.isZero = isZero; /** Returns Zero cell if the spacegroup does not exist */ function create(nameOrNumber, size, anglesInRadians) { var index = (0, tables_1.getSpacegroupIndex)(nameOrNumber); if (index < 0) { console.warn("Unknown spacegroup '".concat(nameOrNumber, "', returning a 'P 1' with cellsize [1, 1, 1]")); return SpacegroupCell.Zero; } var volume = size[0] * size[1] * size[2]; var alpha = anglesInRadians[0]; var beta = anglesInRadians[1]; var gamma = anglesInRadians[2]; var xScale = size[0], yScale = size[1], zScale = size[2]; var z1 = Math.cos(beta); var z2 = (Math.cos(alpha) - Math.cos(beta) * Math.cos(gamma)) / Math.sin(gamma); var z3 = Math.sqrt(1.0 - z1 * z1 - z2 * z2); var x = [xScale, 0.0, 0.0]; var y = [Math.cos(gamma) * yScale, Math.sin(gamma) * yScale, 0.0]; var z = [z1 * zScale, z2 * zScale, z3 * zScale]; var fromFractional = linear_algebra_1.Mat4.ofRows([ [x[0], y[0], z[0], 0], [0, y[1], z[1], 0], [0, 0, z[2], 0], [0, 0, 0, 1.0] ]); var toFractional = linear_algebra_1.Mat4.invert(linear_algebra_1.Mat4.zero(), fromFractional); return { index: index, size: size, volume: volume, anglesInRadians: anglesInRadians, toFractional: toFractional, fromFractional: fromFractional }; } SpacegroupCell.create = create; })(SpacegroupCell || (SpacegroupCell = {})); exports.SpacegroupCell = SpacegroupCell; var Spacegroup; (function (Spacegroup) { /** P1 with [1, 1, 1] cell */ Spacegroup.ZeroP1 = create(SpacegroupCell.Zero); function create(cell) { var operators = tables_1.GroupData[cell.index].map(function (i) { return getOperatorMatrix(tables_1.OperatorData[i]); }); var name = tables_1.SpacegroupName[cell.index]; var num = tables_1.SpacegroupNumber[cell.index]; return { name: name, num: num, cell: cell, operators: operators }; } Spacegroup.create = create; var _ijkVec = (0, linear_algebra_1.Vec3)(); var _tempMat = (0, linear_algebra_1.Mat4)(); function setOperatorMatrix(spacegroup, index, i, j, k, target) { linear_algebra_1.Vec3.set(_ijkVec, i, j, k); linear_algebra_1.Mat4.fromTranslation(_tempMat, _ijkVec); return linear_algebra_1.Mat4.mul(target, linear_algebra_1.Mat4.mul(target, linear_algebra_1.Mat4.mul(target, spacegroup.cell.fromFractional, _tempMat), spacegroup.operators[index]), spacegroup.cell.toFractional); } Spacegroup.setOperatorMatrix = setOperatorMatrix; function getSymmetryOperator(spacegroup, spgrOp, i, j, k) { var operator = setOperatorMatrix(spacegroup, spgrOp, i, j, k, linear_algebra_1.Mat4.zero()); return geometry_1.SymmetryOperator.create("".concat(spgrOp + 1, "_").concat(5 + i).concat(5 + j).concat(5 + k), operator, { hkl: linear_algebra_1.Vec3.create(i, j, k), spgrOp: spgrOp }); } Spacegroup.getSymmetryOperator = getSymmetryOperator; var _translationRef = (0, linear_algebra_1.Vec3)(); var _translationRefSymop = (0, linear_algebra_1.Vec3)(); var _translationRefOffset = (0, linear_algebra_1.Vec3)(); var _translationSymop = (0, linear_algebra_1.Vec3)(); /** * Get Symmetry operator for transformation around the given * reference point `ref` in fractional coordinates */ function getSymmetryOperatorRef(spacegroup, spgrOp, i, j, k, ref) { var operator = linear_algebra_1.Mat4.zero(); linear_algebra_1.Vec3.set(_ijkVec, i, j, k); linear_algebra_1.Vec3.floor(_translationRef, ref); linear_algebra_1.Mat4.copy(operator, spacegroup.operators[spgrOp]); linear_algebra_1.Vec3.floor(_translationRefSymop, linear_algebra_1.Vec3.transformMat4(_translationRefSymop, ref, operator)); linear_algebra_1.Mat4.getTranslation(_translationSymop, operator); linear_algebra_1.Vec3.sub(_translationSymop, _translationSymop, _translationRefSymop); linear_algebra_1.Vec3.add(_translationSymop, _translationSymop, _translationRef); linear_algebra_1.Vec3.add(_translationSymop, _translationSymop, _ijkVec); linear_algebra_1.Mat4.setTranslation(operator, _translationSymop); linear_algebra_1.Mat4.mul(operator, spacegroup.cell.fromFractional, operator); linear_algebra_1.Mat4.mul(operator, operator, spacegroup.cell.toFractional); linear_algebra_1.Vec3.sub(_translationRefOffset, _translationRefSymop, _translationRef); var _i = i - _translationRefOffset[0]; var _j = j - _translationRefOffset[1]; var _k = k - _translationRefOffset[2]; // const operator = setOperatorMatrixRef(spacegroup, spgrOp, i, j, k, ref, Mat4.zero()); return geometry_1.SymmetryOperator.create("".concat(spgrOp + 1, "_").concat(5 + _i).concat(5 + _j).concat(5 + _k), operator, { hkl: linear_algebra_1.Vec3.create(_i, _j, _k), spgrOp: spgrOp }); } Spacegroup.getSymmetryOperatorRef = getSymmetryOperatorRef; function getOperatorMatrix(ids) { var r1 = tables_1.TransformData[ids[0]]; var r2 = tables_1.TransformData[ids[1]]; var r3 = tables_1.TransformData[ids[2]]; return linear_algebra_1.Mat4.ofRows([r1, r2, r3, [0, 0, 0, 1]]); } function getOperatorXyz(op) { return [ formatElement(getRotation(op[0], op[4], op[8]), getShift(op[12])), formatElement(getRotation(op[1], op[5], op[9]), getShift(op[13])), formatElement(getRotation(op[2], op[6], op[10]), getShift(op[14])) ].join(','); } Spacegroup.getOperatorXyz = getOperatorXyz; function getRotation(x, y, z) { var r = []; if (x > 0) r.push('+X'); else if (x < 0) r.push('-X'); if (y > 0) r.push('+Y'); else if (y < 0) r.push('-Y'); if (z > 0) r.push('+Z'); else if (z < 0) r.push('-Z'); if (r.length === 1) { return r[0].charAt(0) === '+' ? r[0].substr(1) : r[0]; } if (r.length === 2) { var s0 = r[0].charAt(0); var s1 = r[1].charAt(0); if (s0 === '+') return "".concat(r[0].substr(1)).concat(r[1]); if (s1 === '+') return "".concat(r[1].substr(1)).concat(r[0]); } throw new Error("unknown rotation '".concat(r, "', ").concat(x, " ").concat(y, " ").concat(z)); } function getShift(s) { switch (s) { case 1 / 2: return '1/2'; case 1 / 4: return '1/4'; case 3 / 4: return '3/4'; case 1 / 3: return '1/3'; case 2 / 3: return '2/3'; case 1 / 6: return '1/6'; case 5 / 6: return '5/6'; } return ''; } function formatElement(rotation, shift) { if (shift === '') return rotation; if (rotation.length > 2) return "".concat(rotation, "+").concat(shift); return rotation.charAt(0) === '-' ? "".concat(shift).concat(rotation) : "".concat(shift, "+").concat(rotation); } })(Spacegroup || (Spacegroup = {})); exports.Spacegroup = Spacegroup;