kopia lustrzana https://github.com/NanoVNA-Saver/nanovna-saver
Touchstone Class can now parses more lazy
- float resistance value can be float now, but will be converted to int - comment lines can be placed everywhere - unordered frequencies will be sortedpull/106/head
rodzic
e27e1a90a0
commit
ec8eb79168
|
@ -18,6 +18,7 @@ import logging
|
|||
import math
|
||||
import cmath
|
||||
import io
|
||||
from operator import attrgetter
|
||||
from NanoVNASaver.RFTools import Datapoint
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
@ -77,12 +78,18 @@ class Options:
|
|||
self.format = p
|
||||
pformat = True
|
||||
elif p == "r" and not presist:
|
||||
self.resistance = int(next(params))
|
||||
rstr = next(params)
|
||||
try:
|
||||
self.resistance = int(rstr)
|
||||
except ValueError:
|
||||
logger.warning("Non integer resistance value: %s", rstr)
|
||||
self.resistance = int(float(rstr))
|
||||
else:
|
||||
raise TypeError("Illegal option line: " + line)
|
||||
|
||||
|
||||
class Touchstone:
|
||||
FIELD_ORDER = ("11", "21", "12", "22")
|
||||
|
||||
def __init__(self, filename: str):
|
||||
self.filename = filename
|
||||
|
@ -92,19 +99,22 @@ class Touchstone:
|
|||
|
||||
@property
|
||||
def s11data(self) -> list:
|
||||
return self.sdata[0]
|
||||
|
||||
@property
|
||||
def s21data(self) -> list:
|
||||
return self.sdata[1]
|
||||
return self.s("11")
|
||||
|
||||
@property
|
||||
def s12data(self) -> list:
|
||||
return self.sdata[2]
|
||||
return self.s("12")
|
||||
|
||||
@property
|
||||
def s21data(self) -> list:
|
||||
return self.s("21")
|
||||
|
||||
@property
|
||||
def s22data(self) -> list:
|
||||
return self.sdata[3]
|
||||
return self.s("22")
|
||||
|
||||
def s(self, name: str):
|
||||
return self.sdata[Touchstone.FIELD_ORDER.index(name)]
|
||||
|
||||
def _parse_comments(self, fp) -> str:
|
||||
for line in fp:
|
||||
|
@ -136,8 +146,6 @@ class Touchstone:
|
|||
try:
|
||||
with open(self.filename) as infile:
|
||||
self.loads(infile.read())
|
||||
except TypeError as e:
|
||||
logger.exception("Failed to parse %s: %s", self.filename, e)
|
||||
except IOError as e:
|
||||
logger.exception("Failed to open %s: %s", self.filename, e)
|
||||
|
||||
|
@ -145,6 +153,13 @@ class Touchstone:
|
|||
"""Parse touchstone 1.1 string input
|
||||
appends to existing sdata if Touchstone object exists
|
||||
"""
|
||||
try:
|
||||
self._loads(s)
|
||||
except TypeError as e:
|
||||
logger.exception("Failed to parse %s: %s", self.filename, e)
|
||||
|
||||
def _loads(self, s: str):
|
||||
need_reorder = False
|
||||
with io.StringIO(s) as file:
|
||||
opts_line = self._parse_comments(file)
|
||||
self.opts.parse(opts_line)
|
||||
|
@ -152,8 +167,14 @@ class Touchstone:
|
|||
prev_freq = 0.0
|
||||
prev_len = 0
|
||||
for line in file:
|
||||
line = line.strip()
|
||||
# ignore empty lines (even if not specified)
|
||||
if not line.strip():
|
||||
if line == "":
|
||||
continue
|
||||
# accept comment lines after header
|
||||
if line.startswith("!"):
|
||||
logger.warning("Comment after header: %s", line)
|
||||
self.comments.append(line)
|
||||
continue
|
||||
|
||||
# ignore comments at data end
|
||||
|
@ -164,7 +185,8 @@ class Touchstone:
|
|||
|
||||
# consistency checks
|
||||
if freq <= prev_freq:
|
||||
raise TypeError("Frequency not ascending: " + line)
|
||||
logger.warning("Frequency not ascending: %s", line)
|
||||
need_reorder = True
|
||||
prev_freq = freq
|
||||
|
||||
if prev_len == 0:
|
||||
|
@ -175,6 +197,10 @@ class Touchstone:
|
|||
raise TypeError("Inconsistent number of pairs: " + line)
|
||||
|
||||
self._append_line_data(freq, data)
|
||||
if need_reorder:
|
||||
logger.warning("Reordering data")
|
||||
for datalist in self.sdata:
|
||||
datalist.sort(key=attrgetter("freq"))
|
||||
|
||||
def setFilename(self, filename: str):
|
||||
self.filename = filename
|
||||
|
|
|
@ -0,0 +1,104 @@
|
|||
!Created with skrf (http://scikit-rf.org).
|
||||
# Hz S RI R 50.0
|
||||
!freq ReS11 ImS11 ReS21 ImS21 ReS12 ImS12 ReS22 ImS22
|
||||
10000.0 0.997945666 -0.000203181 -2.0508e-05 -2.8303e-05 0.0 0.0 0.0 0.0
|
||||
15009900.0 0.998063921 0.000250377 -2.4179e-05 -1.7265e-05 0.0 0.0 0.0 0.0
|
||||
30009800.0 0.997875392 -0.000479933 -5.6028e-05 -1.4079e-05 0.0 0.0 0.0 0.0
|
||||
45009700.0 0.997830152 -0.000535284 -3.2141e-05 -2.2876e-05 0.0 0.0 0.0 0.0
|
||||
60009600.0 0.99804306 -0.001224545 1.5263e-05 1.9332e-05 0.0 0.0 0.0 0.0
|
||||
75009500.0 0.997991502 -0.000669958 1.6072e-05 -3.2965e-05 0.0 0.0 0.0 0.0
|
||||
90009400.0 0.997565209 -0.00161669 2.2068e-05 -2.0463e-05 0.0 0.0 0.0 0.0
|
||||
105009300.0 0.998001456 -0.001703771 0.000163192 0.000111491 0.0 0.0 0.0 0.0
|
||||
120009200.0 0.997912228 -0.002254315 3.4434e-05 -4.9813e-05 0.0 0.0 0.0 0.0
|
||||
135009100.0 0.997857272 -0.002554691 3.7397e-05 1.4562e-05 0.0 0.0 0.0 0.0
|
||||
150009000.0 0.998094379 -0.002690327 4.6955e-05 7.733e-05 0.0 0.0 0.0 0.0
|
||||
165008900.0 0.998075783 -0.003107617 -2.247e-05 6.7876e-05 0.0 0.0 0.0 0.0
|
||||
180008800.0 0.99791491 -0.00310471 5.7183e-05 6.5559e-05 0.0 0.0 0.0 0.0
|
||||
195008700.0 0.998371601 -0.003909578 2.1842e-05 4.178e-05 0.0 0.0 0.0 0.0
|
||||
210008600.0 0.997566342 -0.00470875 -8.3904e-05 4.7072e-05 0.0 0.0 0.0 0.0
|
||||
225008500.0 0.998071551 -0.004474181 -4.7161e-05 5.3963e-05 0.0 0.0 0.0 0.0
|
||||
240008400.0 0.997348725 -0.004639454 2.4776e-05 0.000107233 0.0 0.0 0.0 0.0
|
||||
255008300.0 0.99836862 -0.005756468 8.459e-06 -1.1133e-05 0.0 0.0 0.0 0.0
|
||||
270008200.0 0.99627453 -0.007404021 3.2551e-05 -3.3426e-05 0.0 0.0 0.0 0.0
|
||||
285008100.0 0.996389567 -0.006911531 7.9927e-05 -1.1805e-05 0.0 0.0 0.0 0.0
|
||||
300008000.0 0.984097003 -0.009154403 -0.000167907 0.001612333 0.0 0.0 0.0 0.0
|
||||
315007900.0 0.989603757 -0.003190903 9.3511e-05 -0.000254711 0.0 0.0 0.0 0.0
|
||||
330007800.0 0.990587413 -0.010738851 -2.6822e-05 -0.00020374 0.0 0.0 0.0 0.0
|
||||
345007700.0 0.992036402 -0.009486312 0.000147759 -0.000473813 0.0 0.0 0.0 0.0
|
||||
360007600.0 0.991972208 -0.006600862 0.000686447 0.00026418 0.0 0.0 0.0 0.0
|
||||
375007500.0 0.991577863 -0.008004215 -0.000124766 0.000645741 0.0 0.0 0.0 0.0
|
||||
390007400.0 0.996569514 -0.015393913 -6.3037e-05 0.000463298 0.0 0.0 0.0 0.0
|
||||
405007300.0 0.990179419 -0.01178324 -0.000387249 0.0005063 0.0 0.0 0.0 0.0
|
||||
420007200.0 0.992611587 -0.009658406 5.0784e-05 0.000525389 0.0 0.0 0.0 0.0
|
||||
435007100.0 0.994502842 -0.005429245 2.7807e-05 -0.000765338 0.0 0.0 0.0 0.0
|
||||
450007000.0 0.990648984 -0.011388606 0.000240157 -0.000835526 0.0 0.0 0.0 0.0
|
||||
465006900.0 0.990346252 -0.01049756 0.000115888 -9.6758e-05 0.0 0.0 0.0 0.0
|
||||
480006800.0 0.992519795 -0.009263195 0.000124362 0.000649891 0.0 0.0 0.0 0.0
|
||||
495006700.0 0.990916907 -0.010678514 -0.000208408 8.5402e-05 0.0 0.0 0.0 0.0
|
||||
510006600.0 0.990682482 -0.011856884 -8.8964e-05 0.000116707 0.0 0.0 0.0 0.0
|
||||
525006500.0 0.985233902 -0.010419548 -0.000585533 0.000515226 0.0 0.0 0.0 0.0
|
||||
540006400.0 0.995466768 -0.004720744 -0.000433898 -0.000461067 0.0 0.0 0.0 0.0
|
||||
555006300.0 0.991316795 -0.014557334 0.000266897 -0.000726262 0.0 0.0 0.0 0.0
|
||||
570006200.0 0.988762795 -0.011416017 0.000260244 -0.000191021 0.0 0.0 0.0 0.0
|
||||
585006100.0 0.993501067 -0.002398582 -9.156e-06 -0.000227457 0.0 0.0 0.0 0.0
|
||||
600006000.0 0.98844695 -0.018269769 0.000158602 0.000227051 0.0 0.0 0.0 0.0
|
||||
615005900.0 0.988067388 -0.014115263 0.000336775 -0.000126136 0.0 0.0 0.0 0.0
|
||||
630005800.0 0.998890399 -0.008659123 -0.00043222 -0.001015251 0.0 0.0 0.0 0.0
|
||||
645005700.0 0.990055859 -0.016014145 -0.001114644 -0.000278595 0.0 0.0 0.0 0.0
|
||||
660005600.0 0.990829944 -0.013342772 0.000793625 -0.000369359 0.0 0.0 0.0 0.0
|
||||
675005500.0 0.990757167 -0.01489226 0.000187729 -0.000386121 0.0 0.0 0.0 0.0
|
||||
690005400.0 0.992701351 -0.01520061 -0.000439427 0.000344602 0.0 0.0 0.0 0.0
|
||||
705005300.0 0.988954603 -0.015764433 -0.00073419 -0.000346192 0.0 0.0 0.0 0.0
|
||||
720005200.0 0.985275387 -0.02116522 0.000721478 -0.00026626 0.0 0.0 0.0 0.0
|
||||
735005100.0 0.988921165 -0.018076622 -0.000782531 -0.000888003 0.0 0.0 0.0 0.0
|
||||
750005000.0 0.997871518 -0.016042932 -0.00052584 -0.000241451 0.0 0.0 0.0 0.0
|
||||
765004900.0 0.991029024 -0.020595366 -5.3111e-05 4.5143e-05 0.0 0.0 0.0 0.0
|
||||
780004800.0 1.000474572 -0.014718874 0.000403745 0.000271099 0.0 0.0 0.0 0.0
|
||||
795004700.0 0.991873502 -0.017990043 -0.001036695 0.001309779 0.0 0.0 0.0 0.0
|
||||
810004600.0 1.001269459 -0.022523099 0.000904293 0.000838528 0.0 0.0 0.0 0.0
|
||||
825004500.0 0.995802938 -0.017430307 0.00096513 -0.001949188 0.0 0.0 0.0 0.0
|
||||
840004400.0 0.990553498 -0.022784827 0.000942723 -0.000526193 0.0 0.0 0.0 0.0
|
||||
855004300.0 0.992622613 -0.018191326 -0.000479641 0.001357597 0.0 0.0 0.0 0.0
|
||||
870004200.0 0.998473942 -0.0215917 0.000626809 -0.001388891 0.0 0.0 0.0 0.0
|
||||
885004100.0 0.991835117 -0.018580982 -4.4587e-05 0.000902399 0.0 0.0 0.0 0.0
|
||||
900004000.0 1.00122404 -0.018105072 -1.8327e-05 -0.002446518 0.0 0.0 0.0 0.0
|
||||
915003900.0 1.016865491 -0.026983406 0.001391073 0.001833796 0.0 0.0 0.0 0.0
|
||||
930003800.0 1.004885792 -0.017144799 0.002953082 0.004407539 0.0 0.0 0.0 0.0
|
||||
945003700.0 0.982209146 -0.019811017 -0.000444983 0.000584642 0.0 0.0 0.0 0.0
|
||||
960003600.0 1.001144766 -0.042434174 0.006346683 0.000898356 0.0 0.0 0.0 0.0
|
||||
975003500.0 0.991372644 -0.019519817 -0.004440182 -0.004724822 0.0 0.0 0.0 0.0
|
||||
990003400.0 1.014019727 -0.030354205 -0.006528417 -0.002219166 0.0 0.0 0.0 0.0
|
||||
1005003300.0 1.016555309 -0.039133321 0.001244856 -0.000631911 0.0 0.0 0.0 0.0
|
||||
1020003200.0 0.993585586 -0.027140568 -0.003237228 0.004080757 0.0 0.0 0.0 0.0
|
||||
1035003100.0 1.003273963 -0.018961952 0.003909113 -0.000963084 0.0 0.0 0.0 0.0
|
||||
1050003000.0 1.01273334 -0.062777623 0.003801429 0.004669127 0.0 0.0 0.0 0.0
|
||||
1065002900.0 1.005700349 -0.04565446 0.006958209 0.002412536 0.0 0.0 0.0 0.0
|
||||
1080002800.0 1.011170148 -0.042020332 -0.00354105 -0.001727906 0.0 0.0 0.0 0.0
|
||||
1095002700.0 1.001092314 -0.060577046 0.000117853 0.003003872 0.0 0.0 0.0 0.0
|
||||
1110002600.0 1.032729864 -0.057148627 -0.000723557 0.005098437 0.0 0.0 0.0 0.0
|
||||
1125002500.0 1.00830686 -0.062419198 0.0002536 0.007275069 0.0 0.0 0.0 0.0
|
||||
1140002400.0 1.004439353 -0.072881937 0.001709716 0.002529229 0.0 0.0 0.0 0.0
|
||||
1155002300.0 1.017983794 -0.08438082 -0.009064296 0.006464344 0.0 0.0 0.0 0.0
|
||||
1170002200.0 0.999595582 -0.030973853 0.000407358 -0.005522909 0.0 0.0 0.0 0.0
|
||||
1185002100.0 0.99132055 -0.071514025 -0.008105291 -0.000783289 0.0 0.0 0.0 0.0
|
||||
1200002000.0 0.991782605 -0.096986889 -0.014142063 0.001001663 0.0 0.0 0.0 0.0
|
||||
1215001900.0 0.976635456 -0.079574368 0.00104919 -0.006847375 0.0 0.0 0.0 0.0
|
||||
1230001800.0 1.02203989 -0.053924381 -0.013649494 0.000128238 0.0 0.0 0.0 0.0
|
||||
1245001700.0 0.996935963 -0.10235808 -0.002535079 -0.005486325 0.0 0.0 0.0 0.0
|
||||
1260001600.0 0.997368097 -0.110300377 -0.009988283 -0.001133779 0.0 0.0 0.0 0.0
|
||||
1275001500.0 0.969451427 -0.108227171 0.009824976 -0.004308064 0.0 0.0 0.0 0.0
|
||||
1290001400.0 1.005417943 -0.095492035 -0.003404723 -0.000240547 0.0 0.0 0.0 0.0
|
||||
1305001300.0 0.94099164 -0.097261205 -0.003829509 0.003687269 0.0 0.0 0.0 0.0
|
||||
1320001200.0 1.036064267 -0.109387516 -0.006938047 -0.006778006 0.0 0.0 0.0 0.0
|
||||
1335001100.0 0.982966244 -0.147038042 0.001936204 -0.004359447 0.0 0.0 0.0 0.0
|
||||
1350001000.0 0.943482697 -0.112556122 0.001491426 0.0052864 0.0 0.0 0.0 0.0
|
||||
1365000900.0 1.04384756 -0.175450965 -0.000125052 -0.006158494 0.0 0.0 0.0 0.0
|
||||
1380000800.0 1.08729124 -0.111472949 -0.002034726 -0.00124251 0.0 0.0 0.0 0.0
|
||||
1395000700.0 0.975226998 -0.151159316 0.015185886 0.003684978 0.0 0.0 0.0 0.0
|
||||
1410000600.0 1.006498575 -0.192365437 0.001370865 -0.002877861 0.0 0.0 0.0 0.0
|
||||
1425000500.0 0.972706973 -0.11881756 -0.003922176 0.004854394 0.0 0.0 0.0 0.0
|
||||
1440000400.0 0.986198782 -0.189747989 0.004291551 -0.005275334 0.0 0.0 0.0 0.0
|
||||
1455000300.0 0.913244247 -0.06428568 -0.014572597 0.003062129 0.0 0.0 0.0 0.0
|
||||
1470000200.0 0.869476377 -0.12276107 -0.0028179 -0.001525241 0.0 0.0 0.0 0.0
|
||||
1485000100.0 0.94566971 -0.199387297 0.006458432 0.018461674 0.0 0.0 0.0 0.0
|
||||
15000000.0 0.849810063 -0.4147357 -0.000306106 0.0041482 0.0 0.0 0.0 0.0
|
|
@ -14,12 +14,12 @@
|
|||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
import sys
|
||||
import unittest
|
||||
|
||||
# Import targets to be tested
|
||||
from NanoVNASaver.Touchstone import Options, Touchstone
|
||||
|
||||
|
||||
class TestTouchstoneOptions(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.opts = Options()
|
||||
|
@ -52,6 +52,7 @@ class TestTouchstoneOptions(unittest.TestCase):
|
|||
self.assertEqual(str(self.opts), "# HZ Y RI R 123")
|
||||
self.assertEqual(self.opts.factor, 1)
|
||||
|
||||
|
||||
class TestTouchstoneTouchstone(unittest.TestCase):
|
||||
|
||||
def test_load(self):
|
||||
|
@ -70,5 +71,15 @@ class TestTouchstoneTouchstone(unittest.TestCase):
|
|||
self.assertEqual(len(ts.s22data), 1020)
|
||||
self.assertIn("! Vector Network Analyzer VNA R2", ts.comments)
|
||||
|
||||
def test_load_scikit(self):
|
||||
ts = Touchstone("./test/data/scikit_unordered.s2p")
|
||||
ts.load()
|
||||
print(len(ts.s("12")))
|
||||
self.assertEqual(str(ts.opts), "# HZ S RI R 50")
|
||||
self.assertEqual(len(ts.s11data), 101)
|
||||
self.assertIn("!freq ReS11 ImS11 ReS21 ImS21 ReS12 ImS12 ReS22 ImS22",
|
||||
ts.comments)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main(verbosity=2)
|
||||
|
|
Ładowanie…
Reference in New Issue