ptwrapper 2.7.1__tar.gz → 2.7.2__tar.gz

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.
Files changed (43) hide show
  1. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/PKG-INFO +1 -1
  2. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/pyproject.toml +1 -1
  3. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/subscribers.py +61 -66
  4. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/LICENSE.txt +0 -0
  5. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/README.md +0 -0
  6. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/.flake8 +0 -0
  7. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/__init__.py +0 -0
  8. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/cli.py +0 -0
  9. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/config/agm/cfg_agm_jui.xml +0 -0
  10. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/config/agm/cfg_agm_jui_event_definitions.xml +0 -0
  11. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/config/agm/cfg_agm_jui_fixed_definitions.xml +0 -0
  12. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/config/agm/cfg_agm_jui_predefined_block.xml +0 -0
  13. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/config/eps/BRF_MAL_SGICD_2_1_300101_351005.brf +0 -0
  14. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/config/eps/RES_C50_SA_CELLS_EFFICIENCY_310101_351003.csv +0 -0
  15. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/config/eps/eps.cfg +0 -0
  16. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/config/eps/events.juice.def +0 -0
  17. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/config/eps/phs_com_res_sa_cells_count.asc +0 -0
  18. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/config/eps/units.def +0 -0
  19. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/config/session_file.json +0 -0
  20. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/html_log.py +0 -0
  21. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/TOP__events.evf +0 -0
  22. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/TOP_crema_5_0_events.evf +0 -0
  23. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/TOP_crema_5_1_150lb_23_1_a3_events.evf +0 -0
  24. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/TOP_crema_5_1_150lb_23_1_events.evf +0 -0
  25. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/downlink.evf +0 -0
  26. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/edf/EDF_JUI_SPC_LINK_KAB.edf +0 -0
  27. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/edf/EDF_JUI_SPC_LINK_XB.edf +0 -0
  28. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/edf/TBD.edf +0 -0
  29. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/edf/TOP_experiments.edf +0 -0
  30. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/edf/juice__spacecraft.edf +0 -0
  31. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/edf/juice__spacecraft_platform.edf +0 -0
  32. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/edf/juice__spacecraft_ssmm.edf +0 -0
  33. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/evf/EVT_CREMA_5_0_GEOPIPELINE.EVF +0 -0
  34. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/evf/EVT_CREMA_5_1_150LB_23_1_A3_GEOPIPELINE.EVF +0 -0
  35. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/evf/EVT_CREMA_5_1_150LB_23_1_GEOPIPELINE.EVF +0 -0
  36. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/evf/EVT__GEOPIPELINE.EVF +0 -0
  37. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/itl/TBD.itl +0 -0
  38. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/itl/TOP_timelines.itl +0 -0
  39. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/itl/downlink.itl +0 -0
  40. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/input/itl/platform.itl +0 -0
  41. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/main.py +0 -0
  42. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/py.typed +0 -0
  43. {ptwrapper-2.7.1 → ptwrapper-2.7.2}/src/ptwrapper/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ptwrapper
3
- Version: 2.7.1
3
+ Version: 2.7.2
4
4
  Summary: A Pointing Tool OSVE wrapper
5
5
  License: European Space Agency Public License (ESA-PL) Permissive (Type 3) – v2.4
6
6
  License-File: LICENSE.txt
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "ptwrapper"
3
- version = "2.7.1"
3
+ version = "2.7.2"
4
4
  description = "A Pointing Tool OSVE wrapper"
5
5
  authors = [
6
6
  "Marc Costa <marc.costa@ext.esa.int>",
@@ -30,7 +30,9 @@ class OsvePtrLogger(OsvePtrAbstract):
30
30
 
31
31
  remove_checks = True
32
32
 
33
- swi_check = False
33
+ # Initialize attributes
34
+ swi_pointing_check = False
35
+ swi_drift_check = False
34
36
  swi_block_violation = False
35
37
  swi_et_prev = 0.0
36
38
  swi_x_t_prev = None
@@ -50,6 +52,7 @@ class OsvePtrLogger(OsvePtrAbstract):
50
52
  gala_rate_violation = False
51
53
  gala_rate_sun_exclusion_block_violation = False
52
54
 
55
+ peplo_jna_sun_check = False
53
56
  peplo_jna_violation = False
54
57
  peplo_jna_start_time = False
55
58
  peplo_jna_sun_exclusion_block_violation = False
@@ -91,10 +94,12 @@ class OsvePtrLogger(OsvePtrAbstract):
91
94
  return
92
95
 
93
96
  for obs in block_data["observations"]["observations"]:
94
- if obs.get("instrument") == 'SWI' and obs.get("type") in {'PRIME', 'DESIGNER'}:
95
- self.swi_check = True
97
+ if (obs.get("unit") == 'SWI' or obs.get("instrument") == 'SWI') and obs.get("type") in {'PRIME', 'DESIGNER'}:
98
+ self.swi_pointing_check = False # this is a temporary solution, to be fixed when SWI pointing check is implemented
99
+ self.swi_drift_check = True
96
100
  self._set_swi_target(obs, block_data)
97
- self._check_swi_block_duration(obs, block_data)
101
+ self._set_swi_drift_rate(obs, block_data)
102
+ #self._check_swi_block_duration(obs, block_data)
98
103
 
99
104
  def _set_swi_target(self, observation, block_data):
100
105
  try:
@@ -107,6 +112,15 @@ class OsvePtrLogger(OsvePtrAbstract):
107
112
  warning_msg = f'SWI observation {observation.get("definition", "UNKNOWN")} has no target, setting to JUPITER as default.'
108
113
  log('WARNING', 'PTWR', block_data["block_start"], warning_msg)
109
114
  self.onMsgReceived('WARNING', 'PTWR', block_data["block_start"], warning_msg)
115
+
116
+ def _set_swi_drift_rate(self, observation, block_data):
117
+ # If SWI observation drift rates could not be set, we should disable SWI drift checks
118
+ # self.swi_drift_check = False -> future
119
+
120
+ # For now, we will set a default value if maxATDriftRate or maxCTDriftRate are not provided
121
+ DRMAX = 6.0e-6 # deg/s
122
+ self.swi_at_drift_rate = float(observation.get("maxATDriftRate", DRMAX))
123
+ self.swi_ct_drift_rate = float(observation.get("maxCTDriftRate", DRMAX))
110
124
 
111
125
  def _check_swi_block_duration(self, observation, block_data):
112
126
  violation, message = self._swi_block_duration_check(block_data, observation.get("definition", "UNKNOWN"))
@@ -119,7 +133,7 @@ class OsvePtrLogger(OsvePtrAbstract):
119
133
  return
120
134
 
121
135
  for obs in block_data["observations"]["observations"]:
122
- if obs.get("instrument") == 'PEPHI' and obs.get("type") in {'PRIME', 'DESIGNER'}:
136
+ if (obs.get("unit") == 'PEPHI' or obs.get("instrument") == 'PEPHI') and obs.get("type") in {'PRIME', 'DESIGNER'}:
123
137
  self.pephi_jeni_check = True
124
138
  self._set_pephi_jeni_target(obs, block_data)
125
139
 
@@ -178,14 +192,15 @@ class OsvePtrLogger(OsvePtrAbstract):
178
192
  self.onMsgReceived('WARNING', 'PTWR', blockdata["block_end"], 'SWI Pointing and/or drift range not recovered.')
179
193
 
180
194
  # Deactivate the SWI checks at the end of the block.
181
- self.swi_check = False
195
+ self.swi_pointing_check = False
196
+ self.swi_drift_check = False
182
197
  self.swi_block_violation = False
183
198
 
184
199
  # --------------------------------------------------------------------------------------------------------------
185
200
  # PEPHI JENI Sun and Target Concurrence Check
186
201
  # --------------------------------------------------------------------------------------------------------------
187
202
  if self.pephi_jeni_block_violation:
188
- log(self.pephi_jeni_severity, 'PTWR', blockdata["block_end"], f'{self.pephi_jeni_message} End')
203
+ log(self.pephi_jeni_severity, 'PTWR', blockdata["block_end"], f'PEPHI block end and JENI Sun avoidance not recovered')
189
204
  self.onMsgReceived(self.pephi_jeni_severity, 'PTWR', blockdata["block_end"],
190
205
  f'{self.pephi_jeni_message} End')
191
206
 
@@ -258,7 +273,7 @@ class OsvePtrLogger(OsvePtrAbstract):
258
273
  # ----------------------------------------------------------------------------------------------------------
259
274
  # SWI Pointing Compatibility Check
260
275
  # ----------------------------------------------------------------------------------------------------------
261
- if self.swi_check:
276
+ if self.swi_drift_check or self.swi_pointing_check:
262
277
  # We calculate the sc quaternion for the current state and jump to the
263
278
  # next simulation step to calculate the drift.
264
279
  x_t, y_t, dx_dt, dy_dt = self._swi_pointing_drift(data)
@@ -310,7 +325,7 @@ class OsvePtrLogger(OsvePtrAbstract):
310
325
  # ----------------------------------------------------------------------------------------------------------
311
326
  # PEPLO JNA Sun Exclusion Check
312
327
  # ----------------------------------------------------------------------------------------------------------
313
- if self._sun_distance_threshold(data["time"], 2.0):
328
+ if self._sun_distance_threshold(data["time"], 2.0) and self.peplo_jna_sun_check:
314
329
 
315
330
  violation = self._peplo_jna_sun_exclusion_check(data)
316
331
  if violation:
@@ -694,22 +709,26 @@ class OsvePtrLogger(OsvePtrAbstract):
694
709
  at0 = 0.324
695
710
  ct0 = 0.188
696
711
  drmax = 6.0e-6
712
+ drmax_at = self.swi_at_drift_rate # deg/s
713
+ drmax_ct = self.swi_ct_drift_rate # deg/s
697
714
 
698
715
  flags = {'AT': 'OK', 'CT': 'OK', 'ATDRIFT': 'OK', 'CTDRIFT': 'OK'}
699
716
  violation = False
700
717
 
701
- if (np.abs(x) >= (atmax + at0)):
702
- flags['AT'] = f'SWI Pointing out of AT range: {np.abs(x):.2f} [deg] >= {atmax + at0:.2f} [deg]'
703
- violation = True
704
- elif (np.abs(y) >= (ctmax + ct0)):
705
- flags['CT'] = f'SWI Pointing out of CT range: {np.abs(y):.2f} [deg] >= {ctmax + ct0:.2f} [deg]'
706
- violation = True
707
- elif (np.abs(dx) > drmax):
708
- flags['ATDRIFT'] = f'SWI Drift along AT out of range: {np.abs(dx):.3E} [deg/s] > {drmax:.3E} [deg/s]'
709
- violation = True
710
- elif (np.abs(dy) > drmax):
711
- flags['CTDRIFT'] = f'SWI Drift along CT out of range: {np.abs(dy):.3E} [deg/s] > {drmax:.3E} [deg/s]'
712
- violation = True
718
+ if self.swi_pointing_check is True:
719
+ if (np.abs(x) >= (atmax + at0)):
720
+ flags['AT'] = f'SWI Pointing out of AT range: {np.abs(x):.2f} [deg] >= {atmax + at0:.2f} [deg]'
721
+ violation = True
722
+ if (np.abs(y) >= (ctmax + ct0)):
723
+ flags['CT'] = f'SWI Pointing out of CT range: {np.abs(y):.2f} [deg] >= {ctmax + ct0:.2f} [deg]'
724
+ violation = True
725
+ if self.swi_drift_check is True:
726
+ if (np.abs(dx) > drmax_at):
727
+ flags['ATDRIFT'] = f'SWI Drift along AT out of range: {np.abs(dx):.3E} [deg/s] > {drmax_at:.3E} [deg/s]'
728
+ violation = True
729
+ if (np.abs(dy) > drmax_ct):
730
+ flags['CTDRIFT'] = f'SWI Drift along CT out of range: {np.abs(dy):.3E} [deg/s] > {drmax_ct:.3E} [deg/s]'
731
+ violation = True
713
732
 
714
733
  return flags, violation
715
734
 
@@ -1046,62 +1065,38 @@ class OsvePtrLogger(OsvePtrAbstract):
1046
1065
  et = spice.utc2et(data["time"])
1047
1066
  targ = self.pephi_jeni_target
1048
1067
 
1049
- # 2) Spacecraft's known quaternion (J2000 -> s/c)
1068
+ # 1) Spacecraft's known quaternion (J2000 -> s/c)
1050
1069
  q_t = np.array([data['qs'], data['q1'], data['q2'], data['q3']])
1051
1070
  q_t = q_t / np.linalg.norm(q_t) # make sure it's unit
1052
1071
 
1053
- # 4) Position of the target w.r.t. s/c in J2000 at time et
1072
+ # 2) Position of the target w.r.t. s/c in J2000 at time et
1054
1073
  # (state_t = [x, y, z, vx, vy, vz], ignoring velocity index here)
1055
- state_sun, _ = spice.spkpos('SUN', et, "J2000", "NONE", "JUICE")
1056
- r_j2000_sun = state_sun
1074
+ state_sun, _ = spice.spkpos('SUN', et, 'J2000', 'NONE', 'JUICE')
1075
+ r_j2000_sun = spice.vhat(state_sun)
1057
1076
 
1058
- state_tar, _ = spice.spkpos(targ, et, "J2000", "NONE", "JUICE")
1059
- r_j2000_tar = state_tar
1077
+ state_tar, _ = spice.spkpos(targ, et, 'J2000', 'NONE', 'JUICE')
1078
+ r_j2000_tar = spice.vhat(state_tar)
1060
1079
 
1061
- # 5) Rotation matrix from J2000 to s/c
1062
- r_j2000_to_sc = spice.q2m(q_t)
1080
+ # 3) Example with Jupiter:
1081
+ # Jupiter is in PY FOV, Sun is in PY FOR: yellow -> WARNING
1082
+ # Jupiter is in MY FOV, Sun is in MY FOR: yellow -> WARNING
1083
+ sun_in_fov_p = spice.fovray('JUICE_PEP_JENI_FOR_PY', r_j2000_sun, 'J2000', 'NONE', 'JUICE', et)
1084
+ sun_in_fov_m = spice.fovray('JUICE_PEP_JENI_FOR_MY', r_j2000_sun, 'J2000', 'NONE', 'JUICE', et)
1085
+ tar_in_fov_m = spice.fovray('JUICE_PEP_JENI_E_SLIT_MY', r_j2000_tar, 'J2000', 'NONE', 'JUICE', et)
1086
+ tar_in_fov_p = spice.fovray('JUICE_PEP_JENI_E_SLIT_PY', r_j2000_tar, 'J2000', 'NONE', 'JUICE', et)
1063
1087
 
1064
- # 6) Transform target vector into s/c frame, compute (x, y) at time t
1065
- rb_sun = spice.mxv(r_j2000_to_sc, r_j2000_sun)
1066
- rb_tar = spice.mxv(r_j2000_to_sc, r_j2000_tar)
1067
-
1068
- # Example wit Jupiter:
1069
- # Jupiter is in PY FOV, Sun is completely outside JENI’s FOV (PY or MY): green -> INFO
1070
- # Jupiter is in PY FOV, Sun is in MY FOV: yellow -> WARNING
1071
- # Jupiter and Sun are in PY FOV: red -> ERROR
1072
- sun_in_fov_p = spice.fovray('JUICE_PEP_JENI_FOR_PY', rb_sun, 'JUICE_SPACECRAFT', 'NONE', 'SUN', et)
1073
- sun_in_fov_m = spice.fovray('JUICE_PEP_JENI_FOR_MY', rb_sun, 'JUICE_SPACECRAFT', 'NONE', 'SUN', et)
1074
- tar_in_fov_m = spice.fovray('JUICE_PEP_JENI_FOR_MY', rb_tar, 'JUICE_SPACECRAFT', 'NONE', targ, et)
1075
- tar_in_fov_p = spice.fovray('JUICE_PEP_JENI_FOR_PY', rb_tar, 'JUICE_SPACECRAFT', 'NONE', targ, et)
1076
-
1077
- if tar_in_fov_p and (not sun_in_fov_p and not sun_in_fov_m):
1088
+ if tar_in_fov_m and sun_in_fov_m:
1078
1089
  violation = True
1079
- severity = 'INFO'
1080
- message = f'PEPHI JENI with {targ.capitalize()} in the PY FOR and Sun outside FOR'
1081
- elif tar_in_fov_m and (not sun_in_fov_p and not sun_in_fov_m):
1082
- violation = True
1083
- severity = 'INFO'
1084
- message = f'PEPHI JENI with {targ.capitalize()} in the MY FOR and Sun outside FOR'
1085
- elif tar_in_fov_m and sun_in_fov_p:
1086
- violation = True
1087
- severity = 'WARNING'
1088
- message = f'PEPHI JENI with {targ.capitalize()} in the MY FOR and Sun in the PY FOR'
1089
- elif tar_in_fov_p and sun_in_fov_m:
1090
- violation = True
1091
- severity = 'WARNING'
1092
- message = f'PEPHI JENI with {targ.capitalize()} in the PY FOR and Sun in the MY FOR'
1090
+ severity = 'WARNING'
1091
+ message = f'PEPHI JENI with {targ.capitalize()} in the MY E_SLIT FoV and Sun in the MY FoR'
1093
1092
  elif tar_in_fov_p and sun_in_fov_p:
1094
1093
  violation = True
1095
- severity = 'ERROR'
1096
- message = f'PEPHI JENI with {targ.capitalize()} and the Sun in the PY FOR'
1097
- elif tar_in_fov_m and sun_in_fov_m:
1098
- violation = True
1099
- severity = 'ERROR'
1100
- message = f'PEPHI JENI with {targ.capitalize()} and Sun in the MY FOR'
1094
+ severity = 'WARNING'
1095
+ message = f'PEPHI JENI with {targ.capitalize()} in the PY E_SLIT FoV and Sun in the PY FoR'
1101
1096
  else:
1102
1097
  violation = False
1103
- message = False
1104
- severity = False
1098
+ message = False
1099
+ severity = False
1105
1100
 
1106
1101
  return message, severity, violation
1107
1102
 
@@ -1122,7 +1117,7 @@ class OsvePtrLogger(OsvePtrAbstract):
1122
1117
  def _report_pephi_jeni_recovery(self, time):
1123
1118
 
1124
1119
  severity = 'INFO'
1125
- message = 'PEPHI JENI Sun and Target in FOR recovered'
1120
+ message = 'PEPHI JENI Sun avoidance recovered'
1126
1121
 
1127
1122
  log(severity, 'PTWR', f'{time}Z', message)
1128
1123
  self.onMsgReceived(severity, 'PTWR', f'{time}Z', message)
File without changes
File without changes