From 51caf6a9ef630e33b6656cc8e4ae8de2d4f99dde Mon Sep 17 00:00:00 2001 From: Nathan Stender Date: Mon, 18 May 2026 16:31:52 -0400 Subject: [PATCH] fix: Support bare "UV" curve name in Cytiva Unicorn parser UNICORN 7.7 instruments with a single UV detector export the absorbance curve as just "UV" rather than "UV 1_280". The parser regex `^UV 1_\d+$` failed to match, raising "Unable to find curve data for absorbance measurement." Changes: - Update AbsorbanceMeasurement1 regex to `^UV( 1_\d+)?$` to match both "UV" and "UV 1_280" naming styles - Make all absorbance measurements optional (return None instead of raising) consistent with how other measurement types behave Co-Authored-By: Claude Opus 4.6 --- .../structure/measurements/absorbance.py | 35 +- .../testdata/unicorn_single_uv.json | 1038 +++++++++++++++++ .../testdata/unicorn_single_uv.zip | Bin 0 -> 9040 bytes 3 files changed, 1055 insertions(+), 18 deletions(-) create mode 100644 tests/parsers/cytiva_unicorn/testdata/unicorn_single_uv.json create mode 100644 tests/parsers/cytiva_unicorn/testdata/unicorn_single_uv.zip diff --git a/src/allotropy/parsers/cytiva_unicorn/structure/measurements/absorbance.py b/src/allotropy/parsers/cytiva_unicorn/structure/measurements/absorbance.py index 78108662d..ad8023795 100644 --- a/src/allotropy/parsers/cytiva_unicorn/structure/measurements/absorbance.py +++ b/src/allotropy/parsers/cytiva_unicorn/structure/measurements/absorbance.py @@ -37,7 +37,7 @@ StrictXmlElement, ) from allotropy.parsers.utils.uuids import random_uuid_str -from allotropy.parsers.utils.values import assert_not_none, quantity_or_none +from allotropy.parsers.utils.values import quantity_or_none class AbsorbanceMeasurement(UnicornMeasurement): @@ -56,25 +56,24 @@ def create_or_none( handler: UnicornZipHandler, elements: list[StrictXmlElement], static_docs: StaticDocs, - ) -> UnicornMeasurement: - element = assert_not_none( - cls.filter_curve_or_none(elements, cls.get_curve_regex()), - "Unable to find curve data for absorbance measurement.", + ) -> UnicornMeasurement | None: + element = cls.filter_curve_or_none(elements, cls.get_curve_regex()) + if element is None: + return None + data_cube = cls.get_data_cube_or_none( + handler, + element, + DataCubeComponent( + type_=FieldComponentDatatype.float, + concept="absorbance", + unit="mAU", + ), ) + if data_cube is None: + return None measurement = cls.get_measurement( static_docs=static_docs, - chromatogram_data_cube=assert_not_none( - cls.get_data_cube_or_none( - handler, - element, - DataCubeComponent( - type_=FieldComponentDatatype.float, - concept="absorbance", - unit="mAU", - ), - ), - msg="Unable to find information to create absorbance data cubes.", - ), + chromatogram_data_cube=data_cube, device_control_docs=[ DeviceControlDoc( device_type=DEVICE_TYPE, @@ -93,7 +92,7 @@ def create_or_none( class AbsorbanceMeasurement1(AbsorbanceMeasurement): @classmethod def get_curve_regex(cls) -> str: - return r"^UV 1_\d+$" + return r"^UV( 1_\d+)?$" @classmethod def get_peaks_custom_info( diff --git a/tests/parsers/cytiva_unicorn/testdata/unicorn_single_uv.json b/tests/parsers/cytiva_unicorn/testdata/unicorn_single_uv.json new file mode 100644 index 000000000..cf86617f4 --- /dev/null +++ b/tests/parsers/cytiva_unicorn/testdata/unicorn_single_uv.json @@ -0,0 +1,1038 @@ +{ + "$asm.manifest": "http://purl.allotrope.org/manifests/liquid-chromatography/BENCHLING/2023/09/liquid-chromatography.manifest", + "liquid chromatography aggregate document": { + "data system document": { + "ASM converter name": "allotropy_cytiva_unicorn", + "ASM converter version": "0.1.126", + "file name": "unicorn_single_uv.zip", + "software version": "7.7.0.4016", + "UNC path": "tests/parsers/cytiva_unicorn/testdata/unicorn_single_uv.zip", + "custom information document": { + "Created": "2025-01-15T10:00:00.000", + "CreatedBy": "TestUser", + "CreatedUtcOffsetMinutes": "0", + "FolderPath": "/TestHome/TestSystem", + "IsArchived": "false", + "IsArchivingAllowed": "true", + "IsLegacy": "false", + "IsReadOnly": "false", + "LastModified": "2025-01-15T12:00:00.000", + "LastModifiedBy": "System", + "LastModifiedUtcOffsetMinutes": "0", + "ResultFormatVersion": "7", + "ResultPurpose": "0", + "ResultState": "Normal" + } + }, + "device system document": { + "asset management identifier": "AKTA pure 25", + "product manufacturer": "Cytiva Life Sciences", + "device identifier": "TestSystem 1000000", + "firmware version": "4.24.2.0", + "custom information document": { + "SystemTypeName": "NEXTAKTAchromatography" + } + }, + "liquid chromatography document": [ + { + "measurement aggregate document": { + "measurement document": [ + { + "device control aggregate document": { + "device control document": [ + { + "device type": "HPLC", + "start time setting": "2025-01-15T10:00:00+00:00", + "custom information document": { + "ColumnVolume": "120.0", + "ScanInterval": "0" + } + } + ] + }, + "sample document": { + "sample identifier": "N/A", + "batch identifier": "00000000-0000-0000-0000-000000000001" + }, + "chromatography column document": {}, + "measurement identifier": "CYTIVA_UNICORN_TEST_ID_1", + "injection document": { + "autosampler injection volume setting (chromatography)": { + "value": -0.0, + "unit": "mm^3" + }, + "injection identifier": "CYTIVA_UNICORN_TEST_ID_0", + "injection time": "2025-01-15T10:00:00+00:00" + }, + "chromatogram data cube": { + "label": "UV", + "cube-structure": { + "dimensions": [ + { + "@componentDatatype": "float", + "concept": "retention volume", + "unit": "mL" + } + ], + "measures": [ + { + "@componentDatatype": "float", + "concept": "absorbance", + "unit": "mAU" + } + ] + }, + "data": { + "measures": [ + [ + -8.779904132896689e-16, + -9.905489243514781e-14, + -1.9386643135501458e-28, + -1.1690488170032824e-27, + -1.8128472515473384e+31, 124049170432.0, + 5.660722758593639e-12, + -9.509998699193579e+24, + 1.2026155169784375e+32, + 1.2731467239367115e+19, + -2.7687974864670687e+25, + 8.800792066595106e-28, + 3.5400303204369266e-06, + -1.8132966288866604e-21, + -8.012610373056493e-20, 372467744.0, + 2.3912650110786074e+27, + -1.6578013612320627e-26, + 1.0505236544628192e+31, + -7.082031121112768e-34, + -11426399232.0, + -0.09713983535766602, + -10.022523880004883, + -1.1787061099036159e-18, + -2.8030835887747055e+31, + 6.5677176333139855e-22, + -1.3044050306407098e-33, + 5.224799481950981e-10, 194.86038208007812, 9351.5634765625, + 1.690576437116928e+17, + -1.6480989870615304e-06, + -2250523136.0, + -3.036104820589636e-36, + -7.218288729436621e+34, 9057403904.0, + 2.464789389377536e+16, + -5.709899261878102e-27, + -29.341920852661133, + -1.115054258441176e-22, + -0.007029683329164982, + -2.8773346372190645e-08, + 5.2289980151979425e+28, + -5.339668859960511e-05, + 9.27702586697199e-31, + -1.3320258434745288e-21, + -7.344149258784954e-29, + 1.1889037681909817e-37, + 2.0560045169629228e-22, + -2608609053638656.0, + -3.3195732069642343e-16, + 4.426004431636996e-30, + -1.1032751241364819e+20, 2605035372412928.0, + 2.8888005558233203e+20, + -2.03699029030168e-19, + -2.2265547120846368e+28, + -3593.765625, + -5.023769798123732e-23, + -2.6361111979897e-20, + 6.83310963491751e-31, + -8.219659832534321e-18, + -6.874758340162624e-31, + -3.2369956799316664e-28, + -3.9920558544198973e-23, + -2.3344832764885828e+27, + 1.118661963722743e-29, 0.00021740517695434391, + -4.516082386524234e-12, + 6.806048754242401e+34, + 2.5855943147495902e-36, + -14876738.0, + -3.2643429062802164e+34, + 1.0783282032021275e-37, + -3.7208509117199605e-28, + 1.7796731346531506e+38, + -3.511289481394897e-09 + ] + ], + "dimensions": [ + [ + 4.6864740797481967e+30, + -6.117306788877559e-37, + -7.211314597944294e-31, + -8.522539647797986e-25, + -1.0688829943361755e-18, + -1.304546965244513e-12, + -1.5605548924213508e-06, + -1.8383867740631104, + -2181904.5, + -2732153372672.0, + -3.330711541359051e+18, + -3.980900181287642e+24, + -4.6864740797481967e+30, + -5.585492918761819e+36, + 6.117306788877559e-37, + 6.653211241110278e-34, + 7.211315068142034e-31, + 7.792375629196435e-28, + 8.522540633874118e-25, + 9.582696555196635e-22, + 1.068883097733752e-18, + 1.1842540218525376e-15, + 1.3045470736647302e-12, + 1.4299036399378906e-09, + 1.5605550061081885e-06, 0.0016966540133580565, 1.8383868932724, 1985.9456787109375, 2181904.75, 2451194624.0, 2732153634816.0, 3025186790047744.0, + 3.3307118162369577e+18, + 3.649087478498148e+21, + 3.980900469518018e+24, + 4.326538609719227e+27, + 4.6864743819796516e+30, + 5.061194985069378e+33, + 5.585493552587119e+36, + -1.8522882983175697e-38, + -6.117307237293067e-37, + -2.0183334143903717e-35, + -6.653211241110278e-34, + -2.1912817779748373e-32, + -7.211315068142034e-31, + -2.3713691029646684e-29, + -7.792375629196435e-28, + -2.558838441249898e-26, + -8.522540633874118e-25, + -2.860902838169333e-23, + -9.582696555196635e-22, + -3.203361289040449e-20, + -1.068883097733752e-18, + -3.5606098655185933e-17, + -1.1842540218525376e-15, + -3.933161237565201e-14, + -1.3045470736647302e-12, + -4.3215441641875074e-11, + -1.4299036399378906e-09, + -4.7262130209446696e-08, + -1.5605550061081885e-06, + -5.147909905645065e-05, + -0.0016966540133580565, + -0.05587125942111015, + -1.8383868932724, + -60.4445915222168, + -1985.9456787109375, + -65205.26171875, + -2181904.75, + -73210392.0, + -2451194624.0, + -81909014528.0, + -2732153634816.0, + -90983001751552.0, + -3025186790047744.0, + -1.0044536076946637e+17, + -3.3307118162369577e+18 + ] + ] + } + } + }, + { + "device control aggregate document": { + "device control document": [ + { + "device type": "HPLC", + "start time setting": "2025-01-15T10:00:00+00:00", + "custom information document": { + "ColumnVolume": "120.0", + "ScanInterval": "0" + } + } + ] + }, + "sample document": { + "sample identifier": "N/A", + "batch identifier": "00000000-0000-0000-0000-000000000001" + }, + "chromatography column document": {}, + "measurement identifier": "CYTIVA_UNICORN_TEST_ID_2", + "injection document": { + "autosampler injection volume setting (chromatography)": { + "value": -0.0, + "unit": "mm^3" + }, + "injection identifier": "CYTIVA_UNICORN_TEST_ID_0", + "injection time": "2025-01-15T10:00:00+00:00" + }, + "chromatogram data cube": { + "label": "Cond", + "cube-structure": { + "dimensions": [ + { + "@componentDatatype": "float", + "concept": "retention volume", + "unit": "mL" + } + ], + "measures": [ + { + "@componentDatatype": "float", + "concept": "electric conductivity", + "unit": "S/m" + } + ] + }, + "data": { + "measures": [ + [ + -4.587564908433706e-05, + -1.0825943401698545e-19, + 1.832207668594073e+36, + -4.610734710697173e-12, + -3.185059465623316e-20, + -3.908668351009282e-27, + -1.5252796359277454e-09, 41483592584396.8, + -8.569889965045652e-20, + -4.281196908095808e-09, + -7.680089556856173e+36, + 5.430429994568442e-11, + -3.235371195842163e-07, + 3.8340340559502026e-14, + -1.6735362643217696e-18, + -2.350578499205058e-13, + 7.260980261492022e-10, 5361484.4, + 1.7131277357118482e-16, + -5.112981149579809e-10, 0.15691910982131957, + 1.0516928699559929e-35, + -0.001818573847413063, + 3.6730796110525107e-39, 443459276.8, + -2.381548263381772e-32, + 1.922240103355033e-29, + -5.481079864501953, + -0.3957840442657471, + -97082.0125, 2947.1626953125, + -4.453610939489754e+28, + -8.23953423960788e+20, + 7.136299295787885e+25, + 3.3495717355469085e+30, 59938.0125, + -8.126985990862452e-18, + -8.459484134434144e+17, + -1.2458550600058515e-07, + -0.12990190982818603, + 2.0111840868674826e+23, 39.99238586425781, + -258.089111328125, + -2.0614871978759766, + -4.463884982935867e-36, + -2.7261648433549506e-25, + -0.015250876545906067, + -2.5981413654778445e-29, + 1.981532697439662e-28, + 9.807966079688438e+35, + 1.9393636950120854e+36, 5699019787468.8, + 4.8651500122680354e-30, + -1.9913136843808947e-16, + 7.335811473725061e-40, + -3.6955181344185645e-27, + -1.8440353510119286e-38, + 1.0611393605332236e+26, + -1.9755509588488026e-35, + -362490259046.4, 11237016.8, + -6.64356889501505e-08, + -2.5135126988354318e-39, + -4.896621047622883e-33, + -8.474703747050234e-34, + 7.349509082646768e-24, + -0.00033046756871044634, + 1.537744320856064e+16, + 7.137866643599345e-35, + 1.0636069873726228e-07, + -1.145904025179334e-05, + -2.253495445803111e-11, + -91623027.2, + -1.4998401937798845e-37, + -1.310683066149666e-18, + 2.6762822205067757e+17, 189167330918.4] + ], + "dimensions": [ + [ + 4.6864740797481967e+30, + -6.117306788877559e-37, + -7.211314597944294e-31, + -8.522539647797986e-25, + -1.0688829943361755e-18, + -1.304546965244513e-12, + -1.5605548924213508e-06, + -1.8383867740631104, + -2181904.5, + -2732153372672.0, + -3.330711541359051e+18, + -3.980900181287642e+24, + -4.6864740797481967e+30, + -5.585492918761819e+36, + 6.117306788877559e-37, + 6.653211241110278e-34, + 7.211315068142034e-31, + 7.792375629196435e-28, + 8.522540633874118e-25, + 9.582696555196635e-22, + 1.068883097733752e-18, + 1.1842540218525376e-15, + 1.3045470736647302e-12, + 1.4299036399378906e-09, + 1.5605550061081885e-06, 0.0016966540133580565, 1.8383868932724, 1985.9456787109375, 2181904.75, 2451194624.0, 2732153634816.0, 3025186790047744.0, + 3.3307118162369577e+18, + 3.649087478498148e+21, + 3.980900469518018e+24, + 4.326538609719227e+27, + 4.6864743819796516e+30, + 5.061194985069378e+33, + 5.585493552587119e+36, + -1.8522882983175697e-38, + -6.117307237293067e-37, + -2.0183334143903717e-35, + -6.653211241110278e-34, + -2.1912817779748373e-32, + -7.211315068142034e-31, + -2.3713691029646684e-29, + -7.792375629196435e-28, + -2.558838441249898e-26, + -8.522540633874118e-25, + -2.860902838169333e-23, + -9.582696555196635e-22, + -3.203361289040449e-20, + -1.068883097733752e-18, + -3.5606098655185933e-17, + -1.1842540218525376e-15, + -3.933161237565201e-14, + -1.3045470736647302e-12, + -4.3215441641875074e-11, + -1.4299036399378906e-09, + -4.7262130209446696e-08, + -1.5605550061081885e-06, + -5.147909905645065e-05, + -0.0016966540133580565, + -0.05587125942111015, + -1.8383868932724, + -60.4445915222168, + -1985.9456787109375, + -65205.26171875, + -2181904.75, + -73210392.0, + -2451194624.0, + -81909014528.0, + -2732153634816.0, + -90983001751552.0, + -3025186790047744.0, + -1.0044536076946637e+17, + -3.3307118162369577e+18 + ] + ] + } + } + }, + { + "device control aggregate document": { + "device control document": [ + { + "device type": "HPLC", + "start time setting": "2025-01-15T10:00:00+00:00", + "custom information document": { + "ColumnVolume": "120.0", + "ScanInterval": "0" + } + } + ] + }, + "sample document": { + "sample identifier": "N/A", + "batch identifier": "00000000-0000-0000-0000-000000000001" + }, + "chromatography column document": {}, + "measurement identifier": "CYTIVA_UNICORN_TEST_ID_3", + "injection document": { + "autosampler injection volume setting (chromatography)": { + "value": -0.0, + "unit": "mm^3" + }, + "injection identifier": "CYTIVA_UNICORN_TEST_ID_0", + "injection time": "2025-01-15T10:00:00+00:00" + }, + "chromatogram data cube": { + "label": "pH", + "cube-structure": { + "dimensions": [ + { + "@componentDatatype": "float", + "concept": "retention volume", + "unit": "mL" + } + ], + "measures": [ + { + "@componentDatatype": "float", + "concept": "pH", + "unit": "pH" + } + ] + }, + "data": { + "measures": [ + [ + -1.6781575981804342e-37, + -5.456536911196963e-08, + -2.9529924606215876e-30, + -0.09990932047367096, + 1.241106620142167e-37, + -4.127025049574458e-26, + -8.713503664119862e-38, + -9.602953469304426e-14, + -7.86301437189434e-37, + 3.888606639605244e+21, + 9.095133596295559e-26, + 1.8945112862394747e-27, + -2911065604096.0, + -177.07911682128906, + -77.07080841064453, + 2.5041475367332922e-21, + -1.3549938060464228e-08, + 5.080034355203916e+36, + -2.608235211346663e-20, 581796.125, + 4.6033165288798826e+23, 2077.01611328125, + -5.881804464619509e-22, + -5.000349993437466e-29, + -9.11849621975099e+19, + 2.6351036471710674e-22, + -2.795117357966454e-38, + -1.0863269917417927e-30, + -0.009245694614946842, + -0.39286237955093384, + -7.422554517688695e-06, + 7.282814721550913e-27, + -6919.7822265625, + -0.0003240797377657145, + 7.036490530867856e-13, + -13.295473098754883, + -5.792023658752441, + -2.7371339786710913e-13, + -3.460763403008368e+26, + 2.8539551824048705e-23, + -1.6537902232556523e-13, + -2.286704269486661e+37, + -2.2887611990366606e-34, + 6.645519196778136e+18, + -0.0028553162701427937, + -3.4806863803060016e-32, + 9.907128798480488e+21, + 2.080302947456668e-22, + 6.52785667127062e+32, + -8368.564453125, + 4.681295659777235e+19, 3572842752.0, + -2.269198440263409e-10, + -8.449145569920179e-27, + -4.4529048440292926e-32, + -1.9658706563406054e-31, + 2.0105652367198867e-29, + -1.3516418221524942e+26, + -1.513098732214276e-18, + -1.8134053094331574e-18, + -1.3307190419031834e-11, + -4.944770807924215e-06, 72069648.0, 317994.0625, + -7.145394218855898e-20, + -9.336119629478493e-38, + -1.7618725455124636e-31, + -3.569967413406524e-20, + -7.466555373980555e-09, + 1.3444204654638833e-34, + 1.5161987949628698e-25, + 1.8014193438545788e-25, + 9.817219566023611e+23, + 1.603495118110219e+23, 0.0007218904793262482, 2512401786208256.0, + -5.538434047587912e+22 + ] + ], + "dimensions": [ + [ + 4.6864740797481967e+30, + -6.117306788877559e-37, + -7.211314597944294e-31, + -8.522539647797986e-25, + -1.0688829943361755e-18, + -1.304546965244513e-12, + -1.5605548924213508e-06, + -1.8383867740631104, + -2181904.5, + -2732153372672.0, + -3.330711541359051e+18, + -3.980900181287642e+24, + -4.6864740797481967e+30, + -5.585492918761819e+36, + 6.117306788877559e-37, + 6.653211241110278e-34, + 7.211315068142034e-31, + 7.792375629196435e-28, + 8.522540633874118e-25, + 9.582696555196635e-22, + 1.068883097733752e-18, + 1.1842540218525376e-15, + 1.3045470736647302e-12, + 1.4299036399378906e-09, + 1.5605550061081885e-06, 0.0016966540133580565, 1.8383868932724, 1985.9456787109375, 2181904.75, 2451194624.0, 2732153634816.0, 3025186790047744.0, + 3.3307118162369577e+18, + 3.649087478498148e+21, + 3.980900469518018e+24, + 4.326538609719227e+27, + 4.6864743819796516e+30, + 5.061194985069378e+33, + 5.585493552587119e+36, + -1.8522882983175697e-38, + -6.117307237293067e-37, + -2.0183334143903717e-35, + -6.653211241110278e-34, + -2.1912817779748373e-32, + -7.211315068142034e-31, + -2.3713691029646684e-29, + -7.792375629196435e-28, + -2.558838441249898e-26, + -8.522540633874118e-25, + -2.860902838169333e-23, + -9.582696555196635e-22, + -3.203361289040449e-20, + -1.068883097733752e-18, + -3.5606098655185933e-17, + -1.1842540218525376e-15, + -3.933161237565201e-14, + -1.3045470736647302e-12, + -4.3215441641875074e-11, + -1.4299036399378906e-09, + -4.7262130209446696e-08, + -1.5605550061081885e-06, + -5.147909905645065e-05, + -0.0016966540133580565, + -0.05587125942111015, + -1.8383868932724, + -60.4445915222168, + -1985.9456787109375, + -65205.26171875, + -2181904.75, + -73210392.0, + -2451194624.0, + -81909014528.0, + -2732153634816.0, + -90983001751552.0, + -3025186790047744.0, + -1.0044536076946637e+17, + -3.3307118162369577e+18 + ] + ] + } + } + }, + { + "device control aggregate document": { + "device control document": [ + { + "device type": "HPLC", + "start time setting": "2025-01-15T10:00:00+00:00", + "system pressure data cube": { + "label": "System pressure", + "cube-structure": { + "dimensions": [ + { + "@componentDatatype": "float", + "concept": "retention volume", + "unit": "mL" + } + ], + "measures": [ + { + "@componentDatatype": "float", + "concept": "system pressure", + "unit": "MPa" + } + ] + }, + "data": { + "measures": [ + [ + 2.583887240489044e-18, + -4.237457275390625, + -2.472808080939944e-15, + -3.425842515874037e-32, + 1.6131004635351753e-17, + -1.5665204895082075e-32, + 2.656045118198604e+35, + -182013.015625, + 9.953494796179866e+16, + -5.800925818935044e-30, + -1.6234338215023163e-36, + -3.4942448744395702e+19, + -0.4865284264087677, + -3.744156493680493e-27, + 1.7100751076044308e+18, + 1.1168263689700262e+32, + 5.9687777520544584e-15, + -11219.814453125, + 2.8054180786329157e-30, + -9.417171023191031e-25, + -4.4961700041312724e-05, 0.00034972463618032634, + -2.289138954076286e-27, + -1.565142316513252e-37, + -5.385310253291919e-13, + -2.885540055703607e-31, 0.08369113504886627, + 9.057435856483503e-22, 1323.7266845703125, 0.05554414540529251, + -1.3841966137182674e-32, + 1.5735525729643207e-11, + 4.889237772367348e-20, + 1.0904421142271107e+33, + 4.572240272180152e+37, + -9.823052810657761e-29, + 8.737620601454232e-26, + 2.8045632605917496e+35, 791156.125, + -7.25756369064634e-13, + -1.1115138879589204e-36, + -1.594042023418224e-37, + -4.8404016773471194e+20, + -1.1375494304859144e-38, + 7.644277192579013e-14, + 6.2688529616379e+25, + -0.00853210873901844, + 2.084401736111827e+23, + 1.6262583393474827e-22, + -1.546110048926608e-38, + 1.2224832971696742e-05, + 1.3451770999078912e+16, + -0.012390198186039925, + 4.981926091355913e-23, + -2.9524693489074707, + -5.437215122583439e-07, + -1.0721878345305049e-21, + -2.2047672417344553e+18, + 6.460115147916636e-19, + -1.430146668536334e+25, + 5.03536177386007e-25, + -9.265306166253773e-34, + -7.590584110652255e+21, + -2.3156735337115088e+38, + -2.7713185004750625e-14, + 2.4308456053033932e-26, + -6.201260555746741e-18, + -2.9037525065861903e+20, 0.0352327860891819, + -4.178158606526713e-32, + 1.534293614995286e+36, + -2.3152771366774516e-10, + -1.6615016889528128e-27, + -3.019226296418685e-19, + -3.705044563130738e+20, + -1.5014129489663037e-30, + -1.2882494245306898e-25 + ] + ], + "dimensions": [ + [ + 4.6864740797481967e+30, + -6.117306788877559e-37, + -7.211314597944294e-31, + -8.522539647797986e-25, + -1.0688829943361755e-18, + -1.304546965244513e-12, + -1.5605548924213508e-06, + -1.8383867740631104, + -2181904.5, + -2732153372672.0, + -3.330711541359051e+18, + -3.980900181287642e+24, + -4.6864740797481967e+30, + -5.585492918761819e+36, + 6.117306788877559e-37, + 6.653211241110278e-34, + 7.211315068142034e-31, + 7.792375629196435e-28, + 8.522540633874118e-25, + 9.582696555196635e-22, + 1.068883097733752e-18, + 1.1842540218525376e-15, + 1.3045470736647302e-12, + 1.4299036399378906e-09, + 1.5605550061081885e-06, 0.0016966540133580565, 1.8383868932724, 1985.9456787109375, 2181904.75, 2451194624.0, 2732153634816.0, 3025186790047744.0, + 3.3307118162369577e+18, + 3.649087478498148e+21, + 3.980900469518018e+24, + 4.326538609719227e+27, + 4.6864743819796516e+30, + 5.061194985069378e+33, + 5.585493552587119e+36, + -1.8522882983175697e-38, + -6.117307237293067e-37, + -2.0183334143903717e-35, + -6.653211241110278e-34, + -2.1912817779748373e-32, + -7.211315068142034e-31, + -2.3713691029646684e-29, + -7.792375629196435e-28, + -2.558838441249898e-26, + -8.522540633874118e-25, + -2.860902838169333e-23, + -9.582696555196635e-22, + -3.203361289040449e-20, + -1.068883097733752e-18, + -3.5606098655185933e-17, + -1.1842540218525376e-15, + -3.933161237565201e-14, + -1.3045470736647302e-12, + -4.3215441641875074e-11, + -1.4299036399378906e-09, + -4.7262130209446696e-08, + -1.5605550061081885e-06, + -5.147909905645065e-05, + -0.0016966540133580565, + -0.05587125942111015, + -1.8383868932724, + -60.4445915222168, + -1985.9456787109375, + -65205.26171875, + -2181904.75, + -73210392.0, + -2451194624.0, + -81909014528.0, + -2732153634816.0, + -90983001751552.0, + -3025186790047744.0, + -1.0044536076946637e+17, + -3.3307118162369577e+18 + ] + ] + } + } + } + ] + }, + "sample document": { + "sample identifier": "N/A", + "batch identifier": "00000000-0000-0000-0000-000000000001" + }, + "chromatography column document": {}, + "measurement identifier": "CYTIVA_UNICORN_TEST_ID_5", + "injection document": { + "autosampler injection volume setting (chromatography)": { + "value": -0.0, + "unit": "mm^3" + }, + "injection identifier": "CYTIVA_UNICORN_TEST_ID_0", + "injection time": "2025-01-15T10:00:00+00:00" + } + }, + { + "device control aggregate document": { + "device control document": [ + { + "device type": "HPLC", + "start time setting": "2025-01-15T10:00:00+00:00", + "temperature profile data cube": { + "label": "Cond temp", + "cube-structure": { + "dimensions": [ + { + "@componentDatatype": "float", + "concept": "retention volume", + "unit": "mL" + } + ], + "measures": [ + { + "@componentDatatype": "float", + "concept": "temperature", + "unit": "degC" + } + ] + }, + "data": { + "measures": [ + [ + -0.15535834431648254, + 6.612495721279651e+22, + 7.814610863841552e+36, + 5.234529254494191e-08, + -8.79901022346231e+25, + 7.266053603028323e-37, + -4.850421447222629e-35, + -2.0160526189471117e-25, + -1.1056356176912325e-20, + -6.258785364493624e-21, + 3.7553019465651593e-28, 6292.53173828125, + -4.199450631858781e-05, + 1.1695780062560256e+17, + 1.1403147315292017e-09, + -4.029545586092809e-09, + 1.70791641441424e-31, 0.003153220284730196, + 2.9720733373495494e+22, + -2.6540185831918314e-24, + 4.087559786446574e+33, + 1.3813322727546055e-18, + 5.497530513378447e-35, + -1.3683507735450304e-31, + -8.139626975445844e+24, + -4.840645062792557e-17, + -5.904210018812982e-31, + 1.2376629011401194e-37, + 2.851705443645454e-34, + -3391.140869140625, + 7.323825319712299e-26, + 9.782320499743689e-27, + -3.885155667778876e-18, + -0.059357888996601105, + -2868.07861328125, + -2.7944140320386647e-25, + 2.0838081286155773e-25, + 1.4472266873900932e-35, + -1.968051827176063e-22, + 1.5895527452571599e+19, + 7.83075996624652e-14, + -7.351665090027382e-07, + 6.824536491478739e-09, 2253.015869140625, + -1.6694348351349868e-28, 0.0037666705902665854, + -1.5985736467882816e-07, 0.15216922760009766, 0.00846868846565485, + -7.918695582945612e-38, + -3.6653047617486e-26, + 1.6393181042290919e+25, + -3.7380528450012207, + 9.804477322270293e-26, + -2.1521734345283716e+22, + -2.0949577142492792e-11, + -2.6126716790031423e-08, + -5.156036853790283, + -2.4448523587193607e-22, + -31.224729537963867, + -7.540139453056452e-33, + -1.0857377219508635e-08, 638209622016.0, + -19430.12890625, + -8.03430524404014e+26, + 1.249124373990736e+18, + -27.536258697509766, 50793291776.0, + 2.0190026397033538e+36, + -3.2034577926080733e-32, + 1.5572079519188264e-06, + 6.955093367775454e+35, + 2.8075211222109008e+25, + -1.7442746980123047e-07, + -1.8749392639208824e-28, + -1.1371420174124476e+20, + -0.14557363092899323 + ] + ], + "dimensions": [ + [ + 4.6864740797481967e+30, + -6.117306788877559e-37, + -7.211314597944294e-31, + -8.522539647797986e-25, + -1.0688829943361755e-18, + -1.304546965244513e-12, + -1.5605548924213508e-06, + -1.8383867740631104, + -2181904.5, + -2732153372672.0, + -3.330711541359051e+18, + -3.980900181287642e+24, + -4.6864740797481967e+30, + -5.585492918761819e+36, + 6.117306788877559e-37, + 6.653211241110278e-34, + 7.211315068142034e-31, + 7.792375629196435e-28, + 8.522540633874118e-25, + 9.582696555196635e-22, + 1.068883097733752e-18, + 1.1842540218525376e-15, + 1.3045470736647302e-12, + 1.4299036399378906e-09, + 1.5605550061081885e-06, 0.0016966540133580565, 1.8383868932724, 1985.9456787109375, 2181904.75, 2451194624.0, 2732153634816.0, 3025186790047744.0, + 3.3307118162369577e+18, + 3.649087478498148e+21, + 3.980900469518018e+24, + 4.326538609719227e+27, + 4.6864743819796516e+30, + 5.061194985069378e+33, + 5.585493552587119e+36, + -1.8522882983175697e-38, + -6.117307237293067e-37, + -2.0183334143903717e-35, + -6.653211241110278e-34, + -2.1912817779748373e-32, + -7.211315068142034e-31, + -2.3713691029646684e-29, + -7.792375629196435e-28, + -2.558838441249898e-26, + -8.522540633874118e-25, + -2.860902838169333e-23, + -9.582696555196635e-22, + -3.203361289040449e-20, + -1.068883097733752e-18, + -3.5606098655185933e-17, + -1.1842540218525376e-15, + -3.933161237565201e-14, + -1.3045470736647302e-12, + -4.3215441641875074e-11, + -1.4299036399378906e-09, + -4.7262130209446696e-08, + -1.5605550061081885e-06, + -5.147909905645065e-05, + -0.0016966540133580565, + -0.05587125942111015, + -1.8383868932724, + -60.4445915222168, + -1985.9456787109375, + -65205.26171875, + -2181904.75, + -73210392.0, + -2451194624.0, + -81909014528.0, + -2732153634816.0, + -90983001751552.0, + -3025186790047744.0, + -1.0044536076946637e+17, + -3.3307118162369577e+18 + ] + ] + } + }, + "custom information document": { + "ColumnVolume": "120.0", + "ScanInterval": "0" + } + } + ] + }, + "sample document": { + "sample identifier": "N/A", + "batch identifier": "00000000-0000-0000-0000-000000000001" + }, + "chromatography column document": {}, + "measurement identifier": "CYTIVA_UNICORN_TEST_ID_7", + "injection document": { + "autosampler injection volume setting (chromatography)": { + "value": -0.0, + "unit": "mm^3" + }, + "injection identifier": "CYTIVA_UNICORN_TEST_ID_0", + "injection time": "2025-01-15T10:00:00+00:00" + } + } + ], + "fraction aggregate document": { + "fraction document": [] + }, + "log aggregate document": { + "log document": [] + }, + "custom information document": { + "RunIndex": "0", + "RunType": "Method", + "Name": "TestRun_001", + "ChromatogramID": "1", + "ChromatogramName": "Chrom.1", + "Created": "2025-01-15T10:00:00.000", + "CreatedUtcOffsetMinutes": "0", + "FormatVersion": "9" + } + } + } + ] + } +} diff --git a/tests/parsers/cytiva_unicorn/testdata/unicorn_single_uv.zip b/tests/parsers/cytiva_unicorn/testdata/unicorn_single_uv.zip new file mode 100644 index 0000000000000000000000000000000000000000..5269342225c89aa5a3e0f08b4bcbac6379f7d4e0 GIT binary patch literal 9040 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 MFH