Skip to content

Setting custom units in spectrum_from_column_mapping fails with astropy 4.3 #831

@dhomeier

Description

@dhomeier

These tests on v1.3 are failing with astropy 4.3rc1:

FAILED lib/python3.9/site-packages/specutils/tests/test_loaders.py::test_tabular_fits_writer[wavelength] - assert Unit("W / (Angstrom m2)") == Unit("erg / (Angstrom cm2 s)")
FAILED lib/python3.9/site-packages/specutils/tests/test_loaders.py::test_tabular_fits_writer[frequency] - assert Unit("W / (Angstrom m2)") == Unit("erg / (Angstrom cm2 s)")
FAILED lib/python3.9/site-packages/specutils/tests/test_loaders.py::test_tabular_fits_writer[energy] - KeyError: 'energy'
FAILED lib/python3.9/site-packages/specutils/tests/test_loaders.py::test_tabular_fits_writer[wavenumber] - assert Unit("W / (Angstrom m2)") == Unit("erg / (Angstrom cm2 s)")
FAILED lib/python3.9/site-packages/specutils/tests/test_loaders.py::test_tabular_fits_multid[wavelength-1] - assert Unit("W / (Angstrom m2)") == Unit("erg / (Angstrom cm2 s)")
FAILED lib/python3.9/site-packages/specutils/tests/test_loaders.py::test_tabular_fits_multid[wavelength-2] - assert Unit("W / (Angstrom m2)") == Unit("erg / (Angstrom cm2 s)")
FAILED lib/python3.9/site-packages/specutils/tests/test_loaders.py::test_tabular_fits_multid[wavelength-3] - assert Unit("W / (Angstrom m2)") == Unit("erg / (Angstrom cm2 s)")
FAILED lib/python3.9/site-packages/specutils/tests/test_loaders.py::test_tabular_fits_multid[frequency-1] - assert Unit("W / (Angstrom m2)") == Unit("erg / (Angstrom cm2 s)")
FAILED lib/python3.9/site-packages/specutils/tests/test_loaders.py::test_tabular_fits_multid[frequency-2] - assert Unit("W / (Angstrom m2)") == Unit("erg / (Angstrom cm2 s)")
FAILED lib/python3.9/site-packages/specutils/tests/test_loaders.py::test_tabular_fits_multid[frequency-3] - assert Unit("W / (Angstrom m2)") == Unit("erg / (Angstrom cm2 s)")
FAILED lib/python3.9/site-packages/specutils/tests/test_loaders.py::test_tabular_fits_multid[energy-1] - KeyError: 'energy'
FAILED lib/python3.9/site-packages/specutils/tests/test_loaders.py::test_tabular_fits_multid[energy-2] - KeyError: 'energy'
FAILED lib/python3.9/site-packages/specutils/tests/test_loaders.py::test_tabular_fits_multid[energy-3] - KeyError: 'energy'
FAILED lib/python3.9/site-packages/specutils/tests/test_loaders.py::test_tabular_fits_multid[wavenumber-1] - assert Unit("W / (Angstrom m2)") == Unit("erg / (Angstrom cm2 s)")
FAILED lib/python3.9/site-packages/specutils/tests/test_loaders.py::test_tabular_fits_multid[wavenumber-2] - assert Unit("W / (Angstrom m2)") == Unit("erg / (Angstrom cm2 s)")
FAILED lib/python3.9/site-packages/specutils/tests/test_loaders.py::test_tabular_fits_multid[wavenumber-3] - assert Unit("W / (Angstrom m2)") == Unit("erg / (Angstrom cm2 s)")

the majority are failures on the flux unit like

        spectrum.write(tmpfile, format='tabular-fits', overwrite=True)
    
        cmap = {spectral_axis: ('spectral_axis', wlu[spectral_axis]),
                'flux': ('flux', 'erg / (s cm**2 AA)'),
                'uncertainty': ('uncertainty', None)}
    
        # Read it back again and check against the original
        spec = Spectrum1D.read(tmpfile, format='tabular-fits', column_mapping=cmap)
>       assert spec.flux.unit == u.Unit('erg / (s cm**2 AA)')
E       assert Unit("W / (Angstrom m2)") == Unit("erg / (Angstrom cm2 s)")
E        +  where Unit("W / (Angstrom m2)") = <Quantity [ 5.15047686e-10,  3.85273149e-09,  5.70890511e-10,\n            1.13556564e-09,  9.54001763e-10,  6.51391251...     -3.15269245e-10,  7.58969220e-10, -7.72825215e-10,\n           -2.36818607e-10, -4.85363548e-10] W / (Angstrom m2)>.unit
E        +    where <Quantity [ 5.15047686e-10,  3.85273149e-09,  5.70890511e-10,\n            1.13556564e-09,  9.54001763e-10,  6.51391251...     -3.15269245e-10,  7.58969220e-10, -7.72825215e-10,\n           -2.36818607e-10, -4.85363548e-10] W / (Angstrom m2)> = <Spectrum1D(flux=<Quantity [ 5.15047686e-10,  3.85273149e-09,  5.70890511e-10,\n            1.13556564e-09,  9.54001763...                  1.77558228e-06, 2.75493960e-06, 2.77997341e-06,\n                   1.53889118e-06, 2.20309679e-06]))>.flux
E        +  and   Unit("erg / (Angstrom cm2 s)") = <class 'astropy.units.core.Unit'>('erg / (s cm**2 AA)')
E        +    where <class 'astropy.units.core.Unit'> = u.Unit

the reason being spectrum_from_column_mapping is failing the check

elif 'spectral flux' in cm_unit.physical_type:

as unit.physical_type in astropy 4.3 has become an object of type PhysicalType instead of a plain string; this can be simply fixed by checking for 'spectral flux' in str(cm_unit.physical_type) instead.

Somewhat related, spectral_axis type 'energy' is not recognised since energy units like u.eV have now become
PhysicalType({'energy', 'torque', 'work'})
and are accordingly written to FITS as
TTYPE1 = 'energy/torque/work'

I have to think about how to proceed best with this case. The spectral_axis column would need to be referenced as table['energy/torque/work'], but I'd prefer to have the writer not use that ugly TTYPE in the first place.
Setting custom units on 'energy' seems broken anyway, as the test simply uses u.eV before and after.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions