def test_adcp_earth(self):
        """
        Tests magnetic_correction function for ADCPs set to output data in the
        Earth Coordinate system.

        Values were not defined in DPS, were recreated using test values above:

        OOI (2012). Data Product Specification for Velocity Profile and Echo
            Intensity. Document Control Number 1341-00750.
            https://alfresco.oceanobservatories.org/ (See: Company Home >> OOI
            >> Controlled >> 1000 System Level >>
            1341-00750_Data_Product_SPEC_VELPROF_OOI.pdf)

        Implemented by Christopher Wingard, 2014-02-06
        """

        # set the test data
        u, v, w, e = af.adcp_beam2ins(self.b1, self.b2, self.b3, self.b4)

        ### old adcp_ins2earth returned 3 variables
        uu, vv, ww = af.adcp_ins2earth(u, v, w, self.heading / 100.,
                                       self.pitch / 100., self.roll / 100., self.orient)

        # test the magnetic variation correction
        got_uu_cor = af.adcp_earth_eastward(uu, vv, self.depth, self.lat, self.lon, self.ntp)
        got_vv_cor = af.adcp_earth_northward(uu, vv, self.depth, self.lat, self.lon, self.ntp)

        np.testing.assert_array_almost_equal(got_uu_cor, np.atleast_2d(self.uu_cor), 4)
        np.testing.assert_array_almost_equal(got_vv_cor, np.atleast_2d(self.vv_cor), 4)

        # reset the test inputs for multiple records
        uu = np.tile(uu, (24, 1))
        vv = np.tile(vv, (24, 1))
        depth = np.ones(24) * self.depth
        lat = np.ones(24) * self.lat
        lon = np.ones(24) * self.lon
        ntp = np.ones(24) * self.ntp

        # reset expected results for multiple records
        uu_cor = np.tile(self.uu_cor, (24, 1))
        vv_cor = np.tile(self.vv_cor, (24, 1))

        # compute the results for multiple records
        got_uu_cor = af.adcp_earth_eastward(uu, vv, depth, lat, lon, ntp)
        got_vv_cor = af.adcp_earth_northward(uu, vv, depth, lat, lon, ntp)

        # test the magnetic variation correction
        np.testing.assert_array_almost_equal(got_uu_cor, uu_cor, 4)
        np.testing.assert_array_almost_equal(got_vv_cor, vv_cor, 4)
    def test_adcp_beam2earth(self):
        """
        Test adcp_beam2ins and adcp_ins2earth functions.
        
        Values based on those defined in DPS:
        
        OOI (2012). Data Product Specification for Velocity Profile and Echo
            Intensity. Document Control Number 1341-00750.
            https://alfresco.oceanobservatories.org/ (See: Company Home >> OOI
            >> Controlled >> 1000 System Level >>
            1341-00750_Data_Product_SPEC_VELPROF_OOI.pdf)
        
        Implemented by Christopher Wingard, April 2013
        """
        # set test inputs
        b1 = np.array([-0.0300, -0.2950, -0.5140, -0.2340, -0.1880,
                        0.2030, -0.3250,  0.3050])
        b2 = np.array([ 0.1800, -0.1320,  0.2130,  0.3090,  0.2910,
                        0.0490,  0.1880,  0.3730])
        b3 = np.array([-0.3980, -0.4360, -0.1310, -0.4730, -0.4430,
                        0.1880, -0.1680,  0.2910])
        b4 = np.array([-0.2160, -0.6050, -0.0920, -0.0580,  0.4840,
                       -0.0050,  0.3380,  0.1750])
        heading = 98.4100
        pitch = 0.6900
        roll = -2.5400
        orient = 1

        # compute beam to instrument transform
        u, v, w, e = adcpfunc.adcp_beam2ins(b1, b2, b3, b4)

        # compute instrument to Earth transform        
        got_uu, got_vv, got_ww = adcpfunc.adcp_ins2earth(u, v, w, heading, 
                                              pitch, roll, orient)
        
        # set expected results
        uu = np.array([ 0.2175, -0.2814, -0.1002,  0.4831,  1.2380,
                       -0.2455,  0.6218, -0.1807])
        vv = np.array([-0.3367, -0.1815, -1.0522, -0.8676, -0.8919,
                        0.2585, -0.8497, -0.0873])
        ww = np.array([ 0.1401,  0.3977,  0.1870,  0.1637,  0.0091,
                       -0.1290,  0.0334, -0.3017])
        
        # test the transform
        self.assertTrue(np.allclose(got_uu, uu, rtol=1e4, atol=0))
        self.assertTrue(np.allclose(got_vv, vv, rtol=1e4, atol=0))
        self.assertTrue(np.allclose(got_ww, ww, rtol=1e4, atol=0))
    def test_vadcp_beam(self):
        """
        Tests vadcp_beam_eastward, vadcp_beam_northward,
        vadcp_beam_vertical_est and vadcp_beam_vertical_true functions (which
        call adcp_beam2ins and adcp_ins2earth) for the specialized 5-beam ADCP.
        Application of the magnetic correction and conversion from mm/s to m/s
        is not applied.

        Values based on those defined in DPS:

        OOI (2012). Data Product Specification for Turbulent Velocity Profile
            and Echo Intensity. Document Control Number 1341-00760.
            https://alfresco.oceanobservatories.org/ (See: Company Home >> OOI
            >> Controlled >> 1000 System Level >>
            1341-00760_Data_Product_SPEC_VELTURB_OOI.pdf)

        Implemented by:

            2014-07-24: Christopher Wingard. Initial code.
        """
        # test inputs
        b1 = np.ones((10, 10)) * -325
        b2 = np.ones((10, 10)) * 188
        b3 = np.ones((10, 10)) * 168
        b4 = np.ones((10, 10)) * -338
        b5 = np.ones((10, 10)) * -70

        heading = np.array([30, 30, 30, 30, 30,
                            32, 32, 32, 32, 32])
        pitch = np.array([0, 2, 3, 3, 1, 2, 2, 3, 3, 1])
        roll = np.array([0, 4, 3, 4, 3, 3, 4, 3, 4, 3])
        orient = np.ones(10)

        # expected outputs
        vle = np.array([279.6195, 282.6881, 281.8311, 282.7147,
                        282.1188, 246.2155, 246.9874, 246.1226,
                        247.0156, 246.4276]).reshape(-1, 1)
        vle = np.reshape(np.tile(vle, 10), (10, 10))

        vln = np.array([-1015.5964, -1018.0226, -1018.2595, -1017.9765,
                        -1017.7612, -1027.3264, -1027.2681, -1027.4749,
                        -1027.2230, -1026.9870]).reshape(-1, 1)
        vln = np.reshape(np.tile(vln, 10), (10, 10))

        vlu = np.array([81.6756, 3.3916, 3.5950, -9.4974,
                        29.4154, 16.5077, 3.3916, 3.5950,
                        -9.4974, 29.4154]).reshape(-1, 1)
        vlu = np.reshape(np.tile(vlu, 10), (10, 10))

        evl = np.array([34.1128, 34.1128, 34.1128, 34.1128,
                        34.1128, 34.1128, 34.1128, 34.1128,
                        34.1128, 34.1128]).reshape(-1, 1)
        evl = np.reshape(np.tile(evl, 10), (10, 10))

        w5 = np.array([70.0000, -8.2485, -8.0487, -21.1287,
                       17.7575, 4.8552, -8.2485, -8.0487,
                       -21.1287, 17.7575]).reshape(-1, 1)
        w5 = np.reshape(np.tile(w5, 10), (10, 10))

        # test the transformations
        u, v, w_est, e = af.adcp_beam2ins(b1, b2, b3, b4)
        uu, vv, ww_est = af.adcp_ins2earth(u, v, w_est, heading, pitch, roll, orient)
        _, _, ww_true = af.adcp_ins2earth(u, v, b5, heading, pitch, roll, orient)

        # compare the results
        np.testing.assert_array_almost_equal(uu, vle, 4)
        np.testing.assert_array_almost_equal(vv, vln, 4)
        np.testing.assert_array_almost_equal(ww_est, vlu, 4)
        np.testing.assert_array_almost_equal(e, evl, 4)
        np.testing.assert_array_almost_equal(ww_true, w5, 4)