1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.estimation.measurements.modifiers;
18
19 import java.util.Arrays;
20
21 import org.hipparchus.analysis.differentiation.Gradient;
22 import org.orekit.estimation.measurements.EstimatedMeasurement;
23 import org.orekit.estimation.measurements.EstimatedMeasurementBase;
24 import org.orekit.estimation.measurements.EstimationModifier;
25 import org.orekit.estimation.measurements.GroundStation;
26 import org.orekit.estimation.measurements.ObservedMeasurement;
27 import org.orekit.propagation.FieldSpacecraftState;
28 import org.orekit.propagation.SpacecraftState;
29 import org.orekit.propagation.integration.AbstractGradientConverter;
30 import org.orekit.utils.Differentiation;
31 import org.orekit.utils.ParameterDriver;
32 import org.orekit.utils.ParameterDriversProvider;
33 import org.orekit.utils.TimeSpanMap.Span;
34
35
36
37
38
39 public class RangeRateModifierUtil {
40
41
42 private RangeRateModifierUtil() {
43
44 }
45
46
47
48
49
50
51
52
53
54 public static <T extends ObservedMeasurement<T>> void modifyWithoutDerivatives(final EstimatedMeasurementBase<T> estimated,
55 final GroundStation station,
56 final ParametricModelEffect modelEffect,
57 final EstimationModifier<T> modifier) {
58
59 final SpacecraftState state = estimated.getStates()[0];
60
61
62 final double[] newValue = estimated.getEstimatedValue();
63 final double delay = modelEffect.evaluate(station, state);
64 newValue[0] = newValue[0] + delay;
65 estimated.modifyEstimatedValue(modifier, newValue);
66
67 }
68
69
70
71
72
73
74
75
76
77
78
79
80 public static <T extends ObservedMeasurement<T>> void modify(final EstimatedMeasurement<T> estimated,
81 final ParameterDriversProvider parametricModel,
82 final AbstractGradientConverter converter,
83 final GroundStation station,
84 final ParametricModelEffect modelEffect,
85 final ParametricModelEffectGradient modelEffectGradient,
86 final EstimationModifier<T> modifier) {
87
88 final SpacecraftState state = estimated.getStates()[0];
89
90
91 final FieldSpacecraftState<Gradient> gState = converter.getState(parametricModel);
92 final Gradient[] gParameters = converter.getParameters(gState, parametricModel);
93 final Gradient gDelay = modelEffectGradient.evaluate(station, gState, gParameters);
94 final double[] derivatives = gDelay.getGradient();
95
96
97 final double[][] stateDerivatives = estimated.getStateDerivatives(0);
98 for (int jcol = 0; jcol < stateDerivatives[0].length; ++jcol) {
99 stateDerivatives[0][jcol] += derivatives[jcol];
100 }
101 estimated.setStateDerivatives(0, stateDerivatives);
102
103 int index = 0;
104 for (final ParameterDriver driver : parametricModel.getParametersDrivers()) {
105 if (driver.isSelected()) {
106 for (Span<String> span = driver.getNamesSpanMap().getFirstSpan(); span != null; span = span.next()) {
107
108
109 double parameterDerivative = estimated.getParameterDerivatives(driver, span.getStart())[0];
110 parameterDerivative += derivatives[index + converter.getFreeStateParameters()];
111 estimated.setParameterDerivatives(driver, span.getStart(), parameterDerivative);
112 index = index + 1;
113 }
114 }
115
116 }
117
118 for (final ParameterDriver driver : Arrays.asList(station.getClockOffsetDriver(),
119 station.getEastOffsetDriver(),
120 station.getNorthOffsetDriver(),
121 station.getZenithOffsetDriver())) {
122 if (driver.isSelected()) {
123 for (Span<String> span = driver.getNamesSpanMap().getFirstSpan(); span != null; span = span.next()) {
124
125
126 double parameterDerivative = estimated.getParameterDerivatives(driver, span.getStart())[0];
127 parameterDerivative += Differentiation.differentiate((d, t) -> modelEffect.evaluate(station, state),
128 3, 10.0 * driver.getScale()).value(driver, state.getDate());
129 estimated.setParameterDerivatives(driver, span.getStart(), parameterDerivative);
130 }
131 }
132 }
133
134
135 modifyWithoutDerivatives(estimated, station, modelEffect, modifier);
136
137 }
138
139 }