diff --git a/.gitignore b/.gitignore index 46489e0..dd299cd 100644 --- a/.gitignore +++ b/.gitignore @@ -36,6 +36,7 @@ docs/_build dist build eggs +.eggs parts bin var diff --git a/CHANGES.rst b/CHANGES.rst index f05a6e1..91b7902 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,6 +1,7 @@ 0.9 (unreleased) ---------------- +- Fix Simulator output table units with astropy 1.3.2 (#62). - Add support for simulating calibration exposures (#54). - Add wavelength min/max options to Simulator.plot(). - Better support for alternate simulation wavelength grids (PR #60). diff --git a/setup.cfg b/setup.cfg index 7bb1d65..3422010 100644 --- a/setup.cfg +++ b/setup.cfg @@ -12,7 +12,7 @@ all_files = 1 upload-dir = docs/_build/html show-response = 1 -[pytest] +[tool:pytest] minversion = 2.2 norecursedirs = build docs/_build doctest_plus = enabled diff --git a/specsim/simulator.py b/specsim/simulator.py index c6173ff..89d5a6a 100644 --- a/specsim/simulator.py +++ b/specsim/simulator.py @@ -477,15 +477,15 @@ def simulate(self, sky_positions=None, focal_positions=None, camera.read_noise_per_bin[:, np.newaxis].to(u.electron).value) # Calculate the corresponding downsampled output quantities. - output['num_source_electrons'] = ( + output['num_source_electrons'][:] = ( camera.downsample(num_source_electrons.T)).T - output['num_sky_electrons'] = ( + output['num_sky_electrons'][:] = ( camera.downsample(num_sky_electrons.T)).T - output['num_dark_electrons'] = ( + output['num_dark_electrons'][:] = ( camera.downsample(num_dark_electrons.T)).T - output['read_noise_electrons'] = np.sqrt( + output['read_noise_electrons'][:] = np.sqrt( camera.downsample(read_noise_electrons.T ** 2)).T - output['variance_electrons'] = ( + output['variance_electrons'][:] = ( output['num_source_electrons'] + output['num_sky_electrons'] + output['num_dark_electrons'] + @@ -493,16 +493,16 @@ def simulate(self, sky_positions=None, focal_positions=None, # Calculate the effective calibration from detected electrons to # source flux above the atmosphere, downsampled to output pixels. - output['flux_calibration'] = 1.0 / camera.downsample( + output['flux_calibration'][:] = 1.0 / camera.downsample( camera.apply_resolution( source_flux_to_photons.T * camera.throughput)).T # Calculate the calibrated flux in this camera. - output['observed_flux'] = ( + output['observed_flux'][:] = ( output['flux_calibration'] * output['num_source_electrons']) # Calculate the corresponding flux inverse variance. - output['flux_inverse_variance'] = ( + output['flux_inverse_variance'][:] = ( output['flux_calibration'] ** -2 * output['variance_electrons'] ** -1) diff --git a/specsim/tests/test_simulator.py b/specsim/tests/test_simulator.py index 158ee31..3cac71b 100644 --- a/specsim/tests/test_simulator.py +++ b/specsim/tests/test_simulator.py @@ -110,6 +110,22 @@ def test_fiber_positioning(): assert np.allclose(sim.focal_y.to(u.mm).value, 0.) +def test_output_table_units(): + """Test that units are preserved after calling simulate(). + + This test was added in response to issue #62 + """ + sim = specsim.simulator.Simulator('test', num_fibers=1) + units_before = {} + for table in (sim.simulated, sim.camera_output[0]): + for name in table.colnames: + units_before[name] = table[name].unit + sim.simulate() + for table in (sim.simulated, sim.camera_output[0]): + for name in table.colnames: + assert units_before[name] == table[name].unit + + def test_plot(): s = Simulator('test') s.simulate()