In the examples subdirectory of the powderday root directory are some example snapshots for different hydro codes suppported thusfar. This will likely change over time as the code evolves and parameter files change. Also, eventually the examples will migrate to the agora project snapshots.

For each example file there should be two parameter files that will be reasonable for the associated snapshot, though you’ll need to edit the hard linked directories that specify where (e.g.) dust files are and output should go. To run powderday in any directory:

>pd_front_end.py example directory parameters_master_file

Note - the .py extensions on the parameter files need to be left off.


For example, we have run a gizmo cosmological zoom simulation of a Milky Way mass galaxy that can be downloaded here (6 GB download):

To run powderday on the simulation, you would type:

>pd_front_end.py examples/gadget/mw_zoom parameters_master_401 parameters_model_401

The SED (placed at z = 3 with a Planck13 cosmology) looks like:


and an example plotting code can be found in the convenience subdirectory of the powderday root directory.

The individual parameter files that control this simulation are the parameters_master file and the parameters_model file. The descriptions of these are detailed here but in short, the parameters_master file is meant to control paramters that one might like to remain constant typically for every single galaxy in a given snapshot, or every snapshot in a model simulation. In contrast, the parameters_model file has variables such as the snapshot name, or output file name - variables that one might expect to change for different galaxies in a snapshot or different snapshots in a simulation.


We can create monochromatic images by running the code in the exact same manner as above, though setting the flag “IMAGING” to true in the parameters_master file. A procedure to plot an image is demonstrated in the convenience script make_image_single_wavelength.py, found in the convenience subdirectory.

If filters other than the default filter (arbitrary.filter) are used, powderday will convolve the monochromatic image outputs with each filter’s transmission function and save the result in the output directory as convolved.XXX.hdf5.

Say we’ve set the following in the parameters master file:

powderday will run at each wavelength in all of the specified filter files, and produce convolved image data for each filter.

After running:

>pd_front_end.py examples/gadget/mw_zoom parameters_master_401 parameters_model_401

we get the standard output files, along with the convolved image data (in this case, it is named convolved.134.hdf5).

To load in the image data, use:

import h5py
f = h5py.File('convolved.134.hdf5', 'r')

Now, the image and filter data can be accessed in the hdf5 file format (thoroughly described in the h5py documentation).

Image data is stored in a 3-dimensional array, with the first axis across the filters. The image’s index is matched to its respective filter filename, stored in the filter_names dataset in the np.bytes_ format. So, if you wanted to access a convolved image and its corresponding filter name, you could do:

>>> convolved_image = f['image_data'][0]
>>> filter_name = f['filter_names'][0].astype(str)
>>> print(filter_name)

The filter’s transmission function must be accessed differently. Each filter’s transmission function is saved in its own dataset and can be called using its name:

>>> f['galex1500.filter'][...]
array([[ 1.3406205e-01,  9.0700000e-07],
       [ 1.3504851e-01,  1.1537571e-01],
       [ 1.3702143e-01,  1.7650714e-01],

The image width (float) and its units (np.bytes_ string) are stored as attributes of the image_data dataset. To plot an image, one might do something like this:

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(111)

w = f['image_data'].attrs['width']
w_unit = f['image_data'].attrs['width_unit'].astype(str)

cax = ax.imshow(np.log(convolved_image), cmap=plt.cm.viridis,
                origin='lower', extent=[-w, w, -w, w])
ax.tick_params(axis='both', which='major', labelsize=10)
ax.set_xlabel('x ({})'.format(w_unit))
ax.set_ylabel('y ({})'.format(w_unit))
plt.colorbar(cax, label='log Luminosity (ergs/s)', format='%.0e')
plt.title("Convolved image: {}".format(filter_name))