Skip to content
Snippets Groups Projects
Commit 347c1986 authored by Alexander Rose's avatar Alexander Rose
Browse files

require output object for Tensor.to* methods

parent eac4a898
No related branches found
No related tags found
No related merge requests found
......@@ -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) {
......
......@@ -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);
......
......@@ -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 {
......
......@@ -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);
......
......@@ -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)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment