drugflow-molstar
Version:
Molstar implementation for DrugFlow
853 lines • 75.2 kB
JavaScript
"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)