UNPKG

molstar

Version:

A comprehensive macromolecular library.

90 lines (89 loc) 3.7 kB
/** * Copyright (c) 2018-2020 Mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> */ import { FormatPropertyProvider } from '../../../mol-model-formats/structure/common/property'; export { ModelCrossLinkRestraint }; var ModelCrossLinkRestraint; (function (ModelCrossLinkRestraint) { ModelCrossLinkRestraint.Descriptor = { name: 'ihm_cross_link_restraint', // TODO cifExport }; ModelCrossLinkRestraint.Provider = FormatPropertyProvider.create(ModelCrossLinkRestraint.Descriptor); function fromTable(table, model) { var p1 = { entity_id: table.entity_id_1, asym_id: table.asym_id_1, seq_id: table.seq_id_1, atom_id: table.atom_id_1, }; var p2 = { entity_id: table.entity_id_2, asym_id: table.asym_id_2, seq_id: table.seq_id_2, atom_id: table.atom_id_2, }; function _add(map, element, row) { var indices = map.get(element); if (indices) indices.push(row); else map.set(element, [row]); } function add(row, ps) { var entityId = ps.entity_id.value(row); var asymId = ps.asym_id.value(row); var seqId = ps.seq_id.value(row); if (table.model_granularity.value(row) === 'by-atom') { var atomicElement = model.atomicHierarchy.index.findAtom({ auth_seq_id: seqId, label_asym_id: asymId, label_atom_id: ps.atom_id.value(row), label_entity_id: entityId, }); if (atomicElement >= 0) _add(atomicElementMap, atomicElement, row); } else if (model.coarseHierarchy.isDefined) { var sphereElement = model.coarseHierarchy.spheres.findSequenceKey(entityId, asymId, seqId); if (sphereElement >= 0) { _add(sphereElementMap, sphereElement, row); } else { var gaussianElement = model.coarseHierarchy.gaussians.findSequenceKey(entityId, asymId, seqId); if (gaussianElement >= 0) _add(gaussianElementMap, gaussianElement, row); } } } function getMapByKind(kind) { switch (kind) { case 0 /* Unit.Kind.Atomic */: return atomicElementMap; case 1 /* Unit.Kind.Spheres */: return sphereElementMap; case 2 /* Unit.Kind.Gaussians */: return gaussianElementMap; } } /** map from atomic element to cross link indices */ var atomicElementMap = new Map(); /** map from sphere element to cross link indices */ var sphereElementMap = new Map(); /** map from gaussian element to cross link indices */ var gaussianElementMap = new Map(); var emptyIndexArray = []; for (var i = 0; i < table._rowCount; ++i) { add(i, p1); add(i, p2); } return { getIndicesByElement: function (element, kind) { var map = getMapByKind(kind); var idx = map.get(element); return idx !== undefined ? idx : emptyIndexArray; }, data: table }; } ModelCrossLinkRestraint.fromTable = fromTable; })(ModelCrossLinkRestraint || (ModelCrossLinkRestraint = {}));