molstar
Version:
A comprehensive macromolecular library.
127 lines (126 loc) • 6.8 kB
JavaScript
/**
* Copyright (c) 2021 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
import { __assign, __awaiter, __generator } from "tslib";
import { ParamDefinition as PD } from '../../../mol-util/param-definition';
import { Unit } from '../../../mol-model/structure';
import { CustomModelProperty } from '../../../mol-model-props/common/custom-model-property';
import { QuerySymbolRuntime } from '../../../mol-script/runtime/query/compiler';
import { CustomPropSymbol } from '../../../mol-script/language/symbol';
import { Type } from '../../../mol-script/language/type';
import { CustomPropertyDescriptor } from '../../../mol-model/custom-property';
import { MmcifFormat } from '../../../mol-model-formats/structure/mmcif';
export { QualityAssessment };
var QualityAssessment;
(function (QualityAssessment) {
var Empty = {
value: {
localMetrics: new Map()
}
};
function isApplicable(model, localMetricName) {
if (!model || !MmcifFormat.is(model.sourceData))
return false;
var db = model.sourceData.data.db;
var hasLocalMetric = (db.ma_qa_metric.id.isDefined &&
db.ma_qa_metric_local.ordinal_id.isDefined);
if (localMetricName && hasLocalMetric) {
for (var i = 0, il = db.ma_qa_metric._rowCount; i < il; i++) {
if (db.ma_qa_metric.mode.value(i) !== 'local')
continue;
if (localMetricName === db.ma_qa_metric.name.value(i))
return true;
}
return false;
}
else {
return hasLocalMetric;
}
}
QualityAssessment.isApplicable = isApplicable;
function obtain(ctx, model, props) {
return __awaiter(this, void 0, void 0, function () {
var _a, ma_qa_metric, ma_qa_metric_local, model_id, label_asym_id, label_seq_id, metric_id, metric_value, index, localMetrics, localNames, i, il, name_1, i, il, labelAsymId, entityIndex, rI, name_2;
return __generator(this, function (_b) {
if (!model || !MmcifFormat.is(model.sourceData))
return [2 /*return*/, Empty];
_a = model.sourceData.data.db, ma_qa_metric = _a.ma_qa_metric, ma_qa_metric_local = _a.ma_qa_metric_local;
model_id = ma_qa_metric_local.model_id, label_asym_id = ma_qa_metric_local.label_asym_id, label_seq_id = ma_qa_metric_local.label_seq_id, metric_id = ma_qa_metric_local.metric_id, metric_value = ma_qa_metric_local.metric_value;
index = model.atomicHierarchy.index;
localMetrics = new Map();
localNames = new Map();
for (i = 0, il = ma_qa_metric._rowCount; i < il; i++) {
if (ma_qa_metric.mode.value(i) !== 'local')
continue;
name_1 = ma_qa_metric.name.value(i);
if (localMetrics.has(name_1)) {
console.warn("local ma_qa_metric with name '".concat(name_1, "' already added"));
continue;
}
localMetrics.set(name_1, new Map());
localNames.set(ma_qa_metric.id.value(i), name_1);
}
for (i = 0, il = ma_qa_metric_local._rowCount; i < il; i++) {
if (model_id.value(i) !== model.modelNum)
continue;
labelAsymId = label_asym_id.value(i);
entityIndex = index.findEntity(labelAsymId);
rI = index.findResidue(model.entities.data.id.value(entityIndex), labelAsymId, label_seq_id.value(i));
name_2 = localNames.get(metric_id.value(i));
localMetrics.get(name_2).set(rI, metric_value.value(i));
}
return [2 /*return*/, {
value: {
localMetrics: localMetrics,
pLDDT: localMetrics.get('pLDDT'),
qmean: localMetrics.get('qmean'),
}
}];
});
});
}
QualityAssessment.obtain = obtain;
QualityAssessment.symbols = {
pLDDT: QuerySymbolRuntime.Dynamic(CustomPropSymbol('ma', 'quality-assessment.pLDDT', Type.Num), function (ctx) {
var _a, _b;
var _c = ctx.element, unit = _c.unit, element = _c.element;
if (!Unit.isAtomic(unit))
return -1;
var qualityAssessment = QualityAssessmentProvider.get(unit.model).value;
return (_b = (_a = qualityAssessment === null || qualityAssessment === void 0 ? void 0 : qualityAssessment.pLDDT) === null || _a === void 0 ? void 0 : _a.get(unit.model.atomicHierarchy.residueAtomSegments.index[element])) !== null && _b !== void 0 ? _b : -1;
}),
qmean: QuerySymbolRuntime.Dynamic(CustomPropSymbol('ma', 'quality-assessment.qmean', Type.Num), function (ctx) {
var _a, _b;
var _c = ctx.element, unit = _c.unit, element = _c.element;
if (!Unit.isAtomic(unit))
return -1;
var qualityAssessment = QualityAssessmentProvider.get(unit.model).value;
return (_b = (_a = qualityAssessment === null || qualityAssessment === void 0 ? void 0 : qualityAssessment.qmean) === null || _a === void 0 ? void 0 : _a.get(unit.model.atomicHierarchy.residueAtomSegments.index[element])) !== null && _b !== void 0 ? _b : -1;
}),
};
})(QualityAssessment || (QualityAssessment = {}));
export var QualityAssessmentParams = {};
export var QualityAssessmentProvider = CustomModelProperty.createProvider({
label: 'QualityAssessment',
descriptor: CustomPropertyDescriptor({
name: 'ma_quality_assessment',
symbols: QualityAssessment.symbols
}),
type: 'static',
defaultParams: QualityAssessmentParams,
getParams: function (data) { return QualityAssessmentParams; },
isApplicable: function (data) { return QualityAssessment.isApplicable(data); },
obtain: function (ctx, data, props) { return __awaiter(void 0, void 0, void 0, function () {
var p;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
p = __assign(__assign({}, PD.getDefaultValues(QualityAssessmentParams)), props);
return [4 /*yield*/, QualityAssessment.obtain(ctx, data, p)];
case 1: return [2 /*return*/, _a.sent()];
}
});
}); }
});