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.ArrayList;
20 import java.util.Collections;
21 import java.util.List;
22 import java.util.Map;
23
24 import org.orekit.estimation.measurements.EstimatedMeasurementBase;
25 import org.orekit.estimation.measurements.EstimationModifier;
26 import org.orekit.estimation.measurements.MultiplexedMeasurement;
27 import org.orekit.estimation.measurements.ObservableSatellite;
28 import org.orekit.estimation.measurements.ObservedMeasurement;
29 import org.orekit.propagation.SpacecraftState;
30 import org.orekit.propagation.sampling.OrekitStepInterpolator;
31 import org.orekit.time.AbsoluteDate;
32
33
34
35
36
37
38 public class MultiplexedMeasurementBuilder implements MeasurementBuilder<MultiplexedMeasurement> {
39
40
41 private final List<MeasurementBuilder<?>> builders;
42
43
44 private final ObservableSatellite[] satellites;
45
46
47 private final List<EstimationModifier<MultiplexedMeasurement>> modifiers;
48
49
50
51
52 public MultiplexedMeasurementBuilder(final List<MeasurementBuilder<?>> builders) {
53 this.builders = builders;
54 this.modifiers = new ArrayList<>();
55
56 final List<ObservableSatellite> list = new ArrayList<>();
57 for (final MeasurementBuilder<?> builder : builders) {
58 for (final ObservableSatellite satellite : builder.getSatellites()) {
59 if (!list.contains(satellite)) {
60 list.add(satellite);
61 }
62 }
63 }
64 this.satellites = list.toArray(new ObservableSatellite[0]);
65
66 }
67
68
69
70
71
72
73 @Override
74 public void init(final AbsoluteDate start, final AbsoluteDate end) {
75 for (final MeasurementBuilder<?> builder : builders) {
76 builder.init(start, end);
77 }
78 }
79
80
81 @Override
82 public void addModifier(final EstimationModifier<MultiplexedMeasurement> modifier) {
83 modifiers.add(modifier);
84 }
85
86
87 @Override
88 public List<EstimationModifier<MultiplexedMeasurement>> getModifiers() {
89 return Collections.unmodifiableList(modifiers);
90 }
91
92
93 @Override
94 public EstimatedMeasurementBase<MultiplexedMeasurement> build(final AbsoluteDate date,
95 final Map<ObservableSatellite, OrekitStepInterpolator> interpolators) {
96
97
98 final List<EstimatedMeasurementBase<?>> underlyingEstimated = new ArrayList<>(builders.size());
99 final List<ObservedMeasurement<?>> underlyingObserved = new ArrayList<>(builders.size());
100 for (final MeasurementBuilder<?> builder : builders) {
101 final EstimatedMeasurementBase<?> built = builder.build(date, interpolators);
102 underlyingEstimated.add(built);
103 underlyingObserved.add(built.getObservedMeasurement());
104 }
105
106
107 final MultiplexedMeasurement measurement = new MultiplexedMeasurement(underlyingObserved);
108 for (final EstimationModifier<MultiplexedMeasurement> modifier : getModifiers()) {
109 measurement.addModifier(modifier);
110 }
111
112
113 final SpacecraftState[] states = new SpacecraftState[satellites.length];
114 for (int i = 0; i < underlyingEstimated.size(); ++i) {
115 final EstimatedMeasurementBase<?> mI = underlyingEstimated.get(i);
116 final SpacecraftState[] statesI = mI.getStates();
117 for (int j = 0; j < statesI.length; ++j) {
118 states[measurement.getMultiplexedStateIndex(i, j)] = statesI[j];
119 }
120 }
121 return measurement.estimateWithoutDerivatives(states);
122
123 }
124
125
126 @Override
127 public ObservableSatellite[] getSatellites() {
128 return satellites.clone();
129 }
130
131 }