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)
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)
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, )