import sys, re, math from collections import Counter pat = re.compile( r'outRoot=(\w) flood=(\d+) eye=\(([^)]+)\) player=\(([^)]+)\) ' r'rawPlayer=\(([^)]+)\) yaw=([-\d.]+)') rows = [] for l in sys.stdin: m = pat.search(l) if not m: continue rows.append(( m.group(1), int(m.group(2)), tuple(float(x) for x in m.group(3).split(',')), # eye tuple(float(x) for x in m.group(4).split(',')), # player (RenderPosition) tuple(float(x) for x in m.group(5).split(',')), # rawPlayer (physics body) float(m.group(6)))) # yaw print("parsed pv-input rows:", len(rows)) if not rows: raise SystemExit print("flood histogram (outRoot,flood)->count:", dict(Counter((r[0], r[1]) for r in rows))) def rng(idx): return [max(r[idx][k] for r in rows) - min(r[idx][k] for r in rows) for k in range(3)] print(f"eye range over window (m): {[round(v,6) for v in rng(2)]}") print(f"render-pos range over window (m): {[round(v,6) for v in rng(3)]}") print(f"raw-phys range over window (m): {[round(v,6) for v in rng(4)]}") print(f"yaw range over window (rad): {round(max(r[5] for r in rows)-min(r[5] for r in rows),6)}") flips = 0 samples = [] for i in range(1, len(rows)): a, b = rows[i-1], rows[i] if a[1] == b[1]: continue flips += 1 ed = math.dist(a[2], b[2]); pd = math.dist(a[3], b[3]) rd = math.dist(a[4], b[4]); yd = abs(b[5]-a[5]) if len(samples) < 18: samples.append(f"{b[0]} {a[1]}->{b[1]:<2} eye={ed*1000:7.3f}mm rend={pd*1e6:8.1f}um raw={rd*1e6:8.1f}um yaw={yd*1000:8.4f}mrad") print(f"flood flips in window: {flips}") for s in samples: print(" ", s)