Files
BT411/scratchpad/night17/m173v_check.py
T

69 lines
3.6 KiB
Python

# #173 valve experiment digest -- per run: valve receipts (PROOF of detent),
# time-to-degradation-1000, equilibrium T, held speed, C5/bank finals.
import re, sys, statistics as st
def digest(path):
myotemp = [] # (t, T)
myoheat = [] # (v, a, dt)
myo = [] # speedEffect samples in file order
c5 = []; bank = []
presses = [] # ([valve-tx] BT_VALVE5 press lines)
detents = [] # ([valve] CondenserN valve -> detent D lines)
redist = [] # ([valve] condenser#N valveState=V flow=F (total=T))
for ln in open(path, encoding='latin-1', errors='replace'):
m = re.search(r"\[myotemp\] t=([\d.eE+-]+) T=([\d.eE+-]+)", ln)
if m: myotemp.append((float(m.group(1)), float(m.group(2)))); continue
m = re.search(r"\[myoheat\] v=([\d.eE+-]+) a=([\d.eE+-]+) m=[\d.eE+-]+ g=[\d.eE+-]+ ratio=[\d.eE+-]+ dmgGain=[\d.eE+-]+ dt=([\d.eE+-]+)", ln)
if m: myoheat.append(tuple(map(float, m.groups()))); continue
m = re.search(r"\[myo\] Myomers.* speed=([\d.eE+-]+).* gear=(\d+)", ln)
if m: myo.append((float(m.group(1)), int(m.group(2)))); continue
m = re.search(r"\[heat-t\] (\S+)( \(bank\))? T=([\d.eE+-]+)", ln)
if m:
name, isbank, T = m.group(1), m.group(2), float(m.group(3))
if name == 'Condenser5': c5.append(T)
elif isbank or name == 'HeatSink': bank.append(T)
continue
if '[valve-tx] BT_VALVE5' in ln: presses.append(ln.strip()); continue
m = re.search(r"\[valve\] (Condenser\d+) valve -> detent (\d+)", ln)
if m: detents.append((m.group(1), int(m.group(2)))); continue
m = re.search(r"\[valve\] condenser#(\d) valveState=(\d+) flow=([\d.eE+-]+) \(total=(\d+)\)", ln)
if m: redist.append(tuple(int(x) if i != 2 else float(x) for i, x in enumerate(m.groups()))); continue
name = path.split('m173_')[-1].replace('.log', '')
print("=" * 78)
print("RUN %s" % name)
if presses:
for p in presses: print(" " + p)
if detents:
print(" detent walk: " + " -> ".join("%s:%d" % d for d in detents))
# final redistribute state (last 6 lines)
if redist:
last6 = redist[-6:]
print(" final shares: " + " ".join("#%d v=%d f=%.4f" % (n, v, f) for (n, v, f, t) in last6)
+ " (total=%d)" % last6[-1][3])
if not myotemp:
print(" NO MYOTEMP DATA"); return
t_end = myotemp[-1][0]
t1000 = next((t for t, T in myotemp if T >= 1000), None)
t2000 = next((t for t, T in myotemp if T >= 2000), None)
Tpk = max(T for _, T in myotemp)
late = [T for t, T in myotemp if t > t_end - 40.0]
k = max(2, len(myotemp) // 5)
dT = (myotemp[-1][1] - myotemp[-k][1]) / max(1e-6, (myotemp[-1][0] - myotemp[-k][0]))
# pair myoheat with myotemp by index (printed in lockstep)
n = min(len(myoheat), len(myotemp))
vlate = [myoheat[i][0] for i in range(n) if myotemp[i][0] > t_end - 40.0]
vpk = max(x[0] for x in myoheat) if myoheat else 0.0
selate = [s for s, g in myo[-20:]]
gears = set(g for s, g in myo)
print(" t1000=%s t2000=%s Tpeak=%.0f eqT(last40s)=%.0f endSlope=%+.2f/s (window %.1fs)"
% ("%.1fs" % t1000 if t1000 else "NEVER", "%.1fs" % t2000 if t2000 else "never",
Tpk, st.mean(late), dT, t_end))
print(" vPeak=%.1f vHeld(last40s)=%.1f u/s speedEffect(last~20 samples)=%.2f gear(s)=%s"
% (vpk, st.mean(vlate) if vlate else 0.0, st.mean(selate) if selate else 0.0, sorted(gears)))
print(" Condenser5 end T=%.0f bank end T=%.0f" % (c5[-1] if c5 else 0, bank[-1] if bank else 0))
if __name__ == '__main__':
for f in sys.argv[1:]:
digest(f)