Coverage for python/gsfit/database_readers/mock_st40_mdsplus/setup_rogowski_coils.py: 0%
46 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 RogowskiCoils
8from .mock_get_data import MockGetData
10if TYPE_CHECKING:
11 from . import DatabaseReader
14def setup_rogowski_coils(
15 self: "DatabaseReader",
16 pulseNo: int,
17 settings: dict[str, typing.Any],
18) -> RogowskiCoils:
19 """
20 This method initialises the Rust `RogowskiCoils` 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 RogowskiCoils Rust class
31 rogowski_coils = RogowskiCoils()
33 mag = MockGetData.from_workflow(settings, pulseNo, "mag")
35 names_long = typing.cast(list[str], mag.get("ROG.ALL.NAMES"))
36 sensors_names = np.char.replace(names_long, "ROG_", "")
37 paths_r = typing.cast(npt.NDArray[np.float64], mag.get("ROG.ALL.R_PATH")).astype(np.float64)
38 paths_z = typing.cast(npt.NDArray[np.float64], mag.get("ROG.ALL.Z_PATH")).astype(np.float64)
40 n_sensors = len(sensors_names)
41 for i_sensor in range(0, n_sensors):
42 sensor_name = sensors_names[i_sensor]
43 path_r = paths_r[i_sensor, :]
44 path_z = paths_z[i_sensor, :]
46 # Remove nan's
47 # This is because in MDSplus "ALL" does not allow jagged arrays
48 path_r = path_r[~np.isnan(path_r)]
49 path_z = path_z[~np.isnan(path_z)]
51 # Don't store the "fake" Rogowski coils (e.g. the MC supports)
52 if len(path_r) > 4:
53 if sensor_name in settings["sensor_weights_rogowski_coils.json"]:
54 fit_settings_comment = settings["sensor_weights_rogowski_coils.json"][sensor_name]["fit_settings"]["comment"]
55 fit_settings_expected_value = settings["sensor_weights_rogowski_coils.json"][sensor_name]["fit_settings"]["expected_value"]
56 fit_settings_include = settings["sensor_weights_rogowski_coils.json"][sensor_name]["fit_settings"]["include"]
57 fit_settings_weight = settings["sensor_weights_rogowski_coils.json"][sensor_name]["fit_settings"]["weight"]
58 else:
59 fit_settings_comment = ""
60 fit_settings_expected_value = np.nan
61 fit_settings_include = False
62 fit_settings_weight = np.nan
64 # Measured signals
65 time = typing.cast(npt.NDArray[np.float64], mag.get("TIME")).astype(np.float64)
66 measured = typing.cast(npt.NDArray[np.float64], mag.get(f"ROG.{sensor_name}.I")).astype(np.float64)
68 # By default we don't have any gaps
69 gaps_r: npt.NDArray[np.float64] = np.array([])
70 gaps_z: npt.NDArray[np.float64] = np.array([])
71 gaps_d_r: npt.NDArray[np.float64] = np.array([])
72 gaps_d_z: npt.NDArray[np.float64] = np.array([])
73 gaps_name: list[str] = []
75 # Only INIVC000 has gaps
76 if sensor_name == "INIVC000":
77 gaps = MockGetData.from_workflow(settings, pulseNo, "rog_gaps")
78 gaps_r = typing.cast(npt.NDArray[np.float64], gaps.get("ROG.INIVC000.GAPS.R"))
79 gaps_z = typing.cast(npt.NDArray[np.float64], gaps.get("ROG.INIVC000.GAPS.Z"))
80 gaps_d_r = typing.cast(npt.NDArray[np.float64], gaps.get("ROG.INIVC000.GAPS.DR"))
81 gaps_d_z = typing.cast(npt.NDArray[np.float64], gaps.get("ROG.INIVC000.GAPS.DZ"))
82 gaps_name = typing.cast(list[str], gaps.get("ROG.INIVC000.GAPS.NAME"))
84 # Add Rogowski coil to the Rust class
85 rogowski_coils.add_sensor(
86 sensor_name,
87 path_r,
88 path_z,
89 fit_settings_comment,
90 fit_settings_expected_value,
91 fit_settings_include,
92 fit_settings_weight,
93 time,
94 measured,
95 gaps_r=gaps_r,
96 gaps_z=gaps_z,
97 gaps_d_r=gaps_d_r,
98 gaps_d_z=gaps_d_z,
99 gaps_name=gaps_name,
100 )
102 return rogowski_coils