1   /* Copyright 2002-2022 CS GROUP
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.files.ccsds.ndm.odm.ocm;
18  
19  import java.io.ByteArrayInputStream;
20  import java.io.CharArrayWriter;
21  import java.io.IOException;
22  import java.io.InputStreamReader;
23  import java.net.URISyntaxException;
24  import java.nio.charset.StandardCharsets;
25  import java.util.List;
26  import java.util.Locale;
27  
28  import org.hipparchus.geometry.euclidean.threed.Vector3D;
29  import org.hipparchus.util.FastMath;
30  import org.junit.Assert;
31  import org.junit.Before;
32  import org.junit.Test;
33  import org.orekit.Utils;
34  import org.orekit.data.DataContext;
35  import org.orekit.data.DataSource;
36  import org.orekit.errors.OrekitException;
37  import org.orekit.errors.OrekitMessages;
38  import org.orekit.files.ccsds.definitions.CelestialBodyFrame;
39  import org.orekit.files.ccsds.definitions.CenterName;
40  import org.orekit.files.ccsds.definitions.DutyCycleType;
41  import org.orekit.files.ccsds.definitions.ElementsType;
42  import org.orekit.files.ccsds.definitions.OdMethodType;
43  import org.orekit.files.ccsds.definitions.OnOff;
44  import org.orekit.files.ccsds.definitions.OrbitRelativeFrame;
45  import org.orekit.files.ccsds.definitions.SpacecraftBodyFrame;
46  import org.orekit.files.ccsds.definitions.TimeSystem;
47  import org.orekit.files.ccsds.definitions.Units;
48  import org.orekit.files.ccsds.ndm.ParserBuilder;
49  import org.orekit.files.ccsds.ndm.WriterBuilder;
50  import org.orekit.files.ccsds.ndm.odm.UserDefined;
51  import org.orekit.files.ccsds.ndm.odm.oem.InterpolationMethod;
52  import org.orekit.files.ccsds.utils.generation.Generator;
53  import org.orekit.files.ccsds.utils.generation.KvnGenerator;
54  import org.orekit.files.ccsds.utils.lexical.KvnLexicalAnalyzer;
55  import org.orekit.files.ccsds.utils.lexical.XmlLexicalAnalyzer;
56  import org.orekit.time.AbsoluteDate;
57  import org.orekit.time.TimeScale;
58  import org.orekit.time.TimeScalesFactory;
59  import org.orekit.utils.Constants;
60  import org.orekit.utils.IERSConventions;
61  import org.orekit.utils.TimeStampedPVCoordinates;
62  import org.orekit.utils.units.Unit;
63  
64  public class OcmParserTest {
65  
66      @Before
67      public void setUp() {
68          Utils.setDataRoot("regular-data");
69      }
70  
71      @Test
72      public void testNonExistentKvnFile() throws URISyntaxException {
73          final String realName = "/ccsds/odm/ocm/OCMExample1.txt";
74          final String wrongName = realName + "xxxxx";
75          final DataSource source = new DataSource(wrongName, () -> getClass().getResourceAsStream(wrongName));
76          try {
77              new KvnLexicalAnalyzer(source).accept(new ParserBuilder().buildOcmParser());
78              Assert.fail("an exception should have been thrown");
79          } catch (OrekitException oe) {
80              Assert.assertEquals(OrekitMessages.UNABLE_TO_FIND_FILE, oe.getSpecifier());
81              Assert.assertEquals(wrongName, oe.getParts()[0]);
82          }
83      }
84  
85      @Test
86      public void testNonExistentXmlFile() throws URISyntaxException {
87          final String realName = "/ccsds/odm/ocm/OCMExample1.txt";
88          final String wrongName = realName + "xxxxx";
89          final DataSource source = new DataSource(wrongName, () -> getClass().getResourceAsStream(wrongName));
90          try {
91              new XmlLexicalAnalyzer(source).accept(new ParserBuilder().buildOcmParser());
92              Assert.fail("an exception should have been thrown");
93          } catch (OrekitException oe) {
94              Assert.assertEquals(OrekitMessages.UNABLE_TO_FIND_FILE, oe.getSpecifier());
95              Assert.assertEquals(wrongName, oe.getParts()[0]);
96          }
97      }
98  
99      @Test
100     public void testMissingT0() throws URISyntaxException {
101         final String name = "/ccsds/odm/ocm/OCM-missing-t0.txt";
102         final DataSource source = new DataSource(name, () -> getClass().getResourceAsStream(name));
103         try {
104             new ParserBuilder().
105             withMu(Constants.EIGEN5C_EARTH_MU).
106             buildOcmParser().
107             parseMessage(source);
108             Assert.fail("an exception should have been thrown");
109         } catch (OrekitException oe) {
110             Assert.assertEquals(OrekitMessages.UNINITIALIZED_VALUE_FOR_KEY, oe.getSpecifier());
111             Assert.assertEquals(OcmMetadataKey.EPOCH_TZERO.name(), oe.getParts()[0]);
112         }
113     }
114 
115     @Test
116     public void testMissingManeuverTime() throws URISyntaxException {
117         final String name = "/ccsds/odm/ocm/OCM-missing-maneuver-time.txt";
118         final DataSource source = new DataSource(name, () -> getClass().getResourceAsStream(name));
119         try {
120             new ParserBuilder().
121             withMu(Constants.EIGEN5C_EARTH_MU).
122             buildOcmParser().
123             parseMessage(source);
124             Assert.fail("an exception should have been thrown");
125         } catch (OrekitException oe) {
126             Assert.assertEquals(OrekitMessages.CCSDS_MANEUVER_MISSING_TIME, oe.getSpecifier());
127             Assert.assertEquals("MAN-45", oe.getParts()[0]);
128         }
129     }
130 
131     @Test
132     public void testWrongTimeSpan() throws URISyntaxException {
133         final String name = "/ccsds/odm/ocm/OCM-wrong-time-span.txt";
134         final DataSource source = new DataSource(name, () -> getClass().getResourceAsStream(name));
135         try {
136             new ParserBuilder().
137             withMu(Constants.EIGEN5C_EARTH_MU).
138             buildOcmParser().
139             parseMessage(source);
140             Assert.fail("an exception should have been thrown");
141         } catch (OrekitException oe) {
142             Assert.assertEquals(OrekitMessages.UNABLE_TO_PARSE_ELEMENT_IN_FILE, oe.getSpecifier());
143             Assert.assertEquals("TIME_SPAN", oe.getParts()[0]);
144             Assert.assertEquals(11, ((Integer) oe.getParts()[1]).intValue());
145             Assert.assertTrue(((String) oe.getParts()[2]).endsWith("OCM-wrong-time-span.txt"));
146         }
147     }
148 
149     @Test
150     public void testMissingRevnumBasis() throws URISyntaxException {
151         final String name = "/ccsds/odm/ocm/OCM-missing-revnum-basis.txt";
152         final DataSource source = new DataSource(name, () -> getClass().getResourceAsStream(name));
153         try {
154             new ParserBuilder().
155             withMu(Constants.EIGEN5C_EARTH_MU).
156             buildOcmParser().
157             parseMessage(source);
158             Assert.fail("an exception should have been thrown");
159         } catch (OrekitException oe) {
160             Assert.assertEquals(OrekitMessages.UNINITIALIZED_VALUE_FOR_KEY, oe.getSpecifier());
161             Assert.assertEquals(TrajectoryStateHistoryMetadataKey.ORB_REVNUM_BASIS.name(), oe.getParts()[0]);
162         }
163     }
164 
165     @Test
166     public void testSpuriousMetaDataSection() throws URISyntaxException {
167         final String name = "/ccsds/odm/ocm/OCM-spurious-metadata-section.txt";
168         final DataSource source = new DataSource(name, () -> getClass().getResourceAsStream(name));
169         try {
170             new ParserBuilder().
171             withMu(Constants.EIGEN5C_EARTH_MU).
172             buildOcmParser().
173             parseMessage(source);
174             Assert.fail("an exception should have been thrown");
175         } catch (OrekitException oe) {
176             Assert.assertEquals(OrekitMessages.CCSDS_UNEXPECTED_KEYWORD, oe.getSpecifier());
177             Assert.assertEquals(13, ((Integer) oe.getParts()[0]).intValue());
178             Assert.assertEquals("META", oe.getParts()[2]);
179         }
180     }
181 
182     @Test
183     public void testIncompatibleUnitsDimension() throws URISyntaxException {
184         final String name = "/ccsds/odm/ocm/OCM-incompatible-units-dimension.txt";
185         final DataSource source = new DataSource(name, () -> getClass().getResourceAsStream(name));
186         try {
187             new ParserBuilder().
188             withMu(Constants.EIGEN5C_EARTH_MU).
189             buildOcmParser().
190             parseMessage(source);
191             Assert.fail("an exception should have been thrown");
192         } catch (OrekitException oe) {
193             Assert.assertEquals(OrekitMessages.INCOMPATIBLE_UNITS, oe.getSpecifier());
194             Assert.assertEquals("km²/s", oe.getParts()[0]);
195             Assert.assertEquals("m", oe.getParts()[1]);
196         }
197     }
198 
199     @Test
200     public void testIncompatibleUnitsScale() throws URISyntaxException {
201         final String name = "/ccsds/odm/ocm/OCM-incompatible-units-scale.txt";
202         final DataSource source = new DataSource(name, () -> getClass().getResourceAsStream(name));
203         try {
204             new ParserBuilder().
205             withMu(Constants.EIGEN5C_EARTH_MU).
206             buildOcmParser().
207             parseMessage(source);
208             Assert.fail("an exception should have been thrown");
209         } catch (OrekitException oe) {
210             Assert.assertEquals(OrekitMessages.INCOMPATIBLE_UNITS, oe.getSpecifier());
211             Assert.assertEquals("km", oe.getParts()[0]);
212             Assert.assertEquals("m", oe.getParts()[1]);
213         }
214     }
215 
216     @Test
217     public void testWrongNbElements() throws URISyntaxException {
218         final String name = "/ccsds/odm/ocm/OCM-wrong-nb-elements.txt";
219         final DataSource source = new DataSource(name, () -> getClass().getResourceAsStream(name));
220         try {
221             new ParserBuilder().
222             withMu(Constants.EIGEN5C_EARTH_MU).
223             buildOcmParser().
224             parseMessage(source);
225             Assert.fail("an exception should have been thrown");
226         } catch (OrekitException oe) {
227             Assert.assertEquals(OrekitMessages.CCSDS_ELEMENT_SET_WRONG_NB_COMPONENTS, oe.getSpecifier());
228             Assert.assertEquals(ElementsType.CARTP.name(), oe.getParts()[0]);
229             Assert.assertEquals(ElementsType.CARTP.toString(), oe.getParts()[1]);
230             Assert.assertEquals(3, ((Integer) oe.getParts()[2]).intValue());
231         }
232     }
233 
234     @Test
235     public void testUnknownFrame() throws URISyntaxException {
236         final String name = "/ccsds/odm/ocm/OCM-unknown-frame.txt";
237         final DataSource source = new DataSource(name, () -> getClass().getResourceAsStream(name));
238         final Ocm    ocm    = new ParserBuilder().
239                                   withMu(Constants.EIGEN5C_EARTH_MU).
240                                   buildOcmParser().
241                                   parseMessage(source);
242         Assert.assertEquals("CS GROUP", ocm.getHeader().getOriginator());
243         Assert.assertEquals("728b0d2a-01fc-4d0e-9f0a-370c6930ea84", ocm.getHeader().getMessageId().toLowerCase(Locale.US));
244         final TrajectoryStateHistory h = ocm.getData().getOTrajectoryBlocks().get(0);
245         Assert.assertEquals("ZZRF", h.getMetadata().getTrajReferenceFrame().getName());
246         List<TimeStampedPVCoordinates> l = h.getCoordinates();
247         Assert.assertEquals( 3.0e6, l.get(0).getPosition().getX(), 1.0e-9);
248         Assert.assertEquals( 4.0e6, l.get(0).getPosition().getY(), 1.0e-9);
249         Assert.assertEquals( 5.0e6, l.get(0).getPosition().getZ(), 1.0e-9);
250         Assert.assertEquals(-1.0e3, l.get(0).getVelocity().getX(), 1.0e-12);
251         Assert.assertEquals(-2.0e3, l.get(0).getVelocity().getY(), 1.0e-12);
252         Assert.assertEquals(-3.0e3, l.get(0).getVelocity().getZ(), 1.0e-1);
253         try {
254             ocm.getData().getOTrajectoryBlocks().get(0).getFrame();
255             Assert.fail("an exception should have been thrown");
256         } catch (OrekitException oe) {
257             Assert.assertEquals(OrekitMessages.CCSDS_INVALID_FRAME, oe.getSpecifier());
258             Assert.assertEquals("ZZRF", oe.getParts()[0]);
259         }
260     }
261 
262     @Test
263     public void testUserDefined() throws URISyntaxException {
264         final String name = "/ccsds/odm/ocm/OCM-user-defined.txt";
265         final DataSource source = new DataSource(name, () -> getClass().getResourceAsStream(name));
266         final Ocm    ocm    = new ParserBuilder().
267                                   withMu(Constants.EIGEN5C_EARTH_MU).
268                                   buildOcmParser().
269                                   parseMessage(source);
270         Assert.assertEquals("CS GROUP", ocm.getHeader().getOriginator());
271         Assert.assertEquals("b77d785c-f7a8-4a80-a9b1-a540eac19d7a", ocm.getHeader().getMessageId().toLowerCase(Locale.US));
272         Assert.assertNull(ocm.getData().getOTrajectoryBlocks());
273         Assert.assertEquals(1, ocm.getData().getUserDefinedBlock().getComments().size());
274         Assert.assertEquals("some user data", ocm.getData().getUserDefinedBlock().getComments().get(0));
275         Assert.assertEquals(1, ocm.getData().getUserDefinedBlock().getParameters().size());
276         Assert.assertEquals("OREKIT", ocm.getData().getUserDefinedBlock().getParameters().get("GENERATOR"));
277     }
278 
279     @Test
280     public void testParseOCM1() {
281         final String   name  = "/ccsds/odm/ocm/OCMExample1.txt";
282         final DataSource source = new DataSource(name, () -> getClass().getResourceAsStream(name));
283         final Ocm file = new ParserBuilder().
284                              withMu(Constants.EIGEN5C_EARTH_MU).
285                              buildOcmParser().
286                              parseMessage(source);
287 
288         // check the default values that are not set in this simple file
289         Assert.assertEquals("CSPOC",              file.getMetadata().getCatalogName());
290         Assert.assertEquals(1.0,                  file.getMetadata().getSclkSecPerSISec(), 1.0e-15);
291         Assert.assertEquals("LINEAR",             file.getMetadata().getInterpMethodEOP());
292 
293         // Check Header Block;
294         Assert.assertEquals(3.0, file.getHeader().getFormatVersion(), 1.0e-10);
295         Assert.assertEquals(new AbsoluteDate(1998, 11, 06, 9, 23, 57, TimeScalesFactory.getUTC()),
296                             file.getHeader().getCreationDate());
297 
298         // OCM is the only message for which OBJECT_NAME is not mandatory, it is not present in this minimal file
299         Assert.assertNull(file.getMetadata().getObjectName());
300 
301         Assert.assertEquals("JAXA", file.getHeader().getOriginator());
302 
303         final AbsoluteDate t0 = new AbsoluteDate(1998, 12, 18, 14, 28, 15.1172, TimeScalesFactory.getUTC());
304         Assert.assertEquals(t0, file.getMetadata().getEpochT0());
305         Assert.assertEquals(TimeSystem.UTC, file.getMetadata().getTimeSystem());
306 
307         // trajectory data
308         Assert.assertEquals(1, file.getData().getOTrajectoryBlocks().size());
309         TrajectoryStateHistory history = file.getData().getOTrajectoryBlocks().get(0);
310         Assert.assertEquals("intervening data records omitted between DT=20.0 and DT=500.0",
311                             history.getMetadata().getComments().get(0));
312         Assert.assertEquals("OSCULATING", history.getMetadata().getOrbAveraging());
313         Assert.assertEquals("EARTH", history.getMetadata().getCenter().getName());
314         Assert.assertEquals(CelestialBodyFrame.ITRF2000, history.getMetadata().getTrajReferenceFrame().asCelestialBodyFrame());
315         Assert.assertEquals(ElementsType.CARTPV, history.getMetadata().getTrajType());
316         Assert.assertEquals(0.0, file.getMetadata().getEpochT0().durationFrom(t0), 1.0e-15);
317         List<TrajectoryState> states = history.getTrajectoryStates();
318         Assert.assertEquals(4, states.size());
319 
320         Assert.assertEquals(0.0, states.get(0).getDate().durationFrom(t0), 1.0e-15);
321         Assert.assertEquals(6, states.get(0).getElements().length);
322         Assert.assertEquals( 2789600.0, states.get(0).getElements()[0], 1.0e-15);
323         Assert.assertEquals( -280000.0, states.get(0).getElements()[1], 1.0e-15);
324         Assert.assertEquals(-1746800.0, states.get(0).getElements()[2], 1.0e-15);
325         Assert.assertEquals(    4730.0, states.get(0).getElements()[3], 1.0e-15);
326         Assert.assertEquals(   -2500.0, states.get(0).getElements()[4], 1.0e-15);
327         Assert.assertEquals(   -1040.0, states.get(0).getElements()[5], 1.0e-15);
328 
329         Assert.assertEquals(10.0, states.get(1).getDate().durationFrom(t0), 1.0e-15);
330         Assert.assertEquals(6, states.get(1).getElements().length);
331         Assert.assertEquals( 2783400.0, states.get(1).getElements()[0], 1.0e-15);
332         Assert.assertEquals( -308100.0, states.get(1).getElements()[1], 1.0e-15);
333         Assert.assertEquals(-1877100.0, states.get(1).getElements()[2], 1.0e-15);
334         Assert.assertEquals(    5190.0, states.get(1).getElements()[3], 1.0e-15);
335         Assert.assertEquals(   -2420.0, states.get(1).getElements()[4], 1.0e-15);
336         Assert.assertEquals(   -2000.0, states.get(1).getElements()[5], 1.0e-15);
337 
338         Assert.assertEquals(20.0, states.get(2).getDate().durationFrom(t0), 1.0e-15);
339         Assert.assertEquals(6, states.get(2).getElements().length);
340         Assert.assertEquals( 2776000.0, states.get(2).getElements()[0], 1.0e-15);
341         Assert.assertEquals( -336900.0, states.get(2).getElements()[1], 1.0e-15);
342         Assert.assertEquals(-2008700.0, states.get(2).getElements()[2], 1.0e-15);
343         Assert.assertEquals(    5640.0, states.get(2).getElements()[3], 1.0e-15);
344         Assert.assertEquals(   -2340.0, states.get(2).getElements()[4], 1.0e-15);
345         Assert.assertEquals(   -1950.0, states.get(2).getElements()[5], 1.0e-15);
346 
347         Assert.assertEquals(500.0, states.get(3).getDate().durationFrom(t0), 1.0e-15);
348         Assert.assertEquals(6, states.get(3).getElements().length);
349         Assert.assertEquals( 2164375.0,  states.get(3).getElements()[0], 1.0e-15);
350         Assert.assertEquals( 1115811.0,  states.get(3).getElements()[1], 1.0e-15);
351         Assert.assertEquals( -688131.0,  states.get(3).getElements()[2], 1.0e-15);
352         Assert.assertEquals(   -3533.28, states.get(3).getElements()[3], 1.0e-15);
353         Assert.assertEquals(   -2884.52, states.get(3).getElements()[4], 1.0e-15);
354         Assert.assertEquals(     885.35, states.get(3).getElements()[5], 1.0e-15);
355 
356         Assert.assertEquals(1, file.getSatellites().size());
357         Assert.assertEquals("UNKNOWN", file.getSatellites().entrySet().iterator().next().getKey());
358 
359     }
360 
361     @Test
362     public void testParseOCM2KVN() {
363         final String  name = "/ccsds/odm/ocm/OCMExample2.txt";
364         final DataSource source = new DataSource(name, () -> getClass().getResourceAsStream(name));
365         final Ocm file = new ParserBuilder().
366                              withMu(Constants.EIGEN5C_EARTH_MU).
367                              buildOcmParser().
368                              parseMessage(source);
369 
370         // Check Header Block;
371         Assert.assertEquals(3.0, file.getHeader().getFormatVersion(), 1.0e-10);
372         Assert.assertEquals("This OCM reflects the latest conditions post-maneuver A67Z",
373                             file.getHeader().getComments().get(0));
374         Assert.assertEquals("This example shows the specification of multiple comment lines",
375                             file.getHeader().getComments().get(1));
376         Assert.assertEquals(new AbsoluteDate(1998, 11, 06, 9, 23, 57, TimeScalesFactory.getUTC()),
377                             file.getHeader().getCreationDate());
378         Assert.assertEquals("JAXA", file.getHeader().getOriginator());
379         Assert.assertEquals("OCM 201113719185", file.getHeader().getMessageId());
380 
381         // Check metadata
382         Assert.assertEquals("OSPREY 5",                            file.getMetadata().getObjectName());
383         Assert.assertEquals("1998-999A",                           file.getMetadata().getInternationalDesignator());
384         Assert.assertEquals("R. Rabbit",                           file.getMetadata().getOriginatorPOC());
385         Assert.assertEquals("Flight Dynamics Mission Design Lead", file.getMetadata().getOriginatorPosition());
386         Assert.assertEquals("(719)555-1234",                       file.getMetadata().getOriginatorPhone());
387         Assert.assertEquals("Mr. Rodgers",                         file.getMetadata().getTechPOC());
388         Assert.assertEquals("(719)555-1234",                       file.getMetadata().getTechPhone());
389         Assert.assertEquals("email@email.XXX",                     file.getMetadata().getTechAddress());
390         Assert.assertEquals(TimeSystem.UT1, file.getMetadata().getTimeSystem());
391         TimeScale ts = DataContext.getDefault().getTimeScales().getUT1(IERSConventions.IERS_2010, false);
392         Assert.assertEquals(0.0,
393                             file.getMetadata().getEpochT0().durationFrom(new AbsoluteDate(1998, 12, 18, ts)),
394                             1.0e-10);
395         Assert.assertEquals(36.0,                                  file.getMetadata().getTaimutcT0(), 1.0e-15);
396         Assert.assertEquals(0.357,                                 file.getMetadata().getUt1mutcT0(), 1.0e-15);
397 
398         // check trajectory data
399         Assert.assertEquals(1, file.getData().getOTrajectoryBlocks().size());
400         final TrajectoryStateHistory orb = file.getData().getOTrajectoryBlocks().get(0);
401         Assert.assertEquals(2, orb.getMetadata().getComments().size());
402         Assert.assertEquals("GEOCENTRIC, CARTESIAN, EARTH FIXED", orb.getMetadata().getComments().get(0));
403         Assert.assertEquals("THIS IS MY SECOND COMMENT LINE",     orb.getMetadata().getComments().get(1));
404         Assert.assertEquals("PREDICTED", orb.getMetadata().getTrajBasis());
405         Assert.assertEquals("EFG", orb.getMetadata().getTrajReferenceFrame().getName());
406         Assert.assertNull(orb.getMetadata().getTrajReferenceFrame().asFrame());
407         Assert.assertNull(orb.getMetadata().getTrajReferenceFrame().asCelestialBodyFrame());
408         Assert.assertNull(orb.getMetadata().getTrajReferenceFrame().asOrbitRelativeFrame());
409         Assert.assertNull(orb.getMetadata().getTrajReferenceFrame().asSpacecraftBodyFrame());
410         Assert.assertEquals(ElementsType.CARTPV, orb.getMetadata().getTrajType());
411         Assert.assertEquals(6, orb.getMetadata().getTrajUnits().size());
412         Assert.assertEquals("km",   orb.getMetadata().getTrajUnits().get(0).getName());
413         Assert.assertEquals("km",   orb.getMetadata().getTrajUnits().get(1).getName());
414         Assert.assertEquals("km",   orb.getMetadata().getTrajUnits().get(2).getName());
415         Assert.assertEquals("km/s", orb.getMetadata().getTrajUnits().get(3).getName());
416         Assert.assertEquals("km/s", orb.getMetadata().getTrajUnits().get(4).getName());
417         Assert.assertEquals("km/s", orb.getMetadata().getTrajUnits().get(5).getName());
418         Assert.assertEquals(1, orb.getTrajectoryStates().size());
419         Assert.assertEquals(new AbsoluteDate(1998, 12, 18, 14, 28, 25.1172, ts),
420                             orb.getTrajectoryStates().get(0).getDate());
421         Assert.assertEquals( 2854533.0, orb.getTrajectoryStates().get(0).getElements()[0], 1.0e-10);
422         Assert.assertEquals(-2916187.0, orb.getTrajectoryStates().get(0).getElements()[1], 1.0e-10);
423         Assert.assertEquals(-5360774.0, orb.getTrajectoryStates().get(0).getElements()[2], 1.0e-10);
424         Assert.assertEquals(    5688.0, orb.getTrajectoryStates().get(0).getElements()[3], 1.0e-10);
425         Assert.assertEquals(    4652.0, orb.getTrajectoryStates().get(0).getElements()[4], 1.0e-10);
426         Assert.assertEquals(     520.0, orb.getTrajectoryStates().get(0).getElements()[5], 1.0e-10);
427 
428         // check physical data
429         PhysicalProperties phys = file.getData().getPhysicBlock();
430         Assert.assertEquals(1, phys.getComments().size());
431         Assert.assertEquals("S/C Physical Characteristics:", phys.getComments().get(0));
432         Assert.assertEquals(100.0,   phys.getWetMass(),                  1.0e-10);
433         Assert.assertEquals(0.03123, phys.getOebQ().getQ1(),             1.0e-10);
434         Assert.assertEquals(0.78543, phys.getOebQ().getQ2(),             1.0e-10);
435         Assert.assertEquals(0.39158, phys.getOebQ().getQ3(),             1.0e-10);
436         Assert.assertEquals(0.47832, phys.getOebQ().getQ0(),             1.0e-10);
437         Assert.assertEquals(2.0,     phys.getOebMax(),                   1.0e-10);
438         Assert.assertEquals(1.0,     phys.getOebIntermediate(),          1.0e-10);
439         Assert.assertEquals(0.5,     phys.getOebMin(),                   1.0e-10);
440         Assert.assertEquals(0.15,    phys.getOebAreaAlongMax(),          1.0e-10);
441         Assert.assertEquals(0.30,    phys.getOebAreaAlongIntermediate(), 1.0e-10);
442         Assert.assertEquals(0.50,    phys.getOebAreaAlongMin(),          1.0e-10);
443 
444         // check no covariance
445         Assert.assertNull(file.getData().getCovarianceBlocks());
446 
447         // check no maneuvers
448         Assert.assertNull(file.getData().getManeuverBlocks());
449 
450         // check perturbation data
451         Perturbations perts = file.getData().getPerturbationsBlock();
452         Assert.assertEquals(1, perts.getComments().size());
453         Assert.assertEquals("Perturbations Specification:", perts.getComments().get(0));
454         Assert.assertEquals("NRLMSIS00", perts.getAtmosphericModel());
455         Assert.assertEquals("EGM-96", perts.getGravityModel());
456         Assert.assertEquals(36, perts.getGravityDegree());
457         Assert.assertEquals(36, perts.getGravityOrder());
458         Assert.assertEquals(2, perts.getNBodyPerturbations().size());
459         Assert.assertEquals("MOON", perts.getNBodyPerturbations().get(0).getName());
460         Assert.assertEquals("SUN",  perts.getNBodyPerturbations().get(1).getName());
461         Assert.assertEquals( 12.0, Units.NANO_TESLA.fromSI(perts.getFixedGeomagneticKp()), 1.0e-10);
462         Assert.assertEquals(105.0, Unit.SOLAR_FLUX_UNIT.fromSI(perts.getFixedF10P7()),     1.0e-10);
463         Assert.assertEquals(120.0, Unit.SOLAR_FLUX_UNIT.fromSI(perts.getFixedF10P7Mean()), 1.0e-10);
464 
465         // check no orbit determination
466         Assert.assertNull(file.getData().getOrbitDeterminationBlock());
467 
468         // check user data
469         UserDefined user = file.getData().getUserDefinedBlock();
470         Assert.assertTrue(user.getComments().isEmpty());
471         Assert.assertEquals(1, user.getParameters().size());
472         Assert.assertEquals("MAXWELL RAFERTY", user.getParameters().get("CONSOLE_POC"));
473 
474         Assert.assertEquals(1, file.getSatellites().size());
475         Assert.assertEquals("OSPREY 5", file.getSatellites().entrySet().iterator().next().getKey());
476 
477     }
478 
479     @Test
480     public void testParseOCM2XMLBinary() {
481         final String  name = "/ccsds/odm/ocm/OCMExample2.xml";
482         final DataSource source = new DataSource(name, () -> getClass().getResourceAsStream(name));
483         validateOCM2XML(new ParserBuilder().
484                         withMu(Constants.EIGEN5C_EARTH_MU).
485                         buildOcmParser().
486                         parseMessage(source));
487     }
488 
489     @Test
490     public void testParseOCM2XMLCharacter() {
491         final String  name = "/ccsds/odm/ocm/OCMExample2.xml";
492         final DataSource source = new DataSource(name, () -> new InputStreamReader(getClass().getResourceAsStream(name), StandardCharsets.UTF_8));
493         validateOCM2XML(new ParserBuilder().
494                         withMu(Constants.EIGEN5C_EARTH_MU).
495                         buildOcmParser().
496                         parseMessage(source));
497     }
498 
499     @Test
500     public void testWriteOCM2() throws URISyntaxException, IOException {
501         final String name = "/ccsds/odm/ocm/OCMExample2.xml";
502         final DataSource source = new DataSource(name, () -> getClass().getResourceAsStream(name));
503         OcmParser parser = new ParserBuilder(). withMu(Constants.EIGEN5C_EARTH_MU).buildOcmParser();
504         final Ocm original = parser.parseMessage(source);
505 
506         // write the parsed file back to a characters array
507         final CharArrayWriter caw = new CharArrayWriter();
508         final Generator generator = new KvnGenerator(caw, OcmWriter.KVN_PADDING_WIDTH, "dummy", 60);
509         new WriterBuilder().buildOcmWriter().writeMessage(generator, original);
510 
511         // reparse the written file
512         final byte[]     bytes   = caw.toString().getBytes(StandardCharsets.UTF_8);
513         final DataSource source2 = new DataSource(name, () -> new ByteArrayInputStream(bytes));
514         final Ocm    rebuilt = new ParserBuilder().buildOcmParser().parseMessage(source2);
515         validateOCM2XML(rebuilt);
516 
517     }
518 
519     private void validateOCM2XML(final Ocm file) {
520 
521         // Check Header Block;
522         Assert.assertEquals(3.0, file.getHeader().getFormatVersion(), 1.0e-10);
523         Assert.assertEquals("ODM V.3 Example G-2",
524                             file.getHeader().getComments().get(0));
525         Assert.assertEquals("OCM example with space object characteristics and perturbations.",
526                             file.getHeader().getComments().get(1));
527         Assert.assertEquals("This OCM reflects the latest conditions post-maneuver A67Z",
528                             file.getHeader().getComments().get(2));
529         Assert.assertEquals("This example shows the specification of multiple comment lines",
530                             file.getHeader().getComments().get(3));
531         Assert.assertEquals(new AbsoluteDate(1998, 11, 06, 9, 23, 57, TimeScalesFactory.getUTC()),
532                             file.getHeader().getCreationDate());
533         Assert.assertEquals("JAXA", file.getHeader().getOriginator());
534         Assert.assertEquals("OCM 201113719185", file.getHeader().getMessageId());
535 
536         // Check metadata
537         Assert.assertNull(file.getMetadata().getObjectName());
538         Assert.assertNull(file.getMetadata().getObjectDesignator());
539         Assert.assertEquals("1998-999A",                           file.getMetadata().getInternationalDesignator());
540         Assert.assertEquals("R. Rabbit",                           file.getMetadata().getOriginatorPOC());
541         Assert.assertEquals("Flight Dynamics Mission Design Lead", file.getMetadata().getOriginatorPosition());
542         Assert.assertEquals("(719)555-1234",                       file.getMetadata().getOriginatorPhone());
543         Assert.assertEquals("Mr. Rodgers",                         file.getMetadata().getTechPOC());
544         Assert.assertEquals("(719)555-1234",                       file.getMetadata().getTechPhone());
545         Assert.assertEquals("email@email.XXX",                     file.getMetadata().getTechAddress());
546         Assert.assertEquals(TimeSystem.UT1, file.getMetadata().getTimeSystem());
547         TimeScale ts = DataContext.getDefault().getTimeScales().getUT1(IERSConventions.IERS_2010, false);
548         Assert.assertEquals(0.0,
549                             file.getMetadata().getEpochT0().durationFrom(new AbsoluteDate(1998, 12, 18, ts)),
550                             1.0e-10);
551         Assert.assertEquals(36.0,                                  file.getMetadata().getTaimutcT0(), 1.0e-15);
552         Assert.assertEquals(0.357,                                 file.getMetadata().getUt1mutcT0(), 1.0e-15);
553 
554         // check trajectory data
555         Assert.assertEquals(1, file.getData().getOTrajectoryBlocks().size());
556         final TrajectoryStateHistory orb = file.getData().getOTrajectoryBlocks().get(0);
557         Assert.assertEquals(2, orb.getMetadata().getComments().size());
558         Assert.assertEquals("GEOCENTRIC, CARTESIAN, EARTH FIXED", orb.getMetadata().getComments().get(0));
559         Assert.assertEquals("THIS IS MY SECOND COMMENT LINE",     orb.getMetadata().getComments().get(1));
560         Assert.assertEquals("PREDICTED", orb.getMetadata().getTrajBasis());
561         Assert.assertEquals("EFG", orb.getMetadata().getTrajReferenceFrame().getName());
562         Assert.assertNull(orb.getMetadata().getTrajReferenceFrame().asFrame());
563         Assert.assertNull(orb.getMetadata().getTrajReferenceFrame().asCelestialBodyFrame());
564         Assert.assertNull(orb.getMetadata().getTrajReferenceFrame().asOrbitRelativeFrame());
565         Assert.assertNull(orb.getMetadata().getTrajReferenceFrame().asSpacecraftBodyFrame());
566         Assert.assertEquals(ElementsType.CARTPVA, orb.getMetadata().getTrajType());
567         Assert.assertNull(orb.getMetadata().getTrajUnits());
568         Assert.assertEquals(1, orb.getTrajectoryStates().size());
569         Assert.assertEquals(new AbsoluteDate(1998, 12, 18, 0, 0, 0.0, ts),
570                             orb.getTrajectoryStates().get(0).getDate());
571         Assert.assertEquals( 2854500.0, orb.getTrajectoryStates().get(0).getElements()[0], 1.0e-10);
572         Assert.assertEquals(-2916200.0, orb.getTrajectoryStates().get(0).getElements()[1], 1.0e-10);
573         Assert.assertEquals(-5360700.0, orb.getTrajectoryStates().get(0).getElements()[2], 1.0e-10);
574         Assert.assertEquals(    5900.0, orb.getTrajectoryStates().get(0).getElements()[3], 1.0e-10);
575         Assert.assertEquals(    4860.0, orb.getTrajectoryStates().get(0).getElements()[4], 1.0e-10);
576         Assert.assertEquals(     520.0, orb.getTrajectoryStates().get(0).getElements()[5], 1.0e-10);
577         Assert.assertEquals(       3.7, orb.getTrajectoryStates().get(0).getElements()[6], 1.0e-10);
578         Assert.assertEquals(      -3.8, orb.getTrajectoryStates().get(0).getElements()[7], 1.0e-10);
579         Assert.assertEquals(      -7.0, orb.getTrajectoryStates().get(0).getElements()[8], 1.0e-10);
580 
581         // check physical data
582         PhysicalProperties phys = file.getData().getPhysicBlock();
583         Assert.assertEquals(1, phys.getComments().size());
584         Assert.assertEquals("Spacecraft Physical Characteristics", phys.getComments().get(0));
585         Assert.assertEquals(100.0,   phys.getWetMass(),                  1.0e-10);
586         Assert.assertEquals(0.03123, phys.getOebQ().getQ1(),             1.0e-10);
587         Assert.assertEquals(0.78543, phys.getOebQ().getQ2(),             1.0e-10);
588         Assert.assertEquals(0.39158, phys.getOebQ().getQ3(),             1.0e-10);
589         Assert.assertEquals(0.47832, phys.getOebQ().getQ0(),             1.0e-10);
590         Assert.assertEquals(2.0,     phys.getOebMax(),                   1.0e-10);
591         Assert.assertEquals(1.0,     phys.getOebIntermediate(),          1.0e-10);
592         Assert.assertEquals(0.5,     phys.getOebMin(),                   1.0e-10);
593         Assert.assertEquals(0.15,    phys.getOebAreaAlongMax(),          1.0e-10);
594         Assert.assertEquals(0.30,    phys.getOebAreaAlongIntermediate(), 1.0e-10);
595         Assert.assertEquals(0.50,    phys.getOebAreaAlongMin(),          1.0e-10);
596 
597         // check no covariance
598         Assert.assertNull(file.getData().getCovarianceBlocks());
599 
600         // check no maneuvers
601         Assert.assertNull(file.getData().getManeuverBlocks());
602 
603         // check perturbation data
604         Perturbations perts = file.getData().getPerturbationsBlock();
605         Assert.assertEquals(1, perts.getComments().size());
606         Assert.assertEquals("Perturbations Specification", perts.getComments().get(0));
607         Assert.assertEquals("NRLMSIS00", perts.getAtmosphericModel());
608         Assert.assertEquals("EGM-96", perts.getGravityModel());
609         Assert.assertEquals(36, perts.getGravityDegree());
610         Assert.assertEquals(36, perts.getGravityOrder());
611         Assert.assertEquals(36, perts.getGravityOrder());
612         Assert.assertEquals(3.986004415e14, perts.getGm(), 1.0);
613         Assert.assertEquals("MOON", perts.getNBodyPerturbations().get(0).getName());
614         Assert.assertEquals("SUN",  perts.getNBodyPerturbations().get(1).getName());
615         Assert.assertEquals( 12.0, Units.NANO_TESLA.fromSI(perts.getFixedGeomagneticKp()), 1.0e-10);
616         Assert.assertEquals(105.0, Unit.SOLAR_FLUX_UNIT.fromSI(perts.getFixedF10P7()),     1.0e-10);
617         Assert.assertEquals(120.0, Unit.SOLAR_FLUX_UNIT.fromSI(perts.getFixedF10P7Mean()), 1.0e-10);
618 
619         // check no orbit determination
620         Assert.assertNull(file.getData().getOrbitDeterminationBlock());
621 
622         // check user data
623         UserDefined user = file.getData().getUserDefinedBlock();
624         Assert.assertTrue(user.getComments().isEmpty());
625         Assert.assertEquals(1, user.getParameters().size());
626         Assert.assertEquals("WGS-84", user.getParameters().get("EARTH_MODEL"));
627 
628         Assert.assertEquals(1, file.getSatellites().size());
629         Assert.assertEquals("1998-999A", file.getSatellites().entrySet().iterator().next().getKey());
630     }
631 
632     @Test
633     public void testParseOCM3() throws IOException {
634         final String   name  = "/ccsds/odm/ocm/OCMExample3.txt";
635         final DataSource source = new DataSource(name, () -> getClass().getResourceAsStream(name));
636         final Ocm file = new ParserBuilder().
637                              withMu(Constants.EIGEN5C_EARTH_MU).
638                              buildOcmParser().
639                              parse(source); // using EphemerisFileParser API here
640 
641         // Check Header Block;
642         TimeScale utc = TimeScalesFactory.getUTC();
643         Assert.assertEquals(3.0, file.getHeader().getFormatVersion(), 1.0e-10);
644         Assert.assertEquals(0, file.getMetadata().getComments().size());
645         Assert.assertEquals(new AbsoluteDate(1998, 11, 06, 9, 23, 57, utc),
646                             file.getHeader().getCreationDate());
647 
648         final AbsoluteDate t0 = new AbsoluteDate(1998, 12, 18, 14, 28, 15.1172, utc);
649         Assert.assertEquals(t0, file.getMetadata().getEpochT0());
650         Assert.assertEquals("UTC", file.getMetadata().getTimeSystem().name());
651 
652         // check trajectory data
653         Assert.assertEquals(1, file.getData().getOTrajectoryBlocks().size());
654         final TrajectoryStateHistory orb = file.getData().getOTrajectoryBlocks().get(0);
655         Assert.assertEquals(2, orb.getMetadata().getComments().size());
656         Assert.assertEquals("ORBIT EPHEMERIS INCORPORATING DEPLOYMENTS AND MANEUVERS (BELOW)", orb.getMetadata().getComments().get(0));
657         Assert.assertEquals("intervening data records omitted after DT=20.0",     orb.getMetadata().getComments().get(1));
658         Assert.assertEquals("PREDICTED", orb.getMetadata().getTrajBasis()); // default value, not present in the file
659         Assert.assertEquals("TOD", orb.getMetadata().getTrajReferenceFrame().getName());
660         Assert.assertNotNull(orb.getMetadata().getTrajReferenceFrame().asFrame());
661         Assert.assertEquals(CelestialBodyFrame.TOD, orb.getMetadata().getTrajReferenceFrame().asCelestialBodyFrame());
662         Assert.assertNull(orb.getMetadata().getTrajReferenceFrame().asOrbitRelativeFrame());
663         Assert.assertNull(orb.getMetadata().getTrajReferenceFrame().asSpacecraftBodyFrame());
664         Assert.assertEquals(t0, orb.getMetadata().getTrajFrameEpoch());
665         Assert.assertEquals(ElementsType.CARTPVA, orb.getMetadata().getTrajType());
666         Assert.assertEquals(9, orb.getMetadata().getTrajUnits().size());
667         Assert.assertEquals("km",      orb.getMetadata().getTrajUnits().get(0).getName());
668         Assert.assertEquals("km",      orb.getMetadata().getTrajUnits().get(1).getName());
669         Assert.assertEquals("km",      orb.getMetadata().getTrajUnits().get(2).getName());
670         Assert.assertEquals("km/s",    orb.getMetadata().getTrajUnits().get(3).getName());
671         Assert.assertEquals("km/s",    orb.getMetadata().getTrajUnits().get(4).getName());
672         Assert.assertEquals("km/s",    orb.getMetadata().getTrajUnits().get(5).getName());
673         Assert.assertEquals("km/s**2", orb.getMetadata().getTrajUnits().get(6).getName());
674         Assert.assertEquals("km/s**2", orb.getMetadata().getTrajUnits().get(7).getName());
675         Assert.assertEquals("km/s**2", orb.getMetadata().getTrajUnits().get(8).getName());
676         Assert.assertEquals(4, orb.getTrajectoryStates().size());
677         Assert.assertEquals(       0.0,  orb.getTrajectoryStates().get(0).getDate().durationFrom(t0), 1.0e-10);
678         Assert.assertEquals( 2789600.0,  orb.getTrajectoryStates().get(0).getElements()[0], 1.0e-10);
679         Assert.assertEquals( -280000.0,  orb.getTrajectoryStates().get(0).getElements()[1], 1.0e-10);
680         Assert.assertEquals(-1746800.0,  orb.getTrajectoryStates().get(0).getElements()[2], 1.0e-10);
681         Assert.assertEquals(    4730.0,  orb.getTrajectoryStates().get(0).getElements()[3], 1.0e-10);
682         Assert.assertEquals(   -2500.0,  orb.getTrajectoryStates().get(0).getElements()[4], 1.0e-10);
683         Assert.assertEquals(   -1040.0,  orb.getTrajectoryStates().get(0).getElements()[5], 1.0e-10);
684         Assert.assertEquals(       8.0,  orb.getTrajectoryStates().get(0).getElements()[6], 1.0e-10);
685         Assert.assertEquals(       1.0,  orb.getTrajectoryStates().get(0).getElements()[7], 1.0e-10);
686         Assert.assertEquals(    -159.0,  orb.getTrajectoryStates().get(0).getElements()[8], 1.0e-10);
687         Assert.assertEquals(      10.0,  orb.getTrajectoryStates().get(1).getDate().durationFrom(t0), 1.0e-10);
688         Assert.assertEquals( 2783400.0,  orb.getTrajectoryStates().get(1).getElements()[0], 1.0e-10);
689         Assert.assertEquals( -308100.0,  orb.getTrajectoryStates().get(1).getElements()[1], 1.0e-10);
690         Assert.assertEquals(-1877100.0,  orb.getTrajectoryStates().get(1).getElements()[2], 1.0e-10);
691         Assert.assertEquals(    5190.0,  orb.getTrajectoryStates().get(1).getElements()[3], 1.0e-10);
692         Assert.assertEquals(   -2420.0,  orb.getTrajectoryStates().get(1).getElements()[4], 1.0e-10);
693         Assert.assertEquals(   -2000.0,  orb.getTrajectoryStates().get(1).getElements()[5], 1.0e-10);
694         Assert.assertEquals(       8.0,  orb.getTrajectoryStates().get(1).getElements()[6], 1.0e-10);
695         Assert.assertEquals(       1.0,  orb.getTrajectoryStates().get(1).getElements()[7], 1.0e-10);
696         Assert.assertEquals(       1.0,  orb.getTrajectoryStates().get(1).getElements()[8], 1.0e-10);
697         Assert.assertEquals(      20.0,  orb.getTrajectoryStates().get(2).getDate().durationFrom(t0), 1.0e-10);
698         Assert.assertEquals( 2776000.0,  orb.getTrajectoryStates().get(2).getElements()[0], 1.0e-10);
699         Assert.assertEquals( -336900.0,  orb.getTrajectoryStates().get(2).getElements()[1], 1.0e-10);
700         Assert.assertEquals(-2008700.0,  orb.getTrajectoryStates().get(2).getElements()[2], 1.0e-10);
701         Assert.assertEquals(    5640.0,  orb.getTrajectoryStates().get(2).getElements()[3], 1.0e-10);
702         Assert.assertEquals(   -2340.0,  orb.getTrajectoryStates().get(2).getElements()[4], 1.0e-10);
703         Assert.assertEquals(   -1950.0,  orb.getTrajectoryStates().get(2).getElements()[5], 1.0e-10);
704         Assert.assertEquals(       8.0,  orb.getTrajectoryStates().get(2).getElements()[6], 1.0e-10);
705         Assert.assertEquals(       1.0,  orb.getTrajectoryStates().get(2).getElements()[7], 1.0e-10);
706         Assert.assertEquals(     159.0,  orb.getTrajectoryStates().get(2).getElements()[8], 1.0e-10);
707         Assert.assertEquals(     500.0,  orb.getTrajectoryStates().get(3).getDate().durationFrom(t0), 1.0e-10);
708         Assert.assertEquals( 2164375.0,  orb.getTrajectoryStates().get(3).getElements()[0], 1.0e-10);
709         Assert.assertEquals( 1115811.0,  orb.getTrajectoryStates().get(3).getElements()[1], 1.0e-10);
710         Assert.assertEquals( -688131.0,  orb.getTrajectoryStates().get(3).getElements()[2], 1.0e-10);
711         Assert.assertEquals(   -3533.28, orb.getTrajectoryStates().get(3).getElements()[3], 1.0e-10);
712         Assert.assertEquals(   -2884.52, orb.getTrajectoryStates().get(3).getElements()[4], 1.0e-10);
713         Assert.assertEquals(     885.35, orb.getTrajectoryStates().get(3).getElements()[5], 1.0e-10);
714         Assert.assertEquals(       0.0,  orb.getTrajectoryStates().get(3).getElements()[6], 1.0e-10);
715         Assert.assertEquals(       0.0,  orb.getTrajectoryStates().get(3).getElements()[7], 1.0e-10);
716         Assert.assertEquals(       0.0,  orb.getTrajectoryStates().get(3).getElements()[8], 1.0e-10);
717 
718         // check physical data
719         PhysicalProperties phys = file.getData().getPhysicBlock();
720         Assert.assertEquals(1, phys.getComments().size());
721         Assert.assertEquals("S/C Physical Characteristics:", phys.getComments().get(0));
722         Assert.assertEquals(10.0,    phys.getDragConstantArea(),         1.0e-10);
723         Assert.assertEquals(2.3,     phys.getDragCoefficient(),   1.0e-10);
724         Assert.assertEquals(100.0,   phys.getWetMass(),                  1.0e-10);
725         Assert.assertEquals(4.0,     phys.getSrpConstantArea(),          1.0e-10);
726         Assert.assertEquals(1.3,     phys.getSrpCoefficient(),    1.0e-10);
727 
728         // check no covariance
729         Assert.assertNull(file.getData().getCovarianceBlocks());
730 
731         // check maneuvers
732         List<ManeuverHistory> man = file.getData().getManeuverBlocks();
733         Assert.assertEquals(2, man.size());
734 
735         Assert.assertEquals(2, man.get(0).getMetadata().getComments().size());
736         Assert.assertEquals("Ten 1kg objects deployed from 200kg host over 100 s timespan", man.get(0).getMetadata().getComments().get(0));
737         Assert.assertEquals("20 deg off of back-track direction", man.get(0).getMetadata().getComments().get(1));
738         Assert.assertEquals("CUBESAT DEPLOY", man.get(0).getMetadata().getManID());
739         Assert.assertEquals(ManBasis.CANDIDATE, man.get(0).getMetadata().getManBasis());
740         Assert.assertEquals("DEPLOY",           man.get(0).getMetadata().getManDeviceID());
741         Assert.assertEquals(1,                  man.get(0).getMetadata().getManPurpose().size());
742         Assert.assertEquals("DEPLOY",           man.get(0).getMetadata().getManPurpose().get(0));
743         Assert.assertEquals("RSW_ROTATING",     man.get(0).getMetadata().getManReferenceFrame().getName());
744         Assert.assertNull(man.get(0).getMetadata().getManReferenceFrame().asFrame());
745         Assert.assertNull(man.get(0).getMetadata().getManReferenceFrame().asCelestialBodyFrame());
746         Assert.assertEquals(OrbitRelativeFrame.RSW_ROTATING, man.get(0).getMetadata().getManReferenceFrame().asOrbitRelativeFrame());
747         Assert.assertNull(man.get(0).getMetadata().getManReferenceFrame().asSpacecraftBodyFrame());
748         Assert.assertEquals(9, man.get(0).getMetadata().getManComposition().size());
749         Assert.assertEquals(ManeuverFieldType.TIME_RELATIVE,   man.get(0).getMetadata().getManComposition().get(0));
750         Assert.assertEquals(ManeuverFieldType.DEPLOY_ID,       man.get(0).getMetadata().getManComposition().get(1));
751         Assert.assertEquals(ManeuverFieldType.DEPLOY_DV_X,     man.get(0).getMetadata().getManComposition().get(2));
752         Assert.assertEquals(ManeuverFieldType.DEPLOY_DV_Y,     man.get(0).getMetadata().getManComposition().get(3));
753         Assert.assertEquals(ManeuverFieldType.DEPLOY_DV_Z,     man.get(0).getMetadata().getManComposition().get(4));
754         Assert.assertEquals(ManeuverFieldType.DEPLOY_MASS,     man.get(0).getMetadata().getManComposition().get(5));
755         Assert.assertEquals(ManeuverFieldType.DEPLOY_DV_SIGMA, man.get(0).getMetadata().getManComposition().get(6));
756         Assert.assertEquals(ManeuverFieldType.DEPLOY_DV_RATIO, man.get(0).getMetadata().getManComposition().get(7));
757         Assert.assertEquals(ManeuverFieldType.DEPLOY_DV_CDA,   man.get(0).getMetadata().getManComposition().get(8));
758         Assert.assertEquals(8, man.get(0).getMetadata().getManUnits().size());
759         Assert.assertEquals("n/a",  man.get(0).getMetadata().getManUnits().get(0).getName());
760         Assert.assertEquals("km/s", man.get(0).getMetadata().getManUnits().get(1).getName());
761         Assert.assertEquals("km/s", man.get(0).getMetadata().getManUnits().get(2).getName());
762         Assert.assertEquals("km/s", man.get(0).getMetadata().getManUnits().get(3).getName());
763         Assert.assertEquals("kg",   man.get(0).getMetadata().getManUnits().get(4).getName());
764         Assert.assertEquals("%",    man.get(0).getMetadata().getManUnits().get(5).getName());
765         Assert.assertEquals("n/a",  man.get(0).getMetadata().getManUnits().get(6).getName());
766         Assert.assertEquals("m**2", man.get(0).getMetadata().getManUnits().get(7).getName());
767         Assert.assertEquals(10, man.get(0).getManeuvers().size());
768         Assert.assertEquals(500.0,        man.get(0).getManeuvers().get(0).getDate().durationFrom(t0), 1.0e-10);
769         Assert.assertEquals("CUBESAT_10", man.get(0).getManeuvers().get(0).getDeployId());
770         Assert.assertEquals( 2.8773E-1,   man.get(0).getManeuvers().get(0).getDeployDv().getX(), 1.0e-10);
771         Assert.assertEquals(-9.3969E-1,   man.get(0).getManeuvers().get(0).getDeployDv().getY(), 1.0e-10);
772         Assert.assertEquals( 1.8491E-1,   man.get(0).getManeuvers().get(0).getDeployDv().getZ(), 1.0e-10);
773         Assert.assertEquals(-1.0,         man.get(0).getManeuvers().get(0).getDeployMass(), 1.0e-10);
774         Assert.assertEquals( 0.05,        man.get(0).getManeuvers().get(0).getDeployDvSigma(), 1.0e-10);
775         Assert.assertEquals(-0.005025,    man.get(0).getManeuvers().get(0).getDeployDvRatio(), 1.0e-10);
776         Assert.assertEquals( 0.033,       man.get(0).getManeuvers().get(0).getDeployDvCda(), 1.0e-10);
777         Assert.assertEquals(510.0,        man.get(0).getManeuvers().get(1).getDate().durationFrom(t0), 1.0e-10);
778         Assert.assertEquals("CUBESAT_11", man.get(0).getManeuvers().get(1).getDeployId());
779         Assert.assertEquals( 1.4208E-1,   man.get(0).getManeuvers().get(1).getDeployDv().getX(), 1.0e-10);
780         Assert.assertEquals(-9.3969E-1,   man.get(0).getManeuvers().get(1).getDeployDv().getY(), 1.0e-10);
781         Assert.assertEquals( 3.1111E-1,   man.get(0).getManeuvers().get(1).getDeployDv().getZ(), 1.0e-10);
782         Assert.assertEquals(-1.0,         man.get(0).getManeuvers().get(1).getDeployMass(), 1.0e-10);
783         Assert.assertEquals( 0.05,        man.get(0).getManeuvers().get(1).getDeployDvSigma(), 1.0e-10);
784         Assert.assertEquals(-0.005051,    man.get(0).getManeuvers().get(1).getDeployDvRatio(), 1.0e-10);
785         Assert.assertEquals( 0.033,       man.get(0).getManeuvers().get(1).getDeployDvCda(), 1.0e-10);
786         
787         Assert.assertEquals(1, man.get(1).getMetadata().getComments().size());
788         Assert.assertEquals("100 s of 0.5N +in-track thrust w/effic η=0.95, Isp=300s, 5% 1-sigma error", man.get(1).getMetadata().getComments().get(0));
789         Assert.assertEquals("E W 20160305B",    man.get(1).getMetadata().getManID());
790         Assert.assertEquals(ManBasis.CANDIDATE, man.get(1).getMetadata().getManBasis());
791         Assert.assertEquals("THR 01",           man.get(1).getMetadata().getManDeviceID());
792         Assert.assertEquals(1,                  man.get(1).getMetadata().getManPurpose().size());
793         Assert.assertEquals("ORBIT",            man.get(1).getMetadata().getManPurpose().get(0));
794         Assert.assertEquals("RSW_ROTATING",     man.get(1).getMetadata().getManReferenceFrame().getName());
795         Assert.assertNull(man.get(1).getMetadata().getManReferenceFrame().asFrame());
796         Assert.assertNull(man.get(1).getMetadata().getManReferenceFrame().asCelestialBodyFrame());
797         Assert.assertEquals(OrbitRelativeFrame.RSW_ROTATING, man.get(1).getMetadata().getManReferenceFrame().asOrbitRelativeFrame());
798         Assert.assertEquals(11,                              man.get(1).getMetadata().getManComposition().size());
799         Assert.assertEquals(ManeuverFieldType.TIME_ABSOLUTE, man.get(1).getMetadata().getManComposition().get( 0));
800         Assert.assertEquals(ManeuverFieldType.TIME_RELATIVE, man.get(1).getMetadata().getManComposition().get( 1));
801         Assert.assertEquals(ManeuverFieldType.MAN_DURA,      man.get(1).getMetadata().getManComposition().get( 2));
802         Assert.assertEquals(ManeuverFieldType.THR_X,         man.get(1).getMetadata().getManComposition().get( 3));
803         Assert.assertEquals(ManeuverFieldType.THR_Y,         man.get(1).getMetadata().getManComposition().get( 4));
804         Assert.assertEquals(ManeuverFieldType.THR_Z,         man.get(1).getMetadata().getManComposition().get( 5));
805         Assert.assertEquals(ManeuverFieldType.THR_MAG_SIGMA, man.get(1).getMetadata().getManComposition().get( 6));
806         Assert.assertEquals(ManeuverFieldType.THR_DIR_SIGMA, man.get(1).getMetadata().getManComposition().get( 7));
807         Assert.assertEquals(ManeuverFieldType.THR_INTERP,    man.get(1).getMetadata().getManComposition().get( 8));
808         Assert.assertEquals(ManeuverFieldType.THR_ISP,       man.get(1).getMetadata().getManComposition().get( 9));
809         Assert.assertEquals(ManeuverFieldType.THR_EFFIC,     man.get(1).getMetadata().getManComposition().get(10));
810         Assert.assertEquals(9, man.get(1).getMetadata().getManUnits().size());
811         Assert.assertEquals("s",    man.get(1).getMetadata().getManUnits().get(0).getName());
812         Assert.assertEquals("N",    man.get(1).getMetadata().getManUnits().get(1).getName());
813         Assert.assertEquals("N",    man.get(1).getMetadata().getManUnits().get(2).getName());
814         Assert.assertEquals("N",    man.get(1).getMetadata().getManUnits().get(3).getName());
815         Assert.assertEquals("%",    man.get(1).getMetadata().getManUnits().get(4).getName());
816         Assert.assertEquals("deg",  man.get(1).getMetadata().getManUnits().get(5).getName());
817         Assert.assertEquals("n/a",  man.get(1).getMetadata().getManUnits().get(6).getName());
818         Assert.assertEquals("s",    man.get(1).getMetadata().getManUnits().get(7).getName());
819         Assert.assertEquals("n/a",  man.get(1).getMetadata().getManUnits().get(8).getName());
820         Assert.assertEquals(1,      man.get(1).getManeuvers().size());
821         Assert.assertEquals(500.0,        man.get(1).getManeuvers().get(0).getDate().durationFrom(t0), 1.0e-10);
822         Assert.assertEquals(100,          man.get(1).getManeuvers().get(0).getDuration(),         1.0e-10);
823         Assert.assertEquals(  0.0,        man.get(1).getManeuvers().get(0).getThrust().getX(),    1.0e-10);
824         Assert.assertEquals(  0.5,        man.get(1).getManeuvers().get(0).getThrust().getY(),    1.0e-10);
825         Assert.assertEquals( 0.05,        man.get(1).getManeuvers().get(0).getThrustMagnitudeSigma(), 1.0e-10);
826         Assert.assertEquals( 1.0,         FastMath.toDegrees(man.get(1).getManeuvers().get(0).getThrustDirectionSigma()), 1.0e-10);
827         Assert.assertEquals(OnOff.ON,     man.get(1).getManeuvers().get(0).getThrustInterpolation());
828         Assert.assertTrue(man.get(1).getManeuvers().get(0).getThrustInterpolation().isOn());
829         Assert.assertEquals(300.0,        man.get(1).getManeuvers().get(0).getThrustIsp(),        1.0e-10);
830         Assert.assertEquals(0.95,         man.get(1).getManeuvers().get(0).getThrustEfficiency(), 1.0e-10);
831 
832         // check perturbation data
833         Perturbations perts = file.getData().getPerturbationsBlock();
834         Assert.assertEquals(1, perts.getComments().size());
835         Assert.assertEquals("Perturbations specification", perts.getComments().get(0));
836         Assert.assertEquals(3.986004415e14, perts.getGm(),     1.0);
837 
838         // check orbit determination
839         OrbitDetermination od = file.getData().getOrbitDeterminationBlock();
840         Assert.assertEquals(1, od.getComments().size());
841         Assert.assertEquals("Orbit Determination information", od.getComments().get(0));
842         Assert.assertEquals("OOD #10059",    od.getId());
843         Assert.assertEquals("OOD #10058",    od.getPrevId());
844         Assert.assertEquals(OdMethodType.SF, od.getMethod().getType());
845         Assert.assertEquals("ODTK",          od.getMethod().getTool());
846         Assert.assertEquals(new AbsoluteDate(2001, 11, 6, 11, 17, 33.0, utc), od.getEpoch());
847         Assert.assertEquals(273, od.getObsUsed());
848         Assert.assertEquals( 91, od.getTracksUsed());
849 
850         // check no user data
851         Assert.assertNull(file.getData().getUserDefinedBlock());
852 
853     }
854 
855     @Test
856     public void testParseOCM4() {
857         final String   name  = "/ccsds/odm/ocm/OCMExample4.txt";
858         final DataSource source = new DataSource(name, () -> getClass().getResourceAsStream(name));
859         final Ocm file = new ParserBuilder().
860                              withMu(Constants.IERS2003_EARTH_MU).
861                              buildOcmParser().
862                              parseMessage(source);
863 
864         // Check Header Block;
865         Assert.assertEquals(3.0, file.getHeader().getFormatVersion(), 1.0e-10);
866         Assert.assertEquals(2, file.getHeader().getComments().size());
867         Assert.assertEquals("This file is a dummy example with inconsistent data", file.getHeader().getComments().get(0));
868         Assert.assertEquals("it is used to exercise all possible keys in Key-Value Notation", file.getHeader().getComments().get(1));
869         Assert.assertEquals("JPL",                                 file.getHeader().getOriginator());
870         Assert.assertEquals("ABC-12 34",                           file.getHeader().getMessageId());
871 
872         // Check metadata
873         Assert.assertEquals(new AbsoluteDate(2019, 7, 23, 10, 29, 31.576, TimeScalesFactory.getUTC()),
874                             file.getHeader().getCreationDate());
875 
876         Assert.assertEquals(1,                                     file.getMetadata().getComments().size());
877         Assert.assertEquals("Metadata comment",                    file.getMetadata().getComments().get(0));
878         Assert.assertEquals("FOUO",                                file.getMetadata().getClassification());
879         Assert.assertEquals("POLYSAT",                             file.getMetadata().getObjectName());
880         Assert.assertEquals(3,                                     file.getMetadata().getAlternateNames().size());
881         Assert.assertEquals("ALTERNATE",                           file.getMetadata().getAlternateNames().get(0));
882         Assert.assertEquals("OTHER",                               file.getMetadata().getAlternateNames().get(1));
883         Assert.assertEquals("RELATED",                             file.getMetadata().getAlternateNames().get(2));
884         Assert.assertEquals("18SPCS 18571",                        file.getMetadata().getObjectDesignator());
885         Assert.assertEquals("2000-053A",                           file.getMetadata().getInternationalDesignator());
886         Assert.assertEquals("Mr. Rodgers",                         file.getMetadata().getOriginatorPOC());
887         Assert.assertEquals("Flight Dynamics Mission Design Lead", file.getMetadata().getOriginatorPosition());
888         Assert.assertEquals("+12345678901",                        file.getMetadata().getOriginatorPhone());
889         Assert.assertEquals("JOHN.DOE@EXAMPLE.ORG",                file.getMetadata().getOriginatorAddress());
890         Assert.assertEquals("NASA",                                file.getMetadata().getTechOrg());
891         Assert.assertEquals("Maxwell Smart",                       file.getMetadata().getTechPOC());
892         Assert.assertEquals("+98765432109",                        file.getMetadata().getTechPhone());
893         Assert.assertEquals("MAX@EXAMPLE.ORG",                     file.getMetadata().getTechAddress());
894         Assert.assertEquals("ABC-12 33",                           file.getMetadata().getPreviousMessageID());
895         Assert.assertEquals("ABC-12 35",                           file.getMetadata().getNextMessageID());
896         Assert.assertEquals("ADM-MSG-35132.TXT",                   file.getMetadata().getAdmMessageLink());
897         Assert.assertEquals("CDM-MSG-35132.TXT",                   file.getMetadata().getCdmMessageLink());
898         Assert.assertEquals("PRM-MSG-35132.TXT",                   file.getMetadata().getPrmMessageLink());
899         Assert.assertEquals("RDM-MSG-35132.TXT",                   file.getMetadata().getRdmMessageLink());
900         Assert.assertEquals("COMSPOC",                             file.getMetadata().getCatalogName());
901         Assert.assertEquals("INTELSAT",                            file.getMetadata().getOperator());
902         Assert.assertEquals("SIRIUS",                              file.getMetadata().getOwner());
903         Assert.assertEquals("FRANCE",                              file.getMetadata().getCountry());
904         Assert.assertEquals("SPIRE",                               file.getMetadata().getConstellation());
905         Assert.assertEquals("PAYLOAD",                             file.getMetadata().getObjectType().toString());
906         Assert.assertEquals("Operational",                         file.getMetadata().getOpsStatus().toString());
907         Assert.assertEquals("Extended Geostationary Orbit",        file.getMetadata().getOrbitCategory().toString());
908         Assert.assertEquals(7,                                     file.getMetadata().getOcmDataElements().size());
909         Assert.assertEquals("ORBIT",                               file.getMetadata().getOcmDataElements().get(0));
910         Assert.assertEquals("PHYSICAL DESCRIPTION",                file.getMetadata().getOcmDataElements().get(1));
911         Assert.assertEquals("COVARIANCE",                          file.getMetadata().getOcmDataElements().get(2));
912         Assert.assertEquals("MANEUVER",                            file.getMetadata().getOcmDataElements().get(3));
913         Assert.assertEquals("PERTURBATIONS",                       file.getMetadata().getOcmDataElements().get(4));
914         Assert.assertEquals("OD",                                  file.getMetadata().getOcmDataElements().get(5));
915         Assert.assertEquals("USER",                                file.getMetadata().getOcmDataElements().get(6));
916         Assert.assertEquals("UTC",                                 file.getMetadata().getTimeSystem().name());
917         final AbsoluteDate epoch = file.getMetadata().getEpochT0();
918         Assert.assertEquals(new AbsoluteDate(2019, 7, 23,  0, 0, 0.0, TimeScalesFactory.getUTC()), epoch);
919         Assert.assertEquals(28800.0, file.getMetadata().getSclkOffsetAtEpoch(), 1.0e-10);
920         Assert.assertEquals(2.5,                                   file.getMetadata().getSclkSecPerSISec(), 1.0e-15);
921         Assert.assertEquals(new AbsoluteDate(2019, 7, 23,  9, 29, 31.576, TimeScalesFactory.getUTC()),
922                             file.getMetadata().getPreviousMessageEpoch());
923         Assert.assertEquals(new AbsoluteDate(2019, 7, 23, 11, 29, 31.576, TimeScalesFactory.getUTC()),
924                             file.getMetadata().getNextMessageEpoch());
925         Assert.assertEquals(new AbsoluteDate(2019, 7, 23,  9, 30,  0.0, TimeScalesFactory.getUTC()),
926                             file.getMetadata().getStartTime());
927         Assert.assertEquals(new AbsoluteDate(2019, 7, 23, 10, 29, 50.0, TimeScalesFactory.getUTC()),
928                             file.getMetadata().getStopTime());
929         Assert.assertEquals(0.041550925925 * Constants.JULIAN_DAY, file.getMetadata().getTimeSpan(), 1.0e-15);
930         Assert.assertEquals(37.0,                                  file.getMetadata().getTaimutcT0(), 1.0e-15);
931         Assert.assertEquals(-0.1642060,                            file.getMetadata().getUt1mutcT0(), 1.0e-15);
932         Assert.assertEquals("IERS",                                file.getMetadata().getEopSource());
933         Assert.assertEquals("LAGRANGE ORDER 5",                    file.getMetadata().getInterpMethodEOP());
934         Assert.assertEquals("JPL DE 430",                          file.getMetadata().getCelestialSource());
935 
936         // check trajectory data
937         Assert.assertEquals(2, file.getData().getOTrajectoryBlocks().size());
938         TrajectoryStateHistory osh0 = file.getData().getOTrajectoryBlocks().get(0);
939         Assert.assertEquals("this is number 1 ORB comment", osh0.getMetadata().getComments().get(0));
940         Assert.assertEquals("orbit 1",       osh0.getMetadata().getTrajID());
941         Assert.assertEquals("orbit 0",       osh0.getMetadata().getTrajPrevID());
942         Assert.assertEquals("orbit 2",       osh0.getMetadata().getTrajNextID());
943         Assert.assertEquals("DETERMINED OD", osh0.getMetadata().getTrajBasis());
944         Assert.assertEquals("OD 17",         osh0.getMetadata().getTrajBasisID());
945         Assert.assertEquals(InterpolationMethod.HERMITE, osh0.getMetadata().getInterpolationMethod());
946         Assert.assertEquals(3, osh0.getMetadata().getInterpolationDegree());
947         Assert.assertEquals("ECKSTEIN HECHLER", osh0.getMetadata().getOrbAveraging());
948         Assert.assertEquals(CenterName.EARTH.name(), osh0.getMetadata().getCenter().getName());
949         Assert.assertEquals(CelestialBodyFrame.TOD, osh0.getMetadata().getTrajReferenceFrame().asCelestialBodyFrame());
950         Assert.assertEquals(    0.0,   osh0.getMetadata().getTrajFrameEpoch().durationFrom(epoch),    1.0e-12);
951         Assert.assertEquals(34200.0,   osh0.getMetadata().getUseableStartTime().durationFrom(epoch), 1.0e-12);
952         Assert.assertEquals(35999.999, osh0.getMetadata().getUseableStopTime().durationFrom(epoch),  1.0e-12);
953         Assert.assertEquals(17, osh0.getMetadata().getOrbRevNum());
954         Assert.assertEquals( 1, osh0.getMetadata().getOrbRevNumBasis());
955         Assert.assertEquals(ElementsType.CARTPVA, osh0.getMetadata().getTrajType());
956         Assert.assertEquals(9, osh0.getMetadata().getTrajUnits().size());
957         Assert.assertEquals(Unit.KILOMETRE,  osh0.getMetadata().getTrajUnits().get(0));
958         Assert.assertEquals(Unit.KILOMETRE,  osh0.getMetadata().getTrajUnits().get(1));
959         Assert.assertEquals(Unit.KILOMETRE,  osh0.getMetadata().getTrajUnits().get(2));
960         Assert.assertEquals(Units.KM_PER_S,  osh0.getMetadata().getTrajUnits().get(3));
961         Assert.assertEquals(Units.KM_PER_S,  osh0.getMetadata().getTrajUnits().get(4));
962         Assert.assertEquals(Units.KM_PER_S,  osh0.getMetadata().getTrajUnits().get(5));
963         Assert.assertEquals(Units.KM_PER_S2, osh0.getMetadata().getTrajUnits().get(6));
964         Assert.assertEquals(Units.KM_PER_S2, osh0.getMetadata().getTrajUnits().get(7));
965         Assert.assertEquals(Units.KM_PER_S2, osh0.getMetadata().getTrajUnits().get(8));
966         Assert.assertEquals(3, osh0.getCoordinates().size());
967         Assert.assertEquals(   0.0, osh0.getCoordinates().get(0).getDate().durationFrom(epoch), 1.0e-10);
968         Assert.assertEquals( 1.0e6, osh0.getCoordinates().get(0).getPosition().getX(), 1.0e-10);
969         Assert.assertEquals( 300.0, osh0.getCoordinates().get(1).getDate().durationFrom(epoch), 1.0e-10);
970         Assert.assertEquals( 3.0e3, osh0.getCoordinates().get(1).getVelocity().getY(), 1.0e-10);
971         Assert.assertEquals( 600.0, osh0.getCoordinates().get(2).getDate().durationFrom(epoch), 1.0e-10);
972         Assert.assertEquals(  -6.0, osh0.getCoordinates().get(2).getAcceleration().getZ(), 1.0e-10);
973         TrajectoryStateHistory osh1 = file.getData().getOTrajectoryBlocks().get(1);
974         Assert.assertEquals("this is number 2 ORB comment", osh1.getMetadata().getComments().get(0));
975         Assert.assertEquals("orbit 2",    osh1.getMetadata().getTrajID());
976         Assert.assertEquals("orbit 1",    osh1.getMetadata().getTrajPrevID());
977         Assert.assertEquals("orbit 3",    osh1.getMetadata().getTrajNextID());
978         Assert.assertEquals("PREDICTED",  osh1.getMetadata().getTrajBasis());
979         Assert.assertEquals("SIMULATION", osh1.getMetadata().getTrajBasisID());
980         Assert.assertEquals(-1,           osh1.getMetadata().getOrbRevNum());
981         Assert.assertEquals(-1,           osh1.getMetadata().getOrbRevNumBasis());
982         Assert.assertEquals(3, osh1.getCoordinates().size());
983         Assert.assertEquals(1800.0, osh1.getCoordinates().get(0).getDate().durationFrom(epoch), 1.0e-10);
984         Assert.assertEquals(2100.0, osh1.getCoordinates().get(1).getDate().durationFrom(epoch), 1.0e-10);
985         Assert.assertEquals(2400.0, osh1.getCoordinates().get(2).getDate().durationFrom(epoch), 1.0e-10);
986 
987         // check physical data
988         PhysicalProperties phys = file.getData().getPhysicBlock();
989         Assert.assertEquals("this is PHYS comment", phys.getComments().get(0));
990         Assert.assertEquals("AIRBUS",   phys.getManufacturer());
991         Assert.assertEquals("EUROSTAR", phys.getBusModel());
992         Assert.assertEquals(3,          phys.getDockedWith().size());
993         Assert.assertEquals("A1",       phys.getDockedWith().get(0));
994         Assert.assertEquals("A2",       phys.getDockedWith().get(1));
995         Assert.assertEquals("A3",       phys.getDockedWith().get(2));
996         Assert.assertEquals(5.0,        phys.getDragConstantArea(),               1.0e-10);
997         Assert.assertEquals(2.1,        phys.getDragCoefficient(),                1.0e-10);
998         Assert.assertEquals(0.1,        phys.getDragUncertainty(),                1.0e-10);
999         Assert.assertEquals(700.0,      phys.getInitialWetMass(),                 1.0e-10);
1000         Assert.assertEquals(600.0,      phys.getWetMass(),                        1.0e-10);
1001         Assert.assertEquals(500.0,      phys.getDryMass(),                        1.0e-10);
1002         Assert.assertEquals(OrbitRelativeFrame.RSW_ROTATING, phys.getOebParentFrame().asOrbitRelativeFrame());
1003         Assert.assertEquals(32400.0,    phys.getOebParentFrameEpoch().durationFrom(epoch), 1.0e-10);
1004         Assert.assertEquals(0.64,       phys.getOebQ().getQ1(),                   1.0e-10);
1005         Assert.assertEquals(0.48,       phys.getOebQ().getQ2(),                   1.0e-10);
1006         Assert.assertEquals(0.48,       phys.getOebQ().getQ3(),                   1.0e-10);
1007         Assert.assertEquals(0.36,       phys.getOebQ().getQ0(),                   1.0e-10);
1008         Assert.assertEquals(3.0,        phys.getOebMax(),                         1.0e-10);
1009         Assert.assertEquals(2.0,        phys.getOebIntermediate(),                1.0e-10);
1010         Assert.assertEquals(1.0,        phys.getOebMin(),                         1.0e-10);
1011         Assert.assertEquals(2.2,        phys.getOebAreaAlongMax(),                1.0e-10);
1012         Assert.assertEquals(3.2,        phys.getOebAreaAlongIntermediate(),       1.0e-10);
1013         Assert.assertEquals(6.2,        phys.getOebAreaAlongMin(),                1.0e-10);
1014         Assert.assertEquals(4.3,        phys.getMinAreaForCollisionProbability(), 1.0e-10);
1015         Assert.assertEquals(6.3,        phys.getMaxAreaForCollisionProbability(), 1.0e-10);
1016         Assert.assertEquals(5.3,        phys.getTypAreaForCollisionProbability(), 1.0e-10);
1017         Assert.assertEquals(2.4,        phys.getRcs(),                            1.0e-10);
1018         Assert.assertEquals(1.4,        phys.getMinRcs(),                         1.0e-10);
1019         Assert.assertEquals(3.4,        phys.getMaxRcs(),                         1.0e-10);
1020         Assert.assertEquals(3.5,        phys.getSrpConstantArea(),                1.0e-10);
1021         Assert.assertEquals(1.7,        phys.getSrpCoefficient(),                 1.0e-10);
1022         Assert.assertEquals(0.2,        phys.getSrpUncertainty(),                 1.0e-10);
1023         Assert.assertEquals(15.0,       phys.getVmAbsolute(),                     1.0e-10);
1024         Assert.assertEquals(19.0,       phys.getVmApparentMin(),                  1.0e-10);
1025         Assert.assertEquals(15.4,       phys.getVmApparent(),                     1.0e-10);
1026         Assert.assertEquals(14.0,       phys.getVmApparentMax(),                  1.0e-10);
1027         Assert.assertEquals(0.7,        phys.getReflectivity(),                   1.0e-10);
1028         Assert.assertEquals("THREE AXIS",      phys.getAttitudeControlMode());
1029         Assert.assertEquals("REACTION WHEELS", phys.getAttitudeActuatorType());
1030         Assert.assertEquals(0.3, FastMath.toDegrees(phys.getAttitudeKnowledgeAccuracy()), 1.0e-10);
1031         Assert.assertEquals(2.0, FastMath.toDegrees(phys.getAttitudeControlAccuracy()),   1.0e-10);
1032         Assert.assertEquals(2.3, FastMath.toDegrees(phys.getAttitudePointingAccuracy()),  1.0e-10);
1033         Assert.assertEquals(20.0,       phys.getManeuversPerYear(),             1.0e-10);
1034         Assert.assertEquals(6.8,        phys.getMaxThrust(),                    1.0e-10);
1035         Assert.assertEquals(1900.0,     phys.getBolDv(),                        1.0e-10);
1036         Assert.assertEquals(200.0,      phys.getRemainingDv(),                  1.0e-10);
1037         Assert.assertEquals(1000.0,     phys.getInertiaMatrix().getEntry(0, 0), 1.0e-10);
1038         Assert.assertEquals( 800.0,     phys.getInertiaMatrix().getEntry(1, 1), 1.0e-10);
1039         Assert.assertEquals( 400.0,     phys.getInertiaMatrix().getEntry(2, 2), 1.0e-10);
1040         Assert.assertEquals(  20.0,     phys.getInertiaMatrix().getEntry(0, 1), 1.0e-10);
1041         Assert.assertEquals(  20.0,     phys.getInertiaMatrix().getEntry(1, 0), 1.0e-10);
1042         Assert.assertEquals(  40.0,     phys.getInertiaMatrix().getEntry(0, 2), 1.0e-10);
1043         Assert.assertEquals(  40.0,     phys.getInertiaMatrix().getEntry(2, 0), 1.0e-10);
1044         Assert.assertEquals(  60.0,     phys.getInertiaMatrix().getEntry(1, 2), 1.0e-10);
1045         Assert.assertEquals(  60.0,     phys.getInertiaMatrix().getEntry(2, 1), 1.0e-10);
1046 
1047         // check covariance data
1048         Assert.assertEquals(2, file.getData().getCovarianceBlocks().size());
1049         CovarianceHistory ch0 = file.getData().getCovarianceBlocks().get(0);
1050         Assert.assertEquals("this is number 1 COV comment", ch0.getMetadata().getComments().get(0));
1051         Assert.assertEquals("covariance 1", ch0.getMetadata().getCovID());
1052         Assert.assertEquals("covariance 0", ch0.getMetadata().getCovPrevID());
1053         Assert.assertEquals("covariance 2", ch0.getMetadata().getCovNextID());
1054         Assert.assertEquals("EMPIRICAL",    ch0.getMetadata().getCovBasis());
1055         Assert.assertEquals("basis 1",      ch0.getMetadata().getCovBasisID());
1056         Assert.assertEquals(OrbitRelativeFrame.TNW_INERTIAL, ch0.getMetadata().getCovReferenceFrame().asOrbitRelativeFrame());
1057         Assert.assertEquals(33000.0,        ch0.getMetadata().getCovFrameEpoch().durationFrom(epoch), 1.0e-10);
1058         Assert.assertEquals(0.5,            ch0.getMetadata().getCovScaleMin(),   1.0e-10);
1059         Assert.assertEquals(5.0,            ch0.getMetadata().getCovScaleMax(),   1.0e-10);
1060         Assert.assertEquals(0.25,           ch0.getMetadata().getCovConfidence(), 1.0e-10);
1061         Assert.assertEquals(ElementsType.CARTPV, ch0.getMetadata().getCovType());
1062         Assert.assertEquals(6, ch0.getMetadata().getCovUnits().size());
1063         Assert.assertEquals(Unit.KILOMETRE,  ch0.getMetadata().getCovUnits().get(0));
1064         Assert.assertEquals(Unit.KILOMETRE,  ch0.getMetadata().getCovUnits().get(1));
1065         Assert.assertEquals(Unit.KILOMETRE,  ch0.getMetadata().getCovUnits().get(2));
1066         Assert.assertEquals(Units.KM_PER_S,  ch0.getMetadata().getCovUnits().get(3));
1067         Assert.assertEquals(Units.KM_PER_S,  ch0.getMetadata().getCovUnits().get(4));
1068         Assert.assertEquals(Units.KM_PER_S,  ch0.getMetadata().getCovUnits().get(5));
1069         Assert.assertEquals(3, ch0.getCovariances().size());
1070         Assert.assertEquals(   0.0,  ch0.getCovariances().get(0).getDate().durationFrom(epoch), 1.0e-10);
1071         Assert.assertEquals(1.1e6,   ch0.getCovariances().get(0).getMatrix().getEntry(0, 0),    1.0e-10);
1072         Assert.assertEquals( 300.0,  ch0.getCovariances().get(1).getDate().durationFrom(epoch), 1.0e-10);
1073         Assert.assertEquals(13.2e6,  ch0.getCovariances().get(1).getMatrix().getEntry(2, 1),    1.0e-10);
1074         Assert.assertEquals( 600.0,  ch0.getCovariances().get(2).getDate().durationFrom(epoch), 1.0e-10);
1075         Assert.assertEquals(26.5e6,  ch0.getCovariances().get(2).getMatrix().getEntry(4, 5),    1.0e-10);
1076         CovarianceHistory ch1 = file.getData().getCovarianceBlocks().get(1);
1077         Assert.assertEquals("this is number 2 COV comment", ch1.getMetadata().getComments().get(0));
1078         Assert.assertEquals("covariance 2", ch1.getMetadata().getCovID());
1079         Assert.assertEquals("covariance 1", ch1.getMetadata().getCovPrevID());
1080         Assert.assertEquals("covariance 3", ch1.getMetadata().getCovNextID());
1081         Assert.assertEquals("SIMULATED",    ch1.getMetadata().getCovBasis());
1082         Assert.assertEquals("basis 2",      ch1.getMetadata().getCovBasisID());
1083         Assert.assertEquals(1, ch1.getCovariances().size());
1084         Assert.assertEquals(1800.0, ch1.getCovariances().get(0).getDate().durationFrom(epoch), 1.0e-10);
1085         Assert.assertEquals(43.0e6,   ch1.getCovariances().get(0).getMatrix().getEntry(0, 0),    1.0e-10);
1086         Assert.assertEquals(20.0e6,   ch1.getCovariances().get(0).getMatrix().getEntry(0, 1),    1.0e-10);
1087         Assert.assertEquals( 6.0e6,   ch1.getCovariances().get(0).getMatrix().getEntry(0, 5),    1.0e-10);
1088         Assert.assertEquals( 2.0e6,   ch1.getCovariances().get(0).getMatrix().getEntry(4, 3),    1.0e-10);
1089 
1090         // check maneuver data
1091         Assert.assertEquals(3, file.getData().getManeuverBlocks().size());
1092         ManeuverHistory m0 = file.getData().getManeuverBlocks().get(0);
1093         Assert.assertEquals("this is number 1 MAN comment",  m0.getMetadata().getComments().get(0));
1094         Assert.assertEquals("maneuver 1",                    m0.getMetadata().getManID());
1095         Assert.assertEquals("maneuver 0",                    m0.getMetadata().getManPrevID());
1096         Assert.assertEquals("maneuver 2",                    m0.getMetadata().getManNextID());
1097         Assert.assertEquals(ManBasis.DETERMINED_TLM,         m0.getMetadata().getManBasis());
1098         Assert.assertEquals("TLM 203",                       m0.getMetadata().getManBasisID());
1099         Assert.assertEquals("THR 02",                        m0.getMetadata().getManDeviceID());
1100         Assert.assertEquals(-100.0,                          m0.getMetadata().getManPrevEpoch().durationFrom(epoch), 1.0-10);
1101         Assert.assertEquals(+100.0,                          m0.getMetadata().getManNextEpoch().durationFrom(epoch), 1.0-10);
1102         Assert.assertEquals("ORBIT",                         m0.getMetadata().getManPurpose().get(0));
1103         Assert.assertEquals("OD 5",                          m0.getMetadata().getManPredSource());
1104         Assert.assertEquals(OrbitRelativeFrame.TNW_INERTIAL, m0.getMetadata().getManReferenceFrame().asOrbitRelativeFrame());
1105         Assert.assertEquals(2.3,                             m0.getMetadata().getManFrameEpoch().durationFrom(epoch), 1.0e-10);
1106         Assert.assertEquals("MOON",                          m0.getMetadata().getGravitationalAssist().getName());
1107         Assert.assertEquals(DutyCycleType.TIME,              m0.getMetadata().getDcType());
1108         Assert.assertEquals(2.0,                             m0.getMetadata().getDcWindowOpen().durationFrom(epoch),  1.0e-10);
1109         Assert.assertEquals(100.0,                           m0.getMetadata().getDcWindowClose().durationFrom(epoch), 1.0e-10);
1110         Assert.assertEquals( 5,                              m0.getMetadata().getDcMinCycles());
1111         Assert.assertEquals(30,                              m0.getMetadata().getDcMaxCycles());
1112         Assert.assertEquals( 5.0,                            m0.getMetadata().getDcExecStart().durationFrom(epoch),   1.0e-10);
1113         Assert.assertEquals(95.0,                            m0.getMetadata().getDcExecStop().durationFrom(epoch),    1.0e-10);
1114         Assert.assertEquals(8000.0,                          m0.getMetadata().getDcRefTime().durationFrom(epoch),     1.0e-10);
1115         Assert.assertEquals( 10.0,                           m0.getMetadata().getDcTimePulseDuration(),               1.0e-10);
1116         Assert.assertEquals(200.0,                           m0.getMetadata().getDcTimePulsePeriod(),                 1.0e-10);
1117         Assert.assertEquals(23,                              m0.getMetadata().getManComposition().size());
1118         Assert.assertEquals(ManeuverFieldType.TIME_ABSOLUTE, m0.getMetadata().getManComposition().get( 0));
1119         Assert.assertEquals(ManeuverFieldType.TIME_RELATIVE, m0.getMetadata().getManComposition().get( 1));
1120         Assert.assertEquals(ManeuverFieldType.MAN_DURA,      m0.getMetadata().getManComposition().get( 2));
1121         Assert.assertEquals(ManeuverFieldType.DELTA_MASS,    m0.getMetadata().getManComposition().get( 3));
1122         Assert.assertEquals(ManeuverFieldType.ACC_X,         m0.getMetadata().getManComposition().get( 4));
1123         Assert.assertEquals(ManeuverFieldType.ACC_Y,         m0.getMetadata().getManComposition().get( 5));
1124         Assert.assertEquals(ManeuverFieldType.ACC_Z,         m0.getMetadata().getManComposition().get( 6));
1125         Assert.assertEquals(ManeuverFieldType.ACC_INTERP,    m0.getMetadata().getManComposition().get( 7));
1126         Assert.assertEquals(ManeuverFieldType.ACC_MAG_SIGMA, m0.getMetadata().getManComposition().get( 8));
1127         Assert.assertEquals(ManeuverFieldType.ACC_DIR_SIGMA, m0.getMetadata().getManComposition().get( 9));
1128         Assert.assertEquals(ManeuverFieldType.DV_X,          m0.getMetadata().getManComposition().get(10));
1129         Assert.assertEquals(ManeuverFieldType.DV_Y,          m0.getMetadata().getManComposition().get(11));
1130         Assert.assertEquals(ManeuverFieldType.DV_Z,          m0.getMetadata().getManComposition().get(12));
1131         Assert.assertEquals(ManeuverFieldType.DV_MAG_SIGMA,  m0.getMetadata().getManComposition().get(13));
1132         Assert.assertEquals(ManeuverFieldType.DV_DIR_SIGMA,  m0.getMetadata().getManComposition().get(14));
1133         Assert.assertEquals(ManeuverFieldType.THR_X,         m0.getMetadata().getManComposition().get(15));
1134         Assert.assertEquals(ManeuverFieldType.THR_Y,         m0.getMetadata().getManComposition().get(16));
1135         Assert.assertEquals(ManeuverFieldType.THR_Z,         m0.getMetadata().getManComposition().get(17));
1136         Assert.assertEquals(ManeuverFieldType.THR_EFFIC,     m0.getMetadata().getManComposition().get(18));
1137         Assert.assertEquals(ManeuverFieldType.THR_INTERP,    m0.getMetadata().getManComposition().get(19));
1138         Assert.assertEquals(ManeuverFieldType.THR_ISP,       m0.getMetadata().getManComposition().get(20));
1139         Assert.assertEquals(ManeuverFieldType.THR_MAG_SIGMA, m0.getMetadata().getManComposition().get(21));
1140         Assert.assertEquals(ManeuverFieldType.THR_DIR_SIGMA, m0.getMetadata().getManComposition().get(22));
1141         Assert.assertEquals(m0.getMetadata().getManComposition().size() - 2, m0.getMetadata().getManUnits().size());
1142         for (int i = 0; i < m0.getMetadata().getManUnits().size(); ++i) {
1143             ManeuverFieldType type = m0.getMetadata().getManComposition().get(i + 2);
1144             Unit              unit = m0.getMetadata().getManUnits().get(i);
1145             Assert.assertEquals(type.getUnit(), unit);
1146         }
1147         Assert.assertEquals(2, m0.getManeuvers().size());
1148         Assert.assertEquals(   0.0,   m0.getManeuvers().get(0).getDate().durationFrom(epoch), 1.0e-10);
1149         Assert.assertEquals( 200.0,   m0.getManeuvers().get(0).getDuration(),                 1.0e-10);
1150         Assert.assertEquals(OnOff.ON, m0.getManeuvers().get(0).getAccelerationInterpolation());
1151         Assert.assertEquals( 600.0,   m0.getManeuvers().get(1).getDate().durationFrom(epoch), 1.0e-10);
1152         Assert.assertEquals(  -5.0,   m0.getManeuvers().get(1).getDeltaMass(),                1.0e-10);
1153 
1154         ManeuverHistory m1 = file.getData().getManeuverBlocks().get(1);
1155         Assert.assertEquals("this is number 2 MAN comment",  m1.getMetadata().getComments().get(0));
1156         Assert.assertEquals("maneuver 2",                    m1.getMetadata().getManID());
1157         Assert.assertEquals("maneuver 1",                    m1.getMetadata().getManPrevID());
1158         Assert.assertEquals("maneuver 3",                    m1.getMetadata().getManNextID());
1159         Assert.assertEquals(ManBasis.PLANNED,                m1.getMetadata().getManBasis());
1160         Assert.assertEquals("analysis 17",                   m1.getMetadata().getManBasisID());
1161         Assert.assertEquals("THR 07",                        m1.getMetadata().getManDeviceID());
1162         Assert.assertEquals( 200.0,                          m1.getMetadata().getManPrevEpoch().durationFrom(epoch), 1.0-10);
1163         Assert.assertEquals( 300.0,                          m1.getMetadata().getManNextEpoch().durationFrom(epoch), 1.0-10);
1164         Assert.assertEquals("PERIOD",                        m1.getMetadata().getManPurpose().get(0));
1165         Assert.assertEquals("OD 5",                          m1.getMetadata().getManPredSource());
1166         Assert.assertEquals(OrbitRelativeFrame.TNW_INERTIAL, m1.getMetadata().getManReferenceFrame().asOrbitRelativeFrame());
1167         Assert.assertEquals(2.3,                             m1.getMetadata().getManFrameEpoch().durationFrom(epoch), 1.0e-10);
1168         Assert.assertEquals("EARTH",                         m1.getMetadata().getGravitationalAssist().getName());
1169         Assert.assertEquals(DutyCycleType.TIME_AND_ANGLE,    m1.getMetadata().getDcType());
1170         Assert.assertEquals(1002.0,                          m1.getMetadata().getDcWindowOpen().durationFrom(epoch),  1.0e-10);
1171         Assert.assertEquals(1100.0,                          m1.getMetadata().getDcWindowClose().durationFrom(epoch), 1.0e-10);
1172         Assert.assertEquals(14,                              m1.getMetadata().getDcMinCycles());
1173         Assert.assertEquals(60,                              m1.getMetadata().getDcMaxCycles());
1174         Assert.assertEquals(1005.0,                          m1.getMetadata().getDcExecStart().durationFrom(epoch),   1.0e-10);
1175         Assert.assertEquals(1095.0,                          m1.getMetadata().getDcExecStop().durationFrom(epoch),    1.0e-10);
1176         Assert.assertEquals(12000.0,                         m1.getMetadata().getDcRefTime().durationFrom(epoch),     1.0e-10);
1177         Assert.assertEquals( 20.0,                           m1.getMetadata().getDcTimePulseDuration(),               1.0e-10);
1178         Assert.assertEquals(400.0,                           m1.getMetadata().getDcTimePulsePeriod(),                 1.0e-10);
1179         Assert.assertEquals(22,                              m1.getMetadata().getManComposition().size());
1180         Assert.assertEquals(0.0,
1181                             Vector3D.distance(m1.getMetadata().getDcRefDir(),
1182                                               Vector3D.PLUS_I),
1183                             1.0e-10);
1184         Assert.assertEquals(SpacecraftBodyFrame.BaseEquipment.SENSOR, m1.getMetadata().getDcBodyFrame().getBaseEquipment());
1185         Assert.assertEquals("3",                             m1.getMetadata().getDcBodyFrame().getLabel());
1186         Assert.assertEquals(0.0,
1187                             Vector3D.distance(m1.getMetadata().getDcBodyTrigger(),
1188                                               new Vector3D(0.707, 0.0, 0.707)),
1189                             1.0e-10);
1190         Assert.assertEquals(25.0, FastMath.toDegrees(m1.getMetadata().getDcPhaseStartAngle()), 1.0e-10);
1191         Assert.assertEquals(35.0, FastMath.toDegrees(m1.getMetadata().getDcPhaseStopAngle()),  1.0e-10);
1192         Assert.assertEquals(22,                              m1.getMetadata().getManComposition().size());
1193         Assert.assertEquals(ManeuverFieldType.TIME_RELATIVE, m1.getMetadata().getManComposition().get( 0));
1194         Assert.assertEquals(ManeuverFieldType.MAN_DURA,      m1.getMetadata().getManComposition().get( 1));
1195         Assert.assertEquals(ManeuverFieldType.DELTA_MASS,    m1.getMetadata().getManComposition().get( 2));
1196         Assert.assertEquals(ManeuverFieldType.ACC_X,         m1.getMetadata().getManComposition().get( 3));
1197         Assert.assertEquals(ManeuverFieldType.ACC_Y,         m1.getMetadata().getManComposition().get( 4));
1198         Assert.assertEquals(ManeuverFieldType.ACC_Z,         m1.getMetadata().getManComposition().get( 5));
1199         Assert.assertEquals(ManeuverFieldType.ACC_INTERP,    m1.getMetadata().getManComposition().get( 6));
1200         Assert.assertEquals(ManeuverFieldType.ACC_MAG_SIGMA, m1.getMetadata().getManComposition().get( 7));
1201         Assert.assertEquals(ManeuverFieldType.ACC_DIR_SIGMA, m1.getMetadata().getManComposition().get( 8));
1202         Assert.assertEquals(ManeuverFieldType.DV_X,          m1.getMetadata().getManComposition().get( 9));
1203         Assert.assertEquals(ManeuverFieldType.DV_Y,          m1.getMetadata().getManComposition().get(10));
1204         Assert.assertEquals(ManeuverFieldType.DV_Z,          m1.getMetadata().getManComposition().get(11));
1205         Assert.assertEquals(ManeuverFieldType.DV_MAG_SIGMA,  m1.getMetadata().getManComposition().get(12));
1206         Assert.assertEquals(ManeuverFieldType.DV_DIR_SIGMA,  m1.getMetadata().getManComposition().get(13));
1207         Assert.assertEquals(ManeuverFieldType.THR_X,         m1.getMetadata().getManComposition().get(14));
1208         Assert.assertEquals(ManeuverFieldType.THR_Y,         m1.getMetadata().getManComposition().get(15));
1209         Assert.assertEquals(ManeuverFieldType.THR_Z,         m1.getMetadata().getManComposition().get(16));
1210         Assert.assertEquals(ManeuverFieldType.THR_EFFIC,     m1.getMetadata().getManComposition().get(17));
1211         Assert.assertEquals(ManeuverFieldType.THR_INTERP,    m1.getMetadata().getManComposition().get(18));
1212         Assert.assertEquals(ManeuverFieldType.THR_ISP,       m1.getMetadata().getManComposition().get(19));
1213         Assert.assertEquals(ManeuverFieldType.THR_MAG_SIGMA, m1.getMetadata().getManComposition().get(20));
1214         Assert.assertEquals(ManeuverFieldType.THR_DIR_SIGMA, m1.getMetadata().getManComposition().get(21));
1215         Assert.assertEquals(m1.getMetadata().getManComposition().size() - 1, m1.getMetadata().getManUnits().size());
1216         for (int i = 0; i < m1.getMetadata().getManUnits().size(); ++i) {
1217             ManeuverFieldType type = m1.getMetadata().getManComposition().get(i + 1);
1218             Unit              unit = m1.getMetadata().getManUnits().get(i);
1219             Assert.assertEquals(type.getUnit(), unit);
1220         }
1221         Assert.assertEquals(2, m1.getManeuvers().size());
1222         Assert.assertEquals(1000.0,    m1.getManeuvers().get(0).getDate().durationFrom(epoch), 1.0e-10);
1223         Assert.assertEquals(0.02,      m1.getManeuvers().get(0).getThrustMagnitudeSigma(),     1.0e-10);
1224         Assert.assertEquals(4.3,       FastMath.toDegrees(m1.getManeuvers().get(0).getThrustDirectionSigma()), 1.0e-10);
1225         Assert.assertEquals(OnOff.OFF, m1.getManeuvers().get(0).getAccelerationInterpolation());
1226         Assert.assertEquals(1600.0,    m1.getManeuvers().get(1).getDate().durationFrom(epoch), 1.0e-10);
1227         Assert.assertEquals( 25.0,     m1.getManeuvers().get(1).getDv().getX(),                1.0e-10);
1228 
1229 
1230         ManeuverHistory m2 = file.getData().getManeuverBlocks().get(2);
1231         Assert.assertEquals("this is number 3 MAN comment",     m2.getMetadata().getComments().get(0));
1232         Assert.assertEquals("maneuver 3",                       m2.getMetadata().getManID());
1233         Assert.assertEquals("DEPLOYMENT",                       m2.getMetadata().getManDeviceID());
1234         Assert.assertEquals(10,                                 m2.getMetadata().getManComposition().size());
1235         Assert.assertEquals(ManeuverFieldType.TIME_ABSOLUTE,    m2.getMetadata().getManComposition().get( 0));
1236         Assert.assertEquals(ManeuverFieldType.DEPLOY_ID,        m2.getMetadata().getManComposition().get( 1));
1237         Assert.assertEquals(ManeuverFieldType.DEPLOY_DV_X,      m2.getMetadata().getManComposition().get( 2));
1238         Assert.assertEquals(ManeuverFieldType.DEPLOY_DV_Y,      m2.getMetadata().getManComposition().get( 3));
1239         Assert.assertEquals(ManeuverFieldType.DEPLOY_DV_Z,      m2.getMetadata().getManComposition().get( 4));
1240         Assert.assertEquals(ManeuverFieldType.DEPLOY_MASS,      m2.getMetadata().getManComposition().get( 5));
1241         Assert.assertEquals(ManeuverFieldType.DEPLOY_DV_SIGMA,  m2.getMetadata().getManComposition().get( 6));
1242         Assert.assertEquals(ManeuverFieldType.DEPLOY_DIR_SIGMA, m2.getMetadata().getManComposition().get( 7));
1243         Assert.assertEquals(ManeuverFieldType.DEPLOY_DV_RATIO,  m2.getMetadata().getManComposition().get( 8));
1244         Assert.assertEquals(ManeuverFieldType.DEPLOY_DV_CDA,    m2.getMetadata().getManComposition().get( 9));
1245         Assert.assertEquals(m2.getMetadata().getManComposition().size() - 1, m2.getMetadata().getManUnits().size());
1246         for (int i = 0; i < m2.getMetadata().getManUnits().size(); ++i) {
1247             ManeuverFieldType type = m2.getMetadata().getManComposition().get(i + 1);
1248             Unit              unit = m2.getMetadata().getManUnits().get(i);
1249             Assert.assertEquals(type.getUnit(), unit);
1250         }
1251         Assert.assertEquals(8, m2.getManeuvers().size());
1252         Assert.assertEquals(35100.0,   m2.getManeuvers().get(0).getDate().durationFrom(epoch), 1.0e-10);
1253         Assert.assertEquals("BEE_1",   m2.getManeuvers().get(0).getDeployId());
1254         Assert.assertEquals(35160.0,   m2.getManeuvers().get(1).getDate().durationFrom(epoch), 1.0e-10);
1255         Assert.assertEquals(    0.3,   m2.getManeuvers().get(1).getDeployDv().getY(),          1.0e-10);
1256 
1257         // check perturbation data
1258         final Perturbations pert = file.getData().getPerturbationsBlock();
1259         Assert.assertEquals("this is PERT comment",         pert.getComments().get(0));
1260         Assert.assertEquals("NRLMSIS00",                    pert.getAtmosphericModel());
1261         Assert.assertEquals("TEG-4",                        pert.getGravityModel());
1262         Assert.assertEquals(36,                             pert.getGravityDegree());
1263         Assert.assertEquals(12,                             pert.getGravityOrder());
1264         Assert.assertEquals(6378137.0,                      pert.getEquatorialRadius(), 1.0e-9);
1265         Assert.assertEquals(3.986004415e14,                 pert.getGm(),               1.0);
1266         Assert.assertEquals("MOON",                         pert.getNBodyPerturbations().get(0).getName());
1267         Assert.assertEquals("SUN",                          pert.getNBodyPerturbations().get(1).getName());
1268         Assert.assertEquals(4.17807421629e-3,               FastMath.toDegrees(pert.getCentralBodyRotation()), 1.0e-12);
1269         Assert.assertEquals(0.00335281066475,               pert.getOblateFlattening(), 1.0e-12);
1270         Assert.assertEquals("SEMI-DIURNAL",                 pert.getOceanTidesModel());
1271         Assert.assertEquals("DIURNAL",                      pert.getSolidTidesModel());
1272         Assert.assertEquals("IERS2010",                     pert.getReductionTheory());
1273         Assert.assertEquals("KNOCKE",                       pert.getAlbedoModel());
1274         Assert.assertEquals(100,                            pert.getAlbedoGridSize());
1275         Assert.assertEquals(ShadowModel.DUAL_CONE,          pert.getShadowModel());
1276         Assert.assertEquals("EARTH",                        pert.getShadowBodies().get(0).getName());
1277         Assert.assertEquals("MOON",                         pert.getShadowBodies().get(1).getName());
1278         Assert.assertEquals("BOX WING",                     pert.getSrpModel());
1279         Assert.assertEquals("CELESTRAK",                    pert.getSpaceWeatherSource());
1280         Assert.assertEquals(0.0, pert.getSpaceWeatherEpoch().durationFrom(new AbsoluteDate(2019, 7, 22, TimeScalesFactory.getUTC())), 1.0e-10);
1281         Assert.assertEquals("LAGRANGE ORDER 5",             pert.getInterpMethodSW());
1282         Assert.assertEquals(3.2e-9,                         pert.getFixedGeomagneticKp(),  1.0e-20);
1283         Assert.assertEquals(2.1e-9,                         pert.getFixedGeomagneticAp(),  1.0e-20);
1284         Assert.assertEquals(-20.0e-9,                       pert.getFixedGeomagneticDst(), 1.0e-20);
1285         Assert.assertEquals(1.20e-20,                       pert.getFixedF10P7(),          1.0e-30);
1286         Assert.assertEquals(1.32e-20,                       pert.getFixedF10P7Mean(),      1.0e-30);
1287         Assert.assertEquals(1.30e-20,                       pert.getFixedM10P7(),          1.0e-30);
1288         Assert.assertEquals(1.42e-20,                       pert.getFixedM10P7Mean(),      1.0e-30);
1289         Assert.assertEquals(1.40e-20,                       pert.getFixedS10P7(),          1.0e-30);
1290         Assert.assertEquals(1.52e-20,                       pert.getFixedS10P7Mean(),      1.0e-30);
1291         Assert.assertEquals(1.50e-20,                       pert.getFixedY10P7(),          1.0e-30);
1292         Assert.assertEquals(1.62e-20,                       pert.getFixedY10P7Mean(),      1.0e-30);
1293 
1294         // check orbit determination data
1295         OrbitDetermination od = file.getData().getOrbitDeterminationBlock();
1296         Assert.assertEquals("this is OD comment", od.getComments().get(0));
1297         Assert.assertEquals("OD 24",              od.getId());
1298         Assert.assertEquals("OD 23",              od.getPrevId());
1299         Assert.assertEquals("BWLS",               od.getMethod().getName());
1300         Assert.assertEquals(OdMethodType.BWLS,    od.getMethod().getType());
1301         Assert.assertEquals("OREKIT",             od.getMethod().getTool());
1302         Assert.assertEquals(0.0,
1303                             od.getEpoch().durationFrom(new AbsoluteDate(2019, 7, 22, 17, 32, 27.0,
1304                                                                         TimeScalesFactory.getUTC())),
1305                             1.0e-10);
1306         Assert.assertEquals(302400.0,             od.getTimeSinceFirstObservation(), 1.0e-10);
1307         Assert.assertEquals(103680.0,             od.getTimeSinceLastObservation(),  1.0e-10);
1308         Assert.assertEquals(449280.0,             od.getRecommendedOdSpan(),         1.0e-10);
1309         Assert.assertEquals(198720.0,             od.getActualOdSpan(),              1.0e-10);
1310         Assert.assertEquals(100,                  od.getObsAvailable());
1311         Assert.assertEquals( 90,                  od.getObsUsed());
1312         Assert.assertEquals( 33,                  od.getTracksAvailable());
1313         Assert.assertEquals( 30,                  od.getTracksUsed());
1314         Assert.assertEquals(86400.0,              od.getMaximumObsGap(),             1.0e-10);
1315         Assert.assertEquals(58.73,                od.getEpochEigenMaj(),             1.0e-10);
1316         Assert.assertEquals(35.7,                 od.getEpochEigenMed(),             1.0e-10);
1317         Assert.assertEquals(21.5,                 od.getEpochEigenMin(),             1.0e-10);
1318         Assert.assertEquals(32.5,                 od.getMaxPredictedEigenMaj(),      1.0e-10);
1319         Assert.assertEquals(22.0,                 od.getMinPredictedEigenMin(),      1.0e-10);
1320         Assert.assertEquals(0.953,                od.getConfidence(),                1.0e-10);
1321         Assert.assertEquals(0.857,                od.getGdop(),                      1.0e-10);
1322         Assert.assertEquals(6,                    od.getSolveN());
1323         Assert.assertEquals("POS[3]",             od.getSolveStates().get(0));
1324         Assert.assertEquals("VEL[3]",             od.getSolveStates().get(1));
1325         Assert.assertEquals(2,                    od.getConsiderN());
1326         Assert.assertEquals("DRAG",               od.getConsiderParameters().get(0));
1327         Assert.assertEquals("SRP",                od.getConsiderParameters().get(1));
1328         Assert.assertEquals(3,                    od.getSensorsN());
1329         Assert.assertEquals("EGLIN",              od.getSensors().get(0));
1330         Assert.assertEquals("FYLINGDALES",        od.getSensors().get(1));
1331         Assert.assertEquals("PLAGNOLE",           od.getSensors().get(2));
1332         Assert.assertEquals(1.3,                  od.getWeightedRms(), 1.0e-10);
1333         Assert.assertEquals("RANGE",              od.getDataTypes().get(0));
1334         Assert.assertEquals("DOPPLER",            od.getDataTypes().get(1));
1335         Assert.assertEquals("AZEL",               od.getDataTypes().get(2));
1336 
1337         // check user data
1338         Assert.assertEquals(1, file.getData().getUserDefinedBlock().getParameters().size());
1339         Assert.assertEquals("OREKIT", file.getData().getUserDefinedBlock().getParameters().get("LIBRARY"));
1340 
1341         Assert.assertEquals(1, file.getSatellites().size());
1342         OcmSatelliteEphemeris ephemeris = file.getSatellites().get("POLYSAT");
1343         Assert.assertEquals("POLYSAT", ephemeris.getId());
1344         Assert.assertEquals(3.986004415e14, ephemeris.getMu(), 1e5);
1345         Assert.assertEquals(3.0e5, Constants.IERS2003_EARTH_MU - ephemeris.getMu(), 1e0);
1346         Assert.assertEquals(2, ephemeris.getSegments().size());
1347         List<TimeStampedPVCoordinates> h0 = ephemeris.getSegments().get(0).getCoordinates();
1348         Assert.assertEquals(3, h0.size());
1349         Assert.assertEquals(   0.0, h0.get(0).getDate().durationFrom(epoch), 1.0e-10);
1350         Assert.assertEquals( 300.0, h0.get(1).getDate().durationFrom(epoch), 1.0e-10);
1351         Assert.assertEquals( 600.0, h0.get(2).getDate().durationFrom(epoch), 1.0e-10);
1352         List<TimeStampedPVCoordinates> h1 = ephemeris.getSegments().get(1).getCoordinates();
1353         Assert.assertEquals(3, h1.size());
1354         Assert.assertEquals(1800.0, h1.get(0).getDate().durationFrom(epoch), 1.0e-10);
1355         Assert.assertEquals(2100.0, h1.get(1).getDate().durationFrom(epoch), 1.0e-10);
1356         Assert.assertEquals(2400.0, h1.get(2).getDate().durationFrom(epoch), 1.0e-10);
1357 
1358         Assert.assertEquals(   0.0, ephemeris.getStart().durationFrom(epoch), 10e-10);
1359         Assert.assertEquals(2400.0, ephemeris.getStop().durationFrom(epoch), 10e-10);
1360 
1361     }
1362 
1363 }