imap-processing 0.17.0__py3-none-any.whl → 0.19.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of imap-processing might be problematic. Click here for more details.

Files changed (141) hide show
  1. imap_processing/_version.py +2 -2
  2. imap_processing/ancillary/ancillary_dataset_combiner.py +161 -1
  3. imap_processing/ccsds/excel_to_xtce.py +12 -0
  4. imap_processing/cdf/config/imap_codice_global_cdf_attrs.yaml +6 -6
  5. imap_processing/cdf/config/imap_codice_l1a_variable_attrs.yaml +312 -274
  6. imap_processing/cdf/config/imap_codice_l1b_variable_attrs.yaml +39 -28
  7. imap_processing/cdf/config/imap_codice_l2_variable_attrs.yaml +1048 -183
  8. imap_processing/cdf/config/imap_constant_attrs.yaml +4 -2
  9. imap_processing/cdf/config/imap_glows_l1b_variable_attrs.yaml +12 -0
  10. imap_processing/cdf/config/imap_hi_global_cdf_attrs.yaml +5 -0
  11. imap_processing/cdf/config/imap_hit_global_cdf_attrs.yaml +10 -4
  12. imap_processing/cdf/config/imap_hit_l1a_variable_attrs.yaml +163 -100
  13. imap_processing/cdf/config/imap_hit_l2_variable_attrs.yaml +4 -4
  14. imap_processing/cdf/config/imap_ialirt_l1_variable_attrs.yaml +97 -54
  15. imap_processing/cdf/config/imap_idex_l2a_variable_attrs.yaml +33 -4
  16. imap_processing/cdf/config/imap_idex_l2b_variable_attrs.yaml +44 -44
  17. imap_processing/cdf/config/imap_idex_l2c_variable_attrs.yaml +77 -61
  18. imap_processing/cdf/config/imap_lo_global_cdf_attrs.yaml +30 -0
  19. imap_processing/cdf/config/imap_lo_l1a_variable_attrs.yaml +4 -15
  20. imap_processing/cdf/config/imap_lo_l1c_variable_attrs.yaml +189 -98
  21. imap_processing/cdf/config/imap_mag_global_cdf_attrs.yaml +99 -2
  22. imap_processing/cdf/config/imap_mag_l1c_variable_attrs.yaml +24 -1
  23. imap_processing/cdf/config/imap_ultra_global_cdf_attrs.yaml +60 -0
  24. imap_processing/cdf/config/imap_ultra_l1b_variable_attrs.yaml +99 -11
  25. imap_processing/cdf/config/imap_ultra_l1c_variable_attrs.yaml +50 -7
  26. imap_processing/cli.py +121 -44
  27. imap_processing/codice/codice_l1a.py +165 -77
  28. imap_processing/codice/codice_l1b.py +1 -1
  29. imap_processing/codice/codice_l2.py +118 -19
  30. imap_processing/codice/constants.py +1217 -1089
  31. imap_processing/decom.py +1 -4
  32. imap_processing/ena_maps/ena_maps.py +32 -25
  33. imap_processing/ena_maps/utils/naming.py +8 -2
  34. imap_processing/glows/ancillary/imap_glows_exclusions-by-instr-team_20250923_v002.dat +10 -0
  35. imap_processing/glows/ancillary/imap_glows_map-of-excluded-regions_20250923_v002.dat +393 -0
  36. imap_processing/glows/ancillary/imap_glows_map-of-uv-sources_20250923_v002.dat +593 -0
  37. imap_processing/glows/ancillary/imap_glows_pipeline_settings_20250923_v002.json +54 -0
  38. imap_processing/glows/ancillary/imap_glows_suspected-transients_20250923_v002.dat +10 -0
  39. imap_processing/glows/l1b/glows_l1b.py +99 -9
  40. imap_processing/glows/l1b/glows_l1b_data.py +350 -38
  41. imap_processing/glows/l2/glows_l2.py +11 -0
  42. imap_processing/hi/hi_l1a.py +124 -3
  43. imap_processing/hi/hi_l1b.py +154 -71
  44. imap_processing/hi/hi_l2.py +84 -51
  45. imap_processing/hi/utils.py +153 -8
  46. imap_processing/hit/l0/constants.py +3 -0
  47. imap_processing/hit/l0/decom_hit.py +5 -8
  48. imap_processing/hit/l1a/hit_l1a.py +375 -45
  49. imap_processing/hit/l1b/constants.py +5 -0
  50. imap_processing/hit/l1b/hit_l1b.py +61 -131
  51. imap_processing/hit/l2/constants.py +1 -1
  52. imap_processing/hit/l2/hit_l2.py +10 -11
  53. imap_processing/ialirt/calculate_ingest.py +219 -0
  54. imap_processing/ialirt/constants.py +32 -1
  55. imap_processing/ialirt/generate_coverage.py +201 -0
  56. imap_processing/ialirt/l0/ialirt_spice.py +5 -2
  57. imap_processing/ialirt/l0/parse_mag.py +337 -29
  58. imap_processing/ialirt/l0/process_hit.py +5 -3
  59. imap_processing/ialirt/l0/process_swapi.py +41 -25
  60. imap_processing/ialirt/l0/process_swe.py +23 -7
  61. imap_processing/ialirt/process_ephemeris.py +70 -14
  62. imap_processing/ialirt/utils/constants.py +22 -16
  63. imap_processing/ialirt/utils/create_xarray.py +42 -19
  64. imap_processing/idex/idex_constants.py +1 -5
  65. imap_processing/idex/idex_l0.py +2 -2
  66. imap_processing/idex/idex_l1a.py +2 -3
  67. imap_processing/idex/idex_l1b.py +2 -3
  68. imap_processing/idex/idex_l2a.py +130 -4
  69. imap_processing/idex/idex_l2b.py +313 -119
  70. imap_processing/idex/idex_utils.py +1 -3
  71. imap_processing/lo/l0/lo_apid.py +1 -0
  72. imap_processing/lo/l0/lo_science.py +25 -24
  73. imap_processing/lo/l1a/lo_l1a.py +44 -0
  74. imap_processing/lo/l1b/lo_l1b.py +3 -3
  75. imap_processing/lo/l1c/lo_l1c.py +116 -50
  76. imap_processing/lo/l2/lo_l2.py +29 -29
  77. imap_processing/lo/lo_ancillary.py +55 -0
  78. imap_processing/lo/packet_definitions/lo_xtce.xml +5359 -106
  79. imap_processing/mag/constants.py +1 -0
  80. imap_processing/mag/l1a/mag_l1a.py +1 -0
  81. imap_processing/mag/l1a/mag_l1a_data.py +26 -0
  82. imap_processing/mag/l1b/mag_l1b.py +3 -2
  83. imap_processing/mag/l1c/interpolation_methods.py +14 -15
  84. imap_processing/mag/l1c/mag_l1c.py +23 -6
  85. imap_processing/mag/l1d/__init__.py +0 -0
  86. imap_processing/mag/l1d/mag_l1d.py +176 -0
  87. imap_processing/mag/l1d/mag_l1d_data.py +725 -0
  88. imap_processing/mag/l2/__init__.py +0 -0
  89. imap_processing/mag/l2/mag_l2.py +25 -20
  90. imap_processing/mag/l2/mag_l2_data.py +199 -130
  91. imap_processing/quality_flags.py +28 -2
  92. imap_processing/spice/geometry.py +101 -36
  93. imap_processing/spice/pointing_frame.py +1 -7
  94. imap_processing/spice/repoint.py +29 -2
  95. imap_processing/spice/spin.py +32 -8
  96. imap_processing/spice/time.py +60 -19
  97. imap_processing/swapi/l1/swapi_l1.py +10 -4
  98. imap_processing/swapi/l2/swapi_l2.py +66 -24
  99. imap_processing/swapi/swapi_utils.py +1 -1
  100. imap_processing/swe/l1b/swe_l1b.py +3 -6
  101. imap_processing/ultra/constants.py +28 -3
  102. imap_processing/ultra/l0/decom_tools.py +15 -8
  103. imap_processing/ultra/l0/decom_ultra.py +35 -11
  104. imap_processing/ultra/l0/ultra_utils.py +102 -12
  105. imap_processing/ultra/l1a/ultra_l1a.py +26 -6
  106. imap_processing/ultra/l1b/cullingmask.py +6 -3
  107. imap_processing/ultra/l1b/de.py +122 -26
  108. imap_processing/ultra/l1b/extendedspin.py +29 -2
  109. imap_processing/ultra/l1b/lookup_utils.py +424 -50
  110. imap_processing/ultra/l1b/quality_flag_filters.py +23 -0
  111. imap_processing/ultra/l1b/ultra_l1b_culling.py +356 -5
  112. imap_processing/ultra/l1b/ultra_l1b_extended.py +534 -90
  113. imap_processing/ultra/l1c/helio_pset.py +127 -7
  114. imap_processing/ultra/l1c/l1c_lookup_utils.py +256 -0
  115. imap_processing/ultra/l1c/spacecraft_pset.py +90 -15
  116. imap_processing/ultra/l1c/ultra_l1c.py +6 -0
  117. imap_processing/ultra/l1c/ultra_l1c_culling.py +85 -0
  118. imap_processing/ultra/l1c/ultra_l1c_pset_bins.py +446 -341
  119. imap_processing/ultra/l2/ultra_l2.py +0 -1
  120. imap_processing/ultra/utils/ultra_l1_utils.py +40 -3
  121. imap_processing/utils.py +3 -4
  122. {imap_processing-0.17.0.dist-info → imap_processing-0.19.0.dist-info}/METADATA +3 -3
  123. {imap_processing-0.17.0.dist-info → imap_processing-0.19.0.dist-info}/RECORD +126 -126
  124. imap_processing/idex/idex_l2c.py +0 -250
  125. imap_processing/spice/kernels.py +0 -187
  126. imap_processing/ultra/lookup_tables/Angular_Profiles_FM45_LeftSlit.csv +0 -526
  127. imap_processing/ultra/lookup_tables/Angular_Profiles_FM45_RightSlit.csv +0 -526
  128. imap_processing/ultra/lookup_tables/Angular_Profiles_FM90_LeftSlit.csv +0 -526
  129. imap_processing/ultra/lookup_tables/Angular_Profiles_FM90_RightSlit.csv +0 -524
  130. imap_processing/ultra/lookup_tables/EgyNorm.mem.csv +0 -32769
  131. imap_processing/ultra/lookup_tables/FM45_Startup1_ULTRA_IMGPARAMS_20240719.csv +0 -2
  132. imap_processing/ultra/lookup_tables/FM90_Startup1_ULTRA_IMGPARAMS_20240719.csv +0 -2
  133. imap_processing/ultra/lookup_tables/dps_grid45_compressed.cdf +0 -0
  134. imap_processing/ultra/lookup_tables/ultra45_back-pos-luts.csv +0 -4097
  135. imap_processing/ultra/lookup_tables/ultra45_tdc_norm.csv +0 -2050
  136. imap_processing/ultra/lookup_tables/ultra90_back-pos-luts.csv +0 -4097
  137. imap_processing/ultra/lookup_tables/ultra90_tdc_norm.csv +0 -2050
  138. imap_processing/ultra/lookup_tables/yadjust.csv +0 -257
  139. {imap_processing-0.17.0.dist-info → imap_processing-0.19.0.dist-info}/LICENSE +0 -0
  140. {imap_processing-0.17.0.dist-info → imap_processing-0.19.0.dist-info}/WHEEL +0 -0
  141. {imap_processing-0.17.0.dist-info → imap_processing-0.19.0.dist-info}/entry_points.txt +0 -0
imap_processing/cli.py CHANGED
@@ -36,7 +36,10 @@ from imap_data_access.processing_input import (
36
36
 
37
37
  import imap_processing
38
38
  from imap_processing._version import __version__, __version_tuple__ # noqa: F401
39
- from imap_processing.ancillary.ancillary_dataset_combiner import MagAncillaryCombiner
39
+ from imap_processing.ancillary.ancillary_dataset_combiner import (
40
+ GlowsAncillaryCombiner,
41
+ MagAncillaryCombiner,
42
+ )
40
43
  from imap_processing.cdf.utils import load_cdf, write_cdf
41
44
 
42
45
  # TODO: change how we import things and also folder
@@ -59,7 +62,6 @@ from imap_processing.idex.idex_l1a import PacketParser
59
62
  from imap_processing.idex.idex_l1b import idex_l1b
60
63
  from imap_processing.idex.idex_l2a import idex_l2a
61
64
  from imap_processing.idex.idex_l2b import idex_l2b
62
- from imap_processing.idex.idex_l2c import idex_l2c
63
65
  from imap_processing.lo.l1a import lo_l1a
64
66
  from imap_processing.lo.l1b import lo_l1b
65
67
  from imap_processing.lo.l1c import lo_l1c
@@ -68,6 +70,7 @@ from imap_processing.mag.constants import DataMode
68
70
  from imap_processing.mag.l1a.mag_l1a import mag_l1a
69
71
  from imap_processing.mag.l1b.mag_l1b import mag_l1b
70
72
  from imap_processing.mag.l1c.mag_l1c import mag_l1c
73
+ from imap_processing.mag.l1d.mag_l1d import mag_l1d
71
74
  from imap_processing.mag.l2.mag_l2 import mag_l2
72
75
  from imap_processing.spacecraft import quaternions
73
76
  from imap_processing.spice import pointing_frame, repoint, spin
@@ -378,7 +381,7 @@ class ProcessInstrument(ABC):
378
381
  data_level: str,
379
382
  data_descriptor: str,
380
383
  dependency_str: str,
381
- start_date: str | None,
384
+ start_date: str,
382
385
  repointing: str | None,
383
386
  version: str,
384
387
  upload_to_sdc: bool,
@@ -516,7 +519,7 @@ class ProcessInstrument(ABC):
516
519
  self,
517
520
  processed_data: list[xr.Dataset | Path],
518
521
  dependencies: ProcessingInputCollection,
519
- ) -> None:
522
+ ) -> list[Path]:
520
523
  """
521
524
  Complete post-processing.
522
525
 
@@ -544,10 +547,17 @@ class ProcessInstrument(ABC):
544
547
  method.
545
548
  dependencies : ProcessingInputCollection
546
549
  Object containing dependencies to process.
550
+
551
+ Returns
552
+ -------
553
+ list[Path]
554
+ List of paths to CDF files produced.
547
555
  """
556
+ products: list[Path] = []
557
+
548
558
  if len(processed_data) == 0:
549
559
  logger.info("No products to write to CDF file.")
550
- return
560
+ return products
551
561
 
552
562
  logger.info("Writing products to local storage")
553
563
 
@@ -567,7 +577,6 @@ class ProcessInstrument(ABC):
567
577
  # start_date.
568
578
  # If it is start_date, skip repointing in the output filename.
569
579
 
570
- products = []
571
580
  for ds in processed_data:
572
581
  if isinstance(ds, xr.Dataset):
573
582
  ds.attrs["Data_version"] = self.version[1:] # Strip 'v' from version
@@ -581,6 +590,7 @@ class ProcessInstrument(ABC):
581
590
  products.append(ds)
582
591
 
583
592
  self.upload_products(products)
593
+ return products
584
594
 
585
595
  @final
586
596
  def cleanup(self) -> None:
@@ -678,11 +688,58 @@ class Glows(ProcessInstrument):
678
688
  science_files = dependencies.get_file_paths(source="glows")
679
689
  if len(science_files) != 1:
680
690
  raise ValueError(
681
- f"GLOWS L1A requires exactly one input science file, received: "
691
+ f"GLOWS L1B requires exactly one input science file, received: "
682
692
  f"{science_files}."
683
693
  )
684
694
  input_dataset = load_cdf(science_files[0])
685
- datasets = [glows_l1b(input_dataset)]
695
+ # TODO: Replace this by reading from AWS/ProcessingInputs
696
+
697
+ glows_ancillary_dir = Path(__file__).parent / "glows" / "ancillary"
698
+
699
+ # Create file lists for each ancillary type
700
+ excluded_regions_files = [
701
+ glows_ancillary_dir
702
+ / "imap_glows_map-of-excluded-regions_20250923_v002.dat"
703
+ ]
704
+ uv_sources_files = [
705
+ glows_ancillary_dir / "imap_glows_map-of-uv-sources_20250923_v002.dat"
706
+ ]
707
+ suspected_transients_files = [
708
+ glows_ancillary_dir
709
+ / "imap_glows_suspected-transients_20250923_v002.dat"
710
+ ]
711
+ exclusions_by_instr_team_files = [
712
+ glows_ancillary_dir
713
+ / "imap_glows_exclusions-by-instr-team_20250923_v002.dat"
714
+ ]
715
+
716
+ # Use end date buffer for ancillary data
717
+ current_day = np.datetime64(
718
+ f"{self.start_date[:4]}-{self.start_date[4:6]}-{self.start_date[6:]}"
719
+ )
720
+ day_buffer = current_day + np.timedelta64(3, "D")
721
+
722
+ # Create combiners for each ancillary dataset
723
+ excluded_regions_combiner = GlowsAncillaryCombiner(
724
+ excluded_regions_files, day_buffer
725
+ )
726
+ uv_sources_combiner = GlowsAncillaryCombiner(uv_sources_files, day_buffer)
727
+ suspected_transients_combiner = GlowsAncillaryCombiner(
728
+ suspected_transients_files, day_buffer
729
+ )
730
+ exclusions_by_instr_team_combiner = GlowsAncillaryCombiner(
731
+ exclusions_by_instr_team_files, day_buffer
732
+ )
733
+
734
+ datasets = [
735
+ glows_l1b(
736
+ input_dataset,
737
+ excluded_regions_combiner.combined_dataset,
738
+ uv_sources_combiner.combined_dataset,
739
+ suspected_transients_combiner.combined_dataset,
740
+ exclusions_by_instr_team_combiner.combined_dataset,
741
+ )
742
+ ]
686
743
 
687
744
  if self.data_level == "l2":
688
745
  science_files = dependencies.get_file_paths(source="glows")
@@ -730,10 +787,18 @@ class Hi(ProcessInstrument):
730
787
  elif self.data_level == "l1b":
731
788
  l0_files = dependencies.get_file_paths(source="hi", descriptor="raw")
732
789
  if l0_files:
733
- datasets = hi_l1b.hi_l1b(l0_files[0])
790
+ datasets = hi_l1b.housekeeping(l0_files[0])
734
791
  else:
735
- l1a_files = dependencies.get_file_paths(source="hi", data_type="l1a")
736
- datasets = hi_l1b.hi_l1b(load_cdf(l1a_files[0]))
792
+ l1a_de_file = dependencies.get_file_paths(
793
+ source="hi", data_type="l1a", descriptor="de"
794
+ )[0]
795
+ l1b_hk_file = dependencies.get_file_paths(
796
+ source="hi", data_type="l1b", descriptor="hk"
797
+ )[0]
798
+ esa_energies_csv = dependencies.get_file_paths(data_type="ancillary")[0]
799
+ datasets = hi_l1b.annotate_direct_events(
800
+ load_cdf(l1a_de_file), load_cdf(l1b_hk_file), esa_energies_csv
801
+ )
737
802
  elif self.data_level == "l1c":
738
803
  science_paths = dependencies.get_file_paths(source="hi", data_type="l1b")
739
804
  if len(science_paths) != 1:
@@ -788,37 +853,41 @@ class Hit(ProcessInstrument):
788
853
 
789
854
  dependency_list = dependencies.processing_input
790
855
  if self.data_level == "l1a":
791
- # 1 science files and 2 spice files
792
- if len(dependency_list) > 3:
856
+ # Two inputs - L0 and SPICE
857
+ if len(dependency_list) > 2:
793
858
  raise ValueError(
794
859
  f"Unexpected dependencies found for HIT L1A:"
795
- f"{dependency_list}. Expected only one dependency."
860
+ f"{dependency_list}. Expected only 2 dependencies, "
861
+ f"L0 and time kernels."
796
862
  )
797
863
  # process data to L1A products
798
864
  science_files = dependencies.get_file_paths(source="hit", descriptor="raw")
799
- datasets = hit_l1a(science_files[0])
865
+ datasets = hit_l1a(science_files[0], self.start_date)
800
866
 
801
867
  elif self.data_level == "l1b":
802
- data_dict = {}
803
- # TODO: Sean removed the file number error handling to work with the
804
- # new SPICE dependencies for SIT-4. Need to review and make changes
805
- # if needed.
806
868
  l0_files = dependencies.get_file_paths(source="hit", descriptor="raw")
807
869
  l1a_files = dependencies.get_file_paths(source="hit", data_type="l1a")
808
- if len(l0_files) > 0:
809
- # Add path to CCSDS file to process housekeeping
810
- data_dict["imap_hit_l0_raw"] = l0_files[0]
870
+ if len(l0_files) == 1:
871
+ # Path to CCSDS file to process housekeeping
872
+ dependency = l0_files[0]
811
873
  else:
874
+ # 1 science file
875
+ if len(l1a_files) > 1:
876
+ raise ValueError(
877
+ f"Unexpected dependencies found for HIT L1B:"
878
+ f"{l1a_files}. Expected only one dependency."
879
+ )
812
880
  # Add L1A dataset to process science data
813
- l1a_dataset = load_cdf(l1a_files[0])
814
- data_dict[l1a_dataset.attrs["Logical_source"]] = l1a_dataset
881
+ dependency = load_cdf(l1a_files[0])
815
882
  # process data to L1B products
816
- datasets = hit_l1b(data_dict)
883
+ datasets = [hit_l1b(dependency, self.descriptor)]
884
+
817
885
  elif self.data_level == "l2":
886
+ # 1 science files and 4 ancillary files
818
887
  if len(dependency_list) != 5:
819
888
  raise ValueError(
820
889
  f"Unexpected dependencies found for HIT L2:"
821
- f"{dependency_list}. Expected only one dependency."
890
+ f"{dependency_list}. Expected only five dependencies."
822
891
  )
823
892
  # Add L1B dataset to process science data
824
893
  science_files = dependencies.get_file_paths(
@@ -838,7 +907,7 @@ class Hit(ProcessInstrument):
838
907
  )
839
908
  l1b_dataset = load_cdf(science_files[0])
840
909
  # process data to L2 products
841
- datasets = hit_l2(l1b_dataset, ancillary_files)
910
+ datasets = [hit_l2(l1b_dataset, ancillary_files)]
842
911
 
843
912
  return datasets
844
913
 
@@ -887,14 +956,18 @@ class Idex(ProcessInstrument):
887
956
  dependency = load_cdf(science_files[0])
888
957
  datasets = [idex_l1b(dependency)]
889
958
  elif self.data_level == "l2a":
890
- if len(dependency_list) != 1:
959
+ if len(dependency_list) != 3:
891
960
  raise ValueError(
892
961
  f"Unexpected dependencies found for IDEX L2A:"
893
- f"{dependency_list}. Expected only one dependency."
962
+ f"{dependency_list}. Expected three dependencies."
894
963
  )
895
964
  science_files = dependencies.get_file_paths(source="idex")
896
965
  dependency = load_cdf(science_files[0])
897
- datasets = [idex_l2a(dependency)]
966
+ anc_paths = dependencies.get_file_paths(data_type="ancillary")
967
+ ancillary_files = {}
968
+ for path in anc_paths:
969
+ ancillary_files[path.stem.split("_")[2]] = path
970
+ datasets = [idex_l2a(dependency, ancillary_files)]
898
971
  elif self.data_level == "l2b":
899
972
  if len(dependency_list) < 3 or len(dependency_list) > 4:
900
973
  raise ValueError(
@@ -908,16 +981,7 @@ class Idex(ProcessInstrument):
908
981
  hk_files = dependencies.get_file_paths(source="idex", descriptor="evt")
909
982
  # Remove duplicate housekeeping files
910
983
  hk_dependencies = [load_cdf(dep) for dep in list(set(hk_files))]
911
- datasets = [idex_l2b(sci_dependencies, hk_dependencies)]
912
- elif self.data_level == "l2c":
913
- if len(dependency_list) != 1:
914
- raise ValueError(
915
- f"Unexpected dependencies found for IDEX L2C:"
916
- f"{dependency_list}. Expected only one dependency."
917
- )
918
- sci_files = dependencies.get_file_paths(source="idex", descriptor="sci-1mo")
919
- dependency = load_cdf(sci_files[0])
920
- datasets = idex_l2c(dependency)
984
+ datasets = idex_l2b(sci_dependencies, hk_dependencies)
921
985
  return datasets
922
986
 
923
987
 
@@ -977,15 +1041,13 @@ class Lo(ProcessInstrument):
977
1041
  data_dict = {}
978
1042
  # TODO: Add ancillary descriptors when maps using them are
979
1043
  # implemented.
980
- anc_dependencies = dependencies.get_file_paths(
981
- source="lo",
982
- )
1044
+ anc_dependencies = []
983
1045
  science_files = dependencies.get_file_paths(source="lo", descriptor="pset")
984
1046
  psets = []
985
1047
  for file in science_files:
986
1048
  psets.append(load_cdf(file))
987
1049
  data_dict[psets[0].attrs["Logical_source"]] = psets
988
- datasets = lo_l2.lo_l2(data_dict, anc_dependencies)
1050
+ datasets = lo_l2.lo_l2(data_dict, anc_dependencies, self.descriptor)
989
1051
  return datasets
990
1052
 
991
1053
 
@@ -1073,6 +1135,21 @@ class Mag(ProcessInstrument):
1073
1135
  f"Invalid dependencies found for MAG L1C:"
1074
1136
  f"{dependencies}. Expected one or two dependencies."
1075
1137
  )
1138
+ if self.data_level == "l1d":
1139
+ science_files = dependencies.get_file_paths(source="mag", data_type="l1c")
1140
+ science_files.extend(
1141
+ dependencies.get_file_paths(source="mag", data_type="l1b")
1142
+ )
1143
+ input_data = [load_cdf(dep) for dep in science_files]
1144
+ calibration = dependencies.get_processing_inputs(
1145
+ descriptor="l1d-calibration"
1146
+ )
1147
+ combined_calibration = MagAncillaryCombiner(calibration[0], day_buffer)
1148
+ datasets = mag_l1d(
1149
+ input_data,
1150
+ combined_calibration.combined_dataset,
1151
+ current_day,
1152
+ )
1076
1153
 
1077
1154
  if self.data_level == "l2":
1078
1155
  science_files = dependencies.get_file_paths(source="mag", data_type="l1b")