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.

Files changed (50) hide show
  1. imap_processing/_version.py +2 -2
  2. imap_processing/cdf/config/imap_codice_global_cdf_attrs.yaml +13 -1
  3. imap_processing/cdf/config/imap_codice_l1a_variable_attrs.yaml +44 -44
  4. imap_processing/cdf/config/imap_codice_l1b_variable_attrs.yaml +127 -126
  5. imap_processing/cdf/config/imap_codice_l2-hi-omni_variable_attrs.yaml +635 -0
  6. imap_processing/cdf/config/imap_codice_l2-hi-sectored_variable_attrs.yaml +422 -0
  7. imap_processing/cdf/config/imap_constant_attrs.yaml +1 -1
  8. imap_processing/cdf/config/imap_enamaps_l2-common_variable_attrs.yaml +61 -55
  9. imap_processing/cdf/config/imap_enamaps_l2-healpix_variable_attrs.yaml +3 -2
  10. imap_processing/cdf/config/imap_enamaps_l2-rectangular_variable_attrs.yaml +17 -5
  11. imap_processing/cli.py +6 -11
  12. imap_processing/codice/codice_l1a.py +42 -21
  13. imap_processing/codice/codice_l2.py +640 -127
  14. imap_processing/codice/constants.py +224 -129
  15. imap_processing/ena_maps/ena_maps.py +124 -70
  16. imap_processing/ena_maps/utils/coordinates.py +5 -0
  17. imap_processing/ena_maps/utils/corrections.py +268 -0
  18. imap_processing/ena_maps/utils/map_utils.py +143 -42
  19. imap_processing/hi/hi_l2.py +10 -15
  20. imap_processing/ialirt/constants.py +7 -1
  21. imap_processing/ialirt/generate_coverage.py +1 -1
  22. imap_processing/ialirt/l0/ialirt_spice.py +1 -1
  23. imap_processing/ialirt/l0/parse_mag.py +33 -0
  24. imap_processing/ialirt/l0/process_codice.py +66 -0
  25. imap_processing/ialirt/utils/create_xarray.py +2 -0
  26. imap_processing/idex/idex_l2a.py +2 -2
  27. imap_processing/idex/idex_l2b.py +1 -1
  28. imap_processing/lo/l1c/lo_l1c.py +61 -3
  29. imap_processing/lo/l2/lo_l2.py +79 -11
  30. imap_processing/mag/l1a/mag_l1a.py +2 -2
  31. imap_processing/mag/l1a/mag_l1a_data.py +71 -13
  32. imap_processing/mag/l1c/interpolation_methods.py +34 -13
  33. imap_processing/mag/l1c/mag_l1c.py +117 -67
  34. imap_processing/mag/l1d/mag_l1d_data.py +3 -1
  35. imap_processing/spice/geometry.py +39 -28
  36. imap_processing/spice/pointing_frame.py +77 -50
  37. imap_processing/swapi/l1/swapi_l1.py +12 -4
  38. imap_processing/swe/utils/swe_constants.py +7 -7
  39. imap_processing/ultra/l1b/extendedspin.py +1 -1
  40. imap_processing/ultra/l1b/ultra_l1b_culling.py +2 -2
  41. imap_processing/ultra/l1b/ultra_l1b_extended.py +1 -1
  42. imap_processing/ultra/l1c/helio_pset.py +1 -1
  43. imap_processing/ultra/l1c/spacecraft_pset.py +2 -2
  44. imap_processing/ultra/l2/ultra_l2.py +3 -3
  45. imap_processing-1.0.1.dist-info/METADATA +121 -0
  46. {imap_processing-0.19.4.dist-info → imap_processing-1.0.1.dist-info}/RECORD +49 -47
  47. imap_processing-0.19.4.dist-info/METADATA +0 -120
  48. {imap_processing-0.19.4.dist-info → imap_processing-1.0.1.dist-info}/LICENSE +0 -0
  49. {imap_processing-0.19.4.dist-info → imap_processing-1.0.1.dist-info}/WHEEL +0 -0
  50. {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(imap_attitude_ck: Path) -> list[Path]:
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
- imap_attitude_ck : Path
44
- Location of the IMAP attitude kernel from which to generate pointing
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(imap_attitude_ck)
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
- # TODO: For now just use the input CK start/end dates. It is possible that
55
- # the end date is incorrect b/c the repoint table determines the last
56
- # segment in the pointing kernel.
57
- spice_file = SPICEFilePath(imap_attitude_ck.name)
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
- imap_attitude_ck.parent / f"imap_dps_"
60
- f"{spice_file.spice_metadata['start_date'].strftime('%Y_%j')}_"
61
- f"{spice_file.spice_metadata['end_date'].strftime('%Y_%j')}_"
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, imap_attitude_ck.name
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, parent_ck: str
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
- parent_ck : str
112
- Filename of the CK kernel that the quaternion was derived from.
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 file: {parent_ck}",
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
- ck_path: Path,
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
- ck_path : pathlib.Path
181
- Location of the CK kernel.
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(f"Extracting mean spin axes from CK kernel {ck_path.name}")
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
- # Check that the last loaded kernel matches it input kernel name. This ensures
209
- # that this CK take priority when computing attitude for it's time coverage.
210
- count = spiceypy.ktotal("ck")
211
- loaded_ck_kernel, _, _, _ = spiceypy.kdata(count - 1, "ck")
212
- if str(ck_path) != loaded_ck_kernel:
213
- raise ValueError(
214
- f"Error: Expected CK kernel {ck_path} but loaded {loaded_ck_kernel}"
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"{ck_path.name} contains {num_intervals} intervals with "
228
- f"start time: {et_to_utc(et_start)}, and end time: {et_to_utc(et_end)}"
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 filter to only the pointings fully
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
- repoint_df = repoint_df[
241
- (repoint_df["repoint_end_et"] >= et_start)
242
- & (repoint_df["repoint_start_et"] <= et_end)
243
- ]
244
- n_pointings = len(repoint_df) - 1
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"] = repoint_df.iloc[i_pointing][
250
- "repoint_id"
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
- hk_files = dependencies.get_file_paths(descriptor="hk")
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 l0_unpacked_dict[SWAPIAPID.SWP_HK]:
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
- 435e-6,
20
- 599e-6,
21
- 808e-6,
22
- 781e-6,
23
- 876e-6,
24
- 548e-6,
25
- 432e-6,
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, _, counts, _ = get_energy_histogram(
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, spin_edges, counts, duration = get_energy_histogram(
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, duration = get_spin_and_duration(rates["shcoarse"], rates["spin"])
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, ssd_number = get_ssd_back_position_and_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, efficiency, geometric_function = get_helio_adjusted_data(
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
- ra_and_dec,
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, pointing_stop = get_pointing_times(
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 ena_intensity_stat_unc.
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["ena_intensity_stat_unc"] = (
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["ena_intensity_stat_unc"],
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
+ [![All Contributors](https://img.shields.io/badge/all_contributors-17-orange.svg?style=flat-square)](#contributors-)
59
+ <!-- ALL-CONTRIBUTORS-BADGE:END -->
60
+ [![readthedocs](https://readthedocs.org/projects/imap-processing/badge/?version=latest)](https://imap-processing.readthedocs.io/en/latest/)
61
+ <!-- DOI-BADGE -->
62
+ [![DOI](https://zenodo.org/badge/654679818.svg)](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
+