UNPKG

molstar

Version:

A comprehensive macromolecular library.

122 lines (121 loc) 5.28 kB
/** * Copyright (c) 2019-2020 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> */ import { __awaiter, __generator } from "tslib"; import { Column, Table } from '../../mol-data/db'; import { getMoleculeType } from '../../mol-model/structure/model/types'; import { Topology } from '../../mol-model/structure/topology/topology'; import { Task } from '../../mol-task'; import { BasicSchema, createBasic } from './basic/schema'; import { ComponentBuilder } from './common/component'; import { EntityBuilder } from './common/entity'; import { getChainId } from './common/util'; import { guessElementSymbolString } from './util'; function getBasic(atoms) { var entityIds = new Array(atoms.count); var asymIds = new Array(atoms.count); var seqIds = new Uint32Array(atoms.count); var ids = new Uint32Array(atoms.count); var typeSymbol = new Array(atoms.count); var entityBuilder = new EntityBuilder(); var componentBuilder = new ComponentBuilder(atoms.residueId, atoms.atomName); var currentEntityId = ''; var currentAsymIndex = 0; var currentAsymId = ''; var currentSeqId = 0; var currentSegmentName = atoms.segmentName.value(0), segmentChanged = false; var prevMoleculeType = 0 /* MoleculeType.Unknown */; var prevResidueNumber = -1; for (var i = 0, il = atoms.count; i < il; ++i) { var residueNumber = atoms.residueId.value(i); var segmentName = atoms.segmentName.value(i); if (currentSegmentName !== segmentName) { currentAsymId = getChainId(currentAsymIndex); currentAsymIndex += 1; currentSeqId = 0; segmentChanged = true; currentSegmentName = segmentName; } else { segmentChanged = false; } if (segmentChanged || residueNumber !== prevResidueNumber) { var compId = atoms.residueName.value(i); var moleculeType = getMoleculeType(componentBuilder.add(compId, i).type, compId); if (!segmentChanged && (moleculeType !== prevMoleculeType || residueNumber !== prevResidueNumber + 1)) { currentAsymId = 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; typeSymbol[i] = guessElementSymbolString(atoms.atomName.value(i), atoms.residueName.value(i)); } var atom_site = Table.ofPartialColumns(BasicSchema.atom_site, { auth_asym_id: atoms.segmentName, auth_atom_id: atoms.atomName, auth_comp_id: atoms.residueName, auth_seq_id: atoms.residueId, id: Column.ofIntArray(ids), label_asym_id: Column.ofStringArray(asymIds), label_atom_id: atoms.atomName, label_comp_id: atoms.residueName, label_seq_id: Column.ofIntArray(seqIds), label_entity_id: Column.ofStringArray(entityIds), occupancy: Column.ofConst(1, atoms.count, Column.Schema.float), type_symbol: Column.ofStringArray(typeSymbol), pdbx_PDB_model_num: Column.ofConst(1, atoms.count, Column.Schema.int), }, atoms.count); return createBasic({ entity: entityBuilder.getEntityTable(), chem_comp: componentBuilder.getChemCompTable(), atom_site: atom_site }); } // export { PsfFormat }; var PsfFormat; (function (PsfFormat) { function is(x) { return (x === null || x === void 0 ? void 0 : x.kind) === 'psf'; } PsfFormat.is = is; function fromPsf(psf) { return { kind: 'psf', name: psf.id, data: psf }; } PsfFormat.fromPsf = fromPsf; })(PsfFormat || (PsfFormat = {})); export function topologyFromPsf(psf) { var _this = this; return Task.create('Parse PSF', function (ctx) { return __awaiter(_this, void 0, void 0, function () { var format, basic, _a, atomIdA, atomIdB, bonds; return __generator(this, function (_b) { format = PsfFormat.fromPsf(psf); basic = getBasic(psf.atoms); _a = psf.bonds, atomIdA = _a.atomIdA, atomIdB = _a.atomIdB; bonds = { indexA: Column.ofLambda({ value: function (row) { return atomIdA.value(row) - 1; }, rowCount: atomIdA.rowCount, schema: atomIdA.schema, }), indexB: Column.ofLambda({ value: function (row) { return atomIdB.value(row) - 1; }, rowCount: atomIdB.rowCount, schema: atomIdB.schema, }), order: Column.ofConst(1, psf.bonds.count, Column.Schema.int) }; return [2 /*return*/, Topology.create(psf.id, basic, bonds, format)]; }); }); }); }