Coverage for python/gsfit/database_writers/tokamak_energy_mdsplus_new/create_mdsplus_links.py: 0%
41 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 mdsthin
2import numpy as np
5def create_mdsplus_links(pulseNo_write: int, run_name: str, tree_name: str = "gsfit") -> None:
6 """
7 Add the "ALL" nodes for the "CONSTRAINTS"
9 :param pulseNo_write: Pulse number to write to
10 :param run_name: Run name, e.g. "TEST07"
11 :param tree_name: MDSplus tree to open, e.g. "gsfit" or "GSFIT_TS" [dimensionless]
12 """
14 conn = mdsthin.Connection("smaug")
15 conn.openTree(tree_name, pulseNo_write)
17 tree_name_upper = tree_name.upper()
19 # Add signals
20 sensor_types = ["BP_PROBE", "FLUX_LOOP", "ROGOWSKI", "PF_CURRENT", "PRESSURE"]
21 signal_names = ["MEASURED", "RECONSTRUCT"]
22 for sensor_type in sensor_types:
23 tdi_command = f"getnci('\\\\{tree_name_upper}::TOP.{run_name}.CONSTRAINTS.{sensor_type}.*', 'node_name')"
24 sensor_names_on_mds_np = conn.get(tdi_command).data()
25 sensor_names_on_mds = np.char.strip(sensor_names_on_mds_np).astype(str, copy=False).tolist()
26 sensor_names_on_mds.remove("ALL")
28 for signal_name in signal_names:
29 tdi_command = "Build_Signal(TRANSPOSE(["
30 for sensor_name in sensor_names_on_mds:
31 tdi_command += f'DATA(GETNCI("\\\\{tree_name_upper}::TOP.{run_name}.CONSTRAINTS.{sensor_type}.{sensor_name}:{signal_name}", "record")), '
32 tdi_command = (
33 tdi_command[:-2] # remove the last comma and space
34 + "]), " # closing TRANSPOSE
35 + "*, " # no data in "raw"
36 + f'DATA(GETNCI("\\\\{tree_name_upper}::TOP.{run_name}.CONSTRAINTS.{sensor_type}.ALL:NAMES", "record")), DATA(GETNCI("\\\\{tree_name_upper}::TOP.{run_name}:TIME", "record"))'
37 + ")"
38 )
39 conn.put(f"\\{tree_name_upper}::TOP.{run_name}.CONSTRAINTS.{sensor_type}.ALL:{signal_name}", tdi_command)
41 conn.put(f"\\{tree_name_upper}::TOP.{run_name}.CONSTRAINTS.{sensor_type}.ALL:NAMES", "$1", np.array(sensor_names_on_mds))
43 sensor_types = ["BP_PROBE", "FLUX_LOOP", "ROGOWSKI", "PF_CURRENT", "PRESSURE"]
44 signal_names = ["INCLUDE", "WEIGHT"]
45 for sensor_type in sensor_types:
46 tdi_command = f"getnci('\\\\{tree_name_upper}::TOP.{run_name}.CONSTRAINTS.{sensor_type}.*', 'node_name')"
47 sensor_names_on_mds_np = conn.get(tdi_command).data()
48 sensor_names_on_mds = np.char.strip(sensor_names_on_mds_np).astype(str, copy=False).tolist()
49 sensor_names_on_mds.remove("ALL")
51 for signal_name in signal_names:
52 tdi_command = "Build_Signal(["
53 for sensor_name in sensor_names_on_mds:
54 tdi_command += f'DATA(GETNCI("\\\\{tree_name_upper}::TOP.{run_name}.CONSTRAINTS.{sensor_type}.{sensor_name}:{signal_name}", "record")), '
55 tdi_command = (
56 tdi_command[:-2] # remove the last comma and space
57 + "], " # closing TRANSPOSE
58 + "*, " # no data in "raw"
59 + f'DATA(GETNCI("\\\\{tree_name_upper}::TOP.{run_name}.CONSTRAINTS.{sensor_type}.ALL:NAMES", "record")), DATA(GETNCI("\\\\{tree_name_upper}::TOP.{run_name}:TIME", "record"))'
60 + ")"
61 )
62 conn.put(f"\\{tree_name_upper}::TOP.{run_name}.CONSTRAINTS.{sensor_type}.ALL:{signal_name}", tdi_command)
64 # Add NAMES
65 sensor_types = ["BP_PROBE", "FLUX_LOOP", "ROGOWSKI", "PF_CURRENT", "PRESSURE"]
66 for sensor_type in sensor_types:
67 tdi_command = f"getnci('\\\\{tree_name_upper}::TOP.{run_name}.CONSTRAINTS.{sensor_type}.*', 'node_name')"
68 sensor_names_on_mds_np = conn.get(tdi_command).data()
69 sensor_names_on_mds = np.char.strip(sensor_names_on_mds_np).astype(str, copy=False).tolist()
70 sensor_names_on_mds.remove("ALL")
72 conn.put(f"\\{tree_name_upper}::TOP.{run_name}.CONSTRAINTS.{sensor_type}.ALL:NAMES", "$1", np.array(sensor_names_on_mds))
74 # Close connection
75 conn.closeAllTrees()