drugflow-molstar
Version:
Molstar implementation for DrugFlow
182 lines (181 loc) • 9.54 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.applyAFTransparency = applyAFTransparency;
exports.setStructureTransparency = setStructureTransparency;
exports.clearStructureTransparency = clearStructureTransparency;
var tslib_1 = require("tslib");
var structure_1 = require("Molstar/mol-model/structure");
var transforms_1 = require("Molstar/mol-plugin-state/transforms");
var mol_state_1 = require("Molstar/mol-state");
var loci_1 = require("Molstar/mol-model/loci");
var transparency_1 = require("Molstar/mol-theme/transparency");
var builder_1 = require("Molstar/mol-script/language/builder");
var prop_1 = require("Molstar/extensions/model-archive/quality-assessment/prop");
var compiler_1 = require("Molstar/mol-script/runtime/query/compiler");
var structure_2 = require("Molstar/mol-model/structure");
var TransparencyManagerTag = 'transparency-controls';
function getLociByPLDDT(score, contextData) {
var queryExp = builder_1.MolScriptBuilder.struct.modifier.union([
builder_1.MolScriptBuilder.struct.modifier.wholeResidues([
builder_1.MolScriptBuilder.struct.modifier.union([
builder_1.MolScriptBuilder.struct.generator.atomGroups({
'chain-test': builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('objectPrimitive'), 'atomistic']),
'residue-test': builder_1.MolScriptBuilder.core.rel.lte([prop_1.QualityAssessment.symbols.pLDDT.symbol(), score]),
})
])
])
]);
var query = (0, compiler_1.compile)(queryExp);
var sel = query(new structure_2.QueryContext(contextData));
return structure_2.StructureSelection.toLociWithSourceUnits(sel);
}
function applyAFTransparency(plugin_1, structure_3, transparency_2) {
return tslib_1.__awaiter(this, arguments, void 0, function (plugin, structure, transparency, pLDDT) {
var _this = this;
if (pLDDT === void 0) { pLDDT = 70; }
return tslib_1.__generator(this, function (_a) {
return [2 /*return*/, plugin.dataTransaction(function (ctx) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
var loci;
var _a;
return tslib_1.__generator(this, function (_b) {
switch (_b.label) {
case 0:
loci = getLociByPLDDT(pLDDT, (_a = structure.cell.obj) === null || _a === void 0 ? void 0 : _a.data);
return [4 /*yield*/, setStructureTransparency(plugin, structure.components, transparency, loci)];
case 1:
_b.sent();
return [2 /*return*/];
}
});
}); }, { canUndo: 'Apply Transparency' })];
});
});
}
function setStructureTransparency(plugin, components, value, loci, types) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var _this = this;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, eachRepr(plugin, components, function (update, repr, transparencyCell) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
var structure, layer, bundleLayers, filtered, filtered;
return tslib_1.__generator(this, function (_a) {
if (types && types.length > 0 && !types.includes(repr.params.values.type.name))
return [2 /*return*/];
structure = repr.obj.data.sourceData;
if (loci_1.Loci.isEmpty(loci) || (0, loci_1.isEmptyLoci)(loci))
return [2 /*return*/];
layer = {
bundle: structure_1.StructureElement.Bundle.fromLoci(loci),
value: value,
};
if (transparencyCell) {
bundleLayers = tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(transparencyCell.params.values.layers), false), [layer], false);
filtered = getFilteredBundle(bundleLayers, structure);
update.to(transparencyCell).update(transparency_1.Transparency.toBundle(filtered));
}
else {
filtered = getFilteredBundle([layer], structure);
update.to(repr.transform.ref)
.apply(transforms_1.StateTransforms.Representation.TransparencyStructureRepresentation3DFromBundle, transparency_1.Transparency.toBundle(filtered), { tags: TransparencyManagerTag });
}
return [2 /*return*/];
});
}); })];
case 1:
_a.sent();
return [2 /*return*/];
}
});
});
}
function clearStructureTransparency(plugin, components, types) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var _this = this;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, eachRepr(plugin, components, function (update, repr, transparencyCell) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
if (types && types.length > 0 && !types.includes(repr.params.values.type.name))
return [2 /*return*/];
if (transparencyCell) {
update.delete(transparencyCell.transform.ref);
}
return [2 /*return*/];
});
}); })];
case 1:
_a.sent();
return [2 /*return*/];
}
});
});
}
function eachRepr(plugin, components, callback) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var state, update, components_1, components_1_1, c, _a, _b, r, transparency, e_1_1, e_2_1;
var e_2, _c, e_1, _d;
return tslib_1.__generator(this, function (_e) {
switch (_e.label) {
case 0:
state = plugin.state.data;
update = state.build();
_e.label = 1;
case 1:
_e.trys.push([1, 12, 13, 14]);
components_1 = tslib_1.__values(components), components_1_1 = components_1.next();
_e.label = 2;
case 2:
if (!!components_1_1.done) return [3 /*break*/, 11];
c = components_1_1.value;
_e.label = 3;
case 3:
_e.trys.push([3, 8, 9, 10]);
_a = (e_1 = void 0, tslib_1.__values(c.representations)), _b = _a.next();
_e.label = 4;
case 4:
if (!!_b.done) return [3 /*break*/, 7];
r = _b.value;
transparency = state.select(mol_state_1.StateSelection.Generators.ofTransformer(transforms_1.StateTransforms.Representation.TransparencyStructureRepresentation3DFromBundle, r.cell.transform.ref).withTag(TransparencyManagerTag));
return [4 /*yield*/, callback(update, r.cell, transparency[0])];
case 5:
_e.sent();
_e.label = 6;
case 6:
_b = _a.next();
return [3 /*break*/, 4];
case 7: return [3 /*break*/, 10];
case 8:
e_1_1 = _e.sent();
e_1 = { error: e_1_1 };
return [3 /*break*/, 10];
case 9:
try {
if (_b && !_b.done && (_d = _a.return)) _d.call(_a);
}
finally { if (e_1) throw e_1.error; }
return [7 /*endfinally*/];
case 10:
components_1_1 = components_1.next();
return [3 /*break*/, 2];
case 11: return [3 /*break*/, 14];
case 12:
e_2_1 = _e.sent();
e_2 = { error: e_2_1 };
return [3 /*break*/, 14];
case 13:
try {
if (components_1_1 && !components_1_1.done && (_c = components_1.return)) _c.call(components_1);
}
finally { if (e_2) throw e_2.error; }
return [7 /*endfinally*/];
case 14: return [2 /*return*/, update.commit({ doNotUpdateCurrent: true })];
}
});
});
}
/** filter transparency layers for given structure */
function getFilteredBundle(layers, structure) {
var transparency = transparency_1.Transparency.ofBundle(layers, structure.root);
var merged = transparency_1.Transparency.merge(transparency);
return transparency_1.Transparency.filter(merged, structure);
}