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
imap_processing/swe/l2/swe_l2.py
CHANGED
|
@@ -11,57 +11,10 @@ import xarray as xr
|
|
|
11
11
|
from imap_processing.cdf.imap_cdf_manager import ImapCdfAttributes
|
|
12
12
|
from imap_processing.spice.geometry import SpiceFrame
|
|
13
13
|
from imap_processing.spice.spin import get_instrument_spin_phase, get_spin_angle
|
|
14
|
-
from imap_processing.swe.utils
|
|
15
|
-
ESA_VOLTAGE_ROW_INDEX_DICT,
|
|
16
|
-
read_lookup_table,
|
|
17
|
-
)
|
|
18
|
-
|
|
19
|
-
# TODO: add these to instrument status summary
|
|
20
|
-
ENERGY_CONVERSION_FACTOR = 4.75
|
|
21
|
-
# 7 CEMs geometric factors in cm^2 sr eV/eV units.
|
|
22
|
-
GEOMETRIC_FACTORS = np.array(
|
|
23
|
-
[
|
|
24
|
-
435e-6,
|
|
25
|
-
599e-6,
|
|
26
|
-
808e-6,
|
|
27
|
-
781e-6,
|
|
28
|
-
876e-6,
|
|
29
|
-
548e-6,
|
|
30
|
-
432e-6,
|
|
31
|
-
]
|
|
32
|
-
)
|
|
33
|
-
ELECTRON_MASS = 9.10938356e-31 # kg
|
|
34
|
-
|
|
35
|
-
# See doc string of calculate_phase_space_density() for more details.
|
|
36
|
-
VELOCITY_CONVERSION_FACTOR = 1.237e31
|
|
37
|
-
# See doc string of calculate_flux() for more details.
|
|
38
|
-
FLUX_CONVERSION_FACTOR = 6.187e30
|
|
39
|
-
|
|
40
|
-
CEM_DETECTORS_ANGLE = np.array([-63, -42, -21, 0, 21, 42, 63])
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
def get_particle_energy() -> npt.NDArray:
|
|
44
|
-
"""
|
|
45
|
-
Get particle energy.
|
|
46
|
-
|
|
47
|
-
Calculate particle energy and add to the lookup table.
|
|
48
|
-
To convert Volts to Energy, multiply ESA voltage in Volts by
|
|
49
|
-
energy conversion factor to get electron energy in eV.
|
|
50
|
-
|
|
51
|
-
Returns
|
|
52
|
-
-------
|
|
53
|
-
lookup_table : pandas.DataFrame
|
|
54
|
-
Lookup table with energy column added.
|
|
55
|
-
"""
|
|
56
|
-
# The lookup table gives voltage applied to analyzers.
|
|
57
|
-
lookup_table = read_lookup_table()
|
|
58
|
-
|
|
59
|
-
# Convert voltage to electron energy in eV by apply conversion factor.
|
|
60
|
-
lookup_table["energy"] = lookup_table["esa_v"].values * ENERGY_CONVERSION_FACTOR
|
|
61
|
-
return lookup_table
|
|
14
|
+
from imap_processing.swe.utils import swe_constants
|
|
62
15
|
|
|
63
16
|
|
|
64
|
-
def calculate_phase_space_density(l1b_dataset: xr.Dataset) ->
|
|
17
|
+
def calculate_phase_space_density(l1b_dataset: xr.Dataset) -> npt.NDArray:
|
|
65
18
|
"""
|
|
66
19
|
Convert counts to phase space density.
|
|
67
20
|
|
|
@@ -73,7 +26,7 @@ def calculate_phase_space_density(l1b_dataset: xr.Dataset) -> xr.Dataset:
|
|
|
73
26
|
Where:
|
|
74
27
|
C / tau = corrected count rate which in the input L1B science data.
|
|
75
28
|
G = geometric factor, in (cm^2 * ster). 7 CEMs geometric factor value.
|
|
76
|
-
eV = eV in electron-volts
|
|
29
|
+
eV = eV in electron-volts.
|
|
77
30
|
E = Energy in Joules. eV * 1.60219e-19(J/eV).
|
|
78
31
|
m = mass of electron (9.10938356e-31 kg).
|
|
79
32
|
s = second.
|
|
@@ -101,53 +54,29 @@ def calculate_phase_space_density(l1b_dataset: xr.Dataset) -> xr.Dataset:
|
|
|
101
54
|
|
|
102
55
|
Returns
|
|
103
56
|
-------
|
|
104
|
-
|
|
57
|
+
phase_space_density : np.ndarray
|
|
105
58
|
Phase space density. We need to call this phase space density because
|
|
106
59
|
there will be density in L3 processing.
|
|
107
60
|
"""
|
|
108
|
-
# Get
|
|
109
|
-
|
|
110
|
-
# Get energy values from lookup table.
|
|
111
|
-
particle_energy = get_particle_energy()
|
|
112
|
-
# Get 720 (24 energy steps x 30 angle) particle energy for each full
|
|
113
|
-
# sweep data.
|
|
114
|
-
particle_energy_data = np.array(
|
|
115
|
-
[
|
|
116
|
-
particle_energy[particle_energy["table_index"] == val]["energy"].tolist()
|
|
117
|
-
for val in esa_table_nums
|
|
118
|
-
]
|
|
119
|
-
)
|
|
120
|
-
particle_energy_data = particle_energy_data.reshape(-1, 24, 30)
|
|
61
|
+
# Get energy values.
|
|
62
|
+
particle_energy_data = l1b_dataset["esa_energy"].values
|
|
121
63
|
|
|
122
64
|
# Calculate phase space density using formula:
|
|
123
65
|
# 2 * (C/tau) / (G * 1.237e31 * eV^2)
|
|
124
66
|
# See doc string for more details.
|
|
125
67
|
density = (2 * l1b_dataset["science_data"]) / (
|
|
126
|
-
GEOMETRIC_FACTORS[np.newaxis, np.newaxis, np.newaxis, :]
|
|
127
|
-
* VELOCITY_CONVERSION_FACTOR
|
|
68
|
+
swe_constants.GEOMETRIC_FACTORS[np.newaxis, np.newaxis, np.newaxis, :]
|
|
69
|
+
* swe_constants.VELOCITY_CONVERSION_FACTOR
|
|
128
70
|
* particle_energy_data[:, :, :, np.newaxis] ** 2
|
|
129
71
|
)
|
|
72
|
+
phase_space_density = density.data
|
|
130
73
|
|
|
131
|
-
|
|
132
|
-
# energy in eV value that flux calculation can use.
|
|
133
|
-
phase_space_density_dataset = xr.Dataset(
|
|
134
|
-
{
|
|
135
|
-
"phase_space_density": (
|
|
136
|
-
["epoch", "esa_step", "spin_sector", "cem_id"],
|
|
137
|
-
density.data,
|
|
138
|
-
),
|
|
139
|
-
"energy_in_eV": (
|
|
140
|
-
["epoch", "esa_step", "spin_sector"],
|
|
141
|
-
particle_energy_data,
|
|
142
|
-
),
|
|
143
|
-
},
|
|
144
|
-
coords=l1b_dataset.coords,
|
|
145
|
-
)
|
|
74
|
+
return phase_space_density
|
|
146
75
|
|
|
147
|
-
return phase_space_density_dataset
|
|
148
76
|
|
|
149
|
-
|
|
150
|
-
|
|
77
|
+
def calculate_flux(
|
|
78
|
+
phase_space_density: np.ndarray, esa_energy: np.ndarray
|
|
79
|
+
) -> npt.NDArray:
|
|
151
80
|
"""
|
|
152
81
|
Calculate flux.
|
|
153
82
|
|
|
@@ -159,7 +88,7 @@ def calculate_flux(l1b_dataset: xr.Dataset) -> npt.NDArray:
|
|
|
159
88
|
Where:
|
|
160
89
|
fv = the phase space density of solar wind electrons
|
|
161
90
|
given by calculate_phase_space_density() result.
|
|
162
|
-
eV = Energy in electron-volts
|
|
91
|
+
eV = Energy in electron-volts.
|
|
163
92
|
E = Energy in Joules. eV * 1.60219e-19(J/eV).
|
|
164
93
|
v = sqrt( (3.20438 * 10e-15 / 9.10938e-31) * eV ) cm/s. See
|
|
165
94
|
calculate_phase_space_density() for this calculation.
|
|
@@ -184,19 +113,20 @@ def calculate_flux(l1b_dataset: xr.Dataset) -> npt.NDArray:
|
|
|
184
113
|
|
|
185
114
|
Parameters
|
|
186
115
|
----------
|
|
187
|
-
|
|
188
|
-
The
|
|
116
|
+
phase_space_density : numpy.ndarray
|
|
117
|
+
The phase space density.
|
|
118
|
+
esa_energy : numpy.ndarray
|
|
119
|
+
The energy values in eV.
|
|
189
120
|
|
|
190
121
|
Returns
|
|
191
122
|
-------
|
|
192
123
|
flux : numpy.ndarray
|
|
193
124
|
Flux values.
|
|
194
125
|
"""
|
|
195
|
-
phase_space_density_ds = calculate_phase_space_density(l1b_dataset)
|
|
196
126
|
flux = (
|
|
197
|
-
FLUX_CONVERSION_FACTOR
|
|
198
|
-
*
|
|
199
|
-
*
|
|
127
|
+
swe_constants.FLUX_CONVERSION_FACTOR
|
|
128
|
+
* esa_energy[:, :, :, np.newaxis]
|
|
129
|
+
* phase_space_density
|
|
200
130
|
)
|
|
201
131
|
return flux
|
|
202
132
|
|
|
@@ -220,22 +150,32 @@ def put_data_into_angle_bins(
|
|
|
220
150
|
Parameters
|
|
221
151
|
----------
|
|
222
152
|
data : numpy.ndarray
|
|
223
|
-
Data to put in bins. Shape:
|
|
153
|
+
Data to put in bins. Shape:
|
|
154
|
+
(full_cycle_data, N_ESA_STEPS, N_ANGLE_BINS, N_CEMS).
|
|
224
155
|
angle_bin_indices : numpy.ndarray
|
|
225
156
|
Indices of angle bins to put data in. Shape:
|
|
226
|
-
(full_cycle_data,
|
|
157
|
+
(full_cycle_data, N_ESA_STEPS, N_ANGLE_BINS).
|
|
227
158
|
|
|
228
159
|
Returns
|
|
229
160
|
-------
|
|
230
161
|
numpy.ndarray
|
|
231
|
-
Data in bins. Shape:
|
|
162
|
+
Data in bins. Shape:
|
|
163
|
+
(full_cycle_data, N_ESA_STEPS, N_ANGLE_BINS, N_CEMS).
|
|
232
164
|
"""
|
|
233
165
|
# Initialize with zeros instead of NaN because np.add.at() does not
|
|
234
166
|
# work with nan values. It results in nan + value = nan
|
|
235
|
-
binned_data = np.zeros(
|
|
167
|
+
binned_data = np.zeros(
|
|
168
|
+
(
|
|
169
|
+
data.shape[0],
|
|
170
|
+
swe_constants.N_ESA_STEPS,
|
|
171
|
+
swe_constants.N_ANGLE_BINS,
|
|
172
|
+
swe_constants.N_CEMS,
|
|
173
|
+
),
|
|
174
|
+
dtype=np.float64,
|
|
175
|
+
)
|
|
236
176
|
|
|
237
177
|
time_indices = np.arange(data.shape[0])[:, None, None]
|
|
238
|
-
energy_indices = np.arange(
|
|
178
|
+
energy_indices = np.arange(swe_constants.N_ESA_STEPS)[None, :, None]
|
|
239
179
|
|
|
240
180
|
# Use np.add.at() to accumulate values into bins
|
|
241
181
|
np.add.at(binned_data, (time_indices, energy_indices, angle_bin_indices), data)
|
|
@@ -312,7 +252,7 @@ def find_angle_bin_indices(
|
|
|
312
252
|
return spin_angle_bins_indices
|
|
313
253
|
|
|
314
254
|
|
|
315
|
-
def swe_l2(l1b_dataset: xr.Dataset
|
|
255
|
+
def swe_l2(l1b_dataset: xr.Dataset) -> xr.Dataset:
|
|
316
256
|
"""
|
|
317
257
|
Will process data to L2.
|
|
318
258
|
|
|
@@ -320,8 +260,6 @@ def swe_l2(l1b_dataset: xr.Dataset, data_version: str) -> xr.Dataset:
|
|
|
320
260
|
----------
|
|
321
261
|
l1b_dataset : xarray.Dataset
|
|
322
262
|
The L1B dataset to process.
|
|
323
|
-
data_version : str
|
|
324
|
-
Version of the data product being created.
|
|
325
263
|
|
|
326
264
|
Returns
|
|
327
265
|
-------
|
|
@@ -331,49 +269,55 @@ def swe_l2(l1b_dataset: xr.Dataset, data_version: str) -> xr.Dataset:
|
|
|
331
269
|
cdf_attributes = ImapCdfAttributes()
|
|
332
270
|
cdf_attributes.add_instrument_global_attrs("swe")
|
|
333
271
|
cdf_attributes.add_instrument_variable_attrs("swe", "l2")
|
|
334
|
-
cdf_attributes.add_global_attribute("Data_version", data_version)
|
|
335
272
|
|
|
336
273
|
# Energy values in eV.
|
|
337
274
|
energy_xr = xr.DataArray(
|
|
338
|
-
np.array(list(ESA_VOLTAGE_ROW_INDEX_DICT.keys()))
|
|
275
|
+
np.array(list(swe_constants.ESA_VOLTAGE_ROW_INDEX_DICT.keys()))
|
|
276
|
+
* swe_constants.ENERGY_CONVERSION_FACTOR,
|
|
339
277
|
name="energy",
|
|
340
278
|
dims=["energy"],
|
|
341
|
-
attrs=cdf_attributes.get_variable_attributes("energy"),
|
|
279
|
+
attrs=cdf_attributes.get_variable_attributes("energy", check_schema=False),
|
|
342
280
|
)
|
|
343
281
|
|
|
344
282
|
energy_label = xr.DataArray(
|
|
345
|
-
np.array(list(ESA_VOLTAGE_ROW_INDEX_DICT.keys())).astype(str),
|
|
283
|
+
np.array(list(swe_constants.ESA_VOLTAGE_ROW_INDEX_DICT.keys())).astype(str),
|
|
346
284
|
name="energy_label",
|
|
347
285
|
dims=["energy"],
|
|
348
|
-
attrs=cdf_attributes.get_variable_attributes(
|
|
286
|
+
attrs=cdf_attributes.get_variable_attributes(
|
|
287
|
+
"energy_label", check_schema=False
|
|
288
|
+
),
|
|
349
289
|
)
|
|
350
290
|
|
|
351
291
|
# Angle of each CEM detectors.
|
|
352
292
|
inst_el_xr = xr.DataArray(
|
|
353
|
-
CEM_DETECTORS_ANGLE,
|
|
293
|
+
swe_constants.CEM_DETECTORS_ANGLE,
|
|
354
294
|
name="inst_el",
|
|
355
295
|
dims=["inst_el"],
|
|
356
|
-
attrs=cdf_attributes.get_variable_attributes("inst_el"),
|
|
296
|
+
attrs=cdf_attributes.get_variable_attributes("inst_el", check_schema=False),
|
|
357
297
|
)
|
|
358
298
|
inst_el_label = xr.DataArray(
|
|
359
|
-
CEM_DETECTORS_ANGLE.astype(str),
|
|
299
|
+
swe_constants.CEM_DETECTORS_ANGLE.astype(str),
|
|
360
300
|
name="inst_el_label",
|
|
361
301
|
dims=["inst_el"],
|
|
362
|
-
attrs=cdf_attributes.get_variable_attributes(
|
|
302
|
+
attrs=cdf_attributes.get_variable_attributes(
|
|
303
|
+
"inst_el_label", check_schema=False
|
|
304
|
+
),
|
|
363
305
|
)
|
|
364
306
|
|
|
365
307
|
# Spin Angle bins storing bin center values.
|
|
366
308
|
inst_az_xr = xr.DataArray(
|
|
367
|
-
np.arange(0, 360, 12) + 6,
|
|
309
|
+
np.arange(0, 360, 12, dtype=np.float32) + 6,
|
|
368
310
|
name="inst_az",
|
|
369
311
|
dims=["inst_az"],
|
|
370
|
-
attrs=cdf_attributes.get_variable_attributes("inst_az"),
|
|
312
|
+
attrs=cdf_attributes.get_variable_attributes("inst_az", check_schema=False),
|
|
371
313
|
)
|
|
372
314
|
inst_az_label = xr.DataArray(
|
|
373
315
|
inst_az_xr.values.astype(str),
|
|
374
316
|
name="inst_az_label",
|
|
375
317
|
dims=["inst_az"],
|
|
376
|
-
attrs=cdf_attributes.get_variable_attributes(
|
|
318
|
+
attrs=cdf_attributes.get_variable_attributes(
|
|
319
|
+
"inst_az_label", check_schema=False
|
|
320
|
+
),
|
|
377
321
|
)
|
|
378
322
|
|
|
379
323
|
dataset = xr.Dataset(
|
|
@@ -399,9 +343,7 @@ def swe_l2(l1b_dataset: xr.Dataset, data_version: str) -> xr.Dataset:
|
|
|
399
343
|
# Calculate phase space density and flux. Store data in shape
|
|
400
344
|
# (epoch, esa_step, spin_sector, cem_id). This is for L3 purposes.
|
|
401
345
|
############################################################
|
|
402
|
-
phase_space_density = calculate_phase_space_density(l1b_dataset)
|
|
403
|
-
"phase_space_density"
|
|
404
|
-
]
|
|
346
|
+
phase_space_density = calculate_phase_space_density(l1b_dataset)
|
|
405
347
|
dataset["phase_space_density_spin_sector"] = xr.DataArray(
|
|
406
348
|
phase_space_density,
|
|
407
349
|
name="phase_space_density_spin_sector",
|
|
@@ -409,7 +351,7 @@ def swe_l2(l1b_dataset: xr.Dataset, data_version: str) -> xr.Dataset:
|
|
|
409
351
|
attrs=cdf_attributes.get_variable_attributes("phase_space_density_spin_sector"),
|
|
410
352
|
)
|
|
411
353
|
|
|
412
|
-
flux = calculate_flux(l1b_dataset)
|
|
354
|
+
flux = calculate_flux(phase_space_density, l1b_dataset["esa_energy"].data)
|
|
413
355
|
dataset["flux_spin_sector"] = xr.DataArray(
|
|
414
356
|
flux,
|
|
415
357
|
name="flux_spin_sector",
|
|
@@ -419,36 +361,33 @@ def swe_l2(l1b_dataset: xr.Dataset, data_version: str) -> xr.Dataset:
|
|
|
419
361
|
|
|
420
362
|
# Carry over acquisition times for L3 purposes.
|
|
421
363
|
dataset["acquisition_time"] = l1b_dataset["acquisition_time"]
|
|
364
|
+
# Update the acquisition_time variable attributes.
|
|
365
|
+
dataset["acquisition_time"].attrs = cdf_attributes.get_variable_attributes(
|
|
366
|
+
"acquisition_time"
|
|
367
|
+
)
|
|
368
|
+
# Carry over acq_duration for L3 purposes.
|
|
369
|
+
dataset["acq_duration"] = l1b_dataset["acq_duration"]
|
|
370
|
+
# Update the acq_duration variable attributes.
|
|
371
|
+
dataset["acq_duration"].attrs = cdf_attributes.get_variable_attributes(
|
|
372
|
+
"acq_duration"
|
|
373
|
+
)
|
|
422
374
|
|
|
423
375
|
# Calculate spin phase using SWE acquisition_time from the
|
|
424
376
|
# L1B dataset. The L1B dataset stores acquisition_time with
|
|
425
|
-
# dimensions (epoch, esa_step, spin_sector).
|
|
426
|
-
#
|
|
427
|
-
# necessary to accurately determine the center angle of the data.
|
|
428
|
-
#
|
|
429
|
-
# To determine the center acquisition time, we adjust the
|
|
430
|
-
# recorded acquisition_time as follows:
|
|
431
|
-
# acquisition_time + (acq_duration / 1000000) / 2
|
|
432
|
-
#
|
|
433
|
-
# Here, acq_duration is given in microseconds and is stored
|
|
434
|
-
# in the L1B dataset with dimensions (epoch, cycle). Since acq_duration
|
|
435
|
-
# remains the same for all quarter cycles within a full sweep,
|
|
436
|
-
# we use the first acq_duration value for each full sweep to perform
|
|
437
|
-
# this adjustment.
|
|
438
|
-
|
|
439
|
-
acq_duration = l1b_dataset["acq_duration"].data[:, 0] / 2000000
|
|
440
|
-
data_acq_time = (
|
|
441
|
-
l1b_dataset["acquisition_time"].data + acq_duration[:, np.newaxis, np.newaxis]
|
|
442
|
-
)
|
|
377
|
+
# dimensions (epoch, esa_step, spin_sector). acquisition_time is
|
|
378
|
+
# center time of acquisition time of each science measurement which
|
|
379
|
+
# is necessary to accurately determine the center angle of the data.
|
|
443
380
|
|
|
444
381
|
# Calculate spin phase
|
|
445
382
|
inst_spin_phase = get_instrument_spin_phase(
|
|
446
|
-
query_met_times=
|
|
383
|
+
query_met_times=l1b_dataset["acquisition_time"].data.ravel(),
|
|
447
384
|
instrument=SpiceFrame.IMAP_SWE,
|
|
448
385
|
)
|
|
449
386
|
|
|
450
387
|
# Convert spin phase to spin angle in degrees.
|
|
451
|
-
inst_spin_angle = get_spin_angle(inst_spin_phase, degrees=True).reshape(
|
|
388
|
+
inst_spin_angle = get_spin_angle(inst_spin_phase, degrees=True).reshape(
|
|
389
|
+
-1, swe_constants.N_ESA_STEPS, swe_constants.N_ANGLE_SECTORS
|
|
390
|
+
)
|
|
452
391
|
|
|
453
392
|
# Save spin angle in dataset per SWE request.
|
|
454
393
|
dataset["inst_az_spin_sector"] = xr.DataArray(
|
|
@@ -471,7 +410,7 @@ def swe_l2(l1b_dataset: xr.Dataset, data_version: str) -> xr.Dataset:
|
|
|
471
410
|
|
|
472
411
|
# Put phase space density data in its spin angle bins using the indices.
|
|
473
412
|
phase_space_density_binned_data = put_data_into_angle_bins(
|
|
474
|
-
phase_space_density
|
|
413
|
+
phase_space_density, spin_angle_bins_indices
|
|
475
414
|
)
|
|
476
415
|
dataset["phase_space_density"] = xr.DataArray(
|
|
477
416
|
phase_space_density_binned_data,
|