Coverage for python/gsfit/database_readers/mock_st40_mdsplus/setup_flux_loops.py: 0%
29 statements
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-14 15:25 +0000
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-14 15:25 +0000
1import typing
2from typing import TYPE_CHECKING
4import numpy as np
5import numpy.typing as npt
6from gsfit_rs import FluxLoops
8from .mock_get_data import MockGetData
10if TYPE_CHECKING:
11 from . import DatabaseReader
14def setup_flux_loops(
15 self: "DatabaseReader",
16 pulseNo: int,
17 settings: dict[str, typing.Any],
18) -> FluxLoops:
19 """
20 This method initialises the Rust `FluxLoops` class.
22 :param pulseNo: Pulse number, used to select which mocked MDSplus tree to read
23 :param settings: Dictionary containing the JSON settings read from the `settings` directory
25 **This method is specific to a mock of ST40's experimental MDSplus database.**
27 See `python/gsfit/database_readers/interface.py` for more details on how a new database_reader should be implemented.
28 """
30 # Initialise the FluxLoops Rust class
31 flux_loops = FluxLoops()
33 mag = MockGetData.from_workflow(settings, pulseNo, "mag")
35 # FL-probes
36 names_long = typing.cast(list[str], mag.get("FLOOP.ALL.NAMES"))
37 sensors_names = np.char.replace(names_long, "FLOOP_", "L")
38 sensors_r = typing.cast(npt.NDArray[np.float64], mag.get("FLOOP.ALL.R"))
39 sensors_z = typing.cast(npt.NDArray[np.float64], mag.get("FLOOP.ALL.Z"))
40 time = typing.cast(npt.NDArray[np.float64], mag.get("TIME")).astype(np.float64)
42 n_sensors = len(sensors_names)
43 for i_sensor in range(0, n_sensors):
44 sensor_name = sensors_names[i_sensor]
46 if sensor_name in settings["sensor_weights_flux_loops.json"]:
47 fit_settings_comment = settings["sensor_weights_flux_loops.json"][sensor_name]["fit_settings"]["comment"]
48 fit_settings_expected_value = settings["sensor_weights_flux_loops.json"][sensor_name]["fit_settings"]["expected_value"]
49 fit_settings_include = settings["sensor_weights_flux_loops.json"][sensor_name]["fit_settings"]["include"]
50 fit_settings_weight = settings["sensor_weights_flux_loops.json"][sensor_name]["fit_settings"]["weight"] / (2.0 * np.pi)
51 else:
52 fit_settings_comment = ""
53 fit_settings_expected_value = np.nan
54 fit_settings_include = False
55 fit_settings_weight = np.nan
57 # Measured signals
58 measured = typing.cast(npt.NDArray[np.float64], mag.get(f"FLOOP.{sensor_name}.PSI")).astype(np.float64)
60 # Add the sensor to the Rust class
61 flux_loops.add_sensor(
62 name=sensor_name,
63 geometry_r=sensors_r[i_sensor],
64 geometry_z=sensors_z[i_sensor],
65 fit_settings_comment=fit_settings_comment,
66 fit_settings_expected_value=fit_settings_expected_value,
67 fit_settings_include=fit_settings_include,
68 fit_settings_weight=fit_settings_weight,
69 time=time,
70 measured=measured,
71 )
73 return flux_loops