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

1import typing 

2from typing import TYPE_CHECKING 

3 

4import numpy as np 

5import numpy.typing as npt 

6from gsfit_rs import RogowskiCoils 

7 

8from .mock_get_data import MockGetData 

9 

10if TYPE_CHECKING: 

11 from . import DatabaseReader 

12 

13 

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. 

21 

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 

24 

25 **This method is specific to a mock of ST40's experimental MDSplus database.** 

26 

27 See `python/gsfit/database_readers/interface.py` for more details on how a new database_reader should be implemented. 

28 """ 

29 

30 # Initialise the RogowskiCoils Rust class 

31 rogowski_coils = RogowskiCoils() 

32 

33 mag = MockGetData.from_workflow(settings, pulseNo, "mag") 

34 

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) 

39 

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, :] 

45 

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)] 

50 

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 

63 

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) 

67 

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] = [] 

74 

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")) 

83 

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 ) 

101 

102 return rogowski_coils