imap-processing 0.7.0__py3-none-any.whl → 0.9.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 (172) hide show
  1. imap_processing/__init__.py +1 -1
  2. imap_processing/_version.py +2 -2
  3. imap_processing/ccsds/excel_to_xtce.py +36 -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 +136 -9
  8. imap_processing/cdf/config/imap_hit_global_cdf_attrs.yaml +14 -0
  9. imap_processing/cdf/config/imap_hit_l1a_variable_attrs.yaml +63 -1
  10. imap_processing/cdf/config/imap_hit_l1b_variable_attrs.yaml +9 -0
  11. imap_processing/cdf/config/imap_idex_global_cdf_attrs.yaml +14 -7
  12. imap_processing/cdf/config/imap_idex_l1a_variable_attrs.yaml +577 -235
  13. imap_processing/cdf/config/imap_idex_l1b_variable_attrs.yaml +326 -0
  14. imap_processing/cdf/config/imap_lo_l1a_variable_attrs.yaml +33 -23
  15. imap_processing/cdf/config/imap_mag_l1_variable_attrs.yaml +24 -28
  16. imap_processing/cdf/config/imap_ultra_l1a_variable_attrs.yaml +1 -0
  17. imap_processing/cdf/config/imap_ultra_l1b_variable_attrs.yaml +137 -79
  18. imap_processing/cdf/config/imap_variable_schema.yaml +13 -0
  19. imap_processing/cdf/imap_cdf_manager.py +31 -27
  20. imap_processing/cdf/utils.py +3 -5
  21. imap_processing/cli.py +25 -14
  22. imap_processing/codice/codice_l1a.py +153 -63
  23. imap_processing/codice/constants.py +10 -10
  24. imap_processing/codice/decompress.py +10 -11
  25. imap_processing/codice/utils.py +1 -0
  26. imap_processing/glows/l1a/glows_l1a.py +1 -2
  27. imap_processing/glows/l1b/glows_l1b.py +3 -3
  28. imap_processing/glows/l1b/glows_l1b_data.py +59 -37
  29. imap_processing/glows/l2/glows_l2_data.py +123 -0
  30. imap_processing/hi/l1a/hi_l1a.py +4 -4
  31. imap_processing/hi/l1a/histogram.py +107 -109
  32. imap_processing/hi/l1a/science_direct_event.py +92 -225
  33. imap_processing/hi/l1b/hi_l1b.py +85 -11
  34. imap_processing/hi/l1c/hi_l1c.py +23 -1
  35. imap_processing/hi/packet_definitions/TLM_HI_COMBINED_SCI.xml +3994 -0
  36. imap_processing/hi/utils.py +1 -1
  37. imap_processing/hit/hit_utils.py +221 -0
  38. imap_processing/hit/l0/constants.py +118 -0
  39. imap_processing/hit/l0/decom_hit.py +100 -156
  40. imap_processing/hit/l1a/hit_l1a.py +170 -184
  41. imap_processing/hit/l1b/hit_l1b.py +33 -153
  42. imap_processing/ialirt/l0/process_codicelo.py +153 -0
  43. imap_processing/ialirt/l0/process_hit.py +5 -5
  44. imap_processing/ialirt/packet_definitions/ialirt_codicelo.xml +281 -0
  45. imap_processing/ialirt/process_ephemeris.py +212 -0
  46. imap_processing/idex/idex_l1a.py +65 -84
  47. imap_processing/idex/idex_l1b.py +192 -0
  48. imap_processing/idex/idex_variable_unpacking_and_eu_conversion.csv +33 -0
  49. imap_processing/idex/packet_definitions/idex_packet_definition.xml +97 -595
  50. imap_processing/lo/l0/decompression_tables/decompression_tables.py +17 -1
  51. imap_processing/lo/l0/lo_science.py +45 -13
  52. imap_processing/lo/l1a/lo_l1a.py +76 -8
  53. imap_processing/lo/packet_definitions/lo_xtce.xml +8344 -1849
  54. imap_processing/mag/l0/decom_mag.py +4 -3
  55. imap_processing/mag/l1a/mag_l1a.py +12 -13
  56. imap_processing/mag/l1a/mag_l1a_data.py +1 -2
  57. imap_processing/mag/l1b/mag_l1b.py +90 -7
  58. imap_processing/spice/geometry.py +156 -16
  59. imap_processing/spice/time.py +144 -2
  60. imap_processing/swapi/l1/swapi_l1.py +4 -4
  61. imap_processing/swapi/l2/swapi_l2.py +1 -1
  62. imap_processing/swapi/packet_definitions/swapi_packet_definition.xml +1535 -446
  63. imap_processing/swe/l1b/swe_l1b_science.py +8 -8
  64. imap_processing/swe/l2/swe_l2.py +134 -17
  65. imap_processing/tests/ccsds/test_data/expected_output.xml +2 -1
  66. imap_processing/tests/ccsds/test_excel_to_xtce.py +4 -4
  67. imap_processing/tests/cdf/test_imap_cdf_manager.py +0 -10
  68. imap_processing/tests/codice/conftest.py +1 -17
  69. imap_processing/tests/codice/data/imap_codice_l0_raw_20241110_v001.pkts +0 -0
  70. imap_processing/tests/codice/test_codice_l0.py +8 -2
  71. imap_processing/tests/codice/test_codice_l1a.py +127 -107
  72. imap_processing/tests/codice/test_codice_l1b.py +1 -0
  73. imap_processing/tests/codice/test_decompress.py +7 -7
  74. imap_processing/tests/conftest.py +100 -58
  75. imap_processing/tests/glows/conftest.py +6 -0
  76. imap_processing/tests/glows/test_glows_l1b.py +9 -9
  77. imap_processing/tests/glows/test_glows_l1b_data.py +9 -9
  78. imap_processing/tests/hi/test_data/l0/H90_NHK_20241104.bin +0 -0
  79. imap_processing/tests/hi/test_data/l0/H90_sci_cnt_20241104.bin +0 -0
  80. imap_processing/tests/hi/test_data/l0/H90_sci_de_20241104.bin +0 -0
  81. imap_processing/tests/hi/test_data/l1a/imap_hi_l1a_45sensor-de_20250415_v000.cdf +0 -0
  82. imap_processing/tests/hi/test_hi_l1b.py +73 -3
  83. imap_processing/tests/hi/test_hi_l1c.py +10 -2
  84. imap_processing/tests/hi/test_l1a.py +31 -58
  85. imap_processing/tests/hi/test_science_direct_event.py +58 -0
  86. imap_processing/tests/hi/test_utils.py +4 -3
  87. imap_processing/tests/hit/test_data/sci_sample1.ccsds +0 -0
  88. imap_processing/tests/hit/{test_hit_decom.py → test_decom_hit.py} +95 -36
  89. imap_processing/tests/hit/test_hit_l1a.py +299 -179
  90. imap_processing/tests/hit/test_hit_l1b.py +231 -24
  91. imap_processing/tests/hit/test_hit_utils.py +218 -0
  92. imap_processing/tests/hit/validation_data/hskp_sample_eu.csv +89 -0
  93. imap_processing/tests/hit/validation_data/sci_sample_raw1.csv +29 -0
  94. imap_processing/tests/ialirt/test_data/l0/apid01152.tlm +0 -0
  95. imap_processing/tests/ialirt/test_data/l0/imap_codice_l1a_lo-ialirt_20241110193700_v0.0.0.cdf +0 -0
  96. imap_processing/tests/ialirt/unit/test_process_codicelo.py +106 -0
  97. imap_processing/tests/ialirt/unit/test_process_ephemeris.py +109 -0
  98. imap_processing/tests/ialirt/unit/test_process_hit.py +9 -6
  99. imap_processing/tests/idex/conftest.py +2 -2
  100. imap_processing/tests/idex/imap_idex_l0_raw_20231214_v001.pkts +0 -0
  101. imap_processing/tests/idex/impact_14_tof_high_data.txt +4444 -4444
  102. imap_processing/tests/idex/test_idex_l0.py +4 -4
  103. imap_processing/tests/idex/test_idex_l1a.py +8 -2
  104. imap_processing/tests/idex/test_idex_l1b.py +126 -0
  105. imap_processing/tests/lo/test_lo_l1a.py +7 -16
  106. imap_processing/tests/lo/test_lo_science.py +69 -5
  107. imap_processing/tests/lo/test_pkts/imap_lo_l0_raw_20240803_v002.pkts +0 -0
  108. imap_processing/tests/lo/validation_data/Instrument_FM1_T104_R129_20240803_ILO_SCI_DE_dec_DN_with_fills.csv +1999 -0
  109. imap_processing/tests/mag/imap_mag_l1a_norm-magi_20251017_v001.cdf +0 -0
  110. imap_processing/tests/mag/test_mag_l1b.py +97 -7
  111. imap_processing/tests/spice/test_data/imap_ena_sim_metakernel.template +3 -1
  112. imap_processing/tests/spice/test_geometry.py +115 -9
  113. imap_processing/tests/spice/test_time.py +135 -6
  114. imap_processing/tests/swapi/test_swapi_decom.py +75 -69
  115. imap_processing/tests/swapi/test_swapi_l1.py +4 -4
  116. imap_processing/tests/swe/conftest.py +33 -0
  117. imap_processing/tests/swe/l1_validation/swe_l0_unpacked-data_20240510_v001_VALIDATION_L1B_v3.dat +4332 -0
  118. imap_processing/tests/swe/test_swe_l1b.py +29 -8
  119. imap_processing/tests/swe/test_swe_l2.py +64 -8
  120. imap_processing/tests/test_utils.py +2 -2
  121. imap_processing/tests/ultra/test_data/l0/ultra45_raw_sc_ultrarawimg_withFSWcalcs_FM45_40P_Phi28p5_BeamCal_LinearScan_phi2850_theta-000_20240207T102740.csv +3314 -3314
  122. imap_processing/tests/ultra/test_data/l1/dps_exposure_helio_45_E12.cdf +0 -0
  123. imap_processing/tests/ultra/test_data/l1/dps_exposure_helio_45_E24.cdf +0 -0
  124. imap_processing/tests/ultra/unit/test_de.py +113 -0
  125. imap_processing/tests/ultra/unit/test_spatial_utils.py +125 -0
  126. imap_processing/tests/ultra/unit/test_ultra_l1b.py +27 -3
  127. imap_processing/tests/ultra/unit/test_ultra_l1b_annotated.py +31 -10
  128. imap_processing/tests/ultra/unit/test_ultra_l1b_extended.py +55 -35
  129. imap_processing/tests/ultra/unit/test_ultra_l1c_pset_bins.py +10 -68
  130. imap_processing/ultra/constants.py +12 -3
  131. imap_processing/ultra/l1b/de.py +168 -30
  132. imap_processing/ultra/l1b/ultra_l1b_annotated.py +24 -10
  133. imap_processing/ultra/l1b/ultra_l1b_extended.py +46 -80
  134. imap_processing/ultra/l1c/ultra_l1c_pset_bins.py +60 -144
  135. imap_processing/ultra/utils/spatial_utils.py +221 -0
  136. {imap_processing-0.7.0.dist-info → imap_processing-0.9.0.dist-info}/METADATA +15 -14
  137. {imap_processing-0.7.0.dist-info → imap_processing-0.9.0.dist-info}/RECORD +142 -139
  138. imap_processing/cdf/cdf_attribute_manager.py +0 -322
  139. imap_processing/cdf/config/shared/default_global_cdf_attrs_schema.yaml +0 -246
  140. imap_processing/cdf/config/shared/default_variable_cdf_attrs_schema.yaml +0 -466
  141. imap_processing/hi/l0/decom_hi.py +0 -24
  142. imap_processing/hi/packet_definitions/hi_packet_definition.xml +0 -482
  143. imap_processing/hit/l0/data_classes/housekeeping.py +0 -240
  144. imap_processing/hit/l0/data_classes/science_packet.py +0 -259
  145. imap_processing/hit/l0/utils/hit_base.py +0 -57
  146. imap_processing/tests/cdf/shared/default_global_cdf_attrs_schema.yaml +0 -246
  147. imap_processing/tests/cdf/shared/default_variable_cdf_attrs_schema.yaml +0 -466
  148. imap_processing/tests/cdf/test_cdf_attribute_manager.py +0 -353
  149. imap_processing/tests/codice/data/imap_codice_l0_hi-counters-aggregated_20240429_v001.pkts +0 -0
  150. imap_processing/tests/codice/data/imap_codice_l0_hi-counters-singles_20240429_v001.pkts +0 -0
  151. imap_processing/tests/codice/data/imap_codice_l0_hi-omni_20240429_v001.pkts +0 -0
  152. imap_processing/tests/codice/data/imap_codice_l0_hi-pha_20240429_v001.pkts +0 -0
  153. imap_processing/tests/codice/data/imap_codice_l0_hi-sectored_20240429_v001.pkts +0 -0
  154. imap_processing/tests/codice/data/imap_codice_l0_hskp_20100101_v001.pkts +0 -0
  155. imap_processing/tests/codice/data/imap_codice_l0_lo-counters-aggregated_20240429_v001.pkts +0 -0
  156. imap_processing/tests/codice/data/imap_codice_l0_lo-counters-singles_20240429_v001.pkts +0 -0
  157. imap_processing/tests/codice/data/imap_codice_l0_lo-nsw-angular_20240429_v001.pkts +0 -0
  158. imap_processing/tests/codice/data/imap_codice_l0_lo-nsw-priority_20240429_v001.pkts +0 -0
  159. imap_processing/tests/codice/data/imap_codice_l0_lo-nsw-species_20240429_v001.pkts +0 -0
  160. imap_processing/tests/codice/data/imap_codice_l0_lo-pha_20240429_v001.pkts +0 -0
  161. imap_processing/tests/codice/data/imap_codice_l0_lo-sw-angular_20240429_v001.pkts +0 -0
  162. imap_processing/tests/codice/data/imap_codice_l0_lo-sw-priority_20240429_v001.pkts +0 -0
  163. imap_processing/tests/codice/data/imap_codice_l0_lo-sw-species_20240429_v001.pkts +0 -0
  164. imap_processing/tests/hi/test_decom.py +0 -55
  165. imap_processing/tests/hi/test_l1a_sci_de.py +0 -72
  166. imap_processing/tests/idex/imap_idex_l0_raw_20230725_v001.pkts +0 -0
  167. imap_processing/tests/mag/imap_mag_l1a_burst-magi_20231025_v001.cdf +0 -0
  168. /imap_processing/{hi/l0/__init__.py → tests/glows/test_glows_l2_data.py} +0 -0
  169. /imap_processing/tests/hit/test_data/{imap_hit_l0_hk_20100105_v001.pkts → imap_hit_l0_raw_20100105_v001.pkts} +0 -0
  170. {imap_processing-0.7.0.dist-info → imap_processing-0.9.0.dist-info}/LICENSE +0 -0
  171. {imap_processing-0.7.0.dist-info → imap_processing-0.9.0.dist-info}/WHEEL +0 -0
  172. {imap_processing-0.7.0.dist-info → imap_processing-0.9.0.dist-info}/entry_points.txt +0 -0
@@ -2,36 +2,34 @@ import pandas as pd
2
2
  import pytest
3
3
 
4
4
  from imap_processing import imap_module_directory
5
- from imap_processing.decom import decom_packets
6
5
  from imap_processing.swapi.l1.swapi_l1 import (
7
6
  SWAPIAPID,
8
7
  )
9
- from imap_processing.utils import group_by_apid
8
+ from imap_processing.utils import packet_file_to_datasets
10
9
 
11
10
 
12
11
  @pytest.fixture(scope="session")
13
12
  def decom_test_data(swapi_l0_test_data_path):
14
- """Read test data from file"""
13
+ """Read test data from file with derived values"""
15
14
  test_file = "imap_swapi_l0_raw_20240924_v001.pkts"
16
15
  packet_file = imap_module_directory / swapi_l0_test_data_path / test_file
17
16
  packet_definition = (
18
17
  f"{imap_module_directory}/swapi/packet_definitions/swapi_packet_definition.xml"
19
18
  )
20
- data_list = []
21
- data_list.extend(decom_packets(packet_file, packet_definition))
22
- return data_list
19
+ return packet_file_to_datasets(
20
+ packet_file, packet_definition, use_derived_value=False
21
+ )
23
22
 
24
23
 
25
24
  def test_number_of_packets(decom_test_data):
26
25
  """This test and validate number of packets."""
27
- grouped_data = group_by_apid(decom_test_data)
28
- sci_packets = grouped_data[SWAPIAPID.SWP_SCI]
26
+ sci_packets = decom_test_data[SWAPIAPID.SWP_SCI]
29
27
  expected_sci_packets = 153
30
- assert len(sci_packets) == expected_sci_packets
28
+ assert len(sci_packets["epoch"]) == expected_sci_packets
31
29
 
32
- hk_packets = grouped_data[SWAPIAPID.SWP_HK]
30
+ hk_packets = decom_test_data[SWAPIAPID.SWP_HK]
33
31
  expected_hk_packets = 17
34
- assert len(hk_packets) == expected_hk_packets
32
+ assert len(hk_packets["epoch"]) == expected_hk_packets
35
33
 
36
34
 
37
35
  def test_swapi_sci_data(decom_test_data, swapi_l0_validation_data_path):
@@ -42,32 +40,30 @@ def test_swapi_sci_data(decom_test_data, swapi_l0_validation_data_path):
42
40
  index_col="SHCOARSE",
43
41
  )
44
42
 
45
- grouped_data = group_by_apid(decom_test_data)
46
- sci_packets = grouped_data[SWAPIAPID.SWP_SCI]
47
- first_data = sci_packets[0]
48
- validation_data = raw_validation_data.loc[first_data["SHCOARSE"]]
43
+ sci_packets = decom_test_data[SWAPIAPID.SWP_SCI]
44
+ first_data = sci_packets.isel(epoch=0)
45
+ validation_data = raw_validation_data.loc[first_data["shcoarse"].values]
49
46
 
50
47
  # compare raw values of validation data
51
- for key, value in first_data.items():
52
- # check if the data is the same
53
- if key == "PLAN_ID_SCIENCE":
54
- # We had to work around this because HK and SCI packet uses
55
- # PLAN_ID but they uses different length of bits.
56
- assert value == validation_data["PLAN_ID"]
57
- elif key == "SPARE_2_SCIENCE":
58
- # Same for this SPARE_2 as above case
59
- assert value == validation_data["SPARE_2"]
60
- elif key == "MODE":
61
- assert value.raw_value == validation_data[key]
62
- elif "RNG" in key:
63
- assert value.raw_value == validation_data[key]
64
- else:
65
- # for SHCOARSE we need the name of the column.
66
- # This is done because pandas removed it from the
67
- # main columns to make it the index.
68
- assert value.raw_value == (
69
- validation_data[key] if key != "SHCOARSE" else validation_data.name
70
- )
48
+ for key in raw_validation_data.columns:
49
+ if key in [
50
+ "PHAPID",
51
+ "timestamp",
52
+ "PHGROUPF",
53
+ "PHSHF",
54
+ "PHVERNO",
55
+ "PHSEQCNT",
56
+ "PHDLEN",
57
+ "PHTYPE",
58
+ ]:
59
+ continue
60
+
61
+ # for SHCOARSE we need the name of the column.
62
+ # This is done because pandas removed it from the
63
+ # main columns to make it the index.
64
+ assert first_data[key.lower()].values == (
65
+ validation_data[key] if key != "SHCOARSE" else validation_data.name
66
+ )
71
67
 
72
68
 
73
69
  def test_swapi_hk_data(decom_test_data, swapi_l0_validation_data_path):
@@ -78,39 +74,49 @@ def test_swapi_hk_data(decom_test_data, swapi_l0_validation_data_path):
78
74
  index_col="SHCOARSE",
79
75
  )
80
76
 
81
- grouped_data = group_by_apid(decom_test_data)
82
- hk_packets = grouped_data[SWAPIAPID.SWP_HK]
83
- first_data = hk_packets[0]
84
- validation_data = raw_validation_data.loc[first_data["SHCOARSE"]]
85
- bad_keys = [
86
- "N5_V",
87
- "SCEM_I",
88
- "P5_I",
89
- "PHD_LLD1_V",
90
- "SPARE_4",
91
- "P_CEM_CMD_LVL_MON",
92
- "S_CEM_CMD_LVL_MON",
93
- "ESA_CMD_LVL_MON",
94
- "PHD_LLD2_V",
95
- "CHKSUM",
96
- ]
77
+ hk_packets = decom_test_data[SWAPIAPID.SWP_HK]
78
+ first_data = hk_packets.isel(epoch=0)
79
+ validation_data = raw_validation_data.loc[first_data["shcoarse"].values]
80
+
97
81
  # compare raw values of validation data
98
- for key, value in first_data.items():
99
- if key == "PLAN_ID_HK":
100
- # We had to work around this because HK and SCI packet uses
101
- # PLAN_ID but they uses different length of bits.
102
- assert value == validation_data["PLAN_ID"]
103
- elif key == "SPARE_2_HK":
104
- # Same for this SPARE_2 as PLAN_ID
105
- assert value == validation_data["SPARE_2"]
106
- elif key == "SHCOARSE":
107
- # for SHCOARSE we need the name of the column.
108
- # This is done because pandas removed it from the main columns
109
- # to make it the index.
110
- assert value == validation_data.name
111
- elif key in bad_keys:
112
- # TODO: remove this elif after getting good validation data
113
- # Validation data has wrong value for N5_V
82
+ for key in raw_validation_data.columns:
83
+ if key in [
84
+ "PHAPID",
85
+ "timestamp",
86
+ "PHGROUPF",
87
+ "PHSHF",
88
+ "PHVERNO",
89
+ "PHSEQCNT",
90
+ "PHDLEN",
91
+ "PHTYPE",
92
+ ]:
93
+ continue
94
+
95
+ value_mismatching_keys = [
96
+ "SCEM_I",
97
+ "N5_V",
98
+ "P5_I",
99
+ "PHD_LLD1_V",
100
+ "P_CEM_CMD_LVL_MON",
101
+ "S_CEM_CMD_LVL_MON",
102
+ "ESA_CMD_LVL_MON",
103
+ "PHD_LLD2_V",
104
+ "CHKSUM",
105
+ ]
106
+
107
+ extra_keys_val_data = [
108
+ "ESA_GATE_SET",
109
+ "P5V_ESA_V_MON",
110
+ "M5V_ESA_V_MON",
111
+ "P5V_ESA_I_MON",
112
+ "M5V_ESA_I_MON",
113
+ ]
114
+
115
+ if key in extra_keys_val_data or key in value_mismatching_keys:
114
116
  continue
115
- else:
116
- assert value.raw_value == validation_data[key]
117
+ # for SHCOARSE we need the name of the column.
118
+ # This is done because pandas removed it from the
119
+ # main columns to make it the index.
120
+ assert first_data[key.lower()].values == (
121
+ validation_data[key] if key != "SHCOARSE" else validation_data.name
122
+ )
@@ -39,7 +39,7 @@ def test_filter_good_data():
39
39
  total_sweeps = 3
40
40
  ds = xr.Dataset(
41
41
  {
42
- "plan_id_science": xr.DataArray(np.full((total_sweeps * 12), 1)),
42
+ "plan_id": xr.DataArray(np.full((total_sweeps * 12), 1)),
43
43
  "sweep_table": xr.DataArray(np.repeat(np.arange(total_sweeps), 12)),
44
44
  "mode": xr.DataArray(np.full((total_sweeps * 12), SWAPIMODE.HVSCI.value)),
45
45
  },
@@ -69,9 +69,9 @@ def test_filter_good_data():
69
69
  expected = [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]
70
70
  np.testing.assert_array_equal(filter_good_data(ds), expected)
71
71
 
72
- # Check for bad plan_id_science data.
72
+ # Check for bad plan_id data.
73
73
  ds["sweep_table"] = xr.DataArray(np.repeat(np.arange(total_sweeps), 12))
74
- ds["plan_id_science"][24 : total_sweeps * 12] = np.arange(0, 12)
74
+ ds["plan_id"][24 : total_sweeps * 12] = np.arange(0, 12)
75
75
  np.testing.assert_array_equal(filter_good_data(ds), np.arange(0, 24))
76
76
 
77
77
 
@@ -157,7 +157,7 @@ def test_process_swapi_science(decom_test_data):
157
157
  )
158
158
 
159
159
  # make PLAN_ID data incorrect. Now processed data should have less sweeps
160
- ds_data["plan_id_science"].data[:24] = np.arange(24)
160
+ ds_data["plan_id"].data[:24] = np.arange(24)
161
161
  processed_data = process_swapi_science(
162
162
  ds_data, decom_test_data[SWAPIAPID.SWP_HK], data_version="001"
163
163
  )
@@ -74,3 +74,36 @@ def l1a_validation_df():
74
74
  # Fill NaNs with the previous value
75
75
  df["shcoarse"] = df["shcoarse"].ffill()
76
76
  return df
77
+
78
+
79
+ @pytest.fixture(scope="session")
80
+ def l1b_validation_df():
81
+ """Read validation data from file"""
82
+ l1_val_path = imap_module_directory / "tests/swe/l1_validation"
83
+ filename = "swe_l0_unpacked-data_20240510_v001_VALIDATION_L1B_v3.dat"
84
+
85
+ # Define column names for validation data
86
+ column_names = [
87
+ "shcoarse",
88
+ "cem_1",
89
+ "cem_2",
90
+ "cem_3",
91
+ "cem_4",
92
+ "cem_5",
93
+ "cem_6",
94
+ "cem_7",
95
+ ]
96
+
97
+ # Read the data, specifying na_values and delimiter
98
+ df = pd.read_csv(
99
+ l1_val_path / filename,
100
+ skiprows=12, # Skip the first 10 rows of comments
101
+ sep=r"\s*,\s*", # Regex to handle spaces and commas as delimiters
102
+ names=column_names,
103
+ na_values=["", " "], # Treat empty strings or spaces as NaN
104
+ engine="python",
105
+ )
106
+
107
+ # Fill NaNs with the previous value
108
+ df["shcoarse"] = df["shcoarse"].ffill()
109
+ return df