UNPKG

drugflow-molstar

Version:
853 lines 75.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var react18_1 = require("molstar/lib/mol-plugin-ui/react18"); var transforms_1 = require("molstar/lib/mol-plugin-state/transforms"); var structure_representation_params_1 = require("molstar/lib/mol-plugin-state/helpers/structure-representation-params"); var commands_1 = require("molstar/lib/mol-plugin/commands"); var spec_1 = require("molstar/lib/mol-plugin-ui/spec"); var model_index_1 = require("molstar/lib/mol-plugin-state/animation/built-in/model-index"); var loci_1 = require("molstar/lib/mol-model/loci"); var helpers_1 = require("./helpers"); var rx_event_helper_1 = require("molstar/lib/mol-util/rx-event-helper"); var structure_1 = require("molstar/lib/mol-model/structure"); var builder_1 = require("molstar/lib/mol-script/language/builder"); var structure_selection_query_1 = require("molstar/lib/mol-plugin-state/helpers/structure-selection-query"); var mol_task_1 = require("molstar/lib/mol-task"); var color_1 = require("molstar/lib/mol-util/color/color"); var structure_2 = require("molstar/lib/mol-model/structure"); var mol_state_1 = require("molstar/lib/mol-state"); var representation_1 = require("molstar/lib/mol-repr/representation"); var representation_2 = require("molstar/lib/mol-repr/structure/representation"); var units_visual_1 = require("molstar/lib/mol-repr/structure/units-visual"); var param_definition_1 = require("molstar/lib/mol-util/param-definition"); var location_iterator_1 = require("molstar/lib/mol-geo/util/location-iterator"); var location_1 = require("molstar/lib/mol-model/location"); var loci_2 = require("molstar/lib/mol-model/loci"); var box_1 = require("molstar/lib/mol-geo/geometry/mesh/builder/box"); var mesh_builder_1 = require("molstar/lib/mol-geo/geometry/mesh/mesh-builder"); var linear_algebra_1 = require("molstar/lib/mol-math/linear-algebra"); var int_1 = require("molstar/lib/mol-data/int"); var names_1 = require("molstar/lib/mol-util/color/names"); var structure_contact3d_1 = require("./structure_contact3d"); require('molstar/lib/mol-plugin-ui/skin/light.scss'); var DrugflowMolstarPlugin = /** @class */ (function () { function DrugflowMolstarPlugin() { var _this = this; this._ev = rx_event_helper_1.RxEventHelper.create(); this.events = { loadComplete: this._ev() }; this.assemblyRef = ''; this.granularity = 'residue'; this.selected_info = { "all": { "polymer": [], "ligand": [], "other": [] }, "prev": { "polymer": [], "ligand": [], "other": [] }, "now": { "polymer": [], "ligand": [], "other": [] } }; this.isHighlightColorUpdated = false; this.canvas = { toggleControls: function (isVisible) { if (typeof isVisible === 'undefined') isVisible = !_this.plugin.layout.state.showControls; commands_1.PluginCommands.Layout.Update(_this.plugin, { state: { showControls: isVisible } }); }, toggleExpanded: function (isExpanded) { if (typeof isExpanded === 'undefined') isExpanded = !_this.plugin.layout.state.isExpanded; commands_1.PluginCommands.Layout.Update(_this.plugin, { state: { isExpanded: isExpanded } }); }, setBgColor: function (color) { if (!color) return; _this.canvas.applySettings({ color: color }); }, applySettings: function (settings) { if (!settings) return; var rendererParams = {}; if (settings.color) rendererParams['backgroundColor'] = color_1.Color.fromRgb(settings.color.r, settings.color.g, settings.color.b); if (settings.lighting) rendererParams['style'] = { name: settings.lighting }; var renderer = _this.plugin.canvas3d.props.renderer; commands_1.PluginCommands.Canvas3D.SetSettings(_this.plugin, { settings: { renderer: tslib_1.__assign(tslib_1.__assign({}, renderer), rendererParams) } }); }, toggleSelect: function (isSelect) { _this.plugin.selectionMode = !isSelect; }, }; this.measure = { add_distance: function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { var loci; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: loci = this.plugin.managers.structure.selection.additionsHistory; if (loci.length < 2) { console.log('please select two atoms'); return [2 /*return*/]; } return [4 /*yield*/, this.plugin.managers.structure.measurement.addDistance(loci[0].loci, loci[1].loci)]; case 1: _b.sent(); return [2 /*return*/]; } }); }); }, add_angle: function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { var loci; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: loci = this.plugin.managers.structure.selection.additionsHistory; if (loci.length < 3) { console.log('please select three atoms'); return [2 /*return*/]; } return [4 /*yield*/, this.plugin.managers.structure.measurement.addAngle(loci[0].loci, loci[1].loci, loci[2].loci)]; case 1: _b.sent(); return [2 /*return*/]; } }); }); }, add_dihedral: function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { var loci; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: loci = this.plugin.managers.structure.selection.additionsHistory; if (loci.length < 4) { console.log('please select four atoms'); return [2 /*return*/]; } return [4 /*yield*/, this.plugin.managers.structure.measurement.addDihedral(loci[0].loci, loci[1].loci, loci[2].loci, loci[3].loci)]; case 1: _b.sent(); return [2 /*return*/]; } }); }); }, add_orientation: function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { var locis; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: locis = []; this.plugin.managers.structure.selection.entries.forEach(function (v) { locis.push(v.selection); }); return [4 /*yield*/, this.plugin.managers.structure.measurement.addOrientation(locis)]; case 1: _b.sent(); return [2 /*return*/]; } }); }); }, add_plane: function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { var locis; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: locis = []; this.plugin.managers.structure.selection.entries.forEach(function (v) { locis.push(v.selection); }); return [4 /*yield*/, this.plugin.managers.structure.measurement.addPlane(locis)]; case 1: _b.sent(); return [2 /*return*/]; } }); }); }, clean_all_measure: function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { var state, groupRef, builder; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: state = this.plugin.state.data; groupRef = mol_state_1.StateSelection.findTagInSubtree(state.tree, mol_state_1.StateTransform.RootRef, 'measurement-group'); builder = this.plugin.state.data.build(); if (!groupRef) return [3 /*break*/, 2]; builder.to(mol_state_1.StateTransform.RootRef).delete(groupRef); return [4 /*yield*/, this.applyState(builder)]; case 1: _b.sent(); return [3 /*break*/, 3]; case 2: console.log('no measurement group'); _b.label = 3; case 3: return [2 /*return*/]; } }); }); } }; this.visual = { select_all: function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { var all_query, data; var _this = this; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: all_query = structure_selection_query_1.StructureSelectionQueries.all; data = this.plugin.state.data.select(this.assemblyRef)[0].obj.data; return [4 /*yield*/, this.plugin.runTask(mol_task_1.Task.create('Structure Selection', function (runtime) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var selection, loci; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, all_query.getSelection(this.plugin, runtime, data)]; case 1: selection = _b.sent(); loci = structure_1.StructureSelection.toLociWithSourceUnits(selection); this.plugin.managers.interactivity.lociSelects.select({ loci: loci }); return [2 /*return*/]; } }); }); }))]; case 1: _b.sent(); this.add_selection_info(); return [2 /*return*/]; } }); }); }, select_none: function () { _this.plugin.managers.interactivity.lociSelects.deselectAll(); _this.add_selection_info(); }, expand_select: function (expand, type) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var whole_residues, surroundings_query, data; var _this = this; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: whole_residues = true; if (type) { if (type === 'atom') whole_residues = false; } surroundings_query = (0, structure_selection_query_1.StructureSelectionQuery)('Surrounding of Selection', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.modifier.exceptBy({ 0: builder_1.MolScriptBuilder.struct.modifier.includeSurroundings({ 0: builder_1.MolScriptBuilder.internal.generator.current(), radius: expand, 'as-whole-residues': whole_residues }), by: builder_1.MolScriptBuilder.internal.generator.current() }) ]), { description: 'Select surrounding of the current selection.', category: structure_selection_query_1.StructureSelectionCategory.Manipulate, referencesCurrent: true }); data = this.plugin.state.data.select(this.assemblyRef)[0].obj.data; return [4 /*yield*/, this.plugin.runTask(mol_task_1.Task.create('Structure Selection', function (runtime) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var selection, loci; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, surroundings_query.getSelection(this.plugin, runtime, data)]; case 1: selection = _b.sent(); loci = structure_1.StructureSelection.toLociWithSourceUnits(selection); this.plugin.managers.interactivity.lociSelects.select({ loci: loci }); return [2 /*return*/]; } }); }); }))]; case 1: _b.sent(); this.add_selection_info(); return [2 /*return*/]; } }); }); }, deselect_current: function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { var current_query, data; var _this = this; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: current_query = structure_selection_query_1.StructureSelectionQueries.current; data = this.plugin.state.data.select(this.assemblyRef)[0].obj.data; return [4 /*yield*/, this.plugin.runTask(mol_task_1.Task.create('Structure Selection', function (runtime) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var current_selection, current_loci; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, current_query.getSelection(this.plugin, runtime, data)]; case 1: current_selection = _b.sent(); current_loci = structure_1.StructureSelection.toLociWithSourceUnits(current_selection); this.plugin.managers.interactivity.lociSelects.deselect({ loci: current_loci }); return [2 /*return*/]; } }); }); }))]; case 1: _b.sent(); return [2 /*return*/]; } }); }); }, inverse_select: function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { var current_query, inverse_query, data; var _this = this; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: current_query = structure_selection_query_1.StructureSelectionQueries.current; inverse_query = structure_selection_query_1.StructureSelectionQueries.complement; data = this.plugin.state.data.select(this.assemblyRef)[0].obj.data; return [4 /*yield*/, this.plugin.runTask(mol_task_1.Task.create('Structure Selection', function (runtime) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var current_selection, inverse_selection, current_loci, inverse_loci; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, current_query.getSelection(this.plugin, runtime, data)]; case 1: current_selection = _b.sent(); return [4 /*yield*/, inverse_query.getSelection(this.plugin, runtime, data)]; case 2: inverse_selection = _b.sent(); current_loci = structure_1.StructureSelection.toLociWithSourceUnits(current_selection); inverse_loci = structure_1.StructureSelection.toLociWithSourceUnits(inverse_selection); this.plugin.managers.interactivity.lociSelects.select({ loci: inverse_loci }); this.plugin.managers.interactivity.lociSelects.deselect({ loci: current_loci }); return [2 /*return*/]; } }); }); }))]; case 1: _b.sent(); this.add_selection_info(); return [2 /*return*/]; } }); }); }, hideSelect: function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { var sel, components, _i, sel_1, s; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: sel = this.plugin.managers.structure.hierarchy.getStructuresWithSelection(); components = []; for (_i = 0, sel_1 = sel; _i < sel_1.length; _i++) { s = sel_1[_i]; components.push.apply(components, s.components); } if (components.length === 0) return [2 /*return*/]; return [4 /*yield*/, this.plugin.managers.structure.component.modifyByCurrentSelection(components, 'subtract')]; case 1: _b.sent(); this.update_selected_info(); return [2 /*return*/]; } }); }); }, show_all: function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { var ret_number, need_recreate, ret, update_tree; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, this.visual.deselect_current()]; case 1: _b.sent(); ret_number = 0; need_recreate = { 'polymer': false, 'ligand': false, 'water': false }; return [4 /*yield*/, this.visual.show_prev()]; case 2: ret = _b.sent(); return [4 /*yield*/, this.visual.select(this.selected_info.all.polymer)]; case 3: _b.sent(); return [4 /*yield*/, this.visual._showSelect('Polymer')]; case 4: ret_number = _b.sent(); if (ret_number !== 0) { need_recreate['polymer'] = true; ret['polymer'] = true; } return [4 /*yield*/, this.visual.deselect_current() // 调用showSelect // 再对ligand进行选中 ]; case 5: _b.sent(); // 调用showSelect // 再对ligand进行选中 return [4 /*yield*/, this.visual.select(this.selected_info.all.ligand)]; case 6: // 调用showSelect // 再对ligand进行选中 _b.sent(); return [4 /*yield*/, this.visual._showSelect('Ligand')]; case 7: ret_number = _b.sent(); if (ret_number !== 0) { need_recreate['ligand'] = true; ret['ligand'] = true; } return [4 /*yield*/, this.visual.deselect_current() // 调用showSelect // 再对other进行选中 ]; case 8: _b.sent(); // 调用showSelect // 再对other进行选中 return [4 /*yield*/, this.visual.select(this.selected_info.all.other)]; case 9: // 调用showSelect // 再对other进行选中 _b.sent(); return [4 /*yield*/, this.visual._showSelect('Water')]; case 10: ret_number = _b.sent(); if (ret_number !== 0) { need_recreate['water'] = true; ret['water'] = true; } return [4 /*yield*/, this.visual.deselect_current()]; case 11: _b.sent(); this.selected_info.all = { "polymer": [], "ligand": [], "other": [] }; return [4 /*yield*/, this.create_structure_and_component(undefined, 'default', '0', need_recreate.polymer, need_recreate.ligand, need_recreate.water, false, '', '')]; case 12: update_tree = _b.sent(); return [4 /*yield*/, this.applyState(update_tree)]; case 13: _b.sent(); return [2 /*return*/, ret]; } }); }); }, show_prev: function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { var ret_number, need_recreate, update_tree; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: ret_number = 0; need_recreate = { 'polymer': false, 'ligand': false, 'water': false }; return [4 /*yield*/, this.visual.deselect_current()]; case 1: _b.sent(); console.log('prev', this.selected_info.prev); return [4 /*yield*/, this.visual.select(this.selected_info.prev.polymer)]; case 2: _b.sent(); return [4 /*yield*/, this.visual._showSelect('Polymer')]; case 3: ret_number = _b.sent(); if (ret_number !== 0) { need_recreate['polymer'] = true; } return [4 /*yield*/, this.visual.deselect_current()]; case 4: _b.sent(); return [4 /*yield*/, this.visual.select(this.selected_info.prev.ligand)]; case 5: _b.sent(); return [4 /*yield*/, this.visual._showSelect('Ligand')]; case 6: ret_number = _b.sent(); if (ret_number !== 0) { need_recreate['ligand'] = true; } return [4 /*yield*/, this.visual.deselect_current()]; case 7: _b.sent(); return [4 /*yield*/, this.visual.select(this.selected_info.prev.other)]; case 8: _b.sent(); return [4 /*yield*/, this.visual._showSelect('Water')]; case 9: ret_number = _b.sent(); if (ret_number !== 0) { need_recreate['water'] = true; } return [4 /*yield*/, this.visual.deselect_current()]; case 10: _b.sent(); this.selected_info.prev = { "polymer": [], "ligand": [], "other": [] }; return [4 /*yield*/, this.create_structure_and_component(undefined, 'default', '0', need_recreate.polymer, need_recreate.ligand, need_recreate.water, false, '', '')]; case 11: update_tree = _b.sent(); return [4 /*yield*/, this.applyState(update_tree)]; case 12: _b.sent(); return [2 /*return*/, need_recreate]; } }); }); }, _showSelect: function (type) { if (type === void 0) { type = 'Polymer'; } return tslib_1.__awaiter(_this, void 0, void 0, function () { var sel, components, _i, sel_1, s, _j, _a, c; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: sel = this.plugin.managers.structure.hierarchy.getStructuresWithSelection(); if (sel.length === 0) { console.log('sel is empty, ok'); return [2 /*return*/, 0]; } components = []; for (_i = 0, sel_1 = sel; _i < sel_1.length; _i++) { s = sel_1[_i]; for (_j = 0, _a = s.components; _j < _a.length; _j++) { c = _a[_j]; if (c.key !== type) continue; components.push(c); } // if (s.components.key !== type) continue; // components.push.apply(components, s.components); } if (components.length === 0) { console.log('components is empty, need recreate'); return [2 /*return*/, -1]; } console.log('showSelect components', components); return [4 /*yield*/, this.plugin.managers.structure.component.modifyByCurrentSelection(components, 'union')]; case 1: _b.sent(); return [4 /*yield*/, this.visual.deselect_current()]; case 2: _b.sent(); this.add_selection_info(); return [2 /*return*/, 0]; } }); }); }, changeProps: function (val) { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_b) { //todo 切换选中粒度 this.plugin.managers.interactivity.setProps({ granularity: val }); this.granularity = val; return [2 /*return*/]; }); }); }, toggleSpin: function (isSpinning, resetCamera) { if (!_this.plugin.canvas3d) return; var trackball = _this.plugin.canvas3d.props.trackball; var toggleSpinParam = trackball.animate.name === 'spin' ? { name: 'off', params: {} } : { name: 'spin', params: { speed: 1 } }; if (typeof isSpinning !== 'undefined') { toggleSpinParam = { name: 'off', params: {} }; if (isSpinning) toggleSpinParam = { name: 'spin', params: { speed: 1 } }; } commands_1.PluginCommands.Canvas3D.SetSettings(_this.plugin, { settings: { trackball: tslib_1.__assign(tslib_1.__assign({}, trackball), { animate: toggleSpinParam }) } }); if (resetCamera) commands_1.PluginCommands.Camera.Reset(_this.plugin, {}); }, focus: function (params, structureNumber, expand_num) { var loci = _this.getLociForParams(params, structureNumber); if (expand_num) { _this.plugin.managers.camera.focusLoci(loci, { extraRadius: expand_num }); } else { _this.plugin.managers.camera.focusLoci(loci); } }, get_current_loci: function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { var current_query, data, ret; var _this = this; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: current_query = structure_selection_query_1.StructureSelectionQueries.current; data = this.plugin.state.data.select(this.assemblyRef)[0].obj.data; ret = loci_1.EmptyLoci; return [4 /*yield*/, this.plugin.runTask(mol_task_1.Task.create('Structure Selection', function (runtime) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var current_selection; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, current_query.getSelection(this.plugin, runtime, data)]; case 1: current_selection = _b.sent(); ret = structure_1.StructureSelection.toLociWithSourceUnits(current_selection); return [2 /*return*/]; } }); }); }))]; case 1: _b.sent(); return [2 /*return*/, ret]; } }); }); }, focus_loci: function (loci) { _this.plugin.managers.camera.focusLoci(loci); }, focus_now: function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { var current_query, data; var _this = this; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: current_query = structure_selection_query_1.StructureSelectionQueries.current; data = this.plugin.state.data.select(this.assemblyRef)[0].obj.data; return [4 /*yield*/, this.plugin.runTask(mol_task_1.Task.create('Structure Selection', function (runtime) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var current_selection, current_loci; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, current_query.getSelection(this.plugin, runtime, data)]; case 1: current_selection = _b.sent(); current_loci = structure_1.StructureSelection.toLociWithSourceUnits(current_selection); this.plugin.managers.camera.focusLoci(current_loci); return [2 /*return*/]; } }); }); }))]; case 1: _b.sent(); return [2 /*return*/]; } }); }); }, select: function (params, deselect) { if (deselect === void 0) { deselect = false; } var loci = _this.getLociForParams(params); if (loci_1.Loci.isEmpty(loci)) return; if (deselect) { _this.plugin.managers.interactivity.lociSelects.deselect({ loci: loci }); } else { _this.plugin.managers.interactivity.lociSelects.select({ loci: loci }); } _this.add_selection_info(); }, camera_reset: function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, commands_1.PluginCommands.Camera.Reset(this.plugin, { durationMs: 250 })]; case 1: _b.sent(); return [2 /*return*/]; } }); }); } }; this.ArbitrarySphereVisuals = { 'arbitrary-sphere': function (ctx, getParams) { return (0, representation_2.UnitsRepresentation)('Arbitrary sphere mesh', ctx, getParams, _this.ArbitrarySphereVisual); } }; this.ArbitrarySphereParams = tslib_1.__assign(tslib_1.__assign({}, units_visual_1.UnitsMeshParams), { x: param_definition_1.ParamDefinition.Numeric(0), y: param_definition_1.ParamDefinition.Numeric(0), z: param_definition_1.ParamDefinition.Numeric(0), l1: param_definition_1.ParamDefinition.Numeric(1), l2: param_definition_1.ParamDefinition.Numeric(1), l3: param_definition_1.ParamDefinition.Numeric(1) }); this.ArbitrarySphereVisual = function (materialId) { return (0, units_visual_1.UnitsMeshVisual)({ defaultProps: param_definition_1.ParamDefinition.getDefaultValues(_this.ArbitrarySphereParams), createGeometry: _this.createArbitrarySphereMesh, createLocationIterator: function (structureGroup) { return (0, location_iterator_1.LocationIterator)(1, structureGroup.group.units.length, 1, function () { return location_1.NullLocation; }); }, getLoci: function (pickingId, structureGroup, id) { var objectId = pickingId.objectId; if (objectId !== id) return loci_1.EmptyLoci; return (0, loci_2.DataLoci)('arbitrary-sphere-data-loci', void 0, [0], void 0, function () { return "Box"; }); }, eachLocation: function (loci, structureGroup, apply) { if (loci.kind === 'data-loci' && loci.tag === 'arbitrary-sphere-data-loci') { return apply(int_1.Interval.ofBounds(0, 1)); } return false; }, setUpdateState: function (state, newProps, currentProps) { state.createGeometry = (newProps.x !== currentProps.x || newProps.y !== currentProps.y || newProps.z !== currentProps.z || newProps.l1 !== currentProps.l1 || newProps.l2 !== currentProps.l2 || newProps.l3 !== currentProps.l3); } }, materialId); }; this.ConfalPyramidsRepresentation = function (ctx, getParams) { return representation_1.Representation.createMulti('Confal Pyramids', ctx, getParams, representation_2.StructureRepresentationStateBuilder, _this.ArbitrarySphereVisuals); }; this.ArbitrarySphereRepresentationProvider = (0, representation_2.StructureRepresentationProvider)({ name: 'arbitrary-sphere', label: 'Arbitrary sphere', description: 'Displays an arbitrary sphere at given coordinates', factory: this.ConfalPyramidsRepresentation, getParams: function (ctx, structure) { return param_definition_1.ParamDefinition.clone(_this.ArbitrarySphereParams); }, defaultValues: param_definition_1.ParamDefinition.getDefaultValues(this.ArbitrarySphereParams), defaultColorTheme: { name: 'uniform' }, defaultSizeTheme: { name: 'uniform' }, isApplicable: function (structure) { return true; } }); this.createArbitrarySphereMesh = function (ctx, unit, structure, theme, props, mesh) { var mb = mesh_builder_1.MeshBuilder.createState(16, 16, mesh); mb.currentGroup = 0; var min = (0, linear_algebra_1.Vec3)(); var max = (0, linear_algebra_1.Vec3)(); min[0] = props.x - (props.l1 / 2); min[1] = props.y - (props.l2 / 2); min[2] = props.z - (props.l3 / 2); max[0] = props.x + (props.l1 / 2); max[1] = props.y + (props.l2 / 2); max[2] = props.z + (props.l3 / 2); // addSphere(mb, position, props.radius, 2) (0, box_1.addBoundingBox)(mb, { min: min, max: max }, 0.1, 1, 1); return mesh_builder_1.MeshBuilder.getMesh(mb); }; } DrugflowMolstarPlugin.prototype.init = function (targetElement, params) { return tslib_1.__awaiter(this, void 0, void 0, function () { var init_params, _b; return tslib_1.__generator(this, function (_c) { switch (_c.label) { case 0: init_params = tslib_1.__assign(tslib_1.__assign({}, (0, spec_1.DefaultPluginUISpec)()), { animations: [ model_index_1.AnimateModelIndex ], layout: { initial: { isExpanded: false, showControls: true } }, components: { controls: { top: 'none', left: 'none', right: 'none', bottom: 'none' }, remoteState: 'none' } }); if (params.if_sequence_panel) { delete init_params.components.controls.top; } _b = this; return [4 /*yield*/, (0, react18_1.createPluginUI)(targetElement, init_params)]; case 1: _b.plugin = _c.sent(); this.plugin.representation.structure.registry.add(this.ArbitrarySphereRepresentationProvider); return [2 /*return*/]; } }); }); }; Object.defineProperty(DrugflowMolstarPlugin.prototype, "state", { get: function () { return this.plugin.state.data; }, enumerable: false, configurable: true }); DrugflowMolstarPlugin.prototype.applyState = function (tree) { return commands_1.PluginCommands.State.Update(this.plugin, { state: this.plugin.state.data, tree: tree }); }; DrugflowMolstarPlugin.prototype.recreate_s_c = function (recreate_params) { return tslib_1.__awaiter(this, void 0, void 0, function () { var update_tree; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: update_tree = this.create_structure_and_component(undefined, 'default', '0', recreate_params.polymer, recreate_params.ligand, recreate_params.water, false, '', ''); return [4 /*yield*/, this.applyState(update_tree)]; case 1: _b.sent(); return [2 /*return*/]; } }); }); }; DrugflowMolstarPlugin.prototype.create_ligand_view = function (s, ligand_id, if_all_ligand, chain_id, ligand_res_id, ligand_name) { var ligand_query; if (ligand_name) { ligand_query = (0, structure_selection_query_1.StructureSelectionQuery)('Ligand_' + ligand_name, builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'chain-test': builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('auth_asym_id'), chain_id]), 'residue-test': builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('auth_comp_id'), ligand_name.toUpperCase()]) }) ]), { description: 'Ligand_' + ligand_name, category: structure_selection_query_1.StructureSelectionCategory.Manipulate, referencesCurrent: true }); } else { if (if_all_ligand) { ligand_query = structure_selection_query_1.StructureSelectionQueries.ligand; } else { ligand_query = (0, structure_selection_query_1.StructureSelectionQuery)('Ligand_' + ligand_res_id, builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'chain-test': builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('auth_asym_id'), chain_id]), 'residue-test': builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('auth_seq_id'), Number(ligand_res_id)]) }) ]), { description: 'Ligand_' + ligand_res_id, category: structure_selection_query_1.StructureSelectionCategory.Manipulate, referencesCurrent: true }); } } var surroundings_query = (0, structure_selection_query_1.StructureSelectionQuery)('Surrounding of Ligand', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.modifier.exceptBy({ 0: builder_1.MolScriptBuilder.struct.modifier.includeSurroundings({ 0: ligand_query.expression, radius: 5, 'as-whole-residues': true }), by: ligand_query.expression }) ]), { description: 'Select surrounding of the current ligand.', category: structure_selection_query_1.StructureSelectionCategory.Manipulate, referencesCurrent: true }); s.apply(transforms_1.StateTransforms.Model.StructureComponent, { type: { name: 'expression', params: ligand_query.expression } }, { ref: 'Ligand_' + ligand_id }); s.apply(transforms_1.StateTransforms.Model.StructureComponent, { type: { name: 'expression', params: surroundings_query.expression } }, { ref: 'Ligand_plus_' + ligand_id }); return s; }; DrugflowMolstarPlugin.prototype.create_tmp_label_comp = function () { return tslib_1.__awaiter(this, void 0, void 0, function () { var current_query, data; var _this = this; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, this.remove_tmp_comp('Label_tmp')]; case 1: _b.sent(); current_query = structure_selection_query_1.StructureSelectionQueries.current; data = this.plugin.state.data.select(this.assemblyRef)[0].obj.data; return [4 /*yield*/, this.plugin.runTask(mol_task_1.Task.create('Create Label', function (runtime) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var s_new, selection, loci, expression; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: s_new = this.plugin.state.data.build().to('Structure_0'); return [4 /*yield*/, current_query.getSelection(this.plugin, runtime, data)]; case 1: selection = _b.sent(); loci = structure_1.StructureSelection.toLociWithSourceUnits(selection); expression = structure_2.StructureElement.Loci.toExpression(loci); s_new.apply(transforms_1.StateTransforms.Model.StructureComponent, { type: { name: 'expression', params: expression } }, { ref: 'Label_tmp' }); return [4 /*yield*/, this.applyState(s_new)]; case 2: _b.sent(); return [2 /*return*/]; } }); }); }))]; case 2: _b.sent(); return [2 /*return*/]; } }); }); }; DrugflowMolstarPlugin.prototype.create_surf_comp = function (name) { if (name === void 0) { name = 'tmp'; } return tslib_1.__awaiter(this, void 0, void 0, function () { var current_query, data; var _this = this; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: current_query = structure_selection_query_1.StructureSelectionQueries.current; data = this.plugin.state.data.select(this.assemblyRef)[0].obj.data; return [4 /*yield*/, this.plugin.runTask(mol_task_1.Task.create('Create Surface', function (runtime)