def item_getattr(self, item, attributes): """Return value from any of a list of attributes Parameters ---------- item : dict item to retrieve from attributes : list List of attributes Returns ------- (attribute, value) Returns the value and the attribute from which the value was taken. Raises ------ KeyError None of the attributes are found in the dict. """ return getattr_from_list( item, attributes, invalid_values=self.INVALID_VALUES )
def item_getattr(self, item, attributes): """Return value from any of a list of attributes Parameters ---------- item : dict item to retrieve from attributes : list List of attributes Returns ------- (attribute, value) Returns the value and the attribute from which the value was taken. Raises ------ KeyError None of the attributes are found in the dict. """ return getattr_from_list( item, attributes, invalid_values=self.INVALID_VALUES )
def item_getattr(item, attributes, association=None): """Return value from any of a list of attributes Parameters ---------- item : dict item to retrieve from attributes : list List of attributes Returns ------- (attribute, value) Returns the value and the attribute from which the value was taken. Raises ------ KeyError None of the attributes are found in the dict. """ if association is None: invalid_values = _EMPTY else: invalid_values = association.INVALID_VALUES return getattr_from_list( item, attributes, invalid_values=invalid_values )
def add_catalog_members(self): """Add catalog and direct image member based on direct image members""" directs = self.members_by_type('direct_image') if not directs: raise AssociationNotValidError( '{} has no required direct image exposures'.format( self.__class__.__name__ ) ) sciences = self.members_by_type('science') if not sciences: raise AssociationNotValidError( '{} has no required science exposure'.format( self.__class__.__name__ ) ) science = sciences[0] # Get the exposure sequence for the science. Then, find # the direct image greater than but closest to this value. closest = directs[0] # If the search fails, just use the first. try: expspcin = int(getattr_from_list(science.item, ['expspcin'], _EMPTY)[1]) except KeyError: # If exposure sequence cannot be determined, just fall through. logger.debug('Science exposure %s has no EXPSPCIN defined.', science) else: min_diff = 9999 # Initialize to an invalid value. for direct in directs: # For NIRCam, only consider direct images from the same channel # as the grism image if direct.item['exp_type'] == 'nrc_image': science_channel = getattr_from_list(science.item, ['channel'], _EMPTY)[1] direct_channel = getattr_from_list(direct.item, ['channel'], _EMPTY)[1] if direct_channel != science_channel: continue # For NIRISS, only consider direct images with the same PUPIL value if direct.item['exp_type'] == 'nis_image': science_pupil = getattr_from_list(science.item, ['pupil'], _EMPTY)[1] direct_pupil = getattr_from_list(direct.item, ['pupil'], _EMPTY)[1] if direct_pupil != science_pupil: continue try: direct_expspcin = int(getattr_from_list( direct.item, ['expspcin'], _EMPTY )[1]) except KeyError: # Try the next one. logger.debug('Direct image %s has no EXPSPCIN defined.', direct) continue diff = direct_expspcin - expspcin if diff < min_diff and diff > 0: min_diff = diff closest = direct # Note the selected direct image. Used in `Asn_Lv2WFSS._get_opt_element` self.direct_image = closest # Remove all direct images from the association. members = self.current_product['members'] direct_idxs = [ idx for idx, member in enumerate(members) if member['exptype'] == 'direct_image' ] deque(( list.pop(members, idx) for idx in sorted(direct_idxs, reverse=True) )) # Add the Level3 catalog, direct image, and segmentation map members lv3_direct_image_root = DMS_Level3_Base._dms_product_name(self) members.append( Member({ 'expname': lv3_direct_image_root + '_i2d.fits', 'exptype': 'direct_image' }) ) members.append( Member({ 'expname': lv3_direct_image_root + '_cat.ecsv', 'exptype': 'sourcecat' }) ) members.append( Member({ 'expname': lv3_direct_image_root + '_segm.fits', 'exptype': 'segmap' }) )