molstar
Version:
A comprehensive macromolecular library.
126 lines • 5.93 kB
JavaScript
/**
* 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
;