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