Skip to content

Commit 00c9c4e

Browse files
committed
feat: add fromZetasizer
1 parent 23e7a69 commit 00c9c4e

File tree

7 files changed

+356
-37
lines changed

7 files changed

+356
-37
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
"dependencies": {
3737
"cheminfo-types": "^1.10.0",
3838
"common-spectrum": "^3.1.0",
39+
"parse-zetasizer": "^1.0.0",
3940
"zmes-parser": "^1.0.0"
4041
},
4142
"devDependencies": {
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Type Sample Name Sizes[1] (d.nm) Sizes[2] (d.nm) Sizes[3] (d.nm) Sizes[4] (d.nm) Sizes[5] (d.nm) Sizes[6] (d.nm) Sizes[7] (d.nm) Sizes[8] (d.nm) Sizes[9] (d.nm) Sizes[10] (d.nm) Sizes[11] (d.nm) Sizes[12] (d.nm) Sizes[13] (d.nm) Sizes[14] (d.nm) Sizes[15] (d.nm) Sizes[16] (d.nm) Sizes[17] (d.nm) Sizes[18] (d.nm) Sizes[19] (d.nm) Sizes[20] (d.nm) Sizes[21] (d.nm) Sizes[22] (d.nm) Sizes[23] (d.nm) Sizes[24] (d.nm) Sizes[25] (d.nm) Sizes[26] (d.nm) Sizes[27] (d.nm) Sizes[28] (d.nm) Sizes[29] (d.nm) Sizes[30] (d.nm) Sizes[31] (d.nm) Sizes[32] (d.nm) Sizes[33] (d.nm) Sizes[34] (d.nm) Sizes[35] (d.nm) Sizes[36] (d.nm) Sizes[37] (d.nm) Sizes[38] (d.nm) Sizes[39] (d.nm) Sizes[40] (d.nm) Sizes[41] (d.nm) Sizes[42] (d.nm) Sizes[43] (d.nm) Sizes[44] (d.nm) Sizes[45] (d.nm) Sizes[46] (d.nm) Sizes[47] (d.nm) Sizes[48] (d.nm) Sizes[49] (d.nm) Sizes[50] (d.nm) Sizes[51] (d.nm) Sizes[52] (d.nm) Sizes[53] (d.nm) Sizes[54] (d.nm) Sizes[55] (d.nm) Sizes[56] (d.nm) Sizes[57] (d.nm) Sizes[58] (d.nm) Sizes[59] (d.nm) Sizes[60] (d.nm) Sizes[61] (d.nm) Sizes[62] (d.nm) Sizes[63] (d.nm) Sizes[64] (d.nm) Sizes[65] (d.nm) Sizes[66] (d.nm) Sizes[67] (d.nm) Sizes[68] (d.nm) Sizes[69] (d.nm) Sizes[70] (d.nm) Intensities[1] (Percent) Intensities[2] (Percent) Intensities[3] (Percent) Intensities[4] (Percent) Intensities[5] (Percent) Intensities[6] (Percent) Intensities[7] (Percent) Intensities[8] (Percent) Intensities[9] (Percent) Intensities[10] (Percent) Intensities[11] (Percent) Intensities[12] (Percent) Intensities[13] (Percent) Intensities[14] (Percent) Intensities[15] (Percent) Intensities[16] (Percent) Intensities[17] (Percent) Intensities[18] (Percent) Intensities[19] (Percent) Intensities[20] (Percent) Intensities[21] (Percent) Intensities[22] (Percent) Intensities[23] (Percent) Intensities[24] (Percent) Intensities[25] (Percent) Intensities[26] (Percent) Intensities[27] (Percent) Intensities[28] (Percent) Intensities[29] (Percent) Intensities[30] (Percent) Intensities[31] (Percent) Intensities[32] (Percent) Intensities[33] (Percent) Intensities[34] (Percent) Intensities[35] (Percent) Intensities[36] (Percent) Intensities[37] (Percent) Intensities[38] (Percent) Intensities[39] (Percent) Intensities[40] (Percent) Intensities[41] (Percent) Intensities[42] (Percent) Intensities[43] (Percent) Intensities[44] (Percent) Intensities[45] (Percent) Intensities[46] (Percent) Intensities[47] (Percent) Intensities[48] (Percent) Intensities[49] (Percent) Intensities[50] (Percent) Intensities[51] (Percent) Intensities[52] (Percent) Intensities[53] (Percent) Intensities[54] (Percent) Intensities[55] (Percent) Intensities[56] (Percent) Intensities[57] (Percent) Intensities[58] (Percent) Intensities[59] (Percent) Intensities[60] (Percent) Intensities[61] (Percent) Intensities[62] (Percent) Intensities[63] (Percent) Intensities[64] (Percent) Intensities[65] (Percent) Intensities[66] (Percent) Intensities[67] (Percent) Intensities[68] (Percent) Intensities[69] (Percent) Intensities[70] (Percent) Volumes[1] (Percent) Volumes[2] (Percent) Volumes[3] (Percent) Volumes[4] (Percent) Volumes[5] (Percent) Volumes[6] (Percent) Volumes[7] (Percent) Volumes[8] (Percent) Volumes[9] (Percent) Volumes[10] (Percent) Volumes[11] (Percent) Volumes[12] (Percent) Volumes[13] (Percent) Volumes[14] (Percent) Volumes[15] (Percent) Volumes[16] (Percent) Volumes[17] (Percent) Volumes[18] (Percent) Volumes[19] (Percent) Volumes[20] (Percent) Volumes[21] (Percent) Volumes[22] (Percent) Volumes[23] (Percent) Volumes[24] (Percent) Volumes[25] (Percent) Volumes[26] (Percent) Volumes[27] (Percent) Volumes[28] (Percent) Volumes[29] (Percent) Volumes[30] (Percent) Volumes[31] (Percent) Volumes[32] (Percent) Volumes[33] (Percent) Volumes[34] (Percent) Volumes[35] (Percent) Volumes[36] (Percent) Volumes[37] (Percent) Volumes[38] (Percent) Volumes[39] (Percent) Volumes[40] (Percent) Volumes[41] (Percent) Volumes[42] (Percent) Volumes[43] (Percent) Volumes[44] (Percent) Volumes[45] (Percent) Volumes[46] (Percent) Volumes[47] (Percent) Volumes[48] (Percent) Volumes[49] (Percent) Volumes[50] (Percent) Volumes[51] (Percent) Volumes[52] (Percent) Volumes[53] (Percent) Volumes[54] (Percent) Volumes[55] (Percent) Volumes[56] (Percent) Volumes[57] (Percent) Volumes[58] (Percent) Volumes[59] (Percent) Volumes[60] (Percent) Volumes[61] (Percent) Volumes[62] (Percent) Volumes[63] (Percent) Volumes[64] (Percent) Volumes[65] (Percent) Volumes[66] (Percent) Volumes[67] (Percent) Volumes[68] (Percent) Volumes[69] (Percent) Volumes[70] (Percent) Numbers[1] (Percent) Numbers[2] (Percent) Numbers[3] (Percent) Numbers[4] (Percent) Numbers[5] (Percent) Numbers[6] (Percent) Numbers[7] (Percent) Numbers[8] (Percent) Numbers[9] (Percent) Numbers[10] (Percent) Numbers[11] (Percent) Numbers[12] (Percent) Numbers[13] (Percent) Numbers[14] (Percent) Numbers[15] (Percent) Numbers[16] (Percent) Numbers[17] (Percent) Numbers[18] (Percent) Numbers[19] (Percent) Numbers[20] (Percent) Numbers[21] (Percent) Numbers[22] (Percent) Numbers[23] (Percent) Numbers[24] (Percent) Numbers[25] (Percent) Numbers[26] (Percent) Numbers[27] (Percent) Numbers[28] (Percent) Numbers[29] (Percent) Numbers[30] (Percent) Numbers[31] (Percent) Numbers[32] (Percent) Numbers[33] (Percent) Numbers[34] (Percent) Numbers[35] (Percent) Numbers[36] (Percent) Numbers[37] (Percent) Numbers[38] (Percent) Numbers[39] (Percent) Numbers[40] (Percent) Numbers[41] (Percent) Numbers[42] (Percent) Numbers[43] (Percent) Numbers[44] (Percent) Numbers[45] (Percent) Numbers[46] (Percent) Numbers[47] (Percent) Numbers[48] (Percent) Numbers[49] (Percent) Numbers[50] (Percent) Numbers[51] (Percent) Numbers[52] (Percent) Numbers[53] (Percent) Numbers[54] (Percent) Numbers[55] (Percent) Numbers[56] (Percent) Numbers[57] (Percent) Numbers[58] (Percent) Numbers[59] (Percent) Numbers[60] (Percent) Numbers[61] (Percent) Numbers[62] (Percent) Numbers[63] (Percent) Numbers[64] (Percent) Numbers[65] (Percent) Numbers[66] (Percent) Numbers[67] (Percent) Numbers[68] (Percent) Numbers[69] (Percent) Numbers[70] (Percent) Sample Name S/W Version Serial Number Measurement Date and Time Record Number Result Origin Viscosity (cP) Temperature (�C) Duration (s) Size Runs Measurement Position (mm) Attenuator Target Measurement Duration (s) Duration Used (s) CPF Cell Compensation Zeta Runs Zeta Analysis Version Analysis Date Attenuation Factor Plate ID Well Row Well Column Plate Wells Actual Transmission Factor Measurement Status Undersize By Intensity[1] (Percent) Undersize By Intensity[2] (Percent) Undersize By Intensity[3] (Percent) Undersize By Intensity[4] (Percent) Undersize By Intensity[5] (Percent) Undersize By Intensity[6] (Percent) Undersize By Intensity[7] (Percent) Undersize By Intensity[8] (Percent) Undersize By Intensity[9] (Percent) Undersize By Intensity[10] (Percent) Undersize By Intensity[11] (Percent) Undersize By Intensity[12] (Percent) Undersize By Intensity[13] (Percent) Undersize By Intensity[14] (Percent) Undersize By Intensity[15] (Percent) Undersize By Intensity[16] (Percent) Undersize By Intensity[17] (Percent) Undersize By Intensity[18] (Percent) Undersize By Intensity[19] (Percent) Undersize By Intensity[20] (Percent) Undersize By Intensity[21] (Percent) Undersize By Intensity[22] (Percent) Undersize By Intensity[23] (Percent) Undersize By Intensity[24] (Percent) Undersize By Intensity[25] (Percent) Undersize By Intensity[26] (Percent) Undersize By Intensity[27] (Percent) Undersize By Intensity[28] (Percent) Undersize By Intensity[29] (Percent) Undersize By Intensity[30] (Percent) Undersize By Intensity[31] (Percent) Undersize By Intensity[32] (Percent) Undersize By Intensity[33] (Percent) Undersize By Intensity[34] (Percent) Undersize By Intensity[35] (Percent) Undersize By Intensity[36] (Percent) Undersize By Intensity[37] (Percent) Undersize By Intensity[38] (Percent) Undersize By Intensity[39] (Percent) Undersize By Intensity[40] (Percent) Undersize By Intensity[41] (Percent) Undersize By Intensity[42] (Percent) Undersize By Intensity[43] (Percent) Undersize By Intensity[44] (Percent) Undersize By Intensity[45] (Percent) Undersize By Intensity[46] (Percent) Undersize By Intensity[47] (Percent) Undersize By Intensity[48] (Percent) Undersize By Intensity[49] (Percent) Undersize By Intensity[50] (Percent) Undersize By Intensity[51] (Percent) Undersize By Intensity[52] (Percent) Undersize By Intensity[53] (Percent) Undersize By Intensity[54] (Percent) Undersize By Intensity[55] (Percent) Undersize By Intensity[56] (Percent) Undersize By Intensity[57] (Percent) Undersize By Intensity[58] (Percent) Undersize By Intensity[59] (Percent) Undersize By Intensity[60] (Percent) Undersize By Intensity[61] (Percent) Undersize By Intensity[62] (Percent) Undersize By Intensity[63] (Percent) Undersize By Intensity[64] (Percent) Undersize By Intensity[65] (Percent) Undersize By Intensity[66] (Percent) Undersize By Intensity[67] (Percent) Undersize By Intensity[68] (Percent) Undersize By Intensity[69] (Percent) Undersize By Intensity[70] (Percent)
2+
Size 20260916_SiNP_7 1 0.4000 0.4632 0.5365 0.6213 0.7195 0.8332 0.9649 1.117 1.294 1.499 1.736 2.010 2.328 2.696 3.122 3.615 4.187 4.849 5.615 6.503 7.531 8.721 10.10 11.70 13.54 15.69 18.17 21.04 24.36 28.21 32.67 37.84 43.82 50.75 58.77 68.06 78.82 91.28 105.7 122.4 141.8 164.2 190.1 220.2 255.0 295.3 342.0 396.1 458.7 531.2 615.1 712.4 825.0 955.4 1106 1281 1484 1718 1990 2305 2669 3091 3580 4145 4801 5560 6439 7456 8635 1.000e4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.8 6.3 14.2 20.5 22.2 18.8 11.9 4.8 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.7 4.9 13.4 20.4 21.4 17.5 11.8 6.5 2.7 0.7 0.1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.1 11.3 23.7 26.3 19.0 10.5 4.7 1.8 0.5 0.1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20260916_SiNP_7 1 8.02 MAL1086580 Wednesday, 25 February 2026 16:02:06 20 Nano series 1.2000 25.0 10 10 3.00 7 100 50 0.00 0 Wednesday, 25 February 2026 16:02:06 0.0126 0 0 0 100 Complete 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.4 3.9 14.2 31.5 52.9 73.4 88.8 97.1 99.8 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0
3+
Size 20260916_SiNP_7 2 0.4000 0.4632 0.5365 0.6213 0.7195 0.8332 0.9649 1.117 1.294 1.499 1.736 2.010 2.328 2.696 3.122 3.615 4.187 4.849 5.615 6.503 7.531 8.721 10.10 11.70 13.54 15.69 18.17 21.04 24.36 28.21 32.67 37.84 43.82 50.75 58.77 68.06 78.82 91.28 105.7 122.4 141.8 164.2 190.1 220.2 255.0 295.3 342.0 396.1 458.7 531.2 615.1 712.4 825.0 955.4 1106 1281 1484 1718 1990 2305 2669 3091 3580 4145 4801 5560 6439 7456 8635 1.000e4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.2 8.0 15.1 20.0 20.9 17.4 11.1 4.7 0.7 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.7 7.8 15.8 20.5 19.8 15.5 10.2 5.6 2.4 0.7 0.1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.7 16.9 25.8 23.6 15.5 8.1 3.6 1.3 0.4 0.1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20260916_SiNP_7 2 8.02 MAL1086580 Wednesday, 25 February 2026 16:03:48 21 Nano series 1.2000 25.0 10 10 3.00 7 100 50 0.00 0 Wednesday, 25 February 2026 16:03:48 0.0126 0 0 0 100 Complete 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.1 6.2 17.8 35.3 55.8 74.9 89.1 97.0 99.6 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0
4+
Size 20260916_SiNP_7 3 0.4000 0.4632 0.5365 0.6213 0.7195 0.8332 0.9649 1.117 1.294 1.499 1.736 2.010 2.328 2.696 3.122 3.615 4.187 4.849 5.615 6.503 7.531 8.721 10.10 11.70 13.54 15.69 18.17 21.04 24.36 28.21 32.67 37.84 43.82 50.75 58.77 68.06 78.82 91.28 105.7 122.4 141.8 164.2 190.1 220.2 255.0 295.3 342.0 396.1 458.7 531.2 615.1 712.4 825.0 955.4 1106 1281 1484 1718 1990 2305 2669 3091 3580 4145 4801 5560 6439 7456 8635 1.000e4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.6 9.0 16.2 20.9 21.1 16.7 9.9 3.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 8.6 16.8 21.1 19.8 15.1 9.5 4.9 1.9 0.4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.1 17.9 26.5 23.4 14.9 7.6 3.2 1.1 0.3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20260916_SiNP_7 3 8.02 MAL1086580 Wednesday, 25 February 2026 16:05:30 22 Nano series 1.2000 25.0 10 10 3.00 7 100 50 0.00 0 Wednesday, 25 February 2026 16:05:30 0.0126 0 0 0 100 Complete 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.3 7.1 19.7 38.3 59.3 78.2 91.5 98.2 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
import { readFileSync } from 'node:fs';
2+
import { join } from 'node:path';
3+
4+
import { expect, test } from 'vitest';
5+
6+
import { fromZetasizer } from '../../index.ts';
7+
8+
const testFilePath = join(import.meta.dirname, 'data/zetasizer.txt');
9+
const text = readFileSync(testFilePath, 'latin1');
10+
11+
test('file produces 3 spectra', () => {
12+
const analysis = fromZetasizer(text);
13+
14+
expect(analysis.spectra).toHaveLength(3);
15+
expect(analysis.spectra[0]?.dataType).toBe('Size measurement');
16+
});
17+
18+
test('x variable contains Sizes data', () => {
19+
const analysis = fromZetasizer(text);
20+
const spectrum = analysis.spectra[0];
21+
22+
expect(spectrum).toBeDefined();
23+
expect(spectrum?.variables.x.data).toBeInstanceOf(Float64Array);
24+
expect(spectrum?.variables.x.data).toHaveLength(70);
25+
expect(spectrum?.variables.x.label).toBe('Particle diameter');
26+
expect(spectrum?.variables.x.units).toBe('nm');
27+
expect(spectrum?.variables.x.isDependent).toBe(false);
28+
expect(spectrum?.variables.x.data[0]).toBeCloseTo(0.4, 5);
29+
expect(spectrum?.variables.x.data[69]).toBeCloseTo(10000, 0);
30+
});
31+
32+
test('y variable contains intensity distribution', () => {
33+
const analysis = fromZetasizer(text);
34+
const spectrum = analysis.spectra[0];
35+
36+
expect(spectrum).toBeDefined();
37+
expect(spectrum?.variables.y.data).toBeInstanceOf(Float64Array);
38+
expect(spectrum?.variables.y.data).toHaveLength(70);
39+
expect(spectrum?.variables.y.label).toBe('Intensity');
40+
expect(spectrum?.variables.y.units).toBe('%');
41+
expect(spectrum?.variables.y.isDependent).toBe(true);
42+
});
43+
44+
test('volume and number variables are present', () => {
45+
const analysis = fromZetasizer(text);
46+
const spectrum = analysis.spectra[0];
47+
48+
expect(spectrum).toBeDefined();
49+
50+
expect(spectrum?.variables.v).toBeDefined();
51+
expect(spectrum?.variables.v?.label).toBe('Volume');
52+
expect(spectrum?.variables.v?.units).toBe('%');
53+
expect(spectrum?.variables.v?.data).toHaveLength(70);
54+
55+
expect(spectrum?.variables.n).toBeDefined();
56+
expect(spectrum?.variables.n?.label).toBe('Number');
57+
expect(spectrum?.variables.n?.data).toHaveLength(70);
58+
});
59+
60+
test('title is extracted from sample name', () => {
61+
const analysis = fromZetasizer(text);
62+
63+
expect(analysis.spectra[0]?.title).toBe('20260916_SiNP_7 1');
64+
expect(analysis.spectra[1]?.title).toBe('20260916_SiNP_7 2');
65+
});
66+
67+
test('meta contains measurement metadata', () => {
68+
const analysis = fromZetasizer(text);
69+
const meta = analysis.spectra[0]?.meta;
70+
71+
expect(meta?.['Measurement Date and Time']).toBe(
72+
'Wednesday, 25 February 2026 16:02:06',
73+
);
74+
expect(meta?.['Record Number']).toBe(20);
75+
expect(meta?.['Result Origin']).toBe('Nano series');
76+
expect(meta?.['Viscosity (cP)']).toBe(1.2);
77+
expect(meta?.['Measurement Status']).toBe('Complete');
78+
});
79+
80+
test('settings contain instrument info', () => {
81+
const analysis = fromZetasizer(text);
82+
const settings = analysis.spectra[0]?.settings;
83+
84+
expect(settings?.instrument).toStrictEqual({
85+
manufacturer: 'Malvern Panalytical',
86+
model: 'Zetasizer',
87+
serialNumber: 'MAL1086580',
88+
software: {
89+
name: 'Zetasizer Nano',
90+
version: '8.02',
91+
},
92+
});
93+
});
94+
95+
test('settings contain measurement parameters', () => {
96+
const analysis = fromZetasizer(text);
97+
const meta = analysis.spectra[0]?.meta;
98+
99+
expect(meta?.['Temperature (°C)']).toBe(25);
100+
expect(meta?.['Duration (s)']).toBe(10);
101+
expect(meta?.['Size Runs']).toBe(10);
102+
expect(meta?.['Measurement Position (mm)']).toBe(3);
103+
expect(meta?.Attenuator).toBe(7);
104+
});

src/from/__tests__/fromZmes.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ async function loadAnalysis(): Promise<Analysis> {
2121
test('one record produces one spectrum', async () => {
2222
const analysis = await loadAnalysis();
2323

24+
console.log(analysis.spectra[0]);
25+
2426
expect(analysis.spectra).toHaveLength(2);
2527
expect(analysis.spectra[0]?.dataType).toBe('Size measurement');
2628
});

0 commit comments

Comments
 (0)