Examples¶
All examples are also available as runnable Jupyter notebooks in
examples/notebooks/.
Open with Jupyter:
00 — Settings: create and load¶
from pathlib import Path
import json
import os
from deteqt import load_settings, write_settings_file
def _find_settings(name: str = "settings.toml") -> Path:
for parent in [Path.cwd(), *Path.cwd().parents]:
candidate = parent / name
if candidate.exists():
return candidate
return Path.cwd() / name
SETTINGS_PATH = _find_settings()
URL = "https://influx.yourdomain.com"
ORG = "YOUR_ORG"
BUCKET = "YOUR_BUCKET"
TOKEN = os.getenv("DETEQT_TOKEN", "REPLACE_ME")
TIMEOUT_MS = 30_000
DEFAULT_TAGS = {"device_ID": "chip-a", "condition": "4K"}
OVERWRITE = False
written_path = write_settings_file(
url=URL,
org=ORG,
bucket=BUCKET,
token=TOKEN,
timeout_ms=TIMEOUT_MS,
path=SETTINGS_PATH,
default_tags=DEFAULT_TAGS,
overwrite=OVERWRITE,
)
print(f"settings written: {written_path}")
settings = load_settings(SETTINGS_PATH)
print(
json.dumps(
{
"url": settings.url,
"org": settings.org,
"bucket": settings.bucket,
"timeout_ms": settings.timeout_ms,
"default_tags": settings.default_tags,
"token_loaded": bool(settings.token),
},
indent=2,
sort_keys=True,
)
)
01 — Write one point¶
from pathlib import Path
import json
from deteqt import InfluxWriteError, TUID, write_point
def _find_settings(name: str = "settings.toml") -> Path:
for parent in [Path.cwd(), *Path.cwd().parents]:
candidate = parent / name
if candidate.exists():
return candidate
return Path.cwd() / name
SETTINGS_PATH = _find_settings()
record = {
"qoi": "qubit_01_frequency",
"nominal_value": 5.010,
"uncertainty": 0.005,
"tuid": TUID("20260213-143319-249-01d39d"),
"element": "q1",
"label": "f01",
"unit": "GHz",
"element_label": "qubit-01",
"device_ID": "chip-a",
"run_ID": "run-001",
"cycle_ID": "cycle-01",
"condition": "4K",
"extra_tags": {
"area_of_interest": "sweetspot",
"long_label": "Q1 frequency",
},
"extra_fields": {
"temperature_mK": 12.3,
"passed_qc": True,
},
}
try:
summary = write_point(record, settings_path=SETTINGS_PATH)
print(json.dumps(summary, indent=2, sort_keys=True))
except InfluxWriteError as exc:
print(f"Influx write failed: {exc}")
02 — Write batch¶
from pathlib import Path
import json
from deteqt import InfluxWriteError, write_batch
def _find_settings(name: str = "settings.toml") -> Path:
for parent in [Path.cwd(), *Path.cwd().parents]:
candidate = parent / name
if candidate.exists():
return candidate
return Path.cwd() / name
SETTINGS_PATH = _find_settings()
records = [
{
"qoi": "qubit_01_frequency",
"nominal_value": 5.01,
"uncertainty": 0.01,
"element": "q1",
"run_ID": "run-001",
"cycle_ID": "cycle-01",
"extra_tags": {"sample_id": "S-42"},
"extra_fields": {"temperature_mK": 12.3},
},
{
"qoi": "t1",
"nominal_value": 23.4,
"uncertainty": 0.8,
"element": "q1",
"run_ID": "run-001",
"cycle_ID": "cycle-01",
"extra_tags": {"sample_id": "S-42"},
"extra_fields": {"passed_qc": True},
},
{
"qoi": "resonator_qi",
"nominal_value": 14500.0,
"uncertainty": 120.0,
"element": "q1",
"run_ID": "run-001",
"cycle_ID": "cycle-01",
},
]
try:
summary = write_batch(
records,
settings_path=SETTINGS_PATH,
continue_on_error=True,
chunk_size=2,
return_errors=True,
)
print(json.dumps(summary, indent=2, sort_keys=True))
except InfluxWriteError as exc:
print(f"Influx write failed: {exc}")
03 — Preview recursive ingest matches¶
from pathlib import Path
import json
from deteqt import debug_ingest_matches
FOLDER = Path("/path/to/quantify-data")
plan = debug_ingest_matches(FOLDER)
print(
json.dumps(
{
"pairings_total": len(plan),
"sample_pairings": plan[:10],
},
indent=2,
sort_keys=True,
)
)
04 — Manual pipeline: ingest → process → write¶
from pathlib import Path
import json
from deteqt import InfluxWriteError, ingest_data, process_data, write_batch
def _find_settings(name: str = "settings.toml") -> Path:
for parent in [Path.cwd(), *Path.cwd().parents]:
candidate = parent / name
if candidate.exists():
return candidate
return Path.cwd() / name
FOLDER = Path("/path/to/quantify-data")
SETTINGS_PATH = _find_settings()
MAX_RECORDS = 200
CONTINUE_ON_ERROR = True
raw_data = ingest_data(FOLDER, continue_on_error=CONTINUE_ON_ERROR)
processed_data = process_data(raw_data, continue_on_error=CONTINUE_ON_ERROR)
processed_for_write = (
processed_data[:MAX_RECORDS] if MAX_RECORDS > 0 else processed_data
)
print(
json.dumps(
{
"raw_records_total": len(raw_data),
"processed_records_total": len(processed_data),
"records_selected_for_write": len(processed_for_write),
},
indent=2,
sort_keys=True,
)
)
try:
summary = write_batch(
processed_for_write,
settings_path=SETTINGS_PATH,
continue_on_error=CONTINUE_ON_ERROR,
return_errors=True,
)
print(json.dumps(summary, indent=2, sort_keys=True))
except InfluxWriteError as exc:
print(f"Influx write failed: {exc}")
05 — One-call ingest and write¶
from pathlib import Path
import json
from deteqt import InfluxWriteError, ingest_and_write
def _find_settings(name: str = "settings.toml") -> Path:
for parent in [Path.cwd(), *Path.cwd().parents]:
candidate = parent / name
if candidate.exists():
return candidate
return Path.cwd() / name
FOLDER = Path("/path/to/quantify-data")
SETTINGS_PATH = _find_settings()
try:
summary = ingest_and_write(
folder=FOLDER,
settings_path=SETTINGS_PATH,
continue_on_error=True,
)
print(json.dumps(summary, indent=2, sort_keys=True))
except InfluxWriteError as exc:
print(f"Influx write failed: {exc}")
06 — Build a Flux query¶
from deteqt import build_query
query = build_query(
bucket="qoi",
start="-7d",
measurement="qubit_01_frequency",
fields=("nominal_value", "uncertainty"),
tags={"run_ID": "run-001"},
limit=200,
sort_desc=True,
)
print(query)
Output:
from(bucket: "qoi")
|> range(start: -7d)
|> filter(fn: (r) => r._measurement == "qubit_01_frequency")
|> filter(fn: (r) => r._field == "nominal_value" or r._field == "uncertainty")
|> filter(fn: (r) => r.run_ID == "run-001")
|> sort(columns: ["_time"], desc: true)
|> limit(n: 200)
07 — Structured queries¶
from pathlib import Path
import json
from deteqt import query_rows, query_rows_with_meta, query_stream
def _find_settings(name: str = "settings.toml") -> Path:
for parent in [Path.cwd(), *Path.cwd().parents]:
candidate = parent / name
if candidate.exists():
return candidate
return Path.cwd() / name
SETTINGS_PATH = _find_settings()
START = "-7d"
MEASUREMENT = "qubit_01_frequency"
RUN_ID = "run-001"
LIMIT = 50
rows = query_rows(
settings_path=SETTINGS_PATH,
start=START,
measurement=MEASUREMENT,
fields=("nominal_value", "uncertainty"),
tags={"run_ID": RUN_ID},
limit=LIMIT,
sort_desc=True,
)
rows_with_meta, meta = query_rows_with_meta(
settings_path=SETTINGS_PATH,
start=START,
measurement=MEASUREMENT,
fields=("nominal_value", "uncertainty"),
tags={"run_ID": RUN_ID},
limit=LIMIT,
sort_desc=True,
)
stream_preview: list[dict[str, object]] = []
for idx, row in enumerate(
query_stream(
settings_path=SETTINGS_PATH,
start=START,
measurement=MEASUREMENT,
fields=("nominal_value",),
tags={"run_ID": RUN_ID},
limit=LIMIT,
sort_desc=True,
)
):
if idx >= 3:
break
stream_preview.append(row)
print(
json.dumps(
{
"rows_count": len(rows),
"rows_with_meta_count": len(rows_with_meta),
"meta": {
"elapsed_ms": meta.elapsed_ms,
"row_count": meta.row_count,
"query_sha256": meta.query_sha256,
},
"stream_preview": stream_preview,
},
indent=2,
sort_keys=True,
default=str,
)
)
08 — Raw Flux queries¶
from pathlib import Path
import json
from deteqt import (
build_query,
load_settings,
query_flux_rows,
query_flux_rows_with_meta,
query_flux_stream,
)
def _find_settings(name: str = "settings.toml") -> Path:
for parent in [Path.cwd(), *Path.cwd().parents]:
candidate = parent / name
if candidate.exists():
return candidate
return Path.cwd() / name
SETTINGS_PATH = _find_settings()
query = build_query(
bucket=load_settings(SETTINGS_PATH).bucket,
start="-7d",
measurement="qubit_01_frequency",
fields=("nominal_value", "uncertainty"),
tags={"run_ID": "run-001"},
limit=50,
sort_desc=True,
)
print(query)
rows = query_flux_rows(query=query, settings_path=SETTINGS_PATH)
rows_with_meta, meta = query_flux_rows_with_meta(
query=query,
settings_path=SETTINGS_PATH,
)
stream_preview: list[dict[str, object]] = []
for idx, row in enumerate(
query_flux_stream(query=query, settings_path=SETTINGS_PATH)
):
if idx >= 3:
break
stream_preview.append(row)
print(
json.dumps(
{
"rows_count": len(rows),
"rows_with_meta_count": len(rows_with_meta),
"meta": {
"elapsed_ms": meta.elapsed_ms,
"row_count": meta.row_count,
"query_sha256": meta.query_sha256,
},
"stream_preview": stream_preview,
},
indent=2,
sort_keys=True,
default=str,
)
)
09 — Load one JSON file into records¶
from pathlib import Path
import json
from deteqt.ingest_data import load_json_file_records
FILE_PATH = Path("/path/to/quantities_of_interest.json")
records = load_json_file_records(FILE_PATH)
print(
json.dumps(
{
"records_total": len(records),
"preview": records[:2],
},
indent=2,
sort_keys=True,
default=str,
)
)