commit 5c136f753c74a0f1955700cceef87720d3222374
parent af100bd9257b2d4316f1e553cdb3a0835b16a873
Author: Anders Damsgaard <anders@adamsgaard.dk>
Date: Wed, 8 Apr 2026 16:52:51 +0200
fix(parser): support combined stem TEMImage headers
Diffstat:
3 files changed, 44 insertions(+), 2 deletions(-)
diff --git a/tem_loader/core.py b/tem_loader/core.py
@@ -3,10 +3,24 @@ import math
from pathlib import Path
+REQUIRED_COLUMNS = {'X', 'Y', 'Z', 'DOI', 'DataResidual', 'NumLayers'}
+
+
+def normalize_header_tokens(line):
+ return [token.lstrip('/') for token in line.split()]
+
+
+def is_header_line(line):
+ return REQUIRED_COLUMNS.issubset(normalize_header_tokens(line))
+
+
def count_header_lines(path, comment_char='/'):
with open(path, 'r') as f:
for i, line in enumerate(f):
- if not line.lstrip().startswith(comment_char):
+ stripped = line.lstrip()
+ if is_header_line(stripped):
+ return i
+ if not stripped.startswith(comment_char):
return i
return 0
@@ -17,7 +31,7 @@ def process_xyz(path):
lines = f.readlines()
data_lines = lines[skiprows:]
- headers = data_lines[0].split()
+ headers = normalize_header_tokens(data_lines[0])
data_rows = []
for line in data_lines[1:]:
line = line.strip()
diff --git a/test/data/stem_temimager_4_0_4_6.xyz b/test/data/stem_temimager_4_0_4_6.xyz
@@ -0,0 +1,18 @@
+/TEMImage_Beta Models by TEMcompany, version: 4.0.4.6
+/Unit Resistivity: [Ohm-m], Thickness: [m]
+/Dummy Resistivity:99999, Dummy Thickness: 99999
+ /Project Line StationNo InversionName X Y Z DOI DataResidual NumLayers Res_001 Res_002 Res_003 Res_004 Res_005 Res_006 Res_007 Res_008 Res_009 Res_010 Res_011 Res_012 Res_013 Res_014 Res_015 Res_016 Res_017 Res_018 Res_019 Res_020 Res_021 Res_022 Res_023 Res_024 Res_025 Res_026 Res_027 Res_028 Res_029 Res_030 Thick_001 Thick_002 Thick_003 Thick_004 Thick_005 Thick_006 Thick_007 Thick_008 Thick_009 Thick_010 Thick_011 Thick_012 Thick_013 Thick_014 Thick_015 Thick_016 Thick_017 Thick_018 Thick_019 Thick_020 Thick_021 Thick_022 Thick_023 Thick_024 Thick_025 Thick_026 Thick_027 Thick_028 Thick_029
+ Kenya40x40 1 1_00001 LCI_20251015_090910 276038.8833803 9984374.6509969 1927.81 270.000 0.430 30 1.87400E+001 2.12600E+001 2.39700E+001 2.37700E+001 2.08400E+001 1.99700E+001 2.29500E+001 2.04300E+001 1.29700E+001 9.22000E+000 1.24900E+001 1.76500E+001 2.11800E+001 2.25600E+001 2.18900E+001 1.90900E+001 1.62800E+001 1.69000E+001 1.73000E+001 1.28000E+001 6.82000E+000 4.32000E+000 3.77000E+000 6.52000E+000 1.01500E+001 1.13800E+001 1.01600E+001 8.00000E+000 6.11000E+000 5.14000E+000 2.000 2.250 2.520 2.830 3.180 3.560 4.000 4.490 5.040 5.660 6.350 7.130 8.010 8.990 10.090 11.330 12.720 14.270 16.020 17.990 20.190 22.660 25.440 28.560 32.060 35.990 40.400 45.350 50.920
+ Kenya40x40 1 1_00002 LCI_20251015_090910 276811.8676042 9985028.0769656 1934.58 279.000 0.500 30 1.89500E+001 2.13300E+001 2.35800E+001 2.23800E+001 1.82600E+001 1.75100E+001 2.34300E+001 2.40700E+001 1.83700E+001 1.40800E+001 1.46000E+001 1.60900E+001 1.64800E+001 1.60300E+001 1.50600E+001 1.32300E+001 1.23600E+001 1.64700E+001 2.12400E+001 1.90500E+001 1.17700E+001 6.08000E+000 3.11000E+000 5.65000E+000 9.78000E+000 1.12700E+001 1.01000E+001 7.89000E+000 5.89000E+000 4.80000E+000 2.000 2.250 2.520 2.830 3.180 3.560 4.000 4.490 5.040 5.660 6.350 7.130 8.010 8.990 10.090 11.330 12.720 14.270 16.020 17.990 20.190 22.660 25.440 28.560 32.060 35.990 40.400 45.350 50.920
+ Kenya40x40 1 1_00004 LCI_20251015_090910 273095.6656917 9989224.7621555 1867.36 328.000 0.650 30 1.97000E+001 2.17900E+001 2.26300E+001 1.84300E+001 1.08800E+001 8.30000E+000 1.46500E+001 1.74400E+001 1.46200E+001 1.33900E+001 1.66400E+001 2.05200E+001 2.21800E+001 2.14700E+001 1.83900E+001 1.31000E+001 9.55000E+000 1.42400E+001 2.36500E+001 2.64700E+001 2.08700E+001 1.40400E+001 9.40000E+000 1.08600E+001 1.27700E+001 1.21500E+001 9.78000E+000 7.14000E+000 5.07000E+000 3.94000E+000 2.000 2.250 2.520 2.830 3.180 3.560 4.000 4.490 5.040 5.660 6.350 7.130 8.010 8.990 10.090 11.330 12.720 14.270 16.020 17.990 20.190 22.660 25.440 28.560 32.060 35.990 40.400 45.350 50.920
+ Kenya40x40 1 1_00005 LCI_20251015_090910 273548.2076831 9990962.2088035 1871.66 280.000 0.890 30 9.85000E+000 1.23900E+001 1.55900E+001 1.52800E+001 1.22000E+001 1.24700E+001 1.61800E+001 1.46800E+001 9.51000E+000 8.22000E+000 1.27600E+001 1.87500E+001 2.18500E+001 2.13200E+001 1.68500E+001 9.35000E+000 4.92000E+000 1.01100E+001 2.45700E+001 3.38900E+001 3.17000E+001 2.55400E+001 2.08700E+001 2.06100E+001 1.98000E+001 1.67200E+001 1.21500E+001 7.72000E+000 4.51000E+000 2.44000E+000 2.000 2.250 2.520 2.830 3.180 3.560 4.000 4.490 5.040 5.660 6.350 7.130 8.010 8.990 10.090 11.330 12.720 14.270 16.020 17.990 20.190 22.660 25.440 28.560 32.060 35.990 40.400 45.350 50.920
+ Kenya40x40 1 1_00006 LCI_20251015_090910 273611.3800531 9990915.8336502 1866.74 302.000 0.560 30 1.73700E+001 1.89600E+001 1.93600E+001 1.59900E+001 1.09800E+001 1.17500E+001 1.37800E+001 1.14400E+001 7.23000E+000 7.10000E+000 1.25700E+001 1.97200E+001 2.35700E+001 2.37600E+001 1.96300E+001 1.12900E+001 5.47000E+000 9.54000E+000 2.65000E+001 3.90200E+001 3.70500E+001 2.94900E+001 2.42900E+001 2.12400E+001 1.84400E+001 1.53000E+001 1.13700E+001 7.41000E+000 4.40000E+000 2.48000E+000 2.000 2.250 2.520 2.830 3.180 3.560 4.000 4.490 5.040 5.660 6.350 7.130 8.010 8.990 10.090 11.330 12.720 14.270 16.020 17.990 20.190 22.660 25.440 28.560 32.060 35.990 40.400 45.350 50.920
+ Kenya40x40 1 1_00007 LCI_20251015_090910 272635.2712137 9988886.7197357 1869.44 309.000 0.380 30 1.45300E+001 1.42900E+001 1.26000E+001 8.77000E+000 4.96000E+000 8.55000E+000 1.25300E+001 1.07500E+001 6.31000E+000 6.20000E+000 1.28300E+001 2.15400E+001 2.60000E+001 2.74400E+001 2.49500E+001 1.56500E+001 6.27000E+000 8.50000E+000 2.87000E+001 4.25000E+001 3.75100E+001 2.64200E+001 2.03800E+001 1.56200E+001 1.26900E+001 1.12100E+001 9.41000E+000 6.96000E+000 4.64000E+000 2.97000E+000 2.000 2.250 2.520 2.830 3.180 3.560 4.000 4.490 5.040 5.660 6.350 7.130 8.010 8.990 10.090 11.330 12.720 14.270 16.020 17.990 20.190 22.660 25.440 28.560 32.060 35.990 40.400 45.350 50.920
+ Kenya40x40 1 1_00008 LCI_20251015_090910 272179.9677141 9988165.1480886 1878.47 221.000 0.670 30 1.37800E+001 1.25400E+001 1.00600E+001 6.74000E+000 4.24000E+000 1.25400E+001 2.01500E+001 1.70900E+001 8.21000E+000 6.25000E+000 1.42400E+001 2.39400E+001 2.69500E+001 2.85100E+001 2.75800E+001 1.61900E+001 2.72000E+000 3.74000E+000 2.94200E+001 4.49100E+001 3.51600E+001 2.01900E+001 1.42700E+001 9.21000E+000 6.95000E+000 6.97000E+000 7.19000E+000 6.46000E+000 5.10000E+000 3.92000E+000 2.000 2.250 2.520 2.830 3.180 3.560 4.000 4.490 5.040 5.660 6.350 7.130 8.010 8.990 10.090 11.330 12.720 14.270 16.020 17.990 20.190 22.660 25.440 28.560 32.060 35.990 40.400 45.350 50.920
+ Kenya40x40 1 1_00009 LCI_20251015_090910 290391.2749264 9981655.0961087 2271.36 379.000 1.060 30 3.36500E+001 3.28900E+001 2.83700E+001 1.94800E+001 1.09300E+001 3.25800E+001 5.30200E+001 5.62300E+001 4.53800E+001 3.87600E+001 4.77100E+001 5.17400E+001 4.49200E+001 4.50500E+001 5.03300E+001 4.34300E+001 2.54200E+001 3.16000E+001 6.26400E+001 6.54400E+001 4.18900E+001 1.85000E+001 1.16500E+001 5.34000E+000 3.08000E+000 3.41000E+000 4.69000E+000 5.50000E+000 5.35000E+000 5.09000E+000 2.000 2.250 2.520 2.830 3.180 3.560 4.000 4.490 5.040 5.660 6.350 7.130 8.010 8.990 10.090 11.330 12.720 14.270 16.020 17.990 20.190 22.660 25.440 28.560 32.060 35.990 40.400 45.350 50.920
+ Kenya40x40 1 1_00010 LCI_20251015_090910 290549.5841948 9981363.0242663 2289.06 350.000 2.110 30 7.59200E+001 7.69700E+001 6.42600E+001 3.20700E+001 3.80000E+000 3.87700E+001 7.47800E+001 8.80900E+001 8.43100E+001 7.81400E+001 9.52500E+001 9.39400E+001 7.24600E+001 7.45900E+001 9.27200E+001 8.90600E+001 6.55400E+001 5.89000E+001 6.45400E+001 5.05000E+001 2.19800E+001 4.60000E+000 4.61000E+000 3.20000E+000 2.40000E+000 3.22000E+000 5.09000E+000 6.17000E+000 6.14000E+000 6.04000E+000 2.000 2.250 2.520 2.830 3.180 3.560 4.000 4.490 5.040 5.660 6.350 7.130 8.010 8.990 10.090 11.330 12.720 14.270 16.020 17.990 20.190 22.660 25.440 28.560 32.060 35.990 40.400 45.350 50.920
+ Kenya40x40 1 1_00011 LCI_20251015_090910 282697.6030425 9980784.0989738 2029.62 311.000 0.770 30 7.40000E+001 8.10700E+001 7.02400E+001 3.34400E+001 2.61200E+001 5.24800E+001 6.15300E+001 4.72800E+001 2.10100E+001 9.04000E+000 2.05300E+001 2.18100E+001 9.16000E+000 1.02800E+001 2.15900E+001 2.19000E+001 1.42300E+001 1.68800E+001 2.86300E+001 2.82700E+001 1.42300E+001 4.58000E+000 3.99000E+000 2.56000E+000 3.30000E+000 4.83000E+000 6.40000E+000 6.89000E+000 6.56000E+000 6.25000E+000 2.000 2.250 2.520 2.830 3.180 3.560 4.000 4.490 5.040 5.660 6.350 7.130 8.010 8.990 10.090 11.330 12.720 14.270 16.020 17.990 20.190 22.660 25.440 28.560 32.060 35.990 40.400 45.350 50.920
+ Kenya40x40 1 1_00012 LCI_20251015_090910 283270.9619093 9980981.7534186 2059.05 292.000 0.830 30 2.17500E+001 2.56700E+001 1.94100E+001 2.66000E+000 9.56000E+000 3.32200E+001 4.22400E+001 3.39300E+001 1.87300E+001 1.16500E+001 1.97800E+001 2.21200E+001 1.29000E+001 1.48700E+001 2.66100E+001 2.79000E+001 2.03300E+001 2.19600E+001 3.23900E+001 3.19800E+001 1.80500E+001 6.76000E+000 3.40000E+000 1.35000E+000 3.38000E+000 5.96000E+000 7.24000E+000 7.17000E+000 6.59000E+000 6.14000E+000 2.000 2.250 2.520 2.830 3.180 3.560 4.000 4.490 5.040 5.660 6.350 7.130 8.010 8.990 10.090 11.330 12.720 14.270 16.020 17.990 20.190 22.660 25.440 28.560 32.060 35.990 40.400 45.350 50.920
+ Kenya40x40 1 1_00013 LCI_20251015_090910 283706.5659377 9983216.2409481 2073.17 299.000 1.060 30 1.45800E+001 1.99500E+001 2.05300E+001 1.13700E+001 2.08300E+001 3.49500E+001 3.83100E+001 3.06800E+001 1.86600E+001 1.14500E+001 1.65800E+001 2.01400E+001 1.29500E+001 1.89100E+001 3.76400E+001 4.19500E+001 3.18100E+001 3.11000E+001 4.19300E+001 4.12100E+001 2.54700E+001 1.08900E+001 5.25000E+000 3.57000E+000 6.30000E+000 7.93000E+000 7.62000E+000 6.64000E+000 5.90000E+000 5.33000E+000 2.000 2.250 2.520 2.830 3.180 3.560 4.000 4.490 5.040 5.660 6.350 7.130 8.010 8.990 10.090 11.330 12.720 14.270 16.020 17.990 20.190 22.660 25.440 28.560 32.060 35.990 40.400 45.350 50.920
+ Kenya40x40 1 1_00014 LCI_20251015_090910 268720.2522077 9993553.3593576 1820.55 265.000 0.870 30 1.97800E+001 2.27800E+001 2.03900E+001 1.18800E+001 1.34600E+001 1.84400E+001 2.04800E+001 1.83200E+001 1.54000E+001 1.43900E+001 1.78800E+001 1.49000E+001 2.68000E+000 4.36000E+000 1.97100E+001 2.37400E+001 1.42900E+001 1.55500E+001 3.30400E+001 4.16600E+001 3.22800E+001 1.92500E+001 1.22300E+001 8.97000E+000 9.52000E+000 8.78000E+000 7.10000E+000 5.83000E+000 5.26000E+000 4.86000E+000 2.000 2.250 2.520 2.830 3.180 3.560 4.000 4.490 5.040 5.660 6.350 7.130 8.010 8.990 10.090 11.330 12.720 14.270 16.020 17.990 20.190 22.660 25.440 28.560 32.060 35.990 40.400 45.350 50.920
+ Kenya40x40 1 1_00015 LCI_20251015_090910 271615.9117250 9990870.2006751 1849.78 265.000 0.540 30 1.79300E+001 1.94200E+001 1.62500E+001 9.14000E+000 8.43000E+000 1.02800E+001 1.04100E+001 8.28000E+000 7.37000E+000 9.88000E+000 1.57000E+001 1.51800E+001 6.04000E+000 7.43000E+000 1.75200E+001 1.58300E+001 4.54000E+000 4.18000E+000 1.91900E+001 3.21100E+001 2.76600E+001 1.76500E+001 1.16900E+001 9.05000E+000 9.33000E+000 8.73000E+000 7.30000E+000 6.14000E+000 5.54000E+000 5.19000E+000 2.000 2.250 2.520 2.830 3.180 3.560 4.000 4.490 5.040 5.660 6.350 7.130 8.010 8.990 10.090 11.330 12.720 14.270 16.020 17.990 20.190 22.660 25.440 28.560 32.060 35.990 40.400 45.350 50.920
diff --git a/test/test_core.py b/test/test_core.py
@@ -31,6 +31,16 @@ class ProcessXYZTests(unittest.TestCase):
self.assertEqual(points[0]["StationNo"], "20_00004")
self.assertEqual(points[0]["NumLayers"], 30)
+ def test_stem_temimage_4_0_4_6_fixture(self):
+ path = FIXTURE_DIR / "stem_temimager_4_0_4_6.xyz"
+ points, doi_points, layers = process_xyz(path)
+
+ self.assertEqual(len(points), 14)
+ self.assertEqual(len(doi_points), 14)
+ self.assertEqual(len(layers), 406)
+ self.assertEqual(points[0]["StationNo"], "1_00001")
+ self.assertEqual(points[0]["NumLayers"], 30)
+
def test_write_csv_writes_expected_headers(self):
source = FIXTURE_DIR / "profiler_temimager_4_0_4_6.xyz"
points, _, _ = process_xyz(source)