OpmData.java

/* Copyright 2002-2024 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.ndm.odm.opm;

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

import org.orekit.files.ccsds.ndm.odm.CartesianCovariance;
import org.orekit.files.ccsds.ndm.odm.KeplerianElements;
import org.orekit.files.ccsds.ndm.odm.KeplerianElementsKey;
import org.orekit.files.ccsds.ndm.odm.SpacecraftParameters;
import org.orekit.files.ccsds.ndm.odm.StateVector;
import org.orekit.files.ccsds.ndm.odm.UserDefined;
import org.orekit.files.ccsds.section.Data;

/**
 * Container for Orbit Parameter Message data.
 * @author Luc Maisonobe
 * @since 11.0
 */
public class OpmData implements Data {

    /** State vector block. */
    private final  StateVector stateVectorBlock;

    /** Keplerian elements block. */
    private final KeplerianElements keplerianElementsBlock;

    /** Spacecraft parameters block. */
    private final SpacecraftParameters spacecraftParametersBlock;

    /** Covariance matrix logical block being read. */
    private final CartesianCovariance covarianceBlock;

    /** Maneuvers. */
    private final List<Maneuver> maneuverBlocks;

    /** User defined parameters. */
    private final UserDefined userDefinedBlock;

    /** Mass. */
    private final double mass;

    /** Simple constructor.
     * @param stateVectorBlock state vector logical block
     * @param keplerianElementsBlock Keplerian elements logical block (may be null)
     * @param spacecraftParametersBlock spacecraft parameters logical block (may be null)
     * @param covarianceBlock covariance matrix logical block (may be null)
     * @param maneuverBlocks maneuvers block list
     * @param userDefinedBlock user-defined logical block
     * @param mass mass (always defined, even if there is no {@code spacecraftParameters} block
     */
    public OpmData(final StateVector stateVectorBlock,
                   final KeplerianElements keplerianElementsBlock,
                   final SpacecraftParameters spacecraftParametersBlock,
                   final CartesianCovariance covarianceBlock,
                   final List<Maneuver> maneuverBlocks,
                   final UserDefined userDefinedBlock,
                   final double mass) {
        this.stateVectorBlock          = stateVectorBlock;
        this.keplerianElementsBlock    = keplerianElementsBlock;
        this.spacecraftParametersBlock = spacecraftParametersBlock;
        this.covarianceBlock           = covarianceBlock;
        this.maneuverBlocks            = maneuverBlocks;
        this.userDefinedBlock          = userDefinedBlock;
        this.mass                      = mass;
    }

    /** {@inheritDoc} */
    @Override
    public void validate(final double version) {
        stateVectorBlock.validate(version);
        if (keplerianElementsBlock != null) {
            keplerianElementsBlock.validate(version);
            // in OPM, only semi-major axis is allowed, not mean motion
            keplerianElementsBlock.checkNotNaN(keplerianElementsBlock.getA(),
                                               KeplerianElementsKey.SEMI_MAJOR_AXIS.name());
        }
        if (spacecraftParametersBlock != null) {
            spacecraftParametersBlock.validate(version);
        }
        if (covarianceBlock != null) {
            covarianceBlock.setEpoch(stateVectorBlock.getEpoch());
            covarianceBlock.validate(version);
        }
        for (final Maneuver maneuver : maneuverBlocks) {
            maneuver.validate(version);
        }
        if (userDefinedBlock != null) {
            userDefinedBlock.validate(version);
        }
    }

    /** Get the state vector logical block.
     * @return state vector block
     */
    public StateVector getStateVectorBlock() {
        return stateVectorBlock;
    }

    /** Get the Keplerian elements logical block.
     * @return Keplerian elements block (may be null)
     */
    public KeplerianElements getKeplerianElementsBlock() {
        return keplerianElementsBlock;
    }

    /** Get the spacecraft parameters logical block.
     * @return spacecraft parameters block (may be null)
     */
    public SpacecraftParameters getSpacecraftParametersBlock() {
        return spacecraftParametersBlock;
    }

    /** Get the covariance matrix logical block.
     * @return covariance matrix block (may be null)
     */
    public CartesianCovariance getCovarianceBlock() {
        return covarianceBlock;
    }

    /** Get the mass.
     * @return mass
     */
    public double getMass() {
        return mass;
    }

    /**
     * Get the number of maneuvers present in the APM.
     * @return the number of maneuvers
     */
    public int getNbManeuvers() {
        return maneuverBlocks.size();
    }

    /**
     * Get a list of all maneuvers.
     * @return unmodifiable list of all maneuvers.
     */
    public List<Maneuver> getManeuvers() {
        return Collections.unmodifiableList(maneuverBlocks);
    }

    /**
     * Get a maneuver.
     * @param index maneuver index, counting from 0
     * @return maneuver
     */
    public Maneuver getManeuver(final int index) {
        return maneuverBlocks.get(index);
    }

    /**
     * Get boolean testing whether the APM contains at least one maneuver.
     * @return true if APM contains at least one maneuver
     *         false otherwise
     */
    public boolean hasManeuvers() {
        return !maneuverBlocks.isEmpty();
    }

    /** Get the user defined parameters logical block.
     * @return user defined parameters block (may be null)
     */
    public UserDefined getUserDefinedBlock() {
        return userDefinedBlock;
    }

}