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