def __init__(self, timeID, pulseID, alt_loc=None):
        self.data_loc = processed_data_dir(timeID) + '/' + "polarization_data"

        if alt_loc is not None:
            self.data_loc = alt_loc

        #if the directory doesn't exist create it!
        if not isdir(self.data_loc):
            mkdir(self.data_loc)

        if not isdir(self.data_loc + '/' + "Stokes_Vectors"):
            mkdir(self.data_loc + '/' + "Stokes_Vectors")

        if not isdir(self.data_loc + '/' + "Polarization_Ellipse"):
            mkdir(self.data_loc + '/' + "Polarization_Ellipse")

        self.filename_S = "{}.txt".format(pulseID)  #filename for stokesvectors
        self.filename_PE = "{}.txt".format(
            pulseID)  #filename for polarization ellipse data

        #create empty files with header for S and PE for a particular pulse
        with open(self.data_loc + "/Stokes_Vectors/" + self.filename_S,
                  'w') as f:
            f.write("# Station I Q U V Ierr Qerr Uerr Verr\n")

        with open(self.data_loc + "/Polarization_Ellipse/" + self.filename_PE,
                  'w') as f:
            f.write("# Station S_0 δ τ ε σ_S_0 σ_δ σ_τ σ_ε\n")
    def __init__(self,
                 load_gal_cal=True,
                 timeID=None,
                 findRFI=None,
                 cal_curve=get_LBA_frequency_calibration,
                 jones_matrices=None):
        """if load_gal_cal is true, then timeID and  findRFI should indicate RFI info. If load_gal_cal is false, than data is not normalized relative to noise.
        cal_curve should take numpy arrays of frequency and return frequency dependant adjustment of the data. can be None.
        Jones matrices should be a function that has three parameters: 1) numpy array of frequencies in Hz, 2) zenith in degrees, and 3) azimuth in degrees, then returns array of jones matrices. Default is pycrtools model """

        self.cal_curve = cal_curve

        if load_gal_cal:

            if findRFI is None:
                findRFI = "/findRFI/findRFI_results"

            if isinstance(findRFI, str):  ## load findRFI data from file
                galcal_data_loc = processed_data_dir(timeID) + findRFI
                with open(galcal_data_loc, 'rb') as fin:
                    findRFI = load(fin)

            self.calibration_factors = {}
            for findRFI_info in findRFI.values():
                antenna_names = findRFI_info["antenna_names"]
                num_antennas = len(antenna_names)
                cleaned_power = findRFI_info["cleaned_power"]
                timestamp = findRFI_info["timestamp"]
                analyzed_blocksize = findRFI_info["blocksize"]

                even_cal_factors, odd_cal_factors = getGalaxyCalibrationData(
                    cleaned_power, timestamp, 5.0E-9 / analyzed_blocksize)

                for ant_i in range(0, int(num_antennas / 2)):
                    ant_name = antenna_names[ant_i * 2]
                    self.calibration_factors[ant_name] = (
                        even_cal_factors[ant_i], odd_cal_factors[ant_i])
        else:
            self.calibration_factors = None

        ### Galaxy callibration data ###
#        self.calibration_factors = {}
#        galcal_data_loc = processed_data_dir(timeID) + '/cal_tables/galaxy_cal'
#        galcal_fpaths = glob.glob(galcal_data_loc + '/*.gcal')
#        for fpath in galcal_fpaths:
#            with open(fpath, 'rb') as fin:
#                data = np.load(fin)
#                ant_names = data["arr_0"].astype(str, copy=False)
#                factors = data["arr_1"]
#            ant_i = 0
#            while ant_i<len(ant_names):
#                self.calibration_factors[ ant_names[ant_i] ] = [factors[ant_i], factors[ant_i+1]]
#                ant_i += 2

        if jones_matrices is None:
            self.antenna_model = LBA_antenna_model().JonesMatrix_MultiFreq
Example #3
0
def planewave_fits(timeID,
                   station,
                   polarization,
                   initial_block,
                   number_of_blocks,
                   pulses_per_block=10,
                   pulse_length=50,
                   min_amplitude=50,
                   upsample_factor=0,
                   min_num_antennas=4,
                   polarization_flips="polarization_flips.txt",
                   bad_antennas="bad_antennas.txt",
                   additional_antenna_delays="ant_delays.txt",
                   max_num_planewaves=np.inf,
                   positive_saturation=2046,
                   negative_saturation=-2047,
                   saturation_post_removal_length=50,
                   saturation_half_hann_length=50,
                   verbose=True):
    """ wrapper around 'planewave_fitter' only present for backwards compatiblility. Returns RMS, zenithal and azimuthal fit values, as three arrays in that order"""

    processed_data_folder = processed_data_dir(timeID)
    polarization_flips = read_antenna_pol_flips(processed_data_folder + '/' +
                                                polarization_flips)
    bad_antennas = read_bad_antennas(processed_data_folder + '/' +
                                     bad_antennas)
    additional_antenna_delays = read_antenna_delays(processed_data_folder +
                                                    '/' +
                                                    additional_antenna_delays)

    raw_fpaths = filePaths_by_stationName(timeID)
    TBB_data = MultiFile_Dal1(raw_fpaths[station],
                              polarization_flips=polarization_flips,
                              bad_antennas=bad_antennas,
                              additional_ant_delays=additional_antenna_delays)

    fitter = planewave_fitter(
        TBB_data=TBB_data,
        polarization=polarization,
        initial_block=initial_block,
        number_of_blocks=number_of_blocks,
        pulses_per_block=pulses_per_block,
        pulse_length=pulse_length,
        min_amplitude=min_amplitude,
        upsample_factor=upsample_factor,
        min_num_antennas=min_num_antennas,
        max_num_planewaves=max_num_planewaves,
        verbose=verbose,  ## doesn't do anything anyway
        positive_saturation=positive_saturation,
        negative_saturation=negative_saturation,
        saturation_post_removal_length=saturation_post_removal_length,
        saturation_half_hann_length=saturation_half_hann_length)

    RMSs, Zeniths, Azimuths, throw = fitter.go_fit()
    return RMSs, Zeniths, Azimuths
    def __init__(self, timeID, alt_loc=None):
        self.data_loc = processed_data_dir(timeID)

        if alt_loc is not None:
            self.data_loc = alt_loc
        else:
            if not isdir(self.data_loc + '/' + "polarization_data"):
                raise FileNotFoundError(
                    errno.ENOENT, strerror(errno.ENOENT),
                    "{}".format(self.data_loc + '/' + "polarization_data"))
            self.data_loc += "/polarization_data"
    def __init__(self, timeID, fname=None, alt_loc=None):
        self.data_loc = processed_data_dir(timeID)

        if alt_loc is not None:
            self.data_loc = alt_loc
        else:
            if not isdir(self.data_loc + '/' + "polarization_data"):
                raise FileNotFoundError(
                    errno.ENOENT, strerror(errno.ENOENT),
                    "{}".format(self.data_loc + '/' + "polarization_data"))
            self.data_loc += "/polarization_data"

        if fname is not None:
            self.save_file = fname + ".json"
        else:
            self.save_file = "a_vectors.json"

        #create the file
        with open(self.data_loc + '/' + self.save_file, 'w') as f:
            json.dump(dict(), f, indent=4)
Example #6
0
    def __init__(self, timeID=None, findRFI=None):

        if findRFI is None:
            findRFI = "/findRFI/findRFI_results"

        if isinstance(findRFI, str):  ## load findRFI data from file
            galcal_data_loc = processed_data_dir(timeID) + findRFI
            with open(galcal_data_loc, 'rb') as fin:
                findRFI = load(fin)

        self.calibration_factors = {}
        for findRFI_info in findRFI.values():
            antenna_names = findRFI_info["antenna_names"]
            num_antennas = len(antenna_names)
            cleaned_power = findRFI_info["cleaned_power"]
            timestamp = findRFI_info["timestamp"]
            analyzed_blocksize = findRFI_info["blocksize"]

            even_cal_factors, odd_cal_factors = getGalaxyCalibrationData(
                cleaned_power, timestamp, 5.0E-9 / analyzed_blocksize)

            for ant_i in range(0, int(num_antennas / 2)):
                ant_name = antenna_names[ant_i * 2]
                self.calibration_factors[ant_name] = (even_cal_factors[ant_i],
                                                      odd_cal_factors[ant_i])

        ### Galaxy callibration data ###
#        self.calibration_factors = {}
#        galcal_data_loc = processed_data_dir(timeID) + '/cal_tables/galaxy_cal'
#        galcal_fpaths = glob.glob(galcal_data_loc + '/*.gcal')
#        for fpath in galcal_fpaths:
#            with open(fpath, 'rb') as fin:
#                data = np.load(fin)
#                ant_names = data["arr_0"].astype(str, copy=False)
#                factors = data["arr_1"]
#            ant_i = 0
#            while ant_i<len(ant_names):
#                self.calibration_factors[ ant_names[ant_i] ] = [factors[ant_i], factors[ant_i+1]]
#                ant_i += 2

        self.antenna_model = LBA_antenna_model()
def read_acceleration_vector(timeID, fname, alt_loc=None):
    data_loc = processed_data_dir(timeID)

    if alt_loc is not None:
        data_loc = alt_loc
    else:
        if not isdir(data_loc):
            raise FileNotFoundError(errno.ENOENT, strerror(errno.ENOENT),
                                    "{}".format(data_loc))
        data_loc += "/polarization_data"

    if fname is not None:
        save_file = fname + ".json"
    else:
        save_file = "a_vectors.json"

    if not isfile(data_loc + '/' + save_file):
        raise FileNotFoundError(errno.ENOENT, strerror(errno.ENOENT),
                                "{}".format(data_loc + '/' + save_file))

    with open(data_loc + '/' + save_file, 'r') as f:
        data = json.load(f)

    return data
Example #8
0
def get_noise_std(timeID,
                  initial_block,
                  max_num_blocks,
                  max_double_zeros=100,
                  stations=None,
                  polarization_flips="polarization_flips.txt",
                  bad_antennas="bad_antennas.txt"):

    processed_data_folder = processed_data_dir(timeID)
    if isinstance(polarization_flips, str):
        polarization_flips = read_antenna_pol_flips(processed_data_folder +
                                                    '/' + polarization_flips)
    if isinstance(processed_data_folder, str):
        bad_antennas = read_bad_antennas(processed_data_folder + '/' +
                                         bad_antennas)

    half_window_percent = 0.1
    half_window_percent *= 1.1  ## just to be sure we are away from edge

    raw_fpaths = filePaths_by_stationName(timeID)
    if stations is None:
        stations = raw_fpaths.keys()

    out_dict = {}
    for sname in stations:
        print(sname)

        TBB_data = MultiFile_Dal1(raw_fpaths[sname],
                                  polarization_flips=polarization_flips,
                                  bad_antennas=bad_antennas)
        RFI_filter = window_and_filter(timeID=timeID, sname=sname)
        block_size = RFI_filter.blocksize
        edge_size = int(half_window_percent * block_size)

        antenna_names = TBB_data.get_antenna_names()
        measured_std = np.zeros(len(antenna_names))
        measured_std[:] = -1

        for block_i in range(initial_block, initial_block + max_num_blocks):
            for ant_i in range(len(antenna_names)):
                if measured_std[ant_i] > 0:
                    continue  ## we got a measurment, so skip it

                data = np.array(TBB_data.get_data(block_i * block_size,
                                                  block_size,
                                                  antenna_index=ant_i),
                                dtype=np.double)

                if num_double_zeros(data) > max_double_zeros:
                    continue  ## bad block, skip

                filtered_data = np.real(RFI_filter.filter(data))
                filtered_data = filtered_data[edge_size:
                                              -edge_size]  ##avoid the edge
                measured_std[ant_i] = np.std(filtered_data)

            if np.all(measured_std > 0):  ## we can break early
                break

        for ant_name, std in zip(antenna_names, measured_std):
            out_dict[ant_name] = std

        filter = measured_std > 0
        print("   ave std:", np.average(measured_std[filter]))
        print("   total ant:", len(filter), "good ant:", np.sum(filter))
        print()

    return out_dict
def plot_blocks(timeID,
                block_size,
                block_starts,
                guess_delays,
                guess_location=None,
                bad_stations=[],
                polarization_flips="polarization_flips.txt",
                bad_antennas="bad_antennas.txt",
                additional_antenna_delays="ant_delays.txt",
                do_remove_saturation=True,
                do_remove_RFI=True,
                positive_saturation=2046,
                negative_saturation=-2047,
                saturation_post_removal_length=50,
                saturation_half_hann_length=5,
                referance_station="CS002"):
    """plot multiple blocks, for guessing initial delays and finding pulses. If guess_location is None, then guess_delays should be apparent delays,
    if guess_location is a XYZT location, then guess_delays should be real delays. If a station isn't in guess_delays, its' delay is assumed to be zero.
    A station is only not plotted if it is bad_stations. If referance station is in guess_delays, then its delay is subtract from all stations"""

    if referance_station in guess_delays:
        ref_delay = guess_delays[referance_station]
        guess_delays = {
            sname: delay - ref_delay
            for sname, delay in guess_delays.items()
        }

    processed_data_folder = processed_data_dir(timeID)

    polarization_flips = read_antenna_pol_flips(processed_data_folder + '/' +
                                                polarization_flips)
    bad_antennas = read_bad_antennas(processed_data_folder + '/' +
                                     bad_antennas)
    additional_antenna_delays = read_antenna_delays(processed_data_folder +
                                                    '/' +
                                                    additional_antenna_delays)

    raw_fpaths = filePaths_by_stationName(timeID)
    raw_data_files = {sname:MultiFile_Dal1(raw_fpaths[sname], force_metadata_ant_pos=True, polarization_flips=polarization_flips, bad_antennas=bad_antennas, additional_ant_delays=additional_antenna_delays) \
                      for sname in raw_fpaths.keys() if sname not in bad_stations}

    if guess_location is not None:
        guess_location = np.array(guess_location)

        ref_stat_file = raw_data_files[referance_station]
        ant_loc = ref_stat_file.get_LOFAR_centered_positions()[0]
        ref_delay = np.linalg.norm(
            ant_loc - guess_location[:3]
        ) / v_air - ref_stat_file.get_nominal_sample_number() * 5.0E-9

        for sname, data_file in raw_data_files.items():
            if sname not in guess_delays:
                guess_delays[sname] = 0.0

            data_file = raw_data_files[sname]
            ant_loc = data_file.get_LOFAR_centered_positions()[0]
            guess_delays[sname] += (
                np.linalg.norm(ant_loc - guess_location[:3]) / v_air -
                ref_delay)
            guess_delays[sname] -= data_file.get_nominal_sample_number(
            ) * 5.0E-9

    RFI_filters = {
        sname: window_and_filter(timeID=timeID, sname=sname)
        for sname in raw_fpaths.keys() if sname not in bad_stations
    }

    data = np.empty(block_size, dtype=np.double)

    height = 0
    t0 = np.arange(block_size) * 5.0E-9
    transform = blended_transform_factory(plt.gca().transAxes,
                                          plt.gca().transData)
    sname_X_loc = 0.0
    for sname, data_file in raw_data_files.items():
        print(sname)

        station_delay = -data_file.get_nominal_sample_number() * 5.0E-9
        if sname in guess_delays:
            station_delay = guess_delays[sname]

        station_delay_points = int(station_delay / 5.0E-9)

        RFI_filter = RFI_filters[sname]
        ant_names = data_file.get_antenna_names()

        num_antenna_pairs = int(len(ant_names) / 2)
        peak_height = 0.0
        for point in block_starts:
            T = t0 + point * 5.0E-9
            for pair in range(num_antenna_pairs):
                data[:] = data_file.get_data(point + station_delay_points,
                                             block_size,
                                             antenna_index=pair * 2)

                if do_remove_saturation:
                    remove_saturation(data, positive_saturation,
                                      negative_saturation,
                                      saturation_post_removal_length,
                                      saturation_half_hann_length)
                if do_remove_RFI:
                    filtered_data = RFI_filter.filter(data)
                else:
                    filtered_data = hilbert(data)
                even_HE = np.abs(filtered_data)

                data[:] = data_file.get_data(point + station_delay_points,
                                             block_size,
                                             antenna_index=pair * 2 + 1)
                if do_remove_saturation:
                    remove_saturation(data, positive_saturation,
                                      negative_saturation,
                                      saturation_post_removal_length,
                                      saturation_half_hann_length)
                if do_remove_RFI:
                    filtered_data = RFI_filter.filter(data)
                else:
                    filtered_data = hilbert(data)
                odd_HE = np.abs(filtered_data)

                plt.plot(T, even_HE + height, 'r')
                plt.plot(T, odd_HE + height, 'g')

                max_even = np.max(even_HE)
                if max_even > peak_height:
                    peak_height = max_even
                max_odd = np.max(odd_HE)
                if max_odd > peak_height:
                    peak_height = max_odd

#        plt.annotate(sname, (points[-1]*5.0E-9+t0[-1], height))
        plt.annotate(sname, (sname_X_loc, height),
                     textcoords=transform,
                     xycoords=transform)
        height += 2 * peak_height

    plt.show()
    def open_files(self, log_func=do_nothing, force_metadata_ant_pos=True):
        processed_data_loc = processed_data_dir(self.timeID)

        #### open callibration data files ####
        ### TODO: fix these so they are accounted for in a more standard maner
        self.station_timing_offsets = read_station_delays(
            processed_data_loc + '/' + self.station_delays_fname)
        self.additional_ant_delays = read_antenna_delays(
            processed_data_loc + '/' + self.additional_antenna_delays_fname)
        self.bad_antennas = read_bad_antennas(processed_data_loc + '/' +
                                              self.bad_antennas_fname)
        self.pol_flips = read_antenna_pol_flips(processed_data_loc + '/' +
                                                self.pol_flips_fname)

        #### open data files, and find RFI ####
        raw_fpaths = filePaths_by_stationName(self.timeID)
        self.station_names = []
        self.input_files = []
        self.RFI_filters = []
        CS002_index = None
        self.station_to_antenna_indeces_dict = {}
        for station, fpaths in raw_fpaths.items():
            if (station in self.station_timing_offsets) and (
                    station not in self.stations_to_exclude) and (
                        self.use_core_stations_S1 or self.use_core_stations_S2
                        or (not station[:2] == 'CS') or station == "CS002"):
                #            if (station not in self.stations_to_exclude) and ( self.use_core_stations_S1 or self.use_core_stations_S2 or (not station[:2]=='CS') or station=="CS002" ):
                log_func("opening", station)
                self.station_names.append(station)
                self.station_to_antenna_indeces_dict[station] = []

                if station == 'CS002':
                    CS002_index = len(self.station_names) - 1

                new_file = MultiFile_Dal1(
                    fpaths, force_metadata_ant_pos=force_metadata_ant_pos)
                new_file.set_polarization_flips(self.pol_flips)
                self.input_files.append(new_file)

                RFI_result = None
                if self.do_RFI_filtering and self.use_saved_RFI_info:
                    self.RFI_filters.append(
                        window_and_filter(timeID=self.timeID, sname=station))

                elif self.do_RFI_filtering:
                    RFI_result = FindRFI(new_file,
                                         self.block_size,
                                         self.initial_RFI_block,
                                         self.RFI_num_blocks,
                                         self.RFI_max_blocks,
                                         verbose=False,
                                         figure_location=None)
                    self.RFI_filters.append(
                        window_and_filter(find_RFI=RFI_result))

                else:  ## only basic filtering
                    self.RFI_filters.append(
                        window_and_filter(blocksize=self.block_size))

        #### find antenna pairs ####
        boundingBox_center = np.average(self.bounding_box, axis=-1)
        self.antennas_to_use = pairData_NumAntPerStat(
            self.input_files, self.num_antennas_per_station, self.bad_antennas)
        #        self.antennas_to_use = pairData_NumAntPerStat_PolO(self.input_files, self.num_antennas_per_station, self.bad_antennas )
        #        self.antennas_to_use = pairData_NumAntPerStat_DualPol(self.input_files, self.num_antennas_per_station, self.bad_antennas )
        self.num_antennas = len(self.antennas_to_use)

        #### get antenna locations and delays ####
        self.antenna_locations = np.zeros((self.num_antennas, 3),
                                          dtype=np.double)
        self.antenna_delays = np.zeros(self.num_antennas, dtype=np.double)
        self.is_not_core = np.zeros(self.num_antennas, dtype=np.bool)

        #### TODO: Do we need this "CSOO2 correction??? will removing it fix our time base?? ####
        #        clock_corrections = getClockCorrections()
        #        CS002_correction = -clock_corrections["CS002"] - self.input_files[CS002_index].get_nominal_sample_number()*5.0E-9 ## wierd sign. But is just to correct for previous definiitions
        CS002_correction = self.station_timing_offsets[
            'CS002'] - self.input_files[CS002_index].get_nominal_sample_number(
            ) * 5.0E-9  ## wierd sign. But is just to correct for previous definiitions

        for ant_i, (station_i,
                    station_ant_i) in enumerate(self.antennas_to_use):
            self.station_to_antenna_indeces_dict[
                self.station_names[station_i]].append(
                    ant_i
                )  ### TODO: this should probably be a result of pairData_NumAntPerStat

            data_file = self.input_files[station_i]
            station = self.station_names[station_i]
            self.is_not_core[ant_i] = (not station[:2]
                                       == 'CS') or station == "CS002"

            ant_name = data_file.get_antenna_names()[station_ant_i]

            self.antenna_locations[
                ant_i] = data_file.get_LOFAR_centered_positions(
                )[station_ant_i]
            self.antenna_delays[
                ant_i] = data_file.get_timing_callibration_delays(
                )[station_ant_i]

            ## account for station timing offsets
            #            self.antenna_delays[ant_i]  += self.station_timing_offsets[station] +  (-clock_corrections[station] - data_file.get_nominal_sample_number()*5.0E-9) - CS002_correction
            self.antenna_delays[ant_i] += self.station_timing_offsets[
                station] + (-data_file.get_nominal_sample_number() *
                            5.0E-9) - CS002_correction

            ## add additional timing delays
            ##note this only works for even antennas!
            if ant_name in self.additional_ant_delays:
                self.antenna_delays[ant_i] += self.additional_ant_delays[
                    ant_name][0]

#        #### find prefered station ####
        if self.prefered_station is None:
            prefered_stat_shortestWindowTime = np.inf
            prefered_station_input_file = None
            for station, antenna_indeces in self.station_to_antenna_indeces_dict.items(
            ):
                ant_i = antenna_indeces[0]  ## just use first antenna for test

                if not (self.use_core_stations_S1 or self.is_not_core[ant_i]):
                    continue

                longest_window_time = 0
                for ant_j in range(self.num_antennas):
                    if not (self.use_core_stations_S1
                            or self.is_not_core[ant_j]):
                        continue

                    window_time, throw, throw = find_max_duration(
                        self.antenna_locations[ant_i],
                        self.antenna_locations[ant_j],
                        self.bounding_box,
                        center=boundingBox_center)
                    if window_time > longest_window_time:
                        longest_window_time = window_time

                if longest_window_time < prefered_stat_shortestWindowTime:
                    prefered_stat_shortestWindowTime = longest_window_time
                    self.prefered_station = station
                    prefered_station_input_file = self.input_files[
                        self.antennas_to_use[ant_i][0]]
        else:  ### TODO: throw error is prefered station is in core, but core not included in stage 1
            ant_i = self.station_to_antenna_indeces_dict[
                self.prefered_station][0]

            prefered_stat_shortestWindowTime = 0
            for ant_j in range(self.num_antennas):
                if not (self.use_core_stations_S1 or self.is_not_core[ant_j]):
                    continue

                window_time, throw, throw = find_max_duration(
                    self.antenna_locations[ant_i],
                    self.antenna_locations[ant_j],
                    self.bounding_box,
                    center=boundingBox_center)
                if window_time > prefered_stat_shortestWindowTime:
                    prefered_stat_shortestWindowTime = window_time

            prefered_station_input_file = self.input_files[
                self.antennas_to_use[ant_i][0]]

        log_func("prefered station:", self.prefered_station)
        log_func("    max. half window time:",
                 prefered_stat_shortestWindowTime)
        log_func()
        log_func()

        self.prefered_station_timing_offset = self.station_timing_offsets[
            self.
            prefered_station] - prefered_station_input_file.get_nominal_sample_number(
            ) * 5.0E-9
        self.prefered_station_antenna_timing_offsets = prefered_station_input_file.get_timing_callibration_delays(
        )

        self.startBlock_exclusion = int(
            0.1 * self.block_size)  ### TODO: save these to header.
        self.endBlock_exclusion = int(
            prefered_stat_shortestWindowTime / 5.0E-9) + 1 + int(
                0.1 * self.block_size)  ## last bit accounts for hann-window
        self.active_block_length = self.block_size - self.startBlock_exclusion - self.endBlock_exclusion  ##the length of block used for looking at data

        ##### find window offsets and lengths ####
        self.antenna_data_offsets = np.zeros(self.num_antennas, dtype=np.long)
        self.half_antenna_data_length = np.zeros(self.num_antennas,
                                                 dtype=np.long)

        for ant_i, (station_i,
                    station_ant_i) in enumerate(self.antennas_to_use):

            ## now we account for distance to the source
            travel_time = np.linalg.norm(self.antenna_locations[ant_i] -
                                         boundingBox_center) / v_air
            self.antenna_data_offsets[ant_i] = int(travel_time / 5.0E-9)

            ### find max duration to any of the prefered antennas
            max_duration = 0.0
            for prefered_ant_i in self.station_to_antenna_indeces_dict[
                    self.prefered_station]:
                if prefered_ant_i == ant_i:
                    continue

                duration, throw, throw = find_max_duration(
                    self.antenna_locations[prefered_ant_i],
                    self.antenna_locations[ant_i], self.bounding_box,
                    boundingBox_center)

                if duration > max_duration:
                    max_duration = duration

            self.half_antenna_data_length[ant_i] = int(
                self.pulse_length / 2) + int(duration / 5.0E-9)

            self.antenna_data_offsets[ant_i] -= self.half_antenna_data_length[
                ant_i]

            #### now adjust the data offsets and antenna delays so they are consistent

            ## first we amount to adjust the offset by time delays mod the sampling time
            offset_adjust = int(
                self.antenna_delays[ant_i] / 5.0E-9
            )  ##this needs to be added to offsets and subtracted from delays

            ## then we can adjust the delays accounting for the data offset
            self.antenna_delays[
                ant_i] -= self.antenna_data_offsets[ant_i] * 5.0E-9

            ##now we finally account for large time delays
            self.antenna_data_offsets[ant_i] += offset_adjust
            self.antenna_delays[ant_i] -= offset_adjust * 5.0E-9

        if (not self.use_core_stations_S1) or (not self.use_core_stations_S2):
            core_filtered_ant_locs = np.array(
                self.antenna_locations[self.is_not_core])
            core_filtered_ant_delays = np.array(
                self.antenna_delays[self.is_not_core])

        #### allocate some memory ####
        self.data_block = np.empty((self.num_antennas, self.block_size),
                                   dtype=np.complex)
        self.hilbert_envelope_tmp = np.empty(self.block_size, dtype=np.double)

        #### initialize stage 1 ####
        if self.use_core_stations_S1:
            self.trace_length_stage1 = 2 * np.max(
                self.half_antenna_data_length)
            S1_ant_locs = self.antenna_locations
            S1_ant_delays = self.antenna_delays
        else:
            self.trace_length_stage1 = 2 * np.max(
                self.half_antenna_data_length[self.is_not_core])
            S1_ant_locs = core_filtered_ant_locs
            S1_ant_delays = core_filtered_ant_delays
        self.trace_length_stage1 = 2**(int(np.log2(self.trace_length_stage1)) +
                                       1)
        self.stage_1_imager = II_tools.image_data_stage1(
            S1_ant_locs, S1_ant_delays, self.trace_length_stage1,
            self.upsample_factor)

        #### initialize stage 2 ####
        if self.use_core_stations_S2:
            S2_ant_locs = self.antenna_locations
            S2_ant_delays = self.antenna_delays
        else:
            S2_ant_locs = core_filtered_ant_locs
            S2_ant_delays = core_filtered_ant_delays
        self.trace_length_stage2 = 2**(int(np.log2(self.pulse_length)) + 1)
        self.stage_2_window = half_hann_window(self.pulse_length,
                                               self.hann_window_fraction)
        self.stage_2_imager = II_tools.image_data_stage2_absBefore(
            S2_ant_locs, S2_ant_delays, self.trace_length_stage2,
            self.upsample_factor)

        self.erasure_window = 1.0 - self.stage_2_window
Example #11
0
    def run(self, output_dir, dir_is_organized=True):
        
        processed_data_folder = processed_data_dir( self.timeID )
        
        if dir_is_organized:
            output_dir = processed_data_folder +'/' + output_dir
        
        polarization_flips = read_antenna_pol_flips( processed_data_folder + '/' + self.pol_flips_fname )
        bad_antennas = read_bad_antennas( processed_data_folder + '/' + self.bad_antennas_fname )
        additional_antenna_delays = read_antenna_delays(  processed_data_folder + '/' + self.additional_antenna_delays_fname )
        station_timing_offsets = read_station_delays( processed_data_folder+'/'+ self.station_delays_fname )
        
        raw_fpaths = filePaths_by_stationName( self.timeID )

        self.station_data_files = []
        ref_station_i = None
        referance_station_set = None
        station_i = 0
        self.posix_timestamp = None
        
        for station, fpaths  in raw_fpaths.items():
            if (station in station_timing_offsets) and (station not in self.stations_to_exclude ):
                print('opening', station)
                
                raw_data_file = MultiFile_Dal1(fpaths, polarization_flips=polarization_flips, bad_antennas=bad_antennas, additional_ant_delays=additional_antenna_delays, pol_flips_are_bad=self.pol_flips_are_bad)
                self.station_data_files.append( raw_data_file )
                
                raw_data_file.set_station_delay( station_timing_offsets[station] )
                raw_data_file.find_and_set_polarization_delay()
                
                if self.posix_timestamp is None:
                    self.posix_timestamp = raw_data_file.get_timestamp()
                elif self.posix_timestamp != raw_data_file.get_timestamp():
                    print("ERROR: POSIX timestamps are different")
                    quit()
                
                if self.referance_station is None:
                    if (referance_station_set is None) or ( int(station[2:]) < int(referance_station_set[2:]) ): ## if no referance station, use one with smallist number
                        ref_station_i = station_i
                        referance_station_set = station
                elif self.referance_station == station:
                    ref_station_i = station_i
                    referance_station_set = station
                        
                station_i += 1
                
        ## set reference station first
        tmp = self.station_data_files[0]
        self.station_data_files[0] = self.station_data_files[ ref_station_i ]
        self.station_data_files[ ref_station_i ] = tmp
        self.referance_station = referance_station_set
        
        ## organize antenana info
        self.station_antenna_indeces = [] ## 2D list. First index is station_i, second is a local antenna index, value is station antenna index
        self.station_antenna_RMS = [] ## same as above, but value is RMS
        self.num_total_antennas = 0
        current_ant_i = 0
        for station_i,stationFile in enumerate(self.station_data_files):
            ant_names = stationFile.get_antenna_names()
            num_evenAntennas = int( len(ant_names)/2 )
            
            ## get RMS planewave fits
            if self.antenna_RMS_info is not None:
                
                antenna_RMS_dict = read_planewave_fits(processed_data_folder+'/'+self.antenna_RMS_info, stationFile.get_station_name() )
            else:
                antenna_RMS_dict = {}
                
                
            antenna_RMS_array = np.array([ antenna_RMS_dict[ant_name] if ant_name in antenna_RMS_dict else self.default_expected_RMS  for ant_name in ant_names if antName_is_even(ant_name)  ])
            antenna_indeces = np.arange(num_evenAntennas)*2
            
            ## remove bad antennas and sort
            ant_is_good = np.isfinite( antenna_RMS_array )
            antenna_RMS_array = antenna_RMS_array[ ant_is_good ]
            antenna_indeces = antenna_indeces[ ant_is_good ]
            
            sorter = np.argsort( antenna_RMS_array )
            antenna_RMS_array = antenna_RMS_array[ sorter ]
            antenna_indeces = antenna_indeces[ sorter ]
            
            ## select only the best!
            antenna_indeces = antenna_indeces[:self.max_antennas_per_station]
            antenna_RMS_array = antenna_RMS_array[:self.max_antennas_per_station]
                
            ## fill info
            self.station_antenna_indeces.append( antenna_indeces )
            self.station_antenna_RMS.append( antenna_RMS_array )
            
            self.num_total_antennas += len(antenna_indeces)
            
            current_ant_i += len(antenna_indeces)
        
        ### output to header!
        if not isdir(output_dir):
            mkdir(output_dir)
            
        logging_folder = output_dir + '/logs_and_plots'
        if not isdir(logging_folder):
            mkdir(logging_folder)
            
        header_outfile = h5py.File(output_dir + "/header.h5", "w")
        header_outfile.attrs["timeID"] = self.timeID
        header_outfile.attrs["initial_datapoint"] = self.initial_datapoint
        header_outfile.attrs["max_antennas_per_station"] = self.max_antennas_per_station
        header_outfile.attrs["referance_station"] = self.station_data_files[0].get_station_name()
        header_outfile.attrs["station_delays_fname"] = self.station_delays_fname
        header_outfile.attrs["additional_antenna_delays_fname"] = self.additional_antenna_delays_fname
        header_outfile.attrs["bad_antennas_fname"] = self.bad_antennas_fname
        header_outfile.attrs["pol_flips_fname"] = self.pol_flips_fname
        header_outfile.attrs["blocksize"] = self.blocksize
        header_outfile.attrs["remove_saturation"] = self.remove_saturation
        header_outfile.attrs["remove_RFI"] = self.remove_RFI
        header_outfile.attrs["positive_saturation"] = self.positive_saturation
        header_outfile.attrs["negative_saturation"] = self.negative_saturation
        header_outfile.attrs["saturation_removal_length"] = self.saturation_removal_length
        header_outfile.attrs["saturation_half_hann_length"] = self.saturation_half_hann_length
        header_outfile.attrs["hann_window_fraction"] = self.hann_window_fraction
        header_outfile.attrs["num_zeros_dataLoss_Threshold"] = self.num_zeros_dataLoss_Threshold
        header_outfile.attrs["min_amplitude"] = self.min_amplitude
        header_outfile.attrs["upsample_factor"] = self.upsample_factor
        header_outfile.attrs["max_events_perBlock"] = self.max_events_perBlock
        header_outfile.attrs["min_pulse_length_samples"] = self.min_pulse_length_samples
        header_outfile.attrs["erasure_length"] = self.erasure_length
        header_outfile.attrs["guess_distance"] = self.guess_distance
        header_outfile.attrs["kalman_devations_toSearch"] = self.kalman_devations_toSearch
        header_outfile.attrs["pol_flips_are_bad"] = self.pol_flips_are_bad
        header_outfile.attrs["antenna_RMS_info"] = self.antenna_RMS_info
        header_outfile.attrs["default_expected_RMS"] = self.default_expected_RMS
        header_outfile.attrs["max_planewave_RMS"] = self.max_planewave_RMS
        header_outfile.attrs["stop_chi_squared"] = self.stop_chi_squared
        header_outfile.attrs["max_minimize_itters"] = self.max_minimize_itters
        header_outfile.attrs["minimize_ftol"] = self.minimize_ftol
        header_outfile.attrs["minimize_xtol"] = self.minimize_xtol
        header_outfile.attrs["minimize_gtol"] = self.minimize_gtol
        
        header_outfile.attrs["refStat_delay"] = station_timing_offsets[  self.station_data_files[0].get_station_name()  ]
        header_outfile.attrs["refStat_timestamp"] = self.posix_timestamp#self.station_data_files[0].get_timestamp()
        header_outfile.attrs["refStat_sampleNumber"] = self.station_data_files[0].get_nominal_sample_number()
        
        header_outfile.attrs["stations_to_exclude"] = np.array(self.stations_to_exclude, dtype='S')
        
        header_outfile.attrs["polarization_flips"] = np.array(polarization_flips, dtype='S')
        
        header_outfile.attrs["num_stations"] = len(self.station_data_files)
        header_outfile.attrs["num_antennas"] = self.num_total_antennas
        
        for stat_i, (stat_file, antenna_indeces, antenna_RMS) in enumerate(zip(self.station_data_files, self.station_antenna_indeces, self.station_antenna_RMS)):
            
            station_group = header_outfile.create_group( str(stat_i) )
            station_group.attrs["sname"] = stat_file.get_station_name()
            station_group.attrs["num_antennas"] = len( antenna_indeces )
            
            locations = stat_file.get_LOFAR_centered_positions()
            total_delays = stat_file.get_total_delays()
            ant_names = stat_file.get_antenna_names()
            
            for ant_i, (stat_index, RMS) in enumerate(zip(antenna_indeces, antenna_RMS)):
                
                antenna_group = station_group.create_group( str(ant_i) )
                antenna_group.attrs['antenna_name'] = ant_names[stat_index]
                antenna_group.attrs['location'] = locations[stat_index]
                antenna_group.attrs['delay'] = total_delays[stat_index]
                antenna_group.attrs['planewave_RMS'] = RMS
Example #12
0
from os import mkdir
from os.path import isdir

## these lines are anachronistic and should be fixed at some point
from LoLIM import utilities

utilities.default_raw_data_loc = "/exp_app2/appexp1/public/raw_data"
utilities.default_processed_data_loc = "/home/brian/processed_files"

if __name__ == "__main__":
    timeID = "D20180921T194259.023Z"
    output_folder = "/max_over_blocks"
    block_size = 2**16

    processed_data_dir = processed_data_dir(timeID)

    output_fpath = processed_data_dir + output_folder
    if not isdir(output_fpath):
        mkdir(output_fpath)

    #### get paths to raw data by station ####
    raw_fpaths = filePaths_by_stationName(timeID)
    for station in raw_fpaths.keys():

        print("station:", station)

        #### open the data for this station ####
        TBB_data = MultiFile_Dal1(raw_fpaths[station])

        num_antennas = len(TBB_data.get_antenna_names())
Example #13
0
#!/usr/bin/env python3

import tkinter as tk
import pickle

from LoLIM import utilities
from LoLIM.utilities import processed_data_dir

timeID = "D20190424T210306.154Z"
utilities.default_processed_data_loc = "/home/student4/Marten/processed_files"
processed_data_folder = processed_data_dir(timeID)

ui = tk.Tk()
ui.withdraw()
clip = bytes.fromhex(ui.clipboard_get())
ui.destroy()

data = pickle.loads(clip)

with open(processed_data_folder + "/polarization_data/pulseIDs.pkl", 'wb') as f:
	pickle.dump(data,f,protocol=pickle.HIGHEST_PROTOCOL)
Example #14
0
 def open_files(self, station, log_func=do_nothing, force_metadata_ant_pos=True):
     processed_data_loc = processed_data_dir(self.timeID)
     
     #### open callibration data files ####
     ### TODO: fix these so they are accounted for in a more standard maner
     self.additional_ant_delays = read_antenna_delays( processed_data_loc+'/'+self.additional_antenna_delays_fname )
     self.bad_antennas = read_bad_antennas( processed_data_loc+'/'+self.bad_antennas_fname )
     self.pol_flips = read_antenna_pol_flips( processed_data_loc+'/'+self.pol_flips_fname )
     
     #### open data files, and find RFI ####
     self.station = station
     raw_fpaths = filePaths_by_stationName(self.timeID)[station]
     self.input_file = MultiFile_Dal1( raw_fpaths, force_metadata_ant_pos=force_metadata_ant_pos )
     self.input_file.set_polarization_flips( self.pol_flips )
     
     if self.do_RFI_filtering and self.use_saved_RFI_info:
         self.RFI_filters.append( window_and_filter(timeID=self.timeID, sname=station) )
     
     elif self.do_RFI_filtering:
         RFI_result = FindRFI(self.input_file, self.block_size, self.initial_RFI_block, self.RFI_num_blocks, self.RFI_max_blocks, verbose=False, figure_location=None)
         self.RFI_filters.append( window_and_filter(find_RFI=RFI_result) )
         
     else: ## only basic filtering
         self.RFI_filters.append( window_and_filter(blocksize=self.block_size) )
     
     
     
     #### find antenna pairs ####
     self.antennas_to_use = pairData_evenAnts(self.input_file, self.bad_antennas, self.max_num_antennas )
     self.num_antennas = len(self.antennas_to_use)
     
     
     #### get antenna locations and delays ####
     self.antenna_locations = np.zeros((self.num_antennas, 3), dtype=np.double)
     self.antenna_delays = np.zeros(self.num_antennas, dtype=np.double)
     
     for ant_i, station_ant_i in enumerate(self.antennas_to_use):
         
         ant_name = self.input_file.get_antenna_names()[ station_ant_i ]
         
         self.antenna_locations[ant_i] = self.input_file.get_LOFAR_centered_positions()[ station_ant_i ]
         self.antenna_delays[ant_i] = self.input_file.get_timing_callibration_delays()[ station_ant_i ]
         
         ## add additional timing delays
         ##note this only works for even antennas!
         if ant_name in self.additional_ant_delays:
             self.antenna_delays[ant_i] += self.additional_ant_delays[ ant_name ][0]
     
     
     
     ##### find window offsets and lengths ####
     self.half_antenna_data_length = np.zeros(self.num_antennas, dtype=np.long)
             
     for ant_i, station_ant_i in enumerate(self.antennas_to_use):
         
         ### find max duration to any of the prefered antennas
         max_distance = 0.0
         for ant_j, station_ant_j in enumerate(self.antennas_to_use):
             if ant_j == ant_i:
                 continue
             
             distance = np.linalg.norm( self.antenna_locations[ ant_j ]-self.antenna_locations[ant_i] )
             if distance > max_distance:
                 max_distance = distance
                 
         self.half_antenna_data_length[ant_i] = int(self.pulse_length/2) + int(max_distance/(v_air*5.0E-9))
     
     self.block_exclusion_length = int(0.1*self.block_size) + np.max( self.half_antenna_data_length ) + 1
     self.active_block_length = self.block_size - 2*self.block_exclusion_length##the length of block used for looking at data
     
     self.trace_length = 2*np.max(self.half_antenna_data_length )
     self.trace_length = 2**( int(np.log2( self.trace_length )) + 1 )
     
     
     #### allocate some memory ####
     self.data_block = np.empty((self.num_antennas,self.block_size), dtype=np.complex)
     self.hilbert_envelope_tmp = np.empty(self.block_size, dtype=np.double)
     
     self.stage_1_imager = II_tools.image_data(self.antenna_locations, self.antenna_delays, self.trace_length, self.upsample_factor)
    def run_multiple_blocks(self,
                            output_folder,
                            initial_datapoint,
                            start_block,
                            blocks_per_run,
                            run_number,
                            skip_blocks_done=True,
                            print_to_screen=True):
        processed_data_folder = processed_data_dir(self.timeID)
        data_dir = processed_data_folder + "/" + output_folder
        if not isdir(data_dir):
            mkdir(data_dir)

        logging_folder = data_dir + '/logs_and_plots'
        if not isdir(logging_folder):
            mkdir(logging_folder)

        file_number = 0
        while True:
            fname = logging_folder + "/log_run_" + str(file_number) + ".txt"
            if isfile(fname):
                file_number += 1
            else:
                break

        logger_function = logger()
        logger_function.set(fname, print_to_screen)
        logger_function.take_stdout()
        logger_function.take_stderr()

        #### TODO!#### improve log all options
        logger_function("timeID:", self.timeID)
        logger_function("date and time run:", time.strftime("%c"))
        logger_function("output folder:", output_folder)
        logger_function("block size:", self.block_size)
        logger_function("initial data point:", initial_datapoint)
        logger_function("first block:", start_block)
        logger_function("blocks per run:", blocks_per_run)
        logger_function("run number:", run_number)
        logger_function("station delay file:", self.station_delays_fname)
        logger_function("additional antenna delays file:",
                        self.additional_antenna_delays_fname)
        logger_function("bad antennas file:", self.bad_antennas_fname)
        logger_function("pol flips file:", self.pol_flips_fname)
        logger_function("bounding box:", self.bounding_box)
        logger_function("pulse length:", self.pulse_length)
        logger_function("num antennas per station:",
                        self.num_antennas_per_station)
        logger_function("stations excluded:", self.stations_to_exclude)
        logger_function("prefered station:", self.prefered_station)

        #### open files, save header if necisary ####
        self.open_files(logger_function, True)
        if run_number == 0:
            header_outfile = h5py.File(data_dir + "/header.h5", "w")
            self.save_header(header_outfile)
            header_outfile.close()

        #### run the algorithm!! ####
        for block_index in range(run_number * blocks_per_run + start_block,
                                 (run_number + 1) * blocks_per_run +
                                 start_block):

            out_fname = data_dir + "/block_" + str(block_index) + ".h5"
            tmp_fname = data_dir + "/tmp_" + str(block_index) + ".h5"

            if skip_blocks_done and isfile(out_fname):
                logger_function("block:", block_index,
                                "already completed. Skipping")
                continue

            start_time = time.time()

            block_outfile = h5py.File(tmp_fname, "w")
            block_start = initial_datapoint + self.active_block_length * block_index
            logger_function("starting processing block:", block_index, "at",
                            block_start)
            self.process_block(block_start,
                               block_index,
                               block_outfile,
                               log_func=logger_function)
            block_outfile.close()
            rename(tmp_fname, out_fname)

            logger_function("block done. took:", (time.time() - start_time),
                            's')
            logger_function()

        logger_function("done processing")
def plot_blocks(timeID, block_size, block_starts, guess_delays, guess_location = None, bad_stations=[], polarization_flips="polarization_flips.txt",
                bad_antennas = "bad_antennas.txt", additional_antenna_delays = "ant_delays.txt", do_remove_saturation = True, do_remove_RFI = True,
                positive_saturation = 2046, negative_saturation = -2047, saturation_post_removal_length = 50, saturation_half_hann_length = 5,
                referance_station = "CS002", amplify = {}, omitPOL=None):
    """plot multiple blocks, for guessing initial delays and finding pulses. If guess_location is None, then guess_delays should be apparent delays,
    if guess_location is a XYZT location, then guess_delays should be real delays. If a station isn't in guess_delays, its' delay is assumed to be zero.
    A station is only not plotted if it is bad_stations. If referance station is in guess_delays, then its delay is subtract from all stations"""

    '''Modified version of plot_multiple_data_all_stations to support usage of clickable GUI for aligning station timings'''


##2
    global first_few_names
    global defualt_color
    global ax

    text = []
##~2

    if referance_station in guess_delays:
        ref_delay = guess_delays[referance_station]
        guess_delays = {sname:delay-ref_delay for sname,delay in guess_delays.items()}

    processed_data_folder = processed_data_dir(timeID)

    polarization_flips = read_antenna_pol_flips( processed_data_folder + '/' + polarization_flips )
    bad_antennas = read_bad_antennas( processed_data_folder + '/' + bad_antennas )
    additional_antenna_delays = read_antenna_delays(  processed_data_folder + '/' + additional_antenna_delays )


    raw_fpaths = filePaths_by_stationName(timeID)
    raw_data_files = {sname:MultiFile_Dal1(raw_fpaths[sname], force_metadata_ant_pos=True, polarization_flips=polarization_flips, bad_antennas=bad_antennas, additional_ant_delays=additional_antenna_delays) \
                      for sname in raw_fpaths.keys() if sname not in bad_stations}

    if guess_location is not None:
        guess_location = np.array(guess_location)

        ref_stat_file = raw_data_files[ referance_station ]
        ant_loc = ref_stat_file.get_LOFAR_centered_positions()[0]
        ref_delay = np.linalg.norm(ant_loc-guess_location[:3])/v_air - ref_stat_file.get_nominal_sample_number()*5.0E-9

        for sname, data_file in raw_data_files.items():
            if sname not in guess_delays:
                guess_delays[sname] = 0.0

            data_file = raw_data_files[sname]
            ant_loc = data_file.get_LOFAR_centered_positions()[0]
            guess_delays[sname] += (np.linalg.norm(ant_loc-guess_location[:3])/v_air - ref_delay)
            guess_delays[sname] -= data_file.get_nominal_sample_number()*5.0E-9

    RFI_filters = {sname:window_and_filter(timeID=timeID,sname=sname) for sname in raw_fpaths.keys() if sname not in bad_stations}
    #RFI_filters = {sname:window_and_filter(timeID=timeID,sname=sname, blocksize=block_size) for sname in raw_fpaths.keys() if sname not in bad_stations}

    data = np.empty(block_size, dtype=np.double)


##3
    #fig = plt.figure(figsize=(10, 12))
    fig, ax = plt.subplots()

    for sname, data_file in raw_data_files.items():
        #print("Loading: "+ sname)
        if referance_station in sname:
           ref_plot = (sname, data_file)
           #ref_plot_offset = guess_delays[sname] #currently unsed
        else:
           plots.append((sname, data_file))


    first_few = [ref_plot]
    for p in range(0,Nplots-1):
        first_few.append(plots.pop(0))


    for sname, data_file in first_few:
        if sname != referance_station:
           first_few_names.append(sname)
##~3

##4
    def more_plots(some_data,First,ax,text):
       global l,m
       ax.clear()

       height = 0
       t0 = np.arange(block_size)*5.0E-9
       transform = blended_transform_factory(plt.gca().transAxes, plt.gca().transData)
       sname_X_loc = 0.0
       n = 0
       for sname, data_file in some_data:

        print("Plotting: "+sname)

        station_delay = -data_file.get_nominal_sample_number()*5.0E-9
        if sname in guess_delays:
            station_delay = guess_delays[sname]

        station_delay_points = int(station_delay/5.0E-9)

        RFI_filter = RFI_filters[sname]
        ant_names = data_file.get_antenna_names()

        num_antenna_pairs = int( len( ant_names )/2 )
        peak_height = 0.0

        print("Block starts at: "+str(block_starts[0]))
        for point in block_starts:
            T = t0 + point*5.0E-9
            for pair in range(num_antenna_pairs):
                data[:] = data_file.get_data(point+station_delay_points, block_size, antenna_index=pair*2)

                if do_remove_saturation:
                    remove_saturation(data, positive_saturation, negative_saturation, saturation_post_removal_length, saturation_half_hann_length)
                if do_remove_RFI:
                    filtered_data = RFI_filter.filter( data )
                else:
                    filtered_data = hilbert(data)
                even_HE = np.abs(filtered_data)

                data[:] = data_file.get_data(point+station_delay_points, block_size, antenna_index=pair*2+1)
                if do_remove_saturation:
                    remove_saturation(data, positive_saturation, negative_saturation, saturation_post_removal_length, saturation_half_hann_length)
                if do_remove_RFI:
                    filtered_data = RFI_filter.filter( data )
                else:
                    filtered_data = hilbert(data)
                odd_HE = np.abs(filtered_data)

                #ax.plot(T, even_HE + height, 'r')
                #ax.plot(T, odd_HE + height, 'g' )

                #for cases where data are hard to align due to signal being tiny:
                found = False
                if len(amplify) > 0:
                    for key in amplify:
                        if sname == key:

                            if omitPOL != 0:
                               ax.plot(T, amplify[key]*even_HE + height, 'r')
                            if omitPOL != 1:
                               ax.plot(T, amplify[key]*odd_HE + height, 'g' )

                            #ax.plot(T, amplify[key]*even_HE + height, 'r') twinx with block_starts && point as x rather than t!  (can I update to latests plot_multiple?)
                            #ax.plot(T, amplify[key]*odd_HE + height, 'g' )

                            found = True
                if not found:
                    if omitPOL != 0:
                       ax.plot(T, even_HE + height, 'r')
                    if omitPOL != 1:
                       ax.plot(T, odd_HE + height, 'g' )
                    #ax2 = ax.twiny()
                    #xmin = min(block_starts)
                    #xmax = max(block_starts)
                    #ax2.set_xlim(xmin, xmax) #can also use ax2.set_xticks(x)
                    #ax2.xaxis.set_ticks_position('both')

                max_even = np.max(even_HE)
                if max_even > peak_height:
                    peak_height = max_even
                max_odd = np.max(odd_HE)
                if max_odd > peak_height:
                    peak_height = max_odd

#        plt.annotate(sname, (points[-1]*5.0E-9+t0[-1], height))
        plt.sca(ax) #somehow this makes it so that the annotations work on all plots except for the first time "Next stations" is clicked
        plt.annotate(sname, (sname_X_loc, height), textcoords=transform, xycoords=transform)

        ax.ticklabel_format(useOffset=False)
        plt.setp(ax.get_xticklabels(), rotation=60, horizontalalignment='right')
        plt.subplots_adjust(bottom=0.1,top=0.98,left=0.21)
        if ref_plot_peak_location != 0.0:
           print("Setting ref peak to " +str(ref_plot_peak_location))
           Cpeak = ref_plot_peak_location #peak center, for plotting
           Dpeak = 0.0001  # +/- added to peak center for plotting
           plt.xlim(Cpeak-Dpeak,Cpeak+Dpeak)
        plt.grid(b=True)

        height += 2*peak_height
        n+=1
##~4





##5
#######################CallBacks############################
#######################CallBacks############################
#######################CallBacks############################
    def onclick(event):
        global stations_active
        global station_buttons
        global ref_plot_peak_location
        global set_ref
        global set_stations
        global default_color
        ix = event.xdata
        iy = event.ydata
        #print("click active stations: ", stations_active)
        falsify = []

        if set_ref:
           ref_plot_peak_location = ix
           print("Set ref peak to: "+str(ref_plot_peak_location))
           set_ref = False
           return #return, don't set anything else!
        n=0
        for s in stations_active.keys():
          if stations_active[s] and s !="":
            falsify.append(s)
            if s not in guess_delays.keys():
                guess_delays[s] = 0.0
            print ("Set " + s + " station delay to: ", guess_delays[s] + (ix-ref_plot_peak_location))
            tmp_guess_delays[s] = guess_delays[s] + (ix - ref_plot_peak_location)

            station_buttons[n].color = default_color
            station_buttons[n].hovercolor = default_color

          n+=1

        if len(falsify)>0:
           for f in falsify:
               stations_active[f] = False
           falsify = []
        plt.draw()


    def nextCB(event):
        global ax
        global plots
        global station_buttons
        global stations_active
        global StationCallBacks
        print("next!")

        stations_active = {}
        next_few = [ref_plot]
        if len(plots) >= Nplots:
         for i in range(0,Nplots-1):
               next_few.append(plots.pop(0))
        elif len(plots) > 0:
         bk = len(plots)
         for i in range(0,len(plots)):
               next_few.append(plots.pop(0))
         for i in range(bk,4):
             StationCallBacks[i].reset(i,"")
             station_buttons[i].label.set_text("")

        else:
          next_few = []
          for i in range(0,Nplots-1):
             StationCallBacks[i].reset(i,"")
             station_buttons[i].label.set_text("")
          print("All stations timings have been set")
          ax.clear()
          ax.annotate("All stations timings have been set", (0.5, 0.5))
          plt.draw()
          return

        height = 0.0
        n = 0
        for sname, data_file in next_few:

            if sname != referance_station:
               first_few_names.append(sname)
               StationCallBacks[n].reset(n,sname)
               station_buttons[n].label.set_text("Set "+sname)
               stations_active[sname] = False
               n+=1

        more_plots(next_few,False,ax,text)
        plt.draw()


    def refpCB(event):
        global ref_plot_peak_location
        global set_ref
        print ("Setting ref peak")# to: ",ix)
        set_ref = True

    def cCB(text):
        Cpeak = float(text) #peak center, for plotting
        Dpeak = 0.0001  # +/- added to peak center for plotting
        plt.xlim(Cpeak+Dpeak,Cpeak-Dpeak)
        plt.draw()

    def writeCB(event):
        print('Writing guess station delays')
        file = open('guess_delays.py','w')
        file.write("\n      self.guess_timing = " +str(ref_plot_peak_location) + "\n")
        #file.write("      self.event_index = ____\n\n")
        file.write('      self.guess_station_delays = {\n')
        for g in guess_delays:
            if g in tmp_guess_delays:
               '''If the delay has been updated, write the update:'''
               file.write('"'+g+'": '+str(tmp_guess_delays[g])+',\n')
            else:
               """Else, just write the old delay:"""
               file.write('"'+g+'": '+str(guess_delays[g])+',\n')
        file.write('}\n')
        print('Done!\n')


    def press(event):
        val = event.key
        print('press', val)
        '''if val == ('0' or  '1' or '2' or '3' or '4'):
           val = int(val)
           station_buttons[val].color = 'blue'
           station_buttons[val] .hovercolor = 'blue'
        '''


    class StationCB:
        global stations_active
        def __init__(self,np,station):
            self.N = np
            self.station = station

        def reset(self,np,station):
            self.N = np
            self.station = station

        def stationCB(self,event):
           print("Station active: "+self.station)
           #print(self.station + ' You pressed: ',event.name)
           #---highlight button with color when pressed state, show buttons in correct order
           station_buttons[self.N].color = 'blue'
           station_buttons[self.N].hovercolor = 'blue'
           stations_active[self.station] = True
######################~CallBacks############################
######################~CallBacks############################
######################~CallBacks############################

    more_plots(first_few,True,ax,text)

    axnext = plt.axes([ 0.05, 0.80,  0.1, 0.07])
    bnext = Button(axnext, 'Next\nStations')
    bnext.on_clicked(nextCB)

    axfile = plt.axes([0.05,0.7,  0.1,  0.07])
    bfile = Button(axfile, 'Write\nGuesses')
    bfile.on_clicked(writeCB)

    axref = plt.axes([0.05, 0.1,  0.13, 0.07])
    bref= Button(axref, 'Set\nRef Peak')
    bref.on_clicked(refpCB)

    #Cbox = plt.axes([0.05, 0.6,  0.1, 0.07])
    #text_box = TextBox(Cbox, 'Peak Center', initial="")
    #text_box.on_submit(cCB)

    start = 0.22
    for f in range(0,Nplots-1):
        fax = plt.axes([ 0.05, start+f*0.1,  0.13, 0.05])
        fbtn = Button(fax, "Set "+first_few_names[f])
        stations_active[first_few_names[f]] = False
        s = StationCB(f,first_few_names[f])
        StationCallBacks.append(s)
        station_axes.append(fax)
        station_buttons.append(fbtn)
        fbtn.on_clicked(s.stationCB)

    fig.canvas.mpl_connect('button_press_event', onclick)
    fig.canvas.mpl_connect('key_press_event', press)

    plt.show()
Example #17
0
    def __init__(self,
                 timeID,
                 guess_delays,
                 block_size,
                 initial_block,
                 num_blocks,
                 working_folder,
                 other_folder=None,
                 max_num_stations=np.inf,
                 guess_location=None,
                 bad_stations=[],
                 polarization_flips="polarization_flips.txt",
                 bad_antennas="bad_antennas.txt",
                 additional_antenna_delays=None,
                 do_remove_saturation=True,
                 do_remove_RFI=True,
                 positive_saturation=2046,
                 negative_saturation=-2047,
                 saturation_post_removal_length=50,
                 saturation_half_hann_length=50,
                 referance_station="CS002",
                 pulse_length=50,
                 upsample_factor=4,
                 min_antenna_amplitude=5,
                 fix_polarization_delay=True):

        #### disable matplotlib shortcuts
        plt.rcParams['keymap.save'] = ''
        plt.rcParams['keymap.fullscreen'] = ''
        plt.rcParams['keymap.home'] = ''
        plt.rcParams['keymap.back'] = ''
        plt.rcParams['keymap.forward'] = ''
        plt.rcParams['keymap.pan'] = ''
        plt.rcParams['keymap.zoom'] = ''
        plt.rcParams['keymap.save'] = ''
        plt.rcParams['keymap.quit_all'] = ''
        plt.rcParams['keymap.grid'] = ''
        plt.rcParams['keymap.grid_minor'] = ''
        plt.rcParams['keymap.yscale'] = ''
        plt.rcParams['keymap.xscale'] = ''
        plt.rcParams['keymap.all_axes'] = ''
        plt.rcParams['keymap.copy'] = ''

        #keymap.help : f1                    ## display help about active tools
        #keymap.quit : ctrl+w, cmd+w, q      ## close the current figure

        self.pressed_data = None
        #guess_location = np.array(guess_location[:3])

        self.block_size = block_size
        self.num_blocks = num_blocks

        self.positive_saturation = positive_saturation
        self.negative_saturation = negative_saturation
        self.saturation_post_removal_length = saturation_post_removal_length
        self.saturation_half_hann_length = saturation_half_hann_length
        self.do_remove_saturation = do_remove_saturation
        self.do_remove_RFI = do_remove_RFI
        self.referance_station = referance_station

        #### open data ####
        processed_data_folder = processed_data_dir(timeID)
        polarization_flips = read_antenna_pol_flips(processed_data_folder +
                                                    '/' + polarization_flips)
        bad_antennas = read_bad_antennas(processed_data_folder + '/' +
                                         bad_antennas)
        if additional_antenna_delays is not None:
            additional_antenna_delays = read_antenna_delays(
                processed_data_folder + '/' + additional_antenna_delays)
            print(
                "WARNING: Additional antenna delays should probably be None!")

        raw_fpaths = filePaths_by_stationName(timeID)
        station_names = [
            sname for sname in raw_fpaths.keys() if sname not in bad_stations
        ]
        self.TBB_files = {sname:MultiFile_Dal1(raw_fpaths[sname], polarization_flips=polarization_flips, bad_antennas=bad_antennas, additional_ant_delays=additional_antenna_delays) \
                          for sname in station_names}

        if fix_polarization_delay:
            for sname, file in self.TBB_files.items():

                #                delays = file.get_timing_callibration_delays()
                #                print()
                #                print()
                #                print(sname)
                #                for even_ant_i in range(0,len(delays),2):
                #                    print("  ", delays[even_ant_i+1]-delays[even_ant_i])

                file.find_and_set_polarization_delay()

#                delays = file.get_timing_callibration_delays()

#                print("after")
#                for even_ant_i in range(0,len(delays),2):
#                    print("  ", delays[even_ant_i+1]-delays[even_ant_i])

        self.RFI_filters = {
            sname: window_and_filter(timeID=timeID, sname=sname)
            for sname in station_names
        }
        self.edge_width = int(self.block_size * 0.1)
        self.display_block_size = self.block_size - 2 * self.edge_width

        #### some data things ####
        self.antenna_time_corrections = {
            sname: TBB_file.get_total_delays()
            for sname, TBB_file in self.TBB_files.items()
        }
        self.ave_ref_ant_delay = np.average(
            self.antenna_time_corrections[referance_station])

        #        ref_antenna_delay = self.antenna_time_corrections[ referance_station ][0]
        #        for station_corrections in self.antenna_time_corrections.values():
        #            station_corrections -= ref_antenna_delay

        max_num_antennas = np.max(
            [len(delays) for delays in self.antenna_time_corrections.values()])
        self.temp_data_block = np.empty(
            (max_num_antennas, num_blocks, block_size), dtype=np.double)
        self.time_array = np.arange(block_size) * 5.0E-9

        self.figure = plt.gcf()
        self.axes = plt.gca()

        #### make managers
        guess_delays = {
            sname: delay
            for sname, delay in guess_delays.items()
            if sname not in bad_stations
        }
        self.clock_offset_manager = clock_offsets(referance_station,
                                                  guess_delays, guess_location,
                                                  self.TBB_files)
        self.frame_manager = frames(initial_block, int(num_blocks / 2),
                                    station_names, max_num_stations,
                                    referance_station, self.display_block_size,
                                    num_blocks)

        rem_sat_curry = cur(remove_saturation, 5)(
            positive_saturation=positive_saturation,
            negative_saturation=negative_saturation,
            post_removal_length=saturation_post_removal_length,
            half_hann_length=saturation_half_hann_length)
        self.pulse_manager = pulses(
            pulse_length=pulse_length,
            block_size=block_size,
            out_folder=working_folder,
            other_folder=other_folder,
            TBB_data_dict=self.TBB_files,
            used_delay_dict=self.antenna_time_corrections,
            upsample_factor=upsample_factor,
            min_ant_amp=min_antenna_amplitude,
            referance_station=referance_station,
            RFI_filter_dict=(self.RFI_filters if self.do_remove_RFI else None),
            remove_saturation_curry=(rem_sat_curry
                                     if self.do_remove_saturation else None))

        self.plot()

        self.mode = 0  ##0 is change delay, 1 is set peak, etc...
        self.input_mode = 0  ## 0 is normal. press 's' to enter 1, where numbers are used to enter event. press 's' again to go back to 0, and search for event
        self.search_string = ''
        self.rect_selector = RectangleSelector(plt.gca(),
                                               self.rectangle_callback,
                                               useblit=True,
                                               rectprops=dict(alpha=0.5,
                                                              facecolor='red'),
                                               button=1,
                                               state_modifier_keys={
                                                   'move': '',
                                                   'clear': '',
                                                   'square': '',
                                                   'center': ''
                                               })

        self.mouse_press = self.figure.canvas.mpl_connect(
            'button_press_event', self.mouse_press)
        self.mouse_release = plt.gcf().canvas.mpl_connect(
            'button_release_event', self.mouse_release)

        self.key_press = plt.gcf().canvas.mpl_connect('key_press_event',
                                                      self.key_press_event)

        self.home_lims = [self.axes.get_xlim(), self.axes.get_ylim()]

        plt.show()
Example #18
0
def planewave_fits(timeID, station, polarization, initial_block, number_of_blocks, pulses_per_block=10, pulse_length=50, min_amplitude=50, upsample_factor=0, min_num_antennas=4,
                    polarization_flips="polarization_flips.txt", bad_antennas="bad_antennas.txt", additional_antenna_delays = "ant_delays.txt", max_num_planewaves=np.inf,
                    positive_saturation = 2046, negative_saturation = -2047, saturation_post_removal_length = 50, saturation_half_hann_length = 50, verbose=True):
    
    left_pulse_length = int(pulse_length/2)
    right_pulse_length = pulse_length-left_pulse_length
    
    processed_data_folder = processed_data_dir(timeID)
    polarization_flips = read_antenna_pol_flips( processed_data_folder + '/' + polarization_flips )
    bad_antennas = read_bad_antennas( processed_data_folder + '/' + bad_antennas )
    additional_antenna_delays = read_antenna_delays(  processed_data_folder + '/' + additional_antenna_delays )
    
    raw_fpaths = filePaths_by_stationName(timeID)
    TBB_data = MultiFile_Dal1( raw_fpaths[station], polarization_flips=polarization_flips, bad_antennas=bad_antennas, additional_ant_delays=additional_antenna_delays )
    ant_names = TBB_data.get_antenna_names()
    antenna_locations = TBB_data.get_LOFAR_centered_positions()
    antenna_delays = TBB_data.get_timing_callibration_delays()
    num_antenna_pairs = int( len( ant_names )/2 ) 
    
    if num_antenna_pairs < min_num_antennas:
        return np.array([]), np.array([]), np.array([])

    RFI_filter = window_and_filter(timeID=timeID, sname=station)
    block_size = RFI_filter.blocksize
    
    out_RMS = np.empty( number_of_blocks*pulses_per_block, dtype=np.double )
    out_zenith = np.empty( number_of_blocks*pulses_per_block, dtype=np.double )
    out_azimuth = np.empty( number_of_blocks*pulses_per_block, dtype=np.double )
    N = 0
    data = np.empty( (num_antenna_pairs,block_size), dtype=np.double )
    for block in range(initial_block, initial_block+number_of_blocks):
        if N >= max_num_planewaves:
            break
        
        #### open and filter data
        for pair_i in range(num_antenna_pairs):
            ant_i = pair_i*2 + polarization
            
            data[pair_i,:] = TBB_data.get_data(block*block_size, block_size, antenna_index=ant_i)
            remove_saturation(data[pair_i,:], positive_saturation, negative_saturation, saturation_post_removal_length, saturation_half_hann_length)
            np.abs( RFI_filter.filter( data[pair_i,:] ), out=data[pair_i,:])
    
    
        #### loop over finding planewaves
        i = 0
        while i < pulses_per_block:
            if N >= max_num_planewaves:
                break
            
            pulse_location = 0
            pulse_amplitude = 0
            
            ## find highest peak
            for pair_i, HE in enumerate(data):
                loc = np.argmax( HE )
                amp = HE[ loc ]
                
                if amp > pulse_amplitude:
                    pulse_amplitude = amp
                    pulse_location = loc
                    
            ## check if is strong enough
            if pulse_amplitude < min_amplitude:
                break
            
            ## get 
            fitter = locatefier()
            for pair_i, HE in enumerate(data):
                ant_i = pair_i*2 + polarization
                
                signal = np.array( HE[ pulse_location-left_pulse_length : pulse_location+right_pulse_length] )
                if num_double_zeros(signal, threshold=0.1) == 0:
                    
                    sample_time = 5.0E-9
                    if upsample_factor > 1:
                        sample_time /= upsample_factor
                        signal = resample(signal, len(signal)*upsample_factor )
                        
                    peak_finder = parabolic_fit( signal )
                    peak_time = peak_finder.peak_index*sample_time - antenna_delays[ant_i]
                    fitter.add_antenna(peak_time, antenna_locations[ant_i])
                    
                HE[ pulse_location-left_pulse_length : pulse_location+right_pulse_length] = 0.0
            
            if fitter.num_measurments() < min_num_antennas:
                continue
            
            fitter.prep_for_fitting()
            
            X = brute(fitter.RMS, ranges=[[0,np.pi/2],[0,np.pi*2]], Ns=20)
            
            if X[0] >= np.pi/2:
                X[0] = (np.pi/2)*0.99
            if X[1] >= np.pi*2:
                X[1] = (np.pi*2)*0.99
                
            if X[0] < 0:
                X[0] = 0.00000001
            if X[1] < 0:
                X[1] = 0.00000001
            
            ret = least_squares( fitter.time_fits, X, bounds=[[0,0],[np.pi/2,2*np.pi]], ftol=3e-16, xtol=3e-16, gtol=3e-16, x_scale='jac' )
            
            out_RMS[N] = fitter.RMS(ret.x, 3)
            out_zenith[N] = ret.x[0] 
            out_azimuth[N] = ret.x[1] 
            N += 1
            
            i += 1
            
    return out_RMS[:N], out_zenith[:N], out_azimuth[:N]
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
Example #19
0
def run_fitter(timeID,
               output_folder,
               pulse_input_folders,
               guess_timings,
               souces_to_fit,
               guess_source_locations,
               source_polarizations,
               source_stations_to_exclude,
               source_antennas_to_exclude,
               bad_ants,
               ref_station="CS002",
               min_ant_amplitude=10,
               num_itters=1000,
               error_deviation=0.5E-9,
               antenna_error=0.5E-9):

    ##### holdovers. These globals need to be fixed, so not global....
    global station_locations, station_to_antenna_index_list, stations_with_fits, station_to_antenna_index_dict
    global referance_station, station_order, sorted_antenna_names, min_antenna_amplitude, ant_locs, bad_antennas
    global current_delays_guess, processed_data_folder

    referance_station = ref_station
    min_antenna_amplitude = min_ant_amplitude
    bad_antennas = bad_ants

    if referance_station in guess_timings:
        ref_T = guess_timings[referance_station]
        guess_timings = {
            station: T - ref_T
            for station, T in guess_timings.items()
            if station != referance_station
        }

    processed_data_folder = processed_data_dir(timeID)

    data_dir = processed_data_folder + "/" + output_folder
    if not isdir(data_dir):
        mkdir(data_dir)

    logging_folder = data_dir + '/logs_and_plots'
    if not isdir(logging_folder):
        mkdir(logging_folder)

    #Setup logger and open initial data set
    log = logger()
    log.set(
        logging_folder +
        "/log_out.txt")  ## TODo: save all output to a specific output folder
    log.take_stderr()
    log.take_stdout()

    print("timeID:", timeID)
    print("date and time run:", time.strftime("%c"))
    print("input folders:", pulse_input_folders)
    print("source IDs to fit:", souces_to_fit)
    print("guess locations:", guess_source_locations)
    print("polarization to use:", source_polarizations)
    print("source stations to exclude:", source_stations_to_exclude)
    print("source antennas to exclude:", source_antennas_to_exclude)
    print("bad antennas:", bad_ants)
    print("referance station:", ref_station)
    print("guess delays:", guess_timings)
    print('pulse error:', error_deviation)
    print('antenna error:', antenna_error)
    print()

    #### open data and data processing stuff ####
    print("loading data")
    raw_fpaths = filePaths_by_stationName(timeID)
    raw_data_files = {
        sname: MultiFile_Dal1(fpaths, force_metadata_ant_pos=True)
        for sname, fpaths in raw_fpaths.items()
        if sname in chain(guess_timings.keys(), [referance_station])
    }

    #### sort antennas and stations ####
    station_order = list(
        guess_timings.keys())  ## note this doesn't include reference station
    sorted_antenna_names = []
    station_to_antenna_index_dict = {}
    ant_loc_dict = {}

    for sname in station_order + [referance_station]:
        first_index = len(sorted_antenna_names)

        stat_data = raw_data_files[sname]
        even_ant_names = stat_data.get_antenna_names()[::2]
        even_ant_locs = stat_data.get_LOFAR_centered_positions()[::2]

        sorted_antenna_names += even_ant_names

        for ant_name, ant_loc in zip(even_ant_names, even_ant_locs):
            ant_loc_dict[ant_name] = ant_loc

        station_to_antenna_index_dict[sname] = (first_index,
                                                len(sorted_antenna_names))

    ant_locs = np.zeros((len(sorted_antenna_names), 3))
    for i, ant_name in enumerate(sorted_antenna_names):
        ant_locs[i] = ant_loc_dict[ant_name]

    station_locations = {
        sname: ant_locs[station_to_antenna_index_dict[sname][0]]
        for sname in station_order + [referance_station]
    }
    station_to_antenna_index_list = [
        station_to_antenna_index_dict[sname]
        for sname in station_order + [referance_station]
    ]

    #### sort the delays guess, and account for station locations ####
    current_delays_guess = np.array(
        [guess_timings[sname] for sname in station_order])
    #    original_delays = np.array( current_delays_guess )

    #### open info from part 1 ####

    input_manager = Part1_input_manager(pulse_input_folders)

    #### first we fit the known sources ####
    current_sources = []
    #    next_source = 0
    for knownID in souces_to_fit:

        source_ID, input_name = input_manager.known_source(knownID)

        print("prep fitting:", source_ID)

        location = guess_source_locations[source_ID]

        ## make source
        source_to_add = source_object(source_ID, input_name, location,
                                      source_stations_to_exclude[source_ID],
                                      source_antennas_to_exclude[source_ID],
                                      num_itters)
        current_sources.append(source_to_add)

        polarity = source_polarizations[source_ID]

        source_to_add.prep_for_fitting(polarity, guess_timings)

    fitter = stochastic_fitter_dt(current_sources)

    all_delays = np.empty((num_itters, fitter.num_delays), dtype=np.double)
    all_RMSs = np.empty(num_itters, dtype=np.double)
    for i in range(num_itters):
        all_delays[i, :], all_RMSs[i] = fitter.rerun(error_deviation,
                                                     antenna_error)

        fitter.employ_result(current_sources)
        print('run', i, 'RMS:', all_RMSs[i])

    print()
    print()
    print("station timing errors:")
    for i, sname in zip(range(fitter.num_delays), station_order):
        print(sname, ":", np.std(all_delays[:, i]))

    print()
    print()

    ### get average X, Y, Z for each itteraion
    ave_X = np.zeros(num_itters)
    ave_Y = np.zeros(num_itters)
    ave_Z = np.zeros(num_itters)

    for source in current_sources:
        ave_X += source.solutions[:, 0]
        ave_Y += source.solutions[:, 1]
        ave_Z += source.solutions[:, 2]

    ave_X /= len(current_sources)
    ave_Y /= len(current_sources)
    ave_Z /= len(current_sources)

    print("absolute location errors:")
    print("X", np.std(ave_X), "Y", np.std(ave_Y), "Z", np.std(ave_Z))

    print()
    print()
    print("relative location errors")

    for source in current_sources:
        source.solutions[:, 0] -= ave_X
        source.solutions[:, 1] -= ave_Y
        source.solutions[:, 2] -= ave_Z

        print("source", source.ID)
        print("  ", np.std(source.solutions[:, 0]),
              np.std(source.solutions[:, 1]), np.std(source.solutions[:, 2]))

    print()
    print()

    print("average RMS", np.average(all_RMSs), "std of RMS", np.std(all_RMSs))
Example #20
0
import json

#Own module imports
from stokes_utils import zenith_to_src
from pulse_calibration import calibrate
from stokes import stokes_params, stokes_plotter
from stokesIO import save_polarization_data

#####################
##    SET PATHS    ##
#####################
timeID = "D20190424T210306.154Z"

utilities.default_raw_data_loc = "/home/student4/Marten/KAP_data_link/lightning_data"
utilities.default_processed_data_loc = "/home/student4/Marten/processed_files"
processed_data_folder = processed_data_dir(timeID)

station_delay_file = "station_delays.txt"
polarization_flips = "polarization_flips.txt"
bad_antennas = "bad_antennas.txt"
additional_antenna_delays = "ant_delays.txt"

polarization_flips = read_antenna_pol_flips(processed_data_folder + '/' +
                                            polarization_flips)
bad_antennas = read_bad_antennas(processed_data_folder + '/' + bad_antennas)
additional_antenna_delays = read_antenna_delays(processed_data_folder + '/' +
                                                additional_antenna_delays)
station_timing_offsets = read_station_delays(processed_data_folder + '/' +
                                             station_delay_file)

raw_fpaths = filePaths_by_stationName(timeID)
Example #21
0
def save_EventByLoc(timeID, XYZT, station_timing_delays, pulse_index, output_folder, pulse_width=50, min_ant_amp=5, upsample_factor=0,
                    polarization_flips="polarization_flips.txt", bad_antennas="bad_antennas.txt", additional_antenna_delays = "ant_delays.txt"):
    
    processed_data_folder = processed_data_dir(timeID)
    
    polarization_flips = read_antenna_pol_flips( processed_data_folder + '/' + polarization_flips )
    bad_antennas = read_bad_antennas( processed_data_folder + '/' + bad_antennas )
    additional_antenna_delays = read_antenna_delays(  processed_data_folder + '/' + additional_antenna_delays )
    
    data_dir = processed_data_folder + "/" + output_folder
    if not isdir(data_dir):
        mkdir(data_dir)
        
    logging_folder = data_dir + '/logs_and_plots'
    if not isdir(logging_folder):
        mkdir(logging_folder)

    #Setup logger and open initial data set
    log = logger()
    log.set(logging_folder + "/log_out_"+str(pulse_index)+"_.txt") ## TODo: save all output to a specific output folder
    log.take_stderr()
    log.take_stdout()
    
    print("saving traces to file", pulse_index)
    print("location:", XYZT)
    print("upsample_factor:", upsample_factor)
    
    print()
    print()
    print("station timing offsets")
    print(station_timing_delays)
    
    print()
    print()
    print("pol flips")
    print(polarization_flips)
    
    print()
    print()
    print("bad antennas")
    print(bad_antennas)
    
    print()
    print()
    print("additional antenna delays")
    print(additional_antenna_delays)
    
    
    
    raw_fpaths = filePaths_by_stationName(timeID)
    raw_data_files = {sname:MultiFile_Dal1(fpaths, force_metadata_ant_pos=True, polarization_flips=polarization_flips, bad_antennas=bad_antennas, additional_ant_delays=additional_antenna_delays,
                                           station_delay=station_timing_delays[sname]) for sname,fpaths in raw_fpaths.items() if sname in station_timing_delays}
    
    data_filters = {sname:window_and_filter(timeID=timeID,sname=sname) for sname in station_timing_delays}
    
    trace_locator = getTrace_fromLoc( raw_data_files, data_filters )
    
    print()
    print()
    print("data opened")
    
    out_fname = data_dir + "/potSource_"+str(pulse_index)+".h5"
    out_file = h5py.File(out_fname, "w")
    for sname in station_timing_delays.keys():
        TBB_file = raw_data_files[ sname ]
        TBB_file.find_and_set_polarization_delay()
        antenna_names = TBB_file.get_antenna_names()
        
        
        h5_statGroup = out_file.create_group( sname )
        print()
        print(sname)
        
        for even_ant_i in range(0,len(antenna_names),2):
            even_ant_name = antenna_names[ even_ant_i ]
            odd_ant_name = antenna_names[ even_ant_i+1 ]
            
            starting_index, PolE_offset, throw, PolE_trace = trace_locator.get_trace_fromLoc(XYZT, even_ant_name, pulse_width, do_remove_RFI=True, do_remove_saturation=True)
            throw, PolO_offset, throw, PolO_trace = trace_locator.get_trace_fromIndex(starting_index, odd_ant_name, pulse_width, do_remove_RFI=True, do_remove_saturation=True)
            
            PolE_HE = np.abs(PolE_trace)
            PolO_HE = np.abs(PolO_trace)
            
            
            h5_Ant_dataset = h5_statGroup.create_dataset(even_ant_name, (4, pulse_width ), dtype=np.double)
            
            h5_Ant_dataset[0] = np.real(PolE_trace)
            h5_Ant_dataset[1] = PolE_HE
            h5_Ant_dataset[2] = np.real(PolO_trace)
            h5_Ant_dataset[3] = PolO_HE
            
            ### note that peak time should NOT account for station timing offsets!
            
            h5_Ant_dataset.attrs['starting_index'] = starting_index
            h5_Ant_dataset.attrs['PolE_timeOffset'] = -(PolE_offset - station_timing_delays[sname])
            h5_Ant_dataset.attrs['PolO_timeOffset'] = -(PolO_offset - station_timing_delays[sname])
            h5_Ant_dataset.attrs['PolE_timeOffset_CS'] = (PolE_offset - station_timing_delays[sname])
            h5_Ant_dataset.attrs['PolO_timeOffset_CS'] = (PolO_offset - station_timing_delays[sname])
            
            
            
            
            sample_time = 5.0E-9
            if upsample_factor > 1:
                PolE_HE = resample(PolE_HE, len(PolE_HE)*upsample_factor )
                PolO_HE = resample(PolO_HE, len(PolO_HE)*upsample_factor )
                
                sample_time /= upsample_factor
            
            
            if np.max(PolE_HE)> min_ant_amp:
                
                
                PolE_peak_finder = parabolic_fit( PolE_HE )
                h5_Ant_dataset.attrs['PolE_peakTime'] =  starting_index*5.0E-9 - (PolE_offset-station_timing_delays[sname]) + PolE_peak_finder.peak_index*sample_time
            else:
                h5_Ant_dataset.attrs['PolE_peakTime'] = np.nan
            
            if np.max(PolO_HE)> min_ant_amp:
                
                
                PolO_peak_finder = parabolic_fit( PolO_HE )
                h5_Ant_dataset.attrs['PolO_peakTime'] =  starting_index*5.0E-9 - (PolO_offset-station_timing_delays[sname]) + PolO_peak_finder.peak_index*sample_time
            else:
                h5_Ant_dataset.attrs['PolO_peakTime'] =  np.nan
            
            print("  ", even_ant_name, h5_Ant_dataset.attrs['PolE_peakTime'], h5_Ant_dataset.attrs['PolO_peakTime'])
                
            
    out_file.close()
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
    
Example #22
0
    def __init__(self,
                 timeID,
                 guess_delays,
                 block_size,
                 initial_block,
                 num_blocks,
                 working_folder,
                 other_folder=None,
                 max_num_stations=np.inf,
                 guess_location=None,
                 bad_stations=[],
                 polarization_flips="polarization_flips.txt",
                 bad_antennas="bad_antennas.txt",
                 additional_antenna_delays="ant_delays.txt",
                 do_remove_saturation=True,
                 do_remove_RFI=True,
                 positive_saturation=2046,
                 negative_saturation=-2047,
                 saturation_post_removal_length=50,
                 saturation_half_hann_length=50,
                 referance_station="CS002",
                 pulse_length=50,
                 upsample_factor=4,
                 min_antenna_amplitude=5,
                 fix_polarization_delay=True):

        self.pressed_data = None
        #guess_location = np.array(guess_location[:3])

        self.block_size = block_size
        self.num_blocks = num_blocks

        self.positive_saturation = positive_saturation
        self.negative_saturation = negative_saturation
        self.saturation_post_removal_length = saturation_post_removal_length
        self.saturation_half_hann_length = saturation_half_hann_length
        self.do_remove_saturation = do_remove_saturation
        self.do_remove_RFI = do_remove_RFI

        #### open data ####
        processed_data_folder = processed_data_dir(timeID)
        polarization_flips = read_antenna_pol_flips(processed_data_folder +
                                                    '/' + polarization_flips)
        bad_antennas = read_bad_antennas(processed_data_folder + '/' +
                                         bad_antennas)
        additional_antenna_delays = read_antenna_delays(
            processed_data_folder + '/' + additional_antenna_delays)

        raw_fpaths = filePaths_by_stationName(timeID)
        station_names = [
            sname for sname in raw_fpaths.keys() if sname not in bad_stations
        ]
        self.TBB_files = {sname:MultiFile_Dal1(raw_fpaths[sname], polarization_flips=polarization_flips, bad_antennas=bad_antennas, additional_ant_delays=additional_antenna_delays) \
                          for sname in station_names}

        if fix_polarization_delay:
            for sname, file in self.TBB_files.items():

                #                delays = file.get_timing_callibration_delays()
                #                print()
                #                print()
                #                print(sname)
                #                for even_ant_i in range(0,len(delays),2):
                #                    print("  ", delays[even_ant_i+1]-delays[even_ant_i])

                file.find_and_set_polarization_delay()

#                delays = file.get_timing_callibration_delays()

#                print("after")
#                for even_ant_i in range(0,len(delays),2):
#                    print("  ", delays[even_ant_i+1]-delays[even_ant_i])

#self.RFI_filters = {sname:window_and_filter(timeID=timeID,sname=sname) for sname in station_names}
        self.RFI_filters = {
            sname: window_and_filter(timeID=timeID,
                                     sname=sname,
                                     blocksize=block_size)
            for sname in station_names
        }

        #### some data things ####
        self.antenna_time_corrections = {
            sname: TBB_file.get_total_delays()
            for sname, TBB_file in self.TBB_files.items()
        }
        #        ref_antenna_delay = self.antenna_time_corrections[ referance_station ][0]
        #        for station_corrections in self.antenna_time_corrections.values():
        #            station_corrections -= ref_antenna_delay

        max_num_antennas = np.max(
            [len(delays) for delays in self.antenna_time_corrections.values()])
        self.temp_data_block = np.empty(
            (max_num_antennas, num_blocks, block_size), dtype=np.double)
        self.time_array = np.arange(block_size) * 5.0E-9

        self.figure = plt.gcf()
        self.axes = plt.gca()

        #### make managers
        guess_delays = {
            sname: delay
            for sname, delay in guess_delays.items()
            if sname not in bad_stations
        }
        self.clock_offset_manager = clock_offsets(referance_station,
                                                  guess_delays, guess_location,
                                                  self.TBB_files)
        self.frame_manager = frames(initial_block, int(num_blocks / 2),
                                    station_names, max_num_stations,
                                    referance_station, block_size, num_blocks)

        rem_sat_curry = cur(remove_saturation, 5)(
            positive_saturation=positive_saturation,
            negative_saturation=negative_saturation,
            post_removal_length=saturation_post_removal_length,
            half_hann_length=saturation_half_hann_length)
        self.pulse_manager = pulses(
            pulse_length=pulse_length,
            block_size=block_size,
            out_folder=working_folder,
            other_folder=other_folder,
            TBB_data_dict=self.TBB_files,
            used_delay_dict=self.antenna_time_corrections,
            upsample_factor=upsample_factor,
            min_ant_amp=min_antenna_amplitude,
            referance_station=referance_station,
            RFI_filter_dict=(self.RFI_filters if self.do_remove_RFI else None),
            remove_saturation_curry=(rem_sat_curry
                                     if self.do_remove_saturation else None))

        self.plot()

        self.mode = 0  ##0 is change delay, 1 is set peak
        self.rect_selector = RectangleSelector(plt.gca(),
                                               self.rectangle_callback,
                                               useblit=True,
                                               rectprops=dict(alpha=0.5,
                                                              facecolor='red'),
                                               button=1,
                                               state_modifier_keys={
                                                   'move': '',
                                                   'clear': '',
                                                   'square': '',
                                                   'center': ''
                                               })

        self.mouse_press = self.figure.canvas.mpl_connect(
            'button_press_event', self.mouse_press)
        self.mouse_release = plt.gcf().canvas.mpl_connect(
            'button_release_event', self.mouse_release)

        self.key_press = plt.gcf().canvas.mpl_connect('key_press_event',
                                                      self.key_press_event)

        self.home_lims = [self.axes.get_xlim(), self.axes.get_ylim()]

        plt.show()
Example #23
0
    def __init__(self,
                 blocksize=None,
                 find_RFI=None,
                 timeID=None,
                 sname=None,
                 lower_filter=30.0E6,
                 upper_filter=80.0E6,
                 half_window_percent=0.1,
                 time_per_sample=5.0E-9,
                 filter_roll_width=2.5E6):
        self.lower_filter = lower_filter
        self.upper_filter = upper_filter

        if timeID is not None:
            if find_RFI is None:
                find_RFI = "/findRFI/findRFI_results"
            find_RFI = processed_data_dir(timeID) + find_RFI

        if isinstance(find_RFI, str):  ## load findRFI data from file
            with open(find_RFI, 'rb') as fin:
                find_RFI = load(fin)[sname]

        self.RFI_data = find_RFI

        if self.RFI_data is not None:
            if blocksize is None:
                blocksize = self.RFI_data['blocksize']
            elif self.RFI_data['blocksize'] != blocksize:
                print("blocksize and findRFI blocksize must match")
                quit()
        elif blocksize is None:
            print("window and filter needs a blocksize")
            ## TODO: check block sizes are consistant
            quit()

        self.blocksize = blocksize
        self.half_window_percent = half_window_percent
        self.half_hann_window = half_hann_window(blocksize,
                                                 half_window_percent)

        FFT_frequencies = np.fft.fftfreq(blocksize, d=time_per_sample)
        self.bandpass_filter = np.zeros(len(FFT_frequencies), dtype=complex)
        self.bandpass_filter[np.logical_and(
            FFT_frequencies >= lower_filter,
            FFT_frequencies <= upper_filter)] = 1.0
        width = filter_roll_width / (FFT_frequencies[1] - FFT_frequencies[0])
        if width > 1:
            gaussian_weights = gaussian(len(FFT_frequencies), width)
            self.bandpass_filter = np.convolve(self.bandpass_filter,
                                               gaussian_weights,
                                               mode='same')
        self.bandpass_filter /= np.max(
            self.bandpass_filter)  ##convolution changes the peak value

        self.FFT_frequencies = FFT_frequencies

        ## completly reject low-frequency bits
        self.bandpass_filter[0] = 0.0
        self.bandpass_filter[1] = 0.0

        ##reject RFI
        if self.RFI_data is not None:
            self.bandpass_filter[self.RFI_data["dirty_channels"]] = 0.0
Example #24
0
def plot_station(event_ID, sname_to_plot, plot_bad_antennas,
               timeID, output_folder, pulse_input_folders, guess_timings, sources_to_fit, guess_source_locations,
               source_polarizations, source_stations_to_exclude, source_antennas_to_exclude, bad_ants,
               antennas_to_recalibrate={}, min_ant_amplitude=10, ref_station="CS002"):
    
    processed_data_folder = processed_data_dir( timeID )
    file_manager = input_manager( processed_data_folder, pulse_input_folders )
    throw, input_Fname = file_manager.known_source( event_ID )
    
    
    data_file = h5py.File(input_Fname, "r")
    stat_group = data_file[ sname_to_plot ]
    
    fpaths = filePaths_by_stationName( timeID )[ sname_to_plot ]
    station_file = MultiFile_Dal1(fpaths, force_metadata_ant_pos=True)
    
    source_XYZT = guess_source_locations[event_ID]
    source_polarization = source_polarizations[event_ID]
    antennas_to_exclude = bad_ants + source_antennas_to_exclude[event_ID]
    
    ref_station_delay = 0.0
    if ref_station in guess_timings:
        ref_station_delay = guess_timings[ref_station]
        
    stat_delay = 0.0
    if sname_to_plot != ref_station:
        stat_delay = guess_timings[sname_to_plot] - ref_station_delay
    
    even_HEs = []
    odd_HEs = []
    even_sig = []
    odd_sig = []
    even_good = []
    odd_good = []
    even_offet = []
    odd_offset = []
    even_peakT_offset = []
    odd_peakT_offset = []
    even_ant_names = []
    odd_ant_names = []
    
    peak_amp = 0.0
    ## first we open the data
    even_SSqE = 0.0
    odd_SSqE = 0.0
    even_N = 0
    odd_N = 0
    for ant_name, ant_loc in zip(station_file.get_antenna_names(),station_file.get_LOFAR_centered_positions()):
        if ant_name not in stat_group:
            continue
        
        even_ant_name = ant_name
        odd_ant_name = even_antName_to_odd( ant_name )
        
        ant_dataset = stat_group[ant_name]
        even_trace = np.array( ant_dataset[0] )
        even_HE = np.array( ant_dataset[1] )
        odd_trace = np.array( ant_dataset[2] )
        odd_HE = np.array( ant_dataset[3] )
        
        even_amp = np.max(even_HE)
        odd_amp = np.max(odd_HE)
        
        M = max(even_amp, odd_amp)
        if M>peak_amp:
            peak_amp = M
        
        travel_delay = np.sqrt( (ant_loc[0]-source_XYZT[0])**2 + (ant_loc[1]-source_XYZT[1])**2 + (ant_loc[2]-source_XYZT[2])**2 )/v_air
        travel_delay_odd = travel_delay
        
        if source_polarization==3  and len(source_XYZT)==8:
            travel_delay_odd = np.sqrt( (ant_loc[0]-source_XYZT[4])**2 + (ant_loc[1]-source_XYZT[5])**2 + (ant_loc[2]-source_XYZT[6])**2 )/v_air
        
        even_time =  - travel_delay - stat_delay -source_XYZT[3]
        odd_time =  - travel_delay_odd - stat_delay
        
        if even_ant_name in antennas_to_recalibrate:
            even_time -= antennas_to_recalibrate[even_ant_name]
            
        if odd_ant_name in antennas_to_recalibrate:
            odd_time -= antennas_to_recalibrate[odd_ant_name]  
            
        if source_polarization==0 or source_polarization==1 or len(source_XYZT)==4:
            odd_time -= source_XYZT[3]
        elif (source_polarization==2 or source_polarization==3) and len(source_XYZT)==5:
            odd_time -= source_XYZT[4]
        elif (source_polarization==2 or source_polarization==3)  and len(source_XYZT)==8:
            odd_time -= source_XYZT[7]
            
        even_peak_time = ant_dataset.attrs["PolE_peakTime"] + even_time
        odd_peak_time = ant_dataset.attrs["PolO_peakTime"] + odd_time
            
        even_time += ant_dataset.attrs['starting_index']*5.0E-9 - ant_dataset.attrs['PolE_timeOffset_CS']
        odd_time += ant_dataset.attrs['starting_index']*5.0E-9 - ant_dataset.attrs['PolO_timeOffset_CS']
        
        
        even_is_good = even_amp>min_ant_amplitude
        if not even_is_good:
            print( even_ant_name, ": amp too low" )
        else:
            even_is_good = not (even_ant_name in antennas_to_exclude)
            if not even_is_good:
                print( even_ant_name, ": excluded" )
            else:
                print( even_ant_name, ": good" )
            
        odd_is_good  = odd_amp>min_ant_amplitude
        if not odd_is_good:
            print( odd_ant_name, ": amp too low" )
        else:
            odd_is_good = not (odd_ant_name in antennas_to_exclude)
            if not odd_is_good:
                print( odd_ant_name, ": excluded" )
            else:
                print( odd_ant_name, ": good" )
                
            
        even_HEs.append( even_HE )
        odd_HEs.append( odd_HE )
        even_sig.append( even_trace )
        odd_sig.append( odd_trace )
        even_good.append( even_is_good )
        odd_good.append( odd_is_good )
        even_offet.append( even_time )
        odd_offset.append( odd_time )
        even_ant_names.append( even_ant_name )
        odd_ant_names.append( odd_ant_name )
        even_peakT_offset.append( even_peak_time )
        odd_peakT_offset.append( odd_peak_time )
        
        if even_is_good:
            even_SSqE += even_peak_time*even_peak_time
            even_N += 1
            
        if odd_is_good:
            odd_SSqE += odd_peak_time*odd_peak_time
            odd_N += 1
    if even_N > 0:
        print('even RMS:', np.sqrt(even_SSqE/even_N),end=' ')
    if odd_N > 0:
        print('odd RMS:', np.sqrt(odd_SSqE/odd_N), end='')
    print()
        
    current_offset = 0
    for pair_i in range(len(even_HEs)):
        
        even_T = np.arange( len(even_HEs[pair_i]) )*5.0E-9 + even_offet[pair_i]
        odd_T = np.arange( len(odd_HEs[pair_i]) )*5.0E-9 + odd_offset[pair_i]
        
        if even_good[pair_i] or plot_bad_antennas:
            plt.plot(even_T, even_HEs[pair_i]/peak_amp + current_offset, 'g')
            plt.plot(even_T, even_sig[pair_i]/peak_amp + current_offset, 'g')
            
        if even_good[pair_i]:
            plt.plot( (even_peakT_offset[pair_i],even_peakT_offset[pair_i]), (current_offset,current_offset+1), 'g' )
            
        if odd_good[pair_i] or plot_bad_antennas:
            plt.plot(odd_T, odd_HEs[pair_i]/peak_amp + current_offset, 'm')
            plt.plot(odd_T, odd_sig[pair_i]/peak_amp + current_offset, 'm')
            
        if odd_good[pair_i]:
            plt.plot( (odd_peakT_offset[pair_i],odd_peakT_offset[pair_i]), (current_offset,current_offset+1), 'm' )
        
        even_str = even_ant_names[pair_i] + " "
        odd_str = odd_ant_names[pair_i] + " "
        
        if even_good[pair_i]:
            even_str += ': good'
        else:
            even_str += ': bad'
        
        if odd_good[pair_i]:
            odd_str += ': good'
        else:
            odd_str += ': bad'
            
        plt.annotate(odd_str,  xy=(odd_T[0], current_offset+0.3), c='m')
        plt.annotate(even_str, xy=(even_T[0], current_offset+0.6), c='g')
        
        current_offset += 2
        
    plt.axvline(x=0)
    plt.show()
            
        
        
        
    
def recalibrate_pulse(timeID, input_fname, output_fname, set_polarization_delay=True, upsample_factor=4, polarization_flips="polarization_flips.txt"):

    processed_data_folder = processed_data_dir(timeID)
    raw_fpaths = filePaths_by_stationName(timeID)
    polarization_flips = read_antenna_pol_flips( processed_data_folder + '/' + polarization_flips )
    
    input_file = h5py.File(processed_data_folder+'/'+input_fname, "r")
    
    try:
        output_file = h5py.File(processed_data_folder+'/'+output_fname, "r+")
    except:
        output_file = h5py.File(processed_data_folder+'/'+output_fname, "w")
        
    sample_time = 5.0e-9
    if upsample_factor>1:
        sample_time /= upsample_factor
    
    for sname, h5_statGroup in input_file.items():
        out_statGroup = output_file.require_group(sname)
        print()
        print()
        print(sname)
        
        datafile = MultiFile_Dal1(raw_fpaths[sname], polarization_flips=polarization_flips)
        
        if set_polarization_delay:
            datafile.find_and_set_polarization_delay()
            
        antenna_calibrations = { antname:calibration for antname,calibration in zip(datafile.get_antenna_names(), datafile.get_total_delays()) }
        
        for antname, in_antData in h5_statGroup.items():
            out_statGroup.copy(in_antData,  out_statGroup, name= antname)
            out_antData = out_statGroup[antname]
            
            old_even =  out_antData.attrs['PolE_timeOffset_CS']
            old_odd = out_antData.attrs['PolO_timeOffset_CS']
            
            new_even_delay = antenna_calibrations[antname]
            new_odd_delay = antenna_calibrations[ even_antName_to_odd(antname) ]
            
            out_antData.attrs['PolE_timeOffset'] = -new_even_delay ## NOTE: due to historical reasons, there is a sign flip here
            out_antData.attrs['PolO_timeOffset'] = -new_odd_delay ## NOTE: due to historical reasons, there is a sign flip here
            out_antData.attrs['PolE_timeOffset_CS'] = new_even_delay
            out_antData.attrs['PolO_timeOffset_CS'] = new_odd_delay
            
            print(antname, old_even-new_even_delay, old_odd-new_odd_delay)
            
            starting_index = out_antData.attrs['starting_index']
            
            if np.isfinite( out_antData.attrs['PolE_peakTime'] ):
                
                polE_HE = out_antData[1]
                
                if upsample_factor>1:
                    polE_HE = resample(polE_HE, len(polE_HE)*upsample_factor )
            
                PolE_peak_finder = parabolic_fit( polE_HE  )
                out_antData.attrs['PolE_peakTime'] =  starting_index*5.0E-9 - new_even_delay + PolE_peak_finder.peak_index*sample_time
            
            if np.isfinite( out_antData.attrs['PolO_peakTime'] ):
                
                polO_HE = out_antData[3]
                
                if upsample_factor>1:
                    polO_HE = resample(polO_HE, len(polO_HE)*upsample_factor )
            
                PolO_peak_finder = parabolic_fit( polO_HE  )
                out_antData.attrs['PolO_peakTime'] =  starting_index*5.0E-9 - new_odd_delay + PolO_peak_finder.peak_index*sample_time
def run_fitter(timeID, output_folder, pulse_input_folders, guess_timings, souces_to_fit, guess_source_locations,
               source_polarizations, source_stations_to_exclude, source_antennas_to_exclude, bad_ants,
               X_deviations, Y_deviations, Z_deviations,
               ref_station="CS002", min_ant_amplitude=10, max_stoch_loop_itters = 2000, min_itters_till_convergence = 100,
               initial_jitter_width = 100000E-9, final_jitter_width = 1E-9, cooldown_fraction = 10.0, strong_cooldown_fraction = 100.0,
               fitter = "dt"):
    
    ##### holdovers. These globals need to be fixed, so not global....
    global station_locations, station_to_antenna_index_list, stations_with_fits, station_to_antenna_index_dict
    global referance_station, station_order, sorted_antenna_names, min_antenna_amplitude, ant_locs, bad_antennas
    global max_itters_per_loop, itters_till_convergence, min_jitter_width, max_jitter_width, cooldown, strong_cooldown
    global current_delays_guess, processed_data_folder
    
    referance_station = ref_station
    min_antenna_amplitude = min_ant_amplitude
    bad_antennas = bad_ants
    max_itters_per_loop = max_stoch_loop_itters
    itters_till_convergence = min_itters_till_convergence
    max_jitter_width = initial_jitter_width
    min_jitter_width = final_jitter_width
    cooldown = cooldown_fraction
    strong_cooldown = strong_cooldown_fraction
    
    if referance_station in guess_timings:
        ref_T = guess_timings[referance_station]
        guess_timings = {station:T-ref_T for station,T in guess_timings.items() if station != referance_station}
        
    processed_data_folder = processed_data_dir(timeID)
    
    data_dir = processed_data_folder + "/" + output_folder
    if not isdir(data_dir):
        mkdir(data_dir)
        
    logging_folder = data_dir + '/logs_and_plots'
    if not isdir(logging_folder):
        mkdir(logging_folder)



    #Setup logger and open initial data set
    log = logger()
    log.set(logging_folder + "/log_out.txt") ## TODo: save all output to a specific output folder
    log.take_stderr()
    log.take_stdout()
    
    
    print("timeID:", timeID)
    print("date and time run:", time.strftime("%c") )
    print("input folders:", pulse_input_folders)
    print("source IDs to fit:", souces_to_fit)
    print("guess locations:", guess_source_locations)
    print("polarization to use:", source_polarizations)
    print("source stations to exclude:", source_stations_to_exclude)
    print("source antennas to exclude:", source_antennas_to_exclude)
    print("bad antennas:", bad_ants)
    print("referance station:", ref_station)
    print("fitter type:", fitter)
    print("guess delays:", guess_timings)
    print()
    print()
    
        #### open data and data processing stuff ####
    print("loading data")
    raw_fpaths = filePaths_by_stationName(timeID)
    raw_data_files = {sname:MultiFile_Dal1(fpaths, force_metadata_ant_pos=True) for sname,fpaths in raw_fpaths.items() if sname in chain(guess_timings.keys(), [referance_station]) }
    
    
    
    
    #### sort antennas and stations ####
    station_order = list(guess_timings.keys())## note this doesn't include reference station
    sorted_antenna_names = []
    station_to_antenna_index_dict = {}
    ant_loc_dict = {}
    
    for sname in station_order + [referance_station]:
        first_index = len(sorted_antenna_names)
        
        stat_data = raw_data_files[sname]
        even_ant_names = stat_data.get_antenna_names()[::2]
        even_ant_locs = stat_data.get_LOFAR_centered_positions()[::2]
        
        sorted_antenna_names += even_ant_names
        
        for ant_name, ant_loc in zip(even_ant_names,even_ant_locs):
            ant_loc_dict[ant_name] = ant_loc
                
        station_to_antenna_index_dict[sname] = (first_index, len(sorted_antenna_names))
    
    ant_locs = np.zeros( (len(sorted_antenna_names), 3))
    for i, ant_name in enumerate(sorted_antenna_names):
        ant_locs[i] = ant_loc_dict[ant_name]
    
    station_locations = {sname:ant_locs[station_to_antenna_index_dict[sname][0]] for sname in station_order + [referance_station]}
    station_to_antenna_index_list = [station_to_antenna_index_dict[sname] for sname in station_order + [referance_station]]
    
    
    #### sort the delays guess, and account for station locations ####
    current_delays_guess = np.array([guess_timings[sname] for sname in station_order])
    original_delays = np.array( current_delays_guess )        
    
    
    
    
    #### open info from part 1 ####

    input_manager = Part1_input_manager( pulse_input_folders )



    #### first we fit the known sources ####
    current_sources = []
#    next_source = 0
    for knownID in souces_to_fit:
        
        source_ID, input_name = input_manager.known_source( knownID )
        
        print("prep fitting:", source_ID)
            
            
        location = guess_source_locations[source_ID]
        
        ## make source
        source_to_add = source_object(source_ID, input_name, location, source_stations_to_exclude[source_ID], source_antennas_to_exclude[source_ID] )
        current_sources.append( source_to_add )


        polarity = source_polarizations[source_ID]

            
        source_to_add.prep_for_fitting(polarity)
        
    print()
    print("fitting known sources")
    if fitter!='dt':
        print("only dt")
        quit()
        
    first_source = current_sources[0]
    original_XYZT = np.array( first_source.guess_XYZT )
    
    if X_deviations is not None:
        RMS_values = np.empty( len(X_deviations) )
        
        first_source.guess_XYZT[:] = original_XYZT
        for i in range(len(X_deviations)):
        
            first_source.guess_XYZT[0] = original_XYZT[0] + X_deviations[i]
            fitter = stochastic_fitter_dt(current_sources)
            RMS_values[i] = fitter.RMS
            
            print('X', X_deviations[i], fitter.RMS)
            
        plt.plot(X_deviations, RMS_values)
        plt.show()
        
    
    if Y_deviations is not None:
        RMS_values = np.empty( len(Y_deviations) )
        
        first_source.guess_XYZT[:] = original_XYZT
        for i in range(len(Y_deviations)):
        
            first_source.guess_XYZT[1] = original_XYZT[1] + Y_deviations[i]
            fitter = stochastic_fitter_dt(current_sources)
            RMS_values[i] = fitter.RMS
            
            print('Y', Y_deviations[i], fitter.RMS)
            
        plt.plot(Y_deviations, RMS_values)
        plt.show()
    
        
    if Z_deviations is not None:
        RMS_values = np.empty( len(Z_deviations) )
        
        first_source.guess_XYZT[:] = original_XYZT
        for i in range(len(Z_deviations)):
        
            first_source.guess_XYZT[2] = original_XYZT[2] + Z_deviations[i]
            fitter = stochastic_fitter_dt(current_sources)
            RMS_values[i] = fitter.RMS
            
            print('Z', Z_deviations[i], fitter.RMS)
            
        plt.plot(Z_deviations, RMS_values)
        plt.show()
Example #27
0
    def setup(self):
        if self.ref_station in self.guess_timings:
            ref_T = self.guess_timings[self.ref_station]
            self.guess_timings = {
                station: T - ref_T
                for station, T in self.guess_timings.items()
                if station != self.ref_station
            }

        processed_data_folder = processed_data_dir(self.timeID)

        data_dir = processed_data_folder + "/" + self.output_folder
        if not isdir(data_dir):
            mkdir(data_dir)

        #Setup logger
        logging_folder = data_dir + '/logs_and_plots'
        if not isdir(logging_folder):
            mkdir(logging_folder)

        self.log = logger()
        self.log.set(logging_folder + "/log_out.txt"
                     )  ## TODo: save all output to a specific output folder
        self.log.take_stderr()
        self.log.take_stdout()

        print("timeID:", self.timeID)
        print("date and time run:", time.strftime("%c"))
        print("input folders:", self.pulse_input_folders)
        print("source IDs to fit:", self.sources_to_fit)
        print("guess locations:", self.guess_source_locations)
        print("polarization to use:", self.source_polarizations)
        print("source stations to exclude:", self.source_stations_to_exclude)
        print("source antennas to exclude:", self.source_antennas_to_exclude)
        print("bad antennas:", self.bad_ants)
        print("referance station:", self.ref_station)
        print("guess delays:", self.guess_timings)
        print()
        print()

        #### open data and data processing stuff ####
        print("loading data")

        ## needed for ant locs
        raw_fpaths = filePaths_by_stationName(self.timeID)
        raw_data_files = {
            sname: MultiFile_Dal1(fpaths, force_metadata_ant_pos=True)
            for sname, fpaths in raw_fpaths.items()
            if sname in chain(self.guess_timings.keys(), [self.ref_station])
        }

        #### sort antennas and stations ####
        self.station_order = list(
            self.guess_timings.keys()) + [self.ref_station]
        self.sorted_antenna_names = []
        self.station_to_antenna_index_dict = {}
        self.ant_loc_dict = {}

        for sname in self.station_order:
            first_index = len(self.sorted_antenna_names)

            stat_data = raw_data_files[sname]
            ant_names = stat_data.get_antenna_names()
            stat_ant_locs = stat_data.get_LOFAR_centered_positions()

            self.sorted_antenna_names += ant_names

            for ant_name, ant_loc in zip(ant_names, stat_ant_locs):
                self.ant_loc_dict[ant_name] = ant_loc

            self.station_to_antenna_index_dict[sname] = (
                first_index, len(self.sorted_antenna_names))

        self.ant_locs = np.zeros((len(self.sorted_antenna_names), 3))
        for i, ant_name in enumerate(self.sorted_antenna_names):
            self.ant_locs[i] = self.ant_loc_dict[ant_name]

        self.station_locations = {
            sname: self.ant_locs[self.station_to_antenna_index_dict[sname][0]]
            for sname in self.station_order
        }
        self.station_to_antenna_index_list = [
            self.station_to_antenna_index_dict[sname]
            for sname in self.station_order
        ]

        #### sort the delays guess, and account for station locations ####
        self.current_delays_guess = np.array(
            [self.guess_timings[sname] for sname in self.station_order[:-1]])
        self.original_delays = np.array(self.current_delays_guess)
        self.ant_recalibrate_order = np.array([
            i for i, antname in enumerate(self.sorted_antenna_names)
            if antname in self.antennas_to_recalibrate.keys()
        ],
                                              dtype=np.int)
        self.ant_recalibrate_guess = np.array([
            self.antennas_to_recalibrate[self.sorted_antenna_names[i]]
            for i in self.ant_recalibrate_order
        ])

        self.station_indeces = np.empty(len(self.sorted_antenna_names),
                                        dtype=np.int)
        for station_index, index_range in enumerate(
                self.station_to_antenna_index_list
        ):  ## note this DOES include ref stat
            first, last = index_range
            self.station_indeces[first:last] = station_index

        #### now we open the pulses ####
        input_manager = Part1_input_manager(processed_data_folder,
                                            self.pulse_input_folders)

        self.current_sources = []
        for knownID in self.sources_to_fit:
            source_ID, input_name = input_manager.known_source(knownID)

            print("prep fitting:", source_ID)

            polarity = self.source_polarizations[source_ID]

            source_to_add = source_object(
                source_ID, input_name,
                self.source_stations_to_exclude[source_ID],
                self.source_antennas_to_exclude[source_ID])
            source_to_add.prep_for_fitting(polarity, self)

            #quit()

            self.current_sources.append(source_to_add)

        self.num_sources = len(self.current_sources)
        self.num_delays = len(self.original_delays)
        self.num_RecalAnts = len(self.ant_recalibrate_order)
        self.num_antennas = len(self.sorted_antenna_names)
        self.num_measurments = self.num_sources * self.num_antennas

        self.current_solution = np.zeros(self.num_delays + self.num_RecalAnts +
                                         4 * self.num_sources)
        self.current_solution[:self.num_delays] = self.current_delays_guess
        self.current_solution[self.num_delays:self.num_delays +
                              self.num_RecalAnts] = self.ant_recalibrate_guess

        self.fitter = delay_fitter(self.ant_locs, self.station_indeces,
                                   self.ant_recalibrate_order,
                                   self.num_sources, self.num_delays)

        initial_param_i = self.num_delays + self.num_RecalAnts
        self.num_DOF = -self.num_delays - self.num_RecalAnts - 4 * self.num_sources
        for i, PSE in enumerate(self.current_sources):
            self.current_solution[initial_param_i + 4 * i:initial_param_i + 4 *
                                  (i + 1)] = self.guess_source_locations[
                                      PSE.ID]
            self.num_DOF += PSE.num_data()
            self.fitter.set_event(PSE.pulse_times)
Example #28
0
 def __init__(self, input_folder, timeID=None):
     
     if timeID is not None:
         processed_data_folder = processed_data_dir( timeID )
         input_folder = processed_data_folder + '/' + input_folder
     
     self.input_folder = input_folder
     
     header_infile = h5py.File(input_folder + "/header.h5", "r")
     
     #### input settings ####
     self.timeID = header_infile.attrs['timeID']
     self.initial_datapoint = header_infile.attrs["initial_datapoint"]
     self.max_antennas_per_station = header_infile.attrs["max_antennas_per_station"]
     if "referance_station" in header_infile.attrs:
         self.referance_station = header_infile.attrs["referance_station"]#.decode()
     
     self.station_delays_fname = header_infile.attrs["station_delays_fname"]#.decode()
     self.additional_antenna_delays_fname = header_infile.attrs["additional_antenna_delays_fname"]#.decode()
     self.bad_antennas_fname = header_infile.attrs["bad_antennas_fname"]#.decode()
     self.pol_flips_fname = header_infile.attrs["pol_flips_fname"]#.decode()
     
     self.blocksize = header_infile.attrs["blocksize"]
     self.remove_saturation = header_infile.attrs["remove_saturation"]
     self.remove_RFI = header_infile.attrs["remove_RFI"]
     self.positive_saturation = header_infile.attrs["positive_saturation"]
     self.negative_saturation = header_infile.attrs["negative_saturation"]
     self.saturation_removal_length = header_infile.attrs["saturation_removal_length"]
     self.saturation_half_hann_length = header_infile.attrs["saturation_half_hann_length"]
     self.hann_window_fraction = header_infile.attrs["hann_window_fraction"]
     
     self.num_zeros_dataLoss_Threshold = header_infile.attrs["num_zeros_dataLoss_Threshold"]
     self.min_amplitude = header_infile.attrs["min_amplitude"]
     self.upsample_factor = header_infile.attrs["upsample_factor"]
     self.max_events_perBlock = header_infile.attrs["max_events_perBlock"]
     self.min_pulse_length_samples = header_infile.attrs["min_pulse_length_samples"]
     self.erasure_length = header_infile.attrs["erasure_length"]
     
     self.guess_distance = header_infile.attrs["guess_distance"]
     
     self.kalman_devations_toSearch = header_infile.attrs["kalman_devations_toSearch"]
     
     self.pol_flips_are_bad = header_infile.attrs["pol_flips_are_bad"]
     
     self.antenna_RMS_info = header_infile.attrs["antenna_RMS_info"]
     self.default_expected_RMS = header_infile.attrs["default_expected_RMS"]
     self.max_planewave_RMS = header_infile.attrs["max_planewave_RMS"]
     self.stop_chi_squared = header_infile.attrs["stop_chi_squared"]
     
     self.max_minimize_itters = header_infile.attrs["max_minimize_itters"]
     self.minimize_ftol = header_infile.attrs["minimize_ftol"]
     self.minimize_xtol = header_infile.attrs["minimize_xtol"]
     self.minimize_gtol = header_infile.attrs["minimize_gtol"]
     
     self.refStat_delay = header_infile.attrs["refStat_delay"] 
     self.refStat_timestamp =  header_infile.attrs["refStat_timestamp"]
     self.refStat_sampleNumber = header_infile.attrs["refStat_sampleNumber"]
     
     
     self.stations_to_exclude = header_infile.attrs["stations_to_exclude"]
     self.stations_to_exclude = [sname.decode() for sname in self.stations_to_exclude]
     
     #### processed info ####
     self.pol_flips = header_infile.attrs["polarization_flips"]
     self.pol_flips = [name.decode() for name in self.pol_flips]
     
     self.num_stations = header_infile.attrs["num_stations"]
     self.num_total_antennas = header_infile.attrs["num_antennas"]
     
     self.station_names = [ None ]*self.num_stations
     self.antenna_info = [ None ]*self.num_stations ## each item will be a list of antenna info
     
     for stat_i, stat_group in header_infile.items():
         stat_i = int(stat_i)
         sname = stat_group.attrs["sname"]#.decode()
         num_antennas = stat_group.attrs["num_antennas"]
         
         ant_info = [ None ]*num_antennas
         for ant_i, ant_group in stat_group.items():
             ant_i = int(ant_i)
             
             new_antenna_object = self.antenna_info_object()
             new_antenna_object.sname = sname
             new_antenna_object.ant_name = ant_group.attrs["antenna_name"]#.decode()
             new_antenna_object.delay = ant_group.attrs["delay"]
             new_antenna_object.planewave_RMS = ant_group.attrs["planewave_RMS"]
             new_antenna_object.location = ant_group.attrs["location"]
             
             ant_info[ant_i] = new_antenna_object
             
         self.station_names[ stat_i ] = sname 
         self.antenna_info[ stat_i ] = ant_info
Example #29
0
def plot_all_stations(event_ID, 
               timeID, output_folder, pulse_input_folders, guess_timings, sources_to_fit, guess_source_locations,
               source_polarizations, source_stations_to_exclude, source_antennas_to_exclude, bad_ants,
               antennas_to_recalibrate={}, min_ant_amplitude=10, ref_station="CS002"):
    
    processed_data_folder = processed_data_dir( timeID )
    file_manager = input_manager( processed_data_folder, pulse_input_folders )
    throw, input_Fname = file_manager.known_source( event_ID )
    
    data_file = h5py.File(input_Fname, "r")
    
    fpaths = filePaths_by_stationName( timeID )
    
    source_XYZT = guess_source_locations[event_ID]
    source_polarization = source_polarizations[event_ID]
    antennas_to_exclude = bad_ants + source_antennas_to_exclude[event_ID]
    
    ref_station_delay = 0.0
    if ref_station in guess_timings:
        ref_station_delay = guess_timings[ref_station]
    
    current_offset = 0
    for sname in data_file.keys():
        if (sname not in guess_timings and sname !=ref_station) or (sname in source_stations_to_exclude[event_ID]):
            continue
            
        stat_group = data_file[ sname ]
        station_file = MultiFile_Dal1(fpaths[sname], force_metadata_ant_pos=True)
            
        stat_delay = 0.0
        if sname != ref_station:
            stat_delay = guess_timings[sname] - ref_station_delay
        
        even_HEs = []
        odd_HEs = []
        
        even_offet = []
        odd_offset = []
        
        even_peakT_offset = []
        odd_peakT_offset = []
        
        peak_amp = 0.0
        ## first we open the data
        for ant_name, ant_loc in zip(station_file.get_antenna_names(),station_file.get_LOFAR_centered_positions()):
            if ant_name not in stat_group:
                continue
            
            even_ant_name = ant_name
            odd_ant_name = even_antName_to_odd( ant_name )
            
            ant_dataset = stat_group[ant_name]
#            even_trace = np.array( ant_dataset[0] )
            even_HE = np.array( ant_dataset[1] )
#            odd_trace = np.array( ant_dataset[2] )
            odd_HE = np.array( ant_dataset[3] )
            
            even_amp = np.max(even_HE)
            odd_amp = np.max(odd_HE)
            
            
            travel_delay = np.sqrt( (ant_loc[0]-source_XYZT[0])**2 + (ant_loc[1]-source_XYZT[1])**2 + (ant_loc[2]-source_XYZT[2])**2 )/v_air
            total_correction = travel_delay + stat_delay
            
            even_time =  - total_correction - source_XYZT[3]
            odd_time =  - total_correction
            
            if even_ant_name in antennas_to_recalibrate:
                    
                even_time -= antennas_to_recalibrate[even_ant_name]
                
            if odd_ant_name in antennas_to_recalibrate:
                odd_time -= antennas_to_recalibrate[odd_ant_name]  
                
            if source_polarization==2 and len(source_XYZT)==5:
                odd_time -= source_XYZT[4]
            else:
                odd_time -= source_XYZT[3]
                
            even_peak_time = ant_dataset.attrs["PolE_peakTime"] + even_time
            odd_peak_time = ant_dataset.attrs["PolO_peakTime"] + odd_time
                
            even_time += ant_dataset.attrs['starting_index']*5.0E-9 - ant_dataset.attrs['PolE_timeOffset_CS']
            odd_time += ant_dataset.attrs['starting_index']*5.0E-9 - ant_dataset.attrs['PolO_timeOffset_CS']
            
            even_is_good = (even_amp>min_ant_amplitude) and not (even_ant_name in antennas_to_exclude) 
            odd_is_good  = (odd_amp>min_ant_amplitude) and not (odd_ant_name in antennas_to_exclude)
                
            if (not even_is_good) and (not odd_is_good):
                continue
            
            M = max(even_amp, odd_amp)
            if M>peak_amp:
                peak_amp = M
                
            if even_is_good and source_polarization!=1:
                even_HEs.append( even_HE )
            else:
                even_HEs.append( None )
                
            if odd_is_good and source_polarization!=0:
                odd_HEs.append( odd_HE )
            else:
                odd_HEs.append( None )
        
            even_offet.append( even_time )
            odd_offset.append( odd_time )

            even_peakT_offset.append( even_peak_time )
            odd_peakT_offset.append( odd_peak_time )
            
        earliest_T = np.inf
        for pair_i in range(len(even_HEs)):
            
            if even_HEs[pair_i] is not None:
                even_T = np.arange( len(even_HEs[pair_i]) )*5.0E-9 + even_offet[pair_i]
                
                if even_T[0] < earliest_T:
                    earliest_T = even_T[0]
                
                p = plt.plot(even_T, even_HEs[pair_i]/peak_amp + current_offset)
                color = p[0].get_color()
                
                plt.plot( (even_peakT_offset[pair_i],even_peakT_offset[pair_i]), (current_offset,current_offset+1), color=color )
                
            if odd_HEs[pair_i] is not None:
                odd_T = np.arange( len(odd_HEs[pair_i]) )*5.0E-9 + odd_offset[pair_i]
                
                if odd_T[0] < earliest_T:
                    earliest_T = odd_T[0]
                
                p = plt.plot(odd_T, odd_HEs[pair_i]/peak_amp + current_offset)
                color = p[0].get_color()
                
                plt.plot( (odd_peakT_offset[pair_i],odd_peakT_offset[pair_i]), (current_offset,current_offset+1), color=color )

        plt.annotate(sname, xy=(earliest_T,current_offset+0.5))
        current_offset += 1
        
    plt.axvline(x=0)
    plt.show()
def save_Pulse(timeID, output_folder, event_index, pulse_time, station_delays, skip_stations=[], window_width=7E-6, pulse_width=50, block_size=2**16, 
               min_ant_amp=5.0, guess_flash_location=None, referance_station="CS002", polarization_flips="polarization_flips.txt", 
               bad_antennas="bad_antennas.txt", additional_antenna_delays = "ant_delays.txt"):
    """Desined to be used in conjuction with plot_multiple_data_all_stations.py. Given a pulse_time, and window_width, it saves a pulse on every antenna that is 
    centered on the largest peak in the window, with a width of pulse_width. station_delays doesn't need to be accurate, just should be the same as used in plot_multiple_data_all_stations.
    Same for referance_station, and guess_flash_location. Note that this will save the pulse under an index, and will overwrite any other pulse saved under that index in the output folder"""
    
    
    if referance_station in station_delays:
        ref_delay = station_delays[referance_station]
        station_delays = {sname:delay-ref_delay for sname,delay in station_delays.items()}
    
    #### setup directory variables ####
    processed_data_folder = processed_data_dir(timeID)
    
    data_dir = processed_data_folder + "/" + output_folder
    if not isdir(data_dir):
        mkdir(data_dir)
        
    logging_folder = data_dir + '/logs_and_plots'
    if not isdir(logging_folder):
        mkdir(logging_folder)

    #Setup logger and open initial data set
    log.set(logging_folder + "/log_event_"+str(event_index)+".txt") ## TODo: save all output to a specific output folder
    log.take_stderr()
    log.take_stdout()
    
    print("pulse time:", pulse_time)
    print("window_width:", window_width)
    print("pulse_width:", pulse_width)
    print("skip stations:", skip_stations)
    print("guess_flash_location:", guess_flash_location)
    print("input delays:")
    print( station_delays)
    print()
    
        ##station data
    print()
    print("opening station data")
    
    polarization_flips = read_antenna_pol_flips( processed_data_folder + '/' + polarization_flips )
    bad_antennas = read_bad_antennas( processed_data_folder + '/' + bad_antennas )
    additional_antenna_delays = read_antenna_delays(  processed_data_folder + '/' + additional_antenna_delays )
    
        
    raw_fpaths = filePaths_by_stationName(timeID)
    raw_data_files = {sname:MultiFile_Dal1(raw_fpaths[sname], force_metadata_ant_pos=True, polarization_flips=polarization_flips, bad_antennas=bad_antennas, additional_ant_delays=additional_antenna_delays) \
                      for sname in station_delays.keys()}
    
    data_filters = {sname:window_and_filter(timeID=timeID,sname=sname) for sname in station_delays.keys()}
    
    trace_locator = getTrace_fromLoc( raw_data_files, data_filters, {sname:0.0 for sname in station_delays.keys()} )
    
    
    if guess_flash_location is not None:
        guess_flash_location = np.array(guess_flash_location)
        
        ref_stat_file = raw_data_files[ referance_station ]
        ant_loc = ref_stat_file.get_LOFAR_centered_positions()[0]
        ref_delay = np.linalg.norm(ant_loc-guess_flash_location[:3])/v_air - ref_stat_file.get_nominal_sample_number()*5.0E-9
        
        for sname, data_file in raw_data_files.items():
            if sname not in station_delays:
                station_delays[sname] = 0.0
            
            data_file = raw_data_files[sname]
            ant_loc = data_file.get_LOFAR_centered_positions()[0]
            station_delays[sname] += (np.linalg.norm(ant_loc-guess_flash_location[:3])/v_air - ref_delay) 
            station_delays[sname] -= data_file.get_nominal_sample_number()*5.0E-9
    
    print()
    print("used apparent delays:")
    print(station_delays)
    print()
    
    
    out_fname = data_dir + "/potSource_"+str(event_index)+".h5"
    out_file = h5py.File(out_fname, "w")
    
    half_pulse_width = int(0.5*pulse_width)
    window_width_samples = int(window_width/5.0E-9)
    for sname in station_delays.keys():
        if (not np.isfinite(station_delays[sname])) or sname in skip_stations:
            continue
        
        h5_statGroup = out_file.create_group( sname )
        
        antenna_names = raw_data_files[sname].get_antenna_names()
        
        data_arrival_index = int((pulse_time + station_delays[sname] - window_width*0.5)/5.0E-9)
        
        print()
        print(sname)
        
        for even_ant_i in range(0, len(antenna_names), 2):
            
            #### get window and find peak ####
            throw, even_total_time_offset, throw, even_trace = trace_locator.get_trace_fromIndex( data_arrival_index, antenna_names[even_ant_i], window_width_samples)
            throw, odd_total_time_offset, throw, odd_trace = trace_locator.get_trace_fromIndex( data_arrival_index, antenna_names[even_ant_i+1], window_width_samples)

            even_HE = np.abs(even_trace)
            even_good = False
            if np.max( even_HE ) > min_ant_amp:
                even_good = True
                even_para_fit = parabolic_fit( even_HE )
            
            odd_HE = np.abs(odd_trace)
            odd_good = False
            if np.max( odd_HE ) > min_ant_amp:
                odd_good = True
                odd_para_fit = parabolic_fit( odd_HE )
                
            if (not even_good) and (not odd_good):
                continue
            elif even_good and (not odd_good):
                center_index = int(even_para_fit.peak_index)
            elif (not even_good) and odd_good:
                center_index = int(odd_para_fit.peak_index)
            else: ## both good
                even_amp = even_HE[ int(even_para_fit.peak_index) ]
                odd_amp = odd_HE[ int(odd_para_fit.peak_index) ]
                if even_amp > odd_amp:
                    center_index = int(even_para_fit.peak_index)
                else:
                    center_index = int(odd_para_fit.peak_index)

            
            #### now get data centered on peak. re-get data, as peak may be near edge ####
            throw, even_total_time_offset, throw, even_trace = trace_locator.get_trace_fromIndex( data_arrival_index+center_index-half_pulse_width, antenna_names[even_ant_i], half_pulse_width*2)
            throw, odd_total_time_offset , throw, odd_trace  = trace_locator.get_trace_fromIndex( data_arrival_index+center_index-half_pulse_width, antenna_names[even_ant_i+1], half_pulse_width*2)
                  
#            even_trace = even_trace[center_index-half_pulse_width:center_index+half_pulse_width]
#            odd_trace = odd_trace[center_index-half_pulse_width:center_index+half_pulse_width]
            even_HE = np.abs(even_trace)
            odd_HE = np.abs(odd_trace)
                
            h5_Ant_dataset = h5_statGroup.create_dataset(antenna_names[even_ant_i], (4, half_pulse_width*2), dtype=np.double)
            h5_Ant_dataset[0] = np.real( even_trace )
            h5_Ant_dataset[1] = even_HE
            h5_Ant_dataset[2] = np.real( odd_trace )
            h5_Ant_dataset[3] = odd_HE
                        
            WARNING: not sure this is correct. even_total_time_offset includes station delay
            starting_index = data_arrival_index+center_index-half_pulse_width
            h5_Ant_dataset.attrs['starting_index'] = starting_index
            h5_Ant_dataset.attrs['PolE_timeOffset'] = -even_total_time_offset ## NOTE: due to historical reasons, there is a sign flip here
            h5_Ant_dataset.attrs['PolO_timeOffset'] = -odd_total_time_offset ## NOTE: due to historical reasons, there is a sign flip here
               
            if np.max(even_HE) > min_ant_amp:
#                even_HE = resample(even_HE, len(even_HE)*8 )
#                even_para_fit = parabolic_fit( even_HE )
#                h5_Ant_dataset.attrs['PolE_peakTime'] = (even_para_fit.peak_index/8.0 + starting_index)*5.0E-9 - even_total_time_offset
                even_para_fit = parabolic_fit( even_HE )
                h5_Ant_dataset.attrs['PolE_peakTime'] = (even_para_fit.peak_index + starting_index)*5.0E-9 - even_total_time_offset
            else:
                h5_Ant_dataset.attrs['PolE_peakTime'] = np.nan
                 
            if np.max(odd_HE) > min_ant_amp:
#                odd_HE = resample(odd_HE, len(odd_HE)*8 )
#                odd_para_fit = parabolic_fit( odd_HE )
#                h5_Ant_dataset.attrs['PolO_peakTime'] = (odd_para_fit.peak_index/8.0 + starting_index)*5.0E-9 - odd_total_time_offset
                odd_para_fit = parabolic_fit( odd_HE )
                h5_Ant_dataset.attrs['PolO_peakTime'] = (odd_para_fit.peak_index + starting_index)*5.0E-9 - odd_total_time_offset
            else:
                h5_Ant_dataset.attrs['PolO_peakTime'] = np.nan
                
            
            print("   ", antenna_names[even_ant_i], (data_arrival_index+center_index)*5.0E-9 - station_delays[sname], h5_Ant_dataset.attrs['PolE_peakTime'], h5_Ant_dataset.attrs['PolO_peakTime'] )
            
    out_file.close()