KalmanEstimationCommon.java

  1. /* Copyright 2002-2024 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.estimation.sequential;

  18. import org.hipparchus.filtering.kalman.ProcessEstimate;
  19. import org.hipparchus.linear.ArrayRealVector;
  20. import org.hipparchus.linear.MatrixUtils;
  21. import org.hipparchus.linear.RealMatrix;
  22. import org.hipparchus.linear.RealVector;
  23. import org.orekit.estimation.measurements.EstimatedMeasurement;
  24. import org.orekit.propagation.Propagator;
  25. import org.orekit.propagation.SpacecraftState;
  26. import org.orekit.propagation.conversion.PropagatorBuilder;
  27. import org.orekit.time.AbsoluteDate;
  28. import org.orekit.utils.ParameterDriver;
  29. import org.orekit.utils.ParameterDriversList;
  30. import org.orekit.utils.ParameterDriversList.DelegatingDriver;

  31. import java.util.ArrayList;
  32. import java.util.Arrays;
  33. import java.util.Comparator;
  34. import java.util.HashMap;
  35. import java.util.List;
  36. import java.util.Map;

  37. /** Class defining the process model dynamics to use with a {@link KalmanEstimator}.
  38.  * @author Romain Gerbaud
  39.  * @author Maxime Journot
  40.  * @since 9.2
  41.  */
  42. class KalmanEstimationCommon implements KalmanEstimation {

  43.     /** Builders for propagators. */
  44.     private final List<PropagatorBuilder> builders;

  45.     /** Estimated orbital parameters. */
  46.     private final ParameterDriversList allEstimatedOrbitalParameters;

  47.     /** Estimated propagation drivers. */
  48.     private final ParameterDriversList allEstimatedPropagationParameters;

  49.     /** Per-builder estimated orbita parameters drivers.
  50.      * @since 11.1
  51.      */
  52.     private final ParameterDriversList[] estimatedOrbitalParameters;

  53.     /** Per-builder estimated propagation drivers. */
  54.     private final ParameterDriversList[] estimatedPropagationParameters;

  55.     /** Estimated measurements parameters. */
  56.     private final ParameterDriversList estimatedMeasurementsParameters;

  57.     /** Start columns for each estimated orbit. */
  58.     private final int[] orbitsStartColumns;

  59.     /** End columns for each estimated orbit. */
  60.     private final int[] orbitsEndColumns;

  61.     /** Map for propagation parameters columns. */
  62.     private final Map<String, Integer> propagationParameterColumns;

  63.     /** Map for measurements parameters columns. */
  64.     private final Map<String, Integer> measurementParameterColumns;

  65.     /** Providers for covariance matrices. */
  66.     private final List<CovarianceMatrixProvider> covarianceMatricesProviders;

  67.     /** Process noise matrix provider for measurement parameters. */
  68.     private final CovarianceMatrixProvider measurementProcessNoiseMatrix;

  69.     /** Indirection arrays to extract the noise components for estimated parameters. */
  70.     private final int[][] covarianceIndirection;

  71.     /** Scaling factors. */
  72.     private final double[] scale;

  73.     /** Current corrected estimate. */
  74.     private ProcessEstimate correctedEstimate;

  75.     /** Current number of measurement. */
  76.     private int currentMeasurementNumber;

  77.     /** Reference date. */
  78.     private final AbsoluteDate referenceDate;

  79.     /** Current date. */
  80.     private AbsoluteDate currentDate;

  81.     /** Predicted spacecraft states. */
  82.     private final SpacecraftState[] predictedSpacecraftStates;

  83.     /** Corrected spacecraft states. */
  84.     private final SpacecraftState[] correctedSpacecraftStates;

  85.     /** Predicted measurement. */
  86.     private EstimatedMeasurement<?> predictedMeasurement;

  87.     /** Corrected measurement. */
  88.     private EstimatedMeasurement<?> correctedMeasurement;

  89.     /** Kalman process model constructor.
  90.      * @param propagatorBuilders propagators builders used to evaluate the orbits.
  91.      * @param covarianceMatricesProviders providers for covariance matrices
  92.      * @param estimatedMeasurementParameters measurement parameters to estimate
  93.      * @param measurementProcessNoiseMatrix provider for measurement process noise matrix
  94.      */
  95.     protected KalmanEstimationCommon(final List<PropagatorBuilder> propagatorBuilders,
  96.                                      final List<CovarianceMatrixProvider> covarianceMatricesProviders,
  97.                                      final ParameterDriversList estimatedMeasurementParameters,
  98.                                      final CovarianceMatrixProvider measurementProcessNoiseMatrix) {

  99.         this.builders                        = propagatorBuilders;
  100.         this.estimatedMeasurementsParameters = estimatedMeasurementParameters;
  101.         this.measurementParameterColumns     = new HashMap<>(estimatedMeasurementsParameters.getDrivers().size());
  102.         this.currentMeasurementNumber        = 0;
  103.         this.referenceDate                   = propagatorBuilders.get(0).getInitialOrbitDate();
  104.         this.currentDate                     = referenceDate;

  105.         final Map<String, Integer> orbitalParameterColumns = new HashMap<>(6 * builders.size());
  106.         orbitsStartColumns      = new int[builders.size()];
  107.         orbitsEndColumns        = new int[builders.size()];
  108.         int columns = 0;
  109.         allEstimatedOrbitalParameters = new ParameterDriversList();
  110.         estimatedOrbitalParameters    = new ParameterDriversList[builders.size()];
  111.         for (int k = 0; k < builders.size(); ++k) {
  112.             estimatedOrbitalParameters[k] = new ParameterDriversList();
  113.             orbitsStartColumns[k] = columns;
  114.             final String suffix = propagatorBuilders.size() > 1 ? "[" + k + "]" : null;
  115.             for (final ParameterDriver driver : builders.get(k).getOrbitalParametersDrivers().getDrivers()) {
  116.                 if (driver.getReferenceDate() == null) {
  117.                     driver.setReferenceDate(currentDate);
  118.                 }
  119.                 if (suffix != null && !driver.getName().endsWith(suffix)) {
  120.                     // we add suffix only conditionally because the method may already have been called
  121.                     // and suffixes may have already been appended
  122.                     driver.setName(driver.getName() + suffix);
  123.                 }
  124.                 if (driver.isSelected()) {
  125.                     allEstimatedOrbitalParameters.add(driver);
  126.                     estimatedOrbitalParameters[k].add(driver);
  127.                     orbitalParameterColumns.put(driver.getName(), columns++);
  128.                 }
  129.             }
  130.             orbitsEndColumns[k] = columns;
  131.         }

  132.         // Gather all the propagation drivers names in a list
  133.         allEstimatedPropagationParameters = new ParameterDriversList();
  134.         estimatedPropagationParameters    = new ParameterDriversList[builders.size()];
  135.         final List<String> estimatedPropagationParametersNames = new ArrayList<>();
  136.         for (int k = 0; k < builders.size(); ++k) {
  137.             estimatedPropagationParameters[k] = new ParameterDriversList();
  138.             for (final ParameterDriver driver : builders.get(k).getPropagationParametersDrivers().getDrivers()) {
  139.                 if (driver.getReferenceDate() == null) {
  140.                     driver.setReferenceDate(currentDate);
  141.                 }
  142.                 if (driver.isSelected()) {
  143.                     allEstimatedPropagationParameters.add(driver);
  144.                     estimatedPropagationParameters[k].add(driver);
  145.                     final String driverName = driver.getName();
  146.                     // Add the driver name if it has not been added yet
  147.                     if (!estimatedPropagationParametersNames.contains(driverName)) {
  148.                         estimatedPropagationParametersNames.add(driverName);
  149.                     }
  150.                 }
  151.             }
  152.         }
  153.         estimatedPropagationParametersNames.sort(Comparator.naturalOrder());

  154.         // Populate the map of propagation drivers' columns and update the total number of columns
  155.         propagationParameterColumns = new HashMap<>(estimatedPropagationParametersNames.size());
  156.         for (final String driverName : estimatedPropagationParametersNames) {
  157.             propagationParameterColumns.put(driverName, columns);
  158.             ++columns;
  159.         }

  160.         // Populate the map of measurement drivers' columns and update the total number of columns
  161.         for (final ParameterDriver parameter : estimatedMeasurementsParameters.getDrivers()) {
  162.             if (parameter.getReferenceDate() == null) {
  163.                 parameter.setReferenceDate(currentDate);
  164.             }
  165.             measurementParameterColumns.put(parameter.getName(), columns);
  166.             ++columns;
  167.         }

  168.         // Store providers for process noise matrices
  169.         this.covarianceMatricesProviders = covarianceMatricesProviders;
  170.         this.measurementProcessNoiseMatrix = measurementProcessNoiseMatrix;
  171.         this.covarianceIndirection       = new int[builders.size()][columns];
  172.         for (int k = 0; k < covarianceIndirection.length; ++k) {
  173.             final ParameterDriversList orbitDrivers      = builders.get(k).getOrbitalParametersDrivers();
  174.             final ParameterDriversList parametersDrivers = builders.get(k).getPropagationParametersDrivers();
  175.             Arrays.fill(covarianceIndirection[k], -1);
  176.             int i = 0;
  177.             for (final ParameterDriver driver : orbitDrivers.getDrivers()) {
  178.                 final Integer c = orbitalParameterColumns.get(driver.getName());
  179.                 if (c != null) {
  180.                     covarianceIndirection[k][i++] = c;
  181.                 }
  182.             }
  183.             for (final ParameterDriver driver : parametersDrivers.getDrivers()) {
  184.                 final Integer c = propagationParameterColumns.get(driver.getName());
  185.                 if (c != null) {
  186.                     covarianceIndirection[k][i++] = c;
  187.                 }
  188.             }
  189.             for (final ParameterDriver driver : estimatedMeasurementParameters.getDrivers()) {
  190.                 final Integer c = measurementParameterColumns.get(driver.getName());
  191.                 if (c != null) {
  192.                     covarianceIndirection[k][i++] = c;
  193.                 }
  194.             }
  195.         }

  196.         // Compute the scale factors
  197.         this.scale = new double[columns];
  198.         int index = 0;
  199.         for (final ParameterDriver driver : allEstimatedOrbitalParameters.getDrivers()) {
  200.             scale[index++] = driver.getScale();
  201.         }
  202.         for (final ParameterDriver driver : allEstimatedPropagationParameters.getDrivers()) {
  203.             scale[index++] = driver.getScale();
  204.         }
  205.         for (final ParameterDriver driver : estimatedMeasurementsParameters.getDrivers()) {
  206.             scale[index++] = driver.getScale();
  207.         }

  208.         // Populate predicted and corrected states
  209.         this.predictedSpacecraftStates = new SpacecraftState[builders.size()];
  210.         for (int i = 0; i < builders.size(); ++i) {
  211.             predictedSpacecraftStates[i] = builders.get(i).buildPropagator().getInitialState();
  212.         }
  213.         this.correctedSpacecraftStates = predictedSpacecraftStates.clone();

  214.         // Initialize the estimated normalized state and fill its values
  215.         final RealVector correctedState      = MatrixUtils.createRealVector(columns);

  216.         int p = 0;
  217.         for (final ParameterDriver driver : allEstimatedOrbitalParameters.getDrivers()) {
  218.             correctedState.setEntry(p++, driver.getNormalizedValue());
  219.         }
  220.         for (final ParameterDriver driver : allEstimatedPropagationParameters.getDrivers()) {
  221.             correctedState.setEntry(p++, driver.getNormalizedValue());
  222.         }
  223.         for (final ParameterDriver driver : estimatedMeasurementsParameters.getDrivers()) {
  224.             correctedState.setEntry(p++, driver.getNormalizedValue());
  225.         }

  226.         // Set up initial covariance
  227.         final RealMatrix physicalProcessNoise = MatrixUtils.createRealMatrix(columns, columns);
  228.         for (int k = 0; k < covarianceMatricesProviders.size(); ++k) {

  229.             // Number of estimated measurement parameters
  230.             final int nbMeas = estimatedMeasurementParameters.getNbParams();

  231.             // Number of estimated dynamic parameters (orbital + propagation)
  232.             final int nbDyn  = orbitsEndColumns[k] - orbitsStartColumns[k] +
  233.                     estimatedPropagationParameters[k].getNbParams();

  234.             // Covariance matrix
  235.             final RealMatrix noiseK = MatrixUtils.createRealMatrix(nbDyn + nbMeas, nbDyn + nbMeas);
  236.             if (nbDyn > 0) {
  237.                 final RealMatrix noiseP = covarianceMatricesProviders.get(k).
  238.                         getInitialCovarianceMatrix(correctedSpacecraftStates[k]);
  239.                 noiseK.setSubMatrix(noiseP.getData(), 0, 0);
  240.             }
  241.             if (measurementProcessNoiseMatrix != null) {
  242.                 final RealMatrix noiseM = measurementProcessNoiseMatrix.
  243.                         getInitialCovarianceMatrix(correctedSpacecraftStates[k]);
  244.                 noiseK.setSubMatrix(noiseM.getData(), nbDyn, nbDyn);
  245.             }

  246.             KalmanEstimatorUtil.checkDimension(noiseK.getRowDimension(),
  247.                     builders.get(k).getOrbitalParametersDrivers(),
  248.                     builders.get(k).getPropagationParametersDrivers(),
  249.                     estimatedMeasurementsParameters);

  250.             final int[] indK = covarianceIndirection[k];
  251.             for (int i = 0; i < indK.length; ++i) {
  252.                 if (indK[i] >= 0) {
  253.                     for (int j = 0; j < indK.length; ++j) {
  254.                         if (indK[j] >= 0) {
  255.                             physicalProcessNoise.setEntry(indK[i], indK[j], noiseK.getEntry(i, j));
  256.                         }
  257.                     }
  258.                 }
  259.             }

  260.         }
  261.         final RealMatrix correctedCovariance = KalmanEstimatorUtil.normalizeCovarianceMatrix(physicalProcessNoise, scale);

  262.         correctedEstimate = new ProcessEstimate(0.0, correctedState, correctedCovariance);

  263.     }


  264.     /** {@inheritDoc} */
  265.     @Override
  266.     public RealMatrix getPhysicalStateTransitionMatrix() {
  267.         //  Un-normalize the state transition matrix (φ) from Hipparchus and return it.
  268.         // φ is an mxm matrix where m = nbOrb + nbPropag + nbMeas
  269.         // For each element [i,j] of normalized φ (φn), the corresponding physical value is:
  270.         // φ[i,j] = φn[i,j] * scale[i] / scale[j]
  271.         return correctedEstimate.getStateTransitionMatrix() == null ?
  272.                 null : KalmanEstimatorUtil.unnormalizeStateTransitionMatrix(correctedEstimate.getStateTransitionMatrix(), scale);
  273.     }

  274.     /** {@inheritDoc} */
  275.     @Override
  276.     public RealMatrix getPhysicalMeasurementJacobian() {
  277.         // Un-normalize the measurement matrix (H) from Hipparchus and return it.
  278.         // H is an nxm matrix where:
  279.         //  - m = nbOrb + nbPropag + nbMeas is the number of estimated parameters
  280.         //  - n is the size of the measurement being processed by the filter
  281.         // For each element [i,j] of normalized H (Hn) the corresponding physical value is:
  282.         // H[i,j] = Hn[i,j] * σ[i] / scale[j]
  283.         return correctedEstimate.getMeasurementJacobian() == null ?
  284.                 null : KalmanEstimatorUtil.unnormalizeMeasurementJacobian(correctedEstimate.getMeasurementJacobian(),
  285.                 scale,
  286.                 correctedMeasurement.getObservedMeasurement().getTheoreticalStandardDeviation());
  287.     }

  288.     /** {@inheritDoc} */
  289.     @Override
  290.     public RealMatrix getPhysicalInnovationCovarianceMatrix() {
  291.         // Un-normalize the innovation covariance matrix (S) from Hipparchus and return it.
  292.         // S is an nxn matrix where n is the size of the measurement being processed by the filter
  293.         // For each element [i,j] of normalized S (Sn) the corresponding physical value is:
  294.         // S[i,j] = Sn[i,j] * σ[i] * σ[j]
  295.         return correctedEstimate.getInnovationCovariance() == null ?
  296.                 null : KalmanEstimatorUtil.unnormalizeInnovationCovarianceMatrix(correctedEstimate.getInnovationCovariance(),
  297.                 predictedMeasurement.getObservedMeasurement().getTheoreticalStandardDeviation());
  298.     }

  299.     /** {@inheritDoc} */
  300.     @Override
  301.     public RealMatrix getPhysicalKalmanGain() {
  302.         // Un-normalize the Kalman gain (K) from Hipparchus and return it.
  303.         // K is an mxn matrix where:
  304.         //  - m = nbOrb + nbPropag + nbMeas is the number of estimated parameters
  305.         //  - n is the size of the measurement being processed by the filter
  306.         // For each element [i,j] of normalized K (Kn) the corresponding physical value is:
  307.         // K[i,j] = Kn[i,j] * scale[i] / σ[j]
  308.         return correctedEstimate.getKalmanGain() == null ?
  309.                 null : KalmanEstimatorUtil.unnormalizeKalmanGainMatrix(correctedEstimate.getKalmanGain(),
  310.                 scale,
  311.                 correctedMeasurement.getObservedMeasurement().getTheoreticalStandardDeviation());
  312.     }

  313.     /** {@inheritDoc} */
  314.     @Override
  315.     public SpacecraftState[] getPredictedSpacecraftStates() {
  316.         return predictedSpacecraftStates.clone();
  317.     }

  318.     /** {@inheritDoc} */
  319.     @Override
  320.     public SpacecraftState[] getCorrectedSpacecraftStates() {
  321.         return correctedSpacecraftStates.clone();
  322.     }

  323.     /** {@inheritDoc} */
  324.     @Override
  325.     public int getCurrentMeasurementNumber() {
  326.         return currentMeasurementNumber;
  327.     }

  328.     /** {@inheritDoc} */
  329.     @Override
  330.     public AbsoluteDate getCurrentDate() {
  331.         return currentDate;
  332.     }

  333.     /** {@inheritDoc} */
  334.     @Override
  335.     public EstimatedMeasurement<?> getPredictedMeasurement() {
  336.         return predictedMeasurement;
  337.     }

  338.     /** {@inheritDoc} */
  339.     @Override
  340.     public EstimatedMeasurement<?> getCorrectedMeasurement() {
  341.         return correctedMeasurement;
  342.     }

  343.     /** {@inheritDoc} */
  344.     @Override
  345.     public RealVector getPhysicalEstimatedState() {
  346.         // Method {@link ParameterDriver#getValue()} is used to get
  347.         // the physical values of the state.
  348.         // The scales'array is used to get the size of the state vector
  349.         final RealVector physicalEstimatedState = new ArrayRealVector(scale.length);
  350.         int i = 0;
  351.         for (final DelegatingDriver driver : getEstimatedOrbitalParameters().getDrivers()) {
  352.             physicalEstimatedState.setEntry(i++, driver.getValue());
  353.         }
  354.         for (final DelegatingDriver driver : getEstimatedPropagationParameters().getDrivers()) {
  355.             physicalEstimatedState.setEntry(i++, driver.getValue());
  356.         }
  357.         for (final DelegatingDriver driver : getEstimatedMeasurementsParameters().getDrivers()) {
  358.             physicalEstimatedState.setEntry(i++, driver.getValue());
  359.         }

  360.         return physicalEstimatedState;
  361.     }

  362.     /** {@inheritDoc} */
  363.     @Override
  364.     public RealMatrix getPhysicalEstimatedCovarianceMatrix() {
  365.         // Un-normalize the estimated covariance matrix (P) from Hipparchus and return it.
  366.         // The covariance P is an mxm matrix where m = nbOrb + nbPropag + nbMeas
  367.         // For each element [i,j] of P the corresponding normalized value is:
  368.         // Pn[i,j] = P[i,j] / (scale[i]*scale[j])
  369.         // Consequently: P[i,j] = Pn[i,j] * scale[i] * scale[j]
  370.         return KalmanEstimatorUtil.unnormalizeCovarianceMatrix(correctedEstimate.getCovariance(), scale);
  371.     }

  372.     /** {@inheritDoc} */
  373.     @Override
  374.     public ParameterDriversList getEstimatedOrbitalParameters() {
  375.         return allEstimatedOrbitalParameters;
  376.     }

  377.     /** {@inheritDoc} */
  378.     @Override
  379.     public ParameterDriversList getEstimatedPropagationParameters() {
  380.         return allEstimatedPropagationParameters;
  381.     }

  382.     /** {@inheritDoc} */
  383.     @Override
  384.     public ParameterDriversList getEstimatedMeasurementsParameters() {
  385.         return estimatedMeasurementsParameters;
  386.     }

  387.     /** Get the current corrected estimate.
  388.      * @return current corrected estimate
  389.      */
  390.     public ProcessEstimate getEstimate() {
  391.         return correctedEstimate;
  392.     }

  393.     /** Getter for the propagators.
  394.      * @return the propagators
  395.      */
  396.     public List<PropagatorBuilder> getBuilders() {
  397.         return builders;
  398.     }

  399.     /** Get the propagators estimated with the values set in the propagators builders.
  400.      * @return propagators based on the current values in the builder
  401.      */
  402.     public Propagator[] getEstimatedPropagators() {
  403.         // Return propagators built with current instantiation of the propagator builders
  404.         final Propagator[] propagators = new Propagator[getBuilders().size()];
  405.         for (int k = 0; k < getBuilders().size(); ++k) {
  406.             propagators[k] = getBuilders().get(k).buildPropagator();
  407.         }
  408.         return propagators;
  409.     }

  410.     protected RealMatrix getNormalizedProcessNoise(final int stateDimension) {
  411.         final RealMatrix physicalProcessNoise = MatrixUtils.createRealMatrix(stateDimension, stateDimension);
  412.         for (int k = 0; k < covarianceMatricesProviders.size(); ++k) {

  413.             // Number of estimated measurement parameters
  414.             final int nbMeas = estimatedMeasurementsParameters.getNbParams();

  415.             // Number of estimated dynamic parameters (orbital + propagation)
  416.             final int nbDyn  = orbitsEndColumns[k] - orbitsStartColumns[k] +
  417.                     estimatedPropagationParameters[k].getNbParams();

  418.             // Covariance matrix
  419.             final RealMatrix noiseK = MatrixUtils.createRealMatrix(nbDyn + nbMeas, nbDyn + nbMeas);
  420.             if (nbDyn > 0) {
  421.                 final RealMatrix noiseP = covarianceMatricesProviders.get(k).
  422.                         getProcessNoiseMatrix(correctedSpacecraftStates[k],
  423.                                 predictedSpacecraftStates[k]);
  424.                 noiseK.setSubMatrix(noiseP.getData(), 0, 0);
  425.             }
  426.             if (measurementProcessNoiseMatrix != null) {
  427.                 final RealMatrix noiseM = measurementProcessNoiseMatrix.
  428.                         getProcessNoiseMatrix(correctedSpacecraftStates[k],
  429.                                 predictedSpacecraftStates[k]);
  430.                 noiseK.setSubMatrix(noiseM.getData(), nbDyn, nbDyn);
  431.             }

  432.             KalmanEstimatorUtil.checkDimension(noiseK.getRowDimension(),
  433.                     builders.get(k).getOrbitalParametersDrivers(),
  434.                     builders.get(k).getPropagationParametersDrivers(),
  435.                     estimatedMeasurementsParameters);

  436.             final int[] indK = covarianceIndirection[k];
  437.             for (int i = 0; i < indK.length; ++i) {
  438.                 if (indK[i] >= 0) {
  439.                     for (int j = 0; j < indK.length; ++j) {
  440.                         if (indK[j] >= 0) {
  441.                             physicalProcessNoise.setEntry(indK[i], indK[j], noiseK.getEntry(i, j));
  442.                         }
  443.                     }
  444.                 }
  445.             }

  446.         }
  447.         return KalmanEstimatorUtil.normalizeCovarianceMatrix(physicalProcessNoise, scale);
  448.     }


  449.     protected int[] getOrbitsStartColumns() {
  450.         return orbitsStartColumns;
  451.     }

  452.     protected Map<String, Integer> getPropagationParameterColumns() {
  453.         return propagationParameterColumns;
  454.     }

  455.     protected Map<String, Integer> getMeasurementParameterColumns() {
  456.         return measurementParameterColumns;
  457.     }

  458.     protected ParameterDriversList[] getEstimatedPropagationParametersArray() {
  459.         return estimatedPropagationParameters;
  460.     }

  461.     protected ParameterDriversList[] getEstimatedOrbitalParametersArray() {
  462.         return estimatedOrbitalParameters;
  463.     }

  464.     protected int[][] getCovarianceIndirection() {
  465.         return covarianceIndirection;
  466.     }

  467.     protected double[] getScale() {
  468.         return scale;
  469.     }

  470.     protected ProcessEstimate getCorrectedEstimate() {
  471.         return correctedEstimate;
  472.     }

  473.     protected void setCorrectedEstimate(final ProcessEstimate correctedEstimate) {
  474.         this.correctedEstimate = correctedEstimate;
  475.     }

  476.     protected AbsoluteDate getReferenceDate() {
  477.         return referenceDate;
  478.     }

  479.     protected void incrementCurrentMeasurementNumber() {
  480.         currentMeasurementNumber += 1;
  481.     }

  482.     public void setCurrentDate(final AbsoluteDate currentDate) {
  483.         this.currentDate = currentDate;
  484.     }

  485.     protected void setCorrectedSpacecraftState(final SpacecraftState correctedSpacecraftState, final int index) {
  486.         this.correctedSpacecraftStates[index] = correctedSpacecraftState;
  487.     }

  488.     protected void setPredictedSpacecraftState(final SpacecraftState predictedSpacecraftState, final int index) {
  489.         this.predictedSpacecraftStates[index] = predictedSpacecraftState;
  490.     }

  491.     protected void setPredictedMeasurement(final EstimatedMeasurement<?> predictedMeasurement) {
  492.         this.predictedMeasurement = predictedMeasurement;
  493.     }

  494.     protected void setCorrectedMeasurement(final EstimatedMeasurement<?> correctedMeasurement) {
  495.         this.correctedMeasurement = correctedMeasurement;
  496.     }
  497. }