1414from astropy .io import fits
1515from gwcs import wcs , coordinate_frames
1616from PIL import Image
17+ from stdatamodels import asdf_in_fits
1718
1819from astrocut .asdf_cutout import ASDFCutout , asdf_cut , get_center_pixel
1920from astrocut .exceptions import DataWarning , InvalidInputError , InvalidQueryError
@@ -158,24 +159,28 @@ def test_asdf_cutout(test_images, center_coord, cutout_size):
158159
159160
160161def test_asdf_cutout_write_to_file (test_images , center_coord , cutout_size , tmpdir ):
162+ def check_asdf_metadata (af , original_file , cutout_data ):
163+ """Check that ASDF file contains correct metadata"""
164+ assert 'roman' in af
165+ assert 'meta' in af ['roman' ]
166+ # Check cutout data and metadata
167+ for key in ['data' , 'dq' , 'err' , 'context' ]:
168+ assert key in af ['roman' ]
169+ assert np .all (af ['roman' ][key ] == cutout_data )
170+ meta = af ['roman' ]['meta' ]
171+ assert meta ['wcs' ].pixel_shape == (10 , 10 )
172+ assert meta ['product_type' ] == 'l2'
173+ assert meta ['file_date' ] == Time ('2023-10-01T00:00:00' , format = 'isot' )
174+ assert meta ['origin' ] == 'STSCI/SOC'
175+ assert meta ['orig_file' ] == original_file .as_posix ()
176+
161177 # Write cutouts to ASDF files on disk
162178 cutout = ASDFCutout (test_images , center_coord , cutout_size )
163179 asdf_files = cutout .write_as_asdf (output_dir = tmpdir )
164180 assert len (asdf_files ) == 3
165181 for i , asdf_file in enumerate (asdf_files ):
166182 with asdf .open (asdf_file ) as af :
167- assert 'roman' in af
168- assert 'meta' in af ['roman' ]
169- # Check cutout data and metadata
170- for key in ['data' , 'dq' , 'err' , 'context' ]:
171- assert key in af ['roman' ]
172- assert np .all (af ['roman' ][key ] == cutout .cutouts [i ].data )
173- meta = af ['roman' ]['meta' ]
174- assert meta ['wcs' ].pixel_shape == (10 , 10 )
175- assert meta ['product_type' ] == 'l2'
176- assert meta ['file_date' ] == Time ('2023-10-01T00:00:00' , format = 'isot' )
177- assert meta ['origin' ] == 'STSCI/SOC'
178- assert meta ['orig_file' ] == test_images [i ].as_posix ()
183+ check_asdf_metadata (af , test_images [i ], cutout .cutouts [i ].data )
179184 # Check file size is smaller than original
180185 assert Path (asdf_file ).stat ().st_size < Path (test_images [i ]).stat ().st_size
181186
@@ -191,6 +196,10 @@ def test_asdf_cutout_write_to_file(test_images, center_coord, cutout_size, tmpdi
191196 assert hdul [0 ].header ['ORIG_FLE' ] == test_images [i ].as_posix ()
192197 assert Path (fits_file ).stat ().st_size < Path (test_images [i ]).stat ().st_size
193198
199+ # Check ASDF extension contents
200+ with asdf_in_fits .open (fits_file ) as af :
201+ check_asdf_metadata (af , test_images [i ], cutout .cutouts [i ].data )
202+
194203
195204@pytest .mark .parametrize ('output_format' , ['.asdf' , '.fits' ])
196205def test_asdf_cutout_write_to_zip (tmpdir , test_images , center_coord , cutout_size , output_format ):
@@ -215,7 +224,7 @@ def test_asdf_cutout_write_to_zip(tmpdir, test_images, center_coord, cutout_size
215224 else :
216225 with fits .open (io .BytesIO (data )) as hdul :
217226 assert isinstance (hdul , fits .HDUList )
218- assert len (hdul ) == 1
227+ assert len (hdul ) == 2 # primary + embedded ASDF extension
219228 assert hdul [0 ].data .shape == (cutout_size , cutout_size )
220229
221230
@@ -226,10 +235,9 @@ def test_asdf_cutout_write_to_zip_invalid_format(tmpdir, test_images, center_coo
226235 cutout .write_as_zip (output_dir = tmpdir , output_format = '.invalid' )
227236
228237
229- def test_asdf_cutout_lite (test_images , center_coord , cutout_size , tmpdir ):
230- # Write cutouts to ASDF objects in lite mode
231- cutout = ASDFCutout (test_images , center_coord , cutout_size , lite = True )
232- for af in cutout .asdf_cutouts :
238+ def test_asdf_cutout_lite (test_images , center_coord , cutout_size ):
239+ def check_lite_metadata (af ):
240+ """Check that ASDF file contains only lite metadata"""
233241 assert 'roman' in af
234242 assert 'data' in af ['roman' ]
235243 assert 'meta' in af ['roman' ]
@@ -238,11 +246,21 @@ def test_asdf_cutout_lite(test_images, center_coord, cutout_size, tmpdir):
238246 assert len (af ['roman' ]) == 2 # only data and meta
239247 assert len (af ['roman' ]['meta' ]) == 2 # only wcs and original filename
240248
249+ # Write cutouts to ASDF objects in lite mode
250+ cutout = ASDFCutout (test_images , center_coord , cutout_size , lite = True )
251+ for af in cutout .asdf_cutouts :
252+ check_lite_metadata (af )
253+
241254 # Write cutouts to HDUList objects in lite mode
242255 cutout = ASDFCutout (test_images , center_coord , cutout_size , lite = True )
243256 for hdul in cutout .fits_cutouts :
244- assert len (hdul ) == 1 # primary HDU only
257+ assert len (hdul ) == 2 # primary HDU + embedded ASDF extension
245258 assert hdul [0 ].name == 'PRIMARY'
259+ assert hdul [1 ].name == 'ASDF'
260+
261+ # Check ASDF extension contents
262+ with asdf_in_fits .open (hdul ) as af :
263+ check_lite_metadata (af )
246264
247265
248266def test_asdf_cutout_partial (test_images , center_coord , cutout_size ):
0 commit comments