22from enum import Enum
33
44from calipytion .tools .calibrator import Calibrator
5+ from mdmodels .units .annotation import UnitDefinitionAnnot
56from pyenzyme import (
67 DataTypes ,
78 EnzymeMLDocument ,
1011 SmallMolecule ,
1112)
1213from pyenzyme import Measurement as EnzymeMLMeasurement
13- from pyenzyme import UnitDefinition as EnzymeMLUnitDefinition
1414
1515from ..model import Chromatogram , Measurement
16- from ..model import UnitDefinition as UnitDefinition
1716from ..tools .analyzer import ChromAnalyzer
1817from ..tools .internal_standard import InternalStandard
1918from ..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
637652def 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