PerturbationsKey.java
- /* Copyright 2002-2025 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.ocm;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- import org.orekit.files.ccsds.definitions.Units;
- import org.orekit.files.ccsds.utils.ContextBinding;
- import org.orekit.files.ccsds.utils.lexical.ParseToken;
- import org.orekit.files.ccsds.utils.lexical.TokenType;
- import org.orekit.utils.units.Unit;
- /** Keys for {@link Perturbations perturbations data} entries.
- * @author Luc Maisonobe
- * @since 11.0
- */
- public enum PerturbationsKey {
- /** Comment entry. */
- COMMENT((token, context, container) ->
- token.getType() == TokenType.ENTRY ? container.addComment(token.getContentAsNormalizedString()) : true),
- /** Name of atmospheric model. */
- ATMOSPHERIC_MODEL((token, context, container) -> token.processAsFreeTextString(container::setAtmosphericModel)),
- /** Gravity model. */
- GRAVITY_MODEL(new GravityProcessor()),
- /** Oblate spheroid equatorial radius of central body. */
- EQUATORIAL_RADIUS((token, context, container) -> token.processAsDouble(Unit.KILOMETRE, context.getParsedUnitsBehavior(),
- container::setEquatorialRadius)),
- /** Central body oblate spheroid oblateness. */
- GM((token, context, container) -> token.processAsDouble(Units.KM3_PER_S2, context.getParsedUnitsBehavior(),
- container::setGm)),
- /** N-body perturbation bodies. */
- N_BODY_PERTURBATIONS((token, context, container) -> token.processAsCenterList(container::setNBodyPerturbations,
- context.getDataContext().getCelestialBodies())),
- /** Central body angular rotation rate. */
- CENTRAL_BODY_ROTATION((token, context, container) -> token.processAsDouble(Units.DEG_PER_S, context.getParsedUnitsBehavior(),
- container::setCentralBodyRotation)),
- /** Central body oblate spheroid oblateness. */
- OBLATE_FLATTENING((token, context, container) -> token.processAsDouble(Unit.ONE, context.getParsedUnitsBehavior(),
- container::setOblateFlattening)),
- /** Ocean tides model. */
- OCEAN_TIDES_MODEL((token, context, container) -> token.processAsFreeTextString(container::setOceanTidesModel)),
- /** Solid tides model. */
- SOLID_TIDES_MODEL((token, context, container) -> token.processAsFreeTextString(container::setSolidTidesModel)),
- /** Reduction theory used for precession and nutation modeling. */
- REDUCTION_THEORY((token, context, container) -> token.processAsFreeTextString(container::setReductionTheory)),
- /** Albedo model. */
- ALBEDO_MODEL((token, context, container) -> token.processAsFreeTextString(container::setAlbedoModel)),
- /** Albedo grid size. */
- ALBEDO_GRID_SIZE((token, context, container) -> token.processAsInteger(container::setAlbedoGridSize)),
- /** Shadow model used for solar radiation pressure. */
- SHADOW_MODEL((token, context, container) -> token.processAsEnum(ShadowModel.class, container::setShadowModel)),
- /** Names of shadow bodies. */
- SHADOW_BODIES((token, context, container) -> token.processAsCenterList(container::setShadowBodies,
- context.getDataContext().getCelestialBodies())),
- /** Solar Radiation Pressure model. */
- SRP_MODEL((token, context, container) -> token.processAsFreeTextString(container::setSrpModel)),
- /** Space Weather data source. */
- SW_DATA_SOURCE((token, context, container) -> token.processAsFreeTextString(container::setSpaceWeatherSource)),
- /** Epoch of the Space Weather data. */
- SW_DATA_EPOCH((token, context, container) -> token.processAsDate(container::setSpaceWeatherEpoch, context)),
- /** Interpolation method for Space Weather data. */
- SW_INTERP_METHOD((token, context, container) -> token.processAsFreeTextString(container::setInterpMethodSW)),
- /** Fixed (time invariant) value of the planetary 3-hour-range geomagnetic index Kₚ. */
- FIXED_GEOMAG_KP((token, context, container) -> token.processAsDouble(Units.NANO_TESLA, context.getParsedUnitsBehavior(),
- container::setFixedGeomagneticKp)),
- /** Fixed (time invariant) value of the planetary 3-hour-range geomagnetic index aₚ. */
- FIXED_GEOMAG_AP((token, context, container) -> token.processAsDouble(Units.NANO_TESLA, context.getParsedUnitsBehavior(),
- container::setFixedGeomagneticAp)),
- /** Fixed (time invariant) value of the planetary 1-hour-range geomagnetic index Dst. */
- FIXED_GEOMAG_DST((token, context, container) -> token.processAsDouble(Units.NANO_TESLA, context.getParsedUnitsBehavior(),
- container::setFixedGeomagneticDst)),
- /** Fixed (time invariant) value of the Solar Flux Unit daily proxy F10.7. */
- FIXED_F10P7((token, context, container) -> token.processAsDouble(Unit.SOLAR_FLUX_UNIT, context.getParsedUnitsBehavior(),
- container::setFixedF10P7)),
- /** Fixed (time invariant) value of the Solar Flux Unit 81-day running center-average proxy F10.7. */
- FIXED_F10P7_MEAN((token, context, container) -> token.processAsDouble(Unit.SOLAR_FLUX_UNIT, context.getParsedUnitsBehavior(),
- container::setFixedF10P7Mean)),
- /** Fixed (time invariant) value of the Solar Flux daily proxy M10.7. */
- FIXED_M10P7((token, context, container) -> token.processAsDouble(Unit.SOLAR_FLUX_UNIT, context.getParsedUnitsBehavior(),
- container::setFixedM10P7)),
- /** Fixed (time invariant) value of the Solar Flux 81-day running center-average proxy M10.7. */
- FIXED_M10P7_MEAN((token, context, container) -> token.processAsDouble(Unit.SOLAR_FLUX_UNIT, context.getParsedUnitsBehavior(),
- container::setFixedM10P7Mean)),
- /** Fixed (time invariant) value of the Solar Flux daily proxy S10.7. */
- FIXED_S10P7((token, context, container) -> token.processAsDouble(Unit.SOLAR_FLUX_UNIT, context.getParsedUnitsBehavior(),
- container::setFixedS10P7)),
- /** Fixed (time invariant) value of the Solar Flux 81-day running center-average proxy S10.7. */
- FIXED_S10P7_MEAN((token, context, container) -> token.processAsDouble(Unit.SOLAR_FLUX_UNIT, context.getParsedUnitsBehavior(),
- container::setFixedS10P7Mean)),
- /** Fixed (time invariant) value of the Solar Flux daily proxy Y10.7. */
- FIXED_Y10P7((token, context, container) -> token.processAsDouble(Unit.SOLAR_FLUX_UNIT, context.getParsedUnitsBehavior(),
- container::setFixedY10P7)),
- /** Fixed (time invariant) value of the Solar Flux 81-day running center-average proxy Y10.7. */
- FIXED_Y10P7_MEAN((token, context, container) -> token.processAsDouble(Unit.SOLAR_FLUX_UNIT, context.getParsedUnitsBehavior(),
- container::setFixedY10P7Mean));
- /** Processing method. */
- private final transient TokenProcessor processor;
- /** Simple constructor.
- * @param processor processing method
- */
- PerturbationsKey(final TokenProcessor processor) {
- this.processor = processor;
- }
- /** Process an token.
- * @param token token to process
- * @param context context binding
- * @param container container to fill
- * @return true of token was accepted
- */
- public boolean process(final ParseToken token, final ContextBinding context, final Perturbations container) {
- return processor.process(token, context, container);
- }
- /** Interface for processing one token. */
- interface TokenProcessor {
- /** Process one token.
- * @param token token to process
- * @param context context binding
- * @param container container to fill
- * @return true of token was accepted
- */
- boolean process(ParseToken token, ContextBinding context, Perturbations container);
- }
- /** Dedicated processor for gravity field. */
- private static class GravityProcessor implements TokenProcessor {
- /** Pattern for splitting gravity specification. */
- private static final Pattern GRAVITY_PATTERN =
- Pattern.compile("^\\p{Blank}*([-_A-Za-z0-9]+)\\p{Blank}*:" +
- "\\p{Blank}*([0-9]+)D" +
- "\\p{Blank}*([0-9]+)O" +
- "\\p{Blank}*$");
- /** {@inheritDoc} */
- @Override
- public boolean process(final ParseToken token, final ContextBinding context, final Perturbations container) {
- if (token.getType() == TokenType.ENTRY) {
- final Matcher matcher = GRAVITY_PATTERN.matcher(token.getRawContent());
- if (!matcher.matches()) {
- throw token.generateException(null);
- }
- container.setGravityModel(matcher.group(1),
- Integer.parseInt(matcher.group(2)),
- Integer.parseInt(matcher.group(3)));
- }
- return true;
- }
- }
- }