UNPKG

molstar

Version:

A comprehensive macromolecular library.

317 lines 15.2 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.Model = void 0; var tslib_1 = require("tslib"); var uuid_1 = require("../../../mol-util/uuid"); var custom_property_1 = require("../../custom-property"); var util_1 = require("./util"); var linear_algebra_1 = require("../../../mol-math/linear-algebra"); var coordinates_1 = require("../coordinates"); var mol_task_1 = require("../../../mol-task"); var index_pair_1 = require("../../../mol-model-formats/structure/property/bonds/index-pair"); var parser_1 = require("../../../mol-model-formats/structure/basic/parser"); var mmcif_1 = require("../../../mol-model-formats/structure/mmcif"); var symmetry_1 = require("../../../mol-model-formats/structure/property/symmetry"); var db_1 = require("../../../mol-data/db"); var custom_model_property_1 = require("../../../mol-model-props/common/custom-model-property"); var trajectory_1 = require("../trajectory"); { } var Model; (function (Model) { function _trajectoryFromModelAndCoordinates(model, coordinates) { var trajectory = []; var frames = coordinates.frames; var srcIndex = model.atomicHierarchy.atomSourceIndex; var isIdentity = db_1.Column.isIdentity(srcIndex); var srcIndexArray = isIdentity ? void 0 : srcIndex.toArray({ array: Int32Array }); for (var i = 0, il = frames.length; i < il; ++i) { var f = frames[i]; var m = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, model), { id: uuid_1.UUID.create22(), modelNum: i, atomicConformation: coordinates_1.Coordinates.getAtomicConformation(f, model.atomicConformation.atomId, srcIndexArray), // TODO: add support for supplying sphere and gaussian coordinates in addition to atomic coordinates? // coarseConformation: coarse.conformation, customProperties: new custom_property_1.CustomProperties(), _staticPropertyData: Object.create(null), _dynamicPropertyData: Object.create(null) }); if (f.cell) { var symmetry = symmetry_1.ModelSymmetry.fromCell(f.cell.size, f.cell.anglesInRadians); symmetry_1.ModelSymmetry.Provider.set(m, symmetry); } Model.TrajectoryInfo.set(m, { index: i, size: frames.length }); trajectory.push(m); } return { trajectory: trajectory, srcIndexArray: srcIndexArray }; } function trajectoryFromModelAndCoordinates(model, coordinates) { return new trajectory_1.ArrayTrajectory(_trajectoryFromModelAndCoordinates(model, coordinates).trajectory); } Model.trajectoryFromModelAndCoordinates = trajectoryFromModelAndCoordinates; function trajectoryFromTopologyAndCoordinates(topology, coordinates) { var _this = this; return mol_task_1.Task.create('Create Trajectory', function (ctx) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () { var models, model, trajectory, bondData, indexPairBonds, index, _a, trajectory_2, m; return (0, tslib_1.__generator)(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, (0, parser_1.createModels)(topology.basic, topology.sourceData, ctx)]; case 1: models = _b.sent(); if (models.frameCount === 0) throw new Error('found no model'); model = models.representative; trajectory = _trajectoryFromModelAndCoordinates(model, coordinates).trajectory; bondData = { pairs: topology.bonds, count: model.atomicHierarchy.atoms._rowCount }; indexPairBonds = index_pair_1.IndexPairBonds.fromData(bondData); index = 0; for (_a = 0, trajectory_2 = trajectory; _a < trajectory_2.length; _a++) { m = trajectory_2[_a]; index_pair_1.IndexPairBonds.Provider.set(m, indexPairBonds); Model.TrajectoryInfo.set(m, { index: index++, size: trajectory.length }); } return [2 /*return*/, new trajectory_1.ArrayTrajectory(trajectory)]; } }); }); }); } Model.trajectoryFromTopologyAndCoordinates = trajectoryFromTopologyAndCoordinates; var CenterProp = '__Center__'; function getCenter(model) { if (model._dynamicPropertyData[CenterProp]) return model._dynamicPropertyData[CenterProp]; var center = (0, util_1.calcModelCenter)(model.atomicConformation, model.coarseConformation); model._dynamicPropertyData[CenterProp] = center; return center; } Model.getCenter = getCenter; function invertIndex(xs) { var invertedIndex = new Int32Array(xs.rowCount); var isIdentity = false; for (var i = 0, _i = xs.rowCount; i < _i; i++) { var x = xs.value(i); if (x !== i) isIdentity = false; invertedIndex[x] = i; } return { isIdentity: isIdentity, invertedIndex: invertedIndex }; } var InvertedAtomSrcIndexProp = '__InvertedAtomSrcIndex__'; function getInvertedAtomSourceIndex(model) { if (model._staticPropertyData[InvertedAtomSrcIndexProp]) return model._staticPropertyData[InvertedAtomSrcIndexProp]; var index = invertIndex(model.atomicHierarchy.atomSourceIndex); model._staticPropertyData[InvertedAtomSrcIndexProp] = index; return index; } Model.getInvertedAtomSourceIndex = getInvertedAtomSourceIndex; var TrajectoryInfoProp = '__TrajectoryInfo__'; Model.TrajectoryInfo = { get: function (model) { return model._dynamicPropertyData[TrajectoryInfoProp] || { index: 0, size: 1 }; }, set: function (model, trajectoryInfo) { return model._dynamicPropertyData[TrajectoryInfoProp] = trajectoryInfo; } }; var AsymIdCountProp = '__AsymIdCount__'; Model.AsymIdCount = { get: function (model) { if (model._dynamicPropertyData[AsymIdCountProp]) return model._dynamicPropertyData[AsymIdCountProp]; var asymIdCount = (0, util_1.getAsymIdCount)(model); model._dynamicPropertyData[AsymIdCountProp] = asymIdCount; return asymIdCount; }, }; Model.AsymIdOffset = custom_model_property_1.CustomModelProperty.createSimple('asym_id_offset', 'static'); Model.Index = custom_model_property_1.CustomModelProperty.createSimple('index', 'static'); function getRoot(model) { return model.parent || model; } Model.getRoot = getRoot; function areHierarchiesEqual(a, b) { return a.atomicHierarchy === b.atomicHierarchy && a.coarseHierarchy === b.coarseHierarchy; } Model.areHierarchiesEqual = areHierarchiesEqual; var CoordinatesHistoryProp = '__CoordinatesHistory__'; Model.CoordinatesHistory = { get: function (model) { return model._staticPropertyData[CoordinatesHistoryProp]; }, set: function (model, coordinatesHistory) { return model._staticPropertyData[CoordinatesHistoryProp] = coordinatesHistory; } }; var CoarseGrainedProp = '__CoarseGrained__'; /** * Has typical coarse grained atom names (BB, SC1) or less than three times as many * atoms as polymer residues (C-alpha only models). */ function isCoarseGrained(model) { if (model._staticPropertyData[CoarseGrainedProp] !== undefined) return model._staticPropertyData[CoarseGrainedProp]; var polymerResidueCount = 0; var polymerType = model.atomicHierarchy.derived.residue.polymerType; for (var i = 0; i < polymerType.length; ++i) { if (polymerType[i] !== 0 /* NA */) polymerResidueCount += 1; } // check for coarse grained atom names var hasBB = false, hasSC1 = false; var _a = model.atomicHierarchy.atoms, label_atom_id = _a.label_atom_id, atomCount = _a._rowCount; for (var i = 0; i < atomCount; ++i) { var atomName = label_atom_id.value(i); if (!hasBB && atomName === 'BB') hasBB = true; if (!hasSC1 && atomName === 'SC1') hasSC1 = true; if (hasBB && hasSC1) break; } var coarseGrained = (hasBB && hasSC1) || (polymerResidueCount && atomCount ? atomCount / polymerResidueCount < 3 : false); model._staticPropertyData[CoarseGrainedProp] = coarseGrained; return coarseGrained; } Model.isCoarseGrained = isCoarseGrained; // function hasCarbohydrate(model) { return model.properties.saccharideComponentMap.size > 0; } Model.hasCarbohydrate = hasCarbohydrate; function hasProtein(model) { var subtype = model.entities.subtype; for (var i = 0, il = subtype.rowCount; i < il; ++i) { if (subtype.value(i).startsWith('polypeptide')) return true; } return false; } Model.hasProtein = hasProtein; function hasNucleic(model) { var subtype = model.entities.subtype; for (var i = 0, il = subtype.rowCount; i < il; ++i) { var s = subtype.value(i); if (s.endsWith('ribonucleotide hybrid') || s.endsWith('ribonucleotide')) return true; } return false; } Model.hasNucleic = hasNucleic; function isFromPdbArchive(model) { if (!mmcif_1.MmcifFormat.is(model.sourceData)) return false; var db = model.sourceData.data.db; return (db.database_2.database_id.isDefined || // 4 character PDB id model.entryId.match(/^[1-9][a-z0-9]{3,3}$/i) !== null || // long PDB id model.entryId.match(/^pdb_[0-9]{4,4}[1-9][a-z0-9]{3,3}$/i) !== null); } Model.isFromPdbArchive = isFromPdbArchive; function hasSecondaryStructure(model) { if (!mmcif_1.MmcifFormat.is(model.sourceData)) return false; var db = model.sourceData.data.db; return (db.struct_conf.id.isDefined || db.struct_sheet_range.id.isDefined); } Model.hasSecondaryStructure = hasSecondaryStructure; var tmpAngles90 = linear_algebra_1.Vec3.create(1.5707963, 1.5707963, 1.5707963); // in radians var tmpLengths1 = linear_algebra_1.Vec3.create(1, 1, 1); function hasCrystalSymmetry(model) { var _a; var spacegroup = (_a = symmetry_1.ModelSymmetry.Provider.get(model)) === null || _a === void 0 ? void 0 : _a.spacegroup; return !!spacegroup && !(spacegroup.num === 1 && linear_algebra_1.Vec3.equals(spacegroup.cell.anglesInRadians, tmpAngles90) && linear_algebra_1.Vec3.equals(spacegroup.cell.size, tmpLengths1)); } Model.hasCrystalSymmetry = hasCrystalSymmetry; function isFromXray(model) { if (!mmcif_1.MmcifFormat.is(model.sourceData)) return false; var db = model.sourceData.data.db; for (var i = 0; i < db.exptl.method.rowCount; i++) { var v = db.exptl.method.value(i).toUpperCase(); if (v.indexOf('DIFFRACTION') >= 0) return true; } return false; } Model.isFromXray = isFromXray; function isFromEm(model) { if (!mmcif_1.MmcifFormat.is(model.sourceData)) return false; var db = model.sourceData.data.db; for (var i = 0; i < db.exptl.method.rowCount; i++) { var v = db.exptl.method.value(i).toUpperCase(); if (v.indexOf('MICROSCOPY') >= 0) return true; } return false; } Model.isFromEm = isFromEm; function isFromNmr(model) { if (!mmcif_1.MmcifFormat.is(model.sourceData)) return false; var db = model.sourceData.data.db; for (var i = 0; i < db.exptl.method.rowCount; i++) { var v = db.exptl.method.value(i).toUpperCase(); if (v.indexOf('NMR') >= 0) return true; } return false; } Model.isFromNmr = isFromNmr; function hasXrayMap(model) { if (!mmcif_1.MmcifFormat.is(model.sourceData)) return false; // Check exprimental method to exclude models solved with // 'ELECTRON CRYSTALLOGRAPHY' which also have structure factors if (!isFromXray(model)) return false; var db = model.sourceData.data.db; var status_code_sf = db.pdbx_database_status.status_code_sf; return status_code_sf.isDefined && status_code_sf.value(0) === 'REL'; } Model.hasXrayMap = hasXrayMap; /** * Also checks for `content_type` of 'associated EM volume' to exclude cases * like 6TEK which are solved with 'X-RAY DIFFRACTION' but have an related * EMDB entry of type 'other EM volume'. */ function hasEmMap(model) { if (!mmcif_1.MmcifFormat.is(model.sourceData)) return false; var db = model.sourceData.data.db; var _a = db.pdbx_database_related, db_name = _a.db_name, content_type = _a.content_type; for (var i = 0, il = db.pdbx_database_related._rowCount; i < il; ++i) { if (db_name.value(i).toUpperCase() === 'EMDB' && content_type.value(i) === 'associated EM volume') { return true; } } return false; } Model.hasEmMap = hasEmMap; function hasDensityMap(model) { if (!mmcif_1.MmcifFormat.is(model.sourceData)) return false; return hasXrayMap(model) || hasEmMap(model); } Model.hasDensityMap = hasDensityMap; function probablyHasDensityMap(model) { if (!mmcif_1.MmcifFormat.is(model.sourceData)) return false; var db = model.sourceData.data.db; return hasDensityMap(model) || ( // check if from pdb archive but missing relevant meta data isFromPdbArchive(model) && (!db.exptl.method.isDefined || (isFromXray(model) && (!db.pdbx_database_status.status_code_sf.isDefined || db.pdbx_database_status.status_code_sf.valueKind(0) === 2 /* Unknown */)) || (isFromEm(model) && (!db.pdbx_database_related.db_name.isDefined)))); } Model.probablyHasDensityMap = probablyHasDensityMap; })(Model = exports.Model || (exports.Model = {})); //# sourceMappingURL=model.js.map