From c32f75afc6ace70a08939560fc113379de7a72ac Mon Sep 17 00:00:00 2001
From: Kelvin Rodriguez <kelvinrr@icloud.com>
Date: Fri, 14 Apr 2017 12:27:11 -0700
Subject: [PATCH] whoops

---
 plio/utils/_tes2numpy.py | 405 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 405 insertions(+)
 create mode 100644 plio/utils/_tes2numpy.py

diff --git a/plio/utils/_tes2numpy.py b/plio/utils/_tes2numpy.py
new file mode 100644
index 0000000..bb74ab8
--- /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}}
-- 
GitLab