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 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_glucose_to_surfactant_head(self, name): for index in [321, 323]: glucose_name = name + '_' + BioExplorer.NAME_GLUCOSE + '_' + str( index) glucose = Sugars(assembly_name=name, name=glucose_name, source=glucose_path, protein_name=name + '_' + BioExplorer.NAME_SURFACTANT_HEAD, representation=glycan_representation, site_indices=[index]) self._be.add_sugars(glucose)
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 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_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