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 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
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
55 final AbsoluteDate start = new AbsoluteDate("2018-06-13T00:00:00.000", file.getTimeScale());
56
57
58 final AbsoluteDate end = new AbsoluteDate("2018-06-18T00:00:00.000", file.getTimeScale());
59
60
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
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
93 final CPFEphemeris ephemeris = file.getSatellites().get("1600201");
94 final List<CPFCoordinate> coord = ephemeris.getCoordinates();
95
96
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
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
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
122 final BoundedPropagator propagator = ephemeris.getPropagator();
123
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
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
139 final AbsoluteDate start = new AbsoluteDate("2018-06-13T00:00:00.000", file.getTimeScale());
140
141
142 final AbsoluteDate end = new AbsoluteDate("2018-06-15T00:00:00.000", file.getTimeScale());
143
144
145 final List<String> comments = file.getComments();
146 Assert.assertEquals(0, comments.size());
147
148
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
176 final CPFEphemeris ephemeris = file.getSatellites().get("7603901");
177 final List<CPFCoordinate> coord = ephemeris.getCoordinates();
178
179
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
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
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
203 final BoundedPropagator propagator = ephemeris.getPropagator();
204
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
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
220 final AbsoluteDate start = new AbsoluteDate("2018-06-12T23:59:42.000", file.getTimeScale());
221
222
223 final AbsoluteDate end = new AbsoluteDate("2018-06-14T23:59:42.000", file.getTimeScale());
224
225
226 final List<String> comments = file.getComments();
227 Assert.assertEquals(0, comments.size());
228
229
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
254 final CPFEphemeris ephemeris = file.getSatellites().get("1606902");
255 final List<CPFCoordinate> coord = ephemeris.getCoordinates();
256
257
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
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
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
281 final BoundedPropagator propagator = ephemeris.getPropagator();
282
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
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
298 final List<String> comments = file.getComments();
299 Assert.assertEquals(2, comments.size());
300
301
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 }