ODMFile.java

/* Copyright 2002-2016 CS Systèmes d'Information
 * Licensed to CS Systèmes d'Information (CS) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * CS licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.orekit.files.ccsds;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.orekit.errors.OrekitException;
import org.orekit.errors.OrekitMessages;
import org.orekit.files.general.OrbitFile;
import org.orekit.files.general.SatelliteTimeCoordinate;
import org.orekit.time.AbsoluteDate;
import org.orekit.utils.IERSConventions;

/**
 * The ODMFile (Orbit Data Message) class represents any of the three orbit messages used by the CCSDS,
 * i.e. the Orbit Parameter Message (OPM), the Mean-Elements Message (OMM) and the Orbit Ephemeris Message (OEM).
 * It contains the information of the message's header and configuration data (set in the parser).
 * @author sports
 * @since 6.1
 */
public abstract class ODMFile implements OrbitFile {

    /** CCSDS Format version. */
    private double formatVersion;

    /** Header comments. The list contains a string for each line of comment. */
    private List<String> headerComment;

    /** File creation date and time in UTC. */
    private AbsoluteDate creationDate;

    /** Creating agency or operator. */
    private String originator;

    /** Gravitational coefficient set by the user in the parser. */
    private double muSet;

    /** Gravitational coefficient parsed in the ODM File. */
    private double muParsed;

    /** Gravitational coefficient created from the knowledge of the central body. */
    private double muCreated;

    /** IERS conventions used. */
    private IERSConventions conventions;

    /** Final gravitational coefficient (used for the public methods that need such a parameter, ex: generateCartesianOrbit).
     * In order of decreasing priority, finalMU is equal to: the coefficient parsed in the file, the coefficient set by the
     * user with the parser's method setMu, the coefficient created from the knowledge of the central body.
     */
    private double muUsed;

    /** Initial Date for MET or MRT time systems. */
    private AbsoluteDate missionReferenceDate;

    /** ODMFile constructor. */
    public ODMFile() {
        muSet     = Double.NaN;
        muParsed  = Double.NaN;
        muCreated = Double.NaN;
        muUsed    = Double.NaN;
    }

    /**
     * Get the gravitational coefficient set by the user.
     * @return the coefficient
     */
    public double getMuSet() {
        return muSet;
    }

    /**
     * Set the gravitational coefficient set by the user.
     * @param muSet the coefficient to be set
     */
    void setMuSet(final double muSet) {
        this.muSet = muSet;
    }

    /**
     * Get the gravitational coefficient parsed in the ODM File.
     * @return the coefficient
     */
    public double getMuParsed() {
        return muParsed;
    }

    /**
     * Set the gravitational coefficient parsed in the ODM File.
     * @param muParsed the coefficient to be set
     */
    void setMuParsed(final double muParsed) {
        this.muParsed = muParsed;
    }

    /**
     * Get the gravitational coefficient created from the knowledge of the central body.
     * @return the coefficient
     */
    public double getMuCreated() {
        return muCreated;
    }

    /**
     * Set the gravitational coefficient created from the knowledge of the central body.
     * @param muCreated the coefficient to be set
     */
    void setMuCreated(final double muCreated) {
        this.muCreated = muCreated;
    }

    /**
     * Get the used gravitational coefficient.
     * @return the coefficient
     */
    public double getMuUsed() {
        return muUsed;
    }

    /**
     * Set the gravitational coefficient created from the knowledge of the central body.
     * In order of decreasing priority, finalMU is set equal to:
     * <ol>
     *   <li>the coefficient parsed in the file,</li>
     *   <li>the coefficient set by the user with the parser's method setMu,</li>
     *   <li>the coefficient created from the knowledge of the central body.</li>
     * </ol>
     * @throws OrekitException if no gravitational coefficient can be found
     */
    protected void setMuUsed() throws OrekitException {
        if (!Double.isNaN(muParsed)) {
            muUsed = muParsed;
        } else if (!Double.isNaN(muSet)) {
            muUsed = muSet;
        } else if (!Double.isNaN(muCreated)) {
            muUsed = muCreated;
        } else {
            throw new OrekitException(OrekitMessages.CCSDS_UNKNOWN_GM);
        }
    }

    /** Get IERS conventions.
     * @return conventions IERS conventions
     * @exception OrekitException if no IERS conventions have been set
     */
    public IERSConventions getConventions() throws OrekitException {
        if (conventions != null) {
            return conventions;
        } else {
            throw new OrekitException(OrekitMessages.CCSDS_UNKNOWN_CONVENTIONS);
        }
    }

    /** Set IERS conventions.
     * @param conventions IERS conventions to be set
     */
    void setConventions(final IERSConventions conventions) {
        this.conventions = conventions;
    }

    /** Get reference date for Mission Elapsed Time and Mission Relative Time time systems.
     * @return the reference date
     */
    public AbsoluteDate getMissionReferenceDate() {
        return missionReferenceDate;
    }

    /** Set reference date for Mission Elapsed Time and Mission Relative Time time systems.
     * @param missionReferenceDate reference date for Mission Elapsed Time and Mission Relative Time time systems.
     */
    void setMissionReferenceDate(final AbsoluteDate missionReferenceDate) {
        this.missionReferenceDate = missionReferenceDate;
    }

    /** Get the CCSDS ODM (OPM, OMM or OEM) format version.
     * @return format version
     */
    public double getFormatVersion() {
        return formatVersion;
    }

    /** Set the CCSDS ODM (OPM, OMM or OEM) format version.
     * @param formatVersion the format version to be set
     */
    void setFormatVersion(final double formatVersion) {
        this.formatVersion = formatVersion;
    }

    /** Get the header comment.
     * @return header comment
     */
    public List<String> getHeaderComment() {
        return headerComment;
    }

    /** Set the header comment.
     * @param headerComment header comment
     */
    void setHeaderComment(final List<String> headerComment) {
        this.headerComment = new ArrayList<String>(headerComment);
    }

    /** Get the file creation date and time in UTC.
     * @return the file creation date and time in UTC.
     */
    public AbsoluteDate getCreationDate() {
        return creationDate;
    }

    /** Set the file creation date and time in UTC.
     * @param creationDate the creation date to be set
     */
    void setCreationDate(final AbsoluteDate creationDate) {
        this.creationDate = creationDate;
    }

    /** Get the file originator.
     * @return originator the file originator.
     */
    public String getOriginator() {
        return originator;
    }

    /** Set the file originator.
     * @param originator the originator to be set
     */
    void setOriginator(final String originator) {
        this.originator = originator;
    }

    /**
     * Not supported by CCSDS orbit messages.
     * @return always throws an {@link UnsupportedOperationException}
     * @throws UnsupportedOperationException always
     */
    @Override
    public double getEpochInterval() {
        throw new UnsupportedOperationException();
    }

    /**
     * Not supported by CCSDS orbit messages.
     * @return always throws an {@link UnsupportedOperationException}
     * @throws UnsupportedOperationException always
     */
    @Override
    public int getNumberOfEpochs() {
        throw new UnsupportedOperationException();
    }

    /** {@inheritDoc} */
    @Override
    public boolean containsSatellite(final String satId) {
        return getSatellite(satId) != null;
    }

    /** {@inheritDoc} */
    @Override
    public List<SatelliteTimeCoordinate> getSatelliteCoordinates(final String satId) {
        return Collections.emptyList();
    }

}