def read_subset(self, mnemonics, rep=False, seq=False, events=False): """ decode the data from the currently loaded message subset using the specified mnemonics (a 'mnemonic' is simply a descriptive, alphanumeric name for a data value, like a key in a python dictionary). The mnemonics string may contain multiple space delimited mnemonics (e.g. `mnemonics='MNEMONIC1 MNEMONIC2 MNEMONIC3'`). By default, the mnemonics are assumed to be part of a delayed replication sequence, or have no replication at all, and `ufbint` is used to read the data. `ncepbufr.open.load_subset` must be called before trying to decode a subset using `ncepbufr.open.read_subset`. if `rep = True`, `ufbrep` is used to read data represented a regular replication sequence. See the comments in `src/ufbrep.f` for more details. Used for radiance data. if `seq=True`, `ufbseq` is used to read data represented by a sequence mnemonic. Used for gps data. if `events=True`, `ufbevn` is used to read prepbufr "events", and a 3-d array is returned. Only one of seq, rep and events can be True. returns a numpy masked array with decoded values (missing values are masked). The shape of the array is `(nm,nlevs)`, where where `nm` is the number of elements in the specified mnemonics string, and `nlevs` is the number of levels in the report. If `events=True`, a 3rd dimension representing the prepbufr event codes is added. """ if not self.subset_loaded: raise IOError('subset not loaded, call load_subset first') ndim = len(mnemonics.split()) if np.array([rep, seq, events]).sum() > 1: raise ValueError('only one of rep, seq and events cannot be True') if seq: data = np.empty((_nmaxseq, _maxdim), np.float, order='F') levs = _bufrlib.ufbseq(self.lunit, data, mnemonics, _nmaxseq, _maxdim) elif rep: data = np.empty((ndim, _maxdim), np.float, order='F') levs = _bufrlib.ufbrep(self.lunit, data, mnemonics, ndim, _maxdim) elif events: #data = np.empty((ndim,_maxdim,maxevents),np.float,order='F') data = np.empty((ndim, _maxdim, _maxevents), np.float, order='F') levs = _bufrlib.ufbevn(self.lunit, data, mnemonics, ndim, _maxdim, _maxevents) else: data = np.empty((ndim, _maxdim), np.float, order='F') levs = _bufrlib.ufbint(self.lunit, data, mnemonics, ndim, _maxdim) if events: return np.ma.masked_values(data[:, :levs, :], self.missing_value) else: return np.ma.masked_values(data[:, :levs], self.missing_value)
def read_subset(self,mnemonics,rep=False,seq=False,events=False): """ decode the data from the currently loaded message subset using the specified mnemonics (a 'mnemonic' is simply a descriptive, alphanumeric name for a data value, like a key in a python dictionary). The mnemonics string may contain multiple space delimited mnemonics (e.g. `mnemonics='MNEMONIC1 MNEMONIC2 MNEMONIC3'`). By default, the mnemonics are assumed to be part of a delayed replication sequence, or have no replication at all, and `ufbint` is used to read the data. `ncepbufr.open.load_subset` must be called before trying to decode a subset using `ncepbufr.open.read_subset`. if `rep = True`, `ufbrep` is used to read data represented a regular replication sequence. See the comments in `src/ufbrep.f` for more details. Used for radiance data. if `seq=True`, `ufbseq` is used to read data represented by a sequence mnemonic. Used for gps data. if `events=True`, `ufbevn` is used to read prepbufr "events", and a 3-d array is returned. Only one of seq, rep and events can be True. returns a numpy masked array with decoded values (missing values are masked). The shape of the array is `(nm,nlevs)`, where where `nm` is the number of elements in the specified mnemonics string, and `nlevs` is the number of levels in the report. If `events=True`, a 3rd dimension representing the prepbufr event codes is added. """ if not self.subset_loaded: raise IOError('subset not loaded, call load_subset first') ndim = len(mnemonics.split()) if np.array([rep,seq,events]).sum() > 1: raise ValueError('only one of rep, seq and events cannot be True') if seq: data = np.empty((_nmaxseq,_maxdim),np.float,order='F') levs = _bufrlib.ufbseq(self.lunit,data,mnemonics,_nmaxseq,_maxdim) elif rep: data = np.empty((ndim,_maxdim),np.float,order='F') levs = _bufrlib.ufbrep(self.lunit,data,mnemonics,ndim,_maxdim) elif events: data = np.empty((ndim,_maxdim,maxevent),np.float,order='F') levs = _bufrlib.ufbevn(self.lunit,data,mnemonics,ndim,_maxdim,_maxevents) else: data = np.empty((ndim,_maxdim),np.float,order='F') levs = _bufrlib.ufbint(self.lunit,data,mnemonics,ndim,_maxdim) if events: return np.ma.masked_values(data[:,:levs,:],self.missing_value) else: return np.ma.masked_values(data[:,:levs],self.missing_value)
def write_subset(self,data,mnemonics,rep=False,seq=False,events=False,end=False): """ write data to message subset using the specified mnemonics (a 'mnemonic' is simply a descriptive, alphanumeric name for a data value, like a key in a python dictionary). The mnemonics string may contain multiple space delimited mnemonics (e.g. `mnemonics='MNEMONIC1 MNEMONIC2 MNEMONIC3'`). By default, the mnemonics are assumed to be part of a delayed replication sequence, or have no replication at all, and `ufbint` is used to write the data. if `rep = True`, `ufbrep` is used to write data represented a regular replication sequence. See the comments in `src/ufbrep.f` for more details. Used for radiance data. if `seq=True`, `ufbseq` is used to write data represented by a sequence mnemonic. Used for gps data. if `events=True`, `ufbevn` is used to write prepbufr "events" (a 3-d data array is required) Only one of seq, rep and events can be True. If `end=True`, the message subset is closed and written to the bufr file (default `False`). """ # make a fortran contiguous copy of input data. if len(data.shape) in [2,3]: dataf = np.empty(data.shape, np.float, order='F') dataf[:] = data[:] elif len(data.shape) == 1: # make 1d array into 2d array with 1 level dataf = np.empty((data.shape[0],1), np.float, order='F') dataf[:,0] = data[:] else: msg = 'data in write_subset must be 1,2 or 3d' raise ValueError(msg) if np.array([rep,seq,events]).sum() > 1: raise ValueError('only one of rep, seq and events cannot be True') if seq: levs = _bufrlib.ufbseq(self.lunit,dataf,mnemonics,dataf.shape[0],\ dataf.shape[1]) elif rep: levs = _bufrlib.ufbrep(self.lunit,dataf,mnemonics,dataf.shape[0],\ dataf.shape[1]) elif events: levs = _bufrlib.ufbevn(self.lunit,dataf,mnemonics,dataf.shape[0],\ dataf.shape[1],dataf.shape[2]) else: levs = _bufrlib.ufbint(self.lunit,dataf,mnemonics,dataf.shape[0],\ dataf.shape[1]) # end subset if desired. if end: _bufrlib.writsb(self.lunit)