roc-film 1.13.5__py3-none-any.whl → 1.14.0__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. roc/__init__.py +2 -1
  2. roc/film/__init__.py +2 -2
  3. roc/film/commands.py +372 -323
  4. roc/film/config/__init__.py +0 -1
  5. roc/film/constants.py +101 -65
  6. roc/film/descriptor.json +127 -96
  7. roc/film/exceptions.py +28 -27
  8. roc/film/tasks/__init__.py +16 -16
  9. roc/film/tasks/cat_solo_hk.py +86 -74
  10. roc/film/tasks/cdf_postpro.py +438 -309
  11. roc/film/tasks/check_dds.py +39 -45
  12. roc/film/tasks/db_to_anc_bia_sweep_table.py +381 -0
  13. roc/film/tasks/dds_to_l0.py +232 -180
  14. roc/film/tasks/export_solo_coord.py +147 -0
  15. roc/film/tasks/file_handler.py +91 -75
  16. roc/film/tasks/l0_to_hk.py +117 -103
  17. roc/film/tasks/l0_to_l1_bia_current.py +38 -30
  18. roc/film/tasks/l0_to_l1_bia_sweep.py +417 -329
  19. roc/film/tasks/l0_to_l1_sbm.py +250 -208
  20. roc/film/tasks/l0_to_l1_surv.py +185 -130
  21. roc/film/tasks/make_daily_tm.py +40 -37
  22. roc/film/tasks/merge_tcreport.py +77 -71
  23. roc/film/tasks/merge_tmraw.py +101 -88
  24. roc/film/tasks/parse_dds_xml.py +21 -20
  25. roc/film/tasks/set_l0_utc.py +51 -49
  26. roc/film/tests/cdf_compare.py +565 -0
  27. roc/film/tests/hdf5_compare.py +84 -62
  28. roc/film/tests/test_dds_to_l0.py +93 -51
  29. roc/film/tests/test_dds_to_tc.py +8 -11
  30. roc/film/tests/test_dds_to_tm.py +8 -10
  31. roc/film/tests/test_film.py +161 -116
  32. roc/film/tests/test_l0_to_hk.py +64 -36
  33. roc/film/tests/test_l0_to_l1_bia.py +10 -14
  34. roc/film/tests/test_l0_to_l1_sbm.py +14 -19
  35. roc/film/tests/test_l0_to_l1_surv.py +68 -41
  36. roc/film/tests/test_metadata.py +21 -20
  37. roc/film/tests/tests.py +743 -396
  38. roc/film/tools/__init__.py +5 -5
  39. roc/film/tools/dataset_tasks.py +34 -2
  40. roc/film/tools/file_helpers.py +390 -269
  41. roc/film/tools/l0.py +402 -324
  42. roc/film/tools/metadata.py +147 -127
  43. roc/film/tools/skeleton.py +12 -17
  44. roc/film/tools/tools.py +109 -92
  45. roc/film/tools/xlsx2skt.py +161 -139
  46. {roc_film-1.13.5.dist-info → roc_film-1.14.0.dist-info}/LICENSE +127 -125
  47. roc_film-1.14.0.dist-info/METADATA +60 -0
  48. roc_film-1.14.0.dist-info/RECORD +50 -0
  49. {roc_film-1.13.5.dist-info → roc_film-1.14.0.dist-info}/WHEEL +1 -1
  50. roc/film/tasks/l0_to_anc_bia_sweep_table.py +0 -348
  51. roc_film-1.13.5.dist-info/METADATA +0 -120
  52. roc_film-1.13.5.dist-info/RECORD +0 -48
@@ -13,61 +13,62 @@ from poppy.core.target import FileTarget, PyObjectTarget
13
13
 
14
14
  from edds_process.response import xml_to_dict
15
15
 
16
- __all__ = ['ParseDdsXml']
16
+ __all__ = ["ParseDdsXml"]
17
+
17
18
 
18
19
  class ParseDdsXml(Task):
19
20
  """
20
21
  Task to parse an input DDS TmRaw XML file
21
22
  and return content as a dictionary.
22
23
  """
23
- plugin_name = 'roc.film'
24
- name = 'parse_dds_xml'
24
+
25
+ plugin_name = "roc.film"
26
+ name = "parse_dds_xml"
25
27
 
26
28
  def add_targets(self):
27
- self.add_input(identifier='dds_xml',
28
- filepath=self.get_dds_xml(),
29
- target_class=FileTarget)
30
- self.add_output(identifier='dds_data',
31
- target_class=PyObjectTarget)
29
+ self.add_input(
30
+ identifier="dds_xml", filepath=self.get_dds_xml(), target_class=FileTarget
31
+ )
32
+ self.add_output(identifier="dds_data", target_class=PyObjectTarget)
32
33
 
33
34
  def get_dds_xml(self):
34
- return self.pipeline.get('dds_xml', default=[])
35
+ return self.pipeline.get("dds_xml", default=[])
35
36
 
36
37
  def setup_inputs(self):
37
-
38
38
  # Get input DDS XML file
39
39
  dds_file = None
40
40
  try:
41
- dds_file = self.inputs['dds_xml'].filepath
41
+ dds_file = self.inputs["dds_xml"].filepath
42
42
  if not os.path.isfile(dds_file):
43
43
  raise FileNotFoundError
44
- except:
45
- logger.exception(f"Cannot load input DDS XML file '{dds_file}'")
44
+ except Exception as e:
45
+ logger.exception(f"Cannot load input DDS XML file {dds_file}:\n{e}")
46
46
  return False
47
47
  else:
48
48
  self.dds_file = dds_file
49
49
 
50
50
  # Get/create list of well processed DDS files
51
51
  self.processed_dds_files = self.pipeline.get(
52
- 'processed_dds_files', default=[], create=True)
52
+ "processed_dds_files", default=[], create=True
53
+ )
53
54
  # Get/create list of failed DDS files
54
55
  self.failed_dds_files = self.pipeline.get(
55
- 'failed_dds_files', default=[], create=True)
56
+ "failed_dds_files", default=[], create=True
57
+ )
56
58
 
57
59
  return True
58
60
 
59
61
  def run(self):
60
-
61
62
  if not self.setup_inputs():
62
63
  return
63
64
 
64
65
  try:
65
- logger.info(f'Parsing {self.dds_file}...')
66
+ logger.info(f"Parsing {self.dds_file}...")
66
67
  dds_data = xml_to_dict(self.dds_file)
67
- except:
68
- logger.exception(f"Cannot parse input DDS XML file '{self.dds_file}'")
68
+ except Exception as e:
69
+ logger.exception(f"Cannot parse input DDS XML file {self.dds_file}:\n{e}")
69
70
  self.failed_dds_files.append(self.dds_file)
70
71
  return
71
72
  else:
72
- self.outputs['dds_data'].value = dds_data
73
+ self.outputs["dds_data"].value = dds_data
73
74
  self.processed_dds_files.append(self.dds_file)
@@ -3,7 +3,6 @@
3
3
 
4
4
  """Contains task to set the utc_time values of L0 TM/TC packets."""
5
5
 
6
-
7
6
  import os
8
7
  import shutil
9
8
  from datetime import datetime
@@ -18,29 +17,30 @@ from roc.film import TIME_ISO_STRFORMAT
18
17
  from roc.film.tools.file_helpers import get_output_dir
19
18
  from roc.film.tools.l0 import L0
20
19
 
21
- __all__ = ['SetL0Utc']
20
+ __all__ = ["SetL0Utc"]
21
+
22
22
 
23
23
  class SetL0Utc(Task):
24
24
  """
25
25
  Set the UTC times of the input L0 file using SolO SPICE kernels.
26
26
  """
27
- plugin_name = 'roc.film'
28
- name = 'set_l0_utc'
27
+
28
+ plugin_name = "roc.film"
29
+ name = "set_l0_utc"
29
30
 
30
31
  def add_targets(self):
31
- self.add_input(target_class=FileTarget,
32
- identifier='l0_file',
33
- filepath=self.get_l0_file())
34
- self.add_output(target_class=FileTarget,
35
- identifier='l0_file')
32
+ self.add_input(
33
+ target_class=FileTarget, identifier="l0_file", filepath=self.get_l0_file()
34
+ )
35
+ self.add_output(target_class=FileTarget, identifier="l0_file")
36
36
 
37
37
  def get_l0_file(self):
38
- return self.pipeline.get('l0_file', default=[None])[0]
38
+ return self.pipeline.get("l0_file", default=[None])[0]
39
39
 
40
40
  def setup_inputs(self):
41
- self.l0_file = self.inputs['l0_file'].filepath
41
+ self.l0_file = self.inputs["l0_file"].filepath
42
42
  if not os.path.isfile(self.l0_file):
43
- logger.error(f'Input file {self.l0_file} not found!')
43
+ logger.error(f"Input file {self.l0_file} not found!")
44
44
  return False
45
45
 
46
46
  # Get time instance
@@ -48,49 +48,47 @@ class SetL0Utc(Task):
48
48
 
49
49
  # Pass input arguments for the Time instance
50
50
  self.time.kernel_date = self.pipeline.get(
51
- 'kernel_date', default=None, args=True)
52
- self.time.predictive = self.pipeline.get(
53
- 'predictive', default=True, args=True)
54
- self.time.no_spice = self.pipeline.get(
55
- 'no_spice', default=False, args=True)
51
+ "kernel_date", default=None, args=True
52
+ )
53
+ self.time.predictive = self.pipeline.get("predictive", default=True, args=True)
54
+ self.time.no_spice = self.pipeline.get("no_spice", default=False, args=True)
56
55
 
57
56
  # Get/create list of well processed L0 files
58
57
  self.processed_files = self.pipeline.get(
59
- 'processed_files', default=[], create=True)
58
+ "processed_files", default=[], create=True
59
+ )
60
60
  # Get/create list of failed DDS files
61
- self.failed_files = self.pipeline.get(
62
- 'failed_files', default=[], create=True)
61
+ self.failed_files = self.pipeline.get("failed_files", default=[], create=True)
63
62
 
64
63
  # If output directory not found, create it
65
64
  self.output_dir = get_output_dir(self.pipeline)
66
65
  if not os.path.isdir(self.output_dir):
67
- logger.debug(f'Making {self.output_dir}...')
66
+ logger.debug(f"Making {self.output_dir}...")
68
67
  os.makedirs(self.output_dir)
69
68
 
70
69
  return True
71
70
 
72
71
  def run(self):
73
-
74
72
  # Load/Initialize task inputs
75
73
  if not self.setup_inputs():
76
74
  return
77
75
 
78
76
  # Make a copy of the input L0 file
79
- l0_copy = os.path.join(self.output_dir,
80
- os.path.basename(self.l0_file))
77
+ l0_copy = os.path.join(self.output_dir, os.path.basename(self.l0_file))
81
78
  shutil.copyfile(self.l0_file, l0_copy)
82
79
 
83
80
  if not self._set_utc_time(l0_copy):
84
- logger.info(f'{self.l0_file} does not need to be updated '
85
- f'(delete copy in {self.output_dir})')
81
+ logger.info(
82
+ f"{self.l0_file} does not need to be updated "
83
+ f"(delete copy in {self.output_dir})"
84
+ )
86
85
  os.remove(l0_copy)
87
86
  else:
88
- logger.debug('Make sure to have sorted/unique utc time values')
87
+ logger.debug("Make sure to have sorted/unique utc time values")
89
88
  L0.order_by_utc(l0_copy, unique=True, update_time_minmax=True)
90
- logger.info(f'{l0_copy} updated')
89
+ logger.info(f"{l0_copy} updated")
91
90
 
92
91
  def _set_utc_time(self, l0_file):
93
-
94
92
  # Flag to indicate if the L0 file content has been changed at the end
95
93
  # (or if the L0 already uses the latest SPICE kernels to compute time).
96
94
  # If has_changed = False, then do not need to update the L0, if True then
@@ -98,62 +96,66 @@ class SetL0Utc(Task):
98
96
  has_changed = False
99
97
 
100
98
  # SPICE SCLK kernel name prefix
101
- sclk_prefix = 'solo_ANC_soc-sclk'
99
+ sclk_prefix = "solo_ANC_soc-sclk"
102
100
 
103
101
  # Get loaded SPICE kernels
104
102
  loaded_kernel_list = self.time.spice.kall()
105
103
  if not loaded_kernel_list:
106
- logger.warning('No SPICE kernel loaded, exiting')
104
+ logger.warning("No SPICE kernel loaded, exiting")
107
105
  return has_changed
108
106
  else:
109
107
  # Keep only SCLK kernels
110
- loaded_sclk_list = [kfile
111
- for kfile in loaded_kernel_list.keys()
112
- if sclk_prefix in kfile]
108
+ loaded_sclk_list = [
109
+ kfile for kfile in loaded_kernel_list.keys() if sclk_prefix in kfile
110
+ ]
113
111
  loaded_sclk_num = len(loaded_sclk_list)
114
112
  if loaded_sclk_num == 0:
115
- logger.warning('No SPICE SCLK kernel loaded, exiting')
113
+ logger.warning("No SPICE SCLK kernel loaded, exiting")
116
114
  return has_changed
117
115
  else:
118
116
  # Get loaded SCLK (latest)
119
117
  loaded_sclk = os.path.basename(loaded_sclk_list[-1])
120
118
 
121
119
  # Open L0 file
122
- with h5py.File(l0_file, 'a') as l0:
123
-
120
+ with h5py.File(l0_file, "a") as l0:
124
121
  # Check if utc time values need to be updated
125
122
  # To achieve it, re-compute UTC times with loaded kernels
126
123
  # and compare with current values in the L0
127
- cat = 'TM'
124
+ cat = "TM"
128
125
  if cat in l0.keys():
129
126
  # Loop over each TM packet in L0
130
127
  for packet_name in l0[cat].keys():
131
128
  # Get packet UTC times
132
- utc_time = [datetime.strptime(current_time[:-4] + 'Z', TIME_ISO_STRFORMAT)
133
- for current_time in l0[cat][packet_name]['utc_time'][()]]
129
+ utc_time = [
130
+ datetime.strptime(current_time[:-4] + "Z", TIME_ISO_STRFORMAT)
131
+ for current_time in l0[cat][packet_name]["utc_time"][()]
132
+ ]
134
133
 
135
134
  # Compute UTC times with current SPICE kernels from
136
135
  # array of time in packet data_field_header
137
- new_utc_time = self.time.obt_to_utc((l0[cat][packet_name]
138
- ['data_field_header']['time'][()])[:, :2],
139
- to_datetime=True)
136
+ new_utc_time = self.time.obt_to_utc(
137
+ (l0[cat][packet_name]["data_field_header"]["time"][()])[:, :2],
138
+ to_datetime=True,
139
+ )
140
140
  try:
141
141
  # Compare current L0 utc time values with new ones
142
142
  assert utc_time == new_utc_time
143
143
  except AssertionError:
144
144
  # If not equal, then update L0 UTC Times with loaded
145
145
  # SCLK kernel
146
- l0[cat][packet_name]['utc_time'][...] = new_utc_time
147
- logger.debug(f'UTC time values updated for '
148
- f'{packet_name} in {l0_file}')
146
+ l0[cat][packet_name]["utc_time"][...] = new_utc_time
147
+ logger.debug(
148
+ f"UTC time values updated for {packet_name} in {l0_file}"
149
+ )
149
150
  has_changed = True
150
151
  else:
151
- logger.debug(f'Same UTC time values found for '
152
- f'{packet_name} in {l0_file}')
152
+ logger.debug(
153
+ f"Same UTC time values found for {packet_name} in {l0_file}"
154
+ )
153
155
 
154
156
  # If UTC times have been updated, set the new SCLK filename
155
157
  # in the SPICE_KERNELS attribute
156
158
  if has_changed:
157
- l0.attrs['SPICE_KERNELS'] = loaded_sclk
159
+ l0.attrs["SPICE_KERNELS"] = loaded_sclk
158
160
 
159
161
  return has_changed