imap-processing 0.19.2__py3-none-any.whl → 0.19.3__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.

@@ -1,3 +1,3 @@
1
1
  # These version placeholders will be replaced later during substitution.
2
- __version__ = "0.19.2"
3
- __version_tuple__ = (0, 19, 2)
2
+ __version__ = "0.19.3"
3
+ __version_tuple__ = (0, 19, 3)
@@ -207,6 +207,50 @@ exposure_factor: &exposure_factor
207
207
  DISPLAY_TYPE: no_plot
208
208
  DICT_KEY: SPASE>TemporalDescription:Exposure,Qualifier:Directional,CoordinateSystemName:HAE,CoordinateRepresentation:Spherical
209
209
 
210
+ geometric_function:
211
+ <<: *default_float32
212
+ CATDESC: The geometric function calculated from multiple pointing sets.
213
+ FIELDNAM: geometric_function
214
+ UNITS: cm^2 sr
215
+ DEPEND_0: epoch
216
+ VAR_TYPE: data
217
+ LABLAXIS: Geometric Factor
218
+ DISPLAY_TYPE: no_plot
219
+ DICT_KEY: SPASE>Particle>ParticleType:Atom,ParticleQuantity:GeometricFactor,Qualifier:Directional,CoordinateSystemName:HAE,CoordinateRepresentation:Spherical
220
+
221
+ efficiency:
222
+ <<: *default_float32
223
+ CATDESC: Event efficiency calculated from multiple pointing sets.
224
+ FIELDNAM: efficiency
225
+ UNITS: " "
226
+ DEPEND_0: epoch
227
+ VAR_TYPE: data
228
+ LABLAXIS: Efficiency
229
+ DISPLAY_TYPE: no_plot
230
+ DICT_KEY: SPASE>Particle>ParticleType:Atom,ParticleQuantity:Other
231
+
232
+ positional_uncert_theta:
233
+ <<: *default_float32
234
+ CATDESC: Positional uncertainty in theta direction calculated from multiple pointing sets.
235
+ FIELDNAM: positional_uncertainty_theta
236
+ UNITS: degrees
237
+ DEPEND_0: epoch
238
+ VAR_TYPE: data
239
+ LABLAXIS: Position Uncertainty Theta
240
+ DISPLAY_TYPE: no_plot
241
+ DICT_KEY: SPASE>Particle>ParticleType:Atom,ParticleQuantity:ArrivalDirection,Qualifier:Uncertainty,CoordinateSystemName:HAE,CoordinateRepresentation:Spherical
242
+
243
+ positional_uncert_phi:
244
+ <<: *default_float32
245
+ CATDESC: Positional uncertainty in phi direction calculated from multiple pointing sets.
246
+ FIELDNAM: positional_uncertainty_phi
247
+ UNITS: degrees
248
+ DEPEND_0: epoch
249
+ VAR_TYPE: data
250
+ LABLAXIS: Position Uncertainty Phi
251
+ DISPLAY_TYPE: no_plot
252
+ DICT_KEY: SPASE>Particle>ParticleType:Atom,ParticleQuantity:ArrivalDirection,Qualifier:Uncertainty,CoordinateSystemName:HAE,CoordinateRepresentation:Spherical
253
+
210
254
  obs_date: &obs_date
211
255
  <<: *default_int64
212
256
  datatype: int64
@@ -72,6 +72,29 @@ sensitivity:
72
72
  LABL_PTR_1: energy_label
73
73
  LABL_PTR_2: pixel_index_label
74
74
 
75
+ efficiency:
76
+ DEPEND_1: energy
77
+ DEPEND_2: pixel_index
78
+ LABL_PTR_1: energy_label
79
+ LABL_PTR_2: pixel_index_label
80
+
81
+ geometric_function:
82
+ DEPEND_1: energy
83
+ DEPEND_2: pixel_index
84
+ LABL_PTR_1: energy_label
85
+ LABL_PTR_2: pixel_index_label
86
+
87
+ positional_uncert_theta:
88
+ DEPEND_1: energy
89
+ DEPEND_2: pixel_index
90
+ LABL_PTR_1: energy_label
91
+ LABL_PTR_2: pixel_index_label
92
+
93
+ positional_uncert_phi:
94
+ DEPEND_1: energy
95
+ DEPEND_2: pixel_index
96
+ LABL_PTR_1: energy_label
97
+ LABL_PTR_2: pixel_index_label
75
98
  # These data variables will have an extra (energy) dimension
76
99
  # only if the energy dimension is present in the L1C data.
77
100
  # The default is energy-independent.
@@ -99,6 +122,12 @@ obs_date:
99
122
  LABL_PTR_1: energy_label
100
123
  LABL_PTR_2: pixel_index_label
101
124
 
125
+ obs_date_range:
126
+ DEPEND_1: energy
127
+ DEPEND_2: pixel_index
128
+ LABL_PTR_1: energy_label
129
+ LABL_PTR_2: pixel_index_label
130
+
102
131
  solid_angle:
103
132
  DEPEND_1: pixel_index
104
133
  LABL_PTR_1: pixel_index_label
@@ -134,6 +134,38 @@ exposure_factor:
134
134
  LABL_PTR_2: longitude_label
135
135
  LABL_PTR_3: latitude_label
136
136
 
137
+ efficiency:
138
+ DEPEND_1: energy
139
+ DEPEND_2: longitude
140
+ DEPEND_3: latitude
141
+ LABL_PTR_1: energy_label
142
+ LABL_PTR_2: longitude_label
143
+ LABL_PTR_3: latitude_label
144
+
145
+ geometric_function:
146
+ DEPEND_1: energy
147
+ DEPEND_2: longitude
148
+ DEPEND_3: latitude
149
+ LABL_PTR_1: energy_label
150
+ LABL_PTR_2: longitude_label
151
+ LABL_PTR_3: latitude_label
152
+
153
+ positional_uncert_theta:
154
+ DEPEND_1: energy
155
+ DEPEND_2: longitude
156
+ DEPEND_3: latitude
157
+ LABL_PTR_1: energy_label
158
+ LABL_PTR_2: longitude_label
159
+ LABL_PTR_3: latitude_label
160
+
161
+ positional_uncert_phi:
162
+ DEPEND_1: energy
163
+ DEPEND_2: longitude
164
+ DEPEND_3: latitude
165
+ LABL_PTR_1: energy_label
166
+ LABL_PTR_2: longitude_label
167
+ LABL_PTR_3: latitude_label
168
+
137
169
  obs_date:
138
170
  DEPEND_1: energy
139
171
  DEPEND_2: longitude
@@ -68,28 +68,28 @@ imap_ultra_l1a_90sensor-histogram-ena-extof-hi-ang:
68
68
  Logical_source: imap_ultra_l1a_90sensor-histogram-ena-extof-hi-ang
69
69
  Logical_source_description: IMAP-Ultra Instrument Level-1A ExTOF Hi Angular Data.
70
70
 
71
- imap_ultra_l1a_45sensor-histogram-ena-extof-hi-time:
71
+ imap_ultra_l1a_45sensor-histogram-ion-extof-hi-time:
72
72
  <<: *instrument_base
73
73
  Data_type: L1A_Histogram>Level-1A ExTOF
74
- Logical_source: imap_ultra_l1a_45sensor-histogram-ena-extof-hi-time
74
+ Logical_source: imap_ultra_l1a_45sensor-histogram-ion-extof-hi-time
75
75
  Logical_source_description: IMAP-Ultra Instrument Level-1A ExTOF Hi Time Data.
76
76
 
77
- imap_ultra_l1a_90sensor-histogram-ena-extof-hi-time:
77
+ imap_ultra_l1a_90sensor-histogram-ion-extof-hi-time:
78
78
  <<: *instrument_base
79
79
  Data_type: L1A_Histogram>Level-1A ExTOF
80
- Logical_source: imap_ultra_l1a_90sensor-histogram-ena-extof-hi-time
80
+ Logical_source: imap_ultra_l1a_90sensor-histogram-ion-extof-hi-time
81
81
  Logical_source_description: IMAP-Ultra Instrument Level-1A ExTOF Hi Time Data.
82
82
 
83
- imap_ultra_l1a_45sensor-histogram-ena-extof-hi-nrg:
83
+ imap_ultra_l1a_45sensor-histogram-ion-extof-hi-nrg:
84
84
  <<: *instrument_base
85
85
  Data_type: L1A_Histogram>Level-1A ExTOF
86
- Logical_source: imap_ultra_l1a_45sensor-histogram-ena-extof-hi-nrg
86
+ Logical_source: imap_ultra_l1a_45sensor-histogram-ion-extof-hi-nrg
87
87
  Logical_source_description: IMAP-Ultra Instrument Level-1A ExTOF Hi Energy Data.
88
88
 
89
- imap_ultra_l1a_90sensor-histogram-ena-extof-hi-nrg:
89
+ imap_ultra_l1a_90sensor-histogram-ion-extof-hi-nrg:
90
90
  <<: *instrument_base
91
91
  Data_type: L1A_Histogram>Level-1A ExTOF
92
- Logical_source: imap_ultra_l1a_90sensor-histogram-ena-extof-hi-nrg
92
+ Logical_source: imap_ultra_l1a_90sensor-histogram-ion-extof-hi-nrg
93
93
  Logical_source_description: IMAP-Ultra Instrument Level-1A ExTOF Hi Energy Data.
94
94
 
95
95
  imap_ultra_l1a_45sensor-rates:
@@ -133,8 +133,7 @@ def transform_instrument_vectors_to_inertial(
133
133
  spin_phase: NDArray,
134
134
  sc_inertial_right: NDArray,
135
135
  sc_inertial_decline: NDArray,
136
- # TODO: Use correct IMAP_MAG_I or IMAP_MAG_O frame here
137
- instrument_frame: SpiceFrame = SpiceFrame.IMAP_MAG,
136
+ instrument_frame: SpiceFrame,
138
137
  spacecraft_frame: SpiceFrame = SpiceFrame.IMAP_SPACECRAFT,
139
138
  ) -> NDArray:
140
139
  """
@@ -268,6 +268,9 @@ def calculate_l1b(
268
268
  retrieve_matrix_from_single_l1b_calibration(calibration_dataset, is_mago=False)
269
269
  )
270
270
 
271
+ logger.info(f"calibration_matrix_mago shape: {calibration_matrix_mago.shape}.")
272
+ logger.info(f"calibration_matrix_magi shape: {calibration_matrix_magi.shape}.")
273
+
271
274
  # Get time values for each group.
272
275
  time_data = get_time(
273
276
  grouped_data, group, pkt_counter, time_shift_mago, time_shift_magi
@@ -392,6 +395,7 @@ def transform_to_inertial(
392
395
  attitude_time: np.ndarray,
393
396
  target_time: float,
394
397
  mag_vector: np.ndarray,
398
+ instrument_frame: SpiceFrame,
395
399
  ) -> np.ndarray:
396
400
  """
397
401
  Transform vector to ECLIPJ2000.
@@ -415,6 +419,8 @@ def transform_to_inertial(
415
419
  Example: time_data['primary_epoch'].
416
420
  mag_vector : numpy.ndarray
417
421
  Vector, shape (3).
422
+ instrument_frame : SpiceFrame
423
+ SPICE frame of the instrument.
418
424
 
419
425
  Returns
420
426
  -------
@@ -478,6 +484,7 @@ def transform_to_inertial(
478
484
  np.array([spin_phase_deg]),
479
485
  np.array([ra_deg]),
480
486
  np.array([dec_deg]),
487
+ instrument_frame,
481
488
  )[0]
482
489
 
483
490
  return inertial_vector
@@ -570,6 +577,7 @@ def process_packet(
570
577
  mago_times_all = []
571
578
  magi_vectors_all = []
572
579
  magi_times_all = []
580
+ incomplete_groups = []
573
581
 
574
582
  for group in unique_groups:
575
583
  # Get status values for each group.
@@ -581,10 +589,7 @@ def process_packet(
581
589
  ]
582
590
 
583
591
  if not np.array_equal(pkt_counter, np.arange(4)):
584
- logger.info(
585
- f"Group {group} does not contain all values from 0 to "
586
- f"3 without duplicates."
587
- )
592
+ incomplete_groups.append(group)
588
593
  continue
589
594
 
590
595
  # Get decoded status data.
@@ -648,6 +653,7 @@ def process_packet(
648
653
  attitude_time,
649
654
  time_data["primary_epoch"],
650
655
  mago_out,
656
+ SpiceFrame.IMAP_MAG_O,
651
657
  )
652
658
  magi_inertial_vector = transform_to_inertial(
653
659
  sc_spin_phase_rad.values,
@@ -656,6 +662,7 @@ def process_packet(
656
662
  attitude_time,
657
663
  time_data["secondary_epoch"],
658
664
  magi_out,
665
+ SpiceFrame.IMAP_MAG_I,
659
666
  )
660
667
 
661
668
  met = grouped_data["met"][(grouped_data["group"] == group).values]
@@ -665,6 +672,13 @@ def process_packet(
665
672
  magi_vectors_all.append(magi_inertial_vector)
666
673
  magi_times_all.append(time_data["secondary_epoch"])
667
674
 
675
+ if incomplete_groups:
676
+ logger.info(
677
+ f"The following mag groups were skipped due to "
678
+ f"missing or duplicate pkt_counter values: "
679
+ f"{incomplete_groups}"
680
+ )
681
+
668
682
  mago_corrected, magnitude = apply_gradiometry_correction(
669
683
  np.array(mago_vectors_all),
670
684
  np.array(mago_times_all),
@@ -127,6 +127,7 @@ def process_hit(xarray_data: xr.Dataset) -> list[dict]:
127
127
  Dictionary final data product.
128
128
  """
129
129
  hit_data = []
130
+ incomplete_groups = []
130
131
 
131
132
  # Subsecond time conversion specified in 7516-9054 GSW-FSW ICD.
132
133
  # Value of SCLK subseconds, unsigned, (LSB = 1/256 sec)
@@ -148,10 +149,7 @@ def process_hit(xarray_data: xr.Dataset) -> list[dict]:
148
149
 
149
150
  # Ensure no duplicates and all values from 0 to 59 are present
150
151
  if not np.array_equal(subcom_values, np.arange(60)):
151
- logger.warning(
152
- f"Group {group} does not contain all values from 0 to "
153
- f"59 without duplicates."
154
- )
152
+ incomplete_groups.append(group)
155
153
  continue
156
154
 
157
155
  fast_rate_1 = grouped_data["hit_fast_rate_1"][
@@ -187,4 +185,11 @@ def process_hit(xarray_data: xr.Dataset) -> list[dict]:
187
185
  }
188
186
  )
189
187
 
188
+ if incomplete_groups:
189
+ logger.info(
190
+ f"The following hit groups were skipped due to "
191
+ f"missing or duplicate pkt_counter values: "
192
+ f"{incomplete_groups}"
193
+ )
194
+
190
195
  return hit_data
@@ -158,6 +158,7 @@ def process_swapi_ialirt(
158
158
  # Add required parameters.
159
159
  sci_dataset["met"] = met
160
160
  met_values = []
161
+ incomplete_groups = []
161
162
 
162
163
  grouped_dataset = find_groups(sci_dataset, (0, 11), "swapi_seq_number", "met")
163
164
 
@@ -179,12 +180,16 @@ def process_swapi_ialirt(
179
180
 
180
181
  # Ensure no duplicates and all values from 0 to 11 are present
181
182
  if not np.array_equal(seq_values.astype(int), np.arange(12)):
182
- logger.info(
183
- f"SWAPI group {group} does not contain all sequence values from 0 to "
184
- f"11 without duplicates."
185
- )
183
+ incomplete_groups.append(group)
186
184
  continue
187
185
 
186
+ if incomplete_groups:
187
+ logger.info(
188
+ f"The following swapi groups were skipped due to "
189
+ f"missing or duplicate pkt_counter values: "
190
+ f"{incomplete_groups}"
191
+ )
192
+
188
193
  raw_coin_count = process_sweep_data(grouped_dataset, "swapi_coin_cnt")
189
194
  raw_coin_rate = raw_coin_count / SWAPI_LIVETIME
190
195
  count_rate_error = np.sqrt(raw_coin_count) / SWAPI_LIVETIME
@@ -478,6 +478,7 @@ def process_swe(accumulated_data: xr.Dataset, in_flight_cal_files: list) -> list
478
478
  grouped_data = find_groups(accumulated_data, (0, 59), "swe_seq", "time_seconds")
479
479
  unique_groups = np.unique(grouped_data["group"])
480
480
  swe_data: list[dict] = []
481
+ incomplete_groups = []
481
482
 
482
483
  for group in unique_groups:
483
484
  # Sequence values for the group should be 0-59 with no duplicates.
@@ -485,10 +486,7 @@ def process_swe(accumulated_data: xr.Dataset, in_flight_cal_files: list) -> list
485
486
 
486
487
  # Ensure no duplicates and all values from 0 to 59 are present
487
488
  if not np.array_equal(seq_values, np.arange(60)):
488
- logger.info(
489
- f"Group {group} does not contain all values from 0 to "
490
- f"59 without duplicates."
491
- )
489
+ incomplete_groups.append(group)
492
490
  continue
493
491
  # Prepare raw counts array just for this group
494
492
  # (8 energy steps, 7 CEMs, 30 phi bins)
@@ -570,4 +568,11 @@ def process_swe(accumulated_data: xr.Dataset, in_flight_cal_files: list) -> list
570
568
  },
571
569
  )
572
570
 
571
+ if incomplete_groups:
572
+ logger.info(
573
+ f"The following swe groups were skipped due to "
574
+ f"missing or duplicate pkt_counter values: "
575
+ f"{incomplete_groups}"
576
+ )
577
+
573
578
  return swe_data
@@ -50,8 +50,6 @@ class SpiceFrame(IntEnum):
50
50
  IMAP_HI_90 = -43160
51
51
  IMAP_ULTRA_45 = -43200
52
52
  IMAP_ULTRA_90 = -43210
53
- # TODO: remove IMAP_MAG frame once all usages have been removed
54
- IMAP_MAG = -43999
55
53
  IMAP_MAG_BOOM = -43250
56
54
  IMAP_MAG_I = -43251
57
55
  IMAP_MAG_O = -43252
@@ -157,6 +157,7 @@ def decompress_image(
157
157
  pixel0: int,
158
158
  binary_data: str,
159
159
  packet_props: PacketProperties,
160
+ planes_per_packet: int = 1,
160
161
  ) -> NDArray:
161
162
  """
162
163
  Will decompress a binary string representing an image into a matrix of pixel values.
@@ -174,11 +175,15 @@ def decompress_image(
174
175
  packet_props : PacketProperties
175
176
  Properties of the packet, including width bit, mantissa bit length and pixel
176
177
  window dimensions.
178
+ planes_per_packet : int
179
+ Number of image planes in the packet. Default is 1.
177
180
 
178
181
  Returns
179
182
  -------
180
- p_decom : NDArray
181
- A 2D numpy array representing pixel values.
183
+ planes : NDArray
184
+ A 3D numpy array representing pixel values.
185
+ The last two dimensions correspond to the image dimensions, and the first
186
+ is the number of image planes.
182
187
  Each pixel is stored as an unsigned 16-bit integer (uint16).
183
188
 
184
189
  Notes
@@ -199,51 +204,58 @@ def decompress_image(
199
204
  )
200
205
 
201
206
  blocks_per_row = cols // pixels_per_block
202
-
203
- # Compressed pixel matrix
204
- p = np.zeros((rows, cols), dtype=np.uint16)
205
- # Decompressed pixel matrix
206
- p_decom = np.zeros((rows, cols), dtype=np.int16)
207
-
207
+ current_pixel0 = pixel0 # Use the parameter for first plane
208
+ planes = []
209
+ plane_num = 0
208
210
  pos = 0 # Starting position in the binary string
209
-
210
- for i in range(rows):
211
- for j in range(blocks_per_row):
212
- # Read the width for the block.
213
- w, pos = read_and_advance(binary_data, width_bit, pos)
214
- for k in range(pixels_per_block):
215
- # Handle the special case in which the width is 0
216
- if w == 0:
217
- value = 0
218
- else:
219
- # Find the value of each pixel in the block
220
- value, pos = read_and_advance(binary_data, w, pos)
221
-
222
- # if the least significant bit of value is set (odd)
223
- if value & 0x01:
224
- # value >> 1: shifts bits of value one place to the right
225
- # ~: bitwise NOT operator (flips bits)
226
- delta_f = ~(value >> 1)
227
- else:
228
- delta_f = value >> 1
229
-
230
- # Calculate the new pixel value and update pixel0
231
- column_index = j * pixels_per_block + k
232
- # 0xff is the hexadecimal representation of the number 255,
233
- # Keeps only the last 8 bits of the result of pixel0 - delta_f
234
- # This operation ensures that the result is within the range
235
- # of an 8-bit byte (0-255)
236
- # Use np.int16 for the arithmetic operation to avoid overflow
237
- # Then implicitly cast back to the p's uint16 dtype for storage
238
- p[i][column_index] = np.int16(pixel0) - delta_f
239
- # Perform logarithmic decompression on the pixel value
240
- p_decom[i][column_index] = log_decompression(
241
- p[i][column_index], mantissa_bit_length
242
- )
243
- pixel0 = p[i][column_index]
244
- pixel0 = p[i][0]
245
-
246
- return p_decom
211
+ while plane_num < planes_per_packet:
212
+ # Compressed pixel matrix
213
+ p = np.zeros((rows, cols), dtype=np.uint16)
214
+ # Decompressed pixel matrix
215
+ p_decom = np.zeros((rows, cols), dtype=np.int16)
216
+
217
+ for i in range(rows):
218
+ for j in range(blocks_per_row):
219
+ # Read the width for the block.
220
+ w, pos = read_and_advance(binary_data, width_bit, pos)
221
+ for k in range(pixels_per_block):
222
+ # Handle the special case in which the width is 0
223
+ if w == 0:
224
+ value = 0
225
+ else:
226
+ # Find the value of each pixel in the block
227
+ value, pos = read_and_advance(binary_data, w, pos)
228
+
229
+ # if the least significant bit of value is set (odd)
230
+ if value & 0x01:
231
+ # value >> 1: shifts bits of value one place to the right
232
+ # ~: bitwise NOT operator (flips bits)
233
+ delta_f = ~(value >> 1)
234
+ else:
235
+ delta_f = value >> 1
236
+
237
+ # Calculate the new pixel value and update pixel0
238
+ column_index = j * pixels_per_block + k
239
+ # 0xff is the hexadecimal representation of the number 255,
240
+ # Keeps only the last 8 bits of the result of pixel0 - delta_f
241
+ # This operation ensures that the result is within the range
242
+ # of an 8-bit byte (0-255)
243
+ # Use np.int16 for the arithmetic operation to avoid overflow
244
+ # Then implicitly cast back to the p's uint16 dtype for storage
245
+ p[i][column_index] = np.int16(current_pixel0) - delta_f
246
+ # Perform logarithmic decompression on the pixel value
247
+ p_decom[i][column_index] = log_decompression(
248
+ p[i][column_index], mantissa_bit_length
249
+ )
250
+ current_pixel0 = p[i][column_index]
251
+ current_pixel0 = p[i][0]
252
+ planes.append(p_decom)
253
+ plane_num += 1
254
+ # Read P00 for the next plane (if not the last plane)
255
+ if plane_num < planes_per_packet:
256
+ current_pixel0, pos = read_and_advance(binary_data, 8, pos)
257
+
258
+ return np.stack(planes)
247
259
 
248
260
 
249
261
  def read_image_raw_events_binary(
@@ -81,54 +81,66 @@ def process_ultra_tof(ds: xr.Dataset, packet_props: PacketProperties) -> xr.Data
81
81
  decom_data: defaultdict[str, list[np.ndarray]] = defaultdict(list)
82
82
  decom_data["packetdata"] = []
83
83
  valid_epoch = []
84
-
85
84
  for val, group in ds.groupby("epoch"):
86
85
  if set(group["sid"].values) >= set(
87
86
  np.arange(0, image_planes, planes_per_packet)
88
87
  ):
88
+ plane_count = 0
89
89
  valid_epoch.append(val)
90
90
  group.sortby("sid")
91
91
 
92
92
  for key in scalar_keys:
93
- decom_data[key].append(group[key].values)
93
+ # Repeat the scalar values for each image plane. There may be cases
94
+ # where the last packet has fewer planes than the planes_per_packet, so
95
+ # we slice to ensure the correct length.
96
+ decom_data[key].append(
97
+ np.tile(group[key].values, planes_per_packet)[:image_planes]
98
+ )
94
99
 
95
100
  image = []
96
101
  for i in range(num_image_packets):
97
102
  binary = convert_to_binary_string(group["packetdata"].values[i])
103
+ # Determine how many planes to decompress in this packet.
104
+ # the last packet might have fewer planes than planes_per_packet.
105
+ # Take the minimum of the remaining planes or the max planes per packet
106
+ # value.
107
+ planes_in_packet = min(image_planes - plane_count, planes_per_packet)
98
108
  decompressed = decompress_image(
99
109
  group["p00"].values[i],
100
110
  binary,
101
111
  packet_props,
112
+ planes_in_packet,
102
113
  )
103
114
  image.append(decompressed)
115
+ plane_count += planes_in_packet
104
116
 
105
- decom_data["packetdata"].append(np.stack(image))
117
+ decom_data["packetdata"].append(np.concatenate(image, axis=0))
106
118
 
107
119
  for key in scalar_keys:
108
- decom_data[key] = np.stack(decom_data[key])
120
+ decom_data[key] = np.stack(decom_data[key], axis=0)
109
121
 
110
- decom_data["packetdata"] = np.stack(decom_data["packetdata"])
122
+ decom_data["packetdata"] = np.stack(decom_data["packetdata"], axis=0)
111
123
 
112
124
  coords = {
113
125
  "epoch": np.array(valid_epoch, dtype=np.uint64),
114
- "sid": xr.DataArray(np.arange(num_image_packets), dims=["sid"], name="sid"),
126
+ "plane": xr.DataArray(np.arange(image_planes), dims=["plane"], name="plane"),
115
127
  "row": xr.DataArray(np.arange(rows), dims=["row"], name="row"),
116
128
  "column": xr.DataArray(np.arange(cols), dims=["column"], name="column"),
117
129
  }
118
130
 
119
131
  dataset = xr.Dataset(coords=coords)
120
132
 
121
- # Add scalar keys (2D: epoch x sid)
133
+ # Add scalar keys (2D: epoch x packets)
122
134
  for key in scalar_keys:
123
135
  dataset[key] = xr.DataArray(
124
136
  decom_data[key],
125
- dims=["epoch", "sid"],
137
+ dims=["epoch", "plane"],
126
138
  )
127
139
 
128
140
  # Add PACKETDATA (4D: epoch x sid x row x column)
129
141
  dataset["packetdata"] = xr.DataArray(
130
142
  decom_data["packetdata"],
131
- dims=["epoch", "sid", "row", "column"],
143
+ dims=["epoch", "plane", "row", "column"],
132
144
  )
133
145
 
134
146
  return dataset
@@ -137,8 +137,8 @@ ULTRA_EXTOF_HIGH_ANGULAR = PacketProperties(
137
137
  ULTRA_EXTOF_HIGH_TIME = PacketProperties(
138
138
  apid=[888, 952],
139
139
  logical_source=[
140
- "imap_ultra_l1a_45sensor-histogram-ena-extof-hi-time",
141
- "imap_ultra_l1a_90sensor-histogram-ena-extof-hi-time",
140
+ "imap_ultra_l1a_45sensor-histogram-ion-extof-hi-time",
141
+ "imap_ultra_l1a_90sensor-histogram-ion-extof-hi-time",
142
142
  ],
143
143
  addition_to_logical_desc="Energy By Time of Flight High Time Images",
144
144
  width=4,
@@ -153,8 +153,8 @@ ULTRA_EXTOF_HIGH_TIME = PacketProperties(
153
153
  ULTRA_EXTOF_HIGH_ENERGY = PacketProperties(
154
154
  apid=[887, 951],
155
155
  logical_source=[
156
- "imap_ultra_l1a_45sensor-histogram-ena-extof-hi-nrg",
157
- "imap_ultra_l1a_90sensor-histogram-ena-extof-hi-nrg",
156
+ "imap_ultra_l1a_45sensor-histogram-ion-extof-hi-nrg",
157
+ "imap_ultra_l1a_90sensor-histogram-ion-extof-hi-nrg",
158
158
  ],
159
159
  addition_to_logical_desc="Energy By Time of Flight High Energy Images",
160
160
  width=4,
@@ -75,6 +75,10 @@ VARIABLES_TO_WEIGHT_BY_POINTING_SET_EXPOSURE_TIMES_SOLID_ANGLE = [
75
75
  "sensitivity",
76
76
  "background_rates",
77
77
  "obs_date",
78
+ "geometric_function",
79
+ "efficiency",
80
+ "scatter_theta",
81
+ "scatter_phi",
78
82
  ]
79
83
 
80
84
  # These variables are dropped after they are used to
@@ -310,15 +314,17 @@ def generate_ultra_healpix_skymap(
310
314
  pointing_set.data["exposure_factor"] * pointing_set.solid_angle
311
315
  )
312
316
 
317
+ # Get variables that should be weighted by exposure and solid angle
318
+ existing_vars_to_weight = []
319
+ for var in VARIABLES_TO_WEIGHT_BY_POINTING_SET_EXPOSURE_TIMES_SOLID_ANGLE:
320
+ if var in pointing_set.data:
321
+ existing_vars_to_weight.append(var)
322
+
313
323
  # Initial processing for weighted quantities at PSET level
314
324
  # Weight the values by exposure and solid angle
315
325
  # Ensure only valid pointing set pixels contribute to the weighted mean.
316
- pointing_set.data[
317
- VARIABLES_TO_WEIGHT_BY_POINTING_SET_EXPOSURE_TIMES_SOLID_ANGLE
318
- ] = (
319
- pointing_set.data[
320
- VARIABLES_TO_WEIGHT_BY_POINTING_SET_EXPOSURE_TIMES_SOLID_ANGLE
321
- ]
326
+ pointing_set.data[existing_vars_to_weight] = (
327
+ pointing_set.data[existing_vars_to_weight]
322
328
  * pointing_set.data["pointing_set_exposure_times_solid_angle"]
323
329
  ).where(good_pixel_mask)
324
330
 
@@ -339,9 +345,9 @@ def generate_ultra_healpix_skymap(
339
345
  )
340
346
 
341
347
  # Subsequent processing for weighted quantities at SkyMap level
342
- skymap.data_1d[VARIABLES_TO_WEIGHT_BY_POINTING_SET_EXPOSURE_TIMES_SOLID_ANGLE] /= (
343
- skymap.data_1d["pointing_set_exposure_times_solid_angle"]
344
- )
348
+ skymap.data_1d[existing_vars_to_weight] /= skymap.data_1d[
349
+ "pointing_set_exposure_times_solid_angle"
350
+ ]
345
351
 
346
352
  # Background rates must be scaled by the ratio of the solid angles of the
347
353
  # map pixel / pointing set pixel
@@ -404,11 +410,10 @@ def generate_ultra_healpix_skymap(
404
410
  skymap.data_1d = skymap.data_1d.drop_vars(
405
411
  VARIABLES_TO_DROP_AFTER_INTENSITY_CALCULATION,
406
412
  )
407
-
408
413
  return skymap, np.array(all_pset_epochs)
409
414
 
410
415
 
411
- def ultra_l2(
416
+ def ultra_l2( # noqa: PLR0912
412
417
  data_dict: dict[str, xr.Dataset | str | Path],
413
418
  output_map_structure: (
414
419
  ena_maps.RectangularSkyMap | ena_maps.HealpixSkyMap
@@ -511,6 +516,7 @@ def ultra_l2(
511
516
  map_dataset = healpix_skymap.to_dataset()
512
517
  # Add attributes related to the map
513
518
  map_attrs = {
519
+ "HEALPix_solid_angle": str(healpix_skymap.solid_angle),
514
520
  "HEALPix_nside": str(output_map_structure.nside),
515
521
  "HEALPix_nest": str(output_map_structure.nested),
516
522
  }
@@ -585,6 +591,11 @@ def ultra_l2(
585
591
  # to "energy" for all instruments.
586
592
  map_dataset = map_dataset.rename({"energy_bin_geometric_mean": "energy"})
587
593
 
594
+ # Rename positional uncertainty variables if present
595
+ if "scatter_theta" in map_dataset and "scatter_phi" in map_dataset:
596
+ map_dataset = map_dataset.rename({"scatter_theta": "positional_uncert_theta"})
597
+ map_dataset = map_dataset.rename({"scatter_phi": "positional_uncert_phi"})
598
+
588
599
  # Add the defined attributes to the map's global attrs
589
600
  map_dataset.attrs.update(map_attrs)
590
601
 
@@ -650,6 +661,8 @@ def ultra_l2(
650
661
  )
651
662
  )
652
663
 
653
- # Adjust the dtype of obs_date to be int64
664
+ # Adjust the dtype of obs dates to be int64
654
665
  map_dataset["obs_date"] = map_dataset["obs_date"].astype(np.int64)
666
+ map_dataset["obs_date_range"] = map_dataset["obs_date_range"].astype(np.int64)
667
+
655
668
  return [map_dataset]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: imap-processing
3
- Version: 0.19.2
3
+ Version: 0.19.3
4
4
  Summary: IMAP Science Operations Center Processing
5
5
  License: MIT
6
6
  Keywords: IMAP,SDC,SOC,Science Operations
@@ -30,7 +30,7 @@ Provides-Extra: tools
30
30
  Requires-Dist: astropy-healpix (>=1.0)
31
31
  Requires-Dist: cdflib (>=1.3.6,<2.0.0)
32
32
  Requires-Dist: healpy (>=1.18.0,<2.0.0) ; extra == "map-visualization"
33
- Requires-Dist: imap-data-access (>=0.32.0)
33
+ Requires-Dist: imap-data-access (>=0.35.0)
34
34
  Requires-Dist: mypy (==1.10.1) ; extra == "dev"
35
35
  Requires-Dist: netcdf4 (>=1.7.2,<2.0.0) ; extra == "test"
36
36
  Requires-Dist: numpy (<=3)
@@ -1,5 +1,5 @@
1
1
  imap_processing/__init__.py,sha256=b9xHlf8_0OtN_OyhPlrC6ayahYR0QTt_e713NjxZObw,1305
2
- imap_processing/_version.py,sha256=WrWOXXcm6UvSTFtNjUagyYPNX0Y6V9-C2h9FtOgPEQ0,127
2
+ imap_processing/_version.py,sha256=caBJZAzVH0Oe2UY0UwvflCwyLfJGNXhd9_hNJUMQpUE,127
3
3
  imap_processing/ancillary/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  imap_processing/ancillary/ancillary_dataset_combiner.py,sha256=dSNmfVAvfFxB2lgVMRHWgow93SBZgQIPOMka7AIbYvY,16004
5
5
  imap_processing/ccsds/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -12,9 +12,9 @@ imap_processing/cdf/config/imap_codice_l1b_variable_attrs.yaml,sha256=9bxQBpyORB
12
12
  imap_processing/cdf/config/imap_codice_l2_variable_attrs.yaml,sha256=zui2KLTXQN5IZ7Ne3on5vLI2XbYpo5qLHO0Wddlmc6w,44137
13
13
  imap_processing/cdf/config/imap_constant_attrs.yaml,sha256=DcX5USOf8dNe7ZIB3WaNTjDj4FFLxKoYMKgSbtQFRqk,1176
14
14
  imap_processing/cdf/config/imap_default_global_cdf_attrs.yaml,sha256=3622EmoIdv9Kvb6eQ5JRv0GmA1-SFZaRBleuCMFhEUs,987
15
- imap_processing/cdf/config/imap_enamaps_l2-common_variable_attrs.yaml,sha256=VqGI619H-MInG4vF2pq3YNSbHYO5MeR2dQIAHAOSdfQ,8442
16
- imap_processing/cdf/config/imap_enamaps_l2-healpix_variable_attrs.yaml,sha256=GXJilaf5DG7zQ9VNxI_fkUMIEnmGO555f3nRKeWBfGc,2736
17
- imap_processing/cdf/config/imap_enamaps_l2-rectangular_variable_attrs.yaml,sha256=lg91p8RzaFyntcgmvPxkfc12ILvm_gwiHoE_0JKWhyI,3623
15
+ imap_processing/cdf/config/imap_enamaps_l2-common_variable_attrs.yaml,sha256=ywlCC_nZexEIhMcqw1MJiTDqiw97_1Oy_aTA3ZtLjTI,10056
16
+ imap_processing/cdf/config/imap_enamaps_l2-healpix_variable_attrs.yaml,sha256=_iuF1Q7xuAAxP2NfEzYcs7Awj8soF9bw6zYNG5vGvCE,3346
17
+ imap_processing/cdf/config/imap_enamaps_l2-rectangular_variable_attrs.yaml,sha256=zdmL_OdGojYt9KXH3dnIAT3ELNDvt6aXdVNyM04jizg,4299
18
18
  imap_processing/cdf/config/imap_glows_global_cdf_attrs.yaml,sha256=MkGQVokzjXmJRas0PsFHfeU5VQkThQSXK65EOs2mw6A,1854
19
19
  imap_processing/cdf/config/imap_glows_l1a_variable_attrs.yaml,sha256=aJCTUSEKKGl8W2c_PuFh0Pr-EEEV07F2h3_BrKxtSeY,13675
20
20
  imap_processing/cdf/config/imap_glows_l1b_variable_attrs.yaml,sha256=0twYoQwL9o-uSAdrExf9DUbDuKdX98-PCqgtCy_UgQA,19760
@@ -50,7 +50,7 @@ imap_processing/cdf/config/imap_swe_global_cdf_attrs.yaml,sha256=iWWXclloqkDHOb6
50
50
  imap_processing/cdf/config/imap_swe_l1a_variable_attrs.yaml,sha256=ZNQvNQOOaX82tUsM0AbNLUWQX7GZ0LZ-yndalxKpewM,5397
51
51
  imap_processing/cdf/config/imap_swe_l1b_variable_attrs.yaml,sha256=reAoX4LlgceBtka1res6j0wj_P7OM5OlZuPfNbM5xuM,7761
52
52
  imap_processing/cdf/config/imap_swe_l2_variable_attrs.yaml,sha256=bHG6c6n11KszlDXXtKeKtKBYmq6ikkb7ZeTUZSV1EKQ,7651
53
- imap_processing/cdf/config/imap_ultra_global_cdf_attrs.yaml,sha256=Z72DZjEDD_JBhHss0gWlrGBZPEw7HYcwOjNiFWizk3U,21330
53
+ imap_processing/cdf/config/imap_ultra_global_cdf_attrs.yaml,sha256=rezLAI6AJopkDe7ynT4INZPxRx7ZfjH0LuFSbTqgz7M,21330
54
54
  imap_processing/cdf/config/imap_ultra_l1a_variable_attrs.yaml,sha256=ylzIoJOfoU0NF-QnFvGEe_BySsGtVelo4IsStadHXCk,94698
55
55
  imap_processing/cdf/config/imap_ultra_l1b_variable_attrs.yaml,sha256=IetyCiGlF_Y3x9B47DqnDlSZMJjA8uFsokLYWn2byMg,12456
56
56
  imap_processing/cdf/config/imap_ultra_l1c_variable_attrs.yaml,sha256=Ooqha84ziw0fFmZMOVYfG3zYxu_N2LWSruCK-eNzKjU,4907
@@ -126,13 +126,13 @@ imap_processing/ialirt/calculate_ingest.py,sha256=oUGEDFafmE0KqsurczWOAWhYnbRY9S
126
126
  imap_processing/ialirt/constants.py,sha256=LH6ivNh6Ry0I3WSL6jQ4eBlKJ57g6xlkOtm9715Dnac,2299
127
127
  imap_processing/ialirt/generate_coverage.py,sha256=APdzKr5XbGxBbqK7DBIV69NoQJtKcOj1MCoGqfj7wJo,6419
128
128
  imap_processing/ialirt/l0/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
129
- imap_processing/ialirt/l0/ialirt_spice.py,sha256=ArmmAYrMFwd_rEzyh_5Bn2kHJ-tqzNT9TjdVryK0CWo,5771
129
+ imap_processing/ialirt/l0/ialirt_spice.py,sha256=T-B5ydWF67WJmnJbWYcRHXVyZZMmAoSO_2iwD531GpY,5689
130
130
  imap_processing/ialirt/l0/mag_l0_ialirt_data.py,sha256=vgIerXkk4ZoOxxVaNEgvM1ESWVkGusSZ-3k73-Cl_tI,5276
131
- imap_processing/ialirt/l0/parse_mag.py,sha256=Ft1Snu55mKi74WzyK2pYtV8Tcsv5ob7bul1ItGZWxo4,23049
131
+ imap_processing/ialirt/l0/parse_mag.py,sha256=DNihOVuY6MYhBkiWlVkRJp9KbJYVME3CrWIZDIHmuYU,23551
132
132
  imap_processing/ialirt/l0/process_codice.py,sha256=-gjxJltAGqqnIflvs5-wrZ2sS-1BjHYk0cMGxxhRdi0,1935
133
- imap_processing/ialirt/l0/process_hit.py,sha256=TuziQBsDz54mB8USCN87Knjqw-tv_xobO3eri1bKOpM,5472
134
- imap_processing/ialirt/l0/process_swapi.py,sha256=5SUjU0_IHbxda-w0563YFQOzc-j935PHPb2vyCbOgRc,8179
135
- imap_processing/ialirt/l0/process_swe.py,sha256=4zxFkCEpfIgSfk0GpKtgy9BAWunMcrXVHGUW6GFkp4s,18470
133
+ imap_processing/ialirt/l0/process_hit.py,sha256=x2ABROi9CNePsd6n5LrvYuIbmfcyL1PAFj5s3YdPInI,5598
134
+ imap_processing/ialirt/l0/process_swapi.py,sha256=bL_TnV8Ao6edZCjBDb6lPNJmBMBBAN-4x33yJbwcrcU,8295
135
+ imap_processing/ialirt/l0/process_swe.py,sha256=i3TRiuPxlf9Ece-jZpoYfMLo88ZBG6Z1gJeVl8PXuj4,18599
136
136
  imap_processing/ialirt/packet_definitions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
137
137
  imap_processing/ialirt/packet_definitions/ialirt.xml,sha256=-hlT16Mr2Q6uCUfJ3jdpw0mPdeGCcZiWiorbkiEanwA,40784
138
138
  imap_processing/ialirt/packet_definitions/ialirt_codicehi.xml,sha256=PwzGTJj4dROXJBqbT32UZ6swaPbjvXdXXn7E_Lxch2A,11367
@@ -203,7 +203,7 @@ imap_processing/spacecraft/packet_definitions/scid_x252.xml,sha256=vkeMi_r_nM0R4
203
203
  imap_processing/spacecraft/quaternions.py,sha256=VdW0R76i5QWnENPtewnnkf6oq6uQ6yhFVc_MLDtiRUs,4271
204
204
  imap_processing/spice/__init__.py,sha256=t5dNkU59mun7nZh-BDMApSC-Jie29-2ocFo_Qeu-2nk,17
205
205
  imap_processing/spice/config.py,sha256=UR0M6lrLeYVLj3cx9Rj6Q9-Bdb0NDlmNq8vXIV1k5l8,224
206
- imap_processing/spice/geometry.py,sha256=9YC-liAVr_0CmuvaPMOd5n7Q8pMr1j50c9MzLWW0-OE,22191
206
+ imap_processing/spice/geometry.py,sha256=GcCAP-eSN4QshAnZSS9qTd3HqTmgnZNHqgXFC851rx8,22101
207
207
  imap_processing/spice/pointing_frame.py,sha256=1YY4WvoKBZZ8qBg9p-dSZkT5btRK1BXt-J95fBD6C98,13592
208
208
  imap_processing/spice/repoint.py,sha256=MOf8Syu9eD-sHsLHwfq6BWlG1NOHpA757VUpJW7S_3o,9959
209
209
  imap_processing/spice/spin.py,sha256=qVEKe9GSc8RRewc9YtcvF9pgyVZ3LmBH8F0yCqNtaeg,10736
@@ -230,9 +230,9 @@ imap_processing/swe/utils/swe_utils.py,sha256=ztBWk4xZXzsOtJcztX3kK8zrDdsXKAN8qc
230
230
  imap_processing/ultra/__init__.py,sha256=Ga6Ioj68HnQ4moi7SxJdOyYmGHcRvKOh4uZUEPJZHl4,20
231
231
  imap_processing/ultra/constants.py,sha256=NzSGa-3umBkHJLXaCpHbOnIqSiHyhHoTUTumR05bQbA,4130
232
232
  imap_processing/ultra/l0/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
233
- imap_processing/ultra/l0/decom_tools.py,sha256=cB1ncDxjiHR6uMzm9Z3lCog09TuZzBTeqkz607_Bl74,9302
234
- imap_processing/ultra/l0/decom_ultra.py,sha256=3rpLeg3rJp6Z-62ijmK9OoWhVnEvTlHw8ZQ59oiACV0,13309
235
- imap_processing/ultra/l0/ultra_utils.py,sha256=Ln1vWRprQOdg0MuD6NT_2q36smUfGhlBtlbpM-EwZ1k,18905
233
+ imap_processing/ultra/l0/decom_tools.py,sha256=sbYT16wJnQj07pctXEflFe9GQOu_ZnIF9H2t79R5R-Q,10091
234
+ imap_processing/ultra/l0/decom_ultra.py,sha256=A7blZgzb5dfXXDW5usFs7vyZoPPHWgI8CKpmzE2Bi_g,14126
235
+ imap_processing/ultra/l0/ultra_utils.py,sha256=EM6GtbD5It384VOW7wpw2Ef5mcJNEmGWs4mJw5F8m4s,18905
236
236
  imap_processing/ultra/l1a/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
237
237
  imap_processing/ultra/l1a/ultra_l1a.py,sha256=em0bzciCTT1xPchDT_30B2--swaw9opocyI2DhXgg6w,6702
238
238
  imap_processing/ultra/l1b/badtimes.py,sha256=eOpSACoQ4WwqLHOd3xeStkvn81YRAvmrIOdEE_qDL4E,3586
@@ -252,15 +252,15 @@ imap_processing/ultra/l1c/ultra_l1c.py,sha256=qfW4nNhu6O10quG6rPr12Dy0vtCbclp9nN
252
252
  imap_processing/ultra/l1c/ultra_l1c_culling.py,sha256=g6wzSiTmoLuWl8ohWzYaNFVzCDEEVdTLMWcILqycGM4,3140
253
253
  imap_processing/ultra/l1c/ultra_l1c_pset_bins.py,sha256=FZttQdjMLFNE4U0ClAU_X8gMUCvuQYhIG7GLXoHcQgc,28231
254
254
  imap_processing/ultra/l2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
255
- imap_processing/ultra/l2/ultra_l2.py,sha256=VgrL082qRHVjgLdN6eYcj82k9ipjq8r7JZfUMEwoYmI,26264
255
+ imap_processing/ultra/l2/ultra_l2.py,sha256=s-qemQtLaVluuSaVYnDNcemy8nCVJPOmrO5WhAfxKMk,26936
256
256
  imap_processing/ultra/packet_definitions/README.md,sha256=Iam1bd6UVkRLayApXlHG_y4DyHRWfUFPMcEINZyA8qk,1450
257
257
  imap_processing/ultra/packet_definitions/ULTRA_SCI_COMBINED.xml,sha256=CYxYC93oqmVD1dZ6R6GRBxEOB5HP7wMNapUcYRWjFSk,939289
258
258
  imap_processing/ultra/packet_definitions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
259
259
  imap_processing/ultra/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
260
260
  imap_processing/ultra/utils/ultra_l1_utils.py,sha256=jFZts5If193WHRfYT1jRqNrTpfXB6CvJaBCkGFcgOx8,6576
261
261
  imap_processing/utils.py,sha256=B7TNQHUCK9Fz6whYmIiXZSEFlduvF9-EgDufg2omcH0,13931
262
- imap_processing-0.19.2.dist-info/LICENSE,sha256=F2rxhvc6auEI0Dk9IGjglQSQQk60EvTe8M1dORMZPOg,1098
263
- imap_processing-0.19.2.dist-info/METADATA,sha256=mdftJc8Ub_DWSzi49QwZoTzHDfgKpmomejf-9KbpCuw,9102
264
- imap_processing-0.19.2.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
265
- imap_processing-0.19.2.dist-info/entry_points.txt,sha256=5r8ijLImHSNJxr-SGDC8kJy81BtXjmeUOmNfWSfLuRs,104
266
- imap_processing-0.19.2.dist-info/RECORD,,
262
+ imap_processing-0.19.3.dist-info/LICENSE,sha256=F2rxhvc6auEI0Dk9IGjglQSQQk60EvTe8M1dORMZPOg,1098
263
+ imap_processing-0.19.3.dist-info/METADATA,sha256=Zucs1Pp6pU4pO4z5Xq3BD3LEoIfINOjJD-7xqLPT9bI,9102
264
+ imap_processing-0.19.3.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
265
+ imap_processing-0.19.3.dist-info/entry_points.txt,sha256=5r8ijLImHSNJxr-SGDC8kJy81BtXjmeUOmNfWSfLuRs,104
266
+ imap_processing-0.19.3.dist-info/RECORD,,