Source code for crikit.io.meta_process

"""
Created on Mon May 23 16:55:09 2016

@author: chc
"""

from crikit.data.frequency import (calib_pix_wn as _calib_pix_wn,
                                   calib_pix_wl as _calib_pix_wl)

from crikit.data.spectrum import Spectrum as _Spectrum
from crikit.data.spectra import Spectra as _Spectra
from crikit.data.hsi import Hsi as _Hsi

import numpy as _np

import traceback as _traceback

[docs]def rosetta_query(key, rosetta, output_cls_instance): """ Return the highest-priority value """ if isinstance(rosetta[key],list): # There is a priority list for num, count in enumerate(rosetta[key]): temp_val = None temp_key = None try: if isinstance(count,str): if count == '!': temp_key = key temp_val = rosetta[key][num+1] print('Using default meta_configs value for: {}'.format(key)) break else: temp_key = count temp_val = output_cls_instance._meta[temp_key] break else: pass except: temp_val = None temp_key = None if temp_val is not None: return(temp_val, temp_key) else: return None elif isinstance(rosetta[key],str): try: temp = output_cls_instance._meta[rosetta[key]] except: return None else: return (temp, rosetta[key]) else: # the value is likely a predefined answer-- no need to query meta return None
[docs]def meta_process(rosetta, output_cls_instance): """ Uses a conversion dict (rosetta) to process the meta data in \ output_cls_instance """ # Frequency-calibration calib_dict = {} print('Processing Meta Data\n------------------------------') temp = rosetta_query('ColorPolyVals',rosetta, output_cls_instance) print('{} from {}'.format(temp[0], temp[1])) calib_dict['a_vec'] = temp[0] del temp temp = rosetta_query('ColorChannels',rosetta, output_cls_instance) print('Color/Frequency-Channels: {} from {}'.format(temp[0], temp[1])) if temp[0] != output_cls_instance.shape[-1]: print('WARNING: Number of color channels assigned in meta data ({}) disagrees with datacube size ({})'.format(temp[0], output_cls_instance.shape[-1])) print('Setting to match dataset size...') calib_dict['n_pix'] = output_cls_instance.shape[-1] else: calib_dict['n_pix'] = temp[0] del temp temp = rosetta_query('ColorCenterWL',rosetta, output_cls_instance) print('{} from {}'.format(temp[0], temp[1])) calib_dict['ctr_wl'] = temp[0] del temp temp = rosetta_query('ColorCalibWL',rosetta, output_cls_instance) print('{} from {}'.format(temp[0], temp[1])) calib_dict['ctr_wl0'] = temp[0] del temp temp = rosetta_query('ColorProbe',rosetta, output_cls_instance) print('{} from {}'.format(temp[0], temp[1])) calib_dict['probe'] = temp[0] del temp temp = rosetta_query('ColorUnits',rosetta, output_cls_instance) print('{} from {}'.format(temp[0], temp[1])) calib_dict['units'] = temp[0] del temp output_cls_instance.freq.calib = calib_dict use_wn = rosetta_query('ColorWnMode',rosetta, output_cls_instance)[0] print('Use wavenumber: {}'.format(use_wn)) if use_wn: # Use wavenumber? output_cls_instance.freq.calib_fcn = _calib_pix_wn else: # Use wavelength output_cls_instance.freq.calib_fcn = _calib_pix_wl output_cls_instance.freq.update() # See if an original calibration is found try: calib_orig_dict = {} calib_orig_dict['a_vec'] = rosetta_query('OrigColorPolyVals',rosetta, output_cls_instance)[0] if calib_orig_dict['a_vec'] is None: raise ValueError calib_orig_dict['n_pix'] = rosetta_query('OrigColorChannels',rosetta, output_cls_instance)[0] if calib_orig_dict['n_pix'] is None: raise ValueError calib_orig_dict['ctr_wl'] = rosetta_query('OrigColorCenterWL',rosetta, output_cls_instance)[0] if calib_orig_dict['ctr_wl'] is None: raise ValueError calib_orig_dict['ctr_wl0'] = rosetta_query('OrigColorCalibWL',rosetta, output_cls_instance)[0] if calib_orig_dict['ctr_wl0'] is None: raise ValueError # Probe and Units are not necessary for calibration # Probe is only needed for wavelength-to-wavenumber conversion calib_orig_dict['probe'] = rosetta_query('OrigColorProbe',rosetta, output_cls_instance)[0] calib_orig_dict['units'] = rosetta_query('OrigColorUnits',rosetta, output_cls_instance)[0] except: print('Original calibration not found.') else: print('Original calibration found.') output_cls_instance.freq.calib_orig = calib_orig_dict # Spatial for HSI if type(output_cls_instance) == _Hsi: print('Type Hsi') try: units = rosetta_query('XUnits',rosetta, output_cls_instance) label = rosetta_query('XLabel',rosetta, output_cls_instance) if units is not None: units = units[0] if label is not None: label = label[0] start = rosetta_query('XStart',rosetta, output_cls_instance) stop = rosetta_query('XStop',rosetta, output_cls_instance) steps = rosetta_query('XLength',rosetta, output_cls_instance) if (start is not None) & (stop is not None) & (steps is not None): start = start[0] stop = stop[0] steps = steps[0] else: temp = output_cls_instance.shape start = 0 stop = temp[1] - 1 steps = temp[1] units = 'pix' label = 'X' # HDF files store strings in np.bytes format if isinstance(units, bytes): units = units.decode() if isinstance(label, bytes): label = label.decode() if steps != output_cls_instance.shape[1]: print('{} ({}): Start={}\tStop={}\tSteps={}'.format(label, units, start, stop, steps)) print('WARNING: {}Steps assigned in meta data ({}) disagrees with datacube size ({})'.format(label, steps, output_cls_instance.shape[1])) print('Setting steps to match data...') steps = output_cls_instance.shape[1] if (start == stop) & (steps > 1): print('{} ({}): Start={}\tStop={}\tSteps={}'.format(label, units, start, stop, steps)) print('WARNING: XStart and XStop are the same, which causes plotting problems. Switching to pixel-units based on dataset shape') start = 0 stop = output_cls_instance.shape[1]-1 units = 'pix' print('{} ({}): Start={}\tStop={}\tSteps={}'.format(label, units, start, stop, steps)) # print('Start: {}, Stop: {}, Steps: {}'.format(start, stop, steps)) output_cls_instance.x_rep.data = _np.squeeze(_np.linspace(start, stop, steps)) output_cls_instance.x_rep.units = units output_cls_instance.x_rep.label = label output_cls_instance.x_rep.update_calib_from_data() del start, stop, steps, units, label units = rosetta_query('YUnits',rosetta, output_cls_instance) label = rosetta_query('YLabel',rosetta, output_cls_instance) if units is not None: units = units[0] if label is not None: label = label[0] start = rosetta_query('YStart',rosetta, output_cls_instance) stop = rosetta_query('YStop',rosetta, output_cls_instance) steps = rosetta_query('YLength',rosetta, output_cls_instance) if (start is not None) & (stop is not None) & (steps is not None): start = start[0] stop = stop[0] steps = steps[0] else: temp = output_cls_instance.shape start = 0 stop = temp[0] - 1 steps = temp[0] units = 'pix' label = 'Y' # HDF files store strings in np.bytes format if isinstance(units, bytes): units = units.decode() if isinstance(label, bytes): label = label.decode() if steps != output_cls_instance.shape[0]: print('{} ({}): Start={}\tStop={}\tSteps={}'.format(label, units, start, stop, steps)) print('Warning: {}Steps assigned in meta data ({}) disagrees with datacube size ({})'.format(label, steps, output_cls_instance.shape[0])) print('Setting steps to match data...') steps = output_cls_instance.shape[0] if (start == stop) & (steps > 1): print('{} ({}): Start={}\tStop={}\tSteps={}'.format(label, units, start, stop, steps)) print('WARNING: YStart and YStop are the same, which causes plotting problems. Switching to pixel-units based on dataset shape') start = 0 stop = output_cls_instance.shape[0]-1 units = 'pix' print('{} ({}): Start={}\tStop={}\tSteps={}'.format(label, units, start, stop, steps)) output_cls_instance.y_rep.data = _np.squeeze(_np.linspace(start, stop, steps)) output_cls_instance.y_rep.units = units output_cls_instance.y_rep.label = label output_cls_instance.y_rep.update_calib_from_data() del start, stop, steps, units except Exception as e: _traceback.print_exc(limit=1) print('Something failed in meta_process: HSI-spatial calib: {}'.format(e)) elif type(output_cls_instance) == _Spectra: try: print('Type Spectra') output_cls_instance.reps.units = None output_cls_instance.reps.label = 'Acq Number' output_cls_instance.reps.data = _np.arange(output_cls_instance.data.shape[0]) # print(output_cls_instance.reps.data.shape) output_cls_instance.reps.update_calib_from_data() except: print('Something failed in meta_process: Spectra rep-calib') elif type(output_cls_instance) == _Spectrum: print('Type Spectrum')
if __name__ == '__main__': from crikit.io.meta_configs import (special_nist_bcars2 as _snb) from crikit.io.hdf5 import hdf_import_data as _hdf_import_data rosetta = _snb() filename = _os.path.abspath('../../../mP2_w_small.h5') spect_dark = _Spectra() _hdf_import_data(filename,'/Spectra/Dark_3_5ms_2',spect_dark) meta_process(rosetta, spect_dark) print(spect_dark.reps) print('') img = _Hsi() _hdf_import_data(filename,'/BCARSImage/mP2_3_5ms_Pos_2_0/mP2_3_5ms_Pos_2_0_small',img) meta_process(rosetta, img) print(img.freq.__dict__)