ccsds-ndm-py 0.0.3__cp39-abi3-win32.whl → 0.0.4__cp39-abi3-win32.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]:
682
+ """
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:
595
691
  """
596
- Get attitude states as a tuple of epoch strings and a 2D NumPy array.
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
+ """
1032
1165
  ...
1033
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
+ """
1177
+ ...
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.
@@ -2311,6 +2494,17 @@ class CdmData:
2311
2494
 
2312
2495
  @covariance_matrix_numpy.setter
2313
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
+
2314
2508
  @property
2315
2509
  def od_parameters(self) -> Optional[OdParameters]:
2316
2510
  """
@@ -2492,10 +2686,10 @@ class CdmMetadata:
2492
2686
  catalog_name,
2493
2687
  object_name,
2494
2688
  international_designator,
2689
+ ref_frame,
2495
2690
  ephemeris_name=...,
2496
2691
  covariance_method=None,
2497
2692
  maneuverable=None,
2498
- ref_frame=None,
2499
2693
  object_type=None,
2500
2694
  operator_contact_position=None,
2501
2695
  operator_organization=None,
@@ -2564,7 +2758,7 @@ class CdmMetadata:
2564
2758
  @covariance_method.setter
2565
2759
  def covariance_method(self, value: CovarianceMethodType) -> None: ...
2566
2760
  @property
2567
- def earth_tides(self) -> Optional[str]:
2761
+ def earth_tides(self) -> Optional[bool]:
2568
2762
  """
2569
2763
  Indication of whether solid Earth and ocean tides were used for the OD of the object.
2570
2764
 
@@ -2573,7 +2767,7 @@ class CdmMetadata:
2573
2767
  ...
2574
2768
 
2575
2769
  @earth_tides.setter
2576
- def earth_tides(self, value: Optional[str]) -> None: ...
2770
+ def earth_tides(self, value: Optional[bool]) -> None: ...
2577
2771
  @property
2578
2772
  def ephemeris_name(self) -> str:
2579
2773
  """
@@ -2616,7 +2810,7 @@ class CdmMetadata:
2616
2810
  @international_designator.setter
2617
2811
  def international_designator(self, value: str) -> None: ...
2618
2812
  @property
2619
- def intrack_thrust(self) -> Optional[str]:
2813
+ def intrack_thrust(self) -> Optional[bool]:
2620
2814
  """
2621
2815
  Indication of whether in-track thrust modeling was used for the OD of the object.
2622
2816
 
@@ -2625,7 +2819,7 @@ class CdmMetadata:
2625
2819
  ...
2626
2820
 
2627
2821
  @intrack_thrust.setter
2628
- def intrack_thrust(self, value: Optional[str]) -> None: ...
2822
+ def intrack_thrust(self, value: Optional[bool]) -> None: ...
2629
2823
  @property
2630
2824
  def maneuverable(self) -> ManeuverableType:
2631
2825
  """
@@ -2763,7 +2957,7 @@ class CdmMetadata:
2763
2957
  @ref_frame.setter
2764
2958
  def ref_frame(self, value: ReferenceFrameType) -> None: ...
2765
2959
  @property
2766
- def solar_rad_pressure(self) -> Optional[str]:
2960
+ def solar_rad_pressure(self) -> Optional[bool]:
2767
2961
  """
2768
2962
  Indication of whether solar radiation pressure perturbations were used for the OD of the
2769
2963
  object.
@@ -2773,7 +2967,7 @@ class CdmMetadata:
2773
2967
  ...
2774
2968
 
2775
2969
  @solar_rad_pressure.setter
2776
- def solar_rad_pressure(self, value: Optional[str]) -> None: ...
2970
+ def solar_rad_pressure(self, value: Optional[bool]) -> None: ...
2777
2971
 
2778
2972
  class CdmObjectType:
2779
2973
  """
@@ -2844,6 +3038,11 @@ class CdmStateVector:
2844
3038
  """
2845
3039
  ...
2846
3040
 
3041
+ @staticmethod
3042
+ def from_numpy(array):
3043
+ """ """
3044
+ ...
3045
+
2847
3046
  def to_numpy(self) -> numpy.ndarray:
2848
3047
  """
2849
3048
  Return the state vector as a NumPy array.
@@ -3725,8 +3924,8 @@ class KeplerianElements:
3725
3924
  ra_of_asc_node,
3726
3925
  arg_of_pericenter,
3727
3926
  gm,
3728
- true_anomaly,
3729
- mean_anomaly,
3927
+ true_anomaly=None,
3928
+ mean_anomaly=None,
3730
3929
  ) -> None: ...
3731
3930
  def __getstate__(self, /):
3732
3931
  """
@@ -3883,8 +4082,8 @@ class ManeuverParameters:
3883
4082
  man_tor_1,
3884
4083
  man_tor_2,
3885
4084
  man_tor_3,
3886
- man_delta_mass,
3887
- comment,
4085
+ man_delta_mass=None,
4086
+ comment=None,
3888
4087
  ) -> None: ...
3889
4088
  def __getstate__(self, /):
3890
4089
  """
@@ -4019,9 +4218,9 @@ class MeanElements:
4019
4218
  ra_of_asc_node,
4020
4219
  arg_of_pericenter,
4021
4220
  mean_anomaly,
4022
- semi_major_axis,
4023
- mean_motion,
4024
- gm,
4221
+ semi_major_axis=None,
4222
+ mean_motion=None,
4223
+ gm=None,
4025
4224
  ) -> None: ...
4026
4225
  def __getstate__(self, /):
4027
4226
  """
@@ -4218,7 +4417,7 @@ class Ndm:
4218
4417
  def messages(
4219
4418
  self, value: list[Union[Oem, Cdm, Opm, Omm, Ocm, Rdm, Tdm, Ndm]]
4220
4419
  ) -> None: ...
4221
- def to_file(self, path, format):
4420
+ def to_file(self, path, format, validate=True):
4222
4421
  """
4223
4422
  Write to file.
4224
4423
 
@@ -4228,15 +4427,29 @@ class Ndm:
4228
4427
  Output file path.
4229
4428
  format : str
4230
4429
  Output format ('kvn' or 'xml').
4430
+ validate : bool, optional
4431
+ Whether to validate the message before writing (default: True).
4231
4432
  """
4232
4433
  ...
4233
4434
 
4234
- def to_str(self, format):
4435
+ def to_str(self, format, validate=True):
4235
4436
  """
4236
4437
  Serialize to a string.
4237
4438
  """
4238
4439
  ...
4239
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
+
4240
4453
  class ObjectDescription:
4241
4454
  def __getstate__(self, /):
4242
4455
  """
@@ -4332,6 +4545,15 @@ class Ocm:
4332
4545
  @header.setter
4333
4546
  def header(self, value: OdmHeader) -> None: ...
4334
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
4335
4557
  def segment(self) -> OcmSegment:
4336
4558
  """
4337
4559
  The OCM data segment.
@@ -4340,7 +4562,7 @@ class Ocm:
4340
4562
 
4341
4563
  @segment.setter
4342
4564
  def segment(self, value: OcmSegment) -> None: ...
4343
- def to_file(self, path, format):
4565
+ def to_file(self, path, format, validate=True):
4344
4566
  """
4345
4567
  Write to file.
4346
4568
 
@@ -4350,10 +4572,12 @@ class Ocm:
4350
4572
  Output file path.
4351
4573
  format : str
4352
4574
  Output format ('kvn' or 'xml').
4575
+ validate : bool, optional
4576
+ Whether to validate the message before writing (default: True).
4353
4577
  """
4354
4578
  ...
4355
4579
 
4356
- def to_str(self, format):
4580
+ def to_str(self, format, validate=True):
4357
4581
  """
4358
4582
  Serialize to string.
4359
4583
 
@@ -4361,6 +4585,8 @@ class Ocm:
4361
4585
  ----------
4362
4586
  format : str
4363
4587
  Output format ('kvn' or 'xml').
4588
+ validate : bool, optional
4589
+ Whether to validate the message before writing (default: True).
4364
4590
 
4365
4591
  Returns
4366
4592
  -------
@@ -4369,6 +4595,28 @@ class Ocm:
4369
4595
  """
4370
4596
  ...
4371
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
+
4372
4620
  class OcmCovarianceMatrix:
4373
4621
  """
4374
4622
  OCM Covariance Matrix.
@@ -7874,17 +8122,17 @@ class OdParameters:
7874
8122
  Comments.
7875
8123
  """
7876
8124
  def __init__(
7877
- time_lastob_start,
7878
- time_lastob_end,
7879
- recommended_od_span,
7880
- actual_od_span,
7881
- obs_available,
7882
- obs_used,
7883
- tracks_available,
7884
- tracks_used,
7885
- residuals_accepted,
7886
- weighted_rms,
7887
- 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=...,
7888
8136
  ) -> None: ...
7889
8137
  def __getstate__(self, /):
7890
8138
  """
@@ -8025,7 +8273,7 @@ class OdmHeader:
8025
8273
  Comments.
8026
8274
  """
8027
8275
  def __init__(
8028
- creation_date, originator, classification, message_id, comment
8276
+ creation_date, originator, classification=None, message_id=None, comment=None
8029
8277
  ) -> None: ...
8030
8278
  def __getstate__(self, /):
8031
8279
  """
@@ -8046,9 +8294,17 @@ class OdmHeader:
8046
8294
  @classification.setter
8047
8295
  def classification(self, value: Optional[str]) -> None: ...
8048
8296
  @property
8049
- 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
+
8050
8306
  @comment.setter
8051
- def comment(self, value: object) -> None: ...
8307
+ def comment(self, value: list[str]) -> None: ...
8052
8308
  @property
8053
8309
  def creation_date(self) -> str:
8054
8310
  """
@@ -8164,6 +8420,15 @@ class Oem:
8164
8420
  @header.setter
8165
8421
  def header(self, value: OdmHeader) -> None: ...
8166
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
8167
8432
  def segments(self) -> list[OemSegment]:
8168
8433
  """
8169
8434
  The list of data segments.
@@ -8172,7 +8437,7 @@ class Oem:
8172
8437
 
8173
8438
  @segments.setter
8174
8439
  def segments(self, value: list[OemSegment]) -> None: ...
8175
- def to_file(self, path, format):
8440
+ def to_file(self, path, format, validate=True):
8176
8441
  """
8177
8442
  Write to file.
8178
8443
 
@@ -8182,10 +8447,20 @@ class Oem:
8182
8447
  Output file path.
8183
8448
  format : str
8184
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).
8185
8460
  """
8186
8461
  ...
8187
8462
 
8188
- def to_str(self, format):
8463
+ def to_str(self, format, validate=True):
8189
8464
  """
8190
8465
  Serialize to string.
8191
8466
 
@@ -8194,6 +8469,19 @@ class Oem:
8194
8469
  format : str
8195
8470
  Output format ('kvn' or 'xml').
8196
8471
 
8472
+ Returns
8473
+ -------
8474
+ str
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
+
8197
8485
  Returns
8198
8486
  -------
8199
8487
  str
@@ -8201,6 +8489,28 @@ class Oem:
8201
8489
  """
8202
8490
  ...
8203
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.
8508
+ """
8509
+ ...
8510
+
8511
+ @version.setter
8512
+ def version(self, value: str) -> None: ...
8513
+
8204
8514
  class OemCovarianceMatrix:
8205
8515
  """
8206
8516
  OEM Covariance Matrix.
@@ -8213,7 +8523,8 @@ class OemCovarianceMatrix:
8213
8523
  epoch : str
8214
8524
  Epoch of the covariance matrix (ISO 8601).
8215
8525
  values : numpy.ndarray
8216
- 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.
8217
8528
  cov_ref_frame : str, optional
8218
8529
  Reference frame for the covariance matrix.
8219
8530
  comment : list[str], optional
@@ -8548,7 +8859,7 @@ class OemData:
8548
8859
  comments : list[str], optional
8549
8860
  Comments.
8550
8861
  """
8551
- def __init__(state_vectors, comments) -> None: ...
8862
+ def __init__(state_vectors, covariance_matrix=None, comments=None) -> None: ...
8552
8863
  def __getstate__(self, /):
8553
8864
  """
8554
8865
  Helper for pickle.
@@ -8581,19 +8892,43 @@ class OemData:
8581
8892
  @covariance_matrix.setter
8582
8893
  def covariance_matrix(self, value: list[OemCovarianceMatrix]) -> None: ...
8583
8894
  @property
8584
- def covariance_matrix_numpy(self) -> tuple[list[str], numpy.ndarray]:
8895
+ def covariance_matrix_epochs(self) -> list[str]:
8896
+ """
8897
+ Epochs for covariance matrices (ISO 8601).
8585
8898
  """
8586
- Get covariance matrices as a tuple associated with a NumPy array.
8899
+ ...
8587
8900
 
8588
- Returns:
8589
- 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
8590
8914
  """
8591
8915
  ...
8592
8916
 
8593
8917
  @covariance_matrix_numpy.setter
8594
- def covariance_matrix_numpy(
8595
- self, value: tuple[list[str], numpy.ndarray]
8596
- ) -> 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
+
8597
8932
  @property
8598
8933
  def state_vector(self) -> list[StateVectorAcc]:
8599
8934
  """
@@ -8609,31 +8944,42 @@ class OemData:
8609
8944
  @state_vector.setter
8610
8945
  def state_vector(self, value: list[StateVectorAcc]) -> None: ...
8611
8946
  @property
8612
- def state_vector_numpy(self) -> tuple[list[str], numpy.ndarray]:
8947
+ def state_vector_epochs(self) -> list[str]:
8613
8948
  """
8614
- State vectors as a tuple of epochs and a NumPy array.
8949
+ Epochs for state vectors (ISO 8601).
8950
+ """
8951
+ ...
8952
+
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.
8615
8959
 
8616
- This method allows for efficient zero-copy access to state vector data
8617
- compatible with scientific Python libraries.
8960
+ Use `state_vector_epochs` for the corresponding epochs.
8618
8961
 
8619
8962
  Returns
8620
8963
  -------
8621
- tuple[list[str], numpy.ndarray]
8622
- A tuple containing:
8623
- - List of epoch strings (ISO 8601 format).
8624
- - 2D NumPy array of shape (N, 6) or (N, 9):
8625
- - N x 6: [X, Y, Z, X_DOT, Y_DOT, Z_DOT] if no accelerations.
8626
- - 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.
8627
8968
 
8628
- Units:
8629
- - Position: km
8630
- - Velocity: km/s
8631
- - Acceleration: km/s²
8969
+ Units:
8970
+ - Position: km
8971
+ - Velocity: km/s
8972
+ - Acceleration: km/s²
8632
8973
  """
8633
8974
  ...
8634
8975
 
8635
8976
  @state_vector_numpy.setter
8636
- 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
+ ...
8637
8983
 
8638
8984
  class OemMetadata:
8639
8985
  """
@@ -8869,6 +9215,11 @@ class OemMetadata:
8869
9215
 
8870
9216
  @useable_stop_time.setter
8871
9217
  def useable_stop_time(self, value: Optional[str]) -> None: ...
9218
+ def validate(self):
9219
+ """
9220
+ Validate the metadata against CCSDS rules.
9221
+ """
9222
+ ...
8872
9223
 
8873
9224
  class OemSegment:
8874
9225
  """
@@ -8910,6 +9261,11 @@ class OemSegment:
8910
9261
 
8911
9262
  @metadata.setter
8912
9263
  def metadata(self, value: OemMetadata) -> None: ...
9264
+ def validate(self):
9265
+ """
9266
+ Validate the segment against CCSDS rules.
9267
+ """
9268
+ ...
8913
9269
 
8914
9270
  class Omm:
8915
9271
  """
@@ -8981,6 +9337,15 @@ class Omm:
8981
9337
  @header.setter
8982
9338
  def header(self, value: OdmHeader) -> None: ...
8983
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
8984
9349
  def segment(self) -> OmmSegment:
8985
9350
  """
8986
9351
  The data segment.
@@ -8989,7 +9354,7 @@ class Omm:
8989
9354
 
8990
9355
  @segment.setter
8991
9356
  def segment(self, value: OmmSegment) -> None: ...
8992
- def to_file(self, path, format):
9357
+ def to_file(self, path, format, validate=True):
8993
9358
  """
8994
9359
  Write to file.
8995
9360
 
@@ -8999,10 +9364,12 @@ class Omm:
8999
9364
  Output file path.
9000
9365
  format : str
9001
9366
  Output format ('kvn' or 'xml').
9367
+ validate : bool, optional
9368
+ Whether to validate the message before writing (default: True).
9002
9369
  """
9003
9370
  ...
9004
9371
 
9005
- def to_str(self, format):
9372
+ def to_str(self, format, validate=True):
9006
9373
  """
9007
9374
  Serialize to string.
9008
9375
 
@@ -9011,6 +9378,8 @@ class Omm:
9011
9378
  format : str
9012
9379
  Output format ('kvn' or 'xml').
9013
9380
  (Mandatory)
9381
+ validate : bool, optional
9382
+ Whether to validate the message before writing (default: True).
9014
9383
 
9015
9384
  Returns
9016
9385
  -------
@@ -9019,11 +9388,33 @@ class Omm:
9019
9388
  """
9020
9389
  ...
9021
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
+
9022
9413
  class OmmData:
9023
9414
  """
9024
9415
  OMM Data section.
9025
9416
  """
9026
- def __init__(mean_elements, comments) -> None: ...
9417
+ def __init__(mean_elements, comments=None) -> None: ...
9027
9418
  def __getstate__(self, /):
9028
9419
  """
9029
9420
  Helper for pickle.
@@ -9342,6 +9733,15 @@ class Opm:
9342
9733
  @header.setter
9343
9734
  def header(self, value: OdmHeader) -> None: ...
9344
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
9345
9745
  def segment(self) -> OpmSegment:
9346
9746
  """
9347
9747
  The data segment.
@@ -9350,7 +9750,7 @@ class Opm:
9350
9750
 
9351
9751
  @segment.setter
9352
9752
  def segment(self, value: OpmSegment) -> None: ...
9353
- def to_file(self, path, format):
9753
+ def to_file(self, path, format, validate=True):
9354
9754
  """
9355
9755
  Write to file.
9356
9756
 
@@ -9360,10 +9760,12 @@ class Opm:
9360
9760
  Output file path.
9361
9761
  format : str
9362
9762
  Output format ('kvn' or 'xml').
9763
+ validate : bool, optional
9764
+ Whether to validate the message before writing (default: True).
9363
9765
  """
9364
9766
  ...
9365
9767
 
9366
- def to_str(self, format):
9768
+ def to_str(self, format, validate=True):
9367
9769
  """
9368
9770
  Serialize to string.
9369
9771
 
@@ -9371,6 +9773,8 @@ class Opm:
9371
9773
  ----------
9372
9774
  format : str
9373
9775
  Output format ('kvn' or 'xml').
9776
+ validate : bool, optional
9777
+ Whether to validate the message before writing (default: True).
9374
9778
 
9375
9779
  Returns
9376
9780
  -------
@@ -9379,6 +9783,28 @@ class Opm:
9379
9783
  """
9380
9784
  ...
9381
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
+
9382
9808
  class OpmCovarianceMatrix:
9383
9809
  """
9384
9810
  Position/Velocity Covariance Matrix (6x6 Lower Triangular Form. None or all parameters of the
@@ -9440,29 +9866,29 @@ class OpmCovarianceMatrix:
9440
9866
  ... (see Parameters for full list of attributes with units)
9441
9867
  """
9442
9868
  def __init__(
9443
- cx_x,
9444
- cy_x,
9445
- cy_y,
9446
- cz_x,
9447
- cz_y,
9448
- cz_z,
9449
- cx_dot_x,
9450
- cx_dot_y,
9451
- cx_dot_z,
9452
- cy_dot_x,
9453
- cy_dot_y,
9454
- cy_dot_z,
9455
- cz_dot_x,
9456
- cz_dot_y,
9457
- cz_dot_z,
9458
- cx_dot_x_dot,
9459
- cy_dot_x_dot,
9460
- cy_dot_y_dot,
9461
- cz_dot_x_dot,
9462
- cz_dot_y_dot,
9463
- cz_dot_z_dot,
9464
- cov_ref_frame,
9465
- 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,
9466
9892
  ) -> None: ...
9467
9893
  def __getstate__(self, /):
9468
9894
  """
@@ -9730,7 +10156,7 @@ class OpmData:
9730
10156
  state_vector : StateVector
9731
10157
  State vector.
9732
10158
  """
9733
- def __init__(state_vector, comment) -> None: ...
10159
+ def __init__(state_vector, comment=None) -> None: ...
9734
10160
  def __getstate__(self, /):
9735
10161
  """
9736
10162
  Helper for pickle.
@@ -10166,6 +10592,15 @@ class Rdm:
10166
10592
  @header.setter
10167
10593
  def header(self, value: RdmHeader) -> None: ...
10168
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
10169
10604
  def segment(self) -> RdmSegment:
10170
10605
  """
10171
10606
  The RDM Body consists of a single segment.
@@ -10174,7 +10609,7 @@ class Rdm:
10174
10609
 
10175
10610
  @segment.setter
10176
10611
  def segment(self, value: RdmSegment) -> None: ...
10177
- def to_file(self, path, format):
10612
+ def to_file(self, path, format, validate=True):
10178
10613
  """
10179
10614
  Write to a file.
10180
10615
 
@@ -10184,6 +10619,8 @@ class Rdm:
10184
10619
  Output file path.
10185
10620
  format : str
10186
10621
  Format ('kvn' or 'xml').
10622
+ validate : bool, optional
10623
+ Whether to validate the message before writing (default: True).
10187
10624
  """
10188
10625
  ...
10189
10626
 
@@ -10198,7 +10635,7 @@ class Rdm:
10198
10635
  """
10199
10636
  ...
10200
10637
 
10201
- def to_str(self, format):
10638
+ def to_str(self, format, validate=True):
10202
10639
  """
10203
10640
  Serialize to string (generic).
10204
10641
 
@@ -10206,6 +10643,8 @@ class Rdm:
10206
10643
  ----------
10207
10644
  format : str
10208
10645
  Format ('kvn' or 'xml').
10646
+ validate : bool, optional
10647
+ Whether to validate the message before writing (default: True).
10209
10648
 
10210
10649
  Returns
10211
10650
  -------
@@ -10225,6 +10664,28 @@ class Rdm:
10225
10664
  """
10226
10665
  ...
10227
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
+
10228
10689
  class RdmData:
10229
10690
  """
10230
10691
  The RDM Data section.
@@ -11141,33 +11602,6 @@ class RelativeMetadataData:
11141
11602
  @miss_distance.setter
11142
11603
  def miss_distance(self, value: float) -> None: ...
11143
11604
  @property
11144
- def relative_position_n(self) -> Optional[float]:
11145
- """
11146
- Relative position N component.
11147
- """
11148
- ...
11149
-
11150
- @relative_position_n.setter
11151
- def relative_position_n(self, value: Optional[float]) -> None: ...
11152
- @property
11153
- def relative_position_r(self) -> Optional[float]:
11154
- """
11155
- Relative position R component.
11156
- """
11157
- ...
11158
-
11159
- @relative_position_r.setter
11160
- def relative_position_r(self, value: Optional[float]) -> None: ...
11161
- @property
11162
- def relative_position_t(self) -> Optional[float]:
11163
- """
11164
- Relative position T component.
11165
- """
11166
- ...
11167
-
11168
- @relative_position_t.setter
11169
- def relative_position_t(self, value: Optional[float]) -> None: ...
11170
- @property
11171
11605
  def relative_speed(self) -> Optional[float]:
11172
11606
  """
11173
11607
  The norm of the relative velocity vector. It indicates how fast the two objects are
@@ -11180,41 +11614,14 @@ class RelativeMetadataData:
11180
11614
  @relative_speed.setter
11181
11615
  def relative_speed(self, value: Optional[float]) -> None: ...
11182
11616
  @property
11183
- def relative_state_vector(self) -> Optional[numpy.ndarray]:
11617
+ def relative_state_vector(self) -> Optional[RelativeStateVector]:
11184
11618
  """
11185
11619
  Relative state vector [R, T, N, VR, VT, VN] (combined position and velocity).
11186
11620
  """
11187
11621
  ...
11188
11622
 
11189
11623
  @relative_state_vector.setter
11190
- def relative_state_vector(self, value: Optional[numpy.ndarray]) -> None: ...
11191
- @property
11192
- def relative_velocity_n(self) -> Optional[float]:
11193
- """
11194
- Relative velocity N component.
11195
- """
11196
- ...
11197
-
11198
- @relative_velocity_n.setter
11199
- def relative_velocity_n(self, value: Optional[float]) -> None: ...
11200
- @property
11201
- def relative_velocity_r(self) -> Optional[float]:
11202
- """
11203
- Relative velocity R component.
11204
- """
11205
- ...
11206
-
11207
- @relative_velocity_r.setter
11208
- def relative_velocity_r(self, value: Optional[float]) -> None: ...
11209
- @property
11210
- def relative_velocity_t(self) -> Optional[float]:
11211
- """
11212
- Relative velocity T component.
11213
- """
11214
- ...
11215
-
11216
- @relative_velocity_t.setter
11217
- def relative_velocity_t(self, value: Optional[float]) -> None: ...
11624
+ def relative_state_vector(self, value: Optional[RelativeStateVector]) -> None: ...
11218
11625
  @property
11219
11626
  def screen_entry_time(self) -> Optional[str]:
11220
11627
  """
@@ -11321,6 +11728,115 @@ class RelativeMetadataData:
11321
11728
  @tca.setter
11322
11729
  def tca(self, value: str) -> None: ...
11323
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
+
11324
11840
  class ScreenVolumeFrameType:
11325
11841
  def __getstate__(self, /):
11326
11842
  """
@@ -11356,7 +11872,11 @@ class SpacecraftParameters:
11356
11872
  Drag coefficient.
11357
11873
  """
11358
11874
  def __init__(
11359
- 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,
11360
11880
  ) -> None: ...
11361
11881
  def __getstate__(self, /):
11362
11882
  """
@@ -11628,7 +12148,7 @@ class StateVector:
11628
12148
  z_dot : float
11629
12149
  Velocity vector Z-component (km/s).
11630
12150
  """
11631
- 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: ...
11632
12152
  def __getstate__(self, /):
11633
12153
  """
11634
12154
  Helper for pickle.
@@ -11748,7 +12268,7 @@ class StateVectorAcc:
11748
12268
  Acceleration vector Z-component (km/s²).
11749
12269
  """
11750
12270
  def __init__(
11751
- 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
11752
12272
  ) -> None: ...
11753
12273
  def __getstate__(self, /):
11754
12274
  """
@@ -11970,6 +12490,15 @@ class Tdm:
11970
12490
  @header.setter
11971
12491
  def header(self, value: TdmHeader) -> None: ...
11972
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
11973
12502
  def segments(self) -> list[TdmSegment]:
11974
12503
  """
11975
12504
  Shortcut to access segments directly from the body.
@@ -11978,7 +12507,7 @@ class Tdm:
11978
12507
 
11979
12508
  @segments.setter
11980
12509
  def segments(self, value: list[TdmSegment]) -> None: ...
11981
- def to_file(self, path, format):
12510
+ def to_file(self, path, format, validate=True):
11982
12511
  """
11983
12512
  Write to file.
11984
12513
 
@@ -11988,10 +12517,12 @@ class Tdm:
11988
12517
  Output file path.
11989
12518
  format : str
11990
12519
  Output format ('kvn' or 'xml').
12520
+ validate : bool, optional
12521
+ Whether to validate the message before writing (default: True).
11991
12522
  """
11992
12523
  ...
11993
12524
 
11994
- def to_str(self, format):
12525
+ def to_str(self, format, validate=True):
11995
12526
  """
11996
12527
  Serialize to string.
11997
12528
 
@@ -11999,6 +12530,8 @@ class Tdm:
11999
12530
  ----------
12000
12531
  format : str
12001
12532
  Output format ('kvn' or 'xml').
12533
+ validate : bool, optional
12534
+ Whether to validate the message before writing (default: True).
12002
12535
 
12003
12536
  Returns
12004
12537
  -------
@@ -12007,6 +12540,28 @@ class Tdm:
12007
12540
  """
12008
12541
  ...
12009
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
+
12010
12565
  class TdmBody:
12011
12566
  """
12012
12567
  The TDM Body consists of one or more TDM Segments.
@@ -12048,7 +12603,7 @@ class TdmData:
12048
12603
  Comments in the data section.
12049
12604
  (Optional)
12050
12605
  """
12051
- def __init__(*, observations=None, comment=None) -> None: ...
12606
+ def __init__(observations=None, comment=None) -> None: ...
12052
12607
  def __getstate__(self, /):
12053
12608
  """
12054
12609
  Helper for pickle.