Source code for squadds.simulations.result_normalization

"""Pure helpers for shaping simulation outputs into SQuADDS records."""

from __future__ import annotations


def _require_mapping(name, payload, required_keys):
    if not payload:
        raise ValueError(f"{name} is required and must include {', '.join(required_keys)}.")

    missing_keys = [key for key in required_keys if key not in payload]
    if missing_keys:
        raise ValueError(f"{name} is missing required keys: {', '.join(missing_keys)}.")

    return payload


def _normalize_frequency_to_ghz(value, unit=None):
    """Normalize raw frequency values to GHz while tolerating legacy unit metadata."""
    normalized_unit = str(unit).lower() if unit is not None else None
    if normalized_unit == "mhz":
        return value / 1e3
    if normalized_unit == "khz":
        return value / 1e6
    if normalized_unit == "hz":
        return value / 1e9
    if normalized_unit == "ghz" and abs(value) < 1e6:
        return value
    if abs(value) >= 1e6:
        return value / 1e9
    return value


def _normalize_linewidth_to_khz(value, unit=None):
    """Normalize raw linewidth values to kHz while tolerating legacy unit metadata."""
    normalized_unit = str(unit).lower() if unit is not None else None
    if normalized_unit == "ghz":
        return value * 1e6
    if normalized_unit == "mhz":
        return value * 1e3
    if normalized_unit == "hz":
        return value / 1e3
    if normalized_unit == "khz" and abs(value) < 1e4:
        return value
    if abs(value) >= 1e4:
        return value / 1e3
    return value


[docs] def normalize_simulation_results( emode_df=None, lom_df=None, ncap_lom_df=None, *, find_g_a_fq_fn, find_kappa_fn, ): """Normalize raw eigenmode/LOM results into the legacy combined Hamiltonian payload.""" if ncap_lom_df is None: ncap_lom_df = {} if lom_df is None: lom_df = {} if emode_df is None: emode_df = {} if emode_df == {} and lom_df == {}: print("No simulation results available.") return None emode_sim_results = _require_mapping( "emode_df['sim_results']", _require_mapping("emode_df", emode_df, ["sim_results"])["sim_results"], ["cavity_frequency", "kappa", "Q"], ) lom_sim_results = _require_mapping( "lom_df['sim_results']", _require_mapping("lom_df", lom_df, ["sim_results", "design"])["sim_results"], ["cross_to_claw", "cross_to_ground"], ) lom_design = _require_mapping("lom_df['design']", lom_df["design"], ["design_options"]) lom_design_options = _require_mapping( "lom_df['design']['design_options']", lom_design["design_options"], ["aedt_q3d_inductance"], ) cross2cpw = abs(lom_sim_results["cross_to_claw"]) * 1e-15 cross2ground = abs(lom_sim_results["cross_to_ground"]) * 1e-15 raw_frequency = emode_sim_results["cavity_frequency"] Lj = max(lom_design_options["aedt_q3d_inductance"], 1e-9) N = 2 if ncap_lom_df != {} else 4 gg, aa, ff_q = find_g_a_fq_fn(cross2cpw, cross2ground, raw_frequency, Lj, N=N) raw_kappa = emode_sim_results["kappa"] Q = emode_sim_results["Q"] if ncap_lom_df != {}: ncap_sim_results = _require_mapping("ncap_lom_df", ncap_lom_df, ["sim_results"])["sim_results"] ncap_sim_results = _require_mapping( "ncap_lom_df['sim_results']", ncap_sim_results, ["C_top2ground", "C_top2bottom"], ) raw_frequency, raw_kappa = find_kappa_fn( emode_sim_results["cavity_frequency"], ncap_sim_results["C_top2ground"], ncap_sim_results["C_top2bottom"], ) return dict( cavity_frequency_GHz=_normalize_frequency_to_ghz( raw_frequency, emode_sim_results.get("cavity_frequency_unit"), ), Q=Q, kappa_kHz=_normalize_linewidth_to_khz( raw_kappa, emode_sim_results.get("kappa_unit"), ), g_MHz=gg, anharmonicity_MHz=aa, qubit_frequency_GHz=ff_q, )
[docs] def build_eigenmode_payload(coupler_type, geometry_dict, setup, renderer_options, f_rough, Q, kappa, data): """Build the legacy eigenmode result payload.""" return { "design": {"coupler_type": coupler_type, "design_options": geometry_dict, "design_tool": "Qiskit Metal"}, "sim_options": { "sim_type": "epr", "setup": setup, "renderer_options": renderer_options, "simulator": "Ansys HFSS", }, "sim_results": { "cavity_frequency": f_rough, "cavity_frequency_unit": "GHz", "Q": Q, "kappa": kappa, "kappa_unit": "kHz", }, "misc": data, }
[docs] def build_ncap_lom_payload(param, setup, cap_df, data, coupler_name): """Build the legacy NCap lumped-element payload.""" return { "design": {"coupler_type": "NCap", "design_options": param, "design_tool": "Qiskit Metal"}, "sim_options": {"sim_type": "lom", "setup": setup, "simulator": "Ansys HFSS"}, "sim_results": { "C_top2top": abs(cap_df[f"cap_body_0_{coupler_name}"].values[0]), "C_top2bottom": abs(cap_df[f"cap_body_0_{coupler_name}"].values[1]), "C_top2ground": abs(cap_df[f"cap_body_0_{coupler_name}"].values[2]), "C_bottom2bottom": abs(cap_df[f"cap_body_1_{coupler_name}"].values[1]), "C_bottom2ground": abs(cap_df[f"cap_body_1_{coupler_name}"].values[2]), "C_ground2ground": abs(cap_df["ground_main_plane"].values[2]), }, "misc": data, }
[docs] def build_xmon_lom_payload(design_options, setup, renderer_options, cap_df, qname, cname): """Build the legacy Xmon lumped-element payload.""" return { "design": {"design_options": design_options, "design_tool": "Qiskit Metal"}, "sim_options": { "sim_type": "lom", "setup": setup, "renderer_options": renderer_options, "simulator": "Ansys HFSS", }, "sim_results": { "cross_to_ground": 0 if "ground_main_plane" not in cap_df.loc[f"cross_{qname}"] else abs(cap_df.loc[f"cross_{qname}"]["ground_main_plane"]), "claw_to_ground": 0 if "ground_main_plane" not in cap_df.loc[f"{cname}_connector_arm_{qname}"] else abs(cap_df.loc[f"{cname}_connector_arm_{qname}"]["ground_main_plane"]), "cross_to_claw": abs(cap_df.loc[f"cross_{qname}"][f"{cname}_connector_arm_{qname}"]), "cross_to_cross": abs(cap_df.loc[f"cross_{qname}"][f"cross_{qname}"]), "claw_to_claw": abs(cap_df.loc[f"{cname}_connector_arm_{qname}"][f"{cname}_connector_arm_{qname}"]), "ground_to_ground": 0 if "ground_main_plane" not in cap_df.loc[f"cross_{qname}"] else abs(cap_df.loc["ground_main_plane"]["ground_main_plane"]), "units": "fF", }, }