UNPKG

drugflow-molstar

Version:
182 lines (181 loc) 9.54 kB
"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); }