1   /* Copyright 2002-2012 Space Applications Services
2    * Licensed to CS GROUP (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.files.ilrs;
18  
19  import java.io.IOException;
20  import java.net.URISyntaxException;
21  import java.nio.file.Paths;
22  import java.util.List;
23  
24  import org.hipparchus.geometry.euclidean.threed.Vector3D;
25  import org.junit.Assert;
26  import org.junit.Before;
27  import org.junit.Test;
28  import org.orekit.Utils;
29  import org.orekit.data.DataSource;
30  import org.orekit.errors.OrekitException;
31  import org.orekit.errors.OrekitMessages;
32  import org.orekit.files.ilrs.CPF.CPFCoordinate;
33  import org.orekit.files.ilrs.CPF.CPFEphemeris;
34  import org.orekit.frames.FramesFactory;
35  import org.orekit.propagation.BoundedPropagator;
36  import org.orekit.time.AbsoluteDate;
37  import org.orekit.utils.CartesianDerivativesFilter;
38  import org.orekit.utils.Constants;
39  import org.orekit.utils.IERSConventions;
40  
41  
42  public class CPFParserTest {
43  
44      @Test
45      public void testJason3Version2() throws URISyntaxException, IOException {
46  
47          // Simple test for version 2.0, only contains position entries
48          final String ex = "/ilrs/jason3_cpf_180613_16401.cne";
49  
50          final CPFParser parser = new CPFParser();
51          final String fileName = Paths.get(getClass().getResource(ex).toURI()).toString();
52          final CPF file = (CPF) parser.parse(new DataSource(fileName));
53  
54          // Start date
55          final AbsoluteDate start = new AbsoluteDate("2018-06-13T00:00:00.000", file.getTimeScale());
56  
57          // End date
58          final AbsoluteDate end   = new AbsoluteDate("2018-06-18T00:00:00.000", file.getTimeScale());
59  
60          // Verify comments
61          final List<String> comments = file.getComments();
62          Assert.assertEquals(8, comments.size());
63          Assert.assertEquals("Col 1 : <Record type=10)>", comments.get(0));
64          Assert.assertEquals("Col 8 : <Geocentric Z position in meters>", comments.get(7));
65  
66          // Verify header
67          final CPFHeader header = file.getHeader();
68          Assert.assertEquals("CPF",    header.getFormat());
69          Assert.assertEquals(2,        header.getVersion());
70          Assert.assertEquals("CNE",    header.getSource());
71          Assert.assertEquals(2018,     header.getProductionEpoch().getYear());
72          Assert.assertEquals(6,        header.getProductionEpoch().getMonth());
73          Assert.assertEquals(13,       header.getProductionEpoch().getDay());
74          Assert.assertEquals(6,        header.getProductionHour());
75          Assert.assertEquals(164,      header.getSequenceNumber());
76          Assert.assertEquals(1,        header.getSubDailySequenceNumber());
77          Assert.assertEquals("jason3", header.getName());
78          Assert.assertEquals("1600201", header.getIlrsSatelliteId());
79          Assert.assertEquals("4379",   header.getSic());
80          Assert.assertEquals("41240",  header.getNoradId());
81          Assert.assertEquals(240,      header.getStep());
82          Assert.assertEquals(1,        header.getTargetClass());
83          Assert.assertEquals(0,        header.getRotationalAngleType());
84          Assert.assertEquals(1,        header.getTargetLocation());
85          Assert.assertTrue(header.isCompatibleWithTIVs());
86          Assert.assertFalse(header.isCenterOfMassCorrectionApplied());
87          Assert.assertEquals(0.0, start.durationFrom(header.getStartEpoch()), 1.0e-15);
88          Assert.assertEquals(0.0, end.durationFrom(header.getEndEpoch()),     1.0e-15);
89          Assert.assertEquals(FramesFactory.getITRF(IERSConventions.IERS_2010, false), header.getRefFrame());
90          Assert.assertEquals(0,        header.getRefFrameId());
91  
92          // Coordinates
93          final CPFEphemeris ephemeris    = file.getSatellites().get("1600201");
94          final List<CPFCoordinate> coord = ephemeris.getCoordinates();
95  
96          // Verify first coordinate
97          final AbsoluteDate firstEpoch = AbsoluteDate.createMJDDate(58282, 0.0, file.getTimeScale());
98          final Vector3D firstPos = new Vector3D(6566174.663, 2703003.220, -3022783.901);
99          Assert.assertEquals(0, coord.get(0).getLeap());
100         Assert.assertEquals(0.0, firstPos.distance(coord.get(0).getPosition()), 1.0e-15);
101         Assert.assertEquals(0.0, firstEpoch.durationFrom(coord.get(0).getDate()), 1.0e-15);
102 
103         // Verify last coordinate
104         final AbsoluteDate lastEpoch = AbsoluteDate.createMJDDate(58287, 0.0, file.getTimeScale());
105         final Vector3D lastPos  = new Vector3D(6045281.907, 1607181.391, -4519215.355);
106         Assert.assertEquals(0, coord.get(coord.size() - 1).getLeap());
107         Assert.assertEquals(0.0, lastPos.distance(coord.get(coord.size() - 1).getPosition()), 1.0e-15);
108         Assert.assertEquals(0.0, lastEpoch.durationFrom(coord.get(coord.size() - 1).getDate()), 1.0e-15);
109 
110         // Verify Ephemeris
111         Assert.assertEquals(ephemeris.getFrame(),     header.getRefFrame());
112         Assert.assertEquals(10, ephemeris.getInterpolationSamples());
113         Assert.assertEquals(CartesianDerivativesFilter.USE_P, ephemeris.getAvailableDerivatives());
114         Assert.assertEquals(Constants.EIGEN5C_EARTH_MU,       ephemeris.getMu(), 1.0e-15);
115         Assert.assertEquals(ephemeris,                        ephemeris.getSegments().get(0));
116         Assert.assertEquals(0.0, start.durationFrom(ephemeris.getStart()), 1.0e-15);
117         Assert.assertEquals(0.0, end.durationFrom(ephemeris.getStop()), 1.0e-15);
118         Assert.assertEquals(0.0, firstPos.distance(ephemeris.getEphemeridesDataLines().get(0).getPosition()), 1.0e-15);
119         Assert.assertEquals(0.0, lastPos.distance(ephemeris.getEphemeridesDataLines().get(ephemeris.getEphemeridesDataLines().size() - 1).getPosition()), 1.0e-15);
120 
121         // Verify propagator
122         final BoundedPropagator propagator = ephemeris.getPropagator();
123         // 10 0 58283  56640.000000  0      -1578630.043      -2922293.651      -6964482.056
124         final AbsoluteDate date = AbsoluteDate.createMJDDate(58283, 56640.000000, file.getTimeScale());
125         final Vector3D position = new Vector3D(-1578630.043, -2922293.651, -6964482.056);
126         Assert.assertEquals(0.0, position.distance(propagator.getPVCoordinates(date, ephemeris.getFrame()).getPosition()), 2.4e-10);
127         
128     }
129 
130     @Test
131     public void testLageos1Version2() throws URISyntaxException, IOException {
132 
133         // Simple test for version 2.0, only contains position entries
134         final String    ex     = "/ilrs/lageos1_cpf_180613_16401.hts";
135         final DataSource source = new DataSource(ex, () -> getClass().getResourceAsStream(ex));
136         final CPF   file   = new CPFParser().parse(source);
137 
138         // Start date
139         final AbsoluteDate start = new AbsoluteDate("2018-06-13T00:00:00.000", file.getTimeScale());
140 
141         // End date
142         final AbsoluteDate end   = new AbsoluteDate("2018-06-15T00:00:00.000", file.getTimeScale());
143 
144         // Verify comments
145         final List<String> comments = file.getComments();
146         Assert.assertEquals(0, comments.size());
147 
148         // Verify header
149         final CPFHeader header = file.getHeader();
150         Assert.assertEquals("CPF",     header.getFormat());
151         Assert.assertEquals(2,         header.getVersion());
152         Assert.assertEquals("HTS",     header.getSource());
153         Assert.assertEquals(2018,      header.getProductionEpoch().getYear());
154         Assert.assertEquals(6,         header.getProductionEpoch().getMonth());
155         Assert.assertEquals(13,        header.getProductionEpoch().getDay());
156         Assert.assertEquals(12,        header.getProductionHour());
157         Assert.assertEquals(164,       header.getSequenceNumber());
158         Assert.assertEquals(1,         header.getSubDailySequenceNumber());
159         Assert.assertEquals("lageos1", header.getName());
160         Assert.assertEquals("7603901",   header.getIlrsSatelliteId());
161         Assert.assertEquals("1155",      header.getSic());
162         Assert.assertEquals("8820",      header.getNoradId());
163         Assert.assertEquals(300,       header.getStep());
164         Assert.assertEquals(1,         header.getTargetClass());
165         Assert.assertEquals(0,         header.getRotationalAngleType());
166         Assert.assertEquals(1,         header.getTargetLocation());
167         Assert.assertTrue(header.isCompatibleWithTIVs());
168         Assert.assertFalse(header.isCenterOfMassCorrectionApplied());
169         Assert.assertEquals(0.0,    start.durationFrom(header.getStartEpoch()), 1.0e-15);
170         Assert.assertEquals(0.0,    end.durationFrom(header.getEndEpoch()),     1.0e-15);
171         Assert.assertEquals(0.2510, header.getCenterOfMassOffset(),             1.0e-15);
172         Assert.assertEquals(FramesFactory.getITRF(IERSConventions.IERS_2010, false), header.getRefFrame());
173         Assert.assertEquals(0,        header.getRefFrameId());
174 
175         // Coordinates
176         final CPFEphemeris ephemeris    = file.getSatellites().get("7603901");
177         final List<CPFCoordinate> coord = ephemeris.getCoordinates();
178 
179         // Verify first coordinate
180         final AbsoluteDate firstEpoch = AbsoluteDate.createMJDDate(58281, 84600.00000, file.getTimeScale());
181         final Vector3D firstPos = new Vector3D(2966379.904, 4195129.466, -11136763.061);
182         Assert.assertEquals(0, coord.get(0).getLeap());
183         Assert.assertEquals(0.0, firstPos.distance(coord.get(0).getPosition()), 1.0e-15);
184         Assert.assertEquals(0.0, firstEpoch.durationFrom(coord.get(0).getDate()), 1.0e-15);
185 
186         // Verify last coordinate
187         final AbsoluteDate lastEpoch = AbsoluteDate.createMJDDate(58283, 86100.00000, file.getTimeScale());
188         final Vector3D lastPos  = new Vector3D(-5292229.761, 4106329.723, -10235338.181);
189         Assert.assertEquals(0, coord.get(coord.size() - 1).getLeap());
190         Assert.assertEquals(0.0, lastPos.distance(coord.get(coord.size() - 1).getPosition()), 1.0e-15);
191         Assert.assertEquals(0.0, lastEpoch.durationFrom(coord.get(coord.size() - 1).getDate()), 1.0e-15);
192 
193         // Verify Ephemeris
194         Assert.assertEquals(ephemeris.getFrame(),     header.getRefFrame());
195         Assert.assertEquals(10, ephemeris.getInterpolationSamples());
196         Assert.assertEquals(CartesianDerivativesFilter.USE_P, ephemeris.getAvailableDerivatives());
197         Assert.assertEquals(Constants.EIGEN5C_EARTH_MU,       ephemeris.getMu(), 1.0e-15);
198         Assert.assertEquals(ephemeris,                        ephemeris.getSegments().get(0));
199         Assert.assertEquals(0.0, firstPos.distance(ephemeris.getEphemeridesDataLines().get(0).getPosition()), 1.0e-15);
200         Assert.assertEquals(0.0, lastPos.distance(ephemeris.getEphemeridesDataLines().get(ephemeris.getEphemeridesDataLines().size() - 1).getPosition()), 1.0e-15);
201 
202         // Verify propagator
203         final BoundedPropagator propagator = ephemeris.getPropagator();
204         // 10 0 58282  78000.00000  0   -5843276.537    1074212.914  -10696380.103
205         final AbsoluteDate date = AbsoluteDate.createMJDDate(58282, 78000.00000, file.getTimeScale());
206         final Vector3D position = new Vector3D(-5843276.537, 1074212.914, -10696380.103);
207         Assert.assertEquals(0.0, position.distance(propagator.getPVCoordinates(date, ephemeris.getFrame()).getPosition()), 2.0e-9);
208         
209     }
210 
211     @Test
212     public void testGalileoVersion1() throws URISyntaxException, IOException {
213 
214         // Simple test for version 1.0, only contains position entries
215         final String    ex     = "/ilrs/galileo212_cpf_180613_6641.esa";
216         final DataSource source = new DataSource(ex, () -> getClass().getResourceAsStream(ex));
217         final CPF   file   = new CPFParser().parse(source);
218 
219         // Start date
220         final AbsoluteDate start = new AbsoluteDate("2018-06-12T23:59:42.000", file.getTimeScale());
221 
222         // End date
223         final AbsoluteDate end   = new AbsoluteDate("2018-06-14T23:59:42.000", file.getTimeScale());
224 
225         // Verify comments
226         final List<String> comments = file.getComments();
227         Assert.assertEquals(0, comments.size());
228 
229         // Verify header
230         final CPFHeader header = file.getHeader();
231         Assert.assertEquals("CPF",        header.getFormat());
232         Assert.assertEquals(1,            header.getVersion());
233         Assert.assertEquals("ESA",        header.getSource());
234         Assert.assertEquals(2018,         header.getProductionEpoch().getYear());
235         Assert.assertEquals(6,            header.getProductionEpoch().getMonth());
236         Assert.assertEquals(13,           header.getProductionEpoch().getDay());
237         Assert.assertEquals(10,           header.getProductionHour());
238         Assert.assertEquals(6641,         header.getSequenceNumber());
239         Assert.assertEquals("galileo212", header.getName());
240         Assert.assertEquals("1606902",    header.getIlrsSatelliteId());
241         Assert.assertEquals("7212",       header.getSic());
242         Assert.assertEquals("41860",      header.getNoradId());
243         Assert.assertEquals(900,          header.getStep());
244         Assert.assertEquals(1,            header.getTargetClass());
245         Assert.assertEquals(0,            header.getRotationalAngleType());
246         Assert.assertTrue(header.isCompatibleWithTIVs());
247         Assert.assertFalse(header.isCenterOfMassCorrectionApplied());
248         Assert.assertEquals(0.0,    start.durationFrom(header.getStartEpoch()), 1.0e-15);
249         Assert.assertEquals(0.0,    end.durationFrom(header.getEndEpoch()),     1.0e-15);
250         Assert.assertEquals(FramesFactory.getITRF(IERSConventions.IERS_2010, false), header.getRefFrame());
251         Assert.assertEquals(0,        header.getRefFrameId());
252 
253         // Coordinates
254         final CPFEphemeris ephemeris    = file.getSatellites().get("1606902");
255         final List<CPFCoordinate> coord = ephemeris.getCoordinates();
256 
257         // Verify first coordinate
258         final AbsoluteDate firstEpoch = AbsoluteDate.createMJDDate(58281, 86382.000000, file.getTimeScale());
259         final Vector3D firstPos = new Vector3D(-3442706.377, 29234902.063, 3170080.159);
260         Assert.assertEquals(0, coord.get(0).getLeap());
261         Assert.assertEquals(0.0, firstPos.distance(coord.get(0).getPosition()), 1.0e-15);
262         Assert.assertEquals(0.0, firstEpoch.durationFrom(coord.get(0).getDate()), 1.0e-15);
263 
264         // Verify last coordinate
265         final AbsoluteDate lastEpoch = AbsoluteDate.createMJDDate(58283, 86382.00000, file.getTimeScale());
266         final Vector3D lastPos  = new Vector3D(-7329586.488, -24111259.078, -15507306.979);
267         Assert.assertEquals(0, coord.get(coord.size() - 1).getLeap());
268         Assert.assertEquals(0.0, lastPos.distance(coord.get(coord.size() - 1).getPosition()), 1.0e-15);
269         Assert.assertEquals(0.0, lastEpoch.durationFrom(coord.get(coord.size() - 1).getDate()), 1.0e-15);
270 
271         // Verify Ephemeris
272         Assert.assertEquals(ephemeris.getFrame(),     header.getRefFrame());
273         Assert.assertEquals(10, ephemeris.getInterpolationSamples());
274         Assert.assertEquals(CartesianDerivativesFilter.USE_P, ephemeris.getAvailableDerivatives());
275         Assert.assertEquals(Constants.EIGEN5C_EARTH_MU,       ephemeris.getMu(), 1.0e-15);
276         Assert.assertEquals(ephemeris,                        ephemeris.getSegments().get(0));
277         Assert.assertEquals(0.0, firstPos.distance(ephemeris.getEphemeridesDataLines().get(0).getPosition()), 1.0e-15);
278         Assert.assertEquals(0.0, lastPos.distance(ephemeris.getEphemeridesDataLines().get(ephemeris.getEphemeridesDataLines().size() - 1).getPosition()), 1.0e-15);
279 
280         // Verify propagator
281         final BoundedPropagator propagator = ephemeris.getPropagator();
282         // 10 0 58282  78282.000000  0      22173889.124     -19259262.865       3650461.090
283         final AbsoluteDate date = AbsoluteDate.createMJDDate(58282, 78282.000000, file.getTimeScale());
284         final Vector3D position = new Vector3D(22173889.124, -19259262.865, 3650461.090);
285         Assert.assertEquals(0.0, position.distance(propagator.getPVCoordinates(date, ephemeris.getFrame()).getPosition()), 4.7e-10);
286         
287     }
288 
289     @Test
290     public void testAllFields() throws URISyntaxException, IOException {
291 
292         // Simple test for version 2.0, only contains position entries
293         final String    ex     = "/ilrs/cpf_all_fields.csg";
294         final DataSource source = new DataSource(ex, () -> getClass().getResourceAsStream(ex));
295         final CPF   file   = new CPFParser().parse(source);
296 
297         // Verify comments
298         final List<String> comments = file.getComments();
299         Assert.assertEquals(2, comments.size());
300 
301         // Verify header
302         final CPFHeader header = file.getHeader();
303         Assert.assertEquals("CPF",        header.getFormat());
304         Assert.assertEquals(2,            header.getVersion());
305         Assert.assertEquals("CSG",        header.getSource());
306         Assert.assertEquals(2018,         header.getProductionEpoch().getYear());
307         Assert.assertEquals(6,            header.getProductionEpoch().getMonth());
308         Assert.assertEquals(13,           header.getProductionEpoch().getDay());
309         Assert.assertEquals(10,           header.getProductionHour());
310         Assert.assertEquals(6641,         header.getSequenceNumber());
311         Assert.assertEquals("orekitSat",  header.getName());
312         Assert.assertEquals("1234567",    header.getIlrsSatelliteId());
313         Assert.assertEquals("705",        header.getSic());
314         Assert.assertEquals("99999",      header.getNoradId());
315         Assert.assertEquals(900,          header.getStep());
316         Assert.assertEquals(1,            header.getTargetClass());
317         Assert.assertEquals(0,            header.getRotationalAngleType());
318         Assert.assertEquals(0.0,          header.getPrf(), 0.0);
319         Assert.assertEquals(0.0,          header.getTranspTransmitDelay(), 0.0);
320         Assert.assertEquals(0.0,          header.getTranspUtcOffset(), 0.0);
321         Assert.assertEquals(0.0,          header.getTranspOscDrift(), 0.0);
322         Assert.assertEquals(0.0,          header.getTranspClkRef(), 0.0);
323         
324     }
325 
326     @Test
327     public void testInvalifFormat() throws URISyntaxException, IOException {
328         try {
329             final String ex = "/ilrs/cpf_invalid_format.csg";
330             final DataSource source = new DataSource(ex, () -> getClass().getResourceAsStream(ex));
331             new CPFParser().parse(source);
332             Assert.fail("an exception should have been thrown");
333         } catch (OrekitException oe) {
334             Assert.assertEquals(OrekitMessages.UNEXPECTED_FORMAT_FOR_ILRS_FILE,
335                                 oe.getSpecifier());
336             Assert.assertEquals("CPF", oe.getParts()[0]);
337             Assert.assertEquals("CDR", oe.getParts()[1]);
338         }
339     }
340 
341     @Test
342     public void testMissingEOF() throws IOException, URISyntaxException {
343         try {
344             final String ex = "/ilrs/cpf_unexpected_end_of_file.csg";
345             final DataSource source = new DataSource(ex, () -> getClass().getResourceAsStream(ex));
346             new CPFParser().parse(source);
347             Assert.fail("an exception should have been thrown");
348         } catch (OrekitException oe) {
349             Assert.assertEquals(OrekitMessages.CPF_UNEXPECTED_END_OF_FILE,
350                                 oe.getSpecifier());
351             Assert.assertEquals(5, ((Integer) oe.getParts()[0]).intValue());
352         }
353 
354     }
355 
356     @Test
357     public void testCorruptedData() throws IOException, URISyntaxException {
358         try {
359             final String ex = "/ilrs/cpf_corrupted_data.csg";
360             final DataSource source = new DataSource(ex, () -> getClass().getResourceAsStream(ex));
361             new CPFParser().parse(source);
362             Assert.fail("an exception should have been thrown");
363         } catch (OrekitException oe) {
364             Assert.assertEquals(OrekitMessages.UNABLE_TO_PARSE_LINE_IN_FILE,
365                                 oe.getSpecifier());
366             Assert.assertEquals(4, ((Integer) oe.getParts()[0]).intValue());
367         }
368 
369     }
370 
371     @Before
372     public void setUp() {
373         Utils.setDataRoot("regular-data");
374     }
375 
376 }