def plot_horizontal_grid(self): sch, sls, sci = ppgplot.pgqch(), ppgplot.pgqls(), ppgplot.pgqci() ppgplot.pgsci(15) ppgplot.pgsls(2) # Altitudes for alt in np.arange(0.0, 90.0, 20.0): az = np.arange(0.0, 360.0) rx, ry = forward(self.az, self.alt, az, alt * np.ones_like(az)) for i in range(len(rx)): if i == 0: ppgplot.pgmove(rx[i], ry[i]) if (np.abs(rx[i]) <= 1.5 * self.w) & (np.abs(ry[i]) <= self.w): ppgplot.pgdraw(rx[i], ry[i]) else: ppgplot.pgmove(rx[i], ry[i]) # Azimuths for az in np.arange(0.0, 360.0, 30.0): alt = np.arange(0.0, 80.0) rx, ry = forward(self.az, self.alt, az * np.ones_like(alt), alt) for i in range(len(rx)): if i == 0: ppgplot.pgmove(rx[i], ry[i]) if (np.abs(rx[i]) <= 1.5 * self.w) & (np.abs(ry[i]) <= self.w): ppgplot.pgdraw(rx[i], ry[i]) else: ppgplot.pgmove(rx[i], ry[i]) ppgplot.pgsci(1) ppgplot.pgsls(1) # Horizon az = np.arange(0.0, 360.0) rx, ry = forward(self.az, self.alt, az, np.zeros_like(az)) for i in range(len(rx)): if i == 0: ppgplot.pgmove(rx[i], ry[i]) if (np.abs(rx[i]) <= 1.5 * self.w) & (np.abs(ry[i]) <= self.w): ppgplot.pgdraw(rx[i], ry[i]) else: ppgplot.pgmove(rx[i], ry[i])
def extract_tracks(fname, trkrmin, drdtmin, trksig, ntrkmin, path, results_path): # Read four frame ff = fourframe(fname) # Skip saturated frames if np.sum(ff.zavg > 240.0) / float(ff.nx * ff.ny) > 0.95: return # Read satelite IDs try: f = open(fname + ".id") except OSError: print("Cannot open", fname + ".id") else: lines = f.readlines() f.close() tr = np.array([-0.5, 1.0, 0.0, -0.5, 0.0, 1.0]) # Parse identifications idents = [satid(line) for line in lines] # Identify unknowns for ident0 in idents: if ident0.catalog == "unidentified": for ident1 in idents: if ident1.catalog == "unidentified": continue # Find matches p1 = inside_selection(ident1, ident0.t0, ident0.x0, ident0.y0) p2 = inside_selection(ident1, ident0.t1, ident0.x1, ident0.y1) # Match found if p1 and p2: # Copy info ident0.norad = ident1.norad ident0.catalog = ident1.catalog ident0.state = ident1.state ident1.state = "remove" break # Loop over identifications for ident in idents: # Skip superseded unknowns if ident.state == "remove": continue # Skip slow moving objects drdt = np.sqrt(ident.dxdt**2 + ident.dydt**2) if drdt < drdtmin: continue # Extract significant pixels along a track x, y, t, sig = ff.significant_pixels_along_track( trksig, ident.x0, ident.y0, ident.dxdt, ident.dydt, trkrmin) # Fit tracks if len(t) > ntrkmin: # Get times tmin = np.min(t) tmax = np.max(t) tmid = 0.5 * (tmax + tmin) mjd = ff.mjd + tmid / 86400.0 # Skip if no variance in time if np.std(t - tmid) == 0.0: continue # Very simple polynomial fit; no weighting, no cleaning px = np.polyfit(t - tmid, x, 1) py = np.polyfit(t - tmid, y, 1) # Extract results x0, y0 = px[1], py[1] dxdt, dydt = px[0], py[0] xmin = x0 + dxdt * (tmin - tmid) ymin = y0 + dydt * (tmin - tmid) xmax = x0 + dxdt * (tmax - tmid) ymax = y0 + dydt * (tmax - tmid) cospar = get_cospar(ident.norad, ff.nfd) obs = observation(ff, mjd, x0, y0) iod_line = "%s" % format_iod_line(ident.norad, cospar, ff.site_id, obs.nfd, obs.ra, obs.de) # Create diagnostic plot plot_header(fname.replace(".fits", "_%05d.png/png" % ident.norad), ff, iod_line) ppg.pgimag(ff.zmax, ff.nx, ff.ny, 0, ff.nx - 1, 0, ff.ny - 1, ff.zmaxmax, ff.zmaxmin, tr) ppg.pgbox("BCTSNI", 0., 0, "BCTSNI", 0., 0) ppg.pgstbg(1) ppg.pgsci(0) if ident.catalog.find("classfd.tle") > 0: ppg.pgsci(4) elif ident.catalog.find("inttles.tle") > 0: ppg.pgsci(3) ppg.pgpt(np.array([x0]), np.array([y0]), 4) ppg.pgmove(xmin, ymin) ppg.pgdraw(xmax, ymax) ppg.pgsch(0.65) ppg.pgtext(np.array([x0]), np.array([y0]), " %05d" % ident.norad) ppg.pgsch(1.0) ppg.pgsci(1) ppg.pgend() # Store results store_results(ident, fname, results_path, iod_line) elif ident.catalog.find("classfd.tle") > 0: # Track and stack t = np.linspace(0.0, ff.texp) x, y = ident.x0 + ident.dxdt * t, ident.y0 + ident.dydt * t c = (x > 0) & (x < ff.nx) & (y > 0) & (y < ff.ny) # Skip if no points selected if np.sum(c) == 0: store_not_seen(ident, fname, results_path) continue # Compute track tmid = np.mean(t[c]) mjd = ff.mjd + tmid / 86400.0 xmid = ident.x0 + ident.dxdt * tmid ymid = ident.y0 + ident.dydt * tmid ztrk = ndimage.gaussian_filter( ff.track(ident.dxdt, ident.dydt, tmid), 1.0) vmin = np.mean(ztrk) - 2.0 * np.std(ztrk) vmax = np.mean(ztrk) + 6.0 * np.std(ztrk) # Select region xmin = int(xmid - 100) xmax = int(xmid + 100) ymin = int(ymid - 100) ymax = int(ymid + 100) if xmin < 0: xmin = 0 if ymin < 0: ymin = 0 if xmax > ff.nx: xmax = ff.nx - 1 if ymax > ff.ny: ymax = ff.ny - 1 # Find peak x0, y0, w, sigma = peakfind(ztrk[ymin:ymax, xmin:xmax]) x0 += xmin y0 += ymin # Skip if peak is not significant if sigma < trksig: store_not_seen(ident, fname, results_path) continue # Skip if point is outside selection area if inside_selection(ident, tmid, x0, y0) is False: store_not_seen(ident, fname, results_path) continue # Format IOD line cospar = get_cospar(ident.norad, ff.nfd) obs = observation(ff, mjd, x0, y0) iod_line = "%s" % format_iod_line(ident.norad, cospar, ff.site_id, obs.nfd, obs.ra, obs.de) # Create diagnostic plot pngfile = fname.replace(".fits", "_%05d.png" % ident.norad) plot_header(pngfile + "/png", ff, iod_line) ppg.pgimag(ztrk, ff.nx, ff.ny, 0, ff.nx - 1, 0, ff.ny - 1, vmax, vmin, tr) ppg.pgbox("BCTSNI", 0., 0, "BCTSNI", 0., 0) ppg.pgstbg(1) plot_selection(ident, xmid, ymid) ppg.pgsci(0) if ident.catalog.find("classfd.tle") > 0: ppg.pgsci(4) elif ident.catalog.find("inttles.tle") > 0: ppg.pgsci(3) ppg.pgpt(np.array([ident.x0]), np.array([ident.y0]), 17) ppg.pgmove(ident.x0, ident.y0) ppg.pgdraw(ident.x1, ident.y1) ppg.pgpt(np.array([x0]), np.array([y0]), 4) ppg.pgsch(0.65) ppg.pgtext(np.array([ident.x0]), np.array([ident.y0]), " %05d" % ident.norad) ppg.pgsch(1.0) ppg.pgsci(1) ppg.pgend() # Store results store_results(ident, fname, results_path, iod_line)
def drawLine(self, xLo, yLo, xHi, yHi): if not self.plotDeviceIsOpened: raise ValueError("You have not yet opened a PGPLOT device.") pgplot.pgmove(xLo, yLo) pgplot.pgdraw(xHi, yHi)
def extract_tracks(fname, trkrmin, drdtmin, trksig, ntrkmin): # Read four frame ff = fourframe(fname) # Skip saturated frames if np.sum(ff.zavg > 240.0) / float(ff.nx * ff.ny) > 0.95: return # Read satelite IDs try: f = open(fname + ".id") except OSError: print("Cannot open", fname + ".id") else: lines = f.readlines() f.close() # ppgplot arrays tr = np.array([-0.5, 1.0, 0.0, -0.5, 0.0, 1.0]) heat_l = np.array([0.0, 0.2, 0.4, 0.6, 1.0]) heat_r = np.array([0.0, 0.5, 1.0, 1.0, 1.0]) heat_g = np.array([0.0, 0.0, 0.5, 1.0, 1.0]) heat_b = np.array([0.0, 0.0, 0.0, 0.3, 1.0]) # Loop over identifications for line in lines: # Decode id = satid(line) # Skip slow moving objects drdt = np.sqrt(id.dxdt**2 + id.dydt**2) if drdt < drdtmin: continue # Extract significant pixels x, y, t, sig = ff.significant(trksig, id.x0, id.y0, id.dxdt, id.dydt, trkrmin) # Fit tracks if len(t) > ntrkmin: # Get times tmin = np.min(t) tmax = np.max(t) tmid = 0.5 * (tmax + tmin) mjd = ff.mjd + tmid / 86400.0 # Skip if no variance in time if np.std(t - tmid) == 0.0: continue # Very simple polynomial fit; no weighting, no cleaning px = np.polyfit(t - tmid, x, 1) py = np.polyfit(t - tmid, y, 1) # Extract results x0, y0 = px[1], py[1] dxdt, dydt = px[0], py[0] xmin = x0 + dxdt * (tmin - tmid) ymin = y0 + dydt * (tmin - tmid) xmax = x0 + dxdt * (tmax - tmid) ymax = y0 + dydt * (tmax - tmid) cospar = get_cospar(id.norad) obs = observation(ff, mjd, x0, y0) iod_line = "%s" % format_iod_line(id.norad, cospar, ff.site_id, obs.nfd, obs.ra, obs.de) print(iod_line) if id.catalog.find("classfd.tle") > 0: outfname = "classfd.dat" elif id.catalog.find("inttles.tle") > 0: outfname = "inttles.dat" else: outfname = "catalog.dat" f = open(outfname, "a") f.write("%s\n" % iod_line) f.close() # Plot ppgplot.pgopen( fname.replace(".fits", "") + "_%05d.png/png" % id.norad) #ppgplot.pgopen("/xs") ppgplot.pgpap(0.0, 1.0) ppgplot.pgsvp(0.1, 0.95, 0.1, 0.8) ppgplot.pgsch(0.8) ppgplot.pgmtxt( "T", 6.0, 0.0, 0.0, "UT Date: %.23s COSPAR ID: %04d" % (ff.nfd, ff.site_id)) if (3600.0 * ff.crres[0] < 1e-3 ) | (3600.0 * ff.crres[1] < 1e-3) | ( ff.crres[0] / ff.sx > 2.0) | (ff.crres[1] / ff.sy > 2.0): ppgplot.pgsci(2) else: ppgplot.pgsci(1) ppgplot.pgmtxt( "T", 4.8, 0.0, 0.0, "R.A.: %10.5f (%4.1f'') Decl.: %10.5f (%4.1f'')" % (ff.crval[0], 3600.0 * ff.crres[0], ff.crval[1], 3600.0 * ff.crres[1])) ppgplot.pgsci(1) ppgplot.pgmtxt( "T", 3.6, 0.0, 0.0, "FoV: %.2f\\(2218)x%.2f\\(2218) Scale: %.2f''x%.2f'' pix\\u-1\\d" % (ff.wx, ff.wy, 3600.0 * ff.sx, 3600.0 * ff.sy)) ppgplot.pgmtxt( "T", 2.4, 0.0, 0.0, "Stat: %5.1f+-%.1f (%.1f-%.1f)" % (np.mean(ff.zmax), np.std(ff.zmax), ff.vmin, ff.vmax)) ppgplot.pgmtxt("T", 0.3, 0.0, 0.0, iod_line) ppgplot.pgsch(1.0) ppgplot.pgwnad(0.0, ff.nx, 0.0, ff.ny) ppgplot.pglab("x (pix)", "y (pix)", " ") ppgplot.pgctab(heat_l, heat_r, heat_g, heat_b, 5, 1.0, 0.5) ppgplot.pgimag(ff.zmax, ff.nx, ff.ny, 0, ff.nx - 1, 0, ff.ny - 1, ff.vmax, ff.vmin, tr) ppgplot.pgbox("BCTSNI", 0., 0, "BCTSNI", 0., 0) ppgplot.pgstbg(1) ppgplot.pgsci(0) if id.catalog.find("classfd.tle") > 0: ppgplot.pgsci(4) elif id.catalog.find("inttles.tle") > 0: ppgplot.pgsci(3) ppgplot.pgpt(np.array([x0]), np.array([y0]), 4) ppgplot.pgmove(xmin, ymin) ppgplot.pgdraw(xmax, ymax) ppgplot.pgsch(0.65) ppgplot.pgtext(np.array([x0]), np.array([y0]), " %05d" % id.norad) ppgplot.pgsch(1.0) ppgplot.pgsci(1) ppgplot.pgend() elif id.catalog.find("classfd.tle") > 0: # Track and stack t = np.linspace(0.0, ff.texp) x, y = id.x0 + id.dxdt * t, id.y0 + id.dydt * t c = (x > 0) & (x < ff.nx) & (y > 0) & (y < ff.ny) # Skip if no points selected if np.sum(c) == 0: continue # Compute track tmid = np.mean(t[c]) mjd = ff.mjd + tmid / 86400.0 xmid = id.x0 + id.dxdt * tmid ymid = id.y0 + id.dydt * tmid ztrk = ndimage.gaussian_filter(ff.track(id.dxdt, id.dydt, tmid), 1.0) vmin = np.mean(ztrk) - 2.0 * np.std(ztrk) vmax = np.mean(ztrk) + 6.0 * np.std(ztrk) # Select region xmin = int(xmid - 100) xmax = int(xmid + 100) ymin = int(ymid - 100) ymax = int(ymid + 100) if xmin < 0: xmin = 0 if ymin < 0: ymin = 0 if xmax > ff.nx: xmax = ff.nx - 1 if ymax > ff.ny: ymax = ff.ny - 1 # Find peak x0, y0, w, sigma = peakfind(ztrk[ymin:ymax, xmin:xmax]) x0 += xmin y0 += ymin # Skip if peak is not significant if sigma < trksig: continue # Skip if point is outside selection area if inside_selection(id, xmid, ymid, x0, y0) == False: continue # Format IOD line cospar = get_cospar(id.norad) obs = observation(ff, mjd, x0, y0) iod_line = "%s" % format_iod_line(id.norad, cospar, ff.site_id, obs.nfd, obs.ra, obs.de) print(iod_line) if id.catalog.find("classfd.tle") > 0: outfname = "classfd.dat" elif id.catalog.find("inttles.tle") > 0: outfname = "inttles.dat" else: outfname = "catalog.dat" f = open(outfname, "a") f.write("%s\n" % iod_line) f.close() # Plot ppgplot.pgopen( fname.replace(".fits", "") + "_%05d.png/png" % id.norad) ppgplot.pgpap(0.0, 1.0) ppgplot.pgsvp(0.1, 0.95, 0.1, 0.8) ppgplot.pgsch(0.8) ppgplot.pgmtxt( "T", 6.0, 0.0, 0.0, "UT Date: %.23s COSPAR ID: %04d" % (ff.nfd, ff.site_id)) ppgplot.pgmtxt( "T", 4.8, 0.0, 0.0, "R.A.: %10.5f (%4.1f'') Decl.: %10.5f (%4.1f'')" % (ff.crval[0], 3600.0 * ff.crres[0], ff.crval[1], 3600.0 * ff.crres[1])) ppgplot.pgmtxt( "T", 3.6, 0.0, 0.0, "FoV: %.2f\\(2218)x%.2f\\(2218) Scale: %.2f''x%.2f'' pix\\u-1\\d" % (ff.wx, ff.wy, 3600.0 * ff.sx, 3600.0 * ff.sy)) ppgplot.pgmtxt( "T", 2.4, 0.0, 0.0, "Stat: %5.1f+-%.1f (%.1f-%.1f)" % (np.mean(ff.zmax), np.std(ff.zmax), ff.vmin, ff.vmax)) ppgplot.pgmtxt("T", 0.3, 0.0, 0.0, iod_line) ppgplot.pgsch(1.0) ppgplot.pgwnad(0.0, ff.nx, 0.0, ff.ny) ppgplot.pglab("x (pix)", "y (pix)", " ") ppgplot.pgctab(heat_l, heat_r, heat_g, heat_b, 5, 1.0, 0.5) ppgplot.pgimag(ztrk, ff.nx, ff.ny, 0, ff.nx - 1, 0, ff.ny - 1, vmax, vmin, tr) ppgplot.pgbox("BCTSNI", 0., 0, "BCTSNI", 0., 0) ppgplot.pgstbg(1) plot_selection(id, xmid, ymid) ppgplot.pgsci(0) if id.catalog.find("classfd.tle") > 0: ppgplot.pgsci(4) elif id.catalog.find("inttles.tle") > 0: ppgplot.pgsci(3) ppgplot.pgpt(np.array([id.x0]), np.array([id.y0]), 17) ppgplot.pgmove(id.x0, id.y0) ppgplot.pgdraw(id.x1, id.y1) ppgplot.pgpt(np.array([x0]), np.array([y0]), 4) ppgplot.pgsch(0.65) ppgplot.pgtext(np.array([id.x0]), np.array([id.y0]), " %05d" % id.norad) ppgplot.pgsch(1.0) ppgplot.pgsci(1) ppgplot.pgend()