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