1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.estimation.measurements.generation;
18
19 import java.util.Map;
20
21 import org.hipparchus.random.CorrelatedRandomVectorGenerator;
22 import org.orekit.estimation.measurements.EstimationModifier;
23 import org.orekit.estimation.measurements.FDOA;
24 import org.orekit.estimation.measurements.GroundStation;
25 import org.orekit.estimation.measurements.ObservableSatellite;
26 import org.orekit.propagation.SpacecraftState;
27 import org.orekit.propagation.sampling.OrekitStepInterpolator;
28 import org.orekit.time.AbsoluteDate;
29 import org.orekit.utils.ParameterDriver;
30
31
32
33
34
35 public class FDOABuilder extends AbstractMeasurementBuilder<FDOA> {
36
37
38 private final GroundStation primeStation;
39
40
41 private final GroundStation secondStation;
42
43
44 private final double centreFrequency;
45
46
47 private final ObservableSatellite satellite;
48
49
50
51
52
53
54
55
56
57
58 public FDOABuilder(final CorrelatedRandomVectorGenerator noiseSource,
59 final GroundStation primeStation,
60 final GroundStation secondStation,
61 final double centreFrequency,
62 final double sigma, final double baseWeight,
63 final ObservableSatellite satellite) {
64 super(noiseSource, sigma, baseWeight, satellite);
65 this.primeStation = primeStation;
66 this.secondStation = secondStation;
67 this.centreFrequency = centreFrequency;
68 this.satellite = satellite;
69 }
70
71
72 @Override
73 public FDOA build(final AbsoluteDate date, final Map<ObservableSatellite, OrekitStepInterpolator> interpolators) {
74
75 final double sigma = getTheoreticalStandardDeviation()[0];
76 final double baseWeight = getBaseWeight()[0];
77 final SpacecraftState[] relevant = new SpacecraftState[] { interpolators.get(satellite).getInterpolatedState(date) };
78
79
80 final FDOA dummy = new FDOA(primeStation, secondStation, centreFrequency, relevant[0].getDate(),
81 Double.NaN, sigma, baseWeight, satellite);
82 for (final EstimationModifier<FDOA> modifier : getModifiers()) {
83 dummy.addModifier(modifier);
84 }
85
86
87 for (final ParameterDriver driver : dummy.getParametersDrivers()) {
88 if (driver.getReferenceDate() == null) {
89 final AbsoluteDate start = getStart();
90 final AbsoluteDate end = getEnd();
91 driver.setReferenceDate(start.durationFrom(end) <= 0 ? start : end);
92 }
93 }
94
95
96 double fdoa = dummy.estimateWithoutDerivatives(relevant).getEstimatedValue()[0];
97
98
99 final double[] noise = getNoise();
100 if (noise != null) {
101 fdoa += noise[0];
102 }
103
104
105 final FDOA measurement = new FDOA(primeStation, secondStation, centreFrequency, relevant[0].getDate(),
106 fdoa, sigma, baseWeight, satellite);
107 for (final EstimationModifier<FDOA> modifier : getModifiers()) {
108 measurement.addModifier(modifier);
109 }
110 return measurement;
111
112 }
113
114 }