SinexEopEntry.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.sinex;

import org.orekit.frames.EOPEntry;
import org.orekit.frames.ITRFVersion;
import org.orekit.time.AbsoluteDate;
import org.orekit.time.TimeScale;
import org.orekit.time.TimeStamped;
import org.orekit.utils.IERSConventions;

/**
 * Container for EOP entry read in a Sinex file.
 *
 * @author Bryan Cazabonne
 * @since 11.2
 */
public class SinexEopEntry implements TimeStamped {

    /** Length of day (seconds). */
    private double lod;

    /** UT1-UTC (seconds). */
    private double ut1MinusUtc;

    /** X polar motion (radians). */
    private double xPo;

    /** Y polar motion (radians). */
    private double yPo;

    /** Nutation correction in longitude (radians). */
    private double nutLn;

    /** Nutation correction in obliquity (radians). */
    private double nutOb;

    /** Nutation correction X (radians). */
    private double nutX;

    /** Nutation correction Y (radians). */
    private double nutY;

    /** EOP entry reference epoch. */
    private final AbsoluteDate epoch;

    /**
     * Constructor.
     * @param epoch epoch of the data
     */
    public SinexEopEntry(final AbsoluteDate epoch) {
        this.epoch = epoch;
    }

    /** {@inheritDoc} */
    @Override
    public AbsoluteDate getDate() {
        return epoch;
    }

    /**
     * Get the length of day.
     * @return the length of day in seconds
     */
    public double getLod() {
        return lod;
    }

    /**
     * Set the length of day.
     * @param lod the length of day to set in seconds
     */
    public void setLod(final double lod) {
        this.lod = lod;
    }

    /**
     * Get the UT1-UTC offset.
     * @return the UT1-UTC offset in seconds
     */
    public double getUt1MinusUtc() {
        return ut1MinusUtc;
    }

    /**
     * Set the UT1-UTC offset.
     * @param ut1MinusUtc the value to set in seconds
     */
    public void setUt1MinusUtc(final double ut1MinusUtc) {
        this.ut1MinusUtc = ut1MinusUtc;
    }

    /**
     * Get the X polar motion.
     * @return the X polar motion in radians
     */
    public double getXPo() {
        return xPo;
    }

    /**
     * Set the X polar motion.
     * @param xPo the X polar motion to set in radians
     */
    public void setxPo(final double xPo) {
        this.xPo = xPo;
    }

    /**
     * Get the Y polar motion.
     * @return the Y polar motion in radians
     */
    public double getYPo() {
        return yPo;
    }

    /**
     * Set the Y polar motion.
     * @param yPo the Y polar motion to set in radians
     */
    public void setyPo(final double yPo) {
        this.yPo = yPo;
    }

    /**
     * Get the nutation correction in longitude.
     * @return the nutation correction in longitude in radians
     */
    public double getNutLn() {
        return nutLn;
    }

    /**
     * Set the nutation correction in longitude.
     * @param nutLn the nutation correction in longitude to set in radians
     */
    public void setNutLn(final double nutLn) {
        this.nutLn = nutLn;
    }

    /**
     * Get the nutation correction in obliquity.
     * @return the nutation correction in obliquity in radians
     */
    public double getNutOb() {
        return nutOb;
    }

    /**
     * Set the nutation correction in obliquity.
     * @param nutOb the nutation correction in obliquity to set in radians
     */
    public void setNutOb(final double nutOb) {
        this.nutOb = nutOb;
    }

    /**
     * Get the nutation correction X.
     * @return the nutation correction X in radians
     */
    public double getNutX() {
        return nutX;
    }

    /**
     * Set the nutation correction X.
     * @param nutX the nutation correction X to set in radians
     */
    public void setNutX(final double nutX) {
        this.nutX = nutX;
    }

    /**
     * Get the nutation correction Y.
     * @return the nutation correction Y in radians
     */
    public double getNutY() {
        return nutY;
    }

    /**
     * Set the nutation correction Y.
     * @param nutY the nutation correction Y to set in radians
     */
    public void setNutY(final double nutY) {
        this.nutY = nutY;
    }

    /**
     * Converts to an {@link EOPEntry}.
     * @param converter converter to use for nutation corrections
     * @param version ITRF version
     * @param scale time scale for epochs
     * @return an {@code EOPEntry}
     */
    public EOPEntry toEopEntry(final IERSConventions.NutationCorrectionConverter converter,
                               final ITRFVersion version, final TimeScale scale) {

        // Modified Julian Day
        final int mjd = epoch.getComponents(scale).getDate().getMJD();

        // Array for equinox and non rotating origin
        final double[] nro     = (nutX != 0  && nutY != 0)  ? new double[] {nutX, nutY}   : converter.toNonRotating(epoch, nutLn, nutOb);
        final double[] equinox = (nutLn != 0 && nutOb != 0) ? new double[] {nutLn, nutOb} : converter.toEquinox(epoch, nutX, nutY);

        // Create a new EOPEntry object storing the extracted data, then add it to the list of EOPEntries.
        return new EOPEntry(mjd, ut1MinusUtc, lod,
                            xPo, yPo, Double.NaN, Double.NaN,
                            equinox[0], equinox[1],
                            nro[0], nro[1],
                            version, epoch);

    }

    /** Copy an EOP entry to another epoch.
     * <p>
     * Only the data epoch is updated.
     * </p>
     * @param date new epoch
     * @return a new entry with changed epoch
     */
    SinexEopEntry toNewEpoch(final AbsoluteDate date) {

        // Initialize
        final SinexEopEntry newEntry = new SinexEopEntry(date);

        // Fill
        newEntry.setLod(getLod());
        newEntry.setUt1MinusUtc(getUt1MinusUtc());
        newEntry.setxPo(getXPo());
        newEntry.setyPo(getYPo());
        newEntry.setNutX(getNutX());
        newEntry.setNutY(getNutY());
        newEntry.setNutLn(getNutLn());
        newEntry.setNutOb(getNutOb());

        // Return
        return newEntry;

    }

}