Beispiel #1
0
def draw_cg(vis, site, neighbors, cg=None, perm=None, perfect2local_map=None,
            show_perfect=False, csm_info=None, symmetry_measure_type='csm_wcs_ctwcc', perfect_radius=0.1,
            show_distorted=True, faces_color_override=None):
    if show_perfect:
        if csm_info is None:
            raise ValueError('Not possible to show perfect environment without csm_info')
        csm_suffix = symmetry_measure_type[4:]
        perf_radius = (perfect_radius - 0.2) / 0.002
    if perm is not None and perfect2local_map is not None:
        raise ValueError('Only "perm" or "perfect2local_map" should be provided in draw_cg, not both')
    if show_distorted:
        vis.add_bonds(neighbors, site)
        for n in neighbors:
            vis.add_site(n)
    if len(neighbors) < 3:
        if show_distorted:
            vis.add_bonds(neighbors, site, color=[0.0, 1.0, 0.0], opacity=0.4, radius=0.175)
        if show_perfect:
            if len(neighbors) == 2:
                perfect_geometry = AbstractGeometry.from_cg(cg)
                trans = csm_info['other_symmetry_measures']['translation_vector_{}'.format(csm_suffix)]
                rot = csm_info['other_symmetry_measures']['rotation_matrix_{}'.format(csm_suffix)]
                scale = csm_info['other_symmetry_measures']['scaling_factor_{}'.format(csm_suffix)]
                points = perfect_geometry.points_wcs_ctwcc()
                rotated_points = rotateCoords(points, rot)
                points = [scale * pp + trans for pp in rotated_points]
                if 'wcs' in csm_suffix:
                    ef_points = points[1:]
                else:
                    ef_points = points
                edges = cg.edges(ef_points, input='coords')
                vis.add_edges(edges, color=[1.0, 0.0, 0.0])
                for point in points:
                    vis.add_partial_sphere(coords=point, radius=perf_radius, color=[0.0, 0.0, 0.0],
                                           start=0, end=360, opacity=1)
    else:
        if show_distorted:
            if perm is not None:
                faces = cg.faces(neighbors, permutation=perm)
                edges = cg.edges(neighbors, permutation=perm)
            elif perfect2local_map is not None:
                faces = cg.faces(neighbors, perfect2local_map=perfect2local_map)
                edges = cg.edges(neighbors, perfect2local_map=perfect2local_map)
            else:
                faces = cg.faces(neighbors)
                edges = cg.edges(neighbors)
            symbol = list(site.species_and_occu.keys())[0].symbol
            if faces_color_override:
                mycolor = faces_color_override
            else:
                mycolor = [float(i) / 255 for i in vis.el_color_mapping[symbol]]
            vis.add_faces(faces, mycolor, opacity=0.4)
            vis.add_edges(edges)
        if show_perfect:
            perfect_geometry = AbstractGeometry.from_cg(cg)
            trans = csm_info['other_symmetry_measures']['translation_vector_{}'.format(csm_suffix)]
            rot = csm_info['other_symmetry_measures']['rotation_matrix_{}'.format(csm_suffix)]
            scale = csm_info['other_symmetry_measures']['scaling_factor_{}'.format(csm_suffix)]
            points = perfect_geometry.points_wcs_ctwcc()
            rotated_points = rotateCoords(points, rot)
            points = [scale*pp + trans for pp in rotated_points]
            if 'wcs' in csm_suffix:
                ef_points = points[1:]
            else:
                ef_points = points
            edges = cg.edges(ef_points, input='coords')
            vis.add_edges(edges, color=[1.0, 0.0, 0.0])
            for point in points:
                vis.add_partial_sphere(coords=point, radius=perf_radius, color=[0.0, 0.0, 0.0],
                                       start=0, end=360, opacity=1)
Beispiel #2
0
def draw_cg(vis,
            site,
            neighbors,
            cg=None,
            perm=None,
            perfect2local_map=None,
            show_perfect=False,
            csm_info=None,
            symmetry_measure_type='csm_wcs_ctwcc',
            perfect_radius=0.1,
            show_distorted=True):
    if show_perfect:
        if csm_info is None:
            raise ValueError(
                'Not possible to show perfect environment without csm_info')
        csm_suffix = symmetry_measure_type[4:]
        perf_radius = (perfect_radius - 0.2) / 0.002
    if perm is not None and perfect2local_map is not None:
        raise ValueError(
            'Only "perm" or "perfect2local_map" should be provided in draw_cg, not both'
        )
    if show_distorted:
        vis.add_bonds(neighbors, site)
        for n in neighbors:
            vis.add_site(n)
    if len(neighbors) < 3:
        if show_distorted:
            vis.add_bonds(neighbors,
                          site,
                          color=[0.0, 1.0, 0.0],
                          opacity=0.4,
                          radius=0.175)
        if show_perfect:
            if len(neighbors) == 2:
                perfect_geometry = AbstractGeometry.from_cg(cg)
                trans = csm_info['other_symmetry_measures'][
                    'translation_vector_{}'.format(csm_suffix)]
                rot = csm_info['other_symmetry_measures'][
                    'rotation_matrix_{}'.format(csm_suffix)]
                scale = csm_info['other_symmetry_measures'][
                    'scaling_factor_{}'.format(csm_suffix)]
                points = perfect_geometry.points_wcs_ctwcc()
                rotated_points = rotateCoords(points, rot)
                points = [scale * pp + trans for pp in rotated_points]
                if 'wcs' in csm_suffix:
                    ef_points = points[1:]
                else:
                    ef_points = points
                edges = cg.edges(ef_points, input='coords')
                vis.add_edges(edges, color=[1.0, 0.0, 0.0])
                for point in points:
                    vis.add_partial_sphere(coords=point,
                                           radius=perf_radius,
                                           color=[0.0, 0.0, 0.0],
                                           start=0,
                                           end=360,
                                           opacity=1)
    else:
        if show_distorted:
            if perm is not None:
                faces = cg.faces(neighbors, permutation=perm)
                edges = cg.edges(neighbors, permutation=perm)
            elif perfect2local_map is not None:
                faces = cg.faces(neighbors,
                                 perfect2local_map=perfect2local_map)
                edges = cg.edges(neighbors,
                                 perfect2local_map=perfect2local_map)
            else:
                faces = cg.faces(neighbors)
                edges = cg.edges(neighbors)
            symbol = list(site.species_and_occu.keys())[0].symbol
            mycolor = [float(i) / 255 for i in vis.el_color_mapping[symbol]]
            vis.add_faces(faces, mycolor, opacity=0.4)
            vis.add_edges(edges)
        if show_perfect:
            perfect_geometry = AbstractGeometry.from_cg(cg)
            trans = csm_info['other_symmetry_measures'][
                'translation_vector_{}'.format(csm_suffix)]
            rot = csm_info['other_symmetry_measures'][
                'rotation_matrix_{}'.format(csm_suffix)]
            scale = csm_info['other_symmetry_measures'][
                'scaling_factor_{}'.format(csm_suffix)]
            points = perfect_geometry.points_wcs_ctwcc()
            rotated_points = rotateCoords(points, rot)
            points = [scale * pp + trans for pp in rotated_points]
            if 'wcs' in csm_suffix:
                ef_points = points[1:]
            else:
                ef_points = points
            edges = cg.edges(ef_points, input='coords')
            vis.add_edges(edges, color=[1.0, 0.0, 0.0])
            for point in points:
                vis.add_partial_sphere(coords=point,
                                       radius=perf_radius,
                                       color=[0.0, 0.0, 0.0],
                                       start=0,
                                       end=360,
                                       opacity=1)
Beispiel #3
0
def draw_cg(
    vis,
    site,
    neighbors,
    cg=None,
    perm=None,
    perfect2local_map=None,
    show_perfect=False,
    csm_info=None,
    symmetry_measure_type="csm_wcs_ctwcc",
    perfect_radius=0.1,
    show_distorted=True,
    faces_color_override=None,
):
    """
    Draw cg.

    :param vis:
    :param site:
    :param neighbors:
    :param cg:
    :param perm:
    :param perfect2local_map:
    :param show_perfect:
    :param csm_info:
    :param symmetry_measure_type:
    :param perfect_radius:
    :param show_distorted:
    :param faces_color_override:
    :return:
    """
    if show_perfect:
        if csm_info is None:
            raise ValueError("Not possible to show perfect environment without csm_info")
        csm_suffix = symmetry_measure_type[4:]
        perf_radius = (perfect_radius - 0.2) / 0.002
    if perm is not None and perfect2local_map is not None:
        raise ValueError('Only "perm" or "perfect2local_map" should be provided in draw_cg, not both')
    if show_distorted:
        vis.add_bonds(neighbors, site)
        for n in neighbors:
            vis.add_site(n)
    if len(neighbors) < 3:
        if show_distorted:
            vis.add_bonds(neighbors, site, color=[0.0, 1.0, 0.0], opacity=0.4, radius=0.175)
        if show_perfect:
            if len(neighbors) == 2:
                perfect_geometry = AbstractGeometry.from_cg(cg)
                trans = csm_info["other_symmetry_measures"][f"translation_vector_{csm_suffix}"]
                rot = csm_info["other_symmetry_measures"][f"rotation_matrix_{csm_suffix}"]
                scale = csm_info["other_symmetry_measures"][f"scaling_factor_{csm_suffix}"]
                points = perfect_geometry.points_wcs_ctwcc()
                rotated_points = rotateCoords(points, rot)
                points = [scale * pp + trans for pp in rotated_points]
                if "wcs" in csm_suffix:
                    ef_points = points[1:]
                else:
                    ef_points = points
                edges = cg.edges(ef_points, input="coords")
                vis.add_edges(edges, color=[1.0, 0.0, 0.0])
                for point in points:
                    vis.add_partial_sphere(
                        coords=point,
                        radius=perf_radius,
                        color=[0.0, 0.0, 0.0],
                        start=0,
                        end=360,
                        opacity=1,
                    )
    else:
        if show_distorted:
            if perm is not None:
                faces = cg.faces(neighbors, permutation=perm)
                edges = cg.edges(neighbors, permutation=perm)
            elif perfect2local_map is not None:
                faces = cg.faces(neighbors, perfect2local_map=perfect2local_map)
                edges = cg.edges(neighbors, perfect2local_map=perfect2local_map)
            else:
                faces = cg.faces(neighbors)
                edges = cg.edges(neighbors)
            symbol = list(site.species.keys())[0].symbol
            if faces_color_override:
                mycolor = faces_color_override
            else:
                mycolor = [float(i) / 255 for i in vis.el_color_mapping[symbol]]
            vis.add_faces(faces, mycolor, opacity=0.4)
            vis.add_edges(edges)
        if show_perfect:
            perfect_geometry = AbstractGeometry.from_cg(cg)
            trans = csm_info["other_symmetry_measures"][f"translation_vector_{csm_suffix}"]
            rot = csm_info["other_symmetry_measures"][f"rotation_matrix_{csm_suffix}"]
            scale = csm_info["other_symmetry_measures"][f"scaling_factor_{csm_suffix}"]
            points = perfect_geometry.points_wcs_ctwcc()
            rotated_points = rotateCoords(points, rot)
            points = [scale * pp + trans for pp in rotated_points]
            if "wcs" in csm_suffix:
                ef_points = points[1:]
            else:
                ef_points = points
            edges = cg.edges(ef_points, input="coords")
            vis.add_edges(edges, color=[1.0, 0.0, 0.0])
            for point in points:
                vis.add_partial_sphere(
                    coords=point,
                    radius=perf_radius,
                    color=[0.0, 0.0, 0.0],
                    start=0,
                    end=360,
                    opacity=1,
                )