diff --git a/PythonScripts/Calibration.py b/PythonScripts/Calibration.py new file mode 100644 index 0000000000000000000000000000000000000000..1eb7c6b578da84ec8c18ce95d83865c99a379a1a --- /dev/null +++ b/PythonScripts/Calibration.py @@ -0,0 +1,200 @@ +import numpy as np +from scipy.optimize import curve_fit +import matplotlib.pyplot as plt +from matplotlib.offsetbox import AnchoredText +import sys +## Performs linear fit for calibration + +def FitAndPlot(xp, xm, z1p, z1m, z2p, z2m, z3p, z3m, zAllp, zAllm, Voltage, plots, raw): + #Linewidth + lw = 0.8 + + # + if(plots): + if(raw): + plt.title("Calibration Measurement " + str(Voltage)) + plt.plot(xp, z1p, marker=".", color="tab:blue", label="z1-", linewidth=lw) + plt.plot(xp, z1m, marker=".", color="b", label="z1+", linewidth=lw) + plt.plot(xp, z2p, marker=".", color="tab:red", label="z2-", linewidth=lw) + plt.plot(xp, z2m, marker=".", color="chocolate", label="z2+", linewidth=lw) + plt.plot(xp, z3p, marker=".", color="tab:green", label="z3-", linewidth=lw) + plt.plot(xp, z3m, marker=".", color="darkolivegreen", label="z3+", linewidth=lw) + plt.plot(xp, zAllp, marker=".", color="tab:purple", label="zAll-", linewidth=lw) + plt.plot(xp, zAllm, marker=".", color="m", label="zAll+", linewidth=lw) + plt.ylabel(r"Measured Movement [$\mu m$]") + plt.xlabel("# of step") + plt.legend() + plt.grid() + plt.savefig("Plots\Calibration\\" + str(Voltage) + "_All_Data.pdf") + plt.show() + + # Fit + # Errors are 1/sqrt(12) * one pixel length in mikrometers + error_z1 = 8.87 / np.sqrt(12) + error_z2 = 9.62 / np.sqrt(12) + error_z3 = 9.80 / np.sqrt(12) + error_zAll = 9.00 / np.sqrt(12) + + popt_z1p, pcov_z1p = curve_fit(linear, xp, z1p, error_z1) + popt_z1m, pcov_z1m = curve_fit(linear, xp, z1m, error_z1) + popt_z2p, pcov_z2p = curve_fit(linear, xp, z2p, error_z2) + popt_z2m, pcov_z2m = curve_fit(linear, xp, z2m, error_z2) + popt_z3p, pcov_z3p = curve_fit(linear, xp, z3p, error_z3) + popt_z3m, pcov_z3m = curve_fit(linear, xp, z3m, error_z3) + popt_zAllp, pcov_zAllp = curve_fit(linear, xp, zAllp, error_zAll) + popt_zAllm, pcov_zAllm = curve_fit(linear, xp, zAllm, error_zAll) + + # Chi squared Computation per degree of freedom + chi_z1p = np.sum(((z1p - linear(xp, popt_z1p[0]))**2 / error_z1**2)) / (len(z1p) - 1) + chi_z1m = np.sum(((z1m - linear(xp, popt_z1m[0]))**2 / error_z1**2)) / (len(z1m) - 1) + chi_z2p = np.sum(((z2p - linear(xp, popt_z2p[0]))**2 / error_z2**2)) / (len(z2p) - 1) + chi_z2m = np.sum(((z2m - linear(xp, popt_z2m[0]))**2 / error_z2**2)) / (len(z2m) - 1) + chi_z3p = np.sum(((z3p - linear(xp, popt_z3p[0]))**2 / error_z3**2)) / (len(z3p) - 1) + chi_z3m = np.sum(((z3m - linear(xp, popt_z3m[0]))**2 / error_z3**2)) / (len(z3m) - 1) + chi_zAllp = np.sum(((zAllp - linear(xp, popt_zAllp[0]))**2 / error_zAll**2)) / (len(zAllp) - 1) + chi_zAllm = np.sum(((zAllm - linear(xp, popt_zAllm[0]))**2 / error_zAll**2)) / (len(zAllm) - 1) + + # Plots + fig, ax = plt.subplots(2, 2) + fig.set_figheight(9) + fig.set_figwidth(16) + + # Z1 + capsize = 2 + if(plots): + ax[0,0].set_title("Z1 calibration fit " + str(Voltage)) + ax[0,0].set_xlabel("# of steps") + ax[0,0].set_ylabel(r"Measured Movement [$\mu m$]") + ax[0,0].errorbar(xp, z1p, error_z1, linestyle="none", marker=".", linewidth=lw, color="tab:blue", label="z1- data", capsize=capsize) + ax[0,0].errorbar(xp, z1m, error_z1, linestyle="none", marker=".", linewidth=lw, color="b", label="z1+ data", capsize=capsize) + ax[0,0].plot(xp, linear(xp, popt_z1p[0]), linewidth=lw, color="tab:blue", label="z1- fit") + ax[0,0].plot(xp, linear(xp, popt_z1m[0]), linewidth=lw, color="b", label="z1+ fit") + + #ax = plt.gca() + anchored_text = AnchoredText(r"$b_-$= {:.2f} $\pm$ {:.2f} $n m$/step, $\chi^2/ndof =${:.2f}".format(popt_z1p[0] * 1000, np.sqrt(pcov_z1p[0][0]) * 1000, chi_z1p) + "\n" + "$b_+$= {:.2f} $\pm$ {:.2f} $n m$/step, $\chi^2/ndof =${:.2f}".format(popt_z1m[0] * 1000, np.sqrt(pcov_z1m[0][0]) * 1000, chi_z1m), loc=4) + ax[0,0].add_artist(anchored_text) + + ax[0,0].legend() + plt.grid() + #plt.savefig("Plots\Calibration\Z1_" + str(Voltage) + ".pdf") + #plt.show() + + print("slope in nm/step z1-:", popt_z1p[0] * 1000, " +- ", np.sqrt(pcov_z1p[0][0]) * 1000, " chi^2 ", chi_z1p) + print("slope in nm/step z1+:", popt_z1m[0] * 1000, " +- ", np.sqrt(pcov_z1m[0][0]) * 1000, " chi^2 ", chi_z1m) + + #Z2 + if(plots): + ax[0,1].set_title("Z2 calibration fit " + str(Voltage)) + ax[0,1].set_xlabel("# of steps") + ax[0,1].set_ylabel(r"Measured Movement [$\mu m$]") + ax[0,1].errorbar(xp, z2p, error_z2, linestyle="none", marker=".", linewidth=lw, color="tab:red", label="z2- data", capsize=capsize) + ax[0,1].errorbar(xp, z2m, error_z2, linestyle="none", marker=".", linewidth=lw, color="chocolate", label="z2+ data", capsize=capsize) + ax[0,1].plot(xp, linear(xp, popt_z2p[0]), linewidth=lw, color="tab:red", label="z2- fit") + ax[0,1].plot(xp, linear(xp, popt_z2m[0]), linewidth=lw, color="chocolate", label="z2+ fit") + + #ax = plt.gca() + anchored_text = AnchoredText(r"$b_-$= {:.2f} $\pm$ {:.2f} $n m$/step, $\chi^2/ndof =${:.2f}".format(popt_z2p[0] * 1000, np.sqrt(pcov_z2p[0][0]) * 1000, chi_z2p) + "\n" + "$b_+$= {:.2f} $\pm$ {:.2f} $n m$/step, $\chi^2/ndof =${:.2f}".format(popt_z2m[0] * 1000, np.sqrt(pcov_z2m[0][0]) * 1000, chi_z2m), loc=4) + ax[0,1].add_artist(anchored_text) + + ax[0,1].legend() + plt.grid() + #plt.savefig("Plots\Calibration\Z2_" + str(Voltage) + ".pdf") + #plt.show() + + print("slope in nm/step z2-:", popt_z2p[0] * 1000, " +- ", np.sqrt(pcov_z2p[0][0]) * 1000, " chi^2 ", chi_z2p) + print("slope in nm/step z2+:", popt_z2m[0] * 1000, " +- ", np.sqrt(pcov_z2m[0][0]) * 1000, " chi^2 ", chi_z2m) + + #Z3 + if(plots): + ax[1,0].set_title("Z3 calibration fit " + str(Voltage)) + ax[1,0].set_xlabel("# of steps") + ax[1,0].set_ylabel(r"Measured Movement [$\mu m$]") + ax[1,0].errorbar(xp, z3p, error_z3, linestyle="none", marker=".", linewidth=lw, color="tab:green", label="z3- data", capsize=capsize) + ax[1,0].errorbar(xp, z3m, error_z3, linestyle="none", marker=".", linewidth=lw, color="darkolivegreen", label="z3+ data", capsize=capsize) + ax[1,0].plot(xp, linear(xp, popt_z3p[0]), linewidth=lw, color="tab:green", label="z3- fit") + ax[1,0].plot(xp, linear(xp, popt_z3m[0]), linewidth=lw, color="darkolivegreen", label="z3+ fit") + + #ax = plt.gca() + anchored_text = AnchoredText(r"$b_-$= {:.2f} $\pm$ {:.2f} $n m$/step, $\chi^2/ndof =${:.2f}".format(popt_z3p[0] * 1000, np.sqrt(pcov_z3p[0][0]) * 1000, chi_z3p) + "\n" + "$b_+$= {:.2f} $\pm$ {:.2f} $n m$/step, $\chi^2/ndof =${:.2f}".format(popt_z3m[0] * 1000, np.sqrt(pcov_z3m[0][0]) * 1000, chi_z3m), loc=4) + ax[1,0].add_artist(anchored_text) + + ax[1,0].legend() + plt.grid() + #plt.savefig("Plots\Calibration\Z3_" + str(Voltage) + ".pdf") + #plt.show() + + print("slope in nm/step z3-:", popt_z3p[0] * 1000, " +- ", np.sqrt(pcov_z3p[0][0]) * 1000, " chi^2 ", chi_z3p) + print("slope in nm/step z3+:", popt_z3m[0] * 1000, " +- ", np.sqrt(pcov_z3m[0][0]) * 1000, " chi^2 ", chi_z3p) + + #ZALL + if(plots): + ax[1,1].set_title("ZAll calibration fit " + str(Voltage)) + ax[1,1].set_xlabel("# of steps") + ax[1,1].set_ylabel(r"Measured Movement [$\mu m$]") + ax[1,1].errorbar(xp, zAllp, error_zAll, linestyle="none", marker=".", linewidth=lw, color="tab:purple", label="zAll- data", capsize=capsize) + ax[1,1].errorbar(xp, zAllm, error_zAll, linestyle="none", marker=".", linewidth=lw, color="m", label="zAll+ data", capsize=capsize) + ax[1,1].plot(xp, linear(xp, popt_zAllp[0]), linewidth=lw, color="tab:purple", label="zAll- fit") + ax[1,1].plot(xp, linear(xp, popt_zAllm[0]), linewidth=lw, color="m", label="zAll+ fit") + + #ax = plt.gca() + anchored_text = AnchoredText(r"$b_-$= {:.2f} $\pm$ {:.2f} $n m$/step, $\chi^2/ndof =${:.2f}".format(popt_zAllp[0] * 1000, np.sqrt(pcov_zAllp[0][0]) * 1000, chi_zAllp) + "\n" + "$b_+$= {:.2f} $\pm$ {:.2f} $n m$/step, $\chi^2/ndof =${:.2f}".format(popt_zAllm[0] * 1000, np.sqrt(pcov_zAllm[0][0]) * 1000, chi_zAllm), loc=4) + ax[1,1].add_artist(anchored_text) + + ax[1,1].legend() + plt.grid() + plt.savefig("Plots\Calibration\Z_" + str(Voltage) + ".pdf") + plt.savefig("Plots\Calibration\Z_" + str(Voltage) + ".png", dpi=300) + plt.show() + + print("slope in nm/step zAll-:", popt_zAllp[0] * 1000, " +- ", np.sqrt(pcov_zAllp[0][0]) * 1000, " chi^2 ", chi_zAllp) + print("slope in nm/step zAll+:", popt_zAllm[0] * 1000, " +- ", np.sqrt(pcov_zAllm[0][0]) * 1000, " chi^2 ", chi_zAllp) + +def linear(x, b): + return b*x + +def dataHandling(data, plots, raw): + x = data[0] + z1p = data[1] + z1m = data[2] + z2p = data[3] + z2m = data[4] + z3p = data[5] + z3m = data[6] + # Check if calibration performed for all otherwise use dummy data. + if(len(data) > 7): + zAllp = data[7] + zAllm = data[8] + else: + zAllp = np.zeros(len(z1p)) + zAllm = np.zeros(len(z1m)) + + FitAndPlot(x, x, z1p, z1m, z2p, z2m, z3p, z3m, zAllp, zAllm, 85, plots, raw) + +def main(): + plots = True + raw = False + + file = "C:\MaskAligner\Data\Calibration.csv" + + # very Simple commandline parser + if("--no_plots" in sys.argv): + plots = False + + if("--file" in sys.argv or "-f" in sys.argv): + for i in range(len(sys.argv)): + if("--file" in sys.argv[i] or "-f" == sys.argv[i]): + try: + file = sys.argv[i+1] + except: + print("No file or incorrect file specification.") + + if("--raw_plot" in sys.argv): + raw = True + + data = np.genfromtxt(file, skip_header=0, delimiter=",") + data = data.T + + dataHandling(data, plots, raw) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/PythonScripts/CalibrationAfterRepair.py b/PythonScripts/CalibrationAfterRepair.py new file mode 100644 index 0000000000000000000000000000000000000000..f1ea162f3a988f03c8b80a0c3656c0e32f3f0625 --- /dev/null +++ b/PythonScripts/CalibrationAfterRepair.py @@ -0,0 +1,307 @@ +import numpy as np +from scipy.optimize import curve_fit +import matplotlib.pyplot as plt +import matplotlib.font_manager as font_manager +from matplotlib.offsetbox import AnchoredText +import sys +from sigfig import round + +#plt.rcParams['font.family'] = 'monospace' + +class var_with_err: + def __init__(self, var, err): + self.var = var + self.err = err + + def __str__(self): + return round(self.var, uncertainty=self.err) + +def linear(x, b): + return b*x + +def FitAndPlot(x, z1p, z1m, z2p, z2m, z3p, z3m, z1p_err, z1m_err, z2p_err, z2m_err, z3p_err, z3m_err, voltage, sigma, plots = True, raw = False, residuals=True): + + font = font_manager.FontProperties(family='DejaVu Sans Mono', style='normal') + + fac = 1e6 + + popt_z1p, pcov_z1p = curve_fit(linear, x, z1p, sigma=z1p_err) + popt_z1m, pcov_z1m = curve_fit(linear, x, z1m, sigma=z1m_err) + popt_z2p, pcov_z2p = curve_fit(linear, x, z2p, sigma=z2p_err) + popt_z2m, pcov_z2m = curve_fit(linear, x, z2m, sigma=z2m_err) + popt_z3p, pcov_z3p = curve_fit(linear, x, z3p, sigma=z3p_err) + popt_z3m, pcov_z3m = curve_fit(linear, x, z3m, sigma=z3m_err) + + step_z1p = var_with_err(popt_z1p[0] * fac, np.sqrt(pcov_z1p[0][0]) * fac) + step_z1m = var_with_err(popt_z1m[0] * fac, np.sqrt(pcov_z1m[0][0]) * fac) + step_z2p = var_with_err(popt_z2p[0] * fac, np.sqrt(pcov_z2p[0][0]) * fac) + step_z2m = var_with_err(popt_z2m[0] * fac, np.sqrt(pcov_z2m[0][0]) * fac) + step_z3p = var_with_err(popt_z3p[0] * fac, np.sqrt(pcov_z3p[0][0]) * fac) + step_z3m = var_with_err(popt_z3m[0] * fac, np.sqrt(pcov_z3m[0][0]) * fac) + + chi_z1p = np.sum(((z1p - linear(x, popt_z1p[0]))/z1p_err)**2) / len(x - 2) + chi_z1m = np.sum(((z1m - linear(x, popt_z1m[0]))/z1m_err)**2) / len(x - 2) + chi_z2p = np.sum(((z2p - linear(x, popt_z2p[0]))/z2p_err)**2) / len(x - 2) + chi_z2m = np.sum(((z2m - linear(x, popt_z2m[0]))/z2m_err)**2) / len(x - 2) + chi_z3p = np.sum(((z3p - linear(x, popt_z3p[0]))/z3p_err)**2) / len(x - 2) + chi_z3m = np.sum(((z3m - linear(x, popt_z3m[0]))/z3m_err)**2) / len(x - 2) + + err_z3z2p = popt_z3p[0] * fac / (popt_z2p[0] * fac) + err_z3z2m = popt_z3m[0] * fac / (popt_z2m[0] * fac) + err_z3z1p = popt_z3p[0] * fac / (popt_z1p[0] * fac) + err_z3z1m = popt_z3m[0] * fac / (popt_z1m[0] * fac) + err_z2z1p = popt_z2p[0] * fac / (popt_z1p[0] * fac) + err_z2z1m = popt_z2m[0] * fac / (popt_z1m[0] * fac) + + print("### Voltage: ", voltage, " ###") + + print("z1p: ", step_z1p, " nm/step ", "chi^2/ndof = ", chi_z1p) + print("z1m: ", step_z1m, " nm/step ", "chi^2/ndof = ", chi_z1m) + print("z2p: ", step_z2p, " nm/step ", "chi^2/ndof = ", chi_z2p) + print("z2m: ", step_z2m, " nm/step ", "chi^2/ndof = ", chi_z2m) + print("z3p: ", step_z3p, " nm/step ", "chi^2/ndof = ", chi_z3p) + print("z3m: ", step_z3m, " nm/step ", "chi^2/ndof = ", chi_z3m) + + print("error (ratio) + z3/z2: ", popt_z3p[0] * fac / (popt_z2p[0] * fac)) + print("error (ratio) - z3/z2: ", popt_z3m[0] * fac / (popt_z2m[0] * fac)) + print("error (ratio) + z3/z1: ", popt_z3p[0] * fac / (popt_z1p[0] * fac)) + print("error (ratio) - z3/z1: ", popt_z3m[0] * fac / (popt_z1m[0] * fac)) + print("error (ratio) + z2/z1: ", popt_z2p[0] * fac / (popt_z1p[0] * fac)) + print("error (ratio) - z2/z1: ", popt_z2m[0] * fac / (popt_z1m[0] * fac)) + + + if plots: + + x_inter = np.arange(min(x), max(x), 1) + l_jus = 5 + + if not residuals: + fig = plt.figure() + else: + fig, ax = plt.subplots(2,1, sharex=True, gridspec_kw={'height_ratios': [3,1]}) + + fig.set_figheight(4.5) + fig.set_figwidth(8) + + if residuals: + + ax[0].set_title("Mask Aligner Motors at " + str(voltage) + " V") + ax[0].errorbar(x + 80, z1p, z1p_err, marker=".", linestyle="none", capsize=3, label="z1+:".ljust(l_jus ) + str(step_z1p) + " nm/step ", color="tab:blue") + ax[0].errorbar(x + 40, z2p, z2p_err, marker=".", linestyle="none", capsize=3, label="z2+:".ljust(l_jus ) + str(step_z2p) + " nm/step ", color="tab:orange") + ax[0].errorbar(x - 40, z3p, z3p_err, marker=".", linestyle="none", capsize=3, label="z3+:".ljust(l_jus ) + str(step_z3p) + " nm/step ", color="tab:purple") + + ax[0].plot(x_inter, linear(x_inter, popt_z1p[0]), color="tab:blue") + ax[0].plot(x_inter, linear(x_inter, popt_z1m[0]), color="tab:cyan") + + ax[0].plot(x_inter, linear(x_inter, popt_z2p[0]), color="tab:orange") + ax[0].plot(x_inter, linear(x_inter, popt_z2m[0]), color="tab:red") + + ax[0].errorbar(x - 80, z1m, z1m_err, marker=".", linestyle="none", capsize=3, label="z1-:".ljust(l_jus ) + str(step_z1m) + " nm/step ", color="tab:cyan") + ax[0].errorbar(x + 120, z2m, z2m_err, marker=".", linestyle="none", capsize=3, label="z2-:".ljust(l_jus ) + str(step_z2m) + " nm/step ", color="tab:red") + ax[0].errorbar(x, z3m, z3m_err, marker=".", linestyle="none", capsize=3, label="z3-:".ljust(l_jus ) + str(step_z3m) + " nm/step ", color="tab:pink") + ax[0].plot(x_inter, linear(x_inter, popt_z3p[0]), color="tab:purple") + ax[0].plot(x_inter, linear(x_inter, popt_z3m[0]), color="tab:pink") + + ax[0].set_xlabel("Number of steps driven") + ax[0].set_ylabel("Distance travelled [mm]") + ax[0].legend(handletextpad=0.1, prop = font) + ax[0].grid() + plt.tight_layout() + + #ax[1].set_title("residuals") + ax[1].errorbar(x + 80, z1p - linear(x, popt_z1p[0]), z1p_err, marker=".", linestyle="none", capsize=3, label="z1+:".ljust(l_jus ) + str(step_z1p) + " nm/step ", color="tab:blue") + ax[1].errorbar(x + 40, z2p - linear(x, popt_z2p[0]), z2p_err, marker=".", linestyle="none", capsize=3, label="z2+:".ljust(l_jus ) + str(step_z2p) + " nm/step ", color="tab:orange") + ax[1].errorbar(x- 40, z3p - linear(x, popt_z3p[0]), z3p_err, marker=".", linestyle="none", capsize=3, label="z3+:".ljust(l_jus ) + str(step_z3p) + " nm/step ", color="tab:purple") + + ax[1].plot(x_inter, np.zeros(len(x_inter)), color="tab:blue") + ax[1].set_ylim(0 - max(np.absolute(z3m - linear(x, popt_z1m[0]))) - max(z3m_err) - 0.05, 0 + max(np.absolute(z3m - linear(x, popt_z1m[0]))) + max(z3m_err)+ 0.05) + #ax[1].plot(x_inter, linear(x_inter, popt_z1m[0]), color="tab:cyan") + + #ax[1].plot(x_inter, linear(x_inter, popt_z2p[0]), color="tab:orange") + #ax[1].plot(x_inter, linear(x_inter, popt_z2m[0]), color="tab:red") + + ax[1].errorbar(x - 80, z1m - linear(x, popt_z1m[0]), z1m_err, marker=".", linestyle="none", capsize=3, label="z1-:".ljust(l_jus ) + str(step_z1m) + " nm/step ", color="tab:cyan") + ax[1].errorbar(x + 120, z2m - linear(x, popt_z1m[0]), z2m_err, marker=".", linestyle="none", capsize=3, label="z2-:".ljust(l_jus ) + str(step_z2m) + " nm/step ", color="tab:red") + ax[1].errorbar(x, z3m - linear(x, popt_z1m[0]), z3m_err, marker=".", linestyle="none", capsize=3, label="z3-:".ljust(l_jus ) + str(step_z3m) + " nm/step ", color="tab:pink") + #ax[1].plot(x_inter, linear(x_inter, popt_z3p[0]), color="tab:purple") + #ax[1].plot(x_inter, linear(x_inter, popt_z3m[0]), color="tab:pink") + + ax[1].set_xlabel("Number of steps driven") + ax[1].set_ylabel("Distance travelled [mm]") + + ax[1].grid() + + else: + + plt.title("Mask Aligner Motors at " + str(voltage) + " V") + plt.errorbar(x + 80, z1p, z1p_err, marker=".", linestyle="none", capsize=3, label="z1+:".ljust(l_jus ) + str(step_z1p) + " nm/step ", color="tab:blue") + plt.errorbar(x + 40, z2p, z2p_err, marker=".", linestyle="none", capsize=3, label="z2+:".ljust(l_jus ) + str(step_z2p) + " nm/step ", color="tab:orange") + plt.errorbar(x - 40, z3p, z3p_err, marker=".", linestyle="none", capsize=3, label="z3+:".ljust(l_jus ) + str(step_z3p) + " nm/step ", color="tab:purple") + + plt.plot(x_inter, linear(x_inter, popt_z1p[0]), color="tab:blue") + plt.plot(x_inter, linear(x_inter, popt_z1m[0]), color="tab:cyan") + + plt.plot(x_inter, linear(x_inter, popt_z2p[0]), color="tab:orange") + plt.plot(x_inter, linear(x_inter, popt_z2m[0]), color="tab:red") + + plt.errorbar(x - 80, z1m, z1m_err, marker=".", linestyle="none", capsize=3, label="z1-:".ljust(l_jus ) + str(step_z1m) + " nm/step ", color="tab:cyan") + plt.errorbar(x + 120, z2m, z2m_err, marker=".", linestyle="none", capsize=3, label="z2-:".ljust(l_jus ) + str(step_z2m) + " nm/step ", color="tab:red") + plt.errorbar(x, z3m, z3m_err, marker=".", linestyle="none", capsize=3, label="z3-:".ljust(l_jus ) + str(step_z3m) + " nm/step ", color="tab:pink") + plt.plot(x_inter, linear(x_inter, popt_z3p[0]), color="tab:purple") + plt.plot(x_inter, linear(x_inter, popt_z3m[0]), color="tab:pink") + + plt.xlabel("Number of steps driven") + plt.ylabel("Distance travelled [mm]") + plt.legend(handletextpad=0.1, prop = font) + plt.grid() + plt.tight_layout() + + plt.savefig("Plots/CalibrationAfterRepair/" + str(voltage) + "V.pdf") + plt.savefig("Plots/CalibrationAfterRepair/" + str(voltage) + "V.png", dpi=300) + plt.show() + + return step_z1p, step_z1m, step_z2p, step_z2m, step_z3p, step_z3m, err_z3z2p, err_z3z2m, err_z3z1p, err_z3z1m, err_z2z1p, err_z2z1m + +def dataHandling(data, offset, voltage, plots, raw): + x = data[0 + offset] + z3m = data[1 + offset] + z3p = data[2 + offset] + z2m = data[3 + offset] + z2p = data[4 + offset] + z1m = data[5 + offset] + z1p = data[6 + offset] + + z3m_err = data[7 + offset] + z3p_err = data[8 + offset] + z2m_err = data[9 + offset] + z2p_err = data[10 + offset] + z1m_err = data[11 + offset] + z1p_err = data[12 + offset] + + sigma = np.ones(len(x)) * data[0][0] + + #Check for empty data and fill with dummy + if np.isnan(z1p).any(): + z1p = np.zeros(5) + if np.isnan(z1m).any(): + z1m = np.zeros(5) + if np.isnan(z2p).any(): + z2p = np.zeros(5) + if np.isnan(z2m).any(): + z2m = np.zeros(5) + if np.isnan(z3p).any(): + z3p = np.zeros(5) + if np.isnan(z3m).any(): + z3m = np.zeros(5) + + if np.isnan(z1p_err).any(): + z1p_err = np.ones(5) * sigma + if np.isnan(z1m_err).any(): + z1m_err = np.ones(5) * sigma + if np.isnan(z2p_err).any(): + z2p_err = np.ones(5) * sigma + if np.isnan(z2m_err).any(): + z2m_err = np.ones(5) * sigma + if np.isnan(z3p_err).any(): + z3p_err = np.ones(5) * sigma + if np.isnan(z3m_err).any(): + z3m_err = np.ones(5) * sigma + + step_z1p, step_z1m, step_z2p, step_z2m, step_z3p, step_z3m, err_z3z2p, err_z3z2m, err_z3z1p, err_z3z1m, err_z2z1p, err_z2z1m = FitAndPlot(x, z1p, z1m, z2p, z2m, z3p, z3m, z1p_err, z1m_err, z2p_err, z2m_err, z3p_err, z3m_err, voltage, sigma, plots, raw) + return step_z1p, step_z1m, step_z2p, step_z2m, step_z3p, step_z3m, err_z3z2p, err_z3z2m, err_z3z1p, err_z3z1m, err_z2z1p, err_z2z1m + +def main(): + plots = True + raw = False + + file = "C:\MaskAligner\Data\Calibration\CalibrationAfterRepair_13_11_23.csv" + + # very Simple commandline parser + if("--no_plots" in sys.argv): + plots = False + + if("--file" in sys.argv or "-f" in sys.argv): + for i in range(len(sys.argv)): + if("--file" in sys.argv[i] or "-f" == sys.argv[i]): + try: + file = sys.argv[i+1] + except: + print("No file or incorrect file specification.") + + if("--raw_plot" in sys.argv): + raw = True + + data = np.genfromtxt(file, skip_header=1, delimiter=",") + data = data.T + + arr = [] + + arr.append(dataHandling(data, 43, 70, plots, raw)) + arr.append(dataHandling(data, 1, 80, plots, raw)) + arr.append(dataHandling(data, 15, 100, plots, raw)) + arr.append(dataHandling(data, 29, 120, plots, raw)) + + arr = np.array(arr).T + + ## Plot motors errors against one another against voltage + + fig = plt.figure() + fig.set_figheight(4.5) + fig.set_figwidth(8) + + plt.plot([70, 80, 100, 120], arr[6], label="error z3/z2+", marker=".", linestyle="dashed") + plt.plot([70, 80, 100, 120], arr[8], label="error z3/z1+", marker=".", linestyle="dashed") + plt.plot([70, 80, 100, 120], arr[10], label="error z2/z1+", marker=".", linestyle="dashed") + plt.plot([70, 80, 100, 120], arr[7], label="error z3/z2-", marker=".", linestyle="dashed") + plt.plot([70, 80, 100, 120], arr[9], label="error z3/z1-", marker=".", linestyle="dashed") + plt.plot([70, 80, 100, 120], arr[11], label="error z2/z1-", marker=".", linestyle="dashed") + plt.xlabel("Voltage [V]") + plt.ylabel("ratio of motor's stepsizes") + plt.legend() + plt.tight_layout() + plt.savefig("Plots/CalibrationAfterRepair/Errors.pdf") + plt.savefig("Plots/CalibrationAfterRepair/Errors.png", dpi=300) + plt.show() + + ## Plot stepsizes against voltage + fig = plt.figure() + fig.set_figheight(4.5) + fig.set_figwidth(8) + + plt.errorbar([70, 80, 100, 120], [x.var for x in arr[0]], [x.err for x in arr[0]], label="z1+", marker=".", linestyle="dashed", capsize=3, color="tab:blue") + plt.errorbar([70, 80, 100, 120], [x.var for x in arr[1]], [x.err for x in arr[1]], label="z1-", marker=".", linestyle="dashed", capsize=3, color="tab:cyan") + plt.errorbar([70, 80, 100, 120], [x.var for x in arr[2]], [x.err for x in arr[2]], label="z2+", marker=".", linestyle="dashed", capsize=3, color="tab:orange") + plt.errorbar([70, 80, 100, 120], [x.var for x in arr[3]], [x.err for x in arr[3]], label="z2-", marker=".", linestyle="dashed", capsize=3, color="tab:red") + plt.errorbar([70, 80, 100, 120], [x.var for x in arr[4]], [x.err for x in arr[4]], label="z3+", marker=".", linestyle="dashed", capsize=3, color="tab:purple") + plt.errorbar([70, 80, 100, 120], [x.var for x in arr[5]], [x.err for x in arr[5]], label="z3-", marker=".", linestyle="dashed", capsize=3, color="tab:pink") + plt.xlabel("Voltage [V]") + plt.ylabel("stepsize [nm/step]") + plt.legend() + plt.tight_layout() + plt.savefig("Plots/CalibrationAfterRepair/Stepsizes.pdf") + plt.savefig("Plots/CalibrationAfterRepair/Stepsizes.png", dpi=300) + plt.show() + + + ## Plot up/down ratio against Voltage + z1_ud = var_with_err(np.array([x.var for x in arr[0]])/np.array([x.var for x in arr[1]]), np.sqrt((1/np.array([x.var for x in arr[1]]) * np.array([x.err for x in arr[0]]))**2 + (np.array([x.var for x in arr[0]])/np.array([x.var for x in arr[1]])**2 * np.array([x.err for x in arr[1]]))**2)) + z2_ud = var_with_err(np.array([x.var for x in arr[2]])/np.array([x.var for x in arr[3]]), np.sqrt((1/np.array([x.var for x in arr[3]]) * np.array([x.err for x in arr[2]]))**2 + (np.array([x.var for x in arr[2]])/np.array([x.var for x in arr[3]])**2 * np.array([x.err for x in arr[3]]))**2)) + z3_ud = var_with_err(np.array([x.var for x in arr[4]])/np.array([x.var for x in arr[5]]), np.sqrt((1/np.array([x.var for x in arr[5]]) * np.array([x.err for x in arr[4]]))**2 + (np.array([x.var for x in arr[4]])/np.array([x.var for x in arr[5]])**2 * np.array([x.err for x in arr[5]]))**2)) + + fig = plt.figure() + fig.set_figheight(4.5) + fig.set_figwidth(8) + + plt.errorbar([70, 80, 100, 120], z1_ud.var, z1_ud.err, label="z1", marker=".", linestyle="dashed", capsize=3, color="tab:blue") + plt.errorbar([70, 80, 100, 120], z2_ud.var, z2_ud.err, label="z2", marker=".", linestyle="dashed", capsize=3, color="tab:cyan") + plt.errorbar([70, 80, 100, 120], z3_ud.var, z3_ud.err, label="z3", marker=".", linestyle="dashed", capsize=3, color="tab:orange") + plt.xlabel("Voltage [V]") + plt.ylabel("ratio approach/retract") + plt.legend() + plt.tight_layout() + plt.savefig("Plots/CalibrationAfterRepair/ratioUD.pdf") + plt.savefig("Plots/CalibrationAfterRepair/ratioUD.png", dpi=300) + plt.show() + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/PythonScripts/CalibrationDragAndDrop.bat b/PythonScripts/CalibrationDragAndDrop.bat new file mode 100644 index 0000000000000000000000000000000000000000..418a6bde516c75a95372e393ff8445c9fb074653 --- /dev/null +++ b/PythonScripts/CalibrationDragAndDrop.bat @@ -0,0 +1,3 @@ +@echo off +cd /D "%~dp0" +for %%a in (%*) do py .\Calibration.py --file %%a diff --git a/PythonScripts/CalibrationTimeScrew.py b/PythonScripts/CalibrationTimeScrew.py new file mode 100644 index 0000000000000000000000000000000000000000..f3401892781628ec767b4325fe1d718ba69c18ec --- /dev/null +++ b/PythonScripts/CalibrationTimeScrew.py @@ -0,0 +1,77 @@ +import numpy as np +import matplotlib.pyplot as plt +import sys + +def plottingSingle(rot, zp, zm, err_t = 1, name="z1"): + plt.errorbar(rot, zp, err_t, label=name + " down") + plt.errorbar(rot, zm, err_t, label=name + " up") + + plt.xlabel("screw rotations") + plt.ylabel("t [s]") + plt.legend() + plt.show() + +def plottingAll(rot, z1p, z1m, z2p, z2m, z3p, z3m, err_t = np.sqrt(2)): + plt.errorbar(rot, z1p, err_t, label="z1 down") + plt.errorbar(rot, z1m, err_t, label="z1 up") + plt.errorbar(rot, z2p, err_t, label="z2 down") + plt.errorbar(rot, z2m, err_t, label="z2 up") + plt.errorbar(rot, z3p, err_t, label="z3 down") + plt.errorbar(rot, z3m, err_t, label="z3 up") + + plt.xlabel("screw rotations") + plt.ylabel("t [s]") + plt.legend() + plt.show() + +def plottingRatio(rot, z1, z2, z3, err_t = 1): + plt.errorbar(rot, z1, err_t, label="z1 up/down") + plt.errorbar(rot, z2, err_t, label="z2 up/down") + plt.errorbar(rot, z3, err_t, label="z3 up/down") + + plt.xlabel("screw rotations") + plt.ylabel("t [s]") + plt.legend() + plt.show() + +def main(): + if("--no_plots" in sys.argv): + plots = False + + plt.style.use('tableau-colorblind10') + + file = "" + if("--file" in sys.argv or "-f" in sys.argv): + for i in range(len(sys.argv)): + if("--file" in sys.argv[i] or "-f" == sys.argv[i]): + try: + file = sys.argv[i+1] + except: + print("No file or incorrect file specification.") + + data = np.genfromtxt(file, delimiter=",", skip_header=1) + data = data.T + rot = data[0] + z1p = data[1] + z1m = data[2] + z2p = data[3] + z2m = data[4] + z3p = data[5] + z3m = data[6] + + err_t = 1.5 + + plottingSingle(rot, z1p, z1m, err_t) + plottingSingle(rot, z2p, z2m, err_t, "z2") + plottingSingle(rot, z3p, z3m, err_t, "z3") + + plottingAll(rot, z1p, z1m, z2p, z2m, z3p, z3m) + + plottingRatio(rot, z1p/z1m, z2p/z2m, z3p/z3m) + + print(z1p/z1m) + print(z2p/z2m) + print(z3p/z3m) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/PythonScripts/CalibrationVoltages.py b/PythonScripts/CalibrationVoltages.py new file mode 100644 index 0000000000000000000000000000000000000000..dad569ab35c5360f7d1f7e879706cf6b58fdc44a --- /dev/null +++ b/PythonScripts/CalibrationVoltages.py @@ -0,0 +1,244 @@ +import numpy as np +from scipy.optimize import curve_fit +import matplotlib.pyplot as plt +from matplotlib.offsetbox import AnchoredText +import sys +## Performs linear fit for calibration + +def FitAndPlot(xp, xm, z1p, z1m, z2p, z2m, z3p, z3m, zAllp, zAllm, Voltage, plots): + #Linewidth + lw = 0.8 + + # + if(plots): + plt.title("Calibration Measurement " + str(Voltage) + " V") + plt.plot(xp, z1p, marker=".", color="tab:blue", label="z1-", linewidth=lw) + plt.plot(xp, z1m, marker=".", color="b", label="z1+", linewidth=lw) + plt.plot(xp, z2p, marker=".", color="tab:red", label="z2-", linewidth=lw) + plt.plot(xp, z2m, marker=".", color="chocolate", label="z2+", linewidth=lw) + plt.plot(xp, z3p, marker=".", color="tab:green", label="z3-", linewidth=lw) + plt.plot(xp, z3m, marker=".", color="darkolivegreen", label="z3+", linewidth=lw) + plt.plot(xp, zAllp, marker=".", color="tab:purple", label="zAll-", linewidth=lw) + plt.plot(xp, zAllm, marker=".", color="m", label="zAll+", linewidth=lw) + plt.ylabel(r"Measured Movement [$\mu m$]") + plt.xlabel("# of step") + plt.legend() + plt.grid() + plt.savefig("Plots\Calibration\\" + str(Voltage) + "_All_Data.pdf") + plt.show() + + # Fit + # Errors are 1/sqrt(12) * one pixel length in mikrometers + error_z1 = 8.87 / np.sqrt(12) + error_z2 = 9.62 / np.sqrt(12) + error_z3 = 9.80 / np.sqrt(12) + error_zAll = 9.00 / np.sqrt(12) + + popt_z1p, pcov_z1p = curve_fit(linear, xp, z1p, error_z1) + popt_z1m, pcov_z1m = curve_fit(linear, xp, z1m, error_z1) + popt_z2p, pcov_z2p = curve_fit(linear, xp, z2p, error_z2) + popt_z2m, pcov_z2m = curve_fit(linear, xp, z2m, error_z2) + popt_z3p, pcov_z3p = curve_fit(linear, xp, z3p, error_z3) + popt_z3m, pcov_z3m = curve_fit(linear, xp, z3m, error_z3) + popt_zAllp, pcov_zAllp = curve_fit(linear, xp, zAllp, error_zAll) + popt_zAllm, pcov_zAllm = curve_fit(linear, xp, zAllm, error_zAll) + + # Chi squared Computation per degree of freedom + chi_z1p = np.sum(((z1p - linear(xp, popt_z1p[0]))**2 / error_z1**2)) / (len(z1p) - 1) + chi_z1m = np.sum(((z1m - linear(xp, popt_z1m[0]))**2 / error_z1**2)) / (len(z1m) - 1) + chi_z2p = np.sum(((z2p - linear(xp, popt_z2p[0]))**2 / error_z2**2)) / (len(z2p) - 1) + chi_z2m = np.sum(((z2m - linear(xp, popt_z2m[0]))**2 / error_z2**2)) / (len(z2m) - 1) + chi_z3p = np.sum(((z3p - linear(xp, popt_z3p[0]))**2 / error_z3**2)) / (len(z3p) - 1) + chi_z3m = np.sum(((z3m - linear(xp, popt_z3m[0]))**2 / error_z3**2)) / (len(z3m) - 1) + chi_zAllp = np.sum(((zAllp - linear(xp, popt_zAllp[0]))**2 / error_zAll**2)) / (len(zAllp) - 1) + chi_zAllm = np.sum(((zAllm - linear(xp, popt_zAllm[0]))**2 / error_zAll**2)) / (len(zAllm) - 1) + + # Plots + fig, ax = plt.subplots(2, 2) + fig.set_figheight(9) + fig.set_figwidth(16) + + # Z1 + capsize = 2 + if(plots): + ax[0,0].set_title("Z1 calibration fit " + str(Voltage) + " V") + ax[0,0].set_xlabel("# of steps") + ax[0,0].set_ylabel(r"Measured Movement [$\mu m$]") + ax[0,0].errorbar(xp, z1p, error_z1, linestyle="none", marker=".", linewidth=lw, color="tab:blue", label="z1- data", capsize=capsize) + ax[0,0].errorbar(xp, z1m, error_z1, linestyle="none", marker=".", linewidth=lw, color="b", label="z1+ data", capsize=capsize) + ax[0,0].plot(xp, linear(xp, popt_z1p[0]), linewidth=lw, color="tab:blue", label="z1- fit") + ax[0,0].plot(xp, linear(xp, popt_z1m[0]), linewidth=lw, color="b", label="z1+ fit") + + #ax = plt.gca() + anchored_text = AnchoredText(r"$b_-$= {:.2f} $\pm$ {:.2f} $n m$/step, $\chi^2/ndof =${:.2f}".format(popt_z1p[0] * 1000, np.sqrt(pcov_z1p[0][0]) * 1000, chi_z1p) + "\n" + "$b_+$= {:.2f} $\pm$ {:.2f} $n m$/step, $\chi^2/ndof =${:.2f}".format(popt_z1m[0] * 1000, np.sqrt(pcov_z1m[0][0]) * 1000, chi_z1m), loc=4) + ax[0,0].add_artist(anchored_text) + + ax[0,0].legend() + plt.grid() + #plt.savefig("Plots\Calibration\Z1_" + str(Voltage) + ".pdf") + #plt.show() + + print("slope in nm/step z1-:", popt_z1p[0] * 1000, " +- ", np.sqrt(pcov_z1p[0][0]) * 1000, " chi^2 ", chi_z1p) + print("slope in nm/step z1+:", popt_z1m[0] * 1000, " +- ", np.sqrt(pcov_z1m[0][0]) * 1000, " chi^2 ", chi_z1m) + + #Z2 + if(plots): + ax[0,1].set_title("Z2 calibration fit " + str(Voltage) + " V") + ax[0,1].set_xlabel("# of steps") + ax[0,1].set_ylabel(r"Measured Movement [$\mu m$]") + ax[0,1].errorbar(xp, z2p, error_z2, linestyle="none", marker=".", linewidth=lw, color="tab:red", label="z2- data", capsize=capsize) + ax[0,1].errorbar(xp, z2m, error_z2, linestyle="none", marker=".", linewidth=lw, color="chocolate", label="z2+ data", capsize=capsize) + ax[0,1].plot(xp, linear(xp, popt_z2p[0]), linewidth=lw, color="tab:red", label="z2- fit") + ax[0,1].plot(xp, linear(xp, popt_z2m[0]), linewidth=lw, color="chocolate", label="z2+ fit") + + #ax = plt.gca() + anchored_text = AnchoredText(r"$b_-$= {:.2f} $\pm$ {:.2f} $n m$/step, $\chi^2/ndof =${:.2f}".format(popt_z2p[0] * 1000, np.sqrt(pcov_z2p[0][0]) * 1000, chi_z2p) + "\n" + "$b_+$= {:.2f} $\pm$ {:.2f} $n m$/step, $\chi^2/ndof =${:.2f}".format(popt_z2m[0] * 1000, np.sqrt(pcov_z2m[0][0]) * 1000, chi_z2m), loc=4) + ax[0,1].add_artist(anchored_text) + + ax[0,1].legend() + plt.grid() + #plt.savefig("Plots\Calibration\Z2_" + str(Voltage) + ".pdf") + #plt.show() + + print("slope in nm/step z2-:", popt_z2p[0] * 1000, " +- ", np.sqrt(pcov_z2p[0][0]) * 1000, " chi^2 ", chi_z2p) + print("slope in nm/step z2+:", popt_z2m[0] * 1000, " +- ", np.sqrt(pcov_z2m[0][0]) * 1000, " chi^2 ", chi_z2m) + + #Z3 + if(plots): + ax[1,0].set_title("Z3 calibration fit " + str(Voltage) + " V") + ax[1,0].set_xlabel("# of steps") + ax[1,0].set_ylabel(r"Measured Movement [$\mu m$]") + ax[1,0].errorbar(xp, z3p, error_z3, linestyle="none", marker=".", linewidth=lw, color="tab:green", label="z3- data", capsize=capsize) + ax[1,0].errorbar(xp, z3m, error_z3, linestyle="none", marker=".", linewidth=lw, color="darkolivegreen", label="z3+ data", capsize=capsize) + ax[1,0].plot(xp, linear(xp, popt_z3p[0]), linewidth=lw, color="tab:green", label="z3- fit") + ax[1,0].plot(xp, linear(xp, popt_z3m[0]), linewidth=lw, color="darkolivegreen", label="z3+ fit") + + #ax = plt.gca() + anchored_text = AnchoredText(r"$b_-$= {:.2f} $\pm$ {:.2f} $n m$/step, $\chi^2/ndof =${:.2f}".format(popt_z3p[0] * 1000, np.sqrt(pcov_z3p[0][0]) * 1000, chi_z3p) + "\n" + "$b_+$= {:.2f} $\pm$ {:.2f} $n m$/step, $\chi^2/ndof =${:.2f}".format(popt_z3m[0] * 1000, np.sqrt(pcov_z3m[0][0]) * 1000, chi_z3m), loc=4) + ax[1,0].add_artist(anchored_text) + + ax[1,0].legend() + plt.grid() + #plt.savefig("Plots\Calibration\Z3_" + str(Voltage) + ".pdf") + #plt.show() + + print("slope in nm/step z3-:", popt_z3p[0] * 1000, " +- ", np.sqrt(pcov_z3p[0][0]) * 1000, " chi^2 ", chi_z3p) + print("slope in nm/step z3+:", popt_z3m[0] * 1000, " +- ", np.sqrt(pcov_z3m[0][0]) * 1000, " chi^2 ", chi_z3p) + + #ZALL + if(plots): + ax[1,1].set_title("ZAll calibration fit " + str(Voltage) + " V") + ax[1,1].set_xlabel("# of steps") + ax[1,1].set_ylabel(r"Measured Movement [$\mu m$]") + ax[1,1].errorbar(xp, zAllp, error_zAll, linestyle="none", marker=".", linewidth=lw, color="tab:purple", label="zAll- data", capsize=capsize) + ax[1,1].errorbar(xp, zAllm, error_zAll, linestyle="none", marker=".", linewidth=lw, color="m", label="zAll+ data", capsize=capsize) + ax[1,1].plot(xp, linear(xp, popt_zAllp[0]), linewidth=lw, color="tab:purple", label="zAll- fit") + ax[1,1].plot(xp, linear(xp, popt_zAllm[0]), linewidth=lw, color="m", label="zAll+ fit") + + #ax = plt.gca() + anchored_text = AnchoredText(r"$b_-$= {:.2f} $\pm$ {:.2f} $n m$/step, $\chi^2/ndof =${:.2f}".format(popt_zAllp[0] * 1000, np.sqrt(pcov_zAllp[0][0]) * 1000, chi_zAllp) + "\n" + "$b_+$= {:.2f} $\pm$ {:.2f} $n m$/step, $\chi^2/ndof =${:.2f}".format(popt_zAllm[0] * 1000, np.sqrt(pcov_zAllm[0][0]) * 1000, chi_zAllm), loc=4) + ax[1,1].add_artist(anchored_text) + + ax[1,1].legend() + plt.grid() + plt.savefig("Plots\Calibration\Z_" + str(Voltage) + ".pdf") + plt.savefig("Plots\Calibration\Z_" + str(Voltage) + ".png", dpi=300) + plt.show() + + print("slope in nm/step zAll-:", popt_zAllp[0] * 1000, " +- ", np.sqrt(pcov_zAllp[0][0]) * 1000, " chi^2 ", chi_zAllp) + print("slope in nm/step zAll+:", popt_zAllm[0] * 1000, " +- ", np.sqrt(pcov_zAllm[0][0]) * 1000, " chi^2 ", chi_zAllp) + +def linear(x, b): + return b*x + +def Volt85(data, plots): + print("85 V") + x = data[0] + z1 = data[1] + z2 = data[2] + z3 = data[3] + zAll = data[4] + + xp = x[:6] + xm = x[6:12] + z1p = z1[:6] + z1m = z1[6:12] + z2p = z2[:6] + z2m = z2[6:12] + z3p = z3[:6] + z3m = z3[6:12] + zAllp = zAll[:6] + zAllm = zAll[6:12] + + FitAndPlot(xp, xm, z1p, z1m, z2p, z2m, z3p, z3m, zAllp, zAllm, 85, plots) + +def Volt100(data, plots): + print("100 V") + x = data[0] + z1 = data[1] + z2 = data[2] + z3 = data[3] + zAll = data[4] + + xp = x[18:24] + xm = x[24:30] + z1p = z1[18:24] + z1m = z1[24:30] + z2p = z2[18:24] + z2m = z2[24:30] + z3p = z3[18:24] + z3m = z3[24:30] + zAllp = zAll[18:24] + zAllm = zAll[24:30] + + FitAndPlot(xp, xm, z1p, z1m, z2p, z2m, z3p, z3m, zAllp, zAllm, 100, plots) + +def Volt125(data, plots): + print("125 V") + x = data[0] + z1 = data[1] + z2 = data[2] + z3 = data[3] + zAll = data[4] + + xp = x[36:42] + xm = x[42:48] + z1p = z1[36:42] + z1m = z1[42:48] + z2p = z2[36:42] + z2m = z2[42:48] + z3p = z3[36:42] + z3m = z3[42:48] + zAllp = zAll[36:42] + zAllm = zAll[42:48] + + FitAndPlot(xp, xm, z1p, z1m, z2p, z2m, z3p, z3m, zAllp, zAllm, 125, plots) + + +def main(): + plots = True + + file = "C:\MaskAligner\Data\Calibration.csv" + + # very Simple commandline parser + if("--no_plots" in sys.argv): + plots = False + + if("--file" in sys.argv or "-f" in sys.argv): + for i in range(len(sys.argv)): + if("--file" in sys.argv[i] or "-f" == sys.argv[i]): + try: + file = sys.argv[i+1] + except: + print("No file or incorrect file specification.") + + + data = np.genfromtxt(file, skip_header=1, usecols=[1,2,3,4,5], delimiter=",") + data = data.T + + Volt85(data, plots) + Volt100(data, plots) + Volt125(data, plots) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/PythonScripts/CheckScrewUpDownZ3Z2.py b/PythonScripts/CheckScrewUpDownZ3Z2.py new file mode 100644 index 0000000000000000000000000000000000000000..df301ea1c34d0fb1bae66f67fe779f406d63ad31 --- /dev/null +++ b/PythonScripts/CheckScrewUpDownZ3Z2.py @@ -0,0 +1,195 @@ +import numpy as np +import matplotlib.pyplot as plt +import sys + +def main(): + if("--no_plots" in sys.argv): + plots = False + + #plt.style.use('tableau-colorblind10') + + file = "C:/MaskAligner/Data/CalibrationScrew/Calib_04_10_23.txt" + if("--file" in sys.argv or "-f" in sys.argv): + for i in range(len(sys.argv)): + if("--file" in sys.argv[i] or "-f" == sys.argv[i]): + try: + file = sys.argv[i+1] + except: + print("No file or incorrect file specification.") + + factor = 9000 + data = np.genfromtxt(file, delimiter="\t", skip_header=1) + data = data.T + rot = data[0] + z3m = data[1] / factor * 10**6 + z3p = data[2] / factor * 10**6 + z2m = data[3] / factor * 10**6 + z2p = data[4] / factor * 10**6 + + z3mu = data[11] / factor * 10**6 + z3md = data[12] / factor * 10**6 + z3pu = data[13] / factor * 10**6 + z3pd = data[14] / factor * 10**6 + + z3left01 = data[23] + z3left02 = data[24] + z3left03 = data[25] + z3mid = data[26] + z3right = data[27] + z3right02 = data[28] + + z3left01_c = data[30] + z3left02_c = data[31] + z3mid_c = data[32] + z3right_c = data[33] + z3right02_c = data[34] + + rot_d = data[37] + z3m_d = data[38] / factor * 10**6 + z3p_d = data[40] / factor * 10**6 + z2m_d = data[39] / factor * 10**6 + z2p_d = data[41] / factor * 10**6 + + rot_d = rot_d[~np.isnan(rot_d)] + z3m_d = z3m_d[~np.isnan(z3m_d)] + z3p_d = z3p_d[~np.isnan(z3p_d)] + z2m_d = z2m_d[~np.isnan(z2m_d)] + z2p_d = z2p_d[~np.isnan(z2p_d)] + + rot_dp = data[43] + z3_dp_m = data[44] / factor * 10**6 + z3_dp_p = data[45] / factor * 10**6 + + z3AngleX = [z3left01[0], z3left02[0], z3left03[0], z3mid[0], z3right[0], z3right02[0]] + z3AngleX_copper = [z3left01_c[0], z3left02_c[0], z3mid_c[0], z3right_c[0], z3right02_c[0]] + + z_err = 0.04 / factor * 10**6 + + z3p_vars = [] + z3m_vars = [] + + rot_z3 = rot + + for i in range(1): + z3p_vars.append(np.roll(z3p, i)) + z3m_vars.append(np.roll(z3m, i)) + + for i in range(len(z3p_vars)): + plt.errorbar(rot_z3, z3p_vars[i], z_err, label="z3+ " + str(i), marker=".", capsize=3) + plt.errorbar(rot_z3, z3m_vars[i], z_err, label="z3- " + str(i), marker=".", capsize=3) + plt.errorbar(rot, z2p, z_err, label="z2+", marker=".", capsize=3) + plt.errorbar(rot, z2m, z_err, label="z2-", marker=".", capsize=3) + plt.xlabel("screw rotations from arbitrary 0. Larger means less firm screw.") + plt.ylabel("stepsize [nm]") + + plt.legend() + plt.savefig("Plots/Z3Examine/ScrewRot.png", dpi=300) + plt.savefig("Plots/Z3Examine/ScrewRot.pdf", dpi=300) + plt.show() + + plt.plot(rot, z2p/z2m, label="z2 ratio", marker=".") + plt.plot(rot, z3p/z3m, label="z3 ratio", marker=".") + plt.xlabel("screw rotations from arbitrary 0. Larger means less firm screw.") + plt.ylabel("ration up/down") + plt.legend() + plt.savefig("Plots/Z3Examine/UpDownRatio.png", dpi=300) + plt.savefig("Plots/Z3Examine/UpDownRatio.pdf", dpi=300) + plt.show() + + plt.errorbar(1 + 0.1, np.nanmean(z3mu), np.nanstd(z3mu, ddof=1), label="wobble up", capsize=3, marker=".") + plt.errorbar(-1 - 0.1, np.nanmean(z3pu), np.nanstd(z3pu, ddof=1), label="wobble up", capsize=3, marker=".") + plt.errorbar(1 - 0.1, np.nanmean(z3md), np.nanstd(z3md, ddof=1), label="wobble down", capsize=3, marker=".") + plt.errorbar(-1 + 0.1, np.nanmean(z3pd), np.nanstd(z3pd, ddof=1), label="wobble down", capsize=3, marker=".") + plt.xlabel("movement direction -1 = approach / +1 = retract") + plt.ylabel("stepsize [nm]") + plt.legend() + plt.savefig("Plots/Z3Examine/ScrewWobble.png", dpi=300) + plt.savefig("Plots/Z3Examine/ScrewWobble.pdf", dpi=300) + plt.show() + + z3AngleY = np.array([np.nanmean(z3left01[1:]), np.nanmean(z3left02[1:]), np.nanmean(z3left03[1:]), np.nanmean(z3mid[1:]), np.nanmean(z3right[1:]), np.nanmean(z3right02[1:])]) / factor * 10**6 + z3AngleY_err = np.array([np.nanstd(z3left01[1:], ddof=1), np.nanstd(z3left02[1:], ddof=1), np.nanstd(z3left03[1:], ddof=1), np.nanstd(z3mid[1:], ddof=1), np.nanstd(z3right[1:], ddof=1), np.nanstd(z3right02[1:], ddof=1)]) / factor * 10**6 + + z3AngleY_copper = np.array([np.nanmean(z3left01_c[1:]), np.nanmean(z3left02_c[1:]), np.nanmean(z3mid_c[1:]), np.nanmean(z3right_c[1:]), np.nanmean(z3right02_c[1:])]) / factor * 10**6 + z3AngleY_err_copper = np.array([np.nanstd(z3left01_c[1:], ddof=1), np.nanstd(z3left02_c[1:], ddof=1), np.nanstd(z3mid_c[1:], ddof=1), np.nanstd(z3right_c[1:], ddof=1), np.nanstd(z3right02_c[1:], ddof=1)]) / factor * 10**6 + + plt.errorbar(z3AngleX, z3AngleY, z3AngleY_err, capsize=3, marker=".", linestyle="none", label="w/o copper wire") + plt.errorbar(z3AngleX_copper, z3AngleY_copper, z3AngleY_err_copper, capsize=3, marker=".", linestyle="none", label="copper wire") + plt.xlabel("rotation of front piezo plate [°]") + plt.ylabel("stepsize [nm]") + plt.legend() + plt.savefig("Plots/Z3Examine/FrontPlateAngle.png", dpi=300) + plt.savefig("Plots/Z3Examine/FrontPlateAngle.pdf", dpi=300) + plt.show() + + plt.errorbar(rot_d, z3p_d, z_err, label="z3+ ", marker=".", capsize=3, color="tab:blue") + plt.errorbar(rot_d, z3m_d, z_err, label="z3- ", marker=".", capsize=3, color="tab:orange") + plt.errorbar(rot_d, z2p_d, z_err, label="z2+", marker=".", capsize=3, color="tab:green") + plt.errorbar(rot_d, z2m_d, z_err, label="z2-", marker=".", capsize=3, color="tab:red") + + #plt.errorbar(rot_z3[:3], z3p_vars[0][:3], z_err, label="z3+ " + str(i), marker=".", capsize=3, color="blue") + #plt.errorbar(rot_z3[:3], z3m_vars[0][:3], z_err, label="z3- " + str(i), marker=".", capsize=3, color="orange") + #plt.errorbar(rot[:3], z2p[:3], z_err, label="z2+", marker=".", capsize=3, color="green") + #plt.errorbar(rot[:3], z2m[:3], z_err, label="z2-", marker=".", capsize=3, color="red") + + plt.xlabel("screw rotations from arbitrary 0. Larger means less firm screw.") + plt.ylabel("stepsize [nm]") + plt.legend() + plt.savefig("Plots/Z3Examine/ScrewRot_detail.png", dpi=300) + plt.savefig("Plots/Z3Examine/ScrewRot_detail.pdf", dpi=300) + plt.show() + + plt.errorbar(rot_z3, z3p_vars[0], z_err, label="z3+ ", marker=".", capsize=3) + plt.errorbar(rot_z3, z3m_vars[0], z_err, label="z3- ", marker=".", capsize=3) + plt.errorbar(-rot_dp + 5, z3_dp_p, z_err, label="z3+ with z1 front plate", marker=".", capsize=3) + plt.errorbar(-rot_dp + 5, z3_dp_m, z_err, label="z3- with z1 front plate", marker=".", capsize=3) + plt.errorbar(rot, z2p, z_err, label="z2+", marker=".", capsize=3) + plt.errorbar(rot, z2m, z_err, label="z2-", marker=".", capsize=3) + plt.xlabel("screw rotations from arbitrary 0. Larger means less firm screw.") + plt.ylabel("stepsize [nm]") + + data_2 = np.genfromtxt("C:/MaskAligner/Data/CalibrationScrew/31_10_23.csv", skip_header=1, delimiter=",") + data_2 = data_2.T + x = data_2[0] + y_up = data_2[1] / factor * 10**6 + y_down = data_2[2] / factor * 10**6 + y_err = 0.04 / factor * 10**6 + y_err_2 = 0.1 / factor * 10**6 + + data_3 = np.genfromtxt("C:/MaskAligner/Data/CalibrationScrew/NewPlate_03_11_23.csv", skip_header=1, delimiter=",") + print(data_3) + data_3 = data_3.T + x_2 = data_3[0] + y_up_2 = data_3[1] / factor * 10**6 + y_down_2 = data_3[2] / factor * 10**6 + y_err_2 = data_3[3] / factor * 10**6 + y_err_2_2 = data_3[4] / factor * 10**6 + + plt.errorbar(x, y_up, z_err, label="z3+ with new plate", marker=".", capsize=3) + plt.errorbar(x, y_down, z_err, label="z3- with new plate", marker=".", capsize=3) + + plt.legend() + plt.savefig("Plots/Z3Examine/ScrewRot_CompareSwappedPlate.png", dpi=300) + plt.savefig("Plots/Z3Examine/ScrewRot_CompareSwappedPlate.pdf", dpi=300) + plt.show() + + #plt.errorbar(-rot_dp + 5, z3_dp_p, z_err, label="z3+ with z1 front plate", marker=".", capsize=3) + #plt.errorbar(-rot_dp + 5, z3_dp_m, z_err, label="z3- with z1 front plate", marker=".", capsize=3) + plt.xlabel("screw rotations from arbitrary 0. Larger means less firm screw.") + plt.ylabel("stepsize [nm]") + + plt.errorbar(x_2, y_up_2, y_err_2, label="z3+ with new plate 02_11", marker=".", capsize=3) + plt.errorbar(x_2, y_down_2, y_err_2_2, label="z3- with new plate 02_11", marker=".", capsize=3) + #plt.errorbar(x, y_up, y_err, label="z3+ with new plate", marker=".", capsize=3) + #plt.errorbar(x, y_down, y_err, label="z3- with new plate", marker=".", capsize=3) + plt.errorbar(rot, z2p, z_err, label="z2+", marker=".", capsize=3) + plt.errorbar(rot, z2m, z_err, label="z2-", marker=".", capsize=3) + + plt.legend() + plt.savefig("Plots/Z3Examine/ScrewRot_SwappedPlate.png", dpi=300) + plt.savefig("Plots/Z3Examine/ScrewRot_SwappedPlate.pdf", dpi=300) + plt.show() + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/PythonScripts/PlotApproachAndReversedretract.py b/PythonScripts/PlotApproachAndReversedretract.py new file mode 100644 index 0000000000000000000000000000000000000000..22dd4fc7fa1f57eaec17cda4f9bba17ae948fb9e --- /dev/null +++ b/PythonScripts/PlotApproachAndReversedretract.py @@ -0,0 +1,161 @@ +import numpy as np +import matplotlib.pyplot as plt + +def datahandling(data_app): + c1_app = data_app[0] + c2_app = data_app[1] + c3_app = data_app[2] + + c1_app_err = data_app[3] + c2_app_err = data_app[4] + c3_app_err = data_app[5] + + x = np.arange(0, len(c1_app), 1.0) + + #Throw out mismeasurements, where error is very large and values where c is NaN + c1_app_err_mean = np.nanmean(c1_app_err) + mask_c1_app = np.where(c1_app_err > c1_app_err_mean * 4, False, True) + mask_c1_app_nan = np.where(np.isnan(c1_app), False, True) + c2_app_err_mean = np.nanmean(c2_app_err) + mask_c2_app = np.where(c2_app_err > c2_app_err_mean * 4, False, True) + mask_c2_app_nan = np.where(np.isnan(c2_app), False, True) + c3_app_err_mean = np.nanmean(c3_app_err) + mask_c3_app = np.where(c3_app_err > c3_app_err_mean * 4, False, True) + mask_c3_app_nan = np.where(np.isnan(c3_app), False, True) + full_mask = np.logical_and(np.logical_and(np.logical_and(np.logical_and(np.logical_and(mask_c1_app, mask_c2_app), mask_c3_app), mask_c1_app_nan), mask_c2_app_nan), mask_c3_app_nan) + c1_app = c1_app[full_mask] + c1_app_err = c1_app_err[full_mask] + c2_app = c2_app[full_mask] + c2_app_err = c2_app_err[full_mask] + c3_app = c3_app[full_mask] + c3_app_err = c3_app_err[full_mask] + x = x[full_mask] + + #Ensure no 0 uncertainties for fitting purposes + c1_app_err = np.where(c1_app_err == 0, np.nanmax(c1_app_err), c1_app_err) + c2_app_err = np.where(c2_app_err == 0, np.nanmax(c2_app_err), c2_app_err) + c3_app_err = np.where(c3_app_err == 0, np.nanmax(c3_app_err), c3_app_err) + + #Ensure no NaN values in errors and capacitances + + c1_app_err = np.where(np.isnan(c1_app_err), np.nanmax(c1_app_err), c1_app_err) + c2_app_err = np.where(np.isnan(c2_app_err), np.nanmax(c2_app_err), c2_app_err) + c3_app_err = np.where(np.isnan(c3_app_err), np.nanmax(c3_app_err), c3_app_err) + + try: + step_s = data_app[12][0] + step_s_err = data_app[12][1] + except: + step_s = 69 + step_s_err = 1 + print("No stepsizes specified! Assuming Hard Coded Default!") + + c_diff_1 = np.ones(len(c1_app) - 1) + c_diff_2 = np.ones(len(c2_app) - 1) + c_diff_3 = np.ones(len(c3_app) - 1) + + c_diff_1_err = np.ones(len(c1_app) - 1) + c_diff_2_err = np.ones(len(c2_app) - 1) + c_diff_3_err = np.ones(len(c3_app) - 1) + + for i in range(len(c1_app)-1): + c_diff_1[i] = c1_app[i+1] - c1_app[i] + c_diff_2[i] = c2_app[i+1] - c2_app[i] + c_diff_3[i] = c3_app[i+1] - c3_app[i] + + c_diff_1_err[i] = np.sqrt(c1_app_err[i+1]**2 + c1_app_err[i]**2) + c_diff_2_err[i] = np.sqrt(c2_app_err[i+1]**2 + c2_app_err[i]**2) + c_diff_3_err[i] = np.sqrt(c3_app_err[i+1]**2 + c3_app_err[i]**2) + + return x, step_s, step_s_err, c1_app, c2_app, c3_app, c1_app_err, c2_app_err, c3_app_err, c_diff_1, c_diff_2, c_diff_3, c_diff_1_err, c_diff_2_err, c_diff_3_err + +def main(): + no_err = False + no_diff_err = False + + data_app = np.genfromtxt("C:\MaskAligner\Data\ApproachCurve21_11_23_ToFullContact.csv", delimiter=",").T + data_retr = np.genfromtxt("C:\MaskAligner\Data\RetractCurve_21_11_23_600.csv", delimiter=",").T + + x, step_s, step_s_err, c1, c2, c3, c1_err, c2_err, c3_err, c_diff_1, c_diff_2, c_diff_3, c_diff_1_err, c_diff_2_err, c_diff_3_err = datahandling(data_app) + x_retr, _, _, c1_retr, c2_retr, c3_retr, c1_err_retr, c2_err_retr, c3_err_retr, c_diff_1_retr, c_diff_2_retr, c_diff_3_retr, c_diff_1_err_retr, c_diff_2_err_retr, c_diff_3_err_retr = datahandling(data_retr) + + lw = 0.75 + ms = 2 + + x_retr *= 1.18 + + fig, ax = plt.subplots(2, 3) + fig.set_figheight(9) + fig.set_figwidth(16) + + if not no_err: + ax[0,0].errorbar(x, c1, c1_err, color="tab:red", marker="x", markersize=ms, linestyle="--", linewidth=lw, capsize=3, label="approach") + ax[0,0].errorbar(x_retr, c1_retr[::-1], c1_err_retr[::-1], color="tab:orange", marker="x", markersize=ms, linestyle="--", linewidth=lw, capsize=3, label="retract reversed") + else: + ax[0,0].plot(x, c1, color="tab:red", marker="x", markersize=ms, linestyle="--", linewidth=lw) + ax[0,0].set_title("Capacitance 1") + ax[0,0].set_xlabel("Step [" + str(step_s) + "±" + str(step_s_err) + " nm]") + ax[0,0].set_ylabel("Capacitance [pF]") + + if not no_err: + ax[0,1].errorbar(x, c2, c2_err, color="tab:green", marker="x", markersize=ms, linestyle="--", linewidth=lw, capsize=3, label="approach") + ax[0,1].errorbar(x_retr, c2_retr[::-1], c2_err_retr[::-1], color="tab:olive", marker="x", markersize=ms, linestyle="--", linewidth=lw, capsize=3, label="retract reversed") + else: + ax[0,1].plot(x, c2, color="tab:green", marker="x", markersize=ms, linestyle="--", linewidth=lw) + ax[0,1].set_title("Capacitance 2") + ax[0,1].set_xlabel("Step [" + str(step_s) + "±" + str(step_s_err) + " nm]") + ax[0,1].set_ylabel("Capacitance [pF]") + + if not no_err: + ax[0,2].errorbar(x, c3, c3_err, color="tab:blue", marker="x", markersize=ms, linestyle="--", linewidth=lw, capsize=3, label="approach") + ax[0,2].errorbar(x_retr, c3_retr[::-1], c3_err_retr[::-1], color="tab:cyan", marker="x", markersize=ms, linestyle="--", linewidth=lw, capsize=3, label="retract reversed") + else: + ax[0,2].plot(x, c3, color="tab:blue", marker="x", markersize=ms, linestyle="--", linewidth=lw) + ax[0,2].set_title("Capacitance 3") + ax[0,2].set_xlabel("Step [" + str(step_s) + "±" + str(step_s_err) + " nm]") + ax[0,2].set_ylabel("Capacitance [pF]") + + if not no_diff_err and not no_err: + ax[1,0].errorbar(x[1:], c_diff_1, c_diff_1_err, color="tab:red", marker="x", markersize=ms, linestyle="--", linewidth=lw, capsize=3, label="approach") + ax[1,0].errorbar(x_retr[1:], c_diff_1_retr[::-1], c_diff_1_err_retr[::-1], color="tab:orange", marker="x", markersize=ms, linestyle="--", linewidth=lw, capsize=3, label="retract reversed") + else: + ax[1,0].plot(x[1:], c_diff_1, color="tab:red", marker="x", markersize=ms, linestyle="--", linewidth=lw) + ax[1,0].set_title("Diff Capacitance 1") + ax[1,0].set_xlabel("Step [" + str(step_s) + "±" + str(step_s_err) + " nm]") + ax[1,0].set_ylabel("Capacitance [pF]") + #ax[1,0].set_ylim(-0.0025, 0.02) + + if not no_diff_err and not no_err: + ax[1,1].errorbar(x[1:], c_diff_2, c_diff_2_err, color="tab:green", marker="x", markersize=ms, linestyle="--", linewidth=lw, capsize=3, label="approach") + ax[1,1].errorbar(x_retr[1:], c_diff_2_retr[::-1], c_diff_2_err_retr[::-1], color="tab:olive", marker="x", markersize=ms, linestyle="--", linewidth=lw, capsize=3, label="retract reversed") + else: + ax[1,1].plot(x[1:], c_diff_2, color="tab:green", marker="x", markersize=ms, linestyle="--", linewidth=lw) + ax[1,1].set_title("Diff Capacitance 2") + ax[1,1].set_xlabel("Step [" + str(step_s) + "±" + str(step_s_err) + " nm]") + ax[1,1].set_ylabel("Capacitance [pF]") + #ax[1,1].set_ylim(-0.0015, 0.008) + + if not no_diff_err and not no_err: + ax[1,2].errorbar(x[1:], c_diff_3, c_diff_3_err, color="tab:blue", marker="x", markersize=ms, linestyle="--", linewidth=lw, capsize=3, label="approach") + ax[1,2].errorbar(x_retr[1:], c_diff_3_retr[::-1], c_diff_3_err_retr[::-1], color="tab:cyan", marker="x", markersize=ms, linestyle="--", linewidth=lw, capsize=3, label="retract reversed") + else: + ax[1,2].plot(x[1:], c_diff_3, color="tab:blue", marker="x", markersize=ms, linestyle="--", linewidth=lw) + ax[1,2].set_title("Diff Capacitance 3") + ax[1,2].set_xlabel("Step [" + str(step_s) + "±" + str(step_s_err) + " nm]") + ax[1,2].set_ylabel("Capacitance [pF]") + #ax[1,2].set_ylim(-0.002, 0.005) + + ax[0,0].legend() + ax[0,1].legend() + ax[0,2].legend() + ax[1,0].legend() + ax[1,1].legend() + ax[1,2].legend() + + fig.tight_layout() + plt.show() + + +if __name__ == "__main__": + main() + \ No newline at end of file diff --git a/PythonScripts/PlotApproachCurve.py b/PythonScripts/PlotApproachCurve.py new file mode 100644 index 0000000000000000000000000000000000000000..d2183a97f3996de5ab32d9567a14828e5fe467da --- /dev/null +++ b/PythonScripts/PlotApproachCurve.py @@ -0,0 +1,302 @@ +# -*- coding: utf-8 -*- +""" +Created on Wed Aug 9 14:45:10 2023 + +@author: Luzifer +""" + +import matplotlib.pyplot as plt +import numpy as np +import sys +from matplotlib.offsetbox import AnchoredText +from scipy.optimize import curve_fit + +def func(x, shift, stretch): + return shift + x * stretch + +def linear(x, a, b, c): + return a + x*b + x**2 * c + +def main(): + path = "C:\MaskAligner\Data\ApproachCurve16_08_23.csv" + save = "" + no_err = False + no_diff_err = False + correlation = True + plot_correlation = True + + #Simple command line parsing + if("--file" in sys.argv or "-f" in sys.argv): + for i in range(len(sys.argv)): + if(sys.argv[i] == "--file" or sys.argv[i] == "-f"): + try: + path = sys.argv[i+1] + except: + print("incorrect file path.") + return + + if("--save" in sys.argv or "-s" in sys.argv): + for i in range(len(sys.argv)): + if(sys.argv[i] == "--save" or sys.argv[i] == "-s"): + try: + save = sys.argv[i+1] + except: + print("incorrect save file name.") + return + + if("--no_diff_error" in sys.argv): + no_diff_err = True + + if("--no_error" in sys.argv): + no_err = True + + if("--no_correlation" in sys.argv): + correlation = False + + if("--plot_correlation" in sys.argv): + plot_correlation = True + + if("--help" in sys.argv or "-h" in sys.argv): + print("--file x or -f x: plots the approach curve of file at filepath x. File must be csv, txt and must be formatted: c1, c2, c3, c1_err, c2_err, c3_err, c1_raw, c2_raw, c3_raw, c1_raw_error, c2_raw_error, c3_raw_error, additional_info.") + print("--save x or -s x: saves the resulting plot with filename x. If x is left blank it will determine filename from input file. Should come as last command, since otherwise it will interpret following command as filename.") + print("--no_diff_err: Omits errorbars on the capacitance differences.") + print("--no_err: Omits errorbars on all plots.") + print("--no_correlation: skips c1/c2, c1/c3, c2/c3 correlation calculation.") + print("--plot_correlation: plots c1 and c2 with correlated other capacitances. Does nothing if --no_correlation is also given.") + return + + data = np.genfromtxt(path, delimiter=",") + data = data.T + + c1 = data[0] + c2 = data[1] + c3 = data[2] + + c1_err = data[3] + c2_err = data[4] + c3_err = data[5] + + x = np.arange(0,len(c1), 1) + + #Throw out mismeasurements, where error is very large and values where c is NaN and where difference to neighbouring values is large + c1_err_mean = np.nanmean(c1_err) + mask_c1 = np.where(c1_err > c1_err_mean * 4, False, True) + mask_c1_nan = np.where(np.isnan(c1), False, True) + c2_err_mean = np.nanmean(c2_err) + mask_c2 = np.where(c2_err > c2_err_mean * 4, False, True) + mask_c2_nan = np.where(np.isnan(c2), False, True) + c3_err_mean = np.nanmean(c3_err) + mask_c3 = np.where(c3_err > c3_err_mean * 4, False, True) + mask_c3_nan = np.where(np.isnan(c3), False, True) + c1_dif = np.diff(c1) + c2_dif = np.diff(c2) + c3_dif = np.diff(c3) + full_mask = np.logical_and(np.logical_and(np.logical_and(np.logical_and(np.logical_and(mask_c1, mask_c2), mask_c3), mask_c1_nan), mask_c2_nan), mask_c3_nan) + c1 = c1[full_mask] + c1_err = c1_err[full_mask] + c2 = c2[full_mask] + c2_err = c2_err[full_mask] + c3 = c3[full_mask] + c3_err = c3_err[full_mask] + x = x[full_mask] + + #Ensure no 0 uncertainties for fitting purposes + c1_err = np.where(c1_err == 0, np.nanmax(c1_err), c1_err) + c2_err = np.where(c2_err == 0, np.nanmax(c2_err), c2_err) + c3_err = np.where(c3_err == 0, np.nanmax(c3_err), c3_err) + + #Ensure no NaN values in errors and capacitances + + c1_err = np.where(np.isnan(c1_err), np.nanmax(c1_err), c1_err) + c2_err = np.where(np.isnan(c2_err), np.nanmax(c2_err), c2_err) + c3_err = np.where(np.isnan(c3_err), np.nanmax(c3_err), c3_err) + + try: + step_s = data[12][0] + step_s_err = data[12][1] + except: + step_s = 69 + step_s_err = 1 + print("No stepsizes specified! Assuming Hard Coded Default!") + + c_diff_1 = np.ones(len(c1) - 1) + c_diff_2 = np.ones(len(c2) - 1) + c_diff_3 = np.ones(len(c3) - 1) + + c_diff_1_err = np.ones(len(c1) - 1) + c_diff_2_err = np.ones(len(c2) - 1) + c_diff_3_err = np.ones(len(c3) - 1) + + for i in range(len(c1)-1): + c_diff_1[i] = c1[i+1] - c1[i] + c_diff_2[i] = c2[i+1] - c2[i] + c_diff_3[i] = c3[i+1] - c3[i] + + c_diff_1_err[i] = np.sqrt(c1_err[i+1]**2 + c1_err[i]**2) + c_diff_2_err[i] = np.sqrt(c2_err[i+1]**2 + c2_err[i]**2) + c_diff_3_err[i] = np.sqrt(c3_err[i+1]**2 + c3_err[i]**2) + + #for i in range(len(c1)-5): + # popt_c1, pcov_c1 = curve_fit(linear, x[i:i+5], c1[i:i+5], sigma=c1_err[i:i+5]) + # popt_c2, pcov_c2 = curve_fit(linear, x[i:i+5], c2[i:i+5], sigma=c2_err[i:i+5]) + # popt_c3, pcov_c3 = curve_fit(linear, x[i:i+5], c3[i:i+5], sigma=c3_err[i:i+5]) + + # c_diff_1[i] = popt_c1[1] + popt_c1[2] * c1[i] + # c_diff_2[i] = popt_c2[1] + popt_c2[2] * c2[i] + # c_diff_3[i] = popt_c3[1] + popt_c3[2] * c3[i] + + # c_diff_1_err[i] = np.sqrt(pcov_c1[1][1]) + # c_diff_2_err[i] = np.sqrt(pcov_c2[1][1]) + # c_diff_3_err[i] = np.sqrt(pcov_c3[1][1]) + + del data + + lw = 0.75 + ms = 2 + + fig, ax = plt.subplots(2, 3) + fig.set_figheight(9) + fig.set_figwidth(16) + + if not no_err: + ax[0,0].errorbar(x, c1, c1_err, color="tab:red", marker="x", markersize=ms, linestyle="--", linewidth=lw, capsize=3) + else: + ax[0,0].plot(x, c1, color="tab:red", marker="x", markersize=ms, linestyle="--", linewidth=lw) + ax[0,0].set_title("Capacitance 1") + ax[0,0].set_xlabel("Step [" + str(step_s) + "±" + str(step_s_err) + " nm]") + ax[0,0].set_ylabel("Capacitance [pF]") + + if not no_err: + ax[0,1].errorbar(x, c2, c2_err, color="tab:green", marker="x", markersize=ms, linestyle="--", linewidth=lw, capsize=3) + else: + ax[0,1].plot(x, c2, color="tab:green", marker="x", markersize=ms, linestyle="--", linewidth=lw) + ax[0,1].set_title("Capacitance 2") + ax[0,1].set_xlabel("Step [" + str(step_s) + "±" + str(step_s_err) + " nm]") + ax[0,1].set_ylabel("Capacitance [pF]") + + if not no_err: + ax[0,2].errorbar(x, c3, c3_err, color="tab:blue", marker="x", markersize=ms, linestyle="--", linewidth=lw, capsize=3) + else: + ax[0,2].plot(x, c3, color="tab:blue", marker="x", markersize=ms, linestyle="--", linewidth=lw) + ax[0,2].set_title("Capacitance 3") + ax[0,2].set_xlabel("Step [" + str(step_s) + "±" + str(step_s_err) + " nm]") + ax[0,2].set_ylabel("Capacitance [pF]") + + if not no_diff_err and not no_err: + ax[1,0].errorbar(x[1:], c_diff_1, c_diff_1_err, color="tab:red", marker="x", markersize=ms, linestyle="--", linewidth=lw, capsize=3) + else: + ax[1,0].plot(x[1:], c_diff_1, color="tab:red", marker="x", markersize=ms, linestyle="--", linewidth=lw) + ax[1,0].set_title("Diff Capacitance 1") + ax[1,0].set_xlabel("Step [" + str(step_s) + "±" + str(step_s_err) + " nm]") + ax[1,0].set_ylabel("Capacitance [pF]") + #ax[1,0].set_ylim(-0.0025, 0.02) + + if not no_diff_err and not no_err: + ax[1,1].errorbar(x[1:], c_diff_2, c_diff_2_err, color="tab:green", marker="x", markersize=ms, linestyle="--", linewidth=lw, capsize=3) + else: + ax[1,1].plot(x[1:], c_diff_2, color="tab:green", marker="x", markersize=ms, linestyle="--", linewidth=lw) + ax[1,1].set_title("Diff Capacitance 2") + ax[1,1].set_xlabel("Step [" + str(step_s) + "±" + str(step_s_err) + " nm]") + ax[1,1].set_ylabel("Capacitance [pF]") + #ax[1,1].set_ylim(-0.0015, 0.008) + + if not no_diff_err and not no_err: + ax[1,2].errorbar(x[1:], c_diff_3, c_diff_3_err, color="tab:blue", marker="x", markersize=ms, linestyle="--", linewidth=lw, capsize=3) + else: + ax[1,2].plot(x[1:], c_diff_3, color="tab:blue", marker="x", markersize=ms, linestyle="--", linewidth=lw) + ax[1,2].set_title("Diff Capacitance 3") + ax[1,2].set_xlabel("Step [" + str(step_s) + "±" + str(step_s_err) + " nm]") + ax[1,2].set_ylabel("Capacitance [pF]") + #ax[1,2].set_ylim(-0.002, 0.005) + + fig.tight_layout() + plt.show() + + #Determine Savefile name if not already specified + if(save == ""): + path_parts = [] + if("\\" in path): + path_parts = path.split("\\") + elif ("/" in path): + path_parts = path.split("/") + + save = "Plots/ApproachCurves/" + path_parts[-1].replace(".csv", "") + + fig.savefig(save + ".pdf") + fig.savefig(save + ".png", dpi=300) + + if correlation: + #Throw out outlier points + c1_err_mean = np.mean(c1_err) + mask_c1 = np.where(c1_err > c1_err_mean * 4, False, True) + c2_err_mean = np.mean(c2_err) + mask_c2 = np.where(c2_err > c2_err_mean * 4, False, True) + c3_err_mean = np.mean(c3_err) + mask_c3 = np.where(c3_err > c3_err_mean * 4, False, True) + full_mask = np.logical_and(np.logical_and(mask_c1, mask_c2), mask_c3) + c1 = c1[full_mask] + c1_err = c1_err[full_mask] + c2 = c2[full_mask] + c2_err = c2_err[full_mask] + c3 = c3[full_mask] + c3_err = c3_err[full_mask] + x = x[full_mask] + + #Determine correlation + popt_1_2, pcov_1_2 = curve_fit(func, c2, c1, sigma=c2_err) + popt_1_3, pcov_1_3 = curve_fit(func, c3, c1, sigma=c3_err) + popt_2_3, pcov_2_3 = curve_fit(func, c3, c2, sigma=c3_err) + + chi_1_2 = np.sum(((c1 - func(c2, popt_1_2[0], popt_1_2[1]))**2/(c1_err**2 + (popt_1_2[1] * c2_err)**2))) / len(c1 - 2) + chi_1_3 = np.sum(((c1 - func(c3, popt_1_3[0], popt_1_3[1]))**2/(c1_err**2 + (popt_1_3[1] * c3_err)**2))) / len(c1 - 2) + chi_2_3 = np.sum(((c2 - func(c3, popt_2_3[0], popt_2_3[1]))**2/(c2_err**2 + (popt_2_3[1] * c3_err)**2))) / len(c2 - 2) + + print("Small chi^2/ndof means high correlation of different capacitances. Careful though! Check plot! Since if data is sufficiently linear they can always be fitted to each other.") + print("chi^2/ndof similarity c1/c2: ", chi_1_2) + print("chi^2/ndof similarity c1/c3: ", chi_1_3) + print("chi^2/ndof similarity c2/c3: ", chi_2_3) + + if(plot_correlation): + fig, ax = plt.subplots(2, 2) + fig.set_figheight(9) + fig.set_figwidth(16) + + c1_max = max(np.absolute(c1)) + c2_max = max(np.absolute(c2)) + + fig.suptitle('Correlation of different capacitances') + + ax[0, 0].errorbar(x, func(c2, popt_1_2[0], popt_1_2[1]) / c1_max, func(c2_err, 0, np.absolute(popt_1_2[1])) / c1_max, label="C2 fit to C1", capsize=3, color="tab:green") + ax[0, 0].errorbar(x, func(c3, popt_1_3[0], popt_1_3[1]) / c1_max, func(c3_err, 0, np.absolute(popt_1_3[1])) / c1_max, label="C3 fit to C1", capsize=3, color="tab:blue") + ax[0, 0].errorbar(x, c1 / c1_max, c1_err/ c1_max, label="C1", capsize=3, color="tab:red",zorder=10) + ax[0, 0].set_xlabel(r"steps") + ax[0, 0].set_ylabel(r"$\frac{C}{C_{1,max}}$") + ax[0, 0].legend() + + ax[0, 1].errorbar(x, func(c3, popt_2_3[0], popt_2_3[1]) / c2_max, func(c3_err, 0, np.absolute(popt_2_3[1])) / c2_max, label="C3 fit to C2", capsize=3, color="tab:blue") + ax[0, 1].errorbar(x, c2 / c2_max, c2_err / c2_max, label="C2", capsize=3, color="tab:green",zorder=10) + ax[0, 1].set_xlabel(r"steps") + ax[0, 1].set_ylabel(r"$\frac{C}{C_{2,max}}$") + ax[0, 1].legend() + + y_lim = max(max(np.absolute(c1 - func(c2, popt_1_2[0], popt_1_2[1])) / c1_max + func(c2_err, 0, np.absolute(popt_1_2[1])) / c1_max) * 1.1, max(np.absolute(c1 - func(c3, popt_1_3[0], popt_1_3[1])) / c1_max + func(c3_err, 0, np.absolute(popt_1_3[1])) / c1_max) * 1.1) + + ax[1, 0].errorbar(x, c1 / c1_max - func(c2, popt_1_2[0], popt_1_2[1]) / c1_max, func(c2_err, 0, np.absolute(popt_1_2[1])) / c1_max, label="C2 fit to C1", capsize=3, color="tab:green") + ax[1, 0].errorbar(x, c1 / c1_max - func(c3, popt_1_3[0], popt_1_3[1]) / c1_max, func(c3_err, 0, np.absolute(popt_1_3[1])) / c1_max, label="C3 fit to C1", capsize=3, color="tab:blue") + ax[1, 0].plot(x, np.ones(len(c1)) * 0, label="C1", color="tab:red", zorder=10) + ax[1, 0].set_ylim(-y_lim, y_lim) + ax[1, 0].set_ylabel(r"$\frac{C_1}{C_{1,max}}$ - fit") + ax[1, 0].set_xlabel(r"steps") + ax[1, 0].legend() + + ax[1, 1].errorbar(x, c2 / c2_max - func(c3, popt_2_3[0], popt_2_3[1]) / c2_max, func(c3_err, 0, np.absolute(popt_2_3[1])) / c2_max, label="C3 fit to C2", capsize=3, color="tab:blue") + ax[1, 1].set_ylim(- max(np.absolute(c2 / c2_max - func(c3, popt_2_3[0], popt_2_3[1]) / c2_max + func(c3_err, 0, np.absolute(popt_2_3[1])) / c2_max)) * 1.1, max(np.absolute(c2 / c2_max - func(c3, popt_2_3[0], popt_2_3[1]) / c2_max + func(c3_err, 0, np.absolute(popt_2_3[1])) / c2_max)) * 1.1) + ax[1, 1].plot(x, np.ones(len(c2)) * 0, label="C2", color="tab:green",zorder=10) + ax[1, 1].set_ylabel(r"$\frac{C_2}{C_{2,max}}$ - fit") + ax[1, 1].set_xlabel(r"steps") + ax[1, 1].legend() + plt.show() + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/PythonScripts/PlotApproachCurveDragAndDrop.bat b/PythonScripts/PlotApproachCurveDragAndDrop.bat new file mode 100644 index 0000000000000000000000000000000000000000..bd112dd0a33cb025e322af4b2d2ade8ed280fd85 --- /dev/null +++ b/PythonScripts/PlotApproachCurveDragAndDrop.bat @@ -0,0 +1,4 @@ +@echo off +cd /D "%~dp0" +for %%a in (%*) do py .\PlotApproachCurve.py --file %%a +pause \ No newline at end of file diff --git a/PythonScripts/PlotApproachCurve_old.py b/PythonScripts/PlotApproachCurve_old.py new file mode 100644 index 0000000000000000000000000000000000000000..5a9c596cef5e6481da91d8540d3e27de511c983f --- /dev/null +++ b/PythonScripts/PlotApproachCurve_old.py @@ -0,0 +1,115 @@ +# -*- coding: utf-8 -*- +""" +Created on Wed Aug 9 14:45:10 2023 + +@author: Luzifer +""" + +import matplotlib.pyplot as plt +import numpy as np +import sys +from matplotlib.offsetbox import AnchoredText + +def main(): + path = "C:\MaskAligner\Data\ApproachCurve16_08_23.csv" + save = "" + + #Simple command line parsing + if("--file" in sys.argv or "-f" in sys.argv): + for i in range(len(sys.argv)): + if(sys.argv[i] == "--file" or sys.argv[i] == "--f"): + try: + path = sys.argv[i+1] + except: + print("incorrect file path.") + return + + if("--save" in sys.argv or "-s" in sys.argv): + for i in range(len(sys.argv)): + if(sys.argv[i] == "--save" or sys.argv[i] == "--s"): + try: + save = sys.argv[i+1] + except: + print("incorrect save file name.") + return + + data = np.genfromtxt(path, delimiter=",") + + x = data.T[0] + c1 = data.T[1] + c2 = data.T[2] + c3 = data.T[3] + + step_s = data.T[4][0] + step_s_err = data.T[5][0] + + + c_diff_1 = np.ones(len(c1) - 1) + c_diff_2 = np.ones(len(c2) - 1) + c_diff_3 = np.ones(len(c2) - 1) + + for i in range(len(c1)-1): + c_diff_1[i] = c1[i+1] - c1[i] + c_diff_2[i] = c2[i+1] - c2[i] + c_diff_3[i] = c3[i+1] - c3[i] + + del data + + lw = 0.75 + ms = 2 + + fig, ax = plt.subplots(2, 3) + fig.set_figheight(9) + fig.set_figwidth(16) + + ax[0,0].plot(x, c1, color="tab:red", marker="x", markersize=ms, linestyle="--", linewidth=lw) + ax[0,0].set_title("Capacitance 1") + ax[0,0].set_xlabel("Step [" + str(step_s) + "±" + str(step_s_err) + " nm]") + ax[0,0].set_ylabel("Capacitance [pF]") + + ax[0,1].plot(x, c2, color="tab:green", marker="x", markersize=ms, linestyle="--", linewidth=lw) + ax[0,1].set_title("Capacitance 2") + ax[0,1].set_xlabel("Step [" + str(step_s) + "±" + str(step_s_err) + " nm]") + ax[0,1].set_ylabel("Capacitance [pF]") + + ax[0,2].plot(x, c3, color="tab:blue", marker="x", markersize=ms, linestyle="--", linewidth=lw) + ax[0,2].set_title("Capacitance 3") + ax[0,2].set_xlabel("Step [" + str(step_s) + "±" + str(step_s_err) + " nm]") + ax[0,2].set_ylabel("Capacitance [pF]") + + ax[1,0].plot(x[1:], c_diff_1, color="tab:red", marker="x", markersize=ms, linestyle="--", linewidth=lw) + ax[1,0].set_title("Diff Capacitance 1") + ax[1,0].set_xlabel("Step [" + str(step_s) + "±" + str(step_s_err) + " nm]") + ax[1,0].set_ylabel("Capacitance [pF]") + #ax[1,0].set_ylim(-0.0025, 0.02) + + ax[1,1].plot(x[1:], c_diff_2, color="tab:green", marker="x", markersize=ms, linestyle="--", linewidth=lw) + ax[1,1].set_title("Diff Capacitance 2") + ax[1,1].set_xlabel("Step [" + str(step_s) + "±" + str(step_s_err) + " nm]") + ax[1,1].set_ylabel("Capacitance [pF]") + #ax[1,1].set_ylim(-0.0015, 0.008) + + ax[1,2].plot(x[1:], c_diff_3, color="tab:blue", marker="x", markersize=ms, linestyle="--", linewidth=lw) + ax[1,2].set_title("Diff Capacitance 3") + ax[1,2].set_xlabel("Step [" + str(step_s) + "±" + str(step_s_err) + " nm]") + ax[1,2].set_ylabel("Capacitance [pF]") + #ax[1,2].set_ylim(-0.002, 0.005) + + fig.tight_layout() + plt.show() + + #Determine Savefile name if not already specified + if(save == ""): + path_parts = [] + if("\\" in path): + path_parts = path.split("\\") + elif ("/" in path): + path_parts = path.split("/") + + save = "Plots/ApproachCurves/" + path_parts[-1].replace(".csv", "") + + fig.savefig(save + ".pdf") + fig.savefig(save + ".png", dpi=300) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/PythonScripts/PlotEvaporationData.py b/PythonScripts/PlotEvaporationData.py new file mode 100644 index 0000000000000000000000000000000000000000..666bcaeba26edcbbc576871611d1c88434743671 --- /dev/null +++ b/PythonScripts/PlotEvaporationData.py @@ -0,0 +1,94 @@ +import numpy as np +import matplotlib.pyplot as plt +import sys + +def main(): + path = "C:\MaskAligner\Data\ApproachCurve16_08_23.csv" + save = "" + + plot_Fil = False + plot_Emis = False + plot_Flux = False + plot_Volt = False + plot_Pressure = False + plot_Temp = False + + if("--file" in sys.argv or "-f" in sys.argv): + for i in range(len(sys.argv)): + if(sys.argv[i] == "--file" or sys.argv[i] == "--f"): + try: + path = sys.argv[i+1] + except: + print("incorrect file path.") + return + + if("--FIL" in sys.argv): + plot_Fil = True + if("--EMIS" in sys.argv): + plot_Emis = True + if("--FLUX" in sys.argv): + plot_Flux = True + if("--Volt" in sys.argv): + plot_Volt = True + if("--Pressure" in sys.argv): + plot_Pressure = True + if("--Temp" in sys.argv): + plot_Temp = True + if("--All" in sys.argv): + plot_Temp = True + plot_Pressure = True + plot_Volt = True + plot_Flux = True + plot_Emis = True + plot_Fil = True + + data = np.genfromtxt(path, delimiter=",", skip_header=1) + data = data.T + time = data[0] + FIL = data[1] + EMIS = data[2] + FLUX = data[3] + VOLT = data[4] + Pressure = data[5] + TEMP = data[6] + + if(plot_Fil): + plt.plot(time, FIL, label="FIL") + #plt.legend() + plt.xlabel("time in min") + plt.ylabel("FIL in A") + plt.show() + if(plot_Emis): + plt.plot(time, EMIS, label="EMIS") + #plt.legend() + plt.xlabel("time in min") + plt.ylabel("EMIS in mA") + plt.show() + if(plot_Flux): + plt.plot(time, FLUX, label="Flux") + #plt.legend() + plt.xlabel("time in min") + plt.ylabel("Flux in nA") + plt.show() + if(plot_Volt): + plt.plot(time, VOLT, label="Volt") + #plt.legend() + plt.xlabel("time in min") + plt.ylabel("Volt in V") + plt.show() + if(plot_Pressure): + plt.plot(time, Pressure, label="Pressure") + #plt.legend() + plt.xlabel("time in min") + plt.ylabel("Pressure in mbar") + plt.show() + if(plot_Temp): + plt.plot(time, TEMP, label="Temp") + #plt.legend() + plt.xlabel("time in min") + plt.ylabel("Temp in °C") + plt.show() + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/PythonScripts/PlotMultipleApproachCurves.py b/PythonScripts/PlotMultipleApproachCurves.py new file mode 100644 index 0000000000000000000000000000000000000000..dc786b2564027a824d8cee1bf0a81cba4eb01cd8 --- /dev/null +++ b/PythonScripts/PlotMultipleApproachCurves.py @@ -0,0 +1,157 @@ +# -*- coding: utf-8 -*- +""" +Created on Wed Aug 9 14:45:10 2023 + +@author: Luzifer +""" + +import matplotlib.pyplot as plt +import numpy as np +import sys + +def main(): + path = [] + save = "" + + #Simple command line parsing + if("--files" in sys.argv or "-f" in sys.argv): + for i in range(len(sys.argv)): + if(sys.argv[i] == "--files" or sys.argv[i] == "--f"): + for j in range(i+1, len(sys.argv)): + if(sys.argv[j] == "--save" or sys.argv[j] == "-s"): + break + try: + path.append(sys.argv[j]) + except: + print("incorrect file path.") + return + + if("--save" in sys.argv or "-s" in sys.argv): + for i in range(len(sys.argv)): + if(sys.argv[i] == "--save" or sys.argv[i] == "-s"): + try: + save = sys.argv[i+1] + except: + print("incorrect save file name.") + return + + if path == []: + print("No data to plot.") + return + + xs = [] + + c1s = [] + c2s = [] + c3s = [] + + c_diff_1s = [] + c_diff_2s = [] + c_diff_3s = [] + + for i in range(len(path)): + data = np.genfromtxt(path[i], delimiter=",") + + x = data.T[0] + c1 = data.T[1] + c2 = data.T[2] + c3 = data.T[3] + + c_diff_1 = np.ones(len(c1) - 1) + c_diff_2 = np.ones(len(c2) - 1) + c_diff_3 = np.ones(len(c2) - 1) + + xs.append(x) + c1s.append(c1) + c2s.append(c2) + c3s.append(c3) + + c_diff_1s.append(c_diff_1) + c_diff_2s.append(c_diff_2) + c_diff_3s.append(c_diff_3) + + for j in range(len(path)): + for i in range(len(c1s[j])-1): + c_diff_1s[j][i] = c1s[j][i+1] - c1s[j][i] + c_diff_2s[j][i] = c2s[j][i+1] - c2s[j][i] + c_diff_3s[j][i] = c3s[j][i+1] - c3s[j][i] + + del data + del c1, c2, c3, c_diff_1, c_diff_2, c_diff_3 + + lw = 0.75 + ms = 2 + + fig, ax = plt.subplots(2, 3) + fig.set_figheight(9) + fig.set_figwidth(16) + + color_1 = ["tab:red", "#e24522", "#ec5f1a", "#f47711", "#fb8f05", "#ffa600"] + color_2 = ["tab:green", "#62a50d", "#8ca900", "#b3aa00", "#d9a900", "#ffa600"] + color_3 = ["tab:blue", "#7e75c8", "#cd6abc", "#ff6292", "#ff7957", "#ffa600"] + + for i in range(len(path)): + x = np.arange(0, len(c1s[i])) + + ax[0,0].plot(xs[i], c1s[i], color=color_1[i], marker="x", markersize=ms, linestyle="--", linewidth=lw, label=path[i].replace("\\", "/").split("/")[-1].replace(".csv", "")) + ax[0,0].set_title("Capacitance 1") + ax[0,0].set_xlabel("Step") + ax[0,0].set_ylabel("Capacitance [pF]") + + ax[0,1].plot(xs[i], c2s[i], color=color_2[i], marker="x", markersize=ms, linestyle="--", linewidth=lw, label=path[i].replace("\\", "/").split("/")[-1].replace(".csv", "")) + ax[0,1].set_title("Capacitance 2") + ax[0,1].set_xlabel("Step") + ax[0,1].set_ylabel("Capacitance [pF]") + + ax[0,2].plot(xs[i], c3s[i], color=color_3[i], marker="x", markersize=ms, linestyle="--", linewidth=lw, label=path[i].replace("\\", "/").split("/")[-1].replace(".csv", "")) + ax[0,2].set_title("Capacitance 3") + ax[0,2].set_xlabel("Step") + ax[0,2].set_ylabel("Capacitance [pF]") + + ax[1,0].plot(xs[i][1:], c_diff_1s[i], color=color_1[i], marker="x", markersize=ms, linestyle="--", linewidth=lw, label=path[i].replace("\\", "/").split("/")[-1].replace(".csv", "")) + ax[1,0].set_title("Diff Capacitance 1") + ax[1,0].set_xlabel("Step") + ax[1,0].set_ylabel("Capacitance [pF]") + #ax[1,0].set_ylim(-0.0025, 0.02) + + ax[1,1].plot(xs[i][1:], c_diff_2s[i], color=color_2[i], marker="x", markersize=ms, linestyle="--", linewidth=lw, label=path[i].replace("\\", "/").split("/")[-1].replace(".csv", "")) + ax[1,1].set_title("Diff Capacitance 2") + ax[1,1].set_xlabel("Step") + ax[1,1].set_ylabel("Capacitance [pF]") + #ax[1,1].set_ylim(-0.0015, 0.008) + + ax[1,2].plot(xs[i][1:], c_diff_3s[i], color=color_3[i], marker="x", markersize=ms, linestyle="--", linewidth=lw, label=path[i].replace("\\", "/").split("/")[-1].replace(".csv", "")) + ax[1,2].set_title("Diff Capacitance 3") + ax[1,2].set_xlabel("Step") + ax[1,2].set_ylabel("Capacitance [pF]") + #ax[1,2].set_ylim(-0.002, 0.005) + + ax[0,0].legend() + ax[0,1].legend() + ax[0,2].legend() + ax[1,0].legend() + ax[1,1].legend() + ax[1,2].legend() + ax[1,2].legend() + fig.tight_layout() + plt.show() + + #Determine Savefile name if not already specified, by taking capital letters and number in string and concatenating + if(save == ""): + path_parts = [] + for i in range(len(path)): + path_parts.append(path[i].replace("\\", "/").split("/")[-1].replace(".csv", "")) + path_parts[i] = [x for x in path_parts[i] if x.isupper() or x.isdigit()] + path_parts[i] = "".join(path_parts[i]) + + path_part = "" + for i in range(len(path)): + path_part += path_parts[i] + + save = "Plots/ApproachCurves/" + path_part + + fig.savefig(save + "comparison" + ".pdf") + fig.savefig(save + "comparison" + ".png", dpi=300) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/PythonScripts/PlotPressurePlort.py b/PythonScripts/PlotPressurePlort.py new file mode 100644 index 0000000000000000000000000000000000000000..93ea96d33535b93eae794f2237e44a56e3f1134a --- /dev/null +++ b/PythonScripts/PlotPressurePlort.py @@ -0,0 +1,37 @@ +import matplotlib.pyplot as plt +import numpy as np +import sys +from datetime import datetime + +def remove_day_of_week(string): + return string.replace("Mon", "").replace("Tue", "").replace("Wed", "").replace("Thu", "").replace("Fri", "").replace("Sat", "").replace("Son", "") + +def main(): + file = "C:\MaskAligner\Data\Pressure\Pressure01.txt" + if("--file" in sys.argv or "-f" in sys.argv): + for i in range(len(sys.argv)): + if("--file" in sys.argv[i] or "-f" == sys.argv[i]): + try: + file = sys.argv[i+1] + except: + print("No file or incorrect file specification.") + + times = [] + pressures = [] + + with open(file, "r") as read_file: + lines = read_file.readlines() + pressures = np.zeros(len(lines) - 1) + + for i in range(1, len(lines)): + temp = lines[i].split("\t") + t = datetime.strptime(remove_day_of_week(temp[0]).replace(" ", " "), "%H:%M:%S %d.%m.%y") + times.append(t) + pressures[i-1] = float(temp[1]) + + plt.plot(times, pressures) + plt.ylabel("pressure [mbar]") + plt.show() + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/PythonScripts/PlotPressureRealtime.py b/PythonScripts/PlotPressureRealtime.py new file mode 100644 index 0000000000000000000000000000000000000000..4a73632d85fe19de0b36e5972ce29a61d17868e3 --- /dev/null +++ b/PythonScripts/PlotPressureRealtime.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +""" +Created on Thu Nov 30 15:07:58 2023 + +@author: admin +""" + +import time +import serial +import numpy as np +import matplotlib.pyplot as plt + +def reading(): + ser = serial.Serial('COM7', 19200, timeout=0, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=8) + read_command = b"RFM%d\r" % 1 + ser.write(read_command) + time.sleep(.03) + pressure = '' + while ser.inWaiting() > 0: + pressure += ser.read(1).decode('ascii') + + print(pressure) + + if pressure[0] == '0': + return float(pressure) + else: + return float('nan') + + ser.close() + +def main(): + for i in range(0, 100): + pressure = [] + temp_press = reading() + pressure.append(temp_press) + + plt.plot(pressure) + plt.pause(0.05) + plt.show() + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/PythonScripts/PlotRHKData.py b/PythonScripts/PlotRHKData.py new file mode 100644 index 0000000000000000000000000000000000000000..d507f415e218808b04750b173a7e24bf1f10fa3a --- /dev/null +++ b/PythonScripts/PlotRHKData.py @@ -0,0 +1,32 @@ +import numpy as np +import matplotlib.pyplot as plt + +def main(): + path = "C:/MaskAligner/Data/RHKDAta.csv" + data = np.genfromtxt(path, skip_header=1, delimiter=",") + data = data.T + U_2ms = data[0] + U_1ms = data[3] + Down_2ms = data[1] + Down_1ms = data[4] + Up_2ms = data[2] + Up_1ms = data[5] + + err = 1 + + plt.errorbar(U_2ms, Down_2ms, Down_2ms * 0.1, label="+ 2ms", capsize=3, color="tab:blue") + plt.errorbar(U_2ms, Up_2ms, Up_2ms * 0.1, label="- 2ms", capsize=3, color="tab:red") + plt.plot(U_2ms, Up_2ms /2, linestyle="dashed", color="tab:red") + plt.plot(U_2ms, Down_2ms /2, linestyle="dashed", color="tab:blue") + plt.errorbar(U_1ms, Down_1ms, Down_1ms * 0.1, label="+ 1ms", capsize=3, color="tab:cyan") + plt.errorbar(U_1ms, Up_1ms, Up_1ms * 0.1, label="- 1ms", capsize=3, color="tab:orange") + + plt.xlabel("Voltage [V]") + plt.ylabel("1/speed [s/mm]") + plt.legend() + plt.savefig("Plots/RHKDatadep.pdf") + plt.savefig("Plots/RHKDatadep.png", dpi=300) + plt.show() + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/PythonScripts/Plots/ApproachCurves/AC090823KIM001AC160823AC170823AC1708232AC180823Z3DSScomparison.pdf b/PythonScripts/Plots/ApproachCurves/AC090823KIM001AC160823AC170823AC1708232AC180823Z3DSScomparison.pdf new file mode 100644 index 0000000000000000000000000000000000000000..29c6161f020923a8154493818ee5b0a9b4a98128 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/AC090823KIM001AC160823AC170823AC1708232AC180823Z3DSScomparison.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/AC090823KIM001AC160823AC170823AC1708232AC180823Z3DSScomparison.png b/PythonScripts/Plots/ApproachCurves/AC090823KIM001AC160823AC170823AC1708232AC180823Z3DSScomparison.png new file mode 100644 index 0000000000000000000000000000000000000000..2363f53d2e4c7026f68b1996f07895d526ed6f2e Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/AC090823KIM001AC160823AC170823AC1708232AC180823Z3DSScomparison.png differ diff --git a/PythonScripts/Plots/ApproachCurves/AC160823AC170823AC1708232comparison.pdf b/PythonScripts/Plots/ApproachCurves/AC160823AC170823AC1708232comparison.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6acb42ebea370447ac1d6912d57eff3ccb39abb5 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/AC160823AC170823AC1708232comparison.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/AC160823AC170823AC1708232comparison.png b/PythonScripts/Plots/ApproachCurves/AC160823AC170823AC1708232comparison.png new file mode 100644 index 0000000000000000000000000000000000000000..ddd4af68a39d3224314ba13266e7cc5180298550 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/AC160823AC170823AC1708232comparison.png differ diff --git a/PythonScripts/Plots/ApproachCurves/AC160823AC170823comparison.pdf b/PythonScripts/Plots/ApproachCurves/AC160823AC170823comparison.pdf new file mode 100644 index 0000000000000000000000000000000000000000..217158197856bdb45d2fc0c3e1b0c109417e0ecf Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/AC160823AC170823comparison.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/AC160823AC170823comparison.png b/PythonScripts/Plots/ApproachCurves/AC160823AC170823comparison.png new file mode 100644 index 0000000000000000000000000000000000000000..4e60e354a7f3ec201d4949b92b06b8a6c6c22d3e Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/AC160823AC170823comparison.png differ diff --git a/PythonScripts/Plots/ApproachCurves/AC170823AC1708232AC180823Z1DSScomparison.pdf b/PythonScripts/Plots/ApproachCurves/AC170823AC1708232AC180823Z1DSScomparison.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3a102427f1635cc4c669c38c450b26db234cad12 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/AC170823AC1708232AC180823Z1DSScomparison.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/AC170823AC1708232AC180823Z1DSScomparison.png b/PythonScripts/Plots/ApproachCurves/AC170823AC1708232AC180823Z1DSScomparison.png new file mode 100644 index 0000000000000000000000000000000000000000..7f794a7b1024eeea71316cee12a01c254b153340 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/AC170823AC1708232AC180823Z1DSScomparison.png differ diff --git a/PythonScripts/Plots/ApproachCurves/AC170823AC1708232AC180823Z3DSSAC090823KIM001comparison.pdf b/PythonScripts/Plots/ApproachCurves/AC170823AC1708232AC180823Z3DSSAC090823KIM001comparison.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fe345d63c4087220144e680302bcacabb9a3e87c Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/AC170823AC1708232AC180823Z3DSSAC090823KIM001comparison.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/AC170823AC1708232AC180823Z3DSSAC090823KIM001comparison.png b/PythonScripts/Plots/ApproachCurves/AC170823AC1708232AC180823Z3DSSAC090823KIM001comparison.png new file mode 100644 index 0000000000000000000000000000000000000000..bd329b4f4afc4804734e749ca9f9ea0345b9cc64 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/AC170823AC1708232AC180823Z3DSSAC090823KIM001comparison.png differ diff --git a/PythonScripts/Plots/ApproachCurves/AC170823AC1708232AC180823Z3DSScomparison.pdf b/PythonScripts/Plots/ApproachCurves/AC170823AC1708232AC180823Z3DSScomparison.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3308289d32e93498e21189d0c02e64f6a4c2561e Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/AC170823AC1708232AC180823Z3DSScomparison.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/AC170823AC1708232AC180823Z3DSScomparison.png b/PythonScripts/Plots/ApproachCurves/AC170823AC1708232AC180823Z3DSScomparison.png new file mode 100644 index 0000000000000000000000000000000000000000..519032fd8eeda7a89892746173b442a99b7c458b Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/AC170823AC1708232AC180823Z3DSScomparison.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachAndRetractCurve21_11_23_ToFullContact.pdf b/PythonScripts/Plots/ApproachCurves/ApproachAndRetractCurve21_11_23_ToFullContact.pdf new file mode 100644 index 0000000000000000000000000000000000000000..92d7a858768f2664e0c1defad6ec51e553fd8b66 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachAndRetractCurve21_11_23_ToFullContact.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachAndRetractCurve21_11_23_ToFullContact.png b/PythonScripts/Plots/ApproachCurves/ApproachAndRetractCurve21_11_23_ToFullContact.png new file mode 100644 index 0000000000000000000000000000000000000000..527b9c4461fb597973c7739ca01945c21f436d2a Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachAndRetractCurve21_11_23_ToFullContact.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurve090823KIM001.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurve090823KIM001.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b7edcb6cbf2e9fde86fb47e5ea55728ed1496cf2 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurve090823KIM001.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurve090823KIM001.png b/PythonScripts/Plots/ApproachCurves/ApproachCurve090823KIM001.png new file mode 100644 index 0000000000000000000000000000000000000000..54d2fab889f6e1e69d59967d85e0d9da9276cef7 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurve090823KIM001.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurve16_08_23.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurve16_08_23.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a8b66554dd5afce25bbe2579c04b6ca000b98e69 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurve16_08_23.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurve16_08_23.png b/PythonScripts/Plots/ApproachCurves/ApproachCurve16_08_23.png new file mode 100644 index 0000000000000000000000000000000000000000..e87dab2e72ce35a82d87c382d934434ad12925e6 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurve16_08_23.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurve17_08_23.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurve17_08_23.pdf new file mode 100644 index 0000000000000000000000000000000000000000..40404342592771f290cfa8dcd9ef1899b81a93ee Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurve17_08_23.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurve17_08_23.png b/PythonScripts/Plots/ApproachCurves/ApproachCurve17_08_23.png new file mode 100644 index 0000000000000000000000000000000000000000..88d39e56497c4f0eb963fd9f9b9e27e0b3086ed7 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurve17_08_23.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurve17_08_23_19steps.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurve17_08_23_19steps.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5e8e706d4096c15d08b59f6e3cc1bf287f9ad2a4 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurve17_08_23_19steps.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurve17_08_23_19steps.png b/PythonScripts/Plots/ApproachCurves/ApproachCurve17_08_23_19steps.png new file mode 100644 index 0000000000000000000000000000000000000000..8e321979072c7ebf6bd03a8c280cd0c080a450fb Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurve17_08_23_19steps.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurve17_08_23_2.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurve17_08_23_2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2ad64d096459fefb206e873987900d5b73d47a84 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurve17_08_23_2.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurve17_08_23_2.png b/PythonScripts/Plots/ApproachCurves/ApproachCurve17_08_23_2.png new file mode 100644 index 0000000000000000000000000000000000000000..d74a5dde1e8bebbead1c3b936487d38e37224bd7 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurve17_08_23_2.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurve18_08_23_Z1_StepSize10.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurve18_08_23_Z1_StepSize10.pdf new file mode 100644 index 0000000000000000000000000000000000000000..09d44b1049665cc82f19138c68c194f5b796d703 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurve18_08_23_Z1_StepSize10.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurve18_08_23_Z1_StepSize10.png b/PythonScripts/Plots/ApproachCurves/ApproachCurve18_08_23_Z1_StepSize10.png new file mode 100644 index 0000000000000000000000000000000000000000..a6a5444cc3679731954cb2565cc5be91e5013f35 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurve18_08_23_Z1_StepSize10.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurve20_11_23_206of580_.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurve20_11_23_206of580_.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7774d4f0cb5ea495a34118d1f25344f6bd0e39b7 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurve20_11_23_206of580_.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurve20_11_23_206of580_.png b/PythonScripts/Plots/ApproachCurves/ApproachCurve20_11_23_206of580_.png new file mode 100644 index 0000000000000000000000000000000000000000..073751407eac3127757afebef4f832b80abca145 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurve20_11_23_206of580_.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurve20_11_23_AfterFix (2).pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurve20_11_23_AfterFix (2).pdf new file mode 100644 index 0000000000000000000000000000000000000000..46f175f60cf3146979dce21fcbf6ab3ab02e4a45 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurve20_11_23_AfterFix (2).pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurve20_11_23_AfterFix (2).png b/PythonScripts/Plots/ApproachCurves/ApproachCurve20_11_23_AfterFix (2).png new file mode 100644 index 0000000000000000000000000000000000000000..e11cc33bb4a4b6d8f28d86a61e3deb4efc2be171 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurve20_11_23_AfterFix (2).png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurve20_11_23_AfterFix.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurve20_11_23_AfterFix.pdf new file mode 100644 index 0000000000000000000000000000000000000000..19128a89fa258f540ef6063020b2b78e5ba449db Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurve20_11_23_AfterFix.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurve20_11_23_AfterFix.png b/PythonScripts/Plots/ApproachCurves/ApproachCurve20_11_23_AfterFix.png new file mode 100644 index 0000000000000000000000000000000000000000..f4816da8719a4c4603ff582f46bd2c94951bbf10 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurve20_11_23_AfterFix.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurve21_11_23.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurve21_11_23.pdf new file mode 100644 index 0000000000000000000000000000000000000000..94479ec4de5fc8ce936d2b68397aa1ca3b755cc7 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurve21_11_23.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurve21_11_23.png b/PythonScripts/Plots/ApproachCurves/ApproachCurve21_11_23.png new file mode 100644 index 0000000000000000000000000000000000000000..fe63b56fa93af536339247759952a4084c6428e2 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurve21_11_23.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurve21_11_23_ToFullContact - Copy.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurve21_11_23_ToFullContact - Copy.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1ce3c0c5261a0386e47ab439b053fa6dec0b30ec Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurve21_11_23_ToFullContact - Copy.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurve21_11_23_ToFullContact - Copy.png b/PythonScripts/Plots/ApproachCurves/ApproachCurve21_11_23_ToFullContact - Copy.png new file mode 100644 index 0000000000000000000000000000000000000000..72a7497d419c8db89173115be819fad679056a04 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurve21_11_23_ToFullContact - Copy.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurve21_11_23_ToFullContact.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurve21_11_23_ToFullContact.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b83d28672d129ec739434e39150f7113deb9aa69 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurve21_11_23_ToFullContact.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurve21_11_23_ToFullContact.png b/PythonScripts/Plots/ApproachCurves/ApproachCurve21_11_23_ToFullContact.png new file mode 100644 index 0000000000000000000000000000000000000000..42be9162aff088edc30efef87a0d7c63b92e5250 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurve21_11_23_ToFullContact.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveAfterNearOnlyZ3.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurveAfterNearOnlyZ3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d0f66459d4630f9621d7594975bcd54ffbde48de Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveAfterNearOnlyZ3.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveAfterNearOnlyZ3.png b/PythonScripts/Plots/ApproachCurves/ApproachCurveAfterNearOnlyZ3.png new file mode 100644 index 0000000000000000000000000000000000000000..ecca7ee8c4377bdd4a23dbbc787826982aa720f2 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveAfterNearOnlyZ3.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveAlternating.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurveAlternating.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4444411e8e38c290d65778d951d6699961d476fc Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveAlternating.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveAlternating.png b/PythonScripts/Plots/ApproachCurves/ApproachCurveAlternating.png new file mode 100644 index 0000000000000000000000000000000000000000..cfdca5020b498ecaee4cfdc4b7e8b766b84b6fd6 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveAlternating.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent - Copy.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent - Copy.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9fdc998a135bf214626b6591efdc6634c8eb52ff Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent - Copy.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent - Copy.png b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent - Copy.png new file mode 100644 index 0000000000000000000000000000000000000000..a2122a47b09b849700b0db1408bbb1c510e0a787 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent - Copy.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent1 - Copy.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent1 - Copy.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5a50cbf9d6c701b2307dc3a1527ec208ac0d0f4e Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent1 - Copy.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent1 - Copy.png b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent1 - Copy.png new file mode 100644 index 0000000000000000000000000000000000000000..bfe305c771bbc07c61be384dba5f4ef8c6256364 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent1 - Copy.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent1.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ed3fdf3e6154a73c87ea8f940f9e6018ad737e82 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent1.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent1.png b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent1.png new file mode 100644 index 0000000000000000000000000000000000000000..b0883551504f939c72c9ff9cd25bfe85de3f5410 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent1.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent111.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent111.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3ddcf960d11c28834b7c6f4a6b7d5096235ee9d8 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent111.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent111.png b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent111.png new file mode 100644 index 0000000000000000000000000000000000000000..208d70771c76e1c685638fc2053280d222de2bc7 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent111.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent11113.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent11113.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6bcf5f4b5ee85bee24f5e641f6cd9eb43131c513 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent11113.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent11113.png b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent11113.png new file mode 100644 index 0000000000000000000000000000000000000000..364d91a86059d20b4f009811b1d1bca3570a9ad3 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent11113.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent12.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent12.pdf new file mode 100644 index 0000000000000000000000000000000000000000..62bdd3230452c73cc415b797e5027fdd89e41cb9 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent12.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent12.png b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent12.png new file mode 100644 index 0000000000000000000000000000000000000000..2e888c42444ee54ba966b861ad56792585191038 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent12.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent16.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent16.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2e1bd235cdf32f672f4d13af31b68968274e376f Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent16.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent16.png b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent16.png new file mode 100644 index 0000000000000000000000000000000000000000..3bdf0d396b9f488fe5bf26361eafe450b8585c43 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent16.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent17.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent17.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2e81bc25b48ffd4639012c1682d67a97621d72ed Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent17.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent17.png b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent17.png new file mode 100644 index 0000000000000000000000000000000000000000..b3119900b3adc1c096a7fd9271dbd76aa131c3e8 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent17.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent2.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fc9f86b47532720eaa79670cac661afbe60246a6 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent2.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent2.png b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent2.png new file mode 100644 index 0000000000000000000000000000000000000000..cfdca5020b498ecaee4cfdc4b7e8b766b84b6fd6 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent2.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent3.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..40f849b8f542786407079a4e243e907bcf61402d Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent3.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent3.png b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent3.png new file mode 100644 index 0000000000000000000000000000000000000000..de8172b2e70cb1abaa50f4b3f18ffabdf3cb65a5 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent3.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent4 - Copy.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent4 - Copy.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c7dded13ac2f74459bbf6aebb18fc643fb5d9f85 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent4 - Copy.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent4 - Copy.png b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent4 - Copy.png new file mode 100644 index 0000000000000000000000000000000000000000..b267a51e6cffddfad8f12b2958ca78fc43d783eb Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent4 - Copy.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent5 - Copy.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent5 - Copy.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d634fac4f40edc1b680b16aaf3b553fbf8ab477e Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent5 - Copy.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent5 - Copy.png b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent5 - Copy.png new file mode 100644 index 0000000000000000000000000000000000000000..dd07b8949dbb79c1725c7f3b07e0b55906ae9b1d Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent5 - Copy.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent6.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent6.pdf new file mode 100644 index 0000000000000000000000000000000000000000..abd6484573ed51b3cf5de99f400e7730ae0c8243 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent6.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent6.png b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent6.png new file mode 100644 index 0000000000000000000000000000000000000000..d9da6c1f39cc1525eac9b9a836bdaab9a67d2a1a Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent6.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent9.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent9.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f6a0f1b577cc3c5040e7291b8d36700a287f21d8 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent9.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent9.png b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent9.png new file mode 100644 index 0000000000000000000000000000000000000000..bf026b897e53e435c5e09b7357b4169d9260b7f6 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrent9.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrentToFullContactAfterFeedthroughRepair.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrentToFullContactAfterFeedthroughRepair.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d1677c68f2b378086c9c055f9bd94f176596bec8 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrentToFullContactAfterFeedthroughRepair.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrentToFullContactAfterFeedthroughRepair.png b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrentToFullContactAfterFeedthroughRepair.png new file mode 100644 index 0000000000000000000000000000000000000000..b0883551504f939c72c9ff9cd25bfe85de3f5410 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveCurrentToFullContactAfterFeedthroughRepair.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveFrom25toNearSomewhere.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurveFrom25toNearSomewhere.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7b29d0e21ec718289b01268433574186fd89ebfc Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveFrom25toNearSomewhere.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveFrom25toNearSomewhere.png b/PythonScripts/Plots/ApproachCurves/ApproachCurveFrom25toNearSomewhere.png new file mode 100644 index 0000000000000000000000000000000000000000..789b12c946caa762ad939ed3897eb868f365dce8 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveFrom25toNearSomewhere.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveFrom50Mikron.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurveFrom50Mikron.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bbdfec17e17c2e6336775e9f7ef90394b2778ef2 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveFrom50Mikron.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveFrom50Mikron.png b/PythonScripts/Plots/ApproachCurves/ApproachCurveFrom50Mikron.png new file mode 100644 index 0000000000000000000000000000000000000000..059063cc5f51d5be0bd304b23602f971016c8c6a Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveFrom50Mikron.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveFromAfar.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurveFromAfar.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3d2eb547812915c4618d8dd373de8c5fcf937c2c Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveFromAfar.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveFromAfar.png b/PythonScripts/Plots/ApproachCurves/ApproachCurveFromAfar.png new file mode 100644 index 0000000000000000000000000000000000000000..9597f1ed9aac8dd3c4306b677243496b348cc64d Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveFromAfar.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveFromAfar20_11_23.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurveFromAfar20_11_23.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bb7ec9174fcbd86c78195b8dda72545b12f3014d Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveFromAfar20_11_23.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveFromAfar20_11_23.png b/PythonScripts/Plots/ApproachCurves/ApproachCurveFromAfar20_11_23.png new file mode 100644 index 0000000000000000000000000000000000000000..9597f1ed9aac8dd3c4306b677243496b348cc64d Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveFromAfar20_11_23.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveOldCorrelationtestNOTREALDATA.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurveOldCorrelationtestNOTREALDATA.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ced2a8e25c3fc8bb386bfd53510dd2142de59a4f Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveOldCorrelationtestNOTREALDATA.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveOldCorrelationtestNOTREALDATA.png b/PythonScripts/Plots/ApproachCurves/ApproachCurveOldCorrelationtestNOTREALDATA.png new file mode 100644 index 0000000000000000000000000000000000000000..3165dc2662a19477ea7d94a99854fdc2d30573e0 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveOldCorrelationtestNOTREALDATA.png differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveSlightForwardAgain.pdf b/PythonScripts/Plots/ApproachCurves/ApproachCurveSlightForwardAgain.pdf new file mode 100644 index 0000000000000000000000000000000000000000..045f3a55a0935e08492750a57311209852635199 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveSlightForwardAgain.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/ApproachCurveSlightForwardAgain.png b/PythonScripts/Plots/ApproachCurves/ApproachCurveSlightForwardAgain.png new file mode 100644 index 0000000000000000000000000000000000000000..de685915dec90762535566103c97adcec0533fb0 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/ApproachCurveSlightForwardAgain.png differ diff --git a/PythonScripts/Plots/ApproachCurves/IneterstingCurve.pdf b/PythonScripts/Plots/ApproachCurves/IneterstingCurve.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cbcaba2b0691ad3fee0e8af2d9bb2a3668b85659 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/IneterstingCurve.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/IneterstingCurve.png b/PythonScripts/Plots/ApproachCurves/IneterstingCurve.png new file mode 100644 index 0000000000000000000000000000000000000000..c18dd335ef5b23a5263c4852e4592cac8e992c02 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/IneterstingCurve.png differ diff --git a/PythonScripts/Plots/ApproachCurves/RC170823200RC1708232002comparison.pdf b/PythonScripts/Plots/ApproachCurves/RC170823200RC1708232002comparison.pdf new file mode 100644 index 0000000000000000000000000000000000000000..92eed48608c90e3e598c5020f6fce7c061ce7b19 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/RC170823200RC1708232002comparison.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/RC170823200RC1708232002comparison.png b/PythonScripts/Plots/ApproachCurves/RC170823200RC1708232002comparison.png new file mode 100644 index 0000000000000000000000000000000000000000..e34d249e689a7902a49dd3b7a20eab51502cce75 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/RC170823200RC1708232002comparison.png differ diff --git a/PythonScripts/Plots/ApproachCurves/RetractCurve171123.pdf b/PythonScripts/Plots/ApproachCurves/RetractCurve171123.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0506e53b1f55006a56803450c1121691b0d198a9 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/RetractCurve171123.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/RetractCurve171123.png b/PythonScripts/Plots/ApproachCurves/RetractCurve171123.png new file mode 100644 index 0000000000000000000000000000000000000000..beea1de859f37ea39827681bc032aa1a594523c5 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/RetractCurve171123.png differ diff --git a/PythonScripts/Plots/ApproachCurves/RetractCurve17_08_23_200steps.pdf b/PythonScripts/Plots/ApproachCurves/RetractCurve17_08_23_200steps.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c448f9b9f801a430f272916ca499fd1cf53e6929 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/RetractCurve17_08_23_200steps.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/RetractCurve17_08_23_200steps.png b/PythonScripts/Plots/ApproachCurves/RetractCurve17_08_23_200steps.png new file mode 100644 index 0000000000000000000000000000000000000000..6cfeaa92083fd62c9a30ff90200ca662e4f6f6d2 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/RetractCurve17_08_23_200steps.png differ diff --git a/PythonScripts/Plots/ApproachCurves/RetractCurve17_08_23_200steps_2.pdf b/PythonScripts/Plots/ApproachCurves/RetractCurve17_08_23_200steps_2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a0cf215651e46db55b6f2d1338d9e37402df5195 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/RetractCurve17_08_23_200steps_2.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/RetractCurve17_08_23_200steps_2.png b/PythonScripts/Plots/ApproachCurves/RetractCurve17_08_23_200steps_2.png new file mode 100644 index 0000000000000000000000000000000000000000..9cc1db1ebb177c5e7b22957e24bb0525839406d6 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/RetractCurve17_08_23_200steps_2.png differ diff --git a/PythonScripts/Plots/ApproachCurves/RetractCurveCurrentFromFullContactAfterFeedthroughRepair.pdf b/PythonScripts/Plots/ApproachCurves/RetractCurveCurrentFromFullContactAfterFeedthroughRepair.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e8a503ba286660633c86dc557427d323578e3b67 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/RetractCurveCurrentFromFullContactAfterFeedthroughRepair.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/RetractCurveCurrentFromFullContactAfterFeedthroughRepair.png b/PythonScripts/Plots/ApproachCurves/RetractCurveCurrentFromFullContactAfterFeedthroughRepair.png new file mode 100644 index 0000000000000000000000000000000000000000..cc97ebc94731f283372bdb50e2452be335259951 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/RetractCurveCurrentFromFullContactAfterFeedthroughRepair.png differ diff --git a/PythonScripts/Plots/ApproachCurves/RetractCurve_21_11_23_600.pdf b/PythonScripts/Plots/ApproachCurves/RetractCurve_21_11_23_600.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ed5dd8b697cb8b524c3098c867af336c2e1f178f Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/RetractCurve_21_11_23_600.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/RetractCurve_21_11_23_600.png b/PythonScripts/Plots/ApproachCurves/RetractCurve_21_11_23_600.png new file mode 100644 index 0000000000000000000000000000000000000000..33733c17459d3fc3ad765d0231d77f99115142e6 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/RetractCurve_21_11_23_600.png differ diff --git a/PythonScripts/Plots/ApproachCurves/RetractCurve_21_11_23_First300.pdf b/PythonScripts/Plots/ApproachCurves/RetractCurve_21_11_23_First300.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9b69fa0f6c65cb1f20a2f4663a24eae788a5eae8 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/RetractCurve_21_11_23_First300.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/RetractCurve_21_11_23_First300.png b/PythonScripts/Plots/ApproachCurves/RetractCurve_21_11_23_First300.png new file mode 100644 index 0000000000000000000000000000000000000000..6c0f91f87d2ad7478c2e432b83e81acf3106c182 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/RetractCurve_21_11_23_First300.png differ diff --git a/PythonScripts/Plots/ApproachCurves/TestDrivingAtFullContact.pdf b/PythonScripts/Plots/ApproachCurves/TestDrivingAtFullContact.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2ff8a1aee102639af2cf9606928a31abf3601b3d Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/TestDrivingAtFullContact.pdf differ diff --git a/PythonScripts/Plots/ApproachCurves/TestDrivingAtFullContact.png b/PythonScripts/Plots/ApproachCurves/TestDrivingAtFullContact.png new file mode 100644 index 0000000000000000000000000000000000000000..1037a01f5e9cc3c8f263accf247aedeac7670475 Binary files /dev/null and b/PythonScripts/Plots/ApproachCurves/TestDrivingAtFullContact.png differ diff --git a/PythonScripts/Plots/Calibration/100_All_Data.pdf b/PythonScripts/Plots/Calibration/100_All_Data.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b64010eaec9835cd4c692c4154bc0f2d52b1b7e1 Binary files /dev/null and b/PythonScripts/Plots/Calibration/100_All_Data.pdf differ diff --git a/PythonScripts/Plots/Calibration/125_All_Data.pdf b/PythonScripts/Plots/Calibration/125_All_Data.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a6bf08fadd06dd20947a683e55755c48dbd2945a Binary files /dev/null and b/PythonScripts/Plots/Calibration/125_All_Data.pdf differ diff --git a/PythonScripts/Plots/Calibration/85_All_Data.pdf b/PythonScripts/Plots/Calibration/85_All_Data.pdf new file mode 100644 index 0000000000000000000000000000000000000000..53b43e07f49dc73e232f54f67dae917be197f8dd Binary files /dev/null and b/PythonScripts/Plots/Calibration/85_All_Data.pdf differ diff --git a/PythonScripts/Plots/Calibration/Z_100.pdf b/PythonScripts/Plots/Calibration/Z_100.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f6f1ee78f3854f4c2976374946312575193e5798 Binary files /dev/null and b/PythonScripts/Plots/Calibration/Z_100.pdf differ diff --git a/PythonScripts/Plots/Calibration/Z_100.png b/PythonScripts/Plots/Calibration/Z_100.png new file mode 100644 index 0000000000000000000000000000000000000000..fffe602cb6a44c38ed08911e429a2e15379eec2b Binary files /dev/null and b/PythonScripts/Plots/Calibration/Z_100.png differ diff --git a/PythonScripts/Plots/Calibration/Z_125.pdf b/PythonScripts/Plots/Calibration/Z_125.pdf new file mode 100644 index 0000000000000000000000000000000000000000..be6f16b5e7f0ff5ee4a1b3359b07c7832efafc9b Binary files /dev/null and b/PythonScripts/Plots/Calibration/Z_125.pdf differ diff --git a/PythonScripts/Plots/Calibration/Z_125.png b/PythonScripts/Plots/Calibration/Z_125.png new file mode 100644 index 0000000000000000000000000000000000000000..5e63dccdd5be168c01a84782ee7c9bc3c9ec5a67 Binary files /dev/null and b/PythonScripts/Plots/Calibration/Z_125.png differ diff --git a/PythonScripts/Plots/Calibration/Z_85.pdf b/PythonScripts/Plots/Calibration/Z_85.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cc50d5afcf3fb7cad567c355b1b51628a4ba454a Binary files /dev/null and b/PythonScripts/Plots/Calibration/Z_85.pdf differ diff --git a/PythonScripts/Plots/Calibration/Z_85.png b/PythonScripts/Plots/Calibration/Z_85.png new file mode 100644 index 0000000000000000000000000000000000000000..2149258c817d3e0a01c0544f6f7292ac8c4db94b Binary files /dev/null and b/PythonScripts/Plots/Calibration/Z_85.png differ diff --git a/PythonScripts/Plots/CalibrationAfterRepair/100V.pdf b/PythonScripts/Plots/CalibrationAfterRepair/100V.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b7b20d1a2f9b362574459f2de23b4140ccc3dbd9 Binary files /dev/null and b/PythonScripts/Plots/CalibrationAfterRepair/100V.pdf differ diff --git a/PythonScripts/Plots/CalibrationAfterRepair/100V.png b/PythonScripts/Plots/CalibrationAfterRepair/100V.png new file mode 100644 index 0000000000000000000000000000000000000000..2a2f7e66d6414a9b6b195ad23fec51d9c4c39de9 Binary files /dev/null and b/PythonScripts/Plots/CalibrationAfterRepair/100V.png differ diff --git a/PythonScripts/Plots/CalibrationAfterRepair/120V.pdf b/PythonScripts/Plots/CalibrationAfterRepair/120V.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ce1a5ce799312159132b174cb85ab6213bdbc0d5 Binary files /dev/null and b/PythonScripts/Plots/CalibrationAfterRepair/120V.pdf differ diff --git a/PythonScripts/Plots/CalibrationAfterRepair/120V.png b/PythonScripts/Plots/CalibrationAfterRepair/120V.png new file mode 100644 index 0000000000000000000000000000000000000000..be1a53ffb66a40f30f9db4fd5bf5d0e42c71a1d0 Binary files /dev/null and b/PythonScripts/Plots/CalibrationAfterRepair/120V.png differ diff --git a/PythonScripts/Plots/CalibrationAfterRepair/70V.pdf b/PythonScripts/Plots/CalibrationAfterRepair/70V.pdf new file mode 100644 index 0000000000000000000000000000000000000000..411b9b640372a52c18b1db0ef48c31fd0534f3ac Binary files /dev/null and b/PythonScripts/Plots/CalibrationAfterRepair/70V.pdf differ diff --git a/PythonScripts/Plots/CalibrationAfterRepair/70V.png b/PythonScripts/Plots/CalibrationAfterRepair/70V.png new file mode 100644 index 0000000000000000000000000000000000000000..7ecd9218df513afa205073a02b92cb9db405b036 Binary files /dev/null and b/PythonScripts/Plots/CalibrationAfterRepair/70V.png differ diff --git a/PythonScripts/Plots/CalibrationAfterRepair/80V.pdf b/PythonScripts/Plots/CalibrationAfterRepair/80V.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d432a01769ad91392b92c76f72251d4bb51639f5 Binary files /dev/null and b/PythonScripts/Plots/CalibrationAfterRepair/80V.pdf differ diff --git a/PythonScripts/Plots/CalibrationAfterRepair/80V.png b/PythonScripts/Plots/CalibrationAfterRepair/80V.png new file mode 100644 index 0000000000000000000000000000000000000000..8890c756f0e2d44f0ba00e0ab0a2781fc92cfb56 Binary files /dev/null and b/PythonScripts/Plots/CalibrationAfterRepair/80V.png differ diff --git a/PythonScripts/Plots/CalibrationAfterRepair/Errors.pdf b/PythonScripts/Plots/CalibrationAfterRepair/Errors.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9502fe33658a8cc9e7b7225a21e36f2f94c75562 Binary files /dev/null and b/PythonScripts/Plots/CalibrationAfterRepair/Errors.pdf differ diff --git a/PythonScripts/Plots/CalibrationAfterRepair/Errors.png b/PythonScripts/Plots/CalibrationAfterRepair/Errors.png new file mode 100644 index 0000000000000000000000000000000000000000..99acfe6d84aee9d75fc6ae96c5647be717f0bdb3 Binary files /dev/null and b/PythonScripts/Plots/CalibrationAfterRepair/Errors.png differ diff --git a/PythonScripts/Plots/CalibrationAfterRepair/Stepsizes.pdf b/PythonScripts/Plots/CalibrationAfterRepair/Stepsizes.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f3ead9c340c0ad15bb4e20d18a3a6be21a49503f Binary files /dev/null and b/PythonScripts/Plots/CalibrationAfterRepair/Stepsizes.pdf differ diff --git a/PythonScripts/Plots/CalibrationAfterRepair/Stepsizes.png b/PythonScripts/Plots/CalibrationAfterRepair/Stepsizes.png new file mode 100644 index 0000000000000000000000000000000000000000..7be87da929af3ef6be6a119d1915f12217e0d1c1 Binary files /dev/null and b/PythonScripts/Plots/CalibrationAfterRepair/Stepsizes.png differ diff --git a/PythonScripts/Plots/CalibrationAfterRepair/ratioUD.pdf b/PythonScripts/Plots/CalibrationAfterRepair/ratioUD.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7ad4c99571514f078d84c7cb9b674e887c102743 Binary files /dev/null and b/PythonScripts/Plots/CalibrationAfterRepair/ratioUD.pdf differ diff --git a/PythonScripts/Plots/CalibrationAfterRepair/ratioUD.png b/PythonScripts/Plots/CalibrationAfterRepair/ratioUD.png new file mode 100644 index 0000000000000000000000000000000000000000..b21bfe55488469d5ea565ba70cef281a4f09fb10 Binary files /dev/null and b/PythonScripts/Plots/CalibrationAfterRepair/ratioUD.png differ diff --git a/PythonScripts/Plots/RHKDatadep.pdf b/PythonScripts/Plots/RHKDatadep.pdf new file mode 100644 index 0000000000000000000000000000000000000000..21de5b61cc0a9e883ad3200afbae8310d36633ef Binary files /dev/null and b/PythonScripts/Plots/RHKDatadep.pdf differ diff --git a/PythonScripts/Plots/RHKDatadep.png b/PythonScripts/Plots/RHKDatadep.png new file mode 100644 index 0000000000000000000000000000000000000000..88b9405e6b3d6542ab94c9d26f774c83ce1a36f5 Binary files /dev/null and b/PythonScripts/Plots/RHKDatadep.png differ diff --git a/PythonScripts/Plots/Z3Examine/FrontPlateAngle.pdf b/PythonScripts/Plots/Z3Examine/FrontPlateAngle.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bbaa132c59db5f2890ec61cec40c99d4d191dedd Binary files /dev/null and b/PythonScripts/Plots/Z3Examine/FrontPlateAngle.pdf differ diff --git a/PythonScripts/Plots/Z3Examine/FrontPlateAngle.png b/PythonScripts/Plots/Z3Examine/FrontPlateAngle.png new file mode 100644 index 0000000000000000000000000000000000000000..1efba1ce4e30378d2e57139b4a3c6db7a1f1f25e Binary files /dev/null and b/PythonScripts/Plots/Z3Examine/FrontPlateAngle.png differ diff --git a/PythonScripts/Plots/Z3Examine/ScrewRot.pdf b/PythonScripts/Plots/Z3Examine/ScrewRot.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0a60382461ab5e87f9a629281b1f10896acde9e6 Binary files /dev/null and b/PythonScripts/Plots/Z3Examine/ScrewRot.pdf differ diff --git a/PythonScripts/Plots/Z3Examine/ScrewRot.png b/PythonScripts/Plots/Z3Examine/ScrewRot.png new file mode 100644 index 0000000000000000000000000000000000000000..0c9d0bd2e840d196bad191db33ae83ff5ba65e57 Binary files /dev/null and b/PythonScripts/Plots/Z3Examine/ScrewRot.png differ diff --git a/PythonScripts/Plots/Z3Examine/ScrewRot_CompareSwappedPlate.pdf b/PythonScripts/Plots/Z3Examine/ScrewRot_CompareSwappedPlate.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f0b6b75dd31e5863de6ae0e670022d3b246bc18b Binary files /dev/null and b/PythonScripts/Plots/Z3Examine/ScrewRot_CompareSwappedPlate.pdf differ diff --git a/PythonScripts/Plots/Z3Examine/ScrewRot_CompareSwappedPlate.png b/PythonScripts/Plots/Z3Examine/ScrewRot_CompareSwappedPlate.png new file mode 100644 index 0000000000000000000000000000000000000000..e85160ca3228fe4925f8fbb3d6a174a0af39cd82 Binary files /dev/null and b/PythonScripts/Plots/Z3Examine/ScrewRot_CompareSwappedPlate.png differ diff --git a/PythonScripts/Plots/Z3Examine/ScrewRot_SwappedPlate.pdf b/PythonScripts/Plots/Z3Examine/ScrewRot_SwappedPlate.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b4c9406dd8ee5ea7df2b7bd2bea889a0223de6d8 Binary files /dev/null and b/PythonScripts/Plots/Z3Examine/ScrewRot_SwappedPlate.pdf differ diff --git a/PythonScripts/Plots/Z3Examine/ScrewRot_SwappedPlate.png b/PythonScripts/Plots/Z3Examine/ScrewRot_SwappedPlate.png new file mode 100644 index 0000000000000000000000000000000000000000..f50a3676360e5c5f6199e1c9babaec9caf47b906 Binary files /dev/null and b/PythonScripts/Plots/Z3Examine/ScrewRot_SwappedPlate.png differ diff --git a/PythonScripts/Plots/Z3Examine/ScrewRot_detail.pdf b/PythonScripts/Plots/Z3Examine/ScrewRot_detail.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d8e84872d31f7a28f58b0a45117e17f2b3bba19b Binary files /dev/null and b/PythonScripts/Plots/Z3Examine/ScrewRot_detail.pdf differ diff --git a/PythonScripts/Plots/Z3Examine/ScrewRot_detail.png b/PythonScripts/Plots/Z3Examine/ScrewRot_detail.png new file mode 100644 index 0000000000000000000000000000000000000000..90664b01c71b3ddabf183d7121c5deea4db5e056 Binary files /dev/null and b/PythonScripts/Plots/Z3Examine/ScrewRot_detail.png differ diff --git a/PythonScripts/Plots/Z3Examine/ScrewWobble.pdf b/PythonScripts/Plots/Z3Examine/ScrewWobble.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f2220a1ed0a4c5091e63e5cd6b0ac3b011e1a8bf Binary files /dev/null and b/PythonScripts/Plots/Z3Examine/ScrewWobble.pdf differ diff --git a/PythonScripts/Plots/Z3Examine/ScrewWobble.png b/PythonScripts/Plots/Z3Examine/ScrewWobble.png new file mode 100644 index 0000000000000000000000000000000000000000..53eabd2a4935b6b3562d2f6f8a3d22c2e41edf33 Binary files /dev/null and b/PythonScripts/Plots/Z3Examine/ScrewWobble.png differ diff --git a/PythonScripts/Plots/Z3Examine/UpDownRatio.pdf b/PythonScripts/Plots/Z3Examine/UpDownRatio.pdf new file mode 100644 index 0000000000000000000000000000000000000000..777207358be3a2d59828caee90a64164f75cd695 Binary files /dev/null and b/PythonScripts/Plots/Z3Examine/UpDownRatio.pdf differ diff --git a/PythonScripts/Plots/Z3Examine/UpDownRatio.png b/PythonScripts/Plots/Z3Examine/UpDownRatio.png new file mode 100644 index 0000000000000000000000000000000000000000..fe473d756b7cc6d3233a7195af7081e604359d32 Binary files /dev/null and b/PythonScripts/Plots/Z3Examine/UpDownRatio.png differ