UNPKG

molstar

Version:

A comprehensive macromolecular library.

194 lines 9.14 kB
"use strict"; /** * Copyright (c) 2019-2020 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> */ Object.defineProperty(exports, "__esModule", { value: true }); exports.FeaturesBuilder = exports.Features = void 0; var tslib_1 = require("tslib"); var util_1 = require("../../../mol-data/util"); var geometry_1 = require("../../../mol-math/geometry"); var int_1 = require("../../../mol-data/int"); var valence_model_1 = require("../valence-model"); var linear_algebra_1 = require("../../../mol-math/linear-algebra"); var boundary_1 = require("../../../mol-math/geometry/boundary"); var Features; (function (Features) { function setPosition(out, unit, index, features) { linear_algebra_1.Vec3.set(out, features.x[index], features.y[index], features.z[index]); linear_algebra_1.Vec3.transformMat4(out, out, unit.conformation.operator.matrix); return out; } Features.setPosition = setPosition; function createElementsIndex(data, elementsCount) { var offsets = new Int32Array(elementsCount + 1); var bucketFill = new Int32Array(elementsCount); var bucketSizes = new Int32Array(elementsCount); var members = data.members, count = data.count, featureOffsets = data.offsets; for (var i = 0, il = featureOffsets[count]; i < il; ++i) ++bucketSizes[members[i]]; var offset = 0; for (var i = 0; i < elementsCount; i++) { offsets[i] = offset; offset += bucketSizes[i]; } offsets[elementsCount] = offset; var indices = new Int32Array(offset); for (var i = 0; i < count; ++i) { for (var j = featureOffsets[i], jl = featureOffsets[i + 1]; j < jl; ++j) { var a = members[j]; var oa = offsets[a] + bucketFill[a]; indices[oa] = i; ++bucketFill[a]; } } return { indices: indices, offsets: offsets }; } Features.createElementsIndex = createElementsIndex; function create(elementsCount, data) { var lookup3d; var elementsIndex; return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, data), { get lookup3d() { if (!lookup3d) { var position_1 = { x: data.x, y: data.y, z: data.z, indices: int_1.OrderedSet.ofBounds(0, data.count) }; lookup3d = (0, geometry_1.GridLookup3D)(position_1, (0, boundary_1.getBoundary)(position_1)); } return lookup3d; }, get elementsIndex() { return elementsIndex || (elementsIndex = createElementsIndex(data, elementsCount)); }, subset: function (types) { return createSubset(data, types); } }); } Features.create = create; function createSubset(data, types) { var lookup3d; var count = data.count, _types = data.types; var _indices = []; for (var i = 0; i < count; ++i) { if (types.has(_types[i])) _indices.push(i); } var indices = int_1.SortedArray.ofSortedArray(_indices); return { indices: indices, get lookup3d() { if (!lookup3d) { var position_2 = { x: data.x, y: data.y, z: data.z, indices: indices }; lookup3d = (0, geometry_1.GridLookup3D)(position_2, (0, boundary_1.getBoundary)(position_2)); } return lookup3d; } }; } Features.createSubset = createSubset; function Info(structure, unit, features) { var valenceModel = valence_model_1.ValenceModelProvider.get(structure).value; if (!valenceModel || !valenceModel.has(unit.id)) throw new Error('valence model required'); return { unit: unit, types: features.types, feature: -1, x: features.x, y: features.y, z: features.z, members: features.members, offsets: features.offsets, idealGeometry: valenceModel.get(unit.id).idealGeometry }; } Features.Info = Info; function position(out, info) { linear_algebra_1.Vec3.set(out, info.x[info.feature], info.y[info.feature], info.z[info.feature]); linear_algebra_1.Vec3.transformMat4(out, out, info.unit.conformation.operator.matrix); return out; } Features.position = position; var tmpVecA = (0, linear_algebra_1.Vec3)(); var tmpVecB = (0, linear_algebra_1.Vec3)(); function distance(infoA, infoB) { var elementA = infoA.members[infoA.offsets[infoA.feature]]; var elementB = infoB.members[infoB.offsets[infoB.feature]]; infoA.unit.conformation.position(infoA.unit.elements[elementA], tmpVecA); infoB.unit.conformation.position(infoB.unit.elements[elementB], tmpVecB); return linear_algebra_1.Vec3.distance(tmpVecA, tmpVecB); } Features.distance = distance; function Provider(types, add) { return { types: new Set(types), add: add }; } Features.Provider = Provider; })(Features || (Features = {})); exports.Features = Features; var FeaturesBuilder; (function (FeaturesBuilder) { function create(initialCount, chunkSize, features) { if (initialCount === void 0) { initialCount = 2048; } if (chunkSize === void 0) { chunkSize = 1024; } var xCenters = util_1.ChunkedArray.create(Float32Array, 1, chunkSize, features ? features.x : initialCount); var yCenters = util_1.ChunkedArray.create(Float32Array, 1, chunkSize, features ? features.y : initialCount); var zCenters = util_1.ChunkedArray.create(Float32Array, 1, chunkSize, features ? features.z : initialCount); var types = util_1.ChunkedArray.create(Uint8Array, 1, chunkSize, features ? features.types : initialCount); var groups = util_1.ChunkedArray.create(Uint8Array, 1, chunkSize, features ? features.groups : initialCount); var offsets = util_1.ChunkedArray.create(Uint32Array, 1, chunkSize, features ? features.offsets : initialCount); var members = util_1.ChunkedArray.create(Uint32Array, 1, chunkSize, features ? features.members : initialCount); var state = { x: 0, y: 0, z: 0, offset: 0, count: 0 }; return { startState: function () { state.x = 0; state.y = 0; state.z = 0; state.offset = members.elementCount; state.count = 0; }, pushMember: function (x, y, z, member) { util_1.ChunkedArray.add(members, member); state.x += x; state.y += y; state.z += z; state.count += 1; }, finishState: function (type, group) { var count = state.count; if (count === 0) return; util_1.ChunkedArray.add(types, type); util_1.ChunkedArray.add(groups, group); util_1.ChunkedArray.add(xCenters, state.x / count); util_1.ChunkedArray.add(yCenters, state.y / count); util_1.ChunkedArray.add(zCenters, state.z / count); util_1.ChunkedArray.add(offsets, state.offset); }, add: function (type, group, x, y, z, member) { util_1.ChunkedArray.add(types, type); util_1.ChunkedArray.add(groups, group); util_1.ChunkedArray.add(xCenters, x); util_1.ChunkedArray.add(yCenters, y); util_1.ChunkedArray.add(zCenters, z); util_1.ChunkedArray.add(offsets, members.elementCount); util_1.ChunkedArray.add(members, member); }, getFeatures: function (elementsCount) { util_1.ChunkedArray.add(offsets, members.elementCount); var x = util_1.ChunkedArray.compact(xCenters, true); var y = util_1.ChunkedArray.compact(yCenters, true); var z = util_1.ChunkedArray.compact(zCenters, true); var count = xCenters.elementCount; return Features.create(elementsCount, { x: x, y: y, z: z, count: count, types: util_1.ChunkedArray.compact(types, true), groups: util_1.ChunkedArray.compact(groups, true), offsets: util_1.ChunkedArray.compact(offsets, true), members: util_1.ChunkedArray.compact(members, true), }); } }; } FeaturesBuilder.create = create; })(FeaturesBuilder || (FeaturesBuilder = {})); exports.FeaturesBuilder = FeaturesBuilder; //# sourceMappingURL=features.js.map