keplemon 0.1.3__cp39-cp39-macosx_11_0_arm64.whl → 0.1.4__cp39-cp39-macosx_11_0_arm64.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.
Binary file
keplemon/bodies.pyi CHANGED
@@ -53,47 +53,134 @@ class Satellite:
53
53
  def get_state_at_epoch(self, epoch: Epoch) -> CartesianState: ...
54
54
 
55
55
  class Constellation:
56
+ """
57
+ Args:
58
+ name: Identifier of the constellation
59
+ """
60
+
56
61
  count: int
62
+ """Number of satellites in the constellation"""
63
+
57
64
  name: str | None
65
+ """Human-readable name of the constellation"""
66
+
58
67
  def __init__(self, name: str) -> None: ...
59
68
  @classmethod
60
- def from_tle_catalog(cls, tle_catalog: TLECatalog) -> Constellation: ...
61
- def get_states_at_epoch(self, epoch: Epoch) -> dict[int, CartesianState]: ...
69
+ def from_tle_catalog(cls, tle_catalog: TLECatalog) -> Constellation:
70
+ """
71
+ Instantiate a Constellation from a TLE catalog
72
+
73
+ Args:
74
+ tle_catalog: TLE catalog for the constellation
75
+ """
76
+ ...
77
+
78
+ def get_states_at_epoch(self, epoch: Epoch) -> dict[int, CartesianState]:
79
+ """
80
+ Args:
81
+ epoch: UTC epoch at which the states will be calculated
82
+
83
+ Returns:
84
+ (satellite_id, state) dictionary for the constellation at the given epoch
85
+ """
86
+ ...
87
+
62
88
  def get_ephemeris(
63
89
  self,
64
90
  start: Epoch,
65
91
  end: Epoch,
66
92
  step: TimeSpan,
67
- ) -> dict[int, Ephemeris]: ...
93
+ ) -> dict[int, Ephemeris]:
94
+ """
95
+ Args:
96
+ start: UTC epoch of the start of the ephemeris
97
+ end: UTC epoch of the end of the ephemeris
98
+ step: Time step for the ephemeris
99
+
100
+ Returns:
101
+ (satellite_id, ephemeris) dictionary for the constellation
102
+ """
103
+ ...
104
+
68
105
  def get_ca_report_vs_one(
69
106
  self,
70
107
  other: Satellite,
71
108
  start: Epoch,
72
109
  end: Epoch,
73
110
  distance_threshold: float,
74
- ) -> CloseApproachReport: ...
111
+ ) -> CloseApproachReport:
112
+ """
113
+ Calculate close approaches between the constellation and a given satellite.
114
+
115
+ Args:
116
+ other: Satellite to compare against
117
+ start: UTC epoch of the start of the close approach report
118
+ end: UTC epoch of the end of the close approach report
119
+ distance_threshold: Distance threshold for close approach screening in **_kilometers_**
120
+
121
+ Returns:
122
+ Close approach report for the constellation vs. the given satellite
123
+ """
124
+ ...
125
+
75
126
  def get_ca_report_vs_many(
76
127
  self,
77
128
  start: Epoch,
78
129
  end: Epoch,
79
130
  distance_threshold: float,
80
- ) -> CloseApproachReport: ...
131
+ ) -> CloseApproachReport:
132
+ """
133
+ Calculate close approaches among satellites in the calling constellation.
134
+
135
+ !!! warning
136
+ This is a long-running operation when the constellation is large.
137
+
138
+ Args:
139
+ start: UTC epoch of the start of the close approach report
140
+ end: UTC epoch of the end of the close approach report
141
+ distance_threshold: Distance threshold for close approach screening in **_kilometers_**
142
+
143
+ Returns:
144
+ Close approach report for the constellation vs. all other satellites
145
+ """
146
+ ...
147
+
81
148
  def __getitem__(self, satellite_id: int) -> Satellite: ...
82
149
 
83
150
  class Sensor:
151
+ """
152
+ Args:
153
+ name: Identifier of the sensor
154
+ angular_noise: Angular noise in **_degrees_**
155
+ """
156
+
84
157
  name: str
85
158
  angular_noise: float
86
- range_noise: float
87
- range_rate_noise: float
88
- angular_rate_noise: float
159
+ range_noise: float | None
160
+ """Range noise in **_kilometers_**"""
161
+
162
+ range_rate_noise: float | None
163
+ """Range rate noise in **_kilometers per second_**"""
164
+
165
+ angular_rate_noise: float | None
166
+ """Angular rate noise in **_degrees per second_**"""
89
167
  def __init__(self, name: str, angular_noise: float) -> None: ...
90
168
 
91
169
  class Observatory:
170
+ """
171
+ Args:
172
+ name: Identifier of the observatory
173
+ latitude: Latitude in **_degrees_**
174
+ longitude: Longitude in **_degrees_**
175
+ altitude: Altitude in **_kilometers_**
176
+ """
177
+
92
178
  name: str
93
179
  latitude: float
94
180
  longitude: float
95
181
  altitude: float
96
182
  sensors: list[Sensor]
183
+ """List of sensors at the observatory"""
97
184
  def __init__(
98
185
  self,
99
186
  name: str,
@@ -101,4 +188,12 @@ class Observatory:
101
188
  longitude: float,
102
189
  altitude: float,
103
190
  ) -> None: ...
104
- def get_state_at_epoch(self, epoch: Epoch) -> CartesianState: ...
191
+ def get_state_at_epoch(self, epoch: Epoch) -> CartesianState:
192
+ """
193
+ Args:
194
+ epoch: UTC epoch of the state
195
+
196
+ Returns:
197
+ TEME Cartesian state of the observatory in **_kilometers_** and **_kilometers per second_**
198
+ """
199
+ ...
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,221 @@ 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
+ def get_lines(self) -> tuple[str, str]:
99
+ """
100
+ !!! note
101
+ If the TLE was created in the 3LE format, only lines 2 and 3 will be returned. The name must be accessed
102
+ using the `name` property.
103
+
104
+ Returns:
105
+ Tuple of strings in 2 line format
106
+ """
107
+ ...
108
+
38
109
  def get_state_at_epoch(self, epoch: Epoch) -> CartesianState: ...
39
110
 
40
111
  class SphericalVector:
112
+ """
113
+ !!! note
114
+ The range units can be disregarded if this class is not being used for astrodynamic transforms.
115
+
116
+ Args:
117
+ range: distance from the origin in **_kilometers_**
118
+ right_ascension: right ascension in **_degrees_**
119
+ declination: declination in **_degrees_**
120
+ """
121
+
41
122
  range: float
42
123
  right_ascension: float
43
124
  declination: float
44
125
  def __init__(self, range: float, right_ascension: float, declination: float) -> None: ...
45
- def to_cartesian(self) -> CartesianVector: ...
126
+ def to_cartesian(self) -> CartesianVector:
127
+ """
128
+ Returns:
129
+ Cartesian vector in **_kilometers_**.
130
+ """
131
+ ...
46
132
 
47
133
  class CartesianVector:
134
+ """
135
+ Args:
136
+ x: x coordinate
137
+ y: y coordinate
138
+ z: z coordinate
139
+ """
140
+
48
141
  x: float
49
142
  y: float
50
143
  z: float
51
144
  magnitude: float
145
+ """"""
146
+
52
147
  def __init__(self, x: float, y: float, z: float) -> None: ...
53
- def distance(self, other: CartesianVector) -> float: ...
54
- def to_spherical(self) -> SphericalVector: ...
148
+ def distance(self, other: CartesianVector) -> float:
149
+ """
150
+ !!! note
151
+ Take care to use consistent units with this function.
152
+
153
+ Returns:
154
+ Distance between two Cartesian vectors
155
+ """
156
+ ...
157
+
158
+ def to_spherical(self) -> SphericalVector:
159
+ """
160
+ Returns:
161
+ Spherical representation of the point
162
+ """
163
+ ...
164
+
55
165
  def __add__(self, other: CartesianVector) -> CartesianVector: ...
56
166
  def __sub__(self, other: CartesianVector) -> CartesianVector: ...
57
- def angle(self, other: CartesianVector) -> float: ...
167
+ def angle(self, other: CartesianVector) -> float:
168
+ """
169
+ Returns:
170
+ Angle between two Cartesian vectors in **_radians_**.
171
+ """
172
+ ...
58
173
 
59
174
  class CartesianState:
175
+ """State represented as x, y, z and vx, vy, vz in a given reference frame.
176
+
177
+ Args:
178
+ epoch: UTC epoch of the state
179
+ position: Cartesian position vector in kilometers
180
+ velocity: Cartesian velocity vector in kilometers per second
181
+ frame: reference frame of the state
182
+ """
183
+
60
184
  position: CartesianVector
185
+ """Position of the state in kilometers"""
186
+
61
187
  velocity: CartesianVector
188
+ """Velocity of the state in kilometers per second"""
189
+
190
+ epoch: Epoch
191
+ """UTC epoch of the state"""
192
+
193
+ frame: ReferenceFrame
194
+ """Current reference frame of the state"""
195
+
196
+ def __init__(
197
+ self, epoch: Epoch, position: CartesianVector, velocity: CartesianVector, frame: ReferenceFrame
198
+ ) -> None: ...
199
+ def to_keplerian(self) -> KeplerianState:
200
+ """Convert the Cartesian state to osculating Keplerian elements"""
201
+ ...
202
+
203
+ def to_frame(self, frame: ReferenceFrame) -> CartesianState:
204
+ """
205
+
206
+ Args:
207
+ frame: reference frame of the output state
208
+
209
+ Returns:
210
+ CartesianState: Cartesian state in the new frame"""
211
+ ...
62
212
 
63
213
  class KeplerianState:
214
+ """Orbit represented as Keplerian elements in a given reference frame.
215
+
216
+ Args:
217
+ epoch: UTC epoch of the state
218
+ elements: Keplerian elements of the state
219
+ frame: reference frame of the state
220
+ keplerian_type: type of the Keplerian elements
221
+ """
222
+
64
223
  epoch: Epoch
65
- elements: KeplerianElements
66
224
  frame: ReferenceFrame
67
- keplerian_type: KeplerianType
225
+ type: KeplerianType
226
+ semi_major_axis: float
227
+ """Average distance from the central body in **_kilometers_**"""
228
+
229
+ eccentricity: float
230
+ """Eccentricity of the orbit"""
231
+
232
+ inclination: float
233
+ """Inclination of the orbit in **_degrees_**"""
234
+
235
+ raan: float
236
+ """Right Ascension of Ascending Node in **_degrees_**"""
237
+
238
+ argument_of_perigee: float
239
+ """Argument of Perigee in **_degrees_**"""
240
+
241
+ mean_anomaly: float
242
+ """Mean Anomaly in **_degrees_**"""
243
+
244
+ mean_motion: float
245
+ """Mean motion in **_revolutions per day_**"""
246
+
247
+ apoapsis: float
248
+ """Furthest point from the central body in **_kilometers_**"""
249
+
250
+ periapsis: float
251
+ """Closest point to the central body in **_kilometers_**"""
252
+
68
253
  def __init__(
69
254
  self,
70
255
  epoch: Epoch,
@@ -72,6 +257,21 @@ class KeplerianState:
72
257
  frame: ReferenceFrame,
73
258
  keplerian_type: KeplerianType,
74
259
  ) -> None: ...
260
+ def to_cartesian(self) -> CartesianState:
261
+ """
262
+ Returns:
263
+ Cartesian state in **_kilometers_** and **_kilometers per second_**.
264
+ """
265
+ ...
266
+
267
+ def to_frame(self, frame: ReferenceFrame) -> KeplerianState:
268
+ """
269
+ Args:
270
+ frame: reference frame of the output state
271
+
272
+ Returns:
273
+ Keplerian state in the new frame"""
274
+ ...
75
275
 
76
276
  class Ephemeris:
77
277
  def get_close_approach(
@@ -81,12 +281,33 @@ class Ephemeris:
81
281
  ) -> CloseApproach: ...
82
282
 
83
283
  class TopocentricElements:
284
+ """
285
+ Args:
286
+ ra: TEME right ascension in **_degrees_**
287
+ dec: TEME declination in **_degrees_**
288
+ """
289
+
84
290
  range: float | None
291
+ """Range in **_kilometers_**"""
292
+
85
293
  right_ascension: float
86
294
  declination: float
87
295
  range_rate: float | None
296
+ """Range rate in **_kilometers per second_**"""
297
+
88
298
  right_ascension_rate: float | None
299
+ """Right ascension rate in **_degrees per second**"""
300
+
89
301
  declination_rate: float | None
302
+ """Declination rate in **_degrees per second**"""
303
+
90
304
  def __init__(self, ra: float, dec: float) -> None: ...
91
305
  @classmethod
92
- def from_j2000(cls, epoch: Epoch, ra: float, dec: float) -> TopocentricElements: ...
306
+ def from_j2000(cls, epoch: Epoch, ra: float, dec: float) -> TopocentricElements:
307
+ """
308
+ Args:
309
+ epoch: UTC epoch of the angles
310
+ ra: J2000 right ascension in **_degrees_**
311
+ dec: J2000 declination in **_degrees_**
312
+ """
313
+ ...
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.4
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,6 +1,6 @@
1
- keplemon-0.1.3.dist-info/METADATA,sha256=7XUC7UNKe-AvA8RBbhwVHBLQFpgfjMowCBbTca6K_vM,1116
2
- keplemon-0.1.3.dist-info/WHEEL,sha256=OWa2DoOWNAtKx8o8X2SfzZNCVYa4xySMUeG2PSXKaJ4,102
3
- keplemon-0.1.3.dist-info/entry_points.txt,sha256=eYbCkvQvWfRDQ0LzaCELov1xeLAxQEHlfdgNq-LXyb0,49
1
+ keplemon-0.1.4.dist-info/METADATA,sha256=CXp2vu1v-VwHOi_vhjJEHvAXcGhgoIb0gxF1XGCrJUU,3711
2
+ keplemon-0.1.4.dist-info/WHEEL,sha256=OWa2DoOWNAtKx8o8X2SfzZNCVYa4xySMUeG2PSXKaJ4,102
3
+ keplemon-0.1.4.dist-info/entry_points.txt,sha256=eYbCkvQvWfRDQ0LzaCELov1xeLAxQEHlfdgNq-LXyb0,49
4
4
  keplemon/time.py,sha256=rFefwGP2deAeyzMQcaK5D7dIpiQDklr9eBKT6yVK7Ac,2872
5
5
  keplemon/enums.py,sha256=Jh0tFHg_rZXnOyLUXmHjSm3MSZFbvQKTBcP0BqHXeMY,308
6
6
  keplemon/events.py,sha256=Ep-X4WqhLtXue08swm6Whcc4VFzyWvqnjjAOov6M4bI,154
@@ -25,12 +25,12 @@ keplemon/assets/WGS84-70.GEO,sha256=ARjEC_5s2SVd0Kh9udbTy1ztBwTeuBYPOhUVJgIqit8,
25
25
  keplemon/assets/NWL8C-12.GEO,sha256=ZwDKiFC5AxrSIkDPBUnQMmZeSaA5272V-z8yn6bKjOs,4788
26
26
  keplemon/__main__.py,sha256=-3GVkDOA0lV0MIqU9gPb4zbVimg2lA8HMkvdPDw1O28,669
27
27
  keplemon/__init__.pyi,sha256=53luemEWRmxv8_3hkqme2Gp0bSwfkNuLgxxieU4XWdM,679
28
- keplemon/bodies.pyi,sha256=klIdvqJBvqB8mLoOwQnf1Ya_xzmfz3iN5jfbS5Hsgvw,2753
28
+ keplemon/bodies.pyi,sha256=eIVIyUa9lCw4GAk_hKQsZJt-km0JCgibTY2K2Uy8niM,5453
29
29
  keplemon/catalogs.pyi,sha256=NlWv2E7g5JH8LZyyPCDe9Lh_Me5Fmpv3sPinnbJpLf8,524
30
- keplemon/elements.pyi,sha256=2rcN_JB2TGR47w0rBAZ-EsvNgKIvLIcJwxeo01cenMU,2718
30
+ keplemon/elements.pyi,sha256=SHo2Xc7f7uLDbBGMYJ0HlqTbCjhXvyH4aW6835ARcIs,8046
31
31
  keplemon/enums.pyi,sha256=s9uqkm3Zrx6HLV4dQBScRiUy0CT4QoQwFjaCLOEMW1c,2330
32
- keplemon/estimation.pyi,sha256=Atm8uSJQUMDR95utj7_ULw1k-PdtkwSElG0oZmWrbqE,1215
33
- keplemon/events.pyi,sha256=sAn7JNeKJS6tM1kdegMIAwnq54reqLUD8-cScnYDzbA,248
32
+ keplemon/estimation.pyi,sha256=zb_llx8pCx9Iv95mXXpGnXPZeJsg9Oh5GRWDLyXrMFI,5521
33
+ keplemon/events.pyi,sha256=PrVNvvw1_BgUOIEPmxHE03-XTQcl3LTw8UeuRZOTha4,824
34
34
  keplemon/libastrofunc.dylib,sha256=UAf9ix55_mm1rvVCYHWTbuHvXPuZ673GfZsEqRknquc,241952
35
35
  keplemon/libdllmain.dylib,sha256=8-BkFlZIXC45mx5wPNq0JeEA3Coyqs5oKvcTPZBQC5g,112224
36
36
  keplemon/libelops.dylib,sha256=hzdkXXB582wBOBBJZa7gALMtB54sIwroEpgW-ol_EBI,92800
@@ -50,6 +50,6 @@ keplemon/libtle.dylib,sha256=GIGNJrqUqIzLTrNcUaC9yg94ZP53MZhClq4n7xvSdTk,164816
50
50
  keplemon/libvcm.dylib,sha256=c2x97IoW_cXq9kO1k56V1nTKXbnl812aZNKMPqKa6yU,196384
51
51
  keplemon/propagation.pyi,sha256=YSA3cBzgHLW3_dykrjMX4PbReYJmz5Z7bzfuibPaegc,464
52
52
  keplemon/saal.pyi,sha256=LX4i3SxpL6UduhHjJ5aO443QbH1v-BhKBL968Z8vQhY,469
53
- keplemon/time.pyi,sha256=iCKEf1j_lAsb9_OZ_3NgZUPBuF-bqnKxQkfrvZsHfGs,6258
54
- keplemon/_keplemon.cpython-39-darwin.so,sha256=WuaH7NKn3-2Y5Rlhxsl2tBDv2eU3-8BN3sFC7ScrNQU,1684544
55
- keplemon-0.1.3.dist-info/RECORD,,
53
+ keplemon/time.pyi,sha256=f6MxNpscs3jje0zo5yilyMBj8b0U7TVFnU6bt6NAJl0,6255
54
+ keplemon/_keplemon.cpython-39-darwin.so,sha256=y9ZVomoKDu72DFac75z8_UutJDy8SeekAzcNtOfrP_0,1684016
55
+ keplemon-0.1.4.dist-info/RECORD,,
@@ -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
-