def map_M_kSZ_tSZ_3x1(num_halo, redshift, simulation_type, nbins=100, rfov=2, output='save', projection=0): # Generate plot frame plotpar.set_defaults_plot() fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(20, 9)) rendersz.render_M(axes[0], num_halo, redshift, simulation_type, projection=projection, nbins=nbins, rfov=rfov) rendersz.render_kSZ(axes[1], num_halo, redshift, simulation_type, projection=projection, nbins=nbins, rfov=rfov) rendersz.render_tSZ(axes[2], num_halo, redshift, simulation_type, projection=projection, nbins=nbins, rfov=rfov) # Define output if output == 'show': plt.show() elif output == 'save': dir_name = 'Maps_M+kSZ+tSZ_3x1' save_name = 'map_M+kSZ+tSZ_3x1' + '_halo' + str(num_halo) + '_z' + str( redshift).replace(".", "") + '_rfov' + str(rfov) + '_nbins' + str( nbins) + '_proj' + str(projection) if not exists(dir_name): makedirs(dir_name) plt.savefig(dir_name + '//' + save_name + '.pdf') else: print( "[ERROR] The output type you are trying to select is not defined.") exit(1)
def phasediag_1x2(redshift, output='show', nbins=600, max_halo=10): plotpar.set_defaults_plot() fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(11.5, 7), sharey=True) phase_diagram_master(axes[0], redshift, nbins=nbins, max_halo=max_halo, selection='all', bg='k') phase_diagram_master(axes[1], redshift, nbins=nbins, max_halo=max_halo, selection='sub', bg='k') # Define output if output == 'show': plt.show() elif output == 'save': save_name = 'phase-diagram_nHcgs_2x1_halo' + str(max_halo) + '_z' + str(redshift).replace(".", "") + '_nbins' + str( nbins) + '.png' dir_name = 'phase_diagrams_T-Rho_master390' if not exists(dir_name): makedirs(dir_name) plt.savefig(dir_name + '//' + save_name) else: print("[ERROR] The output type you are trying to select is not defined.") exit(1)
def map_particles(num_halo, redshift, simulation_type = 'gas', output = 'show', title = True, save_name = 'Map_particles_gas', nbins = 400): # Import data path = extract.path_from_cluster_name(num_halo, simulation_type = simulation_type) file = extract.file_name_hdf5(subject = 'groups', redshift = extract.redshift_floatTostr(redshift)) r200 = extract.group_r200(path, file) group_CoP = extract.group_centre_of_potential(path, file) file = extract.file_name_hdf5(subject = 'particledata', redshift = extract.redshift_floatTostr(redshift)) #print(r200) h = extract.file_hubble_param(path, file) # Gas particles part_type = extract.particle_type('gas') mass = extract.particle_masses(path, file, part_type) coordinates = extract.particle_coordinates(path, file, part_type) velocities = extract.particle_velocity(path, file, part_type) group_number = extract.group_number(path, file, part_type) subgroup_number = extract.subgroup_number(path, file, part_type) tot_rest_frame, _ = profile.total_mass_rest_frame(path, file) #gas_rest_frame, _ = profile.cluster_average_momentum(path, file, part_type) # Retrieve coordinates & velocities x = coordinates[:,0] - group_CoP[0] y = coordinates[:,1] - group_CoP[1] z = coordinates[:,2] - group_CoP[2] vx = velocities[:,0] - tot_rest_frame[0] vy = velocities[:,1] - tot_rest_frame[1] vz = velocities[:,2] - tot_rest_frame[2] # Rescale to comoving coordinates x = profile.comoving_length(x, h, redshift) y = profile.comoving_length(y, h, redshift) z = profile.comoving_length(z, h, redshift) r200 = profile.comoving_length(r200, h, redshift) vx = profile.comoving_velocity(vx, h, redshift) vy = profile.comoving_velocity(vy, h, redshift) vz = profile.comoving_velocity(vz, h, redshift) vx = profile.velocity_units(vx, unit_system = 'astro') vy = profile.velocity_units(vy, unit_system = 'astro') vz = profile.velocity_units(vz, unit_system = 'astro') mass = profile.comoving_mass(mass, h, redshift) mass = profile.mass_units(mass, unit_system = 'astro') # Compute radial distance r = np.sqrt(x**2+y**2+z**2) # Select particles within 5*r200 index = np.where((r < 5*r200) & (group_number > -1) & (subgroup_number > -1))[0] mass = mass[index] x, y, z = x[index], y[index], z[index] vx, vy, vz = vx[index], vy[index], vz[index] # Generate plot plotpar.set_defaults_plot() fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(20, 7)) # Bin data #nbins = 250 cmap = 'terrain_r' ################################################################################################ x_Data = x y_Data = y x_bins = np.linspace(np.min(x_Data), np.max(x_Data), nbins) y_bins = np.linspace(np.min(y_Data), np.max(y_Data), nbins) Cx, Cy = mapgen.bins_meshify(x_Data, y_Data, x_bins, y_bins) count = mapgen.bins_evaluate(x_Data, y_Data, x_bins, y_bins, weights = None) img = axes[0].pcolor(Cx, Cy, np.log10(count), cmap=cmap) axes[0].set_xlabel(r'$x\mathrm{/Mpc}$') axes[0].set_ylabel(r'$y\mathrm{/Mpc}$') axes[0].annotate(r'$\bigotimes z$', (0.03, 0.03), textcoords='axes fraction', size = 15) # Colorbar adjustments ax2_divider = make_axes_locatable(axes[0]) cax2 = ax2_divider.append_axes("right", size="3%", pad="2%") cbar = plt.colorbar(img, cax=cax2, orientation='vertical') #cbar.set_label(r'$\log_{10}(N_{particles})$', labelpad=17) #cax2.xaxis.set_tick_labels(['0',' ','0.5',' ','1',' ', '1.5',' ','2']) cax2.xaxis.set_ticks_position("top") x_Data = y y_Data = z x_bins = np.linspace(np.min(x_Data), np.max(x_Data), nbins) y_bins = np.linspace(np.min(y_Data), np.max(y_Data), nbins) Cx, Cy = mapgen.bins_meshify(x_Data, y_Data, x_bins, y_bins) count = mapgen.bins_evaluate(x_Data, y_Data, x_bins, y_bins, weights = None) img = axes[1].pcolor(Cx, Cy, np.log10(count), cmap=cmap) axes[1].set_xlabel(r'$y\mathrm{/Mpc}$') axes[1].set_ylabel(r'$z\mathrm{/Mpc}$') axes[1].annotate(r'$\bigotimes x$', (0.03, 0.03), textcoords='axes fraction', size = 15) # Colorbar adjustments ax2_divider = make_axes_locatable(axes[1]) cax2 = ax2_divider.append_axes("right", size="3%", pad="2%") cbar = plt.colorbar(img, cax=cax2, orientation='vertical') #cbar.set_label(r'$\log_{10}(N_{particles})$', labelpad=17) #cax2.xaxis.set_tick_labels(['0',' ','0.5',' ','1',' ', '1.5',' ','2']) cax2.xaxis.set_ticks_position("top") x_Data = x y_Data = z x_bins = np.linspace(np.min(x_Data), np.max(x_Data), nbins) y_bins = np.linspace(np.min(y_Data), np.max(y_Data), nbins) Cx, Cy = mapgen.bins_meshify(x_Data, y_Data, x_bins, y_bins) count = mapgen.bins_evaluate(x_Data, y_Data, x_bins, y_bins, weights = None) img = axes[2].pcolor(Cx, Cy, np.log10(count), cmap=cmap) axes[2].set_xlabel(r'$x\mathrm{/Mpc}$') axes[2].set_ylabel(r'$z\mathrm{/Mpc}$') axes[2].annotate(r'$\bigodot y$', (0.03, 0.03), textcoords='axes fraction', size = 15) # Colorbar adjustments ax2_divider = make_axes_locatable(axes[2]) cax2 = ax2_divider.append_axes("right", size="3%", pad="2%") cbar = plt.colorbar(img, cax=cax2, orientation='vertical') cbar.set_label(r'$\log_{10}(N_{particles})$', labelpad=17) #cax2.xaxis.set_tick_labels(['0',' ','0.5',' ','1',' ', '1.5',' ','2']) cax2.xaxis.set_ticks_position("top") ################################################################################################ # Plot r200 circle for i in [0,1,2]: axes[i].set_aspect('equal') axes[i].add_artist(Circle((0,0), radius=r200, color = 'red', fill = False, linestyle = '--', label = r'$R_{200}$')) axes[i].add_artist(Circle((0,0), radius=5*r200, color = 'black', fill = False, linewidth = 0.5,linestyle = '-', label = r'$R_{200}$')) axes[i].set_xlim(-5.1*r200, 5.1*r200) axes[i].set_ylim(-5.1*r200, 5.1*r200) if title: axes[i].set_title(r'$\mathrm{MACSIS\ halo\ } %3d \qquad z = %8.3f$' % (num_halo, redshift)) # Define output if output == 'show': plt.show() elif output == 'save': dir_name = 'Map particles' if not exists(dir_name): makedirs(dir_name) plt.savefig(dir_name + '//'+save_name+'_partType'+part_type+'_halo'+str(num_halo)+'z'+str(redshift).replace(".", "")+'.pdf') else: print("[ERROR] The output type you are trying to select is not defined.") exit(1)
def map_kSZ_intensity(num_halo, redshift, simulation_type, nbins, rfov): # Import data path = extract.path_from_cluster_name(num_halo, simulation_type=simulation_type) file = extract.file_name_hdf5( subject='groups', redshift=extract.redshift_floatTostr(redshift)) r200 = extract.group_r200(path, file) print(r200) group_CoP = extract.group_centre_of_potential(path, file) file = extract.file_name_hdf5( subject='particledata', redshift=extract.redshift_floatTostr(redshift)) # Gas particles part_type = extract.particle_type('gas') mass = extract.particle_masses(path, file, part_type) coordinates = extract.particle_coordinates(path, file, part_type) velocities = extract.particle_velocity(path, file, part_type) temperatures = extract.particle_temperature(path, file, part_type) group_number = extract.group_number(path, file, part_type) subgroup_number = extract.subgroup_number(path, file, part_type) tot_rest_frame, _ = profile.total_mass_rest_frame(path, file) #gas_rest_frame, _ = profile.cluster_average_momentum(path, file, part_type) # Retrieve coordinates & velocities x = coordinates[:, 0] - group_CoP[0] y = coordinates[:, 1] - group_CoP[1] z = coordinates[:, 2] - group_CoP[2] vx = velocities[:, 0] - tot_rest_frame[0] vy = velocities[:, 1] - tot_rest_frame[1] vz = velocities[:, 2] - tot_rest_frame[2] h = extract.file_hubble_param(path, file) # Rescale to comoving coordinates x = profile.comoving_length(x, h, redshift) y = profile.comoving_length(y, h, redshift) z = profile.comoving_length(z, h, redshift) r200 = profile.comoving_length(r200, h, redshift) vx = profile.comoving_velocity(vx, h, redshift) vy = profile.comoving_velocity(vy, h, redshift) vz = profile.comoving_velocity(vz, h, redshift) vx = profile.velocity_units(vx, unit_system='astro') vy = profile.velocity_units(vy, unit_system='astro') vz = profile.velocity_units(vz, unit_system='astro') mass = profile.comoving_mass(mass, h, redshift) mass = profile.mass_units(mass, unit_system='astro') T = temperatures # Compute radial distance r = np.sqrt(x**2 + y**2 + z**2) # Particle selection index = np.where((r < 5 * r200) & (group_number > -1) & (subgroup_number > -1) & (T > 10**5))[0] mass, T = mass[index], T[index] x, y, z = x[index], y[index], z[index] vx, vy, vz = vx[index], vy[index], vz[index] # Generate plot plotpar.set_defaults_plot() fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(20, 9)) # Convert to angular distances #cosmo = {'omega_M_0' : 0.307, 'omega_lambda_0' : 0.693, 'h' : 0.6777} #cosmo = cosmolopy.set_omega_k_0(cosmo) redshift = extract.file_redshift(path, file) #angular_distance = cosmolopy.angular_diameter_distance(redshift, z0 = 0, **cosmo) cosmo = FlatLambdaCDM(H0=70, Om0=0.3) angular_distance = cosmo.luminosity_distance(redshift) print("angular_diameter_distance: ", angular_distance) Mpc_to_arcmin = np.power( np.pi, -1) * 180 * 60 / angular_distance * astropy.units.Mpc x = x * Mpc_to_arcmin y = y * Mpc_to_arcmin z = z * Mpc_to_arcmin r200 = r200 * Mpc_to_arcmin # Bin data cmap = [ plt.get_cmap('seismic'), plt.get_cmap('seismic'), plt.get_cmap('seismic_r') ] #cmap = [mapgen.modified_spectral_cmap(Reversed = True), mapgen.modified_spectral_cmap(Reversed = True), mapgen.modified_spectral_cmap(Reversed = False)] xlabel = [ r'$x\mathrm{/arcmin}$', r'$y\mathrm{/arcmin}$', r'$x\mathrm{/arcmin}$' ] ylabel = [ r'$y\mathrm{/arcmin}$', r'$z\mathrm{/arcmin}$', r'$z\mathrm{/arcmin}$' ] thirdAX = [r'$\bigotimes z$', r'$\bigotimes x$', r'$\bigodot y$'] cbarlabel = [ r'$\sum_{i} m_i v_{z, i}\ [\mathrm{M_\odot\ km\ s^{-1}}]$', r'$\sum_{i} m_i v_{x, i}\ [\mathrm{M_\odot\ km\ s^{-1}}]$', r'$\sum_{i} m_i v_{y, i}\ [\mathrm{M_\odot\ km\ s^{-1}}]$' ] for i in [0, 1, 2]: # Handle data if i == 0: x_Data = x y_Data = y weight = vz elif i == 1: x_Data = y y_Data = z weight = vx elif i == 2: x_Data = x y_Data = z weight = vy x_bins = np.linspace(-rfov * r200, rfov * r200, nbins) y_bins = np.linspace(-rfov * r200, rfov * r200, nbins) Cx, Cy = mapgen.bins_meshify(x_Data, y_Data, x_bins, y_bins) # line of sight momentum weights count = mapgen.bins_evaluate(x_Data, y_Data, x_bins, y_bins, weights=mass * weight) # convolution kernel, _ = kernconv.nika2_kernel(x_bins, y_bins) kernel = np.array(kernel) kSZmap = convolve(count, kernel) norm = mapgen.MidpointNormalize(vmin=kSZmap.min(), vmax=kSZmap.max(), midpoint=0) img = axes[i].pcolor(Cx, Cy, kSZmap, cmap=cmap[i], norm=norm) # Render elements in plots axes[i].set_title(r'$\mathrm{MACSIS\ halo\ } %3d \qquad z = %8.3f$' % (num_halo, redshift), pad=94) axes[i].set_aspect('equal') axes[i].add_artist( Circle((0, 0), radius=r200, color='black', fill=False, linestyle='--', label=r'$R_{200}$')) axes[i].add_artist( Circle((0, 0), radius=5 * r200, color='black', fill=False, linewidth=0.5, linestyle='-', label=r'$R_{200}$')) axes[i].set_xlim(-rfov * r200, rfov * r200) axes[i].set_ylim(-rfov * r200, rfov * r200) axes[i].set_xlabel(xlabel[i]) axes[i].set_ylabel(ylabel[i]) axes[i].annotate(thirdAX[i], (0.03, 0.03), textcoords='axes fraction', size=15) #if title: # axes[i].set_title(r'$\mathrm{MACSIS\ halo\ } %3d \qquad z = %8.3f$' % (num_halo, redshift)) # Colorbar adjustments ax2_divider = make_axes_locatable(axes[i]) cax2 = ax2_divider.append_axes("top", size="5%", pad="2%") cbar = plt.colorbar(img, cax=cax2, orientation='horizontal') cbar.set_label(cbarlabel[i], labelpad=-70) #cax2.xaxis.set_tick_labels(['0',' ','0.5',' ','1',' ', '1.5',' ','2']) cax2.xaxis.set_ticks_position("top") print("run completed:", i) #outfilename = 'parallel-out//I_kSZ_halo' + str(num_halo) +'_z016_' + str(nbins) + 'bins_' + str(rfov) + 'rfov.pdf' #plt.savefig(outfilename) plt.show()
def map_weighted_velocity(num_halo, redshift, simulation_type='gas', output='show', title=True, save_name='Map_particles_gas', plot_groups='FoF', nbins=400): # Import data path = extract.path_from_cluster_name(num_halo, simulation_type=simulation_type) file = extract.file_name_hdf5( subject='groups', redshift=extract.redshift_floatTostr(redshift)) r200 = extract.group_r200(path, file) group_CoP = extract.group_centre_of_potential(path, file) file = extract.file_name_hdf5( subject='particledata', redshift=extract.redshift_floatTostr(redshift)) # Gas particles part_type = extract.particle_type('gas') mass = extract.particle_masses(path, file, part_type) coordinates = extract.particle_coordinates(path, file, part_type) velocities = extract.particle_velocity(path, file, part_type) group_number = extract.group_number(path, file, part_type) subgroup_number = extract.subgroup_number(path, file, part_type) tot_rest_frame, _ = profile.total_mass_rest_frame(path, file) #gas_rest_frame, _ = profile.cluster_average_momentum(path, file, part_type) h = extract.file_hubble_param(path, file) # Retrieve coordinates & velocities x = coordinates[:, 0] - group_CoP[0] y = coordinates[:, 1] - group_CoP[1] z = coordinates[:, 2] - group_CoP[2] vx = velocities[:, 0] - tot_rest_frame[0] vy = velocities[:, 1] - tot_rest_frame[1] vz = velocities[:, 2] - tot_rest_frame[2] # Rescale to comoving coordinates x = profile.comoving_length(x, h, redshift) y = profile.comoving_length(y, h, redshift) z = profile.comoving_length(z, h, redshift) r200 = profile.comoving_length(r200, h, redshift) vx = profile.comoving_velocity(vx, h, redshift) vy = profile.comoving_velocity(vy, h, redshift) vz = profile.comoving_velocity(vz, h, redshift) vx = profile.velocity_units(vx, unit_system='astro') vy = profile.velocity_units(vy, unit_system='astro') vz = profile.velocity_units(vz, unit_system='astro') mass = profile.comoving_mass(mass, h, redshift) mass = profile.mass_units(mass, unit_system='astro') # Compute radial distance r = np.sqrt(x**2 + y**2 + z**2) # Select particles within 5*r200 if plot_groups == 'FoF': index = np.where((r < 5 * r200) & (group_number > -1) & (subgroup_number > -1))[0] elif plot_groups == 'subgroups': index = np.where((r < 5 * r200) & (group_number > -1) & (subgroup_number > 0))[0] else: print( "[ERROR] The (sub)groups you are trying to plot are not defined.") exit(1) mass = mass[index] x, y, z = x[index], y[index], z[index] vx, vy, vz = vx[index], vy[index], vz[index] # Generate plot plotpar.set_defaults_plot() fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(20, 7)) # Bin data #nbins = 800 cmap = mapgen.modified_spectral_cmap(Reversed=True) xlabel = [r'$x\mathrm{/Mpc}$', r'$y\mathrm{/Mpc}$', r'$x\mathrm{/Mpc}$'] ylabel = [r'$y\mathrm{/Mpc}$', r'$z\mathrm{/Mpc}$', r'$z\mathrm{/Mpc}$'] thirdAX = [r'$\bigotimes z$', r'$\bigotimes x$', r'$\bigodot y$'] cbarlabel = [ r'$\sum_{i} m_i v_{z, i} / \sum_{i} m_i \ [\mathrm{km\ s^{-1}}]$', r'$\sum_{i} m_i v_{x, i} / \sum_{i} m_i \ [\mathrm{km\ s^{-1}}]$', r'$\sum_{i} m_i v_{y, i} / \sum_{i} m_i \ [\mathrm{km\ s^{-1}}]$' ] for i in [0, 1, 2]: # Handle data if i == 0: x_Data = x y_Data = y weight = vz elif i == 1: x_Data = y y_Data = z weight = vx elif i == 2: x_Data = x y_Data = z weight = vy cmap = mapgen.modified_spectral_cmap(Reversed=False) x_bins = np.linspace(np.min(x_Data), np.max(x_Data), nbins) y_bins = np.linspace(np.min(y_Data), np.max(y_Data), nbins) Cx, Cy = mapgen.bins_meshify(x_Data, y_Data, x_bins, y_bins) # line of sight momentum weights count_mv = mapgen.bins_evaluate(x_Data, y_Data, x_bins, y_bins, weights=mass * weight) # mass weights count_m = mapgen.bins_evaluate(x_Data, y_Data, x_bins, y_bins, weights=mass) # average mass weighted velocity count_m[count_m == 0] = 1 count = np.divide(count_mv, count_m) norm = mapgen.MidpointNormalize(vmin=count.min(), vmax=count.max(), midpoint=0) img = axes[i].pcolor(Cx, Cy, count, cmap=cmap, norm=norm) # Render elements in plots axes[i].set_aspect('equal') axes[i].add_artist( Circle((0, 0), radius=r200, color='black', fill=False, linestyle='--', label=r'$R_{200}$')) axes[i].add_artist( Circle((0, 0), radius=5 * r200, color='black', fill=False, linewidth=0.5, linestyle='-', label=r'$R_{200}$')) axes[i].set_xlim(-5.1 * r200, 5.1 * r200) axes[i].set_ylim(-5.1 * r200, 5.1 * r200) axes[i].set_xlabel(xlabel[i]) axes[i].set_ylabel(ylabel[i]) axes[i].annotate(thirdAX[i], (0.03, 0.03), textcoords='axes fraction', size=15) if title: axes[i].set_title( r'$\mathrm{MACSIS\ halo\ } %3d \qquad z = %8.3f$' % (num_halo, redshift)) # Colorbar adjustments ax2_divider = make_axes_locatable(axes[i]) cax2 = ax2_divider.append_axes("right", size="3%", pad="2%") cbar = plt.colorbar(img, cax=cax2, orientation='vertical') cbar.set_label(cbarlabel[i], labelpad=17) #cax2.xaxis.set_tick_labels(['0',' ','0.5',' ','1',' ', '1.5',' ','2']) cax2.xaxis.set_ticks_position("top") # Define output if output == 'show': plt.show() elif output == 'save': dir_name = 'Map mass weighted velocity' if not exists(dir_name): makedirs(dir_name) plt.savefig(dir_name + '//' + save_name + '_partType' + part_type + '_halo' + str(num_halo) + 'z' + str(redshift).replace(".", "") + '.pdf') else: print( "[ERROR] The output type you are trying to select is not defined.") exit(1)
def phase_diagram_master(redshift, nbins=500, output='save', selection='all', bg='w'): master_density = [] master_temperature = [] for num_halo in np.arange(390): print('Ímporting halo ' + str(num_halo)) # Import data path = extract.path_from_cluster_name(num_halo, simulation_type='gas') file = extract.file_name_hdf5( subject='groups', redshift=extract.redshift_floatTostr(redshift)) r200 = extract.group_r200(path, file) group_CoP = extract.group_centre_of_potential(path, file) file = extract.file_name_hdf5( subject='particledata', redshift=extract.redshift_floatTostr(redshift)) # Gas particles part_type = extract.particle_type('gas') density = extract.particle_SPH_density(path, file, part_type) coordinates = extract.particle_coordinates(path, file, part_type) temperature = extract.particle_temperature(path, file, part_type) group_number = extract.group_number(path, file, part_type) subgroup_number = extract.subgroup_number(path, file, part_type) # Retrieve coordinates x = coordinates[:, 0] - group_CoP[0] y = coordinates[:, 1] - group_CoP[1] z = coordinates[:, 2] - group_CoP[2] # Rescale to comoving coordinates h = extract.file_hubble_param(path, file) x = profile.comoving_length(x, h, redshift) y = profile.comoving_length(y, h, redshift) z = profile.comoving_length(z, h, redshift) r200 = profile.comoving_length(r200, h, redshift) density = profile.comoving_density(density, h, redshift) density = profile.density_units(density, unit_system='nHcgs') # Compute radial distance r = np.sqrt(x**2 + y**2 + z**2) index = 0 # Select particles within 5*r200 if selection.lower() == 'all': index = np.where((r < 5 * r200) & (group_number == 1) & (subgroup_number > -1))[0] if selection.lower() == 'sub': index = np.where((r < 5 * r200) & (group_number == 1) & (subgroup_number > 0) & (subgroup_number < 10000))[0] if selection.lower() == 'icm': index = np.where((r < 5 * r200) & (group_number == 1) & (subgroup_number == 0))[0] density = density[index] temperature = temperature[index] master_density.append(density) master_temperature.append((temperature)) # Bin data x_Data = np.concatenate(master_density) y_Data = np.concatenate(master_temperature) x_bins = np.logspace(np.min(np.log10(x_Data)), np.max(np.log10(x_Data)), nbins) y_bins = np.logspace(np.min(np.log10(y_Data)), np.max(np.log10(y_Data)), nbins) A_pix = (x_bins[1] - x_bins[0]) * (y_bins[1] - y_bins[0]) Cx, Cy = mapgen.bins_meshify(x_Data, y_Data, x_bins, y_bins) count = mapgen.bins_evaluate(x_Data, y_Data, x_bins, y_bins, weights=None) / A_pix # Generate plot plotpar.set_defaults_plot() fig, axes = plt.subplots(nrows=1, ncols=1, figsize=(7, 7)) # Logarithmic normalization norm = mpl.colors.LogNorm() # (vmin=10 ** -2, vmax=10 ** 1) count2 = np.ma.masked_where(count == 0, count) cmap = plt.get_cmap('CMRmap') cmap.set_bad(color=bg, alpha=1) img = axes.pcolormesh(Cx, Cy, count2, cmap=cmap, norm=norm) axes.set_xscale('log') axes.set_yscale('log') axes.set_xlabel(r'$n_{\mathrm{H}}/\mathrm{cm}^{3}$') #axes.set_xlabel(r'$\rho/(M_\odot\ kpc^{-3})$') axes.set_ylabel(r'$T/\mathrm{K}$') # Colorbar adjustments ax2_divider = make_axes_locatable(axes) cax2 = ax2_divider.append_axes("top", size="3%", pad="2%") cbar = plt.colorbar(img, cax=cax2, orientation='horizontal') cbar.set_label( r'$N_{\mathrm{particles}} / (\mathrm{K}\ \mathrm{cm}^{-3})$', labelpad=-70) # cax2.xaxis.set_tick_labels(['0',' ','0.5',' ','1',' ', '1.5',' ','2']) cax2.xaxis.set_ticks_position("top") # Define output if output == 'show': plt.show() elif output == 'save': save_name = 'phase-diagram_nHcgs_halo' + str(10) + '_z' + str( redshift).replace( ".", "") + '_nbins' + str(nbins) + '_' + selection + '.png' dir_name = 'phase_diagrams_T-Rho_master390' if not exists(dir_name): makedirs(dir_name) plt.savefig(dir_name + '//' + save_name) else: print( "[ERROR] The output type you are trying to select is not defined.") exit(1)
def phase_diagram(num_halo, redshift, output='show', title=True, save_name='Central_group_all_part_halo_'): # Import data path = extract.path_from_cluster_name(num_halo, simulation_type=simulation_type) file = extract.file_name_hdf5( subject='groups', redshift=extract.redshift_floatTostr(redshift)) r200 = extract.group_r200(path, file) group_CoP = extract.group_centre_of_potential(path, file) file = extract.file_name_hdf5( subject='particledata', redshift=extract.redshift_floatTostr(redshift)) # Gas particles part_type = extract.particle_type('gas') density = extract.particle_SPH_density(path, file, part_type) coordinates = extract.particle_coordinates(path, file, part_type) temperature = extract.particle_temperature(path, file, part_type) group_number = extract.group_number(path, file, part_type) subgroup_number = extract.subgroup_number(path, file, part_type) # Retrieve coordinates x = coordinates[:, 0] - group_CoP[0] y = coordinates[:, 1] - group_CoP[1] z = coordinates[:, 2] - group_CoP[2] # Rescale to comoving coordinates x = profile.comoving_length(x, h, redshift) y = profile.comoving_length(y, h, redshift) z = profile.comoving_length(z, h, redshift) r200 = profile.comoving_length(r200, h, redshift) density = profile.comoving_density(density, h, redshift) density = profile.density_units(density, unit_system='astro') # Compute radial distance r = np.sqrt(x**2 + y**2 + z**2) # Select particles within 5*r200 index = np.where((r < 5 * r200) & (group_number > -1) & (subgroup_number > 0))[0] density = density[index] temperature = temperature[index] # Bin data nbins = 600 x_Data = density y_Data = temperature x_bins = np.logspace(np.min(np.log10(x_Data)), np.max(np.log10(x_Data)), nbins) y_bins = np.logspace(np.min(np.log10(y_Data)), np.max(np.log10(y_Data)), nbins) Cx, Cy = mapgen.bins_meshify(x_Data, y_Data, x_bins, y_bins) count = mapgen.bins_evaluate(x_Data, y_Data, x_bins, y_bins, weights=None) # Generate plot plotpar.set_defaults_plot() fig, axes = plt.subplots(nrows=1, ncols=1, figsize=(7, 6)) img = axes.pcolor(Cx, Cy, np.log10(count + 1), cmap='viridis') axes.set_xscale('log') axes.set_yscale('log') axes.set_xlabel(r'$\rho/(M_\odot\ pc^{-3})$') axes.set_ylabel(r'$T/K$') if title: axes.set_title(r'$\mathrm{MACSIS\ halo\ } %3d \qquad z = %8.3f$' % (num_halo, redshift)) # Colorbar adjustments ax2_divider = make_axes_locatable(axes) cax2 = ax2_divider.append_axes("right", size="3%", pad="2%") cbar = plt.colorbar(img, cax=cax2, orientation='vertical') cbar.set_label(r'$\log_{10}(N_{particles})$', labelpad=17) #cax2.xaxis.set_tick_labels(['0',' ','0.5',' ','1',' ', '1.5',' ','2']) cax2.xaxis.set_ticks_position("top") # Define output if output == 'show': plt.show() elif output == 'save': dir_name = 'Temperature-Density phase diagrams' if not exists(dir_name): makedirs(dir_name) plt.savefig(dir_name + '//' + save_name + str(num_halo) + 'z' + str(redshift).replace(".", "") + '.pdf') else: print( "[ERROR] The output type you are trying to select is not defined.") exit(1)
def render_figure(halo_number, redshift, projection, output="Show"): plotpar.set_defaults_plot() nullfmt = NullFormatter() fig = plt.figure(1, figsize=(10, 13)) # Now, create the gridspec structure, as required gs = gridspec.GridSpec(ncols=3, nrows=7, height_ratios=[0.05, 1, 0.5, 0.7, 0.05, 1, 0.5], width_ratios=[1, 1, 0.5]) # 3 rows, 4 columns, each with the required size ratios. # Also make sure the margins and spacing are apropriate gs.update(left=0.05, right=0.95, bottom=0.08, top=0.93, wspace=0.08, hspace=0.08) # Note: I set the margins to make it look good on my screen ... # BUT: this is irrelevant for the saved image, if using bbox_inches='tight'in savefig ! # Note: Here, I use a little trick. I only have three vertical layers of plots : # a scatter plot, a histogram, and a line plot. So, in principle, I could use a 3x3 structure. # However, I want to have the histogram 'closer' from the scatter plot than the line plot. # So, I insert a 4th layer between the histogram and line plot, # keep it empty, and use its thickness (the 0.2 above) to adjust the space as required. selection_color = 'coral' # selection_color = 'lime' colormap = 'YlGnBu_r' alpha_select = 0.1 # LABELS label_n = r'$n_{sub}$' label_M = r'$M/M_\odot$' label_R = r'$R/R_{200}$' label_f = r'$f_{g}$' label_v = r'$v_{z}/\mathrm{(km\ s^{-1})}$' # GRIDS & NBINS grid_on = False # loop over plots for j in [0, 4]: for i in [0, 1]: print('Block started') if i == 0 and j == 0: x = data_dict['R'] y = data_dict['Fg'] SELECT_x_min, SELECT_x_max = selec_dict[ 'SELECT_R_MIN'], selec_dict['SELECT_R_MAX'] SELECT_y_min, SELECT_y_max = selec_dict[ 'SELECT_Fg_MIN'], selec_dict['SELECT_Fg_MAX'] if i == 1 and j == 0: x = data_dict['M'] y = data_dict['Fg'] SELECT_x_min, SELECT_x_max = selec_dict[ 'SELECT_M_MIN'], selec_dict['SELECT_M_MAX'] SELECT_y_min, SELECT_y_max = selec_dict[ 'SELECT_Fg_MIN'], selec_dict['SELECT_Fg_MAX'] if i == 0 and j == 4: x = data_dict['R'] y = data_dict['Vr'] SELECT_x_min, SELECT_x_max = selec_dict[ 'SELECT_R_MIN'], selec_dict['SELECT_R_MAX'] SELECT_y_min, SELECT_y_max = selec_dict[ 'SELECT_Vr_MIN'], selec_dict['SELECT_Vr_MAX'] if i == 1 and j == 4: x = data_dict['M'] y = data_dict['Vr'] SELECT_x_min, SELECT_x_max = selec_dict[ 'SELECT_M_MIN'], selec_dict['SELECT_M_MAX'] SELECT_y_min, SELECT_y_max = selec_dict[ 'SELECT_Vr_MIN'], selec_dict['SELECT_Vr_MAX'] x_min_LIN, x_max_LIN = np.min(x), np.max(x) x_min_LOG, x_max_LOG = np.log10(x_min_LIN), np.log10(x_max_LIN) y_min_LIN, y_max_LIN = np.min(y), np.max(y) if j == 0: y_min_LIN, y_max_LIN = 0, 0.3 # First, the scatter plot ax1 = fig.add_subplot(gs[j + 1, i]) print('\tComputing 2dhist \t\t (%1i, %1i)' % (j + 1, i)) # # Get the optimal number of bins based on knuth_bin_width # N_xbins = int((np.max(x)-np.min(x))/knuth_bin_width(x)) + 1 # N_ybins = int((np.max(y)-np.min(y))/knuth_bin_width(y)) + 1 N_xbins = 50 N_ybins = N_xbins bins_LOG = np.logspace(x_min_LOG, x_max_LOG, num=N_xbins) bins_LIN = np.linspace(y_min_LIN, y_max_LIN, num=N_ybins) Cx, Cy = mapgen.bins_meshify(x, y, bins_LOG, bins_LIN) count = mapgen.bins_evaluate(x, y, bins_LOG, bins_LIN, weights=None) norm = colors.LogNorm() plt1 = ax1.pcolor(Cx, Cy, count, cmap=colormap, norm=norm) ax1.grid(grid_on) ax1.set_xlim([x_min_LIN, x_max_LIN]) ax1.set_ylim([y_min_LIN, y_max_LIN]) ax1.set_xscale('log') ax1.set_yscale('linear') ax1.set_xlabel(r' ') # Force this empty ! ax1.xaxis.set_major_formatter(nullfmt) ax1.set_ylabel(label_f) if j == 4: ax1.axhspan(-SELECT_y_max, -SELECT_y_min, alpha=alpha_select, color=selection_color) rect2 = patches.Rectangle((SELECT_x_min, -SELECT_y_max), SELECT_x_max - SELECT_x_min, -SELECT_y_min + SELECT_y_max, linewidth=1.5, edgecolor='r', facecolor='none') ax1.add_patch(rect2) ax1.axvspan(SELECT_x_min, SELECT_x_max, alpha=alpha_select, color=selection_color) ax1.axhspan(SELECT_y_min, SELECT_y_max, alpha=alpha_select, color=selection_color) rect = patches.Rectangle((SELECT_x_min, SELECT_y_min), SELECT_x_max - SELECT_x_min, SELECT_y_max - SELECT_y_min, linewidth=1.5, edgecolor='r', facecolor='none') ax1.add_patch(rect) if j == 0: ax1.set_ylabel(label_f) elif j == 4: ax1.set_ylabel(label_v) # Colorbar cbax = fig.add_subplot(gs[j, i]) print('\tComputing colorbar \t\t (%1i, %1i)' % (j, i)) cb = Colorbar(ax=cbax, mappable=plt1, orientation='horizontal', ticklocation='top') cb.set_label(label_n, labelpad=10) trig_vertical_hist = 0 # VERTICAL HISTOGRAM if i != 0: ax1v = fig.add_subplot(gs[j + 1, i + 1]) print('\tComputing vert hist \t (%1i, %1i)' % (j + 1, i + 1)) ax1v.hist(y, bins=bins_LIN, orientation='horizontal', color='k', histtype='step') ax1v.hist(y, bins=bins_LIN, orientation='horizontal', color='red', histtype='step', cumulative=-1) ax1v.set_yticks(ax1.get_yticks( )) # Ensures we have the same ticks as the scatter plot ! ax1v.set_xlabel(label_n) ax1v.tick_params(labelleft=False) ax1v.set_ylim(ax1.get_ylim()) ax1v.set_xscale('log') ax1v.set_yscale('linear') ax1v.grid(grid_on) ax1v.axhspan(SELECT_y_min, SELECT_y_max, alpha=alpha_select, color=selection_color) if j == 4: ax1v.axhspan(-SELECT_y_max, -SELECT_y_min, alpha=alpha_select, color=selection_color) ax1.yaxis.set_major_formatter(nullfmt) ax1.set_ylabel('') trig_vertical_hist = 1 # Percentiles percents = [15.9, 50, 84.1] percent_str = [r'$16\%$', r'$50\%$', r'$84\%$'] clr = ['orange', 'blue', 'green'] percent_ticks = np.percentile(y, percents) if trig_vertical_hist: percent_str = np.flipud(percent_str) clr = np.flipud(clr) ax1v_TWIN = ax1v.twinx() ax1v_TWIN.set_ylim(ax1.get_ylim()) ax1v_TWIN.tick_params(axis='y', which='both', labelleft='off', labelright='on') ax1v_TWIN.set_yticks(percent_ticks) ax1v_TWIN.set_yticklabels(percent_str) for percent_tick, c, tick in zip( percent_ticks, clr, ax1v_TWIN.yaxis.get_major_ticks()): tick.label1.set_color(c) ax1v_TWIN.axhline(y=percent_tick, color=c, linestyle='--') percent_str = np.flipud(percent_str) clr = np.flipud(clr) # HORIZONTAL HISTOGRAM ax1h = fig.add_subplot(gs[j + 2, i]) print('\tComputing horiz hist \t (%1i, %1i)' % (j + 2, i)) ax1h.hist(x, bins=bins_LOG, orientation='vertical', color='k', histtype='step') ax1h.hist(x, bins=bins_LOG, orientation='vertical', color='red', histtype='step', cumulative=True) ax1h.set_xticks(ax1.get_xticks( )) # Ensures we have the same ticks as the scatter plot ! ax1h.set_xlim(ax1.get_xlim()) if i == 0: ax1h.set_xlabel(label_R) ax1h.set_ylabel(label_n) elif i == 1: ax1h.set_xlabel(label_M) ax1h.tick_params(labelleft=False) ax1h.set_ylabel('') ax1h.set_xscale('log') ax1h.set_yscale('log') ax1h.grid(grid_on) ax1h.axvspan(SELECT_x_min, SELECT_x_max, alpha=alpha_select, color=selection_color) percent_ticks = np.percentile(x, percents) for i in range(len(percents)): ax1h.axvline(x=percent_ticks[i], color=clr[i], linestyle='--') print('Block completed\n') if output.lower() == 'show': fig.show() elif output.lower() == 'save': dir_name = 'Subfind-Selection' if not exists(dir_name): makedirs(dir_name) save_name = 'selection-phase-space_halo' + str( halo_number) + '_z' + str(redshift).replace( ".", "") + '_proj' + str(projection) + '.pdf' fig.savefig(dir_name + '//' + save_name, dpi=None, facecolor='w', edgecolor='w', orientation='portrait', papertype=None, format=None, transparent=False, bbox_inches='tight', pad_inches=0.1, frameon=None) elif output.lower() == 'none': pass else: print("Error: Invalid request")
def map_tSZ_intensity(num_halo, redshift, simulation_type, nbins=100, rfov=2, output='show', title=True, plot_groups='FoF'): # Import data path = extract.path_from_cluster_name(num_halo, simulation_type=simulation_type) file = extract.file_name_hdf5( subject='groups', redshift=extract.redshift_floatTostr(redshift)) r200 = extract.group_r200(path, file) group_CoP = extract.group_centre_of_potential(path, file) file = extract.file_name_hdf5( subject='particledata', redshift=extract.redshift_floatTostr(redshift)) redshift_short = redshift # Gas particles part_type = extract.particle_type('gas') mass = extract.particle_masses(path, file, part_type) coordinates = extract.particle_coordinates(path, file, part_type) velocities = extract.particle_velocity(path, file, part_type) temperatures = extract.particle_temperature(path, file, part_type) group_number = extract.group_number(path, file, part_type) subgroup_number = extract.subgroup_number(path, file, part_type) tot_rest_frame, _ = profile.total_mass_rest_frame(path, file) #gas_rest_frame, _ = profile.cluster_average_momentum(path, file, part_type) # Retrieve coordinates & velocities x = coordinates[:, 0] - group_CoP[0] y = coordinates[:, 1] - group_CoP[1] z = coordinates[:, 2] - group_CoP[2] vx = velocities[:, 0] - tot_rest_frame[0] vy = velocities[:, 1] - tot_rest_frame[1] vz = velocities[:, 2] - tot_rest_frame[2] # Rescale to comoving coordinates h = extract.file_hubble_param(path, file) redshift = extract.file_redshift(path, file) x = profile.comoving_length(x, h, redshift) y = profile.comoving_length(y, h, redshift) z = profile.comoving_length(z, h, redshift) r200 = profile.comoving_length(r200, h, redshift) vx = profile.comoving_velocity(vx, h, redshift) vy = profile.comoving_velocity(vy, h, redshift) vz = profile.comoving_velocity(vz, h, redshift) vx = profile.velocity_units(vx, unit_system='SI') vy = profile.velocity_units(vy, unit_system='SI') vz = profile.velocity_units(vz, unit_system='SI') mass = profile.comoving_mass(mass, h, redshift) mass = profile.mass_units(mass, unit_system='SI') T = temperatures # Compute radial distance r = np.sqrt(x**2 + y**2 + z**2) # Particle selection min_gn = 0 min_T = 10**5 max_r = 5 if plot_groups == 'FoF': min_sgn = 0 elif plot_groups == 'subgroups': min_sgn = 1 else: print( "[ERROR] The (sub)groups you are trying to plot are not defined.") exit(1) index = np.where((r < max_r * r200) & (group_number >= min_gn) & (subgroup_number >= min_sgn) & (T > min_T))[0] mass, T = mass[index], T[index] x, y, z = x[index], y[index], z[index] vx, vy, vz = vx[index], vy[index], vz[index] # Generate plot frame plotpar.set_defaults_plot() fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(20, 9)) # Convert to angular distances angular_distance = cosmo.angular_diameter_D(redshift) Mpc_to_arcmin = np.power(np.pi, -1) * 180 * 60 / angular_distance x = x * Mpc_to_arcmin y = y * Mpc_to_arcmin z = z * Mpc_to_arcmin r200 = r200 * Mpc_to_arcmin # Bin data cmap = ['Blues', 'Blues', 'Blues'] # cmap = [mapgen.modified_spectral_cmap(Reversed = True), mapgen.modified_spectral_cmap(Reversed = True), mapgen.modified_spectral_cmap(Reversed = False)] xlabel = [ r'$x\mathrm{/arcmin}$', r'$y\mathrm{/arcmin}$', r'$x\mathrm{/arcmin}$' ] ylabel = [ r'$y\mathrm{/arcmin}$', r'$z\mathrm{/arcmin}$', r'$z\mathrm{/arcmin}$' ] thirdAX = [r'$\bigotimes z$', r'$\bigotimes x$', r'$\bigodot y$'] cbarlabel = [r'$y_{tSZ}$', r'$y_{tSZ}$', r'$y_{tSZ}$'] weight_function = r'$y_{tSZ} = - \frac{\sigma_T}{A_{pix} \mu_e m_H c} \sum_{i=0}^{N_{l.o.s.} m^{g}_i T^{g}_i}$' for i in [0, 1, 2]: # Handle data if i == 0: x_Data = x y_Data = y weight = T elif i == 1: x_Data = y y_Data = z weight = T elif i == 2: x_Data = x y_Data = z weight = T # Compute angular bins x_bins = np.linspace(-rfov * r200, rfov * r200, nbins) y_bins = np.linspace(-rfov * r200, rfov * r200, nbins) Cx, Cy = mapgen.bins_meshify(x_Data, y_Data, x_bins, y_bins) from astropy.constants import c, sigma_T, k_B, m_e m_H = 1.6737236 * 10**(-27) # Hydrogen atom mass in kg A_pix = (x_bins[1] - x_bins[0]) * (y_bins[1] - y_bins[0]) * ( 3.0856776 * 10**22 / Mpc_to_arcmin)**2 const = sigma_T.value * k_B.value / (m_e.value * c.value**2 * m_H * 1.16) # line of sight momentum weights mass = mass.astype(np.longdouble) weight = weight.astype(np.longdouble) count_mT = mapgen.bins_evaluate(x_Data, y_Data, x_bins, y_bins, weights=mass * weight) # Compute tSZ tSZ = count_mT * const / (A_pix) # convolution kernel_Type = 'gauss' #kernel = Gaussian2DKernel(stddev=2) kernel, fwhm = kernconv.nika2_kernel(x_bins, y_bins, kernel_Type=kernel_Type) kernel = np.array(kernel) tSZmap = convolve(tSZ, kernel) # norm = mapgen.MidpointNormalize(vmin=tSZmap.min(), vmax=tSZmap.max(), midpoint=0) c # norm = colors.PowerNorm(gamma=0.2) img = axes[i].pcolor(Cx, Cy, tSZmap, cmap=cmap[i], norm=norm) # Render elements in plots axes[i].set_aspect('equal') axes[i].add_artist( Circle((0, 0), radius=r200, color='black', fill=False, linestyle='--', label=r'$R_{200}$')) axes[i].add_artist( Circle((0, 0), radius=5 * r200, color='black', fill=False, linewidth=0.5, linestyle='-', label=r'$R_{200}$')) axes[i].set_xlim(-rfov * r200, rfov * r200) axes[i].set_ylim(-rfov * r200, rfov * r200) axes[i].set_xlabel(xlabel[i]) axes[i].set_ylabel(ylabel[i]) axes[i].annotate(thirdAX[i], (0.03, 0.03), textcoords='axes fraction', size=15) if title and plot_groups == 'FoF': axes[i].set_title( r'$\mathrm{MACSIS\ halo\ } %3d \qquad z = %8.3f \qquad \mathrm{ICM + subhalos}$' % (num_halo, redshift), pad=94) if title and plot_groups == 'subgroups': axes[i].set_title( r'$\mathrm{MACSIS\ halo\ } %3d \qquad z = %8.3f \qquad \mathrm{subhalos}$' % (num_halo, redshift), pad=94) # Colorbar adjustments ax2_divider = make_axes_locatable(axes[i]) cax2 = ax2_divider.append_axes("top", size="5%", pad="2%") cbar = plt.colorbar(img, cax=cax2, orientation='horizontal') cbar.set_label(cbarlabel[i], labelpad=-70) #cax2.xaxis.set_tick_labels(['0',' ','0.5',' ','1',' ', '1.5',' ','2']) cax2.xaxis.set_ticks_position("top") print("Plot run completed:\t", i) # Define output if output == 'show': plt.show() elif output == 'save': dir_name = 'tSZ maps' if not exists(dir_name): makedirs(dir_name) save_name = 'tSZmap_' + plot_groups + '_halo' + str( num_halo) + '_z' + str(redshift_short).replace( ".", "") + '_rfov' + str(rfov) + '_nbins' + str(nbins) plt.savefig(dir_name + '//' + save_name + '.pdf') # Generate metadata.txt args = (num_halo, simulation_type, redshift, angular_distance, min_gn, min_sgn, min_T, max_r, weight_function, nbins, rfov, kernel_Type, fwhm, r200, r200 / Mpc_to_arcmin) meta.metadata_file(args, dir_name + '//' + save_name) else: print( "[ERROR] The output type you are trying to select is not defined.") exit(1)
------------------------------------------------------------------- """ import numpy as np from matplotlib import pyplot as plt import sys import os.path sys.path.append( os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) from import_toolkit.cluster import Cluster from visualisation.rendering import Map from visualisation import map_plot_parameters as plotpar plotpar.set_defaults_plot() def group_centre_of_mass(cluster, out_allPartTypes=False, filter_radius=None): """ out_allPartTypes = (bool) if True outputs the centre of mass and sum of masses of each partType separately in arrays if False outputs the overall CoM and sum of masses of the whole cluster. Returns the centre of mass of the cluster for a ALL particle types, except for lowres_DM (2, 3). """ CoM_PartTypes = np.zeros((0, 3), dtype=np.float)