1   /* Copyright 2002-2023 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.files.ccsds.ndm;
18  
19  import org.hipparchus.complex.Quaternion;
20  import org.orekit.files.ccsds.definitions.FrameFacade;
21  import org.orekit.files.ccsds.definitions.OrbitRelativeFrame;
22  import org.orekit.files.ccsds.ndm.cdm.AdditionalParameters;
23  import org.orekit.files.ccsds.ndm.odm.ocm.OrbitPhysicalProperties;
24  import org.orekit.files.ccsds.section.CommentsContainer;
25  import org.orekit.time.AbsoluteDate;
26  
27  /** Container for common physical properties for both {@link OrbitPhysicalProperties} and {@link AdditionalParameters}.
28   *
29   * @author Maxime Journot
30   * @since 11.3
31   */
32  public class CommonPhysicalProperties extends CommentsContainer {
33  
34      /** Optimally Enclosing Box parent reference frame. */
35      private FrameFacade oebParentFrame;
36  
37      /** Optimally Enclosing Box parent reference frame epoch. */
38      private AbsoluteDate oebParentFrameEpoch;
39  
40      /** Quaternion defining Optimally Enclosing Box. */
41      private final double[] oebQ;
42  
43      /** Maximum physical dimension of Optimally Enclosing Box. */
44      private double oebMax;
45  
46      /** Intermediate physical dimension of Optimally Enclosing Box. */
47      private double oebIntermediate;
48  
49      /** Minimum physical dimension of Optimally Enclosing Box. */
50      private double oebMin;
51  
52      /** Cross-sectional area of Optimally Enclosing Box when viewed along the maximum OEB direction. */
53      private double oebAreaAlongMax;
54  
55      /** Cross-sectional area of Optimally Enclosing Box when viewed along the intermediate OEB direction. */
56      private double oebAreaAlongIntermediate;
57  
58      /** Cross-sectional area of Optimally Enclosing Box when viewed along the minimum OEB direction. */
59      private double oebAreaAlongMin;
60  
61          /** Typical (50th percentile) radar cross-section. */
62      private double rcs;
63  
64      /** Minimum radar cross-section. */
65      private double minRcs;
66  
67      /** Maximum radar cross-section. */
68      private double maxRcs;
69  
70      /** Typical (50th percentile) visual magnitude. */
71      private double vmAbsolute;
72  
73      /** Minimum apparent visual magnitude. */
74      private double vmApparentMin;
75  
76      /** Typical (50th percentile) apparent visual magnitude. */
77      private double vmApparent;
78  
79      /** Maximum apparent visual magnitude. */
80      private double vmApparentMax;
81  
82      /** Typical (50th percentile) coefficient of reflectivity. */
83      private double reflectance;
84  
85      /** Simple constructor.
86       */
87      public CommonPhysicalProperties() {
88  
89          oebParentFrame           = new FrameFacade(null, null, OrbitRelativeFrame.RIC, null,
90                                                     OrbitRelativeFrame.RIC.name());
91          oebParentFrameEpoch      = AbsoluteDate.ARBITRARY_EPOCH;
92          oebQ                     = new double[4];
93          oebMax                   = Double.NaN;
94          oebIntermediate          = Double.NaN;
95          oebMin                   = Double.NaN;
96          oebAreaAlongMax          = Double.NaN;
97          oebAreaAlongIntermediate = Double.NaN;
98          oebAreaAlongMin          = Double.NaN;
99          rcs                      = Double.NaN;
100         minRcs                   = Double.NaN;
101         maxRcs                   = Double.NaN;
102         vmAbsolute               = Double.NaN;
103         vmApparentMin            = Double.NaN;
104         vmApparent               = Double.NaN;
105         vmApparentMax            = Double.NaN;
106         reflectance              = Double.NaN;
107     }
108 
109     /** {@inheritDoc} */
110     @Override
111     public void validate(final double version) {
112         super.validate(version);
113     }
114 
115     /** Get the Optimally Enclosing Box parent reference frame.
116      * @return Optimally Enclosing Box parent reference frame
117      */
118     public FrameFacade getOebParentFrame() {
119         return oebParentFrame;
120     }
121 
122     /** Set the Optimally Enclosing Box parent reference frame.
123      * @param oebParentFrame Optimally Enclosing Box parent reference frame
124      */
125     public void setOebParentFrame(final FrameFacade oebParentFrame) {
126         refuseFurtherComments();
127         this.oebParentFrame = oebParentFrame;
128     }
129 
130     /** Get the Optimally Enclosing Box parent reference frame epoch.
131      * @return Optimally Enclosing Box parent reference frame epoch
132      */
133     public AbsoluteDate getOebParentFrameEpoch() {
134         return oebParentFrameEpoch;
135     }
136 
137     /** Set the Optimally Enclosing Box parent reference frame epoch.
138      * @param oebParentFrameEpoch Optimally Enclosing Box parent reference frame epoch
139      */
140     public void setOebParentFrameEpoch(final AbsoluteDate oebParentFrameEpoch) {
141         refuseFurtherComments();
142         this.oebParentFrameEpoch = oebParentFrameEpoch;
143     }
144 
145     /** Get the quaternion defining Optimally Enclosing Box.
146      * @return quaternion defining Optimally Enclosing Box
147      */
148     public Quaternion getOebQ() {
149         return new Quaternion(oebQ[0], oebQ[1], oebQ[2], oebQ[3]);
150     }
151 
152     /** set the component of quaternion defining Optimally Enclosing Box.
153      * @param i index of the component
154      * @param qI component of quaternion defining Optimally Enclosing Box
155      */
156     public void setOebQ(final int i, final double qI) {
157         refuseFurtherComments();
158         oebQ[i] = qI;
159     }
160 
161     /** Get the maximum physical dimension of the OEB.
162      * @return maximum physical dimension of the OEB.
163      */
164     public double getOebMax() {
165         return oebMax;
166     }
167 
168     /** Set the maximum physical dimension of the OEB.
169      * @param oebMax maximum physical dimension of the OEB.
170      */
171     public void setOebMax(final double oebMax) {
172         refuseFurtherComments();
173         this.oebMax = oebMax;
174     }
175 
176     /** Get the intermediate physical dimension of the OEB.
177      * @return intermediate physical dimension of the OEB.
178      */
179     public double getOebIntermediate() {
180         return oebIntermediate;
181     }
182 
183     /** Set the intermediate physical dimension of the OEB.
184      * @param oebIntermediate intermediate physical dimension of the OEB.
185      */
186     public void setOebIntermediate(final double oebIntermediate) {
187         refuseFurtherComments();
188         this.oebIntermediate = oebIntermediate;
189     }
190 
191     /** Get the minimum physical dimension of the OEB.
192      * @return dimensions the minimum physical dimension of the OEB.
193      */
194     public double getOebMin() {
195         return oebMin;
196     }
197 
198     /** Set the minimum physical dimension of the OEB.
199      * @param oebMin the minimum physical dimension of the OEB.
200      */
201     public void setOebMin(final double oebMin) {
202         refuseFurtherComments();
203         this.oebMin = oebMin;
204     }
205 
206     /** Get the cross-sectional area of Optimally Enclosing Box when viewed along the maximum OEB direction.
207      * @return cross-sectional area of Optimally Enclosing Box when viewed along the maximum OEB direction.
208      */
209     public double getOebAreaAlongMax() {
210         return oebAreaAlongMax;
211     }
212 
213     /** Set the cross-sectional area of Optimally Enclosing Box when viewed along the maximum OEB direction.
214      * @param oebAreaAlongMax cross-sectional area of Optimally Enclosing Box when viewed along the maximum OEB direction.
215      */
216     public void setOebAreaAlongMax(final double oebAreaAlongMax) {
217         refuseFurtherComments();
218         this.oebAreaAlongMax = oebAreaAlongMax;
219     }
220 
221     /** Get the cross-sectional area of Optimally Enclosing Box when viewed along the intermediate OEB direction.
222      * @return cross-sectional area of Optimally Enclosing Box when viewed along the intermediate OEB direction.
223      */
224     public double getOebAreaAlongIntermediate() {
225         return oebAreaAlongIntermediate;
226     }
227 
228     /** Set the cross-sectional area of Optimally Enclosing Box when viewed along the intermediate OEB direction.
229      * @param oebAreaAlongIntermediate cross-sectional area of Optimally Enclosing Box when viewed along the intermediate OEB direction.
230      */
231     public void setOebAreaAlongIntermediate(final double oebAreaAlongIntermediate) {
232         refuseFurtherComments();
233         this.oebAreaAlongIntermediate = oebAreaAlongIntermediate;
234     }
235 
236     /** Get the cross-sectional area of Optimally Enclosing Box when viewed along the minimum OEB direction.
237      * @return cross-sectional area of Optimally Enclosing Box when viewed along the minimum OEB direction.
238      */
239     public double getOebAreaAlongMin() {
240         return oebAreaAlongMin;
241     }
242 
243     /** Set the cross-sectional area of Optimally Enclosing Box when viewed along the minimum OEB direction.
244      * @param oebAreaAlongMin cross-sectional area of Optimally Enclosing Box when viewed along the minimum OEB direction.
245      */
246     public void setOebAreaAlongMin(final double oebAreaAlongMin) {
247         refuseFurtherComments();
248         this.oebAreaAlongMin = oebAreaAlongMin;
249     }
250 
251 
252     /** Get the typical (50th percentile) radar cross-section.
253      * @return typical (50th percentile) radar cross-section
254      */
255     public double getRcs() {
256         return rcs;
257     }
258 
259     /** Set the typical (50th percentile) radar cross-section.
260      * @param rcs typical (50th percentile) radar cross-section
261      */
262     public void setRcs(final double rcs) {
263         refuseFurtherComments();
264         this.rcs = rcs;
265     }
266 
267     /** Get the minimum radar cross-section.
268      * @return minimum radar cross-section
269      */
270     public double getMinRcs() {
271         return minRcs;
272     }
273 
274     /** Set the minimum radar cross-section.
275      * @param minRcs minimum radar cross-section
276      */
277     public void setMinRcs(final double minRcs) {
278         refuseFurtherComments();
279         this.minRcs = minRcs;
280     }
281 
282     /** Get the maximum radar cross-section.
283      * @return maximum radar cross-section
284      */
285     public double getMaxRcs() {
286         return maxRcs;
287     }
288 
289     /** Set the maximum radar cross-section.
290      * @param maxRcs maximum radar cross-section
291      */
292     public void setMaxRcs(final double maxRcs) {
293         refuseFurtherComments();
294         this.maxRcs = maxRcs;
295     }
296 
297     /** Get the typical (50th percentile) visual magnitude.
298      * @return typical (50th percentile) visual magnitude
299      */
300     public double getVmAbsolute() {
301         return vmAbsolute;
302     }
303 
304     /** Set the typical (50th percentile) visual magnitude.
305      * @param vmAbsolute typical (50th percentile) visual magnitude
306      */
307     public void setVmAbsolute(final double vmAbsolute) {
308         refuseFurtherComments();
309         this.vmAbsolute = vmAbsolute;
310     }
311 
312     /** Get the minimum apparent visual magnitude.
313      * @return minimum apparent visual magnitude
314      */
315     public double getVmApparentMin() {
316         return vmApparentMin;
317     }
318 
319     /** Set the minimum apparent visual magnitude.
320      * @param vmApparentMin minimum apparent visual magnitude
321      */
322     public void setVmApparentMin(final double vmApparentMin) {
323         refuseFurtherComments();
324         this.vmApparentMin = vmApparentMin;
325     }
326 
327     /** Get the typical (50th percentile) apparent visual magnitude.
328      * @return typical (50th percentile) apparent visual magnitude
329      */
330     public double getVmApparent() {
331         return vmApparent;
332     }
333 
334     /** Set the typical (50th percentile) apparent visual magnitude.
335      * @param vmApparent typical (50th percentile) apparent visual magnitude
336      */
337     public void setVmApparent(final double vmApparent) {
338         refuseFurtherComments();
339         this.vmApparent = vmApparent;
340     }
341 
342     /** Get the maximum apparent visual magnitude.
343      * @return maximum apparent visual magnitude
344      */
345     public double getVmApparentMax() {
346         return vmApparentMax;
347     }
348 
349     /** Set the maximum apparent visual magnitude.
350      * @param vmApparentMax maximum apparent visual magnitude
351      */
352     public void setVmApparentMax(final double vmApparentMax) {
353         refuseFurtherComments();
354         this.vmApparentMax = vmApparentMax;
355     }
356 
357     /** Get the typical (50th percentile) coefficient of reflectance.
358      * @return typical (50th percentile) coefficient of reflectance
359      */
360     public double getReflectance() {
361         return reflectance;
362     }
363 
364     /** Set the typical (50th percentile) coefficient of reflectance.
365      * @param reflectance typical (50th percentile) coefficient of reflectance
366      */
367     public void setReflectance(final double reflectance) {
368         refuseFurtherComments();
369         this.reflectance = reflectance;
370     }
371 }