imap-processing 0.19.4__py3-none-any.whl → 1.0.1__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/_version.py +2 -2
- imap_processing/cdf/config/imap_codice_global_cdf_attrs.yaml +13 -1
- imap_processing/cdf/config/imap_codice_l1a_variable_attrs.yaml +44 -44
- imap_processing/cdf/config/imap_codice_l1b_variable_attrs.yaml +127 -126
- imap_processing/cdf/config/imap_codice_l2-hi-omni_variable_attrs.yaml +635 -0
- imap_processing/cdf/config/imap_codice_l2-hi-sectored_variable_attrs.yaml +422 -0
- imap_processing/cdf/config/imap_constant_attrs.yaml +1 -1
- imap_processing/cdf/config/imap_enamaps_l2-common_variable_attrs.yaml +61 -55
- imap_processing/cdf/config/imap_enamaps_l2-healpix_variable_attrs.yaml +3 -2
- imap_processing/cdf/config/imap_enamaps_l2-rectangular_variable_attrs.yaml +17 -5
- imap_processing/cli.py +6 -11
- imap_processing/codice/codice_l1a.py +42 -21
- imap_processing/codice/codice_l2.py +640 -127
- imap_processing/codice/constants.py +224 -129
- imap_processing/ena_maps/ena_maps.py +124 -70
- imap_processing/ena_maps/utils/coordinates.py +5 -0
- imap_processing/ena_maps/utils/corrections.py +268 -0
- imap_processing/ena_maps/utils/map_utils.py +143 -42
- imap_processing/hi/hi_l2.py +10 -15
- imap_processing/ialirt/constants.py +7 -1
- imap_processing/ialirt/generate_coverage.py +1 -1
- imap_processing/ialirt/l0/ialirt_spice.py +1 -1
- imap_processing/ialirt/l0/parse_mag.py +33 -0
- imap_processing/ialirt/l0/process_codice.py +66 -0
- imap_processing/ialirt/utils/create_xarray.py +2 -0
- imap_processing/idex/idex_l2a.py +2 -2
- imap_processing/idex/idex_l2b.py +1 -1
- imap_processing/lo/l1c/lo_l1c.py +61 -3
- imap_processing/lo/l2/lo_l2.py +79 -11
- imap_processing/mag/l1a/mag_l1a.py +2 -2
- imap_processing/mag/l1a/mag_l1a_data.py +71 -13
- imap_processing/mag/l1c/interpolation_methods.py +34 -13
- imap_processing/mag/l1c/mag_l1c.py +117 -67
- imap_processing/mag/l1d/mag_l1d_data.py +3 -1
- imap_processing/spice/geometry.py +39 -28
- imap_processing/spice/pointing_frame.py +77 -50
- imap_processing/swapi/l1/swapi_l1.py +12 -4
- imap_processing/swe/utils/swe_constants.py +7 -7
- imap_processing/ultra/l1b/extendedspin.py +1 -1
- imap_processing/ultra/l1b/ultra_l1b_culling.py +2 -2
- imap_processing/ultra/l1b/ultra_l1b_extended.py +1 -1
- imap_processing/ultra/l1c/helio_pset.py +1 -1
- imap_processing/ultra/l1c/spacecraft_pset.py +2 -2
- imap_processing/ultra/l2/ultra_l2.py +3 -3
- imap_processing-1.0.1.dist-info/METADATA +121 -0
- {imap_processing-0.19.4.dist-info → imap_processing-1.0.1.dist-info}/RECORD +49 -47
- imap_processing-0.19.4.dist-info/METADATA +0 -120
- {imap_processing-0.19.4.dist-info → imap_processing-1.0.1.dist-info}/LICENSE +0 -0
- {imap_processing-0.19.4.dist-info → imap_processing-1.0.1.dist-info}/WHEEL +0 -0
- {imap_processing-0.19.4.dist-info → imap_processing-1.0.1.dist-info}/entry_points.txt +0 -0
|
@@ -34,14 +34,14 @@ POINTING_SEGMENT_DTYPE = np.dtype(
|
|
|
34
34
|
)
|
|
35
35
|
|
|
36
36
|
|
|
37
|
-
def generate_pointing_attitude_kernel(
|
|
37
|
+
def generate_pointing_attitude_kernel(imap_attitude_cks: list[Path]) -> list[Path]:
|
|
38
38
|
"""
|
|
39
39
|
Generate pointing attitude kernel from input IMAP CK kernel.
|
|
40
40
|
|
|
41
41
|
Parameters
|
|
42
42
|
----------
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
imap_attitude_cks : list[Path]
|
|
44
|
+
List of the IMAP attitude kernels from which to generate pointing
|
|
45
45
|
attitude.
|
|
46
46
|
|
|
47
47
|
Returns
|
|
@@ -49,20 +49,29 @@ def generate_pointing_attitude_kernel(imap_attitude_ck: Path) -> list[Path]:
|
|
|
49
49
|
pointing_kernel_path : list[Path]
|
|
50
50
|
Location of the new pointing kernels.
|
|
51
51
|
"""
|
|
52
|
-
pointing_segments = calculate_pointing_attitude_segments(
|
|
52
|
+
pointing_segments = calculate_pointing_attitude_segments(imap_attitude_cks)
|
|
53
|
+
if len(pointing_segments) == 0:
|
|
54
|
+
raise ValueError("No Pointings covered by input dependencies.")
|
|
55
|
+
|
|
53
56
|
# get the start and end yyyy_doy strings
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
57
|
+
start_datetime = spiceypy.et2datetime(
|
|
58
|
+
sct_to_et(pointing_segments[0]["start_sclk_ticks"])
|
|
59
|
+
)
|
|
60
|
+
end_datetime = spiceypy.et2datetime(
|
|
61
|
+
sct_to_et(pointing_segments[-1]["end_sclk_ticks"])
|
|
62
|
+
)
|
|
63
|
+
# Use the last ck from sorted list to get the version number. I
|
|
64
|
+
# don't think this will be anything but 1.
|
|
65
|
+
sorted_ck_paths = list(sorted(imap_attitude_cks, key=lambda x: x.name))
|
|
66
|
+
spice_file = SPICEFilePath(sorted_ck_paths[-1].name)
|
|
58
67
|
pointing_kernel_path = (
|
|
59
|
-
|
|
60
|
-
f"{
|
|
61
|
-
f"{
|
|
68
|
+
sorted_ck_paths[-1].parent / f"imap_dps_"
|
|
69
|
+
f"{start_datetime.strftime('%Y_%j')}_"
|
|
70
|
+
f"{end_datetime.strftime('%Y_%j')}_"
|
|
62
71
|
f"{spice_file.spice_metadata['version']}.ah.bc"
|
|
63
72
|
)
|
|
64
73
|
write_pointing_frame_ck(
|
|
65
|
-
pointing_kernel_path, pointing_segments,
|
|
74
|
+
pointing_kernel_path, pointing_segments, [p.name for p in imap_attitude_cks]
|
|
66
75
|
)
|
|
67
76
|
return [pointing_kernel_path]
|
|
68
77
|
|
|
@@ -93,7 +102,7 @@ def open_spice_ck_file(pointing_frame_path: Path) -> Generator[int, None, None]:
|
|
|
93
102
|
|
|
94
103
|
|
|
95
104
|
def write_pointing_frame_ck(
|
|
96
|
-
pointing_kernel_path: Path, segment_data: np.ndarray,
|
|
105
|
+
pointing_kernel_path: Path, segment_data: np.ndarray, parent_cks: list[str]
|
|
97
106
|
) -> None:
|
|
98
107
|
"""
|
|
99
108
|
Write a Pointing Frame attitude kernel.
|
|
@@ -108,8 +117,8 @@ def write_pointing_frame_ck(
|
|
|
108
117
|
("end_sclk_ticks", np.float64),
|
|
109
118
|
("quaternion", np.float64, (4,)),
|
|
110
119
|
("pointing_id", np.uint32),
|
|
111
|
-
|
|
112
|
-
|
|
120
|
+
parent_cks : list[str]
|
|
121
|
+
Filenames of the CK kernels that the quaternions were derived from.
|
|
113
122
|
"""
|
|
114
123
|
id_imap_dps = spiceypy.gipool("FRAME_IMAP_DPS", 0, 1)
|
|
115
124
|
|
|
@@ -119,10 +128,12 @@ def write_pointing_frame_ck(
|
|
|
119
128
|
"",
|
|
120
129
|
f"Original file name: {pointing_kernel_path.name}",
|
|
121
130
|
f"Creation date: {datetime.now(timezone.utc).strftime('%Y-%m-%d')}",
|
|
122
|
-
f"Parent
|
|
131
|
+
f"Parent files: {parent_cks}",
|
|
123
132
|
"",
|
|
124
133
|
]
|
|
125
134
|
|
|
135
|
+
logger.debug(f"Writing pointing attitude kernel: {pointing_kernel_path}")
|
|
136
|
+
|
|
126
137
|
with open_spice_ck_file(pointing_kernel_path) as handle:
|
|
127
138
|
# Write the comments to the file
|
|
128
139
|
spiceypy.dafac(handle, comments)
|
|
@@ -161,9 +172,11 @@ def write_pointing_frame_ck(
|
|
|
161
172
|
np.array([TICK_DURATION]),
|
|
162
173
|
)
|
|
163
174
|
|
|
175
|
+
logger.debug(f"Finished writing pointing attitude kernel: {pointing_kernel_path}")
|
|
176
|
+
|
|
164
177
|
|
|
165
178
|
def calculate_pointing_attitude_segments(
|
|
166
|
-
|
|
179
|
+
ck_paths: list[Path],
|
|
167
180
|
) -> NDArray:
|
|
168
181
|
"""
|
|
169
182
|
Calculate the data for each segment of the DPS_FRAME attitude kernel.
|
|
@@ -177,8 +190,8 @@ def calculate_pointing_attitude_segments(
|
|
|
177
190
|
|
|
178
191
|
Parameters
|
|
179
192
|
----------
|
|
180
|
-
|
|
181
|
-
|
|
193
|
+
ck_paths : list[pathlib.Path]
|
|
194
|
+
List of CK kernels to use to generate the pointing attitude kernel.
|
|
182
195
|
|
|
183
196
|
Returns
|
|
184
197
|
-------
|
|
@@ -200,36 +213,41 @@ def calculate_pointing_attitude_segments(
|
|
|
200
213
|
- IMAP historical attitude kernel from which the pointing frame kernel will
|
|
201
214
|
be generated.
|
|
202
215
|
"""
|
|
203
|
-
logger.info(
|
|
216
|
+
logger.info(
|
|
217
|
+
f"Extracting mean spin axes for all Pointings that are"
|
|
218
|
+
f" fully covered by the CK files: {[p.name for p in ck_paths]}"
|
|
219
|
+
)
|
|
204
220
|
# Get IDs.
|
|
205
221
|
# https://spiceypy.readthedocs.io/en/main/documentation.html#spiceypy.spiceypy.gipool
|
|
206
222
|
id_imap_sclk = spiceypy.gipool("CK_-43000_SCLK", 0, 1)
|
|
223
|
+
id_imap_spacecraft = spiceypy.gipool("FRAME_IMAP_SPACECRAFT", 0, 1)
|
|
207
224
|
|
|
208
|
-
#
|
|
209
|
-
#
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
225
|
+
# This job relies on the batch starter to provide all the correct CK kernels
|
|
226
|
+
# to cover the time range of the new repoint table.
|
|
227
|
+
# Get the coverage of the CK files storing the earliest start time and
|
|
228
|
+
# latest end time.
|
|
229
|
+
et_start = np.inf
|
|
230
|
+
et_end = -np.inf
|
|
231
|
+
for ck_path in ck_paths:
|
|
232
|
+
ck_cover = spiceypy.ckcov(
|
|
233
|
+
str(ck_path), int(id_imap_spacecraft), True, "INTERVAL", 0, "TDB"
|
|
215
234
|
)
|
|
235
|
+
num_intervals = spiceypy.wncard(ck_cover)
|
|
236
|
+
individual_ck_start, _ = spiceypy.wnfetd(ck_cover, 0)
|
|
237
|
+
_, individual_ck_end = spiceypy.wnfetd(ck_cover, num_intervals - 1)
|
|
238
|
+
logger.debug(
|
|
239
|
+
f"{ck_path.name} covers time range: ({et_to_utc(individual_ck_start)}, "
|
|
240
|
+
f"{et_to_utc(individual_ck_end)}) in {num_intervals} intervals."
|
|
241
|
+
)
|
|
242
|
+
et_start = min(et_start, individual_ck_start)
|
|
243
|
+
et_end = max(et_end, individual_ck_end)
|
|
216
244
|
|
|
217
|
-
id_imap_spacecraft = spiceypy.gipool("FRAME_IMAP_SPACECRAFT", 0, 1)
|
|
218
|
-
|
|
219
|
-
# Select only the pointings within the attitude coverage.
|
|
220
|
-
ck_cover = spiceypy.ckcov(
|
|
221
|
-
str(ck_path), int(id_imap_spacecraft), True, "INTERVAL", 0, "TDB"
|
|
222
|
-
)
|
|
223
|
-
num_intervals = spiceypy.wncard(ck_cover)
|
|
224
|
-
et_start, _ = spiceypy.wnfetd(ck_cover, 0)
|
|
225
|
-
_, et_end = spiceypy.wnfetd(ck_cover, num_intervals - 1)
|
|
226
245
|
logger.info(
|
|
227
|
-
f"
|
|
228
|
-
f"
|
|
246
|
+
f"CK kernels combined coverage range: "
|
|
247
|
+
f"{(et_to_utc(et_start), et_to_utc(et_end))}, "
|
|
229
248
|
)
|
|
230
249
|
|
|
231
|
-
# Get data from the repoint table and
|
|
232
|
-
# covered by this attitude kernel
|
|
250
|
+
# Get data from the repoint table and convert to Pointings
|
|
233
251
|
repoint_df = get_repoint_data()
|
|
234
252
|
repoint_df["repoint_start_et"] = sct_to_et(
|
|
235
253
|
met_to_sclkticks(repoint_df["repoint_start_met"].values)
|
|
@@ -237,20 +255,29 @@ def calculate_pointing_attitude_segments(
|
|
|
237
255
|
repoint_df["repoint_end_et"] = sct_to_et(
|
|
238
256
|
met_to_sclkticks(repoint_df["repoint_end_met"].values)
|
|
239
257
|
)
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
258
|
+
pointing_ids = repoint_df["repoint_id"].values[:-1]
|
|
259
|
+
pointing_start_ets = repoint_df["repoint_end_et"].values[:-1]
|
|
260
|
+
pointing_end_ets = repoint_df["repoint_start_et"].values[1:]
|
|
261
|
+
|
|
262
|
+
# Keep only the pointings that are fully covered by the attitude kernels.
|
|
263
|
+
keep_mask = (pointing_start_ets >= et_start) & (pointing_end_ets <= et_end)
|
|
264
|
+
# Filter the pointing data.
|
|
265
|
+
pointing_ids = pointing_ids[keep_mask]
|
|
266
|
+
pointing_start_ets = pointing_start_ets[keep_mask]
|
|
267
|
+
pointing_end_ets = pointing_end_ets[keep_mask]
|
|
268
|
+
|
|
269
|
+
n_pointings = len(pointing_ids)
|
|
270
|
+
if n_pointings == 0:
|
|
271
|
+
logger.warning(
|
|
272
|
+
"No Pointings identified based on coverage of CK files. Skipping."
|
|
273
|
+
)
|
|
245
274
|
|
|
246
275
|
pointing_segments = np.zeros(n_pointings, dtype=POINTING_SEGMENT_DTYPE)
|
|
247
276
|
|
|
248
277
|
for i_pointing in range(n_pointings):
|
|
249
|
-
pointing_segments[i_pointing]["pointing_id"] =
|
|
250
|
-
|
|
251
|
-
]
|
|
252
|
-
pointing_start_et = repoint_df.iloc[i_pointing]["repoint_end_et"]
|
|
253
|
-
pointing_end_et = repoint_df.iloc[i_pointing + 1]["repoint_start_et"]
|
|
278
|
+
pointing_segments[i_pointing]["pointing_id"] = pointing_ids[i_pointing]
|
|
279
|
+
pointing_start_et = pointing_start_ets[i_pointing]
|
|
280
|
+
pointing_end_et = pointing_end_ets[i_pointing]
|
|
254
281
|
logger.debug(
|
|
255
282
|
f"Calculating pointing attitude for pointing "
|
|
256
283
|
f"{pointing_segments[i_pointing]['pointing_id']} with time "
|
|
@@ -727,7 +727,7 @@ def process_swapi_science(
|
|
|
727
727
|
return dataset
|
|
728
728
|
|
|
729
729
|
|
|
730
|
-
def swapi_l1(dependencies: ProcessingInputCollection) -> xr.Dataset:
|
|
730
|
+
def swapi_l1(dependencies: ProcessingInputCollection, descriptor: str) -> xr.Dataset:
|
|
731
731
|
"""
|
|
732
732
|
Will process SWAPI level 0 data to level 1.
|
|
733
733
|
|
|
@@ -735,6 +735,9 @@ def swapi_l1(dependencies: ProcessingInputCollection) -> xr.Dataset:
|
|
|
735
735
|
----------
|
|
736
736
|
dependencies : ProcessingInputCollection
|
|
737
737
|
Input dependencies needed for L1 processing.
|
|
738
|
+
descriptor : str
|
|
739
|
+
Descriptor for the type of data to process.
|
|
740
|
+
Options are 'hk' or 'sci'.
|
|
738
741
|
|
|
739
742
|
Returns
|
|
740
743
|
-------
|
|
@@ -754,9 +757,11 @@ def swapi_l1(dependencies: ProcessingInputCollection) -> xr.Dataset:
|
|
|
754
757
|
l0_files[0], xtce_definition, use_derived_value=False
|
|
755
758
|
)
|
|
756
759
|
|
|
757
|
-
|
|
758
|
-
if hk_files and l0_unpacked_dict.get(SWAPIAPID.SWP_SCI, None) is not None:
|
|
760
|
+
if descriptor == "sci":
|
|
759
761
|
logger.info(f"Processing SWAPI science data for {l0_files[0]}.")
|
|
762
|
+
if SWAPIAPID.SWP_SCI not in l0_unpacked_dict:
|
|
763
|
+
logger.warning("No SWP_SCI packets found.")
|
|
764
|
+
return []
|
|
760
765
|
# process science data.
|
|
761
766
|
# First read HK data.
|
|
762
767
|
hk_files = dependencies.get_file_paths(descriptor="hk")
|
|
@@ -770,8 +775,11 @@ def swapi_l1(dependencies: ProcessingInputCollection) -> xr.Dataset:
|
|
|
770
775
|
)
|
|
771
776
|
return [sci_dataset]
|
|
772
777
|
|
|
773
|
-
elif
|
|
778
|
+
elif descriptor == "hk":
|
|
774
779
|
logger.info(f"Processing HK data for {l0_files[0]}.")
|
|
780
|
+
if SWAPIAPID.SWP_HK not in l0_unpacked_dict:
|
|
781
|
+
logger.warning("No SWP_HK packets found.")
|
|
782
|
+
return []
|
|
775
783
|
# Get L1A and L1B HK data.
|
|
776
784
|
l1a_hk_data = l0_unpacked_dict[SWAPIAPID.SWP_HK]
|
|
777
785
|
l1b_hk_data = packet_file_to_datasets(
|
|
@@ -16,13 +16,13 @@ ENERGY_CONVERSION_FACTOR = 4.75
|
|
|
16
16
|
# 7 CEMs geometric factors in cm^2 sr eV/eV units.
|
|
17
17
|
GEOMETRIC_FACTORS = np.array(
|
|
18
18
|
[
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
19
|
+
424.4e-6,
|
|
20
|
+
564.5e-6,
|
|
21
|
+
763.8e-6,
|
|
22
|
+
916.9e-6,
|
|
23
|
+
792.0e-6,
|
|
24
|
+
667.7e-6,
|
|
25
|
+
425.2e-6,
|
|
26
26
|
]
|
|
27
27
|
)
|
|
28
28
|
|
|
@@ -50,7 +50,7 @@ def calculate_extendedspin(
|
|
|
50
50
|
de_dataset["spin"].values,
|
|
51
51
|
de_dataset["energy"].values,
|
|
52
52
|
)
|
|
53
|
-
count_rates, _,
|
|
53
|
+
count_rates, _, _counts, _ = get_energy_histogram(
|
|
54
54
|
de_dataset["spin"].values, de_dataset["energy"].values
|
|
55
55
|
)
|
|
56
56
|
attitude_qf, spin_rates, spin_period, spin_starttime = flag_attitude(
|
|
@@ -255,7 +255,7 @@ def flag_rates(
|
|
|
255
255
|
n_sigma_per_energy_reshape : NDArray
|
|
256
256
|
N sigma per energy.
|
|
257
257
|
"""
|
|
258
|
-
count_rates,
|
|
258
|
+
count_rates, _spin_edges, _counts, duration = get_energy_histogram(
|
|
259
259
|
spin_number, energy
|
|
260
260
|
)
|
|
261
261
|
quality_flags = np.full(
|
|
@@ -440,7 +440,7 @@ def get_pulses_per_spin(rates: xr.Dataset) -> RateResult:
|
|
|
440
440
|
coin_pulses : NDArray
|
|
441
441
|
Total coincidence pulses.
|
|
442
442
|
"""
|
|
443
|
-
spin_number,
|
|
443
|
+
spin_number, _duration = get_spin_and_duration(rates["shcoarse"], rates["spin"])
|
|
444
444
|
|
|
445
445
|
# Top coin pulses
|
|
446
446
|
top_coin_pulses = np.stack(
|
|
@@ -592,7 +592,7 @@ def get_ssd_tof(
|
|
|
592
592
|
tof : np.ndarray
|
|
593
593
|
Time of flight (tenths of a nanosecond).
|
|
594
594
|
"""
|
|
595
|
-
_, tof_offset,
|
|
595
|
+
_, tof_offset, _ssd_number = get_ssd_back_position_and_tof_offset(
|
|
596
596
|
de_dataset, sensor, ancillary_files
|
|
597
597
|
)
|
|
598
598
|
indices = np.nonzero(np.isin(de_dataset["stop_type"], [StopType.SSD.value]))[0]
|
|
@@ -145,7 +145,7 @@ def calculate_helio_pset(
|
|
|
145
145
|
mid_time = ttj2000ns_to_et(met_to_ttj2000ns((pointing_start + pointing_stop) / 2))
|
|
146
146
|
|
|
147
147
|
logger.info("Adjusting data for helio frame.")
|
|
148
|
-
exposure_time,
|
|
148
|
+
exposure_time, _efficiency, geometric_function = get_helio_adjusted_data(
|
|
149
149
|
mid_time,
|
|
150
150
|
exposure_time,
|
|
151
151
|
geometric_function,
|
|
@@ -100,7 +100,7 @@ def calculate_spacecraft_pset(
|
|
|
100
100
|
for_indices_by_spin_phase,
|
|
101
101
|
theta_vals,
|
|
102
102
|
phi_vals,
|
|
103
|
-
|
|
103
|
+
_ra_and_dec,
|
|
104
104
|
boundary_scale_factors,
|
|
105
105
|
) = get_spacecraft_pointing_lookup_tables(ancillary_files, instrument_id)
|
|
106
106
|
|
|
@@ -173,7 +173,7 @@ def calculate_spacecraft_pset(
|
|
|
173
173
|
nside=nside,
|
|
174
174
|
)
|
|
175
175
|
# Get pointing start and stop times and convert to ttj2000ns
|
|
176
|
-
pointing_start,
|
|
176
|
+
pointing_start, _pointing_stop = get_pointing_times(
|
|
177
177
|
float(et_to_met(species_dataset["event_times"].data[0]))
|
|
178
178
|
)
|
|
179
179
|
pointing_start = met_to_ttj2000ns(pointing_start)
|
|
@@ -160,7 +160,7 @@ def generate_ultra_healpix_skymap( # noqa: PLR0912
|
|
|
160
160
|
This function combines IMAP Ultra L1C pointing sets into a single L2 HealpixSkyMap.
|
|
161
161
|
It handles the projection of values from pointing sets to the map, applies necessary
|
|
162
162
|
weighting and background subtraction, and calculates ena_intensity
|
|
163
|
-
and
|
|
163
|
+
and ena_intensity_stat_uncert.
|
|
164
164
|
|
|
165
165
|
Parameters
|
|
166
166
|
----------
|
|
@@ -391,7 +391,7 @@ def generate_ultra_healpix_skymap( # noqa: PLR0912
|
|
|
391
391
|
skymap.data_1d["sensitivity"] * skymap.solid_angle * delta_energy
|
|
392
392
|
)
|
|
393
393
|
|
|
394
|
-
skymap.data_1d["
|
|
394
|
+
skymap.data_1d["ena_intensity_stat_uncert"] = (
|
|
395
395
|
skymap.data_1d["counts"].astype(float) ** 0.5
|
|
396
396
|
) / (
|
|
397
397
|
skymap.data_1d["exposure_factor"]
|
|
@@ -630,7 +630,7 @@ def ultra_l2(
|
|
|
630
630
|
# Add systematic error as all zeros with shape matching statistical unc
|
|
631
631
|
# TODO: update once we have information from the instrument team
|
|
632
632
|
map_dataset["ena_intensity_sys_err"] = xr.zeros_like(
|
|
633
|
-
map_dataset["
|
|
633
|
+
map_dataset["ena_intensity_stat_uncert"],
|
|
634
634
|
)
|
|
635
635
|
|
|
636
636
|
# Add epoch_delta
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: imap-processing
|
|
3
|
+
Version: 1.0.1
|
|
4
|
+
Summary: IMAP Science Operations Center Processing
|
|
5
|
+
License: MIT
|
|
6
|
+
Keywords: IMAP,SDC,SOC,Science Operations
|
|
7
|
+
Author: IMAP SDC Developers
|
|
8
|
+
Author-email: imap-sdc@lists.lasp.colorado.edu
|
|
9
|
+
Requires-Python: >=3.10,<4
|
|
10
|
+
Classifier: Development Status :: 3 - Alpha
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
13
|
+
Classifier: Natural Language :: English
|
|
14
|
+
Classifier: Operating System :: MacOS
|
|
15
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
16
|
+
Classifier: Operating System :: POSIX
|
|
17
|
+
Classifier: Operating System :: Unix
|
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
23
|
+
Classifier: Topic :: Scientific/Engineering
|
|
24
|
+
Classifier: Topic :: Software Development
|
|
25
|
+
Provides-Extra: dev
|
|
26
|
+
Provides-Extra: doc
|
|
27
|
+
Provides-Extra: map-visualization
|
|
28
|
+
Provides-Extra: test
|
|
29
|
+
Provides-Extra: tools
|
|
30
|
+
Requires-Dist: astropy-healpix (>=1.0)
|
|
31
|
+
Requires-Dist: cdflib (>=1.3.6,<2.0.0)
|
|
32
|
+
Requires-Dist: healpy (>=1.18.0,<2.0.0) ; extra == "map-visualization"
|
|
33
|
+
Requires-Dist: imap-data-access (>=0.37.0)
|
|
34
|
+
Requires-Dist: mypy (==1.10.1) ; extra == "dev"
|
|
35
|
+
Requires-Dist: netcdf4 (>=1.7.2,<2.0.0) ; extra == "test"
|
|
36
|
+
Requires-Dist: numpy (<=3)
|
|
37
|
+
Requires-Dist: numpydoc (>=1.5.0,<2.0.0) ; extra == "doc"
|
|
38
|
+
Requires-Dist: openpyxl (>=3.0.7) ; extra == "test" or extra == "tools"
|
|
39
|
+
Requires-Dist: pandas (>=2.0.0) ; extra == "tools"
|
|
40
|
+
Requires-Dist: pre-commit (>=3.3.3,<4.0.0) ; extra == "dev"
|
|
41
|
+
Requires-Dist: pydata-sphinx-theme ; extra == "doc"
|
|
42
|
+
Requires-Dist: pytest (>=6.2.5) ; extra == "test"
|
|
43
|
+
Requires-Dist: pytest-cov (>=4.0.0,<5.0.0) ; extra == "test"
|
|
44
|
+
Requires-Dist: pytest-xdist (>=3.2,<4.0) ; extra == "test"
|
|
45
|
+
Requires-Dist: requests (>=2.32.3,<3.0.0) ; extra == "test"
|
|
46
|
+
Requires-Dist: ruff (==0.2.1) ; extra == "dev"
|
|
47
|
+
Requires-Dist: sammi-cdf (>=1.0,<2.0)
|
|
48
|
+
Requires-Dist: scipy (>=1.13,<2.0)
|
|
49
|
+
Requires-Dist: space_packet_parser (>=5.0.1,<6.0.0)
|
|
50
|
+
Requires-Dist: sphinx ; extra == "doc"
|
|
51
|
+
Requires-Dist: sphinxcontrib-openapi (>=0.8.3,<0.9.0) ; extra == "doc"
|
|
52
|
+
Requires-Dist: spiceypy (>=6.0.0)
|
|
53
|
+
Requires-Dist: xarray (>=2024.10.0)
|
|
54
|
+
Description-Content-Type: text/markdown
|
|
55
|
+
|
|
56
|
+
# IMAP (Interstellar Mapping and Acceleration Probe)
|
|
57
|
+
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
|
|
58
|
+
[](#contributors-)
|
|
59
|
+
<!-- ALL-CONTRIBUTORS-BADGE:END -->
|
|
60
|
+
[](https://imap-processing.readthedocs.io/en/latest/)
|
|
61
|
+
<!-- DOI-BADGE -->
|
|
62
|
+
[](https://zenodo.org/badge/latestdoi/654679818)
|
|
63
|
+
|
|
64
|
+
The Interstellar Mapping and Acceleration Probe (IMAP) is an exciting project aimed at studying the interstellar medium and investigating the acceleration mechanisms of particles within our galaxy. IMAP utilizes cutting-edge technology and advanced instrumentation to gather valuable data and expand our understanding of space.
|
|
65
|
+
|
|
66
|
+
The IMAP project's Git repository serves as a centralized hub for collaboration among researchers, scientists, and developers involved in the project. It provides a platform for version control, code sharing, issue tracking, and documentation, fostering a collaborative environment for advancing the goals of the IMAP mission.
|
|
67
|
+
|
|
68
|
+
Through the Git repository, contributors can access project resources, explore the codebase, propose enhancements or bug fixes, and participate in discussions with other team members. This collaborative approach promotes efficient development and fosters innovation in the pursuit of interstellar mapping and particle acceleration research.
|
|
69
|
+
|
|
70
|
+
Join the IMAP Git repository to be part of an exciting scientific endeavor, contribute your expertise, and help unlock the mysteries of the interstellar medium and particle acceleration in our galaxy. Together, we can advance our knowledge of the cosmos and pave the way for future discoveries in space exploration.
|
|
71
|
+
|
|
72
|
+
[IMAP Website](https://imap.princeton.edu/)
|
|
73
|
+
|
|
74
|
+
[IMAP Processing Documentation](https://imap-processing.readthedocs.io/en/latest/)
|
|
75
|
+
|
|
76
|
+
[Getting started](https://imap-processing.readthedocs.io/en/latest/development-guide/getting-started.html)
|
|
77
|
+
|
|
78
|
+
# Credits
|
|
79
|
+
[LASP (Laboratory of Atmospheric and Space Physics)](https://lasp.colorado.edu/)
|
|
80
|
+
## Contributors ✨
|
|
81
|
+
|
|
82
|
+
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
|
|
83
|
+
|
|
84
|
+
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
|
85
|
+
<!-- prettier-ignore-start -->
|
|
86
|
+
<!-- markdownlint-disable -->
|
|
87
|
+
<table>
|
|
88
|
+
<tbody>
|
|
89
|
+
<tr>
|
|
90
|
+
<td align="center" valign="top" width="14.28%"><a href="http://greglucas.github.io"><img src="https://avatars.githubusercontent.com/u/12417828?v=4?s=100" width="100px;" alt="Greg Lucas"/><br /><sub><b>Greg Lucas</b></sub></a><br /><a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/commits?author=greglucas" title="Code">💻</a> <a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/commits?author=greglucas" title="Documentation">📖</a> <a href="#ideas-greglucas" title="Ideas, Planning, & Feedback">🤔</a> <a href="#infra-greglucas" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#maintenance-greglucas" title="Maintenance">🚧</a> <a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/pulls?q=is%3Apr+reviewed-by%3Agreglucas" title="Reviewed Pull Requests">👀</a></td>
|
|
91
|
+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/tech3371"><img src="https://avatars.githubusercontent.com/u/36522642?v=4?s=100" width="100px;" alt="Tenzin Choedon"/><br /><sub><b>Tenzin Choedon</b></sub></a><br /><a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/commits?author=tech3371" title="Code">💻</a> <a href="#ideas-tech3371" title="Ideas, Planning, & Feedback">🤔</a> <a href="#infra-tech3371" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#example-tech3371" title="Examples">💡</a> <a href="#maintenance-tech3371" title="Maintenance">🚧</a> <a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/pulls?q=is%3Apr+reviewed-by%3Atech3371" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/commits?author=tech3371" title="Documentation">📖</a></td>
|
|
92
|
+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/laspsandoval"><img src="https://avatars.githubusercontent.com/u/46567335?v=4?s=100" width="100px;" alt="Laura Sandoval"/><br /><sub><b>Laura Sandoval</b></sub></a><br /><a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/pulls?q=is%3Apr+reviewed-by%3Alaspsandoval" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/commits?author=laspsandoval" title="Code">💻</a> <a href="#infra-laspsandoval" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#ideas-laspsandoval" title="Ideas, Planning, & Feedback">🤔</a></td>
|
|
93
|
+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sdhoyt"><img src="https://avatars.githubusercontent.com/u/7146374?v=4?s=100" width="100px;" alt="Sean Hoyt"/><br /><sub><b>Sean Hoyt</b></sub></a><br /><a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/commits?author=sdhoyt" title="Code">💻</a> <a href="#ideas-sdhoyt" title="Ideas, Planning, & Feedback">🤔</a> <a href="#infra-sdhoyt" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/pulls?q=is%3Apr+reviewed-by%3Asdhoyt" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/commits?author=sdhoyt" title="Documentation">📖</a> <a href="#maintenance-sdhoyt" title="Maintenance">🚧</a></td>
|
|
94
|
+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GFMoraga"><img src="https://avatars.githubusercontent.com/u/104743000?v=4?s=100" width="100px;" alt="Gabriel M."/><br /><sub><b>Gabriel M.</b></sub></a><br /><a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/commits?author=GFMoraga" title="Code">💻</a> <a href="#ideas-GFMoraga" title="Ideas, Planning, & Feedback">🤔</a> <a href="#infra-GFMoraga" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/pulls?q=is%3Apr+reviewed-by%3AGFMoraga" title="Reviewed Pull Requests">👀</a> <a href="#maintenance-GFMoraga" title="Maintenance">🚧</a> <a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/commits?author=GFMoraga" title="Documentation">📖</a></td>
|
|
95
|
+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/bourque"><img src="https://avatars.githubusercontent.com/u/2250769?v=4?s=100" width="100px;" alt="Matthew Bourque"/><br /><sub><b>Matthew Bourque</b></sub></a><br /><a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/commits?author=bourque" title="Code">💻</a> <a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/commits?author=bourque" title="Documentation">📖</a> <a href="#ideas-bourque" title="Ideas, Planning, & Feedback">🤔</a> <a href="#infra-bourque" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/pulls?q=is%3Apr+reviewed-by%3Abourque" title="Reviewed Pull Requests">👀</a> <a href="#maintenance-bourque" title="Maintenance">🚧</a></td>
|
|
96
|
+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/maxinelasp"><img src="https://avatars.githubusercontent.com/u/117409426?v=4?s=100" width="100px;" alt="Maxine Hartnett"/><br /><sub><b>Maxine Hartnett</b></sub></a><br /><a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/commits?author=maxinelasp" title="Code">💻</a> <a href="#ideas-maxinelasp" title="Ideas, Planning, & Feedback">🤔</a> <a href="#infra-maxinelasp" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/pulls?q=is%3Apr+reviewed-by%3Amaxinelasp" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/commits?author=maxinelasp" title="Documentation">📖</a> <a href="#maintenance-maxinelasp" title="Maintenance">🚧</a></td>
|
|
97
|
+
</tr>
|
|
98
|
+
<tr>
|
|
99
|
+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/bryan-harter"><img src="https://avatars.githubusercontent.com/u/41062454?v=4?s=100" width="100px;" alt="Bryan Harter"/><br /><sub><b>Bryan Harter</b></sub></a><br /><a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/commits?author=bryan-harter" title="Code">💻</a> <a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/commits?author=bryan-harter" title="Documentation">📖</a></td>
|
|
100
|
+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mstrumik"><img src="https://avatars.githubusercontent.com/u/142874888?v=4?s=100" width="100px;" alt="mstrumik"/><br /><sub><b>mstrumik</b></sub></a><br /><a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/pulls?q=is%3Apr+reviewed-by%3Amstrumik" title="Reviewed Pull Requests">👀</a></td>
|
|
101
|
+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/vmartinez-cu"><img src="https://avatars.githubusercontent.com/u/39746325?v=4?s=100" width="100px;" alt="Veronica Martinez"/><br /><sub><b>Veronica Martinez</b></sub></a><br /><a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/pulls?q=is%3Apr+reviewed-by%3Avmartinez-cu" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/commits?author=vmartinez-cu" title="Code">💻</a></td>
|
|
102
|
+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/subagonsouth"><img src="https://avatars.githubusercontent.com/u/16110870?v=4?s=100" width="100px;" alt="Tim Plummer"/><br /><sub><b>Tim Plummer</b></sub></a><br /><a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/pulls?q=is%3Apr+reviewed-by%3Asubagonsouth" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/commits?author=subagonsouth" title="Code">💻</a></td>
|
|
103
|
+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/daralynnrhode"><img src="https://avatars.githubusercontent.com/u/143308810?v=4?s=100" width="100px;" alt="Daralynn Rhode"/><br /><sub><b>Daralynn Rhode</b></sub></a><br /><a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/commits?author=daralynnrhode" title="Code">💻</a> <a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/commits?author=daralynnrhode" title="Documentation">📖</a></td>
|
|
104
|
+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/anamanica"><img src="https://avatars.githubusercontent.com/u/171708990?v=4?s=100" width="100px;" alt="anamanica"/><br /><sub><b>anamanica</b></sub></a><br /><a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/commits?author=anamanica" title="Code">💻</a> <a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/commits?author=anamanica" title="Documentation">📖</a></td>
|
|
105
|
+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/lacoak21"><img src="https://avatars.githubusercontent.com/u/48064300?v=4?s=100" width="100px;" alt="Luisa Coakley"/><br /><sub><b>Luisa Coakley</b></sub></a><br /><a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/commits?author=lacoak21" title="Code">💻</a> <a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/commits?author=lacoak21" title="Documentation">📖</a></td>
|
|
106
|
+
</tr>
|
|
107
|
+
<tr>
|
|
108
|
+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nkerman"><img src="https://avatars.githubusercontent.com/u/13221946?v=4?s=100" width="100px;" alt="Nat Kerman"/><br /><sub><b>Nat Kerman</b></sub></a><br /><a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/commits?author=nkerman" title="Code">💻</a> <a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/commits?author=nkerman" title="Documentation">📖</a></td>
|
|
109
|
+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/torimarbois"><img src="https://avatars.githubusercontent.com/u/65727848?v=4?s=100" width="100px;" alt="Tori Marbois"/><br /><sub><b>Tori Marbois</b></sub></a><br /><a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/commits?author=torimarbois" title="Code">💻</a> <a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/commits?author=torimarbois" title="Documentation">📖</a></td>
|
|
110
|
+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mfacchinelli"><img src="https://avatars.githubusercontent.com/u/19731497?v=4?s=100" width="100px;" alt="Michele Facchinelli"/><br /><sub><b>Michele Facchinelli</b></sub></a><br /><a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/commits?author=mfacchinelli" title="Code">💻</a> <a href="https://github.com/IMAP-Science-Operations-Center/imap_processing/commits?author=mfacchinelli" title="Tests">⚠️</a></td>
|
|
111
|
+
</tr>
|
|
112
|
+
</tbody>
|
|
113
|
+
</table>
|
|
114
|
+
|
|
115
|
+
<!-- markdownlint-restore -->
|
|
116
|
+
<!-- prettier-ignore-end -->
|
|
117
|
+
|
|
118
|
+
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
|
119
|
+
|
|
120
|
+
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
|
|
121
|
+
|