def test_station_arrival_time(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.station_arrival_time(event, ref_ets, range(4), sentinel.offsets, sentinel.station), rel_arrival_time + 2.5) self.assertEqual(mock_detector_ids.call_count, 0) self.assertEqual( event_utils.station_arrival_time(event, ref_ets, None, sentinel.offsets), rel_arrival_time + 2.5) mock_detector_ids.assert_called_once_with(None, event) self.assertEqual( event_utils.station_arrival_time(event, ref_ets, None, sentinel.offsets, sentinel.station), rel_arrival_time + 2.5) mock_detector_ids.assert_called_with(sentinel.station, event)
def determine_time_differences(coin_events, ref_station, station, ref_d_off, d_off): """Determine the arrival time differences between two stations. :param coin_events: coincidence events. :param ref_station,station: station numbers. :param ref_d_off,d_off: `detector_timing_offset` methods of Station objects for the two stations, to retrieve applicable offsets. :return: extended timestamp of the first event and time difference, t - t_ref. Not corrected for altitude differences. """ dt = [] ets = [] for events in coin_events: ref_ets = events[0][1]['ext_timestamp'] ref_ts = ref_ets / int(1e9) # Filter for possibility of same station twice in coincidence if len(events) is not 2: continue if events[0][0] == ref_station: ref_id = 0 id = 1 else: ref_id = 1 id = 0 ref_t = station_arrival_time(events[ref_id][1], ref_ets, [0, 1, 2, 3], ref_d_off(ref_ts)) t = station_arrival_time(events[id][1], ref_ets, [0, 1, 2, 3], d_off(ref_ts)) if isnan(t) or isnan(ref_t): continue dt.append(t - ref_t) ets.append(ref_ets) return ets, dt
def test_station_arrival_time(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.station_arrival_time(event, ref_ets, range(4), sentinel.offsets, sentinel.station), rel_arrival_time + 2.5) self.assertEqual(mock_detector_ids.call_count, 0) self.assertEqual(event_utils.station_arrival_time(event, ref_ets, None, sentinel.offsets), rel_arrival_time + 2.5) mock_detector_ids.assert_called_once_with(None, event) self.assertEqual(event_utils.station_arrival_time(event, ref_ets, None, sentinel.offsets, sentinel.station), rel_arrival_time + 2.5) mock_detector_ids.assert_called_with(sentinel.station, event)
def test_nan_station_arrival_time(self, mock_detector_ids, mock_detector_arrival_times): mock_detector_ids.return_value = range(4) mock_detector_arrival_times.return_value = [7.5, 5., nan, 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.station_arrival_time(event, ref_ets, None, sentinel.offsets, sentinel.station), rel_arrival_time + 5) event_dict['t_trigger'] = -999 self.assertTrue(isnan(event_utils.station_arrival_time(event, ref_ets, None, sentinel.offsets, sentinel.station))) event_dict['t_trigger'] = nan self.assertTrue(isnan(event_utils.station_arrival_time(event, ref_ets, None, sentinel.offsets, sentinel.station))) event_dict['t_trigger'] = 10 mock_detector_arrival_times.return_value = [nan, nan, nan, nan] with warnings.catch_warnings(record=True) as warned: self.assertTrue(isnan(event_utils.station_arrival_time(event, ref_ets, None, sentinel.offsets, sentinel.station))) self.assertEqual(len(warned), 1)
def test_nan_station_arrival_time(self, mock_detector_ids, mock_detector_arrival_times): mock_detector_ids.return_value = range(4) mock_detector_arrival_times.return_value = [7.5, 5., nan, 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.station_arrival_time(event, ref_ets, None, sentinel.offsets, sentinel.station), rel_arrival_time + 5) event_dict['t_trigger'] = -999 self.assertTrue( isnan( event_utils.station_arrival_time(event, ref_ets, None, sentinel.offsets, sentinel.station))) event_dict['t_trigger'] = nan self.assertTrue( isnan( event_utils.station_arrival_time(event, ref_ets, None, sentinel.offsets, sentinel.station))) event_dict['t_trigger'] = 10 mock_detector_arrival_times.return_value = [nan, nan, nan, nan] with warnings.catch_warnings(record=True) as warned: self.assertTrue( isnan( event_utils.station_arrival_time(event, ref_ets, None, sentinel.offsets, sentinel.station))) self.assertEqual(len(warned), 1)
def plot_arrival_time_distribution_v_distance(data, seeds): results = [] cor_t = None for group in data.walk_groups('/'): if (seeds not in group._v_pathname or group._v_name != 'coincidences'): continue coincidences = group.coincidences events = data.get_node(group.s_index[0]).events r = next( int(y[1:]) for y in group._v_pathname.split('/') if y.startswith('r')) seeds = next(y[1:] for y in group._v_pathname.split('/') if y.startswith('s')) if cor_t is None: with tables.open_file(CORSIKA_DATA % seeds) as data: gp = data.root.groundparticles query = '(x < 10) & (x > -10) & (r < 10)' cor_t = gp.read_where(query, field='t').min() # i = get_info(seeds)['first_interaction_altitude'] # cor_t = i / 0.299792458 # Round ts to seconds because it is the ts for first event, not the shower t = [ station_arrival_time( event, int(cets['ext_timestamp'] / int(1e9)) * int(1e9), detector_ids=[0, 1, 2, 3]) - cor_t for event, cets in zip( events[:], coincidences.read_where('N == 1')) ] if not len(t) or len(t) < 10: continue quantiles = [25, 50, 75] qt = percentile(t, q=quantiles) results.append([r] + list(qt) + [100 * events.nrows / float(coincidences.nrows)]) if not len(results): return results = sorted(results) (core_distances, arrival_times_low, arrival_times, arrival_times_high, efficiency) = zip(*results) causal = causal_front(i, core_distances) plot = MultiPlot(2, 1) splot = plot.get_subplot_at(0, 0) plot_shower_profile(seeds, splot, core_distances, cor_t) splot.plot(core_distances, causal, mark=None, linestyle='purple, dashed') splot.plot(core_distances, arrival_times, mark='*') splot.shade_region(core_distances, arrival_times_low, arrival_times_high, color='blue, semitransparent') splot.set_ylabel(r'Arrival time [\si{\ns}]') splot = plot.get_subplot_at(1, 0) splot.plot(core_distances, efficiency) splot.set_ylabel(r'Detection efficiency [\si{\percent}]') splot.set_axis_options(r'height=0.25\textwidth') plot.set_ylimits(0, 0, min=-10, max=210) plot.set_ylimits(1, 0, min=-5, max=105) plot.set_xlimits_for_all(None, 0, 550) plot.set_xlabel(r'Core distance [\si{\meter}]') plot.show_xticklabels(1, 0) plot.show_yticklabels_for_all() plot.save_as_document( '/data/hisparc/adelaat/corsika_accuracy/plots/%s.tex' % get_info_string(seeds))