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
40 public class RangeModifierUtil {
41
42
43 private RangeModifierUtil() {
44
45 }
46
47
48
49
50
51
52
53
54
55 public static <T extends ObservedMeasurement<T>> void modifyWithoutDerivatives(final EstimatedMeasurementBase<T> estimated,
56 final GroundStation station,
57 final ParametricModelEffect modelEffect,
58 final EstimationModifier<T> modifier) {
59
60 final SpacecraftState state = estimated.getStates()[0];
61 final double[] oldValue = estimated.getEstimatedValue();
62
63
64 final double[] newValue = oldValue.clone();
65 final double delay = modelEffect.evaluate(station, state);
66 newValue[0] = newValue[0] + delay;
67 estimated.modifyEstimatedValue(modifier, newValue);
68
69 }
70
71
72
73
74
75
76
77
78
79
80
81 public static <T extends ObservedMeasurement<T>> void modify(final EstimatedMeasurement<T> estimated,
82 final ParameterDriversProvider parametricModel,
83 final AbstractGradientConverter converter,
84 final GroundStation station,
85 final ParametricModelEffect modelEffect,
86 final ParametricModelEffectGradient modelEffectGradient,
87 final EstimationModifier<T> modifier) {
88
89 final SpacecraftState state = estimated.getStates()[0];
90
91
92 final FieldSpacecraftState<Gradient> gState = converter.getState(parametricModel);
93 final Gradient[] gParameters = converter.getParameters(gState, parametricModel);
94 final Gradient gDelay = modelEffectGradient.evaluate(station, gState, gParameters);
95 final double[] derivatives = gDelay.getGradient();
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
107 for (Span<String> span = driver.getNamesSpanMap().getFirstSpan(); span != null; span = span.next()) {
108 double parameterDerivative = estimated.getParameterDerivatives(driver, span.getStart())[0];
109 parameterDerivative += derivatives[index + converter.getFreeStateParameters()];
110 estimated.setParameterDerivatives(driver, span.getStart(), parameterDerivative);
111 index = index + 1;
112 }
113 }
114
115 }
116
117 for (final ParameterDriver driver : Arrays.asList(station.getClockOffsetDriver(),
118 station.getEastOffsetDriver(),
119 station.getNorthOffsetDriver(),
120 station.getZenithOffsetDriver())) {
121 if (driver.isSelected()) {
122
123 for (Span<String> span = driver.getNamesSpanMap().getFirstSpan(); span != null; span = span.next()) {
124 double parameterDerivative = estimated.getParameterDerivatives(driver, span.getStart())[0];
125 parameterDerivative += Differentiation.differentiate((d, t) -> modelEffect.evaluate(station, state),
126 3, 10.0 * driver.getScale()).value(driver, state.getDate());
127 estimated.setParameterDerivatives(driver, span.getStart(), parameterDerivative);
128 }
129 }
130 }
131
132
133 modifyWithoutDerivatives(estimated, station, modelEffect, modifier);
134
135 }
136
137 }