{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Blue Brain BioExplorer\n", "\n", "![](../bioexplorer_banner.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Simplest script to create a visualization of an enzyme reaction" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from bioexplorer import BioExplorer, Protein, EnzymeReaction, MolecularSystemAnimationParams, \\\n", " Volume, Vector3, Quaternion\n", "import os\n", "\n", "be = BioExplorer('localhost:5000')\n", "core = be.core_api()\n", "status = be.reset_scene()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "representation=be.protein_representation.ATOMS_AND_STICKS\n", "atom_radius_multiplier=1.0\n", "draft = True\n", "generate_movie = False\n", "\n", "# Resources\n", "resource_folder = os.path.abspath('../../tests/test_files')\n", "pdb_folder = os.path.join(resource_folder, 'pdb')\n", "metabolites_folder = os.path.join(pdb_folder, 'metabolites')\n", "enzymes_folder = os.path.join(pdb_folder, 'enzymes')\n", "mesh_folder = os.path.join(resource_folder, 'obj')\n", "\n", "pdb_glucose = os.path.join(metabolites_folder, '5793.pdb')\n", "pdb_atp = os.path.join(metabolites_folder, '59.pdb')\n", "pdb_g6p = os.path.join(metabolites_folder, '439284.pdb')\n", "pdb_adp = os.path.join(metabolites_folder, '6022.pdb')\n", "pdb_hexokinase = os.path.join(enzymes_folder, '1bdg.pdb')\n", "\n", "be.set_general_settings(logging_level=3, mesh_folder=mesh_folder)\n", "\n", "scene_size = Vector3(200.0, 200.0, 200.0)\n", "nb_occurences = 200\n", "seed = 5" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def add_molecule(\n", " seed, position_seed, name, pdb_file, nb_occurence,\n", " representation=be.protein_representation.ATOMS_AND_STICKS, rotation=Quaternion()):\n", " protein = Protein(\n", " name=name,\n", " source=pdb_file,\n", " load_bonds=True, load_hydrogen=True, load_non_polymer_chemicals=True,\n", " occurrences=nb_occurence, animation_params=MolecularSystemAnimationParams(seed, position_seed, 25.0, seed, 0.025),\n", " rotation=rotation\n", " )\n", " volume = Volume(\n", " name=name + 's',\n", " shape=be.assembly_shape.CUBE, shape_params=scene_size,\n", " protein=protein)\n", " be.add_volume(\n", " volume=volume,\n", " atom_radius_multiplier=atom_radius_multiplier, representation=representation)\n", " return protein\n", "\n", "# Substrates\n", "substrates = list()\n", "substrates.append(\n", " add_molecule(seed, 6, 'Glucose', pdb_glucose, nb_occurences))\n", "substrates.append(\n", " add_molecule(seed, 7, 'ATP', pdb_atp, nb_occurences))\n", "\n", "# Product\n", "products = list()\n", "products.append(\n", " add_molecule(seed, 8, 'G6P', pdb_g6p, nb_occurences))\n", "products.append(\n", " add_molecule(seed, 9, 'ADP', pdb_adp, nb_occurences))\n", "\n", "# Hexokinase\n", "enzyme = add_molecule(\n", " seed, 0, 'Hexokinase', pdb_hexokinase, nb_occurences, \n", " be.protein_representation.ATOMS_AND_STICKS, Quaternion(0.707, 0.707, 0.0, 0.0)\n", ")\n", "\n", "# Enzyme reaction\n", "enzyme_reaction = EnzymeReaction(\n", " assembly_name='Hexokinase',\n", " name='Hexokinase',\n", " enzyme=enzyme,\n", " substrates=substrates,\n", " products=products)\n", "\n", "# Add the reaction to the scene\n", "status = be.add_enzyme_reaction(enzyme_reaction)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Rendering settings" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "status = be.core_api().set_renderer(\n", " background_color=[96 / 255, 125 / 255, 139 / 255],\n", " current='advanced',\n", " samples_per_pixel=1, subsampling=4, max_accum_frames=16)\n", "params = status = be.core_api().AdvancedRendererParams()\n", "params.gi_samples = 2\n", "params.gi_strength = 0.2\n", "params.gi_ray_length = 5\n", "params.shadow_intensity = 1.0\n", "params.soft_shadow_strength = 1.0\n", "params.fog_start = 1500\n", "params.fog_thickness = 1500\n", "params.max_ray_depth = 1\n", "status = be.core_api().set_renderer_params(params)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Materials" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "status = be.set_protein_color_scheme(\n", " assembly_name='ATPs', name='ATP',\n", " color_scheme=be.protein_color_scheme.ATOMS,\n", " palette_name='Blues', palette_size=2)\n", "\n", "status = be.set_protein_color_scheme(\n", " assembly_name='Glucoses', name='Glucose',\n", " color_scheme=be.protein_color_scheme.ATOMS,\n", " palette_name='Blues', palette_size=2)\n", "\n", "\n", "status = be.set_protein_color_scheme(\n", " assembly_name='ADPs', name='ADP',\n", " color_scheme=be.protein_color_scheme.ATOMS,\n", " palette_name='Set1', palette_size=3)\n", "\n", "status = be.set_protein_color_scheme(\n", " assembly_name='G6Ps', name='G6P',\n", " color_scheme=be.protein_color_scheme.ATOMS,\n", " palette_name='Set1', palette_size=3)\n", "\n", "status = be.set_protein_color_scheme(\n", " assembly_name='Hexokinases', name='Hexokinase',\n", " color_scheme=be.protein_color_scheme.CHAINS,\n", " palette_name='Reds', palette_size=2)\n", "be.core_api().set_renderer()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Movie" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from bioexplorer import MovieMaker\n", "mm = MovieMaker(be)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "if draft:\n", " instance_id = 2\n", " key_frames = [\n", " {\n", " 'apertureRadius': 0.0,\n", " 'direction': [-0.4228059199334163, 0.13956182704765893, -0.8954092084071824],\n", " 'focalDistance': 1000000.0,\n", " 'origin': [-76.94388312721057, 27.008762696107365, 101.90818416814368],\n", " 'up': [0.03825535069708487, 0.9899381257456357, 0.13623155045091803]\n", " }, \n", " {\n", " 'apertureRadius': 0.0,\n", " 'direction': [-0.2931756929393873, -0.19137884221190335, -0.9367081465553406],\n", " 'focalDistance': 1000000.0,\n", " 'origin': [-80.78751362339919, 32.810933007328735, 98.7370846157903],\n", " 'up': [-0.04288359642471887, 0.9814064493156495, -0.18708922577030282]\n", " }\n", " ]\n", "else:\n", " instance_id = 25\n", " key_frames = [\n", " {\n", " 'apertureRadius': 0.0,\n", " 'direction': [-0.813281188551245, -0.09740833983733163, -0.5736595886750337],\n", " 'focalDistance': 1000000.0,\n", " 'origin': [11.06562396175978, -42.45183472913227, 71.07319024762178],\n", " 'up': [-0.26548353789130863, 0.9394084115205614, 0.2168647677081957]\n", " }, \n", " {\n", " 'apertureRadius': 0.0,\n", " 'direction': [-0.06265926430929034, -0.21184739821321946, -0.975292005743156],\n", " 'focalDistance': 1000000.0,\n", " 'origin': [-3.900908980540925, -40.62438454349056, 76.12253643837245],\n", " 'up': [0.09475544149237422, 0.9715352310065103, -0.21711909455575734]\n", " }\n", " ] " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from tqdm import tqdm\n", "\n", "nb_frames = 360\n", "output_folder = '/tmp'\n", "if draft:\n", " image_size=[960, 540]\n", "else:\n", " image_size=[3840, 2160]\n", "\n", "mm.build_camera_path(key_frames, nb_frames, 1)\n", "\n", "if generate_movie:\n", " for frame in tqdm(range(nb_frames)):\n", " mm.set_current_frame(frame)\n", " for instance in range(nb_occurences):\n", " progress = float(frame + instance) / float(nb_frames)\n", " be.set_enzyme_reaction_progress(\n", " enzyme_reaction, instance_id=instance, progress=progress)\n", " mm.create_snapshot(\n", " renderer='advanced',\n", " path=os.path.join(output_folder, 'advanced'), base_name='%05d' % frame,\n", " size=image_size, samples_per_pixel=64)\n", " mm.create_snapshot(\n", " renderer='depth',\n", " path=os.path.join(output_folder, 'depth'), base_name='%05d' % frame,\n", " size=image_size, samples_per_pixel=1)\n", "else:\n", " be.core_api().set_renderer(\n", " current='basic',\n", " samples_per_pixel=1, subsampling=1, max_accum_frames=1)\n", " model_id = core.scene.models[len(core.scene.models)-1]['id']\n", " import time\n", " for frame in tqdm(range(nb_frames)):\n", " mm.set_current_frame(frame)\n", " progress = float(frame) / float(nb_frames)\n", " for instance in range(nb_occurences):\n", " progress = float(frame + instance) / float(nb_frames)\n", " be.set_enzyme_reaction_progress(\n", " enzyme_reaction, instance_id=instance, progress=progress)\n", " be.core_api().set_renderer()\n", " time.sleep(0.1)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.8.10 ('env')", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.12" }, "vscode": { "interpreter": { "hash": "ea9a5fa46eb6bad2806a8ea1d08e15bb1e255a2d4320b81e765591579963c56b" } } }, "nbformat": 4, "nbformat_minor": 4 }