UNPKG

molstar

Version:

A comprehensive macromolecular library.

126 lines 5.93 kB
"use strict"; /** * Copyright (c) 2017 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author David Sehnal <david.sehnal@gmail.com> */ Object.defineProperty(exports, "__esModule", { value: true }); exports.createAssemblies = void 0; var linear_algebra_1 = require("../../../mol-math/linear-algebra"); var symmetry_operator_1 = require("../../../mol-math/geometry/symmetry-operator"); var symmetry_1 = require("../../../mol-model/structure/model/properties/symmetry"); var structure_1 = require("../../../mol-model/structure"); var structure_2 = require("../../../mol-model/structure"); function createAssemblies(pdbx_struct_assembly, pdbx_struct_assembly_gen, pdbx_struct_oper_list) { if (!pdbx_struct_assembly._rowCount) return []; var matrices = getMatrices(pdbx_struct_oper_list); var assemblies = []; for (var i = 0; i < pdbx_struct_assembly._rowCount; i++) { assemblies[assemblies.length] = createAssembly(pdbx_struct_assembly, pdbx_struct_assembly_gen, i, matrices); } return assemblies; } exports.createAssemblies = createAssemblies; function createAssembly(pdbx_struct_assembly, pdbx_struct_assembly_gen, index, matrices) { var id = pdbx_struct_assembly.id.value(index); var details = pdbx_struct_assembly.details.value(index); var generators = []; var assembly_id = pdbx_struct_assembly_gen.assembly_id, oper_expression = pdbx_struct_assembly_gen.oper_expression, asym_id_list = pdbx_struct_assembly_gen.asym_id_list; for (var i = 0, _i = pdbx_struct_assembly_gen._rowCount; i < _i; i++) { if (assembly_id.value(i) !== id) continue; generators[generators.length] = { assemblyId: id, expression: oper_expression.value(i), asymIds: asym_id_list.value(i) }; } return symmetry_1.Assembly.create(id, details, operatorGroupsProvider(generators, matrices)); } function operatorGroupsProvider(generators, matrices) { return function () { var groups = []; var operatorOffset = 0; for (var i = 0; i < generators.length; i++) { var gen = generators[i]; var operatorList = parseOperatorList(gen.expression); var operatorNames = expandOperators(operatorList); var operators = getAssemblyOperators(matrices, operatorNames, operatorOffset, gen.assemblyId); var selector = structure_1.Queries.generators.atoms({ chainTest: structure_1.Queries.pred.and(structure_1.Queries.pred.eq(function (ctx) { return structure_2.StructureProperties.unit.operator_name(ctx.element); }, symmetry_operator_1.SymmetryOperator.DefaultName), structure_1.Queries.pred.inSet(function (ctx) { return structure_2.StructureProperties.chain.label_asym_id(ctx.element); }, gen.asymIds)) }); groups[groups.length] = { selector: selector, operators: operators }; operatorOffset += operators.length; } return groups; }; } function getMatrices(pdbx_struct_oper_list) { var id = pdbx_struct_oper_list.id, matrix = pdbx_struct_oper_list.matrix, vector = pdbx_struct_oper_list.vector, _schema = pdbx_struct_oper_list._schema; var matrices = new Map(); for (var i = 0, _i = pdbx_struct_oper_list._rowCount; i < _i; i++) { var m = linear_algebra_1.Tensor.toMat4((0, linear_algebra_1.Mat4)(), _schema.matrix.space, matrix.value(i)); var t = linear_algebra_1.Tensor.toVec3((0, linear_algebra_1.Vec3)(), _schema.vector.space, vector.value(i)); linear_algebra_1.Mat4.setTranslation(m, t); linear_algebra_1.Mat4.setValue(m, 3, 3, 1); matrices.set(id.value(i), m); } return matrices; } function expandOperators(operatorList) { var ops = []; var currentOp = []; for (var i = 0; i < operatorList.length; i++) currentOp[i] = ''; expandOperators1(operatorList, ops, operatorList.length - 1, currentOp); return ops; } function expandOperators1(operatorNames, list, i, current) { if (i < 0) { list[list.length] = current.slice(0); return; } var ops = operatorNames[i], len = ops.length; for (var j = 0; j < len; j++) { current[i] = ops[j]; expandOperators1(operatorNames, list, i - 1, current); } } function getAssemblyOperators(matrices, operatorNames, startIndex, assemblyId) { var operators = []; var index = startIndex; for (var _a = 0, operatorNames_1 = operatorNames; _a < operatorNames_1.length; _a++) { var op = operatorNames_1[_a]; var m = linear_algebra_1.Mat4.identity(); for (var i = 0; i < op.length; i++) { linear_algebra_1.Mat4.mul(m, m, matrices.get(op[i])); } index++; operators[operators.length] = symmetry_operator_1.SymmetryOperator.create("ASM_" + index, m, { assembly: { id: assemblyId, operId: index, operList: op } }); } return operators; } function parseOperatorList(value) { // '(X0)(1-5)' becomes [['X0'], ['1', '2', '3', '4', '5']] // kudos to Glen van Ginkel. var oeRegex = /\(?([^\(\)]+)\)?]*/g, groups = [], ret = []; var g; while (g = oeRegex.exec(value)) groups[groups.length] = g[1]; groups.forEach(function (g) { var group = []; g.split(',').forEach(function (e) { var dashIndex = e.indexOf('-'); if (dashIndex > 0) { var from = parseInt(e.substring(0, dashIndex)), to = parseInt(e.substr(dashIndex + 1)); for (var i = from; i <= to; i++) group[group.length] = i.toString(); } else { group[group.length] = e.trim(); } }); ret[ret.length] = group; }); return ret; } //# sourceMappingURL=assembly.js.map