1   /* Copyright 2002-2016 CS Systèmes d'Information
2    * Licensed to CS Systèmes d'Information (CS) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * CS licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *   http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.orekit.propagation.analytical.tle;
18  
19  
20  import java.io.IOException;
21  import java.util.Set;
22  
23  import org.apache.commons.math3.analysis.polynomials.PolynomialFunction;
24  import org.junit.Assert;
25  import org.junit.Before;
26  import org.junit.Test;
27  import org.orekit.Utils;
28  import org.orekit.errors.OrekitException;
29  import org.orekit.frames.Frame;
30  import org.orekit.frames.FramesFactory;
31  import org.orekit.frames.Predefined;
32  import org.orekit.propagation.Propagator;
33  import org.orekit.time.AbsoluteDate;
34  import org.orekit.time.TimeScalesFactory;
35  import org.orekit.utils.Constants;
36  import org.orekit.utils.PVCoordinates;
37  
38  
39  public class TLESeriesTest {
40  
41      @Test(expected=OrekitException.class)
42      public void testNoData() throws IOException, OrekitException {
43          TLESeries series = new TLESeries("^inexistant\\.tle$", false);
44          series.loadTLEData();
45      }
46  
47      @Test(expected=OrekitException.class)
48      public void testNoTopexPoseidonNumber() throws IOException, OrekitException {
49          TLESeries series = new TLESeries("^spot-5\\.tle$", false);
50          series.loadTLEData(22076);
51      }
52  
53      @Test(expected=OrekitException.class)
54      public void testNoTopexPoseidonLaunchElements() throws IOException, OrekitException {
55          TLESeries series = new TLESeries("^spot-5\\.tle$", false);
56          series.loadTLEData(1992, 52, "A");
57      }
58  
59      @Test
60      public void testAvailableSatNums() throws IOException, OrekitException {
61          int[] refIds = {
62              5, 4632, 6251, 8195, 9880, 9998, 11801, 14128, 16925,
63              20413, 21897, 22312, 22674, 23177, 23333, 23599, 24208, 25954, 26900,
64              26975, 28057, 28129, 28350, 28623, 28626, 28872, 29141, 29238, 88888};
65  
66          Utils.setDataRoot("tle/extrapolationTest-data:regular-data");
67          TLESeries series = new TLESeries(".*-entry$", true);
68          Set<Integer> available = series.getAvailableSatelliteNumbers();
69          Assert.assertEquals(refIds.length, available.size());
70          for (int ref : refIds) {
71              Assert.assertTrue(available.contains(ref));
72          }
73      }
74      
75  
76      @Test
77      public void testDefaultSearchAndLoad() throws IOException, OrekitException {
78          TLESeries series = new TLESeries(null, true);
79          Assert.assertNotNull(series);
80          Set<Integer> available = series.getAvailableSatelliteNumbers();
81          Assert.assertNotNull(available);
82          
83          int expectedSatId = 27421;
84          Assert.assertTrue(available.contains(expectedSatId));
85          
86          //test what happens if already loaded...
87          available = series.getAvailableSatelliteNumbers();
88          Assert.assertNotNull(available);
89          Assert.assertTrue(available.contains(expectedSatId));
90  
91      }    
92  
93      @Test
94      public void testSpot5Available() throws IOException, OrekitException {
95          TLESeries series = new TLESeries("^spot-5\\.tle$", false);
96          Set<Integer> available = series.getAvailableSatelliteNumbers();
97          Assert.assertEquals(1, available.size());
98          Assert.assertTrue(available.contains(27421));
99      }
100 
101     @Test
102     public void testSpot5WithExtraLines() throws IOException, OrekitException {
103         TLESeries series = new TLESeries("^spot-5-with-extra-lines\\.tle$", true);
104         series.loadTLEData(-1);
105         Assert.assertEquals(27421, series.getFirst().getSatelliteNumber());
106         AbsoluteDate referenceFirst =
107             new AbsoluteDate(2002, 5, 4, 11, 45, 15.695136, TimeScalesFactory.getUTC());
108         Assert.assertEquals(0, series.getFirstDate().durationFrom(referenceFirst), 1e-13);
109         AbsoluteDate referenceLast =
110             new AbsoluteDate(2002, 5, 4, 19, 10, 59.114784, TimeScalesFactory.getUTC());
111         Assert.assertEquals(0, series.getLastDate().durationFrom(referenceLast), 1e-13);
112     }
113 
114     @Test(expected=OrekitException.class)
115     public void testSpot5WithExtraLinesExpectException() throws IOException, OrekitException {
116         TLESeries series = new TLESeries("^spot-5-with-extra-lines\\.tle$", false);
117         series.loadTLEData(-1);
118     }
119 
120     @Test(expected=OrekitException.class)
121     public void testSpot5OneLineExpectException() throws IOException, OrekitException {
122         TLESeries series = new TLESeries("^spot-5-one-line\\.tle$", false);
123         series.loadTLEData(-1);
124     }
125 
126     @Test
127     public void testPVStart() throws IOException, OrekitException {
128         TLESeries series = new TLESeries("^spot-5\\.tle$", false);
129         series.loadTLEData();
130 
131         AbsoluteDate t0 = new AbsoluteDate(2002, 5, 4, 11, 0, 0.0, TimeScalesFactory.getUTC());
132 
133         // this model is a rough fit on first 3 days of current tle with respect to first tle
134         // there are 1500m amplitude variations around a quadratic evolution that grows up to 90km
135         PolynomialFunction errorModel =
136             new PolynomialFunction(new double[] { -135.98, 0.010186, 1.3115e-06 });
137 
138         Propagator propagator = TLEPropagator.selectExtrapolator(series.getFirst());
139         for (double dt = 0; dt < 3 * Constants.JULIAN_DAY; dt += 600) {
140             AbsoluteDate date = t0.shiftedBy(dt);
141             PVCoordinates delta = new PVCoordinates(propagator.getPVCoordinates(date, FramesFactory.getTEME()),
142                                                     series.getPVCoordinates(date));
143             Assert.assertEquals(errorModel.value(dt), delta.getPosition().getNorm(), 1500.0);
144         }
145 
146     }
147 
148     @Test
149     public void testPVEnd() throws IOException, OrekitException {
150         TLESeries series = new TLESeries("^spot-5\\.tle$", false);
151         series.loadTLEData();
152 
153         AbsoluteDate t0 =
154             new AbsoluteDate(2002, 6, 21, 20, 0, 0.0, TimeScalesFactory.getUTC());
155 
156         TLEPropagator propagator = TLEPropagator.selectExtrapolator(series.getLast());
157         for (double dt = 3 * Constants.JULIAN_DAY; dt >= 0; dt -= 600) {
158             AbsoluteDate date = t0.shiftedBy(dt);
159             PVCoordinates delta = new PVCoordinates(propagator.getPVCoordinates(date), series.getPVCoordinates(date));
160             Assert.assertEquals(0, delta.getPosition().getNorm(), 660.0);
161         }
162 
163     }
164 
165     @Test
166     public void testSpot5() throws IOException, OrekitException {
167 
168         TLESeries series = new TLESeries("^spot-5\\.tle$", false);
169 
170         series.loadTLEData(-1);
171         Assert.assertEquals(27421, series.getFirst().getSatelliteNumber());
172 
173         series.loadTLEData(27421);
174         Assert.assertEquals(27421, series.getFirst().getSatelliteNumber());
175 
176         series.loadTLEData(-1, -1, null);
177         Assert.assertEquals(27421, series.getFirst().getSatelliteNumber());
178 
179         series.loadTLEData(2002, -1, null);
180         Assert.assertEquals(27421, series.getFirst().getSatelliteNumber());
181 
182         series.loadTLEData(2002, 21, "A");
183         Assert.assertEquals(27421, series.getFirst().getSatelliteNumber());
184         Assert.assertEquals(2002, series.getFirst().getLaunchYear());
185         Assert.assertEquals(21, series.getFirst().getLaunchNumber());
186         Assert.assertEquals("A", series.getFirst().getLaunchPiece());
187         Assert.assertEquals(27421, series.getLast().getSatelliteNumber());
188         Assert.assertEquals(2002, series.getLast().getLaunchYear());
189         Assert.assertEquals(21, series.getLast().getLaunchNumber());
190         Assert.assertEquals("A", series.getLast().getLaunchPiece());
191 
192         AbsoluteDate referenceFirst =
193             new AbsoluteDate(2002, 5, 4, 11, 45, 15.695136, TimeScalesFactory.getUTC());
194         Assert.assertEquals(0, series.getFirstDate().durationFrom(referenceFirst), 1e-13);
195         AbsoluteDate referenceLast =
196             new AbsoluteDate(2002, 6, 24, 18, 12, 44.591616, TimeScalesFactory.getUTC());
197         Assert.assertEquals(0, series.getLastDate().durationFrom(referenceLast), 1e-13);
198 
199         AbsoluteDate inside = new AbsoluteDate(2002, 06, 02, 11, 12, 15, TimeScalesFactory.getUTC());
200         AbsoluteDate referenceInside =
201             new AbsoluteDate(2002, 6, 2, 10, 8, 25.401, TimeScalesFactory.getUTC());
202         Assert.assertEquals(0, series.getClosestTLE(inside).getDate().durationFrom(referenceInside), 1e-3);
203 
204         AbsoluteDate oneYearBefore = new AbsoluteDate(2001, 06, 02, 11, 12, 15, TimeScalesFactory.getUTC());
205         Assert.assertTrue(series.getClosestTLE(oneYearBefore).getDate().equals(series.getFirstDate()));
206 
207         AbsoluteDate oneYearAfter = new AbsoluteDate(2003, 06, 02, 11, 12, 15, TimeScalesFactory.getUTC());
208         Assert.assertTrue(series.getClosestTLE(oneYearAfter).getDate().equals(series.getLastDate()));
209         
210         
211         series.loadTLEData(2002, 21, null);
212         TLE currentTle = series.getFirst();
213         Assert.assertEquals(27421, currentTle.getSatelliteNumber());
214         Assert.assertEquals(2002, currentTle.getLaunchYear());
215         Assert.assertEquals(21, currentTle.getLaunchNumber());
216         Assert.assertEquals("A", currentTle.getLaunchPiece());
217 
218         series.loadTLEData(2002, 21, "");
219         currentTle = series.getFirst();
220         Assert.assertEquals(27421, currentTle.getSatelliteNumber());
221         Assert.assertEquals(2002, currentTle.getLaunchYear());
222         Assert.assertEquals(21, currentTle.getLaunchNumber());
223         Assert.assertEquals("A", currentTle.getLaunchPiece());
224 
225         try {
226             series.loadTLEData(2002, 22, "A");
227             Assert.fail("Should have thrown exception about not having any TLE data for this combination");
228         }
229         catch(OrekitException exception) {
230         }
231 
232         try {
233             series.loadTLEData(2002, 21, "B");
234             Assert.fail("Should have thrown exception about not having any TLE data for this combination");
235         }
236         catch(OrekitException exception) {
237 
238         }
239     }
240 
241     @Test
242     public void testTLEFrame() throws OrekitException {
243 
244         TLE tle = new TLE("1 27421U 02021A   02124.48976499 -.00021470  00000-0 -89879-2 0    20",
245                           "2 27421  98.7490 199.5121 0001333 133.9522 226.1918 14.26113993    62");
246         Frame tleFrame = TLEPropagator.selectExtrapolator(tle).getFrame();
247         Assert.assertEquals(tleFrame.getName(), FramesFactory.getFrame(Predefined.TEME).getName());
248     }
249 
250     @Before
251     public void setUp() {
252         Utils.setDataRoot("regular-data");
253     }
254 
255 }