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)
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)
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)