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.Comparator;
22 import java.util.HashMap;
23 import java.util.Iterator;
24 import java.util.List;
25 import java.util.Map;
26 import java.util.SortedSet;
27 import java.util.TreeSet;
28
29 import org.orekit.estimation.measurements.ObservableSatellite;
30 import org.orekit.estimation.measurements.ObservedMeasurement;
31 import org.orekit.propagation.Propagator;
32 import org.orekit.propagation.PropagatorsParallelizer;
33 import org.orekit.propagation.SpacecraftState;
34 import org.orekit.propagation.sampling.MultiSatStepHandler;
35 import org.orekit.propagation.sampling.OrekitStepHandler;
36 import org.orekit.propagation.sampling.OrekitStepInterpolator;
37 import org.orekit.propagation.sampling.StepHandlerMultiplexer;
38 import org.orekit.time.AbsoluteDate;
39
40
41
42
43
44
45 public class Generator {
46
47
48
49
50 private final List<ObservableSatellite> observableSatellites;
51
52
53 private final List<Propagator> propagators;
54
55
56 private final List<Scheduler<? extends ObservedMeasurement<?>>> multiSatSchedulers;
57
58
59 private final Map<ObservableSatellite, List<Scheduler<? extends ObservedMeasurement<?>>>> singleSatSchedulers;
60
61
62
63
64 private final List<GeneratedMeasurementSubscriber> subscribers;
65
66
67
68 public Generator() {
69 this.observableSatellites = new ArrayList<>();
70 this.propagators = new ArrayList<>();
71 this.multiSatSchedulers = new ArrayList<>();
72 this.singleSatSchedulers = new HashMap<>();
73 this.subscribers = new ArrayList<>();
74 }
75
76
77
78
79
80 public ObservableSatellite addPropagator(final Propagator propagator) {
81 final ObservableSatellite os = new ObservableSatellite(propagators.size());
82 observableSatellites.add(os);
83 propagators.add(propagator);
84 return os;
85 }
86
87
88
89
90
91 public Propagator getPropagator(final ObservableSatellite satellite) {
92 return propagators.get(satellite.getPropagatorIndex());
93 }
94
95
96
97
98
99 public <T extends ObservedMeasurement<T>> void addScheduler(final Scheduler<T> scheduler) {
100 final ObservableSatellite[] satellites = scheduler.getBuilder().getSatellites();
101 if (satellites.length == 1) {
102
103
104 List<Scheduler<? extends ObservedMeasurement<?>>> list = singleSatSchedulers.get(satellites[0]);
105 if (list == null) {
106 list = new ArrayList<>();
107 singleSatSchedulers.put(satellites[0], list);
108 }
109 list.add(scheduler);
110 } else {
111
112
113 multiSatSchedulers.add(scheduler);
114 }
115 }
116
117
118
119
120
121
122 public void addSubscriber(final GeneratedMeasurementSubscriber subscriber) {
123 subscribers.add(subscriber);
124 }
125
126
127
128
129
130 public void generate(final AbsoluteDate start, final AbsoluteDate end) {
131
132
133 final MultipleSatGeneratorHandler globalHandler =
134 new MultipleSatGeneratorHandler(multiSatSchedulers, subscribers,
135 observableSatellites, end.isAfterOrEqualTo(start));
136
137
138 for (final Map.Entry<ObservableSatellite, List<Scheduler<? extends ObservedMeasurement<?>>>> entry : singleSatSchedulers.entrySet()) {
139 final StepHandlerMultiplexer multiplexer = propagators.get(entry.getKey().getPropagatorIndex()).getMultiplexer();
140 for (final Scheduler<?> scheduler : entry.getValue()) {
141 multiplexer.add(new SingleSatGeneratorHandler<>(scheduler, globalHandler));
142 }
143 }
144
145
146 final PropagatorsParallelizer parallelizer = new PropagatorsParallelizer(propagators, globalHandler);
147
148
149 parallelizer.propagate(start, end);
150
151
152 for (final Map.Entry<ObservableSatellite, List<Scheduler<? extends ObservedMeasurement<?>>>> entry : singleSatSchedulers.entrySet()) {
153
154 final StepHandlerMultiplexer multiplexer = propagators.get(entry.getKey().getPropagatorIndex()).getMultiplexer();
155 final List<OrekitStepHandler> toBeRemoved = new ArrayList<>();
156 for (final OrekitStepHandler handler : multiplexer.getHandlers()) {
157 if (handler instanceof SingleSatGeneratorHandler &&
158 ((SingleSatGeneratorHandler<?>) handler).globalHandler == globalHandler) {
159 toBeRemoved.add(handler);
160 }
161 }
162 for (final OrekitStepHandler handler : toBeRemoved) {
163 multiplexer.remove(handler);
164 }
165 }
166
167 }
168
169
170
171
172
173
174
175
176
177 private static class SingleSatGeneratorHandler<T extends ObservedMeasurement<T>> implements OrekitStepHandler {
178
179
180 private final Scheduler<T> scheduler;
181
182
183 private final ObservableSatellite satellite;
184
185
186 private final MultipleSatGeneratorHandler globalHandler;
187
188
189
190
191
192 SingleSatGeneratorHandler(final Scheduler<T> scheduler, final MultipleSatGeneratorHandler globalHandler) {
193 this.scheduler = scheduler;
194 this.satellite = scheduler.getBuilder().getSatellites()[0];
195 this.globalHandler = globalHandler;
196 }
197
198
199 @Override
200 public void init(final SpacecraftState state0, final AbsoluteDate t) {
201 scheduler.init(state0.getDate(), t);
202 }
203
204
205 @Override
206 public void handleStep(final OrekitStepInterpolator interpolator) {
207 globalHandler.addMeasurements(scheduler.generate(Collections.singletonMap(satellite, interpolator)));
208 }
209
210 }
211
212
213
214
215
216
217
218
219
220
221 private static class MultipleSatGeneratorHandler implements MultiSatStepHandler {
222
223
224 private final List<Scheduler<? extends ObservedMeasurement<?>>> schedulers;
225
226
227
228
229 private final List<GeneratedMeasurementSubscriber> subscribers;
230
231
232
233
234 private final List<ObservableSatellite> observableSatellites;
235
236
237
238
239 private final SortedSet<ObservedMeasurement<?>> generated;
240
241
242
243
244 private final boolean forward;
245
246
247
248
249
250
251
252
253 MultipleSatGeneratorHandler(final List<Scheduler<? extends ObservedMeasurement<?>>> schedulers,
254 final List<GeneratedMeasurementSubscriber> subscribers,
255 final List<ObservableSatellite> observableSatellites, final boolean forward) {
256
257
258 final Comparator<ObservedMeasurement<?>> comparator = forward ? Comparator.naturalOrder() : Comparator.reverseOrder();
259
260 this.schedulers = schedulers;
261 this.subscribers = subscribers;
262 this.observableSatellites = observableSatellites;
263 this.generated = new TreeSet<>(comparator);
264 this.forward = forward;
265
266 }
267
268
269 @Override
270 public void init(final List<SpacecraftState> states0, final AbsoluteDate t) {
271
272 final AbsoluteDate start = states0.get(0).getDate();
273
274
275 for (final Scheduler<?> scheduler : schedulers) {
276 scheduler.init(start, t);
277 }
278
279
280 for (final GeneratedMeasurementSubscriber subscriber : subscribers) {
281 subscriber.init(start, t);
282 }
283
284 }
285
286
287 @Override
288 public void handleStep(final List<OrekitStepInterpolator> interpolators) {
289
290
291 final Map<ObservableSatellite, OrekitStepInterpolator> interpolatorsMap =
292 new HashMap<>(interpolators.size());
293 for (int i = 0; i < interpolators.size(); ++i) {
294 interpolatorsMap.put(observableSatellites.get(i), interpolators.get(i));
295 }
296 final AbsoluteDate lastDate = interpolators.get(0).getCurrentState().getDate();
297
298 synchronized (generated) {
299
300
301 for (final Scheduler<? extends ObservedMeasurement<?>> scheduler : schedulers) {
302 generated.addAll(scheduler.generate(interpolatorsMap));
303 }
304
305
306 for (final Iterator<ObservedMeasurement<?>> iterator = generated.iterator(); iterator.hasNext();) {
307 final ObservedMeasurement<?> measurement = iterator.next();
308 if (forward == lastDate.isAfterOrEqualTo(measurement)) {
309
310 for (final GeneratedMeasurementSubscriber subscriber : subscribers) {
311 subscriber.handleGeneratedMeasurement(measurement);
312 }
313 iterator.remove();
314 } else {
315
316
317 break;
318 }
319 }
320
321 }
322
323 }
324
325
326 public void finish(final List<SpacecraftState> finalStates) {
327 synchronized (generated) {
328 for (final ObservedMeasurement<?> measurement : generated) {
329 for (final GeneratedMeasurementSubscriber subscriber : subscribers) {
330 subscriber.handleGeneratedMeasurement(measurement);
331 }
332 }
333 generated.clear();
334 }
335 }
336
337
338
339
340
341 private void addMeasurements(final SortedSet<? extends ObservedMeasurement<?>> measurements) {
342 synchronized (generated) {
343 generated.addAll(measurements);
344 }
345 }
346
347 }
348
349 }