ccsds-ndm-py 0.0.2__cp39-abi3-win_amd64.whl → 0.0.4__cp39-abi3-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
ccsds_ndm/__init__.pyi CHANGED
@@ -94,6 +94,15 @@ class Acm:
94
94
  @header.setter
95
95
  def header(self, value: AdmHeader) -> None: ...
96
96
  @property
97
+ def id(self) -> Optional[str]:
98
+ """
99
+ The message identifier.
100
+ """
101
+ ...
102
+
103
+ @id.setter
104
+ def id(self, value: Optional[str]) -> None: ...
105
+ @property
97
106
  def segment(self) -> AcmSegment:
98
107
  """
99
108
  ACM Segment.
@@ -102,19 +111,41 @@ class Acm:
102
111
 
103
112
  @segment.setter
104
113
  def segment(self, value: AcmSegment) -> None: ...
105
- def to_file(self, path, format):
114
+ def to_file(self, path, format, validate=True):
106
115
  """ """
107
116
  ...
108
117
 
109
- def to_str(self, format):
118
+ def to_str(self, format, validate=True):
110
119
  """ """
111
120
  ...
112
121
 
122
+ def validate(self, strict=True):
123
+ """
124
+ Validate the message against CCSDS rules.
125
+
126
+ Parameters
127
+ ----------
128
+ strict : bool, optional
129
+ If True (default), raises ValueError on the first error found.
130
+ If False, returns a list of validation error messages (or None if valid).
131
+ """
132
+ ...
133
+
134
+ @property
135
+ def version(self) -> str:
136
+ """
137
+ The message version.
138
+ """
139
+ ...
140
+
141
+ @version.setter
142
+ def version(self, value: str) -> None: ...
143
+
113
144
  class AcmAttitudeDetermination:
114
145
  """
115
146
  ACM Data: Attitude Determination Data Section.
116
147
  """
117
- def __init__(ad_id, comment) -> None: ...
148
+ def __init__(ad_id=None, comment=None) -> None: ...
118
149
  def __getstate__(self, /):
119
150
  """
120
151
  Helper for pickle.
@@ -125,7 +156,9 @@ class AcmAttitudeState:
125
156
  """
126
157
  ACM Data: Attitude State Time History Section.
127
158
  """
128
- def __init__(ref_frame_a, ref_frame_b, att_type, att_lines, comment) -> None: ...
159
+ def __init__(
160
+ ref_frame_a, ref_frame_b, att_type, att_lines, comment=None
161
+ ) -> None: ...
129
162
  def __getstate__(self, /):
130
163
  """
131
164
  Helper for pickle.
@@ -136,7 +169,9 @@ class AcmCovarianceMatrix:
136
169
  """
137
170
  ACM Data: Covariance Time History Section.
138
171
  """
139
- def __init__(cov_basis, cov_ref_frame, cov_type, cov_lines, comment) -> None: ...
172
+ def __init__(
173
+ cov_basis, cov_ref_frame, cov_type, cov_lines, comment=None
174
+ ) -> None: ...
140
175
  def __getstate__(self, /):
141
176
  """
142
177
  Helper for pickle.
@@ -147,7 +182,9 @@ class AcmData:
147
182
  """
148
183
  ACM Data Section.
149
184
  """
150
- def __init__(att, phys, cov, man, ad, user) -> None: ...
185
+ def __init__(
186
+ att=None, phys=None, cov=None, man=None, ad=None, user=None
187
+ ) -> None: ...
151
188
  def __getstate__(self, /):
152
189
  """
153
190
  Helper for pickle.
@@ -182,12 +219,17 @@ class AcmData:
182
219
 
183
220
  @user.setter
184
221
  def user(self, value: UserDefined) -> None: ...
222
+ def validate(self, metadata):
223
+ """
224
+ Validate the data section against CCSDS rules.
225
+ """
226
+ ...
185
227
 
186
228
  class AcmManeuverParameters:
187
229
  """
188
230
  ACM Data: Maneuver Specification Section.
189
231
  """
190
- def __init__(man_id, comment) -> None: ...
232
+ def __init__(man_id=None, comment=None) -> None: ...
191
233
  def __getstate__(self, /):
192
234
  """
193
235
  Helper for pickle.
@@ -246,12 +288,17 @@ class AcmMetadata:
246
288
 
247
289
  @object_name.setter
248
290
  def object_name(self, value: str) -> None: ...
291
+ def validate(self):
292
+ """
293
+ Validate the metadata section against CCSDS rules.
294
+ """
295
+ ...
249
296
 
250
297
  class AcmPhysicalDescription:
251
298
  """
252
299
  ACM Data: Space Object Physical Characteristics Section.
253
300
  """
254
- def __init__(comment) -> None: ...
301
+ def __init__(comment=None) -> None: ...
255
302
  def __getstate__(self, /):
256
303
  """
257
304
  Helper for pickle.
@@ -284,6 +331,11 @@ class AcmSegment:
284
331
 
285
332
  @metadata.setter
286
333
  def metadata(self, value: AcmMetadata) -> None: ...
334
+ def validate(self, header):
335
+ """
336
+ Validate the segment against CCSDS rules.
337
+ """
338
+ ...
287
339
 
288
340
  class AdditionalParameters:
289
341
  """
@@ -436,7 +488,7 @@ class AdmHeader:
436
488
  Represents the `admHeader` complex type from the XSD.
437
489
  """
438
490
  def __init__(
439
- creation_date, originator, classification, message_id, comment
491
+ creation_date, originator, classification=None, message_id=None, comment=None
440
492
  ) -> None: ...
441
493
  def __getstate__(self, /):
442
494
  """
@@ -554,6 +606,15 @@ class Aem:
554
606
  @header.setter
555
607
  def header(self, value: AdmHeader) -> None: ...
556
608
  @property
609
+ def id(self) -> Optional[str]:
610
+ """
611
+ The message identifier.
612
+ """
613
+ ...
614
+
615
+ @id.setter
616
+ def id(self, value: Optional[str]) -> None: ...
617
+ @property
557
618
  def segments(self) -> list[AemSegment]:
558
619
  """
559
620
  AEM Segments.
@@ -562,19 +623,45 @@ class Aem:
562
623
 
563
624
  @segments.setter
564
625
  def segments(self, value: list[AemSegment]) -> None: ...
565
- def to_file(self, path, format):
566
- """ """
626
+ def to_file(self, path, format, validate=True):
627
+ """
628
+ Write to file.
629
+ """
567
630
  ...
568
631
 
569
- def to_str(self, format):
570
- """ """
632
+ def to_str(self, format, validate=True):
633
+ """
634
+ Serialize to string.
635
+ """
636
+ ...
637
+
638
+ def validate(self, strict=True):
639
+ """
640
+ Validate the message against CCSDS rules.
641
+
642
+ Parameters
643
+ ----------
644
+ strict : bool, optional
645
+ If True (default), raises ValueError on the first error found.
646
+ If False, returns a list of validation error messages (or None if valid).
647
+ """
571
648
  ...
572
649
 
650
+ @property
651
+ def version(self) -> str:
652
+ """
653
+ The message version.
654
+ """
655
+ ...
656
+
657
+ @version.setter
658
+ def version(self, value: str) -> None: ...
659
+
573
660
  class AemData:
574
661
  """
575
662
  AEM Data Section.
576
663
  """
577
- def __init__(attitude_states, comment) -> None: ...
664
+ def __init__(attitude_states, comment=None) -> None: ...
578
665
  def __getstate__(self, /):
579
666
  """
580
667
  Helper for pickle.
@@ -591,14 +678,27 @@ class AemData:
591
678
  @attitude_states.setter
592
679
  def attitude_states(self, value: list[AttitudeState]) -> None: ...
593
680
  @property
594
- def attitude_states_numpy(self) -> tuple[list[str], numpy.ndarray]:
681
+ def attitude_states_epochs(self) -> list[str]:
595
682
  """
596
- Get attitude states as a tuple of epoch strings and a 2D NumPy array.
683
+ Epochs for attitude states (ISO 8601).
684
+ """
685
+ ...
686
+
687
+ @attitude_states_epochs.setter
688
+ def attitude_states_epochs(self, value: list[str]) -> None: ...
689
+ @property
690
+ def attitude_states_numpy(self) -> numpy.ndarray:
691
+ """
692
+ Get attitude states as a 2D NumPy array.
693
+
694
+ Use `attitude_states_epochs` for the corresponding epochs.
695
+
696
+ Currently only supports Quaternion Ephemeris states.
597
697
  """
598
698
  ...
599
699
 
600
700
  @attitude_states_numpy.setter
601
- def attitude_states_numpy(self, value: tuple[list[str], numpy.ndarray]) -> None: ...
701
+ def attitude_states_numpy(self, value: numpy.ndarray) -> None: ...
602
702
  @property
603
703
  def comment(self) -> list[str]:
604
704
  """
@@ -609,6 +709,16 @@ class AemData:
609
709
 
610
710
  @comment.setter
611
711
  def comment(self, value: list[str]) -> None: ...
712
+ @staticmethod
713
+ def from_numpy(epochs, array, comment=None):
714
+ """ """
715
+ ...
716
+
717
+ def validate(self, attitude_type):
718
+ """
719
+ Validate the data section against CCSDS rules.
720
+ """
721
+ ...
612
722
 
613
723
  class AemMetadata:
614
724
  """
@@ -853,6 +963,11 @@ class AemMetadata:
853
963
 
854
964
  @useable_stop_time.setter
855
965
  def useable_stop_time(self, value: str) -> None: ...
966
+ def validate(self):
967
+ """
968
+ Validate the metadata section against CCSDS rules.
969
+ """
970
+ ...
856
971
 
857
972
  class AemSegment:
858
973
  def __init__(metadata, data) -> None: ...
@@ -880,6 +995,11 @@ class AemSegment:
880
995
 
881
996
  @metadata.setter
882
997
  def metadata(self, value: AemMetadata) -> None: ...
998
+ def validate(self):
999
+ """
1000
+ Validate the segment against CCSDS rules.
1001
+ """
1002
+ ...
883
1003
 
884
1004
  class AngVelState:
885
1005
  """
@@ -1015,6 +1135,15 @@ class Apm:
1015
1135
  @header.setter
1016
1136
  def header(self, value: AdmHeader) -> None: ...
1017
1137
  @property
1138
+ def id(self) -> Optional[str]:
1139
+ """
1140
+ The message identifier.
1141
+ """
1142
+ ...
1143
+
1144
+ @id.setter
1145
+ def id(self, value: Optional[str]) -> None: ...
1146
+ @property
1018
1147
  def segment(self) -> ApmSegment:
1019
1148
  """
1020
1149
  APM Segment.
@@ -1023,27 +1152,53 @@ class Apm:
1023
1152
 
1024
1153
  @segment.setter
1025
1154
  def segment(self, value: ApmSegment) -> None: ...
1026
- def to_file(self, path, format):
1027
- """ """
1155
+ def to_file(self, path, format, validate=True):
1156
+ """
1157
+ Write to file.
1158
+ """
1028
1159
  ...
1029
1160
 
1030
- def to_str(self, format):
1031
- """ """
1161
+ def to_str(self, format, validate=True):
1162
+ """
1163
+ Serialize to string.
1164
+ """
1165
+ ...
1166
+
1167
+ def validate(self, strict=True):
1168
+ """
1169
+ Validate the message against CCSDS rules.
1170
+
1171
+ Parameters
1172
+ ----------
1173
+ strict : bool, optional
1174
+ If True (default), raises ValueError on the first error found.
1175
+ If False, returns a list of validation error messages (or None if valid).
1176
+ """
1032
1177
  ...
1033
1178
 
1179
+ @property
1180
+ def version(self) -> str:
1181
+ """
1182
+ The message version.
1183
+ """
1184
+ ...
1185
+
1186
+ @version.setter
1187
+ def version(self, value: str) -> None: ...
1188
+
1034
1189
  class ApmData:
1035
1190
  """
1036
1191
  APM Data Section.
1037
1192
  """
1038
1193
  def __init__(
1039
1194
  epoch,
1040
- quaternion_state,
1041
- euler_angle_state,
1042
- angular_velocity,
1043
- spin,
1044
- inertia,
1045
- maneuver_parameters,
1046
- comment,
1195
+ quaternion_state=None,
1196
+ euler_angle_state=None,
1197
+ angular_velocity=None,
1198
+ spin=None,
1199
+ inertia=None,
1200
+ maneuver_parameters=None,
1201
+ comment=None,
1047
1202
  ) -> None: ...
1048
1203
  def __getstate__(self, /):
1049
1204
  """
@@ -1409,7 +1564,7 @@ class Cdm:
1409
1564
  - Relative position and velocity of Object2 with respect to Object1.
1410
1565
  - Metadata describing how the data was determined (orbit determination settings).
1411
1566
  """
1412
- def __init__(header, body, id=None, version=...) -> None: ...
1567
+ def __init__(header, body) -> None: ...
1413
1568
  def __getstate__(self, /):
1414
1569
  """
1415
1570
  Helper for pickle.
@@ -1508,7 +1663,7 @@ class Cdm:
1508
1663
 
1509
1664
  @id.setter
1510
1665
  def id(self, value: Optional[str]) -> None: ...
1511
- def to_file(self, path, format):
1666
+ def to_file(self, path, format, validate=True):
1512
1667
  """
1513
1668
  Write the CDM to a file.
1514
1669
 
@@ -1518,10 +1673,12 @@ class Cdm:
1518
1673
  The output file path.
1519
1674
  format : str
1520
1675
  The output format ('kvn' or 'xml').
1676
+ validate : bool, optional
1677
+ Whether to validate the message before writing (default: True).
1521
1678
  """
1522
1679
  ...
1523
1680
 
1524
- def to_str(self, format):
1681
+ def to_str(self, format, validate=True):
1525
1682
  """
1526
1683
  Serialize the CDM to a string.
1527
1684
 
@@ -1529,6 +1686,8 @@ class Cdm:
1529
1686
  ----------
1530
1687
  format : str
1531
1688
  The output format ('kvn' or 'xml').
1689
+ validate : bool, optional
1690
+ Whether to validate the message before writing (default: True).
1532
1691
 
1533
1692
  Returns
1534
1693
  -------
@@ -1537,6 +1696,18 @@ class Cdm:
1537
1696
  """
1538
1697
  ...
1539
1698
 
1699
+ def validate(self, strict=True):
1700
+ """
1701
+ Validate the message against CCSDS rules.
1702
+
1703
+ Parameters
1704
+ ----------
1705
+ strict : bool, optional
1706
+ If True (default), raises ValueError on the first error found.
1707
+ If False, returns a list of validation error messages (or None if valid).
1708
+ """
1709
+ ...
1710
+
1540
1711
  @property
1541
1712
  def version(self) -> str:
1542
1713
  """
@@ -1708,31 +1879,31 @@ class CdmCovarianceMatrix:
1708
1879
  cndot_rdot,
1709
1880
  cndot_tdot,
1710
1881
  cndot_ndot,
1711
- cdrg_r,
1712
- cdrg_t,
1713
- cdrg_n,
1714
- cdrg_rdot,
1715
- cdrg_tdot,
1716
- cdrg_ndot,
1717
- cdrg_drg,
1718
- csrp_r,
1719
- csrp_t,
1720
- csrp_n,
1721
- csrp_rdot,
1722
- csrp_tdot,
1723
- csrp_ndot,
1724
- csrp_drg,
1725
- csrp_srp,
1726
- cthr_r,
1727
- cthr_t,
1728
- cthr_n,
1729
- cthr_rdot,
1730
- cthr_tdot,
1731
- cthr_ndot,
1732
- cthr_drg,
1733
- cthr_srp,
1734
- cthr_thr,
1735
- comment,
1882
+ cdrg_r=None,
1883
+ cdrg_t=None,
1884
+ cdrg_n=None,
1885
+ cdrg_rdot=None,
1886
+ cdrg_tdot=None,
1887
+ cdrg_ndot=None,
1888
+ cdrg_drg=None,
1889
+ csrp_r=None,
1890
+ csrp_t=None,
1891
+ csrp_n=None,
1892
+ csrp_rdot=None,
1893
+ csrp_tdot=None,
1894
+ csrp_ndot=None,
1895
+ csrp_drg=None,
1896
+ csrp_srp=None,
1897
+ cthr_r=None,
1898
+ cthr_t=None,
1899
+ cthr_n=None,
1900
+ cthr_rdot=None,
1901
+ cthr_tdot=None,
1902
+ cthr_ndot=None,
1903
+ cthr_drg=None,
1904
+ cthr_srp=None,
1905
+ cthr_thr=None,
1906
+ comment=None,
1736
1907
  ) -> None: ...
1737
1908
  def __getstate__(self, /):
1738
1909
  """
@@ -2244,10 +2415,16 @@ class CdmCovarianceMatrix:
2244
2415
 
2245
2416
  @cthr_thr.setter
2246
2417
  def cthr_thr(self, value: float) -> None: ...
2418
+ @staticmethod
2419
+ def from_numpy(array, comment=None):
2420
+ """ """
2421
+ ...
2422
+
2247
2423
  def to_numpy(self):
2248
2424
  """
2249
- Returns the full 9x9 covariance matrix as a NumPy array.
2250
- If the optional 7,8,9 rows (Drag, SRP, Thrust) are missing, they are filled with 0.0.
2425
+ Returns the covariance matrix as a NumPy array.
2426
+ The size will be 6x6, 7x7, 8x8, or 9x9 depending on whether optional
2427
+ Drag, SRP, and Thrust parameters are provided, as per CCSDS 508.0-B-1.
2251
2428
  """
2252
2429
  ...
2253
2430
 
@@ -2265,7 +2442,13 @@ class CdmData:
2265
2442
  covariance_matrix : CdmCovarianceMatrix
2266
2443
  Object covariance at TCA.
2267
2444
  """
2268
- def __init__(state_vector, covariance_matrix, comments) -> None: ...
2445
+ def __init__(
2446
+ state_vector,
2447
+ covariance_matrix=None,
2448
+ od_parameters=None,
2449
+ additional_parameters=None,
2450
+ comments=None,
2451
+ ) -> None: ...
2269
2452
  def __getstate__(self, /):
2270
2453
  """
2271
2454
  Helper for pickle.
@@ -2291,14 +2474,37 @@ class CdmData:
2291
2474
  @comment.setter
2292
2475
  def comment(self, value: list[str]) -> None: ...
2293
2476
  @property
2294
- def covariance_matrix(self) -> CdmCovarianceMatrix:
2477
+ def covariance_matrix(self) -> Optional[CdmCovarianceMatrix]:
2295
2478
  """
2296
2479
  Covariance Matrix.
2297
2480
  """
2298
2481
  ...
2299
2482
 
2300
2483
  @covariance_matrix.setter
2301
- def covariance_matrix(self, value: CdmCovarianceMatrix) -> None: ...
2484
+ def covariance_matrix(self, value: Optional[CdmCovarianceMatrix]) -> None: ...
2485
+ @property
2486
+ def covariance_matrix_numpy(self) -> numpy.ndarray:
2487
+ """
2488
+ Covariance matrix as a NumPy array (convenience method).
2489
+
2490
+ Returns:
2491
+ numpy.ndarray: 9x9 covariance matrix.
2492
+ """
2493
+ ...
2494
+
2495
+ @covariance_matrix_numpy.setter
2496
+ def covariance_matrix_numpy(self, value: numpy.ndarray) -> None: ...
2497
+ @staticmethod
2498
+ def from_numpy(
2499
+ state_vector,
2500
+ covariance_matrix=None,
2501
+ od_parameters=None,
2502
+ additional_parameters=None,
2503
+ comments=None,
2504
+ ):
2505
+ """ """
2506
+ ...
2507
+
2302
2508
  @property
2303
2509
  def od_parameters(self) -> Optional[OdParameters]:
2304
2510
  """
@@ -2317,6 +2523,19 @@ class CdmData:
2317
2523
 
2318
2524
  @state_vector.setter
2319
2525
  def state_vector(self, value: CdmStateVector) -> None: ...
2526
+ @property
2527
+ def state_vector_numpy(self) -> numpy.ndarray:
2528
+ """
2529
+ State vector as a NumPy array (convenience method).
2530
+
2531
+ Returns:
2532
+ numpy.ndarray: 1D array of shape (6,) containing [X, Y, Z, X_DOT, Y_DOT, Z_DOT].
2533
+ Units: [km, km, km, km/s, km/s, km/s]
2534
+ """
2535
+ ...
2536
+
2537
+ @state_vector_numpy.setter
2538
+ def state_vector_numpy(self, value: numpy.ndarray) -> None: ...
2320
2539
 
2321
2540
  class CdmHeader:
2322
2541
  """
@@ -2467,10 +2686,10 @@ class CdmMetadata:
2467
2686
  catalog_name,
2468
2687
  object_name,
2469
2688
  international_designator,
2689
+ ref_frame,
2470
2690
  ephemeris_name=...,
2471
2691
  covariance_method=None,
2472
2692
  maneuverable=None,
2473
- ref_frame=None,
2474
2693
  object_type=None,
2475
2694
  operator_contact_position=None,
2476
2695
  operator_organization=None,
@@ -2539,7 +2758,7 @@ class CdmMetadata:
2539
2758
  @covariance_method.setter
2540
2759
  def covariance_method(self, value: CovarianceMethodType) -> None: ...
2541
2760
  @property
2542
- def earth_tides(self) -> Optional[str]:
2761
+ def earth_tides(self) -> Optional[bool]:
2543
2762
  """
2544
2763
  Indication of whether solid Earth and ocean tides were used for the OD of the object.
2545
2764
 
@@ -2548,7 +2767,7 @@ class CdmMetadata:
2548
2767
  ...
2549
2768
 
2550
2769
  @earth_tides.setter
2551
- def earth_tides(self, value: Optional[str]) -> None: ...
2770
+ def earth_tides(self, value: Optional[bool]) -> None: ...
2552
2771
  @property
2553
2772
  def ephemeris_name(self) -> str:
2554
2773
  """
@@ -2591,7 +2810,7 @@ class CdmMetadata:
2591
2810
  @international_designator.setter
2592
2811
  def international_designator(self, value: str) -> None: ...
2593
2812
  @property
2594
- def intrack_thrust(self) -> Optional[str]:
2813
+ def intrack_thrust(self) -> Optional[bool]:
2595
2814
  """
2596
2815
  Indication of whether in-track thrust modeling was used for the OD of the object.
2597
2816
 
@@ -2600,7 +2819,7 @@ class CdmMetadata:
2600
2819
  ...
2601
2820
 
2602
2821
  @intrack_thrust.setter
2603
- def intrack_thrust(self, value: Optional[str]) -> None: ...
2822
+ def intrack_thrust(self, value: Optional[bool]) -> None: ...
2604
2823
  @property
2605
2824
  def maneuverable(self) -> ManeuverableType:
2606
2825
  """
@@ -2738,7 +2957,7 @@ class CdmMetadata:
2738
2957
  @ref_frame.setter
2739
2958
  def ref_frame(self, value: ReferenceFrameType) -> None: ...
2740
2959
  @property
2741
- def solar_rad_pressure(self) -> Optional[str]:
2960
+ def solar_rad_pressure(self) -> Optional[bool]:
2742
2961
  """
2743
2962
  Indication of whether solar radiation pressure perturbations were used for the OD of the
2744
2963
  object.
@@ -2748,7 +2967,7 @@ class CdmMetadata:
2748
2967
  ...
2749
2968
 
2750
2969
  @solar_rad_pressure.setter
2751
- def solar_rad_pressure(self, value: Optional[str]) -> None: ...
2970
+ def solar_rad_pressure(self, value: Optional[bool]) -> None: ...
2752
2971
 
2753
2972
  class CdmObjectType:
2754
2973
  """
@@ -2819,6 +3038,21 @@ class CdmStateVector:
2819
3038
  """
2820
3039
  ...
2821
3040
 
3041
+ @staticmethod
3042
+ def from_numpy(array):
3043
+ """ """
3044
+ ...
3045
+
3046
+ def to_numpy(self) -> numpy.ndarray:
3047
+ """
3048
+ Return the state vector as a NumPy array.
3049
+
3050
+ Returns:
3051
+ numpy.ndarray: 1D array of shape (6,) containing [X, Y, Z, X_DOT, Y_DOT, Z_DOT].
3052
+ Units: [km, km, km, km/s, km/s, km/s]
3053
+ """
3054
+ ...
3055
+
2822
3056
  @property
2823
3057
  def x(self) -> float:
2824
3058
  """
@@ -3690,8 +3924,8 @@ class KeplerianElements:
3690
3924
  ra_of_asc_node,
3691
3925
  arg_of_pericenter,
3692
3926
  gm,
3693
- true_anomaly,
3694
- mean_anomaly,
3927
+ true_anomaly=None,
3928
+ mean_anomaly=None,
3695
3929
  ) -> None: ...
3696
3930
  def __getstate__(self, /):
3697
3931
  """
@@ -3848,8 +4082,8 @@ class ManeuverParameters:
3848
4082
  man_tor_1,
3849
4083
  man_tor_2,
3850
4084
  man_tor_3,
3851
- man_delta_mass,
3852
- comment,
4085
+ man_delta_mass=None,
4086
+ comment=None,
3853
4087
  ) -> None: ...
3854
4088
  def __getstate__(self, /):
3855
4089
  """
@@ -3984,9 +4218,9 @@ class MeanElements:
3984
4218
  ra_of_asc_node,
3985
4219
  arg_of_pericenter,
3986
4220
  mean_anomaly,
3987
- semi_major_axis,
3988
- mean_motion,
3989
- gm,
4221
+ semi_major_axis=None,
4222
+ mean_motion=None,
4223
+ gm=None,
3990
4224
  ) -> None: ...
3991
4225
  def __getstate__(self, /):
3992
4226
  """
@@ -4183,7 +4417,7 @@ class Ndm:
4183
4417
  def messages(
4184
4418
  self, value: list[Union[Oem, Cdm, Opm, Omm, Ocm, Rdm, Tdm, Ndm]]
4185
4419
  ) -> None: ...
4186
- def to_file(self, path, format):
4420
+ def to_file(self, path, format, validate=True):
4187
4421
  """
4188
4422
  Write to file.
4189
4423
 
@@ -4193,15 +4427,29 @@ class Ndm:
4193
4427
  Output file path.
4194
4428
  format : str
4195
4429
  Output format ('kvn' or 'xml').
4430
+ validate : bool, optional
4431
+ Whether to validate the message before writing (default: True).
4196
4432
  """
4197
4433
  ...
4198
4434
 
4199
- def to_str(self, format):
4435
+ def to_str(self, format, validate=True):
4200
4436
  """
4201
4437
  Serialize to a string.
4202
4438
  """
4203
4439
  ...
4204
4440
 
4441
+ def validate(self, strict=True):
4442
+ """
4443
+ Validate the combined message against CCSDS rules.
4444
+
4445
+ Parameters
4446
+ ----------
4447
+ strict : bool, optional
4448
+ If True (default), raises ValueError on the first error found.
4449
+ If False, returns a list of validation error messages (or None if valid).
4450
+ """
4451
+ ...
4452
+
4205
4453
  class ObjectDescription:
4206
4454
  def __getstate__(self, /):
4207
4455
  """
@@ -4297,6 +4545,15 @@ class Ocm:
4297
4545
  @header.setter
4298
4546
  def header(self, value: OdmHeader) -> None: ...
4299
4547
  @property
4548
+ def id(self) -> Optional[str]:
4549
+ """
4550
+ The message identifier.
4551
+ """
4552
+ ...
4553
+
4554
+ @id.setter
4555
+ def id(self, value: Optional[str]) -> None: ...
4556
+ @property
4300
4557
  def segment(self) -> OcmSegment:
4301
4558
  """
4302
4559
  The OCM data segment.
@@ -4305,7 +4562,7 @@ class Ocm:
4305
4562
 
4306
4563
  @segment.setter
4307
4564
  def segment(self, value: OcmSegment) -> None: ...
4308
- def to_file(self, path, format):
4565
+ def to_file(self, path, format, validate=True):
4309
4566
  """
4310
4567
  Write to file.
4311
4568
 
@@ -4315,10 +4572,12 @@ class Ocm:
4315
4572
  Output file path.
4316
4573
  format : str
4317
4574
  Output format ('kvn' or 'xml').
4575
+ validate : bool, optional
4576
+ Whether to validate the message before writing (default: True).
4318
4577
  """
4319
4578
  ...
4320
4579
 
4321
- def to_str(self, format):
4580
+ def to_str(self, format, validate=True):
4322
4581
  """
4323
4582
  Serialize to string.
4324
4583
 
@@ -4326,6 +4585,8 @@ class Ocm:
4326
4585
  ----------
4327
4586
  format : str
4328
4587
  Output format ('kvn' or 'xml').
4588
+ validate : bool, optional
4589
+ Whether to validate the message before writing (default: True).
4329
4590
 
4330
4591
  Returns
4331
4592
  -------
@@ -4334,6 +4595,28 @@ class Ocm:
4334
4595
  """
4335
4596
  ...
4336
4597
 
4598
+ def validate(self, strict=True):
4599
+ """
4600
+ Validate the message against CCSDS rules.
4601
+
4602
+ Parameters
4603
+ ----------
4604
+ strict : bool, optional
4605
+ If True (default), raises ValueError on the first error found.
4606
+ If False, returns a list of validation error messages (or None if valid).
4607
+ """
4608
+ ...
4609
+
4610
+ @property
4611
+ def version(self) -> str:
4612
+ """
4613
+ The message version.
4614
+ """
4615
+ ...
4616
+
4617
+ @version.setter
4618
+ def version(self, value: str) -> None: ...
4619
+
4337
4620
  class OcmCovarianceMatrix:
4338
4621
  """
4339
4622
  OCM Covariance Matrix.
@@ -7839,17 +8122,17 @@ class OdParameters:
7839
8122
  Comments.
7840
8123
  """
7841
8124
  def __init__(
7842
- time_lastob_start,
7843
- time_lastob_end,
7844
- recommended_od_span,
7845
- actual_od_span,
7846
- obs_available,
7847
- obs_used,
7848
- tracks_available,
7849
- tracks_used,
7850
- residuals_accepted,
7851
- weighted_rms,
7852
- comment,
8125
+ time_lastob_start=None,
8126
+ time_lastob_end=None,
8127
+ recommended_od_span=None,
8128
+ actual_od_span=None,
8129
+ obs_available=None,
8130
+ obs_used=None,
8131
+ tracks_available=None,
8132
+ tracks_used=None,
8133
+ residuals_accepted=None,
8134
+ weighted_rms=None,
8135
+ comment=...,
7853
8136
  ) -> None: ...
7854
8137
  def __getstate__(self, /):
7855
8138
  """
@@ -7990,7 +8273,7 @@ class OdmHeader:
7990
8273
  Comments.
7991
8274
  """
7992
8275
  def __init__(
7993
- creation_date, originator, classification, message_id, comment
8276
+ creation_date, originator, classification=None, message_id=None, comment=None
7994
8277
  ) -> None: ...
7995
8278
  def __getstate__(self, /):
7996
8279
  """
@@ -8011,9 +8294,17 @@ class OdmHeader:
8011
8294
  @classification.setter
8012
8295
  def classification(self, value: Optional[str]) -> None: ...
8013
8296
  @property
8014
- def comment(self): ...
8297
+ def comment(self) -> list[str]:
8298
+ """
8299
+ Comments (allowed in the ODM Header only immediately after the ODM version number).
8300
+ (See 7.8 for formatting rules.)
8301
+
8302
+ Examples: This is a comment
8303
+ """
8304
+ ...
8305
+
8015
8306
  @comment.setter
8016
- def comment(self, value: object) -> None: ...
8307
+ def comment(self, value: list[str]) -> None: ...
8017
8308
  @property
8018
8309
  def creation_date(self) -> str:
8019
8310
  """
@@ -8129,6 +8420,15 @@ class Oem:
8129
8420
  @header.setter
8130
8421
  def header(self, value: OdmHeader) -> None: ...
8131
8422
  @property
8423
+ def id(self) -> Optional[str]:
8424
+ """
8425
+ The message identifier.
8426
+ """
8427
+ ...
8428
+
8429
+ @id.setter
8430
+ def id(self, value: Optional[str]) -> None: ...
8431
+ @property
8132
8432
  def segments(self) -> list[OemSegment]:
8133
8433
  """
8134
8434
  The list of data segments.
@@ -8137,7 +8437,7 @@ class Oem:
8137
8437
 
8138
8438
  @segments.setter
8139
8439
  def segments(self, value: list[OemSegment]) -> None: ...
8140
- def to_file(self, path, format):
8440
+ def to_file(self, path, format, validate=True):
8141
8441
  """
8142
8442
  Write to file.
8143
8443
 
@@ -8147,10 +8447,20 @@ class Oem:
8147
8447
  Output file path.
8148
8448
  format : str
8149
8449
  Output format ('kvn' or 'xml').
8450
+ Write to file.
8451
+
8452
+ Parameters
8453
+ ----------
8454
+ path : str
8455
+ Output file path.
8456
+ format : str
8457
+ Output format ('kvn' or 'xml').
8458
+ validate : bool, optional
8459
+ Whether to validate the message before writing (default: True).
8150
8460
  """
8151
8461
  ...
8152
8462
 
8153
- def to_str(self, format):
8463
+ def to_str(self, format, validate=True):
8154
8464
  """
8155
8465
  Serialize to string.
8156
8466
 
@@ -8163,9 +8473,44 @@ class Oem:
8163
8473
  -------
8164
8474
  str
8165
8475
  The serialized string.
8476
+ Serialize to string.
8477
+
8478
+ Parameters
8479
+ ----------
8480
+ format : str
8481
+ Output format ('kvn' or 'xml').
8482
+ validate : bool, optional
8483
+ Whether to validate the message before writing (default: True).
8484
+
8485
+ Returns
8486
+ -------
8487
+ str
8488
+ The serialized string.
8489
+ """
8490
+ ...
8491
+
8492
+ def validate(self, strict=True):
8493
+ """
8494
+ Validate the message against CCSDS rules.
8495
+
8496
+ Parameters
8497
+ ----------
8498
+ strict : bool, optional
8499
+ If True (default), raises ValueError on the first error found.
8500
+ If False, returns a list of validation error messages (or None if valid).
8501
+ """
8502
+ ...
8503
+
8504
+ @property
8505
+ def version(self) -> str:
8506
+ """
8507
+ The message version.
8166
8508
  """
8167
8509
  ...
8168
8510
 
8511
+ @version.setter
8512
+ def version(self, value: str) -> None: ...
8513
+
8169
8514
  class OemCovarianceMatrix:
8170
8515
  """
8171
8516
  OEM Covariance Matrix.
@@ -8178,7 +8523,8 @@ class OemCovarianceMatrix:
8178
8523
  epoch : str
8179
8524
  Epoch of the covariance matrix (ISO 8601).
8180
8525
  values : numpy.ndarray
8181
- Flat NumPy array of length 21 containing the covariance values.
8526
+ NumPy array of shape (21,) containing the lower-triangular values, or (6,6) for
8527
+ a full symmetric matrix.
8182
8528
  cov_ref_frame : str, optional
8183
8529
  Reference frame for the covariance matrix.
8184
8530
  comment : list[str], optional
@@ -8513,7 +8859,7 @@ class OemData:
8513
8859
  comments : list[str], optional
8514
8860
  Comments.
8515
8861
  """
8516
- def __init__(state_vectors, comments) -> None: ...
8862
+ def __init__(state_vectors, covariance_matrix=None, comments=None) -> None: ...
8517
8863
  def __getstate__(self, /):
8518
8864
  """
8519
8865
  Helper for pickle.
@@ -8546,19 +8892,43 @@ class OemData:
8546
8892
  @covariance_matrix.setter
8547
8893
  def covariance_matrix(self, value: list[OemCovarianceMatrix]) -> None: ...
8548
8894
  @property
8549
- def covariance_matrix_numpy(self) -> tuple[list[str], numpy.ndarray]:
8895
+ def covariance_matrix_epochs(self) -> list[str]:
8550
8896
  """
8551
- Get covariance matrices as a tuple associated with a NumPy array.
8897
+ Epochs for covariance matrices (ISO 8601).
8898
+ """
8899
+ ...
8552
8900
 
8553
- Returns:
8554
- tuple[list[str], np.ndarray]: (Epochs, 2D Array of size Nx21).
8901
+ @covariance_matrix_epochs.setter
8902
+ def covariance_matrix_epochs(self, value: list[str]) -> None: ...
8903
+ @property
8904
+ def covariance_matrix_numpy(self) -> numpy.ndarray:
8905
+ """
8906
+ Get covariance matrices as a NumPy array.
8907
+
8908
+ Use `covariance_matrix_epochs` for the corresponding epochs.
8909
+
8910
+ The returned array is a 3D tensor of shape (N, 6, 6), where N is the number of covariance
8911
+ matrices. Each 6x6 matrix is symmetric and constructed from the lower-triangular CCSDS data.
8912
+
8913
+ Indices: 0=X, 1=Y, 2=Z, 3=X_DOT, 4=Y_DOT, 5=Z_DOT
8555
8914
  """
8556
8915
  ...
8557
8916
 
8558
8917
  @covariance_matrix_numpy.setter
8559
- def covariance_matrix_numpy(
8560
- self, value: tuple[list[str], numpy.ndarray]
8561
- ) -> None: ...
8918
+ def covariance_matrix_numpy(self, value: numpy.ndarray) -> None: ...
8919
+ @staticmethod
8920
+ def from_numpy(
8921
+ state_vector_epochs,
8922
+ state_vector_numpy,
8923
+ covariance_matrix_epochs=None,
8924
+ covariance_matrix_numpy=None,
8925
+ cov_ref_frames=None,
8926
+ cov_comments=None,
8927
+ comments=None,
8928
+ ):
8929
+ """ """
8930
+ ...
8931
+
8562
8932
  @property
8563
8933
  def state_vector(self) -> list[StateVectorAcc]:
8564
8934
  """
@@ -8574,31 +8944,42 @@ class OemData:
8574
8944
  @state_vector.setter
8575
8945
  def state_vector(self, value: list[StateVectorAcc]) -> None: ...
8576
8946
  @property
8577
- def state_vector_numpy(self) -> tuple[list[str], numpy.ndarray]:
8947
+ def state_vector_epochs(self) -> list[str]:
8948
+ """
8949
+ Epochs for state vectors (ISO 8601).
8578
8950
  """
8579
- State vectors as a tuple of epochs and a NumPy array.
8951
+ ...
8580
8952
 
8581
- This method allows for efficient zero-copy access to state vector data
8582
- compatible with scientific Python libraries.
8953
+ @state_vector_epochs.setter
8954
+ def state_vector_epochs(self, value: list[str]) -> None: ...
8955
+ @property
8956
+ def state_vector_numpy(self) -> numpy.ndarray:
8957
+ """
8958
+ State vectors as a NumPy array.
8959
+
8960
+ Use `state_vector_epochs` for the corresponding epochs.
8583
8961
 
8584
8962
  Returns
8585
8963
  -------
8586
- tuple[list[str], numpy.ndarray]
8587
- A tuple containing:
8588
- - List of epoch strings (ISO 8601 format).
8589
- - 2D NumPy array of shape (N, 6) or (N, 9):
8590
- - N x 6: [X, Y, Z, X_DOT, Y_DOT, Z_DOT] if no accelerations.
8591
- - N x 9: [X, Y, Z, X_DOT, Y_DOT, Z_DOT, X_DDOT, Y_DDOT, Z_DDOT] if accelerations present.
8964
+ numpy.ndarray
8965
+ 2D array of shape (N, 6) or (N, 9):
8966
+ - N x 6: [X, Y, Z, X_DOT, Y_DOT, Z_DOT] if no accelerations.
8967
+ - N x 9: [X, Y, Z, X_DOT, Y_DOT, Z_DOT, X_DDOT, Y_DDOT, Z_DDOT] if accelerations present.
8592
8968
 
8593
- Units:
8594
- - Position: km
8595
- - Velocity: km/s
8596
- - Acceleration: km/s²
8969
+ Units:
8970
+ - Position: km
8971
+ - Velocity: km/s
8972
+ - Acceleration: km/s²
8597
8973
  """
8598
8974
  ...
8599
8975
 
8600
8976
  @state_vector_numpy.setter
8601
- def state_vector_numpy(self, value: tuple[list[str], numpy.ndarray]) -> None: ...
8977
+ def state_vector_numpy(self, value: numpy.ndarray) -> None: ...
8978
+ def validate(self):
8979
+ """
8980
+ Validate the data section against CCSDS rules.
8981
+ """
8982
+ ...
8602
8983
 
8603
8984
  class OemMetadata:
8604
8985
  """
@@ -8834,6 +9215,11 @@ class OemMetadata:
8834
9215
 
8835
9216
  @useable_stop_time.setter
8836
9217
  def useable_stop_time(self, value: Optional[str]) -> None: ...
9218
+ def validate(self):
9219
+ """
9220
+ Validate the metadata against CCSDS rules.
9221
+ """
9222
+ ...
8837
9223
 
8838
9224
  class OemSegment:
8839
9225
  """
@@ -8875,6 +9261,11 @@ class OemSegment:
8875
9261
 
8876
9262
  @metadata.setter
8877
9263
  def metadata(self, value: OemMetadata) -> None: ...
9264
+ def validate(self):
9265
+ """
9266
+ Validate the segment against CCSDS rules.
9267
+ """
9268
+ ...
8878
9269
 
8879
9270
  class Omm:
8880
9271
  """
@@ -8946,6 +9337,15 @@ class Omm:
8946
9337
  @header.setter
8947
9338
  def header(self, value: OdmHeader) -> None: ...
8948
9339
  @property
9340
+ def id(self) -> Optional[str]:
9341
+ """
9342
+ The message identifier.
9343
+ """
9344
+ ...
9345
+
9346
+ @id.setter
9347
+ def id(self, value: Optional[str]) -> None: ...
9348
+ @property
8949
9349
  def segment(self) -> OmmSegment:
8950
9350
  """
8951
9351
  The data segment.
@@ -8954,7 +9354,7 @@ class Omm:
8954
9354
 
8955
9355
  @segment.setter
8956
9356
  def segment(self, value: OmmSegment) -> None: ...
8957
- def to_file(self, path, format):
9357
+ def to_file(self, path, format, validate=True):
8958
9358
  """
8959
9359
  Write to file.
8960
9360
 
@@ -8964,10 +9364,12 @@ class Omm:
8964
9364
  Output file path.
8965
9365
  format : str
8966
9366
  Output format ('kvn' or 'xml').
9367
+ validate : bool, optional
9368
+ Whether to validate the message before writing (default: True).
8967
9369
  """
8968
9370
  ...
8969
9371
 
8970
- def to_str(self, format):
9372
+ def to_str(self, format, validate=True):
8971
9373
  """
8972
9374
  Serialize to string.
8973
9375
 
@@ -8976,6 +9378,8 @@ class Omm:
8976
9378
  format : str
8977
9379
  Output format ('kvn' or 'xml').
8978
9380
  (Mandatory)
9381
+ validate : bool, optional
9382
+ Whether to validate the message before writing (default: True).
8979
9383
 
8980
9384
  Returns
8981
9385
  -------
@@ -8984,11 +9388,33 @@ class Omm:
8984
9388
  """
8985
9389
  ...
8986
9390
 
9391
+ def validate(self, strict=True):
9392
+ """
9393
+ Validate the message against CCSDS rules.
9394
+
9395
+ Parameters
9396
+ ----------
9397
+ strict : bool, optional
9398
+ If True (default), raises ValueError on the first error found.
9399
+ If False, returns a list of validation error messages (or None if valid).
9400
+ """
9401
+ ...
9402
+
9403
+ @property
9404
+ def version(self) -> str:
9405
+ """
9406
+ The message version.
9407
+ """
9408
+ ...
9409
+
9410
+ @version.setter
9411
+ def version(self, value: str) -> None: ...
9412
+
8987
9413
  class OmmData:
8988
9414
  """
8989
9415
  OMM Data section.
8990
9416
  """
8991
- def __init__(mean_elements, comments) -> None: ...
9417
+ def __init__(mean_elements, comments=None) -> None: ...
8992
9418
  def __getstate__(self, /):
8993
9419
  """
8994
9420
  Helper for pickle.
@@ -9307,6 +9733,15 @@ class Opm:
9307
9733
  @header.setter
9308
9734
  def header(self, value: OdmHeader) -> None: ...
9309
9735
  @property
9736
+ def id(self) -> Optional[str]:
9737
+ """
9738
+ The message identifier.
9739
+ """
9740
+ ...
9741
+
9742
+ @id.setter
9743
+ def id(self, value: Optional[str]) -> None: ...
9744
+ @property
9310
9745
  def segment(self) -> OpmSegment:
9311
9746
  """
9312
9747
  The data segment.
@@ -9315,7 +9750,7 @@ class Opm:
9315
9750
 
9316
9751
  @segment.setter
9317
9752
  def segment(self, value: OpmSegment) -> None: ...
9318
- def to_file(self, path, format):
9753
+ def to_file(self, path, format, validate=True):
9319
9754
  """
9320
9755
  Write to file.
9321
9756
 
@@ -9325,10 +9760,12 @@ class Opm:
9325
9760
  Output file path.
9326
9761
  format : str
9327
9762
  Output format ('kvn' or 'xml').
9763
+ validate : bool, optional
9764
+ Whether to validate the message before writing (default: True).
9328
9765
  """
9329
9766
  ...
9330
9767
 
9331
- def to_str(self, format):
9768
+ def to_str(self, format, validate=True):
9332
9769
  """
9333
9770
  Serialize to string.
9334
9771
 
@@ -9336,6 +9773,8 @@ class Opm:
9336
9773
  ----------
9337
9774
  format : str
9338
9775
  Output format ('kvn' or 'xml').
9776
+ validate : bool, optional
9777
+ Whether to validate the message before writing (default: True).
9339
9778
 
9340
9779
  Returns
9341
9780
  -------
@@ -9344,6 +9783,28 @@ class Opm:
9344
9783
  """
9345
9784
  ...
9346
9785
 
9786
+ def validate(self, strict=True):
9787
+ """
9788
+ Validate the message against CCSDS rules.
9789
+
9790
+ Parameters
9791
+ ----------
9792
+ strict : bool, optional
9793
+ If True (default), raises ValueError on the first error found.
9794
+ If False, returns a list of validation error messages (or None if valid).
9795
+ """
9796
+ ...
9797
+
9798
+ @property
9799
+ def version(self) -> str:
9800
+ """
9801
+ The message version.
9802
+ """
9803
+ ...
9804
+
9805
+ @version.setter
9806
+ def version(self, value: str) -> None: ...
9807
+
9347
9808
  class OpmCovarianceMatrix:
9348
9809
  """
9349
9810
  Position/Velocity Covariance Matrix (6x6 Lower Triangular Form. None or all parameters of the
@@ -9405,29 +9866,29 @@ class OpmCovarianceMatrix:
9405
9866
  ... (see Parameters for full list of attributes with units)
9406
9867
  """
9407
9868
  def __init__(
9408
- cx_x,
9409
- cy_x,
9410
- cy_y,
9411
- cz_x,
9412
- cz_y,
9413
- cz_z,
9414
- cx_dot_x,
9415
- cx_dot_y,
9416
- cx_dot_z,
9417
- cy_dot_x,
9418
- cy_dot_y,
9419
- cy_dot_z,
9420
- cz_dot_x,
9421
- cz_dot_y,
9422
- cz_dot_z,
9423
- cx_dot_x_dot,
9424
- cy_dot_x_dot,
9425
- cy_dot_y_dot,
9426
- cz_dot_x_dot,
9427
- cz_dot_y_dot,
9428
- cz_dot_z_dot,
9429
- cov_ref_frame,
9430
- comments,
9869
+ cx_x=None,
9870
+ cy_x=None,
9871
+ cy_y=None,
9872
+ cz_x=None,
9873
+ cz_y=None,
9874
+ cz_z=None,
9875
+ cx_dot_x=None,
9876
+ cx_dot_y=None,
9877
+ cx_dot_z=None,
9878
+ cy_dot_x=None,
9879
+ cy_dot_y=None,
9880
+ cy_dot_z=None,
9881
+ cz_dot_x=None,
9882
+ cz_dot_y=None,
9883
+ cz_dot_z=None,
9884
+ cx_dot_x_dot=None,
9885
+ cy_dot_x_dot=None,
9886
+ cy_dot_y_dot=None,
9887
+ cz_dot_x_dot=None,
9888
+ cz_dot_y_dot=None,
9889
+ cz_dot_z_dot=None,
9890
+ cov_ref_frame=None,
9891
+ comments=None,
9431
9892
  ) -> None: ...
9432
9893
  def __getstate__(self, /):
9433
9894
  """
@@ -9695,7 +10156,7 @@ class OpmData:
9695
10156
  state_vector : StateVector
9696
10157
  State vector.
9697
10158
  """
9698
- def __init__(state_vector, comment) -> None: ...
10159
+ def __init__(state_vector, comment=None) -> None: ...
9699
10160
  def __getstate__(self, /):
9700
10161
  """
9701
10162
  Helper for pickle.
@@ -10131,6 +10592,15 @@ class Rdm:
10131
10592
  @header.setter
10132
10593
  def header(self, value: RdmHeader) -> None: ...
10133
10594
  @property
10595
+ def id(self) -> Optional[str]:
10596
+ """
10597
+ The message identifier.
10598
+ """
10599
+ ...
10600
+
10601
+ @id.setter
10602
+ def id(self, value: Optional[str]) -> None: ...
10603
+ @property
10134
10604
  def segment(self) -> RdmSegment:
10135
10605
  """
10136
10606
  The RDM Body consists of a single segment.
@@ -10139,7 +10609,7 @@ class Rdm:
10139
10609
 
10140
10610
  @segment.setter
10141
10611
  def segment(self, value: RdmSegment) -> None: ...
10142
- def to_file(self, path, format):
10612
+ def to_file(self, path, format, validate=True):
10143
10613
  """
10144
10614
  Write to a file.
10145
10615
 
@@ -10149,6 +10619,8 @@ class Rdm:
10149
10619
  Output file path.
10150
10620
  format : str
10151
10621
  Format ('kvn' or 'xml').
10622
+ validate : bool, optional
10623
+ Whether to validate the message before writing (default: True).
10152
10624
  """
10153
10625
  ...
10154
10626
 
@@ -10163,7 +10635,7 @@ class Rdm:
10163
10635
  """
10164
10636
  ...
10165
10637
 
10166
- def to_str(self, format):
10638
+ def to_str(self, format, validate=True):
10167
10639
  """
10168
10640
  Serialize to string (generic).
10169
10641
 
@@ -10171,6 +10643,8 @@ class Rdm:
10171
10643
  ----------
10172
10644
  format : str
10173
10645
  Format ('kvn' or 'xml').
10646
+ validate : bool, optional
10647
+ Whether to validate the message before writing (default: True).
10174
10648
 
10175
10649
  Returns
10176
10650
  -------
@@ -10190,6 +10664,28 @@ class Rdm:
10190
10664
  """
10191
10665
  ...
10192
10666
 
10667
+ def validate(self, strict=True):
10668
+ """
10669
+ Validate the message against CCSDS rules.
10670
+
10671
+ Parameters
10672
+ ----------
10673
+ strict : bool, optional
10674
+ If True (default), raises ValueError on the first error found.
10675
+ If False, returns a list of validation error messages (or None if valid).
10676
+ """
10677
+ ...
10678
+
10679
+ @property
10680
+ def version(self) -> str:
10681
+ """
10682
+ The message version.
10683
+ """
10684
+ ...
10685
+
10686
+ @version.setter
10687
+ def version(self, value: str) -> None: ...
10688
+
10193
10689
  class RdmData:
10194
10690
  """
10195
10691
  The RDM Data section.
@@ -11106,15 +11602,6 @@ class RelativeMetadataData:
11106
11602
  @miss_distance.setter
11107
11603
  def miss_distance(self, value: float) -> None: ...
11108
11604
  @property
11109
- def relative_position(self) -> Optional[list[float]]:
11110
- """
11111
- Relative position [R, T, N].
11112
- """
11113
- ...
11114
-
11115
- @relative_position.setter
11116
- def relative_position(self, value: Optional[list[float]]) -> None: ...
11117
- @property
11118
11605
  def relative_speed(self) -> Optional[float]:
11119
11606
  """
11120
11607
  The norm of the relative velocity vector. It indicates how fast the two objects are
@@ -11127,14 +11614,14 @@ class RelativeMetadataData:
11127
11614
  @relative_speed.setter
11128
11615
  def relative_speed(self, value: Optional[float]) -> None: ...
11129
11616
  @property
11130
- def relative_velocity(self) -> Optional[list[float]]:
11617
+ def relative_state_vector(self) -> Optional[RelativeStateVector]:
11131
11618
  """
11132
- Relative velocity [R, T, N].
11619
+ Relative state vector [R, T, N, VR, VT, VN] (combined position and velocity).
11133
11620
  """
11134
11621
  ...
11135
11622
 
11136
- @relative_velocity.setter
11137
- def relative_velocity(self, value: Optional[list[float]]) -> None: ...
11623
+ @relative_state_vector.setter
11624
+ def relative_state_vector(self, value: Optional[RelativeStateVector]) -> None: ...
11138
11625
  @property
11139
11626
  def screen_entry_time(self) -> Optional[str]:
11140
11627
  """
@@ -11241,6 +11728,115 @@ class RelativeMetadataData:
11241
11728
  @tca.setter
11242
11729
  def tca(self, value: str) -> None: ...
11243
11730
 
11731
+ class RelativeStateVector:
11732
+ """
11733
+ Relative State Vector containing relative position and velocity.
11734
+
11735
+ Parameters
11736
+ ----------
11737
+ relative_position_r : float
11738
+ Relative position R component. Units: m.
11739
+ relative_position_t : float
11740
+ Relative position T component. Units: m.
11741
+ relative_position_n : float
11742
+ Relative position N component. Units: m.
11743
+ relative_velocity_r : float
11744
+ Relative velocity R component. Units: m/s.
11745
+ relative_velocity_t : float
11746
+ Relative velocity T component. Units: m/s.
11747
+ relative_velocity_n : float
11748
+ Relative velocity N component. Units: m/s.
11749
+ """
11750
+ def __init__(
11751
+ relative_position_r,
11752
+ relative_position_t,
11753
+ relative_position_n,
11754
+ relative_velocity_r,
11755
+ relative_velocity_t,
11756
+ relative_velocity_n,
11757
+ ) -> None: ...
11758
+ def __getstate__(self, /):
11759
+ """
11760
+ Helper for pickle.
11761
+ """
11762
+ ...
11763
+
11764
+ @property
11765
+ def relative_position_n(self) -> float:
11766
+ """
11767
+ Relative position N component.
11768
+
11769
+ Units: m
11770
+ """
11771
+ ...
11772
+
11773
+ @relative_position_n.setter
11774
+ def relative_position_n(self, value: float) -> None: ...
11775
+ @property
11776
+ def relative_position_r(self) -> float:
11777
+ """
11778
+ Relative position R component.
11779
+
11780
+ Units: m
11781
+ """
11782
+ ...
11783
+
11784
+ @relative_position_r.setter
11785
+ def relative_position_r(self, value: float) -> None: ...
11786
+ @property
11787
+ def relative_position_t(self) -> float:
11788
+ """
11789
+ Relative position T component.
11790
+
11791
+ Units: m
11792
+ """
11793
+ ...
11794
+
11795
+ @relative_position_t.setter
11796
+ def relative_position_t(self, value: float) -> None: ...
11797
+ @property
11798
+ def relative_velocity_n(self) -> float:
11799
+ """
11800
+ Relative velocity N component.
11801
+
11802
+ Units: m/s
11803
+ """
11804
+ ...
11805
+
11806
+ @relative_velocity_n.setter
11807
+ def relative_velocity_n(self, value: float) -> None: ...
11808
+ @property
11809
+ def relative_velocity_r(self) -> float:
11810
+ """
11811
+ Relative velocity R component.
11812
+
11813
+ Units: m/s
11814
+ """
11815
+ ...
11816
+
11817
+ @relative_velocity_r.setter
11818
+ def relative_velocity_r(self, value: float) -> None: ...
11819
+ @property
11820
+ def relative_velocity_t(self) -> float:
11821
+ """
11822
+ Relative velocity T component.
11823
+
11824
+ Units: m/s
11825
+ """
11826
+ ...
11827
+
11828
+ @relative_velocity_t.setter
11829
+ def relative_velocity_t(self, value: float) -> None: ...
11830
+ def to_numpy(self) -> numpy.ndarray:
11831
+ """
11832
+ Return the relative state vector as a NumPy array.
11833
+
11834
+ Returns:
11835
+ numpy.ndarray: 1D array of shape (6,) containing [R, T, N, VR, VT, VN].
11836
+ Units: [m, m, m, m/s, m/s, m/s]
11837
+ """
11838
+ ...
11839
+
11244
11840
  class ScreenVolumeFrameType:
11245
11841
  def __getstate__(self, /):
11246
11842
  """
@@ -11276,7 +11872,11 @@ class SpacecraftParameters:
11276
11872
  Drag coefficient.
11277
11873
  """
11278
11874
  def __init__(
11279
- mass, solar_rad_area, solar_rad_coeff, drag_area, drag_coeff
11875
+ mass=None,
11876
+ solar_rad_area=None,
11877
+ solar_rad_coeff=None,
11878
+ drag_area=None,
11879
+ drag_coeff=None,
11280
11880
  ) -> None: ...
11281
11881
  def __getstate__(self, /):
11282
11882
  """
@@ -11548,7 +12148,7 @@ class StateVector:
11548
12148
  z_dot : float
11549
12149
  Velocity vector Z-component (km/s).
11550
12150
  """
11551
- def __init__(epoch, x, y, z, x_dot, y_dot, z_dot, comments) -> None: ...
12151
+ def __init__(epoch, x, y, z, x_dot, y_dot, z_dot, comments=None) -> None: ...
11552
12152
  def __getstate__(self, /):
11553
12153
  """
11554
12154
  Helper for pickle.
@@ -11668,7 +12268,7 @@ class StateVectorAcc:
11668
12268
  Acceleration vector Z-component (km/s²).
11669
12269
  """
11670
12270
  def __init__(
11671
- epoch, x, y, z, x_dot, y_dot, z_dot, x_ddot, y_ddot, z_ddot
12271
+ epoch, x, y, z, x_dot, y_dot, z_dot, x_ddot=None, y_ddot=None, z_ddot=None
11672
12272
  ) -> None: ...
11673
12273
  def __getstate__(self, /):
11674
12274
  """
@@ -11890,6 +12490,15 @@ class Tdm:
11890
12490
  @header.setter
11891
12491
  def header(self, value: TdmHeader) -> None: ...
11892
12492
  @property
12493
+ def id(self) -> Optional[str]:
12494
+ """
12495
+ The message identifier.
12496
+ """
12497
+ ...
12498
+
12499
+ @id.setter
12500
+ def id(self, value: Optional[str]) -> None: ...
12501
+ @property
11893
12502
  def segments(self) -> list[TdmSegment]:
11894
12503
  """
11895
12504
  Shortcut to access segments directly from the body.
@@ -11898,7 +12507,7 @@ class Tdm:
11898
12507
 
11899
12508
  @segments.setter
11900
12509
  def segments(self, value: list[TdmSegment]) -> None: ...
11901
- def to_file(self, path, format):
12510
+ def to_file(self, path, format, validate=True):
11902
12511
  """
11903
12512
  Write to file.
11904
12513
 
@@ -11908,10 +12517,12 @@ class Tdm:
11908
12517
  Output file path.
11909
12518
  format : str
11910
12519
  Output format ('kvn' or 'xml').
12520
+ validate : bool, optional
12521
+ Whether to validate the message before writing (default: True).
11911
12522
  """
11912
12523
  ...
11913
12524
 
11914
- def to_str(self, format):
12525
+ def to_str(self, format, validate=True):
11915
12526
  """
11916
12527
  Serialize to string.
11917
12528
 
@@ -11919,6 +12530,8 @@ class Tdm:
11919
12530
  ----------
11920
12531
  format : str
11921
12532
  Output format ('kvn' or 'xml').
12533
+ validate : bool, optional
12534
+ Whether to validate the message before writing (default: True).
11922
12535
 
11923
12536
  Returns
11924
12537
  -------
@@ -11927,6 +12540,28 @@ class Tdm:
11927
12540
  """
11928
12541
  ...
11929
12542
 
12543
+ def validate(self, strict=True):
12544
+ """
12545
+ Validate the message against CCSDS rules.
12546
+
12547
+ Parameters
12548
+ ----------
12549
+ strict : bool, optional
12550
+ If True (default), raises ValueError on the first error found.
12551
+ If False, returns a list of validation error messages (or None if valid).
12552
+ """
12553
+ ...
12554
+
12555
+ @property
12556
+ def version(self) -> str:
12557
+ """
12558
+ The message version.
12559
+ """
12560
+ ...
12561
+
12562
+ @version.setter
12563
+ def version(self, value: str) -> None: ...
12564
+
11930
12565
  class TdmBody:
11931
12566
  """
11932
12567
  The TDM Body consists of one or more TDM Segments.
@@ -11968,7 +12603,7 @@ class TdmData:
11968
12603
  Comments in the data section.
11969
12604
  (Optional)
11970
12605
  """
11971
- def __init__(*, observations=None, comment=None) -> None: ...
12606
+ def __init__(observations=None, comment=None) -> None: ...
11972
12607
  def __getstate__(self, /):
11973
12608
  """
11974
12609
  Helper for pickle.