Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@
DEVICE_TYPE = "Binding Affinity Analyzer"
DETECTION_TYPE = "Surface Plasmon Resonance"
PRODUCT_MANUFACTURER = "Cytiva"
REQUIRED_SHEETS = ("Properties", "Report point table")

COMPARTMENT_TEMP_REGEX = r"Sample compartment temperature (\d+),.*"
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
from pathlib import Path
from typing import Any

import numpy as np

from allotropy.allotrope.models.shared.definitions.custom import (
TQuantityValueHertz,
TQuantityValueNumber,
TQuantityValueResponseUnit,
TQuantityValueSecondTime,
TQuantityValueSquareResponseUnit,
TQuantityValueUnitless,
Expand Down Expand Up @@ -35,6 +39,29 @@
from allotropy.parsers.utils.values import quantity_or_none


def _clean_custom_info(custom_info: dict[str, Any]) -> dict[str, Any]:
"""Remove None and NaN values from custom_info dictionaries."""

def is_valid_value(value: Any) -> bool:
if value is None:
return False
# Check for NaN in plain float values
if isinstance(value, float) and np.isnan(value):
return False
# Check for NaN in quantity objects (objects with 'value' attribute or dicts with 'value' key)
if hasattr(value, "value"):
val = value.value
if isinstance(val, float) and np.isnan(val):
return False
elif isinstance(value, dict) and "value" in value:
val = value["value"]
if isinstance(val, float) and np.isnan(val):
return False
return True

return {key: value for key, value in custom_info.items() if is_valid_value(value)}


def create_metadata(metadata: BiacoreInsightMetadata, file_path: str) -> Metadata:
path = Path(file_path)
run_metadata = metadata.runs[0]
Expand Down Expand Up @@ -107,15 +134,23 @@ def _get_measurements(
maximum_binding_capacity__rmax_=(
measurement.kinetics.maximum_binding_capacity
),
processed_data_custom_info=(
processed_data_custom_info=_clean_custom_info(
{
"Kinetics Chi squared": quantity_or_none(
(
"Affinity Chi squared"
if measurement.kinetics.is_affinity_measurement
else "Kinetics Chi squared"
): quantity_or_none(
TQuantityValueSquareResponseUnit,
measurement.kinetics.kinetics_chi_squared,
),
"tc": quantity_or_none(
TQuantityValueUnitless, measurement.kinetics.tc
),
"offset": quantity_or_none(
TQuantityValueResponseUnit,
measurement.kinetics.offset,
),
}
),
report_point_data=[
Expand All @@ -125,21 +160,26 @@ def _get_measurements(
absolute_resonance=rp.absolute_resonance,
time_setting=rp.time_setting,
relative_resonance=rp.relative_resonance,
custom_info={
"Step name": rp.step_name,
"Step purpose": rp.step_purpose,
"Window": quantity_or_none(TQuantityValueSecondTime, rp.window),
"Baseline": rp.baseline,
},
custom_info=_clean_custom_info(
{
"Step purpose": rp.step_purpose,
"Window": quantity_or_none(
TQuantityValueSecondTime, rp.window
),
"Baseline": rp.baseline,
}
),
)
for rp in measurement.report_point_data
],
data_processing_document={
**data_processing_document,
"Acceptance State": measurement.kinetics.acceptance_state,
"Curve Markers": measurement.kinetics.curve_markers,
"Kinetics Model": measurement.kinetics.kinetics_model,
},
data_processing_document=_clean_custom_info(
{
**data_processing_document,
"Acceptance State": measurement.kinetics.acceptance_state,
"Curve Markers": measurement.kinetics.curve_markers,
"Kinetics Model": measurement.kinetics.kinetics_model,
}
),
)
for measurement in measurement_data
]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,9 @@

from allotropy.exceptions import AllotropeConversionError
from allotropy.named_file_contents import NamedFileContents
from allotropy.parsers.cytiva_biacore_insight.constants import REQUIRED_SHEETS
from allotropy.parsers.utils.pandas import read_multisheet_excel

REQUIRED_SHEETS = ("Properties", "Report point table", "Evaluation - Kinetics")


class CytivaBiacoreInsightReader:
SUPPORTED_EXTENSIONS = "xlsx, xlsm"
Expand Down
Loading
Loading