Generator.java

  1. /* Copyright 2002-2020 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. import java.util.ArrayList;
  19. import java.util.List;
  20. import java.util.SortedSet;
  21. import java.util.TreeSet;

  22. import org.orekit.estimation.measurements.ObservableSatellite;
  23. import org.orekit.estimation.measurements.ObservedMeasurement;
  24. import org.orekit.propagation.Propagator;
  25. import org.orekit.propagation.PropagatorsParallelizer;
  26. import org.orekit.propagation.SpacecraftState;
  27. import org.orekit.propagation.sampling.MultiSatStepHandler;
  28. import org.orekit.propagation.sampling.OrekitStepInterpolator;
  29. import org.orekit.time.AbsoluteDate;


  30. /** Main generator for {@link ObservedMeasurement observed measurements}.
  31.  * @author Luc Maisonobe
  32.  * @since 9.3
  33.  */
  34. public class Generator {

  35.     /** Propagators. */
  36.     private final List<Propagator> propagators;

  37.     /** Sequences generators. */
  38.     private final List<Scheduler<?>> schedulers;

  39.     /** Build a generator with no sequences generator.
  40.      */
  41.     public Generator() {
  42.         this.propagators = new ArrayList<>();
  43.         this.schedulers  = new ArrayList<>();
  44.     }

  45.     /** Add a propagator.
  46.      * @param propagator to add
  47.      * @return satellite satellite propagated by the propagator
  48.      */
  49.     public ObservableSatellite addPropagator(final Propagator propagator) {
  50.         propagators.add(propagator);
  51.         return new ObservableSatellite(propagators.size() - 1);
  52.     }

  53.     /** Get a registered propagator.
  54.      * @param satellite satellite propagated by the propagator {@link #addPropagator(Propagator)}
  55.      * @return propagator corresponding to satellite
  56.      */
  57.     public Propagator getPropagator(final ObservableSatellite satellite) {
  58.         return propagators.get(satellite.getPropagatorIndex());
  59.     }

  60.     /** Add a sequences generator for a specific measurement type.
  61.      * @param scheduler sequences generator to add
  62.      * @param <T> the type of the measurement
  63.      */
  64.     public <T extends ObservedMeasurement<T>> void addScheduler(final Scheduler<T> scheduler) {
  65.         schedulers.add(scheduler);
  66.     }

  67.     /** Generate measurements.
  68.      * @param start start of the measurements time span
  69.      * @param end end of the measurements time span
  70.      * @return generated measurements
  71.      */
  72.     public SortedSet<ObservedMeasurement<?>> generate(final AbsoluteDate start, final AbsoluteDate end) {

  73.         // initialize schedulers
  74.         for (final Scheduler<?> scheduler : schedulers) {
  75.             scheduler.init(start, end);
  76.         }

  77.         // set up parallelized propagators
  78.         final GeneratorHandler handler = new GeneratorHandler(schedulers);
  79.         final PropagatorsParallelizer parallelizer = new PropagatorsParallelizer(propagators, handler);

  80.         // generate the measurements
  81.         parallelizer.propagate(start, end);

  82.         return handler.getMeasurements();

  83.     }

  84.     /** Handler for measurements generation steps. */
  85.     private static class GeneratorHandler implements MultiSatStepHandler {

  86.         /** Sequences generators. */
  87.         private final List<Scheduler<?>> schedulers;

  88.         /** Set for holding measurements. */
  89.         private final SortedSet<ObservedMeasurement<?>> measurements;

  90.         /** Simple constructor.
  91.          * @param schedulers sequences generators
  92.          */
  93.         GeneratorHandler(final List<Scheduler<?>> schedulers) {
  94.             this.schedulers   = schedulers;
  95.             this.measurements = new TreeSet<>();
  96.         }

  97.         /** {@inheritDoc} */
  98.         @Override
  99.         public void init(final List<SpacecraftState> states0, final AbsoluteDate t) {
  100.             for (final Scheduler<?> scheduler : schedulers) {
  101.                 scheduler.init(states0.get(0).getDate(), t);
  102.             }
  103.         }

  104.         /** {@inheritDoc} */
  105.         @Override
  106.         public void handleStep(final List<OrekitStepInterpolator> interpolators, final boolean isLast) {
  107.             for (final Scheduler<?> scheduler : schedulers) {
  108.                 measurements.addAll(scheduler.generate(interpolators));
  109.             }
  110.         }

  111.         /** Get the generated measurements.
  112.          * @return generated measurements
  113.          */
  114.         public SortedSet<ObservedMeasurement<?>> getMeasurements() {
  115.             return measurements;
  116.         }

  117.     }

  118. }