Skip to content

Commit

Permalink
BUG: Fix aperture incorrectly applied
Browse files Browse the repository at this point in the history
to images linked by WCS if sky projection is different
  • Loading branch information
pllim committed Aug 10, 2023
1 parent f1d2ca7 commit 938253d
Show file tree
Hide file tree
Showing 3 changed files with 146 additions and 21 deletions.
32 changes: 25 additions & 7 deletions jdaviz/configs/imviz/plugins/aper_phot_simple/aper_phot_simple.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@

__all__ = ['SimpleAperturePhotometry']

ASTROPY_LT_5_2 = Version(astropy.__version__) < Version('5.2')

# TODO: This plugin needs to show params wrt ref data because that is how glue
# defined it, but then it needs to do internal calculation using region
# that took account of the dither.
Expand Down Expand Up @@ -172,7 +174,12 @@ def _subset_selected_changed(self, event={}):
try:
self._selected_subset = _get_region_from_spatial_subset(self, subset_selected)
self._selected_subset.meta['label'] = subset_selected
self.subset_area = int(np.ceil(self._selected_subset.area))

# Sky subset does not have area. Not worth it to calculate just for a warning.
if hasattr(self._selected_subset, 'area'):
self.subset_area = int(np.ceil(self._selected_subset.area))
else:
self.subset_area = 0

except Exception as e:
self._selected_subset = None
Expand All @@ -187,6 +194,8 @@ def _calc_bg_subset_median(self, reg):
# except here we only care about one stat for the background.
data = self._selected_data
comp = data.get_component(data.main_components[0])
if hasattr(reg, 'to_pixel'):
reg = reg.to_pixel(data.coords)
aper_mask_stat = reg.to_mask(mode='center')
img_stat = aper_mask_stat.get_values(comp.data, mask=None)

Expand Down Expand Up @@ -216,8 +225,6 @@ def vue_do_aper_phot(self, *args, **kwargs):

data = self._selected_data
reg = self._selected_subset
xcenter = reg.center.x
ycenter = reg.center.y

# Reset last fitted model
fit_model = None
Expand All @@ -230,10 +237,18 @@ def vue_do_aper_phot(self, *args, **kwargs):
bg = float(self.background_value)
except ValueError: # Clearer error message
raise ValueError('Missing or invalid background value')
if data.coords is not None:
sky_center = data.coords.pixel_to_world(xcenter, ycenter)

if hasattr(reg, 'to_pixel'):
sky_center = reg.center
xcenter, ycenter = data.coords.world_to_pixel(sky_center)
else:
sky_center = None
xcenter = reg.center.x
ycenter = reg.center.y
if data.coords is not None:
sky_center = data.coords.pixel_to_world(xcenter, ycenter)
else:
sky_center = None

aperture = regions2aperture(reg)
include_pixarea_fac = False
include_counts_fac = False
Expand Down Expand Up @@ -363,7 +378,7 @@ def vue_do_aper_phot(self, *args, **kwargs):
gs = Gaussian1D(amplitude=y_max, mean=x_mean, stddev=std,
fixed={'amplitude': True},
bounds={'amplitude': (y_max * 0.5, y_max)})
if Version(astropy.__version__) < Version('5.2'):
if ASTROPY_LT_5_2:
fitter_kw = {}
else:
fitter_kw = {'filter_non_finite': True}
Expand Down Expand Up @@ -527,6 +542,9 @@ def _curve_of_growth(data, centroid, aperture, final_sum, wcs=None, background=0
"""
n_datapoints += 1 # n + 1

if hasattr(aperture, 'to_pixel'):
aperture = aperture.to_pixel(wcs)

if isinstance(aperture, CircularAperture):
x_label = 'Radius (pix)'
x_arr = np.linspace(0, aperture.r, num=n_datapoints)[1:]
Expand Down
21 changes: 11 additions & 10 deletions jdaviz/configs/imviz/tests/test_simple_aper_phot.py
Original file line number Diff line number Diff line change
Expand Up @@ -215,28 +215,29 @@ def setup_class(self, imviz_helper):
self.imviz = imviz_helper
self.viewer = imviz_helper.default_viewer
self.phot_plugin = imviz_helper.plugins["Imviz Simple Aperture Photometry"]._obj

# Data has a mean background of 5.
self.phot_plugin.bg_subset_selected = 'Manual'
self.phot_plugin.background_value = 5.0

@pytest.mark.parametrize('data_label', [
'gauss100_fits_wcs[PRIMARY,1]',
'gauss100_fits_wcs_block_reduced[PRIMARY,1]',
'gauss100_fits_wcs_block_reduced_rotated[PRIMARY,1]',
'no_wcs'])
@pytest.mark.parametrize(('data_label', 'local_bkg'), [
('gauss100_fits_wcs[PRIMARY,1]', 5.0),
('gauss100_fits_wcs_block_reduced[PRIMARY,1]', 20.0),
('gauss100_fits_wcs_block_reduced_rotated[PRIMARY,1]', 20.0),
('no_wcs', 5.0)])
@pytest.mark.parametrize(('subset_label', 'expected_sum'), [
('Subset 1', 738.8803424408962),
('Subset 2', 348.33262363800094),
('Subset 3', 857.5194857987592),
('Subset 4', 762.3263959884644)])
def test_aperphot(self, data_label, subset_label, expected_sum):
def test_aperphot(self, data_label, local_bkg, subset_label, expected_sum):
"""All data should give similar result for the same Subset."""
self.phot_plugin.dataset_selected = data_label
self.phot_plugin.background_value = local_bkg
self.phot_plugin.subset_selected = subset_label
self.phot_plugin.vue_do_aper_phot()
tbl = self.imviz.get_aperture_photometry_results()
assert_allclose(tbl['sum'][-1], expected_sum)

# FIXME: Subset 4 (rectangle) has huge difference, why???
# Imperfect down-sampling and imperfect apertures, so 10% is good enough.
assert_allclose(tbl['sum'][-1], expected_sum, rtol=0.1)


def test_annulus_background(imviz_helper):
Expand Down
114 changes: 110 additions & 4 deletions notebooks/concepts/imviz_advanced_aper_phot.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@
"source": [
"### How is glue projecting the rectangle?\n",
"\n",
"How is `glue` really projecting the rectangle for all the data?"
"How is `glue` really projecting the rectangle for all the data? This is without any special handling using sky coordinates. Also, this is not the mask that is getting passed into `photutils`."
]
},
{
Expand All @@ -195,7 +195,7 @@
{
"cell_type": "code",
"execution_count": null,
"id": "5958db68-2d75-49da-bac5-4a1eefb59ded",
"id": "1ac4e746",
"metadata": {},
"outputs": [],
"source": [
Expand All @@ -219,10 +219,116 @@
"Even when unrotated, a different pixel scale does affect the projected mask dimension. When rotated, it is not even a rectangle anymore; furthermore, even though this projection follows WCS linking, the array from `to_mask()` does not account for rotation that we see in the viewer."
]
},
{
"cell_type": "markdown",
"id": "b69abb83",
"metadata": {},
"source": [
"### What is aperture photometry telling us now?"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d5ca3ec6",
"metadata": {},
"outputs": [],
"source": [
"phot_plugin = imviz.plugins[\"Imviz Simple Aperture Photometry\"]._obj"
]
},
{
"cell_type": "markdown",
"id": "8fc3202b",
"metadata": {},
"source": [
"To re-calculate for a different subset, uncomment the desired Subset and re-run affected cells."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2eee32c7",
"metadata": {},
"outputs": [],
"source": [
"phot_plugin.subset_selected = \"Subset 1\"\n",
"#phot_plugin.subset_selected = \"Subset 2\"\n",
"#phot_plugin.subset_selected = \"Subset 3\"\n",
"#phot_plugin.subset_selected = \"Subset 4\""
]
},
{
"cell_type": "markdown",
"id": "dfbaf5f1",
"metadata": {},
"source": [
"Calculate for the same Subset for all the data.\n",
"\n",
"Original data has a mean background of 5. Block-reduced data will have mean background of 20 (4 pixels combined into 1 pixel, while preserving total flux)."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5557c11f",
"metadata": {},
"outputs": [],
"source": [
"phot_plugin.bg_subset_selected = 'Manual'\n",
"phot_plugin.background_value = 5.0\n",
"\n",
"phot_plugin.dataset_selected = \"gauss100_fits_wcs[PRIMARY,1]\"\n",
"phot_plugin.vue_do_aper_phot()\n",
"\n",
"phot_plugin.background_value = 20.0\n",
"\n",
"phot_plugin.dataset_selected = \"gauss100_fits_wcs_block_reduced[PRIMARY,1]\"\n",
"phot_plugin.vue_do_aper_phot()\n",
"\n",
"phot_plugin.dataset_selected = \"gauss100_fits_wcs_block_reduced_rotated[PRIMARY,1]\"\n",
"phot_plugin.vue_do_aper_phot()"
]
},
{
"cell_type": "markdown",
"id": "94ed228d",
"metadata": {},
"source": [
"Look at the results. The aperture sum should be close to the following numbers regardless of data if Subset is handled correctly:\n",
"\n",
"| Subset name | Aperture sum | Dev note |\n",
"| --- | --- | --- |\n",
"| Subset 1 | 738.8803424408962 | |\n",
"| Subset 2 | 348.33262363800094 | |\n",
"| Subset 3 | 857.5194857987592 | |\n",
"| Subset 4 | 762.3263959884644 | Why no agreement for rectangle? |"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "136e355f",
"metadata": {},
"outputs": [],
"source": [
"tbl = imviz.get_aperture_photometry_results()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "445b7540",
"metadata": {},
"outputs": [],
"source": [
"tbl[\"data_label\", \"subset_label\", \"sum\"]"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "192e6319-8af3-4450-980f-61fca40f711f",
"id": "486219df",
"metadata": {},
"outputs": [],
"source": []
Expand All @@ -244,7 +350,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.8"
"version": "3.11.0"
}
},
"nbformat": 4,
Expand Down

0 comments on commit 938253d

Please sign in to comment.