Skip to content

Commit 23f541f

Browse files
committed
parent data implementation
1 parent dac6711 commit 23f541f

5 files changed

Lines changed: 57 additions & 4 deletions

File tree

jdaviz/configs/imviz/helper.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,12 +186,14 @@ def load_data(self, data, data_label=None, show_in_viewer=True, **kwargs):
186186
format='Image',
187187
data_label=data_label,
188188
extension=extensions,
189+
parent=kwargs.pop('parent', None),
189190
show_in_viewer=show_in_viewer)
190191
elif isinstance(data, str) and data.endswith('.reg'):
191192
self._load(data,
192193
format='Subset',
193194
data_label=data_label,
194195
extension=extensions,
196+
parent=kwargs.pop('parent', None),
195197
show_in_viewer=show_in_viewer)
196198
else:
197199
# extensions is None or a single extension or data is NDData and importer will handle
@@ -210,6 +212,7 @@ def load_data(self, data, data_label=None, show_in_viewer=True, **kwargs):
210212
data_label=data_label,
211213
data_label_as_prefix=data_label_as_prefix,
212214
extension=extensions,
215+
parent=kwargs.pop('parent', None),
213216
show_in_viewer=show_in_viewer)
214217

215218
def link_data(self, align_by='pixels', wcs_fallback_scheme=None, wcs_fast_approximation=True):

jdaviz/core/loaders/importers/image/image.py

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from traitlets import Bool, List, Any, observe
1212

1313

14-
from jdaviz.core.template_mixin import SelectFileExtensionComponent
14+
from jdaviz.core.template_mixin import SelectFileExtensionComponent, DatasetSelect
1515

1616
from jdaviz.core.registries import loader_importer_registry
1717
from jdaviz.core.loaders.importers import BaseImporterToDataCollection
@@ -42,6 +42,10 @@ class ImageImporter(BaseImporterToDataCollection):
4242
extension_selected = Any().tag(sync=True)
4343
extension_multiselect = Bool(True).tag(sync=True)
4444

45+
# Data-association
46+
parent_items = List().tag(sync=True)
47+
parent_selected = Any().tag(sync=True)
48+
4549
# user-settable option to treat the data_label as prefix and append the extension later
4650
data_label_as_prefix = Bool(False).tag(sync=True)
4751
# whether the current data_label should be treated as a prefix
@@ -50,11 +54,17 @@ class ImageImporter(BaseImporterToDataCollection):
5054

5155
def __init__(self, *args, **kwargs):
5256
super().__init__(*args, **kwargs)
57+
5358
if self.default_data_label_from_resolver:
5459
self.data_label_default = self.default_data_label_from_resolver
5560
elif self.app.config == 'imviz':
5661
self.data_label_default = 'Image'
5762

63+
self.parent = DatasetSelect(self, 'parent_items', 'parent_selected',
64+
multiselect=None, manual_options=['Auto'])
65+
self.parent.add_filter('is_image', 'not_from_plugin')
66+
self.parent.selected = 'Auto'
67+
5868
self.input_hdulist = isinstance(self.input, fits.HDUList)
5969
if self.input_hdulist:
6070
self.extension = SelectFileExtensionComponent(self,
@@ -69,7 +79,7 @@ def __init__(self, *args, **kwargs):
6979

7080
@property
7181
def user_api(self):
72-
expose = ['data_label_as_prefix']
82+
expose = ['parent', 'data_label_as_prefix']
7383
if self.input_hdulist:
7484
expose += ['extension']
7585
return ImporterUserApi(self, expose)
@@ -157,6 +167,32 @@ def __call__(self, show_in_viewer=True):
157167
exts = [None] * len(outputs)
158168
hdus = [None] * len(outputs)
159169

170+
# If parent is set to 'Auto', use any present SCI/DATA extension as parent
171+
# of any other extensions
172+
if self.parent.selected == 'Auto' and len(exts) > 1:
173+
for ext in ('SCI', 'DATA'):
174+
if ext in exts:
175+
parent_ext = ext
176+
break
177+
else:
178+
parent_ext = None
179+
if parent_ext is not None:
180+
parent_index = exts.index(parent_ext)
181+
sort_inds = [parent_index] + [i for i in range(len(exts)) if i != parent_index]
182+
outputs = [outputs[i] for i in sort_inds]
183+
exts = [exts[i] for i in sort_inds]
184+
hdus = [hdus[i] for i in sort_inds]
185+
186+
parent_hdu = hdus[parent_index]
187+
# assume self.data_label_is_prefix is True
188+
parent = self._get_label_with_extension(base_data_label,
189+
parent_ext,
190+
ver=parent_hdu.ver if parent_hdu else None)
191+
elif self.parent.selected == 'Auto':
192+
parent = None
193+
else:
194+
parent = self.parent.selected
195+
160196
for output, ext, hdu in zip(outputs, exts, hdus):
161197
if output is None:
162198
# needed for NDData where one of the "extensions" might
@@ -173,6 +209,7 @@ def __call__(self, show_in_viewer=True):
173209
# If data_label is not a prefix, we use it as is.
174210
data_label = base_data_label
175211
self.add_to_data_collection(output, data_label,
212+
parent=parent if parent != data_label else None,
176213
show_in_viewer=show_in_viewer,
177214
cls=CCDData)
178215

jdaviz/core/loaders/importers/image/image.vue

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,16 @@
1010
:api_hints_enabled="api_hints_enabled"
1111
hint="Extension to use from the FITS HDUList."
1212
></plugin-select>
13+
<plugin-dataset-select
14+
:items="parent_items"
15+
:selected.sync="parent_selected"
16+
:show_if_single_entry="true"
17+
:multiselect="false"
18+
label="Parent Dataset"
19+
api_hint="ldr.importer.parent ="
20+
:api_hints_enabled="api_hints_enabled"
21+
hint="Select a parent dataset to associate the new data with."
22+
></dataset-select>
1323
<v-row>
1424
<plugin-auto-label
1525
:value.sync="data_label_value"

jdaviz/core/loaders/importers/importer.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,8 @@ def load_into_viewer(self, data_label, default_viewer_reference=None):
159159
viewer = self.app._jdaviz_helper.viewers.get(default_viewer_label)
160160
viewer.data_menu.add_data(data_label)
161161

162-
def add_to_data_collection(self, data, data_label=None, show_in_viewer=True, cls=None):
162+
def add_to_data_collection(self, data, data_label=None,
163+
parent=None, show_in_viewer=True, cls=None):
163164
if data_label is None:
164165
data_label = self.data_label_value.strip()
165166
if hasattr(data, 'meta'):
@@ -168,6 +169,8 @@ def add_to_data_collection(self, data, data_label=None, show_in_viewer=True, cls
168169
except TypeError:
169170
pass
170171
self.app.add_data(data, data_label=data_label)
172+
if parent is not None:
173+
self.app._set_assoc_data_as_child(data_label, parent)
171174
# store the original input class so that get_data can default to the
172175
# same class as the input
173176
cls = cls if cls is not None else data.__class__

jdaviz/tests/test_app.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ def test_data_associations(imviz_helper):
192192
assert imviz_helper.app._get_assoc_data_children('parent_data') == ['child_data']
193193
assert imviz_helper.app._get_assoc_data_parent('child_data') == 'parent_data'
194194

195-
with pytest.raises(NotImplementedError):
195+
with pytest.raises(ValueError):
196196
# we don't (yet) allow children of children:
197197
imviz_helper.load_data(data_child, data_label='grandchild_data', parent='child_data')
198198

0 commit comments

Comments
 (0)