UNPKG

molstar

Version:

A comprehensive macromolecular library.

167 lines 7.39 kB
"use strict"; /** * Copyright (c) 2017-2021 Mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author David Sehnal <david.sehnal@gmail.com> * @author Alexander Rose <alexander.rose@weirdbyte.de> */ Object.defineProperty(exports, "__esModule", { value: true }); exports.StructConn = void 0; var int_1 = require("../../../../mol-data/int"); var cif_1 = require("../../../../mol-io/writer/cif"); var bonds_1 = require("../../../../mol-model/structure/model/properties/atomic/bonds"); var property_1 = require("../../common/property"); var StructConn; (function (StructConn) { StructConn.Descriptor = { name: 'struct_conn', cifExport: { prefix: '', categories: [{ name: 'struct_conn', instance: function (ctx) { var p = StructConn.Provider.get(ctx.firstModel); if (!p || p.entries.length === 0) return cif_1.CifWriter.Category.Empty; var structure = ctx.structures[0]; var indices = []; for (var _a = 0, _b = p.entries; _a < _b.length; _a++) { var e = _b[_a]; if (hasAtom(structure, e.partnerA.atomIndex) && hasAtom(structure, e.partnerB.atomIndex)) { indices[indices.length] = e.rowIndex; } } return cif_1.CifWriter.Category.ofTable(p.data, indices); } }] } }; StructConn.Provider = property_1.FormatPropertyProvider.create(StructConn.Descriptor); /** * Heuristic to test if StructConn likely provides all atomic bonds by * checking if the fraction of bonds and atoms is high (> 0.95). */ function isExhaustive(model) { var structConn = StructConn.Provider.get(model); return !!structConn && (structConn.data.id.rowCount / model.atomicConformation.atomId.rowCount) > 0.95; } StructConn.isExhaustive = isExhaustive; function hasAtom(_a, element) { var units = _a.units; for (var i = 0, _i = units.length; i < _i; i++) { if (int_1.SortedArray.indexOf(units[i].elements, element) >= 0) return true; } return false; } function getAtomIndexFromEntries(entries) { var m = new Map(); for (var _a = 0, entries_1 = entries; _a < entries_1.length; _a++) { var e = entries_1[_a]; var iA = e.partnerA.atomIndex, iB = e.partnerB.atomIndex; if (m.has(iA)) m.get(iA).push(e); else m.set(iA, [e]); if (m.has(iB)) m.get(iB).push(e); else m.set(iB, [e]); } return m; } StructConn.getAtomIndexFromEntries = getAtomIndexFromEntries; function getEntriesFromStructConn(struct_conn, model) { var conn_type_id = struct_conn.conn_type_id, pdbx_dist_value = struct_conn.pdbx_dist_value, pdbx_value_order = struct_conn.pdbx_value_order; var p1 = { label_asym_id: struct_conn.ptnr1_label_asym_id, label_seq_id: struct_conn.ptnr1_label_seq_id, auth_seq_id: struct_conn.ptnr1_auth_seq_id, label_atom_id: struct_conn.ptnr1_label_atom_id, label_alt_id: struct_conn.pdbx_ptnr1_label_alt_id, ins_code: struct_conn.pdbx_ptnr1_PDB_ins_code, symmetry: struct_conn.ptnr1_symmetry }; var p2 = { label_asym_id: struct_conn.ptnr2_label_asym_id, label_seq_id: struct_conn.ptnr2_label_seq_id, auth_seq_id: struct_conn.ptnr2_auth_seq_id, label_atom_id: struct_conn.ptnr2_label_atom_id, label_alt_id: struct_conn.pdbx_ptnr2_label_alt_id, ins_code: struct_conn.pdbx_ptnr2_PDB_ins_code, symmetry: struct_conn.ptnr2_symmetry }; var _p = function (row, ps) { if (ps.label_asym_id.valueKind(row) !== 0 /* Present */) return void 0; var asymId = ps.label_asym_id.value(row); var entityIndex = model.atomicHierarchy.index.findEntity(asymId); if (entityIndex < 0) return void 0; var residueIndex = model.atomicHierarchy.index.findResidue(model.entities.data.id.value(entityIndex), asymId, ps.auth_seq_id.value(row), ps.ins_code.value(row)); if (residueIndex < 0) return void 0; var atomName = ps.label_atom_id.value(row); // turns out "mismat" records might not have atom name value if (!atomName) return void 0; var atomIndex = model.atomicHierarchy.index.findAtomOnResidue(residueIndex, atomName, ps.label_alt_id.value(row)); if (atomIndex < 0) return void 0; return { residueIndex: residueIndex, atomIndex: atomIndex, symmetry: ps.symmetry.value(row) }; }; var entries = []; for (var i = 0; i < struct_conn._rowCount; i++) { var partnerA = _p(i, p1); var partnerB = _p(i, p2); if (partnerA === undefined || partnerB === undefined) continue; var type = conn_type_id.value(i); var orderType = (pdbx_value_order.value(i) || '').toLowerCase(); var flags = 0 /* None */; var order = 1; switch (orderType) { case 'sing': order = 1; break; case 'doub': order = 2; break; case 'trip': order = 3; break; case 'quad': order = 4; break; default: order = (0, bonds_1.getInterBondOrderFromTable)(struct_conn.ptnr1_label_comp_id.value(i), struct_conn.ptnr1_label_atom_id.value(i), struct_conn.ptnr2_label_comp_id.value(i), struct_conn.ptnr2_label_atom_id.value(i)); } switch (type) { case 'covale': flags = 1 /* Covalent */; break; case 'disulf': flags = 1 /* Covalent */ | 8 /* Disulfide */; break; case 'hydrog': flags = 4 /* HydrogenBond */; break; case 'metalc': flags = 2 /* MetallicCoordination */; break; } entries.push({ rowIndex: i, flags: flags, order: order, distance: pdbx_dist_value.value(i), partnerA: partnerA, partnerB: partnerB }); } return entries; } StructConn.getEntriesFromStructConn = getEntriesFromStructConn; })(StructConn = exports.StructConn || (exports.StructConn = {})); //# sourceMappingURL=struct_conn.js.map