#!/usr/bin/env python3 import os import re import sys import glob import h5py import json import numpy as np from datetime import datetime, timedelta class Spectrogram: """Spectrogram class""" def __init__(self, t, fcen, bw, freq, z, siteid, location, tle): self.z = z self.nchan = self.z.shape[0] self.nsub = self.z.shape[1] self.t = t self.fcen = fcen self.bw = bw self.freq = freq self.siteid = siteid self.location = location self.tle = tle @classmethod def from_spectrogram(cls, froot, ifile, nsub, siteid): """Define a spectrogram""" path, prefix = extract_path_and_prefix(froot) # Read matching filenames fnames = sorted(glob.glob(os.path.join(path, f"{prefix}_*.bin"))) # Start filename fname = os.path.join(path, f"{prefix}_{ifile:06d}.bin") if not fname in fnames: # Exit on no matching files if fnames == []: print(f"Spectrogram is not available under {fname}") sys.exit(1) else: print(f"Spectrogram is not available under {fname}\nUsing {fnames[0]} instead") fname = fnames[0] ifile = int(fname.split("_")[-1].replace(".bin", "")) # Read first header with open(fname, "rb") as fp: header = parse_header(fp.read(256)) # Set frequencies freq_cen, bw, nchan = header["freq"], header["bw"], header["nchan"] freq_min, freq_max = -0.5 * bw, 0.5 * bw freq = freq_cen + np.linspace(freq_min, freq_max, nchan, endpoint=False) + freq_max / nchan # Loop over subints and files zs = [] t = [] isub = 0; while isub= fmin_padding and freq["freq"] <= fmax_padding: if freq["norad"] in frequencies: frequencies[freq["norad"]].append(freq["freq"]) else: frequencies[freq["norad"]] = [ freq["freq"] ] return frequencies def get_satellite_info(fname, frequencies): with open(fname, "r") as fp: lines = [x.strip() for x in fp.readlines()] sat_freq = [] for i in range(0, len(lines), 3): noradid = int(lines[i+2].split()[1]) if noradid in frequencies: entry = { "noradid" : noradid, "frequencies": frequencies[noradid], "tle": lines[i:i+3] } sat_freq.append(entry) return sat_freq