Device Analysis

Now we will run a power envelope analysis on the device data we uploaded in the previous notebook.

As before, make sure you have the following environment variables set or added to a .env file:

GDSFACTORY_HUB_API_URL="https://{org}.gdsfactoryhub.com"
GDSFACTORY_HUB_QUERY_URL="https://query.{org}.gdsfactoryhub.com"
GDSFACTORY_HUB_KEY="<your-gdsfactoryplus-api-key>"
import getpass

from tqdm.notebook import tqdm

import gdsfactoryhub as gfh
project_id = f"spirals-{getpass.getuser()}"
client = gfh.create_client_from_env(project_id=project_id)
api = client.api()
query = client.query()
utils = client.utils()

Device Analysis

You can either trigger analysis automatically by defining it in the design manifest, using the UI or using the Python DoData library.

device_data = query.device_data().limit(1).execute().data[0]
from gdsfactoryhub.functions.device_data import rolling_window

rolling_window.run?
rolling_window.run(
    device_data_pkey=device_data["pk"],
    xname="wavelength",
    yname="output_power",
    xlabel="Wavelength [nm]",
    ylabel="Power [mW]",
    x0=1550,
)
{'output': {'wavelength': 1550.0,
  'output_power_low': 0.2579795522456139,
  'output_power_mean': 0.2890758853785011,
  'output_power_high': 0.31564956304099945},
 'summary_plot': <Figure size 640x480 with 1 Axes>,
 'device_data_pkey': '3ae46fc0-c669-4a69-84c6-5b04bd5756a1'}

png

# don't error out when function already exists in DoData.
with gfh.suppress_api_error():
    result = api.upload_function(
        function_id="rolling-window",
        target_model="device_data",
        test_target_model_pk=device_data["pk"],
        file=gfh.get_module_path(rolling_window),
        test_kwargs={
            "xname": "wavelength",
            "yname": "output_power",
            "xlabel": "Wavelength [nm]",
            "ylabel": "Power [mW]",
            "x0": 1550,
        },
    )
Duplicate function

Trigger all analyses for all device data

results = []
dd_pks = [d["pk"] for d in query.device_data().execute().data]
for dd_pk in tqdm(dd_pks):
    with gfh.suppress_api_error():
        result = api.start_analysis(
            analysis_id=f"rolling-window_{dd_pk}",
            function_id="rolling-window",
            target_model="device_data",
            target_model_pk=dd_pk,
            kwargs={
                "xname": "wavelength",
                "yname": "output_power",
                "xlabel": "Wavelength [nm]",
                "ylabel": "Power [mW]",
                "x0": 1550,
            },
        )
        results.append(result)
  0%|          | 0/378 [00:00<?, ?it/s]

Let's have a look at the last analysis:

analysis_pks = [r["pk"] for r in results]
utils.analyses().wait_for_completion(pks=analysis_pks)
analyses = query.analyses().in_("pk", analysis_pks).execute().data
succesful_analyses = [a for a in analyses if a["status"] == "COMPLETED"]
analysis = succesful_analyses[-1]
img = api.download_plot(analysis["summary_plot"]["path"])
img.resize((530, 400))
Waiting for analyses:   0%|          | 0/378 [00:00<?, ?it/s]

png

On This Page