diff --git a/src/allotropy/parsers/beckman_coulter_biomek/beckman_coulter_biomek_reader.py b/src/allotropy/parsers/beckman_coulter_biomek/beckman_coulter_biomek_reader.py index 990ba7af2e..0ccb889f4b 100644 --- a/src/allotropy/parsers/beckman_coulter_biomek/beckman_coulter_biomek_reader.py +++ b/src/allotropy/parsers/beckman_coulter_biomek/beckman_coulter_biomek_reader.py @@ -1,3 +1,6 @@ +import re +from typing import ClassVar + import pandas as pd from allotropy.named_file_contents import NamedFileContents @@ -11,18 +14,85 @@ class BeckmanCoulterBiomekReader: header: SeriesData data: pd.DataFrame + # Fixed column names based on headerless files + FIXED_COLUMN_NAMES: ClassVar[list[str]] = [ + "Time Stamp", + "Pod", + "Transfer Step", + "Deck Position", + "Labware Name", + "Labware Barcode", + "Well Index", + "Sample Name", + "Probe", + "Amount", + "Liquid Handling Technique", + ] + + def _looks_like_data_line(self, line: str) -> bool: + """ + Check if a line looks like data rather than metadata. + Data lines should have a date/time pattern as the first field. + """ + parts = line.split(",") + if len(parts) < 3: + return False + + first_part = parts[0].strip() + # Check if first part looks like a timestamp (contains numbers and slashes or dashes) + # Examples: "08/15/2025 10:59:55", "9/4/24 14:15" + timestamp_pattern = r"^\d{1,2}[/-]\d{1,2}[/-]\d{2,4}\s+\d{1,2}:\d{2}" + return bool(re.match(timestamp_pattern, first_part)) + def __init__(self, named_file_contents: NamedFileContents) -> None: reader = CsvReader.create(named_file_contents) - header_lines = list(reader.pop_until(".*Well Index.*")) - header_dict = {} - for line in header_lines: - split = line.split(",")[0].split("=", maxsplit=1) - if len(split) != 2: - continue - header_dict[split[0].strip()] = split[1].strip() - - self.header = SeriesData(pd.Series(header_dict)) - self.data = assert_not_none( - reader.pop_csv_block_as_df(header="infer"), "Cannot parse empty dataset" - ) + # Check if this file has a header line by looking for "Well Index" + has_header_line = any("Well Index" in line for line in reader.lines) + + if has_header_line: + header_lines = list(reader.pop_until(".*Well Index.*")) + header_dict = {} + for line in header_lines: + split = line.split(",")[0].split("=", maxsplit=1) + if len(split) != 2: + continue + header_dict[split[0].strip()] = split[1].strip() + + self.header = SeriesData(pd.Series(header_dict)) + self.data = assert_not_none( + reader.pop_csv_block_as_df(header="infer"), "Cannot parse empty dataset" + ) + else: + # Handle headerless files + header_lines = [] + data_lines = [] + + for raw_line in reader.lines: + line = raw_line.strip() + if not line: + continue + + if self._looks_like_data_line(line): + data_lines.append(line) + else: + header_lines.append(line) + + # Parse header metadata + header_dict = {} + for line in header_lines: + split = line.split(",")[0].split("=", maxsplit=1) + if len(split) != 2: + continue + header_dict[split[0].strip()] = split[1].strip() + + self.header = SeriesData(pd.Series(header_dict)) + + # Create a new reader with just the data lines + data_reader = CsvReader(data_lines) + self.data = assert_not_none( + data_reader.pop_csv_block_as_df( + header=None, names=self.FIXED_COLUMN_NAMES + ), + "Cannot parse empty dataset", + ) diff --git a/src/allotropy/parsers/beckman_coulter_biomek/beckman_coulter_biomek_structure.py b/src/allotropy/parsers/beckman_coulter_biomek/beckman_coulter_biomek_structure.py index 0100fd4519..09cdb9c3b9 100644 --- a/src/allotropy/parsers/beckman_coulter_biomek/beckman_coulter_biomek_structure.py +++ b/src/allotropy/parsers/beckman_coulter_biomek/beckman_coulter_biomek_structure.py @@ -51,10 +51,14 @@ def _create_measurement( identifier=random_uuid_str(), measurement_time=dispense_data[str, "Time Stamp"], sample_identifier=NOT_APPLICABLE, - source_plate=aspiration_data[str, "Labware Barcode"], + source_plate=aspiration_data.get( + str, "Labware Barcode", validate=SeriesData.NOT_NAN + ), source_well=aspiration_data[str, "Well Index"], source_location=aspiration_data[str, "Deck Position"], - destination_plate=dispense_data[str, "Labware Barcode"], + destination_plate=dispense_data.get( + str, "Labware Barcode", validate=SeriesData.NOT_NAN + ), destination_well=dispense_data[str, "Well Index"], destination_location=dispense_data[str, "Deck Position"], aspiration_volume=aspiration_data[float, "Amount"], diff --git a/tests/parsers/beckman_coulter_biomek/testdata/example_03.json b/tests/parsers/beckman_coulter_biomek/testdata/example_03.json new file mode 100644 index 0000000000..8bd40bf0dd --- /dev/null +++ b/tests/parsers/beckman_coulter_biomek/testdata/example_03.json @@ -0,0 +1,810 @@ +{ + "$asm.manifest": "http://purl.allotrope.org/manifests/liquid-handler/BENCHLING/2024/11/liquid-handler.manifest", + "liquid handler aggregate document": { + "liquid handler document": [ + { + "measurement aggregate document": { + "measurement document": [ + { + "device control aggregate document": { + "device control document": [ + { + "device type": "liquid handler", + "custom information document": { + "probe": "1", + "pod": "Pod2", + "source labware name": "Box1", + "destination labware name": "Masterplate", + "source liquid handling technique": "MB_CryovialTo96", + "destination liquid handling technique": "MB_CryovialTo96" + } + } + ] + }, + "sample document": { + "sample identifier": "N/A", + "source location identifier": "P6", + "destination location identifier": "P11", + "source well location identifier": "1", + "destination well location identifier": "1" + }, + "measurement identifier": "BECKMAN_COULTER_BIOMEK_TEST_ID_0", + "measurement time": "2025-08-15T11:00:21+00:00", + "aspiration volume": { + "value": 220.0, + "unit": "μL" + }, + "transfer volume": { + "value": 220.0, + "unit": "μL" + } + }, + { + "device control aggregate document": { + "device control document": [ + { + "device type": "liquid handler", + "custom information document": { + "probe": "2", + "pod": "Pod2", + "source labware name": "Box1", + "destination labware name": "Masterplate", + "source liquid handling technique": "MB_CryovialTo96", + "destination liquid handling technique": "MB_CryovialTo96" + } + } + ] + }, + "sample document": { + "sample identifier": "N/A", + "source location identifier": "P6", + "destination location identifier": "P11", + "source well location identifier": "7", + "destination well location identifier": "13" + }, + "measurement identifier": "BECKMAN_COULTER_BIOMEK_TEST_ID_1", + "measurement time": "2025-08-15T11:00:21+00:00", + "aspiration volume": { + "value": 220.0, + "unit": "μL" + }, + "transfer volume": { + "value": 220.0, + "unit": "μL" + } + }, + { + "device control aggregate document": { + "device control document": [ + { + "device type": "liquid handler", + "custom information document": { + "probe": "3", + "pod": "Pod2", + "source labware name": "Box1", + "destination labware name": "Masterplate", + "source liquid handling technique": "MB_CryovialTo96", + "destination liquid handling technique": "MB_CryovialTo96" + } + } + ] + }, + "sample document": { + "sample identifier": "N/A", + "source location identifier": "P6", + "destination location identifier": "P11", + "source well location identifier": "13", + "destination well location identifier": "25" + }, + "measurement identifier": "BECKMAN_COULTER_BIOMEK_TEST_ID_2", + "measurement time": "2025-08-15T11:00:21+00:00", + "aspiration volume": { + "value": 220.0, + "unit": "μL" + }, + "transfer volume": { + "value": 220.0, + "unit": "μL" + } + }, + { + "device control aggregate document": { + "device control document": [ + { + "device type": "liquid handler", + "custom information document": { + "probe": "4", + "pod": "Pod2", + "source labware name": "Box1", + "destination labware name": "Masterplate", + "source liquid handling technique": "MB_CryovialTo96", + "destination liquid handling technique": "MB_CryovialTo96" + } + } + ] + }, + "sample document": { + "sample identifier": "N/A", + "source location identifier": "P6", + "destination location identifier": "P11", + "source well location identifier": "19", + "destination well location identifier": "37" + }, + "measurement identifier": "BECKMAN_COULTER_BIOMEK_TEST_ID_3", + "measurement time": "2025-08-15T11:00:21+00:00", + "aspiration volume": { + "value": 220.0, + "unit": "μL" + }, + "transfer volume": { + "value": 220.0, + "unit": "μL" + } + }, + { + "device control aggregate document": { + "device control document": [ + { + "device type": "liquid handler", + "custom information document": { + "probe": "5", + "pod": "Pod2", + "source labware name": "Box1", + "destination labware name": "Masterplate", + "source liquid handling technique": "MB_CryovialTo96", + "destination liquid handling technique": "MB_CryovialTo96" + } + } + ] + }, + "sample document": { + "sample identifier": "N/A", + "source location identifier": "P6", + "destination location identifier": "P11", + "source well location identifier": "2", + "destination well location identifier": "49" + }, + "measurement identifier": "BECKMAN_COULTER_BIOMEK_TEST_ID_4", + "measurement time": "2025-08-15T11:00:21+00:00", + "aspiration volume": { + "value": 220.0, + "unit": "μL" + }, + "transfer volume": { + "value": 220.0, + "unit": "μL" + } + }, + { + "device control aggregate document": { + "device control document": [ + { + "device type": "liquid handler", + "custom information document": { + "probe": "6", + "pod": "Pod2", + "source labware name": "Box1", + "destination labware name": "Masterplate", + "source liquid handling technique": "MB_CryovialTo96", + "destination liquid handling technique": "MB_CryovialTo96" + } + } + ] + }, + "sample document": { + "sample identifier": "N/A", + "source location identifier": "P6", + "destination location identifier": "P11", + "source well location identifier": "8", + "destination well location identifier": "61" + }, + "measurement identifier": "BECKMAN_COULTER_BIOMEK_TEST_ID_5", + "measurement time": "2025-08-15T11:00:21+00:00", + "aspiration volume": { + "value": 220.0, + "unit": "μL" + }, + "transfer volume": { + "value": 220.0, + "unit": "μL" + } + }, + { + "device control aggregate document": { + "device control document": [ + { + "device type": "liquid handler", + "custom information document": { + "probe": "7", + "pod": "Pod2", + "source labware name": "Box1", + "destination labware name": "Masterplate", + "source liquid handling technique": "MB_CryovialTo96", + "destination liquid handling technique": "MB_CryovialTo96" + } + } + ] + }, + "sample document": { + "sample identifier": "N/A", + "source location identifier": "P6", + "destination location identifier": "P11", + "source well location identifier": "14", + "destination well location identifier": "73" + }, + "measurement identifier": "BECKMAN_COULTER_BIOMEK_TEST_ID_6", + "measurement time": "2025-08-15T11:00:21+00:00", + "aspiration volume": { + "value": 220.0, + "unit": "μL" + }, + "transfer volume": { + "value": 220.0, + "unit": "μL" + } + }, + { + "device control aggregate document": { + "device control document": [ + { + "device type": "liquid handler", + "custom information document": { + "probe": "8", + "pod": "Pod2", + "source labware name": "Box1", + "destination labware name": "Masterplate", + "source liquid handling technique": "MB_CryovialTo96", + "destination liquid handling technique": "MB_CryovialTo96" + } + } + ] + }, + "sample document": { + "sample identifier": "N/A", + "source location identifier": "P6", + "destination location identifier": "P11", + "source well location identifier": "20", + "destination well location identifier": "85" + }, + "measurement identifier": "BECKMAN_COULTER_BIOMEK_TEST_ID_7", + "measurement time": "2025-08-15T11:00:21+00:00", + "aspiration volume": { + "value": 220.0, + "unit": "μL" + }, + "transfer volume": { + "value": 220.0, + "unit": "μL" + } + }, + { + "device control aggregate document": { + "device control document": [ + { + "device type": "liquid handler", + "custom information document": { + "probe": "1", + "pod": "Pod2", + "source labware name": "Box1", + "destination labware name": "Masterplate", + "source liquid handling technique": "MB_CryovialTo96", + "destination liquid handling technique": "MB_CryovialTo96" + } + } + ] + }, + "sample document": { + "sample identifier": "N/A", + "source location identifier": "P6", + "destination location identifier": "P11", + "source well location identifier": "3", + "destination well location identifier": "2" + }, + "measurement identifier": "BECKMAN_COULTER_BIOMEK_TEST_ID_8", + "measurement time": "2025-08-15T11:01:11+00:00", + "aspiration volume": { + "value": 220.0, + "unit": "μL" + }, + "transfer volume": { + "value": 220.0, + "unit": "μL" + } + }, + { + "device control aggregate document": { + "device control document": [ + { + "device type": "liquid handler", + "custom information document": { + "probe": "2", + "pod": "Pod2", + "source labware name": "Box1", + "destination labware name": "Masterplate", + "source liquid handling technique": "MB_CryovialTo96", + "destination liquid handling technique": "MB_CryovialTo96" + } + } + ] + }, + "sample document": { + "sample identifier": "N/A", + "source location identifier": "P6", + "destination location identifier": "P11", + "source well location identifier": "9", + "destination well location identifier": "14" + }, + "measurement identifier": "BECKMAN_COULTER_BIOMEK_TEST_ID_9", + "measurement time": "2025-08-15T11:01:11+00:00", + "aspiration volume": { + "value": 220.0, + "unit": "μL" + }, + "transfer volume": { + "value": 220.0, + "unit": "μL" + } + }, + { + "device control aggregate document": { + "device control document": [ + { + "device type": "liquid handler", + "custom information document": { + "probe": "3", + "pod": "Pod2", + "source labware name": "Box1", + "destination labware name": "Masterplate", + "source liquid handling technique": "MB_CryovialTo96", + "destination liquid handling technique": "MB_CryovialTo96" + } + } + ] + }, + "sample document": { + "sample identifier": "N/A", + "source location identifier": "P6", + "destination location identifier": "P11", + "source well location identifier": "15", + "destination well location identifier": "26" + }, + "measurement identifier": "BECKMAN_COULTER_BIOMEK_TEST_ID_10", + "measurement time": "2025-08-15T11:01:11+00:00", + "aspiration volume": { + "value": 220.0, + "unit": "μL" + }, + "transfer volume": { + "value": 220.0, + "unit": "μL" + } + }, + { + "device control aggregate document": { + "device control document": [ + { + "device type": "liquid handler", + "custom information document": { + "probe": "4", + "pod": "Pod2", + "source labware name": "Box1", + "destination labware name": "Masterplate", + "source liquid handling technique": "MB_CryovialTo96", + "destination liquid handling technique": "MB_CryovialTo96" + } + } + ] + }, + "sample document": { + "sample identifier": "N/A", + "source location identifier": "P6", + "destination location identifier": "P11", + "source well location identifier": "21", + "destination well location identifier": "38" + }, + "measurement identifier": "BECKMAN_COULTER_BIOMEK_TEST_ID_11", + "measurement time": "2025-08-15T11:01:11+00:00", + "aspiration volume": { + "value": 220.0, + "unit": "μL" + }, + "transfer volume": { + "value": 220.0, + "unit": "μL" + } + }, + { + "device control aggregate document": { + "device control document": [ + { + "device type": "liquid handler", + "custom information document": { + "probe": "5", + "pod": "Pod2", + "source labware name": "Box1", + "destination labware name": "Masterplate", + "source liquid handling technique": "MB_CryovialTo96", + "destination liquid handling technique": "MB_CryovialTo96" + } + } + ] + }, + "sample document": { + "sample identifier": "N/A", + "source location identifier": "P6", + "destination location identifier": "P11", + "source well location identifier": "4", + "destination well location identifier": "50" + }, + "measurement identifier": "BECKMAN_COULTER_BIOMEK_TEST_ID_12", + "measurement time": "2025-08-15T11:01:11+00:00", + "aspiration volume": { + "value": 220.0, + "unit": "μL" + }, + "transfer volume": { + "value": 220.0, + "unit": "μL" + } + }, + { + "device control aggregate document": { + "device control document": [ + { + "device type": "liquid handler", + "custom information document": { + "probe": "6", + "pod": "Pod2", + "source labware name": "Box1", + "destination labware name": "Masterplate", + "source liquid handling technique": "MB_CryovialTo96", + "destination liquid handling technique": "MB_CryovialTo96" + } + } + ] + }, + "sample document": { + "sample identifier": "N/A", + "source location identifier": "P6", + "destination location identifier": "P11", + "source well location identifier": "10", + "destination well location identifier": "62" + }, + "measurement identifier": "BECKMAN_COULTER_BIOMEK_TEST_ID_13", + "measurement time": "2025-08-15T11:01:11+00:00", + "aspiration volume": { + "value": 220.0, + "unit": "μL" + }, + "transfer volume": { + "value": 220.0, + "unit": "μL" + } + }, + { + "device control aggregate document": { + "device control document": [ + { + "device type": "liquid handler", + "custom information document": { + "probe": "7", + "pod": "Pod2", + "source labware name": "Box1", + "destination labware name": "Masterplate", + "source liquid handling technique": "MB_CryovialTo96", + "destination liquid handling technique": "MB_CryovialTo96" + } + } + ] + }, + "sample document": { + "sample identifier": "N/A", + "source location identifier": "P6", + "destination location identifier": "P11", + "source well location identifier": "16", + "destination well location identifier": "74" + }, + "measurement identifier": "BECKMAN_COULTER_BIOMEK_TEST_ID_14", + "measurement time": "2025-08-15T11:01:11+00:00", + "aspiration volume": { + "value": 220.0, + "unit": "μL" + }, + "transfer volume": { + "value": 220.0, + "unit": "μL" + } + }, + { + "device control aggregate document": { + "device control document": [ + { + "device type": "liquid handler", + "custom information document": { + "probe": "8", + "pod": "Pod2", + "source labware name": "Box1", + "destination labware name": "Masterplate", + "source liquid handling technique": "MB_CryovialTo96", + "destination liquid handling technique": "MB_CryovialTo96" + } + } + ] + }, + "sample document": { + "sample identifier": "N/A", + "source location identifier": "P6", + "destination location identifier": "P11", + "source well location identifier": "22", + "destination well location identifier": "86" + }, + "measurement identifier": "BECKMAN_COULTER_BIOMEK_TEST_ID_15", + "measurement time": "2025-08-15T11:01:11+00:00", + "aspiration volume": { + "value": 220.0, + "unit": "μL" + }, + "transfer volume": { + "value": 220.0, + "unit": "μL" + } + }, + { + "device control aggregate document": { + "device control document": [ + { + "device type": "liquid handler", + "custom information document": { + "probe": "1", + "pod": "Pod2", + "source labware name": "Box1", + "destination labware name": "Masterplate", + "source liquid handling technique": "MB_CryovialTo96", + "destination liquid handling technique": "MB_CryovialTo96" + } + } + ] + }, + "sample document": { + "sample identifier": "N/A", + "source location identifier": "P6", + "destination location identifier": "P11", + "source well location identifier": "5", + "destination well location identifier": "3" + }, + "measurement identifier": "BECKMAN_COULTER_BIOMEK_TEST_ID_16", + "measurement time": "2025-08-15T11:02:01+00:00", + "aspiration volume": { + "value": 220.0, + "unit": "μL" + }, + "transfer volume": { + "value": 220.0, + "unit": "μL" + } + }, + { + "device control aggregate document": { + "device control document": [ + { + "device type": "liquid handler", + "custom information document": { + "probe": "2", + "pod": "Pod2", + "source labware name": "Box1", + "destination labware name": "Masterplate", + "source liquid handling technique": "MB_CryovialTo96", + "destination liquid handling technique": "MB_CryovialTo96" + } + } + ] + }, + "sample document": { + "sample identifier": "N/A", + "source location identifier": "P6", + "destination location identifier": "P11", + "source well location identifier": "11", + "destination well location identifier": "15" + }, + "measurement identifier": "BECKMAN_COULTER_BIOMEK_TEST_ID_17", + "measurement time": "2025-08-15T11:02:01+00:00", + "aspiration volume": { + "value": 220.0, + "unit": "μL" + }, + "transfer volume": { + "value": 220.0, + "unit": "μL" + } + }, + { + "device control aggregate document": { + "device control document": [ + { + "device type": "liquid handler", + "custom information document": { + "probe": "3", + "pod": "Pod2", + "source labware name": "Box1", + "destination labware name": "Masterplate", + "source liquid handling technique": "MB_CryovialTo96", + "destination liquid handling technique": "MB_CryovialTo96" + } + } + ] + }, + "sample document": { + "sample identifier": "N/A", + "source location identifier": "P6", + "destination location identifier": "P11", + "source well location identifier": "17", + "destination well location identifier": "27" + }, + "measurement identifier": "BECKMAN_COULTER_BIOMEK_TEST_ID_18", + "measurement time": "2025-08-15T11:02:01+00:00", + "aspiration volume": { + "value": 220.0, + "unit": "μL" + }, + "transfer volume": { + "value": 220.0, + "unit": "μL" + } + }, + { + "device control aggregate document": { + "device control document": [ + { + "device type": "liquid handler", + "custom information document": { + "probe": "4", + "pod": "Pod2", + "source labware name": "Box1", + "destination labware name": "Masterplate", + "source liquid handling technique": "MB_CryovialTo96", + "destination liquid handling technique": "MB_CryovialTo96" + } + } + ] + }, + "sample document": { + "sample identifier": "N/A", + "source location identifier": "P6", + "destination location identifier": "P11", + "source well location identifier": "23", + "destination well location identifier": "39" + }, + "measurement identifier": "BECKMAN_COULTER_BIOMEK_TEST_ID_19", + "measurement time": "2025-08-15T11:02:01+00:00", + "aspiration volume": { + "value": 220.0, + "unit": "μL" + }, + "transfer volume": { + "value": 220.0, + "unit": "μL" + } + }, + { + "device control aggregate document": { + "device control document": [ + { + "device type": "liquid handler", + "custom information document": { + "probe": "5", + "pod": "Pod2", + "source labware name": "Box1", + "destination labware name": "Masterplate", + "source liquid handling technique": "MB_CryovialTo96", + "destination liquid handling technique": "MB_CryovialTo96" + } + } + ] + }, + "sample document": { + "sample identifier": "N/A", + "source location identifier": "P6", + "destination location identifier": "P11", + "source well location identifier": "6", + "destination well location identifier": "51" + }, + "measurement identifier": "BECKMAN_COULTER_BIOMEK_TEST_ID_20", + "measurement time": "2025-08-15T11:02:01+00:00", + "aspiration volume": { + "value": 220.0, + "unit": "μL" + }, + "transfer volume": { + "value": 220.0, + "unit": "μL" + } + }, + { + "device control aggregate document": { + "device control document": [ + { + "device type": "liquid handler", + "custom information document": { + "probe": "6", + "pod": "Pod2", + "source labware name": "Box1", + "destination labware name": "Masterplate", + "source liquid handling technique": "MB_CryovialTo96", + "destination liquid handling technique": "MB_CryovialTo96" + } + } + ] + }, + "sample document": { + "sample identifier": "N/A", + "source location identifier": "P6", + "destination location identifier": "P11", + "source well location identifier": "12", + "destination well location identifier": "63" + }, + "measurement identifier": "BECKMAN_COULTER_BIOMEK_TEST_ID_21", + "measurement time": "2025-08-15T11:02:01+00:00", + "aspiration volume": { + "value": 220.0, + "unit": "μL" + }, + "transfer volume": { + "value": 220.0, + "unit": "μL" + } + }, + { + "device control aggregate document": { + "device control document": [ + { + "device type": "liquid handler", + "custom information document": { + "probe": "7", + "pod": "Pod2", + "source labware name": "Box1", + "destination labware name": "Masterplate", + "source liquid handling technique": "MB_CryovialTo96", + "destination liquid handling technique": "MB_CryovialTo96" + } + } + ] + }, + "sample document": { + "sample identifier": "N/A", + "source location identifier": "P6", + "destination location identifier": "P11", + "source well location identifier": "18", + "destination well location identifier": "75" + }, + "measurement identifier": "BECKMAN_COULTER_BIOMEK_TEST_ID_22", + "measurement time": "2025-08-15T11:02:01+00:00", + "aspiration volume": { + "value": 220.0, + "unit": "μL" + }, + "transfer volume": { + "value": 220.0, + "unit": "μL" + } + } + ], + "analytical method identifier": "Cryovial to 96W Plate\\LabElite 5ml to 96 1ml FullPlate 99999999" + }, + "analyst": "robolab" + } + ], + "data system document": { + "ASM file identifier": "example_03.json", + "data system instance identifier": "N/A", + "file name": "example_03.log", + "UNC path": "tests/parsers/beckman_coulter_biomek/testdata/example_03.log", + "ASM converter name": "allotropy_beckman_coulter_biomek", + "ASM converter version": "0.1.105", + "software name": "BioMek Software" + }, + "device system document": { + "equipment serial number": "", + "product manufacturer": "Beckman Coulter" + } + } +} diff --git a/tests/parsers/beckman_coulter_biomek/testdata/example_03.log b/tests/parsers/beckman_coulter_biomek/testdata/example_03.log new file mode 100644 index 0000000000..367decb458 --- /dev/null +++ b/tests/parsers/beckman_coulter_biomek/testdata/example_03.log @@ -0,0 +1,55 @@ +Method = Cryovial to 96W Plate\LabElite 5ml to 96 1ml FullPlate 99999999 +Logged in user = robolab +Started 08/15/2025 10:59:31 +Unit serial number = +Pod1 head serial number = None +Pod Last validated 10/05/2015 16:42:43 +Pod2 head serial number = None +Pod Last validated 10/05/2015 16:40:53 + +08/15/2025 10:59:55,Pod2,Aspirate,P6,Box1,,2,,5,220,MB_CryovialTo96 +08/15/2025 10:59:55,Pod2,Aspirate,P6,Box1,,8,,6,220,MB_CryovialTo96 +08/15/2025 10:59:55,Pod2,Aspirate,P6,Box1,,14,,7,220,MB_CryovialTo96 +08/15/2025 10:59:55,Pod2,Aspirate,P6,Box1,,20,,8,220,MB_CryovialTo96 +08/15/2025 11:00:09,Pod2,Aspirate,P6,Box1,,1,,1,220,MB_CryovialTo96 +08/15/2025 11:00:09,Pod2,Aspirate,P6,Box1,,7,,2,220,MB_CryovialTo96 +08/15/2025 11:00:09,Pod2,Aspirate,P6,Box1,,13,,3,220,MB_CryovialTo96 +08/15/2025 11:00:09,Pod2,Aspirate,P6,Box1,,19,,4,220,MB_CryovialTo96 +08/15/2025 11:00:21,Pod2,Dispense,P11,Masterplate,,1,,1,220,MB_CryovialTo96 +08/15/2025 11:00:21,Pod2,Dispense,P11,Masterplate,,13,,2,220,MB_CryovialTo96 +08/15/2025 11:00:21,Pod2,Dispense,P11,Masterplate,,25,,3,220,MB_CryovialTo96 +08/15/2025 11:00:21,Pod2,Dispense,P11,Masterplate,,37,,4,220,MB_CryovialTo96 +08/15/2025 11:00:21,Pod2,Dispense,P11,Masterplate,,49,,5,220,MB_CryovialTo96 +08/15/2025 11:00:21,Pod2,Dispense,P11,Masterplate,,61,,6,220,MB_CryovialTo96 +08/15/2025 11:00:21,Pod2,Dispense,P11,Masterplate,,73,,7,220,MB_CryovialTo96 +08/15/2025 11:00:21,Pod2,Dispense,P11,Masterplate,,85,,8,220,MB_CryovialTo96 +08/15/2025 11:00:44,Pod2,Aspirate,P6,Box1,,3,,1,220,MB_CryovialTo96 +08/15/2025 11:00:44,Pod2,Aspirate,P6,Box1,,9,,2,220,MB_CryovialTo96 +08/15/2025 11:00:44,Pod2,Aspirate,P6,Box1,,15,,3,220,MB_CryovialTo96 +08/15/2025 11:00:44,Pod2,Aspirate,P6,Box1,,21,,4,220,MB_CryovialTo96 +08/15/2025 11:00:58,Pod2,Aspirate,P6,Box1,,4,,5,220,MB_CryovialTo96 +08/15/2025 11:00:58,Pod2,Aspirate,P6,Box1,,10,,6,220,MB_CryovialTo96 +08/15/2025 11:00:58,Pod2,Aspirate,P6,Box1,,16,,7,220,MB_CryovialTo96 +08/15/2025 11:00:58,Pod2,Aspirate,P6,Box1,,22,,8,220,MB_CryovialTo96 +08/15/2025 11:01:11,Pod2,Dispense,P11,Masterplate,,2,,1,220,MB_CryovialTo96 +08/15/2025 11:01:11,Pod2,Dispense,P11,Masterplate,,14,,2,220,MB_CryovialTo96 +08/15/2025 11:01:11,Pod2,Dispense,P11,Masterplate,,26,,3,220,MB_CryovialTo96 +08/15/2025 11:01:11,Pod2,Dispense,P11,Masterplate,,38,,4,220,MB_CryovialTo96 +08/15/2025 11:01:11,Pod2,Dispense,P11,Masterplate,,50,,5,220,MB_CryovialTo96 +08/15/2025 11:01:11,Pod2,Dispense,P11,Masterplate,,62,,6,220,MB_CryovialTo96 +08/15/2025 11:01:11,Pod2,Dispense,P11,Masterplate,,74,,7,220,MB_CryovialTo96 +08/15/2025 11:01:11,Pod2,Dispense,P11,Masterplate,,86,,8,220,MB_CryovialTo96 +08/15/2025 11:01:34,Pod2,Aspirate,P6,Box1,,5,,1,220,MB_CryovialTo96 +08/15/2025 11:01:34,Pod2,Aspirate,P6,Box1,,11,,2,220,MB_CryovialTo96 +08/15/2025 11:01:34,Pod2,Aspirate,P6,Box1,,17,,3,220,MB_CryovialTo96 +08/15/2025 11:01:34,Pod2,Aspirate,P6,Box1,,23,,4,220,MB_CryovialTo96 +08/15/2025 11:01:48,Pod2,Aspirate,P6,Box1,,6,,5,220,MB_CryovialTo96 +08/15/2025 11:01:48,Pod2,Aspirate,P6,Box1,,12,,6,220,MB_CryovialTo96 +08/15/2025 11:01:48,Pod2,Aspirate,P6,Box1,,18,,7,220,MB_CryovialTo96 +08/15/2025 11:02:01,Pod2,Dispense,P11,Masterplate,,3,,1,220,MB_CryovialTo96 +08/15/2025 11:02:01,Pod2,Dispense,P11,Masterplate,,15,,2,220,MB_CryovialTo96 +08/15/2025 11:02:01,Pod2,Dispense,P11,Masterplate,,27,,3,220,MB_CryovialTo96 +08/15/2025 11:02:01,Pod2,Dispense,P11,Masterplate,,39,,4,220,MB_CryovialTo96 +08/15/2025 11:02:01,Pod2,Dispense,P11,Masterplate,,51,,5,220,MB_CryovialTo96 +08/15/2025 11:02:01,Pod2,Dispense,P11,Masterplate,,63,,6,220,MB_CryovialTo96 +08/15/2025 11:02:01,Pod2,Dispense,P11,Masterplate,,75,,7,220,MB_CryovialTo96 \ No newline at end of file