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.files.ccsds.ndm.cdm;
18
19 import java.util.List;
20 import java.util.Optional;
21
22 import org.orekit.annotation.Nullable;
23 import org.orekit.files.ccsds.ndm.odm.UserDefined;
24 import org.orekit.files.ccsds.section.CommentsContainer;
25 import org.orekit.files.ccsds.section.Data;
26
27 /**
28 * Container for Conjunction Data Message data.
29 * @author Melina Vanel
30 * @since 11.2
31 */
32 public class CdmData implements Data {
33
34 /** General comments block. */
35 private final CommentsContainer commentsBlock;
36
37 /** Quaternion block. */
38 @Nullable
39 private ODParameters ODParametersBlock;
40
41 /** Euler angles block. */
42 @Nullable
43 private AdditionalParameters additionalParametersBlock;
44
45 /** Spin-stabilized block. */
46 private final StateVector stateVectorBlock;
47
48 /** Spacecraft parameters block. */
49 private RTNCovariance covarianceMatrixBlock;
50
51 /** XYZ covariance block. */
52 @Nullable
53 private final XYZCovariance xyzCovarianceMatrixBlock;
54
55 /** Sigma/Eigenvectors covariance block. */
56 @Nullable
57 private final SigmaEigenvectorsCovariance sig3EigVec3CovarianceBlock;
58
59 /** Type of alternate covariance, if present. */
60 @Nullable
61 private final AltCovarianceType altCovarianceType;
62
63 /** Additional Covariance Metadata block. */
64 @Nullable
65 private final AdditionalCovarianceMetadata additionalCovMetadata;
66
67 /** The block containing the user defined parameters. */
68 @Nullable
69 private UserDefined userDefinedBlock;
70
71 /** Default constructor.
72 * @param commentsBlock general comments block
73 * @param ODParametersBlock OD parameters block (may be null)
74 * @param additionalParametersBlock additionnal parameters block (may be null)
75 * @param stateVectorBlock state vector block
76 * @param covarianceMatrixBlock covariance matrix in RTN coordinates frame block
77 * @param xyzCovarianceBlock XYZ covariance matrix block
78 * @param sig3EigVec3CovarianceBlock sigma/eigenvector covariance block
79 * @param altCovarianceType type of alternate covariance
80 * @param additionalCovMetadata additional covariance metadata
81 */
82 private CdmData(final CommentsContainer commentsBlock,
83 final ODParameters ODParametersBlock,
84 final AdditionalParameters additionalParametersBlock,
85 final StateVector stateVectorBlock,
86 final RTNCovariance covarianceMatrixBlock,
87 final XYZCovariance xyzCovarianceBlock,
88 final SigmaEigenvectorsCovariance sig3EigVec3CovarianceBlock,
89 final AltCovarianceType altCovarianceType,
90 final AdditionalCovarianceMetadata additionalCovMetadata) {
91 this.commentsBlock = commentsBlock;
92 this.ODParametersBlock = ODParametersBlock;
93 this.additionalParametersBlock = additionalParametersBlock;
94 this.stateVectorBlock = stateVectorBlock;
95 this.covarianceMatrixBlock = covarianceMatrixBlock;
96 this.xyzCovarianceMatrixBlock = xyzCovarianceBlock;
97 this.sig3EigVec3CovarianceBlock = sig3EigVec3CovarianceBlock;
98 this.altCovarianceType = altCovarianceType;
99 this.additionalCovMetadata = additionalCovMetadata;
100 this.userDefinedBlock = null;
101 }
102
103 /** Constructor with RTN covariance.
104 * @param commentsBlock general comments block
105 * @param ODParametersBlock OD parameters block (may be null)
106 * @param additionalParametersBlock additionnal parameters block (may be null)
107 * @param stateVectorBlock state vector block
108 * @param covarianceMatrixBlock covariance matrix in RTN coordinates frame block
109
110 */
111 public CdmData(final CommentsContainer commentsBlock,
112 final ODParameters ODParametersBlock,
113 final AdditionalParameters additionalParametersBlock,
114 final StateVector stateVectorBlock,
115 final RTNCovariance covarianceMatrixBlock) {
116 this(commentsBlock, ODParametersBlock, additionalParametersBlock, stateVectorBlock,
117 covarianceMatrixBlock, null, null, null, null);
118 }
119
120 /** Constructor with RTN covariance.
121 * @param commentsBlock general comments block
122 * @param ODParametersBlock OD parameters block (may be null)
123 * @param additionalParametersBlock additionnal parameters block (may be null)
124 * @param stateVectorBlock state vector block
125 * @param covarianceMatrixBlock covariance matrix in RTN coordinates frame block
126 * @param additionalCovMetadata additional covariance metadata
127 */
128 public CdmData(final CommentsContainer commentsBlock,
129 final ODParameters ODParametersBlock,
130 final AdditionalParameters additionalParametersBlock,
131 final StateVector stateVectorBlock,
132 final RTNCovariance covarianceMatrixBlock,
133 final AdditionalCovarianceMetadata additionalCovMetadata) {
134 this(commentsBlock, ODParametersBlock, additionalParametersBlock, stateVectorBlock,
135 covarianceMatrixBlock, null, null, null, additionalCovMetadata);
136 }
137
138 /** Constructor with RTN and XYZ covariance.
139 * @param commentsBlock general comments block
140 * @param ODParametersBlock OD parameters block (may be null)
141 * @param additionalParametersBlock additionnal parameters block (may be null)
142 * @param stateVectorBlock state vector block
143 * @param covarianceMatrixBlock covariance matrix in RTN coordinates frame block
144 * @param xyzCovarianceBlock XYZ covariance matrix block
145 * @param additionalCovMetadata additional covariance metadata
146 */
147 public CdmData(final CommentsContainer commentsBlock,
148 final ODParameters ODParametersBlock,
149 final AdditionalParameters additionalParametersBlock,
150 final StateVector stateVectorBlock,
151 final RTNCovariance covarianceMatrixBlock,
152 final XYZCovariance xyzCovarianceBlock,
153 final AdditionalCovarianceMetadata additionalCovMetadata) {
154 this(commentsBlock, ODParametersBlock, additionalParametersBlock, stateVectorBlock,
155 covarianceMatrixBlock, xyzCovarianceBlock, null, AltCovarianceType.XYZ, additionalCovMetadata);
156 }
157
158 /** Constructor with RTN and sigma/eigenvector covariance.
159 * @param commentsBlock general comments block
160 * @param ODParametersBlock OD parameters block (may be null)
161 * @param additionalParametersBlock additionnal parameters block (may be null)
162 * @param stateVectorBlock state vector block
163 * @param covarianceMatrixBlock covariance matrix in RTN coordinates frame block
164 * @param sig3EigVec3CovarianceBlock sigma/eigenvector covariance block
165 * @param additionalCovMetadata additional covariance metadata
166 */
167 public CdmData(final CommentsContainer commentsBlock,
168 final ODParameters ODParametersBlock,
169 final AdditionalParameters additionalParametersBlock,
170 final StateVector stateVectorBlock,
171 final RTNCovariance covarianceMatrixBlock,
172 final SigmaEigenvectorsCovariance sig3EigVec3CovarianceBlock,
173 final AdditionalCovarianceMetadata additionalCovMetadata) {
174 this(commentsBlock, ODParametersBlock, additionalParametersBlock, stateVectorBlock,
175 covarianceMatrixBlock, null, sig3EigVec3CovarianceBlock, AltCovarianceType.CSIG3EIGVEC3, additionalCovMetadata);
176 }
177
178 /** {@inheritDoc} */
179 @Override
180 public void validate(final double version) {
181 if (ODParametersBlock != null) {
182 ODParametersBlock.validate(version);
183 }
184 if (additionalParametersBlock != null) {
185 additionalParametersBlock.validate(version);
186 }
187 stateVectorBlock.validate(version);
188
189 // covariance options
190 if (altCovarianceType == null) {
191 covarianceMatrixBlock.validate(version);
192 } else if (altCovarianceType == AltCovarianceType.XYZ) {
193 xyzCovarianceMatrixBlock.validate(version);
194 } else if (altCovarianceType == AltCovarianceType.CSIG3EIGVEC3) {
195 sig3EigVec3CovarianceBlock.validate(version);
196 }
197
198 }
199
200 /** Get the comments.
201 * @return comments
202 */
203 public List<String> getComments() {
204 return commentsBlock.getComments();
205 }
206
207 /** Get the OD parameters logical block.
208 * @return OD parameters block (may be null)
209 */
210 public Optional<ODParameters> getODParametersBlock() {
211 return Optional.ofNullable(ODParametersBlock);
212 }
213
214 /** Set the OD parameters logical block.
215 * @param ODParametersBlock the OD Parameters logical block
216 */
217 public void setODParametersBlock(final ODParameters ODParametersBlock) {
218 this.ODParametersBlock = ODParametersBlock;
219 }
220
221 /** Get the additional parameters logical block.
222 * @return additional parameters block (may be null)
223 */
224 public Optional<AdditionalParameters> getAdditionalParametersBlock() {
225 return Optional.ofNullable(additionalParametersBlock);
226 }
227
228 /** Set the additional parameters logical block.
229 * @param additionalParametersBlock the additional parameters logical block
230 */
231 public void setAdditionalParametersBlock(final AdditionalParameters additionalParametersBlock) {
232 this.additionalParametersBlock = additionalParametersBlock;
233 }
234
235 /** Get the state vector logical block.
236 * @return state vector block
237 */
238 public StateVector getStateVectorBlock() {
239 return stateVectorBlock;
240 }
241
242 /** Get the covariance matrix logical block.
243 * <p> The RTN Covariance Matrix is provided in the 9×9 Lower Triangular Form. All parameters of the 6×6 position/velocity submatrix
244 * are mandatory. The remaining elements will return NaN if not provided. </p>
245 * @return covariance matrix block
246 */
247 public RTNCovariance getRTNCovarianceBlock() {
248 return covarianceMatrixBlock;
249 }
250
251 /** Get the Covariance Matrix in the XYZ Coordinate Frame (defined by value of {@link CdmMetadataKey#ALT_COV_REF_FRAME}).
252 * <p> This block is not mandatory and on condition that {@link CdmMetadataKey#ALT_COV_TYPE} = {@link AltCovarianceType#XYZ}.
253 * <p> This method will return null if the block is not defined in the CDM. </p>
254 * @return XYZ covariance matrix block
255 */
256 public Optional<XYZCovariance> getXYZCovarianceBlock() {
257 return Optional.ofNullable(xyzCovarianceMatrixBlock);
258 }
259
260 /** Get the Sigma / Eigenvector covariance logical block.
261 * <p> This block is not mandatory and on condition that {@link CdmMetadataKey#ALT_COV_TYPE} = {@link AltCovarianceType#CSIG3EIGVEC3}.
262 * <p> This method will return null if the block is not defined in the CDM. </p>
263 * @return the Sigma / Eigenvector covariance block
264 */
265 public Optional<SigmaEigenvectorsCovariance> getSig3EigVec3CovarianceBlock() {
266 return Optional.ofNullable(sig3EigVec3CovarianceBlock);
267 }
268
269 /** Get the additional covariance metadata logical block.
270 * <p> This method will return null if the block is not defined in the CDM. </p>
271 * @return the additional covariance metadata logical block
272 */
273 public Optional<AdditionalCovarianceMetadata> getAdditionalCovMetadataBlock() {
274 return Optional.ofNullable(additionalCovMetadata);
275 }
276
277 /** Set the additional covariance metadata logical block.
278 * @param covarianceMatrixBlock the additional covariance metadata logical block
279 */
280 public void setCovarianceMatrixBlock(final RTNCovariance covarianceMatrixBlock) {
281 this.covarianceMatrixBlock = covarianceMatrixBlock;
282 }
283
284 /** Get the user defined logical block.
285 * <p> This method will return null if the block is not defined in the CDM. </p>
286 * @return the additional covariance metadata logical block
287 */
288 public Optional<UserDefined> getUserDefinedBlock() {
289 return Optional.ofNullable(userDefinedBlock);
290 }
291
292 /** Set the user defined logical block.
293 * <p> This block is added at the end of the CDM parsing as common to both Object 1 and 2. </p>
294 * @param userDefinedBlock the user defined block to set
295 */
296 public void setUserDefinedBlock(final UserDefined userDefinedBlock) {
297 this.userDefinedBlock = userDefinedBlock;
298 }
299 }
300