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