1 /* Copyright 2002-2025 CS GROUP 2 * Licensed to CS GROUP (CS) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * CS licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 package org.orekit.files.ccsds.ndm.odm.ocm; 19 20 import java.util.Collections; 21 import java.util.List; 22 import java.util.Map; 23 24 import org.orekit.data.DataContext; 25 import org.orekit.files.ccsds.ndm.NdmConstituent; 26 import org.orekit.files.ccsds.ndm.odm.OdmHeader; 27 import org.orekit.files.ccsds.section.Segment; 28 import org.orekit.files.general.EphemerisFile; 29 import org.orekit.utils.IERSConventions; 30 import org.orekit.utils.TimeStampedPVCoordinates; 31 32 /** This class gathers the informations present in the Orbit Comprehensive Message (OCM). 33 * @author Luc Maisonobe 34 * @since 11.0 35 */ 36 public class Ocm extends NdmConstituent<OdmHeader, Segment<OcmMetadata, OcmData>> 37 implements EphemerisFile<TimeStampedPVCoordinates, TrajectoryStateHistory> { 38 39 /** Root element for XML messages. */ 40 public static final String ROOT = "ocm"; 41 42 /** Key for format version. */ 43 public static final String FORMAT_VERSION_KEY = "CCSDS_OCM_VERS"; 44 45 /** Trajectory line element for XML messages. */ 46 public static final String TRAJ_LINE = "trajLine"; 47 48 /** Covariance line element for XML messages. */ 49 public static final String COV_LINE = "covLine"; 50 51 /** Maneuver line element for XML messages. */ 52 public static final String MAN_LINE = "manLine"; 53 54 /** Default name for unknown object. */ 55 public static final String UNKNOWN_OBJECT = "UNKNOWN"; 56 57 /** Gravitational coefficient to use for building Cartesian/Keplerian orbits. */ 58 private final double mu; 59 60 /** Simple constructor. 61 * @param header file header 62 * @param segments ile segments 63 * @param conventions IERS conventions 64 * @param dataContext used for creating frames, time scales, etc. 65 * @param mu Gravitational coefficient to use for building Cartesian/Keplerian orbits. 66 */ 67 public Ocm(final OdmHeader header, final List<Segment<OcmMetadata, OcmData>> segments, 68 final IERSConventions conventions, final DataContext dataContext, 69 final double mu) { 70 super(header, segments, conventions, dataContext); 71 this.mu = mu; 72 } 73 74 /** Get the metadata from the single {@link #getSegments() segment}. 75 * @return metadata from the single {@link #getSegments() segment} 76 */ 77 public OcmMetadata getMetadata() { 78 return getSegments().get(0).getMetadata(); 79 } 80 81 /** Get the data from the single {@link #getSegments() segment}. 82 * @return data from the single {@link #getSegments() segment} 83 */ 84 public OcmData getData() { 85 return getSegments().get(0).getData(); 86 } 87 88 /** {@inheritDoc} 89 * <p> 90 * The metadata entries checked for use as the key are the following ones, 91 * the first non-null being used. The map from OCM files always contains only 92 * one object. 93 * <ul> 94 * <li>{@link org.orekit.files.ccsds.ndm.odm.OdmMetadata#getObjectName() OBJECT_NAME}</li> 95 * <li>{@link OcmMetadata#getInternationalDesignator() INTERNATIONAL_DESIGNATOR}</li> 96 * <li>{@link OcmMetadata#getObjectDesignator() OBJECT_DESIGNATOR}</li> 97 * <li>the default name {@link #UNKNOWN_OBJECT} for unknown objects</li> 98 * </ul> 99 */ 100 @Override 101 public Map<String, OcmSatelliteEphemeris> getSatellites() { 102 // the OCM file has only one segment and a deep structure 103 // the real ephemeris is buried within the orbit histories logical block 104 final String name; 105 if (getMetadata().getObjectName() != null) { 106 name = getMetadata().getObjectName(); 107 } else if (getMetadata().getInternationalDesignator() != null) { 108 name = getMetadata().getInternationalDesignator(); 109 } else if (getMetadata().getObjectDesignator() != null) { 110 name = getMetadata().getObjectDesignator(); 111 } else { 112 name = UNKNOWN_OBJECT; 113 } 114 final List<TrajectoryStateHistory> histories = getSegments().get(0).getData().getTrajectoryBlocks(); 115 final OcmSatelliteEphemeris ose = new OcmSatelliteEphemeris(name, mu, histories); 116 return Collections.singletonMap(name, ose); 117 } 118 119 }