diff --git a/lib/xmet/rawins.py b/lib/xmet/rawins.py index bedb524..4defa4f 100644 --- a/lib/xmet/rawins.py +++ b/lib/xmet/rawins.py @@ -39,17 +39,10 @@ class RawinsObs(): self.values.append(value) TTAA_HEIGHTS = { - '00': 1000, - '92': 925, - '85': 850, - '70': 700, - '50': 500, - '40': 400, - '30': 300, - '25': 250, - '20': 200, - '15': 150, - '10': 100, + '00': 1000, '92': 925, '85': 850, + '70': 700, '50': 500, '40': 400, + '30': 300, '25': 250, '20': 200, + '15': 150, '10': 100, } def parse_timestamp(self, value: str): @@ -70,7 +63,8 @@ class RawinsObs(): def parse_surface_pressure(self, value: str): if value[0:2] == '99': return { - 'surface': float(value[2:5]) + 'height': None, + 'pressure': float(value[2:5]) } def parse_temp_dewpoint(self, value: str): @@ -133,24 +127,49 @@ class RawinsObs(): def parse_height_pressure(self, value: str): token = value[0:2] + if value[2:5] == '///': + return None + if token in self.TTAA_HEIGHTS: return { 'height': self.TTAA_HEIGHTS[token], 'pressure': float(value[2:5]) } - PRESSURES_SIG = { + PRESSURE_SIG = { '11': True, '22': True, '33': True, '44': True, '55': True, '66': True, '77': True, '88': True, '99': True } def parse_significant_pressure(self, value: str): - if value[0:2] in self.PRESSURES_SIG: + if value[0:2] in self.PRESSURE_SIG: return { 'height': None, 'pressure': float(value[2:5]) } + def parse_sample_values(self, values: list[str], first: bool=False) -> RawinsSample: + if first: + hp = self.parse_surface_pressure(values[0]) + else: + hp = self.parse_height_pressure(values[0]) + + if hp is None: + return None + + td = self.parse_temp_dewpoint(values[1]) + wind = self.parse_wind(values[2]) + + sample = RawinsSample() + sample.height = hp['height'] + sample.pressure = hp['pressure'] + sample.temp = td['temp'] if td is not None else None + sample.dewpoint = td['dewpoint'] if td is not None else None + sample.wind_dir = wind['dir'] if wind is not None else None + sample.wind_speed = wind['speed'] if wind is not None else None + + return sample + def parse_ttaa(self): # # Return None if there is no height data up to 100mb. @@ -168,19 +187,21 @@ class RawinsObs(): sounding.timestamp = self.parse_timestamp(self.values[0]) sounding.station = int(self.values[1]) - for i in range(2, len(self.values), 3): + sample = self.parse_sample_values(self.values[2:5], True) + + if sample is None: + return + + sounding.samples.append(sample) + + for i in range(5, len(self.values), 3): if len(self.values) <= i+2 or self.values[i][-1] == '=': break - td = self.parse_temp_dewpoint(self.values[i+1]) - wind = self.parse_wind(self.values[i+2]) + sample = self.parse_sample_values(self.values[i:i+3]) - sample = RawinsSample() - sample.pressure = self.parse_surface_pressure(self.values[i]) - sample.temp = td['temp'] if td is not None else None - sample.dewpoint = td['dewpoint'] if td is not None else None - sample.wind_dir = wind['dir'] if wind is not None else None - sample.wind_speed = wind['speed'] if wind is not None else None + if sample is None: + continue sounding.samples.append(sample)