diff --git a/CHANGES.rst b/CHANGES.rst index 7fc6da3887..c5ea50dbfc 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -233,6 +233,8 @@ Bug Fixes Cubeviz ^^^^^^^ +- Fixed multiple select handling for batch mode aperture photometry in Cubeviz. [#3163] + Imviz ^^^^^ diff --git a/jdaviz/configs/imviz/plugins/aper_phot_simple/aper_phot_simple.py b/jdaviz/configs/imviz/plugins/aper_phot_simple/aper_phot_simple.py index 418bbadfef..7a9768a6a9 100644 --- a/jdaviz/configs/imviz/plugins/aper_phot_simple/aper_phot_simple.py +++ b/jdaviz/configs/imviz/plugins/aper_phot_simple/aper_phot_simple.py @@ -113,7 +113,8 @@ def valid_cubeviz_datasets(data): acceptable_types = ['spectral flux density wav', 'photon flux density wav', 'spectral flux density', - 'photon flux density'] + 'photon flux density', + 'surface brightness'] return ((data.ndim in (2, 3)) and ((img_unit == (u.MJy / u.sr)) or (img_unit.physical_type in acceptable_types))) @@ -145,10 +146,19 @@ def _on_dataset_selected_changed(self, event={}): if self.config != "cubeviz": return # self.dataset might not exist when app is setting itself up. - if hasattr(self, "dataset") and self.dataset.selected_dc_item.ndim > 2: - self.is_cube = True - else: + if hasattr(self, "dataset"): + if isinstance(self.dataset.selected_dc_item, list): + datasets = self.dataset.selected_dc_item + else: + datasets = [self.dataset.selected_dc_item] + self.is_cube = False + for dataset in datasets: + # This assumes all cubes, or no cubes. If we allow photometry on collapsed cubes + # or images this will need to change. + if dataset.ndim > 2: + self.is_cube = True + break def _on_display_units_changed(self, event={}): @@ -208,6 +218,8 @@ def _set_display_unit_of_selected_dataset(self): return data = self.dataset.selected_dc_item + if isinstance(data, list): + data = data[0] comp = data.get_component(data.main_components[0]) if comp.units: # if data is something-per-solid-angle, its a SB unit and we should @@ -557,7 +569,7 @@ def calculate_photometry(self, dataset=None, aperture=None, background=None, # cubeviz: background_value set in plugin is in display units # convert temporarily to image units for calculations - if (self.config == 'cubeviz') and (img_unit is not None): + if (self.config == 'cubeviz') and (img_unit is not None) and display_unit != '': background_value = (background_value * display_unit).to_value( img_unit, u.spectral_density(self._cube_wave)) @@ -568,7 +580,7 @@ def calculate_photometry(self, dataset=None, aperture=None, background=None, # cubeviz: background_value set in plugin is in display units # convert temporarily to image units for calculations - if (self.config == 'cubeviz') and (img_unit is not None): + if (self.config == 'cubeviz') and (img_unit is not None) and display_unit != '': background_value = (background_value * display_unit).to_value( img_unit, u.spectral_density(self._cube_wave)) else: @@ -578,7 +590,7 @@ def calculate_photometry(self, dataset=None, aperture=None, background=None, # cubeviz: computed background median will be in display units, # convert temporarily back to image units for calculations - if (self.config == 'cubeviz') and (img_unit is not None): + if (self.config == 'cubeviz') and (img_unit is not None) and display_unit != '': background_value = (background_value * display_unit).to_value( img_unit, u.spectral_density(self._cube_wave)) try: @@ -726,25 +738,26 @@ def calculate_photometry(self, dataset=None, aperture=None, background=None, # convert units of certain columns in aperture phot. output table # to reflect display units (i.e if data units are MJy / sr, but # Jy / sr is selected in Unit Conversion plugin) - phot_table['background'] = phot_table['background'].to( - display_unit, u.spectral_density(self._cube_wave)) - - if include_pixarea_fac: - phot_table['sum'] = phot_table['sum'].to( - (display_unit * pixarea_fac).unit, u.spectral_density(self._cube_wave)) - else: - phot_table['sum'] = phot_table['sum'].to( + if display_unit != '': + phot_table['background'] = phot_table['background'].to( display_unit, u.spectral_density(self._cube_wave)) - for key in ['min', 'max', 'mean', 'median', 'mode', 'std', - 'mad_std', 'biweight_location']: - phot_table[key] = phot_table[key].to( - display_unit, u.spectral_density(self._cube_wave)) - for key in ['var', 'biweight_midvariance']: - try: - phot_table[key] = phot_table[key].to(display_unit**2) - # FIXME: Can fail going between per-wave and per-freq - except u.UnitConversionError: - pass + + if include_pixarea_fac: + phot_table['sum'] = phot_table['sum'].to( + (display_unit * pixarea_fac).unit, u.spectral_density(self._cube_wave)) + else: + phot_table['sum'] = phot_table['sum'].to( + display_unit, u.spectral_density(self._cube_wave)) + for key in ['min', 'max', 'mean', 'median', 'mode', 'std', + 'mad_std', 'biweight_location']: + phot_table[key] = phot_table[key].to( + display_unit, u.spectral_density(self._cube_wave)) + for key in ['var', 'biweight_midvariance']: + try: + phot_table[key] = phot_table[key].to(display_unit**2) + # FIXME: Can fail going between per-wave and per-freq + except u.UnitConversionError: + pass if add_to_table: try: @@ -1060,6 +1073,7 @@ def calculate_batch_photometry(self, options=[], add_to_table=True, update_plots option.setdefault('pixel_area', defaults.get('pixel_area', 0)) if self.flux_scaling_multi_auto: option.setdefault('flux_scaling', defaults.get('flux_scaling', 0)) + try: self.calculate_photometry(add_to_table=add_to_table, update_plots=this_update_plots, diff --git a/jdaviz/configs/imviz/tests/test_simple_aper_phot.py b/jdaviz/configs/imviz/tests/test_simple_aper_phot.py index 0b1a49cfb6..2f00530d21 100644 --- a/jdaviz/configs/imviz/tests/test_simple_aper_phot.py +++ b/jdaviz/configs/imviz/tests/test_simple_aper_phot.py @@ -489,3 +489,33 @@ def test_curve_of_growth(with_unit): with pytest.raises(TypeError, match='Unsupported aperture'): _curve_of_growth(data, cen, EllipticalAnnulus(cen, 3, 8, 5), 100, pixarea_fac=pixarea_fac) + + +def test_cubeviz_batch(cubeviz_helper, spectrum1d_cube_fluxunit_jy_per_steradian): + cubeviz_helper.load_data(spectrum1d_cube_fluxunit_jy_per_steradian, data_label='test') + phot_plugin = cubeviz_helper.plugins['Aperture Photometry']._obj + uc_plugin = cubeviz_helper.plugins['Unit Conversion'] + + cubeviz_helper.load_regions(CirclePixelRegion(center=PixCoord(x=5, y=5), radius=2)) + cubeviz_helper.load_regions(CirclePixelRegion(center=PixCoord(x=3, y=3), radius=2)) + + phot_plugin.dataset_selected = 'test[FLUX]' + phot_plugin.multiselect = True + phot_plugin.aperture.selected = ['Subset 1', 'Subset 2'] + + phot_plugin.calculate_batch_photometry(full_exceptions=True) + assert len(phot_plugin.table) == 2 + tbl = cubeviz_helper.get_aperture_photometry_results() + assert_quantity_allclose(tbl['sum'], [5.980836e-12, 2.037396e-10] * u.Jy, rtol=1e-4) + + # Test that it still works after unit conversion + uc_plugin.flux_unit = 'MJy' + + phot_plugin.calculate_batch_photometry(full_exceptions=True) + + assert len(phot_plugin.table) == 4 + tbl = cubeviz_helper.get_aperture_photometry_results() + # get_aperture_photometry_results converts all to the same units + assert_quantity_allclose(tbl['sum'], + [5.980836e-12, 2.037396e-10, 5.980836e-12, 2.037396e-10] * u.Jy, + rtol=1e-4)