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