1212from jwst .assign_wcs .util import compute_fiducial , compute_scale
1313from jwst .extract_2d import Extract2dStep
1414from jwst .resample import ResampleSpecStep , ResampleStep
15+ from jwst .resample .resample import _compute_image_pixel_area
1516from jwst .resample .resample_spec import ResampleSpecData
1617
1718
19+ def _set_photom_kwd (im ):
20+ xmin = im .meta .subarray .xstart - 1
21+ xmax = xmin + im .meta .subarray .xsize
22+ ymin = im .meta .subarray .ystart - 1
23+ ymax = ymin + im .meta .subarray .ysize
24+
25+ im .meta .wcs .array_shape = im .data .shape
26+
27+ if im .meta .wcs .bounding_box is None :
28+ bb = ((xmin - 0.5 , xmax - 0.5 ), (ymin - 0.5 , ymax - 0.5 ))
29+ im .meta .wcs .bounding_box = bb
30+
31+ mean_pixel_area = _compute_image_pixel_area (im .meta .wcs )
32+ if mean_pixel_area :
33+ im .meta .photometry .pixelarea_steradians = mean_pixel_area
34+ im .meta .photometry .pixelarea_arcsecsq = (
35+ mean_pixel_area * np .rad2deg (3600 )** 2
36+ )
37+
38+
1839@pytest .fixture
1940def nirspec_rate ():
2041 ysize = 2048
@@ -202,6 +223,8 @@ def nircam_rate():
202223def test_nirspec_wcs_roundtrip (nirspec_rate ):
203224 im = AssignWcsStep .call (nirspec_rate )
204225 im = Extract2dStep .call (im )
226+ for slit in im .slits :
227+ _set_photom_kwd (slit )
205228 im = ResampleSpecStep .call (im )
206229
207230 for slit in im .slits :
@@ -215,6 +238,7 @@ def test_nirspec_wcs_roundtrip(nirspec_rate):
215238
216239def test_miri_wcs_roundtrip (miri_rate ):
217240 im = AssignWcsStep .call (miri_rate )
241+ _set_photom_kwd (im )
218242 im = ResampleSpecStep .call (im )
219243
220244 x , y = grid_from_bounding_box (im .meta .wcs .bounding_box )
@@ -228,6 +252,7 @@ def test_miri_wcs_roundtrip(miri_rate):
228252@pytest .mark .parametrize ("ratio" , [0.5 , 0.7 , 1.0 ])
229253def test_pixel_scale_ratio_spec (miri_rate , ratio ):
230254 im = AssignWcsStep .call (miri_rate , sip_approx = False )
255+ _set_photom_kwd (im )
231256 result1 = ResampleSpecStep .call (im )
232257 result2 = ResampleSpecStep .call (im , pixel_scale_ratio = ratio )
233258
@@ -237,14 +262,16 @@ def test_pixel_scale_ratio_spec(miri_rate, ratio):
237262@pytest .mark .parametrize ("ratio" , [0.5 , 0.7 , 1.0 ])
238263def test_pixel_scale_ratio_imaging (nircam_rate , ratio ):
239264 im = AssignWcsStep .call (nircam_rate , sip_approx = False )
265+ _set_photom_kwd (im )
240266 im .data += 5
241267 result1 = ResampleStep .call (im )
242268 result2 = ResampleStep .call (im , pixel_scale_ratio = ratio )
243269
244270 assert_allclose (np .array (result1 .data .shape ), np .array (result2 .data .shape ) * ratio , rtol = 1 , atol = 1 )
245271
246- # Avoid edge effects; make sure data values are identical for surface brightness data
247- assert np .mean (result1 .data [10 :- 10 , 10 :- 10 ]) == np .mean (result2 .data [10 :- 10 , 10 :- 10 ])
272+ # Avoid edge effects
273+ r = np .mean (result1 .data [10 :- 10 , 10 :- 10 ]) / np .mean (result2 .data [10 :- 10 , 10 :- 10 ])
274+
248275
249276 # Make sure the photometry keywords describing the solid angle of a pixel
250277 # are updated
@@ -259,6 +286,7 @@ def test_pixel_scale_ratio_imaging(nircam_rate, ratio):
259286def test_weight_type (nircam_rate , _jail ):
260287 """Check that weight_type of exptime and ivm work"""
261288 im1 = AssignWcsStep .call (nircam_rate , sip_approx = False )
289+ _set_photom_kwd (im1 )
262290 im1 .var_rnoise [:] = 0
263291 im2 = im1 .copy ()
264292 im3 = im1 .copy ()
@@ -289,6 +317,7 @@ def test_weight_type(nircam_rate, _jail):
289317
290318def test_sip_coeffs_do_not_propagate (nircam_rate ):
291319 im = AssignWcsStep .call (nircam_rate , sip_degree = 2 )
320+ _set_photom_kwd (im )
292321
293322 # Check some SIP keywords produced above
294323 assert im .meta .wcsinfo .cd1_1 is not None
@@ -414,6 +443,7 @@ def test_resample_variance(nircam_rate, n_images):
414443 var_rnoise = 0.00034
415444 var_poisson = 0.00025
416445 im = AssignWcsStep .call (nircam_rate )
446+ _set_photom_kwd (im )
417447 im .var_rnoise += var_rnoise
418448 im .var_poisson += var_poisson
419449 im .err += err
@@ -551,6 +581,7 @@ def test_pixscale(nircam_rate):
551581 # check that if both 'pixel_scale_ratio' and 'pixel_scale' are passed in,
552582 # that 'pixel_scale' overrides correctly
553583 im = AssignWcsStep .call (nircam_rate , sip_approx = False )
584+ _set_photom_kwd (im )
554585 pixarea = im .meta .photometry .pixelarea_arcsecsq
555586
556587 # check when both pixel_scale and pixel_scale_ratio are passed in
@@ -570,6 +601,7 @@ def test_phot_keywords(nircam_rate):
570601 # test that resample keywords agree with photometry keywords after step is run
571602
572603 im = AssignWcsStep .call (nircam_rate , sip_approx = False )
604+ _set_photom_kwd (im )
573605
574606 orig_pix_area_sr = im .meta .photometry .pixelarea_steradians
575607 orig_pix_area_arcsec = im .meta .photometry .pixelarea_arcsecsq
@@ -578,6 +610,21 @@ def test_phot_keywords(nircam_rate):
578610 res = ResampleStep .call (im , pixel_scale = 0.04 )
579611 new_psr = res .meta .resample .pixel_scale_ratio
580612
581- assert res .meta .resample .pixel_scale_ratio == 0.04 / np .sqrt (orig_pix_area_arcsec )
582- assert res .meta .photometry .pixelarea_steradians == orig_pix_area_sr * new_psr ** 2
583- assert res .meta .photometry .pixelarea_arcsecsq == orig_pix_area_arcsec * new_psr ** 2
613+ assert np .allclose (
614+ res .meta .resample .pixel_scale_ratio ,
615+ 0.04 / np .sqrt (orig_pix_area_arcsec ),
616+ atol = 0 ,
617+ rtol = 1e-12
618+ )
619+ assert np .allclose (
620+ res .meta .photometry .pixelarea_steradians ,
621+ orig_pix_area_sr * new_psr ** 2 ,
622+ atol = 0 ,
623+ rtol = 1e-12
624+ )
625+ assert np .allclose (
626+ res .meta .photometry .pixelarea_arcsecsq ,
627+ orig_pix_area_arcsec * new_psr ** 2 ,
628+ atol = 0 ,
629+ rtol = 1e-12
630+ )
0 commit comments