Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
0605823
biacore insigth init and metadata
slopez-b Aug 6, 2025
02c832f
lint & data processing document
slopez-b Aug 13, 2025
0e29e2a
support multiple device control documents per measurement in mapper
slopez-b Aug 21, 2025
d3d7ce4
device control document data
slopez-b Aug 21, 2025
775f65e
device control and sample documents
slopez-b Aug 26, 2025
9e2b9d8
add evaluation kinetics data
slopez-b Aug 26, 2025
f0a41f5
add SquareResonanceUnits
slopez-b Aug 27, 2025
693e728
fix temperature setting
slopez-b Aug 27, 2025
1bea4ef
add report point data
slopez-b Aug 27, 2025
c376900
add report point custom info
slopez-b Aug 28, 2025
f9f2c73
Merge branch 'main' into slopez/cytiva-biacore-insight
slopez-b Aug 28, 2025
427a6d1
use DeviceControlDocument mapper class in biacore t200
slopez-b Aug 28, 2025
2f592ed
update instrument table
slopez-b Aug 29, 2025
7d261eb
use example file with masked data
slopez-b Aug 29, 2025
3779f30
lint
slopez-b Aug 29, 2025
965cfbf
fix unit
slopez-b Aug 29, 2025
213c067
add calculated data
slopez-b Sep 2, 2025
798da3d
Merge branch 'main' into slopez/cytiva-biacore-insight
slopez-b Sep 2, 2025
e5b5bbf
Merge branch 'main' into slopez/cytiva-biacore-insight
slopez-b Sep 2, 2025
41dbdda
reduce example size
slopez-b Sep 2, 2025
9cd8235
Merge branch 'main' into slopez/cytiva-biacore-insight
slopez-b Sep 2, 2025
3891373
fix sensorgram type
slopez-b Sep 3, 2025
d592d93
make sample_id consistent beteween measurements
slopez-b Sep 5, 2025
22bf416
Merge branch 'main' into slopez/cytiva-biacore-insight
slopez-b Sep 9, 2025
c56be0a
Merge branch 'main' into slopez/cytiva-biacore-insight
slopez-b Sep 12, 2025
976396f
use uuid for report point items to ensure uniquenes
slopez-b Sep 12, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion SUPPORTED_INSTRUMENT_SOFTWARE.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ The parsers follow maturation levels of: Recommended, Candidate Release, Working
[cols="4*^.^"]
|===
|Instrument Category|Instrument Software|Release Status|Exported ASM Schema
.1+|Binding Affinity Analyzer|Cytiva Biacore T200 Control|Recommended|WD/2024/12
.2+|Binding Affinity Analyzer|Cytiva Biacore Insight|Recommended|WD/2024/12
|Cytiva Biacore T200 Control|Recommended|WD/2024/12
.6+|Cell Counting|Beckman Coulter Vi-Cell BLU|Recommended|REC/2024/09
|Beckman Coulter Vi-Cell XR|Recommended|REC/2024/09
|ChemoMetec NC View|Recommended|REC/2024/09
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# generated by datamodel-codegen:
# filename: binding-affinity-analyzer.schema.json
# timestamp: 2025-02-26T19:19:58+00:00
# timestamp: 2025-08-29T17:23:20+00:00

from __future__ import annotations

Expand All @@ -14,10 +14,10 @@
TQuantityValueMolar,
TQuantityValueNanomolar,
TQuantityValuePercent,
TQuantityValuePerMolarPerSecond,
TQuantityValuePerSecond,
TQuantityValueResonanceUnits,
TQuantityValueSecondTime,
TQuantityValueTODO,
)
from allotropy.allotrope.models.shared.definitions.definitions import (
TBooleanValue,
Expand Down Expand Up @@ -268,10 +268,12 @@ class ProcessedDataDocumentItem:
field_index: int | None = None
POSIX_path: TStringValue | None = None
identifier: TStringValue | None = None
binding_on_rate_measurement_datum__kon_: TQuantityValueTODO | None = None
binding_on_rate_measurement_datum__kon_: TQuantityValuePerMolarPerSecond | None = (
None
)
binding_off_rate_measurement_datum__koff_: TQuantityValuePerSecond | None = None
equilibrium_dissociation_constant__KD_: TQuantityValueMolar | None = None
maximum_binding_capacity__Rmax_: TQuantityValueTODO | None = None
maximum_binding_capacity__Rmax_: TQuantityValueResonanceUnits | None = None
report_point_aggregate_document: ReportPointAggregateDocument | None = None


Expand Down
13 changes: 13 additions & 0 deletions src/allotropy/allotrope/models/shared/definitions/custom.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@
SeimensPerMeter,
SquareCentimetersPerGram,
SquareCentimetersPerMole,
SquareResonanceUnits,
TODO,
Unitless,
UnitPerLiter,
Expand Down Expand Up @@ -807,6 +808,18 @@ class TNullableQuantityValueSquareCentimetersPerMole(
pass


@dataclass(frozen=True, kw_only=True)
class TQuantityValueSquareResonanceUnits(SquareResonanceUnits, TQuantityValue):
pass


@dataclass(frozen=True, kw_only=True)
class TNullableQuantityValueSquareResonanceUnits(
SquareResonanceUnits, TNullableQuantityValue
):
pass


@dataclass(frozen=True, kw_only=True)
class TQuantityValueTODO(TODO, TQuantityValue):
pass
Expand Down
5 changes: 5 additions & 0 deletions src/allotropy/allotrope/models/shared/definitions/units.py
Original file line number Diff line number Diff line change
Expand Up @@ -334,6 +334,11 @@ class SquareCentimetersPerMole(HasUnit):
unit: str = "cm^2/mol"


@dataclass(frozen=True, kw_only=True)
class SquareResonanceUnits(HasUnit):
unit: str = "RU^2"


@dataclass(frozen=True, kw_only=True)
class TODO(HasUnit):
unit: str = "TODO"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,11 @@
from allotropy.allotrope.models.shared.definitions.custom import (
TQuantityValueDegreeCelsius,
TQuantityValueMicroliterPerMinute,
TQuantityValueMolar,
TQuantityValueNanomolar,
TQuantityValuePercent,
TQuantityValuePerMolarPerSecond,
TQuantityValuePerSecond,
TQuantityValueResonanceUnits,
TQuantityValueSecondTime,
)
Expand All @@ -41,7 +44,7 @@
from allotropy.parsers.utils.calculated_data_documents.definition import (
CalculatedDocument,
)
from allotropy.parsers.utils.values import assert_not_none, quantity_or_none
from allotropy.parsers.utils.values import assert_not_none, has_value, quantity_or_none
from allotropy.types import DictType


Expand Down Expand Up @@ -87,33 +90,49 @@ class ReportPoint:
custom_info: DictType | None = None


@dataclass(frozen=True)
class DeviceControlDocument:
device_type: str
flow_cell_identifier: str | None = None
flow_path: str | None = None
flow_rate: float | None = None
contact_time: float | None = None
dilution: float | None = None
sample_temperature_setting: float | None = None
device_control_custom_info: DictType | None = None


@dataclass(frozen=True)
class Measurement:
identifier: str
sample_identifier: str
device_type: str
type_: MeasurementType
device_control_document: list[DeviceControlDocument]
location_identifier: str | None = None
batch_identifier: str | None = None
well_plate_identifier: str | None = None
sample_role_type: str | None = None
concentration: float | None = None
method_name: str | None = None
ligand_identifier: str | None = None
flow_cell_identifier: str | None = None
flow_path: str | None = None
flow_rate: float | None = None
contact_time: float | None = None
dilution: float | None = None
device_control_custom_info: DictType | None = None
sample_custom_info: DictType | None = None

# Sensorgram
sensorgram_data_cube: DataCube | None = None

# Processed Data
binding_on_rate_measurement_datum__kon_: float | None = None
binding_off_rate_measurement_datum__koff_: float | None = None
equilibrium_dissociation_constant__kd_: float | None = None
maximum_binding_capacity__rmax_: float | None = None
processed_data_custom_info: DictType | None = None

# Report point
report_point_data: list[ReportPoint] | None = None

# Data processing
data_processing_document: DictType | None = None


@dataclass(frozen=True)
class MeasurementGroup:
Expand Down Expand Up @@ -153,6 +172,7 @@ def map_model(self, data: Data) -> Model:
model_number=data.metadata.model_number,
brand_name=data.metadata.brand_name,
product_manufacturer=data.metadata.product_manufacturer,
equipment_serial_number=data.metadata.equipment_serial_number,
device_document=(
[
DeviceDocumentItem(
Expand Down Expand Up @@ -213,6 +233,60 @@ def _get_measurement_document_item(
def _get_surface_plasmon_resonance_measurement_document(
self, measurement: Measurement, metadata: Metadata
) -> MeasurementDocument:
processed_data_document = ProcessedDataDocumentItem(
data_processing_document=(
{
key: value
for key, value in measurement.data_processing_document.items()
if value is not None
}
if measurement.data_processing_document
else None
),
binding_on_rate_measurement_datum__kon_=quantity_or_none(
TQuantityValuePerMolarPerSecond,
measurement.binding_on_rate_measurement_datum__kon_,
),
binding_off_rate_measurement_datum__koff_=quantity_or_none(
TQuantityValuePerSecond,
measurement.binding_off_rate_measurement_datum__koff_,
),
equilibrium_dissociation_constant__KD_=quantity_or_none(
TQuantityValueMolar,
measurement.equilibrium_dissociation_constant__kd_,
),
maximum_binding_capacity__Rmax_=quantity_or_none(
TQuantityValueResonanceUnits,
measurement.maximum_binding_capacity__rmax_,
),
report_point_aggregate_document=(
ReportPointAggregateDocument(
report_point_document=[
add_custom_information_document(
ReportPointDocumentItem(
report_point_identifier=report_point.identifier,
identifier_role=report_point.identifier_role,
absolute_resonance=TQuantityValueResonanceUnits(
value=report_point.absolute_resonance
),
relative_resonance=quantity_or_none(
TQuantityValueResonanceUnits,
report_point.relative_resonance,
),
time_setting=TQuantityValueSecondTime(
value=report_point.time_setting
),
),
custom_info_doc=report_point.custom_info,
)
for report_point in measurement.report_point_data
]
)
if measurement.report_point_data
else None
),
)

return MeasurementDocument(
measurement_identifier=measurement.identifier,
sample_document=add_custom_information_document(
Expand Down Expand Up @@ -245,55 +319,39 @@ def _get_surface_plasmon_resonance_measurement_document(
device_control_document=[
add_custom_information_document(
DeviceControlDocumentItem(
flow_cell_identifier=measurement.flow_cell_identifier,
flow_path=measurement.flow_path,
sample_temperature_setting=quantity_or_none(
TQuantityValueDegreeCelsius,
device_control.sample_temperature_setting,
),
flow_cell_identifier=device_control.flow_cell_identifier,
flow_path=device_control.flow_path,
flow_rate=quantity_or_none(
TQuantityValueMicroliterPerMinute,
measurement.flow_rate,
device_control.flow_rate,
),
contact_time=quantity_or_none(
TQuantityValueSecondTime, measurement.contact_time
TQuantityValueSecondTime, device_control.contact_time
),
dilution_factor=quantity_or_none(
TQuantityValuePercent, measurement.dilution
TQuantityValuePercent, device_control.dilution
),
device_type=measurement.device_type,
device_type=device_control.device_type,
),
custom_info_doc=measurement.device_control_custom_info,
custom_info_doc=device_control.device_control_custom_info,
)
for device_control in measurement.device_control_document
]
),
processed_data_aggregate_document=(
ProcessedDataAggregateDocument(
processed_data_document=[
ProcessedDataDocumentItem(
report_point_aggregate_document=ReportPointAggregateDocument(
report_point_document=[
add_custom_information_document(
ReportPointDocumentItem(
report_point_identifier=report_point.identifier,
identifier_role=report_point.identifier_role,
absolute_resonance=TQuantityValueResonanceUnits(
value=report_point.absolute_resonance
),
relative_resonance=quantity_or_none(
TQuantityValueResonanceUnits,
report_point.relative_resonance,
),
time_setting=TQuantityValueSecondTime(
value=report_point.time_setting
),
),
# TODO: probably this should be at the processed document level.
custom_info_doc=report_point.custom_info,
)
for report_point in measurement.report_point_data
]
)
),
add_custom_information_document(
processed_data_document,
custom_info_doc=measurement.processed_data_custom_info,
)
]
)
if measurement.report_point_data
if has_value(processed_data_document)
else None
),
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@
"$ref": "http://purl.allotrope.org/json-schemas/adm/core/REC/2024/09/core.schema#/$defs/tQuantityValue"
},
{
"$ref": "TODO"
"$ref": "http://purl.allotrope.org/json-schemas/qudt/REC/2024/09/units.schema#/$defs/PerMolarPerSecond"
}
]
},
Expand Down Expand Up @@ -216,7 +216,7 @@
"$ref": "http://purl.allotrope.org/json-schemas/adm/core/REC/2024/09/core.schema#/$defs/tQuantityValue"
},
{
"$ref": "TODO"
"$ref": "http://purl.allotrope.org/json-schemas/qudt/REC/2024/09/units.schema#/$defs/ResonanceUnits"
}
]
}
Expand Down Expand Up @@ -4521,6 +4521,18 @@
"unit"
]
},
"M-1s-1": {
"properties": {
"unit": {
"$asm.unit-iri": "http://purl.allotrope.org/ontology/qudt-ext/unit#PerMolarPerSecond",
"const": "M-1s-1",
"type": "string"
}
},
"required": [
"unit"
]
},
"MHz": {
"properties": {
"unit": {
Expand Down
20 changes: 20 additions & 0 deletions src/allotropy/allotrope/schemas/shared/definitions/custom.json
Original file line number Diff line number Diff line change
Expand Up @@ -1299,6 +1299,26 @@
}
]
},
"tQuantityValueSquareResonanceUnits": {
"allOf": [
{
"$ref": "#/$defs/tQuantityValue"
},
{
"$ref": "#/$defs/SquareResonanceUnits"
}
]
},
"tNullableQuantityValueSquareResonanceUnits": {
"allOf": [
{
"$ref": "#/$defs/tNullableQuantityValue"
},
{
"$ref": "#/$defs/SquareResonanceUnits"
}
]
},
"tQuantityValueTODO": {
"allOf": [
{
Expand Down
12 changes: 12 additions & 0 deletions src/allotropy/allotrope/schemas/shared/definitions/units.json
Original file line number Diff line number Diff line change
Expand Up @@ -779,6 +779,18 @@
"unit"
]
},
"SquareResonanceUnits": {
"properties": {
"unit": {
"type": "string",
"const": "RU^2",
"$asm.unit-iri": "TODO"
}
},
"required": [
"unit"
]
},
"TODO": {
"properties": {
"unit": {
Expand Down
Loading
Loading