Compare commits

..

No commits in common. "0921e27df622b9a8797721d30a313466f9a8a689" and "b86694e603c6a8341c912aa8eb4b83c515a6bc3c" have entirely different histories.

9 changed files with 55 additions and 163 deletions

View File

@ -23,22 +23,22 @@ canny-args:
no-graph:
- "None"
- "at1"
- "at2"
- "at3"
# - "at1"
# - "at2"
# - "at3"
- "at4"
- "at5"
- "at6"
# - "at4"
# - "at5"
# - "at6"
pcb-refs:
- "at1"
- "at2"
- "at3"
- "at4"
- "at5"
- "at6"
#- "at1"
#- "at2"
#- "at3"
#
#- "at4"
#- "at5"
#- "at6"
- "st1"
- "st3"
@ -49,7 +49,6 @@ probe-info:
c2c: 5.6 # mm
gauge-diam: 3.05 # mm
gauge-c2c: 4 #mm
dist-uncert: 3.05 #mm
gauges:
- 1
@ -61,7 +60,6 @@ probe-info:
- type: "scope"
config: "eProbe-Scope.txt"
data: "eProbe-Scope.csv"
time-uncert: 0.00000001428571428571 # s
trigger: # Redundant?
type: "channel"

View File

@ -49,7 +49,6 @@ probe-info:
c2c: 5.6 # mm
gauge-diam: 0.8 # mm
gauge-c2c: 1.8 #mm
dist-uncert: 0.8 #mm
gauges:
- 1
@ -62,7 +61,6 @@ probe-info:
- type: "scope"
config: "eProbe-Scope.txt"
data: "eProbe-Scope.csv"
time-uncert: 0.00000001428571428571 # s
trigger: # Redundant?
type: "channel"

View File

@ -52,7 +52,6 @@ probe-info:
c2c: 5.6 # mm
gauge-diam: 0.8 # mm
gauge-c2c: 1.8 #mm
dist-uncert: 0.8 #mm
gauges:
- 1
@ -65,7 +64,6 @@ probe-info:
- type: "scope"
config: "eProbe-Scope.txt"
data: "eProbe-Scope.csv"
time-uncert: 0.00000001428571428571 # s
trigger: # Redundant?
type: "channel"

View File

@ -54,7 +54,6 @@ probe-info:
c2c: 5.6 # mm
gauge-diam: 0.8 # mm
gauge-c2c: 1.8 #mm
dist-uncert: 0.8 #mm
gauges:
- 1
@ -67,7 +66,6 @@ probe-info:
- type: "scope"
config: "eProbe-Scope.txt"
data: "eProbe-Scope.csv"
time-uncert: 0.00000001428571428571 # s
trigger: # Redundant?
type: "channel"

View File

@ -52,7 +52,6 @@ probe-info:
c2c: 5.6 # mm
gauge-diam: 0.8 # mm
gauge-c2c: 1.8 #mm
dist-uncert: 0.8 #mm
gauges:
- 1
@ -65,7 +64,6 @@ probe-info:
- type: "scope"
config: "eProbe-Scope.txt"
data: "eProbe-Scope.csv"
time-uncert: 0.00000001428571428571 # s
trigger: # Redundant?
type: "channel"

View File

@ -55,13 +55,11 @@ probe-info:
c2c: 5.6 # mm
gauge-diam: 0.8 # mm
gauge-c2c: 1.8 #mm
dist-uncert: 0.8 #mm
data-records:
- type: "scope"
config: "eProbe-Scope.txt"
data: "eProbe-Scope.csv"
time-uncert: 0.00000001428571428571 # s
trigger: # Redundant?
type: "channel"

View File

@ -58,13 +58,11 @@ probe-info:
c2c: 5.6 # mm
gauge-diam: 0.8 # mm
gauge-c2c: 1.8 #mm
dist-uncert: 0.8 #mm
data-records:
- type: "scope"
config: "eProbe-Scope.txt"
data: "eProbe-Scope.csv"
time-uncert: 0.00000001428571428571 # s
trigger: # Redundant?
type: "channel"

144
main.py
View File

@ -39,21 +39,6 @@ data_to_load = [
"x2s5832"
]
# ==== Uncerts ====
# Taken from DOI: 10.1007/s00193-017-0763-3 (Implementation of a state-to-state analytical framework for the calculation of expansion tube flow properties)
UNCERTS = TUNNEL_INFO["uncertainties"]
def deltaX(delta_x_1: float, delta_x_2: float):
return np.sqrt(np.pow(delta_x_1, 2) + np.pow(delta_x_2, 2))
def deltaT(delta_t_1: float, delta_t_2: float, delta_t_sr: float):
return np.sqrt(np.pow(delta_t_1, 2) + np.pow(delta_t_2, 2) + np.pow(delta_t_sr, 2))
def deltaVs(V: float, dx: float, dt: float, delta_x: tuple[float, float], delta_t: tuple[float, float, float]):
return V * np.sqrt(np.pow(deltaX(*delta_x) / dx, 2) + np.pow(deltaT(*delta_t) / dt, 2))
# ==== Data Loading & Processing ====
def load_data(data_path: str, data={}) -> dict:
data_info_path = data_path + DATA_INFO
@ -129,7 +114,6 @@ def load_data(data_path: str, data={}) -> dict:
"x2": None,
"probes": None, # This may be x2 but may not - ie a scope was used
"trigger_index": None,
"probe_uncert": None, #s
},
"data": {
"x2": {}, # Only pop channels with a voltage scale in ./tunnel-info.yaml
@ -212,7 +196,6 @@ def load_data(data_path: str, data={}) -> dict:
if "scope" in data_locs:
data[x2_shot]["data"]["probes"] = [data[x2_shot]["data"]["scope"][1], data[x2_shot]["data"]["scope"][2]]
data[x2_shot]["time"]["probes"] = data[x2_shot]["time"]["scope"]
data[x2_shot]["time"]["probe_uncert"] = scope_data_info["time-uncert"]
# Find Shock Times
@ -232,7 +215,7 @@ def load_data(data_path: str, data={}) -> dict:
first_value, first_value_uncertainty, _, _ = canny_shock_finder(x2_time_us, refData, sigma=sigma, post_suppression_threshold=post_sup_thresh, plot=False, print_func=None)
shock_point = np.where(x2_time_us >= first_value)[0][0] # [BUG] Seems to give n+1
data[x2_shot]["shock-point"][ref] = shock_point, first_value, first_value_uncertainty
data[x2_shot]["shock-point"][ref] = shock_point, first_value
@ -267,7 +250,7 @@ def load_data(data_path: str, data={}) -> dict:
shock_point = np.where(scope_time >= first_value)[0][0] # [BUG] Seems to give n+1
data[x2_shot]["shock-point"][f"{probe}-g1"] = shock_point, first_value, first_value_uncertainty
data[x2_shot]["shock-point"][f"{probe}-g1"] = shock_point, first_value
if 2 in dataInfo["probe-info"]["gauges"]:
# Do the same for G2
@ -281,7 +264,7 @@ def load_data(data_path: str, data={}) -> dict:
raise ValueError(f"{probe}-g2 not detected")
shock_point = np.where(scope_time >= first_value)[0][0] # [BUG] Seems to give n+1
data[x2_shot]["shock-point"][f"{probe}-g2"] = shock_point, first_value, first_value_uncertainty
data[x2_shot]["shock-point"][f"{probe}-g2"] = shock_point, first_value
@ -293,19 +276,11 @@ def load_data(data_path: str, data={}) -> dict:
if i == 0: continue
p1_time = data[x2_shot]["shock-point"][refProbe][1] / 1e6 # Convert to seconds
p2_time = data[x2_shot]["shock-point"][dataInfo["pcb-refs"][i-1]][1] / 1e6 # Convert to seconds
p2p_dist = (TUNNEL_INFO["distance"][refProbe] - TUNNEL_INFO["distance"][dataInfo["pcb-refs"][i-1]]) / 1000 # convert to m
p2p_dist = abs(TUNNEL_INFO["distance"][refProbe] - TUNNEL_INFO["distance"][dataInfo["pcb-refs"][i-1]]) / 1000 # convert to m
p2p_time = abs(p2_time - p1_time)
probe_velocity = p2p_dist / p2p_time # m/s
p1_time_uncert = data[x2_shot]["shock-point"][dataInfo["pcb-refs"][i-1]][2] / 1e6 # Convert to seconds
p2_time_uncert = data[x2_shot]["shock-point"][refProbe][2] / 1e6 # Convert to seconds
uncert = deltaVs(probe_velocity, p2p_dist, p2p_time, (UNCERTS["probe-dist"][refProbe], UNCERTS["probe-dist"][dataInfo["pcb-refs"][i-1]]), (p1_time_uncert, p2_time_uncert, UNCERTS["time"]["x2-daq"]))
print(f"{dataInfo["pcb-refs"][i-1]}-{refProbe} Measured a shock speed of {probe_velocity:.2f} +/- {uncert:.2f} m/s ({probe_velocity/1000:.2f} +/- {uncert/1000:.2f} km/s [{uncert/probe_velocity * 100 :.2f}%])")
data[x2_shot]["shock-speed"][f"{dataInfo["pcb-refs"][i-1]}-{refProbe}"] = probe_velocity, uncert, True # Speed, Ref
probe_velocity = p2p_dist / abs(p2_time - p1_time) # m/s
print(f"{refProbe}-{dataInfo["pcb-refs"][i-1]} Measured a shock speed of {probe_velocity:.2f} m/s ({probe_velocity/1000:.2f} km/s)")
data[x2_shot]["shock-speed"][f"{refProbe}-{dataInfo["pcb-refs"][i-1]}"] = probe_velocity, True # Speed, Ref
print()
for probe in dataInfo["probe-info"]["locations"]:
@ -313,55 +288,35 @@ def load_data(data_path: str, data={}) -> dict:
g1_time = data[x2_shot]["shock-point"][f"{probe}-g1"][1] / 1e6 # Convert to seconds
g2_time = data[x2_shot]["shock-point"][f"{probe}-g2"][1] / 1e6 # Convert to seconds
c2c_dist = dataInfo["probe-info"]["c2c"] / 1000 # convert to m
c2c_time = abs(g2_time - g1_time)
probe_velocity = c2c_dist / c2c_time # m/s
probe_velocity = c2c_dist / abs(g2_time - g1_time) # m/s
g1_time_uncert = data[x2_shot]["shock-point"][f"{probe}-g1"][2] / 1e6 # Convert to seconds
g2_time_uncert = data[x2_shot]["shock-point"][f"{probe}-g2"][2] / 1e6 # Convert to seconds
uncert = deltaVs(probe_velocity, p2p_dist, p2p_time, (0.05/1000, 0.05/1000), (g1_time_uncert, g2_time_uncert, data[x2_shot]["time"]["probe_uncert"]))
print(f"{probe} Measured a shock speed of {probe_velocity:.2f} +/- {uncert:.2f} m/s ({probe_velocity/1000:.2f} +/- {uncert/1000:.2f} km/s)")
data[x2_shot]["shock-speed"][probe] = probe_velocity, uncert, False # Speed, Ref # m/s
print(f"{probe} Measured a shock speed of {probe_velocity:.2f} m/s ({probe_velocity/1000:.2f} km/s)")
data[x2_shot]["shock-speed"][probe] = probe_velocity, False # Speed, Ref # m/s
else:
print(f"Unable to calculate probe velocity, only have one gauge: {f"{probe}-g2" if f"{probe}-g2" in data[x2_shot]["shock-point"] else f"{probe}-g1"}")
print(f"Unable to calculate probe velocity, only have one probe: {f"{probe}-g2" if f"{probe}-g2" in data[x2_shot]["shock-point"] else f"{probe}-g1"}")
if len(dataInfo["probe-info"]["locations"]) > 1:
for i in range(len(dataInfo["probe-info"]["locations"]) - 1):
probe_locs = dataInfo["probe-info"]["locations"]
p2p_dist = (TUNNEL_INFO["distance"][probe_locs[1]] - TUNNEL_INFO["distance"][probe_locs[0]]) / 1000 # convert to m
p2p = (TUNNEL_INFO["distance"][probe_locs[1]] - TUNNEL_INFO["distance"][probe_locs[0]]) / 1000 # convert to m
if f"{probe_locs[i]}-g1" in data[x2_shot]["shock-point"] and f"{probe_locs[i+1]}-g1" in data[x2_shot]["shock-point"]:
p1_g1_time = data[x2_shot]["shock-point"][f"{probe_locs[i]}-g1"][1] / 1e6 # Convert to seconds
p2_g1_time = data[x2_shot]["shock-point"][f"{probe_locs[i+1]}-g1"][1] / 1e6 # Convert to seconds
p2p_time = abs(p2_g1_time - p1_g1_time)
p2p_1 = p2p_dist / p2p_time # m/s
p2p_1 = p2p / abs(p2_g1_time - p1_g1_time) # m/s
p1_time_uncert = data[x2_shot]["shock-point"][f"{probe_locs[i]}-g1"][2] / 1e6 # Convert to seconds
p2_time_uncert = data[x2_shot]["shock-point"][f"{probe_locs[i+1]}-g1"][2] / 1e6 # Convert to seconds
uncert = deltaVs(p2p_1, p2p_dist, p2p_time, (UNCERTS["probe-dist"][probe_locs[i]], UNCERTS["probe-dist"][probe_locs[i+1]]), (p1_time_uncert, p2_time_uncert, data[x2_shot]["time"]["probe_uncert"]))
print(f"{probe_locs[i]}-{probe_locs[i + 1]} - G1 - Measured a shock speed of {p2p_1:.2f} +/- {uncert:.2f} m/s ({p2p_1/1000:.2f} +/- {uncert/1000:.2f} [{uncert/p2p_1 * 100:.2f}%] km/s)")
data[x2_shot]["shock-speed"][f"{probe_locs[i]}-{probe_locs[i + 1]}-g1"] = p2p_1, uncert, False # Speed, Ref
print(f"{probe_locs[i]}-{probe_locs[i + 1]} - G1 - Measured a shock speed of {p2p_1:.2f} m/s ({p2p_1/1000:.2f} km/s)")
data[x2_shot]["shock-speed"][f"{probe_locs[i]}-{probe_locs[i + 1]}-g1"] = p2p_1, False # Speed, Ref
if f"{probe_locs[i]}-g2" in data[x2_shot]["shock-point"] and f"{probe_locs[i+1]}-g2" in data[x2_shot]["shock-point"]:
p1_g2_time = data[x2_shot]["shock-point"][f"{probe_locs[i]}-g2"][1] / 1e6 # Convert to seconds
p2_g2_time = data[x2_shot]["shock-point"][f"{probe_locs[i+1]}-g2"][1] / 1e6 # Convert to seconds
p2p_time = abs(p2_g2_time - p1_g2_time)
p2p_2 = p2p_dist / p2p_time # m/s
p2p_2 = p2p / abs(p2_g2_time - p1_g2_time) # m/s
p1_time_uncert = data[x2_shot]["shock-point"][f"{probe_locs[i]}-g2"][2] / 1e6 # Convert to seconds
p2_time_uncert = data[x2_shot]["shock-point"][f"{probe_locs[i+1]}-g2"][2] / 1e6 # Convert to seconds
uncert = deltaVs(p2p_2, p2p_dist, p2p_time, (UNCERTS["probe-dist"][probe_locs[i]], UNCERTS["probe-dist"][probe_locs[i+1]]), (p1_time_uncert, p2_time_uncert, data[x2_shot]["time"]["probe_uncert"]))
print(f"{probe_locs[i]}-{probe_locs[i + 1]} - G2 - Measured a shock speed of {p2p_2:.2f} +/- {uncert:.2f} m/s ({p2p_2/1000:.2f} +/- {uncert/1000:.2f} [{uncert/p2p_2 * 100:.2f}%] km/s)")
data[x2_shot]["shock-speed"][f"{probe_locs[i]}-{probe_locs[i + 1]}-g2"] = p2p_2, uncert, False # Speed, Ref
print(f"{probe_locs[i]}-{probe_locs[i + 1]} - G2 - Measured a shock speed of {p2p_2:.2f} m/s ({p2p_2/1000:.2f} km/s)")
data[x2_shot]["shock-speed"][f"{probe_locs[i]}-{probe_locs[i + 1]}-g2"] = p2p_2, False # Speed, Ref
print()
# Return the data & the successfully loaded data keys
@ -378,7 +333,7 @@ print("Loaded Data")
#[TODO] Refactor
def genGraph(gData: dict, showPlot: bool = True, doLimits: bool = True, forcePlots: bool = False, addShockInfo: bool = True):
def genGraph(gData: dict, showPlot: bool = True, doLimits: bool = True, forcePlots: bool = False):
graphData = {
"title": f"Shock response Time\nFor {gData['info']['long_name']}",
"xLabel": "Time ($\\mu$s)",
@ -389,11 +344,6 @@ def genGraph(gData: dict, showPlot: bool = True, doLimits: bool = True, forcePlo
"plots": []
}
#if forcePlots or not doLimits: graphData["title"] += "\n"
#if forcePlots: graphData["title"] += "(All Data Shown)"
#if not doLimits: graphData["title"] += () + "Full Re"
lims = []
for label in gData["info"]["pcb-refs"]: # + ["trigbox"]:
@ -410,12 +360,12 @@ def genGraph(gData: dict, showPlot: bool = True, doLimits: bool = True, forcePlo
"x": gData["shock-point"][label][1],
"label": f"{label} - Shock Point {gData["shock-point"][label][1]:.2f}$\\mu$s",
"colour": "gray",
"args":{"zorder":2, "linestyle":"--", "alpha":0.5}
"args":{"zorder":2, "linestyle":"--"}
})
lims.append(gData["shock-point"][label][1]) # [TODO this but better]
for label, d in [("1 [V]", "Gauge 1"),("2 [V]", "Gauge 2")]: #, ("4 [V]", "Gauge Trigger")]:
for label, d in [("1 [V]", "G1"),("2 [V]", "G2")]: #, ("4 [V]", "Gauge Trigger")]:
graphData["plots"].append({
"x": gData["time"]["scope"],
"y": gData["data"]["scope"][label],
@ -427,9 +377,9 @@ def genGraph(gData: dict, showPlot: bool = True, doLimits: bool = True, forcePlo
graphData["plots"].append({
"type": "axvLine",
"x": gData["shock-point"][f"{probe}-g1"][1],#[i],
"label": f"{probe}-Gauge 1 - Shock Point {gData["shock-point"][f"{probe}-g1"][1]:.2f}$\\mu$s",
"colour": UQC["purple"].lighten(0.5),
"args":{"zorder":2, "linestyle":"--", "alpha":0.5}
"label": f"{probe}-G1 - Shock Point {gData["shock-point"][f"{probe}-g1"][1]:.2f}$\\mu$s",
#"colour": "gray",
"args":{"zorder":2, "linestyle":"--"}
})
lims.append(gData["shock-point"][f"{probe}-g1"][1])
@ -437,50 +387,40 @@ def genGraph(gData: dict, showPlot: bool = True, doLimits: bool = True, forcePlo
graphData["plots"].append({
"type": "axvLine",
"x": gData["shock-point"][f"{probe}-g2"][1],#[i],
"label": f"{probe}-Gauge 2 - Shock Point {gData["shock-point"][f"{probe}-g2"][1]:.2f}$\\mu$s",
"colour": UQC["purple"].lighten(0.5),
"args":{"zorder":2, "linestyle":"--", "alpha":0.5}
"label": f"{probe}-G2 - Shock Point {gData["shock-point"][f"{probe}-g2"][1]:.2f}$\\mu$s",
#"colour": "gray",
"args":{"zorder":2, "linestyle":"--"}
})
lims.append(gData["shock-point"][f"{probe}-g2"][1])
probeText = ""
for shock_speed_loc in gData["shock-speed"]:
probeText += "\n"
#probeText += "(Reference) " if gData["shock-speed"][shock_speed_loc][1] else ""
probeText += f"{shock_speed_loc} - {gData["shock-speed"][shock_speed_loc][0]/1000:.2f} km/s"
if addShockInfo:
probeText = ""
flag = False
for shock_speed_loc in gData["shock-speed"]:
if not flag and not gData["shock-speed"][shock_speed_loc][2]:
flag = True
probeText += "\n" + "-"*50
probeText += "\n"
#probeText += "\\definecolor{my_gray}{rbg}{0.6, 0.5803921568627451, 0.5647058823529412}\\textcolor{my_gray}{" if gData["shock-speed"][shock_speed_loc][1] else ""
probeText += f"{shock_speed_loc} - {gData['shock-speed'][shock_speed_loc][0]/1000:.2f} $\\pm${gData['shock-speed'][shock_speed_loc][1]/1000:.2f} [{gData['shock-speed'][shock_speed_loc][1]/gData['shock-speed'][shock_speed_loc][0]*100:.2f}%] km/s"
#probeText += "}" if gData["shock-speed"][shock_speed_loc][1] else ""
graphData["plots"].append({
"type": "text",
"text": f"Measured Shock Speeds {probeText}",
"align": ("top", "right"),
"alpha": 0.75,
"x": 0.94 if len(gData["info"]["probe-info"]["locations"]) < 3 else 0.885,
"y": 0.94
})
graphData["plots"].append({
"type": "text",
"text": f"Measured Shock Speeds{probeText}",
"align": ("top", "right"),
"x": 0.94, "y": 0.94
})
if doLimits and len(lims) > 1:
OFFSET = 10 #if not forcePlots else 50
OFFSET = 10
graphData["xLim"] = (float(min(lims) - OFFSET), float(max(lims) + OFFSET))
makeGraph(graphData, doProgramBlock=False, showPlot=showPlot, figSavePath=f"./images/{gData['info']['shot-info']['name']}{'-all' if forcePlots else ''}{'-clipped' if doLimits else ''}.png") #figSavePath=f"./images/{{0}}{"-noLims" if not doLimits else ""}.png")
makeGraph(graphData, doProgramBlock=False, showPlot=showPlot, figSavePath=f"./images/{{0}}{"-noLims" if not doLimits else ""}.png")
print("Graphing Data")
for shot in loaded_data:
#if shot != loaded_data[-2]: continue
genGraph(data[shot], showPlot=False, addShockInfo=False)
genGraph(data[shot], showPlot=False, forcePlots=True)
genGraph(data[shot], showPlot=False)
genGraph(data[shot], showPlot=False, doLimits=False, forcePlots=True)
# This forces matplotlib to hang until I tell it to close all windows
pltKeyClose()

View File

@ -35,37 +35,3 @@ volt-scale:
trigbox: 0.001 #V / mV
trigbox_delay: 0.001 #V / mV
uncertainties:
probe-dist:
sd1: 0.002 # +/- m
sd2: 0.002 # +/- m
sd3: 0.002 # +/- m
st1: 0.002 # +/- m
st2: 0.002 # +/- m
st3: 0.002 # +/- m
at1: 0.002 # +/- m
at2: 0.002 # +/- m
at3: 0.002 # +/- m
at4: 0.002 # +/- m
at5: 0.002 # +/- m
at6: 0.002 # +/- m
# [TODO] This could be better
st1-g1: 0.002 # +/- m
st1-g2: 0.002 # +/- m
st2-g1: 0.002 # +/- m
st2-g2: 0.002 # +/- m
st3-g1: 0.002 # +/- m
st3-g2: 0.002 # +/- m
time:
x2-daq: 0.00000039999999999996 # 30MHz ?