Skip to content

Commit 7157707

Browse files
authored
String units (#34)
* Remove ontomaps.toml and refactor unit definitions in predefined.py to use string representations instead of UnitDefinition instances. This simplifies the unit handling and eliminates the need for the deleted units.py file. * Refactor unit handling across readers and models to use string representations instead of UnitDefinition instances. This change enhances clarity and consistency in unit management, while also updating related tests and example data for improved accuracy. * Update version number in pyproject.toml to 0.9.18
1 parent c068f07 commit 7157707

38 files changed

+1071
-2616
lines changed

chromatopy/ioutils/enzymeml.py

Lines changed: 38 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from enum import Enum
33

44
from calipytion.tools.calibrator import Calibrator
5+
from mdmodels.units.annotation import UnitDefinitionAnnot
56
from pyenzyme import (
67
DataTypes,
78
EnzymeMLDocument,
@@ -10,10 +11,8 @@
1011
SmallMolecule,
1112
)
1213
from pyenzyme import Measurement as EnzymeMLMeasurement
13-
from pyenzyme import UnitDefinition as EnzymeMLUnitDefinition
1414

1515
from ..model import Chromatogram, Measurement
16-
from ..model import UnitDefinition as UnitDefinition
1716
from ..tools.analyzer import ChromAnalyzer
1817
from ..tools.internal_standard import InternalStandard
1918
from ..tools.molecule import Molecule
@@ -168,13 +167,13 @@ def create_enzymeml(
168167

169168
species_data = list(measurement_data_instances.values())
170169
for species in species_data:
171-
species.time_unit = EnzymeMLUnitDefinition(**time_unit.model_dump())
170+
species.time_unit = time_unit.name
172171

173172
enzml_measurement = EnzymeMLMeasurement(
174173
id=measurement_id,
175174
name=measurement_id,
176175
temperature=temp,
177-
temperature_unit=EnzymeMLUnitDefinition(**temp_unit.model_dump()),
176+
temperature_unit=temp_unit.name,
178177
ph=ph,
179178
species_data=list(measurement_data_instances.values()),
180179
)
@@ -250,10 +249,11 @@ def create_MeasurementData_instances(
250249
A MeasurementData instance for molecule {species.name} already exists.
251250
""")
252251

253-
assert isinstance(species.conc_unit, UnitDefinition), f"""
254-
The concentration unit of the molecule {species.name} needs to be defined.
255-
Please specify the `conc_unit` attribute of {species.name}.
256-
"""
252+
if not species.conc_unit:
253+
raise ValueError(f"""
254+
The concentration unit of the molecule {species.name} needs to be defined.
255+
Please specify the `conc_unit` attribute of {species.name}.
256+
""")
257257

258258
# Determine the data type based on the species type
259259
if isinstance(species, ChromProtein):
@@ -263,7 +263,7 @@ def create_MeasurementData_instances(
263263
species_id=species.id,
264264
initial=species.init_conc,
265265
prepared=species.init_conc,
266-
data_unit=EnzymeMLUnitDefinition(**species.conc_unit.model_dump()),
266+
data_unit=species.conc_unit.name,
267267
data_type=data_type,
268268
)
269269
elif isinstance(species, Molecule):
@@ -272,7 +272,7 @@ def create_MeasurementData_instances(
272272
species_id=species.id,
273273
initial=species.init_conc,
274274
prepared=species.init_conc,
275-
data_unit=EnzymeMLUnitDefinition(**species.conc_unit.model_dump()),
275+
data_unit=species.conc_unit.name,
276276
data_type=data_type,
277277
)
278278

@@ -311,29 +311,38 @@ def add_measurements_to_enzymeml(
311311
ph, temp, time_unit, temp_unit = extract_measurement_conditions(new_measurements)
312312

313313
# Create MeasurementData instances for existing molecules
314-
measurement_data_instances = {
315-
mol.id: MeasurementData(
314+
measurement_data_instances: dict[str, MeasurementData] = {}
315+
for mol in molecules:
316+
if mol.internal_standard:
317+
continue
318+
if not mol.conc_unit:
319+
raise ValueError(
320+
f"Concentration unit is not defined for molecule {mol.name}."
321+
)
322+
323+
measurement_data_instances[mol.id] = MeasurementData(
316324
species_id=mol.id,
317325
initial=mol.init_conc,
318326
prepared=mol.init_conc,
319-
data_unit=EnzymeMLUnitDefinition(**mol.conc_unit.model_dump()), # type: ignore
327+
data_unit=mol.conc_unit.name,
320328
data_type=DataTypes.PEAK_AREA,
321-
time_unit=EnzymeMLUnitDefinition(**time_unit.model_dump()),
329+
time_unit=time_unit.name,
322330
)
323-
for mol in molecules
324-
if not mol.internal_standard
325-
}
326331

327332
# Add MeasurementData instances for proteins
328333
for protein in proteins:
334+
if not protein.conc_unit:
335+
raise ValueError(
336+
f"Concentration unit is not defined for protein {protein.name}."
337+
)
329338
if protein.id not in measurement_data_instances:
330339
measurement_data_instances[protein.id] = MeasurementData(
331340
species_id=protein.id,
332341
initial=protein.init_conc,
333342
prepared=protein.init_conc,
334-
data_unit=EnzymeMLUnitDefinition(**protein.conc_unit.model_dump()), # type: ignore
343+
data_unit=protein.conc_unit.name,
335344
data_type=DataTypes.CONCENTRATION,
336-
time_unit=EnzymeMLUnitDefinition(**time_unit.model_dump()),
345+
time_unit=time_unit.name,
337346
)
338347

339348
# Convert new measurements to MeasurementData instances
@@ -351,7 +360,7 @@ def add_measurements_to_enzymeml(
351360
id=measurement_id,
352361
name=measurement_id,
353362
temperature=temp,
354-
temperature_unit=EnzymeMLUnitDefinition(**temp_unit.model_dump()),
363+
temperature_unit=temp_unit.name,
355364
ph=ph,
356365
species_data=list(measurement_data_instances.values()),
357366
)
@@ -431,6 +440,12 @@ def add_measurement_to_MeasurementData(
431440
if species_id in measured_once:
432441
# Handle molecules with peaks
433442
for measurement in measurements:
443+
dilution_factor = (
444+
measurement.dilution_factor
445+
if measurement.dilution_factor is not None
446+
else 1.0
447+
)
448+
434449
for chrom in measurement.chromatograms:
435450
add_data(
436451
measurement_data=meas_data,
@@ -439,7 +454,7 @@ def add_measurement_to_MeasurementData(
439454
calibrators=calibrators,
440455
calibrator_type=strategy,
441456
extrapolate=extrapolate,
442-
dilution_factor=measurement.dilution_factor,
457+
dilution_factor=dilution_factor,
443458
)
444459
else:
445460
# Handle proteins or molecules without peaks - add zero values for molecules with retention times
@@ -626,7 +641,7 @@ def setup_internal_calibrators(
626641
standard_molecule_id=internal_standard.id,
627642
molecule_init_conc=molecule.init_conc,
628643
standard_init_conc=internal_standard.init_conc,
629-
molecule_conc_unit=molecule.conc_unit,
644+
molecule_conc_unit=molecule.conc_unit.name,
630645
molecule_t0_signal=peak_analyte.area,
631646
standard_t0_signal=peak_internal_standard.area,
632647
)
@@ -636,7 +651,7 @@ def setup_internal_calibrators(
636651

637652
def extract_measurement_conditions(
638653
measurements: list[Measurement],
639-
) -> tuple[float, float, UnitDefinition, UnitDefinition]:
654+
) -> tuple[float, float, UnitDefinitionAnnot, UnitDefinitionAnnot]:
640655
"""Asserts and extracts the measurement conditions from a list of Measurement instances.
641656
642657
Args:

0 commit comments

Comments
 (0)