boulder-opal-scale-up-sdk 1.0.5__py3-none-any.whl → 1.0.6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. {boulder_opal_scale_up_sdk-1.0.5.dist-info → boulder_opal_scale_up_sdk-1.0.6.dist-info}/METADATA +1 -1
  2. {boulder_opal_scale_up_sdk-1.0.5.dist-info → boulder_opal_scale_up_sdk-1.0.6.dist-info}/RECORD +27 -21
  3. boulderopalscaleupsdk/agent/worker.py +15 -2
  4. boulderopalscaleupsdk/common/dtypes.py +21 -1
  5. boulderopalscaleupsdk/{stubs/__init__.py → constants.py} +3 -0
  6. boulderopalscaleupsdk/device/controller/quantum_machines.py +86 -17
  7. boulderopalscaleupsdk/device/processor/common.py +3 -3
  8. boulderopalscaleupsdk/errors.py +21 -0
  9. boulderopalscaleupsdk/experiments/__init__.py +8 -2
  10. boulderopalscaleupsdk/experiments/cz_spectroscopy_by_bias.py +84 -0
  11. boulderopalscaleupsdk/experiments/ramsey_ef.py +62 -0
  12. boulderopalscaleupsdk/experiments/{readout_classifier_calibration.py → readout_classifier.py} +7 -3
  13. boulderopalscaleupsdk/experiments/readout_optimization.py +57 -0
  14. boulderopalscaleupsdk/experiments/resonator_spectroscopy_by_bias.py +1 -3
  15. boulderopalscaleupsdk/experiments/transmon_anharmonicity.py +0 -2
  16. boulderopalscaleupsdk/grpc_interceptors/error.py +318 -0
  17. boulderopalscaleupsdk/plotting/dtypes.py +5 -5
  18. boulderopalscaleupsdk/protobuf/v1/device_pb2.py +57 -49
  19. boulderopalscaleupsdk/protobuf/v1/device_pb2.pyi +67 -43
  20. boulderopalscaleupsdk/protobuf/v1/device_pb2_grpc.py +100 -66
  21. boulderopalscaleupsdk/protobuf/v1/job_pb2.py +47 -0
  22. boulderopalscaleupsdk/protobuf/v1/job_pb2.pyi +54 -0
  23. boulderopalscaleupsdk/protobuf/v1/job_pb2_grpc.py +138 -0
  24. boulderopalscaleupsdk/third_party/quantum_machines/__init__.py +1 -1
  25. boulderopalscaleupsdk/third_party/quantum_machines/config.py +51 -48
  26. boulderopalscaleupsdk/stubs/dtypes.py +0 -47
  27. boulderopalscaleupsdk/stubs/maps.py +0 -18
  28. {boulder_opal_scale_up_sdk-1.0.5.dist-info → boulder_opal_scale_up_sdk-1.0.6.dist-info}/LICENSE +0 -0
  29. {boulder_opal_scale_up_sdk-1.0.5.dist-info → boulder_opal_scale_up_sdk-1.0.6.dist-info}/WHEEL +0 -0
@@ -0,0 +1,138 @@
1
+ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
2
+ """Client and server classes corresponding to protobuf-defined services."""
3
+ import grpc
4
+
5
+ from boulderopalscaleupsdk.protobuf.v1 import job_pb2 as boulderopalscaleupsdk_dot_protobuf_dot_v1_dot_job__pb2
6
+
7
+
8
+ class JobManagerServiceStub(object):
9
+ """Job manager service.
10
+ """
11
+
12
+ def __init__(self, channel):
13
+ """Constructor.
14
+
15
+ Args:
16
+ channel: A grpc.Channel.
17
+ """
18
+ self.List = channel.unary_unary(
19
+ '/boulderopalscaleupsdk.protobuf.v1.JobManagerService/List',
20
+ request_serializer=boulderopalscaleupsdk_dot_protobuf_dot_v1_dot_job__pb2.ListRequest.SerializeToString,
21
+ response_deserializer=boulderopalscaleupsdk_dot_protobuf_dot_v1_dot_job__pb2.ListResponse.FromString,
22
+ )
23
+ self.Get = channel.unary_unary(
24
+ '/boulderopalscaleupsdk.protobuf.v1.JobManagerService/Get',
25
+ request_serializer=boulderopalscaleupsdk_dot_protobuf_dot_v1_dot_job__pb2.GetRequest.SerializeToString,
26
+ response_deserializer=boulderopalscaleupsdk_dot_protobuf_dot_v1_dot_job__pb2.GetResponse.FromString,
27
+ )
28
+ self.GetSummary = channel.unary_unary(
29
+ '/boulderopalscaleupsdk.protobuf.v1.JobManagerService/GetSummary',
30
+ request_serializer=boulderopalscaleupsdk_dot_protobuf_dot_v1_dot_job__pb2.GetSummaryRequest.SerializeToString,
31
+ response_deserializer=boulderopalscaleupsdk_dot_protobuf_dot_v1_dot_job__pb2.GetSummaryResponse.FromString,
32
+ )
33
+
34
+
35
+ class JobManagerServiceServicer(object):
36
+ """Job manager service.
37
+ """
38
+
39
+ def List(self, request, context):
40
+ """Fetch all the jobs that have been run on the device.
41
+ """
42
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
43
+ context.set_details('Method not implemented!')
44
+ raise NotImplementedError('Method not implemented!')
45
+
46
+ def Get(self, request, context):
47
+ """Fetch the results of a specific job executed on the device previously.
48
+ """
49
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
50
+ context.set_details('Method not implemented!')
51
+ raise NotImplementedError('Method not implemented!')
52
+
53
+ def GetSummary(self, request, context):
54
+ """Fetch the results view of a previously executed job.
55
+ """
56
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
57
+ context.set_details('Method not implemented!')
58
+ raise NotImplementedError('Method not implemented!')
59
+
60
+
61
+ def add_JobManagerServiceServicer_to_server(servicer, server):
62
+ rpc_method_handlers = {
63
+ 'List': grpc.unary_unary_rpc_method_handler(
64
+ servicer.List,
65
+ request_deserializer=boulderopalscaleupsdk_dot_protobuf_dot_v1_dot_job__pb2.ListRequest.FromString,
66
+ response_serializer=boulderopalscaleupsdk_dot_protobuf_dot_v1_dot_job__pb2.ListResponse.SerializeToString,
67
+ ),
68
+ 'Get': grpc.unary_unary_rpc_method_handler(
69
+ servicer.Get,
70
+ request_deserializer=boulderopalscaleupsdk_dot_protobuf_dot_v1_dot_job__pb2.GetRequest.FromString,
71
+ response_serializer=boulderopalscaleupsdk_dot_protobuf_dot_v1_dot_job__pb2.GetResponse.SerializeToString,
72
+ ),
73
+ 'GetSummary': grpc.unary_unary_rpc_method_handler(
74
+ servicer.GetSummary,
75
+ request_deserializer=boulderopalscaleupsdk_dot_protobuf_dot_v1_dot_job__pb2.GetSummaryRequest.FromString,
76
+ response_serializer=boulderopalscaleupsdk_dot_protobuf_dot_v1_dot_job__pb2.GetSummaryResponse.SerializeToString,
77
+ ),
78
+ }
79
+ generic_handler = grpc.method_handlers_generic_handler(
80
+ 'boulderopalscaleupsdk.protobuf.v1.JobManagerService', rpc_method_handlers)
81
+ server.add_generic_rpc_handlers((generic_handler,))
82
+
83
+
84
+ # This class is part of an EXPERIMENTAL API.
85
+ class JobManagerService(object):
86
+ """Job manager service.
87
+ """
88
+
89
+ @staticmethod
90
+ def List(request,
91
+ target,
92
+ options=(),
93
+ channel_credentials=None,
94
+ call_credentials=None,
95
+ insecure=False,
96
+ compression=None,
97
+ wait_for_ready=None,
98
+ timeout=None,
99
+ metadata=None):
100
+ return grpc.experimental.unary_unary(request, target, '/boulderopalscaleupsdk.protobuf.v1.JobManagerService/List',
101
+ boulderopalscaleupsdk_dot_protobuf_dot_v1_dot_job__pb2.ListRequest.SerializeToString,
102
+ boulderopalscaleupsdk_dot_protobuf_dot_v1_dot_job__pb2.ListResponse.FromString,
103
+ options, channel_credentials,
104
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
105
+
106
+ @staticmethod
107
+ def Get(request,
108
+ target,
109
+ options=(),
110
+ channel_credentials=None,
111
+ call_credentials=None,
112
+ insecure=False,
113
+ compression=None,
114
+ wait_for_ready=None,
115
+ timeout=None,
116
+ metadata=None):
117
+ return grpc.experimental.unary_unary(request, target, '/boulderopalscaleupsdk.protobuf.v1.JobManagerService/Get',
118
+ boulderopalscaleupsdk_dot_protobuf_dot_v1_dot_job__pb2.GetRequest.SerializeToString,
119
+ boulderopalscaleupsdk_dot_protobuf_dot_v1_dot_job__pb2.GetResponse.FromString,
120
+ options, channel_credentials,
121
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
122
+
123
+ @staticmethod
124
+ def GetSummary(request,
125
+ target,
126
+ options=(),
127
+ channel_credentials=None,
128
+ call_credentials=None,
129
+ insecure=False,
130
+ compression=None,
131
+ wait_for_ready=None,
132
+ timeout=None,
133
+ metadata=None):
134
+ return grpc.experimental.unary_unary(request, target, '/boulderopalscaleupsdk.protobuf.v1.JobManagerService/GetSummary',
135
+ boulderopalscaleupsdk_dot_protobuf_dot_v1_dot_job__pb2.GetSummaryRequest.SerializeToString,
136
+ boulderopalscaleupsdk_dot_protobuf_dot_v1_dot_job__pb2.GetSummaryResponse.FromString,
137
+ options, channel_credentials,
138
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@@ -34,7 +34,7 @@ from unittest.mock import patch
34
34
 
35
35
  from packaging.version import Version
36
36
 
37
- if os.environ.get("QCTRL_SU_DISABLE_QM_LOGGING", "False") == "True":
37
+ if os.getenv("QCTRL_SU_DISABLE_QM_LOGGING", "False") == "True":
38
38
  # Disable QM logging and telemetry
39
39
  os.environ["QM_DISABLE_STREAMOUTPUT"] = "true" # Used in 1.1.0
40
40
  _qm_logger = logging.getLogger("qm")
@@ -84,13 +84,12 @@ For information about PyPA's version specifiers:
84
84
 
85
85
  # ruff: noqa: UP007, N815, E741
86
86
  from collections.abc import MutableMapping
87
- from typing import Annotated, Any, Literal, Self, TypeVar, Union
87
+ from typing import Annotated, Literal, NamedTuple, Self, TypeVar, Union
88
88
 
89
89
  from packaging.specifiers import SpecifierSet
90
90
  from packaging.version import Version
91
91
  from pydantic import (
92
92
  BaseModel,
93
- BeforeValidator,
94
93
  Discriminator,
95
94
  Field,
96
95
  PrivateAttr,
@@ -125,8 +124,18 @@ class Constants(BaseSettings):
125
124
  CONST = Constants()
126
125
 
127
126
 
128
- StandardPort = tuple[str, int, int]
129
- PortReferenceType = Union[tuple[str, int], StandardPort]
127
+ class NativeOPXPortType(NamedTuple):
128
+ controller_id: str
129
+ port_id: int
130
+
131
+
132
+ class NativeOPX1000PortType(NamedTuple):
133
+ controller_id: str
134
+ fem_id: int
135
+ port_id: int
136
+
137
+
138
+ QMPortTypes = NativeOPXPortType | NativeOPX1000PortType
130
139
 
131
140
 
132
141
  class AnalogOutputFilterConfigType(BaseModel):
@@ -134,24 +143,19 @@ class AnalogOutputFilterConfigType(BaseModel):
134
143
  feedback: list[float] = []
135
144
 
136
145
 
137
- def ensure_int(value: Any) -> Any:
138
- match value:
139
- case int():
140
- return value
141
- case str():
142
- return int(value)
143
- case _:
144
- raise ValueError("Field must be convertible to int.")
145
-
146
-
147
- IntLike = Annotated[int, BeforeValidator(ensure_int)]
146
+ class AnalogOutputFilterConfigType123(BaseModel):
147
+ feedforward: list[float] = []
148
+ feedback: list[float] = []
149
+ exponential: list[tuple[float, int]] = []
150
+ exponential_dc_gain: float | None = None
151
+ high_pass: float | None = None
148
152
 
149
153
 
150
154
  class AnalogOutputPortConfigType(BaseModel):
151
155
  offset: Number | None = None
152
156
  filter: AnalogOutputFilterConfigType | None = None
153
157
  delay: int | None = None
154
- crosstalk: Mapping[IntLike, Number] = {}
158
+ crosstalk: Mapping[int, Number] = {}
155
159
  shareable: bool | None = None
156
160
 
157
161
 
@@ -175,13 +179,12 @@ class DigitalInputPortConfigType(BaseModel):
175
179
  threshold: Number | None = None
176
180
 
177
181
 
178
- class AnalogOutputPortConfigTypeOctoDac(BaseModel):
182
+ class LfAnalogOutputPortConfigType(BaseModel):
179
183
  offset: Number | None = None
180
- filter: AnalogOutputFilterConfigType | None = None
184
+ filter: AnalogOutputFilterConfigType | AnalogOutputFilterConfigType123 | None = None
181
185
  delay: int | None = None
182
186
  crosstalk: Mapping[int, Number] = {}
183
187
  shareable: bool | None = None
184
- connectivity: tuple[str, str] | None = None
185
188
  sampling_rate: float | None = None
186
189
  upsampling_mode: Literal["mw", "pulse"] | None = None
187
190
  output_mode: Literal["direct", "amplified"] | None = None
@@ -189,10 +192,10 @@ class AnalogOutputPortConfigTypeOctoDac(BaseModel):
189
192
 
190
193
  class LfFemConfigType(BaseModel):
191
194
  type: Literal["LF"] | None = None
192
- analog_outputs: Mapping[int | str, AnalogOutputPortConfigTypeOctoDac] = {}
193
- analog_inputs: Mapping[int | str, AnalogInputPortConfigType] = {}
194
- digital_outputs: Mapping[int | str, DigitalOutputPortConfigType] = {}
195
- digital_inputs: Mapping[int | str, DigitalInputPortConfigType] = {}
195
+ analog_outputs: Mapping[int, LfAnalogOutputPortConfigType] = {}
196
+ analog_inputs: Mapping[int, AnalogInputPortConfigType] = {}
197
+ digital_outputs: Mapping[int, DigitalOutputPortConfigType] = {}
198
+ digital_inputs: Mapping[int, DigitalInputPortConfigType] = {}
196
199
 
197
200
 
198
201
  Band = Literal[1, 2, 3]
@@ -216,16 +219,16 @@ class MwFemAnalogOutputPortConfigType(BaseModel):
216
219
  band: Band | None = None
217
220
  delay: int | None = None
218
221
  shareable: bool | None = None
219
- upconverters: Mapping[IntLike, MwUpconverterConfigType] = {}
222
+ upconverters: Mapping[int, MwUpconverterConfigType] | None = None
220
223
  upconverter_frequency: float | None = None
221
224
 
222
225
 
223
226
  class MwFemConfigType(BaseModel):
224
227
  type: Literal["MW"] | None = None
225
- analog_outputs: Mapping[int | str, MwFemAnalogOutputPortConfigType] = {}
226
- analog_inputs: Mapping[int | str, MwFemAnalogInputPortConfigType] = {}
227
- digital_outputs: Mapping[int | str, DigitalOutputPortConfigType] = {}
228
- digital_inputs: Mapping[int | str, DigitalInputPortConfigType] = {}
228
+ analog_outputs: Mapping[int, MwFemAnalogOutputPortConfigType] = {}
229
+ analog_inputs: Mapping[int, MwFemAnalogInputPortConfigType] = {}
230
+ digital_outputs: Mapping[int, DigitalOutputPortConfigType] = {}
231
+ digital_inputs: Mapping[int, DigitalInputPortConfigType] = {}
229
232
 
230
233
 
231
234
  class ControllerConfigType(BaseModel):
@@ -247,8 +250,8 @@ class OctaveRFOutputConfigType(BaseModel):
247
250
  ] = "always_off"
248
251
  gain: int | float = Field(default=0, ge=-20, le=20, multiple_of=0.5)
249
252
  input_attenuators: Literal["ON", "OFF"] = "OFF"
250
- I_connection: PortReferenceType | None = None
251
- Q_connection: PortReferenceType | None = None
253
+ I_connection: NativeOPXPortType | None = None
254
+ Q_connection: NativeOPXPortType | None = None
252
255
 
253
256
 
254
257
  _RF_SOURCES = Literal[
@@ -270,7 +273,7 @@ class OctaveRFInputConfigType(BaseModel):
270
273
 
271
274
 
272
275
  class OctaveSingleIfOutputConfigType(BaseModel):
273
- port: PortReferenceType | None = None
276
+ port: NativeOPXPortType | None = None
274
277
  name: str | None = None
275
278
 
276
279
 
@@ -279,7 +282,7 @@ class OctaveIfOutputsConfigType(BaseModel):
279
282
  IF_out2: OctaveSingleIfOutputConfigType | None = None
280
283
 
281
284
 
282
- FEM_IDX = Literal[1, 2, 3, 4, 5, 6, 7, 8, "1", "2", "3", "4", "5", "6", "7", "8"]
285
+ FEM_IDX = Annotated[int, Field(ge=1, le=8)]
283
286
 
284
287
 
285
288
  class OPX1000ControllerConfigType(BaseModel):
@@ -296,13 +299,13 @@ LoopbackType = tuple[
296
299
  class OctaveConfig(BaseModel):
297
300
  """Octave configuration for qm-qua 1.1.7."""
298
301
 
299
- RF_outputs: Mapping[IntLike, OctaveRFOutputConfigType] = {}
302
+ RF_outputs: Mapping[int, OctaveRFOutputConfigType] = {}
300
303
  """
301
304
  RF Outputs in Octave's up-converter chain.
302
305
  OPX/AnalogOutput -> Octave/IFInput -> Octave/RFOutput -> Fridge.
303
306
  """
304
307
 
305
- RF_inputs: Mapping[IntLike, OctaveRFInputConfigType] = {}
308
+ RF_inputs: Mapping[int, OctaveRFInputConfigType] = {}
306
309
  """RF Inputs in Octave's down-converter chain. See IF_Outputs."""
307
310
 
308
311
  IF_outputs: OctaveIfOutputsConfigType | None = None
@@ -367,7 +370,7 @@ class OctaveConfig121(OctaveConfig):
367
370
  class DigitalInputConfigType(BaseModel):
368
371
  delay: int | None = None
369
372
  buffer: int | None = None
370
- port: PortReferenceType | None = None
373
+ port: QMPortTypes | None = None
371
374
 
372
375
 
373
376
  class IntegrationWeightConfigType(BaseModel):
@@ -413,16 +416,16 @@ class PulseConfigType(BaseModel):
413
416
 
414
417
 
415
418
  class SingleInputConfigType(BaseModel):
416
- port: PortReferenceType | None = None
419
+ port: QMPortTypes | None = None
417
420
 
418
421
 
419
422
  class MwInputConfigType(BaseModel):
420
- port: PortReferenceType | None = None
421
- upconverter: int | None = None
423
+ port: NativeOPX1000PortType | None = None
424
+ upconverter: int = Field(default=1, description="The index of the upconverter to use.")
422
425
 
423
426
 
424
427
  class MwOutputConfigType(BaseModel):
425
- port: PortReferenceType | None = None
428
+ port: NativeOPX1000PortType | None = None
426
429
 
427
430
 
428
431
  class HoldOffsetConfigType(BaseModel):
@@ -436,14 +439,14 @@ class StickyConfigType(BaseModel):
436
439
 
437
440
 
438
441
  class MixInputConfigType(BaseModel):
439
- I: PortReferenceType | None = None
440
- Q: PortReferenceType | None = None
442
+ I: QMPortTypes | None = None
443
+ Q: QMPortTypes | None = None
441
444
  mixer: str | None = None
442
445
  lo_frequency: float | None = None
443
446
 
444
447
 
445
448
  class InputCollectionConfigType(BaseModel):
446
- inputs: Mapping[str, PortReferenceType] = {}
449
+ inputs: Mapping[str, QMPortTypes] = {}
447
450
 
448
451
 
449
452
  class OscillatorConfigType(BaseModel):
@@ -472,15 +475,15 @@ class ElementConfig(BaseModel):
472
475
  multipleInputs: InputCollectionConfigType | None = None
473
476
  time_of_flight: int | None = None
474
477
  smearing: int | None = None
475
- outputs: Mapping[str, PortReferenceType] = {}
478
+ outputs: Mapping[str, QMPortTypes] = {}
476
479
  digitalInputs: Mapping[str, DigitalInputConfigType] | None = None
477
- digitalOutputs: Mapping[str, PortReferenceType] | None = None
480
+ digitalOutputs: Mapping[str, QMPortTypes] | None = None
478
481
  outputPulseParameters: OutputPulseParameterConfigType | None = None
479
482
  hold_offset: HoldOffsetConfigType | None = None
480
483
  sticky: StickyConfigType | None = None
481
484
  thread: str | None = None
482
- RF_inputs: Mapping[str, tuple[str, int]] | None = None
483
- RF_outputs: Mapping[str, tuple[str, int]] | None = None
485
+ RF_inputs: Mapping[str, NativeOPXPortType] | None = None
486
+ RF_outputs: Mapping[str, NativeOPXPortType] | None = None
484
487
 
485
488
  @model_validator(mode="after")
486
489
  def validator_oscillators(self) -> Self:
@@ -499,7 +502,7 @@ class ElementConfig121(ElementConfig):
499
502
 
500
503
  @model_validator(mode="after")
501
504
  def validate_outputs(self) -> Self:
502
- if self.RF_outputs:
505
+ if self.RF_outputs or self.MWOutput:
503
506
  if self.smearing is None:
504
507
  raise ValueError("Element with output must have smearing defined.")
505
508
  if self.time_of_flight is None:
@@ -529,7 +532,7 @@ class _BaseQuaConfig(BaseModel):
529
532
  qm_version: str
530
533
  """The qm-qua package version used."""
531
534
 
532
- version: str = "1"
535
+ version: int = 1
533
536
  """The configuration version. This is a field used in Qua's configuration API."""
534
537
 
535
538
  oscillators: Mapping[str, OscillatorConfigType] = {}
@@ -1,47 +0,0 @@
1
- # Copyright 2025 Q-CTRL. All rights reserved.
2
- #
3
- # Licensed under the Q-CTRL Terms of service (the "License"). Unauthorized
4
- # copying or use of this file, via any medium, is strictly prohibited.
5
- # Proprietary and confidential. You may not use this file except in compliance
6
- # with the License. You may obtain a copy of the License at
7
- #
8
- # https://q-ctrl.com/terms
9
- #
10
- # Unless required by applicable law or agreed to in writing, software
11
- # distributed under the License is distributed on an "AS IS" BASIS. See the
12
- # License for the specific language.
13
-
14
- from pathlib import Path
15
- from typing import Any
16
-
17
- from pydantic import TypeAdapter
18
- from pydantic.dataclasses import dataclass
19
-
20
-
21
- @dataclass
22
- class StubMetadata:
23
- api_url: str
24
- app_name: str
25
- device_name: str
26
- controller_type: str
27
- routine_name: str
28
- parameters: dict[str, Any]
29
- created_at: str
30
-
31
-
32
- @dataclass
33
- class StubData:
34
- raw_data: dict[str, Any]
35
- metadata: StubMetadata | None = None
36
-
37
- def to_dict(self) -> dict[str, Any]:
38
- return TypeAdapter(type(self)).dump_python(self)
39
-
40
- @classmethod
41
- def from_str(cls, data: str) -> "StubData":
42
- return TypeAdapter(cls).validate_json(data)
43
-
44
- @classmethod
45
- def load_from_file(cls, file_path: Path) -> "StubData":
46
- with file_path.open("rb") as file:
47
- return cls.from_str(file.read().decode("utf-8"))
@@ -1,18 +0,0 @@
1
- STUB_DATA_FILE_MAPPING: dict[str, list[str]] = {
2
- # Experiments
3
- "chi01_scan": ["QM/Tuna-5/chi01_scan.json"],
4
- "coherence_t1": ["QM/Tuna-5/coherence_t1.json"],
5
- "coherence_t2": ["QM/Tuna-5/coherence_t2.json"],
6
- "readout_classifier_calibration": ["QM/Tuna-5/readout_classifier_calibration.json"],
7
- "resonator_spectroscopy": ["QM/Tuna-5/resonator_spectroscopy.json"],
8
- "resonator_spectroscopy_by_power": ["QM/Tuna-5/resonator_spectroscopy_by_power.json"],
9
- "resonator_spectroscopy_by_bias": ["QM/Tuna-5/resonator_spectroscopy_by_bias.json"],
10
- "ramsey": ["QM/Tuna-5/ramsey.json"],
11
- "power_rabi": ["QM/Tuna-5/power_rabi.json"],
12
- "transmon_anharmonicity": ["QM/Tuna-5/transmon_anharmonicity.json"],
13
- "transmon_spectroscopy": ["QM/Tuna-5/transmon_spectroscopy.json"],
14
- # Routines
15
- "feedline_discovery": [f"QM/Tuna-5/feedline_discovery/{n}.json" for n in range(1, 7)],
16
- "resonator_mapping": [f"QM/Tuna-5/resonator_mapping/{n}.json" for n in range(1, 17)],
17
- "transmon_discovery": [f"QM/Tuna-5/transmon_discovery/{n}.json" for n in range(1, 8)],
18
- }