diff --git a/.gitignore b/.gitignore index 24c0589..b915a3b 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ nanome_docking.egg-info/ dist/ *.pyc nanome +nanome_docking/Rh_x64.exe diff --git a/README.md b/README.md index 2628f18..a958dc9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Nanome - Docking -Plugin to dock ligands to a receptor and display the result in Nanome +This Nanome plugin interfaces with a variety of docking softwares to dock ligands to a receptor and display the result in Nanome. ### Installation @@ -33,6 +33,7 @@ In Nanome: - Click on "Ligand", and select ligands to dock - If using Smina, click on "Site", and select which molecule should be used to define the docking site - Choose exhaustiveness, number of results and size of the box to generate around the site molecule (Smina only) +- If visual scoring is turned on, atom size and labels will indicate each atom's contribution to the ligand's score - Click on Run ### License diff --git a/nanome_docking/Docking.py b/nanome_docking/Docking.py index cbcbb85..c11f6a5 100644 --- a/nanome_docking/Docking.py +++ b/nanome_docking/Docking.py @@ -1,7 +1,10 @@ import nanome from ._DockingCalculations import DockingCalculations as Smina from ._DockingCalculationsAutodock4 import DockingCalculations as Autodock4 +from ._DockingCalculationsRhodium import DockingCalculations as Rhodium from ._DockingMenu import DockingMenu +from ._DockingMenuRhodium import DockingMenuRhodium +import functools import sys __metaclass__ = type @@ -19,32 +22,38 @@ def convert_atoms_to_relative_position(complex, mat): class Docking(nanome.PluginInstance): def __init__(self): - self._menu = DockingMenu(self) + self._menu = None self._calculations = None self._autobox = True - # Function called when Nanome connects to the Plugin, after its instantiation + # Called when Nanome connects to the Plugin, after its instantiation def start(self): self._menu.build_menu() if self._autobox == False: self._menu.disable_autobox() + # Request shallow complex (name, position, orientation), to display them in a list self.request_complex_list(self.on_complex_list_received) - # Function called when user clicks on the "Run" button in Nanome + # Called when user clicks on the "Run" button in Nanome def on_run(self): menu = self._menu - if menu._selected_receptor == None or menu._selected_site == None or menu._selected_ligands == []: + # If menu doesn't have Receptor and Ligands selected, open it + # Else, just start docking + if menu.is_ready_for_docking() == False: self.open_menu() else: - self.run_docking(menu._selected_receptor[1], menu._selected_ligands, menu._selected_site[1]) + self.run_docking(menu.get_receptor(), menu.get_ligands(), menu.get_site(), menu.get_params()) + # Called when user click on the "Advanced Settings" button in Nanome def on_advanced_settings(self): nanome.util.Logs.debug("Advanced Settings") self.open_menu() + # Called when a complex is added to the workspace in Nanome def on_complex_added(self): self.request_complex_list(self.on_complex_list_received) + # Called when a complex is removed from the workspace in Nanome def on_complex_removed(self): self.request_complex_list(self.on_complex_list_received) @@ -56,38 +65,69 @@ def open_menu(self): def make_plugin_usable(self): self._menu.make_plugin_usable() - # Function called when Nanome returns the complex list after a request def on_complex_list_received(self, complexes): self._menu.change_complex_list(complexes) - def run_docking(self, receptor, ligand_list, site, params): - has_site = site != None - - def on_complexes_received(complexes): + def combine_ligands_start_docking(self, receptor, site, params, individual_ligands): + combined_ligands = nanome.structure.Complex() + combined_ligands.names = [] + for ligand in individual_ligands: + convert_atoms_to_absolute_position(ligand) + convert_atoms_to_relative_position(ligand, receptor.m_workspace_to_complex) + combined_ligands.names.append(ligand.name) + for molecule in ligand.molecules: + combined_ligands.add_molecule(molecule) + self._calculations.start_docking(receptor, combined_ligands, site, **params) + + def replace_conformer(self, complexes, callback, existing=True): + for i in range(len(complexes)): + complex_index = complexes[i].index + complexes[i] = complexes[i].convert_to_frames() + complexes[i].index = complex_index + + rerequest_complexes = functools.partial(self.request_complexes, [complex.index for complex in complexes], callback) + + request_docking_results = functools.partial(self.request_docking_results, callback) + rerequest_complexes = functools.partial(self.request_complex_list, request_docking_results) if not existing else rerequest_complexes + + self.update_structures_deep(complexes, rerequest_complexes) + + def request_docking_results(self, callback, all_complexes): + docking_results_index = all_complexes[len(all_complexes)-1].index + self.request_complexes([docking_results_index], callback) + + def set_and_convert_structures(self, has_site, params, complexes): + # When deep complexes data are received, unpack them and prepare ligand for docking receptor = complexes[0] + receptor.m_workspace_to_complex = receptor.get_workspace_to_complex_matrix() self._receptor = receptor - m_workspace_to_receptor = receptor.get_workspace_to_complex_matrix() starting_lig_idx = 1 site = None if has_site: site = complexes[1] self._site = site convert_atoms_to_absolute_position(site) - convert_atoms_to_relative_position(site, m_workspace_to_receptor) + convert_atoms_to_relative_position(site, receptor.m_workspace_to_complex) starting_lig_idx = 2 - ligands = nanome.structure.Complex() - for ligand in complexes[starting_lig_idx:]: - convert_atoms_to_absolute_position(ligand) - convert_atoms_to_relative_position(ligand, m_workspace_to_receptor) - for molecule in ligand.molecules: - ligands.add_molecule(molecule) - self._calculations.start_docking(receptor, ligands, site, **params) - + # convert ligands to frame representation + ligands = complexes[starting_lig_idx:] + combine_ligs_and_start_docking = functools.partial(self.combine_ligands_start_docking, receptor, site, params) + self.replace_conformer(ligands, combine_ligs_and_start_docking) + + def run_docking(self, receptor, ligands, site, params): + # Change the plugin to be "unusable" + if self._menu._run_button.unusable == True: + return + self._menu.make_plugin_usable(False) + + # Request complexes to Nanome in this order: [receptor, site (if any), ligand, ligand,...] request_list = [receptor.index] - if has_site: + if site != None: request_list.append(site.index) - request_list += [x.index for x in ligand_list] - self.request_complexes(request_list, on_complexes_received) + request_list += [x.index for x in ligands] + + setup_structures = functools.partial(self.set_and_convert_structures, site != None, params) + self.request_complexes(request_list, setup_structures) # Called every update tick of the Plugin def update(self): @@ -121,14 +161,22 @@ class SminaDocking(Docking): def __init__(self): super(SminaDocking, self).__init__() self._calculations = Smina(self) + self._menu = DockingMenu(self) class Autodock4Docking(Docking): def __init__(self): super(Autodock4Docking, self).__init__() self._calculations = Autodock4(self) + self._menu = DockingMenu(self) self._autobox = False +class RhodiumDocking(Docking): + def __init__(self): + super(RhodiumDocking, self).__init__() + self._calculations = Rhodium(self) + self._menu = DockingMenuRhodium(self) + def main(): name = None @@ -140,8 +188,11 @@ def main(): elif arg == "autodock4": name = "Autodock 4" cl = Autodock4Docking + elif arg == "rhodium": + name = "Rhodium" + cl = RhodiumDocking if name == None: - nanome.util.Logs.error("Please pass the docking software to use as an argument: smina|autodock4") + nanome.util.Logs.error("Please pass the docking software to use as an argument: smina|autodock4|rhodium") sys.exit(1) # Create the plugin, register Docking as the class to instantiate, and start listening diff --git a/nanome_docking/_DockingCalculations.py b/nanome_docking/_DockingCalculations.py index c96c32e..60a4f59 100644 --- a/nanome_docking/_DockingCalculations.py +++ b/nanome_docking/_DockingCalculations.py @@ -1,7 +1,9 @@ import traceback - +import math +import re import nanome import shutil +import gzip import itertools import operator import os @@ -12,6 +14,8 @@ from nanome.util.enums import NotificationTypes +DEBUG = True + SDFOPTIONS = nanome.api.structure.Complex.io.SDFSaveOptions() SDFOPTIONS.write_bonds = True PDBOPTIONS = nanome.api.structure.Complex.io.PDBSaveOptions() @@ -23,18 +27,6 @@ except: pass -def not_dollars(line): - return '$$$$' != line.strip('\n') - -def parse_molecules(file, self): - nanome.util.Logs.debug("Parsing output", file) - with open(file) as lines: - while True: - block = list(itertools.takewhile(not_dollars, lines )) - if not block: - break - yield block + ['$$$$\n'] - class DockingCalculations(): def __init__(self, plugin): self._plugin = plugin @@ -42,20 +34,19 @@ def __init__(self, plugin): self._running = False self._structures_written = False self._started_docking = False + self.requires_site = True def initialize(self): self.temp_dir = tempfile.TemporaryDirectory() self._receptor_input = tempfile.NamedTemporaryFile(delete=False, suffix=".pdb", dir=self.temp_dir.name) self._ligands_input = tempfile.NamedTemporaryFile(delete=False, suffix=".pdb", dir=self.temp_dir.name) - self._ligands_pdb_input = tempfile.NamedTemporaryFile(delete=False, suffix=".pdb", dir=self.temp_dir.name) self._site_input = tempfile.NamedTemporaryFile(delete=False, suffix=".pdb", dir=self.temp_dir.name) self._docking_output = tempfile.NamedTemporaryFile(delete=False, prefix="output", suffix=".sdf", dir=self.temp_dir.name) self._ligand_output = tempfile.NamedTemporaryFile(delete=False, suffix=".pdb", dir=self.temp_dir.name) self._log_file = tempfile.NamedTemporaryFile(delete=False, dir=self.temp_dir.name) - - def start_docking(self, receptor, ligands, site, exhaustiveness, modes, align, replace, scoring, autobox): + def start_docking(self, receptor, ligands, site, exhaustiveness, modes, align, replace, scoring, visual_scores, autobox): self._exhaustiveness = exhaustiveness self._modes = modes self._receptor = receptor @@ -64,6 +55,7 @@ def start_docking(self, receptor, ligands, site, exhaustiveness, modes, align, r self._align = align self._replace = replace self._scoring = scoring + self._visual_scores = visual_scores self._autobox = autobox # Start docking process @@ -92,9 +84,9 @@ def write_structures_to_file(self): self._receptor.io.to_pdb(self._receptor_input.name, PDBOPTIONS) nanome.util.Logs.debug("Saved PDB", self._receptor_input.name) self._ligands.io.to_pdb(self._ligands_input.name, PDBOPTIONS) - nanome.util.Logs.debug("Saved SDF", self._ligands_input.name) + nanome.util.Logs.debug("Saved PDB", self._ligands_input.name) self._site.io.to_pdb(self._site_input.name, PDBOPTIONS) - nanome.util.Logs.debug("Saved SDF", self._site_input.name) + nanome.util.Logs.debug("Saved PDB", self._site_input.name) def _check_conversion(self): poll = self._obabel_process.poll() @@ -104,12 +96,14 @@ def _check_conversion(self): def _start_docking(self): exe_path = os.path.join(os.path.dirname(__file__), 'smina') - + if self._scoring: smina_args = [exe_path, '-r', self._receptor_input.name, '-l', self._ligands_input.name, '--autobox_ligand', self._site_input.name, '--score_only', '--out', self._ligand_output.name] else: + smina_args = [exe_path, '-r', self._receptor_input.name, '-l', self._ligands_input.name, '--autobox_ligand', self._site_input.name, '--out', \ - self._docking_output.name, '--log', self._log_file.name, '--exhaustiveness', str(self._exhaustiveness), '--num_modes', str(self._modes), '--autobox_add', str(self._autobox), '--seed', '0'] + self._docking_output.name, '--log', self._log_file.name, '--exhaustiveness', str(self._exhaustiveness), '--num_modes', str(self._modes), '--autobox_add', str(self._autobox), '--atom_term_data'] + nanome.util.Logs.debug("Run SMINA") self._start_timer = timer() try: @@ -128,54 +122,85 @@ def _start_docking(self): def _check_docking(self): return self._smina_process.poll() != None - def _reassemble_ligs(self): - generators = parse_molecules(self._docking_output.name, self) - fout = open(self._ligand_output.name, 'w') - - try: - for gen in generators: - for line in gen: - str = lines.strip('\n') - fout.write(''.join(str)) - fout.write('\n') - except StopIteration: - pass - - fout.close() - - def _docking_finished(self): - end = timer() - nanome.util.Logs.debug("Docking Finished in", end - self._start_timer, "seconds") - self._request_pending = False - try: - (results, errors) = self._smina_process.communicate() - if len(errors) == 0: - for line in results.decode().splitlines(): - nanome.util.Logs.debug(line) - else: - for line in errors.decode().splitlines(): - nanome.util.Logs.warning(line) - except: - nanome.util.Logs.warning(traceback.format_exc()) + def _resume_docking_finished(self, docking_results): + docking_results = docking_results[0] + nanome.util.Logs.debug("Read SDF", self._docking_output.name) + for i, molecule in enumerate(docking_results.molecules): + nanome.util.Logs.debug("molecule " + str(i)) + self.set_scores(i, molecule) - if not self._scoring: - pass - # self._reassemble_ligs() - docked_ligands = nanome.structure.Complex.io.from_sdf(path=self._docking_output.name) - nanome.util.Logs.debug("Read PDB", self._docking_output.name) + if self._visual_scores: + self.visualize_scores(docking_results) if not self._scoring: - docked_ligands.molecular.name = "Docking" - docked_ligands.rendering.visible = True + if len(self._ligands.names) > 1: + docking_results.name += "Docking Results" + elif len(self._ligands.names) == 1: + docking_results.name = self._ligands.names[0] + " (Docked)" + docking_results.visible = True - self._plugin.make_plugin_usable() if self._scoring: nanome.util.Logs.debug("Display scoring result") - self._plugin.display_scoring_result(docked_ligands) + self._plugin.display_scoring_result(docking_results) else: nanome.util.Logs.debug("Update workspace") - self._plugin.add_result_to_workspace([docked_ligands], self._align) + self._plugin.add_result_to_workspace([docking_results], self._align) shutil.rmtree(self.temp_dir.name) self._plugin.send_notification(NotificationTypes.success, "Docking finished") + + def _docking_finished(self): + end = timer() + nanome.util.Logs.debug("Docking Finished in", end - self._start_timer, "seconds") + self._request_pending = False + + docking_results = nanome.structure.Complex.io.from_sdf(path=self._docking_output.name) + docking_results.index = 0 + self._plugin.replace_conformer([docking_results], self._resume_docking_finished, existing=False) + + def update_min_max_scores(self, molecule, score): + min_score = molecule.min_atom_score + max_score = molecule.max_atom_score + molecule.min_atom_score = score if score < min_score else min_score + molecule.max_atom_score = score if score > max_score else max_score + + def set_scores(self, lig_i, molecule): + molecule.min_atom_score = float('inf') + molecule.max_atom_score = float('-inf') + + num_rgx = '(-?[\d.]+(?:e[+-]\d+)?)' + pattern = re.compile('<{},{},{}> {} {} {} {} {}'.format(*([num_rgx] * 8)), re.U) + for associated in molecule.associateds: + pose_score = associated['> '] + for residue in molecule.residues: + residue.label_text = pose_score + " kcal/mol" + residue.labeled = True + interaction_terms = associated['> '] + interaction_values = re.findall(pattern, interaction_terms) + atom_count = len([atom for atom in molecule.atoms]) + for i, atom in enumerate(molecule.atoms): + if i < len(interaction_values) - 1: + nanome.util.Logs.debug("interaction values for atom " + str(i) + ": "+ str(interaction_values[i])) + atom.score = float(interaction_values[i][5]) + self.update_min_max_scores(molecule, atom.score) + + + def visualize_scores(self, ligand_complex): + for molecule in ligand_complex.molecules: + for atom in molecule.atoms: + if hasattr(atom, "score"): + atom.atom_mode = nanome.api.structure.Atom.AtomRenderingMode.Point + denominator = -molecule.min_atom_score if atom.score < 0 else molecule.max_atom_score + norm_score = atom.score / denominator + atom.atom_scale = norm_score * 1.5 + 0.1 + atom.label_text = self.truncate(atom.score, 3) + atom.labeled = True + + def truncate(self, f, n): + '''Truncates/pads a float f to n decimal places without rounding''' + s = '{}'.format(f) + if 'e' in s or 'E' in s: + return '{0:.{1}f}'.format(f, n) + i, p, d = s.partition('.') + return '.'.join([i, (d+'0'*n)[:n]]) \ No newline at end of file diff --git a/nanome_docking/_DockingCalculationsAutodock4.py b/nanome_docking/_DockingCalculationsAutodock4.py index 0f8f797..d8b4584 100644 --- a/nanome_docking/_DockingCalculationsAutodock4.py +++ b/nanome_docking/_DockingCalculationsAutodock4.py @@ -1,5 +1,6 @@ import nanome import os +import shutil import subprocess import tempfile import re @@ -21,21 +22,23 @@ def __init__(self, plugin): self._pdb_options.write_bonds = True self._sdf_options = SDFOptions() self._sdf_options.write_bonds = True + self.requires_site = False def initialize(self): # TODO: Read and write in a folder unique per plugin instance - self._protein_input = tempfile.NamedTemporaryFile(delete=False, suffix=".pdb") - self._protein_input_converted = tempfile.NamedTemporaryFile(delete=False, suffix=".pdbqt") - self._ligands_input = tempfile.NamedTemporaryFile(delete=False, suffix=".pdb") - self._ligands_input_converted = tempfile.NamedTemporaryFile(delete=False, suffix=".pdbqt") - self._ligands_output = tempfile.NamedTemporaryFile(delete=False, suffix=".pdb") - self._bond_output = tempfile.NamedTemporaryFile(delete=False, suffix=".sdf") - self._autogrid_input = tempfile.NamedTemporaryFile(delete=False, suffix=".gpf") - self._autodock_input = tempfile.NamedTemporaryFile(delete=False, suffix=".dpf") - self._autogrid_log = tempfile.NamedTemporaryFile(delete=False, suffix=".glg") - self._autodock_log = tempfile.NamedTemporaryFile(delete=False, suffix=".dlf") - - def start_docking(self, receptor, ligands, site, exhaustiveness, modes, align, replace, scoring, autobox): + self.temp_dir = tempfile.TemporaryDirectory() + self._protein_input = tempfile.NamedTemporaryFile(delete=False, suffix=".pdb", dir=self.temp_dir.name) + self._protein_input_converted = tempfile.NamedTemporaryFile(delete=False, suffix=".pdbqt", dir=self.temp_dir.name) + self._ligands_input = tempfile.NamedTemporaryFile(delete=False, suffix=".pdb", dir=self.temp_dir.name) + self._ligands_input_converted = tempfile.NamedTemporaryFile(delete=False, suffix=".pdbqt", dir=self.temp_dir.name) + self._ligands_output = tempfile.NamedTemporaryFile(delete=False, suffix=".pdb", dir=self.temp_dir.name) + self._bond_output = tempfile.NamedTemporaryFile(delete=False, suffix=".sdf", dir=self.temp_dir.name) + self._autogrid_input = tempfile.NamedTemporaryFile(delete=False, suffix=".gpf", dir=self.temp_dir.name) + self._autodock_input = tempfile.NamedTemporaryFile(delete=False, suffix=".dpf", dir=self.temp_dir.name) + self._autogrid_log = tempfile.NamedTemporaryFile(delete=False, suffix=".glg", dir=self.temp_dir.name) + self._autodock_log = tempfile.NamedTemporaryFile(delete=False, suffix=".dlf", dir=self.temp_dir.name) + + def start_docking(self, receptor, ligands, site, exhaustiveness, modes, align, replace, scoring, visual_scores, autobox): self.initialize() # Save all input files receptor.io.to_pdb(self._protein_input.name, self._pdb_options) @@ -44,9 +47,11 @@ def start_docking(self, receptor, ligands, site, exhaustiveness, modes, align, r nanome.util.Logs.debug("Saved PDB", self._ligands_input.name) self._receptor = receptor + self._ligands = ligands self._site = site self._align = align self._replace = replace + self._visual_scores = visual_scores # Start docking process self._running = False @@ -123,13 +128,13 @@ def _check_process_error(self, process, check_only_errors = False): def _start_preparation(self): # Awful situation here - lig_args = ['py', '-2.5', os.path.join(os.path.dirname(__file__), 'prepare_ligand4.py'), '-l', self._ligands_input.name, '-o', self._ligands_input_converted.name] - rec_args = ['py', '-2.5', os.path.join(os.path.dirname(__file__), 'prepare_receptor4.py'), '-r', self._protein_input.name, '-o', self._protein_input_converted.name] + lig_args = ['python', os.path.join(os.path.dirname(__file__), 'prepare_ligand4.py'), '-l', self._ligands_input.name, '-o', self._ligands_input_converted.name] + rec_args = ['python', os.path.join(os.path.dirname(__file__), 'prepare_receptor4.py'), '-r', self._protein_input.name, '-o', self._protein_input_converted.name] nanome.util.Logs.debug("Prepare ligand and receptor") self._start_timer = timer() - self._lig_process = subprocess.Popen(lig_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - self._rec_process = subprocess.Popen(rec_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + self._lig_process = subprocess.Popen(lig_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=self.temp_dir.name) + self._rec_process = subprocess.Popen(rec_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=self.temp_dir.name) self._running = True def _check_preparation(self): @@ -150,13 +155,13 @@ def _preparation_finished(self): def _start_parameters_preparation(self): # Awful situation here - grid_args = ['py', '-2.5', os.path.join(os.path.dirname(__file__), 'prepare_gpf4.py'), '-l', self._ligands_input_converted.name, '-r', self._protein_input_converted.name, '-o', self._autogrid_input.name] - dock_args = ['py', '-2.5', os.path.join(os.path.dirname(__file__), 'prepare_dpf42.py'), '-l', self._ligands_input_converted.name, '-r', self._protein_input_converted.name, '-o', self._autodock_input.name] + grid_args = ['python', os.path.join(os.path.dirname(__file__), 'prepare_gpf4.py'), '-l', self._ligands_input_converted.name, '-r', self._protein_input_converted.name, '-o', self._autogrid_input.name] + dock_args = ['python', os.path.join(os.path.dirname(__file__), 'prepare_dpf42.py'), '-l', self._ligands_input_converted.name, '-r', self._protein_input_converted.name, '-o', self._autodock_input.name] nanome.util.Logs.debug("Prepare grid and docking parameter files") self._start_timer = timer() - self._grid_process = subprocess.Popen(grid_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - self._dock_process = subprocess.Popen(dock_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + self._grid_process = subprocess.Popen(grid_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=self.temp_dir.name) + self._dock_process = subprocess.Popen(dock_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=self.temp_dir.name) self._running = True def _check_parameters_preparation(self): @@ -181,15 +186,10 @@ def _parameters_preparation_finished(self): def _start_grid(self): full_name = self._autogrid_input.name - delimiter = full_name.rfind('\\') - path = full_name[:delimiter] - name = full_name[delimiter + 1:] - full_name_log = self._autogrid_log.name - delimiter_log = full_name_log.rfind('\\') - name_log = full_name_log[delimiter_log + 1:] + path = os.path.dirname(full_name) - args = ['autogrid4', '-p', name, '-l', name_log] + args = ['autogrid4', '-p', full_name, '-l', full_name_log] nanome.util.Logs.debug("Start Autogrid") self._start_timer = timer() @@ -214,15 +214,10 @@ def _grid_finished(self): def _start_docking(self): full_name_input = self._autodock_input.name - delimiter_input = full_name_input.rfind('\\') - path = full_name_input[:delimiter_input] - name_input = full_name_input[delimiter_input + 1:] - + path = os.path.dirname(full_name_input) full_name_log = self._autodock_log.name - delimiter_log = full_name_log.rfind('\\') - name_log = full_name_log[delimiter_log + 1:] - args = ['autodock4', '-p', name_input, '-l', name_log] + args = ['autodock4', '-p', full_name_input, '-l', full_name_log] nanome.util.Logs.debug("Start Autodock") self._start_timer = timer() @@ -291,12 +286,15 @@ def _bonds_finished(self): docked_ligands = nanome.structure.Complex.io.from_sdf(path=self._bond_output.name) nanome.util.Logs.debug("Read SDF", self._bond_output.name) - docked_ligands.molecular.name = "Docking" - docked_ligands.rendering.visible = True + docked_ligands.name = self._ligands[0].full_name + " (Docked)" + docked_ligands.visible = True if self._align == True: docked_ligands.transform.position = self._receptor.transform.position docked_ligands.transform.rotation = self._receptor.transform.rotation nanome.util.Logs.debug("Update workspace") - self._plugin.make_plugin_usable() - self._plugin.add_result_to_workspace([docked_ligands]) \ No newline at end of file + # TODO: verify this shouldn't be here anymore (test) + # self._plugin.make_plugin_usable() + self._plugin.add_result_to_workspace([docked_ligands]) + + shutil.rmtree(self.temp_dir.name) \ No newline at end of file diff --git a/nanome_docking/_DockingCalculationsRhodium.py b/nanome_docking/_DockingCalculationsRhodium.py new file mode 100644 index 0000000..b015dd0 --- /dev/null +++ b/nanome_docking/_DockingCalculationsRhodium.py @@ -0,0 +1,179 @@ +import nanome +from nanome.util import Logs, Process +from nanome.util.enums import NotificationTypes + +import os +import tempfile +import traceback +import subprocess +from timeit import default_timer as timer + +RHODIUM_PATH = os.path.join(os.path.dirname(__file__), 'Rh_x64.exe') + +class DockingCalculations(): + def __init__(self, plugin): + self._plugin = plugin + self.__docking_running = False + self.requires_site = False + + # Entry point, where everything starts + def start_docking(self, receptor, ligands, site, params): + # Create temporary files + self.initialize() + + self._ligands = ligands + self._receptor = receptor + self._site = site + self._params = params + + self.prepare_receptor(receptor) + + # Docking process needs to be check manually in an update loop for now + # This is due to a current bug with the plugin system Process API with process outputting a lot of text + # In the future, no update loop will be needed to check when Rhodium has ended + def update(self): + if self.__docking_running == False: + return + + self.__process.communicate() + if self.__process.poll() != None: + self.__docking_running = False + self._docking_finished() + + def initialize(self): + self._protein_input = tempfile.NamedTemporaryFile(delete=False, suffix=".pdb") + self._protein_converted_input = tempfile.NamedTemporaryFile(delete=False, suffix=".pdb") + self._ligands_input = tempfile.NamedTemporaryFile(delete=False, suffix=".sdf") + self._site_input = tempfile.NamedTemporaryFile(delete=False, suffix=".pdb") + self._docking_output = tempfile.NamedTemporaryFile() + self._docking_output.close() + + def clean_files(self, docking_result): + self._protein_input.close() + self._protein_converted_input.close() + self._ligands_input.close() + self._site_input.close() + os.remove(self._protein_input.name) + os.remove(self._protein_converted_input.name) + os.remove(self._ligands_input.name) + os.remove(self._site_input.name) + os.remove(self._docking_output.name + ".csv") + for entry in docking_result: + os.chmod(entry[0], 0o777) + os.remove(entry[0]) + pass + + def prepare_receptor(self, receptor): + # Remove waters + residues_to_remove = [] + for residue in receptor.residues: + if residue.name == "HOH": + residues_to_remove.append(residue) + + for residue in residues_to_remove: + residue.parent.remove_residue(residue) + + # Write pdb file for openbabel + receptor.io.to_pdb(self._protein_input.name) + + # Use openbabel to add hydrogens + proc = Process() + proc.executable_path = 'obabel' + proc.args = ['-ipdb', self._protein_input.name, + '-opdb', '-O' + self._protein_converted_input.name, '-h'] + proc.on_done = self.receptor_ready + proc.start() + + # Callback when obabel is done + def receptor_ready(self, return_value): + self._ligands.io.to_sdf(self._ligands_input.name) + if self._site != None: + self._site.io.to_sdf(self._site_input.name) + self._start_docking() + + def _start_docking(self): + # Start process manually, because of problem described above Update function + args = [RHODIUM_PATH, self._protein_converted_input.name, self._ligands_input.name, + '--outfile', self._docking_output.name, + '--refine', str(self._params['poses']), + '--resolution', str(self._params['grid_resolution']), + '--refine', str(self._params['poses']), + '--nr', str(self._params['rotamers'])] + + if self._params['ignore_hetatoms']: + args += ['--ignore_pdb_hetatm'] + + if self._site != None: + args += ['--usegrid', self._site_input.name] + + Logs.debug("Start Rhodium:", args) + + self._start_timer = timer() + try: + self.__process = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=os.path.dirname(__file__)) + except: + nanome.util.Logs.error("Couldn't execute Rhodium, please check if executable is in the plugin folder and has permissions. Path:", RHODIUM_PATH, traceback.format_exc()) + self._plugin.make_plugin_usable() + self._plugin.send_notification(NotificationTypes.error, "Docking error, check plugin") + return + + self._plugin.send_notification(NotificationTypes.message, "Docking started") + self.__docking_running = True + + def read_csv(self): + result = [] + with open(self._docking_output.name + ".csv", 'r') as file: + lines = file.readlines() + for line in lines: + if line.startswith('seed') == False: + continue + line_split = line.split(',') + result.append([line_split[5].strip(), + line_split[13].strip(), + line_split[41].strip(), + line_split[43].strip()]) + return result + + def assemble_result(self, docking_output): + # docking_output contains the lines from the csv file + + docked_ligands = nanome.api.structure.Complex() + for entry in docking_output: + # Read complex from pdb and extract molecule from it + complex = nanome.structure.Complex.io.from_pdb(path=entry[0]) + molecule = next(complex.molecules) + # Write docking information in the molecule + molecule._associated['score'] = entry[1] + molecule._associated['affinity'] = entry[2] + molecule._associated['pose_population'] = entry[3] + # Add it to the result complex + docked_ligands.add_molecule(molecule) + + def bonds_added(complex_arr): + docked_ligands_bonded = complex_arr[0] + docked_ligands_bonded.name = "Docking" + docked_ligands_bonded.visible = True + if self._params['align'] == True: + docked_ligands_bonded.transform.position = self._receptor.transform.position + docked_ligands_bonded.transform.rotation = self._receptor.transform.rotation + docked_ligands_bonded.boxed = True + + nanome.util.Logs.debug("Update workspace") + self._plugin.add_result_to_workspace([docked_ligands_bonded]) + + # Docking process is over, clean files and make plugin available again + self.clean_files(docking_output) + # TODO: Verify this shouldn't be here anymore (test) + # self._plugin.make_plugin_usable(True) + self._plugin.send_notification(NotificationTypes.success, "Docking finished") + + # Add bonds to the result complex + self._plugin.add_bonds([docked_ligands], bonds_added) + + def _docking_finished(self): + end = timer() + nanome.util.Logs.debug("Docking Finished in", end - self._start_timer, "seconds") + + # When Rhodium finished, read csv, then assemble result ligands + docking_output = self.read_csv() + self.assemble_result(docking_output) diff --git a/nanome_docking/_DockingMenu.py b/nanome_docking/_DockingMenu.py index 099e5c3..7699c74 100644 --- a/nanome_docking/_DockingMenu.py +++ b/nanome_docking/_DockingMenu.py @@ -9,14 +9,15 @@ def __init__(self, docking_plugin): self._selected_receptor = None self._selected_ligands = [] self._selected_site = None - self._exhaustiveness = 8 - self._modes = 9 + self._exhaustiveness = 10 + self._modes = 5 self._autobox = 4 self._run_button = None self._run_button = None self._align = True self._replace = False self._scoring = False + self._visual_scores = False self._tab = None self._autobox_enabled = True @@ -27,6 +28,27 @@ def get_params(self): params[key] = newvalue return params + def get_receptor(self): + return self._selected_receptor.complex + + def get_ligands(self): + ligands = [] + for item in self._selected_ligands: + ligands.append(item.complex) + return ligands + + def get_site(self): + if self._selected_site == None: + return None + return self._selected_site.complex + + def get_params(self): + params = {"exhaustiveness": None, "modes": None, "align": None, "replace": None, "scoring": None, "visual_scores": None, "autobox": None} + for key, value in params.items(): + newvalue = getattr(self, "_"+key) + params[key] = newvalue + return params + def _run_docking(self): if self._selected_receptor == None or len(self._selected_ligands) == 0: if self._autobox_enabled == True and self._selected_site == None: @@ -50,7 +72,7 @@ def disable_autobox(self): self._plugin.update_menu(self._menu) def make_plugin_usable(self, state=True): - self._run_button.unusable = not state | self.refresh_run_btn_enabled(False) + self._run_button.unusable = (not state) | self.refresh_run_btn_unusable(False) self._plugin.update_content(self._run_button) def receptor_pressed(self, button): @@ -64,7 +86,7 @@ def receptor_pressed(self, button): self._receptor_checkmark.file_path = os.path.join(os.path.dirname(__file__), 'checkmark.png') self._plugin.update_content(self._receptor_checkmark) - self.refresh_run_btn_enabled() + self.refresh_run_btn_unusable() def ligand_pressed(self, button): if button.selected == False: @@ -80,7 +102,7 @@ def ligand_pressed(self, button): self._ligand_checkmark.file_path = os.path.join(os.path.dirname(__file__), 'none.png') self._plugin.update_content(self._ligand_checkmark) - self.refresh_run_btn_enabled() + self.refresh_run_btn_unusable() def site_pressed(self, button): lastSelected = self._selected_site @@ -93,10 +115,11 @@ def site_pressed(self, button): self._site_checkmark.file_path = os.path.join(os.path.dirname(__file__), 'checkmark.png') self._plugin.update_content(self._site_checkmark) - self.refresh_run_btn_enabled() + self.refresh_run_btn_unusable() - def refresh_run_btn_enabled(self, update=True): - if self._selected_receptor != None and len(self._selected_ligands) > 0 and self._selected_site != None: + def refresh_run_btn_unusable(self, update=True): + site_requirement_met = self._selected_site != None or not self._plugin._calculations.requires_site + if self._selected_receptor != None and len(self._selected_ligands) > 0 and site_requirement_met: self._run_button.text.value_unusable = "Running..." self._run_button.unusable = False else: @@ -117,13 +140,7 @@ def complex_pressed(button): elif self._tab.text.value_idle == "Site": self.site_pressed(button) - self._selected_receptor = None - self._selected_ligands = [] - self._selected_site = None - self._complex_list.items = [] - self._receptor_checkmark.file_path = os.path.join(os.path.dirname(__file__), 'none.png') - self._ligand_checkmark.file_path = os.path.join(os.path.dirname(__file__), 'none.png') - self._site_checkmark.file_path = os.path.join(os.path.dirname(__file__), 'none.png') + self.reset(update_menu=False) for complex in complex_list: clone = self._complex_item_prefab.clone() @@ -137,23 +154,32 @@ def complex_pressed(button): self._plugin.update_menu(self._menu) def display_scoring_result(self, result): - self.reset_menu() + self.reset() for molecule in result.molecules: clone = self._score_item_prefab.clone() ln_lbl = clone.get_children()[0] lbl = ln_lbl.get_content() - lbl.text_value = molecule.molecular.name + " - " + molecule._associated["> "] + lbl.text_value = molecule.name + " - " + molecule._associated["> "] self._score_list.items.append(clone) - def reset_menu(self): + def reset(self, update_menu=True): self._selected_receptor = None self._selected_ligands = [] - self._selected_site == None + self._selected_site = None + self._complex_list.items = [] + self._receptor_checkmark.file_path = os.path.join(os.path.dirname(__file__), 'none.png') + self._ligand_checkmark.file_path = os.path.join(os.path.dirname(__file__), 'none.png') + self._site_checkmark.file_path = os.path.join(os.path.dirname(__file__), 'none.png') self.make_plugin_usable() self._plugin.update_menu(self._menu) + def open_menu(self): + self._plugin.menu = self._menu + self._plugin.menu.enabled = True + self._plugin.update_menu(self._plugin.menu) + def build_menu(self): # defining callbacks def run_button_pressed_callback(button): @@ -238,6 +264,11 @@ def scoring_button_pressed_callback(button): button.selected = self._scoring self._plugin.update_content(button) + def visual_scores_button_pressed_callback(button): + self._visual_scores = not self._visual_scores + button.selected = self._visual_scores + self._plugin.update_content(button) + # Create a prefab that will be used to populate the lists self._complex_item_prefab = nanome.ui.LayoutNode() self._complex_item_prefab.layout_orientation = nanome.ui.LayoutNode.LayoutTypes.horizontal @@ -298,6 +329,9 @@ def scoring_button_pressed_callback(button): self._score_btn = menu.root.find_node("ScoringButton", True).get_content() self._score_btn.register_pressed_callback(scoring_button_pressed_callback) + self._display_score_btn = menu.root.find_node("VisualScoresButton", True).get_content() + self._display_score_btn.register_pressed_callback(visual_scores_button_pressed_callback) + close_score_btn = menu.root.find_node("CloseScoreButton", True).get_content() close_score_btn.register_pressed_callback(close_score_pressed_callback) @@ -305,7 +339,7 @@ def scoring_button_pressed_callback(button): run_button.register_pressed_callback(run_button_pressed_callback) self._run_button = run_button self._run_button.enabled = False - self.refresh_run_btn_enabled() + self.refresh_run_btn_unusable() # lists self._complex_list = menu.root.find_node("ComplexList", True).get_content() diff --git a/nanome_docking/_DockingMenuRhodium.py b/nanome_docking/_DockingMenuRhodium.py new file mode 100644 index 0000000..097c728 --- /dev/null +++ b/nanome_docking/_DockingMenuRhodium.py @@ -0,0 +1,267 @@ +import nanome +from nanome.api.ui.image import Image as Image + +import os + +class DockingMenuRhodium(): + def __init__(self, docking_plugin): + self._plugin = docking_plugin + self._selected_receptor = None + self._selected_ligands = [] + self._selected_site = None + self._grid_resolution = 2.5 + self._poses = 128 + self._rotamer = 6 + self._run_button = None + self._align = True + self._ignore_hetatoms = False + self._tab = None + + def is_ready_for_docking(self): + return self._selected_receptor != None and len(self._selected_ligands) > 0 + + def get_receptor(self): + return self._selected_receptor.complex + + def get_ligands(self): + ligands = [] + for item in self._selected_ligands: + ligands.append(item.complex) + return ligands + + def get_site(self): + if self._selected_site == None: + return None + return self._selected_site.complex + + def get_params(self): + return { "receptor":self._selected_receptor, + "ligands":self._selected_ligands, + "site":self._selected_site, + "grid_resolution":self._grid_resolution, + "poses":self._poses, + "rotamers":self._rotamer, + "align":self._align, + "ignore_hetatoms":self._ignore_hetatoms + } + + def _run_docking(self): + if self._selected_receptor == None or len(self._selected_ligands) == 0: + nanome.util.Logs.warning("Trying to run docking without having one receptor, and at least one ligand selected") + self._plugin.send_notification(nanome.util.enums.NotificationTypes.error, "Please select a receptor, and at least one ligand") + return + ligands = [] + for item in self._selected_ligands: + ligands.append(item.complex) + self._plugin.run_docking(self.get_receptor(), self.get_ligands(), self.get_site(), self.get_params()) + + def make_plugin_usable(self, state=True): + self._run_button.unusable = not state + self._plugin.update_content(self._run_button) + + def receptor_pressed(self, button): + lastSelected = self._selected_receptor + if lastSelected != None: + lastSelected.selected = False + self._plugin.update_content(lastSelected) + button.selected = True + self._selected_receptor = button + self._plugin.update_content(button) + self._receptor_checkmark.file_path = os.path.join(os.path.dirname(__file__), 'checkmark.png') + self._plugin.update_content(self._receptor_checkmark) + + def ligand_pressed(self, button): + if button.selected == False: + button.selected = True + self._selected_ligands.append(button) + else: + button.selected = False + self._selected_ligands.remove(button) + self._plugin.update_content(button) + if len(self._selected_ligands) != 0: + self._ligand_checkmark.file_path = os.path.join(os.path.dirname(__file__), 'checkmark.png') + else: + self._ligand_checkmark.file_path = os.path.join(os.path.dirname(__file__), 'none.png') + self._plugin.update_content(self._ligand_checkmark) + + def site_pressed(self, button): + lastSelected = self._selected_site + if lastSelected == button: + button.selected = False + self._plugin.update_content(button) + self._selected_site = None + self._site_checkmark.file_path = os.path.join(os.path.dirname(__file__), 'none.png') + self._plugin.update_content(self._site_checkmark) + return + elif lastSelected != None: + lastSelected.selected = False + self._plugin.update_content(lastSelected) + button.selected = True + self._selected_site = button + self._plugin.update_content(button) + self._site_checkmark.file_path = os.path.join(os.path.dirname(__file__), 'checkmark.png') + self._plugin.update_content(self._site_checkmark) + + def change_complex_list(self, complex_list): + def complex_pressed(button): + if self._tab.text.value_idle == "Receptor": + self.receptor_pressed(button) + elif self._tab.text.value_idle == "Ligand": + self.ligand_pressed(button) + elif self._tab.text.value_idle == "Site": + self.site_pressed(button) + + self._selected_receptor = None + self._selected_ligands = [] + self._selected_site = None + self._complex_list.items = [] + self._receptor_checkmark.file_path = os.path.join(os.path.dirname(__file__), 'none.png') + self._ligand_checkmark.file_path = os.path.join(os.path.dirname(__file__), 'none.png') + self._site_checkmark.file_path = os.path.join(os.path.dirname(__file__), 'none.png') + + for complex in complex_list: + clone = self._complex_item_prefab.clone() + ln_btn = clone.get_children()[0] + btn = ln_btn.get_content() + btn.set_all_text(complex.name) + btn.complex = complex + btn.register_pressed_callback(complex_pressed) + self._complex_list.items.append(clone) + + self._plugin.update_menu(self._menu) + + def build_menu(self): + # defining callbacks + def run_button_pressed_callback(button): + self._run_docking() + + def grid_resolution_changed(input): + try: + self._grid_resolution = float(input.input_text) + nanome.util.Logs.debug("Grid resolution set to", self._grid_resolution) + except: + self._grid_resolution = 1.4 + + def poses_changed(input): + try: + self._poses = int(input.input_text) + nanome.util.Logs.debug("Poses count set to", self._poses) + except: + self._poses = 96 + if self._poses <= 0: + self._poses = 96 + + def rotamer_changed(input): + try: + self._rotamer = int(input.input_text) + nanome.util.Logs.debug("Rotamer count set to", self._rotamer) + except: + self._rotamer = 3 + if self._rotamer <= 0: + self._rotamer = 3 + + def tab_button_pressed_callback(button): + if self._tab == button: + return + + self._tab.selected = False + button.selected = True + self._tab = button + + if button.text.value_idle == "Receptor": + for item in self._complex_list.items: + btn = item.get_children()[0].get_content() + if btn == self._selected_receptor: + btn.selected = True + else: + btn.selected = False + elif button.text.value_idle == "Ligand": + for item in self._complex_list.items: + btn = item.get_children()[0].get_content() + if btn in self._selected_ligands: + btn.selected = True + else: + btn.selected = False + elif button.text.value_idle == "Site": + for item in self._complex_list.items: + btn = item.get_children()[0].get_content() + if btn == self._selected_site: + btn.selected = True + else: + btn.selected = False + + self._plugin.update_menu(self._menu) + + def align_button_pressed_callback(button): + self._align = not self._align + button.selected = self._align + self._plugin.update_content(button) + + def ignore_hetatoms_pressed_callback(button): + self._ignore_hetatoms = not self._ignore_hetatoms + button.selected = self._ignore_hetatoms + self._plugin.update_content(button) + + # Create a prefab that will be used to populate the lists + self._complex_item_prefab = nanome.ui.LayoutNode() + self._complex_item_prefab.layout_orientation = nanome.ui.LayoutNode.LayoutTypes.horizontal + child = self._complex_item_prefab.create_child_node() + child.forward_dist = 0.002 + child.add_new_button() + + # loading menus + menu = nanome.ui.Menu.io.from_json(os.path.join(os.path.dirname(__file__), '_docking_menu_rhodium.json')) + self._plugin.menu = menu + + # images + none_path = os.path.join(os.path.dirname(__file__), 'none.png') + logo_path = os.path.join(os.path.dirname(__file__), 'swri_logo.png') + self._receptor_checkmark = menu.root.find_node("ReceptorIcon", True).add_new_image(none_path) + self._receptor_checkmark.scaling_option = Image.ScalingOptions.fit + self._ligand_checkmark = menu.root.find_node("LigandIcon", True).add_new_image(none_path) + self._ligand_checkmark.scaling_option = Image.ScalingOptions.fit + self._site_checkmark = menu.root.find_node("SiteIcon", True).add_new_image(none_path) + self._site_checkmark.scaling_option = Image.ScalingOptions.fit + logo_image = menu.root.find_node("LogoImage", True).add_new_image(logo_path) + logo_image.scaling_option = Image.ScalingOptions.fit + + # texts + txt1 = menu.root.find_node("GridResolutionInput", True).get_content() + txt1.register_changed_callback(grid_resolution_changed) + + txt2 = menu.root.find_node("PosesCountInput", True).get_content() + txt2.register_changed_callback(poses_changed) + + txt3 = menu.root.find_node("RotamerCountInput", True).get_content() + txt3.register_changed_callback(rotamer_changed) + + # buttons + receptor_btn = menu.root.find_node("ReceptorButton", True).get_content() + receptor_btn.register_pressed_callback(tab_button_pressed_callback) + receptor_btn.selected = True + self._tab = receptor_btn + + ligand_btn = menu.root.find_node("LigandButton", True).get_content() + ligand_btn.register_pressed_callback(tab_button_pressed_callback) + + site_btn = menu.root.find_node("SiteButton", True).get_content() + site_btn.register_pressed_callback(tab_button_pressed_callback) + + align_btn = menu.root.find_node("AlignButton", True).get_content() + align_btn.register_pressed_callback(align_button_pressed_callback) + align_btn.selected = True + + run_button = menu.root.find_node("RunButton", True).get_content() + run_button.register_pressed_callback(run_button_pressed_callback) + self._run_button = run_button + + # lists + self._complex_list = menu.root.find_node("ComplexList", True).get_content() + self._receptor_tab = menu.root.find_node("ReceptorButton", True).get_content() + self._ligand_tab = menu.root.find_node("LigandButton", True).get_content() + self._site_tab = menu.root.find_node("SiteButton", True).get_content() + + # Update the menu + self._menu = menu + self._plugin.update_menu(menu) + nanome.util.Logs.debug("Constructed plugin menu") diff --git a/nanome_docking/_docking_menu.json b/nanome_docking/_docking_menu.json index f47aeb9..bd8feec 100644 --- a/nanome_docking/_docking_menu.json +++ b/nanome_docking/_docking_menu.json @@ -1 +1 @@ -{"title": "Docking", "version": 0, "width": 0.829999983310699, "height": 0.600000023841858, "is_menu": true, "effective_root": {"name": "Root", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 0, "sizing_value": 1, "forward_dist": 0, "padding_type": 1, "padding_x": -1, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"text": "", "text_vertical_align": 1, "text_horizontal_align": 1, "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 1, "text_color": -1, "text_bold": true, "text_italics": false, "text_underlined": false, "type_name": "Label"}, "children": [{"name": "LeftSideScore", "enabled": false, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "ScoreList", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 5, "forward_dist": 0.01, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"display_columns": 1, "display_rows": 6, "total_columns": 1, "unusable": false, "type_name": "List"}, "children": []}, {"name": "CloseScoreButton", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0.0179999992251396, "padding_z": 0.0149999996647239, "padding_w": 0, "content": {"selected": false, "unusable": false, "text_active": true, "text_value_idle": "--", "text_value_selected": "--", "text_value_highlighted": "--", "text_value_selected_highlighted": "--", "text_value_unusable": "--", "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 1, "text_underlined": false, "text_bolded": true, "text_vertical_align": 1, "text_horizontal_align": 1, "type_name": "Button"}, "children": []}]}, {"name": "LeftSide", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "Top", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 2, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "RecepeterData", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "ReceptorIcon", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 0.119999997317791, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0.00999999977648258, "padding_z": 0.00999999977648258, "padding_w": 0.00999999977648258, "content": null, "children": []}, {"name": "ReceptorText", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"text": "Receptor:", "text_vertical_align": 1, "text_horizontal_align": 0, "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.300000011920929, "text_color": -1, "text_bold": true, "text_italics": false, "text_underlined": false, "type_name": "Label"}, "children": []}]}, {"name": "LigandData", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "LigandIcon", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 0.119999997317791, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0.00999999977648258, "padding_z": 0.00999999977648258, "padding_w": 0.00999999977648258, "content": null, "children": []}, {"name": "LigandText", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"text": "Ligand:", "text_vertical_align": 1, "text_horizontal_align": 0, "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.300000011920929, "text_color": -1, "text_bold": true, "text_italics": false, "text_underlined": false, "type_name": "Label"}, "children": []}]}, {"name": "SiteData", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "SiteIcon", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 0.119999997317791, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0.00999999977648258, "padding_z": 0.00999999977648258, "padding_w": 0.00999999977648258, "content": null, "children": []}, {"name": "SiteText", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"text": "Site:", "text_vertical_align": 1, "text_horizontal_align": 0, "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.300000011920929, "text_color": -1, "text_bold": true, "text_italics": false, "text_underlined": false, "type_name": "Label"}, "children": []}]}]}, {"name": "Bot", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 4, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "Tabs", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 0.270000010728836, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "Receptor", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "ReceptorButton", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"selected": false, "unusable": false, "text_active": true, "text_value_idle": "Receptor", "text_value_selected": "Receptor", "text_value_highlighted": "Receptor", "text_value_selected_highlighted": "Receptor", "text_value_unusable": "Receptor", "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.280000001192093, "text_underlined": false, "text_bolded": true, "text_vertical_align": 1, "text_horizontal_align": 1, "type_name": "Button"}, "children": []}]}, {"name": "Ligand", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "LigandButton", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"selected": false, "unusable": false, "text_active": true, "text_value_idle": "Ligand", "text_value_selected": "Ligand", "text_value_highlighted": "Ligand", "text_value_selected_highlighted": "Ligand", "text_value_unusable": "Ligand", "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.300000011920929, "text_underlined": false, "text_bolded": true, "text_vertical_align": 1, "text_horizontal_align": 1, "type_name": "Button"}, "children": []}]}, {"name": "Site", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "SiteButton", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"selected": false, "unusable": false, "text_active": true, "text_value_idle": "Site", "text_value_selected": "Site", "text_value_highlighted": "Site", "text_value_selected_highlighted": "Site", "text_value_unusable": "Site", "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.300000011920929, "text_underlined": false, "text_bolded": true, "text_vertical_align": 1, "text_horizontal_align": 1, "type_name": "Button"}, "children": []}]}]}, {"name": "List", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0.01, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "Mesh", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"mesh_color": 691685119, "type_name": "Mesh"}, "children": []}, {"name": "ComplexList", "enabled": true, "layer": 1, "layout_orientation": 0, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0.01, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"display_columns": 1, "display_rows": 3, "total_columns": 1, "unusable": false, "type_name": "List"}, "children": []}]}]}]}, {"name": "RightSide", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 0.75, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "Exhaustiveness", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0.0179999992251396, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "text", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"text": "Exhaust.", "text_vertical_align": 1, "text_horizontal_align": 0, "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.349999994039536, "text_color": -1, "text_bold": true, "text_italics": false, "text_underlined": false, "type_name": "Label"}, "children": []}, {"name": "ExhaustivenessInput", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 0.400000005960464, "forward_dist": 0.0020000000949949, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0.0149999996647239, "padding_w": 0.0149999996647239, "content": {"max_length": 10, "placeholder_text": "10", "input_text": "10", "type_name": "Text Input"}, "children": []}]}, {"name": "NumModes", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0.0179999992251396, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "text", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"text": "Num Modes", "text_vertical_align": 1, "text_horizontal_align": 0, "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.349999994039536, "text_color": -1, "text_bold": true, "text_italics": false, "text_underlined": false, "type_name": "Label"}, "children": []}, {"name": "ModesInput", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 0.400000005960464, "forward_dist": 0.0020000000949949, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0.0149999996647239, "padding_w": 0.0149999996647239, "content": {"max_length": 5, "placeholder_text": "5", "input_text": "5", "type_name": "Text Input"}, "children": []}]}, {"name": "Autobox", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0.0179999992251396, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "text", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"text": "Autobox", "text_vertical_align": 1, "text_horizontal_align": 0, "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.349999994039536, "text_color": -1, "text_bold": true, "text_italics": false, "text_underlined": false, "type_name": "Label"}, "children": []}, {"name": "AutoboxInput", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 0.400000005960464, "forward_dist": 0.0020000000949949, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0.0149999996647239, "padding_w": 0.0149999996647239, "content": {"max_length": 4, "placeholder_text": "4", "input_text": "4", "type_name": "Text Input"}, "children": []}]}, {"name": "AlignAfter", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0.0179999992251396, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "text", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"text": "Align After", "text_vertical_align": 1, "text_horizontal_align": 0, "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.349999994039536, "text_color": -1, "text_bold": true, "text_italics": false, "text_underlined": false, "type_name": "Label"}, "children": []}, {"name": "AlignButton", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 0.400000005960464, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0.0149999996647239, "padding_w": 0.0149999996647239, "content": {"selected": false, "unusable": false, "text_active": true, "text_value_idle": "off", "text_value_selected": "on", "text_value_highlighted": "off", "text_value_selected_highlighted": "on", "text_value_unusable": "off", "text_auto_size": true, "text_min_size": 0, "text_max_size": 72, "text_size": 1, "text_underlined": false, "text_bolded": true, "text_vertical_align": 1, "text_horizontal_align": 1, "type_name": "Button"}, "children": []}]}, {"name": "ScoringOnly", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0.0179999992251396, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "Text", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"text": "Scoring Only", "text_vertical_align": 1, "text_horizontal_align": 0, "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.330000013113022, "text_color": -1, "text_bold": true, "text_italics": false, "text_underlined": false, "type_name": "Label"}, "children": []}, {"name": "ScoringButton", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 0.400000005960464, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0.0149999996647239, "padding_w": 0.0149999996647239, "content": {"selected": false, "unusable": false, "text_active": true, "text_value_idle": "off", "text_value_selected": "on", "text_value_highlighted": "off", "text_value_selected_highlighted": "on", "text_value_unusable": "off", "text_auto_size": true, "text_min_size": 0, "text_max_size": 72, "text_size": 1, "text_underlined": false, "text_bolded": true, "text_vertical_align": 1, "text_horizontal_align": 1, "type_name": "Button"}, "children": []}]}, {"name": "Run", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "RunButton", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0.0179999992251396, "padding_y": 0, "padding_z": 0.0149999996647239, "padding_w": 0, "content": {"selected": false, "unusable": false, "text_active": true, "text_value_idle": "Run", "text_value_selected": "Run", "text_value_highlighted": "Run", "text_value_selected_highlighted": "Run", "text_value_unusable": "Running...", "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.430000007152557, "text_underlined": false, "text_bolded": true, "text_vertical_align": 1, "text_horizontal_align": 1, "type_name": "Button"}, "children": []}]}]}]}} \ No newline at end of file +{"title": "Docking", "version": 0, "width": 0.829999983310699, "height": 0.600000023841858, "is_menu": true, "effective_root": {"name": "Root", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 0, "sizing_value": 1, "forward_dist": 0, "padding_type": 1, "padding_x": -1, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"text": "", "text_vertical_align": 1, "text_horizontal_align": 1, "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 1, "text_color": -1, "text_bold": true, "text_italics": false, "text_underlined": false, "type_name": "Label"}, "children": [{"name": "LeftSideScore", "enabled": false, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "ScoreList", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 5, "forward_dist": 0.00999999977648258, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"display_columns": 1, "display_rows": 6, "total_columns": 1, "unusable": false, "type_name": "List"}, "children": []}, {"name": "CloseScoreButton", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0.0179999992251396, "padding_z": 0.0149999996647239, "padding_w": 0, "content": {"selected": false, "unusable": false, "text_active": true, "text_value_idle": "--", "text_value_selected": "--", "text_value_highlighted": "--", "text_value_selected_highlighted": "--", "text_value_unusable": "--", "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 1, "text_underlined": false, "text_bolded": true, "text_vertical_align": 1, "text_horizontal_align": 1, "type_name": "Button"}, "children": []}]}, {"name": "LeftSide", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "Top", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 2, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "RecepeterData", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "ReceptorIcon", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 0.119999997317791, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0.00999999977648258, "padding_z": 0.00999999977648258, "padding_w": 0.00999999977648258, "content": null, "children": []}, {"name": "ReceptorText", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"text": "Receptor:", "text_vertical_align": 1, "text_horizontal_align": 0, "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.300000011920929, "text_color": -1, "text_bold": true, "text_italics": false, "text_underlined": false, "type_name": "Label"}, "children": []}]}, {"name": "LigandData", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "LigandIcon", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 0.119999997317791, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0.00999999977648258, "padding_z": 0.00999999977648258, "padding_w": 0.00999999977648258, "content": null, "children": []}, {"name": "LigandText", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"text": "Ligand:", "text_vertical_align": 1, "text_horizontal_align": 0, "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.300000011920929, "text_color": -1, "text_bold": true, "text_italics": false, "text_underlined": false, "type_name": "Label"}, "children": []}]}, {"name": "SiteData", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "SiteIcon", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 0.119999997317791, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0.00999999977648258, "padding_z": 0.00999999977648258, "padding_w": 0.00999999977648258, "content": null, "children": []}, {"name": "SiteText", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"text": "Site:", "text_vertical_align": 1, "text_horizontal_align": 0, "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.300000011920929, "text_color": -1, "text_bold": true, "text_italics": false, "text_underlined": false, "type_name": "Label"}, "children": []}]}]}, {"name": "Bot", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 4, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "Tabs", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 0.270000010728836, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "Receptor", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "ReceptorButton", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"selected": false, "unusable": false, "text_active": true, "text_value_idle": "Receptor", "text_value_selected": "Receptor", "text_value_highlighted": "Receptor", "text_value_selected_highlighted": "Receptor", "text_value_unusable": "Receptor", "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.280000001192093, "text_underlined": false, "text_bolded": true, "text_vertical_align": 1, "text_horizontal_align": 1, "type_name": "Button"}, "children": []}]}, {"name": "Ligand", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "LigandButton", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"selected": false, "unusable": false, "text_active": true, "text_value_idle": "Ligand", "text_value_selected": "Ligand", "text_value_highlighted": "Ligand", "text_value_selected_highlighted": "Ligand", "text_value_unusable": "Ligand", "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.300000011920929, "text_underlined": false, "text_bolded": true, "text_vertical_align": 1, "text_horizontal_align": 1, "type_name": "Button"}, "children": []}]}, {"name": "Site", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "SiteButton", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"selected": false, "unusable": false, "text_active": true, "text_value_idle": "Site", "text_value_selected": "Site", "text_value_highlighted": "Site", "text_value_selected_highlighted": "Site", "text_value_unusable": "Site", "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.300000011920929, "text_underlined": false, "text_bolded": true, "text_vertical_align": 1, "text_horizontal_align": 1, "type_name": "Button"}, "children": []}]}]}, {"name": "List", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0.00999999977648258, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "Mesh", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"mesh_color": 691685119, "type_name": "Mesh"}, "children": []}, {"name": "ComplexList", "enabled": true, "layer": 1, "layout_orientation": 0, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0.00999999977648258, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"display_columns": 1, "display_rows": 3, "total_columns": 1, "unusable": false, "type_name": "List"}, "children": []}]}]}]}, {"name": "RightSide", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 0.75, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "Exhaustiveness", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0.0179999992251396, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "text", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"text": "Exhaust.", "text_vertical_align": 1, "text_horizontal_align": 0, "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.349999994039536, "text_color": -1, "text_bold": true, "text_italics": false, "text_underlined": false, "type_name": "Label"}, "children": []}, {"name": "ExhaustivenessInput", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 0.400000005960464, "forward_dist": 0.0020000000949949, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0.0149999996647239, "padding_w": 0.0149999996647239, "content": {"max_length": 10, "placeholder_text": "10", "input_text": "10", "type_name": "Text Input"}, "children": []}]}, {"name": "NumModes", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0.0179999992251396, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "text", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"text": "Num Modes", "text_vertical_align": 1, "text_horizontal_align": 0, "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.349999994039536, "text_color": -1, "text_bold": true, "text_italics": false, "text_underlined": false, "type_name": "Label"}, "children": []}, {"name": "ModesInput", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 0.400000005960464, "forward_dist": 0.0020000000949949, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0.0149999996647239, "padding_w": 0.0149999996647239, "content": {"max_length": 5, "placeholder_text": "5", "input_text": "5", "type_name": "Text Input"}, "children": []}]}, {"name": "Autobox", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0.0179999992251396, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "text", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"text": "Autobox", "text_vertical_align": 1, "text_horizontal_align": 0, "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.349999994039536, "text_color": -1, "text_bold": true, "text_italics": false, "text_underlined": false, "type_name": "Label"}, "children": []}, {"name": "AutoboxInput", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 0.400000005960464, "forward_dist": 0.0020000000949949, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0.0149999996647239, "padding_w": 0.0149999996647239, "content": {"max_length": 4, "placeholder_text": "4", "input_text": "4", "type_name": "Text Input"}, "children": []}]}, {"name": "AlignAfter", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0.0179999992251396, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "text", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"text": "Align After", "text_vertical_align": 1, "text_horizontal_align": 0, "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.349999994039536, "text_color": -1, "text_bold": true, "text_italics": false, "text_underlined": false, "type_name": "Label"}, "children": []}, {"name": "AlignButton", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 0.400000005960464, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0.0149999996647239, "padding_w": 0.0149999996647239, "content": {"selected": false, "unusable": false, "text_active": true, "text_value_idle": "off", "text_value_selected": "on", "text_value_highlighted": "off", "text_value_selected_highlighted": "on", "text_value_unusable": "off", "text_auto_size": true, "text_min_size": 0, "text_max_size": 72, "text_size": 1, "text_underlined": false, "text_bolded": true, "text_vertical_align": 1, "text_horizontal_align": 1, "type_name": "Button"}, "children": []}]}, {"name": "ScoringOnly", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0.0179999992251396, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "Text", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"text": "Scoring Only", "text_vertical_align": 1, "text_horizontal_align": 0, "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.330000013113022, "text_color": -1, "text_bold": true, "text_italics": false, "text_underlined": false, "type_name": "Label"}, "children": []}, {"name": "ScoringButton", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 0.400000005960464, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0.0149999996647239, "padding_w": 0.0149999996647239, "content": {"selected": false, "unusable": false, "text_active": true, "text_value_idle": "off", "text_value_selected": "on", "text_value_highlighted": "off", "text_value_selected_highlighted": "on", "text_value_unusable": "off", "text_auto_size": true, "text_min_size": 0, "text_max_size": 72, "text_size": 1, "text_underlined": false, "text_bolded": true, "text_vertical_align": 1, "text_horizontal_align": 1, "type_name": "Button"}, "children": []}]}, {"name": "Scoring Labels", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0.0179999992251396, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "text", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0.0020000000949949, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"text": "Visual Scores", "text_vertical_align": 1, "text_horizontal_align": 0, "text_auto_size": true, "text_min_size": 0, "text_max_size": 72, "text_size": 0.28999999165535, "text_color": -1, "text_bold": true, "text_italics": false, "text_underlined": false, "type_name": "Label"}, "children": []}, {"name": "VisualScoresButton", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 0.400000005960464, "forward_dist": 0.0020000000949949, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0.0149999996647239, "padding_w": 0.0149999996647239, "content": {"selected": false, "unusable": false, "text_active": true, "text_value_idle": "off", "text_value_selected": "on", "text_value_highlighted": "off", "text_value_selected_highlighted": "on", "text_value_unusable": "off", "text_auto_size": true, "text_min_size": 0, "text_max_size": 72, "text_size": 1, "text_underlined": false, "text_bolded": true, "text_vertical_align": 1, "text_horizontal_align": 1, "type_name": "Button"}, "children": []}]}, {"name": "Run", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "RunButton", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0.0179999992251396, "padding_y": 0, "padding_z": 0.0149999996647239, "padding_w": 0, "content": {"selected": false, "unusable": false, "text_active": true, "text_value_idle": "Run", "text_value_selected": "Run", "text_value_highlighted": "Run", "text_value_selected_highlighted": "Run", "text_value_unusable": "Running...", "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.430000007152557, "text_underlined": false, "text_bolded": true, "text_vertical_align": 1, "text_horizontal_align": 1, "type_name": "Button"}, "children": []}]}]}]}} \ No newline at end of file diff --git a/nanome_docking/_docking_menu_rhodium.json b/nanome_docking/_docking_menu_rhodium.json new file mode 100644 index 0000000..c837eb2 --- /dev/null +++ b/nanome_docking/_docking_menu_rhodium.json @@ -0,0 +1 @@ +{"title": "Docking", "version": 0, "width": 0.829999983310699, "height": 0.600000023841858, "is_menu": true, "effective_root": {"name": "Root", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 0, "sizing_value": 1, "forward_dist": 0, "padding_type": 1, "padding_x": -1, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"text": "", "text_vertical_align": 1, "text_horizontal_align": 1, "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 1, "text_color": -1, "text_bold": true, "text_italics": false, "text_underlined": false, "type_name": "Label"}, "children": [{"name": "LeftSide", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "Top", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 2, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "RecepeterData", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "ReceptorIcon", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 0.119999997317791, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0.00999999977648258, "padding_z": 0.00999999977648258, "padding_w": 0.00999999977648258, "content": null, "children": []}, {"name": "ReceptorText", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"text": "Receptor:", "text_vertical_align": 1, "text_horizontal_align": 0, "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.300000011920929, "text_color": -1, "text_bold": true, "text_italics": false, "text_underlined": false, "type_name": "Label"}, "children": []}]}, {"name": "LigandData", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "LigandIcon", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 0.119999997317791, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0.00999999977648258, "padding_z": 0.00999999977648258, "padding_w": 0.00999999977648258, "content": null, "children": []}, {"name": "LigandText", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"text": "Ligand:", "text_vertical_align": 1, "text_horizontal_align": 0, "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.300000011920929, "text_color": -1, "text_bold": true, "text_italics": false, "text_underlined": false, "type_name": "Label"}, "children": []}]}, {"name": "SiteData", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "SiteIcon", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 0.119999997317791, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0.00999999977648258, "padding_z": 0.00999999977648258, "padding_w": 0.00999999977648258, "content": null, "children": []}, {"name": "SiteText", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"text": "Site:", "text_vertical_align": 1, "text_horizontal_align": 0, "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.300000011920929, "text_color": -1, "text_bold": true, "text_italics": false, "text_underlined": false, "type_name": "Label"}, "children": []}]}]}, {"name": "Bot", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 4, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "Tabs", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 0.270000010728836, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "Receptor", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "ReceptorButton", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"selected": false, "unusable": false, "text_active": true, "text_value_idle": "Receptor", "text_value_selected": "Receptor", "text_value_highlighted": "Receptor", "text_value_selected_highlighted": "Receptor", "text_value_unusable": "Receptor", "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.280000001192093, "text_underlined": false, "text_bolded": true, "text_vertical_align": 1, "text_horizontal_align": 1, "type_name": "Button"}, "children": []}]}, {"name": "Ligand", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "LigandButton", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"selected": false, "unusable": false, "text_active": true, "text_value_idle": "Ligand", "text_value_selected": "Ligand", "text_value_highlighted": "Ligand", "text_value_selected_highlighted": "Ligand", "text_value_unusable": "Ligand", "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.300000011920929, "text_underlined": false, "text_bolded": true, "text_vertical_align": 1, "text_horizontal_align": 1, "type_name": "Button"}, "children": []}]}, {"name": "Site", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "SiteButton", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0.0020000000949949, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"selected": false, "unusable": false, "text_active": true, "text_value_idle": "Site", "text_value_selected": "Site", "text_value_highlighted": "Site", "text_value_selected_highlighted": "Site", "text_value_unusable": "Site", "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.300000011920929, "text_underlined": false, "text_bolded": true, "text_vertical_align": 1, "text_horizontal_align": 1, "type_name": "Button"}, "children": []}]}]}, {"name": "List", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0.00999999977648258, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "Mesh", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"mesh_color": 691685119, "type_name": "Mesh"}, "children": []}, {"name": "ComplexList", "enabled": true, "layer": 1, "layout_orientation": 0, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0.00999999977648258, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"display_columns": 1, "display_rows": 3, "total_columns": 1, "unusable": false, "type_name": "List"}, "children": []}]}]}]}, {"name": "RightSide", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 0.75, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "GridResolution", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0.0179999992251396, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "text", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"text": "Grid Res.", "text_vertical_align": 1, "text_horizontal_align": 0, "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.349999994039536, "text_color": -1, "text_bold": true, "text_italics": false, "text_underlined": false, "type_name": "Label"}, "children": []}, {"name": "GridResolutionInput", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 0.400000005960464, "forward_dist": 0.0020000000949949, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0.0149999996647239, "padding_w": 0.0149999996647239, "content": {"max_length": 5, "placeholder_text": "2.5", "input_text": "2.5", "type_name": "Text Input"}, "children": []}]}, {"name": "PosesCount", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0.0179999992251396, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "text", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"text": "Poses ct.", "text_vertical_align": 1, "text_horizontal_align": 0, "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.349999994039536, "text_color": -1, "text_bold": true, "text_italics": false, "text_underlined": false, "type_name": "Label"}, "children": []}, {"name": "PosesCountInput", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 0.400000005960464, "forward_dist": 0.0020000000949949, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0.0149999996647239, "padding_w": 0.0149999996647239, "content": {"max_length": 3, "placeholder_text": "128", "input_text": "128", "type_name": "Text Input"}, "children": []}]}, {"name": "RotamerCount", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0.0179999992251396, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "text", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"text": "Rotamer ct.", "text_vertical_align": 1, "text_horizontal_align": 0, "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.349999994039536, "text_color": -1, "text_bold": true, "text_italics": false, "text_underlined": false, "type_name": "Label"}, "children": []}, {"name": "RotamerCountInput", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 0.400000005960464, "forward_dist": 0.0020000000949949, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0.0149999996647239, "padding_w": 0.0149999996647239, "content": {"max_length": 2, "placeholder_text": "6", "input_text": "6", "type_name": "Text Input"}, "children": []}]}, {"name": "AlignAfter", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0.0179999992251396, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "text", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"text": "Align After", "text_vertical_align": 1, "text_horizontal_align": 0, "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.349999994039536, "text_color": -1, "text_bold": true, "text_italics": false, "text_underlined": false, "type_name": "Label"}, "children": []}, {"name": "AlignButton", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 0.400000005960464, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0.0149999996647239, "padding_w": 0.0149999996647239, "content": {"selected": false, "unusable": false, "text_active": true, "text_value_idle": "off", "text_value_selected": "on", "text_value_highlighted": "off", "text_value_selected_highlighted": "on", "text_value_unusable": "off", "text_auto_size": true, "text_min_size": 0, "text_max_size": 72, "text_size": 1, "text_underlined": false, "text_bolded": true, "text_vertical_align": 1, "text_horizontal_align": 1, "type_name": "Button"}, "children": []}]}, {"name": "IgnoreHet", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0.0179999992251396, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "Text", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": {"text": "Ignore Het.", "text_vertical_align": 1, "text_horizontal_align": 0, "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.330000013113022, "text_color": -1, "text_bold": true, "text_italics": false, "text_underlined": false, "type_name": "Label"}, "children": []}, {"name": "IgnoreHetButton", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 0.400000005960464, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0.0149999996647239, "padding_w": 0.0149999996647239, "content": {"selected": false, "unusable": false, "text_active": true, "text_value_idle": "off", "text_value_selected": "on", "text_value_highlighted": "off", "text_value_selected_highlighted": "on", "text_value_unusable": "off", "text_auto_size": true, "text_min_size": 0, "text_max_size": 72, "text_size": 1, "text_underlined": false, "text_bolded": true, "text_vertical_align": 1, "text_horizontal_align": 1, "type_name": "Button"}, "children": []}]}, {"name": "Run", "enabled": true, "layer": 0, "layout_orientation": 1, "sizing_type": 2, "sizing_value": 1, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": [{"name": "RunButton", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0.0179999992251396, "padding_y": 0, "padding_z": 0.0149999996647239, "padding_w": 0, "content": {"selected": false, "unusable": false, "text_active": true, "text_value_idle": "Run", "text_value_selected": "Run", "text_value_highlighted": "Run", "text_value_selected_highlighted": "Run", "text_value_unusable": "Running...", "text_auto_size": false, "text_min_size": 0, "text_max_size": 72, "text_size": 0.430000007152557, "text_underlined": false, "text_bolded": true, "text_vertical_align": 1, "text_horizontal_align": 1, "type_name": "Button"}, "children": []}]}, {"name": "Logo", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 2, "sizing_value": 1.5, "forward_dist": 0, "padding_type": 0, "padding_x": 0.01, "padding_y": 0, "padding_z": 0.01, "padding_w": 0, "content": null, "children": [{"name": "LogoImage", "enabled": true, "layer": 0, "layout_orientation": 0, "sizing_type": 0, "sizing_value": 0, "forward_dist": 0, "padding_type": 0, "padding_x": 0, "padding_y": 0, "padding_z": 0, "padding_w": 0, "content": null, "children": []}]}]}]}} \ No newline at end of file diff --git a/nanome_docking/swri_logo.png b/nanome_docking/swri_logo.png new file mode 100644 index 0000000..4ecbbc1 Binary files /dev/null and b/nanome_docking/swri_logo.png differ diff --git a/publish.sh b/publish.sh old mode 100644 new mode 100755 diff --git a/setup.py b/setup.py index eddccc2..79b4f8e 100644 --- a/setup.py +++ b/setup.py @@ -1,12 +1,13 @@ -import pathlib +import os from setuptools import find_packages, setup -README = (pathlib.Path(__file__).parent / "README.md").read_text() +with open(os.path.join(os.path.dirname(__file__), "README.md"), 'r') as file: + README = file.read() setup( name = 'nanome-docking', packages=find_packages(), - version = '0.1.4', + version = '0.1.5', license='MIT', description = 'Nanome Plugin to dock ligands to a receptor', long_description = README,