Source code for vtk_funcs


import caesar.vtk_vis as vtk
from caesar.utils import rotator

[docs]def group_vis(group, rotate=True): """Function to visualize a :class:`group.Group` with VTK. Parameters ---------- group : :class:`group.Group` Group to visualize. rotate : boolean If true the positions are rotated so that the angular momentum vector is aligned with the z-axis. """ DM = group.obj.data_manager v = vtk.vtk_render() if group.ngas > 0: pos = DM.pos[DM.glist[group.glist]] if rotate: pos = rotator(pos, group.rotation_angles['ALPHA'], group.rotation_angles['BETA']) v.point_render(pos, color=[0,0,1]) if group.nstar > 0: pos = DM.pos[DM.slist[group.slist]] if rotate: pos = rotator(pos, group.rotation_angles['ALPHA'], group.rotation_angles['BETA']) v.point_render(pos, color=[1,1,0]) if hasattr(group, 'ndm') and group.ndm > 0: pos = DM.pos[DM.dmlist[group.dmlist]] if rotate: pos = rotator(pos, group.rotation_angles['ALPHA'], group.rotation_angles['BETA']) v.point_render(pos, color=[1,0,0]) v.render(focal_point=group.pos.d)
[docs]def sim_vis(obj, ptypes = ['dm','star','gas'], halo_only=True, galaxy_only=False, annotate_halos=False, annotate_galaxies=False, draw_spheres=None): """Function to visualize an entire simulation with VTK. Parameters ---------- obj : :class:`main.CAESAR` Simulation object to visualize. ptypes : list List containing one or more of the following: 'dm','gas','star', which dictates which particles to render. halo_only : boolean If True only render particles belonging to halos. galaxy_only: boolean If True only render particles belonging to galaxies. Note that this overwrites ``halo_only``. annotate_halos : boolean, list, int, optional Add labels to the render at the location of halos annotating the group ID and total mass. If True then all halos are annotated, if an integer list then halos of those indexes are annotated, and finally if an integer than the most massive N halos are annotated. annotate_galaxies : boolean, list, int, optional Add labels to the render at the location of galaxies annotating the group ID and total mass. If True then all galaxies are annotated, if an integer list then galaxies of those indexes are annotated, and finally if an integer than the most massive N galaxies are annotated. draw_spheres : string, boolean Add spheres around your annotated objects. The size is determined by the string you pass, should be from the .radii dict. If a boolean of True is passed it will use the total radii. """ import numpy as np if galaxy_only: halo_only = False if 'dm' in ptypes: ptypes.remove('dm') gpl = obj.global_particle_lists DM = obj.data_manager v = vtk.vtk_render() if obj.simulation.ngas > 0 and 'gas' in ptypes: pos = DM.pos[DM.glist] if halo_only: pos = pos[np.where(gpl.halo_glist > -1)[0]] elif galaxy_only: pos = pos[np.where(gpl.galaxy_glist > -1)[0]] v.point_render(pos, color=[0,0,1]) if obj.simulation.nstar > 0 and 'star' in ptypes: pos = DM.pos[DM.slist] if halo_only: pos = pos[np.where(gpl.halo_slist > -1)[0]] elif galaxy_only: pos = pos[np.where(gpl.galaxy_slist > -1)[0]] v.point_render(pos, color=[1,1,0]) if obj.simulation.ndm > 0 and 'dm' in ptypes: pos = DM.pos[DM.dmlist] if halo_only: pos = pos[np.where(gpl.halo_dmlist > -1)[0]] v.point_render(pos, color=[1,0,0]) def annotate_group(group_list, annotation, txtcolor, spheres=None): if isinstance(annotation, bool): indexes = [i for i in range(0,len(group_list))] elif isinstance(annotation, list): indexes = annotation elif isinstance(annotation, int): indexes = [i for i in range(0, annotate_halos)] if isinstance(spheres, bool): spheres = 'total' for i in indexes: if i >= len(group_list): continue group = group_list[i] v.place_label(group.pos, '%d :: %0.2e Msun' % (group.GroupID, group.masses['total']), text_color=txtcolor) if spheres is not None and spheres in group.radii: v.draw_sphere(group.pos, group.radii[spheres], color=txtcolor, opacity=0.5) if annotate_halos and 'dm' in ptypes: annotate_group(obj.halos, annotate_halos, [0.75,0.75,0], draw_spheres) if annotate_galaxies: annotate_group(obj.galaxies, annotate_galaxies, [0, 0.75, 0.75], draw_spheres) v.render()