Esempio n. 1
0
    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)
Esempio n. 2
0
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
Esempio n. 3
0
    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)
Esempio n. 4
0
    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)
Esempio n. 5
0
    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)
Esempio n. 6
0
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))