diff --git a/jdaviz/app.py b/jdaviz/app.py index e9276b9ec4..fc6fe40791 100644 --- a/jdaviz/app.py +++ b/jdaviz/app.py @@ -72,7 +72,7 @@ def equivalent_units(self, data, cid, units): eqv = u.spectral_density(1 * u.m) # Value does not matter here. list_of_units = set(list(map(str, u.Unit(units).find_equivalent_units( include_prefix_units=True, equivalencies=eqv))) + [ - 'Jy', 'mJy', 'uJy', + 'Jy', 'mJy', 'uJy', 'MJy', 'W / (m2 Hz)', 'W / (Hz m2)', # Order is different in astropy v5.3 'eV / (s m2 Hz)', 'eV / (Hz s m2)', 'erg / (s cm2)', @@ -95,13 +95,50 @@ def to_unit(self, data, cid, values, original_units, target_units): # gives the units of the values array, which might not be the same # as the original native units of the component in the data. if cid.label == "flux": + # to debug + print('orginal_units : ', original_units, "target_units : ", target_units) + spec = data.get_object(cls=Spectrum1D) if len(values) == 2: # Need this for setting the y-limits spec_limits = [spec.spectral_axis[0].value, spec.spectral_axis[-1].value] eqv = u.spectral_density(spec_limits*spec.spectral_axis.unit) + + elif '_pixel_scale_factor' in spec.meta: + if (u.sr in u.Unit(original_units).bases) and \ + (u.sr not in u.Unit(target_units).bases): + # sb -> flux + + # to debug + print('first if') + print('values before') + print(values) + + converted_values = values * spec.meta['_pixel_scale_factor'] + + # to debug + print(converted_values) + + return converted_values + else: + # elif (u.sr in u.Unit(target_units).bases) and \ + # (u.sr not in u.Unit(original_units).bases): + # flux -> sb + + # to debug + print('second elif') + print('values before') + print(values) + + converted_values = values / spec.meta['_pixel_scale_factor'] + # to debug + print(converted_values) + + return converted_values + else: eqv = u.spectral_density(spec.spectral_axis) + else: # spectral axis eqv = u.spectral() diff --git a/jdaviz/configs/cubeviz/cubeviz.yaml b/jdaviz/configs/cubeviz/cubeviz.yaml index 92a7ac1a4c..a52a1de34a 100644 --- a/jdaviz/configs/cubeviz/cubeviz.yaml +++ b/jdaviz/configs/cubeviz/cubeviz.yaml @@ -23,6 +23,7 @@ tray: - g-subset-plugin - g-markers - cubeviz-slice + - g-unit-conversion - g-gaussian-smooth - g-collapse - g-model-fitting diff --git a/jdaviz/configs/cubeviz/plugins/spectral_extraction/spectral_extraction.py b/jdaviz/configs/cubeviz/plugins/spectral_extraction/spectral_extraction.py index 97cbd65ff6..0f4a372317 100644 --- a/jdaviz/configs/cubeviz/plugins/spectral_extraction/spectral_extraction.py +++ b/jdaviz/configs/cubeviz/plugins/spectral_extraction/spectral_extraction.py @@ -3,7 +3,6 @@ import numpy as np import astropy -from astropy import units as u from astropy.utils.decorators import deprecated from astropy.nddata import ( NDDataArray, StdDevUncertainty @@ -524,13 +523,3 @@ def _live_update(self, event={}): for mark in self.marks.values(): mark.update_xy(sp.spectral_axis.value, sp.flux.value) mark.visible = True - - def translate_units(self, collapsed_spec): - # remove sr - if u.sr in collapsed_spec._unit.bases: - collapsed_spec._data *= collapsed_spec.meta['_pixel_scale_factor'] - collapsed_spec._unit *= u.sr - # add sr - elif u.sr not in collapsed_spec._unit.bases: - collapsed_spec._data /= collapsed_spec.meta['_pixel_scale_factor'] - collapsed_spec._unit /= u.sr diff --git a/jdaviz/configs/cubeviz/plugins/spectral_extraction/spectral_extraction.vue b/jdaviz/configs/cubeviz/plugins/spectral_extraction/spectral_extraction.vue index 019dcfe694..c4d8514a35 100644 --- a/jdaviz/configs/cubeviz/plugins/spectral_extraction/spectral_extraction.vue +++ b/jdaviz/configs/cubeviz/plugins/spectral_extraction/spectral_extraction.vue @@ -135,6 +135,17 @@ +
+ + + +
+
Extract @@ -262,6 +273,5 @@
- diff --git a/jdaviz/configs/cubeviz/plugins/spectral_extraction/tests/test_spectral_extraction.py b/jdaviz/configs/cubeviz/plugins/spectral_extraction/tests/test_spectral_extraction.py index 26fd380d4c..d805f61eb0 100644 --- a/jdaviz/configs/cubeviz/plugins/spectral_extraction/tests/test_spectral_extraction.py +++ b/jdaviz/configs/cubeviz/plugins/spectral_extraction/tests/test_spectral_extraction.py @@ -373,6 +373,7 @@ def test_cube_extraction_with_nan(cubeviz_helper, image_cube_hdu_obj): assert_allclose(sp_subset.flux.value, 12) # (4 x 4) - 4 +# this test will have to move def test_unit_translation(cubeviz_helper): # custom cube so we have PIXAR_SR in metadata, and flux units = Jy/pix wcs_dict = {"CTYPE1": "WAVE-LOG", "CTYPE2": "DEC--TAN", "CTYPE3": "RA---TAN", diff --git a/jdaviz/configs/specviz/plugins/unit_conversion/unit_conversion.py b/jdaviz/configs/specviz/plugins/unit_conversion/unit_conversion.py index d10d2c6770..f443562823 100644 --- a/jdaviz/configs/specviz/plugins/unit_conversion/unit_conversion.py +++ b/jdaviz/configs/specviz/plugins/unit_conversion/unit_conversion.py @@ -1,10 +1,11 @@ import numpy as np from astropy import units as u -from traitlets import List, Unicode, observe +from traitlets import List, Unicode, observe, Bool from jdaviz.core.events import GlobalDisplayUnitChanged from jdaviz.core.registries import tray_registry -from jdaviz.core.template_mixin import PluginTemplateMixin, UnitSelectPluginComponent, PluginUserApi +from jdaviz.core.template_mixin import (PluginTemplateMixin, UnitSelectPluginComponent, + PluginUserApi) from jdaviz.core.validunits import (create_spectral_equivalencies_list, create_flux_equivalencies_list) @@ -51,6 +52,7 @@ class UnitConversion(PluginTemplateMixin): spectral_unit_selected = Unicode().tag(sync=True) flux_unit_items = List().tag(sync=True) flux_unit_selected = Unicode().tag(sync=True) + translate_unit = Bool(False).tag(sync=True) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -125,6 +127,20 @@ def _on_glue_y_display_unit_changed(self, y_unit): self.flux_unit.choices = choices self.flux_unit.selected = y_unit + def translate_units(self): + spec_units = u.Unit(self.spectrum_viewer.state.y_display_unit) + # remove sr + if u.sr in spec_units.bases: + spec_units *= u.sr + # update display units + self.spectrum_viewer.state.y_display_unit = str(spec_units) + + # add sr + elif u.sr not in spec_units.bases: + spec_units /= u.sr + # update display units + self.spectrum_viewer.state.y_display_unit = str(spec_units) + @observe('spectral_unit_selected') def _on_spectral_unit_changed(self, *args): self.hub.broadcast(GlobalDisplayUnitChanged('spectral', @@ -136,9 +152,25 @@ def _on_spectral_unit_changed(self, *args): @observe('flux_unit_selected') def _on_flux_unit_changed(self, *args): - self.hub.broadcast(GlobalDisplayUnitChanged('flux', - self.flux_unit.selected, - sender=self)) + # self.hub.broadcast(GlobalDisplayUnitChanged('flux', + # self.flux_unit.selected, + # sender=self)) yunit = _valid_glue_display_unit(self.flux_unit.selected, self.spectrum_viewer, 'y') + print('y_unit = ', yunit) if self.spectrum_viewer.state.y_display_unit != yunit: self.spectrum_viewer.state.y_display_unit = yunit + self.hub.broadcast(GlobalDisplayUnitChanged('flux', + self.flux_unit.selected, + sender=self)) + + @observe('translate_unit') + def _translate(self, *args): + # make sure we have a scale factor + specs_w_factor = [spec for spec in self.app.data_collection + if "_pixel_scale_factor" in spec.meta] + + if specs_w_factor: + self.translate_units() + else: + raise ValueError("No collapse spectra in data collection, \ + please collapse a spectrum first.") diff --git a/jdaviz/configs/specviz/plugins/unit_conversion/unit_conversion.vue b/jdaviz/configs/specviz/plugins/unit_conversion/unit_conversion.vue index 8d5afc6ab8..80e93b30e1 100644 --- a/jdaviz/configs/specviz/plugins/unit_conversion/unit_conversion.vue +++ b/jdaviz/configs/specviz/plugins/unit_conversion/unit_conversion.vue @@ -25,10 +25,20 @@ attach :items="flux_unit_items.map(i => i.label)" v-model="flux_unit_selected" - label="Flux Unit" - hint="Global display unit for flux." + :label="translate_unit ? 'Flux Unit' : 'Surface Brightness'" + :hint="translate_unit ? 'Global display unit for flux.' : 'Global display unit for surface brightness.'" persistent-hint > + + + + diff --git a/jdaviz/configs/specviz/plugins/viewers.py b/jdaviz/configs/specviz/plugins/viewers.py index e92f4abfa4..2205fdcf58 100644 --- a/jdaviz/configs/specviz/plugins/viewers.py +++ b/jdaviz/configs/specviz/plugins/viewers.py @@ -559,9 +559,25 @@ def set_plot_axes(self): y_display_unit = self.state.y_display_unit y_unit = u.Unit(y_display_unit) if y_display_unit else u.dimensionless_unscaled - if y_unit.is_equivalent(u.Jy / u.sr): - flux_unit_type = "Surface brightness" - elif y_unit.is_equivalent(u.erg / (u.s * u.cm**2)): + # Get local units. + locally_defined_flux_units = [ + u.Jy, u.mJy, u.uJy, u.MJy, + u.W / (u.m**2 * u.Hz), + u.eV / (u.s * u.m**2 * u.Hz), + u.erg / (u.s * u.cm**2), + u.erg / (u.s * u.cm**2 * u.Angstrom), + u.erg / (u.s * u.cm**2 * u.Hz), + u.ph / (u.s * u.cm**2 * u.Angstrom), + u.ph / (u.s * u.cm**2 * u.Hz) + ] + + locally_defined_sb_units = [ + unit / u.sr for unit in locally_defined_flux_units + ] + + if any(y_unit.is_equivalent(unit) for unit in locally_defined_sb_units): + flux_unit_type = "Surface Brightness" + elif any(y_unit.is_equivalent(unit) for unit in locally_defined_flux_units): flux_unit_type = 'Flux' elif y_unit.is_equivalent(u.electron / u.s) or y_unit.physical_type == 'dimensionless': # electron / s or 'dimensionless_unscaled' should be labeled counts diff --git a/jdaviz/core/validunits.py b/jdaviz/core/validunits.py index 372a5f2904..166b7b41ba 100644 --- a/jdaviz/core/validunits.py +++ b/jdaviz/core/validunits.py @@ -67,7 +67,7 @@ def create_flux_equivalencies_list(flux_unit, spectral_axis_unit): return [] # Get local units. - locally_defined_flux_units = ['Jy', 'mJy', 'uJy', + locally_defined_flux_units = ['Jy', 'mJy', 'uJy', 'MJy', 'W / (m2 Hz)', 'eV / (s m2 Hz)', 'erg / (s cm2)',