1111from 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
1616from jdaviz .core .registries import loader_importer_registry
1717from 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
0 commit comments