From 0e309cb45ef620c4e3553504ece755debce4a1ec Mon Sep 17 00:00:00 2001 From: Felipe Narvaez Date: Mon, 4 Aug 2025 15:03:27 -0500 Subject: [PATCH 1/4] attempt 1 at adding unread to cytiva unicorn --- .../_2023/_09/liquid_chromatography.py | 125 +- .../allotrope/schema_mappers/data_cube.py | 1 + .../structure/data_cube/creator.py | 1 + .../structure/measurement_group.py | 3 + .../structure/measurements/absorbance.py | 11 +- .../structure/measurements/generic.py | 10 +- .../parsers/utils/strict_xml_element.py | 65 +- .../cytiva_unicorn/testdata/unicorn_1.json | 1012 ++++++++++++++--- 8 files changed, 1064 insertions(+), 164 deletions(-) diff --git a/src/allotropy/allotrope/schema_mappers/adm/liquid_chromatography/benchling/_2023/_09/liquid_chromatography.py b/src/allotropy/allotrope/schema_mappers/adm/liquid_chromatography/benchling/_2023/_09/liquid_chromatography.py index d8a2a27aa2..f9e1e08fb0 100644 --- a/src/allotropy/allotrope/schema_mappers/adm/liquid_chromatography/benchling/_2023/_09/liquid_chromatography.py +++ b/src/allotropy/allotrope/schema_mappers/adm/liquid_chromatography/benchling/_2023/_09/liquid_chromatography.py @@ -146,6 +146,7 @@ class Fraction: field_type: str | None = None retention_time: float | None = None retention_volume: float | None = None + custom_info: dict[str, Any] | None = None @dataclass(frozen=True) @@ -155,6 +156,7 @@ class Log: log_entry: str | None = None retention_time: float | None = None retention_volume: float | None = None + custom_info: dict[str, Any] | None = None @dataclass(frozen=True) @@ -361,11 +363,12 @@ def _get_measurement_document_item( for device_control_doc in measurement.device_control_docs ] ), - chromatogram_data_cube=( + chromatogram_data_cube=add_custom_information_document( get_data_cube( measurement.chromatogram_data_cube, ChromatogramDataCube, - ) + ), + getattr(measurement.chromatogram_data_cube, "custom_info", None), ), ), measurement.measurement_custom_info, @@ -548,8 +551,15 @@ def build_data_document_item( else None ) item = ProcessedDataDocumentItem( - chromatogram_data_cube=get_data_cube( - measurement.processed_data_chromatogram_data_cube, TDatacube + chromatogram_data_cube=add_custom_information_document( + get_data_cube( + measurement.processed_data_chromatogram_data_cube, TDatacube + ), + getattr( + measurement.processed_data_chromatogram_data_cube, + "custom_info", + None, + ), ), derived_column_pressure_data_cube=get_data_cube( measurement.derived_column_pressure_data_cube, @@ -605,37 +615,87 @@ def _get_device_control_document( TQuantityValueNanometer, device_control_doc.detector_bandwidth_setting, ), - solvent_concentration_data_cube=get_data_cube( - device_control_doc.solvent_conc_data_cube, - SolventConcentrationDataCube, + solvent_concentration_data_cube=add_custom_information_document( + get_data_cube( + device_control_doc.solvent_conc_data_cube, + SolventConcentrationDataCube, + ), + getattr( + device_control_doc.solvent_conc_data_cube, "custom_info", None + ), ), - pre_column_pressure_data_cube=get_data_cube( - device_control_doc.pre_column_pressure_data_cube, - PreColumnPressureDataCube, + pre_column_pressure_data_cube=add_custom_information_document( + get_data_cube( + device_control_doc.pre_column_pressure_data_cube, + PreColumnPressureDataCube, + ), + getattr( + device_control_doc.pre_column_pressure_data_cube, + "custom_info", + None, + ), ), - sample_pressure_data_cube=get_data_cube( - device_control_doc.sample_pressure_data_cube, - SamplePressureDataCube, + sample_pressure_data_cube=add_custom_information_document( + get_data_cube( + device_control_doc.sample_pressure_data_cube, + SamplePressureDataCube, + ), + getattr( + device_control_doc.sample_pressure_data_cube, + "custom_info", + None, + ), ), - system_pressure_data_cube=get_data_cube( - device_control_doc.system_pressure_data_cube, - SystemPressureDataCube, + system_pressure_data_cube=add_custom_information_document( + get_data_cube( + device_control_doc.system_pressure_data_cube, + SystemPressureDataCube, + ), + getattr( + device_control_doc.system_pressure_data_cube, + "custom_info", + None, + ), ), - post_column_pressure_data_cube=get_data_cube( - device_control_doc.post_column_pressure_data_cube, - PostColumnPressureDataCube, + post_column_pressure_data_cube=add_custom_information_document( + get_data_cube( + device_control_doc.post_column_pressure_data_cube, + PostColumnPressureDataCube, + ), + getattr( + device_control_doc.post_column_pressure_data_cube, + "custom_info", + None, + ), ), - sample_flow_rate_data_cube=get_data_cube( - device_control_doc.sample_flow_data_cube, - SampleFlowRateDataCube, + sample_flow_rate_data_cube=add_custom_information_document( + get_data_cube( + device_control_doc.sample_flow_data_cube, + SampleFlowRateDataCube, + ), + getattr( + device_control_doc.sample_flow_data_cube, "custom_info", None + ), ), - system_flow_rate_data_cube=get_data_cube( - device_control_doc.system_flow_data_cube, - SystemFlowRateDataCube, + system_flow_rate_data_cube=add_custom_information_document( + get_data_cube( + device_control_doc.system_flow_data_cube, + SystemFlowRateDataCube, + ), + getattr( + device_control_doc.system_flow_data_cube, "custom_info", None + ), ), - temperature_profile_data_cube=get_data_cube( - device_control_doc.temperature_profile_data_cube, - TemperatureProfileDataCube, + temperature_profile_data_cube=add_custom_information_document( + get_data_cube( + device_control_doc.temperature_profile_data_cube, + TemperatureProfileDataCube, + ), + getattr( + device_control_doc.temperature_profile_data_cube, + "custom_info", + None, + ), ), detector_offset_setting=quantity_or_none( TQuantityValueUnitless, device_control_doc.detector_offset_setting @@ -670,7 +730,7 @@ def _get_fraction_aggregate_document( ) def _get_fraction_document(self, fraction_doc: Fraction) -> FractionDocumentItem: - return FractionDocumentItem( + fraction_doc_item = FractionDocumentItem( index=fraction_doc.index, fraction_role=fraction_doc.fraction_role, field_type=fraction_doc.field_type, @@ -682,6 +742,10 @@ def _get_fraction_document(self, fraction_doc: Fraction) -> FractionDocumentItem ), ) + return add_custom_information_document( + fraction_doc_item, fraction_doc.custom_info + ) + def _get_log_aggregate_document( self, logs: list[Log] | None ) -> LogAggregateDocument | None: @@ -693,7 +757,7 @@ def _get_log_aggregate_document( ) def _get_log_document(self, log_doc: Log) -> LogDocumentItem: - return LogDocumentItem( + log_doc_item = LogDocumentItem( index=log_doc.index, method_identifier=log_doc.method_identifier, log_entry=log_doc.log_entry, @@ -704,3 +768,4 @@ def _get_log_document(self, log_doc: Log) -> LogDocumentItem: TQuantityValueMilliliter, log_doc.retention_volume ), ) + return add_custom_information_document(log_doc_item, log_doc.custom_info) diff --git a/src/allotropy/allotrope/schema_mappers/data_cube.py b/src/allotropy/allotrope/schema_mappers/data_cube.py index c891350edb..54de21ade3 100644 --- a/src/allotropy/allotrope/schema_mappers/data_cube.py +++ b/src/allotropy/allotrope/schema_mappers/data_cube.py @@ -30,6 +30,7 @@ class DataCube: measures: Sequence[ Sequence[float | None] | Sequence[str | None] | Sequence[bool | None] ] + custom_info: dict[str, str] | None = None class DataCubeProtocol(Protocol): diff --git a/src/allotropy/parsers/cytiva_unicorn/structure/data_cube/creator.py b/src/allotropy/parsers/cytiva_unicorn/structure/data_cube/creator.py index 06825be727..57e11e8b3b 100644 --- a/src/allotropy/parsers/cytiva_unicorn/structure/data_cube/creator.py +++ b/src/allotropy/parsers/cytiva_unicorn/structure/data_cube/creator.py @@ -46,4 +46,5 @@ def create_data_cube( ).get_data() ) ], + custom_info={}, ) diff --git a/src/allotropy/parsers/cytiva_unicorn/structure/measurement_group.py b/src/allotropy/parsers/cytiva_unicorn/structure/measurement_group.py index 0467a5ef92..5e43659cd6 100644 --- a/src/allotropy/parsers/cytiva_unicorn/structure/measurement_group.py +++ b/src/allotropy/parsers/cytiva_unicorn/structure/measurement_group.py @@ -68,6 +68,7 @@ def create_measurement_groups( measurements=[measurement for measurement in measurements if measurement], fractions=create_fractions(event_curves) if event_curves else None, logs=create_logs(event_curves) if event_curves else None, + measurement_aggregate_custom_info=chrom_1.get_unread(), ) ] @@ -94,6 +95,7 @@ def create_fractions(event_curves: StrictXmlElement) -> list[Fraction]: else t_min * 60 ), retention_volume=event.get_sub_float_or_none("EventVolume"), + custom_info=event.get_unread(), ) for idx, event in enumerate(events.findall("Event"), start=1) if event.get_attr_or_none("EventType") in ["Fraction", "Method"] @@ -144,6 +146,7 @@ def create_logs(event_curves: StrictXmlElement) -> list[Log]: else t_min * 60 ), retention_volume=event.get_sub_float_or_none("EventVolume"), + custom_info=event.get_unread(), ) ) diff --git a/src/allotropy/parsers/cytiva_unicorn/structure/measurements/absorbance.py b/src/allotropy/parsers/cytiva_unicorn/structure/measurements/absorbance.py index ecff7dfc37..461310c2a7 100644 --- a/src/allotropy/parsers/cytiva_unicorn/structure/measurements/absorbance.py +++ b/src/allotropy/parsers/cytiva_unicorn/structure/measurements/absorbance.py @@ -150,8 +150,9 @@ def get_peaks_custom_info( def get_peaks(cls, handler: UnicornZipHandler) -> list[Peak]: chrom_1 = handler.get_chrom_1() peaks = chrom_1.recursive_find_or_none(["PeakTables", "PeakTable", "Peaks"]) - return [ - Peak( + output = [] + for idx, peak in enumerate(peaks.findall("Peak") if peaks else [], start=1): + peak_obj = Peak( identifier=random_uuid_str(), index=f"Peak {idx}", end=peak.get_sub_float_or_none("EndPeakRetention"), @@ -172,8 +173,10 @@ def get_peaks(cls, handler: UnicornZipHandler) -> list[Peak]: chromatographic_asymmetry=peak.get_sub_float_or_none("Assymetry"), custom_info=cls.get_peaks_custom_info(peak), ) - for idx, peak in enumerate(peaks.findall("Peak") if peaks else [], start=1) - ] + if peak_obj.custom_info is not None: + peak_obj.custom_info.update(peak.get_unread()) + output.append(peak_obj) + return output class AbsorbanceMeasurement2(AbsorbanceMeasurement): diff --git a/src/allotropy/parsers/cytiva_unicorn/structure/measurements/generic.py b/src/allotropy/parsers/cytiva_unicorn/structure/measurements/generic.py index 5fbb3f9c4e..1ec1d9362d 100644 --- a/src/allotropy/parsers/cytiva_unicorn/structure/measurements/generic.py +++ b/src/allotropy/parsers/cytiva_unicorn/structure/measurements/generic.py @@ -61,13 +61,21 @@ def get_data_cube_or_none( if data_cube_handler := cls.get_data_cube_handler_or_none(handler, curve): name_element = curve.find("Name") + if name := name_element.get_text_or_none(): - return create_data_cube( + data_cube = create_data_cube( data_cube_handler, name, data_cube_component, transformation, ) + if data_cube.custom_info is not None: + # Filter out None values to match expected dict[str, str] type + unread_data = { + k: v for k, v in curve.get_unread().items() if v is not None + } + data_cube.custom_info.update(unread_data) + return data_cube return None @classmethod diff --git a/src/allotropy/parsers/utils/strict_xml_element.py b/src/allotropy/parsers/utils/strict_xml_element.py index 77696ebb95..05e454a729 100644 --- a/src/allotropy/parsers/utils/strict_xml_element.py +++ b/src/allotropy/parsers/utils/strict_xml_element.py @@ -205,9 +205,16 @@ def get_unread( - attribute names without "attr:" prefix - namespaced attribute names without "ns_attr:" prefix """ + all_keys = self._get_all_available_keys() attribute_keys = self._get_all_attribute_keys() + non_attribute_keys = all_keys - attribute_keys self._handle_skip_keys(skip) - matching_keys = self._apply_regex_filter(attribute_keys, regex) + + matching_keys_attribute = self._apply_regex_filter(attribute_keys, regex) + matching_keys_non_attribute = self._apply_regex_filter( + non_attribute_keys, regex + ) + matching_keys = matching_keys_attribute | matching_keys_non_attribute unread_keys: dict[str, str | None] = {} processed_attrs: set[str] = set() @@ -217,6 +224,11 @@ def get_unread( self._process_attr_key(key, matching_keys, unread_keys, processed_attrs) elif key.startswith("ns_attr:"): self._process_ns_attr_key(key, unread_keys, processed_attrs) + elif key.startswith("element:"): + if self.should_process_element_key(key): + self._process_element_key(key, unread_keys) + else: + continue self._mark_processed_keys_as_read(matching_keys, unread_keys) return unread_keys @@ -299,6 +311,57 @@ def _process_ns_attr_key( unread_keys[clean_key] = self.element.get(full_attr_name) processed_attrs.add(full_attr_name) + def _process_element_key( + self, key: str, unread_keys: dict[str, str | None] + ) -> None: + """Process an 'element:' prefixed key.""" + element_name = key.replace("element:", "") # Remove "element:" prefix + element = getattr(self.find_or_none(element_name), "element", None) + if element is None: + return + value_for_key = element.text + if value_for_key is not None: + unread_keys[element_name] = value_for_key + + def should_process_element_key(self, key: str) -> bool: + """ + Check if an XML element key should be processed. + + Returns False if: + - The element has children + - The element's text content appears to be XML formatted + + Returns True otherwise. + """ + # Extract element name from key + element_name = key.replace("element:", "") + + # Find the element + element_wrapper = self.find_or_none(element_name) + element = getattr(element_wrapper, "element", None) + if element is None: + return False + + # Check if element has children + if len(element) > 0: + return False + + # Check if element text looks like XML + text = element.text + if text: + text = text.strip() + if text: + # Check for basic XML patterns + if text.startswith("<") and text.endswith(">"): + return False + + # Check for XML-like patterns with regex + xml_pattern = re.compile(r"<[^>]+>.*]+>", re.DOTALL) + if xml_pattern.search(text): + return False + + return True + def _is_attr_already_processed( self, attr_name: str, processed_attrs: set[str] ) -> bool: diff --git a/tests/parsers/cytiva_unicorn/testdata/unicorn_1.json b/tests/parsers/cytiva_unicorn/testdata/unicorn_1.json index 4709208fb0..280b7cf7e8 100644 --- a/tests/parsers/cytiva_unicorn/testdata/unicorn_1.json +++ b/tests/parsers/cytiva_unicorn/testdata/unicorn_1.json @@ -123,7 +123,10 @@ "average conductivity": { "value": 1.691657, "unit": "S/m" - } + }, + "StartPeakLimitType": "BaseLine", + "IsStandardPeak": "false", + "EndPeakLimitType": "DropLine" } }, { @@ -209,7 +212,10 @@ "average conductivity": { "value": 1.700847, "unit": "S/m" - } + }, + "StartPeakLimitType": "DropLine", + "IsStandardPeak": "false", + "EndPeakLimitType": "DropLine" } }, { @@ -295,7 +301,10 @@ "average conductivity": { "value": 1.701128, "unit": "S/m" - } + }, + "StartPeakLimitType": "DropLine", + "IsStandardPeak": "false", + "EndPeakLimitType": "DropLine" } }, { @@ -381,7 +390,10 @@ "average conductivity": { "value": 1.701361, "unit": "S/m" - } + }, + "StartPeakLimitType": "DropLine", + "IsStandardPeak": "false", + "EndPeakLimitType": "DropLine" } } ] @@ -422,6 +434,27 @@ "measures": [ [0.19794297218322754, 0.19794535636901855, 0.19794775545597076] ] + }, + "custom information document": { + "IsOriginalData": "true", + "MethodStartTime": "2024-01-02T11:00:00.000", + "AmplitudeUnit": "mAU", + "ChromatogramStartTimeUtcOffsetMinutes": "-300", + "AmplitudePrecision": "3", + "CurveDataType": "UV", + "IsReadOnly": "false", + "MethodStartTimeUtcOffsetMinutes": "-300", + "ColumnVolumeUnitName": "ml", + "IsoChroneType": "Time", + "DistanceToStartPoint": "0.06833267", + "CurveNumber": "1", + "ColumnVolume": "4", + "ScanInterval": "0", + "DistanceBetweenPoints": "0.001666667", + "ChromatogramStartTime": "2024-01-02T11:00:00.000", + "TimeUnit": "min", + "VolumeUnit": "ml", + "IsExternal": "false" } } }, @@ -492,6 +525,27 @@ "measures": [ [0.0, 0.0, 0.0] ] + }, + "custom information document": { + "IsOriginalData": "true", + "MethodStartTime": "2024-01-02T11:00:00.000", + "AmplitudeUnit": "mAU", + "ChromatogramStartTimeUtcOffsetMinutes": "-300", + "AmplitudePrecision": "3", + "CurveDataType": "UV", + "IsReadOnly": "false", + "MethodStartTimeUtcOffsetMinutes": "-300", + "ColumnVolumeUnitName": "ml", + "IsoChroneType": "Time", + "DistanceToStartPoint": "0.08499908", + "CurveNumber": "2", + "ColumnVolume": "4", + "ScanInterval": "0", + "DistanceBetweenPoints": "0.008333334", + "ChromatogramStartTime": "2024-01-02T11:00:00.000", + "TimeUnit": "min", + "VolumeUnit": "ml", + "IsExternal": "false" } } }, @@ -562,6 +616,27 @@ "measures": [ [0.0, 0.0, 0.0] ] + }, + "custom information document": { + "IsOriginalData": "true", + "MethodStartTime": "2024-01-02T11:00:00.000", + "AmplitudeUnit": "mAU", + "ChromatogramStartTimeUtcOffsetMinutes": "-300", + "AmplitudePrecision": "3", + "CurveDataType": "UV", + "IsReadOnly": "false", + "MethodStartTimeUtcOffsetMinutes": "-300", + "ColumnVolumeUnitName": "ml", + "IsoChroneType": "Time", + "DistanceToStartPoint": "0.08499908", + "CurveNumber": "3", + "ColumnVolume": "4", + "ScanInterval": "0", + "DistanceBetweenPoints": "0.008333334", + "ChromatogramStartTime": "2024-01-02T11:00:00.000", + "TimeUnit": "min", + "VolumeUnit": "ml", + "IsExternal": "false" } } }, @@ -627,6 +702,27 @@ "measures": [ [31.154701232910156, 31.13396453857422, 30.91810417175293] ] + }, + "custom information document": { + "IsOriginalData": "true", + "MethodStartTime": "2024-01-02T11:00:00.000", + "AmplitudeUnit": "%", + "ChromatogramStartTimeUtcOffsetMinutes": "-300", + "AmplitudePrecision": "1", + "CurveDataType": "Conduction", + "IsReadOnly": "false", + "MethodStartTimeUtcOffsetMinutes": "-300", + "ColumnVolumeUnitName": "ml", + "IsoChroneType": "Time", + "DistanceToStartPoint": "0", + "CurveNumber": "5", + "ColumnVolume": "4", + "ScanInterval": "0", + "DistanceBetweenPoints": "0", + "ChromatogramStartTime": "2024-01-02T11:00:00.000", + "TimeUnit": "min", + "VolumeUnit": "ml", + "IsExternal": "false" } } } @@ -665,6 +761,27 @@ "measures": [ [3.1048166275024416, 3.104812431335449, 3.104808044433594] ] + }, + "custom information document": { + "IsOriginalData": "true", + "MethodStartTime": "2024-01-02T11:00:00.000", + "AmplitudeUnit": "mS/cm", + "ChromatogramStartTimeUtcOffsetMinutes": "-300", + "AmplitudePrecision": "2", + "CurveDataType": "Conduction", + "IsReadOnly": "false", + "MethodStartTimeUtcOffsetMinutes": "-300", + "ColumnVolumeUnitName": "ml", + "IsoChroneType": "Time", + "DistanceToStartPoint": "0", + "CurveNumber": "4", + "ColumnVolume": "4", + "ScanInterval": "0", + "DistanceBetweenPoints": "0.003333333", + "ChromatogramStartTime": "2024-01-02T11:00:00.000", + "TimeUnit": "min", + "VolumeUnit": "ml", + "IsExternal": "false" } } }, @@ -735,6 +852,26 @@ "measures": [ [6.056291580200195, 0.0, 6.056750297546387] ] + }, + "custom information document": { + "IsOriginalData": "true", + "MethodStartTime": "2024-01-02T11:00:00.000", + "ChromatogramStartTimeUtcOffsetMinutes": "-300", + "AmplitudePrecision": "2", + "CurveDataType": "pH", + "IsReadOnly": "false", + "MethodStartTimeUtcOffsetMinutes": "-300", + "ColumnVolumeUnitName": "ml", + "IsoChroneType": "Time", + "DistanceToStartPoint": "0.09333229", + "CurveNumber": "7", + "ColumnVolume": "4", + "ScanInterval": "0", + "DistanceBetweenPoints": "0.01666667", + "ChromatogramStartTime": "2024-01-02T11:00:00.000", + "TimeUnit": "min", + "VolumeUnit": "ml", + "IsExternal": "false" } } }, @@ -769,6 +906,27 @@ "measures": [ [0.0, 0.0, 0.0] ] + }, + "custom information document": { + "IsOriginalData": "true", + "MethodStartTime": "2024-01-02T11:00:00.000", + "AmplitudeUnit": "%", + "ChromatogramStartTimeUtcOffsetMinutes": "-300", + "AmplitudePrecision": "1", + "CurveDataType": "Other", + "IsReadOnly": "false", + "MethodStartTimeUtcOffsetMinutes": "-300", + "ColumnVolumeUnitName": "ml", + "IsoChroneType": "Time", + "DistanceToStartPoint": "0.07666588", + "CurveNumber": "6", + "ColumnVolume": "4", + "ScanInterval": "0", + "DistanceBetweenPoints": "0.0", + "ChromatogramStartTime": "2024-01-02T11:00:00.000", + "TimeUnit": "min", + "VolumeUnit": "ml", + "IsExternal": "false" } } } @@ -839,6 +997,27 @@ "measures": [ [0.03866715729236603, 0.19328080117702484, 0.20647241175174713] ] + }, + "custom information document": { + "IsOriginalData": "true", + "MethodStartTime": "2024-01-02T11:00:00.000", + "AmplitudeUnit": "MPa", + "ChromatogramStartTimeUtcOffsetMinutes": "-300", + "AmplitudePrecision": "3", + "CurveDataType": "Pressure", + "IsReadOnly": "false", + "MethodStartTimeUtcOffsetMinutes": "-300", + "ColumnVolumeUnitName": "ml", + "IsoChroneType": "Time", + "DistanceToStartPoint": "0.08666611", + "CurveNumber": "26", + "ColumnVolume": "4", + "ScanInterval": "0", + "DistanceBetweenPoints": "0.01666667", + "ChromatogramStartTime": "2024-01-02T11:00:00.000", + "TimeUnit": "min", + "VolumeUnit": "ml", + "IsExternal": "false" } }, "post column pressure data cube": { @@ -866,6 +1045,27 @@ "measures": [ [0.13015341758728027, 0.14228571951389313, 0.06806576997041702] ] + }, + "custom information document": { + "IsOriginalData": "true", + "MethodStartTime": "2024-01-02T11:00:00.000", + "AmplitudeUnit": "MPa", + "ChromatogramStartTimeUtcOffsetMinutes": "-300", + "AmplitudePrecision": "3", + "CurveDataType": "Pressure", + "IsReadOnly": "false", + "MethodStartTimeUtcOffsetMinutes": "-300", + "ColumnVolumeUnitName": "ml", + "IsoChroneType": "Time", + "DistanceToStartPoint": "0.08499908", + "CurveNumber": "28", + "ColumnVolume": "4", + "ScanInterval": "0", + "DistanceBetweenPoints": "0.01666667", + "ChromatogramStartTime": "2024-01-02T11:00:00.000", + "TimeUnit": "min", + "VolumeUnit": "ml", + "IsExternal": "false" } }, "sample pressure data cube": { @@ -893,6 +1093,27 @@ "measures": [ [0.05315263196825981, 0.05314874276518822, 0.05314485356211662] ] + }, + "custom information document": { + "IsOriginalData": "true", + "MethodStartTime": "2024-01-02T11:00:00.000", + "AmplitudeUnit": "MPa", + "ChromatogramStartTimeUtcOffsetMinutes": "-300", + "AmplitudePrecision": "3", + "CurveDataType": "Pressure", + "IsReadOnly": "false", + "MethodStartTimeUtcOffsetMinutes": "-300", + "ColumnVolumeUnitName": "ml", + "IsoChroneType": "Time", + "DistanceToStartPoint": "0.07166481", + "CurveNumber": "25", + "ColumnVolume": "4", + "ScanInterval": "0", + "DistanceBetweenPoints": "0.008333334", + "ChromatogramStartTime": "2024-01-02T11:00:00.000", + "TimeUnit": "min", + "VolumeUnit": "ml", + "IsExternal": "false" } }, "system pressure data cube": { @@ -920,6 +1141,27 @@ "measures": [ [0.1649095118045807, 0.13285210728645325, 0.10079468786716461] ] + }, + "custom information document": { + "IsOriginalData": "true", + "MethodStartTime": "2024-01-02T11:00:00.000", + "AmplitudeUnit": "MPa", + "ChromatogramStartTimeUtcOffsetMinutes": "-300", + "AmplitudePrecision": "3", + "CurveDataType": "Pressure", + "IsReadOnly": "false", + "MethodStartTimeUtcOffsetMinutes": "-300", + "ColumnVolumeUnitName": "ml", + "IsoChroneType": "Time", + "DistanceToStartPoint": "0.07166481", + "CurveNumber": "10", + "ColumnVolume": "4", + "ScanInterval": "0", + "DistanceBetweenPoints": "0.008333334", + "ChromatogramStartTime": "2024-01-02T11:00:00.000", + "TimeUnit": "min", + "VolumeUnit": "ml", + "IsExternal": "false" } } } @@ -1023,6 +1265,27 @@ "measures": [ [0.0, 7.460474014282227, 14.920948028564453] ] + }, + "custom information document": { + "IsOriginalData": "true", + "MethodStartTime": "2024-01-02T11:00:00.000", + "AmplitudeUnit": "CV/h", + "ChromatogramStartTimeUtcOffsetMinutes": "-300", + "AmplitudePrecision": "2", + "CurveDataType": "Other", + "IsReadOnly": "false", + "MethodStartTimeUtcOffsetMinutes": "-300", + "ColumnVolumeUnitName": "ml", + "IsoChroneType": "Time", + "DistanceToStartPoint": "0.07666588", + "CurveNumber": "90", + "ColumnVolume": "4", + "ScanInterval": "0", + "DistanceBetweenPoints": "0.01666667", + "ChromatogramStartTime": "2024-01-02T11:00:00.000", + "TimeUnit": "min", + "VolumeUnit": "ml", + "IsExternal": "false" } }, "sample flow rate data cube": { @@ -1050,6 +1313,27 @@ "measures": [ [0.0, 0.0, 0.0] ] + }, + "custom information document": { + "IsOriginalData": "true", + "MethodStartTime": "2024-01-02T11:00:00.000", + "AmplitudeUnit": "CV/h", + "ChromatogramStartTimeUtcOffsetMinutes": "-300", + "AmplitudePrecision": "2", + "CurveDataType": "Other", + "IsReadOnly": "false", + "MethodStartTimeUtcOffsetMinutes": "-300", + "ColumnVolumeUnitName": "ml", + "IsoChroneType": "Time", + "DistanceToStartPoint": "0.08833313", + "CurveNumber": "89", + "ColumnVolume": "4", + "ScanInterval": "0", + "DistanceBetweenPoints": "0.01666667", + "ChromatogramStartTime": "2024-01-02T11:00:00.000", + "TimeUnit": "min", + "VolumeUnit": "ml", + "IsExternal": "false" } } }, @@ -1081,6 +1365,27 @@ "measures": [ [5.000010013580322, 2.3790595531463623, 0.0] ] + }, + "custom information document": { + "IsOriginalData": "true", + "MethodStartTime": "2024-01-02T11:00:00.000", + "AmplitudeUnit": "ml/min", + "ChromatogramStartTimeUtcOffsetMinutes": "-300", + "AmplitudePrecision": "2", + "CurveDataType": "Other", + "IsReadOnly": "false", + "MethodStartTimeUtcOffsetMinutes": "-300", + "ColumnVolumeUnitName": "ml", + "IsoChroneType": "Time", + "DistanceToStartPoint": "0.07666588", + "CurveNumber": "8", + "ColumnVolume": "4", + "ScanInterval": "0", + "DistanceBetweenPoints": "0.01666667", + "ChromatogramStartTime": "2024-01-02T11:00:00.000", + "TimeUnit": "min", + "VolumeUnit": "ml", + "IsExternal": "false" } }, "sample flow rate data cube": { @@ -1108,6 +1413,27 @@ "measures": [ [0.0, 0.0, 0.0] ] + }, + "custom information document": { + "IsOriginalData": "true", + "MethodStartTime": "2024-01-02T11:00:00.000", + "AmplitudeUnit": "ml/min", + "ChromatogramStartTimeUtcOffsetMinutes": "-300", + "AmplitudePrecision": "2", + "CurveDataType": "Other", + "IsReadOnly": "false", + "MethodStartTimeUtcOffsetMinutes": "-300", + "ColumnVolumeUnitName": "ml", + "IsoChroneType": "Time", + "DistanceToStartPoint": "0.08833313", + "CurveNumber": "14", + "ColumnVolume": "4", + "ScanInterval": "0", + "DistanceBetweenPoints": "0.01666667", + "ChromatogramStartTime": "2024-01-02T11:00:00.000", + "TimeUnit": "min", + "VolumeUnit": "ml", + "IsExternal": "false" } } }, @@ -1139,6 +1465,27 @@ "measures": [ [0.0, 0.0, 0.0] ] + }, + "custom information document": { + "IsOriginalData": "true", + "MethodStartTime": "2024-01-02T11:00:00.000", + "AmplitudeUnit": "cm/h", + "ChromatogramStartTimeUtcOffsetMinutes": "-300", + "AmplitudePrecision": "0", + "CurveDataType": "Other", + "IsReadOnly": "false", + "MethodStartTimeUtcOffsetMinutes": "-300", + "ColumnVolumeUnitName": "ml", + "IsoChroneType": "Time", + "DistanceToStartPoint": "0.08999825", + "CurveNumber": "15", + "ColumnVolume": "4", + "ScanInterval": "0", + "DistanceBetweenPoints": "0.01666667", + "ChromatogramStartTime": "2024-01-02T11:00:00.000", + "TimeUnit": "min", + "VolumeUnit": "ml", + "IsExternal": "false" } } } @@ -1209,6 +1556,27 @@ "measures": [ [27.713348388671875, 27.648590087890625, 27.536712646484375] ] + }, + "custom information document": { + "IsOriginalData": "true", + "MethodStartTime": "2024-01-02T11:00:00.000", + "AmplitudeUnit": "°C", + "ChromatogramStartTimeUtcOffsetMinutes": "-300", + "AmplitudePrecision": "1", + "CurveDataType": "Temperature", + "IsReadOnly": "false", + "MethodStartTimeUtcOffsetMinutes": "-300", + "ColumnVolumeUnitName": "ml", + "IsoChroneType": "Time", + "DistanceToStartPoint": "0.1033325", + "CurveNumber": "13", + "ColumnVolume": "4", + "ScanInterval": "0", + "DistanceBetweenPoints": "0.03333334", + "ChromatogramStartTime": "2024-01-02T11:00:00.000", + "TimeUnit": "min", + "VolumeUnit": "ml", + "IsExternal": "false" } } } @@ -1262,7 +1630,11 @@ "unit": "mL" }, "fraction role": "Out-Waste", - "@type": "Fraction" + "@type": "Fraction", + "custom information document": { + "EventSubType": "Undefined", + "InstructionFeedback": "0" + } }, { "index": "Fraction Event 2", @@ -1274,7 +1646,11 @@ "value": 73.47809, "unit": "mL" }, - "@type": "Method" + "@type": "Method", + "custom information document": { + "EventSubType": "Undefined", + "InstructionFeedback": "0" + } }, { "index": "Fraction Event 3", @@ -1286,7 +1662,11 @@ "value": 385.0173, "unit": "mL" }, - "@type": "Method" + "@type": "Method", + "custom information document": { + "EventSubType": "Undefined", + "InstructionFeedback": "0" + } }, { "index": "Fraction Event 4", @@ -1298,7 +1678,11 @@ "value": 385.154, "unit": "mL" }, - "@type": "Method" + "@type": "Method", + "custom information document": { + "EventSubType": "Undefined", + "InstructionFeedback": "0" + } }, { "index": "Fraction Event 5", @@ -1310,7 +1694,11 @@ "value": 455.8084, "unit": "mL" }, - "@type": "Method" + "@type": "Method", + "custom information document": { + "EventSubType": "Undefined", + "InstructionFeedback": "0" + } }, { "index": "Fraction Event 6", @@ -1322,7 +1710,11 @@ "value": 586.219, "unit": "mL" }, - "@type": "Method" + "@type": "Method", + "custom information document": { + "EventSubType": "Undefined", + "InstructionFeedback": "0" + } }, { "index": "Fraction Event 7", @@ -1335,7 +1727,11 @@ "unit": "mL" }, "fraction role": "Frac", - "@type": "Fraction" + "@type": "Fraction", + "custom information document": { + "EventSubType": "Undefined", + "InstructionFeedback": "0" + } }, { "index": "Fraction Event 8", @@ -1348,7 +1744,11 @@ "unit": "mL" }, "fraction role": "Out-Waste", - "@type": "Fraction" + "@type": "Fraction", + "custom information document": { + "EventSubType": "Undefined", + "InstructionFeedback": "0" + } } ] }, @@ -1364,7 +1764,10 @@ "value": 0.3665924, "unit": "mL" }, - "log entry": "Batch ID: " + "log entry": "Batch ID: ", + "custom information document": { + "InstructionFeedback": "0" + } }, { "index": "Run Log Event 83", @@ -1376,7 +1779,10 @@ "value": 4.948364, "unit": "mL" }, - "log entry": ")" + "log entry": ")", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 91", @@ -1388,7 +1794,10 @@ "value": 5.014816, "unit": "mL" }, - "log entry": "Alarm air sensors Enabled Enabled Disabled (Completed) (Manual)" + "log entry": "Alarm air sensors Enabled Enabled Disabled (Completed) (Manual)", + "custom information document": { + "InstructionFeedback": "262144" + } }, { "index": "Run Log Event 92", @@ -1400,7 +1809,10 @@ "value": 5.014816, "unit": "mL" }, - "log entry": "Continue 2(Issued) (Manual)" + "log entry": "Continue 2(Issued) (Manual)", + "custom information document": { + "InstructionFeedback": "65536" + } }, { "index": "Run Log Event 93", @@ -1412,7 +1824,10 @@ "value": 5.014816, "unit": "mL" }, - "log entry": "Continue (Processing) (Manual)" + "log entry": "Continue (Processing) (Manual)", + "custom information document": { + "InstructionFeedback": "131072" + } }, { "index": "Run Log Event 94", @@ -1424,7 +1839,10 @@ "value": 5.014816, "unit": "mL" }, - "log entry": "Continue 0 (Completed) (Manual)" + "log entry": "Continue 0 (Completed) (Manual)", + "custom information document": { + "InstructionFeedback": "262144" + } }, { "index": "Run Log Event 95", @@ -1436,7 +1854,10 @@ "value": 73.47809, "unit": "mL" }, - "log entry": "Peak start (System)" + "log entry": "Peak start (System)", + "custom information document": { + "InstructionFeedback": "0" + } }, { "index": "Run Log Event 96", @@ -1448,7 +1869,10 @@ "value": 364.9618, "unit": "mL" }, - "log entry": "End_Block (Issued) (Processing) (Completed)" + "log entry": "End_Block (Issued) (Processing) (Completed)", + "custom information document": { + "InstructionFeedback": "458753" + } }, { "index": "Run Log Event 97", @@ -1460,7 +1884,10 @@ "value": 364.9618, "unit": "mL" }, - "log entry": "Block Finalize sample injection (Issued) (Processing) (Completed)" + "log entry": "Block Finalize sample injection (Issued) (Processing) (Completed)", + "custom information document": { + "InstructionFeedback": "458753" + } }, { "index": "Run Log Event 98", @@ -1472,7 +1899,10 @@ "value": 364.9618, "unit": "mL" }, - "log entry": "Base Volume, ColumnSameAsMain" + "log entry": "Base Volume, ColumnSameAsMain", + "custom information document": { + "InstructionFeedback": "0" + } }, { "index": "Run Log Event 99", @@ -1484,7 +1914,10 @@ "value": 364.9618, "unit": "mL" }, - "log entry": "Sample inlet Buffer (Issued) (Processing)" + "log entry": "Sample inlet Buffer (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 100", @@ -1496,7 +1929,10 @@ "value": 364.9884, "unit": "mL" }, - "log entry": "Sample inlet Buffer (Completed)" + "log entry": "Sample inlet Buffer (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 101", @@ -1508,7 +1944,10 @@ "value": 384.9723, "unit": "mL" }, - "log entry": "End_Block (Issued) (Processing) (Completed)" + "log entry": "End_Block (Issued) (Processing) (Completed)", + "custom information document": { + "InstructionFeedback": "458753" + } }, { "index": "Run Log Event 102", @@ -1520,7 +1959,10 @@ "value": 384.9723, "unit": "mL" }, - "log entry": "Sample flow 0.00 {ml/min} Off (Issued) (Processing)" + "log entry": "Sample flow 0.00 {ml/min} Off (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 103", @@ -1532,7 +1974,10 @@ "value": 385.0173, "unit": "mL" }, - "log entry": "Sample flow 0.00 {ml/min} Off (Completed)" + "log entry": "Sample flow 0.00 {ml/min} Off (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 104", @@ -1544,7 +1989,10 @@ "value": 385.0173, "unit": "mL" }, - "log entry": "Injection valve Manual load (Issued) (Processing)" + "log entry": "Injection valve Manual load (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 105", @@ -1556,7 +2004,10 @@ "value": 385.0173, "unit": "mL" }, - "log entry": "The method flow is now calculated based on the system flow. (System)" + "log entry": "The method flow is now calculated based on the system flow. (System)", + "custom information document": { + "InstructionFeedback": "0" + } }, { "index": "Run Log Event 106", @@ -1568,7 +2019,10 @@ "value": 385.0173, "unit": "mL" }, - "log entry": "Injection valve Manual load (Completed)" + "log entry": "Injection valve Manual load (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 107", @@ -1580,7 +2034,10 @@ "value": 385.0173, "unit": "mL" }, - "log entry": "Block Stop frac (Sample Appl) (Issued) (Processing) (Completed)" + "log entry": "Block Stop frac (Sample Appl) (Issued) (Processing) (Completed)", + "custom information document": { + "InstructionFeedback": "458753" + } }, { "index": "Run Log Event 108", @@ -1592,7 +2049,10 @@ "value": 385.0173, "unit": "mL" }, - "log entry": "Base SameAsMain" + "log entry": "Base SameAsMain", + "custom information document": { + "InstructionFeedback": "0" + } }, { "index": "Run Log Event 109", @@ -1604,7 +2064,10 @@ "value": 385.0173, "unit": "mL" }, - "log entry": "Stop peak frac in outlet valve (Issued) (Processing)" + "log entry": "Stop peak frac in outlet valve (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 110", @@ -1616,7 +2079,10 @@ "value": 385.0173, "unit": "mL" }, - "log entry": "Stop peak frac in outlet valve (Completed)" + "log entry": "Stop peak frac in outlet valve (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 111", @@ -1628,7 +2094,10 @@ "value": 385.0173, "unit": "mL" }, - "log entry": "End_Block (Issued) (Processing) (Completed)" + "log entry": "End_Block (Issued) (Processing) (Completed)", + "custom information document": { + "InstructionFeedback": "458753" + } }, { "index": "Run Log Event 112", @@ -1640,7 +2109,10 @@ "value": 385.0173, "unit": "mL" }, - "log entry": "End Phase (Issued) (Processing) (Completed)" + "log entry": "End Phase (Issued) (Processing) (Completed)", + "custom information document": { + "InstructionFeedback": "458753" + } }, { "index": "Run Log Event 113", @@ -1653,7 +2125,10 @@ "unit": "mL" }, "method identifier": "Column Wash", - "log entry": "Phase Column Wash (Issued) (Processing) (Completed)" + "log entry": "Phase Column Wash (Issued) (Processing) (Completed)", + "custom information document": { + "InstructionFeedback": "458753" + } }, { "index": "Run Log Event 114", @@ -1666,7 +2141,10 @@ "unit": "mL" }, "method identifier": "Column Wash", - "log entry": "Base SameAsMain" + "log entry": "Base SameAsMain", + "custom information document": { + "InstructionFeedback": "0" + } }, { "index": "Run Log Event 115", @@ -1679,7 +2157,10 @@ "unit": "mL" }, "method identifier": "Column Wash", - "log entry": "Inlet A A2 (Issued) (Processing)" + "log entry": "Inlet A A2 (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 116", @@ -1692,7 +2173,10 @@ "unit": "mL" }, "method identifier": "Column Wash", - "log entry": "Inlet A A2 (Completed)" + "log entry": "Inlet A A2 (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 117", @@ -1705,7 +2189,10 @@ "unit": "mL" }, "method identifier": "Column Wash", - "log entry": "Inlet B B1 (Issued) (Processing)" + "log entry": "Inlet B B1 (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 118", @@ -1718,7 +2205,10 @@ "unit": "mL" }, "method identifier": "Column Wash", - "log entry": "Inlet B B1 (Completed)" + "log entry": "Inlet B B1 (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 119", @@ -1731,7 +2221,10 @@ "unit": "mL" }, "method identifier": "Column Wash", - "log entry": "Gradient 0.0 {%B} 0.00 {CV} (Issued) (Processing)" + "log entry": "Gradient 0.0 {%B} 0.00 {CV} (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 120", @@ -1744,7 +2237,10 @@ "unit": "mL" }, "method identifier": "Column Wash", - "log entry": "Gradient 0.0 {%B} 0.00 {CV} (Completed)" + "log entry": "Gradient 0.0 {%B} 0.00 {CV} (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 121", @@ -1757,7 +2253,10 @@ "unit": "mL" }, "method identifier": "Column Wash", - "log entry": "System flow 10.00 {ml/min} Off (Issued) (Processing)" + "log entry": "System flow 10.00 {ml/min} Off (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 122", @@ -1770,7 +2269,10 @@ "unit": "mL" }, "method identifier": "Column Wash", - "log entry": "System flow 10.00 {ml/min} Off (Completed)" + "log entry": "System flow 10.00 {ml/min} Off (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 123", @@ -1783,7 +2285,10 @@ "unit": "mL" }, "method identifier": "Column Wash", - "log entry": "Block Start frac (Column Wash) (Issued) (Processing) (Completed)" + "log entry": "Block Start frac (Column Wash) (Issued) (Processing) (Completed)", + "custom information document": { + "InstructionFeedback": "458753" + } }, { "index": "Run Log Event 124", @@ -1796,7 +2301,10 @@ "unit": "mL" }, "method identifier": "Column Wash", - "log entry": "Base SameAsMain" + "log entry": "Base SameAsMain", + "custom information document": { + "InstructionFeedback": "0" + } }, { "index": "Run Log Event 125", @@ -1809,7 +2317,10 @@ "unit": "mL" }, "method identifier": "Column Wash", - "log entry": "Peak fractionation parameters Level 0.125 {min} 50.000 {mAU} 100.000 {mAU/min} 75.000 {mAU} 75.000 {mAU/min} (Issued) (Processing)" + "log entry": "Peak fractionation parameters Level 0.125 {min} 50.000 {mAU} 100.000 {mAU/min} 75.000 {mAU} 75.000 {mAU/min} (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 126", @@ -1822,7 +2333,10 @@ "unit": "mL" }, "method identifier": "Column Wash", - "log entry": "Peak fractionation is performed using the UV1 signal. (System)" + "log entry": "Peak fractionation is performed using the UV1 signal. (System)", + "custom information document": { + "InstructionFeedback": "0" + } }, { "index": "Run Log Event 127", @@ -1835,7 +2349,10 @@ "unit": "mL" }, "method identifier": "Column Wash", - "log entry": "Peak fractionation parameters Level 0.125 {min} 50.000 {mAU} 100.000 {mAU/min} 75.000 {mAU} 75.000 {mAU/min} (Completed)" + "log entry": "Peak fractionation parameters Level 0.125 {min} 50.000 {mAU} 100.000 {mAU/min} 75.000 {mAU} 75.000 {mAU/min} (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 128", @@ -1848,7 +2365,10 @@ "unit": "mL" }, "method identifier": "Column Wash", - "log entry": "Peak frac in outlet valve Out 1 9 700.00 {ml} (Issued) (Processing)" + "log entry": "Peak frac in outlet valve Out 1 9 700.00 {ml} (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 129", @@ -1861,7 +2381,10 @@ "unit": "mL" }, "method identifier": "Column Wash", - "log entry": "Peak frac in outlet valve Out 1 9 700.00 {ml} (Completed)" + "log entry": "Peak frac in outlet valve Out 1 9 700.00 {ml} (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 130", @@ -1874,7 +2397,10 @@ "unit": "mL" }, "method identifier": "Column Wash", - "log entry": "End_Block (Issued) (Processing) (Completed)" + "log entry": "End_Block (Issued) (Processing) (Completed)", + "custom information document": { + "InstructionFeedback": "458753" + } }, { "index": "Run Log Event 131", @@ -1887,7 +2413,10 @@ "unit": "mL" }, "method identifier": "Column Wash", - "log entry": "Block Wash (Issued) (Processing) (Completed)" + "log entry": "Block Wash (Issued) (Processing) (Completed)", + "custom information document": { + "InstructionFeedback": "458753" + } }, { "index": "Run Log Event 132", @@ -1900,7 +2429,10 @@ "unit": "mL" }, "method identifier": "Column Wash", - "log entry": "Base SameAsMain" + "log entry": "Base SameAsMain", + "custom information document": { + "InstructionFeedback": "0" + } }, { "index": "Run Log Event 133", @@ -1913,7 +2445,10 @@ "unit": "mL" }, "method identifier": "Column Wash", - "log entry": "Peak start (System)" + "log entry": "Peak start (System)", + "custom information document": { + "InstructionFeedback": "0" + } }, { "index": "Run Log Event 134", @@ -1926,7 +2461,10 @@ "unit": "mL" }, "method identifier": "Column Wash", - "log entry": "Peak end (System)" + "log entry": "Peak end (System)", + "custom information document": { + "InstructionFeedback": "0" + } }, { "index": "Run Log Event 135", @@ -1939,7 +2477,10 @@ "unit": "mL" }, "method identifier": "Column Wash", - "log entry": "End_Block (Issued) (Processing) (Completed)" + "log entry": "End_Block (Issued) (Processing) (Completed)", + "custom information document": { + "InstructionFeedback": "458753" + } }, { "index": "Run Log Event 136", @@ -1952,7 +2493,10 @@ "unit": "mL" }, "method identifier": "Column Wash", - "log entry": "Block Stop frac (Column Wash) (Issued) (Processing) (Completed)" + "log entry": "Block Stop frac (Column Wash) (Issued) (Processing) (Completed)", + "custom information document": { + "InstructionFeedback": "458753" + } }, { "index": "Run Log Event 137", @@ -1965,7 +2509,10 @@ "unit": "mL" }, "method identifier": "Column Wash", - "log entry": "Base SameAsMain" + "log entry": "Base SameAsMain", + "custom information document": { + "InstructionFeedback": "0" + } }, { "index": "Run Log Event 138", @@ -1978,7 +2525,10 @@ "unit": "mL" }, "method identifier": "Column Wash", - "log entry": "Stop peak frac in outlet valve (Issued) (Processing)" + "log entry": "Stop peak frac in outlet valve (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 139", @@ -1991,7 +2541,10 @@ "unit": "mL" }, "method identifier": "Column Wash", - "log entry": "Stop peak frac in outlet valve (Completed)" + "log entry": "Stop peak frac in outlet valve (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 140", @@ -2004,7 +2557,10 @@ "unit": "mL" }, "method identifier": "Column Wash", - "log entry": "End_Block (Issued) (Processing) (Completed)" + "log entry": "End_Block (Issued) (Processing) (Completed)", + "custom information document": { + "InstructionFeedback": "458753" + } }, { "index": "Run Log Event 141", @@ -2017,7 +2573,10 @@ "unit": "mL" }, "method identifier": "Column Wash", - "log entry": "End Phase (Issued) (Processing) (Completed)" + "log entry": "End Phase (Issued) (Processing) (Completed)", + "custom information document": { + "InstructionFeedback": "458753" + } }, { "index": "Run Log Event 142", @@ -2030,7 +2589,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Phase CIP & Storage (Issued) (Processing) (Completed)" + "log entry": "Phase CIP & Storage (Issued) (Processing) (Completed)", + "custom information document": { + "InstructionFeedback": "458753" + } }, { "index": "Run Log Event 143", @@ -2043,7 +2605,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Base SameAsMain" + "log entry": "Base SameAsMain", + "custom information document": { + "InstructionFeedback": "0" + } }, { "index": "Run Log Event 144", @@ -2056,7 +2621,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "pH valve Off-line Off-line (Issued) (Processing)" + "log entry": "pH valve Off-line Off-line (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 145", @@ -2069,7 +2637,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "The instruction 'pH valve' will be executed after the delay volume has been collected. (System)" + "log entry": "The instruction 'pH valve' will be executed after the delay volume has been collected. (System)", + "custom information document": { + "InstructionFeedback": "0" + } }, { "index": "Run Log Event 146", @@ -2082,7 +2653,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "pH valve Off-line Off-line (Completed)" + "log entry": "pH valve Off-line Off-line (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 147", @@ -2095,7 +2669,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Block Column maintenance step_(1) (Issued) (Processing) (Completed)" + "log entry": "Block Column maintenance step_(1) (Issued) (Processing) (Completed)", + "custom information document": { + "InstructionFeedback": "458753" + } }, { "index": "Run Log Event 148", @@ -2108,7 +2685,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Base SameAsMain" + "log entry": "Base SameAsMain", + "custom information document": { + "InstructionFeedback": "0" + } }, { "index": "Run Log Event 149", @@ -2121,7 +2701,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Message \"Maintenance solution: \" (Issued) (Processing) (Completed)" + "log entry": "Message \"Maintenance solution: \" (Issued) (Processing) (Completed)", + "custom information document": { + "InstructionFeedback": "458753" + } }, { "index": "Run Log Event 150", @@ -2134,7 +2717,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Inlet A A4 (Issued) (Processing)" + "log entry": "Inlet A A4 (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 151", @@ -2147,7 +2733,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Inlet A A4 (Completed)" + "log entry": "Inlet A A4 (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 152", @@ -2160,7 +2749,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Inlet B B1 (Issued) (Processing)" + "log entry": "Inlet B B1 (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 153", @@ -2173,7 +2765,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Inlet B B1 (Completed)" + "log entry": "Inlet B B1 (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 154", @@ -2186,7 +2781,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Column position Position 3 Down flow (Issued) (Processing)" + "log entry": "Column position Position 3 Down flow (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 155", @@ -2199,7 +2797,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Column position Position 3 Down flow (Completed)" + "log entry": "Column position Position 3 Down flow (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 156", @@ -2212,7 +2813,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Outlet valve Out-Waste (Issued) (Processing)" + "log entry": "Outlet valve Out-Waste (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 157", @@ -2225,7 +2829,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Outlet valve Out-Waste (Completed)" + "log entry": "Outlet valve Out-Waste (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 158", @@ -2238,7 +2845,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "System flow 15.00 {ml/min} Off (Issued) (Processing)" + "log entry": "System flow 15.00 {ml/min} Off (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 159", @@ -2251,7 +2861,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "System flow 15.00 {ml/min} Off (Completed)" + "log entry": "System flow 15.00 {ml/min} Off (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 160", @@ -2264,7 +2877,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Gradient 0.0 {%B} 0.00 {CV} (Issued) (Processing)" + "log entry": "Gradient 0.0 {%B} 0.00 {CV} (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 161", @@ -2277,7 +2893,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Gradient 0.0 {%B} 0.00 {CV} (Completed)" + "log entry": "Gradient 0.0 {%B} 0.00 {CV} (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 162", @@ -2290,7 +2909,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "End_Block (Issued) (Processing) (Completed)" + "log entry": "End_Block (Issued) (Processing) (Completed)", + "custom information document": { + "InstructionFeedback": "458753" + } }, { "index": "Run Log Event 163", @@ -2303,7 +2925,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Block Column maintenance step_(2) (Issued) (Processing) (Completed)" + "log entry": "Block Column maintenance step_(2) (Issued) (Processing) (Completed)", + "custom information document": { + "InstructionFeedback": "458753" + } }, { "index": "Run Log Event 164", @@ -2316,7 +2941,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Base SameAsMain" + "log entry": "Base SameAsMain", + "custom information document": { + "InstructionFeedback": "0" + } }, { "index": "Run Log Event 165", @@ -2329,7 +2957,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Message \"Maintenance solution: RODI\" (Issued) (Processing) (Completed)" + "log entry": "Message \"Maintenance solution: RODI\" (Issued) (Processing) (Completed)", + "custom information document": { + "InstructionFeedback": "458753" + } }, { "index": "Run Log Event 166", @@ -2342,7 +2973,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Inlet A A6 (Issued) (Processing)" + "log entry": "Inlet A A6 (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 167", @@ -2355,7 +2989,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Inlet A A6 (Completed)" + "log entry": "Inlet A A6 (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 168", @@ -2368,7 +3005,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Inlet B B1 (Issued) (Processing)" + "log entry": "Inlet B B1 (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 169", @@ -2381,7 +3021,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Inlet B B1 (Completed)" + "log entry": "Inlet B B1 (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 170", @@ -2394,7 +3037,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Column position Position 3 Down flow (Issued) (Processing)" + "log entry": "Column position Position 3 Down flow (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 171", @@ -2407,7 +3053,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Column position Position 3 Down flow (Completed)" + "log entry": "Column position Position 3 Down flow (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 172", @@ -2420,7 +3069,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Outlet valve Out-Waste (Issued) (Processing)" + "log entry": "Outlet valve Out-Waste (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 173", @@ -2433,7 +3085,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Outlet valve Out-Waste (Completed)" + "log entry": "Outlet valve Out-Waste (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 174", @@ -2446,7 +3101,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "System flow 15.00 {ml/min} Off (Issued) (Processing)" + "log entry": "System flow 15.00 {ml/min} Off (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 175", @@ -2459,7 +3117,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "System flow 15.00 {ml/min} Off (Completed)" + "log entry": "System flow 15.00 {ml/min} Off (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 176", @@ -2472,7 +3133,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Gradient 0.0 {%B} 0.00 {CV} (Issued) (Processing)" + "log entry": "Gradient 0.0 {%B} 0.00 {CV} (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 177", @@ -2485,7 +3149,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Gradient 0.0 {%B} 0.00 {CV} (Completed)" + "log entry": "Gradient 0.0 {%B} 0.00 {CV} (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 178", @@ -2498,7 +3165,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "End_Block (Issued) (Processing) (Completed)" + "log entry": "End_Block (Issued) (Processing) (Completed)", + "custom information document": { + "InstructionFeedback": "458753" + } }, { "index": "Run Log Event 179", @@ -2511,7 +3181,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Block Column maintenance step_(3) (Issued) (Processing) (Completed)" + "log entry": "Block Column maintenance step_(3) (Issued) (Processing) (Completed)", + "custom information document": { + "InstructionFeedback": "458753" + } }, { "index": "Run Log Event 180", @@ -2524,7 +3197,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Base SameAsMain" + "log entry": "Base SameAsMain", + "custom information document": { + "InstructionFeedback": "0" + } }, { "index": "Run Log Event 181", @@ -2537,7 +3213,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Message \"Maintenance solution: 20% EtOH\" (Issued) (Processing) (Completed)" + "log entry": "Message \"Maintenance solution: 20% EtOH\" (Issued) (Processing) (Completed)", + "custom information document": { + "InstructionFeedback": "458753" + } }, { "index": "Run Log Event 182", @@ -2550,7 +3229,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Inlet A A5 (Issued) (Processing)" + "log entry": "Inlet A A5 (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 183", @@ -2563,7 +3245,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Inlet A A5 (Completed)" + "log entry": "Inlet A A5 (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 184", @@ -2576,7 +3261,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Inlet B B1 (Issued) (Processing)" + "log entry": "Inlet B B1 (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 185", @@ -2589,7 +3277,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Inlet B B1 (Completed)" + "log entry": "Inlet B B1 (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 186", @@ -2602,7 +3293,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Column position Position 3 Down flow (Issued) (Processing)" + "log entry": "Column position Position 3 Down flow (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 187", @@ -2615,7 +3309,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Column position Position 3 Down flow (Completed)" + "log entry": "Column position Position 3 Down flow (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 188", @@ -2628,7 +3325,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Outlet valve Fraction collector (Issued) (Processing)" + "log entry": "Outlet valve Fraction collector (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 189", @@ -2641,7 +3341,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Outlet valve Fraction collector (Completed)" + "log entry": "Outlet valve Fraction collector (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 190", @@ -2654,7 +3357,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "System flow 8.00 {ml/min} Off (Issued) (Processing)" + "log entry": "System flow 8.00 {ml/min} Off (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 191", @@ -2667,7 +3373,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "System flow 8.00 {ml/min} Off (Completed)" + "log entry": "System flow 8.00 {ml/min} Off (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 192", @@ -2680,7 +3389,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Gradient 0.0 {%B} 0.00 {CV} (Issued) (Processing)" + "log entry": "Gradient 0.0 {%B} 0.00 {CV} (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 193", @@ -2693,7 +3405,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Gradient 0.0 {%B} 0.00 {CV} (Completed)" + "log entry": "Gradient 0.0 {%B} 0.00 {CV} (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 194", @@ -2706,7 +3421,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "End_Block (Issued) (Processing) (Completed)" + "log entry": "End_Block (Issued) (Processing) (Completed)", + "custom information document": { + "InstructionFeedback": "458753" + } }, { "index": "Run Log Event 195", @@ -2719,7 +3437,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Column position Position 3 Down flow (Issued) (Processing)" + "log entry": "Column position Position 3 Down flow (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 196", @@ -2732,7 +3453,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Column position Position 3 Down flow (Completed)" + "log entry": "Column position Position 3 Down flow (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 197", @@ -2745,7 +3469,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Outlet valve Out-Waste (Issued) (Processing)" + "log entry": "Outlet valve Out-Waste (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 198", @@ -2758,7 +3485,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "Outlet valve Out-Waste (Completed)" + "log entry": "Outlet valve Out-Waste (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 199", @@ -2771,7 +3501,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "pH valve In-line Off-line (Issued) (Processing)" + "log entry": "pH valve In-line Off-line (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 200", @@ -2780,7 +3513,10 @@ "unit": "s" }, "method identifier": "CIP & Storage", - "log entry": "pH valve In-line Off-line (Completed)" + "log entry": "pH valve In-line Off-line (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } }, { "index": "Run Log Event 201", @@ -2793,7 +3529,10 @@ "unit": "mL" }, "method identifier": "CIP & Storage", - "log entry": "End Phase (Issued) (Processing) (Completed)" + "log entry": "End Phase (Issued) (Processing) (Completed)", + "custom information document": { + "InstructionFeedback": "458753" + } }, { "index": "Run Log Event 202", @@ -2805,7 +3544,10 @@ "value": 908.8585, "unit": "mL" }, - "log entry": "End (Issued) (Processing)" + "log entry": "End (Issued) (Processing)", + "custom information document": { + "InstructionFeedback": "196609" + } }, { "index": "Run Log Event 203", @@ -2817,9 +3559,23 @@ "value": 908.8585, "unit": "mL" }, - "log entry": "End (Completed)" + "log entry": "End (Completed)", + "custom information document": { + "InstructionFeedback": "262145" + } } ] + }, + "custom information document": { + "ChromatogramName": "Chrom.1", + "CreatedUtcOffsetMinutes": "-300", + "Created": "2024-01-01T10:00:00.000", + "UNICORNVersion": "7.7.0.4016", + "IsReadonly": "false", + "ChromatogramID": "100", + "FormatVersion": "9", + "TimeUnit": "min", + "VolumeUnit": "ml" } }, "analyst": "Default" @@ -2827,7 +3583,7 @@ ], "data system document": { "ASM converter name": "allotropy_cytiva_unicorn", - "ASM converter version": "0.1.85", + "ASM converter version": "0.1.102", "file name": "unicorn_1.zip", "UNC path": "tests/parsers/cytiva_unicorn/testdata/unicorn_1.zip" }, From ebb709fe49541ef7194f11b5e72f10c9fb1075a3 Mon Sep 17 00:00:00 2001 From: Felipe Narvaez Date: Tue, 5 Aug 2025 13:13:34 -0500 Subject: [PATCH 2/4] Updated data according to comments on PR --- .../_2023/_09/liquid_chromatography.py | 141 ++--- .../allotrope/schema_mappers/data_cube.py | 1 - .../structure/data_cube/creator.py | 1 - .../structure/measurement_group.py | 12 +- .../structure/measurements/absorbance.py | 7 +- .../structure/measurements/concentration.py | 4 + .../structure/measurements/conductivity.py | 2 + .../structure/measurements/flow.py | 1 + .../structure/measurements/generic.py | 67 ++- .../structure/measurements/ph.py | 2 + .../structure/measurements/pressure.py | 4 + .../structure/measurements/temperature.py | 4 + .../cytiva_unicorn/structure/metadata.py | 12 +- .../cytiva_unicorn/testdata/unicorn_1.json | 532 +++++------------- 14 files changed, 291 insertions(+), 499 deletions(-) diff --git a/src/allotropy/allotrope/schema_mappers/adm/liquid_chromatography/benchling/_2023/_09/liquid_chromatography.py b/src/allotropy/allotrope/schema_mappers/adm/liquid_chromatography/benchling/_2023/_09/liquid_chromatography.py index f9e1e08fb0..8550e50836 100644 --- a/src/allotropy/allotrope/schema_mappers/adm/liquid_chromatography/benchling/_2023/_09/liquid_chromatography.py +++ b/src/allotropy/allotrope/schema_mappers/adm/liquid_chromatography/benchling/_2023/_09/liquid_chromatography.py @@ -238,6 +238,7 @@ class Measurement: injection_custom_info: dict[str, Any] | None = None column_custom_info: dict[str, Any] | None = None measurement_custom_info: dict[str, Any] | None = None + processed_data_custom_info: dict[str, Any] | None = None @dataclass(frozen=True) @@ -363,12 +364,9 @@ def _get_measurement_document_item( for device_control_doc in measurement.device_control_docs ] ), - chromatogram_data_cube=add_custom_information_document( - get_data_cube( - measurement.chromatogram_data_cube, - ChromatogramDataCube, - ), - getattr(measurement.chromatogram_data_cube, "custom_info", None), + chromatogram_data_cube=get_data_cube( + measurement.chromatogram_data_cube, + ChromatogramDataCube, ), ), measurement.measurement_custom_info, @@ -550,24 +548,27 @@ def build_data_document_item( if pdd and get_data_processing_documents(pdd) else None ) - item = ProcessedDataDocumentItem( - chromatogram_data_cube=add_custom_information_document( - get_data_cube( - measurement.processed_data_chromatogram_data_cube, TDatacube + item = add_custom_information_document( + ProcessedDataDocumentItem( + chromatogram_data_cube=add_custom_information_document( + get_data_cube( + measurement.processed_data_chromatogram_data_cube, TDatacube + ), + getattr( + measurement.processed_data_chromatogram_data_cube, + "custom_info", + None, + ), ), - getattr( - measurement.processed_data_chromatogram_data_cube, - "custom_info", - None, + derived_column_pressure_data_cube=get_data_cube( + measurement.derived_column_pressure_data_cube, + DerivedColumnPressureDataCube, ), + processed_data_identifier=measurement.processed_data_identifier, + peak_list=build_peak_list(), + data_processing_aggregate_document=data_processing, ), - derived_column_pressure_data_cube=get_data_cube( - measurement.derived_column_pressure_data_cube, - DerivedColumnPressureDataCube, - ), - processed_data_identifier=measurement.processed_data_identifier, - peak_list=build_peak_list(), - data_processing_aggregate_document=data_processing, + measurement.processed_data_custom_info, ) return ( add_custom_information_document(item, pdd.custom_info) if pdd else item @@ -615,87 +616,37 @@ def _get_device_control_document( TQuantityValueNanometer, device_control_doc.detector_bandwidth_setting, ), - solvent_concentration_data_cube=add_custom_information_document( - get_data_cube( - device_control_doc.solvent_conc_data_cube, - SolventConcentrationDataCube, - ), - getattr( - device_control_doc.solvent_conc_data_cube, "custom_info", None - ), + solvent_concentration_data_cube=get_data_cube( + device_control_doc.solvent_conc_data_cube, + SolventConcentrationDataCube, ), - pre_column_pressure_data_cube=add_custom_information_document( - get_data_cube( - device_control_doc.pre_column_pressure_data_cube, - PreColumnPressureDataCube, - ), - getattr( - device_control_doc.pre_column_pressure_data_cube, - "custom_info", - None, - ), + pre_column_pressure_data_cube=get_data_cube( + device_control_doc.pre_column_pressure_data_cube, + PreColumnPressureDataCube, ), - sample_pressure_data_cube=add_custom_information_document( - get_data_cube( - device_control_doc.sample_pressure_data_cube, - SamplePressureDataCube, - ), - getattr( - device_control_doc.sample_pressure_data_cube, - "custom_info", - None, - ), + sample_pressure_data_cube=get_data_cube( + device_control_doc.sample_pressure_data_cube, + SamplePressureDataCube, ), - system_pressure_data_cube=add_custom_information_document( - get_data_cube( - device_control_doc.system_pressure_data_cube, - SystemPressureDataCube, - ), - getattr( - device_control_doc.system_pressure_data_cube, - "custom_info", - None, - ), + system_pressure_data_cube=get_data_cube( + device_control_doc.system_pressure_data_cube, + SystemPressureDataCube, ), - post_column_pressure_data_cube=add_custom_information_document( - get_data_cube( - device_control_doc.post_column_pressure_data_cube, - PostColumnPressureDataCube, - ), - getattr( - device_control_doc.post_column_pressure_data_cube, - "custom_info", - None, - ), + post_column_pressure_data_cube=get_data_cube( + device_control_doc.post_column_pressure_data_cube, + PostColumnPressureDataCube, ), - sample_flow_rate_data_cube=add_custom_information_document( - get_data_cube( - device_control_doc.sample_flow_data_cube, - SampleFlowRateDataCube, - ), - getattr( - device_control_doc.sample_flow_data_cube, "custom_info", None - ), + sample_flow_rate_data_cube=get_data_cube( + device_control_doc.sample_flow_data_cube, + SampleFlowRateDataCube, ), - system_flow_rate_data_cube=add_custom_information_document( - get_data_cube( - device_control_doc.system_flow_data_cube, - SystemFlowRateDataCube, - ), - getattr( - device_control_doc.system_flow_data_cube, "custom_info", None - ), + system_flow_rate_data_cube=get_data_cube( + device_control_doc.system_flow_data_cube, + SystemFlowRateDataCube, ), - temperature_profile_data_cube=add_custom_information_document( - get_data_cube( - device_control_doc.temperature_profile_data_cube, - TemperatureProfileDataCube, - ), - getattr( - device_control_doc.temperature_profile_data_cube, - "custom_info", - None, - ), + temperature_profile_data_cube=get_data_cube( + device_control_doc.temperature_profile_data_cube, + TemperatureProfileDataCube, ), detector_offset_setting=quantity_or_none( TQuantityValueUnitless, device_control_doc.detector_offset_setting diff --git a/src/allotropy/allotrope/schema_mappers/data_cube.py b/src/allotropy/allotrope/schema_mappers/data_cube.py index 54de21ade3..c891350edb 100644 --- a/src/allotropy/allotrope/schema_mappers/data_cube.py +++ b/src/allotropy/allotrope/schema_mappers/data_cube.py @@ -30,7 +30,6 @@ class DataCube: measures: Sequence[ Sequence[float | None] | Sequence[str | None] | Sequence[bool | None] ] - custom_info: dict[str, str] | None = None class DataCubeProtocol(Protocol): diff --git a/src/allotropy/parsers/cytiva_unicorn/structure/data_cube/creator.py b/src/allotropy/parsers/cytiva_unicorn/structure/data_cube/creator.py index 57e11e8b3b..06825be727 100644 --- a/src/allotropy/parsers/cytiva_unicorn/structure/data_cube/creator.py +++ b/src/allotropy/parsers/cytiva_unicorn/structure/data_cube/creator.py @@ -46,5 +46,4 @@ def create_data_cube( ).get_data() ) ], - custom_info={}, ) diff --git a/src/allotropy/parsers/cytiva_unicorn/structure/measurement_group.py b/src/allotropy/parsers/cytiva_unicorn/structure/measurement_group.py index 5e43659cd6..a316df8e29 100644 --- a/src/allotropy/parsers/cytiva_unicorn/structure/measurement_group.py +++ b/src/allotropy/parsers/cytiva_unicorn/structure/measurement_group.py @@ -63,14 +63,22 @@ def create_measurement_groups( TemperatureMeasurement.create_or_none(handler, elements, static_docs), ] - return [ + measurement_group = [ MeasurementGroup( measurements=[measurement for measurement in measurements if measurement], fractions=create_fractions(event_curves) if event_curves else None, logs=create_logs(event_curves) if event_curves else None, - measurement_aggregate_custom_info=chrom_1.get_unread(), + measurement_aggregate_custom_info={}, ) ] + custom_info = chrom_1.get_unread() + + if measurement_group[0].measurement_aggregate_custom_info is not None: + custom_info["software version"] = custom_info["UNICORNVersion"] + custom_info.pop("UNICORNVersion") + measurement_group[0].measurement_aggregate_custom_info.update(custom_info) + + return measurement_group def create_fractions(event_curves: StrictXmlElement) -> list[Fraction]: diff --git a/src/allotropy/parsers/cytiva_unicorn/structure/measurements/absorbance.py b/src/allotropy/parsers/cytiva_unicorn/structure/measurements/absorbance.py index 461310c2a7..6973a80be8 100644 --- a/src/allotropy/parsers/cytiva_unicorn/structure/measurements/absorbance.py +++ b/src/allotropy/parsers/cytiva_unicorn/structure/measurements/absorbance.py @@ -57,7 +57,7 @@ def create_or_none( elements: list[StrictXmlElement], static_docs: StaticDocs, ) -> UnicornMeasurement: - return cls.get_measurement( + measurement = cls.get_measurement( static_docs=static_docs, chromatogram_data_cube=assert_not_none( cls.get_data_cube_or_none( @@ -75,10 +75,15 @@ def create_or_none( DeviceControlDoc( device_type=DEVICE_TYPE, start_time=static_docs.start_time, + device_control_custom_info={}, ) ], peaks=cls.get_peaks(handler), ) + cls.add_custom_info( + measurement, cls.filter_curve_or_none(elements, cls.get_curve_regex()) + ) + return measurement class AbsorbanceMeasurement1(AbsorbanceMeasurement): diff --git a/src/allotropy/parsers/cytiva_unicorn/structure/measurements/concentration.py b/src/allotropy/parsers/cytiva_unicorn/structure/measurements/concentration.py index 0af375bc0f..9cc6dbd8b1 100644 --- a/src/allotropy/parsers/cytiva_unicorn/structure/measurements/concentration.py +++ b/src/allotropy/parsers/cytiva_unicorn/structure/measurements/concentration.py @@ -43,9 +43,13 @@ def create_or_none( unit="%", ), ), + device_control_custom_info={}, ), ], ) + cls.add_custom_info( + measurement, cls.filter_curve_or_none(elements, r"^Conc B$") + ) return measurement if cls.is_valid(cls.get_data_cubes(measurement)) else None @classmethod diff --git a/src/allotropy/parsers/cytiva_unicorn/structure/measurements/conductivity.py b/src/allotropy/parsers/cytiva_unicorn/structure/measurements/conductivity.py index f06c74defa..cc772885c3 100644 --- a/src/allotropy/parsers/cytiva_unicorn/structure/measurements/conductivity.py +++ b/src/allotropy/parsers/cytiva_unicorn/structure/measurements/conductivity.py @@ -56,9 +56,11 @@ def create_or_none( DeviceControlDoc( device_type=DEVICE_TYPE, start_time=static_docs.start_time, + device_control_custom_info={}, ) ], ) + cls.add_custom_info(measurement, cls.filter_curve_or_none(elements, r"^Cond$")) return measurement if cls.is_valid(cls.get_data_cubes(measurement)) else None @classmethod diff --git a/src/allotropy/parsers/cytiva_unicorn/structure/measurements/flow.py b/src/allotropy/parsers/cytiva_unicorn/structure/measurements/flow.py index 3fe3ab40ac..57439410c8 100644 --- a/src/allotropy/parsers/cytiva_unicorn/structure/measurements/flow.py +++ b/src/allotropy/parsers/cytiva_unicorn/structure/measurements/flow.py @@ -36,6 +36,7 @@ def create_device_control( start_time=start_time, sample_flow_data_cube=sample_flow_data_cube, system_flow_data_cube=system_flow_data_cube, + device_control_custom_info={}, ) @classmethod diff --git a/src/allotropy/parsers/cytiva_unicorn/structure/measurements/generic.py b/src/allotropy/parsers/cytiva_unicorn/structure/measurements/generic.py index 1ec1d9362d..d1bd58f744 100644 --- a/src/allotropy/parsers/cytiva_unicorn/structure/measurements/generic.py +++ b/src/allotropy/parsers/cytiva_unicorn/structure/measurements/generic.py @@ -27,6 +27,66 @@ class UnicornMeasurement(Measurement): + @classmethod + def add_custom_info( + cls, measurement: Measurement, base_element: StrictXmlElement | None + ) -> None: + if base_element: + device_control_custom_info = { + "ColumnVolume": base_element.get_sub_text_or_none("ColumnVolume"), + "ScanInterval": base_element.get_sub_text_or_none("ScanInterval"), + } + + processed_data_custom_info = { + "IsOriginalData": base_element.get_sub_text_or_none("IsOriginalData"), + "MethodStartTime": base_element.get_sub_text_or_none("MethodStartTime"), + "AmplitudeUnit": base_element.get_sub_text_or_none("AmplitudeUnit"), + "ChromatogramStartTimeUtcOffsetMinutes": base_element.get_sub_text_or_none( + "ChromatogramStartTimeUtcOffsetMinutes" + ), + "AmplitudePrecision": base_element.get_sub_text_or_none( + "AmplitudePrecision" + ), + "CurveDataType": base_element.get_sub_text_or_none("CurveDataType"), + "IsReadOnly": base_element.get_sub_text_or_none("IsReadOnly"), + "MethodStartTimeUtcOffsetMinutes": base_element.get_sub_text_or_none( + "MethodStartTimeUtcOffsetMinutes" + ), + "ColumnVolumeUnitName": base_element.get_sub_text_or_none( + "ColumnVolumeUnitName" + ), + "IsoChroneType": base_element.get_sub_text_or_none("IsoChroneType"), + "CurveNumber": base_element.get_sub_text_or_none("CurveNumber"), + "ChromatogramStartTime": base_element.get_sub_text_or_none( + "ChromatogramStartTime" + ), + "TimeUnit": base_element.get_sub_text_or_none("TimeUnit"), + "VolumeUnit": base_element.get_sub_text_or_none("VolumeUnit"), + "IsExternal": base_element.get_sub_text_or_none("IsExternal"), + "DistancetoStartPoints": base_element.get_sub_text_or_none( + "DistancetoStartPoints" + ), + "DistanceBetweenPoints": base_element.get_sub_text_or_none( + "DistanceBetweenPoints" + ), + "ChromatogramName": base_element.get_sub_text_or_none( + "ChromatogramName" + ), + "ChromatogramID": base_element.get_sub_text_or_none("ChromatogramID"), + } + if ( + measurement.device_control_docs[0].device_control_custom_info + is not None + ): + measurement.device_control_docs[0].device_control_custom_info.update( + device_control_custom_info + ) + if measurement.processed_data_custom_info is not None: + processed_data_custom_info.update(base_element.get_unread()) + measurement.processed_data_custom_info.update( + processed_data_custom_info + ) + @classmethod def filter_curve_or_none( cls, curve_elements: list[StrictXmlElement], pattern: str @@ -69,12 +129,6 @@ def get_data_cube_or_none( data_cube_component, transformation, ) - if data_cube.custom_info is not None: - # Filter out None values to match expected dict[str, str] type - unread_data = { - k: v for k, v in curve.get_unread().items() if v is not None - } - data_cube.custom_info.update(unread_data) return data_cube return None @@ -112,6 +166,7 @@ def get_measurement( "sample_volume_3": static_docs.sample_volume_3, }, peaks=peaks, + processed_data_custom_info={}, ) @classmethod diff --git a/src/allotropy/parsers/cytiva_unicorn/structure/measurements/ph.py b/src/allotropy/parsers/cytiva_unicorn/structure/measurements/ph.py index 7aae000ae9..12f7bbe0ff 100644 --- a/src/allotropy/parsers/cytiva_unicorn/structure/measurements/ph.py +++ b/src/allotropy/parsers/cytiva_unicorn/structure/measurements/ph.py @@ -43,9 +43,11 @@ def create_or_none( DeviceControlDoc( device_type=DEVICE_TYPE, start_time=static_docs.start_time, + device_control_custom_info={}, ) ], ) + cls.add_custom_info(measurement, cls.filter_curve_or_none(elements, r"^pH$")) return measurement if cls.is_valid(cls.get_data_cubes(measurement)) else None @classmethod diff --git a/src/allotropy/parsers/cytiva_unicorn/structure/measurements/pressure.py b/src/allotropy/parsers/cytiva_unicorn/structure/measurements/pressure.py index eb18128995..d7805f99bd 100644 --- a/src/allotropy/parsers/cytiva_unicorn/structure/measurements/pressure.py +++ b/src/allotropy/parsers/cytiva_unicorn/structure/measurements/pressure.py @@ -79,9 +79,13 @@ def create_or_none( unit="MPa", ), ), + device_control_custom_info={}, ), ], ) + cls.add_custom_info( + measurement, cls.filter_curve_or_none(elements, r"^DeltaC pressure$") + ) return measurement if cls.is_valid(cls.get_data_cubes(measurement)) else None @classmethod diff --git a/src/allotropy/parsers/cytiva_unicorn/structure/measurements/temperature.py b/src/allotropy/parsers/cytiva_unicorn/structure/measurements/temperature.py index c1d9478052..18474c977c 100644 --- a/src/allotropy/parsers/cytiva_unicorn/structure/measurements/temperature.py +++ b/src/allotropy/parsers/cytiva_unicorn/structure/measurements/temperature.py @@ -43,9 +43,13 @@ def create_or_none( unit="degC", ), ), + device_control_custom_info={}, ), ], ) + cls.add_custom_info( + measurement, cls.filter_curve_or_none(elements, r"^Cond temp$") + ) return measurement if cls.is_valid(cls.get_data_cubes(measurement)) else None @classmethod diff --git a/src/allotropy/parsers/cytiva_unicorn/structure/metadata.py b/src/allotropy/parsers/cytiva_unicorn/structure/metadata.py index ce8b230ab5..bd46282ff2 100644 --- a/src/allotropy/parsers/cytiva_unicorn/structure/metadata.py +++ b/src/allotropy/parsers/cytiva_unicorn/structure/metadata.py @@ -37,7 +37,7 @@ def create_metadata( system_name = results.find_or_none("SystemName") firmware_version = instrument_config_data.find_or_none("FirmwareVersion") - return Metadata( + metadata = Metadata( asset_management_identifier=instrument_config.get_attr("Description"), product_manufacturer="Cytiva Life Sciences", device_identifier=system_name.get_text_or_none() if system_name else None, @@ -47,4 +47,14 @@ def create_metadata( analyst=get_audit_trail_entry_user(handler), file_name=Path(file_path).name, unc_path=file_path, + data_system_custom_info={}, ) + + if metadata.data_system_custom_info is not None: + data_system_custom_info = results.get_unread() + data_system_custom_info["software version"] = data_system_custom_info[ + "UNICORNVersion" + ] + data_system_custom_info.pop("UNICORNVersion") + metadata.data_system_custom_info.update(data_system_custom_info) + return metadata diff --git a/tests/parsers/cytiva_unicorn/testdata/unicorn_1.json b/tests/parsers/cytiva_unicorn/testdata/unicorn_1.json index 280b7cf7e8..936dd58bc8 100644 --- a/tests/parsers/cytiva_unicorn/testdata/unicorn_1.json +++ b/tests/parsers/cytiva_unicorn/testdata/unicorn_1.json @@ -10,7 +10,11 @@ "device control document": [ { "device type": "HPLC", - "start time setting": "2024-01-02T11:00:00+00:00" + "start time setting": "2024-01-02T11:00:00+00:00", + "custom information document": { + "ColumnVolume": "4", + "ScanInterval": "0" + } } ] }, @@ -125,8 +129,8 @@ "unit": "S/m" }, "StartPeakLimitType": "BaseLine", - "IsStandardPeak": "false", - "EndPeakLimitType": "DropLine" + "EndPeakLimitType": "DropLine", + "IsStandardPeak": "false" } }, { @@ -214,8 +218,8 @@ "unit": "S/m" }, "StartPeakLimitType": "DropLine", - "IsStandardPeak": "false", - "EndPeakLimitType": "DropLine" + "EndPeakLimitType": "DropLine", + "IsStandardPeak": "false" } }, { @@ -303,8 +307,8 @@ "unit": "S/m" }, "StartPeakLimitType": "DropLine", - "IsStandardPeak": "false", - "EndPeakLimitType": "DropLine" + "EndPeakLimitType": "DropLine", + "IsStandardPeak": "false" } }, { @@ -392,11 +396,30 @@ "unit": "S/m" }, "StartPeakLimitType": "DropLine", - "IsStandardPeak": "false", - "EndPeakLimitType": "DropLine" + "EndPeakLimitType": "DropLine", + "IsStandardPeak": "false" } } ] + }, + "custom information document": { + "IsOriginalData": "true", + "MethodStartTime": "2024-01-02T11:00:00.000", + "AmplitudeUnit": "mAU", + "ChromatogramStartTimeUtcOffsetMinutes": "-300", + "AmplitudePrecision": "3", + "CurveDataType": "UV", + "IsReadOnly": "false", + "MethodStartTimeUtcOffsetMinutes": "-300", + "ColumnVolumeUnitName": "ml", + "IsoChroneType": "Time", + "CurveNumber": "1", + "ChromatogramStartTime": "2024-01-02T11:00:00.000", + "TimeUnit": "min", + "VolumeUnit": "ml", + "IsExternal": "false", + "DistanceBetweenPoints": "0.001666667", + "DistanceToStartPoint": "0.06833267" } } ] @@ -434,27 +457,6 @@ "measures": [ [0.19794297218322754, 0.19794535636901855, 0.19794775545597076] ] - }, - "custom information document": { - "IsOriginalData": "true", - "MethodStartTime": "2024-01-02T11:00:00.000", - "AmplitudeUnit": "mAU", - "ChromatogramStartTimeUtcOffsetMinutes": "-300", - "AmplitudePrecision": "3", - "CurveDataType": "UV", - "IsReadOnly": "false", - "MethodStartTimeUtcOffsetMinutes": "-300", - "ColumnVolumeUnitName": "ml", - "IsoChroneType": "Time", - "DistanceToStartPoint": "0.06833267", - "CurveNumber": "1", - "ColumnVolume": "4", - "ScanInterval": "0", - "DistanceBetweenPoints": "0.001666667", - "ChromatogramStartTime": "2024-01-02T11:00:00.000", - "TimeUnit": "min", - "VolumeUnit": "ml", - "IsExternal": "false" } } }, @@ -463,7 +465,11 @@ "device control document": [ { "device type": "HPLC", - "start time setting": "2024-01-02T11:00:00+00:00" + "start time setting": "2024-01-02T11:00:00+00:00", + "custom information document": { + "ColumnVolume": "4", + "ScanInterval": "0" + } } ] }, @@ -525,27 +531,6 @@ "measures": [ [0.0, 0.0, 0.0] ] - }, - "custom information document": { - "IsOriginalData": "true", - "MethodStartTime": "2024-01-02T11:00:00.000", - "AmplitudeUnit": "mAU", - "ChromatogramStartTimeUtcOffsetMinutes": "-300", - "AmplitudePrecision": "3", - "CurveDataType": "UV", - "IsReadOnly": "false", - "MethodStartTimeUtcOffsetMinutes": "-300", - "ColumnVolumeUnitName": "ml", - "IsoChroneType": "Time", - "DistanceToStartPoint": "0.08499908", - "CurveNumber": "2", - "ColumnVolume": "4", - "ScanInterval": "0", - "DistanceBetweenPoints": "0.008333334", - "ChromatogramStartTime": "2024-01-02T11:00:00.000", - "TimeUnit": "min", - "VolumeUnit": "ml", - "IsExternal": "false" } } }, @@ -554,7 +539,11 @@ "device control document": [ { "device type": "HPLC", - "start time setting": "2024-01-02T11:00:00+00:00" + "start time setting": "2024-01-02T11:00:00+00:00", + "custom information document": { + "ColumnVolume": "4", + "ScanInterval": "0" + } } ] }, @@ -616,27 +605,6 @@ "measures": [ [0.0, 0.0, 0.0] ] - }, - "custom information document": { - "IsOriginalData": "true", - "MethodStartTime": "2024-01-02T11:00:00.000", - "AmplitudeUnit": "mAU", - "ChromatogramStartTimeUtcOffsetMinutes": "-300", - "AmplitudePrecision": "3", - "CurveDataType": "UV", - "IsReadOnly": "false", - "MethodStartTimeUtcOffsetMinutes": "-300", - "ColumnVolumeUnitName": "ml", - "IsoChroneType": "Time", - "DistanceToStartPoint": "0.08499908", - "CurveNumber": "3", - "ColumnVolume": "4", - "ScanInterval": "0", - "DistanceBetweenPoints": "0.008333334", - "ChromatogramStartTime": "2024-01-02T11:00:00.000", - "TimeUnit": "min", - "VolumeUnit": "ml", - "IsExternal": "false" } } }, @@ -645,7 +613,11 @@ "device control document": [ { "device type": "HPLC", - "start time setting": "2024-01-02T11:00:00+00:00" + "start time setting": "2024-01-02T11:00:00+00:00", + "custom information document": { + "ColumnVolume": "4", + "ScanInterval": "0" + } } ] }, @@ -702,28 +674,26 @@ "measures": [ [31.154701232910156, 31.13396453857422, 30.91810417175293] ] - }, - "custom information document": { - "IsOriginalData": "true", - "MethodStartTime": "2024-01-02T11:00:00.000", - "AmplitudeUnit": "%", - "ChromatogramStartTimeUtcOffsetMinutes": "-300", - "AmplitudePrecision": "1", - "CurveDataType": "Conduction", - "IsReadOnly": "false", - "MethodStartTimeUtcOffsetMinutes": "-300", - "ColumnVolumeUnitName": "ml", - "IsoChroneType": "Time", - "DistanceToStartPoint": "0", - "CurveNumber": "5", - "ColumnVolume": "4", - "ScanInterval": "0", - "DistanceBetweenPoints": "0", - "ChromatogramStartTime": "2024-01-02T11:00:00.000", - "TimeUnit": "min", - "VolumeUnit": "ml", - "IsExternal": "false" } + }, + "custom information document": { + "IsOriginalData": "true", + "MethodStartTime": "2024-01-02T11:00:00.000", + "AmplitudeUnit": "mS/cm", + "ChromatogramStartTimeUtcOffsetMinutes": "-300", + "AmplitudePrecision": "2", + "CurveDataType": "Conduction", + "IsReadOnly": "false", + "MethodStartTimeUtcOffsetMinutes": "-300", + "ColumnVolumeUnitName": "ml", + "IsoChroneType": "Time", + "CurveNumber": "4", + "ChromatogramStartTime": "2024-01-02T11:00:00.000", + "TimeUnit": "min", + "VolumeUnit": "ml", + "IsExternal": "false", + "DistanceBetweenPoints": "0.003333333", + "DistanceToStartPoint": "0" } } ] @@ -761,27 +731,6 @@ "measures": [ [3.1048166275024416, 3.104812431335449, 3.104808044433594] ] - }, - "custom information document": { - "IsOriginalData": "true", - "MethodStartTime": "2024-01-02T11:00:00.000", - "AmplitudeUnit": "mS/cm", - "ChromatogramStartTimeUtcOffsetMinutes": "-300", - "AmplitudePrecision": "2", - "CurveDataType": "Conduction", - "IsReadOnly": "false", - "MethodStartTimeUtcOffsetMinutes": "-300", - "ColumnVolumeUnitName": "ml", - "IsoChroneType": "Time", - "DistanceToStartPoint": "0", - "CurveNumber": "4", - "ColumnVolume": "4", - "ScanInterval": "0", - "DistanceBetweenPoints": "0.003333333", - "ChromatogramStartTime": "2024-01-02T11:00:00.000", - "TimeUnit": "min", - "VolumeUnit": "ml", - "IsExternal": "false" } } }, @@ -790,7 +739,11 @@ "device control document": [ { "device type": "HPLC", - "start time setting": "2024-01-02T11:00:00+00:00" + "start time setting": "2024-01-02T11:00:00+00:00", + "custom information document": { + "ColumnVolume": "4", + "ScanInterval": "0" + } } ] }, @@ -852,26 +805,6 @@ "measures": [ [6.056291580200195, 0.0, 6.056750297546387] ] - }, - "custom information document": { - "IsOriginalData": "true", - "MethodStartTime": "2024-01-02T11:00:00.000", - "ChromatogramStartTimeUtcOffsetMinutes": "-300", - "AmplitudePrecision": "2", - "CurveDataType": "pH", - "IsReadOnly": "false", - "MethodStartTimeUtcOffsetMinutes": "-300", - "ColumnVolumeUnitName": "ml", - "IsoChroneType": "Time", - "DistanceToStartPoint": "0.09333229", - "CurveNumber": "7", - "ColumnVolume": "4", - "ScanInterval": "0", - "DistanceBetweenPoints": "0.01666667", - "ChromatogramStartTime": "2024-01-02T11:00:00.000", - "TimeUnit": "min", - "VolumeUnit": "ml", - "IsExternal": "false" } } }, @@ -906,28 +839,11 @@ "measures": [ [0.0, 0.0, 0.0] ] - }, - "custom information document": { - "IsOriginalData": "true", - "MethodStartTime": "2024-01-02T11:00:00.000", - "AmplitudeUnit": "%", - "ChromatogramStartTimeUtcOffsetMinutes": "-300", - "AmplitudePrecision": "1", - "CurveDataType": "Other", - "IsReadOnly": "false", - "MethodStartTimeUtcOffsetMinutes": "-300", - "ColumnVolumeUnitName": "ml", - "IsoChroneType": "Time", - "DistanceToStartPoint": "0.07666588", - "CurveNumber": "6", - "ColumnVolume": "4", - "ScanInterval": "0", - "DistanceBetweenPoints": "0.0", - "ChromatogramStartTime": "2024-01-02T11:00:00.000", - "TimeUnit": "min", - "VolumeUnit": "ml", - "IsExternal": "false" } + }, + "custom information document": { + "ColumnVolume": "4", + "ScanInterval": "0" } } ] @@ -997,27 +913,6 @@ "measures": [ [0.03866715729236603, 0.19328080117702484, 0.20647241175174713] ] - }, - "custom information document": { - "IsOriginalData": "true", - "MethodStartTime": "2024-01-02T11:00:00.000", - "AmplitudeUnit": "MPa", - "ChromatogramStartTimeUtcOffsetMinutes": "-300", - "AmplitudePrecision": "3", - "CurveDataType": "Pressure", - "IsReadOnly": "false", - "MethodStartTimeUtcOffsetMinutes": "-300", - "ColumnVolumeUnitName": "ml", - "IsoChroneType": "Time", - "DistanceToStartPoint": "0.08666611", - "CurveNumber": "26", - "ColumnVolume": "4", - "ScanInterval": "0", - "DistanceBetweenPoints": "0.01666667", - "ChromatogramStartTime": "2024-01-02T11:00:00.000", - "TimeUnit": "min", - "VolumeUnit": "ml", - "IsExternal": "false" } }, "post column pressure data cube": { @@ -1045,27 +940,6 @@ "measures": [ [0.13015341758728027, 0.14228571951389313, 0.06806576997041702] ] - }, - "custom information document": { - "IsOriginalData": "true", - "MethodStartTime": "2024-01-02T11:00:00.000", - "AmplitudeUnit": "MPa", - "ChromatogramStartTimeUtcOffsetMinutes": "-300", - "AmplitudePrecision": "3", - "CurveDataType": "Pressure", - "IsReadOnly": "false", - "MethodStartTimeUtcOffsetMinutes": "-300", - "ColumnVolumeUnitName": "ml", - "IsoChroneType": "Time", - "DistanceToStartPoint": "0.08499908", - "CurveNumber": "28", - "ColumnVolume": "4", - "ScanInterval": "0", - "DistanceBetweenPoints": "0.01666667", - "ChromatogramStartTime": "2024-01-02T11:00:00.000", - "TimeUnit": "min", - "VolumeUnit": "ml", - "IsExternal": "false" } }, "sample pressure data cube": { @@ -1093,27 +967,6 @@ "measures": [ [0.05315263196825981, 0.05314874276518822, 0.05314485356211662] ] - }, - "custom information document": { - "IsOriginalData": "true", - "MethodStartTime": "2024-01-02T11:00:00.000", - "AmplitudeUnit": "MPa", - "ChromatogramStartTimeUtcOffsetMinutes": "-300", - "AmplitudePrecision": "3", - "CurveDataType": "Pressure", - "IsReadOnly": "false", - "MethodStartTimeUtcOffsetMinutes": "-300", - "ColumnVolumeUnitName": "ml", - "IsoChroneType": "Time", - "DistanceToStartPoint": "0.07166481", - "CurveNumber": "25", - "ColumnVolume": "4", - "ScanInterval": "0", - "DistanceBetweenPoints": "0.008333334", - "ChromatogramStartTime": "2024-01-02T11:00:00.000", - "TimeUnit": "min", - "VolumeUnit": "ml", - "IsExternal": "false" } }, "system pressure data cube": { @@ -1141,28 +994,11 @@ "measures": [ [0.1649095118045807, 0.13285210728645325, 0.10079468786716461] ] - }, - "custom information document": { - "IsOriginalData": "true", - "MethodStartTime": "2024-01-02T11:00:00.000", - "AmplitudeUnit": "MPa", - "ChromatogramStartTimeUtcOffsetMinutes": "-300", - "AmplitudePrecision": "3", - "CurveDataType": "Pressure", - "IsReadOnly": "false", - "MethodStartTimeUtcOffsetMinutes": "-300", - "ColumnVolumeUnitName": "ml", - "IsoChroneType": "Time", - "DistanceToStartPoint": "0.07166481", - "CurveNumber": "10", - "ColumnVolume": "4", - "ScanInterval": "0", - "DistanceBetweenPoints": "0.008333334", - "ChromatogramStartTime": "2024-01-02T11:00:00.000", - "TimeUnit": "min", - "VolumeUnit": "ml", - "IsExternal": "false" } + }, + "custom information document": { + "ColumnVolume": "4", + "ScanInterval": "0" } } ] @@ -1221,6 +1057,25 @@ [0.06312736868858337, 0.06418673694133759, 0.03745259717106819] ] } + }, + "custom information document": { + "IsOriginalData": "true", + "MethodStartTime": "2024-01-02T11:00:00.000", + "AmplitudeUnit": "MPa", + "ChromatogramStartTimeUtcOffsetMinutes": "-300", + "AmplitudePrecision": "3", + "CurveDataType": "Pressure", + "IsReadOnly": "false", + "MethodStartTimeUtcOffsetMinutes": "-300", + "ColumnVolumeUnitName": "ml", + "IsoChroneType": "Time", + "CurveNumber": "27", + "ChromatogramStartTime": "2024-01-02T11:00:00.000", + "TimeUnit": "min", + "VolumeUnit": "ml", + "IsExternal": "false", + "DistanceBetweenPoints": "0.01666667", + "DistanceToStartPoint": "0.08499908" } } ] @@ -1265,27 +1120,6 @@ "measures": [ [0.0, 7.460474014282227, 14.920948028564453] ] - }, - "custom information document": { - "IsOriginalData": "true", - "MethodStartTime": "2024-01-02T11:00:00.000", - "AmplitudeUnit": "CV/h", - "ChromatogramStartTimeUtcOffsetMinutes": "-300", - "AmplitudePrecision": "2", - "CurveDataType": "Other", - "IsReadOnly": "false", - "MethodStartTimeUtcOffsetMinutes": "-300", - "ColumnVolumeUnitName": "ml", - "IsoChroneType": "Time", - "DistanceToStartPoint": "0.07666588", - "CurveNumber": "90", - "ColumnVolume": "4", - "ScanInterval": "0", - "DistanceBetweenPoints": "0.01666667", - "ChromatogramStartTime": "2024-01-02T11:00:00.000", - "TimeUnit": "min", - "VolumeUnit": "ml", - "IsExternal": "false" } }, "sample flow rate data cube": { @@ -1313,27 +1147,6 @@ "measures": [ [0.0, 0.0, 0.0] ] - }, - "custom information document": { - "IsOriginalData": "true", - "MethodStartTime": "2024-01-02T11:00:00.000", - "AmplitudeUnit": "CV/h", - "ChromatogramStartTimeUtcOffsetMinutes": "-300", - "AmplitudePrecision": "2", - "CurveDataType": "Other", - "IsReadOnly": "false", - "MethodStartTimeUtcOffsetMinutes": "-300", - "ColumnVolumeUnitName": "ml", - "IsoChroneType": "Time", - "DistanceToStartPoint": "0.08833313", - "CurveNumber": "89", - "ColumnVolume": "4", - "ScanInterval": "0", - "DistanceBetweenPoints": "0.01666667", - "ChromatogramStartTime": "2024-01-02T11:00:00.000", - "TimeUnit": "min", - "VolumeUnit": "ml", - "IsExternal": "false" } } }, @@ -1365,27 +1178,6 @@ "measures": [ [5.000010013580322, 2.3790595531463623, 0.0] ] - }, - "custom information document": { - "IsOriginalData": "true", - "MethodStartTime": "2024-01-02T11:00:00.000", - "AmplitudeUnit": "ml/min", - "ChromatogramStartTimeUtcOffsetMinutes": "-300", - "AmplitudePrecision": "2", - "CurveDataType": "Other", - "IsReadOnly": "false", - "MethodStartTimeUtcOffsetMinutes": "-300", - "ColumnVolumeUnitName": "ml", - "IsoChroneType": "Time", - "DistanceToStartPoint": "0.07666588", - "CurveNumber": "8", - "ColumnVolume": "4", - "ScanInterval": "0", - "DistanceBetweenPoints": "0.01666667", - "ChromatogramStartTime": "2024-01-02T11:00:00.000", - "TimeUnit": "min", - "VolumeUnit": "ml", - "IsExternal": "false" } }, "sample flow rate data cube": { @@ -1413,27 +1205,6 @@ "measures": [ [0.0, 0.0, 0.0] ] - }, - "custom information document": { - "IsOriginalData": "true", - "MethodStartTime": "2024-01-02T11:00:00.000", - "AmplitudeUnit": "ml/min", - "ChromatogramStartTimeUtcOffsetMinutes": "-300", - "AmplitudePrecision": "2", - "CurveDataType": "Other", - "IsReadOnly": "false", - "MethodStartTimeUtcOffsetMinutes": "-300", - "ColumnVolumeUnitName": "ml", - "IsoChroneType": "Time", - "DistanceToStartPoint": "0.08833313", - "CurveNumber": "14", - "ColumnVolume": "4", - "ScanInterval": "0", - "DistanceBetweenPoints": "0.01666667", - "ChromatogramStartTime": "2024-01-02T11:00:00.000", - "TimeUnit": "min", - "VolumeUnit": "ml", - "IsExternal": "false" } } }, @@ -1465,27 +1236,6 @@ "measures": [ [0.0, 0.0, 0.0] ] - }, - "custom information document": { - "IsOriginalData": "true", - "MethodStartTime": "2024-01-02T11:00:00.000", - "AmplitudeUnit": "cm/h", - "ChromatogramStartTimeUtcOffsetMinutes": "-300", - "AmplitudePrecision": "0", - "CurveDataType": "Other", - "IsReadOnly": "false", - "MethodStartTimeUtcOffsetMinutes": "-300", - "ColumnVolumeUnitName": "ml", - "IsoChroneType": "Time", - "DistanceToStartPoint": "0.08999825", - "CurveNumber": "15", - "ColumnVolume": "4", - "ScanInterval": "0", - "DistanceBetweenPoints": "0.01666667", - "ChromatogramStartTime": "2024-01-02T11:00:00.000", - "TimeUnit": "min", - "VolumeUnit": "ml", - "IsExternal": "false" } } } @@ -1556,28 +1306,11 @@ "measures": [ [27.713348388671875, 27.648590087890625, 27.536712646484375] ] - }, - "custom information document": { - "IsOriginalData": "true", - "MethodStartTime": "2024-01-02T11:00:00.000", - "AmplitudeUnit": "°C", - "ChromatogramStartTimeUtcOffsetMinutes": "-300", - "AmplitudePrecision": "1", - "CurveDataType": "Temperature", - "IsReadOnly": "false", - "MethodStartTimeUtcOffsetMinutes": "-300", - "ColumnVolumeUnitName": "ml", - "IsoChroneType": "Time", - "DistanceToStartPoint": "0.1033325", - "CurveNumber": "13", - "ColumnVolume": "4", - "ScanInterval": "0", - "DistanceBetweenPoints": "0.03333334", - "ChromatogramStartTime": "2024-01-02T11:00:00.000", - "TimeUnit": "min", - "VolumeUnit": "ml", - "IsExternal": "false" } + }, + "custom information document": { + "ColumnVolume": "4", + "ScanInterval": "0" } } ] @@ -1632,8 +1365,8 @@ "fraction role": "Out-Waste", "@type": "Fraction", "custom information document": { - "EventSubType": "Undefined", - "InstructionFeedback": "0" + "InstructionFeedback": "0", + "EventSubType": "Undefined" } }, { @@ -1648,8 +1381,8 @@ }, "@type": "Method", "custom information document": { - "EventSubType": "Undefined", - "InstructionFeedback": "0" + "InstructionFeedback": "0", + "EventSubType": "Undefined" } }, { @@ -1664,8 +1397,8 @@ }, "@type": "Method", "custom information document": { - "EventSubType": "Undefined", - "InstructionFeedback": "0" + "InstructionFeedback": "0", + "EventSubType": "Undefined" } }, { @@ -1680,8 +1413,8 @@ }, "@type": "Method", "custom information document": { - "EventSubType": "Undefined", - "InstructionFeedback": "0" + "InstructionFeedback": "0", + "EventSubType": "Undefined" } }, { @@ -1696,8 +1429,8 @@ }, "@type": "Method", "custom information document": { - "EventSubType": "Undefined", - "InstructionFeedback": "0" + "InstructionFeedback": "0", + "EventSubType": "Undefined" } }, { @@ -1712,8 +1445,8 @@ }, "@type": "Method", "custom information document": { - "EventSubType": "Undefined", - "InstructionFeedback": "0" + "InstructionFeedback": "0", + "EventSubType": "Undefined" } }, { @@ -1729,8 +1462,8 @@ "fraction role": "Frac", "@type": "Fraction", "custom information document": { - "EventSubType": "Undefined", - "InstructionFeedback": "0" + "InstructionFeedback": "0", + "EventSubType": "Undefined" } }, { @@ -1746,8 +1479,8 @@ "fraction role": "Out-Waste", "@type": "Fraction", "custom information document": { - "EventSubType": "Undefined", - "InstructionFeedback": "0" + "InstructionFeedback": "0", + "EventSubType": "Undefined" } } ] @@ -3567,15 +3300,15 @@ ] }, "custom information document": { - "ChromatogramName": "Chrom.1", + "FormatVersion": "9", "CreatedUtcOffsetMinutes": "-300", - "Created": "2024-01-01T10:00:00.000", - "UNICORNVersion": "7.7.0.4016", + "TimeUnit": "min", "IsReadonly": "false", + "VolumeUnit": "ml", + "Created": "2024-01-01T10:00:00.000", + "ChromatogramName": "Chrom.1", "ChromatogramID": "100", - "FormatVersion": "9", - "TimeUnit": "min", - "VolumeUnit": "ml" + "software version": "7.7.0.4016" } }, "analyst": "Default" @@ -3585,7 +3318,22 @@ "ASM converter name": "allotropy_cytiva_unicorn", "ASM converter version": "0.1.102", "file name": "unicorn_1.zip", - "UNC path": "tests/parsers/cytiva_unicorn/testdata/unicorn_1.zip" + "UNC path": "tests/parsers/cytiva_unicorn/testdata/unicorn_1.zip", + "custom information document": { + "IsArchived": "false", + "FormatVersion": "100", + "SystemTypeName": "NEXTAKTAchromatography", + "ResultState": "Evaluated", + "IsReadOnly": "false", + "BatchId": "f65ef0a9-7240-434e-aac1-44cb8e8faa08", + "ResultPurpose": "100", + "RunIndex": "100", + "Name": "Capto Adhere Polishing 100ppm Sample", + "RunType": "Method", + "FolderPath": "/DefaultHome", + "ResultFormatVersion": "100", + "software version": "100.100.100.100" + } }, "device system document": { "asset management identifier": "AKTA avant", From 33edc80747cc54411180ccbeb4848d575ef990a4 Mon Sep 17 00:00:00 2001 From: Felipe Narvaez Date: Wed, 6 Aug 2025 14:38:10 -0500 Subject: [PATCH 3/4] Fixed PR comments --- .../structure/measurement_group.py | 14 +- .../structure/measurements/generic.py | 44 +++--- .../cytiva_unicorn/structure/metadata.py | 12 +- .../parsers/utils/strict_xml_element.py | 3 +- .../cytiva_unicorn/testdata/unicorn_1.json | 136 +++++++++--------- 5 files changed, 109 insertions(+), 100 deletions(-) diff --git a/src/allotropy/parsers/cytiva_unicorn/structure/measurement_group.py b/src/allotropy/parsers/cytiva_unicorn/structure/measurement_group.py index a316df8e29..db18465294 100644 --- a/src/allotropy/parsers/cytiva_unicorn/structure/measurement_group.py +++ b/src/allotropy/parsers/cytiva_unicorn/structure/measurement_group.py @@ -71,12 +71,22 @@ def create_measurement_groups( measurement_aggregate_custom_info={}, ) ] + + chrom_1.mark_read({"element:TimeUnit", "element:VolumeUnit", "element:IsReadonly"}) custom_info = chrom_1.get_unread() if measurement_group[0].measurement_aggregate_custom_info is not None: - custom_info["software version"] = custom_info["UNICORNVersion"] custom_info.pop("UNICORNVersion") - measurement_group[0].measurement_aggregate_custom_info.update(custom_info) + custom_info.update( + { + "RunIndex": results.get_sub_text_or_none("RunIndex"), + "RunType": results.get_sub_text_or_none("RunType"), + } + ) + custom_info_sorted = dict(sorted(custom_info.items())) + measurement_group[0].measurement_aggregate_custom_info.update( + custom_info_sorted + ) return measurement_group diff --git a/src/allotropy/parsers/cytiva_unicorn/structure/measurements/generic.py b/src/allotropy/parsers/cytiva_unicorn/structure/measurements/generic.py index d1bd58f744..ddcf78dd6d 100644 --- a/src/allotropy/parsers/cytiva_unicorn/structure/measurements/generic.py +++ b/src/allotropy/parsers/cytiva_unicorn/structure/measurements/generic.py @@ -38,41 +38,41 @@ def add_custom_info( } processed_data_custom_info = { - "IsOriginalData": base_element.get_sub_text_or_none("IsOriginalData"), - "MethodStartTime": base_element.get_sub_text_or_none("MethodStartTime"), - "AmplitudeUnit": base_element.get_sub_text_or_none("AmplitudeUnit"), - "ChromatogramStartTimeUtcOffsetMinutes": base_element.get_sub_text_or_none( - "ChromatogramStartTimeUtcOffsetMinutes" - ), "AmplitudePrecision": base_element.get_sub_text_or_none( "AmplitudePrecision" ), - "CurveDataType": base_element.get_sub_text_or_none("CurveDataType"), - "IsReadOnly": base_element.get_sub_text_or_none("IsReadOnly"), - "MethodStartTimeUtcOffsetMinutes": base_element.get_sub_text_or_none( - "MethodStartTimeUtcOffsetMinutes" + "AmplitudeUnit": base_element.get_sub_text_or_none("AmplitudeUnit"), + "ChromatogramID": base_element.get_sub_text_or_none("ChromatogramID"), + "ChromatogramName": base_element.get_sub_text_or_none( + "ChromatogramName" + ), + "ChromatogramStartTime": base_element.get_sub_text_or_none( + "ChromatogramStartTime" + ), + "ChromatogramStartTimeUtcOffsetMinutes": base_element.get_sub_text_or_none( + "ChromatogramStartTimeUtcOffsetMinutes" ), "ColumnVolumeUnitName": base_element.get_sub_text_or_none( "ColumnVolumeUnitName" ), - "IsoChroneType": base_element.get_sub_text_or_none("IsoChroneType"), + "CurveDataType": base_element.get_sub_text_or_none("CurveDataType"), "CurveNumber": base_element.get_sub_text_or_none("CurveNumber"), - "ChromatogramStartTime": base_element.get_sub_text_or_none( - "ChromatogramStartTime" + "DistanceBetweenPoints": base_element.get_sub_text_or_none( + "DistanceBetweenPoints" ), - "TimeUnit": base_element.get_sub_text_or_none("TimeUnit"), - "VolumeUnit": base_element.get_sub_text_or_none("VolumeUnit"), - "IsExternal": base_element.get_sub_text_or_none("IsExternal"), "DistancetoStartPoints": base_element.get_sub_text_or_none( "DistancetoStartPoints" ), - "DistanceBetweenPoints": base_element.get_sub_text_or_none( - "DistanceBetweenPoints" - ), - "ChromatogramName": base_element.get_sub_text_or_none( - "ChromatogramName" + "IsExternal": base_element.get_sub_text_or_none("IsExternal"), + "IsOriginalData": base_element.get_sub_text_or_none("IsOriginalData"), + "IsReadOnly": base_element.get_sub_text_or_none("IsReadOnly"), + "IsoChroneType": base_element.get_sub_text_or_none("IsoChroneType"), + "MethodStartTime": base_element.get_sub_text_or_none("MethodStartTime"), + "MethodStartTimeUtcOffsetMinutes": base_element.get_sub_text_or_none( + "MethodStartTimeUtcOffsetMinutes" ), - "ChromatogramID": base_element.get_sub_text_or_none("ChromatogramID"), + "TimeUnit": base_element.get_sub_text_or_none("TimeUnit"), + "VolumeUnit": base_element.get_sub_text_or_none("VolumeUnit"), } if ( measurement.device_control_docs[0].device_control_custom_info diff --git a/src/allotropy/parsers/cytiva_unicorn/structure/metadata.py b/src/allotropy/parsers/cytiva_unicorn/structure/metadata.py index bd46282ff2..a936693989 100644 --- a/src/allotropy/parsers/cytiva_unicorn/structure/metadata.py +++ b/src/allotropy/parsers/cytiva_unicorn/structure/metadata.py @@ -36,6 +36,7 @@ def create_metadata( system_name = results.find_or_none("SystemName") firmware_version = instrument_config_data.find_or_none("FirmwareVersion") + results.mark_read({"element:RunIndex", "element:RunType"}) metadata = Metadata( asset_management_identifier=instrument_config.get_attr("Description"), @@ -48,13 +49,12 @@ def create_metadata( file_name=Path(file_path).name, unc_path=file_path, data_system_custom_info={}, + software_version=results.get_attr("UNICORNVersion"), + device_system_custom_info={ + "SystemTypeName": results.get_sub_text_or_none("SystemTypeName") + }, ) if metadata.data_system_custom_info is not None: - data_system_custom_info = results.get_unread() - data_system_custom_info["software version"] = data_system_custom_info[ - "UNICORNVersion" - ] - data_system_custom_info.pop("UNICORNVersion") - metadata.data_system_custom_info.update(data_system_custom_info) + metadata.data_system_custom_info.update(results.get_unread()) return metadata diff --git a/src/allotropy/parsers/utils/strict_xml_element.py b/src/allotropy/parsers/utils/strict_xml_element.py index 05e454a729..9bb06f423e 100644 --- a/src/allotropy/parsers/utils/strict_xml_element.py +++ b/src/allotropy/parsers/utils/strict_xml_element.py @@ -231,7 +231,8 @@ def get_unread( continue self._mark_processed_keys_as_read(matching_keys, unread_keys) - return unread_keys + + return dict(sorted(unread_keys.items())) def _get_all_attribute_keys(self) -> set[str]: """Get all attribute keys with appropriate prefixes.""" diff --git a/tests/parsers/cytiva_unicorn/testdata/unicorn_1.json b/tests/parsers/cytiva_unicorn/testdata/unicorn_1.json index 936dd58bc8..a8160c3333 100644 --- a/tests/parsers/cytiva_unicorn/testdata/unicorn_1.json +++ b/tests/parsers/cytiva_unicorn/testdata/unicorn_1.json @@ -128,9 +128,9 @@ "value": 1.691657, "unit": "S/m" }, - "StartPeakLimitType": "BaseLine", "EndPeakLimitType": "DropLine", - "IsStandardPeak": "false" + "IsStandardPeak": "false", + "StartPeakLimitType": "BaseLine" } }, { @@ -217,9 +217,9 @@ "value": 1.700847, "unit": "S/m" }, - "StartPeakLimitType": "DropLine", "EndPeakLimitType": "DropLine", - "IsStandardPeak": "false" + "IsStandardPeak": "false", + "StartPeakLimitType": "DropLine" } }, { @@ -306,9 +306,9 @@ "value": 1.701128, "unit": "S/m" }, - "StartPeakLimitType": "DropLine", "EndPeakLimitType": "DropLine", - "IsStandardPeak": "false" + "IsStandardPeak": "false", + "StartPeakLimitType": "DropLine" } }, { @@ -395,30 +395,30 @@ "value": 1.701361, "unit": "S/m" }, - "StartPeakLimitType": "DropLine", "EndPeakLimitType": "DropLine", - "IsStandardPeak": "false" + "IsStandardPeak": "false", + "StartPeakLimitType": "DropLine" } } ] }, "custom information document": { - "IsOriginalData": "true", - "MethodStartTime": "2024-01-02T11:00:00.000", + "AmplitudePrecision": "3", "AmplitudeUnit": "mAU", + "ChromatogramStartTime": "2024-01-02T11:00:00.000", "ChromatogramStartTimeUtcOffsetMinutes": "-300", - "AmplitudePrecision": "3", + "ColumnVolumeUnitName": "ml", "CurveDataType": "UV", + "CurveNumber": "1", + "DistanceBetweenPoints": "0.001666667", + "IsExternal": "false", + "IsOriginalData": "true", "IsReadOnly": "false", - "MethodStartTimeUtcOffsetMinutes": "-300", - "ColumnVolumeUnitName": "ml", "IsoChroneType": "Time", - "CurveNumber": "1", - "ChromatogramStartTime": "2024-01-02T11:00:00.000", + "MethodStartTime": "2024-01-02T11:00:00.000", + "MethodStartTimeUtcOffsetMinutes": "-300", "TimeUnit": "min", "VolumeUnit": "ml", - "IsExternal": "false", - "DistanceBetweenPoints": "0.001666667", "DistanceToStartPoint": "0.06833267" } } @@ -677,22 +677,22 @@ } }, "custom information document": { - "IsOriginalData": "true", - "MethodStartTime": "2024-01-02T11:00:00.000", + "AmplitudePrecision": "2", "AmplitudeUnit": "mS/cm", + "ChromatogramStartTime": "2024-01-02T11:00:00.000", "ChromatogramStartTimeUtcOffsetMinutes": "-300", - "AmplitudePrecision": "2", + "ColumnVolumeUnitName": "ml", "CurveDataType": "Conduction", + "CurveNumber": "4", + "DistanceBetweenPoints": "0.003333333", + "IsExternal": "false", + "IsOriginalData": "true", "IsReadOnly": "false", - "MethodStartTimeUtcOffsetMinutes": "-300", - "ColumnVolumeUnitName": "ml", "IsoChroneType": "Time", - "CurveNumber": "4", - "ChromatogramStartTime": "2024-01-02T11:00:00.000", + "MethodStartTime": "2024-01-02T11:00:00.000", + "MethodStartTimeUtcOffsetMinutes": "-300", "TimeUnit": "min", "VolumeUnit": "ml", - "IsExternal": "false", - "DistanceBetweenPoints": "0.003333333", "DistanceToStartPoint": "0" } } @@ -1059,22 +1059,22 @@ } }, "custom information document": { - "IsOriginalData": "true", - "MethodStartTime": "2024-01-02T11:00:00.000", + "AmplitudePrecision": "3", "AmplitudeUnit": "MPa", + "ChromatogramStartTime": "2024-01-02T11:00:00.000", "ChromatogramStartTimeUtcOffsetMinutes": "-300", - "AmplitudePrecision": "3", + "ColumnVolumeUnitName": "ml", "CurveDataType": "Pressure", + "CurveNumber": "27", + "DistanceBetweenPoints": "0.01666667", + "IsExternal": "false", + "IsOriginalData": "true", "IsReadOnly": "false", - "MethodStartTimeUtcOffsetMinutes": "-300", - "ColumnVolumeUnitName": "ml", "IsoChroneType": "Time", - "CurveNumber": "27", - "ChromatogramStartTime": "2024-01-02T11:00:00.000", + "MethodStartTime": "2024-01-02T11:00:00.000", + "MethodStartTimeUtcOffsetMinutes": "-300", "TimeUnit": "min", "VolumeUnit": "ml", - "IsExternal": "false", - "DistanceBetweenPoints": "0.01666667", "DistanceToStartPoint": "0.08499908" } } @@ -1365,8 +1365,8 @@ "fraction role": "Out-Waste", "@type": "Fraction", "custom information document": { - "InstructionFeedback": "0", - "EventSubType": "Undefined" + "EventSubType": "Undefined", + "InstructionFeedback": "0" } }, { @@ -1381,8 +1381,8 @@ }, "@type": "Method", "custom information document": { - "InstructionFeedback": "0", - "EventSubType": "Undefined" + "EventSubType": "Undefined", + "InstructionFeedback": "0" } }, { @@ -1397,8 +1397,8 @@ }, "@type": "Method", "custom information document": { - "InstructionFeedback": "0", - "EventSubType": "Undefined" + "EventSubType": "Undefined", + "InstructionFeedback": "0" } }, { @@ -1413,8 +1413,8 @@ }, "@type": "Method", "custom information document": { - "InstructionFeedback": "0", - "EventSubType": "Undefined" + "EventSubType": "Undefined", + "InstructionFeedback": "0" } }, { @@ -1429,8 +1429,8 @@ }, "@type": "Method", "custom information document": { - "InstructionFeedback": "0", - "EventSubType": "Undefined" + "EventSubType": "Undefined", + "InstructionFeedback": "0" } }, { @@ -1445,8 +1445,8 @@ }, "@type": "Method", "custom information document": { - "InstructionFeedback": "0", - "EventSubType": "Undefined" + "EventSubType": "Undefined", + "InstructionFeedback": "0" } }, { @@ -1462,8 +1462,8 @@ "fraction role": "Frac", "@type": "Fraction", "custom information document": { - "InstructionFeedback": "0", - "EventSubType": "Undefined" + "EventSubType": "Undefined", + "InstructionFeedback": "0" } }, { @@ -1479,8 +1479,8 @@ "fraction role": "Out-Waste", "@type": "Fraction", "custom information document": { - "InstructionFeedback": "0", - "EventSubType": "Undefined" + "EventSubType": "Undefined", + "InstructionFeedback": "0" } } ] @@ -3300,15 +3300,13 @@ ] }, "custom information document": { - "FormatVersion": "9", - "CreatedUtcOffsetMinutes": "-300", - "TimeUnit": "min", - "IsReadonly": "false", - "VolumeUnit": "ml", - "Created": "2024-01-01T10:00:00.000", - "ChromatogramName": "Chrom.1", "ChromatogramID": "100", - "software version": "7.7.0.4016" + "ChromatogramName": "Chrom.1", + "Created": "2024-01-01T10:00:00.000", + "CreatedUtcOffsetMinutes": "-300", + "FormatVersion": "9", + "RunIndex": "100", + "RunType": "Method" } }, "analyst": "Default" @@ -3318,28 +3316,28 @@ "ASM converter name": "allotropy_cytiva_unicorn", "ASM converter version": "0.1.102", "file name": "unicorn_1.zip", + "software version": "100.100.100.100", "UNC path": "tests/parsers/cytiva_unicorn/testdata/unicorn_1.zip", "custom information document": { - "IsArchived": "false", + "BatchId": "f65ef0a9-7240-434e-aac1-44cb8e8faa08", + "FolderPath": "/DefaultHome", "FormatVersion": "100", - "SystemTypeName": "NEXTAKTAchromatography", - "ResultState": "Evaluated", + "IsArchived": "false", "IsReadOnly": "false", - "BatchId": "f65ef0a9-7240-434e-aac1-44cb8e8faa08", - "ResultPurpose": "100", - "RunIndex": "100", "Name": "Capto Adhere Polishing 100ppm Sample", - "RunType": "Method", - "FolderPath": "/DefaultHome", "ResultFormatVersion": "100", - "software version": "100.100.100.100" + "ResultPurpose": "100", + "ResultState": "Evaluated" } }, "device system document": { "asset management identifier": "AKTA avant", "product manufacturer": "Cytiva Life Sciences", "device identifier": "Avant1", - "firmware version": "100.100.100.100" + "firmware version": "100.100.100.100", + "custom information document": { + "SystemTypeName": "NEXTAKTAchromatography" + } } } } From f27c273f1039dc1fa58dd755f3f74bf863752a9b Mon Sep 17 00:00:00 2001 From: Felipe Narvaez Date: Mon, 11 Aug 2025 09:07:51 -0500 Subject: [PATCH 4/4] Moved Name and removed BatchId --- .../parsers/cytiva_unicorn/structure/measurement_group.py | 1 + src/allotropy/parsers/cytiva_unicorn/structure/metadata.py | 4 +++- tests/parsers/cytiva_unicorn/testdata/unicorn_1.json | 3 +-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/allotropy/parsers/cytiva_unicorn/structure/measurement_group.py b/src/allotropy/parsers/cytiva_unicorn/structure/measurement_group.py index db18465294..2279889762 100644 --- a/src/allotropy/parsers/cytiva_unicorn/structure/measurement_group.py +++ b/src/allotropy/parsers/cytiva_unicorn/structure/measurement_group.py @@ -81,6 +81,7 @@ def create_measurement_groups( { "RunIndex": results.get_sub_text_or_none("RunIndex"), "RunType": results.get_sub_text_or_none("RunType"), + "Name": results.get_sub_text_or_none("Name"), } ) custom_info_sorted = dict(sorted(custom_info.items())) diff --git a/src/allotropy/parsers/cytiva_unicorn/structure/metadata.py b/src/allotropy/parsers/cytiva_unicorn/structure/metadata.py index a936693989..f89e88cd35 100644 --- a/src/allotropy/parsers/cytiva_unicorn/structure/metadata.py +++ b/src/allotropy/parsers/cytiva_unicorn/structure/metadata.py @@ -36,7 +36,9 @@ def create_metadata( system_name = results.find_or_none("SystemName") firmware_version = instrument_config_data.find_or_none("FirmwareVersion") - results.mark_read({"element:RunIndex", "element:RunType"}) + results.mark_read( + {"element:RunIndex", "element:RunType", "element:BatchId", "element:Name"} + ) metadata = Metadata( asset_management_identifier=instrument_config.get_attr("Description"), diff --git a/tests/parsers/cytiva_unicorn/testdata/unicorn_1.json b/tests/parsers/cytiva_unicorn/testdata/unicorn_1.json index a8160c3333..6569403ac5 100644 --- a/tests/parsers/cytiva_unicorn/testdata/unicorn_1.json +++ b/tests/parsers/cytiva_unicorn/testdata/unicorn_1.json @@ -3305,6 +3305,7 @@ "Created": "2024-01-01T10:00:00.000", "CreatedUtcOffsetMinutes": "-300", "FormatVersion": "9", + "Name": "Capto Adhere Polishing 100ppm Sample", "RunIndex": "100", "RunType": "Method" } @@ -3319,12 +3320,10 @@ "software version": "100.100.100.100", "UNC path": "tests/parsers/cytiva_unicorn/testdata/unicorn_1.zip", "custom information document": { - "BatchId": "f65ef0a9-7240-434e-aac1-44cb8e8faa08", "FolderPath": "/DefaultHome", "FormatVersion": "100", "IsArchived": "false", "IsReadOnly": "false", - "Name": "Capto Adhere Polishing 100ppm Sample", "ResultFormatVersion": "100", "ResultPurpose": "100", "ResultState": "Evaluated"