def plot_offset_timeline(ref_station, station): ref_s = Station(ref_station) s = Station(station) # ref_gps = ref_s.gps_locations # ref_voltages = ref_s.voltages # ref_n = get_n_events(ref_station) # gps = s.gps_locations # voltages = s.voltages # n = get_n_events(station) # Determine offsets for first day of each month # d_off = s.detector_timing_offsets s_off = get_station_offsets(ref_station, station) graph = Plot(width=r'.6\textwidth') # graph.scatter(ref_gps['timestamp'], [95] * len(ref_gps), mark='square', markstyle='purple,mark size=.5pt') # graph.scatter(ref_voltages['timestamp'], [90] * len(ref_voltages), mark='triangle', markstyle='purple,mark size=.5pt') # graph.scatter(gps['timestamp'], [85] * len(gps), mark='square', markstyle='gray,mark size=.5pt') # graph.scatter(voltages['timestamp'], [80] * len(voltages), mark='triangle', markstyle='gray,mark size=.5pt') # graph.shade_region(n['timestamp'], -ref_n['n'] / 1000, n['n'] / 1000, color='lightgray,const plot') # graph.plot(d_off['timestamp'], d_off['d0'], markstyle='mark size=.5pt') # graph.plot(d_off['timestamp'], d_off['d2'], markstyle='mark size=.5pt', linestyle='green') # graph.plot(d_off['timestamp'], d_off['d3'], markstyle='mark size=.5pt', linestyle='blue') graph.plot(s_off['timestamp'], s_off['offset'], mark='*', markstyle='mark size=1.25pt', linestyle=None) graph.set_ylabel('$\Delta t$ [ns]') graph.set_xlabel('Date') graph.set_xticks( [datetime_to_gps(date(y, 1, 1)) for y in range(2010, 2016)]) graph.set_xtick_labels(['%d' % y for y in range(2010, 2016)]) graph.set_xlimits(1.25e9, 1.45e9) graph.set_ylimits(-150, 150) graph.save_as_pdf('plots/offsets/offsets_ref%d_%d' % (ref_station, station))
def plot_min_max(variable_pairs): plot = Plot() variable_pairs = sorted(variable_pairs) for i, minmax_d in enumerate(variable_pairs): plot.plot([i, i], minmax_d, mark=None) plot.set_xlabel('Station pair') plot.set_xtick_labels([' ']) plot.set_ylabel(r'Distance between stations [\si{\meter}]') plot.save_as_pdf('min_max_distances')
def make_map(station=None, label='map', detectors=False): get_locations = (get_detector_locations if detectors else get_station_locations) latitudes, longitudes = get_locations(station) bounds = (min(latitudes), min(longitudes), max(latitudes), max(longitudes)) map = Map(bounds, margin=0, z=18) image = map.to_pil() map_w, map_h = image.size xmin, ymin = map.to_pixels(map.box[:2]) xmax, ymax = map.to_pixels(map.box[2:]) aspect = abs(xmax - xmin) / abs(ymax - ymin) width = 0.67 height = width / aspect plot = Plot(width=r'%.2f\linewidth' % width, height=r'%.2f\linewidth' % height) plot.draw_image(image, 0, 0, map_w, map_h) plot.set_axis_equal() plot.set_xlimits(xmin, xmax) plot.set_ylimits(map_h - ymin, map_h - ymax) x, y = map.to_pixels(array(latitudes), array(longitudes)) marks = cycle(['o'] * 4 + ['triangle'] * 4 + ['*'] * 4) colors = cycle(['black', 'red', 'green', 'blue']) if detectors: for xi, yi in zip(x, y): plot.scatter([xi], [map_h - yi], markstyle="%s, thick" % colors.next(), mark=marks.next()) else: plot.scatter(x, map_h - y, markstyle="black!50!green") plot.set_xlabel('Longitude [$^\circ$]') plot.set_xticks([xmin, xmax]) plot.set_xtick_labels(['%.4f' % x for x in (map.box[1], map.box[3])]) plot.set_ylabel('Latitude [$^\circ$]') plot.set_yticks([map_h - ymin, map_h - ymax]) plot.set_ytick_labels(['%.4f' % x for x in (map.box[0], map.box[2])]) # plot.set_title(label) # save plot to file plot.save_as_pdf(label.replace(' ', '-'))
def make_logo(): size = '.02\linewidth' x = arange(0, 2*pi, .01) y = sin(x) plot = Plot(width=size, height=size) plot.set_ylimits(-1.3, 1.3) plot.set_yticks([-1, 0, 1]) plot.set_ytick_labels(['', '', '']) plot.set_xticks([0, pi, 2*pi]) plot.set_xtick_labels(['', '', '']) plot.plot(x, y, mark=None, linestyle='thick') plot.set_axis_options("axis line style=thick, major tick length=.04cm") plot.save_as_pdf('logo')
def plot_luminosity(timestamp, aligned_data, aligned_data_all, i): n_active_aligned = (aligned_data != 0).sum(axis=0) cumsummed_data_all = aligned_data_all.sum(axis=0).cumsum() summed_data = aligned_data.sum(axis=0) cumsummed_data = summed_data.cumsum() plot = Plot(width=r'.5\textwidth') # plot.plot([t / 1e9 for t in timestamp[::100]], cumsummed_data_all[::100], # linestyle='black!50!green, thick', mark=None) plot.plot([t / 1e9 for t in timestamp[::100]], cumsummed_data[::100], linestyle='thick', mark=None) plot.set_xticks([datetime_to_gps(date(y, 1, 1)) / 1e9 for y in YEARS[::3]]) plot.set_xtick_labels(['%d' % y for y in YEARS[::3]]) plot.set_ylabel('Cummulative number of events') plot.set_xlabel('Date') plot.save_as_pdf('luminosity_%s' % ['network', 'spa'][i])
def main(): stations = np.genfromtxt("data/cluster-utrecht-stations.txt", names=["x", "y"]) image = Image.open("data/cluster-utrecht-background.png") graph = Plot(width=r".75\linewidth", height=r".5\linewidth") graph.scatter(stations["x"], stations["y"]) graph.draw_image(image) graph.set_axis_equal() nw = ["%.4f" % i for i in (52.10650519075632, 5.053710938)] se = ["%.4f" % i for i in (52.05249047600099, 5.185546875)] graph.set_xlabel("Longitude [$^\circ$]") graph.set_xticks([0, image.size[0]]) graph.set_xtick_labels([nw[1], se[1]]) graph.set_ylabel("Latitude [$^\circ$]") graph.set_yticks([0, image.size[1]]) graph.set_ytick_labels([se[0], nw[0]]) graph.save("utrecht")
def plot_histogram(data, timestamps, station_numbers): """Make a 2D histogram plot of the number of events over time per station :param data: list of lists, with the number of events. :param station_numbers: list of station numbers in the data list. """ plot = Plot(width=r'\linewidth', height=r'1.3\linewidth') plot.histogram2d(data.T[::7][1:], timestamps[::7] / 1e9, np.arange(len(station_numbers) + 1), type='reverse_bw', bitmap=True) plot.set_label( gps_to_datetime(timestamps[-1]).date().isoformat(), 'upper left') plot.set_xlimits(min=YEARS_TICKS[0] / 1e9, max=timestamps[-1] / 1e9) plot.set_xticks(YEARS_TICKS / 1e9) plot.set_xtick_labels(YEARS_LABELS) plot.set_yticks(np.arange(0.5, len(station_numbers) + 0.5)) plot.set_ytick_labels(['%d' % s for s in sorted(station_numbers)], style=r'font=\sffamily\tiny') plot.set_axis_options('ytick pos=right') plot.save_as_pdf('eventtime_histogram_network_hour')
def display_coincidences(cluster, coincidence_events, coincidence, reconstruction, map): offsets = { s.number: [d.offset + s.gps_offset for d in s.detectors] for s in cluster.stations } ts0 = coincidence_events[0][1]['ext_timestamp'] latitudes = [] longitudes = [] t = [] p = [] for station_number, event in coincidence_events: station = cluster.get_station(station_number) for detector in station.detectors: latitude, longitude, _ = detector.get_lla_coordinates() latitudes.append(latitude) longitudes.append(longitude) t.extend( event_utils.relative_detector_arrival_times( event, ts0, DETECTOR_IDS, offsets=offsets[station_number])) p.extend(event_utils.detector_densities(event, DETECTOR_IDS)) image = map.to_pil() map_w, map_h = image.size aspect = float(map_w) / float(map_h) width = 0.67 height = width / aspect plot = Plot(width=r'%.2f\linewidth' % width, height=r'%.2f\linewidth' % height) plot.draw_image(image, 0, 0, map_w, map_h) x, y = map.to_pixels(np.array(latitudes), np.array(longitudes)) mint = np.nanmin(t) xx = [] yy = [] tt = [] pp = [] for xv, yv, tv, pv in zip(x, y, t, p): if np.isnan(tv) or np.isnan(pv): plot.scatter([xv], [map_h - yv], mark='diamond') else: xx.append(xv) yy.append(map_h - yv) tt.append(tv - mint) pp.append(pv) plot.scatter_table(xx, yy, tt, pp) transform = geographic.FromWGS84ToENUTransformation(cluster.lla) # Plot reconstructed core dx = np.cos(reconstruction['azimuth']) dy = np.sin(reconstruction['azimuth']) direction_length = reconstruction['zenith'] * 300 core_x = reconstruction['x'] core_y = reconstruction['y'] core_lat, core_lon, _ = transform.enu_to_lla((core_x, core_y, 0)) core_x, core_y = map.to_pixels(core_lat, core_lon) plot.scatter([core_x], [image.size[1] - core_y], mark='10-pointed star', markstyle='red') plot.plot([core_x, core_x + direction_length * dx], [ image.size[1] - core_y, image.size[1] - (core_y - direction_length * dy) ], mark=None) # Plot simulated core dx = np.cos(reconstruction['reference_azimuth']) dy = np.sin(reconstruction['reference_azimuth']) direction_length = reconstruction['reference_zenith'] * 300 core_x = reconstruction['reference_x'] core_y = reconstruction['reference_y'] core_lat, core_lon, _ = transform.enu_to_lla((core_x, core_y, 0)) core_x, core_y = map.to_pixels(core_lat, core_lon) plot.scatter([core_x], [image.size[1] - core_y], mark='asterisk', markstyle='orange') plot.plot([core_x, core_x + direction_length * dx], [ image.size[1] - core_y, image.size[1] - (core_y - direction_length * dy) ], mark=None) plot.set_scalebar(location="lower left") plot.set_slimits(min=1, max=30) plot.set_colorbar('$\Delta$t [\si{n\second}]') plot.set_axis_equal() plot.set_colormap('viridis') nw = num2deg(map.xmin, map.ymin, map.z) se = num2deg(map.xmin + map_w / TILE_SIZE, map.ymin + map_h / TILE_SIZE, map.z) x0, y0, _ = transform.lla_to_enu((nw[0], nw[1], 0)) x1, y1, _ = transform.lla_to_enu((se[0], se[1], 0)) plot.set_xlabel('x [\si{\meter}]') plot.set_xticks([0, map_w]) plot.set_xtick_labels([int(x0), int(x1)]) plot.set_ylabel('y [\si{\meter}]') plot.set_yticks([0, map_h]) plot.set_ytick_labels([int(y1), int(y0)]) plot.save_as_pdf('map/event_display_%d' % coincidence['id'])
def make_map(country=None, cluster=None, subcluster=None, station=None, stations=None, label='map', detectors=False, weather=False, knmi=False): get_locations = (get_detector_locations if detectors else get_station_locations) if (country is None and cluster is None and subcluster is None and station is None and stations is None): latitudes, longitudes = ([], []) else: latitudes, longitudes = get_locations(country, cluster, subcluster, station, stations) if weather: weather_latitudes, weather_longitudes = get_weather_locations() else: weather_latitudes, weather_longitudes = ([], []) if knmi: knmi_latitudes, knmi_longitudes = get_knmi_locations() else: knmi_latitudes, knmi_longitudes = ([], []) bounds = (min(latitudes + weather_latitudes + knmi_latitudes), min(longitudes + weather_longitudes + knmi_longitudes), max(latitudes + weather_latitudes + knmi_latitudes), max(longitudes + weather_longitudes + knmi_longitudes)) map = Map(bounds, margin=.1) # map.save_png('map-tiles-background.png') image = map.to_pil() map_w, map_h = image.size xmin, ymin = map.to_pixels(map.box[:2]) xmax, ymax = map.to_pixels(map.box[2:]) aspect = abs(xmax - xmin) / abs(ymax - ymin) width = 0.67 height = width / aspect plot = Plot(width=r'%.2f\linewidth' % width, height=r'%.2f\linewidth' % height) plot.draw_image(image, 0, 0, map_w, map_h) plot.set_axis_equal() plot.set_xlimits(xmin, xmax) plot.set_ylimits(map_h - ymin, map_h - ymax) if knmi: x, y = map.to_pixels(array(knmi_latitudes), array(knmi_longitudes)) plot.scatter( x, map_h - y, mark='square', markstyle="mark size=0.5pt, black!50!blue, thick, opacity=0.6") x, y = map.to_pixels(array(latitudes), array(longitudes)) if detectors: mark_size = 1.5 else: mark_size = 3 plot.scatter(x, map_h - y, markstyle="mark size=%fpt, black!50!green, " "thick, opacity=0.9" % mark_size) if weather: x, y = map.to_pixels(array(weather_latitudes), array(weather_longitudes)) plot.scatter( x, map_h - y, markstyle="mark size=1.5pt, black!30!red, thick, opacity=0.9") plot.set_xlabel('Longitude [$^\circ$]') plot.set_xticks([xmin, xmax]) plot.set_xtick_labels(['%.4f' % x for x in (map.box[1], map.box[3])]) plot.set_ylabel('Latitude [$^\circ$]') plot.set_yticks([map_h - ymin, map_h - ymax]) plot.set_ytick_labels(['%.4f' % x for x in (map.box[0], map.box[2])]) # plot.set_title(label) # save plot to file plot.save_as_pdf(label.replace(' ', '-'))
def display_coincidences(coincidence_events, c_id, map): cluster = CLUSTER ts0 = coincidence_events[0][1]['ext_timestamp'] latitudes = [] longitudes = [] t = [] p = [] for station_number, event in coincidence_events: station = cluster.get_station(station_number) for detector in station.detectors: latitude, longitude, _ = detector.get_lla_coordinates() latitudes.append(latitude) longitudes.append(longitude) t.extend( event_utils.relative_detector_arrival_times( event, ts0, DETECTOR_IDS)) p.extend(event_utils.detector_densities(event, DETECTOR_IDS)) image = map.to_pil() map_w, map_h = image.size aspect = float(map_w) / float(map_h) width = 0.67 height = width / aspect plot = Plot(width=r'%.2f\linewidth' % width, height=r'%.2f\linewidth' % height) plot.draw_image(image, 0, 0, map_w, map_h) x, y = map.to_pixels(array(latitudes), array(longitudes)) mint = nanmin(t) xx = [] yy = [] tt = [] pp = [] for xv, yv, tv, pv in zip(x, y, t, p): if isnan(tv) or isnan(pv): plot.scatter([xv], [map_h - yv], mark='diamond') else: xx.append(xv) yy.append(map_h - yv) tt.append(tv - mint) pp.append(pv) plot.scatter_table(xx, yy, tt, pp) transform = geographic.FromWGS84ToENUTransformation(cluster.lla) plot.set_scalebar(location="lower left") plot.set_slimits(min=1, max=60) plot.set_colorbar('$\Delta$t [\si{n\second}]') plot.set_axis_equal() nw = num2deg(map.xmin, map.ymin, map.z) se = num2deg(map.xmin + map_w / TILE_SIZE, map.ymin + map_h / TILE_SIZE, map.z) x0, y0, _ = transform.lla_to_enu((nw[0], nw[1], 0)) x1, y1, _ = transform.lla_to_enu((se[0], se[1], 0)) plot.set_xlabel('x [\si{\meter}]') plot.set_xticks([0, map_w]) plot.set_xtick_labels([int(x0), int(x1)]) plot.set_ylabel('y [\si{\meter}]') plot.set_yticks([0, map_h]) plot.set_ytick_labels([int(y1), int(y0)]) # plot.set_xlimits(min=-250, max=350) # plot.set_ylimits(min=-250, max=250) # plot.set_xlabel('x [\si{\meter}]') # plot.set_ylabel('y [\si{\meter}]') plot.save_as_pdf('coincidences/event_display_%d_%d' % (c_id, ts0))
def plot_active_stations(timestamps, stations, aligned_data, data, i): first_ts = [] last_ts = [] stations_with_data = [] assert aligned_data.shape[0] == len(stations) for n in range(aligned_data.shape[0]): prev_ts = 0 for ts, has_data in zip(timestamps, aligned_data[n]): if has_data: if prev_ts > 30: # Running for at least 30 hours. first_ts.append(ts) stations_with_data.append(stations[n]) break else: prev_ts += 1 else: prev_ts = 0 for station in stations_with_data: end_ts = get_station_end_timestamp(station, data) if end_ts is not None: last_ts.append(end_ts) first_ts = sorted(first_ts) last_ts = sorted(last_ts) diff_stations = array([1] * len(first_ts) + [-1] * len(last_ts)) idx = argsort(first_ts + last_ts) n_stations = diff_stations[idx].cumsum() # Get maximinum number of simultaneaously active stations per 7 days n_active_aligned = (aligned_data != 0).sum(axis=0) n_binned, t_binned, _ = binned_statistic(timestamps, n_active_aligned, npmax, bins=len(timestamps) / (7 * 24)) # Get average number of detected events per 7 days # todo; scale 2/4 detector stations summed_data = aligned_data.sum(axis=0) e_binned, t_binned, _ = binned_statistic(timestamps, summed_data, average, bins=len(timestamps) / (7 * 24)) plot = Plot(width=r'.5\textwidth') plot.plot([t / 1e9 for t in sorted(first_ts + last_ts)], n_stations, linestyle='gray, thick', mark=None, use_steps=True) plot.histogram(n_binned, t_binned / 1e9, linestyle='thick') plot.histogram(e_binned * max(n_binned) / max(e_binned), t_binned / 1e9, linestyle='blue') plot.set_axis_options('line join=round') plot.set_ylabel('Number of stations') plot.set_xlabel('Date') plot.set_ylimits(min=0) plot.set_xticks([datetime_to_gps(date(y, 1, 1)) / 1e9 for y in YEARS[::3]]) plot.set_xtick_labels(['%d' % y for y in YEARS[::3]]) plot.save_as_pdf('active_stations_%s' % ['network', 'spa'][i])