def _init_header(self, path): config = _load_config(path) metadata = config['metadata'] header = Stats() config_key = self._config['header_sampling_rate_key'] try: header.sampling_rate = float(metadata[config_key]) except KeyError: raise KeyError("The following key was not found in the metadata: " + "{}. Did you set the correct ".format(config_key) + "'sample rate metadata key' in PAL H5 Output module?") header.npts = int(metadata[self._config['header_samples_per_record_key']]) - 1 try: if self._config['dd_300']: header.calib = metadata['dd_300_calibration'] elif self._config['dd_900']: header.calib = metadata['dd_900_calibration'] elif self._config['vd_08']: header.calib = metadata['vd_08_calibration'] elif self._config['vd_09']: header.calib = metadata['vd_09_calibration'] except KeyError: pass header.comments = str(config['comments']) header.place = metadata if self._config['header_extra1_name'] != '' and self._config['header_extra1_val'] != '': header[self._config['header_extra1_name']] = self._config['header_extra1_val'] if self._config['header_extra2_name'] != '' and self._config['header_extra2_val'] != '': header[self._config['header_extra2_name']] = self._config['header_extra2_val'] return header
def _init_header(self, path): config = _load_config(path) metadata = config['metadata'] header = Stats() if 'ATS9440' in config['plugins'].keys(): ats_config = config['plugins']['ATS9440']['config'] elif 'ATS660' in config['plugins'].keys(): ats_config = config['plugins']['ATS660']['config'] else: raise KeyError('Cannot locate trace config data') if 'Polytec' in config['plugins'].keys(): polytec_config = config['plugins']['Polytec']['config'] else: raise KeyError('Cannot locate vibrometer config data') header.sampling_rate = _calc_sampling_rate(ats_config['sample_rate']) header.npts = int(ats_config['pre_trigger_samples'] + ats_config['post_trigger_samples']) - 1 if polytec_config['dd_300']: header.calib = float( re.findall(_NUMBER, polytec_config['dd_300_range'])[0]) elif polytec_config['dd_900']: header.calib = float( re.findall(_NUMBER, polytec_config['dd_900_range'])[0]) elif polytec_config['vd_08']: header.calib = float( re.findall(_NUMBER, polytec_config['vd_08_range'])[0]) elif polytec_config['vd_09']: header.calib = float( re.findall(_NUMBER, polytec_config['vd_09_range'])[0]) else: raise KeyError('Cannot locate vibrometer calibration data') header.comments = str(config['comments']) header.place = metadata if self._config['header_extra1_name'] != '' and self._config[ 'header_extra1_val'] != '': header[self._config['header_extra1_name']] = self._config[ 'header_extra1_val'] if self._config['header_extra2_name'] != '' and self._config[ 'header_extra2_val'] != '': header[self._config['header_extra2_name']] = self._config[ 'header_extra2_val'] return header
def _init_header(self, path): config = _load_config(path) metadata = config['metadata'] header = Stats() if 'ATS9440' in config['plugins'].keys(): ats_config = config['plugins']['ATS9440']['config'] elif 'ATS660' in config['plugins'].keys(): ats_config = config['plugins']['ATS660']['config'] else: raise KeyError('Cannot locate trace config data') if 'Polytec' in config['plugins'].keys(): polytec_config = config['plugins']['Polytec']['config'] else: raise KeyError('Cannot locate vibrometer config data') header.sampling_rate = _calc_sampling_rate(ats_config['sample_rate']) header.npts = int(ats_config['pre_trigger_samples'] + ats_config['post_trigger_samples']) - 1 if polytec_config['dd_300']: header.calib = float(re.findall( _NUMBER, polytec_config['dd_300_range'])[0]) elif polytec_config['dd_900']: header.calib = float(re.findall( _NUMBER, polytec_config['dd_900_range'])[0]) elif polytec_config['vd_08']: header.calib = float(re.findall( _NUMBER, polytec_config['vd_08_range'])[0]) elif polytec_config['vd_09']: header.calib = float(re.findall( _NUMBER, polytec_config['vd_09_range'])[0]) else: raise KeyError('Cannot locate vibrometer calibration data') header.comments = str(config['comments']) header.place = metadata if self._config['header_extra1_name'] != '' and self._config['header_extra1_val'] != '': header[self._config['header_extra1_name'] ] = self._config['header_extra1_val'] if self._config['header_extra2_name'] != '' and self._config['header_extra2_val'] != '': header[self._config['header_extra2_name'] ] = self._config['header_extra2_val'] return header
def python2obspy(self): from obspy.core.trace import Stats, Trace from obspy.core.utcdatetime import UTCDateTime s = Stats() s.network = self.network s.station = self.station s.location = self.location s.channel = self.channel s.sampling_rate = self.sampling_rate s.starttime = UTCDateTime(self.starttime) s.npts = len(self.data) misc_fields = dict() if 'CALIB' in self.misc_fields: s.calib = self.misc_fields.pop('CALIB') s.update(self.misc_fields) return Trace(self.data[:], header=s)
def parseISF(self, isf_data, header_only=None, convert=None): """ Determine starting point of data. Header has something like 'CURVE #520000', where ascii '5' is the length of the length field '20000'. :: 'CURVE #520000xxxx...' ^ ^^ ^ | || +---- data_loc: location of first valid byte of data | |+--------- len_loc: location of first byte of data length field | +---------- len_len_loc: location of length of length +----------------- tag_loc: location of start tag """ start_tag = 'CURVE #' tag_loc = int(isf_data.find(start_tag)) len_len_loc = tag_loc + len(start_tag) len_loc = len_len_loc + 1 len_len = int(isf_data[len_len_loc]) # e.g. 5 data_loc = len_loc + len_len data_len = int(isf_data[len_loc:len_loc+len_len]) # e.g. 20000 # Extract and parse header header = isf_data[:tag_loc] # Reformat the header into a dictionary header_dict = {} items = header.replace(':WFMPRE:','').replace(':','').split(';') # list of "key value" pairs for item in items: if(item): key, value = item.split(' ', 1) # maxsplit 1 to ignore subsequent spaces in value value = value.replace('"', '') header_dict[key] = value if(header_only): return header_dict # Extract data and convert from string to integer value data = isf_data[data_loc:] stats = Stats() stats.npts = int(header_dict['NR_PT']) stats.calib = float(header_dict['YMULT']) byte_order = header_dict['BYT_OR'] # 'MSB' or 'LSB' if(byte_order == 'MSB'): byte_order = '>' else: byte_order = '<' points = [] for i in range(0, stats.npts*2, 2): value = data[i:i+2] # as string converted = struct.unpack('%sh' % byte_order, value)[0] points.append(converted) # Optionally convert points to engineering units if(convert): try: points = np.array(points) * stats.calib # requires numpy except NameError: # If numpy not available, use list instead. p = [] for point in points: p.append(point * stats.calib) points = p stats.time_offset = float(header_dict['XZERO']) stats.calib_unit = header_dict['YUNIT'] stats.delta = float(header_dict['XINCR']) stats.amp_offset = float(header_dict['YOFF']) stats.comments = header_dict['WFID'] stats.channel = header_dict['WFID'][0:3] return stats, points