Coverage for python/gsfit/database_readers/freegs/setup_bp_probes.py: 0%
40 statements
« prev ^ index » next coverage.py v7.15.0, created at 2026-07-07 13:12 +0000
« prev ^ index » next coverage.py v7.15.0, created at 2026-07-07 13:12 +0000
1import typing
2from typing import TYPE_CHECKING
4import freegs
5import numpy as np
6import numpy.typing as npt
7from gsfit_rs import BpProbes
9if TYPE_CHECKING:
10 from . import DatabaseReader
13def setup_bp_probes(
14 self: "DatabaseReader",
15 pulseNo: int,
16 settings: dict[str, typing.Any],
17 time: npt.NDArray[np.float64],
18 freegs_eqs: list[freegs.equilibrium.Equilibrium],
19) -> BpProbes:
20 """
21 This method initialises the Rust `BpProbes` class.
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 freegs_eqs: List of FreeGS equilibrium objects, one for each time-slice
28 **This method is specific to FreeGS.**
30 See `python/gsfit/database_readers/interface.py` for more details on how a new database_reader should be implemented.
31 """
33 # Initialise the BpProbes Rust class
34 bp_probes = BpProbes()
36 n_time = len(time)
38 # Let's see how many flux loops there are
39 n_bp_probes = 0
40 for sensor in freegs_eqs[0].tokamak.sensors:
41 if isinstance(sensor, freegs.machine.PoloidalFieldSensor):
42 n_bp_probes += 1
44 # Collect the measured values
45 measured_values = np.full((n_time, n_bp_probes), np.nan)
46 for i_time in range(n_time):
47 i_sensor = 0
48 for sensor in freegs_eqs[i_time].tokamak.sensors:
49 if isinstance(sensor, freegs.machine.PoloidalFieldSensor):
50 measured_values[i_time, i_sensor] = sensor.measurement
51 i_sensor += 1
53 # Add the sensors to the BpProbes class
54 i_sensor = 0
55 for sensor in freegs_eqs[0].tokamak.sensors:
56 if isinstance(sensor, freegs.machine.PoloidalFieldSensor):
57 # Get the sensor name
58 sensor_name = sensor.name
60 # Get the sensor position
61 r = sensor.R
62 z = sensor.Z
63 angle = sensor.theta
65 # Get the sensor data
66 measured = sensor.measurement
68 # Only add sesnors which are included in the settings file
69 if sensor_name in settings["sensor_weights_bp_probe.json"]:
70 fit_settings_comment = settings["sensor_weights_bp_probe.json"][sensor_name]["fit_settings"]["comment"]
71 fit_settings_expected_value = settings["sensor_weights_bp_probe.json"][sensor_name]["fit_settings"]["expected_value"]
72 fit_settings_include = settings["sensor_weights_bp_probe.json"][sensor_name]["fit_settings"]["include"]
73 fit_settings_weight = settings["sensor_weights_bp_probe.json"][sensor_name]["fit_settings"]["weight"]
74 else:
75 fit_settings_comment = ""
76 fit_settings_expected_value = np.nan
77 fit_settings_include = False
78 fit_settings_weight = np.nan
80 # Add the sensor to the BpProbes class
81 bp_probes.add_sensor(
82 name=sensor_name,
83 geometry_angle_pol=angle,
84 geometry_r=r,
85 geometry_z=z,
86 fit_settings_comment=fit_settings_comment,
87 fit_settings_expected_value=fit_settings_expected_value,
88 fit_settings_include=fit_settings_include,
89 fit_settings_weight=fit_settings_weight,
90 time=time,
91 measured=measured_values[:, i_sensor],
92 )
94 # Increment the sensor index
95 i_sensor += 1
97 return bp_probes