imap-processing 0.7.0__py3-none-any.whl → 0.8.0__py3-none-any.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 imap-processing might be problematic. Click here for more details.

Files changed (124) hide show
  1. imap_processing/__init__.py +1 -1
  2. imap_processing/_version.py +2 -2
  3. imap_processing/ccsds/excel_to_xtce.py +34 -2
  4. imap_processing/cdf/config/imap_codice_global_cdf_attrs.yaml +1 -1
  5. imap_processing/cdf/config/imap_codice_l1a_variable_attrs.yaml +145 -30
  6. imap_processing/cdf/config/imap_glows_l1b_variable_attrs.yaml +36 -36
  7. imap_processing/cdf/config/imap_hi_variable_attrs.yaml +36 -8
  8. imap_processing/cdf/config/imap_hit_l1b_variable_attrs.yaml +9 -0
  9. imap_processing/cdf/config/imap_idex_global_cdf_attrs.yaml +7 -7
  10. imap_processing/cdf/config/imap_idex_l1a_variable_attrs.yaml +32 -33
  11. imap_processing/cdf/config/imap_mag_l1_variable_attrs.yaml +24 -28
  12. imap_processing/cdf/config/imap_ultra_l1a_variable_attrs.yaml +1 -0
  13. imap_processing/cdf/config/imap_ultra_l1b_variable_attrs.yaml +133 -78
  14. imap_processing/cdf/config/imap_variable_schema.yaml +13 -0
  15. imap_processing/cdf/imap_cdf_manager.py +31 -27
  16. imap_processing/cli.py +12 -10
  17. imap_processing/codice/codice_l1a.py +151 -61
  18. imap_processing/codice/constants.py +1 -1
  19. imap_processing/codice/decompress.py +4 -9
  20. imap_processing/codice/utils.py +1 -0
  21. imap_processing/glows/l1b/glows_l1b.py +3 -3
  22. imap_processing/glows/l1b/glows_l1b_data.py +59 -37
  23. imap_processing/glows/l2/glows_l2_data.py +123 -0
  24. imap_processing/hi/l1a/histogram.py +1 -1
  25. imap_processing/hi/l1a/science_direct_event.py +1 -1
  26. imap_processing/hi/l1b/hi_l1b.py +85 -11
  27. imap_processing/hi/l1c/hi_l1c.py +23 -1
  28. imap_processing/hi/utils.py +1 -1
  29. imap_processing/hit/hit_utils.py +221 -0
  30. imap_processing/hit/l0/constants.py +118 -0
  31. imap_processing/hit/l0/decom_hit.py +186 -153
  32. imap_processing/hit/l1a/hit_l1a.py +20 -175
  33. imap_processing/hit/l1b/hit_l1b.py +33 -153
  34. imap_processing/idex/idex_l1a.py +10 -9
  35. imap_processing/lo/l0/decompression_tables/decompression_tables.py +1 -1
  36. imap_processing/lo/l0/lo_science.py +1 -1
  37. imap_processing/lo/packet_definitions/lo_xtce.xml +1 -3296
  38. imap_processing/mag/l0/decom_mag.py +4 -3
  39. imap_processing/mag/l1a/mag_l1a.py +11 -11
  40. imap_processing/mag/l1b/mag_l1b.py +89 -7
  41. imap_processing/spice/geometry.py +126 -4
  42. imap_processing/swapi/l1/swapi_l1.py +1 -1
  43. imap_processing/swapi/l2/swapi_l2.py +1 -1
  44. imap_processing/swe/l1b/swe_l1b_science.py +8 -8
  45. imap_processing/tests/ccsds/test_data/expected_output.xml +1 -0
  46. imap_processing/tests/ccsds/test_excel_to_xtce.py +4 -4
  47. imap_processing/tests/cdf/test_imap_cdf_manager.py +0 -10
  48. imap_processing/tests/codice/conftest.py +1 -17
  49. imap_processing/tests/codice/data/imap_codice_l0_raw_20241110_v001.pkts +0 -0
  50. imap_processing/tests/codice/test_codice_l0.py +8 -2
  51. imap_processing/tests/codice/test_codice_l1a.py +127 -107
  52. imap_processing/tests/codice/test_codice_l1b.py +1 -0
  53. imap_processing/tests/codice/test_decompress.py +7 -7
  54. imap_processing/tests/conftest.py +54 -15
  55. imap_processing/tests/glows/conftest.py +6 -0
  56. imap_processing/tests/glows/test_glows_l1b.py +9 -9
  57. imap_processing/tests/glows/test_glows_l1b_data.py +9 -9
  58. imap_processing/tests/glows/test_glows_l2_data.py +0 -0
  59. imap_processing/tests/hi/test_data/l1a/imap_hi_l1a_45sensor-de_20250415_v000.cdf +0 -0
  60. imap_processing/tests/hi/test_hi_l1b.py +71 -1
  61. imap_processing/tests/hi/test_hi_l1c.py +10 -2
  62. imap_processing/tests/hi/test_utils.py +4 -3
  63. imap_processing/tests/hit/{test_hit_decom.py → test_decom_hit.py} +84 -35
  64. imap_processing/tests/hit/test_hit_l1a.py +2 -197
  65. imap_processing/tests/hit/test_hit_l1b.py +156 -25
  66. imap_processing/tests/hit/test_hit_utils.py +218 -0
  67. imap_processing/tests/idex/conftest.py +1 -1
  68. imap_processing/tests/idex/imap_idex_l0_raw_20231214_v001.pkts +0 -0
  69. imap_processing/tests/idex/impact_14_tof_high_data.txt +4444 -4444
  70. imap_processing/tests/idex/test_idex_l0.py +3 -3
  71. imap_processing/tests/idex/test_idex_l1a.py +1 -1
  72. imap_processing/tests/lo/test_lo_science.py +2 -2
  73. imap_processing/tests/mag/imap_mag_l1a_norm-magi_20251017_v001.cdf +0 -0
  74. imap_processing/tests/mag/test_mag_l1b.py +59 -3
  75. imap_processing/tests/spice/test_data/imap_ena_sim_metakernel.template +3 -1
  76. imap_processing/tests/spice/test_geometry.py +84 -4
  77. imap_processing/tests/swe/conftest.py +33 -0
  78. imap_processing/tests/swe/l1_validation/swe_l0_unpacked-data_20240510_v001_VALIDATION_L1B_v3.dat +4332 -0
  79. imap_processing/tests/swe/test_swe_l1b.py +29 -8
  80. imap_processing/tests/test_utils.py +1 -1
  81. imap_processing/tests/ultra/test_data/l1/dps_exposure_helio_45_E12.cdf +0 -0
  82. imap_processing/tests/ultra/test_data/l1/dps_exposure_helio_45_E24.cdf +0 -0
  83. imap_processing/tests/ultra/unit/test_de.py +108 -0
  84. imap_processing/tests/ultra/unit/test_ultra_l1b.py +27 -3
  85. imap_processing/tests/ultra/unit/test_ultra_l1b_annotated.py +31 -10
  86. imap_processing/tests/ultra/unit/test_ultra_l1b_extended.py +21 -11
  87. imap_processing/tests/ultra/unit/test_ultra_l1c_pset_bins.py +9 -44
  88. imap_processing/ultra/constants.py +8 -3
  89. imap_processing/ultra/l1b/de.py +174 -30
  90. imap_processing/ultra/l1b/ultra_l1b_annotated.py +24 -10
  91. imap_processing/ultra/l1b/ultra_l1b_extended.py +21 -14
  92. imap_processing/ultra/l1c/ultra_l1c_pset_bins.py +70 -119
  93. {imap_processing-0.7.0.dist-info → imap_processing-0.8.0.dist-info}/METADATA +15 -14
  94. {imap_processing-0.7.0.dist-info → imap_processing-0.8.0.dist-info}/RECORD +98 -113
  95. imap_processing/cdf/cdf_attribute_manager.py +0 -322
  96. imap_processing/cdf/config/shared/default_global_cdf_attrs_schema.yaml +0 -246
  97. imap_processing/cdf/config/shared/default_variable_cdf_attrs_schema.yaml +0 -466
  98. imap_processing/hit/l0/data_classes/housekeeping.py +0 -240
  99. imap_processing/hit/l0/data_classes/science_packet.py +0 -259
  100. imap_processing/hit/l0/utils/hit_base.py +0 -57
  101. imap_processing/tests/cdf/shared/default_global_cdf_attrs_schema.yaml +0 -246
  102. imap_processing/tests/cdf/shared/default_variable_cdf_attrs_schema.yaml +0 -466
  103. imap_processing/tests/cdf/test_cdf_attribute_manager.py +0 -353
  104. imap_processing/tests/codice/data/imap_codice_l0_hi-counters-aggregated_20240429_v001.pkts +0 -0
  105. imap_processing/tests/codice/data/imap_codice_l0_hi-counters-singles_20240429_v001.pkts +0 -0
  106. imap_processing/tests/codice/data/imap_codice_l0_hi-omni_20240429_v001.pkts +0 -0
  107. imap_processing/tests/codice/data/imap_codice_l0_hi-pha_20240429_v001.pkts +0 -0
  108. imap_processing/tests/codice/data/imap_codice_l0_hi-sectored_20240429_v001.pkts +0 -0
  109. imap_processing/tests/codice/data/imap_codice_l0_hskp_20100101_v001.pkts +0 -0
  110. imap_processing/tests/codice/data/imap_codice_l0_lo-counters-aggregated_20240429_v001.pkts +0 -0
  111. imap_processing/tests/codice/data/imap_codice_l0_lo-counters-singles_20240429_v001.pkts +0 -0
  112. imap_processing/tests/codice/data/imap_codice_l0_lo-nsw-angular_20240429_v001.pkts +0 -0
  113. imap_processing/tests/codice/data/imap_codice_l0_lo-nsw-priority_20240429_v001.pkts +0 -0
  114. imap_processing/tests/codice/data/imap_codice_l0_lo-nsw-species_20240429_v001.pkts +0 -0
  115. imap_processing/tests/codice/data/imap_codice_l0_lo-pha_20240429_v001.pkts +0 -0
  116. imap_processing/tests/codice/data/imap_codice_l0_lo-sw-angular_20240429_v001.pkts +0 -0
  117. imap_processing/tests/codice/data/imap_codice_l0_lo-sw-priority_20240429_v001.pkts +0 -0
  118. imap_processing/tests/codice/data/imap_codice_l0_lo-sw-species_20240429_v001.pkts +0 -0
  119. imap_processing/tests/idex/imap_idex_l0_raw_20230725_v001.pkts +0 -0
  120. imap_processing/tests/mag/imap_mag_l1a_burst-magi_20231025_v001.cdf +0 -0
  121. /imap_processing/tests/hit/test_data/{imap_hit_l0_hk_20100105_v001.pkts → imap_hit_l0_raw_20100105_v001.pkts} +0 -0
  122. {imap_processing-0.7.0.dist-info → imap_processing-0.8.0.dist-info}/LICENSE +0 -0
  123. {imap_processing-0.7.0.dist-info → imap_processing-0.8.0.dist-info}/WHEEL +0 -0
  124. {imap_processing-0.7.0.dist-info → imap_processing-0.8.0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,218 @@
1
+ import numpy as np
2
+ import pytest
3
+ import xarray as xr
4
+
5
+ from imap_processing import imap_module_directory
6
+ from imap_processing.cdf.imap_cdf_manager import ImapCdfAttributes
7
+ from imap_processing.hit.hit_utils import (
8
+ HitAPID,
9
+ concatenate_leak_variables,
10
+ get_attribute_manager,
11
+ get_datasets_by_apid,
12
+ process_housekeeping_data,
13
+ )
14
+
15
+
16
+ @pytest.fixture(scope="module")
17
+ def packet_filepath():
18
+ """Set path to test data file"""
19
+ return (
20
+ imap_module_directory / "tests/hit/test_data/imap_hit_l0_raw_20100105_v001.pkts"
21
+ )
22
+
23
+
24
+ @pytest.fixture(scope="module")
25
+ def attribute_manager():
26
+ """Create the attribute manager"""
27
+ data_version = "001"
28
+ level = "l1a"
29
+ attr_mgr = get_attribute_manager(data_version, level)
30
+ return attr_mgr
31
+
32
+
33
+ @pytest.fixture(scope="module")
34
+ def housekeeping_dataset(packet_filepath):
35
+ """Get the housekeeping dataset"""
36
+ # Unpack ccsds file to xarray datasets
37
+ datasets_by_apid = get_datasets_by_apid(packet_filepath)
38
+ return datasets_by_apid[HitAPID.HIT_HSKP]
39
+
40
+
41
+ def test_get_datasets_by_apid(packet_filepath):
42
+ result = get_datasets_by_apid(packet_filepath)
43
+
44
+ assert isinstance(result, dict)
45
+ assert HitAPID.HIT_HSKP in result
46
+ # assert HitAPID.HIT_SCIENCE in result
47
+
48
+
49
+ def test_get_attribute_manager():
50
+ data_version = "001"
51
+ level = "l1a"
52
+ attr_mgr = get_attribute_manager(data_version, level)
53
+
54
+ assert isinstance(attr_mgr, ImapCdfAttributes)
55
+
56
+
57
+ def test_concatenate_leak_variables(housekeeping_dataset):
58
+ """Test concatenation of leak_i variables"""
59
+
60
+ # Create data array for leak_i dependency
61
+ adc_channels = xr.DataArray(
62
+ np.arange(64, dtype=np.uint8),
63
+ name="adc_channels",
64
+ dims=["adc_channels"],
65
+ )
66
+
67
+ updated_dataset = concatenate_leak_variables(housekeeping_dataset, adc_channels)
68
+
69
+ # Assertions
70
+ # ----------------
71
+ assert "leak_i" in updated_dataset
72
+ assert updated_dataset["leak_i"].shape == (88, 64)
73
+ for i in range(64):
74
+ # Check if the values in the `leak_i` variable match the values in
75
+ # the original `leak_i_XX` variable.
76
+ # - First access the `leak_i` variable in the `updated_dataset`.
77
+ # The [:, i] selects all rows (`:`) and the `i`-th column of the `leak_i`
78
+ # variable.
79
+ # - Then access the `leak_i_XX` variable in the `housekeeping_dataset`.
80
+ # The `f"leak_i_{i:02d}"` selects the variable with the name `leak_i_XX`
81
+ # where `XX` is the `i`-th value.
82
+ # - Compare values
83
+ np.testing.assert_array_equal(
84
+ updated_dataset["leak_i"][:, i], housekeeping_dataset[f"leak_i_{i:02d}"]
85
+ )
86
+
87
+
88
+ def test_process_housekeeping(housekeeping_dataset, attribute_manager):
89
+ """Test processing of housekeeping dataset"""
90
+
91
+ # Call the function
92
+ processed_hskp_dataset = process_housekeeping_data(
93
+ housekeeping_dataset, attribute_manager, "imap_hit_l1a_hk"
94
+ )
95
+
96
+ # Define the keys that should have dropped from the dataset
97
+ dropped_keys = {
98
+ "pkt_apid",
99
+ "sc_tick",
100
+ "version",
101
+ "type",
102
+ "sec_hdr_flg",
103
+ "seq_flgs",
104
+ "src_seq_ctr",
105
+ "pkt_len",
106
+ "hskp_spare1",
107
+ "hskp_spare2",
108
+ "hskp_spare3",
109
+ "hskp_spare4",
110
+ "hskp_spare5",
111
+ }
112
+ # Define the keys that should be present
113
+ valid_keys = {
114
+ "heater_on",
115
+ "fsw_version_b",
116
+ "ebox_m12va",
117
+ "phasic_stat",
118
+ "ebox_3d4vd",
119
+ "ebox_p2d0vd",
120
+ "temp1",
121
+ "last_bad_seq_num",
122
+ "ebox_m5d7va",
123
+ "ebox_p12va",
124
+ "table_status",
125
+ "enable_50khz",
126
+ "mram_disabled",
127
+ "temp3",
128
+ "preamp_l1a",
129
+ "l2ab_bias",
130
+ "l34b_bias",
131
+ "fsw_version_c",
132
+ "num_evnt_last_hk",
133
+ "dac1_enable",
134
+ "preamp_l234b",
135
+ "analog_temp",
136
+ "fee_running",
137
+ "fsw_version_a",
138
+ "num_errors",
139
+ "test_pulser_on",
140
+ "dac0_enable",
141
+ "preamp_l1b",
142
+ "l1ab_bias",
143
+ "l34a_bias",
144
+ "leak_i",
145
+ "last_good_cmd",
146
+ "lvps_temp",
147
+ "idpu_temp",
148
+ "temp2",
149
+ "preamp_l234a",
150
+ "last_good_seq_num",
151
+ "num_good_cmds",
152
+ "heater_control",
153
+ "hvps_temp",
154
+ "ebox_p5d7va",
155
+ "spin_period_long",
156
+ "enable_hvps",
157
+ "temp0",
158
+ "spin_period_short",
159
+ "dyn_thresh_lvl",
160
+ "num_bad_cmds",
161
+ "adc_mode",
162
+ "ebox_5d1vd",
163
+ "active_heater",
164
+ "last_error_num",
165
+ "last_bad_cmd",
166
+ "ref_p5v",
167
+ "code_checksum",
168
+ "mode",
169
+ }
170
+
171
+ # Define the dataset attributes
172
+ dataset_attrs = {
173
+ "Acknowledgement": "Please acknowledge the IMAP Mission Principal "
174
+ "Investigator, Prof. David J. McComas of Princeton "
175
+ "University.\n",
176
+ "Data_level": "1A",
177
+ "Data_type": "L1A_HK>Level-1A Housekeeping",
178
+ "Data_version": "001",
179
+ "Descriptor": "HIT>IMAP High-energy Ion Telescope",
180
+ "Discipline": "Solar Physics>Heliospheric Physics",
181
+ "File_naming_convention": "source_descriptor_datatype_yyyyMMdd_vNNN",
182
+ "HTTP_LINK": "https://imap.princeton.edu/",
183
+ "Instrument_type": "Particles (space)",
184
+ "LINK_TITLE": "IMAP The Interstellar Mapping and Acceleration Probe",
185
+ "Logical_file_id": None,
186
+ "Logical_source": "imap_hit_l1a_hk",
187
+ "Logical_source_description": "IMAP Mission HIT Instrument Level-1A "
188
+ "Housekeeping Data.",
189
+ "Mission_group": "IMAP",
190
+ "PI_affiliation": "Princeton University",
191
+ "PI_name": "Prof. David J. McComas",
192
+ "Project": "STP>Solar Terrestrial Probes",
193
+ "Rules_of_use": "All IMAP data products are publicly released and citable for "
194
+ "use in publications. Please consult the IMAP team "
195
+ "publications and personnel for further details on "
196
+ "production, processing, and usage of these data.\n",
197
+ "Source_name": "IMAP>Interstellar Mapping and Acceleration Probe",
198
+ "TEXT": "The High-energy Ion Telescope (HIT) measures the elemental "
199
+ "composition, energy spectra, angle distributions, and arrival "
200
+ "times of high-energy ions. HIT delivers full-sky coverage from "
201
+ "a wide instrument field-of-view (FOV) to enable a high resolution "
202
+ "of ion measurements, such as observing shock-accelerated ions, "
203
+ "determining the origin of the solar energetic particles (SEPs) "
204
+ "spectra, and resolving particle transport in the heliosphere. "
205
+ "See https://imap.princeton.edu/instruments/hit for more details.\n",
206
+ }
207
+
208
+ # Define the coordinates and dimensions. Both have equivalent values
209
+ dataset_coords_dims = {"epoch", "adc_channels", "adc_channels_label"}
210
+
211
+ # Assertions
212
+ # ----------------
213
+ # Check that the dataset has the correct variables
214
+ assert valid_keys == set(processed_hskp_dataset.data_vars.keys())
215
+ assert set(dropped_keys).isdisjoint(set(processed_hskp_dataset.data_vars.keys()))
216
+ # Check that the dataset has the correct attributes, coordinates, and dimensions
217
+ assert processed_hskp_dataset.attrs == dataset_attrs
218
+ assert processed_hskp_dataset.coords.keys() == dataset_coords_dims
@@ -17,6 +17,6 @@ def decom_test_data() -> xr.Dataset:
17
17
  A ``xarray`` dataset containing the test data
18
18
  """
19
19
  test_file = Path(
20
- f"{imap_module_directory}/tests/idex/imap_idex_l0_raw_20230725_v001.pkts"
20
+ f"{imap_module_directory}/tests/idex/imap_idex_l0_raw_20231214_v001.pkts"
21
21
  )
22
22
  return PacketParser(test_file, "001").data