def get_data(self, tilt:int, drange:Number_T, dtype:str) -> Radial: if isinstance(dtype, str): self.dtype = dtype.upper().encode() elif isinstance(dtype, bytes): self.dtype = dtype.upper() if self.dtype in [b'REF', b'VEL', b'ZDR', b'PHI', b'RHO']: if self.dtype in [b'ZDR', b'PHI', b'RHO'] and tilt in [1, 3]: tilt -= 1 warnings.warn('Elevation angle {} does not contain {} data, automatically switch to tilt {}'.format( tilt + 1, self.dtype.decode(), tilt)) elif self.dtype in [b'VEL', b'SW'] and tilt in [0, 2]: tilt += 1 warnings.warn('Elevation angle {} does not contain {} data, automatically switch to tilt {}'.format( tilt - 1, self.dtype.decode(), tilt)) hdr = self.f.sweeps[tilt][0][4][self.dtype][0] self.reso = hdr.gate_width raw = np.array([ray[4][self.dtype][1] for ray in self.f.sweeps[tilt]]) else: raise RadarDecodeError('Unsupported data type {}'.format(self.dtype.decode())) cut = raw[:, :int(drange / self.reso)] masked = np.ma.array(cut, mask=np.isnan(cut)) self.tilt = tilt self.drange = drange self.elev = self.el[tilt] x, y, z, d, a = self.projection(self.reso) radial = Radial(masked, drange, self.elev, self.reso, self.name, self.name, self.scantime, self.dtype.decode(), self.stationlon, self.stationlat, x, y, a_reso=720) radial.add_polarc(d, a) return radial
def get_data(self, tilt:int, drange:Number_T, dtype:str) -> Radial: r''' Get radar data Parameters ---------- tilt: int index of elevation angle drange: float radius of data dtype: str type of product (REF, VEL, etc.) Returns ------- r_obj: cinrad.datastruct.Radial ''' task = getattr(self, 'task_name', None) reso = self.Rreso if dtype == 'REF' else self.Vreso ret = self.get_raw(tilt, drange, dtype) shape = ret[0].shape[1] if isinstance(ret, tuple) else ret.shape[1] r_obj = Radial(ret, int(np.round(shape * reso)), self.elev, reso, self.code, self.name, self.scantime, dtype, self.stationlon, self.stationlat, nyquist_velocity=self.nyquist_v[tilt], task=task) x, y, z, d, a = self.projection(reso) r_obj.add_geoc(x, y, z) r_obj.add_polarc(d, a) if self.radartype == 'CC': r_obj.a_reso = 512 return r_obj
def get_data(self, tilt, drange, dtype): r''' Get radar raw data Parameters ---------- tilt: int index of elevation angle drange: float radius of data dtype: str type of product (REF, VEL, etc.) Returns ------- r_obj: cinrad.datastruct.Radial ''' rf_flag = False self.tilt = tilt reso = self.Rreso if dtype == 'REF' else self.Vreso dmax = np.round(self.data[tilt][dtype][0].shape[0] * reso) if dmax < drange: warnings.warn('Requested data range exceed max range in this tilt') self.drange = drange self.elev = self.el[tilt] try: data = np.ma.array(self.data[tilt][dtype]) except KeyError: raise RadarDecodeError('Invalid product name') length = data.shape[1] * reso cut = data.T[:int(np.round(drange / reso))] shape_diff = np.round(drange / reso) - cut.shape[0] append = np.zeros( (int(np.round(shape_diff)), cut.shape[1])) * np.ma.masked if dtype == 'VEL': try: rf = self.data[tilt]['RF'] except KeyError: pass else: rf_flag = True rf = rf.T[:int(np.round(drange / reso))] rf = np.ma.vstack([rf, append]) #r = np.ma.array(cut, mask=np.isnan(cut)) r = np.ma.vstack([cut, append]) if rf_flag: r.mask = np.logical_or(r.mask, ~rf.mask) ret = (r.T, rf.T) else: ret = r.T r_obj = Radial(ret, int(np.round(r.shape[0] * reso)), self.elev, reso, self.code, self.name, self.scantime, dtype, self.stationlon, self.stationlat) x, y, z, d, a = self.projection(reso) r_obj.add_geoc(x, y, z) r_obj.add_polarc(d, a) if self.radartype == 'CC': r_obj.a_reso = 512 return r_obj
def get_data( self, tilt: int, drange: Number_T, dtype: str ) -> Union[Radial, Slice_]: r""" Get radar data Parameters ---------- tilt: int index of elevation angle drange: float radius of data dtype: str type of product (REF, VEL, etc.) Returns ------- r_obj: cinrad.datastruct.Radial """ reso = self.scan_config[tilt].dop_reso / 1000 ret = self.get_raw(tilt, drange, dtype) if self.scan_type == "PPI": shape = ret[0].shape[1] if isinstance(ret, tuple) else ret.shape[1] r_obj = Radial( ret, int(shape * reso), self.elev, reso, self.code, self.name, self.scantime, dtype, self.stationlon, self.stationlat, nyquist_velocity=self.scan_config[tilt].nyquist_spd, task=self.task_name, ) x, y, z, d, a = self.projection(reso) r_obj.add_geoc(x, y, z) r_obj.add_polarc(d, a) return r_obj else: # Manual projection shape = ret[0].shape[1] if isinstance(ret, tuple) else ret.shape[1] dist = np.linspace(reso, self.drange, ret.shape[1]) d, e = np.meshgrid(dist, self.aux[tilt]["elevation"]) h = height(d, e, 0) rhi = Slice_( ret, d, h, self.scantime, self.code, self.name, dtype, azimuth=self.aux[tilt]["azimuth"][0], ) return rhi
def get_data(self, tilt, drange, dtype): r''' Get radar raw data Parameters ---------- tilt: int index of elevation angle drange: float radius of data dtype: str type of product (REF, VEL, etc.) Returns ------- r_obj: cinrad.datastruct.Radial ''' self.tilt = tilt self.drange = drange self.elev = self.el[tilt] try: raw = np.array(self.data[tilt][dtype]) except KeyError: raise RadarDecodeError('Invalid product name') if raw.size == 0: warnings.warn('Empty data', RuntimeWarning) data = np.ma.array(raw, mask=(raw <= 5)) reso = self.scan_config[tilt].dop_reso / 1000 cut = data[:, :int(drange / reso)] shape_diff = np.round(drange / reso) - cut.shape[1] append = np.zeros((cut.shape[0], int(shape_diff))) * np.ma.masked if dtype == 'VEL': rf = np.ma.array(cut.data, mask=(cut.data != 1)) rf = np.ma.hstack([rf, append]) cut = np.ma.hstack([cut, append]) scale, offset = self.aux[tilt][dtype] r = (cut - offset) / scale if dtype == 'VEL': ret = (r, rf) else: ret = r r_obj = Radial(ret, int(r.shape[1] * reso), self.elev, reso, self.code, self.name, self.scantime, dtype, self.stationlon, self.stationlat) x, y, z, d, a = self.projection(reso) r_obj.add_geoc(x, y, z) r_obj.add_polarc(d, a) return r_obj
def get_data(self, tilt, drange, dtype): r''' Get radar raw data Parameters ---------- tilt: int index of elevation angle drange: float radius of data dtype: str type of product (REF, VEL, etc.) Returns ------- r_obj: cinrad.datastruct.Radial ''' self.tilt = tilt self.drange = drange self.elev = self.el[tilt] try: data = np.array(self.data[tilt][dtype]) except KeyError: raise RadarDecodeError('Invalid product name') if data.size == 0: raise RadarDecodeError( 'Current elevation does not contain this data.') reso = self.scanconfig[tilt]['radial_reso'] length = data.shape[1] * reso cut = data[:, :int(drange / reso)] r = np.ma.array(cut, mask=np.isnan(cut)) r_obj = Radial(r, int(r.shape[0] * reso), self.elev, reso, self.code, self.name, self.scantime, dtype, self.stationlon, self.stationlat) x, y, z, d, a = self.projection(reso) r_obj.add_geoc(x, y, z) r_obj.add_polarc(d, a) return r_obj
def get_data(self, tilt: int, drange: number_type, dtype: str) -> Radial: r''' Get radar raw data Parameters ---------- tilt: int index of elevation angle drange: float radius of data dtype: str type of product (REF, VEL, etc.) Returns ------- r_obj: cinrad.datastruct.Radial ''' self.tilt = tilt if self.scan_type == 'PPI' else 0 self.drange = drange if self.scan_type == 'RHI': max_range = self.scan_config[0].max_range1 / 1000 if drange > max_range: drange = max_range self.elev = self.el[tilt] try: raw = np.array(self.data[tilt][dtype]) except KeyError: raise RadarDecodeError('Invalid product name') if raw.size == 0: warnings.warn('Empty data', RuntimeWarning) data = np.ma.array(raw, mask=(raw <= 5)) reso = self.scan_config[tilt].dop_reso / 1000 cut = data[:, :int(drange / reso)] shape_diff = np.round(drange / reso) - cut.shape[1] append = np.zeros((cut.shape[0], int(shape_diff))) * np.ma.masked if dtype == 'VEL': rf = np.ma.array(cut.data, mask=(cut.data != 1)) rf = np.ma.hstack([rf, append]) cut = np.ma.hstack([cut, append]) scale, offset = self.aux[tilt][dtype] r = (cut - offset) / scale if dtype in ['VEL', 'SW']: ret = (r, rf) else: ret = r if self.scan_type == 'PPI': r_obj = Radial(ret, int(r.shape[1] * reso), self.elev, reso, self.code, self.name, self.scantime, dtype, self.stationlon, self.stationlat, nyquist_velocity=self.scan_config[tilt].nyquist_spd) x, y, z, d, a = self.projection(reso) r_obj.add_geoc(x, y, z) r_obj.add_polarc(d, a) return r_obj else: # Manual projection dist = np.linspace(reso, self.drange, cut.shape[1]) d, e = np.meshgrid(dist, self.aux[tilt]['elevation']) h = height(d, e, 0) rhi = Slice_(ret, d, h, self.scantime, self.code, self.name, dtype, azimuth=self.aux[tilt]['azimuth'][0]) return rhi