diff --git a/lib/xmet/raob.py b/lib/xmet/raob.py index 6679ed1..b28c7e7 100644 --- a/lib/xmet/raob.py +++ b/lib/xmet/raob.py @@ -258,38 +258,27 @@ class RAOBObs(): 'height': height } - PRESSURE_SIG = { + PRESSURE_CODES = { '11': True, '22': True, '33': True, '44': True, '55': True, '66': True, '77': True, '88': True, '99': True } - def parse_significant_pressure(self, token: str): - code, pressure = token[0:2], token[2:5] - - if code in self.PRESSURE_SIG: - return { - 'height': None, - 'pressure': float(pressure) - } - - def parse_surface_pressure(self, token: str): + def parse_pressure(self, token: str): code, pressure = token[0:2], float(token[2:5]) if pressure < 100: pressure += 1000.0 - if code == '99': - return { - 'height': None, - 'pressure': pressure - } + return { + 'pressure': pressure if code in self.PRESSURE_CODES else None, + 'height': None + } - def parse_sample_tokens(self, tokens: list[str]) -> SoundingSample: + def parse_ttaa_sample(self, tokens: list[str]) -> dict: sample = SoundingSample() if tokens[0][0:2] == '99': - sample.elapsed = 0 - hp = self.parse_surface_pressure(tokens[0]) + hp = self.parse_pressure(tokens[0]) else: hp = self.parse_height_pressure(tokens[0]) @@ -299,16 +288,14 @@ class RAOBObs(): td = self.parse_temp_dewpoint(tokens[1]) wind = self.parse_wind(tokens[2]) - 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 - - sample.pressure_qa = ' ' - sample.height_qa = ' ' - sample.temp_qa = ' ' + return { + 'pressure': hp['pressure'], + 'height': hp['height'], + 'temp': td['temp'], + 'dewpoint': td['dewpoint'], + 'wind_speed': wind['speed'], + 'wind_dir': wind['dir'] + } return sample @@ -325,16 +312,11 @@ class RAOBObs(): if self.tokens[1][0:3] == 'NIL': return None - sample = self.parse_sample_tokens(self.tokens[2:5]) - - if sample is None: - return - station = self.tokens[1] timestamp = self.tokens[0] samples = list() - for i in range(5, len(self.tokens), 3): + for i in range(2, len(self.tokens), 3): if len(self.tokens) < i+3 or self.tokens[i][-1] == '=': break @@ -344,12 +326,31 @@ class RAOBObs(): if self.tokens[i][0:2] == '88': break - sample = self.parse_sample_tokens(self.tokens[i:i+3]) + samples.append(self.parse_ttaa_sample(self.tokens[i:i+3])) - if sample is None: - continue + return { + 'station': station, + 'timestamp': timestamp, + 'samples': samples + } - samples.append(sample) + def parse_ttbb_sample(self, tokens: list[str]) -> dict: + hp = self.parse_pressure(tokens[0]) + td = self.parse_temp_dewpoint(tokens[1]) + + return { + 'pressure': hp['pressure'], + 'temp': td['temp'], + 'dewpoint': td['dewpoint'] + } + + def parse_ttbb(self) -> dict: + station = self.tokens[1] + timestamp = self.tokens[2] + samples = list() + + for i in range(3, len(self.tokens), 2): + samples.append(self.parse_sample_tokens(self.tokens[i:i+2])) return { 'station': station, @@ -499,18 +500,18 @@ class RAOBReader(): sounding = self.sounding(station, timestamp) - for sample in samples: - pressure = sample.pressure + for data in samples: + pressure = data['pressure'] - sounding.record_height(pressure, sample.height) + sounding.record_height(pressure, data['height']) sounding.record_temp_dewpoint(pressure, - sample.temp, - sample.dewpoint) + data['temp'], + data['dewpoint']) sounding.record_wind_speed_dir(pressure, - sample.wind_speed, - sample.wind_dir) + data['wind_speed'], + data['wind_dir']) for key in self.soundings: yield self.soundings[key].finish()