/* Copyright 2002-2017 CS Systèmes d'Information
* Licensed to CS Systèmes d'Information (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* CS licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.orekit.propagation.analytical.tle;
import java.io.IOException;
import java.util.Set;
import org.hipparchus.analysis.polynomials.PolynomialFunction;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.orekit.Utils;
import org.orekit.errors.OrekitException;
import org.orekit.frames.Frame;
import org.orekit.frames.FramesFactory;
import org.orekit.frames.Predefined;
import org.orekit.propagation.Propagator;
import org.orekit.time.AbsoluteDate;
import org.orekit.time.TimeScalesFactory;
import org.orekit.utils.Constants;
import org.orekit.utils.PVCoordinates;
public class TLESeriesTest {
@Test(expected=OrekitException.class)
public void testNoData() throws IOException, OrekitException {
TLESeries series = new TLESeries("^inexistant\\.tle$", false);
series.loadTLEData();
}
@Test(expected=OrekitException.class)
public void testNoTopexPoseidonNumber() throws IOException, OrekitException {
TLESeries series = new TLESeries("^spot-5\\.tle$", false);
series.loadTLEData(22076);
}
@Test(expected=OrekitException.class)
public void testNoTopexPoseidonLaunchElements() throws IOException, OrekitException {
TLESeries series = new TLESeries("^spot-5\\.tle$", false);
series.loadTLEData(1992, 52, "A");
}
@Test
public void testAvailableSatNums() throws IOException, OrekitException {
int[] refIds = {
5, 4632, 6251, 8195, 9880, 9998, 11801, 14128, 16925,
20413, 21897, 22312, 22674, 23177, 23333, 23599, 24208, 25954, 26900,
26975, 28057, 28129, 28350, 28623, 28626, 28872, 29141, 29238, 88888};
Utils.setDataRoot("tle/extrapolationTest-data:regular-data");
TLESeries series = new TLESeries(".*-entry$", true);
Set<Integer> available = series.getAvailableSatelliteNumbers();
Assert.assertEquals(refIds.length, available.size());
for (int ref : refIds) {
Assert.assertTrue(available.contains(ref));
}
}
@Test
public void testDefaultSearchAndLoad() throws IOException, OrekitException {
TLESeries series = new TLESeries(null, true);
Assert.assertNotNull(series);
Set<Integer> available = series.getAvailableSatelliteNumbers();
Assert.assertNotNull(available);
int expectedSatId = 27421;
Assert.assertTrue(available.contains(expectedSatId));
//test what happens if already loaded...
available = series.getAvailableSatelliteNumbers();
Assert.assertNotNull(available);
Assert.assertTrue(available.contains(expectedSatId));
}
@Test
public void testSpot5Available() throws IOException, OrekitException {
TLESeries series = new TLESeries("^spot-5\\.tle$", false);
Set<Integer> available = series.getAvailableSatelliteNumbers();
Assert.assertEquals(1, available.size());
Assert.assertTrue(available.contains(27421));
}
@Test
public void testSpot5WithExtraLines() throws IOException, OrekitException {
TLESeries series = new TLESeries("^spot-5-with-extra-lines\\.tle$", true);
series.loadTLEData(-1);
Assert.assertEquals(27421, series.getFirst().getSatelliteNumber());
AbsoluteDate referenceFirst =
new AbsoluteDate(2002, 5, 4, 11, 45, 15.695136, TimeScalesFactory.getUTC());
Assert.assertEquals(0, series.getFirstDate().durationFrom(referenceFirst), 1e-13);
AbsoluteDate referenceLast =
new AbsoluteDate(2002, 5, 4, 19, 10, 59.114784, TimeScalesFactory.getUTC());
Assert.assertEquals(0, series.getLastDate().durationFrom(referenceLast), 1e-13);
}
@Test(expected=OrekitException.class)
public void testSpot5WithExtraLinesExpectException() throws IOException, OrekitException {
TLESeries series = new TLESeries("^spot-5-with-extra-lines\\.tle$", false);
series.loadTLEData(-1);
}
@Test(expected=OrekitException.class)
public void testSpot5OneLineExpectException() throws IOException, OrekitException {
TLESeries series = new TLESeries("^spot-5-one-line\\.tle$", false);
series.loadTLEData(-1);
}
@Test
public void testPVStart() throws IOException, OrekitException {
TLESeries series = new TLESeries("^spot-5\\.tle$", false);
series.loadTLEData();
AbsoluteDate t0 = new AbsoluteDate(2002, 5, 4, 11, 0, 0.0, TimeScalesFactory.getUTC());
// this model is a rough fit on first 3 days of current tle with respect to first tle
// there are 1500m amplitude variations around a quadratic evolution that grows up to 90km
PolynomialFunction errorModel =
new PolynomialFunction(new double[] { -135.98, 0.010186, 1.3115e-06 });
Propagator propagator = TLEPropagator.selectExtrapolator(series.getFirst());
for (double dt = 0; dt < 3 * Constants.JULIAN_DAY; dt += 600) {
AbsoluteDate date = t0.shiftedBy(dt);
PVCoordinates delta = new PVCoordinates(propagator.getPVCoordinates(date, FramesFactory.getTEME()),
series.getPVCoordinates(date));
Assert.assertEquals(errorModel.value(dt), delta.getPosition().getNorm(), 1500.0);
}
}
@Test
public void testPVEnd() throws IOException, OrekitException {
TLESeries series = new TLESeries("^spot-5\\.tle$", false);
series.loadTLEData();
AbsoluteDate t0 =
new AbsoluteDate(2002, 6, 21, 20, 0, 0.0, TimeScalesFactory.getUTC());
TLEPropagator propagator = TLEPropagator.selectExtrapolator(series.getLast());
for (double dt = 3 * Constants.JULIAN_DAY; dt >= 0; dt -= 600) {
AbsoluteDate date = t0.shiftedBy(dt);
PVCoordinates delta = new PVCoordinates(propagator.getPVCoordinates(date), series.getPVCoordinates(date));
Assert.assertEquals(0, delta.getPosition().getNorm(), 660.0);
}
}
@Test
public void testSpot5() throws IOException, OrekitException {
TLESeries series = new TLESeries("^spot-5\\.tle$", false);
series.loadTLEData(-1);
Assert.assertEquals(27421, series.getFirst().getSatelliteNumber());
series.loadTLEData(27421);
Assert.assertEquals(27421, series.getFirst().getSatelliteNumber());
series.loadTLEData(-1, -1, null);
Assert.assertEquals(27421, series.getFirst().getSatelliteNumber());
series.loadTLEData(2002, -1, null);
Assert.assertEquals(27421, series.getFirst().getSatelliteNumber());
series.loadTLEData(2002, 21, "A");
Assert.assertEquals(27421, series.getFirst().getSatelliteNumber());
Assert.assertEquals(2002, series.getFirst().getLaunchYear());
Assert.assertEquals(21, series.getFirst().getLaunchNumber());
Assert.assertEquals("A", series.getFirst().getLaunchPiece());
Assert.assertEquals(27421, series.getLast().getSatelliteNumber());
Assert.assertEquals(2002, series.getLast().getLaunchYear());
Assert.assertEquals(21, series.getLast().getLaunchNumber());
Assert.assertEquals("A", series.getLast().getLaunchPiece());
AbsoluteDate referenceFirst =
new AbsoluteDate(2002, 5, 4, 11, 45, 15.695136, TimeScalesFactory.getUTC());
Assert.assertEquals(0, series.getFirstDate().durationFrom(referenceFirst), 1e-13);
AbsoluteDate referenceLast =
new AbsoluteDate(2002, 6, 24, 18, 12, 44.591616, TimeScalesFactory.getUTC());
Assert.assertEquals(0, series.getLastDate().durationFrom(referenceLast), 1e-13);
AbsoluteDate inside = new AbsoluteDate(2002, 06, 02, 11, 12, 15, TimeScalesFactory.getUTC());
AbsoluteDate referenceInside =
new AbsoluteDate(2002, 6, 2, 10, 8, 25.401, TimeScalesFactory.getUTC());
Assert.assertEquals(0, series.getClosestTLE(inside).getDate().durationFrom(referenceInside), 1e-3);
AbsoluteDate oneYearBefore = new AbsoluteDate(2001, 06, 02, 11, 12, 15, TimeScalesFactory.getUTC());
Assert.assertTrue(series.getClosestTLE(oneYearBefore).getDate().equals(series.getFirstDate()));
AbsoluteDate oneYearAfter = new AbsoluteDate(2003, 06, 02, 11, 12, 15, TimeScalesFactory.getUTC());
Assert.assertTrue(series.getClosestTLE(oneYearAfter).getDate().equals(series.getLastDate()));
series.loadTLEData(2002, 21, null);
TLE currentTle = series.getFirst();
Assert.assertEquals(27421, currentTle.getSatelliteNumber());
Assert.assertEquals(2002, currentTle.getLaunchYear());
Assert.assertEquals(21, currentTle.getLaunchNumber());
Assert.assertEquals("A", currentTle.getLaunchPiece());
series.loadTLEData(2002, 21, "");
currentTle = series.getFirst();
Assert.assertEquals(27421, currentTle.getSatelliteNumber());
Assert.assertEquals(2002, currentTle.getLaunchYear());
Assert.assertEquals(21, currentTle.getLaunchNumber());
Assert.assertEquals("A", currentTle.getLaunchPiece());
try {
series.loadTLEData(2002, 22, "A");
Assert.fail("Should have thrown exception about not having any TLE data for this combination");
}
catch(OrekitException exception) {
}
try {
series.loadTLEData(2002, 21, "B");
Assert.fail("Should have thrown exception about not having any TLE data for this combination");
}
catch(OrekitException exception) {
}
}
@Test
public void testTLEFrame() throws OrekitException {
TLE tle = new TLE("1 27421U 02021A 02124.48976499 -.00021470 00000-0 -89879-2 0 20",
"2 27421 98.7490 199.5121 0001333 133.9522 226.1918 14.26113993 62");
Frame tleFrame = TLEPropagator.selectExtrapolator(tle).getFrame();
Assert.assertEquals(tleFrame.getName(), FramesFactory.getFrame(Predefined.TEME).getName());
}
@Before
public void setUp() {
Utils.setDataRoot("regular-data");
}
}