LazyLoadedFrames.java
/* Contributed in the public domain.
* 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.frames;
import org.orekit.bodies.CelestialBodies;
import org.orekit.time.TimeScales;
import org.orekit.utils.IERSConventions;
/**
* This class lazily loads auxiliary data when it is needed by a requested frame. It is
* designed to match the behavior of {@link FramesFactory} in Orekit 10.0.
*
* @author Guylaine Prat
* @author Luc Maisonobe
* @author Pascal Parraud
* @author Evan Ward
* @see LazyLoadedEop
* @since 10.1
*/
public class LazyLoadedFrames extends AbstractFrames {
/** Delegate for all EOP loading. */
private final LazyLoadedEop lazyLoadedEop;
/**
* Create a collection of frames from the given auxiliary data.
*
* @param lazyLoadedEop loads Earth Orientation Parameters.
* @param timeScales defines the time scales used when computing frame
* transformations. For example, the TT time scale needed for
* {@link #getPZ9011(IERSConventions, boolean)}.
* @param celestialBodies defines the celestial bodies which, for example, are used in
* {@link #getICRF()}.
*/
public LazyLoadedFrames(final LazyLoadedEop lazyLoadedEop,
final TimeScales timeScales,
final CelestialBodies celestialBodies) {
super(timeScales, () -> celestialBodies.getSolarSystemBarycenter()
.getInertiallyOrientedFrame());
this.lazyLoadedEop = lazyLoadedEop;
}
/** Add the default loaders EOP history (IAU 1980 precession/nutation).
* <p>
* The default loaders look for IERS EOP C04 and bulletins B files. They
* correspond to {@link IERSConventions#IERS_1996 IERS 1996} conventions.
* </p>
* @param rapidDataColumnsSupportedNames regular expression for supported
* rapid data columns EOP files names
* (may be null if the default IERS file names are used)
* @param rapidDataXMLSupportedNames regular expression for supported
* rapid data XML EOP files names
* (may be null if the default IERS file names are used)
* @param eopC04SupportedNames regular expression for supported EOP C04 files names
* (may be null if the default IERS file names are used)
* @param bulletinBSupportedNames regular expression for supported bulletin B files names
* (may be null if the default IERS file names are used)
* @param bulletinASupportedNames regular expression for supported bulletin A files names
* (may be null if the default IERS file names are used)
* @see <a href="http://hpiers.obspm.fr/eoppc/eop/eopc04/">IERS EOP C04 files</a>
* @see #addEOPHistoryLoader(IERSConventions, EOPHistoryLoader)
* @see #clearEOPHistoryLoaders()
* @see #addDefaultEOP2000HistoryLoaders(String, String, String, String, String)
*/
public void addDefaultEOP1980HistoryLoaders(final String rapidDataColumnsSupportedNames,
final String rapidDataXMLSupportedNames,
final String eopC04SupportedNames,
final String bulletinBSupportedNames,
final String bulletinASupportedNames) {
lazyLoadedEop.addDefaultEOP1980HistoryLoaders(
rapidDataColumnsSupportedNames,
rapidDataXMLSupportedNames,
eopC04SupportedNames,
bulletinBSupportedNames,
bulletinASupportedNames,
() -> getTimeScales().getUTC());
}
/** Add the default loaders for EOP history (IAU 2000/2006 precession/nutation).
* <p>
* The default loaders look for IERS EOP C04 and bulletins B files. They
* correspond to both {@link IERSConventions#IERS_2003 IERS 2003} and {@link
* IERSConventions#IERS_2010 IERS 2010} conventions.
* </p>
* @param rapidDataColumnsSupportedNames regular expression for supported
* rapid data columns EOP files names
* (may be null if the default IERS file names are used)
* @param rapidDataXMLSupportedNames regular expression for supported
* rapid data XML EOP files names
* (may be null if the default IERS file names are used)
* @param eopC04SupportedNames regular expression for supported EOP C04 files names
* (may be null if the default IERS file names are used)
* @param bulletinBSupportedNames regular expression for supported bulletin B files names
* (may be null if the default IERS file names are used)
* @param bulletinASupportedNames regular expression for supported bulletin A files names
* (may be null if the default IERS file names are used)
* @see <a href="http://hpiers.obspm.fr/eoppc/eop/eopc04/">IERS EOP C04 files</a>
* @see #addEOPHistoryLoader(IERSConventions, EOPHistoryLoader)
* @see #clearEOPHistoryLoaders()
* @see #addDefaultEOP1980HistoryLoaders(String, String, String, String, String)
*/
public void addDefaultEOP2000HistoryLoaders(final String rapidDataColumnsSupportedNames,
final String rapidDataXMLSupportedNames,
final String eopC04SupportedNames,
final String bulletinBSupportedNames,
final String bulletinASupportedNames) {
lazyLoadedEop.addDefaultEOP2000HistoryLoaders(
rapidDataColumnsSupportedNames,
rapidDataXMLSupportedNames,
eopC04SupportedNames,
bulletinBSupportedNames,
bulletinASupportedNames,
() -> getTimeScales().getUTC());
}
/** Add a loader for Earth Orientation Parameters history.
* @param conventions IERS conventions to which EOP history applies
* @param loader custom loader to add for the EOP history
* @see #addDefaultEOP1980HistoryLoaders(String, String, String, String, String)
* @see #clearEOPHistoryLoaders()
*/
public void addEOPHistoryLoader(final IERSConventions conventions, final EOPHistoryLoader loader) {
lazyLoadedEop.addEOPHistoryLoader(conventions, loader);
}
/** Clear loaders for Earth Orientation Parameters history.
* @see #addEOPHistoryLoader(IERSConventions, EOPHistoryLoader)
* @see #addDefaultEOP1980HistoryLoaders(String, String, String, String, String)
*/
public void clearEOPHistoryLoaders() {
lazyLoadedEop.clearEOPHistoryLoaders();
}
/** Set the threshold to check EOP continuity.
* <p>
* The default threshold (used if this method is never called)
* is 5 Julian days. If after loading EOP entries some holes
* between entries exceed this threshold, an exception will
* be triggered.
* </p>
* <p>
* One case when calling this method is really useful is for
* applications that use a single Bulletin A, as these bulletins
* have a roughly one month wide hole for the first bulletin of
* each month, which contains older final data in addition to the
* rapid data and the predicted data.
* </p>
* @param threshold threshold to use for checking EOP continuity (in seconds)
*/
public void setEOPContinuityThreshold(final double threshold) {
lazyLoadedEop.setEOPContinuityThreshold(threshold);
}
/** {@inheritDoc}
* <p>
* If no {@link EOPHistoryLoader} has been added by calling {@link
* #addEOPHistoryLoader(IERSConventions, EOPHistoryLoader) addEOPHistoryLoader}
* or if {@link #clearEOPHistoryLoaders() clearEOPHistoryLoaders} has been
* called afterwards, the {@link #addDefaultEOP1980HistoryLoaders(String, String,
* String, String, String)} and {@link #addDefaultEOP2000HistoryLoaders(String,
* String, String, String, String)} methods will be called automatically with
* supported file names parameters all set to null, in order to get the default
* loaders configuration.
* </p>
*/
@Override
public EOPHistory getEOPHistory(final IERSConventions conventions, final boolean simpleEOP) {
return lazyLoadedEop.getEOPHistory(conventions, simpleEOP, getTimeScales());
}
}