diff --git a/src/mol-math/linear-algebra/tensor.ts b/src/mol-math/linear-algebra/tensor.ts index 3dccac7e1413476a68194042620dde4affaf387e..68a17214169ea387b449f1c7f69cc1c3820bb9f6 100644 --- a/src/mol-math/linear-algebra/tensor.ts +++ b/src/mol-math/linear-algebra/tensor.ts @@ -56,40 +56,36 @@ export namespace Tensor { export function ColumnMajorMatrix(rows: number, cols: number, ctor?: ArrayCtor) { return Space([rows, cols], [1, 0], ctor); } export function RowMajorMatrix(rows: number, cols: number, ctor?: ArrayCtor) { return Space([rows, cols], [0, 1], ctor); } - export function toMat4(space: Space, data: Tensor.Data): Mat4 { + export function toMat4(out: Mat4, space: Space, data: Tensor.Data): Mat4 { if (space.rank !== 2) throw new Error('Invalid tensor rank'); - const mat = Mat4.zero(); const d0 = Math.min(4, space.dimensions[0]), d1 = Math.min(4, space.dimensions[1]); for (let i = 0; i < d0; i++) { - for (let j = 0; j < d1; j++) Mat4.setValue(mat, i, j, space.get(data, i, j)); + for (let j = 0; j < d1; j++) Mat4.setValue(out, i, j, space.get(data, i, j)); } - return mat; + return out; } - export function toMat3(space: Space, data: Tensor.Data): Mat3 { + export function toMat3(out: Mat3, space: Space, data: Tensor.Data): Mat3 { if (space.rank !== 2) throw new Error('Invalid tensor rank'); - const mat = Mat3.zero(); const d0 = Math.min(3, space.dimensions[0]), d1 = Math.min(3, space.dimensions[1]); for (let i = 0; i < d0; i++) { - for (let j = 0; j < d1; j++) Mat3.setValue(mat, i, j, space.get(data, i, j)); + for (let j = 0; j < d1; j++) Mat3.setValue(out, i, j, space.get(data, i, j)); } - return mat; + return out; } - export function toVec3(space: Space, data: Tensor.Data): Vec3 { + export function toVec3(out: Vec3, space: Space, data: Tensor.Data): Vec3 { if (space.rank !== 1) throw new Error('Invalid tensor rank'); - const vec = Vec3.zero(); const d0 = Math.min(3, space.dimensions[0]); - for (let i = 0; i < d0; i++) vec[i] = data[i]; - return vec; + for (let i = 0; i < d0; i++) out[i] = data[i]; + return out; } - export function toVec4(space: Space, data: Tensor.Data): Vec4 { + export function toVec4(out: Vec4, space: Space, data: Tensor.Data): Vec4 { if (space.rank !== 1) throw new Error('Invalid tensor rank'); - const vec = Vec4.zero(); const d0 = Math.min(4, space.dimensions[0]); - for (let i = 0; i < d0; i++) vec[i] = data[i]; - return vec; + for (let i = 0; i < d0; i++) out[i] = data[i]; + return out; } export function areEqualExact(a: Tensor.Data, b: Tensor.Data) { diff --git a/src/mol-model-formats/structure/mmcif/assembly.ts b/src/mol-model-formats/structure/mmcif/assembly.ts index aed735ed8ca69ce9e4e19b0053d76950420e5906..e47c81d43bc9abe482ee9530f553ba8b5ffeeb10 100644 --- a/src/mol-model-formats/structure/mmcif/assembly.ts +++ b/src/mol-model-formats/structure/mmcif/assembly.ts @@ -4,7 +4,7 @@ * @author David Sehnal <david.sehnal@gmail.com> */ -import { Mat4, Tensor } from '../../../mol-math/linear-algebra' +import { Mat4, Tensor, Vec3 } from '../../../mol-math/linear-algebra' import { SymmetryOperator } from '../../../mol-math/geometry/symmetry-operator' import { Assembly, OperatorGroup, OperatorGroups } from '../../../mol-model/structure/model/properties/symmetry' import { Queries as Q } from '../../../mol-model/structure' @@ -76,8 +76,8 @@ function getMatrices({ data }: mmCIF_Format): Matrices { const matrices = new Map<string, Mat4>(); for (let i = 0, _i = pdbx_struct_oper_list._rowCount; i < _i; i++) { - const m = Tensor.toMat4(_schema.matrix.space, matrix.value(i)); - const t = Tensor.toVec3(_schema.vector.space, vector.value(i)); + const m = Tensor.toMat4(Mat4(), _schema.matrix.space, matrix.value(i)); + const t = Tensor.toVec3(Vec3(), _schema.vector.space, vector.value(i)); Mat4.setTranslation(m, t); Mat4.setValue(m, 3, 3, 1); matrices.set(id.value(i), m); diff --git a/src/mol-model-formats/structure/mmcif/ihm.ts b/src/mol-model-formats/structure/mmcif/ihm.ts index 98ce31c6750cbb2467b4467cf649166ebcb04f62..7ce1eb9fd8b03eb2f6709a9cafc8297951c64a26 100644 --- a/src/mol-model-formats/structure/mmcif/ihm.ts +++ b/src/mol-model-formats/structure/mmcif/ihm.ts @@ -74,7 +74,7 @@ function getGaussianConformation(data: mmCIF['ihm_gaussian_obj_site']): CoarseGa const { covariance_matrix: cm } = data; for (let i = 0, _i = cm.rowCount; i < _i; i++) { - covariance_matrix[i] = Tensor.toMat3(matrix_space, cm.value(i)); + covariance_matrix[i] = Tensor.toMat3(Mat3(), matrix_space, cm.value(i)); } return { diff --git a/src/mol-model-formats/structure/mmcif/parser.ts b/src/mol-model-formats/structure/mmcif/parser.ts index 2ec01ddd4cc1403460242424c413226fdc476851..e0945621e6789f60b8f53ee136e3761d6154ec11 100644 --- a/src/mol-model-formats/structure/mmcif/parser.ts +++ b/src/mol-model-formats/structure/mmcif/parser.ts @@ -8,7 +8,7 @@ import { Column, Table } from '../../../mol-data/db'; import { mmCIF_Database, mmCIF_Schema } from '../../../mol-io/reader/cif/schema/mmcif'; import { Spacegroup, SpacegroupCell, SymmetryOperator } from '../../../mol-math/geometry'; -import { Tensor, Vec3 } from '../../../mol-math/linear-algebra'; +import { Tensor, Vec3, Mat3 } from '../../../mol-math/linear-algebra'; import { RuntimeContext } from '../../../mol-task'; import UUID from '../../../mol-util/uuid'; import { Model } from '../../../mol-model/structure/model/model'; @@ -72,8 +72,8 @@ function getNcsOperators(format: mmCIF_Format) { const opers: SymmetryOperator[] = []; for (let i = 0; i < struct_ncs_oper._rowCount; i++) { - const m = Tensor.toMat3(matrixSpace, matrix.value(i)); - const v = Tensor.toVec3(vectorSpace, vector.value(i)); + const m = Tensor.toMat3(Mat3(), matrixSpace, matrix.value(i)); + const v = Tensor.toVec3(Vec3(), vectorSpace, vector.value(i)); if (!SymmetryOperator.checkIfRotationAndTranslation(m, v)) continue; const ncsId = id.value(i) opers[opers.length] = SymmetryOperator.ofRotationAndOffset(`ncs_${ncsId}`, m, v, ncsId); diff --git a/src/mol-model-props/rcsb/representations/assembly-symmetry-axes.ts b/src/mol-model-props/rcsb/representations/assembly-symmetry-axes.ts index 9cfdd869e13cf2bf3ee7617f9fda80910fb22e8a..7c215a05e8a51859e508fd0d567a9cd2926f1845 100644 --- a/src/mol-model-props/rcsb/representations/assembly-symmetry-axes.ts +++ b/src/mol-model-props/rcsb/representations/assembly-symmetry-axes.ts @@ -13,7 +13,7 @@ import { StructureRepresentationProvider, StructureRepresentation, ComplexRepres import { AssemblySymmetry } from '../assembly-symmetry'; import { Table } from '../../../mol-data/db'; import { MeshBuilder } from '../../../mol-geo/geometry/mesh/mesh-builder'; -import { Tensor } from '../../../mol-math/linear-algebra'; +import { Tensor, Vec3 } from '../../../mol-math/linear-algebra'; import { addSphere } from '../../../mol-geo/geometry/mesh/builder/sphere'; import { addCylinder } from '../../../mol-geo/geometry/mesh/builder/cylinder'; import { VisualUpdateState } from '../../../mol-repr/util'; @@ -127,8 +127,8 @@ export function createAssemblySymmetryAxesMesh(ctx: VisualContext, structure: St for (let i = 0, il = axes._rowCount; i < il; ++i) { if (axes.symmetry_id.value(i) !== symmetryId) continue - const start = Tensor.toVec3(vectorSpace, axes.start.value(i)) - const end = Tensor.toVec3(vectorSpace, axes.end.value(i)) + const start = Tensor.toVec3(Vec3(), vectorSpace, axes.start.value(i)) + const end = Tensor.toVec3(Vec3(), vectorSpace, axes.end.value(i)) builderState.currentGroup = i addSphere(builderState, start, radius, 2) addSphere(builderState, end, radius, 2)