diff --git a/plio/utils/_tes2numpy.py b/plio/utils/_tes2numpy.py new file mode 100644 index 0000000000000000000000000000000000000000..bb74ab80607ee9c414f7b4aaca8ed46687d110fc --- /dev/null +++ b/plio/utils/_tes2numpy.py @@ -0,0 +1,405 @@ +def tes2numpy(msb_type, num_bytes, nelems=1): + """ + Converts a MSB data type to a numpy datatype + + """ + valid_bytes = { + 'MSB_UNSIGNED_INTEGER': [1,2,4,8,16,32,64], + 'MSB_INTEGER': [1,2,4,8,16,32,64], + 'IEEE_REAL': [1,2,4,8,16,32,64], + 'CHARACTER': range(1,128), + 'MSB_BIT_STRING': range(1,128) + } + + msb_bit_string_type = [('byte{}'.format(i), '>u1') for i in range(num_bytes)] + + dtype_map = { + 'MSB_UNSIGNED_INTEGER': '>u{}'.format(num_bytes), + 'MSB_INTEGER': '>i{}'.format(num_bytes), + 'IEEE_REAL': '>f{}'.format(num_bytes), + 'CHARACTER': 'a{}'.format(num_bytes), + 'MSB_BIT_STRING': msb_bit_string_type + } + + if num_bytes not in valid_bytes[msb_type] and nelems == 1: + raise Exception('invalid byte ({}) count for type ({})'.format(num_bytes, msb_type)) + + if nelems > 1: + # Must be an array + return [('elem{}'.format(i), dtype_map[msb_type]) for i in range(nelems)] + + + return dtype_map[msb_type] + + +tes_dtype_map = {'ATM': [('sclk_time', '>u4'), + ('srf_pressure', '>u2'), + ('nadir_pt', + [('elem0', '>u2'), + ('elem1', '>u2'), + ('elem2', '>u2'), + ('elem3', '>u2'), + ('elem4', '>u2'), + ('elem5', '>u2'), + ('elem6', '>u2'), + ('elem7', '>u2'), + ('elem8', '>u2'), + ('elem9', '>u2'), + ('elem10', '>u2'), + ('elem11', '>u2'), + ('elem12', '>u2'), + ('elem13', '>u2'), + ('elem14', '>u2'), + ('elem15', '>u2'), + ('elem16', '>u2'), + ('elem17', '>u2'), + ('elem18', '>u2'), + ('elem19', '>u2'), + ('elem20', '>u2'), + ('elem21', '>u2'), + ('elem22', '>u2'), + ('elem23', '>u2'), + ('elem24', '>u2'), + ('elem25', '>u2'), + ('elem26', '>u2'), + ('elem27', '>u2'), + ('elem28', '>u2'), + ('elem29', '>u2'), + ('elem30', '>u2'), + ('elem31', '>u2'), + ('elem32', '>u2'), + ('elem33', '>u2'), + ('elem34', '>u2'), + ('elem35', '>u2'), + ('elem36', '>u2'), + ('elem37', '>u2')]), + ('co2_cont_temp', '>u2'), + ('srf_temp_est', '>u2'), + ('rms_pt', '>f4'), + ('best_fit_opacities', + [('elem0', '>i2'), + ('elem1', '>i2'), + ('elem2', '>i2'), + ('elem3', '>i2'), + ('elem4', '>i2'), + ('elem5', '>i2'), + ('elem6', '>i2'), + ('elem7', '>i2'), + ('elem8', '>i2')]), + ('rms_opacities', '>f4'), + ('co2_dw_flux', '>f4'), + ('total_dw_flux', '>f4'), + ('quality', [('byte0', '>u1'), ('byte1', '>u1')]), + ('srf_radiance', '>i4'), + ('version_id', 'a4')], + 'BOL': [('sclk_time', '>u4'), + ('detector', '>u1'), + ('tic_count', '>u1'), + ('vbol', '>i2'), + ('tbol', '>i2'), + ('cal_vbol', '>f4'), + ('lambert_alb', '>f4'), + ('ti_bol', '>f4'), + ('brightness_temp_bol', '>u2'), + ('vbol_version_id', 'a2'), + ('tbol_version_id', 'a2'), + ('quality', [('byte0', '>u1'), ('byte1', '>u1')])], + 'GEO': [('sclk_time', '>u4'), + ('detector', '>u1'), + ('longitude', '>u2'), + ('latitude', '>i2'), + ('phase', '>u2'), + ('emission', '>u2'), + ('incidence', '>u2'), + ('planetary_phase', '>u2'), + ('heliocentric_lon', '>u2'), + ('sub_sc_lon', '>u2'), + ('sub_sc_lat', '>i2'), + ('sub_solar_lon', '>u2'), + ('sub_solar_lat', '>i2'), + ('target_distance', '>u2'), + ('height', '>u2'), + ('altitude', '>u2'), + ('local_time', '>u2'), + ('solar_distance', '>u2'), + ('angular_semidiameter', '>u2'), + ('version_id', 'a4')], + 'IFG': [('sclk_time', '>u4'), ('detector', '>u1'), ('ifgm', '>i4')], + 'OBS': [('sclk_time', '>u4'), + ('orbit', '>u2'), + ('ock', '>u2'), + ('ick', '>u4'), + ('tic', '>u1'), + ('pnt_angle', '>i2'), + ('pnt_imc', '>u1'), + ('pnt_view', 'a1'), + ('scan_len', 'a1'), + ('pckt_type', 'a1'), + ('schedule_type', 'a1'), + ('spc_gain', 'a1'), + ('vbol_gain', 'a1'), + ('tbol_gain', 'a1'), + ('comp_pp', '>u1'), + ('det_mask', '>u1'), + ('class', + [('byte0', '>u1'), ('byte1', '>u1'), ('byte2', '>u1'), ('byte3', '>u1')]), + ('quality', + [('byte0', '>u1'), ('byte1', '>u1'), ('byte2', '>u1'), ('byte3', '>u1')]), + ('temps', + [('elem0', '>u2'), ('elem1', '>u2'), ('elem2', '>u2'), ('elem3', '>u2')]), + ('ffti', '>u1')], + 'POS': [('sclk_time', '>u4'), + ('et', '>f8'), + ('pos', [('elem0', '>f4'), ('elem1', '>f4'), ('elem2', '>f4')]), + ('sun', [('elem0', '>f4'), ('elem1', '>f4'), ('elem2', '>f4')]), + ('quat', + [('elem0', '>f4'), ('elem1', '>f4'), ('elem2', '>f4'), ('elem3', '>f4')]), + ('id', [('elem0', 'a1'), ('elem1', 'a1')])], + 'RAD': [('sclk_time', '>u4'), + ('detector', '>u1'), + ('spectral_mask', '>u1'), + ('cmode', '>u2'), + ('raw_rad', '>i4'), + ('cal_rad', '>i4'), + ('tdet', '>u2'), + ('target_temp', '>u2'), + ('ti_spc', '>f4'), + ('version_id', 'a4'), + ('quality', + [('byte0', '>u1'), ('byte1', '>u1'), ('byte2', '>u1'), ('byte3', '>u1')])], + 'TLM': [('sclk_time', '>u4'), + ('aux_temps', + [('elem0', '>u2'), + ('elem1', '>u2'), + ('elem2', '>u2'), + ('elem3', '>u2'), + ('elem4', '>u2'), + ('elem5', '>u2'), + ('elem6', '>u2'), + ('elem7', '>u2'), + ('elem8', '>u2'), + ('elem9', '>u2'), + ('elem10', '>u2'), + ('elem11', '>u2')]), + ('ifgm_max', + [('elem0', '>i2'), + ('elem1', '>i2'), + ('elem2', '>i2'), + ('elem3', '>i2'), + ('elem4', '>i2'), + ('elem5', '>i2')]), + ('ifgm_min', + [('elem0', '>i2'), + ('elem1', '>i2'), + ('elem2', '>i2'), + ('elem3', '>i2'), + ('elem4', '>i2'), + ('elem5', '>i2')]), + ('dsp_log', + [('elem0', '>u2'), + ('elem1', '>u2'), + ('elem2', '>u2'), + ('elem3', '>u2'), + ('elem4', '>u2'), + ('elem5', '>u2')]), + ('V1', '>i1'), + ('V2', '>i1'), + ('V3', '>i1'), + ('V4', '>i1'), + ('V5', '>i1'), + ('V6', '>i1'), + ('V7', '>i1'), + ('V8', '>i1'), + ('V9', '>i1'), + ('V10', '>i1'), + ('V11', '>i1'), + ('V12', '>i1'), + ('V13', '>i1'), + ('V14', '>i1'), + ('V15', '>i1'), + ('V16', '>i1'), + ('V17', '>i1'), + ('V18', '>i1'), + ('V19', '>i1'), + ('V20', '>i1'), + ('neon_lamp', '>u1'), + ('neon_gain', 'a1'), + ('neon_amp', '>i1'), + ('neon_zpd', '>u2'), + ('ifgm_zpd', + [('elem0', '>u2'), + ('elem1', '>u2'), + ('elem2', '>u2'), + ('elem3', '>u2'), + ('elem4', '>u2'), + ('elem5', '>u2')]), + ('ifgm_end', + [('elem0', '>u2'), + ('elem1', '>u2'), + ('elem2', '>u2'), + ('elem3', '>u2'), + ('elem4', '>u2'), + ('elem5', '>u2')])]} + +tes_columns = {'ATM': ['sclk_time', + 'srf_pressure', + 'nadir_pt', + 'co2_cont_temp', + 'srf_temp_est', + 'rms_pt', + 'best_fit_opacities', + 'rms_opacities', + 'co2_dw_flux', + 'total_dw_flux', + 'quality', + 'srf_radiance', + 'version_id'], + 'BOL': ['sclk_time', + 'detector', + 'tic_count', + 'vbol', + 'tbol', + 'cal_vbol', + 'lambert_alb', + 'ti_bol', + 'brightness_temp_bol', + 'vbol_version_id', + 'tbol_version_id', + 'quality'], + 'GEO': ['sclk_time', + 'detector', + 'longitude', + 'latitude', + 'phase', + 'emission', + 'incidence', + 'planetary_phase', + 'heliocentric_lon', + 'sub_sc_lon', + 'sub_sc_lat', + 'sub_solar_lon', + 'sub_solar_lat', + 'target_distance', + 'height', + 'altitude', + 'local_time', + 'solar_distance', + 'angular_semidiameter', + 'version_id'], + 'IFG': ['sclk_time', 'detector', 'ifgm'], + 'OBS': ['sclk_time', + 'orbit', + 'ock', + 'ick', + 'tic', + 'pnt_angle', + 'pnt_imc', + 'pnt_view', + 'scan_len', + 'pckt_type', + 'schedule_type', + 'spc_gain', + 'vbol_gain', + 'tbol_gain', + 'comp_pp', + 'det_mask', + 'class', + 'quality', + 'temps', + 'ffti'], + 'POS': ['sclk_time', 'et', 'pos', 'sun', 'quat', 'id'], + 'RAD': ['sclk_time', + 'detector', + 'spectral_mask', + 'cmode', + 'raw_rad', + 'cal_rad', + 'tdet', + 'target_temp', + 'ti_spc', + 'version_id', + 'quality'], + 'TLM': ['sclk_time', + 'aux_temps', + 'ifgm_max', + 'ifgm_min', + 'dsp_log', + 'V1', + 'V2', + 'V3', + 'V4', + 'V5', + 'V6', + 'V7', + 'V8', + 'V9', + 'V10', + 'V11', + 'V12', + 'V13', + 'V14', + 'V15', + 'V16', + 'V17', + 'V18', + 'V19', + 'V20', + 'neon_lamp', + 'neon_gain', + 'neon_amp', + 'neon_zpd', + 'ifgm_zpd', + 'ifgm_end']} + +tes_scaling_factors = {'ATM': {'best_fit_opacities': 0.001, + 'co2_cont_temp': 0.01, + 'nadir_pt': 0.01, + 'srf_pressure': 0.001, + 'srf_temp_est': 0.01}, + 'BOL': {'brightness_temp_bol': 0.01, + 'tbol': 0.000152587890625, + 'vbol': 0.000152587890625}, + 'CMP': {}, + 'GEO': {'angular_semidiameter': 0.01, + 'emission': 0.01, + 'height': 0.01, + 'heliocentric_lon': 0.01, + 'incidence': 0.01, + 'latitude': 0.01, + 'local_time': 0.001, + 'longitude': 0.01, + 'phase': 0.01, + 'planetary_phase': 0.01, + 'solar_distance': 10000, + 'sub_sc_lat': 0.01, + 'sub_sc_lon': 0.01, + 'sub_solar_lat': 0.01, + 'sub_solar_lon': 0.01}, + 'IFG': {}, + 'OBS': {'pnt_angle': 0.046875, 'temps': 0.01}, + 'PCT': {}, + 'POS': {}, + 'RAD': {'target_temp': 0.01, 'tdet': 0.01}, + 'TLM': {'V1': 3.90625, + 'V10': -0.15625, + 'V11': 0.0976055, + 'V12': -0.0985813, + 'V13': 0.976562, + 'V14': 0.0648437, + 'V15': 0.045727, + 'V16': 0.0480992, + 'V17': 0.0478277, + 'V18': 0.0488039, + 'V19': 0.141966, + 'V2': 1.95312, + 'V20': -0.149688, + 'V3': 0.278906, + 'V4': 0.278906, + 'V5': 4.45312, + 'V6': 0.652344, + 'V7': 0.119457, + 'V8': -0.103067, + 'V9': 0.15576, + 'aux_temps': 0.01, + 'ifgm_max': 0.000152587890625, + 'ifgm_min': 0.000152587890625}}