1 /* Copyright 2002-2024 CS GROUP
2 * Licensed to CS GROUP (CS) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * CS licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.orekit.estimation.measurements.generation;
18
19 import java.util.List;
20 import java.util.Map;
21 import java.util.SortedSet;
22 import java.util.TreeSet;
23
24 import org.orekit.estimation.measurements.ObservableSatellite;
25 import org.orekit.estimation.measurements.ObservedMeasurement;
26 import org.orekit.propagation.sampling.OrekitStepInterpolator;
27 import org.orekit.time.AbsoluteDate;
28 import org.orekit.time.DatesSelector;
29
30
31 /** Base implementation of {@link Scheduler} managing {@link DatesSelector dates selection}.
32 * @param <T> the type of the measurement
33 * @author Luc Maisonobe
34 * @since 9.3
35 */
36 public abstract class AbstractScheduler<T extends ObservedMeasurement<T>> implements Scheduler<T> {
37
38 /** Builder for individual measurements. */
39 private final MeasurementBuilder<T> builder;
40
41 /** Selector for dates. */
42 private final DatesSelector selector;
43
44 /** Simple constructor.
45 * @param builder builder for individual measurements
46 * @param selector selector for dates
47 */
48 protected AbstractScheduler(final MeasurementBuilder<T> builder,
49 final DatesSelector selector) {
50 this.builder = builder;
51 this.selector = selector;
52 }
53
54 /** {@inheritDoc}
55 * <p>
56 * This implementation initialize the measurement builder.
57 * </p>
58 */
59 @Override
60 public void init(final AbsoluteDate start, final AbsoluteDate end) {
61 builder.init(start, end);
62 }
63
64 /** {@inheritDoc} */
65 @Override
66 public MeasurementBuilder<T> getBuilder() {
67 return builder;
68 }
69
70 /** Get the dates selector.
71 * @return dates selector
72 */
73 public DatesSelector getSelector() {
74 return selector;
75 }
76
77 /** {@inheritDoc} */
78 @Override
79 public SortedSet<T> generate(final Map<ObservableSatellite, OrekitStepInterpolator> interpolators) {
80
81 // select dates in the current step, using arbitrarily first interpolator
82 // as all interpolators cover the same range
83 final Map.Entry<ObservableSatellite, OrekitStepInterpolator> first = interpolators.entrySet().iterator().next();
84 final List<AbsoluteDate> dates = getSelector().selectDates(first.getValue().getPreviousState().getDate(),
85 first.getValue().getCurrentState().getDate());
86
87 // generate measurements when feasible
88 final SortedSet<T> measurements = new TreeSet<>();
89 for (final AbsoluteDate date : dates) {
90 if (measurementIsFeasible(date)) {
91 // a measurement is feasible at this date
92 measurements.add(getBuilder().build(date, interpolators));
93 }
94 }
95
96 return measurements;
97
98 }
99
100 /** Check if a measurement is feasible at some date.
101 * @param date date to check
102 * @return true if measurement if feasible
103 * @since 12.0
104 */
105 protected abstract boolean measurementIsFeasible(AbsoluteDate date);
106
107 }