diff --git a/mappings/mast/groups.json b/mappings/mast/groups.json index 6a80e93..9f4d9ab 100644 --- a/mappings/mast/groups.json +++ b/mappings/mast/groups.json @@ -5,8 +5,9 @@ "ahx": {"name": "hard_x_rays", "imas": "hard_x_rays"}, "ait": {"name": "camera_ir", "imas": "camera_ir"}, "alp": {"name": "langmuir_probes", "imas": "langmuir_probes"}, + "ama": {"name": "magnetics_a", "imas": "magnetics"}, "amb": {"name": "magnetics_b", "imas": "magnetics"}, - "amc": {"name": "magnetics", "imas": "magnetics"}, + "amc": {"name": "magnetics_c", "imas": "magnetics"}, "anb": {"name": "nbi", "imas": "nbi"}, "ane": {"name": "interferometer", "imas": "interferometer"}, "anu": {"name": "neutron_diagnostic", "imas": "neutron_diagnostic"}, @@ -28,9 +29,10 @@ "xbt": {"name": "bes"}, "xdc": {"name": "pulse_schedule", "imas": "pulse_schedule"}, "xim": {"name": "spectrometer_visible", "imas": "spectrometer_visible"}, - "xma": {"name": "magnetics_a", "imas": "magnetics"}, - "xmc": {"name": "magnetics_c", "imas": "magnetics"}, - "xmo": {"name": "magnetics_mirnov","imas": "magnetics"}, + "xma": {"name": "magnetics_raw_a", "imas": "magnetics"}, + "xmb": {"name": "magnetics_raw_b", "imas": "magnetics"}, + "xmc": {"name": "magnetics_raw_c", "imas": "magnetics"}, + "xmo": {"name": "magnetics_omaha", "imas": "magnetics"}, "xms": {"name": "mse", "imas": "mse"}, "xsx": {"name": "soft_x_rays", "imas": "soft_x_rays"} } \ No newline at end of file diff --git a/mappings/mastu/dimensions.json b/mappings/mastu/dimensions.json index eeecc91..20f297f 100644 --- a/mappings/mastu/dimensions.json +++ b/mappings/mastu/dimensions.json @@ -1079,5 +1079,21 @@ }, "epq/input_constraints_mse_a1": { "dim_0": "mse_n" + }, + + "xsx/devices_limit": { + "dim_0": "dim_1" + }, + "xim/devices_limit": { + "dim_0": "dim_1" + }, + "xma/devices_limit": { + "dim_0": "dim_1" + }, + "xmb/devices_limit": { + "dim_0": "dim_1" + }, + "xmc/devices_limit": { + "dim_0": "dim_1" } } \ No newline at end of file diff --git a/mappings/mastu/groups.json b/mappings/mastu/groups.json index 85f5fa6..f477425 100644 --- a/mappings/mastu/groups.json +++ b/mappings/mastu/groups.json @@ -7,12 +7,11 @@ "aiv": {"name": "camera_ir_v", "imas": "camera_ir"}, "alp": {"name": "langmuir_probes", "imas": "langmuir_probes"}, "amb": {"name": "magnetics_b", "imas": "magnetics"}, - "amc": {"name": "magnetics", "imas": "magnetics"}, + "amc": {"name": "magnetics_c", "imas": "magnetics"}, "ams": {"name": "mse", "imas": "mse"}, "anb": {"name": "nbi", "imas": "nbi"}, "ane": {"name": "interferometer", "imas": "interferometer"}, "anu": {"name": "neutron_diagnostic", "imas": "neutron_diagnostic"}, - "asm": {"name": "magnetics_saddle", "imas": "magnetics"}, "ayc": {"name": "thomson_scattering", "imas": "thomson_scattering"}, "ayd": {"name": "thomson_scattering_divertor", "imas": "thomson_scattering"}, "epm": {"name": "equilibrium", "imas": "equilibrium"}, @@ -24,9 +23,11 @@ "rgb": {"name": "camera_visible_bremsstrahlung_a", "imas": "camera_visible"}, "rgc": {"name": "camera_visible_bremsstrahlung_b", "imas": "camera_visible"}, "xbt": {"name": "bes"}, - "xdc": {"name": "controllers", "imas": "controllers"}, + "xdc": {"name": "pulse_schedule", "imas": "pulse_schedule"}, "xim": {"name": "spectrometer_visible", "imas": "spectrometer_visible"}, - "xma": {"name": "magnetics_a", "imas": "magnetics"}, - "xmc": {"name": "magnetics_c", "imas": "magnetics"}, - "xsx": {"name": "soft_x_rays", "imas": "soft_x_rays"} + "xma": {"name": "magnetics_raw_a", "imas": "magnetics"}, + "xmb": {"name": "magnetics_raw_b", "imas": "magnetics"}, + "xmc": {"name": "magnetics_omaha", "imas": "magnetics"}, + "xsx": {"name": "soft_x_rays", "imas": "soft_x_rays"}, + "asx": {"name": "soft_x_rays", "imas": "soft_x_rays"} } \ No newline at end of file diff --git a/mappings/mastu/variables.json b/mappings/mastu/variables.json index 5002ecf..530039c 100644 --- a/mappings/mastu/variables.json +++ b/mappings/mastu/variables.json @@ -25,6 +25,24 @@ "r_error": "major_radius_error", "arb": "radial_index" }, + "rba": { + "rba": "data" + }, + "rbb": { + "rbb": "data" + }, + "rbc": { + "rbc": "data" + }, + "rco": { + "rco": "data" + }, + "rgb": { + "rgb": "data" + }, + "rgc": { + "rgc": "data" + }, "xdc": { "XDC/PLASMA/T/IP_REF": "reference_plasma_current", "XDC/FUELLING/T/DENSITY_REF_TARGET": "reference_plasma_density" diff --git a/mappings/units.json b/mappings/units.json index 584355d..49c06f3 100644 --- a/mappings/units.json +++ b/mappings/units.json @@ -1,4 +1,5 @@ { + "STATE": "", "W / (sr.m2)": "W / (sr*m^2)", "S": "s", "m^-^3": "m^-3", diff --git a/src/builder.py b/src/builder.py index 33a9ea1..4cff87d 100644 --- a/src/builder.py +++ b/src/builder.py @@ -47,6 +47,8 @@ def create(self, shot: int): pipeline = self.pipelines.get(group_name) dataset: xr.Dataset = pipeline(datasets) + dataset.attrs["description"] = dataset_info.description + dataset.attrs["quality"] = dataset_info.quality dataset, group_name = self._rename_group(dataset, group_name) logger.info(f"Writing {group_name} for shot #{shot}") diff --git a/src/load.py b/src/load.py index 065ba82..e793948 100644 --- a/src/load.py +++ b/src/load.py @@ -14,6 +14,8 @@ from src.registry import Registry from src.utils import harmonise_name +LAST_MAST_SHOT = 30471 + class MissingProfileError(Exception): pass @@ -113,6 +115,15 @@ def get_source_infos(self, shot_num: int) -> t.List[DatasetInfo]: ) for item in signals ] + + # Special case: in MAST-U, soft x rays were moved from XSX -> ASX then back to XSX, but XSX contained raw data signals. + # Here we drop XSX if ASX is avilable, otherwise we return ASX + if shot_num > LAST_MAST_SHOT: + sources = {info.name: info for info in infos} + if "asx" in sources: + sources.pop("xsx") + infos = sources.values() + return infos def lookup_status_code(self, status): @@ -247,6 +258,7 @@ def _convert_signal_to_dataset(self, signal_name, signal): data = xr.DataArray(data, dims=dim_names, coords=coords, attrs=attrs) if signal_name == "time": signal_name = "time_" + data.name = signal_name data.attrs["name"] = data.name data.attrs["uda_name"] = uda_name diff --git a/src/pipelines.py b/src/pipelines.py index 1a3a3c8..8e2db4c 100644 --- a/src/pipelines.py +++ b/src/pipelines.py @@ -204,6 +204,20 @@ def __init__(self) -> None: TransformUnits(), ] ), + "asx": Pipeline( + [ + MapDict(RenameDimensions(self.dimension_mapping_file)), + MapDict(RenameVariables(self.variable_mapping_file)), + MapDict(DropZeroDimensions()), + MapDict(DropZeroDataset()), + MergeDatasets(), + TransformUnits(), + TensoriseChannels("hcam_l", regex=r"hcam_l_ch(\d+)"), + TensoriseChannels("hcam_u", regex=r"hcam_u_ch(\d+)"), + TensoriseChannels("tcam", regex=r"tcam_ch(\d+)"), + TensoriseChannels("vcam", regex=r"vcam_ch(\d+)"), + ] + ), "ayc": Pipeline( [ MapDict(RenameDimensions(self.dimension_mapping_file)), @@ -245,6 +259,28 @@ def __init__(self) -> None: "input_constraints_fluxloops_fluxloopdim", ] ), + DropCoordinates("output_radialprofiles_totalpressure", ["r"]), + DropCoordinates("output_radialprofiles_toroidalflux", ["r"]), + DropCoordinates("output_radialprofiles_staticpressure", ["r"]), + DropCoordinates("output_radialprofiles_staticpprime", ["r"]), + DropCoordinates("output_radialprofiles_rotationalpressure", ["r"]), + DropCoordinates("output_radialprofiles_radialcoord", ["r"]), + DropCoordinates("output_radialprofiles_r", ["r"]), + DropCoordinates("output_radialprofiles_q", ["r"]), + DropCoordinates("output_radialprofiles_poloidalarea", ["r"]), + DropCoordinates("output_radialprofiles_plasmavolume", ["r"]), + DropCoordinates("output_radialprofiles_plasmadensity", ["r"]), + DropCoordinates( + "output_radialprofiles_normalizedtoroidalflux", ["r"] + ), + DropCoordinates( + "output_radialprofiles_normalizedpoloidalflux", ["r"] + ), + DropCoordinates("output_radialprofiles_jphi", ["r"]), + DropCoordinates("output_radialprofiles_ffprime", ["r"]), + DropCoordinates("output_radialprofiles_bz", ["r"]), + DropCoordinates("output_radialprofiles_bt", ["r"]), + DropCoordinates("output_radialprofiles_br", ["r"]), MergeDatasets(), TransformUnits(), ] @@ -270,6 +306,38 @@ def __init__(self) -> None: "input_constraints_fluxloops_fluxloopdim", ] ), + DropCoordinates("output_radialprofiles_totalpressure", ["r"]), + DropCoordinates("output_radialprofiles_toroidalflux", ["r"]), + DropCoordinates("output_radialprofiles_staticpressure", ["r"]), + DropCoordinates("output_radialprofiles_staticpprime", ["r"]), + DropCoordinates("output_radialprofiles_rotationalpressure", ["r"]), + DropCoordinates("output_radialprofiles_radialcoord", ["r"]), + DropCoordinates("output_radialprofiles_r", ["r"]), + DropCoordinates("output_radialprofiles_q", ["r"]), + DropCoordinates("output_radialprofiles_poloidalarea", ["r"]), + DropCoordinates("output_radialprofiles_plasmavolume", ["r"]), + DropCoordinates("output_radialprofiles_plasmadensity", ["r"]), + DropCoordinates( + "output_radialprofiles_normalizedtoroidalflux", ["r"] + ), + DropCoordinates( + "output_radialprofiles_normalizedpoloidalflux", ["r"] + ), + DropCoordinates("output_radialprofiles_jphi", ["r"]), + DropCoordinates("output_radialprofiles_ffprime", ["r"]), + DropCoordinates("output_radialprofiles_bz", ["r"]), + DropCoordinates("output_radialprofiles_bt", ["r"]), + DropCoordinates("output_radialprofiles_br", ["r"]), + MergeDatasets(), + TransformUnits(), + ] + ), + "esm": Pipeline( + [ + MapDict(RenameDimensions(self.dimension_mapping_file)), + MapDict(RenameVariables(self.variable_mapping_file)), + MapDict(DropZeroDimensions()), + MapDict(DropZeroDataset()), MergeDatasets(), TransformUnits(), ] @@ -289,7 +357,7 @@ def __init__(self) -> None: "rgc": Pipeline( [MapDict(RenameVariables(self.variable_mapping_file)), ProcessImage()] ), - "esm": Pipeline( + "xbt": Pipeline( [ MapDict(RenameDimensions(self.dimension_mapping_file)), MapDict(RenameVariables(self.variable_mapping_file)), @@ -297,9 +365,10 @@ def __init__(self) -> None: MapDict(DropZeroDataset()), MergeDatasets(), TransformUnits(), + TensoriseChannels("bes", regex=r"channel(\d+)"), ] ), - "xbt": Pipeline( + "xdc": Pipeline( [ MapDict(RenameDimensions(self.dimension_mapping_file)), MapDict(RenameVariables(self.variable_mapping_file)), @@ -309,7 +378,7 @@ def __init__(self) -> None: TransformUnits(), ] ), - "xdc": Pipeline( + "xim": Pipeline( [ MapDict(RenameDimensions(self.dimension_mapping_file)), MapDict(RenameVariables(self.variable_mapping_file)), @@ -319,7 +388,7 @@ def __init__(self) -> None: TransformUnits(), ] ), - "xim": Pipeline( + "xma": Pipeline( [ MapDict(RenameDimensions(self.dimension_mapping_file)), MapDict(RenameVariables(self.variable_mapping_file)), @@ -327,9 +396,21 @@ def __init__(self) -> None: MapDict(DropZeroDataset()), MergeDatasets(), TransformUnits(), + TensoriseChannels("rtdi_01", regex=r"rtdi_01_ch(\d+)$"), + TensoriseChannels("rtdi_02", regex=r"rtdi_02_ch(\d+)$"), + TensoriseChannels("rtdi_03", regex=r"rtdi_03_ch(\d+)$"), + TensoriseChannels("rtdi_04", regex=r"rtdi_04_ch(\d+)$"), + TensoriseChannels("rtdi_05", regex=r"rtdi_05_ch(\d+)$"), + TensoriseChannels("rtdi_06", regex=r"rtdi_06_ch(\d+)$"), + TensoriseChannels("rtdi_07", regex=r"rtdi_07_ch(\d+)$"), + TensoriseChannels("rtdi_08", regex=r"rtdi_08_ch(\d+)$"), + TensoriseChannels("sanx20_01", regex=r"sanx20_01_ch(\d+)$"), + TensoriseChannels("sanx20_02", regex=r"sanx20_02_ch(\d+)$"), + TensoriseChannels("sanx21_01", regex=r"sanx21_01_ch(\d+)$"), + TensoriseChannels("sanx21_02", regex=r"sanx21_02_ch(\d+)$"), ] ), - "xma": Pipeline( + "xmb": Pipeline( [ MapDict(RenameDimensions(self.dimension_mapping_file)), MapDict(RenameVariables(self.variable_mapping_file)), @@ -347,6 +428,7 @@ def __init__(self) -> None: MapDict(DropZeroDataset()), MergeDatasets(), TransformUnits(), + TensoriseChannels("acq216_202", regex=r"acq216_202_ch(\d+)"), ] ), "xsx": Pipeline( @@ -360,6 +442,7 @@ def __init__(self) -> None: TensoriseChannels("hcam_l", regex=r"hcam_l_ch(\d+)"), TensoriseChannels("hcam_u", regex=r"hcam_u_ch(\d+)"), TensoriseChannels("tcam", regex=r"tcam_ch(\d+)"), + TensoriseChannels("vcam", regex=r"vcam_ch(\d+)"), ] ), } diff --git a/src/transforms.py b/src/transforms.py index 77be21c..76e8bbc 100644 --- a/src/transforms.py +++ b/src/transforms.py @@ -156,9 +156,9 @@ def __call__(self, dataset: xr.Dataset) -> xr.Dataset: class MergeDatasets(BaseTransform): def __call__(self, dataset_dict: dict[str, xr.Dataset]) -> xr.Dataset: for name, item in dataset_dict.items(): - if "dim_0" in item.dims: + if "r" in item.dims: print(f"{item.dims}, {name}") - # print(item) + print(item["r"].values) dataset = xr.merge(dataset_dict.values()) dataset = dataset.compute() @@ -208,9 +208,6 @@ def __init__( def __call__(self, dataset: xr.Dataset) -> xr.Dataset: group_keys = self._get_group_keys(dataset) - for key in group_keys: - self._parse_digits(key) - # If we couldn't find any matching keys, do nothing. if len(group_keys) == 0: return dataset