keplemon 0.1.3__cp311-cp311-win_amd64.whl → 0.1.5__cp311-cp311-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.

Potentially problematic release.


This version of keplemon might be problematic. Click here for more details.

Binary file
keplemon/bodies.pyi CHANGED
@@ -51,49 +51,143 @@ class Satellite:
51
51
  step: TimeSpan,
52
52
  ) -> Ephemeris: ...
53
53
  def get_state_at_epoch(self, epoch: Epoch) -> CartesianState: ...
54
+ def to_tle(self) -> TLE | None:
55
+ """
56
+ Returns:
57
+ Satellite as a two-line element set or None if no state is loaded
58
+
59
+ """
60
+ ...
54
61
 
55
62
  class Constellation:
63
+ """
64
+ Args:
65
+ name: Identifier of the constellation
66
+ """
67
+
56
68
  count: int
69
+ """Number of satellites in the constellation"""
70
+
57
71
  name: str | None
72
+ """Human-readable name of the constellation"""
73
+
58
74
  def __init__(self, name: str) -> None: ...
59
75
  @classmethod
60
- def from_tle_catalog(cls, tle_catalog: TLECatalog) -> Constellation: ...
61
- def get_states_at_epoch(self, epoch: Epoch) -> dict[int, CartesianState]: ...
76
+ def from_tle_catalog(cls, tle_catalog: TLECatalog) -> Constellation:
77
+ """
78
+ Instantiate a Constellation from a TLE catalog
79
+
80
+ Args:
81
+ tle_catalog: TLE catalog for the constellation
82
+ """
83
+ ...
84
+
85
+ def get_states_at_epoch(self, epoch: Epoch) -> dict[int, CartesianState]:
86
+ """
87
+ Args:
88
+ epoch: UTC epoch at which the states will be calculated
89
+
90
+ Returns:
91
+ (satellite_id, state) dictionary for the constellation at the given epoch
92
+ """
93
+ ...
94
+
62
95
  def get_ephemeris(
63
96
  self,
64
97
  start: Epoch,
65
98
  end: Epoch,
66
99
  step: TimeSpan,
67
- ) -> dict[int, Ephemeris]: ...
100
+ ) -> dict[int, Ephemeris]:
101
+ """
102
+ Args:
103
+ start: UTC epoch of the start of the ephemeris
104
+ end: UTC epoch of the end of the ephemeris
105
+ step: Time step for the ephemeris
106
+
107
+ Returns:
108
+ (satellite_id, ephemeris) dictionary for the constellation
109
+ """
110
+ ...
111
+
68
112
  def get_ca_report_vs_one(
69
113
  self,
70
114
  other: Satellite,
71
115
  start: Epoch,
72
116
  end: Epoch,
73
117
  distance_threshold: float,
74
- ) -> CloseApproachReport: ...
118
+ ) -> CloseApproachReport:
119
+ """
120
+ Calculate close approaches between the constellation and a given satellite.
121
+
122
+ Args:
123
+ other: Satellite to compare against
124
+ start: UTC epoch of the start of the close approach report
125
+ end: UTC epoch of the end of the close approach report
126
+ distance_threshold: Distance threshold for close approach screening in **_kilometers_**
127
+
128
+ Returns:
129
+ Close approach report for the constellation vs. the given satellite
130
+ """
131
+ ...
132
+
75
133
  def get_ca_report_vs_many(
76
134
  self,
77
135
  start: Epoch,
78
136
  end: Epoch,
79
137
  distance_threshold: float,
80
- ) -> CloseApproachReport: ...
138
+ ) -> CloseApproachReport:
139
+ """
140
+ Calculate close approaches among satellites in the calling constellation.
141
+
142
+ !!! warning
143
+ This is a long-running operation when the constellation is large.
144
+
145
+ Args:
146
+ start: UTC epoch of the start of the close approach report
147
+ end: UTC epoch of the end of the close approach report
148
+ distance_threshold: Distance threshold for close approach screening in **_kilometers_**
149
+
150
+ Returns:
151
+ Close approach report for the constellation vs. all other satellites
152
+ """
153
+ ...
154
+
81
155
  def __getitem__(self, satellite_id: int) -> Satellite: ...
82
156
 
83
157
  class Sensor:
158
+ """
159
+ Args:
160
+ name: Identifier of the sensor
161
+ angular_noise: Angular noise in **_degrees_**
162
+ """
163
+
84
164
  name: str
85
165
  angular_noise: float
86
- range_noise: float
87
- range_rate_noise: float
88
- angular_rate_noise: float
166
+ range_noise: float | None
167
+ """Range noise in **_kilometers_**"""
168
+
169
+ range_rate_noise: float | None
170
+ """Range rate noise in **_kilometers per second_**"""
171
+
172
+ angular_rate_noise: float | None
173
+ """Angular rate noise in **_degrees per second_**"""
89
174
  def __init__(self, name: str, angular_noise: float) -> None: ...
90
175
 
91
176
  class Observatory:
177
+ """
178
+ Args:
179
+ name: Identifier of the observatory
180
+ latitude: Latitude in **_degrees_**
181
+ longitude: Longitude in **_degrees_**
182
+ altitude: Altitude in **_kilometers_**
183
+ """
184
+
92
185
  name: str
93
186
  latitude: float
94
187
  longitude: float
95
188
  altitude: float
96
189
  sensors: list[Sensor]
190
+ """List of sensors at the observatory"""
97
191
  def __init__(
98
192
  self,
99
193
  name: str,
@@ -101,4 +195,12 @@ class Observatory:
101
195
  longitude: float,
102
196
  altitude: float,
103
197
  ) -> None: ...
104
- def get_state_at_epoch(self, epoch: Epoch) -> CartesianState: ...
198
+ def get_state_at_epoch(self, epoch: Epoch) -> CartesianState:
199
+ """
200
+ Args:
201
+ epoch: UTC epoch of the state
202
+
203
+ Returns:
204
+ TEME Cartesian state of the observatory in **_kilometers_** and **_kilometers per second_**
205
+ """
206
+ ...
keplemon/elements.pyi CHANGED
@@ -6,6 +6,16 @@ from keplemon.propagation import ForceProperties
6
6
  from keplemon.events import CloseApproach
7
7
 
8
8
  class KeplerianElements:
9
+ """
10
+ Args:
11
+ semi_major_axis: Average distance from the central body in **_kilometers_**
12
+ eccentricity: Eccentricity of the orbit
13
+ inclination: Inclination of the orbit in **_degrees_**
14
+ raan: Right Ascension of Ascending Node in **_degrees_**
15
+ argument_of_perigee: Argument of Perigee in **_degrees_**
16
+ mean_anomaly: Mean Anomaly in **_degrees_**
17
+ """
18
+
9
19
  semi_major_axis: float
10
20
  eccentricity: float
11
21
  inclination: float
@@ -25,46 +35,222 @@ class KeplerianElements:
25
35
 
26
36
  class TLE:
27
37
  satellite_id: int
28
- designator: str
38
+ """"""
39
+
40
+ name: str
41
+ """"""
42
+
43
+ inclination: float
44
+ """Inclination of the orbit in **_degrees_**"""
45
+
46
+ eccentricity: float
47
+ """"""
48
+
49
+ raan: float
50
+ """Right Ascension of Ascending Node in **_degrees_**"""
51
+
52
+ argument_of_perigee: float
53
+ """Argument of Perigee in **_degrees_**"""
54
+
55
+ mean_anomaly: float
56
+ """Mean Anomaly in **_degrees_**"""
57
+
58
+ mean_motion: float
59
+ """Mean motion in **_revolutions per day_**"""
60
+
61
+ type: KeplerianType
62
+ """"""
63
+
64
+ b_star: float
65
+ """"""
66
+
67
+ mean_motion_dot: float
68
+ """"""
69
+
70
+ mean_motion_dot_dot: float
71
+ """"""
72
+
73
+ agom: float
74
+ """"""
75
+
76
+ b_term: float
77
+ """"""
78
+
79
+ epoch: Epoch
80
+ """UTC epoch of the state"""
81
+
29
82
  classification: Classification
30
- keplerian_state: KeplerianState
31
- force_properties: ForceProperties
32
- ephemeris_type: KeplerianType
83
+ """"""
84
+
85
+ designator: str
86
+ """8-character identifier of the satellite"""
87
+
88
+ cartesian_state: CartesianState
89
+ """TEME cartesian state of the TLE at epoch"""
33
90
 
34
91
  @classmethod
35
- def from_lines(cls, line_1: str, line_2: str, line_3: str | None = None) -> TLE: ...
36
- def get_lines(self) -> tuple[str, str]: ...
37
- def load_to_memory(self) -> None: ...
92
+ def from_lines(cls, line_1: str, line_2: str, line_3: str | None = None) -> TLE:
93
+ """
94
+ Create a TLE object using strings in 2 or 3 line format
95
+ """
96
+ ...
97
+
98
+ @property
99
+ def lines(self) -> tuple[str, str]:
100
+ """
101
+ !!! note
102
+ If the TLE was created in the 3LE format, only lines 2 and 3 will be returned. The name must be accessed
103
+ using the `name` property.
104
+
105
+ Returns:
106
+ Tuple of strings in 2 line format
107
+ """
108
+ ...
109
+
38
110
  def get_state_at_epoch(self, epoch: Epoch) -> CartesianState: ...
39
111
 
40
112
  class SphericalVector:
113
+ """
114
+ !!! note
115
+ The range units can be disregarded if this class is not being used for astrodynamic transforms.
116
+
117
+ Args:
118
+ range: distance from the origin in **_kilometers_**
119
+ right_ascension: right ascension in **_degrees_**
120
+ declination: declination in **_degrees_**
121
+ """
122
+
41
123
  range: float
42
124
  right_ascension: float
43
125
  declination: float
44
126
  def __init__(self, range: float, right_ascension: float, declination: float) -> None: ...
45
- def to_cartesian(self) -> CartesianVector: ...
127
+ def to_cartesian(self) -> CartesianVector:
128
+ """
129
+ Returns:
130
+ Cartesian vector in **_kilometers_**.
131
+ """
132
+ ...
46
133
 
47
134
  class CartesianVector:
135
+ """
136
+ Args:
137
+ x: x coordinate
138
+ y: y coordinate
139
+ z: z coordinate
140
+ """
141
+
48
142
  x: float
49
143
  y: float
50
144
  z: float
51
145
  magnitude: float
146
+ """"""
147
+
52
148
  def __init__(self, x: float, y: float, z: float) -> None: ...
53
- def distance(self, other: CartesianVector) -> float: ...
54
- def to_spherical(self) -> SphericalVector: ...
149
+ def distance(self, other: CartesianVector) -> float:
150
+ """
151
+ !!! note
152
+ Take care to use consistent units with this function.
153
+
154
+ Returns:
155
+ Distance between two Cartesian vectors
156
+ """
157
+ ...
158
+
159
+ def to_spherical(self) -> SphericalVector:
160
+ """
161
+ Returns:
162
+ Spherical representation of the point
163
+ """
164
+ ...
165
+
55
166
  def __add__(self, other: CartesianVector) -> CartesianVector: ...
56
167
  def __sub__(self, other: CartesianVector) -> CartesianVector: ...
57
- def angle(self, other: CartesianVector) -> float: ...
168
+ def angle(self, other: CartesianVector) -> float:
169
+ """
170
+ Returns:
171
+ Angle between two Cartesian vectors in **_radians_**.
172
+ """
173
+ ...
58
174
 
59
175
  class CartesianState:
176
+ """State represented as x, y, z and vx, vy, vz in a given reference frame.
177
+
178
+ Args:
179
+ epoch: UTC epoch of the state
180
+ position: Cartesian position vector in kilometers
181
+ velocity: Cartesian velocity vector in kilometers per second
182
+ frame: reference frame of the state
183
+ """
184
+
60
185
  position: CartesianVector
186
+ """Position of the state in kilometers"""
187
+
61
188
  velocity: CartesianVector
189
+ """Velocity of the state in kilometers per second"""
190
+
191
+ epoch: Epoch
192
+ """UTC epoch of the state"""
193
+
194
+ frame: ReferenceFrame
195
+ """Current reference frame of the state"""
196
+
197
+ def __init__(
198
+ self, epoch: Epoch, position: CartesianVector, velocity: CartesianVector, frame: ReferenceFrame
199
+ ) -> None: ...
200
+ def to_keplerian(self) -> KeplerianState:
201
+ """Convert the Cartesian state to osculating Keplerian elements"""
202
+ ...
203
+
204
+ def to_frame(self, frame: ReferenceFrame) -> CartesianState:
205
+ """
206
+
207
+ Args:
208
+ frame: reference frame of the output state
209
+
210
+ Returns:
211
+ CartesianState: Cartesian state in the new frame"""
212
+ ...
62
213
 
63
214
  class KeplerianState:
215
+ """Orbit represented as Keplerian elements in a given reference frame.
216
+
217
+ Args:
218
+ epoch: UTC epoch of the state
219
+ elements: Keplerian elements of the state
220
+ frame: reference frame of the state
221
+ keplerian_type: type of the Keplerian elements
222
+ """
223
+
64
224
  epoch: Epoch
65
- elements: KeplerianElements
66
225
  frame: ReferenceFrame
67
- keplerian_type: KeplerianType
226
+ type: KeplerianType
227
+ semi_major_axis: float
228
+ """Average distance from the central body in **_kilometers_**"""
229
+
230
+ eccentricity: float
231
+ """Eccentricity of the orbit"""
232
+
233
+ inclination: float
234
+ """Inclination of the orbit in **_degrees_**"""
235
+
236
+ raan: float
237
+ """Right Ascension of Ascending Node in **_degrees_**"""
238
+
239
+ argument_of_perigee: float
240
+ """Argument of Perigee in **_degrees_**"""
241
+
242
+ mean_anomaly: float
243
+ """Mean Anomaly in **_degrees_**"""
244
+
245
+ mean_motion: float
246
+ """Mean motion in **_revolutions per day_**"""
247
+
248
+ apoapsis: float
249
+ """Furthest point from the central body in **_kilometers_**"""
250
+
251
+ periapsis: float
252
+ """Closest point to the central body in **_kilometers_**"""
253
+
68
254
  def __init__(
69
255
  self,
70
256
  epoch: Epoch,
@@ -72,6 +258,21 @@ class KeplerianState:
72
258
  frame: ReferenceFrame,
73
259
  keplerian_type: KeplerianType,
74
260
  ) -> None: ...
261
+ def to_cartesian(self) -> CartesianState:
262
+ """
263
+ Returns:
264
+ Cartesian state in **_kilometers_** and **_kilometers per second_**.
265
+ """
266
+ ...
267
+
268
+ def to_frame(self, frame: ReferenceFrame) -> KeplerianState:
269
+ """
270
+ Args:
271
+ frame: reference frame of the output state
272
+
273
+ Returns:
274
+ Keplerian state in the new frame"""
275
+ ...
75
276
 
76
277
  class Ephemeris:
77
278
  def get_close_approach(
@@ -81,12 +282,33 @@ class Ephemeris:
81
282
  ) -> CloseApproach: ...
82
283
 
83
284
  class TopocentricElements:
285
+ """
286
+ Args:
287
+ ra: TEME right ascension in **_degrees_**
288
+ dec: TEME declination in **_degrees_**
289
+ """
290
+
84
291
  range: float | None
292
+ """Range in **_kilometers_**"""
293
+
85
294
  right_ascension: float
86
295
  declination: float
87
296
  range_rate: float | None
297
+ """Range rate in **_kilometers per second_**"""
298
+
88
299
  right_ascension_rate: float | None
300
+ """Right ascension rate in **_degrees per second**"""
301
+
89
302
  declination_rate: float | None
303
+ """Declination rate in **_degrees per second**"""
304
+
90
305
  def __init__(self, ra: float, dec: float) -> None: ...
91
306
  @classmethod
92
- def from_j2000(cls, epoch: Epoch, ra: float, dec: float) -> TopocentricElements: ...
307
+ def from_j2000(cls, epoch: Epoch, ra: float, dec: float) -> TopocentricElements:
308
+ """
309
+ Args:
310
+ epoch: UTC epoch of the angles
311
+ ra: J2000 right ascension in **_degrees_**
312
+ dec: J2000 declination in **_degrees_**
313
+ """
314
+ ...
keplemon/estimation.pyi CHANGED
@@ -6,8 +6,44 @@ from keplemon.enums import KeplerianType
6
6
 
7
7
  class Covariance:
8
8
  sigmas: list[float]
9
+ """"""
9
10
 
10
11
  class Observation:
12
+ """
13
+ Args:
14
+ sensor: Sensor that made the observation
15
+ epoch: Time of the observation
16
+ observed_teme_topo: Topocentric elements of the satellite at the time of observation
17
+ observer_teme_pos: Position of the observer in TEME coordinates
18
+ """
19
+
20
+ sensor: Sensor
21
+ """Sensor which produced the observation"""
22
+
23
+ epoch: Epoch
24
+ """Time the measurement was observed"""
25
+
26
+ range: float | None
27
+ """Observed range from the sensor to the satellite in **_kilometers_**"""
28
+
29
+ range_rate: float | None
30
+ """Observed range rate from the sensor to the satellite in **_kilometers per second_**"""
31
+
32
+ right_ascension: float
33
+ """Observed TEME right ascension in **_degrees_**"""
34
+
35
+ declination: float
36
+ """Observed TEME declination in **_degrees_**"""
37
+
38
+ right_ascension_rate: float | None
39
+ """Observed right ascension rate in **_degrees per second_**"""
40
+
41
+ declination_rate: float | None
42
+ """Observed declination rate in **_degrees per second_**"""
43
+
44
+ observed_satellite_id: int | None
45
+ """Tagged satellite ID of the observation"""
46
+
11
47
  def __init__(
12
48
  self,
13
49
  sensor: Sensor,
@@ -15,33 +51,122 @@ class Observation:
15
51
  observed_teme_topo: TopocentricElements,
16
52
  observer_teme_pos: CartesianVector,
17
53
  ) -> None: ...
18
- def get_residual(self, sat: Satellite) -> ObservationResidual: ...
54
+ def get_residual(self, sat: Satellite) -> ObservationResidual | None:
55
+ """
56
+ Calculate the residual of the observation with respect to a given satellite state.
57
+
58
+ !!! note
59
+ If an error occurs during propagation of the satellite state, this method will return None.
60
+
61
+ Args:
62
+ sat: Expected satellite state
63
+
64
+ Returns:
65
+ Calculated residual
66
+ """
67
+ ...
19
68
 
20
69
  class ObservationResidual:
21
70
  range: float
71
+ """Euclidean distance between the observed and expected state in **_kilometers_**"""
72
+
22
73
  radial: float
74
+ """Radial distance between the observed and expected state in **_kilometers_**"""
75
+
23
76
  in_track: float
77
+ """In-track distance between the observed and expected state in **_kilometers_**"""
78
+
24
79
  cross_track: float
80
+ """Cross-track distance between the observed and expected state in **_kilometers_**"""
81
+
82
+ velocity: float
83
+ """Velocity magnitude difference between the observed and expected state in **_kilometers per second_**"""
84
+
85
+ radial_velocity: float
86
+ """Radial velocity difference between the observed and expected state in **_kilometers per second_**"""
87
+
88
+ in_track_velocity: float
89
+ """In-track velocity difference between the observed and expected state in **_kilometers per second_**"""
90
+
91
+ cross_track_velocity: float
92
+ """Cross-track velocity difference between the observed and expected state in **_kilometers per second_**"""
93
+
25
94
  time: float
95
+ """Time difference between the observed and expected state in **_seconds_**"""
96
+
26
97
  beta: float
98
+ """Out-of-plane difference between the observed and expected state in **_degrees_**"""
99
+
100
+ height: float
101
+ """Height difference between the observed and expected state in **_kilometers_**"""
27
102
 
28
103
  class BatchLeastSquares:
104
+ """
105
+ Args:
106
+ obs: List of observations to be used in the estimation
107
+ a_priori: A priori satellite state
108
+ """
109
+
29
110
  converged: bool
111
+ """Indicates if the solution meets the tolerance criteria"""
112
+
30
113
  max_iterations: int
114
+ """Maximum number of iterations to perform when solving if the tolerance is not met"""
115
+
31
116
  iteration_count: int
117
+ """Number of iterations performed to reach the solution"""
118
+
32
119
  current_estimate: Satellite
120
+ """Current estimate of the satellite state after iterating or solving"""
121
+
33
122
  rms: float | None
123
+ """Root mean square of the residuals in **_kilometers_**"""
124
+
34
125
  weighted_rms: float | None
126
+ """Unitless weighted root mean square of the residuals"""
127
+
35
128
  estimate_srp: bool
129
+ """Flag to indicate if solar radiation pressure should be estimated
130
+
131
+ !!! warning
132
+ This currently has unexpected behavior if solving for output_types other than XP
133
+ """
134
+
36
135
  estimate_drag: bool
136
+ """Flag to indicate if atmospheric drag should be estimated
137
+
138
+ !!! warning
139
+ This currently has unexpected behavior if solving for output_types other than XP
140
+ """
141
+
37
142
  a_priori: Satellite
143
+ """A priori satellite state used to initialize the estimation"""
144
+
38
145
  observations: list[Observation]
146
+ """List of observations used in the estimation"""
147
+
39
148
  residuals: list[tuple[Epoch, ObservationResidual]]
149
+ """List of residuals for each observation compared to the current estimate"""
150
+
40
151
  covariance: Covariance | None
152
+ """UVW covariance matrix of the current estimate in **_kilometers_** and **_kilometers per second_**"""
153
+
41
154
  output_type: KeplerianType
155
+ """Type of Keplerian elements to be used in the output state"""
156
+
42
157
  def __init__(
43
158
  self,
44
159
  obs: list[Observation],
45
160
  a_priori: Satellite,
46
161
  ) -> None: ...
47
- def solve(self) -> None: ...
162
+ def solve(self) -> None:
163
+ """Iterate until the solution converges or the maximum number of iterations is reached."""
164
+ ...
165
+
166
+ def iterate(self) -> None:
167
+ """Perform a single iteration of the estimation process."""
168
+ ...
169
+
170
+ def reset(self) -> None:
171
+ """Reset the estimation process to the initial state."""
172
+ ...
keplemon/events.pyi CHANGED
@@ -3,10 +3,27 @@ from keplemon.time import Epoch
3
3
 
4
4
  class CloseApproach:
5
5
  epoch: Epoch
6
+ """UTC epoch of the close approach"""
7
+
6
8
  primary_id: int
9
+ """Satellite ID of the primary body in the close approach"""
10
+
7
11
  secondary_id: int
12
+ """Satellite ID of the secondary body in the close approach"""
13
+
8
14
  distance: float
15
+ """Distance between the two bodies in **_kilometers_**"""
9
16
 
10
17
  class CloseApproachReport:
18
+ """
19
+ Args:
20
+ start: CA screening start time
21
+ end: CA screening end time
22
+ distance_threshold: Distance threshold for CA screening in **_kilometers_**
23
+ """
24
+
11
25
  close_approaches: list[CloseApproach]
26
+ """List of close approaches found during the screening"""
27
+
12
28
  distance_threshold: float
29
+ def __init__(self, start: Epoch, end: Epoch, distance_threshold: float) -> None: ...
keplemon/time.pyi CHANGED
@@ -121,7 +121,7 @@ class TimeComponents:
121
121
  def to_iso(self) -> str:
122
122
  """
123
123
  Returns:
124
- Epoch in ISO 8601 format (YYYY-MM-DDThh:mm:ss.sssZ)
124
+ Epoch in ISO 8601 format (YYYY-MM-DDThh:mm:ss.sss)
125
125
  """
126
126
  ...
127
127
 
@@ -129,7 +129,7 @@ class TimeComponents:
129
129
  def from_iso(cls, iso_str: str) -> TimeComponents:
130
130
  """
131
131
  Args:
132
- iso_str: ISO 8601 formatted string (YYYY-MM-DDThh:mm:ss.sssZ)
132
+ iso_str: ISO 8601 formatted string (YYYY-MM-DDThh:mm:ss.sss)
133
133
  """
134
134
  ...
135
135
 
@@ -158,7 +158,7 @@ class Epoch:
158
158
  def from_iso(cls, iso_str: str, time_system: TimeSystem) -> Epoch:
159
159
  """
160
160
  Args:
161
- iso_str: ISO 8601 formatted string (YYYY-MM-DDThh:mm:ss.sssZ)
161
+ iso_str: ISO 8601 formatted string (YYYY-MM-DDThh:mm:ss.sss)
162
162
  time_system: System used to calculate the epoch
163
163
  """
164
164
  ...
@@ -179,6 +179,7 @@ class Epoch:
179
179
 
180
180
  !!! note
181
181
  DTG formats include:
182
+
182
183
  - DTG 20: YYYY/DDD HHMM SS.SSS
183
184
  - DTG 19: YYYYMonDDHHMMSS.SSS
184
185
  - DTG 17: YYYY/DDD.DDDDDDDD
@@ -193,7 +194,7 @@ class Epoch:
193
194
  def to_iso(self) -> str:
194
195
  """
195
196
  Returns:
196
- Epoch in ISO 8601 format (YYYY-MM-DDThh:mm:ss.sssZ)
197
+ Epoch in ISO 8601 format (YYYY-MM-DDThh:mm:ss.sss)
197
198
  """
198
199
  ...
199
200
 
@@ -0,0 +1,100 @@
1
+ Metadata-Version: 2.4
2
+ Name: keplemon
3
+ Version: 0.1.5
4
+ Requires-Dist: requests
5
+ Requires-Dist: click
6
+ Requires-Dist: maturin ; extra == 'dev'
7
+ Requires-Dist: keplemon[test] ; extra == 'dev'
8
+ Requires-Dist: mkdocstrings[python] ; extra == 'dev'
9
+ Requires-Dist: mkdocs-material ; extra == 'dev'
10
+ Requires-Dist: markdown-include ; extra == 'dev'
11
+ Requires-Dist: pytest ; extra == 'test'
12
+ Provides-Extra: dev
13
+ Provides-Extra: test
14
+ Summary: Citra Space Corporation's Rust-accelerated astrodynamics library.
15
+ Author-email: Brandon Sexton <brandon@citra.space>
16
+ License: MIT
17
+ Requires-Python: >=3.9
18
+ Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
19
+ Project-URL: Documentation, https://keplemon.citra.space
20
+ Project-URL: Repository, https://github.com/citra-space/keplemon.git
21
+ Project-URL: Issues, https://github.com/citra-space/keplemon/issues
22
+
23
+ # KepLemon
24
+
25
+ [Citra Space Corporation's](https://citra.space) Rust-accelerated astrodynamics package built on the shared libraries
26
+ provided by [space-track](https://space-track.org). Please visit the [documentation](https://keplemon.citra.space)
27
+ page for additional details.
28
+
29
+ ## Installation
30
+
31
+ ### From PyPI (Preferred)
32
+
33
+ KepLemon can be installed directly for any operating system from a command line using `pip install keplemon`.
34
+
35
+ ### From a Local Build
36
+
37
+ For python users, the **_preferred installation method is through [PyPI](https://www.pypi.org)_**; however, the package can be
38
+ installed locally by following the steps below.
39
+
40
+ 1. `git clone https://github.com/citra-space/keplemon.git`
41
+ 2. `cargo install cargo-make`
42
+ 3. `cargo make build-<os>-<architecture>` (e.g. for Linux x86 `cargo make build-linux-amd`)
43
+ 4. `pip install target/wheels/*.whl`
44
+
45
+ ## Environment Settings
46
+
47
+ Although not required, it is recommended to explicitly apply the settings in this section before using KepLemon to avoid
48
+ unexpected behaviors and inaccurate calculations.
49
+
50
+ ### CPU Limits
51
+
52
+ By default, KepLemon will have access to all available cores when performing parallel functions. Limit this by calling
53
+ `set_thread_count` **_before_** using other KepLemon functions.
54
+
55
+ ```python
56
+ from keplemon import set_thread_count, get_thread_count
57
+
58
+ # Update this to the desired core count
59
+ set_thread_count(4)
60
+ ```
61
+
62
+ ### Time Constants and Earth-Orientation Parameters (EOP)
63
+
64
+ All astrodynamics packages have a strict dependence on measured changes to time and Earth's orientation. Since KepLemon
65
+ uses the public Standardized Astrodynamics Algorithms Library (SAAL) at the core, the time and (EOP) data must conform
66
+ to a specific format required by the underlying binaries. Rather than referencing data directly provided by the
67
+ [USNO](https://maia.usno.navy.mil/), utility scripts are provided in KepLemon to request and export the relevant data.
68
+
69
+ #### Global Update
70
+
71
+ Use the command below from a terminal to update time constants and EOP data package-wide.
72
+
73
+ ```bash
74
+ keplemon --update-eop global
75
+ ```
76
+
77
+ #### Local Override
78
+
79
+ EOP data can also be written to explicit paths for inspection or package overrides using the commands below.
80
+
81
+ ```bash
82
+ keplemon --update-eop custom_path.txt
83
+ ```
84
+
85
+ !!! note
86
+ If you intend to use the data written to a local override, you must use the `load_time_constants` method at the
87
+ beginning of your scripts. **_This is not needed if you maintain constants using the global method_**.
88
+
89
+ ```python
90
+ from keplemon.time import load_time_constants
91
+
92
+ # Update this to reflect the desired override path
93
+ load_time_constants("custom_path.txt")
94
+ ```
95
+
96
+ ## Contributing
97
+
98
+ Anyone is welcome to contribute to KepLemon. Users are encouraged to start by opening issues or forking the repository.
99
+ Changes directly to the baseline may be approved by contacting the owner at <brandon@citra.space>.
100
+
@@ -1,29 +1,6 @@
1
- keplemon-0.1.3.dist-info/METADATA,sha256=472bk4hufRyub5W1ATBw5OcUk2YERb4_NliYBW0FO_c,1121
2
- keplemon-0.1.3.dist-info/WHEEL,sha256=tAGdc4C2KTz7B2CZ8Jf3DcKSAviAbCg44UH9ma2gYww,96
3
- keplemon-0.1.3.dist-info/entry_points.txt,sha256=eYbCkvQvWfRDQ0LzaCELov1xeLAxQEHlfdgNq-LXyb0,49
4
- keplemon/assets/EGM-2008.GEO,sha256=K2nG8HGLATIHZYMfw3GSClYOTCuZ7rq4RdCeUNgCw5A,148770
5
- keplemon/assets/EGM-96.GEO,sha256=VBkILuvEMwAPuWmUHy2PeyEfULOwJ4PEJLNf5hr84mU,148770
6
- keplemon/assets/GEM_5-22.GEO,sha256=stemYLn1ChXa-VdLGHYfa15AXZa_xxGZQ65p4c3gffI,6852
7
- keplemon/assets/GEM_9-30.GEO,sha256=1mM2LRXRdxhs8-Z_xjadlWq8s2tOnRJd7nYOK3cgW_o,15012
8
- keplemon/assets/JGM2-70.GEO,sha256=7NCW-clrb7PddiBOf_GWrJ0Qf_ZjM823jU9mDIOVLG0,148566
9
- keplemon/assets/JPLcon_1950_2050.405,sha256=IRfVZmBTDAKGdMGTyZr06KSBY0N5PxRgEcljPrZB_iU,31222725
10
- keplemon/assets/NWL8C-12.GEO,sha256=ZwDKiFC5AxrSIkDPBUnQMmZeSaA5272V-z8yn6bKjOs,4788
11
- keplemon/assets/SEM68R-8.GEO,sha256=vJTCLrviQ9HonN9BojX8PbH0vPkL4qgpBxUc9X43sjI,2482
12
- keplemon/assets/time_constants.dat,sha256=3nsYjFgq0QnTUHPxuQPdtMG-AqxShVbvmG2zPcZfdcA,1246208
13
- keplemon/assets/WGS84-70.GEO,sha256=ARjEC_5s2SVd0Kh9udbTy1ztBwTeuBYPOhUVJgIqit8,148510
14
- keplemon/bodies.py,sha256=MjdAGL25eF5pA3KHo5ipjz0DDql5EEEbBqR735M254g,217
15
- keplemon/catalogs.py,sha256=AKONH7zWBOnUZI0ty0lYiYZtrdILfKivoUgk1nU3PZ8,107
16
- keplemon/elements.py,sha256=wNOjcOhoomRN0bcJW-KgzHhIIuS11IUFwg-ACIDMIJc,420
17
- keplemon/enums.py,sha256=5MejXeSwXPtfpIYeNuFQH3LSIRf4aTFZTK2Q1AYyaEg,325
18
- keplemon/estimation.py,sha256=Of0rHiapW4s1wRipBCZrp4oOiIzs794w1nhqM7AVrGs,236
19
- keplemon/events.py,sha256=5BOio4qnc6kEpOMZWiBy7LfXXTEM_TQPb7GiCNn936s,160
20
- keplemon/propagation.py,sha256=PEFXVmF-UgSR88Wp72MGtJYo2xxUFC5A7tQhT9JnF8w,120
21
- keplemon/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
- keplemon/saal.py,sha256=-il5Iq9qXRx83myb_qtFr2VIlTntizuBaDH27e83g9s,316
23
- keplemon/SGP4_Open_License.txt,sha256=ThQ87DpbbXt-9K0-0U13tcZqsndte_UkaG3S0nLsfNY,8695
24
- keplemon/time.py,sha256=3cCQYaJpRPm5EEHa8PUT7OP6ILkmzxCEjmrhqa383cE,2974
25
- keplemon/__init__.py,sha256=CsNJS6r7e05oHdMKI-dQyIiLvL36KJU8c70vweuL5YE,759
26
- keplemon/__main__.py,sha256=Bbbzny3eE3NOikVCEVFAGJiSRGooAkLzPwoSz-rpaxc,689
1
+ keplemon-0.1.5.dist-info/METADATA,sha256=iMR_LJXroEYiMYSob7qJ4lQJjzYlii9GciBdkSJfLAo,3788
2
+ keplemon-0.1.5.dist-info/WHEEL,sha256=Kw8y023UaufEXFM028WbBCk7rJUUAhAX1Zw-54pv0m4,96
3
+ keplemon-0.1.5.dist-info/entry_points.txt,sha256=eYbCkvQvWfRDQ0LzaCELov1xeLAxQEHlfdgNq-LXyb0,49
27
4
  keplemon/AstroFunc.dll,sha256=ArPDsKRu052cQ63JV7WWvS3Z7KuqLzZ44ICQgTp55KM,363520
28
5
  keplemon/AstroFunc.lib,sha256=i7R4c_8zDF9fnAeR935vNMOZNYX6zSly8JE2BhTLIO8,56218
29
6
  keplemon/DllMain.dll,sha256=r_GyeLglQQc25cxrRItUOYiY2qh5rdPXOj5quH6iQSQ,128512
@@ -36,6 +13,7 @@ keplemon/ExtEphem.dll,sha256=GM8TT_uhmmKuDXApanx2r10utZ4SRtGJ4zbLnjVgyQA,189440
36
13
  keplemon/ExtEphem.lib,sha256=R7dZInQF8xnTNeFK4qxnsFZFWp3JGK1BILKq7RmZyyE,23564
37
14
  keplemon/Obs.dll,sha256=QhLn3iXcwIiXTOpBPe9nDxXFadol293E_wfddi-GS4o,507904
38
15
  keplemon/Obs.lib,sha256=HtMrLI6WpUOfyLj-1g1Xej07IPhoXV9laMftqu2BTOo,47006
16
+ keplemon/SGP4_Open_License.txt,sha256=ThQ87DpbbXt-9K0-0U13tcZqsndte_UkaG3S0nLsfNY,8695
39
17
  keplemon/SatState.dll,sha256=8n7XrrfQ0WaKF3FhyW13UsL0RNU0ttUD_siKqwIA3JY,179200
40
18
  keplemon/SatState.lib,sha256=A39brG5s5hhXVuizKayjj4pbf1IPtGMx1HGySNgjcjU,18276
41
19
  keplemon/Sensor.dll,sha256=NWbh_sPATDLINQYB25xGNh0W5o-Us6arfJtCshEQnY0,882688
@@ -50,18 +28,40 @@ keplemon/Tle.dll,sha256=5eJ4-LHJROB5NqMh-O38qR0Lhx739oURR5--PLy6iuw,196608
50
28
  keplemon/Tle.lib,sha256=6NCJPR7JQ63mxCISyvYteq4-oHcqs3Ib8bwhTjJfk-I,23622
51
29
  keplemon/Vcm.dll,sha256=eaKzLh20L_UZhNlqCK5DqRfRHwV7eo6VOqs4krla2NA,272384
52
30
  keplemon/Vcm.lib,sha256=q2FPbH_DJXjIzNIzli2f1uV2faHHBjLbffZrL3Nagpw,19404
31
+ keplemon/__init__.py,sha256=CsNJS6r7e05oHdMKI-dQyIiLvL36KJU8c70vweuL5YE,759
53
32
  keplemon/__init__.pyi,sha256=2eKLIesgOK-C6maXIFVk8xe-EHQR_uJVor8KhtlYpT4,709
54
- keplemon/bodies.pyi,sha256=s0o5d6VDMm2SmwqRiIYfg10jWxfi8pzvqAyoq3yzqI4,2857
33
+ keplemon/__main__.py,sha256=Bbbzny3eE3NOikVCEVFAGJiSRGooAkLzPwoSz-rpaxc,689
34
+ keplemon/_keplemon.cp311-win_amd64.pyd,sha256=peeFcmcblgTpM97-KcKEXt7JEeNKtjpn5FPNclgbtcI,1314816
35
+ keplemon/assets/EGM-2008.GEO,sha256=K2nG8HGLATIHZYMfw3GSClYOTCuZ7rq4RdCeUNgCw5A,148770
36
+ keplemon/assets/EGM-96.GEO,sha256=VBkILuvEMwAPuWmUHy2PeyEfULOwJ4PEJLNf5hr84mU,148770
37
+ keplemon/assets/GEM_5-22.GEO,sha256=stemYLn1ChXa-VdLGHYfa15AXZa_xxGZQ65p4c3gffI,6852
38
+ keplemon/assets/GEM_9-30.GEO,sha256=1mM2LRXRdxhs8-Z_xjadlWq8s2tOnRJd7nYOK3cgW_o,15012
39
+ keplemon/assets/JGM2-70.GEO,sha256=7NCW-clrb7PddiBOf_GWrJ0Qf_ZjM823jU9mDIOVLG0,148566
40
+ keplemon/assets/JPLcon_1950_2050.405,sha256=IRfVZmBTDAKGdMGTyZr06KSBY0N5PxRgEcljPrZB_iU,31222725
41
+ keplemon/assets/NWL8C-12.GEO,sha256=ZwDKiFC5AxrSIkDPBUnQMmZeSaA5272V-z8yn6bKjOs,4788
42
+ keplemon/assets/SEM68R-8.GEO,sha256=vJTCLrviQ9HonN9BojX8PbH0vPkL4qgpBxUc9X43sjI,2482
43
+ keplemon/assets/WGS84-70.GEO,sha256=ARjEC_5s2SVd0Kh9udbTy1ztBwTeuBYPOhUVJgIqit8,148510
44
+ keplemon/assets/time_constants.dat,sha256=3nsYjFgq0QnTUHPxuQPdtMG-AqxShVbvmG2zPcZfdcA,1246208
45
+ keplemon/bodies.py,sha256=MjdAGL25eF5pA3KHo5ipjz0DDql5EEEbBqR735M254g,217
46
+ keplemon/bodies.pyi,sha256=GMlkidDa2mHXFXPtUeoNkpAwFZ9UULlfwQNXvn7PijI,5827
47
+ keplemon/catalogs.py,sha256=AKONH7zWBOnUZI0ty0lYiYZtrdILfKivoUgk1nU3PZ8,107
55
48
  keplemon/catalogs.pyi,sha256=xcXEaiQY4wNvd95YdQDmqjD-nkirc_phSwL256Fejuc,540
56
- keplemon/elements.pyi,sha256=PNKkQ2vAuE3eS7pD4nDpC8rGXc-93J5GJqM8xsBaQMY,2810
49
+ keplemon/elements.py,sha256=wNOjcOhoomRN0bcJW-KgzHhIIuS11IUFwg-ACIDMIJc,420
50
+ keplemon/elements.pyi,sha256=2aBLxZyXNzvQ-dT4BKzhuLkVcDs4z4VHgyGK5zxtt04,8370
51
+ keplemon/enums.py,sha256=5MejXeSwXPtfpIYeNuFQH3LSIRf4aTFZTK2Q1AYyaEg,325
57
52
  keplemon/enums.pyi,sha256=OSS71WesYTgzWGUSjpxaYtzj6XmoyLBXq_Zd13IBwyQ,2418
58
- keplemon/estimation.pyi,sha256=QR1TapFgfhh1B5tQ2CLuwaNu_pibDi5MMFwRNdSNyH4,1262
59
- keplemon/events.pyi,sha256=w6OXHHtPbnCHP6lOFSQA15dk54hCLmBMFp_jTMaoIIE,260
53
+ keplemon/estimation.py,sha256=Of0rHiapW4s1wRipBCZrp4oOiIzs794w1nhqM7AVrGs,236
54
+ keplemon/estimation.pyi,sha256=kH-erT5qhxKVpHm9NehHsZbHbe96FP3aDX6GgwdntAs,5693
55
+ keplemon/events.py,sha256=5BOio4qnc6kEpOMZWiBy7LfXXTEM_TQPb7GiCNn936s,160
56
+ keplemon/events.pyi,sha256=L4dzNDRG477oS6jIPWkmuVfD9vZh0z7Ek8ZA-UT1A64,853
60
57
  keplemon/libifcoremd.dll,sha256=x8iFLCgtUCJjWdfdmQycUx9BlXcNCW-Q3MeGpcIN12k,1885224
61
58
  keplemon/libiomp5md.dll,sha256=C2O3Lj2yJYPGTyH0Z1c4FSrflnSzxHARp6y0dE3H2ZI,2030632
62
59
  keplemon/libmmd.dll,sha256=Qf9bE3FoMllIyq4gRjhGK-Al9PVonTI0O5GP-dwuhb4,4449832
60
+ keplemon/propagation.py,sha256=PEFXVmF-UgSR88Wp72MGtJYo2xxUFC5A7tQhT9JnF8w,120
63
61
  keplemon/propagation.pyi,sha256=ZWqjxwg4MQebRukTysK2ZyTtIxvAyZIkUybO3wsZO9Q,483
62
+ keplemon/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
+ keplemon/saal.py,sha256=-il5Iq9qXRx83myb_qtFr2VIlTntizuBaDH27e83g9s,316
64
64
  keplemon/saal.pyi,sha256=0XbQhzZQhHTFa0_YLC5Zg63drIUlswRbcRYmrY5MZ7I,477
65
- keplemon/time.pyi,sha256=_lWQHMU5URNqDEyBCPIiV1FxBphjvhfzRtgli25norc,6526
66
- keplemon/_keplemon.cp311-win_amd64.pyd,sha256=0J2VOhDtsEk5Ps1Ivsf1EjC355WA0cPXdDh3EHYHyEU,1316864
67
- keplemon-0.1.3.dist-info/RECORD,,
65
+ keplemon/time.py,sha256=3cCQYaJpRPm5EEHa8PUT7OP6ILkmzxCEjmrhqa383cE,2974
66
+ keplemon/time.pyi,sha256=A4mR1uKrXIeBWfkwzIGoh910u2xZ_TAF6vENG7kvs2E,6524
67
+ keplemon-0.1.5.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: maturin (1.8.3)
2
+ Generator: maturin (1.8.6)
3
3
  Root-Is-Purelib: false
4
4
  Tag: cp311-cp311-win_amd64
@@ -1,28 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: keplemon
3
- Version: 0.1.3
4
- Requires-Dist: requests
5
- Requires-Dist: click
6
- Requires-Dist: maturin ; extra == 'dev'
7
- Requires-Dist: keplemon[test] ; extra == 'dev'
8
- Requires-Dist: mkdocstrings[python] ; extra == 'dev'
9
- Requires-Dist: mkdocs-material ; extra == 'dev'
10
- Requires-Dist: markdown-include ; extra == 'dev'
11
- Requires-Dist: pytest ; extra == 'test'
12
- Provides-Extra: dev
13
- Provides-Extra: test
14
- Summary: Citra Space Corporation's Rust-accelerated astrodynamics library.
15
- Author-email: Brandon Sexton <brandon@citra.space>
16
- License: MIT
17
- Requires-Python: >=3.9
18
- Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
19
- Project-URL: Documentation, https://keplemon.citra.space
20
- Project-URL: Repository, https://github.com/citra-space/keplemon.git
21
- Project-URL: Issues, https://github.com/citra-space/keplemon/issues
22
-
23
- # KepLemon
24
-
25
- [Citra Space Corporation's](https://citra.space) Rust-accelerated astrodynamics package built on the shared libraries
26
- provided by [space-track](https://space-track.org). Please visit the [documentation](https://keplemon.citra.space)
27
- page for additional details.
28
-