"""Demonstration script to find particles belonging to a particular galaxy. It generates two plots of the same galaxy: one of its star particles in a first snapshot, and a second of the same particles in a later snapshot, after the galaxy has begun to be stripped. This example illustrates reading in particle data from a small volume with ReadRegion, and testing for subhalo membership with in_subhalo(). """ # Import required packages import numpy as np import hydrangea as hy import matplotlib.pyplot as plt from pdb import set_trace # Set script parameters sim_index = 0 # Which simulation do we want? first_snapshot_index = 8 # Which snapshot? 29 --> z = 0 second_snapshot_index = 12 # Second snapshot? 29 --> z = 0 ref_snapshot_index = 8 galaxy_id = 1808 # Which galaxy to plot? imsize = 100 # (Half-)size of analysis region, in kpc nbins = 100 # Number of bins for plotting ptype = 4 # Look at stars here plot_range = [6.0, 9.5] plotloc = 'galaxy_stars.png' # Where to save the output plot? # Set up the simulation object for the run we're working with sim = hy.Simulation(index=sim_index) # Set up the figure fig = plt.figure(figsize=(8/0.9, 4)) ax1 = fig.add_axes([0.09, 0.15, 0.4, 0.8]) ax2 = fig.add_axes([0.5, 0.15, 0.4, 0.8]) # Form the (first) files of the required subfind and snapshot catalogues, # in the first snapshot subfind_file_ref = sim.get_subfind_file(ref_snapshot_index) gal_positions = hy.hdf5.read_data( sim.gps_loc, 'Centre', read_index=galaxy_id) shi_ref = hy.hdf5.read_data(sim.fgt_loc, 'SHI', read_index=galaxy_id)[ref_snapshot_index] def plot_log_sigma(snapshot_index, ax): """Plot a surface density map at a given snapshot.""" gal_centre = gal_positions[snapshot_index, :] # Set up a ReadRegion to extract star particles around the galaxy's # position in the current snapshot print("\nSetting up reader:") snapshot_file = sim.get_snap_file(snapshot_index) parts = hy.ReadRegion(snapshot_file, ptype, gal_centre, imsize/1e3, shape='cube') # Get particle coordinates relative to subhalo centre (in kpc) part_relpos = (parts.Coordinates - gal_centre[None, :]) * 1e3 # Now filter out only those particles that are actually part of the # galaxy in : ind_in_gal = parts.in_subhalo(shi_ref, subfind_file_ref) # Make a simple 2D histogram map of mass surface density sigma = (np.histogram2d(part_relpos[ind_in_gal, 1], part_relpos[ind_in_gal, 0], bins=nbins, range=[[-imsize, imsize], [-imsize, imsize]], weights=parts.Mass[ind_in_gal])[0] / ((imsize/nbins)**2)) plt.sca(ax) im = plt.imshow(np.log10(sigma + 1e-15), extent=[-imsize, imsize, -imsize, imsize], aspect='equal', interpolation='nearest', origin='lower', alpha=1.0, cmap=plt.cm.inferno, vmin=plot_range[0], vmax=plot_range[1]) return im im = plot_log_sigma(first_snapshot_index, ax1) im = plot_log_sigma(second_snapshot_index, ax2) # Add some embellishments to plot ax1.set_xlim((-imsize, imsize)) ax1.set_ylim((-imsize, imsize)) ax2.set_xlim((-imsize, imsize)) ax2.set_ylim((-imsize, imsize)) ax1.set_xlabel(r'$\Delta x$ [kpc]') ax1.set_ylabel(r'$\Delta y$ [kpc]') ax2.set_xlabel(r'$\Delta x$ [kpc]') ax2.set_yticks([], []) # Add a colour bar on the right side ax3 = fig.add_axes([0.9, 0.15, 0.02, 0.8]) ax3.set_xticks([]) ax3.set_yticks([]) cbar = plt.colorbar(im, cax=ax3, orientation='vertical') fig.text(0.96, 0.55, r'log$_{10}$ ($\Sigma$ [M$_\odot$ kpc$^{-2}$])', rotation=90.0, va='center', ha='left') # Save the figure plt.show plt.savefig(plotloc, transparent=False, dpi=150)