1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
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
61 final AbsoluteDate start = new AbsoluteDate("2018-06-13T00:00:00.000", file.getTimeScale());
62
63
64 final AbsoluteDate end = new AbsoluteDate("2018-06-18T00:00:00.000", file.getTimeScale());
65
66
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
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
99 final CPFEphemeris ephemeris = file.getSatellites().get("1600201");
100 final List<CPFCoordinate> coord = ephemeris.getCoordinates();
101
102
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
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
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
128 final BoundedPropagator propagator = ephemeris.getPropagator(new FrameAlignedProvider(ephemeris.getInertialFrame()));
129
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
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
145 final AbsoluteDate start = new AbsoluteDate("2018-06-13T00:00:00.000", file.getTimeScale());
146
147
148 final AbsoluteDate end = new AbsoluteDate("2018-06-15T00:00:00.000", file.getTimeScale());
149
150
151 final List<String> comments = file.getComments();
152 Assertions.assertEquals(0, comments.size());
153
154
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
182 final CPFEphemeris ephemeris = file.getSatellites().get("7603901");
183 final List<CPFCoordinate> coord = ephemeris.getCoordinates();
184
185
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
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
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
209 final BoundedPropagator propagator = ephemeris.getPropagator();
210
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
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
226 final AbsoluteDate start = new AbsoluteDate("2018-06-12T23:59:42.000", file.getTimeScale());
227
228
229 final AbsoluteDate end = new AbsoluteDate("2018-06-14T23:59:42.000", file.getTimeScale());
230
231
232 final List<String> comments = file.getComments();
233 Assertions.assertEquals(0, comments.size());
234
235
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
260 final CPFEphemeris ephemeris = file.getSatellites().get("1606902");
261 final List<CPFCoordinate> coord = ephemeris.getCoordinates();
262
263
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
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
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
287 final BoundedPropagator propagator = ephemeris.getPropagator(new FrameAlignedProvider(ephemeris.getInertialFrame()));
288
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
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
304 final List<String> comments = file.getComments();
305 Assertions.assertEquals(2, comments.size());
306
307
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 }