molstar
Version:
A comprehensive macromolecular library.
317 lines • 15.2 kB
JavaScript
"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