OrbitDeterminationWriter.java

  1. /* Copyright 2002-2025 CS GROUP
  2.  * Licensed to CS GROUP (CS) under one or more
  3.  * contributor license agreements.  See the NOTICE file distributed with
  4.  * this work for additional information regarding copyright ownership.
  5.  * CS licenses this file to You under the Apache License, Version 2.0
  6.  * (the "License"); you may not use this file except in compliance with
  7.  * the License.  You may obtain a copy of the License at
  8.  *
  9.  *   http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */

  17. package org.orekit.files.ccsds.ndm.odm.ocm;

  18. import java.io.IOException;

  19. import org.orekit.files.ccsds.definitions.TimeConverter;
  20. import org.orekit.files.ccsds.definitions.Units;
  21. import org.orekit.files.ccsds.section.AbstractWriter;
  22. import org.orekit.files.ccsds.utils.generation.Generator;
  23. import org.orekit.utils.units.Unit;

  24. /** Writer for orbit determination data.
  25.  * @author Luc Maisonobe
  26.  * @since 11.0
  27.  */
  28. class OrbitDeterminationWriter extends AbstractWriter {

  29.     /** Orbit determination block. */
  30.     private final OrbitDetermination od;

  31.     /** Converter for dates. */
  32.     private final TimeConverter timeConverter;

  33.     /** Create a writer.
  34.      * @param orbitDetermination orbit determination to write
  35.      * @param timeConverter converter for dates
  36.      */
  37.     OrbitDeterminationWriter(final OrbitDetermination orbitDetermination,
  38.                              final TimeConverter timeConverter) {
  39.         super(OcmDataSubStructureKey.od.name(), OcmDataSubStructureKey.OD.name());
  40.         this.od            = orbitDetermination;
  41.         this.timeConverter = timeConverter;
  42.     }

  43.     /** {@inheritDoc} */
  44.     @Override
  45.     protected void writeContent(final Generator generator) throws IOException {

  46.         // orbit determination block
  47.         generator.writeComments(od.getComments());

  48.         // identifiers
  49.         generator.writeEntry(OrbitDeterminationKey.OD_ID.name(),      od.getId(),     null, false);
  50.         generator.writeEntry(OrbitDeterminationKey.OD_PREV_ID.name(), od.getPrevId(), null, false);
  51.         if (od.getMethod() != null) {
  52.             final StringBuilder builder = new StringBuilder();
  53.             builder.append(od.getMethod().getName());
  54.             if (od.getMethod().getTool() != null) {
  55.                 builder.append(':');
  56.                 builder.append(od.getMethod().getTool());
  57.             }
  58.             generator.writeEntry(OrbitDeterminationKey.OD_METHOD.name(),  builder.toString(), null, false);
  59.         }

  60.         // time
  61.         generator.writeEntry(OrbitDeterminationKey.OD_EPOCH.name(),             timeConverter, od.getEpoch(),                false, false);
  62.         generator.writeEntry(OrbitDeterminationKey.DAYS_SINCE_FIRST_OBS.name(), od.getTimeSinceFirstObservation(), Unit.DAY, false);
  63.         generator.writeEntry(OrbitDeterminationKey.DAYS_SINCE_LAST_OBS.name(),  od.getTimeSinceLastObservation(), Unit.DAY,  false);
  64.         generator.writeEntry(OrbitDeterminationKey.RECOMMENDED_OD_SPAN.name(),  od.getRecommendedOdSpan(), Unit.DAY,         false);
  65.         generator.writeEntry(OrbitDeterminationKey.ACTUAL_OD_SPAN.name(),       od.getActualOdSpan(), Unit.DAY,              false);

  66.         // counters
  67.         generator.writeEntry(OrbitDeterminationKey.OBS_AVAILABLE.name(),    od.getObsAvailable(),            false);
  68.         generator.writeEntry(OrbitDeterminationKey.OBS_USED.name(),         od.getObsUsed(),                 false);
  69.         generator.writeEntry(OrbitDeterminationKey.TRACKS_AVAILABLE.name(), od.getTracksAvailable(),         false);
  70.         generator.writeEntry(OrbitDeterminationKey.TRACKS_USED.name(),      od.getTracksUsed(),              false);
  71.         generator.writeEntry(OrbitDeterminationKey.MAXIMUM_OBS_GAP.name(),  od.getMaximumObsGap(), Unit.DAY, false);

  72.         // errors
  73.         generator.writeEntry(OrbitDeterminationKey.OD_EPOCH_EIGMAJ.name(),    od.getEpochEigenMaj(), Unit.METRE,        false);
  74.         generator.writeEntry(OrbitDeterminationKey.OD_EPOCH_EIGINT.name(),    od.getEpochEigenInt(), Unit.METRE,        false);
  75.         generator.writeEntry(OrbitDeterminationKey.OD_EPOCH_EIGMIN.name(),    od.getEpochEigenMin(), Unit.METRE,        false);
  76.         generator.writeEntry(OrbitDeterminationKey.OD_MAX_PRED_EIGMAJ.name(), od.getMaxPredictedEigenMaj(), Unit.METRE, false);
  77.         generator.writeEntry(OrbitDeterminationKey.OD_MIN_PRED_EIGMIN.name(), od.getMinPredictedEigenMin(), Unit.METRE, false);
  78.         generator.writeEntry(OrbitDeterminationKey.OD_CONFIDENCE.name(),      od.getConfidence(), Unit.PERCENT,         false);
  79.         generator.writeEntry(OrbitDeterminationKey.GDOP.name(),               od.getGdop(), Unit.ONE,                   false);

  80.         // parameters
  81.         generator.writeEntry(OrbitDeterminationKey.SOLVE_N.name(),         od.getSolveN(),               false);
  82.         generator.writeEntry(OrbitDeterminationKey.SOLVE_STATES.name(),    od.getSolveStates(),          false);
  83.         generator.writeEntry(OrbitDeterminationKey.CONSIDER_N.name(),      od.getConsiderN(),            false);
  84.         generator.writeEntry(OrbitDeterminationKey.CONSIDER_PARAMS.name(), od.getConsiderParameters(),   false);
  85.         generator.writeEntry(OrbitDeterminationKey.SEDR.name(),            od.getSedr(), Units.W_PER_KG, false);
  86.         generator.writeEntry(OrbitDeterminationKey.SENSORS_N.name(),       od.getSensorsN(),             false);
  87.         generator.writeEntry(OrbitDeterminationKey.SENSORS.name(),         od.getSensors(),              false);

  88.         // observations
  89.         generator.writeEntry(OrbitDeterminationKey.WEIGHTED_RMS.name(),  od.getWeightedRms(), Unit.ONE, false);
  90.         generator.writeEntry(OrbitDeterminationKey.DATA_TYPES.name(),    od.getDataTypes(),             false);

  91.     }

  92. }