OGMFile.java
/* Copyright 2002-2020 CS GROUP
* Licensed to CS GROUP (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.HashMap;
import java.util.List;
import java.util.Map;
import org.hipparchus.linear.MatrixUtils;
import org.hipparchus.linear.RealMatrix;
import org.orekit.errors.OrekitException;
import org.orekit.errors.OrekitMessages;
import org.orekit.frames.Frame;
import org.orekit.frames.LOFType;
import org.orekit.orbits.PositionAngle;
import org.orekit.time.AbsoluteDate;
/** This class gathers the general state data present in both OPM and OMM files.
* <p>
* This class does not appear in the CCSDS standard, it is only a design
* feature of Orekit to reduce code duplication.
* </p>
* @author sports
* @since 6.1
*/
public abstract class OGMFile extends ODMFile {
/** Epoch of state vector and optional Keplerian elements. */
private AbsoluteDate epoch;
/** Orbit semi-major axis (m). */
private double a;
/** Orbit eccentricity. */
private double e;
/** Orbit inclination (rad). */
private double i;
/** Orbit right ascension of ascending node (rad). */
private double raan;
/** Orbit argument of pericenter (rad). */
private double pa;
/** Orbit anomaly (rad). */
private double anomaly;
/** Orbit anomaly type (mean or true). */
private PositionAngle anomalyType;
/** Spacecraft mass. */
private double mass;
/** Solar radiation pressure area (m^2). */
private double solarRadArea;
/** Solar radiation pressure coefficient. */
private double solarRadCoeff;
/** Drag area (m^2). */
private double dragArea;
/** Drag coefficient. */
private double dragCoeff;
/** Coordinate system for covariance matrix, for Local Orbital Frames. */
private LOFType covRefLofType;
/** Coordinate system for covariance matrix, for absolute frames.
* If not given it is set equal to refFrame. */
private Frame covRefFrame;
/** Position/Velocity covariance matrix. */
private RealMatrix covarianceMatrix;
/** Map of user defined parameter keywords and corresponding values. */
private Map<String, String> userDefinedParameters;
/** Tests whether the OPM contains Keplerian elements data. */
private boolean hasKeplerianElements;
/** Epoch comments. The list contains a string for each line of comment. */
private List<String> epochComment;
/** Keplerian elements comments. The list contains a string for each line of comment. */
private List<String> keplerianElementsComment;
/** Spacecraft data comments. The list contains a string for each line of comment. */
private List<String> spacecraftComment;
/** Covariance matrix data comments. The list contains a string for each line of comment. */
private List<String> covarianceComment;
/** Create a new OPM file object. */
OGMFile() {
mass = Double.NaN;
userDefinedParameters = new HashMap<String, String>();
epochComment = Collections.emptyList();
keplerianElementsComment = Collections.emptyList();
spacecraftComment = Collections.emptyList();
covarianceComment = Collections.emptyList();
}
/** Get epoch of state vector, Keplerian elements and covariance matrix data.
* @return epoch the epoch
*/
public AbsoluteDate getEpoch() {
return epoch;
}
/** Set epoch of state vector, Keplerian elements and covariance matrix data.
* @param epoch the epoch to be set
*/
void setEpoch(final AbsoluteDate epoch) {
this.epoch = epoch;
}
/** Get the orbit semi-major axis.
* @return the orbit semi-major axis
*/
public double getA() {
return a;
}
/** Set the orbit semi-major axis.
* @param a the semi-major axis to be set
*/
void setA(final double a) {
this.a = a;
}
/** Get the orbit eccentricity.
* @return the orbit eccentricity
*/
public double getE() {
return e;
}
/** Set the orbit eccentricity.
* @param e the eccentricity to be set
*/
void setE(final double e) {
this.e = e;
}
/** Get the orbit inclination.
* @return the orbit inclination
*/
public double getI() {
return i;
}
/**Set the orbit inclination.
* @param i the inclination to be set
*/
void setI(final double i) {
this.i = i;
}
/** Get the orbit right ascension of ascending node.
* @return the orbit right ascension of ascending node
*/
public double getRaan() {
return raan;
}
/** Set the orbit right ascension of ascending node.
* @param raan the right ascension of ascending node to be set
*/
void setRaan(final double raan) {
this.raan = raan;
}
/** Get the orbit argument of pericenter.
* @return the orbit argument of pericenter
*/
public double getPa() {
return pa;
}
/** Set the orbit argument of pericenter.
* @param pa the argument of pericenter to be set
*/
void setPa(final double pa) {
this.pa = pa;
}
/** Get the orbit anomaly.
* @return the orbit anomaly
*/
public double getAnomaly() {
return anomaly;
}
/** Set the orbit anomaly.
* @param anomaly the anomaly to be set
*/
void setAnomaly(final double anomaly) {
this.anomaly = anomaly;
}
/** Get the type of anomaly (true or mean).
* @return the type of anomaly
*/
public PositionAngle getAnomalyType() {
return anomalyType;
}
/** Set the type of anomaly (true or mean).
* @param anomalyType the type of anomaly to be set
*/
void setAnomalyType(final String anomalyType) {
this.anomalyType = PositionAngle.valueOf(anomalyType);
}
/** Get the spacecraft mass.
* @return the spacecraft mass
*/
public double getMass() {
if (Double.isNaN(mass)) {
throw new OrekitException(OrekitMessages.CCSDS_UNKNOWN_SPACECRAFT_MASS);
}
return mass;
}
/** Set the spacecraft mass.
* @param mass the spacecraft mass to be set
*/
void setMass(final double mass) {
this.mass = mass;
}
/** Get the solar radiation pressure area.
* @return the solar radiation pressure area
*/
public double getSolarRadArea() {
return solarRadArea;
}
/** Set the solar radiation pressure area.
* @param solarRadArea the area to be set
*/
void setSolarRadArea(final double solarRadArea) {
this.solarRadArea = solarRadArea;
}
/** Get the solar radiation pressure coefficient.
* @return the solar radiation pressure coefficient
*/
public double getSolarRadCoeff() {
return solarRadCoeff;
}
/** Get the solar radiation pressure coefficient.
* @param solarRadCoeff the coefficient to be set
*/
void setSolarRadCoeff(final double solarRadCoeff) {
this.solarRadCoeff = solarRadCoeff;
}
/** Get the drag area.
* @return the drag area
*/
public double getDragArea() {
return dragArea;
}
/** Set the drag area.
* @param dragArea the area to be set
*/
void setDragArea(final double dragArea) {
this.dragArea = dragArea;
}
/** Get the drag coefficient.
* @return the drag coefficient
*/
public double getDragCoeff() {
return dragCoeff;
}
/** Set the drag coefficient.
* @param dragCoeff the coefficient to be set
*/
void setDragCoeff(final double dragCoeff) {
this.dragCoeff = dragCoeff;
}
/** Get coordinate system for covariance matrix, for Local Orbital Frames.
* <p>
* The value returned is null if the covariance matrix is given in an
* absolute frame rather than a Local Orbital Frame. In this case, the
* method {@link #getCovRefFrame()} must be used instead.
* </p>
* @return the coordinate system for covariance matrix, or null if the
* covariance matrix is given in an absolute frame rather than a Local
* Orbital Frame
*/
public LOFType getCovRefLofType() {
return covRefLofType;
}
/** Set coordinate system for covariance matrix, for Local Orbital Frames.
* @param covRefLofType the coordinate system to be set
*/
void setCovRefLofType(final LOFType covRefLofType) {
this.covRefLofType = covRefLofType;
this.covRefFrame = null;
}
/** Get coordinate system for covariance matrix, for absolute frames.
* <p>
* The value returned is null if the covariance matrix is given in a
* Local Orbital Frame rather than an absolute frame. In this case, the
* method {@link #getCovRefLofType()} must be used instead.
* </p>
* @return the coordinate system for covariance matrix
*/
public Frame getCovRefFrame() {
return covRefFrame;
}
/** Set coordinate system for covariance matrix.
* @param covRefFrame the coordinate system to be set
*/
void setCovRefFrame(final Frame covRefFrame) {
this.covRefLofType = null;
this.covRefFrame = covRefFrame;
}
/** Get the Position/Velocity covariance matrix.
* @return the Position/Velocity covariance matrix
*/
public RealMatrix getCovarianceMatrix() {
return covarianceMatrix;
}
/** Set an entry in the Position/Velocity covariance matrix.
* <p>
* Both m(j, k) and m(k, j) are set.
* </p>
* @param j row index (must be between 0 and 5 (inclusive)
* @param k column index (must be between 0 and 5 (inclusive)
* @param entry value of the matrix entry
*/
void setCovarianceMatrixEntry(final int j, final int k, final double entry) {
covarianceMatrix.setEntry(j, k, entry);
covarianceMatrix.setEntry(k, j, entry);
}
/** Get the map of user defined parameter keywords and their corresponding values.
* @return the map of user defined parameter keywords and their corresponding values.
*/
public Map<String, String> getUserDefinedParameters() {
return userDefinedParameters;
}
/** Add a pair keyword-value in the map of user defined parameter keywords and their corresponding values.
* @param keyword the user defined parameter keyword to be set. Starts with USER_DEFINED_
* @param value the user defined parameter value to be set
*/
void setUserDefinedParameters(final String keyword,
final String value) {
userDefinedParameters.put(keyword, value);
}
/** Check whether the OPM contains Keplerian elements data.
* @return true if OPM contains Keplerian elements data.
*/
public boolean hasKeplerianElements() {
return hasKeplerianElements;
}
/** Set boolean testing whether the OPM contains Keplerian elements data.
* @param hasKeplerianElements the boolean to be set.
*/
void setHasKeplerianElements(final boolean hasKeplerianElements) {
this.hasKeplerianElements = hasKeplerianElements;
}
/** Check whether the OPM contains covariance matrix data.
* @return true if OPM contains covariance matrix data.
*/
public boolean hasCovarianceMatrix() {
return covarianceMatrix != null;
}
/** Create a covariance matrix, initialized to zero.
*/
void createCovarianceMatrix() {
covarianceMatrix = MatrixUtils.createRealMatrix(6, 6);
}
/** Get the comment for epoch.
* @return comment for epoch
*/
public List<String> getEpochComment() {
return Collections.unmodifiableList(epochComment);
}
/** Set the comment for epoch.
* @param comment comment to set
*/
void setEpochComment(final List<String> comment) {
epochComment = new ArrayList<String>(comment);
}
/** Get the comment for Keplerian elements.
* @return comment for Keplerian elements
*/
public List<String> getKeplerianElementsComment() {
return Collections.unmodifiableList(keplerianElementsComment);
}
/** Set the comment for Keplerian elements.
* @param comment comment to set
*/
void setKeplerianElementsComment(final List<String> comment) {
keplerianElementsComment = new ArrayList<String>(comment);
}
/** Get the comment for spacecraft.
* @return comment for spacecraft
*/
public List<String> getSpacecraftComment() {
return Collections.unmodifiableList(spacecraftComment);
}
/** Set the comment for spacecraft.
* @param comment comment to set
*/
void setSpacecraftComment(final List<String> comment) {
spacecraftComment = new ArrayList<String>(comment);
}
/** Get the comment for covariance.
* @return comment for covariance
*/
public List<String> getCovarianceComment() {
return Collections.unmodifiableList(covarianceComment);
}
/** Set the comment for covariance.
* @param comment comment to set
*/
void setCovarianceComment(final List<String> comment) {
covarianceComment = new ArrayList<String>(comment);
}
/** Get the meta data.
* @return meta data
*/
public abstract ODMMetaData getMetaData();
}