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 class TDOAModifierUtil {
40
41
42 private TDOAModifierUtil() {
43
44 }
45
46
47
48
49
50
51
52
53
54
55 @Deprecated
56 public static <T extends ObservedMeasurement<T>> void modifyWithoutDerivatives(final EstimatedMeasurementBase<T> estimated,
57 final GroundStation primeStation,
58 final GroundStation secondStation,
59 final ParametricModelEffect modelEffect) {
60 modifyWithoutDerivatives(estimated, primeStation, secondStation, modelEffect, null);
61 }
62
63
64
65
66
67
68
69
70
71
72 public static <T extends ObservedMeasurement<T>> void modifyWithoutDerivatives(final EstimatedMeasurementBase<T> estimated,
73 final GroundStation primeStation,
74 final GroundStation secondStation,
75 final ParametricModelEffect modelEffect,
76 final EstimationModifier<T> modifier) {
77
78 final SpacecraftState state = estimated.getStates()[0];
79 final double[] oldValue = estimated.getEstimatedValue();
80 final double primeDelay = modelEffect.evaluate(primeStation, state);
81 final double secondDelay = modelEffect.evaluate(secondStation, state);
82
83
84
85 final double[] newValue = oldValue.clone();
86 newValue[0] += primeDelay;
87 newValue[0] -= secondDelay;
88 estimated.modifyEstimatedValue(modifier, newValue);
89 }
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104 @Deprecated
105 public static <T extends ObservedMeasurement<T>> void modify(final EstimatedMeasurement<T> estimated,
106 final ParameterDriversProvider parametricModel,
107 final AbstractGradientConverter converter,
108 final GroundStation primeStation, final GroundStation secondStation,
109 final ParametricModelEffect modelEffect,
110 final ParametricModelEffectGradient modelEffectGradient) {
111 modify(estimated, parametricModel, converter, primeStation, secondStation,
112 modelEffect, modelEffectGradient, null);
113 }
114
115
116
117
118
119
120
121
122
123
124
125
126
127 public static <T extends ObservedMeasurement<T>> void modify(final EstimatedMeasurement<T> estimated,
128 final ParameterDriversProvider parametricModel,
129 final AbstractGradientConverter converter,
130 final GroundStation primeStation, final GroundStation secondStation,
131 final ParametricModelEffect modelEffect,
132 final ParametricModelEffectGradient modelEffectGradient,
133 final EstimationModifier<T> modifier) {
134
135 final SpacecraftState state = estimated.getStates()[0];
136 final double[] oldValue = estimated.getEstimatedValue();
137
138
139 final FieldSpacecraftState<Gradient> gState = converter.getState(parametricModel);
140 final Gradient[] gParameters = converter.getParameters(gState, parametricModel);
141 final Gradient primeGDelay = modelEffectGradient.evaluate(primeStation, gState, gParameters);
142 final Gradient secondGDelay = modelEffectGradient.evaluate(secondStation, gState, gParameters);
143 final double[] primeDerivatives = primeGDelay.getGradient();
144 final double[] secondDerivatives = secondGDelay.getGradient();
145
146 final double[][] stateDerivatives = estimated.getStateDerivatives(0);
147 for (int jcol = 0; jcol < stateDerivatives[0].length; ++jcol) {
148 stateDerivatives[0][jcol] += primeDerivatives[jcol];
149 stateDerivatives[0][jcol] -= secondDerivatives[jcol];
150 }
151 estimated.setStateDerivatives(0, stateDerivatives);
152
153 int index = 0;
154 for (final ParameterDriver driver : parametricModel.getParametersDrivers()) {
155 if (driver.isSelected()) {
156 for (Span<String> span = driver.getNamesSpanMap().getFirstSpan(); span != null; span = span.next()) {
157
158
159 double parameterDerivative = estimated.getParameterDerivatives(driver, span.getStart())[0];
160 parameterDerivative += primeDerivatives[index + converter.getFreeStateParameters()];
161 parameterDerivative -= secondDerivatives[index + converter.getFreeStateParameters()];
162 estimated.setParameterDerivatives(driver, span.getStart(), parameterDerivative);
163 index += 1;
164 }
165 }
166
167 }
168
169
170 for (final ParameterDriver driver : Arrays.asList(primeStation.getClockOffsetDriver(),
171 primeStation.getEastOffsetDriver(),
172 primeStation.getNorthOffsetDriver(),
173 primeStation.getZenithOffsetDriver())) {
174 if (driver.isSelected()) {
175 for (Span<String> span = driver.getNamesSpanMap().getFirstSpan(); span != null; span = span.next()) {
176
177 double parameterDerivative = estimated.getParameterDerivatives(driver, span.getStart())[0];
178 parameterDerivative += Differentiation.differentiate((d, t) -> modelEffect.evaluate(primeStation, state),
179 3, 10.0 * driver.getScale()).value(driver, state.getDate());
180 estimated.setParameterDerivatives(driver, span.getStart(), parameterDerivative);
181 }
182 }
183 }
184
185
186 for (final ParameterDriver driver : Arrays.asList(secondStation.getClockOffsetDriver(),
187 secondStation.getEastOffsetDriver(),
188 secondStation.getNorthOffsetDriver(),
189 secondStation.getZenithOffsetDriver())) {
190 if (driver.isSelected()) {
191 for (Span<String> span = driver.getNamesSpanMap().getFirstSpan(); span != null; span = span.next()) {
192
193 double parameterDerivative = estimated.getParameterDerivatives(driver, span.getStart())[0];
194 parameterDerivative -= Differentiation.differentiate((d, t) -> modelEffect.evaluate(secondStation, state),
195 3, 10.0 * driver.getScale()).value(driver, state.getDate());
196 estimated.setParameterDerivatives(driver, span.getStart(), parameterDerivative);
197 }
198 }
199 }
200
201
202
203 final double[] newValue = oldValue.clone();
204 newValue[0] += primeGDelay.getReal();
205 newValue[0] -= secondGDelay.getReal();
206 estimated.modifyEstimatedValue(modifier, newValue);
207 }
208
209 }