def _add_surfactants_a(self, frame): spa_sequences = [[0, 3750]] spa_random_seeds = [2] spa_frames = [ [ Vector3(-400.0, -100.0, 100.0), Quaternion(-0.095, 0.652, -0.326, 0.677), Vector3(250.0, -50.0, 100.0), Quaternion(1.0, 0.0, 0.0, 0.0), ROTATION_MODE_SINUSOIDAL ], ] for surfactant_index in range(len(spa_frames)): name = 'Surfactant-A ' + str(surfactant_index) sequence = spa_sequences[surfactant_index] pos, rot, progress = self._get_transformation( start_frame=sequence[0], end_frame=sequence[1], frame=frame, data=spa_frames[surfactant_index]) self._log(3, '- ' + name + ' (%.01f pct)' % progress) self._add_surfactant_a( name=name, position=pos, rotation=rot, random_seed=spa_random_seeds[surfactant_index]) self._add_glucose_to_surfactant_head(name=name)
def add_cell(bioexplorer, name, size, height, position=Vector3()): ace2_receptor = Protein(sources=[PDB_FOLDER + '6m18.pdb'], occurences=20, position=Vector3(0.0, 6.0, 0.0)) membrane = ParametricMembrane(sources=[ MEMBRANE_FOLDER + 'segA.pdb', MEMBRANE_FOLDER + 'segB.pdb', MEMBRANE_FOLDER + 'segC.pdb', MEMBRANE_FOLDER + 'segD.pdb' ], occurences=1200000) cell = Cell(name=name, size=size, shape=bioexplorer.ASSEMBLY_SHAPE_SINUSOIDAL, membrane=membrane, receptor=ace2_receptor, extra_parameters=[height], random_position_seed=1, random_position_strength=0.025, random_rotation_seed=2, random_rotation_strength=2.0) bioexplorer.add_cell(cell=cell, position=position, representation=PROTEIN_REPRESENTATION) if ADD_GLYCANS: bioexplorer.add_multiple_glycans( representation=PROTEIN_REPRESENTATION, assembly_name=name, glycan_type=bioexplorer.NAME_GLYCAN_COMPLEX, protein_name=bioexplorer.NAME_RECEPTOR, paths=COMPLEX_PATHS, indices=[53, 90, 103, 322, 432, 690]) bioexplorer.add_multiple_glycans( representation=PROTEIN_REPRESENTATION, assembly_name=name, glycan_type=bioexplorer.NAME_GLYCAN_HYBRID, protein_name=bioexplorer.NAME_RECEPTOR, paths=HYBRID_PATHS, indices=[546]) indices = [[155, Quaternion(0.707, 0.0, 0.707, 0.0)], [730, Quaternion(0.707, 0.0, 0.707, 0.0)]] for index in indices: o_glycan_name = name + '_' + bioexplorer.NAME_GLYCAN_O_GLYCAN + '_' + str( index[0]) o_glycan = Sugars(assembly_name=name, name=o_glycan_name, source=O_GLYCAN_PATHS[0], protein_name=name + '_' + bioexplorer.NAME_RECEPTOR, representation=PROTEIN_REPRESENTATION, chain_ids=[2, 4], site_indices=[index[0]], rotation=index[1]) bioexplorer.add_sugars(o_glycan)
def _add_lymphocyte(self, frame): if frame < 1400: '''Lymphocyte is not in the field of view''' return '''Protein animation params''' params = [0, 0, 0.0, frame + 2, 0.2] clip_planes = [ [1.0, 0.0, 0.0, scene_size * 1.5 + 5], [-1.0, 0.0, 0.0, scene_size * 1.5 + 5], [0.0, 0.0, 1.0, scene_size + 5], [0.0, 0.0, -1.0, scene_size + 5] ] name = 'Emile' lymphocyte_sequence = [0, 3750] lymphocyte_frames = [Vector3(-2500.0, 100.0, 30.0), Quaternion(1.0, 0.0, 0.0, 0.0), Vector3(-830.0, 100.0, 30.0), Quaternion(0.707, 0.707, 0.0, 0.0), ROTATION_MODE_LINEAR] protein_sources = [ membrane_folder + 'segA.pdb', membrane_folder + 'segB.pdb', membrane_folder + 'segC.pdb', membrane_folder + 'segD.pdb' ] mesh_based_membrane = MeshBasedMembrane( mesh_source=lymphocyte_path, protein_sources=protein_sources, density=lymphocyte_density, surface_variable_offset=lymphocyte_surface_variable_offset, assembly_params=params ) pos, rot, progress = self._get_transformation( start_frame=lymphocyte_sequence[0], end_frame=lymphocyte_sequence[1], frame=frame, data=lymphocyte_frames) self._log(3, '- ' + name + ' (%.01f pct)' % progress) scale = Vector3(1.0, 1.0, 1.0) status = self._be.add_mesh_based_membrane( name, mesh_based_membrane, position=pos, rotation=rot, scale=scale, clipping_planes=clip_planes ) for i in range(len(protein_sources)): status = self._be.set_protein_color_scheme( assembly_name=name, name=BioExplorer.NAME_MEMBRANE + '_' + str(i), color_scheme=BioExplorer.COLOR_SCHEME_CHAINS, palette_name='OrRd', palette_size=5)
def _add_surfactants_d(self, frame): spd_sequences = [[0, 3750], [0, 2600], [0, 2600], [0, 3750]] spd_random_seeds = [1, 1, 1, 2] spd_flights = [ [Vector3(300, 124.0, 0.0), Quaternion(-0.095, 0.652, -0.326, 0.677), Vector3(74.0, 24.0, -45.0), Quaternion(1.0, 0.0, 0.0, 0.0), ROTATION_MODE_SINUSOIDAL], # SP-D is used for the head focus on 3rd virus spike [Vector3(-50, 250.0, 20.0), Quaternion(0.087, 0.971, -0.147, -0.161), Vector3(-11.0, 108.0, 20.0), Quaternion(1.0, 0.0, 0.0, 0.0), ROTATION_MODE_LINEAR], # SP-D attaching to lymphocyte [Vector3(-200.0, 100.0, 100.0), Quaternion(0.519, 0.671, 0.528, -0.036), Vector3(-135.0, 135.0, 140.0), Quaternion(1.0, 0.0, 0.0, 0.0), ROTATION_MODE_LINEAR], [Vector3(100.0, 0.0, -80.0), Quaternion(-0.095, 0.652, -0.326, 0.677), Vector3(-260.0, 50.0, 150.0), Quaternion(1.0, 0.0, 0.0, 0.0), ROTATION_MODE_SINUSOIDAL] ] for surfactant_index in range(len(spd_sequences)): name = 'Surfactant-D ' + str(surfactant_index) sequence = spd_sequences[surfactant_index] pos, rot, progress = self._get_transformation( start_frame=sequence[0], end_frame=sequence[1], frame=frame, data=spd_flights[surfactant_index]) self._log(3, '- ' + name + ' (%.01f pct)' % progress) self._add_surfactant_d( name=name, position=pos, rotation=rot, random_seed=spd_random_seeds[surfactant_index])
def test_layout(): resource_folder = 'tests/test_files/' pdb_folder = resource_folder + 'pdb/' bio_explorer = BioExplorer('localhost:5000') bio_explorer.reset() print('BioExplorer version ' + bio_explorer.version()) # Suspend image streaming bio_explorer.core_api().set_application_parameters(image_stream_fps=0) # Camera brayns = bio_explorer.core_api() brayns.set_camera( current='orthographic', orientation=[0.0, 0.0, 0.0, 1.0], position=[23.927943790322814, 24.84577580212592, 260.43975983632527], target=[23.927943790322814, 24.84577580212592, 39.93749999999999]) params = brayns.OrthographicCameraParams() params.height = 55 brayns.set_camera_params(params) # ACE2 Receptor ace2_receptor = Protein(sources=[pdb_folder + '6m1d.pdb']) bio_explorer.add_protein('ACE2 receptor', ace2_receptor, rotation=Quaternion(0.5, 0.5, 1.0, 0.0)) # Restore image streaming bio_explorer.core_api().set_application_parameters(image_stream_fps=20)
def test_layout(): resource_folder = 'tests/test_files/' pdb_folder = resource_folder + 'pdb/' bio_explorer = BioExplorer('localhost:5000') bio_explorer.reset() print('BioExplorer version ' + bio_explorer.version()) # Suspend image streaming bio_explorer.core_api().set_application_parameters(image_stream_fps=0) # Resources protein_representation = BioExplorer.REPRESENTATION_ATOMS_AND_STICKS protein_radius_multiplier = 1.0 glycan_representation = BioExplorer.REPRESENTATION_ATOMS_AND_STICKS glycan_radius_multiplier = 1.0 # M Protein source = pdb_folder + 'QHD43419a.pdb' m_protein = Protein(sources=[source], load_hydrogen=False, load_non_polymer_chemicals=False) name = bio_explorer.NAME_PROTEIN_M bio_explorer.add_protein(name=name, protein=m_protein, atom_radius_multiplier=protein_radius_multiplier, representation=protein_representation) # Glycans glycan_folder = pdb_folder + 'glycans/' high_mannose_paths = [ glycan_folder + 'high-mannose/1.pdb', glycan_folder + 'high-mannose/2.pdb', glycan_folder + 'high-mannose/3.pdb', glycan_folder + 'high-mannose/4.pdb' ] # High-mannose glycans on Protein M indices = [5] high_mannose_glycans = Sugars( rotation=Quaternion(0.707, 0.0, 0.0, 0.707), assembly_name=name, name=bio_explorer.NAME_GLYCAN_HIGH_MANNOSE, protein_name=name, source=high_mannose_paths[0], site_indices=indices, representation=glycan_representation, atom_radius_multiplier=glycan_radius_multiplier) bio_explorer.add_glycans(high_mannose_glycans) # Materials bio_explorer.apply_default_color_scheme( shading_mode=bio_explorer.SHADING_MODE_BASIC) # Restore image streaming bio_explorer.core_api().set_application_parameters(image_stream_fps=20)
def _get_transformation(self, start_frame, end_frame, frame, data): '''Progress''' progress = (frame - start_frame) * 1.0 / (end_frame - start_frame) progress = max(0.0, progress) progress = min(1.0, progress) '''Position''' start_pos = data[0].to_list() end_pos = data[2].to_list() pos = start_pos for i in range(3): pos[i] += (end_pos[i] - start_pos[i]) * progress '''Rotation''' start_rot = data[1] end_rot = data[3] rot = Quaternion.slerp(start_rot, end_rot, progress) if data[4] == ROTATION_MODE_SINUSOIDAL: rot = Quaternion.slerp(start_rot, end_rot, math.cos((progress - 0.5) * math.pi)) return [Vector3(pos[0], pos[1], pos[2]), rot, progress * 100.0]
def test_cell(): resource_folder = 'tests/test_files/' pdb_folder = resource_folder + 'pdb/' bio_explorer = BioExplorer('localhost:5000') bio_explorer.reset() # Suspend image streaming bio_explorer.core_api().set_application_parameters(image_stream_fps=0) # Proteins protein_representation = bio_explorer.REPRESENTATION_ATOMS # Membrane parameters membrane_size = 800.0 membrane_height = 80 membrane_nb_receptors = 20 membrane_nb_lipids = 1200000 # ACE2 Receptor ace2_receptor = Protein( sources=[pdb_folder + '6m1d.pdb'], occurences=membrane_nb_receptors, position=Vector3(0.0, 6.0, 0.0)) membrane = ParametricMembrane( sources=[pdb_folder + 'membrane/popc.pdb'], occurences=membrane_nb_lipids) cell = Cell( name='Cell', size=membrane_size, shape=bio_explorer.ASSEMBLY_SHAPE_SINUSOIDAL, membrane=membrane, receptor=ace2_receptor, extra_parameters=[membrane_height]) bio_explorer.add_cell( cell=cell, position=Vector3(4.5, -186, 7.0), rotation=Quaternion(1, 0, 0, 0), representation=protein_representation, random_seed=1) # Set rendering settings bio_explorer.core_api().set_renderer( background_color=[96 / 255, 125 / 255, 139 / 255], current='bio_explorer', samples_per_pixel=1, subsampling=4, max_accum_frames=64) params = bio_explorer.core_api().BioExplorerRendererParams() params.shadows = 0.75 params.soft_shadows = 1.0 bio_explorer.core_api().set_renderer_params(params) # Restore image streaming bio_explorer.core_api().set_application_parameters(image_stream_fps=20)
def _add_surfactants_d(self, frame): spd_sequences = [[-1550, 3750], [0, 3750], [0, 3750]] spd_random_seeds = [1, 2, 6] spd_flights = [[ Vector3(-340.0, 0.0, -100.0), Quaternion(-0.095, 0.652, -0.326, 0.677), Vector3(74.0 + (74.0 + 340), 24.0 + (24.0 - 0.0), -45.0 + (-45.0 + 100)), Quaternion(1.0, 0.0, 0.0, 0.0), ROTATION_MODE_SINUSOIDAL ], [ Vector3(-200, 0.0, -200.0), Quaternion(0.087, 0.971, -0.147, -0.161), Vector3(304.0, 75.0, -100.0), Quaternion(1.0, 0.0, 0.0, 0.0), ROTATION_MODE_SINUSOIDAL ], [ Vector3(-460.0, 50.0, 0.0), Quaternion(0.519, 0.671, 0.528, -0.036), Vector3(160.0, -50.0, -50.0), Quaternion(1.0, 0.0, 0.0, 0.0), ROTATION_MODE_SINUSOIDAL ]] for surfactant_index in range(len(spd_sequences)): name = 'Surfactant-D ' + str(surfactant_index) sequence = spd_sequences[surfactant_index] pos, rot, progress = self._get_transformation( start_frame=sequence[0], end_frame=sequence[1], frame=frame, data=spd_flights[surfactant_index]) self._log(3, '- ' + name + ' (%.01f pct)' % progress) self._add_surfactant_d( name=name, position=pos, rotation=rot, random_seed=spd_random_seeds[surfactant_index]) self._add_glucose_to_surfactant_head(name=name)
def test_virus(): resource_folder = 'tests/test_files/' pdb_folder = resource_folder + 'pdb/' rna_folder = resource_folder + 'rna/' glycan_folder = pdb_folder + 'glycans/' bio_explorer = BioExplorer('localhost:5000') bio_explorer.reset() # Settings virus_radius = 45.0 add_glycans = True protein_radius_multiplier = 1.0 protein_representation = BioExplorer.REPRESENTATION_ATOMS protein_load_hydrogen = False # Virus configuration nb_protein_s = 62 nb_protein_s_indices = [1, 27, 43] nb_protein_e = 42 nb_protein_m = 50 show_rna = True # Virus parameters show_functional_regions = False show_glycosylation_sites = False # Suspend image streaming bio_explorer.core_api().set_application_parameters(image_stream_fps=0) # Protein S open_conformation_indices = nb_protein_s_indices closed_conformation_indices = list() for i in range(nb_protein_s): if i not in open_conformation_indices: closed_conformation_indices.append(i) params = [11.5, 0, 0.0, 0, 0.0, 0.0] virus_protein_s = Protein( sources=[pdb_folder + '6vyb.pdb', pdb_folder + 'sars-cov-2-v1.pdb'], load_hydrogen=protein_load_hydrogen, occurences=nb_protein_s, assembly_params=params, rotation=Quaternion(0.087, 0.0, 0.996, 0.0), instance_indices=[open_conformation_indices, closed_conformation_indices]) # Protein M (QHD43419) params = [2.5, 0, 0.0, 0, 0.0, 0.0] virus_protein_m = Protein( sources=[pdb_folder + 'QHD43419a.pdb'], load_hydrogen=protein_load_hydrogen, occurences=nb_protein_m, assembly_params=params, rotation=Quaternion(0.99, 0.0, 0.0, 0.135)) # Protein E (QHD43418 P0DTC4) params = [2.5, 0, 0.0, 0, 0.0, 0.0] virus_protein_e = Protein( sources=[pdb_folder + 'QHD43418a.pdb'], load_hydrogen=protein_load_hydrogen, occurences=nb_protein_e, assembly_params=params, rotation=Quaternion(0.705, 0.705, -0.04, -0.04)) # Virus membrane virus_membrane = ParametricMembrane( sources=[pdb_folder + 'membrane/popc.pdb'], occurences=15000) # RNA Sequence clip_planes = list() rna_sequence = None if show_rna: clip_planes.append([0.0, 0.0, -1.0, 15.0]) rna_sequence = RNASequence( source=rna_folder + 'sars-cov-2.rna', assembly_params=[11.0, 0.5], t_range=Vector2(0, 30.5 * math.pi), shape=bio_explorer.RNA_SHAPE_TREFOIL_KNOT, shape_params=Vector3(1.51, 1.12, 1.93)) # Coronavirus name = 'Coronavirus' coronavirus = Virus( name=name, protein_s=virus_protein_s, protein_e=virus_protein_e, protein_m=virus_protein_m, membrane=virus_membrane, rna_sequence=rna_sequence, assembly_params=[virus_radius, 1, 0.025, 2, 0.4, 0.0]) bio_explorer.add_virus( virus=coronavirus, position=Vector3(-70.0, -100.0, 230.0), representation=protein_representation, atom_radius_multiplier=protein_radius_multiplier, clipping_planes=clip_planes) # Glycans if add_glycans: complex_paths = [glycan_folder + 'complex/5.pdb', glycan_folder + 'complex/15.pdb', glycan_folder + 'complex/25.pdb', glycan_folder + 'complex/35.pdb'] high_mannose_paths = [ glycan_folder + 'high-mannose/1.pdb', glycan_folder + 'high-mannose/2.pdb', glycan_folder + 'high-mannose/3.pdb', glycan_folder + 'high-mannose/4.pdb'] o_glycan_paths = [glycan_folder + 'o-glycan/12.pdb'] # High-mannose indices_closed = [61, 122, 234, 603, 709, 717, 801, 1074] indices_open = [61, 122, 234, 709, 717, 801, 1074] bio_explorer.add_multiple_glycans( assembly_name=name, glycan_type=bio_explorer.NAME_GLYCAN_HIGH_MANNOSE, protein_name=bio_explorer.NAME_PROTEIN_S_CLOSED, paths=high_mannose_paths, indices=indices_closed, representation=protein_representation, atom_radius_multiplier=protein_radius_multiplier) bio_explorer.add_multiple_glycans( assembly_name=name, glycan_type=bio_explorer.NAME_GLYCAN_HIGH_MANNOSE, protein_name=bio_explorer.NAME_PROTEIN_S_OPEN, paths=high_mannose_paths, indices=indices_open, representation=protein_representation, atom_radius_multiplier=protein_radius_multiplier) # Complex indices1 = [17, 74, 149, 165, 282, 331, 343, 616, 657, 1098, 1134, 1158, 1173, 1194] indices2 = [17, 74, 149, 165, 282, 331, 343, 1098, 657, 1134, 1158, 1173, 1194] bio_explorer.add_multiple_glycans( assembly_name=name, glycan_type=bio_explorer.NAME_GLYCAN_COMPLEX, protein_name=bio_explorer.NAME_PROTEIN_S_CLOSED, paths=complex_paths, indices=indices1, representation=protein_representation, atom_radius_multiplier=protein_radius_multiplier) bio_explorer.add_multiple_glycans( assembly_name=name, glycan_type=bio_explorer.NAME_GLYCAN_COMPLEX, protein_name=bio_explorer.NAME_PROTEIN_S_OPEN, paths=complex_paths, indices=indices2, representation=protein_representation, atom_radius_multiplier=protein_radius_multiplier) # O-Glycans for index in [323, 325]: o_glycan_name = name + '_' + bio_explorer.NAME_GLYCAN_O_GLYCAN + '_' + str(index) o_glycan = Sugars( assembly_name=name, name=o_glycan_name, source=o_glycan_paths[0], protein_name=name + '_' + bio_explorer.NAME_PROTEIN_S_CLOSED, representation=protein_representation, site_indices=[index], atom_radius_multiplier=protein_radius_multiplier) bio_explorer.add_sugars(o_glycan) # High-mannose glycans on Protein M indices = [5] protein_name = name + '_' + bio_explorer.NAME_PROTEIN_M high_mannose_glycans = Sugars( rotation=Quaternion(0.707, 0.0, 0.0, 0.707), assembly_name=name, name=protein_name + '_' + bio_explorer.NAME_GLYCAN_HIGH_MANNOSE, protein_name=protein_name, source=high_mannose_paths[0], site_indices=indices, representation=protein_representation ) bio_explorer.add_glycans(high_mannose_glycans) # Complex glycans on Protein E indices = [48, 66] protein_name = name + '_' + bio_explorer.NAME_PROTEIN_E complex_glycans = Sugars( rotation=Quaternion(0.707, 0.0, 0.0, 0.707), assembly_name=name, name=protein_name + '_' + bio_explorer.NAME_GLYCAN_COMPLEX, protein_name=protein_name, source=complex_paths[0], site_indices=indices, representation=protein_representation ) bio_explorer.add_glycans(complex_glycans) # Apply default materials bio_explorer.apply_default_color_scheme(shading_mode=bio_explorer.SHADING_MODE_BASIC) # Functional regions on open spike if show_functional_regions: indices = [1, 16, 306, 330, 438, 507, 522, 816, 835, 908, 986, 1076, 1274, 2000] region_colors = [ [1.0, 1.0, 1.0], [0.0, 0.0, 1.0], [1.0, 1.0, 1.0], [0.0, 1.0, 0.0], [0.4, 0.1, 0.1], [0.0, 1.0, 0.0], [1.0, 1.0, 1.0], [1.0, 0.0, 0.0], [1.0, 1.0, 1.0], [1.0, 1.0, 0.0], [1.0, 1.0, 1.0], [1.0, 0.0, 1.0], [1.0, 1.0, 1.0], [1.0, 1.0, 1.0]] palette = list() for index in range(len(indices) - 1): for i in range(0, indices[index + 1] - indices[index]): color = list() for j in range(3): color.append(region_colors[index][j] * 1) palette.append(color) bio_explorer.set_protein_color_scheme( assembly_name=name, name=name + '_' + bio_explorer.NAME_PROTEIN_S_OPEN, color_scheme=bio_explorer.COLOR_SCHEME_REGION, palette=palette) # Display glycosylation sites if show_glycosylation_sites: palette = sns.color_palette('Set2', 2) bio_explorer.set_protein_color_scheme( assembly_name=name, name=name + '_' + bio_explorer.NAME_PROTEIN_S_OPEN, color_scheme=bio_explorer.COLOR_SCHEME_GLYCOSYLATION_SITE, palette=palette) bio_explorer.set_protein_color_scheme( assembly_name=name, name=name + '_' + bio_explorer.NAME_PROTEIN_S_CLOSED, color_scheme=bio_explorer.COLOR_SCHEME_GLYCOSYLATION_SITE, palette=palette) # Set rendering settings bio_explorer.core_api().set_renderer( background_color=[96 / 255, 125 / 255, 139 / 255], current='bio_explorer', samples_per_pixel=1, subsampling=4, max_accum_frames=64) params = bio_explorer.core_api().BioExplorerRendererParams() params.shadows = 0.75 params.soft_shadows = 1.0 bio_explorer.core_api().set_renderer_params(params) # Restore image streaming bio_explorer.core_api().set_application_parameters(image_stream_fps=20)
def test_quaternion_to_list(): try: q = Quaternion(0, 1, 2, 3) assert q.to_list() == [0, 1, 2, 3] except RuntimeError: assert True
def test_quaternion_4(): try: Quaternion(1, 2, 3, 4) assert True except RuntimeError: assert False
def test_quaternion_2(): try: Quaternion(1, 2) assert False except RuntimeError: assert True
def add_virus(bioexplorer, name, position, open_conformation_indices=list()): closed_conformation_indices = list() for i in range(NB_PROTEIN_S): if i not in open_conformation_indices: closed_conformation_indices.append(i) params = [11.5, 0, 0.0, 0, 0.0, 0.0] virus_protein_s = Protein( sources=[ PDB_FOLDER + '6vyb.pdb', # Open conformation PDB_FOLDER + 'sars-cov-2-v1.pdb' # Closed conformation ], load_hydrogen=PROTEIN_LOAD_HYDROGEN, occurences=NB_PROTEIN_S, assembly_params=params, rotation=Quaternion(0.0, 1.0, 0.0, 0.0), instance_indices=[ open_conformation_indices, closed_conformation_indices ]) params = [2.5, 0, 0.0, 0, 0.0, 0.0] virus_protein_m = Protein(sources=[PDB_FOLDER + 'QHD43419a.pdb'], load_hydrogen=PROTEIN_LOAD_HYDROGEN, occurences=NB_PROTEIN_M, assembly_params=params, rotation=Quaternion(0.99, 0.0, 0.0, 0.135)) params = [2.5, 0, 0.0, 0, 0.0, 0.0] virus_protein_e = Protein(sources=[PDB_FOLDER + 'QHD43418a.pdb'], load_hydrogen=PROTEIN_LOAD_HYDROGEN, occurences=NB_PROTEIN_E, assembly_params=params, rotation=Quaternion(0.705, 0.705, -0.04, -0.04)) virus_membrane = Membrane(sources=[PDB_FOLDER + 'membrane/popc.pdb'], occurences=15000) rna_sequence = None if ADD_RNA: rna_sequence = RNASequence(source=RNA_FOLDER + 'sars-cov-2.rna', assembly_params=[11.0, 0.5], t_range=Vector2(0, 30.5 * math.pi), shape=bioexplorer.RNA_SHAPE_TREFOIL_KNOT, shape_params=Vector3(1.51, 1.12, 1.93)) coronavirus = Virus(name=name, protein_s=virus_protein_s, protein_e=virus_protein_e, protein_m=virus_protein_m, membrane=virus_membrane, rna_sequence=rna_sequence, assembly_params=[45.0, 1, 0.025, 2, 0.4, 0.0]) clip_planes = list() if ADD_RNA: clip_planes.append([0, 0, -1, 15]) bioexplorer.add_virus(virus=coronavirus, position=position, representation=PROTEIN_REPRESENTATION, atom_radius_multiplier=PROTEIN_RADIUS_MULTIPLIER, clipping_planes=clip_planes) if ADD_GLYCANS: # High-mannose indices_closed = [61, 122, 234, 603, 709, 717, 801, 1074] indices_open = [61, 122, 234, 709, 717, 801, 1074] bioexplorer.add_multiple_glycans( assembly_name=name, glycan_type=bioexplorer.NAME_GLYCAN_HIGH_MANNOSE, protein_name=bioexplorer.NAME_PROTEIN_S_CLOSED, paths=HIGH_MANNOSE_PATHS, indices=indices_closed, representation=PROTEIN_REPRESENTATION) if open_conformation_indices: bioexplorer.add_multiple_glycans( assembly_name=name, glycan_type=bioexplorer.NAME_GLYCAN_HIGH_MANNOSE, protein_name=bioexplorer.NAME_PROTEIN_S_OPEN, paths=HIGH_MANNOSE_PATHS, indices=indices_open, representation=PROTEIN_REPRESENTATION) # Complex indices_closed = [ 17, 74, 149, 165, 282, 331, 343, 616, 657, 1098, 1134, 1158, 1173, 1194 ] indices_open = [ 17, 74, 149, 165, 282, 331, 343, 657, 1098, 1134, 1158, 1173, 1194 ] bioexplorer.add_multiple_glycans( assembly_name=name, glycan_type=bioexplorer.NAME_GLYCAN_COMPLEX, protein_name=bioexplorer.NAME_PROTEIN_S_CLOSED, paths=COMPLEX_PATHS, indices=indices_closed, representation=PROTEIN_REPRESENTATION) if open_conformation_indices: bioexplorer.add_multiple_glycans( assembly_name=name, glycan_type=bioexplorer.NAME_GLYCAN_COMPLEX, protein_name=bioexplorer.NAME_PROTEIN_S_OPEN, paths=COMPLEX_PATHS, indices=indices_open, representation=PROTEIN_REPRESENTATION) # O-Glycans for index in [323, 325]: o_glycan_name = name + '_' + bioexplorer.NAME_GLYCAN_O_GLYCAN + '_' + str( index) o_glycan = Sugars(assembly_name=name, name=o_glycan_name, source=O_GLYCAN_PATHS[0], protein_name=name + '_' + bioexplorer.NAME_PROTEIN_S_CLOSED, representation=PROTEIN_REPRESENTATION, site_indices=[index]) bioexplorer.add_sugars(o_glycan) # High-mannose glycans on Protein M indices = [5] high_mannose_glycans = Sugars( rotation=Quaternion(0.707, 0.0, 0.0, 0.707), assembly_name=name, name=bioexplorer.NAME_GLYCAN_HIGH_MANNOSE, protein_name=name + '_' + bioexplorer.NAME_PROTEIN_M, source=HIGH_MANNOSE_PATHS[0], site_indices=indices, representation=PROTEIN_REPRESENTATION) bioexplorer.add_glycans(high_mannose_glycans) # Complex glycans on Protein E indices = [48, 66] complex_glycans = Sugars(rotation=Quaternion(0.707, 0.0, 0.0, 0.707), assembly_name=name, name=bioexplorer.NAME_GLYCAN_COMPLEX, protein_name=name + '_' + bioexplorer.NAME_PROTEIN_E, source=COMPLEX_PATHS[0], site_indices=indices, representation=PROTEIN_REPRESENTATION) bioexplorer.add_glycans(complex_glycans) for i in range(NB_DEFENSINS): defensin = AssemblyProtein( assembly_name=name, name=name + '_' + bioexplorer.NAME_DEFENSIN + '_' + str(i), source=DEFENSINS_PATH, assembly_params=[2.0, 0, 0.0, 0, 0.0, 0.0], shape=bioexplorer.ASSEMBLY_SHAPE_SPHERICAL, atom_radius_multiplier=PROTEIN_RADIUS_MULTIPLIER, representation=PROTEIN_REPRESENTATION, random_seed=100 + i + 1) bioexplorer.add_assembly_protein(defensin)
def _add_viruses(self, frame): virus_radii = [45.0, 44.0, 45.0, 43.0, 44.0] virus_sequences = [ [[0, 2599], [1e6, 1e6], [1e6, 1e6], [1e6, 1e6], [1e6, 1e6], [1e6, 1e6]], [[0, 2599], [1e6, 1e6], [1e6, 1e6], [1e6, 1e6], [1e6, 1e6], [1e6, 1e6]], [[0, 2599], [1e6, 1e6], [1e6, 1e6], [1e6, 1e6], [1e6, 1e6], [1e6, 1e6]], [[0, 2999], [3000, 3099], [3100, 3299], [3300, 3750], [1e6, 1e6], [1e6, 1e6]], [[0, 599], [1e6, 1e6], [1e6, 1e6], [1e6, 1e6], [1e6, 1e6], [1600, 3750]], ] virus_flights_in = [ [Vector3(-35.0, 300.0, -70.0), Quaternion(0.519, 0.671, 0.528, -0.036), Vector3(-5.0, 45.0, -33.0), Quaternion(1.0, 0.0, 0.0, 0.0), ROTATION_MODE_LINEAR], [Vector3(153.0, 300.0, -200.0), Quaternion(0.456, 0.129, -0.185, -0.860), Vector3(73.0, 93.0, -130.0), Quaternion(1.0, 0.0, 0.0, 0.0), ROTATION_MODE_LINEAR], # Virus used for SP-D zoom [Vector3(-100.0, 300.0, 20.0), Quaternion(0.087, 0.971, -0.147, -0.161), Vector3(-79.0, 108.0, 80.0), Quaternion(1.0, 0.0, 0.0, 0.0), ROTATION_MODE_LINEAR], # Virus getting inside cell [Vector3(224.9, 300.0, -220.0), Quaternion(-0.095, 0.652, -0.326, 0.677), Vector3(211.5, -104.9, -339.2), Quaternion(1.0, 0.0, 0.0, 0.0), ROTATION_MODE_LINEAR], # Virus used for detailed view of the Spike [Vector3(200.0, 20.0, -150.0), Quaternion(1.0, 0.0, 0.0, 0.0), Vector3(200.0, 20.0, -150.0), Quaternion(1.0, 0.0, 0.0, 0.0), ROTATION_MODE_LINEAR] ] virus_flights_out = [ # Unused [Vector3(-5.0, 45.0, -33.0), Quaternion(1.0, 0.0, 0.0, 0.0), Vector3(-105.0, 45.0, -33.0), Quaternion(0.0, 1.0, 0.0, 0.0), ROTATION_MODE_LINEAR], # Unused [Vector3(73.0, 93.0, -130.0), Quaternion(1.0, 0.0, 0.0, 0.0), Vector3(-33.0, 93.0, -130.0), Quaternion(0.0, 0.0, 1.0, 0.0), ROTATION_MODE_LINEAR], # Virus used for SP-D zoom [Vector3(-84.0, 110.0, 75.0), Quaternion(1.0, 0.0, 0.0, 0.0), Vector3(-100.0, -100.0, 51.2), Quaternion(0.087, 0.971, -0.147, -0.161), ROTATION_MODE_LINEAR], # Unused [Vector3(0.0, 0.0, 0.0), Quaternion(1.0, 0.0, 0.0, 0.0), Vector3(0.0, 0.0, 0.0), Quaternion(1.0, 0.0, 0.0, 0.0), ROTATION_MODE_LINEAR], # Virus used for detailed view of the Spike [Vector3(200.0, 20.0, -150.0), Quaternion(1.0, 0.0, 0.0, 0.0), Vector3(300.0, -100.0, -100.0), Quaternion(0.456, 0.129, -0.185, -0.860), ROTATION_MODE_LINEAR] ] for virus_index in range(len(virus_sequences)): name = 'Coronavirus ' + str(virus_index) current_sequence = 0 sequences = virus_sequences[virus_index] for i in range(len(sequences)): if frame >= sequences[i][0]: current_sequence = i '''Initialize position and rotation to end-of-flight values''' start_frame = sequences[current_sequence][0] end_frame = sequences[current_sequence][1] progress_in_sequence = (frame - start_frame) / (end_frame - start_frame) morphing_step = 0.0 if current_sequence == 0: '''Flying''' pos, rot, progress = self._get_transformation(start_frame, end_frame, frame, virus_flights_in[virus_index]) self._log(3, '- Virus %d is flying in... (%.01f pct)' % (virus_index, progress)) elif current_sequence == 1: '''Landing''' pos = virus_flights_in[virus_index][2] rot = virus_flights_in[virus_index][3] pos.y -= landing_distance * progress_in_sequence self._log(3, '- Virus %d is landing...' % virus_index) elif current_sequence == 2: '''Merging into cell''' pos = virus_flights_in[virus_index][2] rot = virus_flights_in[virus_index][3] morphing_step = (frame - start_frame) / (end_frame - start_frame) pos.y -= landing_distance self._log(3, '- Virus %d is merging in (%.01f pct)' % (virus_index, morphing_step * 100.0)) elif current_sequence == 3: '''Inside cell''' self._log(3, '- Virus %d is inside cell' % virus_index) '''Virus is not added to the scene''' self._be.remove_assembly(name=name) continue elif current_sequence == 4: '''Merging out of cell''' pos = virus_flights_out[virus_index][0] rot = virus_flights_out[virus_index][1] morphing_step = 1.0 - (frame - start_frame) / (end_frame - start_frame) self._log(3, '- Virus %d is merging out (%.01f pct)' % (virus_index, morphing_step * 100.0)) else: '''Flying out''' pos, rot, progress = self._get_transformation(start_frame, end_frame, frame, virus_flights_out[virus_index]) self._log(3, '- Virus %d is flying out... (%.01f pct)' % (virus_index, progress)) if False: self._be.add_sphere(name=name, position=pos, radius=virus_radii[virus_index]) else: self._be.add_coronavirus( name=name, resource_folder=resource_folder, representation=protein_representation, position=pos, rotation=rot, add_glycans=add_glycans, assembly_params=[virus_radii[virus_index], 5 * frame + 2 * virus_index, 0.25, frame + 2 * virus_index + 1, 0.1, morphing_step] )
def _add_cell(self, frame): name = 'Cell' nb_receptors = cell_nb_receptors size = scene_size * 2.0 height = scene_size / 10.0 position = Vector3(4.5, -186.0, 7.0) random_seed = 10 nb_lipids = cell_nb_lipids ace2_receptor = Protein(sources=[pdb_folder + '6m18.pdb'], occurences=nb_receptors, position=Vector3(0.0, 6.0, 0.0)) membrane = ParametricMembrane(sources=[ membrane_folder + 'segA.pdb', membrane_folder + 'segB.pdb', membrane_folder + 'segC.pdb', membrane_folder + 'segD.pdb' ], occurences=cell_nb_lipids) cell = Cell(name=name, size=size, extra_parameters=[height], shape=BioExplorer.ASSEMBLY_SHAPE_SINUSOIDAL, membrane=membrane, receptor=ace2_receptor, random_position_seed=frame + 1, random_position_strength=0.025, random_rotation_seed=frame + 2, random_rotation_strength=0.2) self._be.add_cell(cell=cell, position=position, representation=protein_representation, random_seed=random_seed) '''Modify receptor position when attached virus enters the cell''' receptors_instances = [90, 23, 24, 98, 37, 44] receptors_sequences = [[2500, 2599], [2200, 2299], [2550, 2649], [2600, 2699], [2650, 2749], [-1, -1]] for i in range(len(receptors_instances)): instance_index = receptors_instances[i] sequence = receptors_sequences[i] start_frame = sequence[0] end_frame = sequence[1] if frame >= start_frame: if frame > end_frame: '''Send receptor to outter space''' status = self._be.set_protein_instance_transformation( assembly_name=name, name=name + '_' + BioExplorer.NAME_RECEPTOR, instance_index=instance_index, position=Vector3(0.0, 1e6, 0.0)) else: '''Current receptor transformation''' transformation = self._be.get_protein_instance_transformation( assembly_name=name, name=name + '_' + BioExplorer.NAME_RECEPTOR, instance_index=instance_index) p = transformation['position'].split(',') q = transformation['rotation'].split(',') pos = Vector3(float(p[0]), float(p[1]), float(p[2])) q2 = Quaternion(float(q[0]), float(q[1]), float(q[2]), float(q[3])) '''Bend receptor''' progress = (frame - start_frame) * 1.0 / (end_frame - start_frame) q1 = Quaternion(axis=[0, 1, 0], angle=math.pi * progress) rot = q2 * q1 pos.x += landing_distance * progress * 0.3 pos.y -= landing_distance * progress * 0.3 status = self._be.set_protein_instance_transformation( assembly_name=name, name=name + '_' + BioExplorer.NAME_RECEPTOR, instance_index=instance_index, position=pos, rotation=rot) '''Glycans''' if nb_receptors != 0 and add_glycans: self._be.add_multiple_glycans( representation=glycan_representation, assembly_name=name, glycan_type=BioExplorer.NAME_GLYCAN_COMPLEX, protein_name=BioExplorer.NAME_RECEPTOR, paths=complex_paths, indices=[53, 90, 103, 322, 432, 690], assembly_params=[0, 0, 0.0, frame + 3, 0.2]) self._be.add_multiple_glycans( representation=glycan_representation, assembly_name=name, glycan_type=BioExplorer.NAME_GLYCAN_HYBRID, protein_name=BioExplorer.NAME_RECEPTOR, paths=hybrid_paths, indices=[546], assembly_params=[0, 0, 0.0, frame + 4, 0.2]) indices = [[155, Quaternion(0.707, 0.0, 0.707, 0.0)], [730, Quaternion(0.707, 0.0, 0.707, 0.0)]] count = 0 for index in indices: o_glycan_name = name + '_' + BioExplorer.NAME_GLYCAN_O_GLYCAN + '_' + str( index[0]) o_glycan = Sugars( assembly_name=name, name=o_glycan_name, source=o_glycan_paths[0], protein_name=name + '_' + BioExplorer.NAME_RECEPTOR, representation=glycan_representation, chain_ids=[2, 4], site_indices=[index[0]], rotation=index[1], assembly_params=[0, 0, 0.0, frame + count + 5, 0.2]) self._be.add_sugars(o_glycan) count += 1
def _add_viruses(self, frame): virus_sequences = [ [[-1000, 2499], [2500, 2599], [2600, 2799], [2800, 2999], [3000, 3099], [3100, 3750]], # Virus used for the ACE2 close-up [[0, 2100], [2200, 2299], [2300, 2499], [2500, 3049], [3050, 3149], [3150, 3750]], [[-800, 2549], [2550, 2649], [2650, 2849], [2850, 3199], [3200, 3299], [3300, 3750]], [[-1400, 3750], [1e6, 1e6], [1e6, 1e6], [1e6, 1e6], [1e6, 1e6], [1e6, 1e6]], [[-400, 2599], [2600, 2699], [2700, 2899], [2900, 3119], [3120, 3219], [3220, 3750]], [[0, 2649], [2650, 2749], [2750, 2949], [2950, 3199], [3200, 3299], [3300, 3750]], # new Viruses [[-1, -1], [-1, -1], [-1, -1], [-1, 3212], [3213, 3312], [3313, 3750]], [[-1, -1], [-1, -1], [-1, -1], [-1, 3201], [3202, 3301], [3302, 3750]], [[-1, -1], [-1, -1], [-1, -1], [-1, 3171], [3172, 3271], [3272, 3750]], [[-1, -1], [-1, -1], [-1, -1], [-1, 3152], [3153, 3252], [3253, 3750]], [[-1, -1], [-1, -1], [-1, -1], [-1, 3358], [3359, 3458], [3459, 3750]] ] virus_radii = [ 45.0, 44.0, 45.0, 43.0, 44.0, 43.0, 45.0, 46.0, 44.0, 45.0, 44.0 ] virus_flights_in = [ [ Vector3(-250.0, 100.0, -70.0), Quaternion(0.519, 0.671, 0.528, -0.036), Vector3(-337.3, -92.3, -99.2), Quaternion(1.0, 0.0, 0.0, 0.0), ROTATION_MODE_LINEAR ], [ Vector3(-50.0, 300.0, 250.0), Quaternion(0.456, 0.129, -0.185, -0.860), Vector3(-74.9, -99.0, 228.8), Quaternion(1.0, 0.0, 0.0, 0.0), ROTATION_MODE_LINEAR ], [ Vector3(150.0, 100.0, 50.0), Quaternion(0.087, 0.971, -0.147, -0.161), Vector3(187.5, -110.4, 51.2), Quaternion(1.0, 0.0, 0.0, 0.0), ROTATION_MODE_LINEAR ], [ Vector3(40.0, 250.0, -50), Quaternion(0.0, 0.0, 0.0, 1.0), Vector3(4.5, 100.0, 7.5), Quaternion(1.0, 0.0, 0.0, 0.0), ROTATION_MODE_LINEAR ], [ Vector3(60.0, 100.0, -240.0), Quaternion(-0.095, 0.652, -0.326, 0.677), Vector3(73.9, -117.1, -190.4), Quaternion(1.0, 0.0, 0.0, 0.0), ROTATION_MODE_LINEAR ], [ Vector3(200.0, 100.0, 300.0), Quaternion(-0.866, 0.201, 0.308, -0.336), Vector3(211.5, -104.9, 339.2), Quaternion(1.0, 0.0, 0.0, 0.0), ROTATION_MODE_LINEAR ], # New viruses (no flying in, only flying out) [ Vector3(), Quaternion(), Vector3(), Quaternion(), ROTATION_MODE_LINEAR ], [ Vector3(), Quaternion(), Vector3(), Quaternion(), ROTATION_MODE_LINEAR ], [ Vector3(), Quaternion(), Vector3(), Quaternion(), ROTATION_MODE_LINEAR ], [ Vector3(), Quaternion(), Vector3(), Quaternion(), ROTATION_MODE_LINEAR ], [ Vector3(), Quaternion(), Vector3(), Quaternion(), ROTATION_MODE_LINEAR ] ] virus_flights_out = [[ Vector3(-250.0, -150.0, -70.0), Quaternion(), Vector3(-270.0, 200.0, -99.2), Quaternion(0.519, 0.671, 0.528, -0.036), ROTATION_MODE_LINEAR ], [ Vector3(-50.0, -150.0, 250.0), Quaternion(), Vector3(-75.0, 240.0, 228.8), Quaternion(0.456, 0.129, -0.185, -0.860), ROTATION_MODE_LINEAR ], [ Vector3(150.0, -150.0, 50.0), Quaternion(), Vector3(187.0, 300.0, 51.2), Quaternion(0.087, 0.971, -0.147, -0.161), ROTATION_MODE_LINEAR ], [ Vector3(), Quaternion(), Vector3(), Quaternion(), ROTATION_MODE_LINEAR ], [ Vector3(60.0, -150.0, -240.0), Quaternion(), Vector3(74.0, 195.0, -220.0), Quaternion(-0.095, 0.652, -0.326, 0.677), ROTATION_MODE_LINEAR ], [ Vector3(-200.0, -150.0, 300.0), Quaternion(), Vector3(-210.0, 205.0, 330.0), Quaternion(-0.866, 0.201, 0.308, -0.336), ROTATION_MODE_LINEAR ], [ Vector3(531, -150.0, -34.0), Quaternion(), Vector3(500.0, 215.0, -50.0), Quaternion(0.431, -0.145, -0.700, -0.550), ROTATION_MODE_LINEAR ], [ Vector3(225.0, -150.0, 554.0), Quaternion(), Vector3(200.0, 190.0, 520.0), Quaternion(-0.466, -0.086, -0.616, -0.629), ROTATION_MODE_LINEAR ], [ Vector3(-171, -150.0, -5.0), Quaternion(), Vector3(-160.0, 300.0, 10.0), Quaternion(0.227, 0.834, -0.187, 0.468), ROTATION_MODE_LINEAR ], [ Vector3(-331, -150.0, 343), Quaternion(), Vector3(-310.0, 230.0, 350.0), Quaternion(0.417, 0.849, -0.075, -0.316), ROTATION_MODE_LINEAR ], [ Vector3(159.0, -150.0, -341.0), Quaternion(), Vector3(170.0, 100.0, -360.0), Quaternion(0.483, -0.352, 0.769, -0.226), ROTATION_MODE_LINEAR ]] indices = range(len(virus_sequences)) if self._magnetic: indices = [1] for virus_index in indices: name = 'Coronavirus ' + str(virus_index) current_sequence = 0 sequences = virus_sequences[virus_index] for i in range(len(sequences)): if frame >= sequences[i][0]: current_sequence = i '''Initialize position and rotation to end-of-flight values''' start_frame = sequences[current_sequence][0] end_frame = sequences[current_sequence][1] progress_in_sequence = (frame - start_frame) / (end_frame - start_frame) morphing_step = 0.0 if current_sequence == 0: '''Flying''' pos, rot, progress = self._get_transformation( start_frame, end_frame, frame, virus_flights_in[virus_index]) self._log( 3, '- Virus %d is flying in... (%.01f pct)' % (virus_index, progress)) elif current_sequence == 1: '''Landing''' pos = virus_flights_in[virus_index][2] rot = virus_flights_in[virus_index][3] pos.y -= landing_distance * progress_in_sequence self._log(3, '- Virus %d is landing...' % virus_index) elif current_sequence == 2: '''Merging into cell''' pos = virus_flights_in[virus_index][2] rot = virus_flights_in[virus_index][3] morphing_step = (frame - start_frame) / (end_frame - start_frame) pos.y -= landing_distance self._log( 3, '- Virus %d is merging in (%.01f pct)' % (virus_index, morphing_step * 100.0)) elif current_sequence == 3: '''Inside cell''' self._log(3, '- Virus %d is inside cell' % virus_index) '''Virus is not added to the scene''' self._be.remove_assembly(name=name) continue elif current_sequence == 4: '''Merging out of cell''' pos = virus_flights_out[virus_index][0] rot = virus_flights_out[virus_index][1] morphing_step = 1.0 - (frame - start_frame) / (end_frame - start_frame) self._log( 3, '- Virus %d is merging out (%.01f pct)' % (virus_index, morphing_step * 100.0)) else: '''Flying out''' pos, rot, progress = self._get_transformation( start_frame, end_frame, frame, virus_flights_out[virus_index]) self._log( 3, '- Virus %d is flying out... (%.01f pct)' % (virus_index, progress)) self._be.add_coronavirus(name=name, resource_folder=resource_folder, representation=protein_representation, position=pos, rotation=rot, add_glycans=add_glycans, assembly_params=[ virus_radii[virus_index], 5 * frame + 2 * virus_index, 0.25, frame + 2 * virus_index + 1, 0.1, morphing_step ])
def test_layout(): resource_folder = 'tests/test_files/' pdb_folder = resource_folder + 'pdb/' bio_explorer = BioExplorer('localhost:5000') bio_explorer.reset() print('BioExplorer version ' + bio_explorer.version()) # Suspend image streaming bio_explorer.core_api().set_application_parameters(image_stream_fps=0) line_surfactant = 5 line_virus = 25 line_defense = 45 # Camera brayns = bio_explorer.core_api() brayns.set_camera( current='orthographic', orientation=[0.0, 0.0, 0.0, 1.0], position=[23.927943790322814, 24.84577580212592, 260.43975983632527], target=[23.927943790322814, 24.84577580212592, 39.93749999999999]) params = brayns.OrthographicCameraParams() params.height = 55 brayns.set_camera_params(params) # Grid bio_explorer.add_grid(min_value=0, max_value=100, interval=1, radius=0.005, colored=False, position=Vector3(-10.0, -10.0, -10.0)) # Layout virus_protein_s = Protein(sources=[ pdb_folder + '6vyb.pdb', # Open conformation pdb_folder + 'sars-cov-2-v1.pdb' # Closed conformation ]) bio_explorer.add_protein(name='Protein S (open)', protein=virus_protein_s, conformation_index=0, position=Vector3(5.0, line_virus, 0.0), rotation=Quaternion(0.0, 0.0, 1.0, 0.0)) bio_explorer.add_protein(name='Protein S (closed)', protein=virus_protein_s, conformation_index=1, position=Vector3(20.0, line_virus, 0.0), rotation=Quaternion(0.0, 0.0, 1.0, 0.0)) # Protein M (QHD43419) virus_protein_m = Protein(sources=[pdb_folder + 'QHD43419a.pdb']) bio_explorer.add_protein(name='Protein M', protein=virus_protein_m, position=Vector3(35.0, line_virus, 0.0)) # Protein E (QHD43418 P0DTC4) virus_protein_e = Protein(sources=[pdb_folder + 'QHD43418a.pdb']) bio_explorer.add_protein(name='Protein E', protein=virus_protein_e, position=Vector3(45.0, line_virus, 0.0)) # Lactoferrin lactoferrin = Protein(sources=[pdb_folder + 'immune/1b0l.pdb']) bio_explorer.add_protein(name='Lactoferrin', protein=lactoferrin, position=Vector3(5.0, line_defense, 0.0)) # Defensin defensin = Protein(sources=[pdb_folder + 'immune/1ijv.pdb']) bio_explorer.add_protein(name='Defensin', protein=defensin, position=Vector3(20.0, line_defense, 0.0)) # Glucose glucose = Protein(sources=[pdb_folder + 'glucose.pdb'], load_non_polymer_chemicals=True) bio_explorer.add_protein(name='Glucose', protein=glucose, position=Vector3(30.0, line_defense, 0.0), rotation=Quaternion(0.0, 0.0, 0.707, 0.707)) # ACE2 Receptor ace2_receptor = Protein(sources=[pdb_folder + '6m18.pdb']) bio_explorer.add_protein(name='ACE2 receptor', protein=ace2_receptor, position=Vector3(45.0, line_defense - 2.5, 0.0), rotation=Quaternion(0.5, 0.5, 1.0, 0.0)) # Surfactant head_source = pdb_folder + 'surfactant/1pw9.pdb' branch_source = pdb_folder + 'surfactant/1k6f.pdb' surfactant_d = Surfactant( name='Surfactant', surfactant_protein=bio_explorer.SURFACTANT_BRANCH, head_source=head_source, branch_source=branch_source) bio_explorer.add_surfactant(surfactant=surfactant_d, position=Vector3(5.0, line_surfactant, 0.0)) # Restore image streaming bio_explorer.core_api().set_application_parameters(image_stream_fps=20)