molstar
Version:
A comprehensive macromolecular library.
288 lines • 14.1 kB
JavaScript
/**
* Copyright (c) 2018-2020 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.StructureQualityReportProvider = exports.StructureQualityReportParams = exports.StructureQualityReport = void 0;
var tslib_1 = require("tslib");
var db_1 = require("../../../mol-data/db");
var schema_1 = require("../../../mol-io/reader/cif/schema");
var mmcif_extras_1 = require("../../../mol-io/reader/cif/schema/mmcif-extras");
var cif_1 = require("../../../mol-io/writer/cif");
var structure_1 = require("../../../mol-model/structure");
var atom_site_1 = require("../../../mol-model/structure/export/categories/atom_site");
var symbol_1 = require("../../../mol-script/language/symbol");
var type_1 = require("../../../mol-script/language/type");
var compiler_1 = require("../../../mol-script/runtime/query/compiler");
var param_definition_1 = require("../../../mol-util/param-definition");
var array_1 = require("../../../mol-util/array");
var mmcif_1 = require("../../../mol-model-formats/structure/mmcif");
var wrapper_1 = require("../../../mol-model-props/common/wrapper");
var custom_model_property_1 = require("../../../mol-model-props/common/custom-model-property");
var assets_1 = require("../../../mol-util/assets");
var custom_property_1 = require("../../../mol-model/custom-property");
var StructureQualityReport;
(function (StructureQualityReport) {
StructureQualityReport.DefaultServerUrl = 'https://www.ebi.ac.uk/pdbe/api/validation/residuewise_outlier_summary/entry/';
function getEntryUrl(pdbId, serverUrl) {
return serverUrl + "/" + pdbId.toLowerCase();
}
StructureQualityReport.getEntryUrl = getEntryUrl;
function isApplicable(model) {
return !!model && structure_1.Model.isFromPdbArchive(model);
}
StructureQualityReport.isApplicable = isApplicable;
StructureQualityReport.Schema = {
pdbe_structure_quality_report: {
updated_datetime_utc: db_1.Column.Schema.str
},
pdbe_structure_quality_report_issues: (0, tslib_1.__assign)((0, tslib_1.__assign)({ id: db_1.Column.Schema.int }, mmcif_extras_1.mmCIF_residueId_schema), { pdbx_PDB_model_num: db_1.Column.Schema.int, issue_type_group_id: db_1.Column.Schema.int }),
pdbe_structure_quality_report_issue_types: {
group_id: db_1.Column.Schema.int,
issue_type: db_1.Column.Schema.str
}
};
function fromJson(model, data) {
var info = wrapper_1.PropertyWrapper.createInfo();
var issueMap = createIssueMapFromJson(model, data);
return { info: info, data: issueMap };
}
StructureQualityReport.fromJson = fromJson;
function fromServer(ctx, model, props) {
return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
var url, json, data;
return (0, tslib_1.__generator)(this, function (_a) {
switch (_a.label) {
case 0:
url = assets_1.Asset.getUrlAsset(ctx.assetManager, getEntryUrl(model.entryId, props.serverUrl));
return [4 /*yield*/, ctx.assetManager.resolve(url, 'json').runInContext(ctx.runtime)];
case 1:
json = _a.sent();
data = json.data[model.entryId.toLowerCase()];
if (!data)
throw new Error('missing data');
return [2 /*return*/, { value: fromJson(model, data), assets: [json] }];
}
});
});
}
StructureQualityReport.fromServer = fromServer;
function fromCif(ctx, model, props) {
var info = wrapper_1.PropertyWrapper.tryGetInfoFromCif('pdbe_structure_quality_report', model);
if (!info)
return;
var data = getCifData(model);
var issueMap = createIssueMapFromCif(model, data.residues, data.groups);
return { info: info, data: issueMap };
}
StructureQualityReport.fromCif = fromCif;
function fromCifOrServer(ctx, model, props) {
return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
var cif;
return (0, tslib_1.__generator)(this, function (_a) {
cif = fromCif(ctx, model, props);
return [2 /*return*/, cif ? { value: cif } : fromServer(ctx, model, props)];
});
});
}
StructureQualityReport.fromCifOrServer = fromCifOrServer;
var _emptyArray = [];
function getIssues(e) {
if (!structure_1.Unit.isAtomic(e.unit))
return _emptyArray;
var prop = exports.StructureQualityReportProvider.get(e.unit.model).value;
if (!prop || !prop.data)
return _emptyArray;
var rI = e.unit.residueIndex[e.element];
return prop.data.issues.has(rI) ? prop.data.issues.get(rI) : _emptyArray;
}
StructureQualityReport.getIssues = getIssues;
function getIssueTypes(structure) {
if (!structure)
return _emptyArray;
var prop = exports.StructureQualityReportProvider.get(structure.models[0]).value;
if (!prop || !prop.data)
return _emptyArray;
return prop.data.issueTypes;
}
StructureQualityReport.getIssueTypes = getIssueTypes;
function getCifData(model) {
if (!mmcif_1.MmcifFormat.is(model.sourceData))
throw new Error('Data format must be mmCIF.');
return {
residues: (0, schema_1.toTable)(StructureQualityReport.Schema.pdbe_structure_quality_report_issues, model.sourceData.data.frame.categories.pdbe_structure_quality_report_issues),
groups: (0, schema_1.toTable)(StructureQualityReport.Schema.pdbe_structure_quality_report_issue_types, model.sourceData.data.frame.categories.pdbe_structure_quality_report_issue_types),
};
}
})(StructureQualityReport || (StructureQualityReport = {}));
exports.StructureQualityReport = StructureQualityReport;
exports.StructureQualityReportParams = {
serverUrl: param_definition_1.ParamDefinition.Text(StructureQualityReport.DefaultServerUrl, { description: 'JSON API Server URL' })
};
exports.StructureQualityReportProvider = custom_model_property_1.CustomModelProperty.createProvider({
label: 'Structure Quality Report',
descriptor: (0, custom_property_1.CustomPropertyDescriptor)({
name: 'pdbe_structure_quality_report',
cifExport: {
prefix: 'pdbe',
context: function (ctx) {
return createExportContext(ctx);
},
categories: [
wrapper_1.PropertyWrapper.defaultInfoCategory('pdbe_structure_quality_report', function (ctx) { return ctx.info; }),
{
name: 'pdbe_structure_quality_report_issues',
instance: function (ctx) {
return {
fields: _structure_quality_report_issues_fields,
source: ctx.models.map(function (data) { return ({ data: data, rowCount: data.elements.length }); })
};
}
}, {
name: 'pdbe_structure_quality_report_issue_types',
instance: function (ctx) {
return cif_1.CifWriter.Category.ofTable(ctx.issueTypes);
}
}
]
},
symbols: {
issueCount: compiler_1.QuerySymbolRuntime.Dynamic((0, symbol_1.CustomPropSymbol)('pdbe', 'structure-quality.issue-count', type_1.Type.Num), function (ctx) { return StructureQualityReport.getIssues(ctx.element).length; }),
// TODO: add (hasIssue :: IssueType(extends string) -> boolean) symbol
}
}),
type: 'static',
defaultParams: exports.StructureQualityReportParams,
getParams: function (data) { return exports.StructureQualityReportParams; },
isApplicable: function (data) { return StructureQualityReport.isApplicable(data); },
obtain: function (ctx, data, props) { return (0, tslib_1.__awaiter)(void 0, void 0, void 0, function () {
var p;
return (0, tslib_1.__generator)(this, function (_a) {
switch (_a.label) {
case 0:
p = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, param_definition_1.ParamDefinition.getDefaultValues(exports.StructureQualityReportParams)), props);
return [4 /*yield*/, StructureQualityReport.fromCifOrServer(ctx, data, p)];
case 1: return [2 /*return*/, _a.sent()];
}
});
}); }
});
var _structure_quality_report_issues_fields = cif_1.CifWriter.fields()
.index('id')
.many((0, atom_site_1.residueIdFields)(function (i, d) { return d.elements[i]; }, { includeModelNum: true }))
.int('issue_type_group_id', function (i, d) { return d.groupId[i]; })
.getFields();
function createExportContext(ctx) {
var groupMap = new Map();
var models = [];
var group_id = [], issue_type = [];
var info = wrapper_1.PropertyWrapper.createInfo();
for (var _i = 0, _a = ctx.structures; _i < _a.length; _i++) {
var s = _a[_i];
var prop = exports.StructureQualityReportProvider.get(s.model).value;
if (prop)
info = prop.info;
if (!prop || !prop.data)
continue;
var _b = prop.data.issues.getElements(s), elements = _b.elements, property = _b.property;
if (elements.length === 0)
continue;
var elementGroupId = [];
for (var i = 0; i < elements.length; i++) {
var issues = property(i);
var key = issues.join(',');
if (!groupMap.has(key)) {
var idx = groupMap.size + 1;
groupMap.set(key, idx);
for (var _c = 0, issues_1 = issues; _c < issues_1.length; _c++) {
var issue = issues_1[_c];
group_id.push(idx);
issue_type.push(issue);
}
}
elementGroupId[i] = groupMap.get(key);
}
models.push({ elements: elements, groupId: elementGroupId });
}
return {
info: info,
models: models,
issueTypes: db_1.Table.ofArrays(StructureQualityReport.Schema.pdbe_structure_quality_report_issue_types, { group_id: group_id, issue_type: issue_type })
};
}
function createIssueMapFromJson(modelData, data) {
var ret = new Map();
if (!data.molecules)
return;
var issueTypes = [];
for (var _i = 0, _a = data.molecules; _i < _a.length; _i++) {
var entity = _a[_i];
var entity_id = entity.entity_id.toString();
for (var _b = 0, _c = entity.chains; _b < _c.length; _b++) {
var chain = _c[_b];
var asym_id = chain.struct_asym_id.toString();
for (var _d = 0, _e = chain.models; _d < _e.length; _d++) {
var model = _e[_d];
var model_id = model.model_id.toString();
if (+model_id !== modelData.modelNum)
continue;
for (var _f = 0, _g = model.residues; _f < _g.length; _f++) {
var residue = _g[_f];
var auth_seq_id = residue.author_residue_number, ins_code = residue.author_insertion_code || '';
var idx = modelData.atomicHierarchy.index.findResidue(entity_id, asym_id, auth_seq_id, ins_code);
ret.set(idx, residue.outlier_types);
for (var _h = 0, _j = residue.outlier_types; _h < _j.length; _h++) {
var t = _j[_h];
(0, array_1.arraySetAdd)(issueTypes, t);
}
}
}
}
}
return {
issues: structure_1.IndexedCustomProperty.fromResidueMap(ret),
issueTypes: issueTypes
};
}
function createIssueMapFromCif(modelData, residueData, groupData) {
var ret = new Map();
var label_entity_id = residueData.label_entity_id, label_asym_id = residueData.label_asym_id, auth_seq_id = residueData.auth_seq_id, pdbx_PDB_ins_code = residueData.pdbx_PDB_ins_code, issue_type_group_id = residueData.issue_type_group_id, pdbx_PDB_model_num = residueData.pdbx_PDB_model_num, _rowCount = residueData._rowCount;
var groups = parseIssueTypes(groupData);
for (var i = 0; i < _rowCount; i++) {
if (pdbx_PDB_model_num.value(i) !== modelData.modelNum)
continue;
var idx = modelData.atomicHierarchy.index.findResidue(label_entity_id.value(i), label_asym_id.value(i), auth_seq_id.value(i), pdbx_PDB_ins_code.value(i));
ret.set(idx, groups.get(issue_type_group_id.value(i)));
}
var issueTypes = [];
groups.forEach(function (issues) {
for (var _i = 0, issues_2 = issues; _i < issues_2.length; _i++) {
var t = issues_2[_i];
(0, array_1.arraySetAdd)(issueTypes, t);
}
});
return {
issues: structure_1.IndexedCustomProperty.fromResidueMap(ret),
issueTypes: issueTypes
};
}
function parseIssueTypes(groupData) {
var ret = new Map();
var group_id = groupData.group_id, issue_type = groupData.issue_type;
for (var i = 0; i < groupData._rowCount; i++) {
var group = void 0;
var id = group_id.value(i);
if (ret.has(id))
group = ret.get(id);
else {
group = [];
ret.set(id, group);
}
group.push(issue_type.value(i));
}
return ret;
}
//# sourceMappingURL=prop.js.map
;