class TestPyOrbEphemerides(unittest.TestCase):
    def setUp(self):
        self.testdir = os.path.join(getPackageDir('sims_movingObjects'),
                                    'tests/orbits_testdata')
        self.orbits = Orbits()
        self.orbits.readOrbits(os.path.join(self.testdir, 'test_orbitsQ.des'))
        self.orbitsKEP = Orbits()
        self.orbitsKEP.readOrbits(
            os.path.join(self.testdir, 'test_orbitsA.des'))
        self.ephems = PyOrbEphemerides()

    def tearDown(self):
        del self.orbits
        del self.orbitsKEP
        del self.ephems

    def testSetOrbits(self):
        # Test that we can set orbits.
        self.ephems.setOrbits(self.orbits)
        assert_frame_equal(self.ephems.orbitObj.orbits, self.orbits.orbits)
        # Test that setting with something other than an Orbit object fails.
        with self.assertRaises(ValueError):
            self.ephems.setOrbits(self.orbits.orbits)
        # Test that setting with an empty orbit object fails.
        # (Avoids hard-to-interpret errors from pyoorb).
        with self.assertRaises(ValueError):
            emptyOrb = Orbits()
            empty = pd.DataFrame([], columns=self.orbits.dataCols['KEP'])
            emptyOrb.setOrbits(empty)
            self.ephems.setOrbits(emptyOrb)

    def testConvertToOorbArray(self):
        # Check that orbital elements are converted.
        self.ephems.orbitObj = self.orbits
        self.ephems._convertToOorbElem()
        self.assertEqual(len(self.ephems.oorbElem), len(self.orbits))
        self.assertEqual(self.ephems.oorbElem[0][7], 2)
        self.assertEqual(self.ephems.oorbElem[0][9], 3)
        self.assertEqual(self.ephems.oorbElem[0][1],
                         self.orbits.orbits['q'][0])
        # Test that we can convert KEP orbital elements too.
        self.ephems.orbitObj = self.orbitsKEP
        self.ephems._convertToOorbElem()
        self.assertEqual(len(self.ephems.oorbElem), len(self.orbitsKEP))
        self.assertEqual(self.ephems.oorbElem[0][7], 3)
        self.assertEqual(self.ephems.oorbElem[0][1],
                         self.orbitsKEP.orbits['a'][0])

    def testConvertFromOorbArray(self):
        self.ephems.orbitObj = self.orbits
        self.ephems._convertToOorbElem()
        newOrbits = self.ephems._convertFromOorbElem(self.ephems.oorbElem)
        self.assertEqual(newOrbits, self.orbits)

    def testConvertTimes(self):
        times = np.arange(49353, 49353 + 10, 0.5)
        ephTimes = self.ephems._convertTimes(times, 'UTC')
        # Check that shape of ephTimes is correct.
        self.assertEqual(ephTimes.shape[0], len(times))
        self.assertEqual(ephTimes.shape[1], 2)
        # Check that 'timescale' for ephTimes is correct.
        self.assertEqual(ephTimes[0][1], 1)
        ephTimes = self.ephems._convertTimes(times, 'TAI')
        self.assertEqual(ephTimes[0][1], 4)

    def testOorbEphemeris(self):
        self.ephems.setOrbits(self.orbits)
        times = np.arange(49353, 49353 + 3, 0.25)
        ephTimes = self.ephems._convertTimes(times)
        oorbEphs = self.ephems._generateOorbEphs(ephTimes, obscode=807)
        # Check that it returned the right sort of array.
        self.assertEqual(oorbEphs.shape,
                         (len(self.ephems.oorbElem), len(times), 10))

    def testEphemeris(self):
        # Calculate and convert ephemerides.
        self.ephems.setOrbits(self.orbits)
        times = np.arange(49353, 49353 + 2, 0.3)
        ephTimes = self.ephems._convertTimes(times)
        oorbEphs = self.ephems._generateOorbEphs(ephTimes, obscode=807)
        # Group by object, and check grouping.
        ephs = self.ephems._convertOorbEphs(oorbEphs, byObject=True)
        self.assertEqual(len(ephs), len(self.orbits))
        # Group by time, and check grouping.
        ephs = self.ephems._convertOorbEphs(oorbEphs, byObject=False)
        self.assertEqual(len(ephs), len(times))
        # And test all-wrapped-up method:
        ephsAll = self.ephems.generateEphemerides(times,
                                                  obscode=807,
                                                  timeScale='UTC',
                                                  byObject=False)
        np.testing.assert_equal(ephsAll, ephs)
        # Reset ephems to use KEP Orbits, and calculate new ephemerides.
        self.ephems.setOrbits(self.orbitsKEP)
        oorbEphs = self.ephems._generateOorbEphs(ephTimes, obscode=807)
        ephsKEP = self.ephems._convertOorbEphs(oorbEphs, byObject=True)
        self.assertEqual(len(ephsKEP), len(self.orbitsKEP))
        ephsKEP = self.ephems._convertOorbEphs(oorbEphs, byObject=False)
        self.assertEqual(len(ephsKEP), len(times))
        # Check that ephemerides calculated by each method are almost equal.
        for column in ephs.dtype.names:
            np.testing.assert_allclose(ephs[column],
                                       ephsKEP[column],
                                       rtol=0,
                                       atol=1e-7)
        # And test all-wrapped-up method:
        ephsAllKEP = self.ephems.generateEphemerides(times,
                                                     obscode=807,
                                                     timeScale='UTC',
                                                     byObject=False)
        np.testing.assert_equal(ephsAllKEP, ephsKEP)
        # Check that the wrapped method using KEP elements and the wrapped method using COM elements match.
        for column in ephsAll.dtype.names:
            np.testing.assert_allclose(ephsAllKEP[column],
                                       ephsAll[column],
                                       rtol=0,
                                       atol=1e-7)
Esempio n. 2
0
class TestPyOrbEphemerides(unittest.TestCase):
    def setUp(self):
        self.testdir = os.path.join(getPackageDir('sims_movingObjects'),
                                    'tests/orbits_testdata')
        self.orbits = Orbits()
        self.orbits.readOrbits(os.path.join(self.testdir, 'test_orbitsQ.des'))
        self.orbitsKEP = Orbits()
        self.orbitsKEP.readOrbits(
            os.path.join(self.testdir, 'test_orbitsA.des'))
        self.ephems = PyOrbEphemerides()
        self.ephems.setOrbits(self.orbits)
        self.len_ephems_basic = 11
        self.len_ephems_full = 34

    def tearDown(self):
        del self.orbits
        del self.orbitsKEP
        del self.ephems

    def testSetOrbits(self):
        # Test that we can set orbits.
        self.ephems.setOrbits(self.orbits)
        # Test that setting with an empty orbit object fails.
        # (Avoids hard-to-interpret errors from pyoorb).
        with self.assertRaises(ValueError):
            emptyOrb = Orbits()
            empty = pd.DataFrame([], columns=self.orbits.dataCols['KEP'])
            emptyOrb.setOrbits(empty)
            self.ephems.setOrbits(emptyOrb)

    def testConvertToOorbArray(self):
        # Check that orbital elements are converted.
        self.ephems._convertToOorbElem(self.orbits.orbits,
                                       self.orbits.orb_format)
        self.assertEqual(len(self.ephems.oorbElem), len(self.orbits))
        self.assertEqual(self.ephems.oorbElem[0][7], 2)
        self.assertEqual(self.ephems.oorbElem[0][9], 3)
        self.assertEqual(self.ephems.oorbElem[0][1],
                         self.orbits.orbits['q'][0])
        # Test that we can convert KEP orbital elements too.
        self.ephems._convertToOorbElem(self.orbitsKEP.orbits,
                                       self.orbitsKEP.orb_format)
        self.assertEqual(len(self.ephems.oorbElem), len(self.orbitsKEP))
        self.assertEqual(self.ephems.oorbElem[0][7], 3)
        self.assertEqual(self.ephems.oorbElem[0][1],
                         self.orbitsKEP.orbits['a'][0])

    def testConvertFromOorbArray(self):
        # Check that we can convert orbital elements TO oorb format and back
        # without losing info (except ObjId -- we will lose that unless we use updateOrbits.)
        self.ephems._convertToOorbElem(self.orbits.orbits,
                                       self.orbits.orb_format)
        newOrbits = Orbits()
        newOrbits.setOrbits(self.orbits.orbits)
        newOrbits.updateOrbits(self.ephems.convertFromOorbElem())
        self.assertEqual(newOrbits, self.orbits)

    def testConvertTimes(self):
        times = np.arange(49353, 49353 + 10, 0.5)
        ephTimes = self.ephems._convertTimes(times, 'UTC')
        # Check that shape of ephTimes is correct. (times x 2)
        self.assertEqual(ephTimes.shape[0], len(times))
        self.assertEqual(ephTimes.shape[1], 2)
        # Check that 'timescale' for ephTimes is correct.
        self.assertEqual(ephTimes[0][1], 1)
        ephTimes = self.ephems._convertTimes(times, 'TAI')
        self.assertEqual(ephTimes[0][1], 4)

    def testOorbEphemeris(self):
        self.ephems.setOrbits(self.orbits)
        times = np.arange(49353, 49353 + 3, 0.25)
        ephTimes = self.ephems._convertTimes(times)
        # Basic ephemerides.
        oorbEphs = self.ephems._generateOorbEphsBasic(ephTimes,
                                                      obscode=807,
                                                      ephMode='N')
        # Check that it returned the right sort of array.
        self.assertEqual(
            oorbEphs.shape,
            (len(self.ephems.oorbElem), len(times), self.len_ephems_basic))
        # Full ephemerides
        oorbEphs = self.ephems._generateOorbEphsFull(ephTimes,
                                                     obscode=807,
                                                     ephMode='N')
        # Check that it returned the right sort of array.
        self.assertEqual(
            oorbEphs.shape,
            (len(self.ephems.oorbElem), len(times), self.len_ephems_full))

    def testEphemeris(self):
        # Calculate and convert ephemerides.
        self.ephems.setOrbits(self.orbits)
        times = np.arange(49353, 49353 + 2, 0.3)
        ephTimes = self.ephems._convertTimes(times)
        oorbEphs = self.ephems._generateOorbEphsBasic(ephTimes, obscode=807)
        # Group by object, and check grouping.
        ephs = self.ephems._convertOorbEphsBasic(oorbEphs, byObject=True)
        self.assertEqual(len(ephs), len(self.orbits))
        # Group by time, and check grouping.
        oorbEphs = self.ephems._generateOorbEphsBasic(ephTimes, obscode=807)
        ephs = self.ephems._convertOorbEphsBasic(oorbEphs, byObject=False)
        self.assertEqual(len(ephs), len(times))
        # And test all-wrapped-up method:
        ephsAll = self.ephems.generateEphemerides(times,
                                                  obscode=807,
                                                  ephMode='N',
                                                  ephType='basic',
                                                  timeScale='UTC',
                                                  byObject=False)
        np.testing.assert_equal(ephsAll, ephs)
        # Reset ephems to use KEP Orbits, and calculate new ephemerides.
        self.ephems.setOrbits(self.orbitsKEP)
        oorbEphs = self.ephems._generateOorbEphsBasic(ephTimes,
                                                      obscode=807,
                                                      ephMode='N')
        ephsKEP = self.ephems._convertOorbEphsBasic(oorbEphs, byObject=True)
        self.assertEqual(len(ephsKEP), len(self.orbitsKEP))
        oorbEphs = self.ephems._generateOorbEphsBasic(ephTimes,
                                                      obscode=807,
                                                      ephMode='N')
        ephsKEP = self.ephems._convertOorbEphsBasic(oorbEphs, byObject=False)
        self.assertEqual(len(ephsKEP), len(times))
        # And test all-wrapped-up method:
        ephsAllKEP = self.ephems.generateEphemerides(times,
                                                     obscode=807,
                                                     ephMode='N',
                                                     ephType='basic',
                                                     timeScale='UTC',
                                                     byObject=False)
        np.testing.assert_equal(ephsAllKEP, ephsKEP)
Esempio n. 3
0
class TestPyOrbEphemerides(unittest.TestCase):
    def setUp(self):
        self.testdir = os.path.join(getPackageDir('sims_movingObjects'), 'tests/orbits_testdata')
        self.orbits = Orbits()
        self.orbits.readOrbits(os.path.join(self.testdir, 'test_orbitsQ.des'))
        self.orbitsKEP = Orbits()
        self.orbitsKEP.readOrbits(os.path.join(self.testdir, 'test_orbitsA.des'))
        self.ephems = PyOrbEphemerides()

    def tearDown(self):
        del self.orbits
        del self.orbitsKEP
        del self.ephems

    def testSetOrbits(self):
        # Test that we can set orbits.
        self.ephems.setOrbits(self.orbits)
        assert_frame_equal(self.ephems.orbitObj.orbits, self.orbits.orbits)
        # Test that setting with something other than an Orbit object fails.
        with self.assertRaises(ValueError):
            self.ephems.setOrbits(self.orbits.orbits)
        # Test that setting with an empty orbit object fails.
        # (Avoids hard-to-interpret errors from pyoorb).
        with self.assertRaises(ValueError):
            emptyOrb = Orbits()
            empty = pd.DataFrame([], columns=self.orbits.dataCols['KEP'])
            emptyOrb.setOrbits(empty)
            self.ephems.setOrbits(emptyOrb)

    def testConvertToOorbArray(self):
        # Check that orbital elements are converted.
        self.ephems.orbitObj = self.orbits
        self.ephems._convertToOorbElem()
        self.assertEqual(len(self.ephems.oorbElem), len(self.orbits))
        self.assertEqual(self.ephems.oorbElem[0][7], 2)
        self.assertEqual(self.ephems.oorbElem[0][9], 3)
        self.assertEqual(self.ephems.oorbElem[0][1], self.orbits.orbits['q'][0])
        # Test that we can convert KEP orbital elements too.
        self.ephems.orbitObj = self.orbitsKEP
        self.ephems._convertToOorbElem()
        self.assertEqual(len(self.ephems.oorbElem), len(self.orbitsKEP))
        self.assertEqual(self.ephems.oorbElem[0][7], 3)
        self.assertEqual(self.ephems.oorbElem[0][1], self.orbitsKEP.orbits['a'][0])

    def testConvertFromOorbArray(self):
        self.ephems.orbitObj = self.orbits
        self.ephems._convertToOorbElem()
        newOrbits = self.ephems._convertFromOorbElem(self.ephems.oorbElem)
        self.assertEqual(newOrbits, self.orbits)

    def testConvertTimes(self):
        times = np.arange(49353, 49353 + 10, 0.5)
        ephTimes = self.ephems._convertTimes(times, 'UTC')
        # Check that shape of ephTimes is correct.
        self.assertEqual(ephTimes.shape[0], len(times))
        self.assertEqual(ephTimes.shape[1], 2)
        # Check that 'timescale' for ephTimes is correct.
        self.assertEqual(ephTimes[0][1], 1)
        ephTimes = self.ephems._convertTimes(times, 'TAI')
        self.assertEqual(ephTimes[0][1], 4)

    def testOorbEphemeris(self):
        self.ephems.setOrbits(self.orbits)
        times = np.arange(49353, 49353 + 3, 0.25)
        ephTimes = self.ephems._convertTimes(times)
        oorbEphs = self.ephems._generateOorbEphs(ephTimes, obscode=807)
        # Check that it returned the right sort of array.
        self.assertEqual(oorbEphs.shape, (len(self.ephems.oorbElem), len(times), 10))

    def testEphemeris(self):
        # Calculate and convert ephemerides.
        self.ephems.setOrbits(self.orbits)
        times = np.arange(49353, 49353 + 2, 0.3)
        ephTimes = self.ephems._convertTimes(times)
        oorbEphs = self.ephems._generateOorbEphs(ephTimes, obscode=807)
        # Group by object, and check grouping.
        ephs = self.ephems._convertOorbEphs(oorbEphs, byObject=True)
        self.assertEqual(len(ephs), len(self.orbits))
        # Group by time, and check grouping.
        ephs = self.ephems._convertOorbEphs(oorbEphs, byObject=False)
        self.assertEqual(len(ephs), len(times))
        # And test all-wrapped-up method:
        ephsAll = self.ephems.generateEphemerides(times, obscode=807,
                                                  timeScale='UTC', byObject=False)
        np.testing.assert_equal(ephsAll, ephs)
        # Reset ephems to use KEP Orbits, and calculate new ephemerides.
        self.ephems.setOrbits(self.orbitsKEP)
        oorbEphs = self.ephems._generateOorbEphs(ephTimes, obscode=807)
        ephsKEP = self.ephems._convertOorbEphs(oorbEphs, byObject=True)
        self.assertEqual(len(ephsKEP), len(self.orbitsKEP))
        ephsKEP = self.ephems._convertOorbEphs(oorbEphs, byObject=False)
        self.assertEqual(len(ephsKEP), len(times))
        # Check that ephemerides calculated by each method are almost equal.
        for column in ephs.dtype.names:
            np.testing.assert_allclose(ephs[column], ephsKEP[column], rtol=0, atol=1e-7)
        # And test all-wrapped-up method:
        ephsAllKEP = self.ephems.generateEphemerides(times, obscode=807,
                                                     timeScale='UTC', byObject=False)
        np.testing.assert_equal(ephsAllKEP, ephsKEP)
        # Check that the wrapped method using KEP elements and the wrapped method using COM elements match.
        for column in ephsAll.dtype.names:
            np.testing.assert_allclose(ephsAllKEP[column], ephsAll[column], rtol=0, atol=1e-7)