1   /* Copyright 2002-2026 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.propagation.conversion;
18  
19  import org.orekit.annotation.DefaultDataContext;
20  import org.orekit.attitudes.AttitudeProvider;
21  import org.orekit.attitudes.FrameAlignedProvider;
22  import org.orekit.data.DataContext;
23  import org.orekit.propagation.Propagator;
24  import org.orekit.propagation.analytical.tle.TLE;
25  import org.orekit.propagation.analytical.tle.TLEPropagator;
26  import org.orekit.propagation.analytical.tle.generation.TleGenerationAlgorithm;
27  import org.orekit.utils.ParameterDriversList;
28  
29  /** Builder for TLEPropagator.
30   * @author Pascal Parraud
31   * @author Thomas Paulet
32   * @since 6.0
33   */
34  public class TLEPropagatorBuilder
35      extends AbstractAnalyticalPropagatorBuilder<TLEPropagator, TLE, TleGenerationAlgorithm> {
36  
37      /** Data context used to access frames and time scales. */
38      private final DataContext dataContext;
39  
40      /** TLE generation algorithm. */
41      private final TleGenerationAlgorithm generationAlgorithm;
42  
43      /** Build a new instance. This constructor uses the {@link DataContext#getDefault()
44       * default data context}.
45       * @param generationAlgorithm TLE generation algorithm
46       * @see #TLEPropagatorBuilder(DataContext, TleGenerationAlgorithm)
47       * @see #TLEPropagatorBuilder(DataContext, TleGenerationAlgorithm, AttitudeProvider)
48       * @since 14.0
49       */
50      @DefaultDataContext
51      public TLEPropagatorBuilder(final TleGenerationAlgorithm generationAlgorithm) {
52          this(DataContext.getDefault(), generationAlgorithm);
53      }
54  
55      /** Build a new instance.
56       * @param dataContext used to access frames and time scales.
57       * @param generationAlgorithm TLE generation algorithm
58       * @see #TLEPropagatorBuilder(DataContext, TleGenerationAlgorithm, AttitudeProvider)
59       * @since 14.0
60       */
61      public TLEPropagatorBuilder(final DataContext dataContext,
62                                  final TleGenerationAlgorithm generationAlgorithm) {
63          this(dataContext, generationAlgorithm,
64               FrameAlignedProvider.of(dataContext.getFrames().getTEME()));
65      }
66  
67      /** Build a new instance.
68       * @param dataContext used to access frames and time scales.
69       * @param generationAlgorithm TLE generation algorithm
70       * @param attitudeProvider attitude law to use
71       * @since 14.0
72       */
73      public TLEPropagatorBuilder(final DataContext dataContext,
74                                  final TleGenerationAlgorithm generationAlgorithm,
75                                  final AttitudeProvider attitudeProvider) {
76          super(generationAlgorithm, false, attitudeProvider, Propagator.DEFAULT_MASS);
77          this.dataContext         = dataContext;
78          this.generationAlgorithm = generationAlgorithm;
79      }
80  
81      /** {@inheritDoc}. */
82      @Override
83      public TLEPropagatorBuilder clone() {
84          // Call to super clone() method to avoid warning
85          final TLEPropagatorBuilder clonedBuilder = (TLEPropagatorBuilder) super.clone();
86  
87          // Use cloned builder to unlink orbital drivers
88          final TLEPropagatorBuilder builder =
89              new TLEPropagatorBuilder(clonedBuilder.dataContext,
90                                       clonedBuilder.generationAlgorithm.clone(),
91                                       clonedBuilder.getAttitudeProvider());
92  
93          // Set mass
94          builder.setMass(getMass());
95  
96          // Ensure drivers' selection consistency
97          final ParameterDriversList propDrivers = clonedBuilder.getPropagationParametersDrivers();
98          builder.getPropagationParametersDrivers().getDrivers().
99                          forEach(driver -> driver.setSelected(propDrivers.findByName(driver.getName()).isSelected()));
100         return builder;
101     }
102 
103     /** {@inheritDoc} */
104     @Override
105     public TLEPropagator buildPropagator(final double[] normalizedParameters) {
106 
107         // set all parameters (including both orbital parameters and propagation parameters)
108         setParameters(normalizedParameters);
109 
110         // TLE related to the orbit
111         final TLE tle = getOrbitalParameterFactory().createFromDrivers();
112 
113         // propagator
114         final TLEPropagator propagator = TLEPropagator.selectExtrapolator(tle, getAttitudeProvider(), getMass(),
115                                                                           getOrbitalParameterFactory().getFrame());
116 
117         final boolean bStarSelected = this.getPropagationParametersDrivers().getDrivers().getFirst().isSelected();
118         propagator.getParametersDrivers().getFirst().setSelected(bStarSelected);
119         propagator.setTleGenerationAlgorithm(generationAlgorithm);
120         getImpulseManeuvers().forEach(propagator::addEventDetector);
121         return propagator;
122     }
123 
124 }