Source code for squadds.core.analysis_enrichment

"""Pure dataframe enrichment helpers used by the Analyzer compatibility facade."""

from __future__ import annotations

from typing import Any

import numpy as np
import pandas as pd


[docs] def fix_cavity_claw_dataframe(df: pd.DataFrame) -> pd.DataFrame: """Rename and rescale cavity-claw columns using the legacy Analyzer behavior.""" if ("cavity_frequency" in df.columns) or ("kappa" in df.columns): df = df.rename(columns={"cavity_frequency": "cavity_frequency_GHz", "kappa": "kappa_kHz"}) df["cavity_frequency_GHz"] = df["cavity_frequency_GHz"] * 1e-9 df["kappa_kHz"] = df["kappa_kHz"] * 1e-3 try: df.drop(columns=["units"], inplace=True) except Exception: pass return df
[docs] def extract_qubit_options(df: pd.DataFrame) -> dict[str, list[Any]]: """Extract qubit geometry arrays from Analyzer result rows.""" qubit_options_dict = { "claw_gap": [], "claw_length": [], "claw_width": [], "ground_spacing": [], "cross_gap": [], "cross_length": [], "cross_width": [], } for idx, row in df.iterrows(): try: design_options = row.get("design_options", None) if design_options is None: raise ValueError(f"Row {idx} has no 'design_options'.") qubit_options = design_options.get("qubit_options", {}) claw_gap = qubit_options.get("connection_pads", {}).get("readout", {}).get("claw_gap") claw_length = qubit_options.get("connection_pads", {}).get("readout", {}).get("claw_length") claw_width = qubit_options.get("connection_pads", {}).get("readout", {}).get("claw_width") ground_spacing = qubit_options.get("connection_pads", {}).get("readout", {}).get("ground_spacing") cross_gap = qubit_options.get("cross_gap") cross_length = qubit_options.get("cross_length") cross_width = qubit_options.get("cross_width") if None in [claw_gap, claw_length, claw_width, ground_spacing, cross_gap, cross_length, cross_width]: raise ValueError(f"Row {idx} has missing qubit parameter(s).") qubit_options_dict["claw_gap"].append(claw_gap) qubit_options_dict["claw_length"].append(claw_length) qubit_options_dict["claw_width"].append(claw_width) qubit_options_dict["ground_spacing"].append(ground_spacing) qubit_options_dict["cross_gap"].append(cross_gap) qubit_options_dict["cross_length"].append(cross_length) qubit_options_dict["cross_width"].append(cross_width) except Exception as error: print(f"Error processing row {idx}: {str(error)}") for key in qubit_options_dict: qubit_options_dict[key].append(None) return {key: np.array(value) for key, value in qubit_options_dict.items()}
[docs] def extract_cpw_options(df: pd.DataFrame) -> dict[str, list[Any]]: """Extract CPW geometry arrays from Analyzer result rows.""" cpw_options_dict = {"total_length": [], "trace_gap": [], "trace_width": []} for idx, row in df.iterrows(): try: design_options = row.get("design_options", None) if design_options is None: raise ValueError(f"Row {idx} has no 'design_options'.") cpw_opts = design_options.get("cavity_claw_options", {}).get("cpw_opts", {}).get("left_options", {}) total_length = cpw_opts.get("total_length") trace_gap = cpw_opts.get("trace_gap") trace_width = cpw_opts.get("trace_width") if None in [total_length, trace_gap, trace_width]: raise ValueError(f"Row {idx} has missing CPW parameter(s).") cpw_options_dict["total_length"].append(total_length) cpw_options_dict["trace_gap"].append(trace_gap) cpw_options_dict["trace_width"].append(trace_width) except Exception as error: print(f"Error processing row {idx}: {str(error)}") for key in cpw_options_dict: cpw_options_dict[key].append(None) return {key: np.array(value) for key, value in cpw_options_dict.items()}
[docs] def extract_coupler_options(df: pd.DataFrame) -> dict[str, list[Any]]: """Extract coupler geometry arrays from Analyzer result rows.""" coupler_options_dict = { "coupling_length": [], "coupling_space": [], "down_length": [], "orientation": [], "prime_gap": [], "prime_width": [], "second_gap": [], "second_width": [], "cap_distance": [], "cap_gap": [], "cap_gap_ground": [], "cap_width": [], "finger_count": [], "finger_length": [], } for idx, row in df.iterrows(): try: design_options = row.get("design_options", None) if design_options is None: raise ValueError(f"Row {idx} has no 'design_options'.") cavity_claw_options = design_options.get("cavity_claw_options", {}) coupler_type = cavity_claw_options.get("coupler_type") if coupler_type == "CLT": coupler_options = cavity_claw_options.get("coupler_options", {}) extracted_options = { "coupling_length": coupler_options.get("coupling_length"), "coupling_space": coupler_options.get("coupling_space"), "down_length": coupler_options.get("down_length"), "orientation": coupler_options.get("orientation"), "prime_gap": coupler_options.get("prime_gap"), "prime_width": coupler_options.get("prime_width"), "second_gap": coupler_options.get("second_gap"), "second_width": coupler_options.get("second_width"), } elif coupler_type in ["NCap", "CapNInterdigital"]: coupler_options = cavity_claw_options.get("coupler_options", {}) extracted_options = { "cap_distance": coupler_options.get("cap_distance"), "cap_gap": coupler_options.get("cap_gap"), "cap_gap_ground": coupler_options.get("cap_gap_ground"), "cap_width": coupler_options.get("cap_width"), "finger_count": coupler_options.get("finger_count"), "finger_length": coupler_options.get("finger_length"), "orientation": coupler_options.get("orientation"), } else: raise ValueError(f"Row {idx} has an unsupported coupler_type: {coupler_type}") for key in extracted_options: coupler_options_dict[key].append(extracted_options.get(key)) except Exception as error: print(f"Error processing row {idx}: {str(error)}") for key in coupler_options_dict: coupler_options_dict[key].append(None) return {key: np.array(value) for key, value in coupler_options_dict.items()}