imap-processing 0.11.0__py3-none-any.whl → 0.13.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 +11 -11
- imap_processing/_version.py +2 -2
- imap_processing/ccsds/ccsds_data.py +1 -2
- imap_processing/ccsds/excel_to_xtce.py +66 -18
- imap_processing/cdf/config/imap_codice_global_cdf_attrs.yaml +24 -40
- imap_processing/cdf/config/imap_codice_l1a_variable_attrs.yaml +934 -42
- imap_processing/cdf/config/imap_codice_l1b_variable_attrs.yaml +1846 -128
- 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 +27 -14
- 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 +25 -9
- imap_processing/cdf/config/imap_idex_l1a_variable_attrs.yaml +6 -4
- imap_processing/cdf/config/imap_idex_l1b_variable_attrs.yaml +3 -3
- 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 +23 -20
- 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_swapi_variable_attrs.yaml +22 -0
- 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 +64 -52
- imap_processing/cdf/config/imap_swe_l2_variable_attrs.yaml +71 -47
- imap_processing/cdf/config/imap_ultra_global_cdf_attrs.yaml +180 -19
- imap_processing/cdf/config/imap_ultra_l1a_variable_attrs.yaml +5045 -41
- imap_processing/cdf/config/imap_ultra_l1b_variable_attrs.yaml +80 -17
- imap_processing/cdf/config/imap_ultra_l1c_variable_attrs.yaml +32 -57
- imap_processing/cdf/utils.py +52 -38
- imap_processing/cli.py +477 -233
- imap_processing/codice/codice_l1a.py +466 -131
- imap_processing/codice/codice_l1b.py +51 -152
- imap_processing/codice/constants.py +1360 -569
- imap_processing/codice/decompress.py +2 -6
- imap_processing/ena_maps/ena_maps.py +1103 -146
- 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 +55 -52
- imap_processing/glows/l1a/glows_l1a.py +28 -99
- imap_processing/glows/l1a/glows_l1a_data.py +2 -2
- imap_processing/glows/l1b/glows_l1b.py +1 -4
- imap_processing/glows/l1b/glows_l1b_data.py +1 -3
- imap_processing/glows/l2/glows_l2.py +2 -5
- imap_processing/hi/l1a/hi_l1a.py +54 -29
- 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 +111 -82
- imap_processing/hi/l1c/hi_l1c.py +416 -32
- imap_processing/hi/utils.py +58 -12
- imap_processing/hit/ancillary/imap_hit_l1b-to-l2-sector-dt0-factors_20250219_v002.csv +81 -0
- 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 +235 -5
- imap_processing/hit/l0/constants.py +20 -11
- imap_processing/hit/l0/decom_hit.py +21 -5
- imap_processing/hit/l1a/hit_l1a.py +71 -75
- imap_processing/hit/l1b/constants.py +321 -0
- imap_processing/hit/l1b/hit_l1b.py +377 -67
- imap_processing/hit/l2/constants.py +318 -0
- imap_processing/hit/l2/hit_l2.py +723 -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 +374 -0
- imap_processing/ialirt/l0/process_swapi.py +69 -0
- imap_processing/ialirt/l0/process_swe.py +548 -0
- imap_processing/ialirt/packet_definitions/ialirt.xml +216 -208
- imap_processing/ialirt/packet_definitions/ialirt_codicehi.xml +1 -1
- imap_processing/ialirt/packet_definitions/ialirt_codicelo.xml +1 -1
- imap_processing/ialirt/packet_definitions/ialirt_mag.xml +115 -0
- imap_processing/ialirt/packet_definitions/ialirt_swapi.xml +14 -14
- 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 +33 -0
- imap_processing/idex/idex_l0.py +22 -8
- imap_processing/idex/idex_l1a.py +81 -51
- imap_processing/idex/idex_l1b.py +13 -39
- imap_processing/idex/idex_l2a.py +823 -0
- imap_processing/idex/idex_l2b.py +120 -0
- imap_processing/idex/idex_variable_unpacking_and_eu_conversion.csv +11 -11
- imap_processing/idex/packet_definitions/idex_housekeeping_packet_definition.xml +9130 -0
- imap_processing/lo/l0/lo_science.py +7 -2
- imap_processing/lo/l1a/lo_l1a.py +1 -5
- imap_processing/lo/l1b/lo_l1b.py +702 -29
- imap_processing/lo/l1b/tof_conversions.py +11 -0
- imap_processing/lo/l1c/lo_l1c.py +1 -4
- imap_processing/mag/constants.py +51 -0
- imap_processing/mag/imap_mag_sdc_configuration_v001.py +8 -0
- imap_processing/mag/l0/decom_mag.py +10 -3
- imap_processing/mag/l1a/mag_l1a.py +23 -19
- imap_processing/mag/l1a/mag_l1a_data.py +35 -10
- imap_processing/mag/l1b/mag_l1b.py +259 -50
- imap_processing/mag/l1c/interpolation_methods.py +388 -0
- imap_processing/mag/l1c/mag_l1c.py +621 -17
- imap_processing/mag/l2/mag_l2.py +140 -0
- imap_processing/mag/l2/mag_l2_data.py +288 -0
- imap_processing/quality_flags.py +1 -0
- imap_processing/spacecraft/packet_definitions/scid_x252.xml +538 -0
- imap_processing/spacecraft/quaternions.py +121 -0
- imap_processing/spice/geometry.py +19 -22
- imap_processing/spice/kernels.py +0 -276
- imap_processing/spice/pointing_frame.py +257 -0
- imap_processing/spice/repoint.py +149 -0
- imap_processing/spice/spin.py +38 -33
- imap_processing/spice/time.py +24 -0
- imap_processing/swapi/l1/swapi_l1.py +20 -12
- imap_processing/swapi/l2/swapi_l2.py +116 -5
- imap_processing/swapi/swapi_utils.py +32 -0
- imap_processing/swe/l1a/swe_l1a.py +44 -12
- imap_processing/swe/l1a/swe_science.py +13 -13
- imap_processing/swe/l1b/swe_l1b.py +898 -23
- imap_processing/swe/l2/swe_l2.py +75 -136
- imap_processing/swe/packet_definitions/swe_packet_definition.xml +1121 -1
- imap_processing/swe/utils/swe_constants.py +64 -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 +24 -21
- imap_processing/tests/cdf/test_data/imap_instrument2_global_cdf_attrs.yaml +0 -2
- imap_processing/tests/cdf/test_utils.py +14 -16
- imap_processing/tests/codice/conftest.py +44 -33
- 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 +126 -53
- imap_processing/tests/codice/test_codice_l1b.py +6 -7
- imap_processing/tests/codice/test_decompress.py +4 -4
- imap_processing/tests/conftest.py +239 -27
- imap_processing/tests/ena_maps/conftest.py +51 -0
- imap_processing/tests/ena_maps/test_ena_maps.py +1068 -110
- imap_processing/tests/ena_maps/test_map_utils.py +66 -43
- imap_processing/tests/ena_maps/test_spatial_utils.py +17 -21
- imap_processing/tests/glows/conftest.py +10 -14
- imap_processing/tests/glows/test_glows_decom.py +4 -4
- imap_processing/tests/glows/test_glows_l1a_cdf.py +6 -27
- imap_processing/tests/glows/test_glows_l1a_data.py +6 -8
- imap_processing/tests/glows/test_glows_l1b.py +11 -11
- imap_processing/tests/glows/test_glows_l1b_data.py +5 -5
- imap_processing/tests/glows/test_glows_l2.py +2 -8
- imap_processing/tests/hi/conftest.py +1 -1
- 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 +22 -27
- imap_processing/tests/hi/test_hi_l1c.py +249 -18
- imap_processing/tests/hi/test_l1a.py +35 -7
- imap_processing/tests/hi/test_science_direct_event.py +3 -3
- imap_processing/tests/hi/test_utils.py +24 -2
- imap_processing/tests/hit/helpers/l1_validation.py +74 -73
- 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 +5 -1
- imap_processing/tests/hit/test_hit_l1a.py +32 -36
- imap_processing/tests/hit/test_hit_l1b.py +300 -81
- imap_processing/tests/hit/test_hit_l2.py +716 -0
- imap_processing/tests/hit/test_hit_utils.py +184 -7
- imap_processing/tests/hit/validation_data/hit_l1b_standard_sample2_nsrl_v4_3decimals.csv +62 -62
- 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/hit/validation_data/sci_sample_raw.csv +1 -1
- imap_processing/tests/ialirt/data/l0/461971383-404.bin +0 -0
- imap_processing/tests/ialirt/data/l0/461971384-405.bin +0 -0
- imap_processing/tests/ialirt/data/l0/461971385-406.bin +0 -0
- imap_processing/tests/ialirt/data/l0/461971386-407.bin +0 -0
- imap_processing/tests/ialirt/data/l0/461971387-408.bin +0 -0
- imap_processing/tests/ialirt/data/l0/461971388-409.bin +0 -0
- imap_processing/tests/ialirt/data/l0/461971389-410.bin +0 -0
- imap_processing/tests/ialirt/data/l0/461971390-411.bin +0 -0
- imap_processing/tests/ialirt/data/l0/461971391-412.bin +0 -0
- imap_processing/tests/ialirt/data/l0/sample_decoded_i-alirt_data.csv +383 -0
- imap_processing/tests/ialirt/unit/test_decom_ialirt.py +16 -81
- imap_processing/tests/ialirt/unit/test_grouping.py +81 -0
- imap_processing/tests/ialirt/unit/test_parse_mag.py +223 -0
- imap_processing/tests/ialirt/unit/test_process_codicehi.py +3 -3
- imap_processing/tests/ialirt/unit/test_process_codicelo.py +3 -10
- imap_processing/tests/ialirt/unit/test_process_ephemeris.py +4 -4
- imap_processing/tests/ialirt/unit/test_process_hit.py +3 -3
- imap_processing/tests/ialirt/unit/test_process_swapi.py +24 -16
- imap_processing/tests/ialirt/unit/test_process_swe.py +319 -6
- imap_processing/tests/ialirt/unit/test_time.py +16 -0
- imap_processing/tests/idex/conftest.py +127 -6
- imap_processing/tests/idex/test_data/imap_idex_l0_raw_20231218_v001.pkts +0 -0
- imap_processing/tests/idex/test_data/imap_idex_l0_raw_20241206_v001.pkts +0 -0
- imap_processing/tests/idex/test_data/imap_idex_l0_raw_20250108_v001.pkts +0 -0
- imap_processing/tests/idex/test_data/impact_14_tof_high_data.txt +4508 -4508
- imap_processing/tests/idex/test_idex_l0.py +33 -11
- imap_processing/tests/idex/test_idex_l1a.py +92 -21
- imap_processing/tests/idex/test_idex_l1b.py +106 -27
- imap_processing/tests/idex/test_idex_l2a.py +399 -0
- imap_processing/tests/idex/test_idex_l2b.py +93 -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_l1a.py +3 -3
- imap_processing/tests/lo/test_lo_l1b.py +515 -6
- imap_processing/tests/lo/test_lo_l1c.py +1 -1
- imap_processing/tests/lo/test_lo_science.py +7 -7
- imap_processing/tests/lo/test_star_sensor.py +1 -1
- imap_processing/tests/mag/conftest.py +120 -2
- imap_processing/tests/mag/test_mag_decom.py +5 -4
- imap_processing/tests/mag/test_mag_l1a.py +51 -7
- imap_processing/tests/mag/test_mag_l1b.py +40 -59
- imap_processing/tests/mag/test_mag_l1c.py +354 -19
- imap_processing/tests/mag/test_mag_l2.py +130 -0
- imap_processing/tests/mag/test_mag_validation.py +247 -26
- 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/L1c/T013/mag-l1b-l1c-t013-magi-normal-in.csv +1217 -0
- imap_processing/tests/mag/validation/L1c/T013/mag-l1b-l1c-t013-magi-normal-out.csv +1857 -0
- imap_processing/tests/mag/validation/L1c/T013/mag-l1b-l1c-t013-mago-normal-in.csv +1217 -0
- imap_processing/tests/mag/validation/L1c/T013/mag-l1b-l1c-t013-mago-normal-out.csv +1857 -0
- imap_processing/tests/mag/validation/L1c/T014/mag-l1b-l1c-t014-magi-normal-in.csv +1217 -0
- imap_processing/tests/mag/validation/L1c/T014/mag-l1b-l1c-t014-magi-normal-out.csv +1793 -0
- imap_processing/tests/mag/validation/L1c/T014/mag-l1b-l1c-t014-mago-normal-in.csv +1217 -0
- imap_processing/tests/mag/validation/L1c/T014/mag-l1b-l1c-t014-mago-normal-out.csv +1793 -0
- imap_processing/tests/mag/validation/L1c/T015/mag-l1b-l1c-t015-magi-burst-in.csv +2561 -0
- imap_processing/tests/mag/validation/L1c/T015/mag-l1b-l1c-t015-magi-normal-in.csv +961 -0
- imap_processing/tests/mag/validation/L1c/T015/mag-l1b-l1c-t015-magi-normal-out.csv +1539 -0
- imap_processing/tests/mag/validation/L1c/T015/mag-l1b-l1c-t015-mago-normal-in.csv +1921 -0
- imap_processing/tests/mag/validation/L1c/T015/mag-l1b-l1c-t015-mago-normal-out.csv +2499 -0
- imap_processing/tests/mag/validation/L1c/T016/mag-l1b-l1c-t016-magi-normal-in.csv +865 -0
- imap_processing/tests/mag/validation/L1c/T016/mag-l1b-l1c-t016-magi-normal-out.csv +1196 -0
- imap_processing/tests/mag/validation/L1c/T016/mag-l1b-l1c-t016-mago-normal-in.csv +1729 -0
- imap_processing/tests/mag/validation/L1c/T016/mag-l1b-l1c-t016-mago-normal-out.csv +3053 -0
- imap_processing/tests/mag/validation/L2/imap_mag_l1b_norm-mago_20251017_v002.cdf +0 -0
- imap_processing/tests/mag/validation/calibration/imap_mag_l1b-calibration_20240229_v001.cdf +0 -0
- imap_processing/tests/mag/validation/calibration/imap_mag_l2-calibration-matrices_20251017_v004.cdf +0 -0
- imap_processing/tests/mag/validation/calibration/imap_mag_l2-offsets-norm_20251017_20251017_v001.cdf +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_data/fake_spin_data.csv +11 -11
- imap_processing/tests/spice/test_geometry.py +9 -12
- imap_processing/tests/spice/test_kernels.py +1 -200
- imap_processing/tests/spice/test_pointing_frame.py +185 -0
- imap_processing/tests/spice/test_repoint.py +121 -0
- imap_processing/tests/spice/test_spin.py +50 -9
- imap_processing/tests/spice/test_time.py +14 -0
- imap_processing/tests/swapi/lut/imap_swapi_esa-unit-conversion_20250211_v000.csv +73 -0
- imap_processing/tests/swapi/lut/imap_swapi_lut-notes_20250211_v000.csv +1025 -0
- imap_processing/tests/swapi/test_swapi_l1.py +13 -11
- imap_processing/tests/swapi/test_swapi_l2.py +180 -8
- 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/lut/checker-board-indices.csv +24 -0
- imap_processing/tests/swe/lut/imap_swe_esa-lut_20250301_v000.csv +385 -0
- imap_processing/tests/swe/lut/imap_swe_l1b-in-flight-cal_20240510_20260716_v000.csv +3 -0
- imap_processing/tests/swe/test_swe_l1a.py +20 -2
- 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_l1a_science.py +3 -3
- imap_processing/tests/swe/test_swe_l1b.py +162 -24
- imap_processing/tests/swe/test_swe_l2.py +153 -91
- imap_processing/tests/test_cli.py +171 -88
- imap_processing/tests/test_utils.py +140 -17
- 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 +369 -0
- imap_processing/tests/ultra/unit/conftest.py +115 -89
- imap_processing/tests/ultra/unit/test_badtimes.py +4 -4
- imap_processing/tests/ultra/unit/test_cullingmask.py +8 -6
- imap_processing/tests/ultra/unit/test_de.py +14 -13
- imap_processing/tests/ultra/unit/test_decom_apid_880.py +27 -76
- imap_processing/tests/ultra/unit/test_decom_apid_881.py +54 -11
- imap_processing/tests/ultra/unit/test_decom_apid_883.py +12 -10
- imap_processing/tests/ultra/unit/test_decom_apid_896.py +202 -55
- imap_processing/tests/ultra/unit/test_lookup_utils.py +23 -1
- imap_processing/tests/ultra/unit/test_spacecraft_pset.py +77 -0
- imap_processing/tests/ultra/unit/test_ultra_l1a.py +98 -305
- imap_processing/tests/ultra/unit/test_ultra_l1b.py +60 -14
- imap_processing/tests/ultra/unit/test_ultra_l1b_annotated.py +2 -2
- imap_processing/tests/ultra/unit/test_ultra_l1b_culling.py +26 -27
- imap_processing/tests/ultra/unit/test_ultra_l1b_extended.py +239 -70
- imap_processing/tests/ultra/unit/test_ultra_l1c.py +5 -5
- imap_processing/tests/ultra/unit/test_ultra_l1c_pset_bins.py +114 -83
- imap_processing/tests/ultra/unit/test_ultra_l2.py +230 -0
- imap_processing/ultra/constants.py +1 -1
- imap_processing/ultra/l0/decom_tools.py +27 -39
- imap_processing/ultra/l0/decom_ultra.py +168 -204
- imap_processing/ultra/l0/ultra_utils.py +152 -136
- imap_processing/ultra/l1a/ultra_l1a.py +55 -271
- imap_processing/ultra/l1b/badtimes.py +1 -4
- imap_processing/ultra/l1b/cullingmask.py +2 -6
- imap_processing/ultra/l1b/de.py +116 -57
- imap_processing/ultra/l1b/extendedspin.py +20 -18
- imap_processing/ultra/l1b/lookup_utils.py +72 -9
- imap_processing/ultra/l1b/ultra_l1b.py +36 -16
- imap_processing/ultra/l1b/ultra_l1b_culling.py +66 -30
- imap_processing/ultra/l1b/ultra_l1b_extended.py +297 -94
- imap_processing/ultra/l1c/histogram.py +2 -6
- imap_processing/ultra/l1c/spacecraft_pset.py +84 -0
- imap_processing/ultra/l1c/ultra_l1c.py +8 -9
- imap_processing/ultra/l1c/ultra_l1c_pset_bins.py +206 -108
- imap_processing/ultra/l2/ultra_l2.py +299 -0
- imap_processing/ultra/lookup_tables/Angular_Profiles_FM45_LeftSlit.csv +526 -0
- imap_processing/ultra/lookup_tables/Angular_Profiles_FM45_RightSlit.csv +526 -0
- imap_processing/ultra/lookup_tables/Angular_Profiles_FM90_LeftSlit.csv +526 -0
- imap_processing/ultra/lookup_tables/Angular_Profiles_FM90_RightSlit.csv +526 -0
- imap_processing/ultra/lookup_tables/FM45_Startup1_ULTRA_IMGPARAMS_20240719.csv +2 -2
- imap_processing/ultra/lookup_tables/FM90_Startup1_ULTRA_IMGPARAMS_20240719.csv +2 -0
- imap_processing/ultra/packet_definitions/README.md +38 -0
- imap_processing/ultra/packet_definitions/ULTRA_SCI_COMBINED.xml +15302 -482
- imap_processing/ultra/utils/ultra_l1_utils.py +31 -12
- imap_processing/utils.py +69 -29
- {imap_processing-0.11.0.dist-info → imap_processing-0.13.0.dist-info}/METADATA +10 -6
- imap_processing-0.13.0.dist-info/RECORD +578 -0
- imap_processing/cdf/config/imap_mag_l1_variable_attrs.yaml +0 -237
- imap_processing/hi/l1a/housekeeping.py +0 -27
- imap_processing/hi/l1b/hi_eng_unit_convert_table.csv +0 -154
- imap_processing/swe/l1b/swe_esa_lookup_table.csv +0 -1441
- imap_processing/swe/l1b/swe_l1b_science.py +0 -652
- 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/swe/test_swe_l1b_science.py +0 -84
- imap_processing/tests/ultra/test_data/mock_data.py +0 -161
- imap_processing/ultra/l1c/pset.py +0 -40
- imap_processing/ultra/lookup_tables/dps_sensitivity45.cdf +0 -0
- imap_processing-0.11.0.dist-info/RECORD +0 -488
- /imap_processing/idex/packet_definitions/{idex_packet_definition.xml → idex_science_packet_definition.xml} +0 -0
- /imap_processing/tests/ialirt/{test_data → data}/l0/20240827095047_SWE_IALIRT_packet.bin +0 -0
- /imap_processing/tests/ialirt/{test_data → data}/l0/BinLog CCSDS_FRAG_TLM_20240826_152323Z_IALIRT_data_for_SDC.bin +0 -0
- /imap_processing/tests/ialirt/{test_data → data}/l0/IALiRT Raw Packet Telemetry.txt +0 -0
- /imap_processing/tests/ialirt/{test_data → data}/l0/apid01152.tlm +0 -0
- /imap_processing/tests/ialirt/{test_data → data}/l0/eu_SWP_IAL_20240826_152033.csv +0 -0
- /imap_processing/tests/ialirt/{test_data → data}/l0/hi_fsw_view_1_ccsds.bin +0 -0
- /imap_processing/tests/ialirt/{test_data → data}/l0/hit_ialirt_sample.ccsds +0 -0
- /imap_processing/tests/ialirt/{test_data → data}/l0/hit_ialirt_sample.csv +0 -0
- /imap_processing/tests/ialirt/{test_data → data}/l0/idle_export_eu.SWE_IALIRT_20240827_093852.csv +0 -0
- /imap_processing/tests/ialirt/{test_data → data}/l0/imap_codice_l1a_hi-ialirt_20240523200000_v0.0.0.cdf +0 -0
- /imap_processing/tests/ialirt/{test_data → data}/l0/imap_codice_l1a_lo-ialirt_20241110193700_v0.0.0.cdf +0 -0
- /imap_processing/{mag/l1b → tests/spacecraft}/__init__.py +0 -0
- /imap_processing/{swe/l1b/engineering_unit_convert_table.csv → tests/swe/lut/imap_swe_eu-conversion_20240510_v000.csv} +0 -0
- /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.13.0.dist-info}/LICENSE +0 -0
- {imap_processing-0.11.0.dist-info → imap_processing-0.13.0.dist-info}/WHEEL +0 -0
- {imap_processing-0.11.0.dist-info → imap_processing-0.13.0.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""Lo TOF EU Conversions."""
|
|
2
|
+
|
|
3
|
+
from collections import namedtuple
|
|
4
|
+
|
|
5
|
+
tof_conv = namedtuple("tof_conv", ["C0", "C1"])
|
|
6
|
+
# TOF conversion coefficients from Lo's TOF Conversion_annotated.docx
|
|
7
|
+
# TODO: Ask Lo to put these in the algorithm document for better reference
|
|
8
|
+
TOF0_CONV = tof_conv(C0=5.52524e-01, C1=1.68374e-01)
|
|
9
|
+
TOF1_CONV = tof_conv(C0=-7.20181e-01, C1=1.65124e-01)
|
|
10
|
+
TOF2_CONV = tof_conv(C0=3.74422e-01, C1=1.66409e-01)
|
|
11
|
+
TOF3_CONV = tof_conv(C0=4.41970e-01, C1=1.72024e-01)
|
imap_processing/lo/l1c/lo_l1c.py
CHANGED
|
@@ -11,7 +11,7 @@ from imap_processing.cdf.imap_cdf_manager import ImapCdfAttributes
|
|
|
11
11
|
from imap_processing.spice.time import met_to_ttj2000ns
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
def lo_l1c(dependencies: dict
|
|
14
|
+
def lo_l1c(dependencies: dict) -> list[Path]:
|
|
15
15
|
"""
|
|
16
16
|
Will process IMAP-Lo L1B data into L1C CDF data products.
|
|
17
17
|
|
|
@@ -19,8 +19,6 @@ def lo_l1c(dependencies: dict, data_version: str) -> list[Path]:
|
|
|
19
19
|
----------
|
|
20
20
|
dependencies : dict
|
|
21
21
|
Dictionary of datasets needed for L1C data product creation in xarray Datasets.
|
|
22
|
-
data_version : str
|
|
23
|
-
Version of the data product being created.
|
|
24
22
|
|
|
25
23
|
Returns
|
|
26
24
|
-------
|
|
@@ -31,7 +29,6 @@ def lo_l1c(dependencies: dict, data_version: str) -> list[Path]:
|
|
|
31
29
|
attr_mgr = ImapCdfAttributes()
|
|
32
30
|
attr_mgr.add_instrument_global_attrs(instrument="lo")
|
|
33
31
|
attr_mgr.add_instrument_variable_attrs(instrument="lo", level="l1c")
|
|
34
|
-
attr_mgr.add_global_attribute("Data_version", data_version)
|
|
35
32
|
|
|
36
33
|
# if the dependencies are used to create Annotated Direct Events
|
|
37
34
|
if "imap_lo_l1b_de" in dependencies:
|
imap_processing/mag/constants.py
CHANGED
|
@@ -59,6 +59,31 @@ class PrimarySensor(Enum):
|
|
|
59
59
|
MAGI = 1
|
|
60
60
|
|
|
61
61
|
|
|
62
|
+
class VecSec(Enum):
|
|
63
|
+
"""Enum for all valid vector rates (Vectors per second)."""
|
|
64
|
+
|
|
65
|
+
ONE_VEC_PER_S = 1
|
|
66
|
+
TWO_VECS_PER_S = 2
|
|
67
|
+
FOUR_VECS_PER_S = 4
|
|
68
|
+
EIGHT_VECS_PER_S = 8
|
|
69
|
+
SIXTEEN_VECS_PER_S = 16
|
|
70
|
+
THIRTY_TWO_VECS_PER_S = 32
|
|
71
|
+
SIXTY_FOUR_VECS_PER_S = 64
|
|
72
|
+
ONE_TWENTY_EIGHT_VECS_PER_S = 128
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
# Possible sensor rates
|
|
76
|
+
POSSIBLE_RATES = [e.value for e in VecSec]
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
class ModeFlags(Enum):
|
|
80
|
+
"""Enum for MAG mode flags: burst and normal (BURST + NORM)."""
|
|
81
|
+
|
|
82
|
+
NORM = 0
|
|
83
|
+
BURST = 1
|
|
84
|
+
MISSING = -1
|
|
85
|
+
|
|
86
|
+
|
|
62
87
|
FIBONACCI_SEQUENCE = [
|
|
63
88
|
1,
|
|
64
89
|
2,
|
|
@@ -106,3 +131,29 @@ MAX_FINE_TIME = np.iinfo(np.uint16).max # maximum 16 bit unsigned int
|
|
|
106
131
|
AXIS_COUNT = 3
|
|
107
132
|
RANGE_BIT_WIDTH = 2
|
|
108
133
|
MAX_COMPRESSED_VECTOR_BITS = 60
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def vectors_per_second_from_string(vecsec_string: str) -> dict:
|
|
137
|
+
"""
|
|
138
|
+
Extract the vectors per second from a string into a dictionary.
|
|
139
|
+
|
|
140
|
+
Dictionary format: {start_time: vecsec, start_time: vecsec}.
|
|
141
|
+
|
|
142
|
+
Parameters
|
|
143
|
+
----------
|
|
144
|
+
vecsec_string : str
|
|
145
|
+
A string of the form "start:vecsec,start:vecsec" where start is the time in
|
|
146
|
+
nanoseconds and vecsec is the number of vectors per second.
|
|
147
|
+
|
|
148
|
+
Returns
|
|
149
|
+
-------
|
|
150
|
+
dict
|
|
151
|
+
A dictionary of the form {start_time: vecsec, start_time: vecsec}.
|
|
152
|
+
"""
|
|
153
|
+
vecsec_dict = {}
|
|
154
|
+
vecsec_segments = vecsec_string.split(",")
|
|
155
|
+
for vecsec_segment in vecsec_segments:
|
|
156
|
+
start_time, vecsec = vecsec_segment.split(":")
|
|
157
|
+
vecsec_dict[int(start_time)] = int(vecsec)
|
|
158
|
+
|
|
159
|
+
return vecsec_dict
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"""File describing configuration changes that are not expected to change often."""
|
|
2
|
+
|
|
3
|
+
# interpolation method used in L1C processing
|
|
4
|
+
L1C_INTERPOLATION_METHOD = "linear_filtered"
|
|
5
|
+
|
|
6
|
+
# Setting for L2 output
|
|
7
|
+
# if this setting is updated, the dependency settings for L2 will also need to change.
|
|
8
|
+
ALWAYS_OUTPUT_MAGO = True
|
|
@@ -164,12 +164,19 @@ def generate_dataset(
|
|
|
164
164
|
|
|
165
165
|
for key, value in support_data.items():
|
|
166
166
|
# Time varying values
|
|
167
|
-
if key not in [
|
|
168
|
-
|
|
167
|
+
if key not in [
|
|
168
|
+
"SHCOARSE",
|
|
169
|
+
"VECTORS",
|
|
170
|
+
"PUS_SPARE1",
|
|
171
|
+
"PUS_SPARE2",
|
|
172
|
+
"SPARE1",
|
|
173
|
+
"SPARE2",
|
|
174
|
+
]:
|
|
175
|
+
output[key.lower()] = xr.DataArray(
|
|
169
176
|
value,
|
|
170
177
|
name=key.lower(),
|
|
171
178
|
dims=["epoch"],
|
|
172
|
-
attrs=attribute_manager.get_variable_attributes(key),
|
|
179
|
+
attrs=attribute_manager.get_variable_attributes(key.lower()),
|
|
173
180
|
)
|
|
174
181
|
|
|
175
182
|
return output
|
|
@@ -24,7 +24,7 @@ from imap_processing.spice.time import (
|
|
|
24
24
|
logger = logging.getLogger(__name__)
|
|
25
25
|
|
|
26
26
|
|
|
27
|
-
def mag_l1a(packet_filepath: Path
|
|
27
|
+
def mag_l1a(packet_filepath: Path) -> list[xr.Dataset]:
|
|
28
28
|
"""
|
|
29
29
|
Will process MAG L0 data into L1A CDF files at cdf_filepath.
|
|
30
30
|
|
|
@@ -32,8 +32,6 @@ def mag_l1a(packet_filepath: Path, data_version: str) -> list[xr.Dataset]:
|
|
|
32
32
|
----------
|
|
33
33
|
packet_filepath : pathlib.Path
|
|
34
34
|
Packet files for processing.
|
|
35
|
-
data_version : str
|
|
36
|
-
Data version to write to CDF files.
|
|
37
35
|
|
|
38
36
|
Returns
|
|
39
37
|
-------
|
|
@@ -50,9 +48,7 @@ def mag_l1a(packet_filepath: Path, data_version: str) -> list[xr.Dataset]:
|
|
|
50
48
|
# Create attribute manager and add MAG L1A attributes and global variables
|
|
51
49
|
attribute_manager = ImapCdfAttributes()
|
|
52
50
|
attribute_manager.add_instrument_global_attrs("mag")
|
|
53
|
-
attribute_manager.add_instrument_variable_attrs("mag", "
|
|
54
|
-
|
|
55
|
-
attribute_manager.add_global_attribute("Data_version", data_version)
|
|
51
|
+
attribute_manager.add_instrument_variable_attrs("mag", "l1a")
|
|
56
52
|
attribute_manager.add_global_attribute("Input_files", str(input_files))
|
|
57
53
|
attribute_manager.add_global_attribute(
|
|
58
54
|
"Generation_date",
|
|
@@ -179,7 +175,7 @@ def process_packets(
|
|
|
179
175
|
# each sensor, we can calculate how much data is in this packet and where the
|
|
180
176
|
# byte boundaries are.
|
|
181
177
|
primary_vectors, secondary_vectors = MagL1a.process_vector_data(
|
|
182
|
-
mag_l0.VECTORS,
|
|
178
|
+
mag_l0.VECTORS,
|
|
183
179
|
primary_packet_properties.total_vectors,
|
|
184
180
|
secondary_packet_data.total_vectors,
|
|
185
181
|
mag_l0.COMPRESSION,
|
|
@@ -276,11 +272,6 @@ def generate_dataset(
|
|
|
276
272
|
dataset : xarray.Dataset
|
|
277
273
|
One xarray dataset with proper CDF attributes and shape containing MAG L1A data.
|
|
278
274
|
"""
|
|
279
|
-
# TODO: add:
|
|
280
|
-
# gaps_in_data global attr
|
|
281
|
-
# magl1avectordefinition data
|
|
282
|
-
|
|
283
|
-
# TODO: Just leave time in datetime64 type with vector as dtype object to avoid this
|
|
284
275
|
# Get the timestamp from the end of the vector
|
|
285
276
|
time_data = single_file_l1a.vectors[:, 4]
|
|
286
277
|
|
|
@@ -288,18 +279,20 @@ def generate_dataset(
|
|
|
288
279
|
np.arange(2),
|
|
289
280
|
name="compression",
|
|
290
281
|
dims=["compression"],
|
|
291
|
-
attrs=attribute_manager.get_variable_attributes(
|
|
282
|
+
attrs=attribute_manager.get_variable_attributes(
|
|
283
|
+
"compression_attrs", check_schema=False
|
|
284
|
+
),
|
|
292
285
|
)
|
|
293
286
|
|
|
294
287
|
direction = xr.DataArray(
|
|
295
288
|
np.arange(4),
|
|
296
289
|
name="direction",
|
|
297
290
|
dims=["direction"],
|
|
298
|
-
attrs=attribute_manager.get_variable_attributes(
|
|
291
|
+
attrs=attribute_manager.get_variable_attributes(
|
|
292
|
+
"direction_attrs", check_schema=False
|
|
293
|
+
),
|
|
299
294
|
)
|
|
300
295
|
|
|
301
|
-
# TODO: Epoch here refers to the start of the sample. Confirm that this is
|
|
302
|
-
# what mag is expecting, and if it is, CATDESC needs to be updated.
|
|
303
296
|
epoch_time = xr.DataArray(
|
|
304
297
|
time_data,
|
|
305
298
|
name="epoch",
|
|
@@ -338,6 +331,18 @@ def generate_dataset(
|
|
|
338
331
|
"compression_label", check_schema=False
|
|
339
332
|
),
|
|
340
333
|
)
|
|
334
|
+
global_attributes = attribute_manager.get_global_attributes(logical_file_id)
|
|
335
|
+
global_attributes["is_mago"] = str(bool(single_file_l1a.is_mago))
|
|
336
|
+
global_attributes["is_active"] = str(bool(single_file_l1a.is_active))
|
|
337
|
+
global_attributes["vectors_per_second"] = (
|
|
338
|
+
single_file_l1a.vectors_per_second_attribute()
|
|
339
|
+
)
|
|
340
|
+
# empty arrays are removed in cdflib
|
|
341
|
+
global_attributes["missing_sequences"] = (
|
|
342
|
+
single_file_l1a.missing_sequences
|
|
343
|
+
if single_file_l1a.missing_sequences
|
|
344
|
+
else "None"
|
|
345
|
+
)
|
|
341
346
|
|
|
342
347
|
output = xr.Dataset(
|
|
343
348
|
coords={
|
|
@@ -345,13 +350,12 @@ def generate_dataset(
|
|
|
345
350
|
"direction": direction,
|
|
346
351
|
"compression": compression,
|
|
347
352
|
},
|
|
348
|
-
attrs=
|
|
353
|
+
attrs=global_attributes,
|
|
349
354
|
)
|
|
355
|
+
|
|
350
356
|
output["direction_label"] = direction_label
|
|
351
357
|
output["compression_label"] = compression_label
|
|
352
358
|
output["vectors"] = vectors
|
|
353
359
|
output["compression_flags"] = compression_flags
|
|
354
360
|
|
|
355
|
-
# TODO: Put is_mago and active in the header
|
|
356
|
-
|
|
357
361
|
return output
|
|
@@ -240,6 +240,7 @@ class MagL1a:
|
|
|
240
240
|
decode_fib_zig_zag()
|
|
241
241
|
twos_complement()
|
|
242
242
|
update_compression_array()
|
|
243
|
+
vectors_per_second_attribute()
|
|
243
244
|
"""
|
|
244
245
|
|
|
245
246
|
is_mago: bool
|
|
@@ -285,7 +286,8 @@ class MagL1a:
|
|
|
285
286
|
vector_sequence = packet_properties.src_seq_ctr
|
|
286
287
|
|
|
287
288
|
self.vectors = np.concatenate([self.vectors, additional_vectors])
|
|
288
|
-
|
|
289
|
+
start_time = np.int64(met_to_ttj2000ns(packet_properties.shcoarse))
|
|
290
|
+
self.packet_definitions[start_time] = packet_properties
|
|
289
291
|
|
|
290
292
|
# Every additional packet should be the next one in the sequence, if not, add
|
|
291
293
|
# the missing sequence(s) to the gap data
|
|
@@ -349,9 +351,7 @@ class MagL1a:
|
|
|
349
351
|
cdf.utils.met_to_j2000ns.
|
|
350
352
|
"""
|
|
351
353
|
timedelta = np.timedelta64(int(1 / vectors_per_sec * 1e9), "ns")
|
|
352
|
-
# TODO: From finetime and coarsetime, depends per packet
|
|
353
354
|
start_time_ns = start_time.to_j2000ns()
|
|
354
|
-
|
|
355
355
|
# Calculate time skips for each vector in ns
|
|
356
356
|
times = np.reshape(
|
|
357
357
|
np.arange(
|
|
@@ -368,7 +368,7 @@ class MagL1a:
|
|
|
368
368
|
|
|
369
369
|
@staticmethod
|
|
370
370
|
def process_vector_data(
|
|
371
|
-
vector_data: np.ndarray,
|
|
371
|
+
vector_data: np.ndarray | bytes,
|
|
372
372
|
primary_count: int,
|
|
373
373
|
secondary_count: int,
|
|
374
374
|
compression: int,
|
|
@@ -679,10 +679,9 @@ class MagL1a:
|
|
|
679
679
|
primary_boundaries[-1] - primary_boundaries[-4]
|
|
680
680
|
> MAX_COMPRESSED_VECTOR_BITS
|
|
681
681
|
)
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
)
|
|
682
|
+
) or (
|
|
683
|
+
vector_count == 2
|
|
684
|
+
and primary_boundaries[-1] > MAX_COMPRESSED_VECTOR_BITS
|
|
686
685
|
):
|
|
687
686
|
# Since we know how long each uncompressed vector is,
|
|
688
687
|
# we can determine the end of the primary vectors.
|
|
@@ -792,7 +791,7 @@ class MagL1a:
|
|
|
792
791
|
return primary_vectors, secondary_vectors
|
|
793
792
|
|
|
794
793
|
@staticmethod
|
|
795
|
-
def _process_vector_section(
|
|
794
|
+
def _process_vector_section(
|
|
796
795
|
vector_bits: np.ndarray,
|
|
797
796
|
split_bits: list,
|
|
798
797
|
last_index: int,
|
|
@@ -998,7 +997,7 @@ class MagL1a:
|
|
|
998
997
|
"""
|
|
999
998
|
if np.any(vector_data > 1):
|
|
1000
999
|
raise ValueError(
|
|
1001
|
-
"unpack_one_vector method is expecting an array of bits as
|
|
1000
|
+
"unpack_one_vector method is expecting an array of bits as input."
|
|
1002
1001
|
)
|
|
1003
1002
|
|
|
1004
1003
|
if len(vector_data) != width * AXIS_COUNT + RANGE_BIT_WIDTH * has_range:
|
|
@@ -1092,3 +1091,29 @@ class MagL1a:
|
|
|
1092
1091
|
value = int((value >> 1) ^ (-(value & 1)))
|
|
1093
1092
|
|
|
1094
1093
|
return value
|
|
1094
|
+
|
|
1095
|
+
def vectors_per_second_attribute(self) -> str:
|
|
1096
|
+
"""
|
|
1097
|
+
Generate a string describing the vectors per second.
|
|
1098
|
+
|
|
1099
|
+
Format is {start time}:{vectors per second},{start time}:{vectors per second}
|
|
1100
|
+
where it's only included if vectors per second changes.
|
|
1101
|
+
|
|
1102
|
+
Returns
|
|
1103
|
+
-------
|
|
1104
|
+
output_str : str
|
|
1105
|
+
Output string describing the vectors per second in all the packets.
|
|
1106
|
+
"""
|
|
1107
|
+
output_str = ""
|
|
1108
|
+
last_vectors_per_second = None
|
|
1109
|
+
for _, packet in self.packet_definitions.items():
|
|
1110
|
+
vecsec = packet.vectors_per_second
|
|
1111
|
+
time: np.int64 = packet.start_time.to_j2000ns().astype(np.int64)
|
|
1112
|
+
if vecsec != last_vectors_per_second:
|
|
1113
|
+
if output_str == "":
|
|
1114
|
+
output_str = f"{time}:{vecsec}"
|
|
1115
|
+
else:
|
|
1116
|
+
output_str += f",{time}:{vecsec}"
|
|
1117
|
+
last_vectors_per_second = vecsec
|
|
1118
|
+
|
|
1119
|
+
return output_str
|