imap-processing 0.11.0__py3-none-any.whl → 0.12.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.
- imap_processing/__init__.py +10 -11
- imap_processing/_version.py +2 -2
- imap_processing/ccsds/excel_to_xtce.py +65 -16
- imap_processing/cdf/config/imap_codice_global_cdf_attrs.yaml +6 -28
- imap_processing/cdf/config/imap_codice_l1a_variable_attrs.yaml +365 -42
- imap_processing/cdf/config/imap_glows_global_cdf_attrs.yaml +0 -5
- imap_processing/cdf/config/imap_hi_global_cdf_attrs.yaml +10 -11
- imap_processing/cdf/config/imap_hi_variable_attrs.yaml +17 -19
- imap_processing/cdf/config/imap_hit_global_cdf_attrs.yaml +26 -13
- imap_processing/cdf/config/imap_hit_l1a_variable_attrs.yaml +106 -116
- imap_processing/cdf/config/imap_hit_l1b_variable_attrs.yaml +120 -145
- imap_processing/cdf/config/imap_hit_l2_variable_attrs.yaml +14 -0
- imap_processing/cdf/config/imap_idex_global_cdf_attrs.yaml +6 -9
- imap_processing/cdf/config/imap_idex_l1a_variable_attrs.yaml +1 -1
- imap_processing/cdf/config/imap_lo_global_cdf_attrs.yaml +0 -12
- imap_processing/cdf/config/imap_lo_l1a_variable_attrs.yaml +1 -1
- imap_processing/cdf/config/imap_mag_global_cdf_attrs.yaml +9 -21
- imap_processing/cdf/config/imap_mag_l1a_variable_attrs.yaml +361 -0
- imap_processing/cdf/config/imap_mag_l1b_variable_attrs.yaml +160 -0
- imap_processing/cdf/config/imap_mag_l1c_variable_attrs.yaml +160 -0
- imap_processing/cdf/config/imap_spacecraft_global_cdf_attrs.yaml +18 -0
- imap_processing/cdf/config/imap_spacecraft_variable_attrs.yaml +40 -0
- imap_processing/cdf/config/imap_swapi_global_cdf_attrs.yaml +1 -5
- imap_processing/cdf/config/imap_swe_global_cdf_attrs.yaml +12 -4
- imap_processing/cdf/config/imap_swe_l1a_variable_attrs.yaml +16 -2
- imap_processing/cdf/config/imap_swe_l1b_variable_attrs.yaml +48 -52
- imap_processing/cdf/config/imap_swe_l2_variable_attrs.yaml +71 -47
- imap_processing/cdf/config/imap_ultra_global_cdf_attrs.yaml +2 -14
- imap_processing/cdf/config/imap_ultra_l1b_variable_attrs.yaml +51 -2
- imap_processing/cdf/config/imap_ultra_l1c_variable_attrs.yaml +29 -14
- imap_processing/cdf/utils.py +13 -7
- imap_processing/cli.py +23 -8
- imap_processing/codice/codice_l1a.py +207 -85
- imap_processing/codice/constants.py +1322 -568
- imap_processing/codice/decompress.py +2 -6
- imap_processing/ena_maps/ena_maps.py +480 -116
- imap_processing/ena_maps/utils/coordinates.py +19 -0
- imap_processing/ena_maps/utils/map_utils.py +14 -17
- imap_processing/ena_maps/utils/spatial_utils.py +45 -47
- imap_processing/hi/l1a/hi_l1a.py +24 -18
- imap_processing/hi/l1a/histogram.py +0 -1
- imap_processing/hi/l1a/science_direct_event.py +6 -8
- imap_processing/hi/l1b/hi_l1b.py +31 -39
- imap_processing/hi/l1c/hi_l1c.py +405 -17
- imap_processing/hi/utils.py +58 -12
- imap_processing/hit/ancillary/imap_hit_l1b-to-l2-standard-dt0-factors_20250219_v002.csv +205 -0
- imap_processing/hit/ancillary/imap_hit_l1b-to-l2-standard-dt1-factors_20250219_v002.csv +205 -0
- imap_processing/hit/ancillary/imap_hit_l1b-to-l2-standard-dt2-factors_20250219_v002.csv +205 -0
- imap_processing/hit/ancillary/imap_hit_l1b-to-l2-standard-dt3-factors_20250219_v002.csv +205 -0
- imap_processing/hit/ancillary/imap_hit_l1b-to-l2-summed-dt0-factors_20250219_v002.csv +68 -0
- imap_processing/hit/hit_utils.py +173 -1
- imap_processing/hit/l0/constants.py +20 -11
- imap_processing/hit/l0/decom_hit.py +18 -4
- imap_processing/hit/l1a/hit_l1a.py +45 -54
- imap_processing/hit/l1b/constants.py +317 -0
- imap_processing/hit/l1b/hit_l1b.py +367 -18
- imap_processing/hit/l2/constants.py +281 -0
- imap_processing/hit/l2/hit_l2.py +614 -0
- imap_processing/hit/packet_definitions/hit_packet_definitions.xml +1323 -71
- imap_processing/ialirt/l0/mag_l0_ialirt_data.py +155 -0
- imap_processing/ialirt/l0/parse_mag.py +246 -0
- imap_processing/ialirt/l0/process_swe.py +252 -0
- imap_processing/ialirt/packet_definitions/ialirt.xml +7 -3
- imap_processing/ialirt/packet_definitions/ialirt_mag.xml +115 -0
- imap_processing/ialirt/utils/grouping.py +114 -0
- imap_processing/ialirt/utils/time.py +29 -0
- imap_processing/idex/atomic_masses.csv +22 -0
- imap_processing/idex/decode.py +2 -2
- imap_processing/idex/idex_constants.py +25 -0
- imap_processing/idex/idex_l1a.py +6 -7
- imap_processing/idex/idex_l1b.py +4 -31
- imap_processing/idex/idex_l2a.py +789 -0
- imap_processing/idex/idex_variable_unpacking_and_eu_conversion.csv +39 -33
- imap_processing/lo/l0/lo_science.py +6 -0
- imap_processing/lo/l1a/lo_l1a.py +0 -1
- imap_processing/lo/l1b/lo_l1b.py +177 -25
- imap_processing/mag/constants.py +8 -0
- imap_processing/mag/imap_mag_sdc-configuration_v001.yaml +6 -0
- imap_processing/mag/l0/decom_mag.py +10 -3
- imap_processing/mag/l1a/mag_l1a.py +22 -11
- imap_processing/mag/l1a/mag_l1a_data.py +28 -3
- imap_processing/mag/l1b/mag_l1b.py +190 -48
- imap_processing/mag/l1c/interpolation_methods.py +211 -0
- imap_processing/mag/l1c/mag_l1c.py +447 -9
- imap_processing/quality_flags.py +1 -0
- imap_processing/spacecraft/packet_definitions/scid_x252.xml +538 -0
- imap_processing/spacecraft/quaternions.py +123 -0
- imap_processing/spice/geometry.py +16 -19
- imap_processing/spice/repoint.py +120 -0
- imap_processing/swapi/l1/swapi_l1.py +4 -0
- imap_processing/swapi/l2/swapi_l2.py +0 -1
- imap_processing/swe/l1a/swe_l1a.py +47 -8
- imap_processing/swe/l1a/swe_science.py +5 -2
- imap_processing/swe/l1b/swe_l1b_science.py +103 -56
- imap_processing/swe/l2/swe_l2.py +60 -65
- imap_processing/swe/packet_definitions/swe_packet_definition.xml +1121 -1
- imap_processing/swe/utils/swe_constants.py +63 -0
- imap_processing/swe/utils/swe_utils.py +85 -28
- imap_processing/tests/ccsds/test_data/expected_output.xml +40 -1
- imap_processing/tests/ccsds/test_excel_to_xtce.py +23 -20
- imap_processing/tests/cdf/test_data/imap_instrument2_global_cdf_attrs.yaml +0 -2
- imap_processing/tests/codice/conftest.py +1 -1
- imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-counters-aggregated_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-counters-singles_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-ialirt_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-omni_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-pha_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-priorities_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_hi-sectored_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-counters-aggregated_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-counters-singles_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-ialirt_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-nsw-angular_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-nsw-priority_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-nsw-species_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-pha_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-sw-angular_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-sw-priority_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/data/validation/imap_codice_l1a_lo-sw-species_20241110193700_v0.0.0.cdf +0 -0
- imap_processing/tests/codice/test_codice_l1a.py +110 -46
- imap_processing/tests/codice/test_decompress.py +4 -4
- imap_processing/tests/conftest.py +166 -10
- imap_processing/tests/ena_maps/conftest.py +51 -0
- imap_processing/tests/ena_maps/test_ena_maps.py +638 -109
- imap_processing/tests/ena_maps/test_map_utils.py +66 -43
- imap_processing/tests/ena_maps/test_spatial_utils.py +16 -20
- imap_processing/tests/hi/data/l0/H45_diag_fee_20250208.bin +0 -0
- imap_processing/tests/hi/data/l0/H45_diag_fee_20250208_verify.csv +205 -0
- imap_processing/tests/hi/test_hi_l1b.py +12 -15
- imap_processing/tests/hi/test_hi_l1c.py +234 -6
- imap_processing/tests/hi/test_l1a.py +30 -0
- imap_processing/tests/hi/test_science_direct_event.py +1 -1
- imap_processing/tests/hi/test_utils.py +24 -2
- imap_processing/tests/hit/helpers/l1_validation.py +39 -39
- imap_processing/tests/hit/test_data/hskp_sample.ccsds +0 -0
- imap_processing/tests/hit/test_data/imap_hit_l0_raw_20100105_v001.pkts +0 -0
- imap_processing/tests/hit/test_decom_hit.py +4 -0
- imap_processing/tests/hit/test_hit_l1a.py +24 -28
- imap_processing/tests/hit/test_hit_l1b.py +304 -40
- imap_processing/tests/hit/test_hit_l2.py +454 -0
- imap_processing/tests/hit/test_hit_utils.py +112 -2
- imap_processing/tests/hit/validation_data/hskp_sample_eu_3_6_2025.csv +89 -0
- imap_processing/tests/hit/validation_data/hskp_sample_raw.csv +89 -88
- imap_processing/tests/ialirt/test_data/l0/461971383-404.bin +0 -0
- imap_processing/tests/ialirt/test_data/l0/461971384-405.bin +0 -0
- imap_processing/tests/ialirt/test_data/l0/461971385-406.bin +0 -0
- imap_processing/tests/ialirt/test_data/l0/461971386-407.bin +0 -0
- imap_processing/tests/ialirt/test_data/l0/461971387-408.bin +0 -0
- imap_processing/tests/ialirt/test_data/l0/461971388-409.bin +0 -0
- imap_processing/tests/ialirt/test_data/l0/461971389-410.bin +0 -0
- imap_processing/tests/ialirt/test_data/l0/461971390-411.bin +0 -0
- imap_processing/tests/ialirt/test_data/l0/461971391-412.bin +0 -0
- imap_processing/tests/ialirt/test_data/l0/sample_decoded_i-alirt_data.csv +383 -0
- imap_processing/tests/ialirt/unit/test_grouping.py +81 -0
- imap_processing/tests/ialirt/unit/test_parse_mag.py +168 -0
- imap_processing/tests/ialirt/unit/test_process_swe.py +208 -3
- imap_processing/tests/ialirt/unit/test_time.py +16 -0
- imap_processing/tests/idex/conftest.py +62 -6
- imap_processing/tests/idex/test_data/imap_idex_l0_raw_20231218_v001.pkts +0 -0
- imap_processing/tests/idex/test_data/impact_14_tof_high_data.txt +4508 -4508
- imap_processing/tests/idex/test_idex_l1a.py +48 -4
- imap_processing/tests/idex/test_idex_l1b.py +3 -3
- imap_processing/tests/idex/test_idex_l2a.py +383 -0
- imap_processing/tests/lo/test_cdfs/imap_lo_l1a_de_20241022_v002.cdf +0 -0
- imap_processing/tests/lo/test_cdfs/imap_lo_l1a_spin_20241022_v002.cdf +0 -0
- imap_processing/tests/lo/test_lo_l1b.py +148 -4
- imap_processing/tests/lo/test_lo_science.py +1 -0
- imap_processing/tests/mag/conftest.py +69 -0
- imap_processing/tests/mag/test_mag_decom.py +1 -1
- imap_processing/tests/mag/test_mag_l1a.py +38 -0
- imap_processing/tests/mag/test_mag_l1b.py +34 -53
- imap_processing/tests/mag/test_mag_l1c.py +251 -20
- imap_processing/tests/mag/test_mag_validation.py +109 -25
- imap_processing/tests/mag/validation/L1b/T009/MAGScience-normal-(2,2)-8s-20250204-16h39.csv +17 -0
- imap_processing/tests/mag/validation/L1b/T009/mag-l1a-l1b-t009-magi-out.csv +16 -16
- imap_processing/tests/mag/validation/L1b/T009/mag-l1a-l1b-t009-mago-out.csv +16 -16
- imap_processing/tests/mag/validation/L1b/T010/MAGScience-normal-(2,2)-8s-20250206-12h05.csv +17 -0
- imap_processing/tests/mag/validation/L1b/T011/MAGScience-normal-(2,2)-8s-20250204-16h08.csv +17 -0
- imap_processing/tests/mag/validation/L1b/T011/mag-l1a-l1b-t011-magi-out.csv +16 -16
- imap_processing/tests/mag/validation/L1b/T011/mag-l1a-l1b-t011-mago-out.csv +16 -16
- imap_processing/tests/mag/validation/L1b/T012/MAGScience-normal-(2,2)-8s-20250204-16h08.csv +17 -0
- imap_processing/tests/mag/validation/L1b/T012/data.bin +0 -0
- imap_processing/tests/mag/validation/L1b/T012/field_like_all_ranges.txt +19200 -0
- imap_processing/tests/mag/validation/L1b/T012/mag-l1a-l1b-t012-cal.cdf +0 -0
- imap_processing/tests/mag/validation/L1b/T012/mag-l1a-l1b-t012-in.csv +17 -0
- imap_processing/tests/mag/validation/L1b/T012/mag-l1a-l1b-t012-magi-out.csv +17 -0
- imap_processing/tests/mag/validation/L1b/T012/mag-l1a-l1b-t012-mago-out.csv +17 -0
- imap_processing/tests/mag/validation/imap_calibration_mag_20240229_v01.cdf +0 -0
- imap_processing/tests/spacecraft/__init__.py +0 -0
- imap_processing/tests/spacecraft/data/SSR_2024_190_20_08_12_0483851794_2_DA_apid0594_1packet.pkts +0 -0
- imap_processing/tests/spacecraft/test_quaternions.py +71 -0
- imap_processing/tests/spice/test_data/fake_repoint_data.csv +5 -0
- imap_processing/tests/spice/test_geometry.py +6 -9
- imap_processing/tests/spice/test_repoint.py +111 -0
- imap_processing/tests/swapi/test_swapi_l1.py +7 -3
- imap_processing/tests/swe/l0_data/2024051010_SWE_HK_packet.bin +0 -0
- imap_processing/tests/swe/l0_data/2024051011_SWE_CEM_RAW_packet.bin +0 -0
- imap_processing/tests/swe/l0_validation_data/idle_export_eu.SWE_APP_HK_20240510_092742.csv +49 -0
- imap_processing/tests/swe/l0_validation_data/idle_export_eu.SWE_CEM_RAW_20240510_092742.csv +593 -0
- imap_processing/tests/swe/test_swe_l1a.py +18 -0
- imap_processing/tests/swe/test_swe_l1a_cem_raw.py +52 -0
- imap_processing/tests/swe/test_swe_l1a_hk.py +68 -0
- imap_processing/tests/swe/test_swe_l1b_science.py +23 -4
- imap_processing/tests/swe/test_swe_l2.py +112 -30
- imap_processing/tests/test_cli.py +2 -2
- imap_processing/tests/test_utils.py +138 -16
- imap_processing/tests/ultra/data/l0/FM45_UltraFM45_Functional_2024-01-22T0105_20240122T010548.CCSDS +0 -0
- imap_processing/tests/ultra/data/l0/ultra45_raw_sc_ultraimgrates_20220530_00.csv +164 -0
- imap_processing/tests/ultra/{test_data → data}/l0/ultra45_raw_sc_ultrarawimg_withFSWcalcs_FM45_40P_Phi28p5_BeamCal_LinearScan_phi2850_theta-000_20240207T102740.csv +3243 -3243
- imap_processing/tests/ultra/data/mock_data.py +341 -0
- imap_processing/tests/ultra/unit/conftest.py +69 -26
- imap_processing/tests/ultra/unit/test_badtimes.py +2 -0
- imap_processing/tests/ultra/unit/test_cullingmask.py +4 -0
- imap_processing/tests/ultra/unit/test_de.py +12 -4
- imap_processing/tests/ultra/unit/test_decom_apid_881.py +44 -0
- imap_processing/tests/ultra/unit/test_spacecraft_pset.py +78 -0
- imap_processing/tests/ultra/unit/test_ultra_l1a.py +28 -12
- imap_processing/tests/ultra/unit/test_ultra_l1b.py +34 -6
- imap_processing/tests/ultra/unit/test_ultra_l1b_culling.py +22 -26
- imap_processing/tests/ultra/unit/test_ultra_l1b_extended.py +86 -51
- imap_processing/tests/ultra/unit/test_ultra_l1c_pset_bins.py +94 -52
- imap_processing/ultra/l0/decom_tools.py +6 -5
- imap_processing/ultra/l1a/ultra_l1a.py +28 -56
- imap_processing/ultra/l1b/de.py +72 -28
- imap_processing/ultra/l1b/extendedspin.py +12 -14
- imap_processing/ultra/l1b/ultra_l1b.py +34 -9
- imap_processing/ultra/l1b/ultra_l1b_culling.py +65 -29
- imap_processing/ultra/l1b/ultra_l1b_extended.py +64 -19
- imap_processing/ultra/l1c/spacecraft_pset.py +86 -0
- imap_processing/ultra/l1c/ultra_l1c.py +7 -4
- imap_processing/ultra/l1c/ultra_l1c_pset_bins.py +112 -61
- imap_processing/ultra/lookup_tables/ultra_90_dps_exposure_compressed.cdf +0 -0
- imap_processing/ultra/utils/ultra_l1_utils.py +20 -2
- imap_processing/utils.py +68 -28
- {imap_processing-0.11.0.dist-info → imap_processing-0.12.0.dist-info}/METADATA +8 -5
- {imap_processing-0.11.0.dist-info → imap_processing-0.12.0.dist-info}/RECORD +250 -199
- imap_processing/cdf/config/imap_mag_l1_variable_attrs.yaml +0 -237
- imap_processing/hi/l1a/housekeeping.py +0 -27
- imap_processing/tests/codice/data/imap_codice_l1a_hi-counters-aggregated_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1a_hi-counters-singles_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1a_hi-omni_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1a_hi-sectored_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1a_hskp_20100101_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1a_lo-counters-aggregated_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1a_lo-counters-singles_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1a_lo-nsw-angular_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1a_lo-nsw-priority_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1a_lo-nsw-species_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1a_lo-sw-angular_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1a_lo-sw-priority_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1a_lo-sw-species_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1b_hi-counters-aggregated_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1b_hi-counters-singles_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1b_hi-omni_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1b_hi-sectored_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1b_hskp_20100101_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1b_lo-counters-aggregated_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1b_lo-counters-singles_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1b_lo-nsw-angular_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1b_lo-nsw-priority_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1b_lo-nsw-species_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1b_lo-sw-angular_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1b_lo-sw-priority_20240429_v001.cdf +0 -0
- imap_processing/tests/codice/data/imap_codice_l1b_lo-sw-species_20240429_v001.cdf +0 -0
- imap_processing/tests/hi/data/l1/imap_hi_l1b_45sensor-de_20250415_v999.cdf +0 -0
- imap_processing/tests/hit/PREFLIGHT_raw_record_2023_256_15_59_04_apid1251.pkts +0 -0
- imap_processing/tests/hit/PREFLIGHT_raw_record_2023_256_15_59_04_apid1252.pkts +0 -0
- imap_processing/tests/hit/validation_data/hskp_sample_eu.csv +0 -89
- imap_processing/tests/hit/validation_data/sci_sample_raw1.csv +0 -29
- imap_processing/tests/idex/test_data/imap_idex_l0_raw_20231214_v001.pkts +0 -0
- imap_processing/tests/lo/test_cdfs/imap_lo_l1a_de_20100101_v001.cdf +0 -0
- imap_processing/tests/lo/test_cdfs/imap_lo_l1a_spin_20100101_v001.cdf +0 -0
- imap_processing/tests/ultra/test_data/mock_data.py +0 -161
- imap_processing/ultra/l1c/pset.py +0 -40
- /imap_processing/tests/ultra/{test_data → data}/l0/FM45_40P_Phi28p5_BeamCal_LinearScan_phi28.50_theta-0.00_20240207T102740.CCSDS +0 -0
- /imap_processing/tests/ultra/{test_data → data}/l0/FM45_7P_Phi0.0_BeamCal_LinearScan_phi0.04_theta-0.01_20230821T121304.CCSDS +0 -0
- /imap_processing/tests/ultra/{test_data → data}/l0/FM45_TV_Cycle6_Hot_Ops_Front212_20240124T063837.CCSDS +0 -0
- /imap_processing/tests/ultra/{test_data → data}/l0/Ultra45_EM_SwRI_Cal_Run7_ThetaScan_20220530T225054.CCSDS +0 -0
- /imap_processing/tests/ultra/{test_data → data}/l0/ultra45_raw_sc_auxdata_Ultra45_EM_SwRI_Cal_Run7_ThetaScan_20220530T225054.csv +0 -0
- /imap_processing/tests/ultra/{test_data → data}/l0/ultra45_raw_sc_enaphxtofhangimg_FM45_TV_Cycle6_Hot_Ops_Front212_20240124T063837.csv +0 -0
- /imap_processing/tests/ultra/{test_data → data}/l0/ultra45_raw_sc_ultraimgrates_Ultra45_EM_SwRI_Cal_Run7_ThetaScan_20220530T225054.csv +0 -0
- /imap_processing/tests/ultra/{test_data → data}/l0/ultra45_raw_sc_ultrarawimgevent_FM45_7P_Phi00_BeamCal_LinearScan_phi004_theta-001_20230821T121304.csv +0 -0
- /imap_processing/tests/ultra/{test_data → data}/l1/dps_exposure_helio_45_E1.cdf +0 -0
- /imap_processing/tests/ultra/{test_data → data}/l1/dps_exposure_helio_45_E12.cdf +0 -0
- /imap_processing/tests/ultra/{test_data → data}/l1/dps_exposure_helio_45_E24.cdf +0 -0
- {imap_processing-0.11.0.dist-info → imap_processing-0.12.0.dist-info}/LICENSE +0 -0
- {imap_processing-0.11.0.dist-info → imap_processing-0.12.0.dist-info}/WHEEL +0 -0
- {imap_processing-0.11.0.dist-info → imap_processing-0.12.0.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
import pandas as pd
|
|
3
|
+
import pytest
|
|
4
|
+
import xarray as xr
|
|
5
|
+
|
|
6
|
+
from imap_processing import imap_module_directory
|
|
7
|
+
from imap_processing.ialirt.l0.parse_mag import (
|
|
8
|
+
extract_magnetic_vectors,
|
|
9
|
+
get_pkt_counter,
|
|
10
|
+
get_status_data,
|
|
11
|
+
get_time,
|
|
12
|
+
parse_packet,
|
|
13
|
+
)
|
|
14
|
+
from imap_processing.utils import packet_file_to_datasets
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@pytest.fixture(scope="session")
|
|
18
|
+
def xtce_mag_path():
|
|
19
|
+
"""Returns the xtce directory."""
|
|
20
|
+
return imap_module_directory / "ialirt" / "packet_definitions" / "ialirt_mag.xml"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@pytest.fixture(scope="session")
|
|
24
|
+
def binary_packet_path():
|
|
25
|
+
"""Returns the paths to the binary packets."""
|
|
26
|
+
directory = imap_module_directory / "tests" / "ialirt" / "test_data" / "l0"
|
|
27
|
+
filenames = [
|
|
28
|
+
"461971383-404.bin",
|
|
29
|
+
"461971384-405.bin",
|
|
30
|
+
"461971385-406.bin",
|
|
31
|
+
"461971386-407.bin",
|
|
32
|
+
"461971387-408.bin",
|
|
33
|
+
"461971388-409.bin",
|
|
34
|
+
"461971389-410.bin",
|
|
35
|
+
"461971390-411.bin",
|
|
36
|
+
"461971391-412.bin",
|
|
37
|
+
]
|
|
38
|
+
return tuple(directory / fname for fname in filenames)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@pytest.fixture(scope="session")
|
|
42
|
+
def mag_test_data():
|
|
43
|
+
"""Returns the test data directory."""
|
|
44
|
+
data_path = (
|
|
45
|
+
imap_module_directory
|
|
46
|
+
/ "tests"
|
|
47
|
+
/ "ialirt"
|
|
48
|
+
/ "test_data"
|
|
49
|
+
/ "l0"
|
|
50
|
+
/ "sample_decoded_i-alirt_data.csv"
|
|
51
|
+
)
|
|
52
|
+
data = pd.read_csv(data_path)
|
|
53
|
+
|
|
54
|
+
return data
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
@pytest.fixture()
|
|
58
|
+
def xarray_data(binary_packet_path, xtce_mag_path):
|
|
59
|
+
"""Create xarray data for multiple packets."""
|
|
60
|
+
apid = 1001
|
|
61
|
+
|
|
62
|
+
xarray_data = tuple(
|
|
63
|
+
packet_file_to_datasets(packet, xtce_mag_path, use_derived_value=False)[apid]
|
|
64
|
+
for packet in binary_packet_path
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
merged_xarray_data = xr.concat(xarray_data, dim="epoch")
|
|
68
|
+
return merged_xarray_data
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
@pytest.fixture()
|
|
72
|
+
def grouped_data():
|
|
73
|
+
"""Creates grouped data for tests."""
|
|
74
|
+
epoch = np.arange(12)
|
|
75
|
+
|
|
76
|
+
# Example `src_seq_ctr` values for 3 groups:
|
|
77
|
+
# Group 0 - valid, all diffs = 1
|
|
78
|
+
# Group 1 - invalid, has a jump of 5
|
|
79
|
+
# Group 2 - valid, wraps at -16383
|
|
80
|
+
src_seq_ctr = np.concatenate(
|
|
81
|
+
[
|
|
82
|
+
np.arange(100, 104),
|
|
83
|
+
np.array([200, 205, 206, 207]),
|
|
84
|
+
np.array([16382, 16383, 0, 1]),
|
|
85
|
+
],
|
|
86
|
+
dtype=np.int32,
|
|
87
|
+
)
|
|
88
|
+
mag_acq_tm_coarse = np.repeat(
|
|
89
|
+
np.array([461971382, 461971386, 461971390], dtype=np.uint32), repeats=4
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
mag_acq_tm_fine = np.array(
|
|
93
|
+
[1502, 1502, 1505, 1505, 1500, 1500, 1503, 1503, 1497, 1497, 1491, 1491]
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
group = np.tile(np.arange(3), 4).reshape(4, 3).T.ravel()
|
|
97
|
+
|
|
98
|
+
grouped_data = xr.Dataset(
|
|
99
|
+
data_vars={
|
|
100
|
+
"src_seq_ctr": ("epoch", src_seq_ctr),
|
|
101
|
+
"mag_acq_tm_coarse": ("epoch", mag_acq_tm_coarse),
|
|
102
|
+
"mag_acq_tm_fine": ("epoch", mag_acq_tm_fine),
|
|
103
|
+
},
|
|
104
|
+
coords={"epoch": epoch, "group": ("epoch", group)},
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
return grouped_data
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def test_get_pkt_counter(xarray_data):
|
|
111
|
+
"""Tests the get_pkt_counter function."""
|
|
112
|
+
status_values = xarray_data["mag_status"].values
|
|
113
|
+
pkt_counter = get_pkt_counter(status_values)
|
|
114
|
+
assert np.array_equal(pkt_counter, np.array([0, 1, 2, 3, 0, 1, 2, 3, 0]))
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def test_get_status_data(xarray_data, mag_test_data):
|
|
118
|
+
"""Tests the get_status_data function."""
|
|
119
|
+
|
|
120
|
+
status_data = get_status_data(
|
|
121
|
+
xarray_data["mag_status"].values[0:4], np.array([0, 1, 2, 3])
|
|
122
|
+
)
|
|
123
|
+
index = mag_test_data["PRI_COARSETM"] == 461971382
|
|
124
|
+
matching_row = mag_test_data[index]
|
|
125
|
+
|
|
126
|
+
for key in status_data.keys():
|
|
127
|
+
assert status_data[key] == matching_row[key.upper()].values[0]
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def test_get_time(grouped_data):
|
|
131
|
+
"""Tests the get_time function."""
|
|
132
|
+
time_data = get_time(grouped_data, 1, np.array([0, 1, 2, 3]))
|
|
133
|
+
assert time_data == {
|
|
134
|
+
"pri_coarsetm": 461971386,
|
|
135
|
+
"pri_fintm": 1500,
|
|
136
|
+
"sec_coarsetm": 461971386,
|
|
137
|
+
"sec_fintm": 1503,
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def test_extract_magnetic_vectors():
|
|
142
|
+
"""Tests the extract_magnetic_vectors function."""
|
|
143
|
+
science_values = xr.DataArray(
|
|
144
|
+
data=np.array([15797207, 5750698, 15921110, 2342918], dtype=np.uint32)
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
vectors = extract_magnetic_vectors(science_values)
|
|
148
|
+
|
|
149
|
+
assert vectors == {
|
|
150
|
+
"pri_x": 61707,
|
|
151
|
+
"pri_y": 55127,
|
|
152
|
+
"pri_z": 49066,
|
|
153
|
+
"sec_x": 62191,
|
|
154
|
+
"sec_y": 54819,
|
|
155
|
+
"sec_z": 49158,
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def test_parse_packet(xarray_data, mag_test_data):
|
|
160
|
+
"""Tests the parse_packet function."""
|
|
161
|
+
parsed_packets = parse_packet(xarray_data)
|
|
162
|
+
|
|
163
|
+
for packet in parsed_packets:
|
|
164
|
+
index = packet["pri_coarsetm"] == mag_test_data["PRI_COARSETM"]
|
|
165
|
+
matching_rows = mag_test_data[index]
|
|
166
|
+
|
|
167
|
+
for key in packet.keys():
|
|
168
|
+
assert packet[key] == matching_rows[key.upper()].values[0]
|
|
@@ -1,8 +1,23 @@
|
|
|
1
|
+
from unittest.mock import patch
|
|
2
|
+
|
|
1
3
|
import numpy as np
|
|
2
4
|
import pandas as pd
|
|
3
5
|
import pytest
|
|
6
|
+
import xarray as xr
|
|
4
7
|
|
|
5
8
|
from imap_processing import imap_module_directory
|
|
9
|
+
from imap_processing.ialirt.l0.process_swe import (
|
|
10
|
+
decompress_counts,
|
|
11
|
+
get_ialirt_energies,
|
|
12
|
+
normalize_counts,
|
|
13
|
+
phi_to_bin,
|
|
14
|
+
prepare_raw_counts,
|
|
15
|
+
process_swe,
|
|
16
|
+
)
|
|
17
|
+
from imap_processing.swe.utils.swe_constants import (
|
|
18
|
+
ESA_VOLTAGE_ROW_INDEX_DICT,
|
|
19
|
+
GEOMETRIC_FACTORS,
|
|
20
|
+
)
|
|
6
21
|
from imap_processing.utils import packet_file_to_datasets
|
|
7
22
|
|
|
8
23
|
|
|
@@ -52,9 +67,9 @@ def xarray_data(binary_packet_path, xtce_swe_path):
|
|
|
52
67
|
return xarray_data
|
|
53
68
|
|
|
54
69
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
70
|
+
@pytest.fixture()
|
|
71
|
+
def fields_to_test():
|
|
72
|
+
"""Create a dictionary to convert names"""
|
|
58
73
|
fields_to_test = {
|
|
59
74
|
"swe_shcoarse": "SHCOARSE",
|
|
60
75
|
"swe_acq_sec": "ACQUISITION_TIME",
|
|
@@ -91,6 +106,19 @@ def test_decom_packets(xarray_data, swe_test_data):
|
|
|
91
106
|
"swe_cem7_e3": "ELEC_COUNTS_SPIN_I_POL_6_E_2J",
|
|
92
107
|
"swe_cem7_e4": "ELEC_COUNTS_SPIN_I_POL_6_E_3J",
|
|
93
108
|
}
|
|
109
|
+
return fields_to_test
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def test_get_energy():
|
|
113
|
+
"""Tests get_alirt_energies function."""
|
|
114
|
+
energies = get_ialirt_energies()
|
|
115
|
+
|
|
116
|
+
for i in range(len(energies)):
|
|
117
|
+
assert i + 11 == ESA_VOLTAGE_ROW_INDEX_DICT[energies[i]]
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def test_decom_packets(xarray_data, swe_test_data, fields_to_test):
|
|
121
|
+
"""This function checks that all instrument parameters are accounted for."""
|
|
94
122
|
_, index, test_index = np.intersect1d(
|
|
95
123
|
xarray_data["swe_shcoarse"], swe_test_data["SHCOARSE"], return_indices=True
|
|
96
124
|
)
|
|
@@ -104,3 +132,180 @@ def test_decom_packets(xarray_data, swe_test_data):
|
|
|
104
132
|
f"Mismatch found in {xarray_field}: "
|
|
105
133
|
f"actual {actual_values}, expected {expected_values}"
|
|
106
134
|
)
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def test_decompress_counts():
|
|
138
|
+
"""Test that we get correct decompressed counts from the algorithm."""
|
|
139
|
+
expected_value = 24063
|
|
140
|
+
input_count = 230
|
|
141
|
+
returned_value = decompress_counts(np.array([input_count]))
|
|
142
|
+
assert np.all(expected_value == returned_value)
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def test_phi_to_bin():
|
|
146
|
+
"""Test phi_to_bin function."""
|
|
147
|
+
|
|
148
|
+
# Define expected phi-to-bin mapping for one full spin
|
|
149
|
+
phis = np.arange(12, 361, 12).tolist()
|
|
150
|
+
|
|
151
|
+
expected_bins = np.arange(30)
|
|
152
|
+
|
|
153
|
+
for phi, expected_bin in zip(phis, expected_bins):
|
|
154
|
+
assert phi_to_bin(phi) == expected_bin
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def test_prepare_raw_counts():
|
|
158
|
+
"""Test that prepare_raw_counts correctly bins counts into (30, 7, 4) array."""
|
|
159
|
+
|
|
160
|
+
# 2 rows = 4 phis (12, 24, 36, 48)
|
|
161
|
+
epochs = [0, 1]
|
|
162
|
+
|
|
163
|
+
data = {
|
|
164
|
+
"group": ("epoch", [1, 1]), # Both rows belong to group 1
|
|
165
|
+
# CEM 1 (Phi 12, 24, 36, 48)
|
|
166
|
+
"swe_cem1_e1": ("epoch", [1, 9]),
|
|
167
|
+
"swe_cem1_e2": ("epoch", [2, 10]),
|
|
168
|
+
"swe_cem1_e3": ("epoch", [3, 11]),
|
|
169
|
+
"swe_cem1_e4": ("epoch", [4, 12]),
|
|
170
|
+
# CEM 2
|
|
171
|
+
"swe_cem2_e1": ("epoch", [5, 13]),
|
|
172
|
+
"swe_cem2_e2": ("epoch", [6, 14]),
|
|
173
|
+
"swe_cem2_e3": ("epoch", [7, 15]),
|
|
174
|
+
"swe_cem2_e4": ("epoch", [8, 16]),
|
|
175
|
+
"swe_seq": ("epoch", [0, 1]),
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
grouped_data = xr.Dataset(data, coords={"epoch": epochs})
|
|
179
|
+
group_mask = grouped_data["group"] == 1
|
|
180
|
+
grouped = grouped_data.sel(epoch=group_mask)
|
|
181
|
+
|
|
182
|
+
raw_counts = prepare_raw_counts(grouped, cem_number=2)
|
|
183
|
+
|
|
184
|
+
# Expected shape (8, 7, 30) but only some CEMs are used.
|
|
185
|
+
expected = np.zeros((8, 2, 30), dtype=np.uint8)
|
|
186
|
+
|
|
187
|
+
# Phi bins for 12, 24, 36, 48)
|
|
188
|
+
phi_bin_12 = 0 # Phi 12
|
|
189
|
+
phi_bin_24 = 1 # Phi 24
|
|
190
|
+
phi_bin_36 = 2 # Phi 36
|
|
191
|
+
phi_bin_48 = 3 # Phi 48
|
|
192
|
+
|
|
193
|
+
# CEM 1, Phi 12 (E1, E2)
|
|
194
|
+
expected[1, 0, phi_bin_12] = 1
|
|
195
|
+
expected[5, 0, phi_bin_12] = 2
|
|
196
|
+
|
|
197
|
+
# CEM 1, Phi 24 (E3, E4)
|
|
198
|
+
expected[7, 0, phi_bin_24] = 3
|
|
199
|
+
expected[3, 0, phi_bin_24] = 4
|
|
200
|
+
|
|
201
|
+
# CEM 1, Phi 36 (E1, E2)
|
|
202
|
+
expected[1, 0, phi_bin_36] = 9
|
|
203
|
+
expected[5, 0, phi_bin_36] = 10
|
|
204
|
+
|
|
205
|
+
# CEM 1, Phi 48 (E3, E4)
|
|
206
|
+
expected[7, 0, phi_bin_48] = 11
|
|
207
|
+
expected[3, 0, phi_bin_48] = 12
|
|
208
|
+
|
|
209
|
+
# CEM 2, Phi 12 (E1, E2)
|
|
210
|
+
expected[1, 1, phi_bin_12] = 5
|
|
211
|
+
expected[5, 1, phi_bin_12] = 6
|
|
212
|
+
|
|
213
|
+
# CEM 2, Phi 24 (E3, E4)
|
|
214
|
+
expected[7, 1, phi_bin_24] = 7
|
|
215
|
+
expected[3, 1, phi_bin_24] = 8
|
|
216
|
+
|
|
217
|
+
# CEM 2, Phi 36 (E1, E2)
|
|
218
|
+
expected[1, 1, phi_bin_36] = 13
|
|
219
|
+
expected[5, 1, phi_bin_36] = 14
|
|
220
|
+
|
|
221
|
+
# CEM 2, Phi 48 (E3, E4)
|
|
222
|
+
expected[7, 1, phi_bin_48] = 15
|
|
223
|
+
expected[3, 1, phi_bin_48] = 16
|
|
224
|
+
|
|
225
|
+
assert np.array_equal(raw_counts, expected)
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
def test_norm_counts():
|
|
229
|
+
"""Tests normalize_counts function"""
|
|
230
|
+
|
|
231
|
+
# Shape (2, 7, 3) for a small test case
|
|
232
|
+
corrected_counts = np.array(
|
|
233
|
+
[
|
|
234
|
+
[
|
|
235
|
+
[1, 2, 3],
|
|
236
|
+
[4, 5, 6],
|
|
237
|
+
[7, 8, 9],
|
|
238
|
+
[10, 11, 12],
|
|
239
|
+
[13, 14, 15],
|
|
240
|
+
[16, 17, 18],
|
|
241
|
+
[19, 20, 21],
|
|
242
|
+
],
|
|
243
|
+
[
|
|
244
|
+
[2, 4, 6],
|
|
245
|
+
[8, 10, 12],
|
|
246
|
+
[14, 16, 18],
|
|
247
|
+
[20, 22, 24],
|
|
248
|
+
[26, 28, 30],
|
|
249
|
+
[32, 34, 36],
|
|
250
|
+
[38, 40, 42],
|
|
251
|
+
],
|
|
252
|
+
],
|
|
253
|
+
dtype=np.uint8,
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
latest_cal = pd.Series(
|
|
257
|
+
[2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0],
|
|
258
|
+
index=[
|
|
259
|
+
"cem1",
|
|
260
|
+
"cem2",
|
|
261
|
+
"cem3",
|
|
262
|
+
"cem4",
|
|
263
|
+
"cem5",
|
|
264
|
+
"cem6",
|
|
265
|
+
"cem7",
|
|
266
|
+
], # Simulating real data structure
|
|
267
|
+
dtype=np.float64,
|
|
268
|
+
)
|
|
269
|
+
expected = np.zeros((2, 7, 3), dtype=np.float64)
|
|
270
|
+
|
|
271
|
+
for i in range(2):
|
|
272
|
+
for j in range(7):
|
|
273
|
+
for k in range(3):
|
|
274
|
+
if corrected_counts[i][j][k] < 0:
|
|
275
|
+
expected[i][j][k] = 0.0
|
|
276
|
+
else:
|
|
277
|
+
expected[i][j][k] = (
|
|
278
|
+
corrected_counts[i][j][k] * latest_cal[j] / GEOMETRIC_FACTORS[j]
|
|
279
|
+
)
|
|
280
|
+
|
|
281
|
+
norm_counts = normalize_counts(corrected_counts, latest_cal)
|
|
282
|
+
|
|
283
|
+
assert np.allclose(norm_counts, expected, atol=1e-9)
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
@patch(
|
|
287
|
+
"imap_processing.ialirt.l0.process_swe.read_in_flight_cal_data",
|
|
288
|
+
return_value=pd.DataFrame(
|
|
289
|
+
{
|
|
290
|
+
"met_time": [453051300, 453051900],
|
|
291
|
+
"cem1": [1, 2],
|
|
292
|
+
"cem2": [1, 2],
|
|
293
|
+
"cem3": [1, 2],
|
|
294
|
+
"cem4": [1, 2],
|
|
295
|
+
"cem5": [1, 2],
|
|
296
|
+
"cem6": [1, 2],
|
|
297
|
+
"cem7": [1, 2],
|
|
298
|
+
}
|
|
299
|
+
),
|
|
300
|
+
)
|
|
301
|
+
def test_process_swe(mock_read_cal, swe_test_data, fields_to_test):
|
|
302
|
+
"""Test processing for swe."""
|
|
303
|
+
swe_test_data = swe_test_data.rename(
|
|
304
|
+
columns={v: k for k, v in fields_to_test.items()}
|
|
305
|
+
)
|
|
306
|
+
swe_test_data.index.name = "epoch"
|
|
307
|
+
ds = swe_test_data.to_xarray()
|
|
308
|
+
ds["src_seq_ctr"] = ("epoch", np.arange(len(ds["swe_shcoarse"])))
|
|
309
|
+
swe_data = process_swe(ds)
|
|
310
|
+
|
|
311
|
+
assert swe_data == []
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"""Tests grouping functions for I-ALiRT instruments."""
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
|
|
5
|
+
from imap_processing.ialirt.utils.time import calculate_time
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def test_calculate_time():
|
|
9
|
+
"""Tests calculate_time function."""
|
|
10
|
+
|
|
11
|
+
coarse = np.array([1, 2, 3, 4, 5])
|
|
12
|
+
fine = np.array([0, 1, 2, 3, 4])
|
|
13
|
+
|
|
14
|
+
time = calculate_time(coarse, fine, 6553)
|
|
15
|
+
|
|
16
|
+
np.testing.assert_allclose(time, coarse + fine / 65535.0, atol=1e-03, rtol=0)
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from pathlib import Path
|
|
2
|
-
|
|
3
1
|
import numpy as np
|
|
4
2
|
import pytest
|
|
5
3
|
import xarray as xr
|
|
@@ -7,6 +5,13 @@ import xarray as xr
|
|
|
7
5
|
from imap_processing import imap_module_directory
|
|
8
6
|
from imap_processing.idex.idex_l1a import PacketParser
|
|
9
7
|
|
|
8
|
+
TEST_DATA_PATH = imap_module_directory / "tests" / "idex" / "test_data"
|
|
9
|
+
|
|
10
|
+
TEST_L0_FILE = TEST_DATA_PATH / "imap_idex_l0_raw_20231218_v001.pkts"
|
|
11
|
+
L1A_EXAMPLE_FILE = TEST_DATA_PATH / "idex_l1a_validation_file.h5"
|
|
12
|
+
|
|
13
|
+
pytestmark = pytest.mark.external_test_data
|
|
14
|
+
|
|
10
15
|
SPICE_ARRAYS = [
|
|
11
16
|
"ephemeris_position_x",
|
|
12
17
|
"ephemeris_position_y",
|
|
@@ -30,10 +35,20 @@ def decom_test_data() -> xr.Dataset:
|
|
|
30
35
|
dataset : xarray.Dataset
|
|
31
36
|
A ``xarray`` dataset containing the test data
|
|
32
37
|
"""
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
38
|
+
return PacketParser(TEST_L0_FILE, "001").data
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@pytest.fixture(scope="session")
|
|
42
|
+
def l1a_example_data(_download_test_data):
|
|
43
|
+
"""
|
|
44
|
+
Pytest fixture to load example L1A data (produced by the IDEX team) for testing.
|
|
45
|
+
|
|
46
|
+
Returns
|
|
47
|
+
-------
|
|
48
|
+
dict
|
|
49
|
+
A dictionary containing the 6 waveform and telemetry arrays
|
|
50
|
+
"""
|
|
51
|
+
return load_hdf_file(L1A_EXAMPLE_FILE)
|
|
37
52
|
|
|
38
53
|
|
|
39
54
|
def get_spice_data_side_effect_func(l1a_ds, idex_attrs):
|
|
@@ -48,3 +63,44 @@ def get_spice_data_side_effect_func(l1a_ds, idex_attrs):
|
|
|
48
63
|
)
|
|
49
64
|
for name in SPICE_ARRAYS
|
|
50
65
|
}
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def load_hdf_file(path: str) -> xr.Dataset:
|
|
69
|
+
"""
|
|
70
|
+
Loads an HDF5 file produced by the IDEX team into a dataset.
|
|
71
|
+
|
|
72
|
+
Parameters
|
|
73
|
+
----------
|
|
74
|
+
path : str
|
|
75
|
+
The file path to the HDF5 file.
|
|
76
|
+
|
|
77
|
+
Returns
|
|
78
|
+
-------
|
|
79
|
+
dataset
|
|
80
|
+
A dataset containing the extracted data.
|
|
81
|
+
"""
|
|
82
|
+
# Load hdf5 data into a datatree
|
|
83
|
+
datatree = xr.open_datatree(path, engine="netcdf4")
|
|
84
|
+
datasets = []
|
|
85
|
+
# Sort datatree by the event number
|
|
86
|
+
datatree = sorted(datatree.items(), key=lambda x: int(x[0]))
|
|
87
|
+
# Iterate through every nested tree in the datatree (Each nested tree represents
|
|
88
|
+
# data from one event).
|
|
89
|
+
# Rename the dimensions across every tree to be the same
|
|
90
|
+
# Add an "event" dimension which will allow them all to be concatenated together.
|
|
91
|
+
for event, tree in datatree:
|
|
92
|
+
event_num = int(event)
|
|
93
|
+
# Extract the metadata
|
|
94
|
+
metadata = tree.Metadata.to_dataset().expand_dims({"event": [event_num]})
|
|
95
|
+
ds = tree.to_dataset()
|
|
96
|
+
# Sort dimensions by shape. The high sampling time dimension is always less
|
|
97
|
+
# than the low sampling time.
|
|
98
|
+
dims = [k for k, v in sorted(ds.dims.items(), key=lambda item: item[1])]
|
|
99
|
+
ds = ds.rename({dims[0]: "time_low", dims[1]: "time_high"}).expand_dims(
|
|
100
|
+
{"event": [event_num]}
|
|
101
|
+
)
|
|
102
|
+
datasets.append(xr.merge([ds, metadata]))
|
|
103
|
+
|
|
104
|
+
example_dataset = xr.concat(datasets, dim="event")
|
|
105
|
+
|
|
106
|
+
return example_dataset
|
|
Binary file
|