UNPKG

molstar

Version:

A comprehensive macromolecular library.

148 lines (147 loc) 6.71 kB
"use strict"; /** * Copyright (c) 2022 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.topologyFromPrmtop = exports.PrmtopFormat = void 0; var tslib_1 = require("tslib"); var db_1 = require("../../mol-data/db"); var types_1 = require("../../mol-model/structure/model/types"); var topology_1 = require("../../mol-model/structure/topology/topology"); var mol_task_1 = require("../../mol-task"); var schema_1 = require("./basic/schema"); var component_1 = require("./common/component"); var entity_1 = require("./common/entity"); var util_1 = require("./common/util"); var util_2 = require("./util"); function getBasic(prmtop) { var pointers = prmtop.pointers, residuePointer = prmtop.residuePointer, residueLabel = prmtop.residueLabel, atomName = prmtop.atomName; var atomCount = pointers.NATOM; var residueCount = pointers.NRES; // var residueIds = new Uint32Array(atomCount); var residueNames = []; var addResidue = function (i, from, to) { var rn = residueLabel.value(i); for (var j = from, jl = to; j < jl; ++j) { residueIds[j] = i + 1; residueNames[j] = rn; } }; for (var i = 0, il = residueCount - 1; i < il; ++i) { addResidue(i, residuePointer.value(i) - 1, residuePointer.value(i + 1) - 1); } addResidue(residueCount - 1, residuePointer.value(residueCount - 1) - 1, atomCount); var residueId = db_1.Column.ofIntArray(residueIds); var residueName = db_1.Column.ofStringArray(residueNames); // var entityIds = new Array(atomCount); var asymIds = new Array(atomCount); var seqIds = new Uint32Array(atomCount); var ids = new Uint32Array(atomCount); var entityBuilder = new entity_1.EntityBuilder(); var componentBuilder = new component_1.ComponentBuilder(residueId, atomName); var currentEntityId = ''; var currentAsymIndex = 0; var currentAsymId = ''; var currentSeqId = 0; var prevMoleculeType = 0 /* MoleculeType.Unknown */; var prevResidueNumber = -1; for (var i = 0, il = atomCount; i < il; ++i) { var residueNumber = residueId.value(i); if (residueNumber !== prevResidueNumber) { var compId = residueName.value(i); var moleculeType = (0, types_1.getMoleculeType)(componentBuilder.add(compId, i).type, compId); if (moleculeType !== prevMoleculeType) { currentAsymId = (0, util_1.getChainId)(currentAsymIndex); currentAsymIndex += 1; currentSeqId = 0; } currentEntityId = entityBuilder.getEntityId(compId, moleculeType, currentAsymId); currentSeqId += 1; prevResidueNumber = residueNumber; prevMoleculeType = moleculeType; } entityIds[i] = currentEntityId; asymIds[i] = currentAsymId; seqIds[i] = currentSeqId; ids[i] = i; } var id = db_1.Column.ofIntArray(ids); var asym_id = db_1.Column.ofStringArray(asymIds); // var type_symbol = new Array(atomCount); for (var i = 0; i < atomCount; ++i) { type_symbol[i] = (0, util_2.guessElementSymbolString)(atomName.value(i), residueName.value(i)); } var atom_site = db_1.Table.ofPartialColumns(schema_1.BasicSchema.atom_site, { auth_asym_id: asym_id, auth_atom_id: db_1.Column.asArrayColumn(atomName), auth_comp_id: residueName, auth_seq_id: residueId, id: db_1.Column.asArrayColumn(id), label_asym_id: asym_id, label_atom_id: db_1.Column.asArrayColumn(atomName), label_comp_id: residueName, label_seq_id: db_1.Column.ofIntArray(seqIds), label_entity_id: db_1.Column.ofStringArray(entityIds), occupancy: db_1.Column.ofConst(1, atomCount, db_1.Column.Schema.float), type_symbol: db_1.Column.ofStringArray(type_symbol), pdbx_PDB_model_num: db_1.Column.ofConst(1, atomCount, db_1.Column.Schema.int), }, atomCount); var basic = (0, schema_1.createBasic)({ entity: entityBuilder.getEntityTable(), chem_comp: componentBuilder.getChemCompTable(), atom_site: atom_site }); return basic; } var PrmtopFormat; (function (PrmtopFormat) { function is(x) { return (x === null || x === void 0 ? void 0 : x.kind) === 'prmtop'; } PrmtopFormat.is = is; function fromPrmtop(prmtop) { return { kind: 'prmtop', name: prmtop.title.join(' ') || 'PRMTOP', data: prmtop }; } PrmtopFormat.fromPrmtop = fromPrmtop; })(PrmtopFormat || (PrmtopFormat = {})); exports.PrmtopFormat = PrmtopFormat; function topologyFromPrmtop(prmtop) { var _this = this; return mol_task_1.Task.create('Parse PRMTOP', function (ctx) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var format, basic, _a, NBONH, NBONA, bondsIncHydrogen, bondsWithoutHydrogen, bondCount, bonds; return tslib_1.__generator(this, function (_b) { format = PrmtopFormat.fromPrmtop(prmtop); basic = getBasic(prmtop); _a = prmtop.pointers, NBONH = _a.NBONH, NBONA = _a.NBONA, bondsIncHydrogen = prmtop.bondsIncHydrogen, bondsWithoutHydrogen = prmtop.bondsWithoutHydrogen; bondCount = NBONH + NBONA; bonds = { indexA: db_1.Column.ofLambda({ value: function (row) { return row < NBONH ? bondsIncHydrogen.value(row * 3) / 3 : bondsWithoutHydrogen.value((row - NBONH) * 3) / 3; }, rowCount: bondCount, schema: db_1.Column.Schema.int, }), indexB: db_1.Column.ofLambda({ value: function (row) { return row < NBONH ? bondsIncHydrogen.value(row * 3 + 1) / 3 : bondsWithoutHydrogen.value((row - NBONH) * 3 + 1) / 3; }, rowCount: bondCount, schema: db_1.Column.Schema.int, }), order: db_1.Column.ofConst(1, bondCount, db_1.Column.Schema.int) }; return [2 /*return*/, topology_1.Topology.create(prmtop.title.join(' ') || 'PRMTOP', basic, bonds, format)]; }); }); }); } exports.topologyFromPrmtop = topologyFromPrmtop;