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

1import typing 

2from typing import TYPE_CHECKING 

3 

4import numpy as np 

5import numpy.typing as npt 

6from gsfit_rs import FluxLoops 

7 

8from .mock_get_data import MockGetData 

9 

10if TYPE_CHECKING: 

11 from . import DatabaseReader 

12 

13 

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. 

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 FluxLoops Rust class 

31 flux_loops = FluxLoops() 

32 

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

34 

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) 

41 

42 n_sensors = len(sensors_names) 

43 for i_sensor in range(0, n_sensors): 

44 sensor_name = sensors_names[i_sensor] 

45 

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 

56 

57 # Measured signals 

58 measured = typing.cast(npt.NDArray[np.float64], mag.get(f"FLOOP.{sensor_name}.PSI")).astype(np.float64) 

59 

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 ) 

72 

73 return flux_loops