예제 #1
0
    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)
예제 #2
0
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])
예제 #5
0
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)
예제 #6
0
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)
예제 #7
0
    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]
예제 #8
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)
예제 #9
0
    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)
예제 #10
0
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)
예제 #11
0
def test_quaternion_to_list():
    try:
        q = Quaternion(0, 1, 2, 3)
        assert q.to_list() == [0, 1, 2, 3]
    except RuntimeError:
        assert True
예제 #12
0
def test_quaternion_4():
    try:
        Quaternion(1, 2, 3, 4)
        assert True
    except RuntimeError:
        assert False
예제 #13
0
def test_quaternion_2():
    try:
        Quaternion(1, 2)
        assert False
    except RuntimeError:
        assert True
예제 #14
0
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]
                )
예제 #16
0
    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
예제 #17
0
    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
                                     ])
예제 #18
0
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)