diff --git a/src/mol-geo/shape/mesh.ts b/src/mol-geo/shape/mesh.ts index daab5862beadae5b31a7ac0388058dbd876ca65d..fcd4ac207f5e8dfb879c3ecacdb4ef33d4525bd8 100644 --- a/src/mol-geo/shape/mesh.ts +++ b/src/mol-geo/shape/mesh.ts @@ -7,7 +7,7 @@ import { Task } from 'mol-task' import { ValueCell } from 'mol-util' import { Vec3, Mat4 } from 'mol-math/linear-algebra' -import Sphere from 'mol-math/geometry/sphere' +import { Sphere3D } from 'mol-math/geometry' import { transformPositionArray } from '../util'; export interface Mesh { @@ -29,7 +29,7 @@ export interface Mesh { normalsComputed: boolean, /** Bounding sphere of the mesh */ - boundingSphere?: Sphere + boundingSphere?: Sphere3D } export namespace Mesh { diff --git a/src/mol-math/geometry.ts b/src/mol-math/geometry.ts index 5754f04a380143ee983caaed3bea1b3d1028cc28..7484d18b19e139f60666ac4a850c254f685e5848 100644 --- a/src/mol-math/geometry.ts +++ b/src/mol-math/geometry.ts @@ -6,6 +6,7 @@ export * from './geometry/common' export * from './geometry/symmetry-operator' +export * from './geometry/spacegroup/construction' export * from './geometry/lookup3d/common' export * from './geometry/lookup3d/grid' export * from './geometry/primitives/box3d' diff --git a/src/mol-math/geometry/primitives/sphere3d.ts b/src/mol-math/geometry/primitives/sphere3d.ts index 3e280da055a57333215ebda7b540d309b50280b1..2132583d80c6937669c3d3186603d804bd8793c3 100644 --- a/src/mol-math/geometry/primitives/sphere3d.ts +++ b/src/mol-math/geometry/primitives/sphere3d.ts @@ -11,6 +11,10 @@ import { OrderedSet } from 'mol-data/int'; interface Sphere3D { center: Vec3, radius: number } namespace Sphere3D { + export function create(center: Vec3, radius: number): Sphere3D { + return { center, radius }; + } + export function computeBounding(data: PositionData): Sphere3D { const { x, y, z, indices } = data; let cx = 0, cy = 0, cz = 0; diff --git a/src/mol-math/geometry/spacegroup/construction.ts b/src/mol-math/geometry/spacegroup/construction.ts new file mode 100644 index 0000000000000000000000000000000000000000..807eb02ad96ad1c9df499b95459bdb7206866330 --- /dev/null +++ b/src/mol-math/geometry/spacegroup/construction.ts @@ -0,0 +1,92 @@ +/** + * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info. + * + * @author David Sehnal <david.sehnal@gmail.com> + */ + +import { Vec3, Mat4 } from '../../linear-algebra' +import { SpacegroupName, TransformData, GroupData, SpacegroupNumbers, SpacegroupNames, OperatorData } from './tables' +import { SymmetryOperator } from '../../geometry'; + +interface SpacegroupCell { + readonly size: Vec3, + readonly anglesInRadians: Vec3, + /** Transfrom cartesian -> fractional coordinates within the cell */ + readonly toFractional: Mat4, + /** Transfrom fractional coordinates within the cell -> cartesian */ + readonly fromFractional: Mat4 +} + +interface Spacegroup { + readonly number: number, + readonly name: string, + readonly cell: SpacegroupCell, + readonly operators: ReadonlyArray<Mat4> +} + +namespace SpacegroupCell { + export function create(size: Vec3, anglesInRadians: Vec3): SpacegroupCell { + const alpha = anglesInRadians[0]; + const beta = anglesInRadians[1]; + const gamma = anglesInRadians[2]; + + const xScale = size[0], yScale = size[1], zScale = size[2]; + + const z1 = Math.cos(beta); + const z2 = (Math.cos(alpha) - Math.cos(beta) * Math.cos(gamma)) / Math.sin(gamma); + const z3 = Math.sqrt(1.0 - z1 * z1 - z2 * z2); + + const x = [xScale, 0.0, 0.0]; + const y = [Math.cos(gamma) * yScale, Math.sin(gamma) * yScale, 0.0]; + const z = [z1 * zScale, z2 * zScale, z3 * zScale]; + + const fromFractional = 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] + ]); + const toFractional = Mat4.invert(Mat4.zero(), fromFractional)!; + + return { size, anglesInRadians, toFractional, fromFractional }; + } +} + +namespace Spacegroup { + export function create(nameOrNumber: number | SpacegroupName, cell: SpacegroupCell): Spacegroup { + const num = typeof nameOrNumber === 'number' ? nameOrNumber : SpacegroupNumbers[nameOrNumber]; + const name = typeof nameOrNumber === 'number' ? SpacegroupNames[nameOrNumber] : nameOrNumber; + + if (typeof num === 'undefined' || typeof name === 'undefined') { + throw new Error(`Spacegroup '${nameOrNumber}' is not defined.`); + } + + const operators = GroupData[num].map(i => getOperatorMatrix(OperatorData[i])); + + return { number: num, name, cell, operators }; + } + + const _tempVec = Vec3.zero(), _tempMat = Mat4.zero(); + export function updateOperatorMatrix(spacegroup: Spacegroup, index: number, i: number, j: number, k: number, target: Mat4) { + _tempVec[0] = i; + _tempVec[1] = j; + _tempVec[2] = k; + + Mat4.fromTranslation(_tempMat, _tempVec); + return Mat4.mul(target, Mat4.mul(target, Mat4.mul(target, spacegroup.cell.fromFractional, _tempMat), spacegroup.operators[index]), spacegroup.cell.toFractional); + } + + export function getSymmetryOperator(spacegroup: Spacegroup, index: number, i: number, j: number, k: number): SymmetryOperator { + const operator = updateOperatorMatrix(spacegroup, index, i, j, k, Mat4.zero()); + return SymmetryOperator.create(`${index + 1}_${5 + i}${5 + j}${5 + k}`, operator, Vec3.create(i, j, k)); + } + + function getOperatorMatrix(ids: number[]) { + const r1 = TransformData[ids[0]]; + const r2 = TransformData[ids[1]]; + const r3 = TransformData[ids[2]]; + return Mat4.ofRows([r1, r2, r3, [0, 0, 0, 1]]); + } +} + +export { Spacegroup, SpacegroupCell } \ No newline at end of file diff --git a/src/mol-math/geometry/spacegroup/tables.ts b/src/mol-math/geometry/spacegroup/tables.ts new file mode 100644 index 0000000000000000000000000000000000000000..de3ec97927b441f1fc80b0a8d665650b628bf331 --- /dev/null +++ b/src/mol-math/geometry/spacegroup/tables.ts @@ -0,0 +1,1344 @@ +/** + * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info. + * + * @author David Sehnal <david.sehnal@gmail.com> + */ + +export const TransformData = [ + [1.0, 0.0, 0.0, 0.0], + [0.0, 1.0, 0.0, 0.0], + [0.0, 0.0, 1.0, 0.0], + [-1.0, 0.0, 0.0, 0.0], + [0.0, -1.0, 0.0, 0.0], + [0.0, 0.0, -1.0, 0.0], + [0.0, 1.0, 0.0, 0.5], + [1.0, 0.0, 0.0, 0.5], + [-1.0, 0.0, 0.0, 0.5], + [0.0, 0.0, 1.0, 0.5], + [0.0, -1.0, 0.0, 0.5], + [0.0, 0.0, -1.0, 0.5], + [1.0, 0.0, 0.0, 0.25], + [0.0, -1.0, 0.0, 0.25], + [0.0, 0.0, 1.0, 0.25], + [-1.0, 0.0, 0.0, 0.25], + [0.0, 1.0, 0.0, 0.25], + [0.0, -1.0, 0.0, 0.75], + [0.0, 0.0, 1.0, 0.75], + [0.0, 1.0, 0.0, 0.75], + [1.0, 0.0, 0.0, 0.75], + [-1.0, 0.0, 0.0, 0.75], + [0.0, 0.0, -1.0, 0.25], + [0.0, 0.0, -1.0, 0.75], + [1.0, -1.0, 0.0, 0.0], + [-1.0, 1.0, 0.0, 0.0], + [0.0, 0.0, 1.0, 0.333333333333333], + [0.0, 0.0, 1.0, 0.666666666666667], + [1.0, 0.0, 0.0, 0.666666666666667], + [0.0, 1.0, 0.0, 0.333333333333333], + [0.0, -1.0, 0.0, 0.666666666666667], + [1.0, -1.0, 0.0, 0.333333333333333], + [-1.0, 1.0, 0.0, 0.666666666666667], + [-1.0, 0.0, 0.0, 0.333333333333333], + [1.0, 0.0, 0.0, 0.333333333333333], + [0.0, 1.0, 0.0, 0.666666666666667], + [0.0, -1.0, 0.0, 0.333333333333333], + [1.0, -1.0, 0.0, 0.666666666666667], + [-1.0, 1.0, 0.0, 0.333333333333333], + [-1.0, 0.0, 0.0, 0.666666666666667], + [0.0, 0.0, -1.0, 0.333333333333333], + [0.0, 0.0, -1.0, 0.666666666666667], + [0.0, 0.0, 1.0, 0.833333333333333], + [0.0, 0.0, 1.0, 0.166666666666667], + [0.0, 0.0, -1.0, 0.833333333333333], + [0.0, 0.0, -1.0, 0.166666666666667], +]; + +export const OperatorData = [ + [0, 1, 2], + [3, 4, 5], + [3, 1, 5], + [3, 6, 5], + [7, 6, 2], + [8, 6, 5], + [0, 4, 2], + [0, 4, 9], + [7, 10, 2], + [7, 10, 9], + [0, 10, 2], + [8, 10, 5], + [3, 1, 11], + [3, 6, 11], + [0, 10, 9], + [8, 6, 11], + [3, 4, 2], + [0, 4, 5], + [3, 4, 9], + [7, 10, 5], + [8, 4, 9], + [8, 10, 9], + [8, 10, 2], + [0, 6, 9], + [3, 10, 9], + [0, 10, 11], + [7, 1, 9], + [8, 1, 11], + [7, 4, 11], + [7, 6, 9], + [7, 10, 11], + [3, 10, 2], + [8, 1, 5], + [0, 4, 11], + [3, 1, 2], + [3, 1, 9], + [7, 4, 2], + [8, 1, 2], + [8, 1, 9], + [3, 6, 9], + [7, 4, 9], + [8, 6, 2], + [8, 6, 9], + [3, 6, 2], + [12, 13, 14], + [15, 16, 14], + [12, 17, 18], + [15, 19, 18], + [20, 13, 18], + [21, 16, 18], + [20, 17, 14], + [21, 19, 14], + [0, 1, 5], + [8, 10, 11], + [7, 6, 11], + [7, 6, 5], + [8, 4, 2], + [7, 4, 5], + [7, 1, 5], + [7, 1, 11], + [0, 10, 5], + [0, 1, 11], + [0, 6, 11], + [0, 6, 5], + [3, 10, 11], + [8, 4, 11], + [15, 13, 22], + [12, 16, 22], + [15, 17, 23], + [12, 19, 23], + [21, 13, 23], + [20, 16, 23], + [21, 17, 22], + [20, 19, 22], + [4, 0, 2], + [1, 3, 2], + [4, 0, 14], + [1, 3, 18], + [4, 0, 9], + [1, 3, 9], + [4, 0, 18], + [1, 3, 14], + [10, 7, 9], + [6, 8, 9], + [4, 7, 14], + [6, 3, 18], + [10, 0, 18], + [1, 8, 14], + [1, 3, 5], + [4, 0, 5], + [6, 8, 11], + [10, 7, 11], + [1, 3, 11], + [4, 0, 11], + [10, 7, 2], + [6, 8, 2], + [3, 10, 22], + [7, 1, 23], + [8, 4, 23], + [0, 6, 22], + [1, 0, 5], + [4, 3, 5], + [1, 0, 23], + [4, 3, 22], + [10, 7, 14], + [6, 8, 18], + [8, 6, 22], + [7, 10, 23], + [4, 3, 11], + [1, 0, 11], + [1, 0, 22], + [4, 3, 23], + [10, 7, 18], + [6, 8, 14], + [8, 6, 23], + [7, 10, 22], + [6, 7, 11], + [10, 8, 11], + [8, 1, 23], + [0, 10, 22], + [3, 6, 22], + [7, 4, 23], + [4, 3, 2], + [1, 0, 2], + [10, 8, 2], + [6, 7, 2], + [4, 3, 9], + [1, 0, 9], + [10, 8, 9], + [6, 7, 9], + [4, 8, 14], + [6, 0, 18], + [10, 3, 18], + [1, 7, 14], + [4, 8, 18], + [6, 0, 14], + [10, 3, 14], + [1, 7, 18], + [6, 7, 5], + [10, 8, 5], + [6, 8, 5], + [10, 7, 5], + [8, 1, 22], + [0, 10, 23], + [3, 6, 23], + [7, 4, 22], + [4, 24, 2], + [25, 3, 2], + [4, 24, 26], + [25, 3, 27], + [4, 24, 27], + [25, 3, 26], + [28, 29, 26], + [30, 31, 26], + [32, 33, 26], + [34, 35, 27], + [36, 37, 27], + [38, 39, 27], + [2, 0, 1], + [1, 2, 0], + [1, 25, 5], + [24, 0, 5], + [39, 36, 40], + [35, 38, 40], + [37, 34, 40], + [33, 30, 41], + [29, 32, 41], + [31, 28, 41], + [5, 3, 4], + [4, 5, 3], + [25, 1, 5], + [0, 24, 5], + [24, 4, 5], + [3, 25, 5], + [4, 3, 41], + [25, 1, 40], + [24, 4, 41], + [3, 25, 40], + [4, 3, 40], + [25, 1, 41], + [24, 4, 40], + [3, 25, 41], + [35, 34, 40], + [37, 36, 40], + [39, 38, 40], + [29, 28, 41], + [31, 30, 41], + [33, 32, 41], + [3, 5, 4], + [5, 4, 3], + [25, 1, 2], + [0, 24, 2], + [24, 4, 2], + [3, 25, 2], + [25, 1, 9], + [0, 24, 9], + [24, 4, 9], + [3, 25, 9], + [30, 33, 26], + [32, 29, 26], + [28, 31, 26], + [36, 39, 27], + [38, 35, 27], + [34, 37, 27], + [0, 2, 1], + [2, 1, 0], + [30, 33, 42], + [32, 29, 42], + [28, 31, 42], + [36, 39, 43], + [38, 35, 43], + [34, 37, 43], + [7, 9, 6], + [9, 6, 7], + [25, 1, 11], + [0, 24, 11], + [24, 4, 11], + [3, 25, 11], + [35, 34, 44], + [37, 36, 44], + [39, 38, 44], + [29, 28, 45], + [31, 30, 45], + [33, 32, 45], + [8, 11, 10], + [11, 10, 8], + [1, 25, 2], + [24, 0, 2], + [1, 25, 42], + [24, 0, 43], + [1, 25, 43], + [24, 0, 42], + [1, 25, 27], + [24, 0, 26], + [1, 25, 26], + [24, 0, 27], + [1, 25, 9], + [24, 0, 9], + [4, 24, 5], + [25, 3, 5], + [4, 24, 11], + [25, 3, 11], + [1, 0, 40], + [4, 3, 44], + [0, 24, 45], + [1, 0, 41], + [4, 3, 45], + [0, 24, 44], + [0, 24, 40], + [0, 24, 41], + [2, 3, 4], + [5, 3, 1], + [5, 0, 4], + [4, 2, 3], + [1, 5, 3], + [4, 5, 0], + [2, 7, 6], + [2, 8, 10], + [5, 8, 6], + [5, 7, 10], + [1, 9, 7], + [4, 9, 8], + [1, 11, 8], + [4, 11, 7], + [9, 0, 6], + [9, 3, 10], + [11, 3, 6], + [11, 0, 10], + [6, 2, 7], + [10, 2, 8], + [6, 5, 8], + [10, 5, 7], + [9, 7, 1], + [9, 8, 4], + [11, 8, 1], + [11, 7, 4], + [6, 9, 0], + [10, 9, 3], + [6, 11, 3], + [10, 11, 0], + [9, 7, 6], + [9, 8, 10], + [11, 8, 6], + [11, 7, 10], + [6, 9, 7], + [10, 9, 8], + [6, 11, 8], + [10, 11, 7], + [2, 3, 10], + [5, 8, 1], + [11, 0, 4], + [10, 2, 3], + [1, 5, 8], + [4, 11, 0], + [5, 0, 1], + [2, 0, 4], + [2, 3, 1], + [1, 5, 0], + [4, 2, 0], + [1, 2, 3], + [11, 8, 10], + [11, 7, 6], + [9, 7, 10], + [9, 8, 6], + [10, 11, 8], + [6, 11, 7], + [10, 9, 7], + [6, 9, 8], + [5, 8, 10], + [5, 7, 6], + [2, 7, 10], + [2, 8, 6], + [4, 11, 8], + [1, 11, 7], + [4, 9, 7], + [1, 9, 8], + [11, 3, 10], + [11, 0, 6], + [9, 0, 10], + [9, 3, 6], + [10, 5, 8], + [6, 5, 7], + [10, 2, 7], + [6, 2, 8], + [11, 8, 4], + [11, 7, 1], + [9, 7, 4], + [9, 8, 1], + [10, 11, 3], + [6, 11, 0], + [10, 9, 0], + [6, 9, 3], + [22, 15, 13], + [22, 12, 16], + [14, 12, 13], + [14, 15, 16], + [13, 22, 15], + [16, 22, 12], + [13, 14, 12], + [16, 14, 15], + [22, 21, 17], + [22, 20, 19], + [14, 20, 17], + [14, 21, 19], + [13, 23, 21], + [16, 23, 20], + [13, 18, 20], + [16, 18, 21], + [23, 15, 17], + [23, 12, 19], + [18, 12, 17], + [18, 15, 19], + [17, 22, 21], + [19, 22, 20], + [17, 14, 20], + [19, 14, 21], + [23, 21, 13], + [23, 20, 16], + [18, 20, 13], + [18, 21, 16], + [17, 23, 15], + [19, 23, 12], + [17, 18, 12], + [19, 18, 15], + [5, 0, 6], + [2, 7, 4], + [9, 3, 1], + [6, 5, 0], + [4, 2, 7], + [1, 9, 3], + [0, 2, 4], + [3, 2, 1], + [0, 5, 1], + [2, 1, 3], + [2, 4, 0], + [5, 1, 0], + [7, 9, 10], + [8, 9, 6], + [7, 11, 6], + [9, 6, 8], + [9, 10, 7], + [11, 6, 7], + [1, 7, 11], + [4, 8, 11], + [1, 8, 9], + [4, 7, 9], + [0, 9, 10], + [3, 9, 6], + [3, 11, 10], + [0, 11, 6], + [2, 6, 8], + [2, 10, 7], + [5, 6, 7], + [5, 10, 8], + [6, 0, 11], + [10, 3, 11], + [6, 3, 9], + [10, 0, 9], + [7, 2, 10], + [8, 2, 6], + [8, 5, 10], + [7, 5, 6], + [9, 1, 8], + [9, 4, 7], + [11, 1, 7], + [11, 4, 8], + [7, 9, 4], + [8, 9, 1], + [8, 11, 4], + [7, 11, 1], + [9, 6, 3], + [9, 10, 0], + [11, 6, 0], + [11, 10, 3], + [19, 12, 23], + [13, 15, 22], + [16, 21, 18], + [17, 20, 14], + [20, 14, 17], + [21, 18, 16], + [15, 22, 13], + [12, 23, 19], + [18, 16, 21], + [14, 17, 20], + [23, 19, 12], + [22, 13, 15], + [19, 20, 22], + [13, 21, 23], + [16, 15, 14], + [17, 12, 18], + [20, 18, 13], + [21, 14, 19], + [15, 23, 17], + [12, 22, 16], + [18, 19, 15], + [14, 13, 12], + [23, 16, 20], + [22, 17, 21], + [16, 12, 22], + [17, 15, 23], + [19, 21, 14], + [13, 20, 18], + [12, 14, 13], + [15, 18, 19], + [21, 22, 17], + [20, 23, 16], + [14, 16, 15], + [18, 17, 12], + [22, 19, 20], + [23, 13, 21], + [16, 20, 23], + [17, 21, 22], + [19, 15, 18], + [13, 12, 14], + [12, 18, 17], + [15, 14, 16], + [21, 23, 13], + [20, 22, 19], + [14, 19, 21], + [18, 13, 20], + [22, 16, 12], + [23, 17, 15], + [19, 12, 22], + [17, 21, 23], + [16, 15, 18], + [13, 20, 14], + [20, 14, 13], + [15, 18, 16], + [21, 23, 17], + [12, 22, 19], + [18, 16, 15], + [14, 13, 20], + [22, 19, 12], + [23, 17, 21], + [3, 2, 4], + [3, 5, 1], + [0, 5, 4], + [2, 4, 3], + [5, 1, 3], + [5, 4, 0], + [1, 7, 9], + [4, 8, 9], + [1, 8, 11], + [4, 7, 11], + [0, 9, 6], + [3, 9, 10], + [3, 11, 6], + [0, 11, 10], + [2, 6, 7], + [2, 10, 8], + [5, 6, 8], + [5, 10, 7], + [6, 0, 9], + [10, 3, 9], + [6, 3, 11], + [10, 0, 11], + [7, 2, 6], + [8, 2, 10], + [8, 5, 6], + [7, 5, 10], + [9, 1, 7], + [9, 4, 8], + [11, 1, 8], + [11, 4, 7], + [7, 9, 1], + [8, 9, 4], + [8, 11, 1], + [7, 11, 4], + [9, 6, 0], + [9, 10, 3], + [11, 6, 3], + [11, 10, 0], + [8, 9, 10], + [8, 11, 6], + [7, 11, 10], + [9, 10, 8], + [11, 6, 8], + [11, 10, 7], + [6, 0, 2], + [10, 3, 2], + [6, 3, 5], + [10, 0, 5], + [7, 2, 1], + [8, 2, 4], + [8, 5, 1], + [7, 5, 4], + [9, 1, 0], + [9, 4, 3], + [11, 1, 3], + [11, 4, 0], + [1, 7, 2], + [4, 8, 2], + [1, 8, 5], + [4, 7, 5], + [0, 9, 1], + [3, 9, 4], + [3, 11, 1], + [0, 11, 4], + [2, 6, 0], + [2, 10, 3], + [5, 6, 3], + [5, 10, 0], + [0, 2, 6], + [3, 2, 10], + [3, 5, 6], + [0, 5, 10], + [2, 1, 7], + [2, 4, 8], + [5, 1, 8], + [5, 4, 7], + [16, 12, 14], + [13, 21, 18], + [19, 15, 23], + [17, 20, 22], + [12, 14, 16], + [21, 18, 13], + [15, 23, 19], + [20, 22, 17], + [14, 16, 12], + [18, 13, 21], + [23, 19, 15], + [22, 17, 20], + [19, 20, 18], + [17, 15, 14], + [16, 21, 22], + [13, 12, 23], + [20, 18, 19], + [15, 14, 17], + [21, 22, 16], + [12, 23, 13], + [18, 19, 20], + [14, 17, 15], + [22, 16, 21], + [23, 13, 12], + [6, 0, 5], + [10, 3, 5], + [6, 3, 2], + [10, 0, 2], + [7, 2, 4], + [8, 2, 1], + [8, 5, 4], + [7, 5, 1], + [9, 1, 3], + [9, 4, 0], + [11, 1, 0], + [11, 4, 3], + [1, 7, 5], + [4, 8, 5], + [1, 8, 2], + [4, 7, 2], + [0, 9, 4], + [3, 9, 1], + [3, 11, 4], + [0, 11, 1], + [2, 6, 3], + [2, 10, 0], + [5, 6, 0], + [5, 10, 3], + [0, 2, 10], + [3, 2, 6], + [3, 5, 10], + [0, 5, 6], + [2, 1, 8], + [2, 4, 7], + [5, 1, 7], + [5, 4, 8], + [21, 17, 23], + [20, 16, 22], + [12, 13, 18], + [15, 19, 14], + [23, 21, 17], + [22, 20, 16], + [18, 12, 13], + [14, 15, 19], + [17, 23, 21], + [16, 22, 20], + [13, 18, 12], + [19, 14, 15], + [21, 13, 22], + [20, 19, 23], + [12, 17, 14], + [15, 16, 18], + [23, 15, 13], + [22, 12, 19], + [18, 20, 17], + [14, 21, 16], + [17, 22, 15], + [16, 23, 12], + [13, 14, 20], + [19, 18, 21], + [15, 17, 22], + [12, 16, 23], + [20, 13, 14], + [21, 19, 18], + [22, 21, 13], + [23, 20, 19], + [14, 12, 17], + [18, 15, 16], + [13, 23, 15], + [19, 22, 12], + [17, 18, 20], + [16, 14, 21], + [15, 13, 23], + [12, 19, 22], + [20, 17, 18], + [21, 16, 14], + [22, 15, 17], + [23, 12, 16], + [14, 20, 13], + [18, 21, 19], + [13, 22, 21], + [19, 23, 20], + [17, 14, 12], + [16, 18, 15], + [6, 5, 3], + [4, 9, 3], + [9, 3, 4], + [5, 7, 4], + [4, 5, 7], + [5, 3, 6], +]; + +export const GroupData = [ + [0], + [0, 1], + [0, 2], + [0, 3], + [0, 2, 4, 5], + [0, 6], + [0, 7], + [0, 6, 4, 8], + [0, 7, 4, 9], + [0, 6, 2, 1], + [0, 3, 1, 10], + [0, 6, 2, 1, 4, 8, 5, 11], + [0, 12, 1, 7], + [0, 1, 13, 14], + [0, 12, 1, 7, 4, 15, 11, 9], + [0, 16, 2, 17], + [0, 18, 12, 17], + [0, 16, 5, 19], + [0, 20, 13, 19], + [0, 18, 12, 17, 4, 21, 15, 19], + [0, 16, 2, 17, 4, 22, 5, 19], + [0, 16, 2, 17, 23, 24, 13, 25, 26, 20, 27, 28, 4, 22, 5, 19], + [0, 16, 17, 2, 29, 21, 30, 15], + [0, 20, 13, 19, 29, 31, 32, 33], + [0, 16, 6, 34], + [0, 18, 7, 34], + [0, 16, 7, 35], + [0, 16, 36, 37], + [0, 18, 36, 38], + [0, 16, 14, 39], + [0, 20, 40, 34], + [0, 16, 8, 41], + [0, 18, 8, 42], + [0, 16, 9, 42], + [0, 16, 6, 34, 4, 22, 8, 41], + [0, 18, 7, 34, 4, 21, 9, 41], + [0, 16, 7, 35, 4, 22, 9, 42], + [0, 16, 6, 34, 23, 24, 14, 39], + [0, 16, 10, 43, 23, 24, 7, 35], + [0, 16, 36, 37, 23, 24, 9, 42], + [0, 16, 8, 41, 23, 24, 40, 38], + [0, 16, 6, 34, 23, 24, 14, 39, 26, 20, 40, 38, 4, 22, 8, 41], + [0, 16, 44, 45, 23, 24, 46, 47, 26, 20, 48, 49, 4, 22, 50, 51], + [0, 16, 6, 34, 29, 21, 9, 42], + [0, 16, 8, 41, 29, 21, 7, 35], + [0, 16, 36, 37, 29, 21, 14, 39], + [0, 16, 2, 17, 1, 52, 6, 34], + [0, 16, 2, 17, 53, 54, 9, 42], + [0, 16, 12, 33, 1, 52, 7, 35], + [0, 16, 2, 17, 11, 55, 8, 41], + [0, 56, 2, 57, 1, 58, 6, 37], + [0, 56, 15, 25, 1, 58, 9, 39], + [0, 20, 27, 17, 1, 59, 40, 34], + [0, 56, 12, 28, 1, 58, 7, 38], + [0, 16, 5, 19, 1, 52, 8, 41], + [0, 22, 13, 28, 1, 55, 14, 38], + [0, 18, 13, 60, 1, 61, 14, 43], + [0, 16, 15, 30, 1, 52, 9, 42], + [0, 16, 5, 19, 11, 55, 6, 34], + [0, 21, 12, 19, 1, 54, 7, 41], + [0, 20, 13, 19, 1, 59, 14, 41], + [0, 20, 3, 30, 1, 59, 10, 42], + [0, 18, 12, 17, 1, 61, 7, 34, 4, 21, 15, 19, 11, 54, 9, 41], + [0, 24, 13, 17, 1, 62, 14, 34, 4, 20, 27, 19, 11, 59, 40, 41], + [0, 16, 2, 17, 1, 52, 6, 34, 4, 22, 5, 19, 11, 55, 8, 41], + [0, 16, 12, 33, 1, 52, 7, 35, 4, 22, 15, 30, 11, 55, 9, 42], + [0, 31, 3, 17, 1, 63, 10, 34, 4, 56, 32, 19, 11, 58, 36, 41], + [0, 22, 2, 19, 64, 59, 14, 38, 4, 16, 5, 17, 65, 62, 40, 39], + [0, 16, 2, 17, 1, 52, 6, 34, 23, 24, 13, 25, 64, 62, 14, 39, 26, 20, 27, 28, 65, 59, 40, 38, 4, 22, 5, 19, 11, 55, 8, 41], + [0, 16, 2, 17, 66, 67, 44, 45, 23, 24, 13, 25, 68, 69, 46, 47, 26, 20, 27, 28, 70, 71, 48, 49, 4, 22, 5, 19, 72, 73, 50, 51], + [0, 16, 2, 17, 1, 52, 6, 34, 29, 21, 15, 30, 53, 54, 9, 42], + [0, 16, 5, 19, 1, 52, 8, 41, 29, 21, 12, 33, 53, 54, 7, 35], + [0, 20, 13, 19, 1, 59, 14, 41, 29, 31, 32, 33, 53, 63, 36, 35], + [0, 31, 3, 17, 1, 63, 10, 34, 29, 20, 27, 30, 53, 59, 40, 42], + [0, 16, 74, 75], + [0, 18, 76, 77], + [0, 16, 78, 79], + [0, 18, 80, 81], + [0, 16, 74, 75, 29, 21, 82, 83], + [0, 21, 84, 85, 29, 16, 86, 87], + [0, 16, 88, 89], + [0, 16, 88, 89, 29, 21, 90, 91], + [0, 16, 74, 75, 1, 52, 88, 89], + [0, 16, 78, 79, 1, 52, 92, 93], + [0, 16, 94, 95, 11, 55, 88, 89], + [0, 16, 82, 83, 53, 54, 88, 89], + [0, 16, 74, 75, 1, 52, 88, 89, 29, 21, 82, 83, 53, 54, 90, 91], + [0, 21, 84, 85, 96, 97, 88, 91, 29, 16, 86, 87, 98, 99, 90, 89], + [0, 16, 74, 75, 2, 17, 100, 101], + [0, 16, 94, 95, 5, 19, 100, 101], + [0, 18, 76, 77, 2, 33, 102, 103], + [0, 18, 104, 105, 106, 107, 100, 108], + [0, 16, 78, 79, 2, 17, 109, 108], + [0, 16, 82, 83, 15, 30, 100, 101], + [0, 18, 80, 81, 2, 33, 110, 111], + [0, 18, 112, 113, 114, 115, 100, 108], + [0, 16, 74, 75, 2, 17, 100, 101, 29, 21, 82, 83, 15, 30, 116, 117], + [0, 21, 84, 85, 118, 119, 116, 101, 29, 16, 86, 87, 120, 121, 100, 117], + [0, 16, 74, 75, 6, 34, 122, 123], + [0, 16, 74, 75, 8, 41, 124, 125], + [0, 16, 78, 79, 7, 35, 122, 123], + [0, 16, 82, 83, 9, 42, 122, 123], + [0, 16, 74, 75, 7, 35, 126, 127], + [0, 16, 74, 75, 9, 42, 128, 129], + [0, 16, 78, 79, 6, 34, 126, 127], + [0, 16, 78, 79, 8, 41, 128, 129], + [0, 16, 74, 75, 6, 34, 122, 123, 29, 21, 82, 83, 9, 42, 128, 129], + [0, 16, 74, 75, 7, 35, 126, 127, 29, 21, 82, 83, 8, 41, 124, 125], + [0, 21, 84, 85, 6, 42, 130, 131, 29, 16, 86, 87, 9, 34, 132, 133], + [0, 21, 84, 85, 7, 41, 134, 135, 29, 16, 86, 87, 8, 35, 136, 137], + [0, 16, 89, 88, 2, 17, 122, 123], + [0, 16, 89, 88, 12, 33, 126, 127], + [0, 16, 89, 88, 5, 19, 124, 125], + [0, 16, 89, 88, 15, 30, 128, 129], + [0, 16, 88, 89, 6, 34, 100, 101], + [0, 16, 89, 88, 7, 35, 109, 108], + [0, 16, 89, 88, 8, 41, 138, 139], + [0, 16, 89, 88, 9, 42, 116, 117], + [0, 16, 89, 88, 6, 34, 100, 101, 29, 21, 91, 90, 9, 42, 116, 117], + [0, 16, 89, 88, 7, 35, 109, 108, 29, 21, 91, 90, 8, 41, 138, 139], + [0, 16, 89, 88, 2, 17, 122, 123, 29, 21, 91, 90, 15, 30, 128, 129], + [0, 16, 89, 88, 118, 121, 132, 131, 29, 21, 91, 90, 120, 119, 130, 133], + [0, 16, 74, 75, 2, 17, 100, 101, 1, 52, 88, 89, 6, 34, 122, 123], + [0, 16, 74, 75, 12, 33, 109, 108, 1, 52, 88, 89, 7, 35, 126, 127], + [0, 16, 74, 75, 2, 17, 100, 101, 11, 55, 140, 141, 8, 41, 124, 125], + [0, 16, 74, 75, 2, 17, 100, 101, 53, 54, 90, 91, 9, 42, 128, 129], + [0, 16, 74, 75, 5, 19, 138, 139, 1, 52, 88, 89, 8, 41, 124, 125], + [0, 16, 74, 75, 15, 30, 116, 117, 1, 52, 88, 89, 9, 42, 128, 129], + [0, 16, 94, 95, 5, 19, 100, 101, 11, 55, 88, 89, 6, 34, 124, 125], + [0, 16, 94, 95, 15, 30, 109, 108, 11, 55, 88, 89, 7, 35, 128, 129], + [0, 16, 78, 79, 2, 17, 109, 108, 1, 52, 92, 93, 6, 34, 126, 127], + [0, 16, 78, 79, 12, 33, 100, 101, 1, 52, 92, 93, 7, 35, 122, 123], + [0, 16, 82, 83, 12, 33, 138, 139, 53, 54, 88, 89, 8, 41, 126, 127], + [0, 16, 82, 83, 2, 17, 116, 117, 53, 54, 88, 89, 9, 42, 122, 123], + [0, 16, 78, 79, 5, 19, 116, 117, 1, 52, 92, 93, 8, 41, 128, 129], + [0, 16, 82, 83, 15, 30, 100, 101, 1, 52, 90, 91, 9, 42, 122, 123], + [0, 16, 82, 83, 15, 30, 100, 101, 53, 54, 88, 89, 6, 34, 128, 129], + [0, 16, 82, 83, 5, 19, 109, 108, 53, 54, 88, 89, 7, 35, 124, 125], + [0, 16, 74, 75, 2, 17, 100, 101, 1, 52, 88, 89, 6, 34, 122, 123, 29, 21, 82, 83, 15, 30, 116, 117, 53, 54, 90, 91, 9, 42, 128, 129], + [0, 16, 74, 75, 12, 33, 109, 108, 1, 52, 88, 89, 7, 35, 126, 127, 29, 21, 82, 83, 5, 19, 138, 139, 53, 54, 90, 91, 8, 41, 124, 125], + [0, 21, 84, 85, 118, 119, 116, 101, 96, 97, 88, 91, 9, 34, 132, 133, 29, 16, 86, 87, 120, 121, 100, 117, 98, 99, 90, 89, 6, 42, 130, 131], + [0, 21, 84, 85, 142, 143, 138, 108, 96, 97, 88, 91, 8, 35, 136, 137, 29, 16, 86, 87, 144, 145, 109, 139, 98, 99, 90, 89, 7, 41, 134, 135], + [0, 146, 147], + [0, 148, 149], + [0, 150, 151], + [0, 146, 147, 152, 153, 154, 155, 156, 157], + [0, 158, 159], + [0, 146, 147, 1, 160, 161], + [0, 146, 147, 1, 160, 161, 152, 153, 154, 162, 163, 164, 155, 156, 157, 165, 166, 167], + [0, 158, 159, 1, 168, 169], + [0, 146, 147, 101, 170, 171], + [0, 146, 147, 100, 172, 173], + [0, 148, 149, 174, 175, 171], + [0, 148, 149, 100, 176, 177], + [0, 150, 151, 178, 179, 171], + [0, 150, 151, 100, 180, 181], + [0, 146, 147, 100, 172, 173, 152, 153, 154, 182, 183, 184, 155, 156, 157, 185, 186, 187], + [0, 158, 159, 101, 188, 189], + [0, 146, 147, 122, 190, 191], + [0, 146, 147, 123, 192, 193], + [0, 146, 147, 126, 194, 195], + [0, 146, 147, 127, 196, 197], + [0, 146, 147, 122, 190, 191, 152, 153, 154, 198, 199, 200, 155, 156, 157, 201, 202, 203], + [0, 158, 159, 123, 204, 205], + [0, 146, 147, 126, 194, 195, 152, 153, 154, 206, 207, 208, 155, 156, 157, 209, 210, 211], + [0, 158, 159, 129, 212, 213], + [0, 146, 147, 101, 170, 171, 1, 160, 161, 123, 192, 193], + [0, 146, 147, 108, 214, 215, 1, 160, 161, 127, 196, 197], + [0, 146, 147, 100, 172, 173, 1, 160, 161, 122, 190, 191], + [0, 146, 147, 109, 216, 217, 1, 160, 161, 126, 194, 195], + [0, 146, 147, 100, 172, 173, 1, 160, 161, 122, 190, 191, 152, 153, 154, 182, 183, 184, 162, 163, 164, 198, 199, 200, 155, 156, 157, 185, 186, 187, 165, 166, 167, 201, 202, 203], + [0, 158, 159, 101, 188, 189, 1, 168, 169, 123, 204, 205], + [0, 146, 147, 109, 216, 217, 1, 160, 161, 126, 194, 195, 152, 153, 154, 218, 219, 220, 162, 163, 164, 206, 207, 208, 155, 156, 157, 221, 222, 223, 165, 166, 167, 209, 210, 211], + [0, 158, 159, 117, 224, 225, 1, 168, 169, 129, 212, 213], + [0, 146, 147, 16, 226, 227], + [0, 148, 149, 18, 228, 229], + [0, 150, 151, 18, 230, 231], + [0, 150, 151, 16, 232, 233], + [0, 148, 149, 16, 234, 235], + [0, 146, 147, 18, 236, 237], + [0, 146, 147, 52, 238, 239], + [0, 146, 147, 16, 226, 227, 1, 160, 161, 52, 238, 239], + [0, 146, 147, 18, 236, 237, 1, 160, 161, 61, 240, 241], + [0, 146, 147, 16, 226, 227, 100, 172, 173, 101, 170, 171], + [0, 148, 149, 18, 228, 229, 242, 172, 181, 243, 214, 244], + [0, 150, 151, 18, 230, 231, 245, 172, 177, 246, 214, 247], + [0, 150, 151, 16, 232, 233, 245, 172, 177, 174, 170, 248], + [0, 148, 149, 16, 234, 235, 242, 172, 181, 178, 170, 249], + [0, 146, 147, 18, 236, 237, 100, 172, 173, 108, 214, 215], + [0, 146, 147, 16, 226, 227, 122, 190, 191, 123, 192, 193], + [0, 146, 147, 16, 226, 227, 126, 194, 195, 127, 196, 197], + [0, 146, 147, 18, 236, 237, 126, 194, 195, 123, 192, 193], + [0, 146, 147, 18, 236, 237, 122, 190, 191, 127, 196, 197], + [0, 146, 147, 52, 238, 239, 122, 190, 191, 101, 170, 171], + [0, 146, 147, 61, 240, 241, 126, 194, 195, 101, 170, 171], + [0, 146, 147, 52, 238, 239, 100, 172, 173, 123, 192, 193], + [0, 146, 147, 61, 240, 241, 100, 172, 173, 127, 196, 197], + [0, 146, 147, 16, 226, 227, 100, 172, 173, 101, 170, 171, 1, 160, 161, 52, 239, 238, 122, 190, 191, 123, 192, 193], + [0, 146, 147, 16, 226, 227, 109, 216, 217, 108, 214, 215, 1, 160, 161, 52, 239, 238, 126, 194, 195, 127, 196, 197], + [0, 146, 147, 18, 236, 237, 109, 216, 217, 101, 170, 171, 1, 160, 161, 61, 241, 240, 126, 194, 195, 123, 192, 193], + [0, 146, 147, 18, 236, 237, 100, 172, 173, 108, 214, 215, 1, 160, 161, 61, 241, 240, 122, 190, 191, 127, 196, 197], + [0, 16, 2, 17, 158, 250, 251, 252, 159, 253, 254, 255], + [0, 16, 2, 17, 158, 250, 251, 252, 159, 253, 254, 255, 23, 24, 13, 25, 256, 257, 258, 259, 260, 261, 262, 263, 26, 20, 27, 28, 264, 265, 266, 267, 268, 269, 270, 271, 4, 22, 5, 19, 272, 273, 274, 275, 276, 277, 278, 279], + [0, 16, 2, 17, 158, 250, 251, 252, 159, 253, 254, 255, 29, 21, 15, 30, 280, 281, 282, 283, 284, 285, 286, 287], + [0, 20, 13, 19, 158, 273, 266, 259, 159, 261, 278, 271], + [0, 20, 13, 19, 158, 273, 266, 259, 159, 261, 278, 271, 29, 31, 32, 33, 280, 288, 289, 290, 284, 291, 292, 293], + [0, 16, 2, 17, 158, 250, 251, 252, 159, 253, 254, 255, 1, 52, 6, 34, 168, 294, 295, 296, 169, 297, 298, 299], + [0, 16, 2, 17, 158, 250, 251, 252, 159, 253, 254, 255, 53, 54, 9, 42, 300, 301, 302, 303, 304, 305, 306, 307], + [0, 16, 2, 17, 158, 250, 251, 252, 159, 253, 254, 255, 1, 52, 6, 34, 168, 294, 295, 296, 169, 297, 298, 299, 23, 24, 13, 25, 256, 257, 258, 259, 260, 261, 262, 263, 64, 62, 14, 39, 308, 309, 310, 311, 312, 313, 314, 315, 26, 20, 27, 28, 264, 265, 266, 267, 268, 269, 270, 271, 65, 59, 40, 38, 316, 317, 318, 319, 320, 321, 322, 323, 4, 22, 5, 19, 272, 273, 274, 275, 276, 277, 278, 279, 11, 55, 8, 41, 324, 325, 326, 327, 328, 329, 330, 331], + [0, 16, 2, 17, 158, 250, 251, 252, 159, 253, 254, 255, 66, 67, 44, 45, 332, 333, 334, 335, 336, 337, 338, 339, 23, 24, 13, 25, 256, 257, 258, 259, 260, 261, 262, 263, 68, 69, 46, 47, 340, 341, 342, 343, 344, 345, 346, 347, 26, 20, 27, 28, 264, 265, 266, 267, 268, 269, 270, 271, 70, 71, 48, 49, 348, 349, 350, 351, 352, 353, 354, 355, 4, 22, 5, 19, 272, 273, 274, 275, 276, 277, 278, 279, 72, 73, 50, 51, 356, 357, 358, 359, 360, 361, 362, 363], + [0, 16, 2, 17, 158, 250, 251, 252, 159, 253, 254, 255, 1, 52, 6, 34, 168, 294, 295, 296, 169, 297, 298, 299, 29, 21, 15, 30, 280, 281, 282, 283, 284, 285, 286, 287, 53, 54, 9, 42, 300, 301, 302, 303, 304, 305, 306, 307], + [0, 20, 13, 19, 158, 273, 266, 259, 159, 261, 278, 271, 1, 59, 14, 41, 168, 325, 318, 311, 169, 313, 330, 323], + [0, 20, 13, 19, 158, 273, 266, 259, 159, 261, 278, 271, 1, 59, 14, 41, 168, 325, 318, 311, 169, 313, 330, 323, 29, 31, 32, 33, 280, 288, 289, 290, 284, 291, 292, 293, 53, 63, 36, 35, 300, 364, 365, 366, 304, 367, 368, 369], + [0, 16, 2, 17, 158, 250, 251, 252, 159, 253, 254, 255, 100, 101, 75, 74, 370, 371, 188, 372, 373, 374, 375, 189], + [0, 16, 2, 17, 158, 250, 251, 252, 159, 253, 254, 255, 116, 117, 83, 82, 376, 377, 224, 378, 379, 380, 381, 225], + [0, 16, 2, 17, 158, 250, 251, 252, 159, 253, 254, 255, 100, 101, 75, 74, 370, 371, 188, 372, 373, 374, 375, 189, 23, 24, 13, 25, 256, 257, 258, 259, 260, 261, 262, 263, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 26, 20, 27, 28, 264, 265, 266, 267, 268, 269, 270, 271, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 4, 22, 5, 19, 272, 273, 274, 275, 276, 277, 278, 279, 138, 139, 95, 94, 406, 407, 408, 409, 410, 411, 412, 413], + [0, 24, 5, 28, 158, 265, 258, 275, 159, 277, 270, 263, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 23, 16, 27, 19, 256, 273, 251, 267, 260, 269, 278, 255, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 26, 22, 13, 17, 264, 250, 274, 259, 268, 261, 254, 279, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 4, 20, 2, 25, 272, 257, 266, 252, 276, 253, 262, 271, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461], + [0, 16, 2, 17, 158, 250, 251, 252, 159, 253, 254, 255, 100, 101, 75, 74, 370, 371, 188, 372, 373, 374, 375, 189, 29, 21, 15, 30, 280, 281, 282, 283, 284, 285, 286, 287, 116, 117, 83, 82, 376, 377, 224, 378, 379, 380, 381, 225], + [0, 20, 13, 19, 158, 273, 266, 259, 159, 261, 278, 271, 450, 415, 440, 429, 454, 431, 420, 445, 458, 447, 436, 425], + [0, 20, 13, 19, 158, 273, 266, 259, 159, 261, 278, 271, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473], + [0, 20, 13, 19, 158, 273, 266, 259, 159, 261, 278, 271, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 29, 31, 32, 33, 280, 288, 289, 290, 284, 291, 292, 293, 450, 415, 440, 429, 454, 431, 420, 445, 458, 447, 436, 425], + [0, 16, 2, 17, 158, 250, 251, 252, 159, 253, 254, 255, 123, 122, 88, 89, 204, 474, 475, 476, 205, 477, 478, 479], + [0, 16, 2, 17, 158, 250, 251, 252, 159, 253, 254, 255, 123, 122, 88, 89, 204, 474, 475, 476, 205, 477, 478, 479, 23, 24, 13, 25, 256, 257, 258, 259, 260, 261, 262, 263, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 26, 20, 27, 28, 264, 265, 266, 267, 268, 269, 270, 271, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 4, 22, 5, 19, 272, 273, 274, 275, 276, 277, 278, 279, 125, 124, 140, 141, 504, 505, 506, 507, 508, 509, 510, 511], + [0, 16, 2, 17, 158, 250, 251, 252, 159, 253, 254, 255, 123, 122, 88, 89, 204, 474, 475, 476, 205, 477, 478, 479, 29, 21, 15, 30, 280, 281, 282, 283, 284, 285, 286, 287, 129, 128, 90, 91, 212, 512, 513, 514, 213, 515, 516, 517], + [0, 16, 2, 17, 158, 250, 251, 252, 159, 253, 254, 255, 129, 128, 90, 91, 212, 512, 513, 514, 213, 515, 516, 517], + [0, 16, 2, 17, 158, 250, 251, 252, 159, 253, 254, 255, 129, 128, 90, 91, 212, 512, 513, 514, 213, 515, 516, 517, 23, 24, 13, 25, 256, 257, 258, 259, 260, 261, 262, 263, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 26, 20, 27, 28, 264, 265, 266, 267, 268, 269, 270, 271, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 4, 22, 5, 19, 272, 273, 274, 275, 276, 277, 278, 279, 127, 126, 92, 93, 542, 543, 544, 545, 546, 547, 548, 549], + [0, 20, 13, 19, 158, 273, 266, 259, 159, 261, 278, 271, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 29, 31, 32, 33, 280, 288, 289, 290, 284, 291, 292, 293, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573], + [0, 16, 2, 17, 158, 250, 251, 252, 159, 253, 254, 255, 100, 101, 75, 74, 370, 371, 188, 372, 373, 374, 375, 189, 1, 52, 6, 34, 168, 294, 295, 296, 169, 297, 298, 299, 122, 123, 89, 88, 475, 476, 204, 474, 479, 478, 477, 205], + [0, 16, 2, 17, 158, 250, 251, 252, 159, 253, 254, 255, 100, 101, 75, 74, 370, 371, 188, 372, 373, 374, 375, 189, 53, 54, 9, 42, 300, 301, 302, 303, 304, 305, 306, 307, 128, 129, 91, 90, 513, 514, 212, 512, 517, 516, 515, 213], + [0, 16, 2, 17, 158, 250, 251, 252, 159, 253, 254, 255, 116, 117, 83, 82, 376, 377, 224, 378, 379, 380, 381, 225, 1, 52, 6, 34, 168, 294, 295, 296, 169, 297, 298, 299, 128, 129, 91, 90, 513, 514, 212, 512, 517, 516, 515, 213], + [0, 16, 2, 17, 158, 250, 251, 252, 159, 253, 254, 255, 116, 117, 83, 82, 376, 377, 224, 378, 379, 380, 381, 225, 53, 54, 9, 42, 300, 301, 302, 303, 304, 305, 306, 307, 122, 123, 89, 88, 475, 476, 204, 474, 479, 478, 477, 205], + [0, 16, 2, 17, 158, 250, 251, 252, 159, 253, 254, 255, 100, 101, 75, 74, 370, 371, 188, 372, 373, 374, 375, 189, 1, 52, 6, 34, 168, 294, 295, 296, 169, 297, 298, 299, 122, 123, 89, 88, 475, 476, 204, 474, 479, 478, 477, 205, 23, 24, 13, 25, 256, 257, 258, 259, 260, 261, 262, 263, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 64, 62, 14, 39, 308, 309, 310, 311, 312, 313, 314, 315, 481, 480, 483, 482, 486, 487, 484, 485, 491, 490, 489, 488, 26, 20, 27, 28, 264, 265, 266, 267, 268, 269, 270, 271, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 65, 59, 40, 38, 316, 317, 318, 319, 320, 321, 322, 323, 493, 492, 495, 494, 498, 499, 496, 497, 503, 502, 501, 500, 4, 22, 5, 19, 272, 273, 274, 275, 276, 277, 278, 279, 138, 139, 95, 94, 406, 407, 408, 409, 410, 411, 412, 413, 11, 55, 8, 41, 324, 325, 326, 327, 328, 329, 330, 331, 124, 125, 141, 140, 506, 507, 504, 505, 511, 510, 509, 508], + [0, 16, 2, 17, 158, 250, 251, 252, 159, 253, 254, 255, 116, 117, 83, 82, 376, 377, 224, 378, 379, 380, 381, 225, 1, 52, 6, 34, 168, 294, 295, 296, 169, 297, 298, 299, 128, 129, 91, 90, 513, 514, 212, 512, 517, 516, 515, 213, 23, 24, 13, 25, 256, 257, 258, 259, 260, 261, 262, 263, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 64, 62, 14, 39, 308, 309, 310, 311, 312, 313, 314, 315, 519, 518, 521, 520, 524, 525, 522, 523, 529, 528, 527, 526, 26, 20, 27, 28, 264, 265, 266, 267, 268, 269, 270, 271, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 65, 59, 40, 38, 316, 317, 318, 319, 320, 321, 322, 323, 531, 530, 533, 532, 536, 537, 534, 535, 541, 540, 539, 538, 4, 22, 5, 19, 272, 273, 274, 275, 276, 277, 278, 279, 109, 108, 79, 78, 598, 599, 600, 601, 602, 603, 604, 605, 11, 55, 8, 41, 324, 325, 326, 327, 328, 329, 330, 331, 126, 127, 93, 92, 544, 545, 542, 543, 549, 548, 547, 546], + [0, 24, 5, 28, 158, 265, 258, 275, 159, 277, 270, 263, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 66, 69, 50, 49, 332, 349, 342, 359, 336, 361, 354, 347, 493, 123, 483, 140, 498, 507, 204, 485, 503, 490, 509, 205, 23, 16, 27, 19, 256, 273, 251, 267, 260, 269, 278, 255, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 68, 67, 48, 51, 340, 357, 334, 351, 344, 353, 362, 339, 124, 480, 89, 494, 506, 499, 484, 474, 511, 478, 501, 488, 26, 22, 13, 17, 264, 250, 274, 259, 268, 261, 254, 279, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 70, 73, 46, 45, 348, 333, 358, 343, 352, 345, 338, 363, 122, 492, 141, 482, 475, 487, 496, 505, 479, 510, 489, 500, 4, 20, 2, 25, 272, 257, 266, 252, 276, 253, 262, 271, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 72, 71, 44, 47, 356, 341, 350, 335, 360, 337, 346, 355, 481, 125, 495, 88, 486, 476, 504, 497, 491, 502, 477, 508], + [0, 24, 5, 28, 158, 265, 258, 275, 159, 277, 270, 263, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 531, 129, 521, 92, 536, 545, 212, 523, 541, 528, 547, 213, 23, 16, 27, 19, 256, 273, 251, 267, 260, 269, 278, 255, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 126, 518, 91, 532, 544, 537, 522, 512, 549, 516, 539, 526, 26, 22, 13, 17, 264, 250, 274, 259, 268, 261, 254, 279, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 128, 530, 93, 520, 513, 525, 534, 543, 517, 548, 527, 538, 4, 20, 2, 25, 272, 257, 266, 252, 276, 253, 262, 271, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 519, 127, 533, 90, 524, 514, 542, 535, 529, 540, 515, 546], + [0, 16, 2, 17, 158, 250, 251, 252, 159, 253, 254, 255, 100, 101, 75, 74, 370, 371, 188, 372, 373, 374, 375, 189, 1, 52, 6, 34, 168, 294, 295, 296, 169, 297, 298, 299, 122, 123, 89, 88, 475, 476, 204, 474, 479, 478, 477, 205, 29, 21, 15, 30, 280, 281, 282, 283, 284, 285, 286, 287, 116, 117, 83, 82, 376, 377, 224, 378, 379, 380, 381, 225, 53, 54, 9, 42, 300, 301, 302, 303, 304, 305, 306, 307, 128, 129, 91, 90, 513, 514, 212, 512, 517, 516, 515, 213], + [0, 20, 13, 19, 158, 273, 266, 259, 159, 261, 278, 271, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 1, 59, 14, 41, 168, 325, 318, 311, 169, 313, 330, 323, 551, 550, 553, 552, 556, 557, 554, 555, 561, 560, 559, 558, 29, 31, 32, 33, 280, 288, 289, 290, 284, 291, 292, 293, 450, 415, 440, 429, 454, 431, 420, 445, 458, 447, 436, 425, 53, 63, 36, 35, 300, 364, 365, 366, 304, 367, 368, 369, 563, 562, 565, 564, 568, 569, 566, 567, 573, 572, 571, 570], + [0, 16], + [0, 18], + [0, 16, 26, 20], + [0, 2, 23, 13], + [0, 3, 4, 32], + [0, 2, 29, 15], + [0, 3, 29, 27], + [0, 52], + [0, 63], + [0, 52, 26, 59], + [0, 63, 26, 54], + [0, 52, 16, 1], + [0, 18, 1, 61], + [0, 52, 16, 1, 26, 59, 20, 65], + [0, 31, 1, 63], + [0, 1, 24, 62], + [0, 31, 1, 63, 26, 21, 65, 54], + [0, 2, 57, 56], + [0, 60, 3, 16], + [0, 22, 57, 3], + [0, 2, 28, 20], + [0, 17, 13, 24], + [0, 20, 19, 13, 4, 24, 17, 27], + [0, 22, 57, 3, 4, 16, 60, 32], + [0, 22, 57, 3, 23, 20, 30, 12, 26, 24, 33, 15, 4, 16, 60, 32], + [0, 22, 57, 3, 29, 18, 27, 25], + [0, 22, 3, 57, 1, 55, 10, 37], + [0, 22, 385, 396, 3, 57, 109, 117], + [0, 22, 57, 3, 159, 279, 654, 655, 158, 274, 656, 657, 29, 18, 25, 27, 284, 658, 262, 269, 280, 659, 257, 267], +]; + +export const SpacegroupNumbers = { + 'P 1': 0, + 'P -1': 1, + 'P 1 2 1': 2, + 'P 1 21 1': 3, + 'C 1 2 1': 4, + 'P 1 m 1': 5, + 'P 1 c 1': 6, + 'C 1 m 1': 7, + 'C 1 c 1': 8, + 'P 1 2/m 1': 9, + 'P 1 21/m 1': 10, + 'C 1 2/m 1': 11, + 'P 1 2/c 1': 12, + 'P 1 21/c 1': 13, + 'C 1 2/c 1': 14, + 'P 2 2 2': 15, + 'P 2 2 21': 16, + 'P 21 21 2': 17, + 'P 21 21 21': 18, + 'C 2 2 21': 19, + 'C 2 2 2': 20, + 'F 2 2 2': 21, + 'I 2 2 2': 22, + 'I 21 21 21': 23, + 'P m m 2': 24, + 'P m c 21': 25, + 'P c c 2': 26, + 'P m a 2': 27, + 'P c a 21': 28, + 'P n c 2': 29, + 'P m n 21': 30, + 'P b a 2': 31, + 'P n a 21': 32, + 'P n n 2': 33, + 'C m m 2': 34, + 'C m c 21': 35, + 'C c c 2': 36, + 'A m m 2': 37, + 'A b m 2': 38, + 'A m a 2': 39, + 'A b a 2': 40, + 'F m m 2': 41, + 'F d d 2': 42, + 'I m m 2': 43, + 'I b a 2': 44, + 'I m a 2': 45, + 'P 2/m 2/m 2/m': 46, + 'P m m m': 46, + 'P 2/n 2/n 2/n': 47, + 'P n n n': 47, + 'P 2/c 2/c 2/m': 48, + 'P c c m': 48, + 'P 2/b 2/a 2/n': 49, + 'P b a n': 49, + 'P 21/m 2/m 2/a': 50, + 'P m m a': 50, + 'P 2/n 21/n 2/a': 51, + 'P n n a': 51, + 'P 2/m 2/n 21/a': 52, + 'P m n a': 52, + 'P 21/c 2/c 2/a': 53, + 'P c c a': 53, + 'P 21/b 21/a 2/m': 54, + 'P b a m': 54, + 'P 21/c 21/c 2/n': 55, + 'P c c n': 55, + 'P 2/b 21/c 21/m': 56, + 'P b c m': 56, + 'P 21/n 21/n 2/m': 57, + 'P n n m': 57, + 'P 21/m 21/m 2/n': 58, + 'P m m n': 58, + 'P 21/b 2/c 21/n': 59, + 'P b c n': 59, + 'P 21/b 21/c 21/a': 60, + 'P b c a': 60, + 'P 21/n 21/m 21/a': 61, + 'P n m a': 61, + 'C 2/m 2/c 21/m': 62, + 'C m c m': 62, + 'C 2/m 2/c 21/a': 63, + 'C m c a': 63, + 'C 2/m 2/m 2/m': 64, + 'C m m m': 64, + 'C 2/c 2/c 2/m': 65, + 'C c c m': 65, + 'C 2/m 2/m 2/a': 66, + 'C m m a': 66, + 'C 2/c 2/c 2/a': 67, + 'C c c a': 67, + 'F 2/m 2/m 2/m': 68, + 'F m m m': 68, + 'F 2/d 2/d 2/d': 69, + 'F d d d': 69, + 'I 2/m 2/m 2/m': 70, + 'I m m m': 70, + 'I 2/b 2/a 2/m': 71, + 'I b a m': 71, + 'I 21/b 21/c 21/a': 72, + 'I b c a': 72, + 'I 21/m 21/m 21/a': 73, + 'I m m a': 73, + 'P 4': 74, + 'P 41': 75, + 'P 42': 76, + 'P 43': 77, + 'I 4': 78, + 'I 41': 79, + 'P -4': 80, + 'I -4': 81, + 'P 4/m': 82, + 'P 42/m': 83, + 'P 4/n': 84, + 'P 42/n': 85, + 'I 4/m': 86, + 'I 41/a': 87, + 'P 4 2 2': 88, + 'P 4 21 2': 89, + 'P 41 2 2': 90, + 'P 41 21 2': 91, + 'P 42 2 2': 92, + 'P 42 21 2': 93, + 'P 43 2 2': 94, + 'P 43 21 2': 95, + 'I 4 2 2': 96, + 'I 41 2 2': 97, + 'P 4 m m': 98, + 'P 4 b m': 99, + 'P 42 c m': 100, + 'P 42 n m': 101, + 'P 4 c c': 102, + 'P 4 n c': 103, + 'P 42 m c': 104, + 'P 42 b c': 105, + 'I 4 m m': 106, + 'I 4 c m': 107, + 'I 41 m d': 108, + 'I 41 c d': 109, + 'P -4 2 m': 110, + 'P -4 2 c': 111, + 'P -4 21 m': 112, + 'P -4 21 c': 113, + 'P -4 m 2': 114, + 'P -4 c 2': 115, + 'P -4 b 2': 116, + 'P -4 n 2': 117, + 'I -4 m 2': 118, + 'I -4 c 2': 119, + 'I -4 2 m': 120, + 'I -4 2 d': 121, + 'P 4/m 2/m 2/m': 122, + 'P4/m m m': 122, + 'P 4/m 2/c 2/c': 123, + 'P4/m c c': 123, + 'P 4/n 2/b 2/m': 124, + 'P4/n b m': 124, + 'P 4/n 2/n 2/c': 125, + 'P4/n n c': 125, + 'P 4/m 21/b 2/m': 126, + 'P4/m b m': 126, + 'P 4/m 21/n 2/c': 127, + 'P4/m n c': 127, + 'P 4/n 21/m 2/m': 128, + 'P4/n m m': 128, + 'P 4/n 2/c 2/c': 129, + 'P4/n c c': 129, + 'P 42/m 2/m 2/c': 130, + 'P42/m m c': 130, + 'P 42/m 2/c 2/m': 131, + 'P42/m c m': 131, + 'P 42/n 2/b 2/c': 132, + 'P42/n b c': 132, + 'P 42/n 2/n 2/m': 133, + 'P42/n n m': 133, + 'P 42/m 21/b 2/c': 134, + 'P42/m b c': 134, + 'P 42/m 21/n 2/m': 135, + 'P42/m n m': 135, + 'P 42/n 21/m 2/c': 136, + 'P42/n m c': 136, + 'P 42/n 21/c 2/m': 137, + 'P42/n c m': 137, + 'I 4/m 2/m 2/m': 138, + 'I4/m m m': 138, + 'I 4/m 2/c 2/m': 139, + 'I4/m c m': 139, + 'I 41/a 2/m 2/d': 140, + 'I41/a m d': 140, + 'I 41/a 2/c 2/d': 141, + 'I41/a c d': 141, + 'P 3': 142, + 'P 31': 143, + 'P 32': 144, + 'H 3': 145, + 'R 3': 146, + 'P -3': 147, + 'H -3': 148, + 'R -3': 149, + 'P 3 1 2': 150, + 'P 3 2 1': 151, + 'P 31 1 2': 152, + 'P 31 2 1': 153, + 'P 32 1 2': 154, + 'P 32 2 1': 155, + 'H 3 2': 156, + 'R 3 2': 157, + 'P 3 m 1': 158, + 'P 3 1 m': 159, + 'P 3 c 1': 160, + 'P 3 1 c': 161, + 'H 3 m': 162, + 'R 3 m': 163, + 'H 3 c': 164, + 'R 3 c': 165, + 'P -3 1 2/m': 166, + 'P -3 1 m': 166, + 'P -3 1 2/c': 167, + 'P -3 1 c': 167, + 'P -3 2/m 1': 168, + 'P -3 m 1': 168, + 'P -3 2/c 1': 169, + 'P -3 c 1': 169, + 'H -3 2/m': 170, + 'H -3 m': 170, + 'R -3 2/m': 171, + 'R -3 m': 171, + 'H -3 2/c': 172, + 'H -3 c': 172, + 'R -3 2/c': 173, + 'R -3 c': 173, + 'P 6': 174, + 'P 61': 175, + 'P 65': 176, + 'P 62': 177, + 'P 64': 178, + 'P 63': 179, + 'P -6': 180, + 'P 6/m': 181, + 'P 63/m': 182, + 'P 6 2 2': 183, + 'P 61 2 2': 184, + 'P 65 2 2': 185, + 'P 62 2 2': 186, + 'P 64 2 2': 187, + 'P 63 2 2': 188, + 'P 6 m m': 189, + 'P 6 c c': 190, + 'P 63 c m': 191, + 'P 63 m c': 192, + 'P -6 m 2': 193, + 'P -6 c 2': 194, + 'P -6 2 m': 195, + 'P -6 2 c': 196, + 'P 6/m 2/m 2/m': 197, + 'P 6/m m m': 197, + 'P 6/m 2/c 2/c': 198, + 'P 6/m c c': 198, + 'P 63/m 2/c 2/m': 199, + 'P 63/m c m': 199, + 'P 63/m 2/m 2/c': 200, + 'P 63/m m c': 200, + 'P 2 3': 201, + 'F 2 3': 202, + 'I 2 3': 203, + 'P 21 3': 204, + 'I 21 3': 205, + 'P 2/m -3': 206, + 'P m -3': 206, + 'P 2/n -3': 207, + 'P n -3': 207, + 'F 2/m -3': 208, + 'F m -3': 208, + 'F 2/d -3': 209, + 'F d -3': 209, + 'I 2/m -3': 210, + 'I m -3': 210, + 'P 21/a -3': 211, + 'P a -3': 211, + 'I 21/a -3': 212, + 'I a -3': 212, + 'P 4 3 2': 213, + 'P 42 3 2': 214, + 'F 4 3 2': 215, + 'F 41 3 2': 216, + 'I 4 3 2': 217, + 'P 43 3 2': 218, + 'P 41 3 2': 219, + 'I 41 3 2': 220, + 'P -4 3 m': 221, + 'F -4 3 m': 222, + 'I -4 3 m': 223, + 'P -4 3 n': 224, + 'F -4 3 c': 225, + 'I -4 3 d': 226, + 'P 4/m -3 2/m': 227, + 'P m -3 m': 227, + 'P 4/n -3 2/n': 228, + 'P n -3 n': 228, + 'P 42/m -3 2/n': 229, + 'P m -3 n': 229, + 'P 42/n -3 2/m': 230, + 'P n -3 m': 230, + 'F 4/m -3 2/m': 231, + 'F m -3 m': 231, + 'F 4/m -3 2/c': 232, + 'F m -3 c': 232, + 'F 41/d -3 2/m': 233, + 'F d -3 m': 233, + 'F 41/d -3 2/c': 234, + 'F d -3 c': 234, + 'I 4/m -3 2/m': 235, + 'I m -3 m': 235, + 'I 41/a -3 2/d': 236, + 'I a -3 d': 236, + 'P 1 1 2': 237, + 'P 1 1 21': 238, + 'B 1 1 2': 239, + 'B 2': 239, + 'A 1 2 1': 240, + 'C 1 21 1': 241, + 'I 1 2 1': 242, + 'I 2': 242, + 'I 1 21 1': 243, + 'P 1 1 m': 244, + 'P 1 1 b': 245, + 'B 1 1 m': 246, + 'B 1 1 b': 247, + 'P 1 1 2/m': 248, + 'P 1 1 21/m': 249, + 'B 1 1 2/m': 250, + 'P 1 1 2/b': 251, + 'P 1 1 21/b': 252, + 'B 1 1 2/b': 253, + 'P 21 2 2': 254, + 'P 2 21 2': 255, + 'P 21 21 2 (a)': 256, + 'P 21 2 21': 257, + 'P 2 21 21': 258, + 'C 2 2 21a)': 259, + 'C 2 2 2a': 260, + 'F 2 2 2a': 261, + 'I 2 2 2a': 262, + 'P 21/m 21/m 2/n a': 263, + 'P 42 21 2a': 264, + 'I 2 3a': 265, +}; + +export type SpacegroupName = keyof typeof SpacegroupNumbers + +export const SpacegroupNames: { [num: number]: SpacegroupName } = (function () { + const names = Object.create(null); + for (const n of Object.keys(SpacegroupNumbers)) { + names[(SpacegroupNumbers as any)[n]] = n; + } + return names; +}()); \ No newline at end of file diff --git a/src/mol-math/geometry/sphere.ts b/src/mol-math/geometry/sphere.ts deleted file mode 100644 index 0b81ae4c5ea821f16a2f1721524da58d808778a8..0000000000000000000000000000000000000000 --- a/src/mol-math/geometry/sphere.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info. - * - * @author Alexander Rose <alexander.rose@weirdbyte.de> - */ - -import { Vec3 } from '../linear-algebra' - -export interface Sphere { - center: Vec3 - radius: number -} - -export namespace Sphere { - export function create(center: Vec3, radius: number): Sphere { - return { center, radius } - } -} - -export default Sphere \ No newline at end of file