def test_beam_angles_algorithm_01(self):
        """
        beam angles algorithm test #01
        ------------------------------
        """

        # load the expected data object
        expected = TestDataLoader(self.expected_01, delim=' ')

        # load the input data
        input_data = TestDataLoader(self.input_01, delim=' ')

        self.initialise_algorithm(input_data)

        # create surface location objects
        surfs = []

        for i, surf_num in enumerate(input_data["surface_counter"]):
            surf = SurfaceData(
                self.cst,
                self.chd,
                surf_num,
                # time_surf=input_data["time_surf"][i],
                x_surf=input_data["x_surf"][i],
                y_surf=input_data["y_surf"][i],
                z_surf=input_data["z_surf"][i],
            )
            surfs.append(surf)

        # create packet object
        packet = L1AProcessingData(
            self.cst,
            self.chd,
            time_sar_ku=input_data["time_sar_ku"],
            x_sar_sat=input_data["x_sar_sat"],
            y_sar_sat=input_data["y_sar_sat"],
            z_sar_sat=input_data["z_sar_sat"],
            x_vel_sat_sar=input_data["x_vel_sat_sar"],
            y_vel_sat_sar=input_data["y_vel_sat_sar"],
            z_vel_sat_sar=input_data["z_vel_sat_sar"],
            pri_sar_pre_dat=input_data["pri_sar_pre_dat"],
            doppler_angle_sar_sat=input_data["doppler_angle_sar_sat"])
        work_loc = input_data["working_surface_location_counter"]

        # execute beam angles algorithm
        self.beam_angles_algorithm(surfs, packet, surfs[work_loc])

        # confirm correct number of surfaces seen
        self.assertEqual(len(self.beam_angles_algorithm.surfaces_seen),
                         expected["surfaces_seen"])

        # confirm the working surface location is seen
        self.assertTrue(self.beam_angles_algorithm.work_location_seen,
                        msg="working location seen")

        # check beam angles are correct
        self.assertTrue(np.allclose(self.beam_angles_algorithm.beam_angles,
                                    expected["beam_ang"]),
                        msg="Beam Angles values are not correct")

        # check surface indicies are correct
        self.assertTrue(np.array_equal(
            self.beam_angles_algorithm.surfaces_seen,
            expected["surf_loc_index"]),
                        msg="Surface Indicies are not correct")
Example #2
0
    def test_surface_location_algorithm_04(self):
        """
        surface location algorithm test 04
        ----------------------------------

        loads multiple input ISPs and two input surface locations.
        expected result is for the surface location algorithm to
        generate a new surface location and focus the position of the previous
        one towards the target position. The attributes of these
        surface locations are then validated against the expected
        values.
        """
        # load the expected data
        expected_data = TestDataLoader(self.expected_04, delim=' ')

        # load the input data
        inputs = TestDataLoader(self.inputs_04, delim=' ')

        self.initialise_algorithm(inputs)

        # create all input packet objects
        isps = [
            L1AProcessingData(self.cst, self.chd, i,
                              time_sar_ku=time,
                              lat_sar_sat=inputs["lat_sar_sat"][i],
                              lon_sar_sat=inputs["lon_sar_sat"][i],
                              alt_sar_sat=inputs["alt_sar_sat"][i],
                              win_delay_sar_ku=inputs["win_delay_sar_ku"][i],
                              x_sar_sat=inputs["x_sar_sat"][i],
                              y_sar_sat=inputs["y_sar_sat"][i],
                              z_sar_sat=inputs["z_sar_sat"][i],
                              alt_rate_sat_sar=0,
                              roll_sar=inputs["roll_sar"][i],
                              pitch_sar=inputs["pitch_sar"][i],
                              yaw_sar=inputs["yaw_sar"][i],
                              x_vel_sat_sar=inputs["x_vel_sat_sar"][i],
                              y_vel_sat_sar=inputs["y_vel_sat_sar"][i],
                              z_vel_sat_sar=inputs["z_vel_sat_sar"][i],
                              days=inputs["time_sar_ku"] // self.cst.sec_in_day,
                              seconds=inputs["time_sar_ku"] % self.cst.sec_in_day) \
            for i, time in enumerate(inputs["time_sar_ku"])
            ]
        # calculate surface position for each packet
        for packet in isps:
            packet.compute_location_sar_surf()

        surfs = []
        # create the prior surface location object
        for i, time in enumerate(inputs["time_surf"]):
            surf = SurfaceData(
                self.cst, self.chd,
                time_surf=time,
                x_surf=inputs["x_surf"][i],
                y_surf=inputs["y_surf"][i],
                z_surf=inputs["z_surf"][i],
                lat_surf=inputs["lat_surf"][i],
                lon_surf=inputs["lon_surf"][i],
                alt_surf=inputs["alt_surf"][i],
                x_sat=inputs["x_sat"][i],
                y_sat=inputs["y_sat"][i],
                z_sat=inputs["z_sat"][i],
                lat_sat=inputs["lat_sat"][i],
                lon_sat=inputs["lon_sat"][i],
                alt_sat=inputs["alt_sat"][i],
                x_vel_sat=inputs["x_vel_sat"][i],
                y_vel_sat=inputs["y_vel_sat"][i],
                z_vel_sat=inputs["z_vel_sat"][i],
                focus_target_distance=inputs["focus_target_distance"][i],
                win_delay_surf=inputs["win_delay_surf"][i]
            )
            surf.compute_surf_sat_vector()
            surf.compute_angular_azimuth_beam_resolution(
                inputs["pri_sar_pre_dat"][i]
            )
            surfs.append(surf)

        # execute the surface location algorithm
        new_surf = self.surface_location_algorithm(surfs, isps)

        # confirm new surface has been created
        self.assertTrue(new_surf, msg="failed to create new surface")

        # retreive properties of the surface location
        surf = surfs[1]

        # validate properties
        self.assertAlmostEqual(surf.time_surf, expected_data["time_surf"])

        self.assertAlmostEqual(surf.x_surf, expected_data["x_surf"], delta=1e-5)
        self.assertAlmostEqual(surf.y_surf, expected_data["y_surf"], delta=1e-5)
        self.assertAlmostEqual(surf.z_surf, expected_data["z_surf"], delta=1e-5)

        self.assertAlmostEqual(surf.lat_surf, expected_data["lat_surf"], delta=1e-12)
        self.assertAlmostEqual(surf.lon_surf, expected_data["lon_surf"], delta=1e-12)
        self.assertAlmostEqual(surf.alt_surf, expected_data["alt_surf"], delta=1e-4)

        self.assertAlmostEqual(surf.win_delay_surf, expected_data["win_delay_surf"])
    def multilooking_tests(self, input_data, expected):
        """

        :param input_data:
        :param expected:
        :return:
        """
        self.initialise_algorithm(input_data)

        zp_fact_range = input_data['zp_fact_range_cnf']
        data_stack_size = input_data['data_stack_size']

        input_stack_mask_vector = input_data['stack_mask_vector']
        n_samples_max = self.chd.n_samples_sar * zp_fact_range

        stack_mask = np.reshape(
            input_data['stack_mask'],
            (data_stack_size, n_samples_max)
        )
        beams_masked = np.reshape(
            input_data['beams_masked'],
            (data_stack_size, n_samples_max)
        )

        working_location = SurfaceData(
            self.cst, self.chd,
            data_stack_size=data_stack_size,
            beam_angles_surf=input_data['beam_angles_surf'],
            look_angles_surf=input_data['look_angles_surf'],
            pointing_angles_surf=input_data['pointing_angles_surf'],
            doppler_angles_surf=input_data['doppler_angles_surf'],
            stack_mask_vector=input_stack_mask_vector,
            stack_mask=stack_mask,
            beams_masked=beams_masked
        )
        self.multilooking_algorithm.zp_fact_range =\
            input_data['zp_fact_range_cnf']
        self.multilooking_algorithm.flag_avoid_zeros_in_multilooking =\
            input_data['flag_avoid_zeros_in_multilooking']
        self.multilooking_algorithm.n_looks_stack =\
            input_data['n_looks_stack_cnf']
        self.multilooking_algorithm(working_location)

        expected_waveform = expected['wfm_ml_sar']
        for sample_index in range(n_samples_max):
            self.assertEqual(
                expected_waveform[sample_index],
                self.multilooking_algorithm.waveform_multilooked[sample_index]
            )
        self.zero_float_assertion(
            expected['stack_skewness'],
            self.multilooking_algorithm.stack_skewness
        )
        self.zero_float_assertion(
            expected['stack_kurtosis'],
            self.multilooking_algorithm.stack_kurtosis
        )
        self.zero_float_assertion(
            expected['stack_std'],
            self.multilooking_algorithm.stack_std
        )
        self.zero_float_assertion(
            expected['stack_look_angle_centre'],
            self.multilooking_algorithm.look_angle_centre
        )
        self.zero_float_assertion(
            expected['stack_pointing_angle_centre'],
            self.multilooking_algorithm.pointing_angle_centre
        )
        # look angle
        self.assertEqual(
            expected['start_look_angle'],
            self.multilooking_algorithm.start_look_angle
        )
        self.assertEqual(
            expected['stop_look_angle'],
            self.multilooking_algorithm.stop_look_angle
        )
        # doppler angle
        self.assertEqual(
            expected['start_doppler_angle'],
            self.multilooking_algorithm.start_doppler_angle
        )
        self.assertEqual(
            expected['stop_doppler_angle'],
            self.multilooking_algorithm.stop_doppler_angle
        )
        # pointing angle
        self.assertEqual(
            expected['start_pointing_angle'],
            self.multilooking_algorithm.start_pointing_angle
        )
        self.assertEqual(
            expected['stop_pointing_angle'],
            self.multilooking_algorithm.stop_pointing_angle
        )
        # beams contributing
        self.assertEqual(
            expected['n_beams_multilooking'],
            self.multilooking_algorithm.n_beams_multilooking
        )
        self.assertEqual(
            expected['n_beams_start_stop'],
            self.multilooking_algorithm.n_beams_start_stop
        )
        for expect, actual in zip(expected['stack_mask_vector_start_stop'],
                                  self.multilooking_algorithm.stack_mask_vector_start_stop):
            self.assertEqual(expect, actual)
        self.assertEqual(
            len(expected['stack_mask_vector_start_stop']),
            len(self.multilooking_algorithm.stack_mask_vector_start_stop)
        )
Example #4
0
    def test_stacking_algorithm_01(self):
        """
        stack_gathering algorithm test 01
        --------------------------
        """

        input_data = TestDataLoader(self.inputs_01, delim=' ')
        expected = TestDataLoader(self.expected_01, delim=' ')

        self.initialise_algorithm(input_data)

        all_stack_size = input_data["all_stack_size"]

        input_beam_angles_list = np.reshape(
            input_data["beam_angles_list"],
            (all_stack_size, self.chd.n_ku_pulses_burst))
        isps = []

        for stack_index in range(all_stack_size):
            beams_focused = np.zeros(
                (self.chd.n_ku_pulses_burst, self.chd.n_samples_sar))
            pid = PacketPid.echo_sar if input_data['isp_pid'][
                stack_index] == 7 else PacketPid.echo_rmc
            packet = L1AProcessingData(
                self.cst,
                self.chd,
                stack_index,
                t0_sar=input_data["T0_sar"][stack_index],
                doppler_angle_sar_sat=input_data["doppler_angle_sar_sat"]
                [stack_index],
                pitch_sar=input_data["pitch_sar"][stack_index],
                beam_angles_list=input_beam_angles_list[stack_index, :],
                beams_focused=beams_focused,
                isp_pid=pid)
            isps.append(packet)

        working_loc = SurfaceData(self.cst, self.chd, stack_all_bursts=isps)
        for beam_index in input_data["stack_all_beam_indexes"]:
            working_loc.add_stack_beam_index(beam_index, 0, 0)

        self.stacking_algorithm(working_loc)

        self.assertEqual(self.stacking_algorithm.data_stack_size,
                         expected["data_stack_size"])
        self.assertEqual(self.stacking_algorithm.surface_type,
                         SurfaceType(expected["surface_type"]))

        # beam_angles_surf
        self.assertTrue(np.allclose(self.stacking_algorithm.beam_angles_surf,
                                    expected["beam_angles_surf"]),
                        msg="beam_angles_surf do not match expected values")
        # t0_surf
        self.assertTrue(np.allclose(self.stacking_algorithm.t0_surf,
                                    expected["t0_surf"]),
                        msg="t0_surf do not match expected values")
        # doppler_angles_surf
        self.assertTrue(np.allclose(
            self.stacking_algorithm.doppler_angles_surf,
            expected["doppler_angles_surf"]),
                        msg="doppler_angles_surf do not match expected values")
        # look_angles_surf
        self.assertTrue(np.allclose(self.stacking_algorithm.look_angles_surf,
                                    expected["look_angles_surf"]),
                        msg="look_angles_surf do not match expected values")
        # pointing_angles_surf
        self.assertTrue(
            np.allclose(self.stacking_algorithm.pointing_angles_surf,
                        expected["pointing_angles_surf"]),
            msg="pointing_angles_surf do not match expected values")
Example #5
0
    def test_surface_location_algorithm_03(self):
        """
        surface location algorithm test 03
        ----------------------------------

        loads multiple input ISPs and one input surface location.
        expected result is for the surface location algorithm to
        generate a new surface location. The attributes of this
        new surface location are then validated against the expected
        values.
        """
        # load the expected data
        expected_data = TestDataLoader(self.expected_03, delim=' ')

        # load the input data
        inputs = TestDataLoader(self.input_03, delim=' ')

        self.initialise_algorithm(inputs)

        # create all input packet objects
        isps = [
            L1AProcessingData(self.cst, self.chd, i,
                              time_sar_ku=time,
                              lat_sar_sat=inputs["lat_sar_sat"][i],
                              lon_sar_sat=inputs["lon_sar_sat"][i],
                              alt_sar_sat=inputs["alt_sar_sat"][i],
                              win_delay_sar_ku=inputs["win_delay_sar_ku"][i],
                              x_sar_sat=0,
                              y_sar_sat=0,
                              z_sar_sat=0,
                              alt_rate_sat_sar=0,
                              roll_sar=0,
                              pitch_sar=0,
                              yaw_sar=0,
                              x_vel_sat_sar=0,
                              y_vel_sat_sar=0,
                              z_vel_sat_sar=0,
                              days=inputs["time_sar_ku"] // self.cst.sec_in_day,
                              seconds=inputs["time_sar_ku"] % self.cst.sec_in_day) \
            for i, time in enumerate(inputs["time_sar_ku"])
            ]
        # calculate surface position for each packet
        for packet in isps:
            packet.compute_location_sar_surf()

        # create the prior surface location object
        surf = SurfaceData(self.cst,
                           self.chd,
                           time_surf=inputs["time_surf"],
                           x_surf=inputs["x_surf"],
                           y_surf=inputs["y_surf"],
                           z_surf=inputs["z_surf"],
                           x_sat=inputs["x_sat"],
                           y_sat=inputs["y_sat"],
                           z_sat=inputs["z_sat"],
                           x_vel_sat=inputs["x_vel_sat"],
                           y_vel_sat=inputs["y_vel_sat"],
                           z_vel_sat=inputs["z_vel_sat"])
        # compute properties of the surface location
        surf.compute_surf_sat_vector()
        surf.compute_angular_azimuth_beam_resolution(inputs["pri_sar_pre_dat"])

        # execute the surface location algorithm
        new_surf = self.surface_location_algorithm([surf], isps)

        # confirm new surface has been created
        self.assertTrue(new_surf, msg="failed to create new surface")

        # retreive properties of the surface location
        surf = self.surface_location_algorithm.get_surface()

        # validate properties
        self.assertAlmostEqual(surf["time_surf"], expected_data["time_surf"])

        self.assertAlmostEqual(surf["x_surf"],
                               expected_data["x_surf"],
                               delta=1e-5)
        self.assertAlmostEqual(surf["y_surf"],
                               expected_data["y_surf"],
                               delta=1e-5)
        self.assertAlmostEqual(surf["z_surf"],
                               expected_data["z_surf"],
                               delta=1e-5)

        self.assertAlmostEqual(surf["lat_surf"],
                               expected_data["lat_surf"],
                               delta=1e-12)
        self.assertAlmostEqual(surf["lon_surf"],
                               expected_data["lon_surf"],
                               delta=1e-12)
        self.assertAlmostEqual(surf["alt_surf"],
                               expected_data["alt_surf"],
                               delta=1e-4)
    def _geometry_corrections_algorithm_tests(self, input_data, expected):
        self.initialize_algorithm(input_data)
        # create stack of ISPs
        isps = []

        stack_size = input_data["data_stack_size"]
        for stack_index in range(stack_size):
            packet = L1AProcessingData(
                self.cst, self.chd,
                x_vel_sat_sar=input_data["x_vel_sat_sar"][stack_index],
                y_vel_sat_sar=input_data["y_vel_sat_sar"][stack_index],
                z_vel_sat_sar=input_data["z_vel_sat_sar"][stack_index],
                x_sar_sat=input_data["x_sar_sat"][stack_index],
                y_sar_sat=input_data["y_sar_sat"][stack_index],
                z_sar_sat=input_data["z_sar_sat"][stack_index],
                win_delay_sar_ku=input_data["win_delay_sar_ku"][stack_index]
            )
            isps.append(packet)

        # create working surface location
        beams_surf = np.reshape(
            input_data["beams_surf"],
            (stack_size, self.chd.n_samples_sar)
        )

        working_loc = SurfaceData(
            self.cst, self.chd,
            stack_bursts=isps,
            data_stack_size=stack_size,
            win_delay_surf=input_data["win_delay_surf"],
            x_surf=input_data["x_surf"],
            y_surf=input_data["y_surf"],
            z_surf=input_data["z_surf"],
            beam_angles_surf=input_data["beam_angles_surf"],
            t0_surf=input_data["T0_surf"],
            beams_surf=beams_surf
        )


        # TODO: add window delay alignment method selection
        self.geometry_corrections_algorithm(working_loc, input_data["wv_length_ku"])

        self.assertTrue(
            np.allclose(
                self.geometry_corrections_algorithm.doppler_corrections,
                expected["doppler_corrections"]
            ),
            msg="Doppler corrections do not match"
        )
        self.assertTrue(
            np.allclose(
                self.geometry_corrections_algorithm.range_sat_surf,
                expected["range_sat_surf"]
            ),
            msg="Range Sat Surf does not match"
        )
        self.assertTrue(
            np.allclose(
                self.geometry_corrections_algorithm.slant_range_corrections,
                expected["slant_range_corrections"], atol=1e-8
            ),
            msg="Slant Range Corrections do not match"
        )
        self.assertTrue(
            np.allclose(
                self.geometry_corrections_algorithm.win_delay_corrections,
                expected["win_delay_corrections"]
            ),
            msg="window delay corrections do not match"
        )
        flat_corr = np.ravel(self.geometry_corrections_algorithm.beams_geo_corr)
        components = zip(np.real(flat_corr), np.imag(flat_corr))

        for index, (i, q) in enumerate(components):
            expected_i = expected["beams_geo_corr_i"][index]
            expected_q = expected["beams_geo_corr_q"][index]

            if expected_i == 0:
                self.assertEqual(
                    expected_i, i
                )
            else:
                rel_err = abs((expected_i - i) / expected_i)
                self.assertLess(rel_err, 2e-4)

            if expected_q == 0:
                self.assertEqual(
                    expected_q, q
                )
            else:
                rel_err = abs((expected_q - q) / expected_q)
                self.assertLess(rel_err, 2e-4)