scpn_fusion.io – Data Interop¶
The IO subpackage provides data-interoperability adapters for the IMAS (Integrated Modelling & Analysis Suite) data exchange standard used in the fusion community.
IMAS Connector¶
Facade API for IMAS/IDS adapter modules.
This module intentionally stays as a stable import surface while implementation is decomposed into focused submodules:
imas_connector_common: validation/coercion primitivesimas_connector_digital_twin: summary/state IDS mappingsimas_connector_equilibrium: GEQDSK <-> IMAS equilibriumimas_connector_transport: core_profiles/summary/core_transportimas_connector_storage: JSON I/O helpersimas_connector_omas: OMAS bridgeomas_free_boundary_inputs: strict PF/magnetics acquisition contract
- scpn_fusion.io.imas_connector.validate_ids_payload(payload)[source]¶
Validate a complete IDS payload shape and units.
Ensures required top-level fields, nested structures, and numeric coercion constraints are satisfied. This function performs strict checks for time-slice ordering at the millisecond level and required equilibrium / performance keys.
- scpn_fusion.io.imas_connector.digital_twin_summary_to_ids(summary, *, machine='ITER', shot=0, run=0)[source]¶
Map an internal digital-twin summary into an IDS-like payload.
Returns a shallow canonicalised mapping that includes the equilibrium and performance fields required by
validate_ids_payload().
- scpn_fusion.io.imas_connector.digital_twin_state_to_ids(state, *, machine='ITER', shot=0, run=0)[source]¶
Map a detailed digital-twin state + profiles into an IDS-like payload.
Accepts full internal state records, including optional 1-D profile fields, and delegates to
digital_twin_summary_to_ids()before attaching the validatedequilibrium.profiles_1dpayload.
- scpn_fusion.io.imas_connector.ids_to_digital_twin_summary(payload)[source]¶
Convert an IDS-like payload into internal digital-twin summary shape.
- scpn_fusion.io.imas_connector.ids_to_digital_twin_state(payload)[source]¶
Convert IDS payload into detailed digital-twin state with optional profiles.
- scpn_fusion.io.imas_connector.digital_twin_history_to_ids(history, *, machine='ITER', shot=0, run=0)[source]¶
Convert a local digital-twin history into IDS payload sequence form.
- scpn_fusion.io.imas_connector.digital_twin_history_to_ids_pulse(history, *, machine='ITER', shot=0, run=0)[source]¶
Convert digital-twin history into a single IDS pulse payload.
- scpn_fusion.io.imas_connector.ids_to_digital_twin_history(payloads)[source]¶
Convert a sequence of IDS payloads back to digital-twin snapshots.
- scpn_fusion.io.imas_connector.ids_pulse_to_digital_twin_history(pulse)[source]¶
Convert IDS pulse payload into a sequence of digital-twin snapshots.
- scpn_fusion.io.imas_connector.validate_ids_payload_sequence(payloads)[source]¶
Validate a strictly monotonic sequence of IDS payloads.
The function enforces: - required payload schema fields - shared machine / shot / run identity across the sequence - strictly increasing time index and time value
- scpn_fusion.io.imas_connector.validate_ids_pulse_payload(pulse)[source]¶
Validate IDS pulse payload integrity and consistency constraints.
- scpn_fusion.io.imas_connector.geqdsk_to_imas_equilibrium(eq, *, time_s=0.0, shot=0, run=0)[source]¶
Convert a GEqdsk equilibrium to an IMAS Data Dictionary
equilibriumIDS.
- scpn_fusion.io.imas_connector.imas_equilibrium_to_geqdsk(ids)[source]¶
Convert an IMAS Data Dictionary
equilibriumIDS back to a GEqdsk.
- scpn_fusion.io.imas_connector.state_to_imas_core_profiles(state, *, time_s=0.0)[source]¶
Convert a plasma state dict to an IMAS
core_profilesIDS.
- scpn_fusion.io.imas_connector.state_to_imas_summary(state)[source]¶
Convert a performance/state dict to an IMAS
summaryIDS.
- scpn_fusion.io.imas_connector.state_to_imas_core_transport(state, *, time_s=0.0)[source]¶
Convert a plasma state dict to an IMAS
core_transportIDS.
- scpn_fusion.io.imas_connector.imas_core_transport_to_state(ids)[source]¶
Convert an IMAS
core_transportIDS back to a state dict.
- scpn_fusion.io.imas_connector.write_ids(ids_dict, path)[source]¶
Write an IDS dict to a JSON file with schema validation.
- scpn_fusion.io.imas_connector.read_ids(path)[source]¶
Read an IDS JSON file and validate minimal schema.
- scpn_fusion.io.imas_connector.ids_to_omas_core_profiles(ids_dict)[source]¶
Convert an IMAS
core_profilesIDS dict to an OMAS ODS.
- scpn_fusion.io.imas_connector.ids_to_omas_equilibrium(ids_dict)[source]¶
Convert an IMAS equilibrium IDS dict to an OMAS ODS.
- scpn_fusion.io.imas_connector.omas_core_profiles_to_ids(ods)[source]¶
Convert OMAS ODS
core_profilesdata back to an IDS dict.
- scpn_fusion.io.imas_connector.omas_equilibrium_to_ids(ods)[source]¶
Convert OMAS ODS equilibrium data back to an IDS dict.
- class scpn_fusion.io.imas_connector.FluxLoopInput(identifier, r_m, z_m, flux_wb)[source]¶
Bases:
objectFlux-loop geometry and poloidal-flux history.
-
flux_wb:
TimeSeriesSI¶
-
flux_wb:
- class scpn_fusion.io.imas_connector.OmasFreeBoundaryInputs(schema, cocos, imas_version, provenance, time_alignment, pf_coils, bpol_probes, flux_loops, ingestion_blockers, ingestion_ready, tier0_claim_blockers, tier0_claim_admission_ready, payload_sha256)[source]¶
Bases:
objectValidated OMAS channels with distinct ingestion and Tier-0 states.
- Parameters:
schema (str)
cocos (int)
imas_version (str | None)
provenance (OmasSourceProvenance | None)
time_alignment (Literal['native_unaligned', 'exact_common_axis'])
pf_coils (tuple[PfCoilInput, ...])
bpol_probes (tuple[PoloidalFieldProbeInput, ...])
flux_loops (tuple[FluxLoopInput, ...])
ingestion_ready (bool)
tier0_claim_admission_ready (Literal[False])
payload_sha256 (str)
-
provenance:
OmasSourceProvenance|None¶
-
pf_coils:
tuple[PfCoilInput,...]¶
-
bpol_probes:
tuple[PoloidalFieldProbeInput,...]¶
-
flux_loops:
tuple[FluxLoopInput,...]¶
- class scpn_fusion.io.imas_connector.OmasSourceProvenance(machine, shot_id, run_id, source_uri, source_sha256, license_id)[source]¶
Bases:
objectExternal binding that an ODS alone cannot prove reliably.
- Parameters:
- class scpn_fusion.io.imas_connector.PfCoilInput(identifier, elements, current_a)[source]¶
Bases:
objectPF-coil current history and matching signed geometry.
- Parameters:
identifier (str)
elements (tuple[PfElementGeometry, ...])
current_a (TimeSeriesSI)
-
elements:
tuple[PfElementGeometry,...]¶
-
current_a:
TimeSeriesSI¶
- class scpn_fusion.io.imas_connector.PfElementGeometry(identifier, turns_with_sign, geometry_type, r_m, z_m, width_m, height_m)[source]¶
Bases:
objectOne signed PF element with an explicit IMAS geometry representation.
- Parameters:
- class scpn_fusion.io.imas_connector.PoloidalFieldProbeInput(identifier, r_m, z_m, poloidal_angle_rad, length_m, field_t)[source]¶
Bases:
objectPoloidal-field probe position, orientation, and field history.
- Parameters:
-
field_t:
TimeSeriesSI¶
- class scpn_fusion.io.imas_connector.TimeSeriesSI(time_s, values, error_lower, error_upper, validity)[source]¶
Bases:
objectOne finite, strictly ordered SI-unit time series.
- Parameters:
- scpn_fusion.io.imas_connector.extract_omas_free_boundary_inputs(ods, *, provenance=None, cocos=None, time_alignment='native_unaligned', require_ingestion_ready=True)[source]¶
Extract strict SI-unit PF and magnetics channels from an OMAS ODS.
- Parameters:
ods (
ODSLike) – OMAS ODS (or compatible dotted-path mapping). IMAS schema units are preserved: seconds, amperes, metres, radians, tesla, and webers.provenance (
OmasSourceProvenance|None) – Immutable source binding supplied by the acquisition layer.cocos (
int|None) – Canonical COCOS index. When omitted,ods.cocosis used.time_alignment (
Literal['native_unaligned','exact_common_axis']) – Declare whether every channel was acquired on one exact time axis. The adapter verifies anexact_common_axisdeclaration byte-for-byte.require_ingestion_ready (
bool) – Raise when any provenance, uncertainty, validity, channel, or alignment gate is missing. Set false only for explicit development inspection.
- Returns:
Immutable extracted inputs, ingestion blockers, readiness state, and digest. Full Tier-0 claim admission remains explicitly false.
- Return type:
- Raises:
ValueError – If the ODS is structurally malformed or strict ingestion is blocked.