def test_relative_detector_arrival_times(self, mock_detector_ids, mock_detector_arrival_times): mock_detector_ids.return_value = range(4) mock_detector_arrival_times.return_value = [7.5, 5., 2.5, 5.] event_dict = {'t_trigger': 10, 'ext_timestamp': 1000} event = MagicMock() event.__getitem__.side_effect = lambda name: event_dict[name] ref_ets = 500 rel_arrival_time = event_dict['ext_timestamp'] - ref_ets - event_dict[ 't_trigger'] self.assertEqual( event_utils.relative_detector_arrival_times( event, 500, range(4), sentinel.offsets, sentinel.station), [rel_arrival_time + t for t in mock_detector_arrival_times()]) self.assertEqual(mock_detector_ids.call_count, 0) self.assertEqual( event_utils.relative_detector_arrival_times( event, 500, None, sentinel.offsets), [rel_arrival_time + t for t in mock_detector_arrival_times()]) mock_detector_ids.assert_called_once_with(None, event) self.assertEqual( event_utils.relative_detector_arrival_times( event, 500, None, sentinel.offsets, sentinel.station), [rel_arrival_time + t for t in mock_detector_arrival_times()]) mock_detector_ids.assert_called_with(sentinel.station, event)
def test_relative_detector_arrival_times(self, mock_detector_ids, mock_detector_arrival_times): mock_detector_ids.return_value = range(4) mock_detector_arrival_times.return_value = [7.5, 5., 2.5, 5.] event_dict = {'t_trigger': 10, 'ext_timestamp': 1000} event = MagicMock() event.__getitem__.side_effect = lambda name: event_dict[name] ref_ets = 500 rel_arrival_time = event_dict['ext_timestamp'] - ref_ets - event_dict['t_trigger'] self.assertEqual(event_utils.relative_detector_arrival_times(event, 500, range(4), sentinel.offsets, sentinel.station), [rel_arrival_time + t for t in mock_detector_arrival_times()]) self.assertEqual(mock_detector_ids.call_count, 0) self.assertEqual(event_utils.relative_detector_arrival_times(event, 500, None, sentinel.offsets), [rel_arrival_time + t for t in mock_detector_arrival_times()]) mock_detector_ids.assert_called_once_with(None, event) self.assertEqual(event_utils.relative_detector_arrival_times(event, 500, None, sentinel.offsets, sentinel.station), [rel_arrival_time + t for t in mock_detector_arrival_times()]) mock_detector_ids.assert_called_with(sentinel.station, event)
def test_nan_relative_detector_arrival_times(self, mock_detector_ids, mock_detector_arrival_times): mock_detector_ids.return_value = range(4) mock_detector_arrival_times.return_value = [7.5, 5., 5., nan] event_dict = {'t_trigger': 10, 'ext_timestamp': 1000} event = MagicMock() event.__getitem__.side_effect = lambda name: event_dict[name] ref_ets = 500 rel_arrival_time = event_dict['ext_timestamp'] - ref_ets - event_dict['t_trigger'] result = event_utils.relative_detector_arrival_times(event, 500, None, sentinel.offsets, sentinel.station) self.assertEqual(result[:-1], [rel_arrival_time + t for t in mock_detector_arrival_times()[:-1]]) self.assertTrue(isnan(result[-1])) event_dict['t_trigger'] = -999 self.assertTrue(isnan(event_utils.relative_detector_arrival_times(event, 500, None, sentinel.offsets, sentinel.station)).all()) event_dict['t_trigger'] = nan self.assertTrue(isnan(event_utils.relative_detector_arrival_times(event, 500, None, sentinel.offsets, sentinel.station)).all()) event_dict['t_trigger'] = 10 mock_detector_arrival_times.return_value = [nan, nan, nan, nan] self.assertTrue(isnan(event_utils.relative_detector_arrival_times(event, 500, None, sentinel.offsets, sentinel.station)).all())
def test_nan_relative_detector_arrival_times(self, mock_detector_ids, mock_detector_arrival_times): mock_detector_ids.return_value = range(4) mock_detector_arrival_times.return_value = [7.5, 5., 5., nan] event_dict = {'t_trigger': 10, 'ext_timestamp': 1000} event = MagicMock() event.__getitem__.side_effect = lambda name: event_dict[name] ref_ets = 500 rel_arrival_time = event_dict['ext_timestamp'] - ref_ets - event_dict[ 't_trigger'] result = event_utils.relative_detector_arrival_times( event, 500, None, sentinel.offsets, sentinel.station) self.assertEqual( result[:-1], [rel_arrival_time + t for t in mock_detector_arrival_times()[:-1]]) self.assertTrue(isnan(result[-1])) event_dict['t_trigger'] = -999 self.assertTrue( isnan( event_utils.relative_detector_arrival_times( event, 500, None, sentinel.offsets, sentinel.station)).all()) event_dict['t_trigger'] = nan self.assertTrue( isnan( event_utils.relative_detector_arrival_times( event, 500, None, sentinel.offsets, sentinel.station)).all()) event_dict['t_trigger'] = 10 mock_detector_arrival_times.return_value = [nan, nan, nan, nan] self.assertTrue( isnan( event_utils.relative_detector_arrival_times( event, 500, None, sentinel.offsets, sentinel.station)).all())
cq.events_from_stations([coincidence], STATIONS)) reconstruction = cq._get_reconstruction(coincidence) core_x = reconstruction['x'] core_y = reconstruction['y'] plot = Plot() ref_extts = coincidence_events[0][1]['ext_timestamp'] distances = arange(1, 370, 1) times = (2.43 * (1 + distances / 30.)**1.55) + 20 plot.plot(distances, times, mark=None) for station_number, event in coincidence_events: station = CLUSTER.get_station(station_number) offsets = OFFSETS[station_number] t = relative_detector_arrival_times(event, ref_extts, offsets=offsets) core_distances = [] for d in station.detectors: x, y = d.get_xy_coordinates() core_distances.append(distance_between(core_x, core_y, x, y)) plot.scatter(core_distances, t, mark='*', markstyle=COLORS[station_number]) plot.set_ylabel('Relative arrival time [ns]') plot.set_xlabel('Distance from core [m]') plot.save_as_pdf('relative_arrival_times')
def plot_distance_vs_delay(data): colors = { 501: 'black', 502: 'red!80!black', 503: 'blue!80!black', 504: 'green!80!black', 505: 'orange!80!black', 506: 'pink!80!black', 508: 'blue!40!black', 509: 'red!40!black', 510: 'green!40!black', 511: 'orange!40!black' } cq = CoincidenceQuery(data) cq.reconstructions = cq.data.get_node('/coincidences', 'recs_curved') cq.reconstructed = True cluster = data.root.coincidences._v_attrs['cluster'] offsets = { s.number: [d.offset + s.gps_offset for d in s.detectors] for s in cluster.stations } front = CorsikaStationFront() front_r = np.arange(500) front_t = front.delay_at_r(front_r) for i, coincidence in enumerate(cq.coincidences.read_where('N > 6')): if i > 50: break coincidence_events = next(cq.all_events([coincidence])) reconstruction = cq._get_reconstruction(coincidence) core_x = coincidence['x'] core_y = coincidence['y'] plot = MultiPlot(2, 1) splot = plot.get_subplot_at(0, 0) rplot = plot.get_subplot_at(1, 0) splot.plot(front_r, front_t, mark=None) ref_extts = coincidence_events[0][1]['ext_timestamp'] front_detect_r = [] front_detect_t = [] for station_number, event in coincidence_events: station = cluster.get_station(station_number) t = event_utils.relative_detector_arrival_times( event, ref_extts, offsets=offsets[station_number], detector_ids=DETECTOR_IDS) core_distances = [] for i, d in enumerate(station.detectors): x, y, z = d.get_coordinates() core_distances.append(distance_between(core_x, core_y, x, y)) t += d.get_coordinates()[-1] / c splot.scatter(core_distances, t, mark='o', markstyle=colors[station_number]) splot.scatter([np.mean(core_distances)], [np.nanmin(t)], mark='*', markstyle=colors[station_number]) rplot.scatter( [np.mean(core_distances)], [np.nanmin(t) - front.delay_at_r(np.mean(core_distances))], mark='*', markstyle=colors[station_number]) splot.set_ylabel('Relative arrival time [ns]') rplot.set_ylabel(r'Residuals') rplot.set_axis_options(r'height=0.25\textwidth') splot.set_ylimits(-10, 150) plot.set_xlimits_for_all(None, 0, 400) plot.set_xlabel('Distance from core [m]') plot.show_xticklabels(1, 0) plot.show_yticklabels_for_all() plot.save_as_pdf('front_shape/distance_v_time_%d_core' % coincidence['id'])
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 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))