Преглед на файлове

require output object for Tensor.to* methods

Alexander Rose преди 5 години
родител
ревизия
347c1986df

+ 12 - 16
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) {

+ 3 - 3
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);

+ 1 - 1
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 {

+ 3 - 3
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);

+ 3 - 3
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)