1313from specutils import Spectrum1D , SpectrumList
1414
1515
16- # The x1d reader tests --------------------------
16+ # The c1d/ x1d reader tests --------------------------
1717
18- def create_spectrum_hdu (data_len , srctype = None , ver = 1 ):
18+ def create_spectrum_hdu (data_len , srctype = None , ver = 1 , name = 'EXTRACT1D' ):
1919 """Mock a JWST x1d BinTableHDU"""
2020 data = np .random .random ((data_len , 5 ))
2121 table = Table (data = data , names = ['WAVELENGTH' , 'FLUX' , 'ERROR' , 'SURF_BRIGHT' ,
2222 'SB_ERROR' ])
2323
24- hdu = fits .BinTableHDU (table , name = 'EXTRACT1D' )
24+ hdu = fits .BinTableHDU (table , name = name )
2525 hdu .header ['TUNIT1' ] = 'um'
2626 hdu .header ['TUNIT2' ] = 'Jy'
2727 hdu .header ['TUNIT3' ] = 'Jy'
@@ -48,27 +48,46 @@ def x1d_single():
4848
4949
5050@pytest .fixture (scope = "function" )
51- def x1d_multi ():
52- """Mock a JWST x1d multispec HDUList with 3 spectra"""
51+ def spec_single (request ):
52+ """Mock a JWST c1d/x1d HDUList with a single spectrum"""
53+ name = request .param
54+ hdulist = fits .HDUList ()
55+ hdulist .append (fits .PrimaryHDU ())
56+ hdulist ["PRIMARY" ].header ["TELESCOP" ] = ("JWST" , "comment" )
57+ # Add a BinTableHDU that contains spectral data
58+ hdulist .append (create_spectrum_hdu (100 , 'POINT' , ver = 1 , name = name ))
59+ # Mock the ASDF extension
60+ hdulist .append (fits .BinTableHDU (name = 'ASDF' ))
61+
62+ return hdulist
63+
64+
65+ @pytest .fixture (scope = "function" )
66+ def spec_multi (request ):
67+ """Mock a JWST c1d/x1d multispec HDUList with 3 spectra"""
68+ name = request .param
5369 hdulist = fits .HDUList ()
5470 hdulist .append (fits .PrimaryHDU ())
5571 hdulist ["PRIMARY" ].header ["TELESCOP" ] = "JWST"
5672 # Add a few BinTableHDUs that contain spectral data
57- hdulist .append (create_spectrum_hdu (100 , 'POINT' , ver = 1 ))
58- hdulist .append (create_spectrum_hdu (120 , 'EXTENDED' , ver = 2 ))
59- hdulist .append (create_spectrum_hdu (110 , 'POINT' , ver = 3 ))
73+ hdulist .append (create_spectrum_hdu (100 , 'POINT' , ver = 1 , name = name ))
74+ hdulist .append (create_spectrum_hdu (120 , 'EXTENDED' , ver = 2 , name = name ))
75+ hdulist .append (create_spectrum_hdu (110 , 'POINT' , ver = 3 , name = name ))
6076 # Mock the ASDF extension
6177 hdulist .append (fits .BinTableHDU (name = 'ASDF' ))
6278
6379 return hdulist
6480
6581
66- def test_jwst_x1d_multi_reader (tmpdir , x1d_multi ):
67- """Test SpectrumList.read for JWST x1d multi data"""
82+ @pytest .mark .parametrize ('spec_multi, format' ,
83+ [('EXTRACT1D' , 'JWST x1d multi' ),
84+ ('COMBINE1D' , 'JWST c1d multi' )], indirect = ['spec_multi' ])
85+ def test_jwst_1d_multi_reader (tmpdir , spec_multi , format ):
86+ """Test SpectrumList.read for JWST c1d/x1d multi data"""
6887 tmpfile = str (tmpdir .join ('jwst.fits' ))
69- x1d_multi .writeto (tmpfile )
88+ spec_multi .writeto (tmpfile )
7089
71- data = SpectrumList .read (tmpfile , format = 'JWST x1d multi' )
90+ data = SpectrumList .read (tmpfile , format = format )
7291 assert type (data ) is SpectrumList
7392 assert len (data ) == 3
7493
@@ -80,20 +99,39 @@ def test_jwst_x1d_multi_reader(tmpdir, x1d_multi):
8099 assert data [2 ].shape == (110 ,)
81100
82101
83- def test_jwst_x1d_single_reader (tmpdir , x1d_single ):
102+ @pytest .mark .parametrize ('spec_single, format' ,
103+ [('EXTRACT1D' , 'JWST x1d' ),
104+ ('COMBINE1D' , 'JWST c1d' )], indirect = ['spec_single' ])
105+ def test_jwst_1d_single_reader (tmpdir , spec_single , format ):
84106 """Test Spectrum1D.read for JWST x1d data"""
85107 tmpfile = str (tmpdir .join ('jwst.fits' ))
108+ spec_single .writeto (tmpfile )
109+
110+ data = Spectrum1D .read (tmpfile , format = format )
111+ assert type (data ) is Spectrum1D
112+ assert data .shape == (100 ,)
113+
114+
115+ @pytest .mark .parametrize ("srctype" , [None , "UNKNOWN" ])
116+ def test_jwst_srctpye_defaults (tmpdir , x1d_single , srctype ):
117+ """ Test """
118+ tmpfile = str (tmpdir .join ('jwst.fits' ))
119+
120+ # Add a spectrum with missing or UNKNOWN SRCTYPE (mutate the fixture)
121+ x1d_single ['EXTRACT1D' ].header ['SRCTYPE' ] == srctype
86122 x1d_single .writeto (tmpfile )
87123
88124 data = Spectrum1D .read (tmpfile , format = 'JWST x1d' )
89125 assert type (data ) is Spectrum1D
90126 assert data .shape == (100 ,)
127+ assert x1d_single ['EXTRACT1D' ].header ['SRCTYPE' ] == "POINT"
91128
92129
93- def test_jwst_x1d_single_reader_no_format (tmpdir , x1d_single ):
94- """Test Spectrum1D.read for JWST x1d data without format arg"""
130+ @pytest .mark .parametrize ('spec_single' , ['EXTRACT1D' , 'COMBINE1D' ], indirect = ['spec_single' ])
131+ def test_jwst_1d_single_reader_no_format (tmpdir , spec_single ):
132+ """Test Spectrum1D.read for JWST c1d/x1d data without format arg"""
95133 tmpfile = str (tmpdir .join ('jwst.fits' ))
96- x1d_single .writeto (tmpfile )
134+ spec_single .writeto (tmpfile )
97135
98136 data = Spectrum1D .read (tmpfile )
99137 assert type (data ) is Spectrum1D
@@ -102,10 +140,11 @@ def test_jwst_x1d_single_reader_no_format(tmpdir, x1d_single):
102140 assert data .spectral_axis .unit == u .um
103141
104142
105- def test_jwst_x1d_multi_reader_no_format (tmpdir , x1d_multi ):
106- """Test Spectrum1D.read for JWST x1d data without format arg"""
143+ @pytest .mark .parametrize ('spec_multi' , ['EXTRACT1D' , 'COMBINE1D' ], indirect = ['spec_multi' ])
144+ def test_jwst_1d_multi_reader_no_format (tmpdir , spec_multi ):
145+ """Test Spectrum1D.read for JWST c1d/x1d data without format arg"""
107146 tmpfile = str (tmpdir .join ('jwst.fits' ))
108- x1d_multi .writeto (tmpfile )
147+ spec_multi .writeto (tmpfile )
109148
110149 data = SpectrumList .read (tmpfile )
111150 assert type (data ) is SpectrumList
@@ -115,39 +154,42 @@ def test_jwst_x1d_multi_reader_no_format(tmpdir, x1d_multi):
115154 assert isinstance (item , Spectrum1D )
116155
117156
118- def test_jwst_x1d_multi_reader_check_units (tmpdir , x1d_multi ):
119- """Test units for Spectrum1D.read for JWST x1d data"""
157+ @pytest .mark .parametrize ('spec_multi' , ['EXTRACT1D' , 'COMBINE1D' ], indirect = ['spec_multi' ])
158+ def test_jwst_1d_multi_reader_check_units (tmpdir , spec_multi ):
159+ """Test units for Spectrum1D.read for JWST c1d/x1d data"""
120160 tmpfile = str (tmpdir .join ('jwst.fits' ))
121- x1d_multi .writeto (tmpfile )
161+ spec_multi .writeto (tmpfile )
122162
123163 data = SpectrumList .read (tmpfile )
124164 assert data [0 ].unit == u .Jy
125165 assert data [1 ].unit == u .MJy / u .sr
126166 assert data [2 ].unit == u .Jy
127167
128168
129- def test_jwst_x1d_reader_meta (tmpdir , x1d_single ):
130- """Test that the Primary and EXTRACT1D extension headers are merged in meta"""
169+ @pytest .mark .parametrize ('spec_single' , ['EXTRACT1D' , 'COMBINE1D' ], indirect = ['spec_single' ])
170+ def test_jwst_1d_reader_meta (tmpdir , spec_single ):
171+ """Test that the Primary and COMBINE1D/EXTRACT1D extension headers are merged in meta"""
131172 tmpfile = str (tmpdir .join ('jwst.fits' ))
132- x1d_single .writeto (tmpfile )
173+ spec_single .writeto (tmpfile )
133174
134175 data = Spectrum1D .read (tmpfile )
135176 assert ('TELESCOP' , 'JWST' ) in data .meta ['header' ].items ()
136177 assert ('SRCTYPE' , 'POINT' ) in data .meta ['header' ].items ()
137178
138179
139- def test_jwst_x1d_single_reader_fail_on_multi (tmpdir , x1d_multi ):
140- """Make sure Spectrum1D.read on JWST x1d with many spectra errors out"""
180+ @pytest .mark .parametrize ('spec_multi' , ['EXTRACT1D' , 'COMBINE1D' ], indirect = ['spec_multi' ])
181+ def test_jwst_1d_single_reader_fail_on_multi (tmpdir , spec_multi ):
182+ """Make sure Spectrum1D.read on JWST c1d/x1d with many spectra errors out"""
141183 tmpfile = str (tmpdir .join ('jwst.fits' ))
142- x1d_multi .writeto (tmpfile )
184+ spec_multi .writeto (tmpfile )
143185
144186 with pytest .raises (IORegistryError ):
145187 Spectrum1D .read (tmpfile )
146188
147189
148- @pytest .mark .parametrize ("srctype" , [None , "UNKNOWN " ])
190+ @pytest .mark .parametrize ("srctype" , ["BADVAL " ])
149191def test_jwst_reader_fail (tmpdir , x1d_single , srctype ):
150- """Check that the reader fails when SRCTYPE is not set or is UNKNOWN """
192+ """Check that the reader fails when SRCTYPE is a BADVAL """
151193 tmpfile = str (tmpdir .join ('jwst.fits' ))
152194 hdulist = x1d_single
153195 # Add a spectrum with bad SRCTYPE (mutate the fixture)
0 commit comments