1
0
Fork 0

Merge pull request #7 from xmichaelx/dirty_hdf5_support

Dirty hdf5 support
merge-requests/2/head
Cees Bassa 2022-06-23 09:24:31 +02:00 committed by GitHub
commit 945d17a599
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 50 additions and 12 deletions

View File

@ -13,14 +13,36 @@ from matplotlib.widgets import RectangleSelector
import matplotlib as mpl import matplotlib as mpl
from skyfield.api import EarthSatellite from skyfield.api import EarthSatellite
from skyfield.api import load, wgs84, utc from skyfield.api import load, wgs84, utc
from datetime import datetime, timedelta
import h5py
import json
from modest import imshow from modest import imshow
class Artifact:
def __init__(self, filename):
hdf5_file = h5py.File(filename, 'r')
if hdf5_file.attrs['artifact_version'] != 2:
raise Exception(hdf5_file.attrs['artifact_version'])
wf = hdf5_file.get('waterfall')
metadata = json.loads(hdf5_file.attrs['metadata'])
start_time = datetime.strptime(wf.attrs['start_time'].decode('ascii'), '%Y-%m-%dT%H:%M:%S.%fZ')
print(metadata)
self.z = np.transpose((np.array(wf['data']) * np.array(wf['scale']) + np.array(wf['offset'])))
self.fcen = float(metadata['frequency'])
self.freq = np.array(hdf5_file.get('waterfall').get("frequency")) + self.fcen
self.t = [ start_time + timedelta(seconds=x) for x in np.array(hdf5_file.get('waterfall').get("relative_time"))]
self.location = metadata["location"]
self.tle = [ x for x in metadata["tle"].split("\n") if x.strip() != "" ]
def main(): def main():
plt.style.use('dark_background')
mpl.rcParams['keymap.save'].remove('s') mpl.rcParams['keymap.save'].remove('s')
mpl.rcParams['keymap.fullscreen'].remove('f') mpl.rcParams['keymap.fullscreen'].remove('f')
mpl.rcParams['backend'] = "TkAgg" ts = load.timescale()
parser = argparse.ArgumentParser(description='rfplot: plot RF observations', formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser = argparse.ArgumentParser(description='rfplot: plot RF observations', formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('-p', help='Input path to parent directory /a/b/', required=True) parser.add_argument('-p', help='Input path to parent directory /a/b/', required=True)
@ -29,6 +51,7 @@ def main():
parser.add_argument('-l', type=int, default=3600, help='Number of subintegrations to plot') parser.add_argument('-l', type=int, default=3600, help='Number of subintegrations to plot')
parser.add_argument('-C', type=int, help='Site ID', default=4171) parser.add_argument('-C', type=int, help='Site ID', default=4171)
parser.add_argument('-F', help='List with frequencies') parser.add_argument('-F', help='List with frequencies')
parser.add_argument('-a', help='Input path to artifact')
args = parser.parse_args() args = parser.parse_args()
@ -46,7 +69,6 @@ def main():
print(f"Site with no: {args.C} does not exist") print(f"Site with no: {args.C} does not exist")
sys.exit(1) sys.exit(1)
site_location = wgs84.latlon(site["lat"], site["lon"], site["height"])
if args.F is not None: if args.F is not None:
freq_fname = args.F freq_fname = args.F
@ -60,7 +82,20 @@ def main():
tle_fname = os.path.join(os.environ["ST_TLEDIR"], "bulk.tle") tle_fname = os.path.join(os.environ["ST_TLEDIR"], "bulk.tle")
# Read spectrogram # Read spectrogram
s = Spectrogram(args.p, args.P, args.s, args.l, args.C) if args.a is None:
s = Spectrogram(args.p, args.P, args.s, args.l, args.C)
timestamps = [ x.replace(tzinfo=utc) for x in s.t]
range_rate_base = [ 0 for x in timestamps]
site_location = wgs84.latlon(site["lat"], site["lon"], site["height"])
else:
s = Artifact(args.a)
site = {"lat" : s.location["latitude"],"lon" : s.location["longitude"],"height" : s.location["altitude"]}
site_location = wgs84.latlon(site["lat"], site["lon"], site["height"])
satellite = EarthSatellite(s.tle[-2], s.tle[-1])
timestamps = [ x.replace(tzinfo=utc) for x in s.t]
pos = (satellite - site_location).at(ts.utc(timestamps))
_, _, _, _, _, range_rate_base = pos.frame_latlon_and_rates(site_location)
range_rate_base = range_rate_base.km_per_s
# Create plot # Create plot
vmin, vmax = np.percentile(s.z, (5, 99.95)) vmin, vmax = np.percentile(s.z, (5, 99.95))
@ -69,9 +104,8 @@ def main():
tmin, tmax = mdates.date2num(s.t[0]), mdates.date2num(s.t[-1]) tmin, tmax = mdates.date2num(s.t[0]), mdates.date2num(s.t[-1])
# Frequency limits # Frequency limits
fcen = np.mean(s.freq) fcen = s.fcen
fmin, fmax = (s.freq[0] - fcen) * 1e-6, (s.freq[-1] - fcen) * 1e-6 fmin, fmax = (s.freq[0] - fcen) * 1e-6, (s.freq[-1] - fcen) * 1e-6
ts = load.timescale()
frequencies = [] frequencies = []
satellite_info = [] satellite_info = []
@ -93,7 +127,6 @@ def main():
mark = ax.scatter([], [],c="white",s=5) mark = ax.scatter([], [],c="white",s=5)
line_fitting = ax.scatter([], [], edgecolors="yellow",s=10, facecolors='none') line_fitting = ax.scatter([], [], edgecolors="yellow",s=10, facecolors='none')
# imshow(ax, s.z, vmin=vmin, vmax=vmax) # imshow(ax, s.z, vmin=vmin, vmax=vmax)
timestamps = [ x.replace(tzinfo=utc) for x in s.t]
for sat_info in satellite_info: for sat_info in satellite_info:
satellite = EarthSatellite(sat_info["tle"][-2], sat_info["tle"][-1]) satellite = EarthSatellite(sat_info["tle"][-2], sat_info["tle"][-1])
t, events = satellite.find_events(site_location, t0, t1, altitude_degrees=0.0) t, events = satellite.find_events(site_location, t0, t1, altitude_degrees=0.0)
@ -110,20 +143,25 @@ def main():
sat_info["timeslot"] = [ (pairs[i][0].utc_datetime(), pairs[i+1][0].utc_datetime()) for i in range(0, len(pairs), 2)] sat_info["timeslot"] = [ (pairs[i][0].utc_datetime(), pairs[i+1][0].utc_datetime()) for i in range(0, len(pairs), 2)]
for timeslot in sat_info["timeslot"]: for timeslot in sat_info["timeslot"]:
selected_timestamps = [ x for x in timestamps if x >= timeslot[0] and x <= timeslot[1]] selected_pairs = [ x for x in zip(timestamps,range_rate_base) if x[0] >= timeslot[0] and x[0] <= timeslot[1]]
selected_timestamps = [x[0] for x in selected_pairs]
selected_range_rate_base = np.array([x[1] for x in selected_pairs])
pos = (satellite - site_location).at(ts.utc(selected_timestamps)) pos = (satellite - site_location).at(ts.utc(selected_timestamps))
_, _, _, _, _, range_rate = pos.frame_latlon_and_rates(site_location) _, _, _, _, _, range_rate = pos.frame_latlon_and_rates(site_location)
range_rate_sat = range_rate.km_per_s
C = 299792.458 # km/s C = 299792.458 # km/s
for freq in sat_info["frequencies"]: for fsat in sat_info["frequencies"]:
freq1 = (freq - fcen * 1e-6) fbase = fcen * 1e-6
dfreq = freq1 - range_rate.km_per_s / C * freq # MHz dfreq = (1 - range_rate_sat / C) * fsat - (1 - selected_range_rate_base / C) * fbase
ax.plot([mdates.date2num(x) for x in selected_timestamps], dfreq,c="lime") tt = [mdates.date2num(x) for x in selected_timestamps]
ax.plot(tt, dfreq,c="orange")
ax.text(tt[0], dfreq[0], sat_info["noradid"],c="orange")
image = imshow(ax, s.z, origin="lower", aspect="auto", interpolation="None", image = imshow(ax, s.z, origin="lower", aspect="auto", interpolation="None",
vmin=vmin, vmax=vmax, vmin=vmin, vmax=vmax,
extent=[tmin, tmax, fmin, fmax]) extent=[tmin, tmax, fmin, fmax])
mode = { mode = {
"current_mode" : None, "current_mode" : None,
"vmin" : vmin, "vmin" : vmin,