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 }