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