Coverage for python/gsfit/database_readers/freegsnke/setup_rogowski_coils.py: 85%

27 statements  

« prev     ^ index     » next       coverage.py v7.15.0, created at 2026-07-07 13:12 +0000

1import typing 

2from typing import TYPE_CHECKING 

3 

4import numpy as np 

5import numpy.typing as npt 

6from freegsnke.equilibrium_update import Equilibrium as FreeGsnkeEquilibrium 

7from gsfit_rs import RogowskiCoils 

8 

9if TYPE_CHECKING: 

10 from . import DatabaseReader 

11 

12 

13def setup_rogowski_coils( 

14 self: "DatabaseReader", 

15 pulseNo: int, 

16 settings: dict[str, typing.Any], 

17 time: npt.NDArray[np.float64], 

18 freegsnke_eqs: list[FreeGsnkeEquilibrium], 

19) -> RogowskiCoils: 

20 """ 

21 This method initialises the Rust `RogowskiCoils` class. 

22 

23 :param pulseNo: Pulse number, used to read from the database 

24 :param settings: Dictionary containing the JSON settings read from the `settings` directory 

25 :param time: Measured time vector 

26 :param freegsnke_eqs: List of FreeGSNKE equilibrium objects, one for each time-slice 

27 

28 **This method is specific to FreeGSNKE.** 

29 

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

31 """ 

32 

33 # Initialise the RogowskiCoils Rust class 

34 rogowski_coils = RogowskiCoils() 

35 

36 # No Rogowski coils are included in FreeGSNKE, so let's use the limiter as 

37 # the plasma current Rogowski 

38 sensor_name = "plasma_current_rogowski" 

39 freegsnke_tokamak = freegsnke_eqs[0].tokamak 

40 limit_pts_r = np.array(freegsnke_tokamak.limiter.R) 

41 limit_pts_z = np.array(freegsnke_tokamak.limiter.Z) 

42 

43 # Get the plasma current 

44 n_time = len(time) 

45 ip = np.full((n_time), np.nan) 

46 for i_time in range(0, n_time): 

47 ip[i_time] = freegsnke_eqs[i_time].plasmaCurrent() 

48 

49 # Get the Rogowski coil data 

50 if sensor_name in settings["sensor_weights_rogowski_coils.json"]: 

51 fit_settings_comment = settings["sensor_weights_rogowski_coils.json"][sensor_name]["fit_settings"]["comment"] 

52 fit_settings_expected_value = settings["sensor_weights_rogowski_coils.json"][sensor_name]["fit_settings"]["expected_value"] 

53 fit_settings_include = settings["sensor_weights_rogowski_coils.json"][sensor_name]["fit_settings"]["include"] 

54 fit_settings_weight = settings["sensor_weights_rogowski_coils.json"][sensor_name]["fit_settings"]["weight"] 

55 else: 

56 fit_settings_comment = "" 

57 fit_settings_expected_value = np.nan 

58 fit_settings_include = False 

59 fit_settings_weight = np.nan 

60 

61 # Add Rogowski coil to the Rust class 

62 rogowski_coils.add_sensor( 

63 name=sensor_name, 

64 r=limit_pts_r, 

65 z=limit_pts_z, 

66 fit_settings_comment=fit_settings_comment, 

67 fit_settings_expected_value=fit_settings_expected_value, 

68 fit_settings_include=fit_settings_include, 

69 fit_settings_weight=fit_settings_weight, 

70 time=time, 

71 measured=ip, 

72 gaps_r=np.array([]), 

73 gaps_z=np.array([]), 

74 gaps_d_r=np.array([]), 

75 gaps_d_z=np.array([]), 

76 gaps_name=[], 

77 ) 

78 

79 return rogowski_coils