|
|
| import os |
| import obspy |
| import pickle |
| import datetime |
| import h5py |
| from obspy.clients.fdsn.header import FDSNNoDataException |
| from obspy import UTCDateTime |
| import time |
| import pandas as pd |
| import multiprocessing |
| import numpy as np |
| import matplotlib.pyplot as plt |
| from obspy.signal.filter import bandpass |
| from scipy import signal |
| from obspy.geodetics.base import gps2dist_azimuth |
|
|
| class DataForSeiPnTest(): |
| def __init__(self, file_name="models/h5test/all-gzip4.h5", maxdist = 2000, slatrang = [-90, 90], slonrang= [-180, 180]): |
| self.file_name = file_name |
| self.n_thread = 2 |
| self.maxdist = maxdist |
| self.slatrang = slatrang |
| self.slonrang = slonrang |
| self.dqueue = multiprocessing.Queue(100) |
| for h5index in range(3): |
| multiprocessing.Process(target=self.feed_data, args=(self.dqueue, h5index)).start() |
| |
| def feed_data(self, dqueue, h5index): |
| file_name = f"SeisPnSn/Pn/SeisPnSn{h5index+1}.hdf5" |
| |
| csvfile = pd.read_csv(f"seipnsn/pn_part_metadata/pn{h5index+1}.csv") |
| h5keys = csvfile["key"] |
| h5file = h5py.File(file_name, "r") |
| h5fileyears = h5file["pn"] |
| |
| |
| print(f"{file_name}数据加载完成") |
| years = list(h5fileyears.keys()) |
| |
| for i in range(5): |
| year = years[i] |
| h5fileyear = h5fileyears[year] |
| print(f"当前数据年份为{year}") |
| for ekey in h5keys: |
| |
| if ekey.startswith(year): |
| |
| event = h5fileyear[ekey] |
| elat = event.attrs["event_la"] |
| elon = event.attrs["event_lo"] |
| slat = event.attrs["station_la"] |
| slon = event.attrs["station_lo"] |
| if slat < self.slatrang[0] or slat > self.slatrang[1]:continue |
| if slon < self.slonrang[0] or slon > self.slonrang[1]:continue |
| dist, abz, baz = gps2dist_azimuth(elat, elon, slat, slon) |
| |
| dist = dist/1000 |
| if dist > self.maxdist:continue |
| |
| rdata = [] |
| data = [0, 0, 0] |
| snr = event.attrs["snr_z_dB"] |
| |
| skey = event.attrs["station"] |
| data[0] = event[:, 0] |
| data[1] = event[:, 1] |
| data[2] = event[:, 2] |
| data[0] = signal.resample(data[0], 18000) |
| data[1] = signal.resample(data[1], 18000) |
| data[2] = signal.resample(data[2], 18000) |
| if len(data)!=3:continue |
| for d in data: |
| w = d[0:10240] |
| w = w - np.mean(w) |
| w = w / (np.max(np.abs(w))+1e-6) |
| rdata.append(w[np.newaxis, :, np.newaxis]) |
| rdata = np.concatenate(rdata, axis=2) |
| dqueue.put([rdata, [dist, ekey, skey, snr]]) |
| def batch_data(self, batch_size=50): |
| x1, x2 = [], [] |
| for _ in range(batch_size): |
| data, infos = self.dqueue.get() |
| x1.append(data) |
| x2.append(infos) |
| x1 = np.concatenate(x1, axis=0) |
| return x1, x2 |
|
|
|
|
|
|
|
|