From c3e86068cce6e666831ea9c8d4444c088091d851 Mon Sep 17 00:00:00 2001 From: erik Date: Thu, 9 Apr 2026 17:33:50 -0700 Subject: [PATCH 01/16] add requirements.txt --- requirements.txt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..f828f39 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,9 @@ +h5py +numpy +matplotlib +PyQt5 +pyvisa < 1.10.0 +pyvisa-py +scipy +setuptools < 82.0.0 +setuptools-scm From 410e60081e1099aab2ab937484e2c446da15e744 Mon Sep 17 00:00:00 2001 From: erik Date: Thu, 9 Apr 2026 17:34:15 -0700 Subject: [PATCH 02/16] remove random 19 --- Data_Run_GUI_xy.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Data_Run_GUI_xy.py b/Data_Run_GUI_xy.py index 068f0dd..21fb709 100644 --- a/Data_Run_GUI_xy.py +++ b/Data_Run_GUI_xy.py @@ -10,7 +10,6 @@ # Author: Yuchen Qian # Oct 2017 # -19 import numpy import math From b523d6f183fb0ea57b4c9be7b6200a5e33218ad8 Mon Sep 17 00:00:00 2001 From: erik Date: Thu, 9 Apr 2026 17:34:35 -0700 Subject: [PATCH 03/16] put self back into the disable method --- Data_Run_GUI_xy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Data_Run_GUI_xy.py b/Data_Run_GUI_xy.py index 21fb709..62362ae 100644 --- a/Data_Run_GUI_xy.py +++ b/Data_Run_GUI_xy.py @@ -346,7 +346,7 @@ def move_to_position(self): except ValueError: QMessageBox.about(self, "Error", "Position should be valid numbers.") - def disable(): + def disable(self): self.mc.disable() def stop_now(self): From 791310dbbfc601e47f26eca4039487e5f61d4022 Mon Sep 17 00:00:00 2001 From: erik Date: Thu, 9 Apr 2026 20:20:01 -0700 Subject: [PATCH 04/16] update requirements so vicp drivers are install properly --- requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index f828f39..abc9049 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,8 +2,8 @@ h5py numpy matplotlib PyQt5 -pyvisa < 1.10.0 -pyvisa-py +pyvisa >= 1.12 +pyvisa-py[vicp, psutil, hislip-discovery, usb-full] scipy setuptools < 82.0.0 setuptools-scm From d4c321896f7429ec3e7f219a103b6d8041c945f8 Mon Sep 17 00:00:00 2001 From: erik Date: Thu, 9 Apr 2026 20:20:56 -0700 Subject: [PATCH 05/16] organize import --- LeCroy_Scope.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/LeCroy_Scope.py b/LeCroy_Scope.py index 58218d4..c8191e7 100644 --- a/LeCroy_Scope.py +++ b/LeCroy_Scope.py @@ -32,17 +32,18 @@ """ -import numpy -import visa -from pyvisa.resources import MessageBasedResource -from pyvisa.errors import VisaIOError import collections +import numpy +import matplotlib.image as mpimg +import pylab as plt +import pyvisa as visa import struct import sys -import pylab as plt -import matplotlib.image as mpimg import time +from pyvisa.resources import MessageBasedResource +from pyvisa.errors import VisaIOError + # the header recorded for each trace # 63 entries, 346 bytes WAVEDESC = collections.namedtuple('WAVEDESC', From 90ff64fbd79157cf09fb34cf909c6eaa5c136952 Mon Sep 17 00:00:00 2001 From: erik Date: Thu, 9 Apr 2026 20:21:46 -0700 Subject: [PATCH 06/16] specify to pyvisa.ResourceManager to use the drivers installed by pyvisa-py --- LeCroy_Scope.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LeCroy_Scope.py b/LeCroy_Scope.py index c8191e7..14618f2 100644 --- a/LeCroy_Scope.py +++ b/LeCroy_Scope.py @@ -210,7 +210,7 @@ def rm_open(self, ipv4_addr) -> bool: if self.verbose: print('<:> constructing resource manager') t0 = time.time() - self.rm = visa.ResourceManager() + self.rm = visa.ResourceManager("@py") t1 = time.time() if self.verbose and (t1-t0 > 1): print(' .............................%6.3g sec' % (t1-t0), end='') From 40533e3f2a8ffe4af327e7490e0dd048c90677a2 Mon Sep 17 00:00:00 2001 From: erik Date: Thu, 9 Apr 2026 20:22:31 -0700 Subject: [PATCH 07/16] PEP8 fixes --- LeCroy_Scope.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/LeCroy_Scope.py b/LeCroy_Scope.py index 14618f2..fd8bb74 100644 --- a/LeCroy_Scope.py +++ b/LeCroy_Scope.py @@ -218,7 +218,10 @@ def rm_open(self, ipv4_addr) -> bool: # attempt to open a connection to the scope try: - self.scope = self.rm.open_resource('VICP::'+ipv4_addr+'::INSTR', resource_pyclass=MessageBasedResource) + self.scope = self.rm.open_resource( + 'VICP::'+ipv4_addr+'::INSTR', + resource_pyclass=MessageBasedResource, + ) print('...ok') except Exception: print('\n**** Scope not found at "', ipv4_addr, '"\n') @@ -302,7 +305,7 @@ def validate_channel(self, Cn) -> str: #------------------------------------------------------------------------- - def validate_trace(self, tr) -> str: + def validate_trace(self, tr) -> str: """ convenience function, returns canonical trace label, which is broader than a channel label see valid_trace_names defined at top of file if Cn is an integer, assumes we want a channel name @@ -316,7 +319,6 @@ def validate_trace(self, tr) -> str: err = '**** validate_trace(): trace name "' + tr + '" is unknown' raise(RuntimeError(err)).with_traceback(sys.exc_info()[2]) - #------------------------------------------------------------------------- def max_samples(self, N = 0) -> int: """ mostly used for determining the number of samples the scope expects to acquire. From 6ba3cef495aedcc3fe86426a0d3465de211f6503 Mon Sep 17 00:00:00 2001 From: erik Date: Thu, 9 Apr 2026 20:23:31 -0700 Subject: [PATCH 08/16] add type annotations --- Data_Run_GUI_xy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Data_Run_GUI_xy.py b/Data_Run_GUI_xy.py index 62362ae..842b530 100644 --- a/Data_Run_GUI_xy.py +++ b/Data_Run_GUI_xy.py @@ -675,7 +675,7 @@ def run(self): pos_ds.attrs['shotperpos'] = num_duplicate_shots # not legacy # create the scope access object, and iterate over positions - with LeCroy_Scope(self.ip_addrs['scope'], verbose=False) as scope: + with LeCroy_Scope(self.ip_addrs['scope'], verbose=False) as scope: # type: LeCroy_Scope if not scope: print('Scope not found at '+self.ip_addrs['scope']) # I think we have raised an exception if this is the case, so we never get here return From f01ca8eb55c456b5f9219e353337083a7f5439b3 Mon Sep 17 00:00:00 2001 From: erik Date: Thu, 9 Apr 2026 21:01:56 -0700 Subject: [PATCH 09/16] organize imports --- Data_Run_GUI_xy.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Data_Run_GUI_xy.py b/Data_Run_GUI_xy.py index 842b530..6553375 100644 --- a/Data_Run_GUI_xy.py +++ b/Data_Run_GUI_xy.py @@ -11,20 +11,22 @@ # Oct 2017 # -import numpy +import datetime +import h5py import math -import sys +import numpy import os import os.path +import sys import time -import datetime -from Motor_Control_2D_xy import Motor_Control_2D -from LeCroy_Scope import LeCroy_Scope, WAVEDESC_SIZE -from LeCroy_Scope import EXPANDED_TRACE_NAMES import tkinter -from tkinter import filedialog import tkinter.messagebox -import h5py as h5py + +from tkinter import filedialog + +from LeCroy_Scope import LeCroy_Scope, WAVEDESC_SIZE +from LeCroy_Scope import EXPANDED_TRACE_NAMES +from Motor_Control_2D_xy import Motor_Control_2D dir_path=os.path.dirname(os.path.realpath(__file__)) version_number="03/01/2018 12:37pm" # update this when a change has been made From 96cb2c1f81deb243ff15b60186e1d7814479ec50 Mon Sep 17 00:00:00 2001 From: erik Date: Thu, 9 Apr 2026 21:02:21 -0700 Subject: [PATCH 10/16] add some annotations --- Data_Run_GUI_xy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Data_Run_GUI_xy.py b/Data_Run_GUI_xy.py index 6553375..7af64b8 100644 --- a/Data_Run_GUI_xy.py +++ b/Data_Run_GUI_xy.py @@ -541,7 +541,7 @@ def get_hdf5_filename(self) -> str: self.hdf5_filename = fn # save it for later return fn - def acquire_displayed_traces(self, scope, datasets, hdr_data, pos_ndx): + def acquire_displayed_traces(self, scope: LeCroy_Scope, datasets, hdr_data, pos_ndx): """ worker for below : acquire enough sweeps for the averaging, then read displayed scope trace data into HDF5 datasets """ From 3a65e2b672c2487035f07b807997dc8b66969fb5 Mon Sep 17 00:00:00 2001 From: erik Date: Thu, 9 Apr 2026 21:02:45 -0700 Subject: [PATCH 11/16] PEP8 cleanup --- Data_Run_GUI_xy.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/Data_Run_GUI_xy.py b/Data_Run_GUI_xy.py index 7af64b8..7c054f4 100644 --- a/Data_Run_GUI_xy.py +++ b/Data_Run_GUI_xy.py @@ -802,12 +802,9 @@ def run(self): datasets[tr].attrs['recorded'] = True datasets[tr].attrs['shots per position'] = self.pos_param["num_shots"] - f.close() # close the HDF5 file self.signals.finished.emit() - #done - class Test_Shot_Thread(QRunnable): From bc2c0ce7b478dfa45271983a0f990fa345d8810d Mon Sep 17 00:00:00 2001 From: erik Date: Thu, 9 Apr 2026 21:03:42 -0700 Subject: [PATCH 12/16] improve algorithm for filling datasets when the acquired data is different length than expected --- Data_Run_GUI_xy.py | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/Data_Run_GUI_xy.py b/Data_Run_GUI_xy.py index 7c054f4..57b6abf 100644 --- a/Data_Run_GUI_xy.py +++ b/Data_Run_GUI_xy.py @@ -554,17 +554,31 @@ def acquire_displayed_traces(self, scope: LeCroy_Scope, datasets, hdr_data, pos_ traces = scope.displayed_traces() for tr in traces: + NPos, NTimes = datasets[tr].shape + signal = scope.acquire(tr) # type: numpy.ndarray try: - NPos,NTimes = datasets[tr].shape - datasets[tr][pos_ndx,0:NTimes] = scope.acquire(tr)[0:NTimes] # sometimes for 10000 the scope hardware returns 10001 samples, so we have to specify [0:NTimes] - #?# datasets[tr].flush() - except KeyError: - print(tr + ' is displayed on the scope but not recorded. To record this channel, please display the trace before starting the data run.') - continue - except TypeError: - print('Not enough points from scope trace') - datasets[tr][pos_ndx,:] = scope.acquire(tr)[:] - continue + datasets[tr][pos_ndx, ...] = signal[...] + except KeyError as err: + print( + tr + + ' is displayed on the scope but not recorded. ' + 'To record this channel, please display the trace ' + 'before starting the data run.' + + err + ) + except TypeError as err: + # the returned signal does not always have exactly NTimes + # samples. It's is off by a few data points. + signal_NTimes = signal.size + if not numpy.isclose(signal_NTimes, NTimes, rtol=0.005, atol=0): + # the difference in the number of time samples is greater + # than 0.5% + raise err + + if NTimes > signal_NTimes: + datasets[tr][pos_ndx, 0:signal_NTimes] = signal[...] + else: + datasets[tr][pos_ndx, ...] = signal[0:NTimes] for tr in traces: try: @@ -572,7 +586,7 @@ def acquire_displayed_traces(self, scope: LeCroy_Scope, datasets, hdr_data, pos_ #?# hdr_data[tr].flush() #?# are there consequences in timing or compression size if we do the flush()s recommend for the SWMR function? except KeyError: - continue + pass scope.set_trigger_mode('NORM') # resume triggering From 73868e6aaaafc903c1de0d3f7d030a2d31e0786b Mon Sep 17 00:00:00 2001 From: erik Date: Thu, 9 Apr 2026 21:04:14 -0700 Subject: [PATCH 13/16] update algorithm for filling the time dataset when the acquired data is different length than expected --- Data_Run_GUI_xy.py | 43 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/Data_Run_GUI_xy.py b/Data_Run_GUI_xy.py index 57b6abf..594af7b 100644 --- a/Data_Run_GUI_xy.py +++ b/Data_Run_GUI_xy.py @@ -791,16 +791,51 @@ def run(self): # at least get one time array recorded for swmr functions if pos[0] == 1: - time_ds[0:NTimes] = scope.time_array()[0:NTimes] - #time_ds.flush() + time_array = scope.time_array() + try: + time_ds[...] = scope.time_array()[...] + except TypeError as err: + # the returned signal does not always have exactly NTimes + # samples. It's is off by a few data points. + time_size = time_array.size + if not numpy.isclose( + time_size, NTimes, rtol=0.005, atol=0 + ): + # the difference in the number of time samples is greater + # than 0.5% + raise err + + if NTimes > time_size: + time_ds[0:time_size] = time_array[...] + else: + time_ds[...] = time_array[0:NTimes] ######### END MAIN ACQUISITION LOOP ######### except KeyboardInterrupt: print('\n______Halted due to Ctrl-C______', ' at', time.ctime()) - # copy the array of time values, corresponding to the last acquired trace, to the times_dataset - time_ds[0:NTimes] = scope.time_array()[0:NTimes] # specify number of points, sometimes scope return extras + # copy the array of time values, corresponding to the last acquired + # trace, to the times_dataset + time_array = scope.time_array() + try: + time_ds[...] = scope.time_array()[...] + except TypeError as err: + # the returned signal does not always have exactly NTimes + # samples. It's is off by a few data points. + time_size = time_array.size + if not numpy.isclose( + time_size, NTimes, rtol=0.005, atol=0 + ): + # the difference in the number of time samples is greater + # than 0.5% + raise err + + if NTimes > time_size: + time_ds[0:time_size] = time_array[...] + else: + time_ds[...] = time_array[0:NTimes] + if type(time_ds) == 'stupid': print(' this is only included to make the linter happy, otherwise it thinks time_ds is not used') From 8529673fd5e046bdb35d70eca1019a7ded2832ac Mon Sep 17 00:00:00 2001 From: Erik Everson Date: Mon, 13 Apr 2026 10:21:51 -0700 Subject: [PATCH 14/16] Delete __pycache__ directory --- .../Acquire_Scope_Data_3D.cpython-35.pyc | Bin 6040 -> 0 bytes __pycache__/LeCroy_Scope.cpython-35.pyc | Bin 26647 -> 0 bytes __pycache__/LeCroy_Scope.cpython-36.pyc | Bin 24036 -> 0 bytes __pycache__/Motor_Control_1D.cpython-35.pyc | Bin 8807 -> 0 bytes __pycache__/Motor_Control_2D.cpython-36.pyc | Bin 3760 -> 0 bytes __pycache__/Motor_Control_2D_xy.cpython-36.pyc | Bin 3835 -> 0 bytes __pycache__/Motor_Control_3D.cpython-35.pyc | Bin 6366 -> 0 bytes __pycache__/Single_Motor_Control.cpython-36.pyc | Bin 8268 -> 0 bytes __pycache__/find_ip_addr.cpython-35.pyc | Bin 5024 -> 0 bytes __pycache__/find_ip_addr.cpython-36.pyc | Bin 4586 -> 0 bytes __pycache__/wavegen_control.cpython-35.pyc | Bin 4966 -> 0 bytes 11 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 __pycache__/Acquire_Scope_Data_3D.cpython-35.pyc delete mode 100644 __pycache__/LeCroy_Scope.cpython-35.pyc delete mode 100644 __pycache__/LeCroy_Scope.cpython-36.pyc delete mode 100644 __pycache__/Motor_Control_1D.cpython-35.pyc delete mode 100644 __pycache__/Motor_Control_2D.cpython-36.pyc delete mode 100644 __pycache__/Motor_Control_2D_xy.cpython-36.pyc delete mode 100644 __pycache__/Motor_Control_3D.cpython-35.pyc delete mode 100644 __pycache__/Single_Motor_Control.cpython-36.pyc delete mode 100644 __pycache__/find_ip_addr.cpython-35.pyc delete mode 100644 __pycache__/find_ip_addr.cpython-36.pyc delete mode 100644 __pycache__/wavegen_control.cpython-35.pyc diff --git a/__pycache__/Acquire_Scope_Data_3D.cpython-35.pyc b/__pycache__/Acquire_Scope_Data_3D.cpython-35.pyc deleted file mode 100644 index e505c4859df1b49b6fb8d54b0abd353d8f43a821..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6040 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 Q()$&>R>NP8dn*_I2Mw$GdjJ3c diff --git a/__pycache__/Motor_Control_2D.cpython-36.pyc b/__pycache__/Motor_Control_2D.cpython-36.pyc deleted file mode 100644 index 0e8fd8aa8d12d5f4afc3437107a478f1d8bd499b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3760 zcmbtXU60$w6(xrsqGYXBwl}sDJI)v>k_y;5wu3f7lG<+VIO&784dNgOu`R*n%OX!};6MIZXwf6^lVfDb`|KKU=?r9F2j(OO9{T7<%U&)hk4?wxx_ zZ?CO2hG+lef7v#Se;ae3h5B8j?5D_t;TysftZVuvN~_CymT#G5pY7Xv%<-L%3}FlB zsUe&b=DV^c+(V{r3-+nesg3{9c$ns?3ht#zuF`IB>pqXlYR2=&Deuu}#=k%0VIugb zv&jcpob2&Wk#%KoYH{Od3D5WAj7MQ6H&K;*SPDRXEHfS_JRHVhmy1}*D34RLN$TPx ztjxpbldd-aQpCHl6ntm&9{*wx?aPFJ5{F6S=TXjY-MINq;~5w+wmN39b_!EO-LtQv z?+@sa252*UCSDUvSWivgDro|7uBbgVd`Ebqj?xtkaRy~gG{qW9Pqf53%DQaGGot-h zCeDg;Pi?QpcfVPi1KEZ%YGL0u`uct?dL5a z_mq@HQ`<`bb;CY7R$*tdyIa(Uvu%p{Xjc8Zq1GV&o7?x^+x`q-vTYF_ZQqyKVV?H4 zZ@zouLw-Mm8T=$V8pK&l*0R0G(DnYP@PZ&t;yegmg0!rG%wR3EWx1xy#xF0en9Z)Z zb!Y*S=Jqx!6XU>`m?!2F@OWTO7;511fE`#9>%=r^+(zA|IiuUxInaqQJS{_Zg=u&lL#ihp~jEwdI)ZqwDHoo73}j^3<^%wP?(VK(t|&GEG*q88UhCau9o zB_&PRB~);H5Jd!NnsiN5VQzISeb&Oupwu8qAM0~=Ons0AsOkb_-9XC7)Ct`R_08mb zM>Jr5ELHj_{wF=Et&UZp{MoF>+C_7az0z_25e+tl*C8f=YI)$k+@b5vu zOkXfvxQ_#ibVtsDw1;HxQfPqgoYGEP8d-2GyJ-~Xqr%PlQi`F5I&F+rYqV&F*Js|-+135Du%Lo}rGig4bY^gLN2j;1GC99aq-v-osaAP;*zvGn$D;+? zgJZ+&*%3d+E~OCy=?a|lbKz4>QMgLx1C>Msls+m6xIQ!8!yGOJ+?pH433+?KWQ7$Y z=GHLSVdZ^z4fO?J3Qqvz6QoRwX5(d@&v}~vYkzf(w)2p^X#cYq|7>o5zNEDU=T_O> zDaCC<1kSJh1lieT;|cLGwY>xTGF<6~@q~dTrtOc7KjIJLz5Sdgur?lYnMA2T+!>Iw zrvOC0b(6=tvk|_Fi92C*$glkvPmTT{=QM>sBX2u1=5{ntN+xrTmlU8aq@J3Qf)C)V0dvY2R@v@5!q1rGXWTl63 zvaXcaYm`~3((&*cFrOu)5rE} zak3xp#QC>))|!a3aHlJO3t=a{TSd_mK@pAWGG$kh70zxq z4fE2s(zz5lQ1v=xWLN43lo4TyfX;!Z$FQPMp~!KbN6IMLd92a$);!m9JP)bfw%eZ9 z^saigXX}{+ycfnv5Olnv76c-VfZOhc`M$rg>TjBU)vGrlyKs_0uRqda)J=4(f>U@O Zlx*B4Pnpq~Z06w(c&1lteQCI!`CluKe)0eS diff --git a/__pycache__/Motor_Control_2D_xy.cpython-36.pyc b/__pycache__/Motor_Control_2D_xy.cpython-36.pyc deleted file mode 100644 index e9916d3688b9bce67b05e09b328f4dc6bd91125f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3835 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 N%S}F@ykpK8{|2P6NudA$ diff --git a/__pycache__/Single_Motor_Control.cpython-36.pyc b/__pycache__/Single_Motor_Control.cpython-36.pyc deleted file mode 100644 index e9dd3f3d1e53a35dd136039e4d5cc2a813d8d49e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8268 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 PpJ|_IpVB{?O8Wl+Y7fI| diff --git a/__pycache__/find_ip_addr.cpython-35.pyc b/__pycache__/find_ip_addr.cpython-35.pyc deleted file mode 100644 index 04068fec16a61658211c8ba33a159887cfd4ceb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5024 zcmb_g&2QYs6@TP%zo=bHmTa$OJIO>zY^@uw<9t_5ow%}{7)@l=a_eNFU_p^1Eu~#@ zJ>*&vEA>$K6YZfr^bhE2ZPD6_Qo*%H&nZtJ1Gb z?rq!T*|Z5Y$fwAwX*s-@B3UD^PCF*4=gfS{I<@PgX-;r^e}*JRonX(})AS%XOO~wA zj!o)sWEchvL;P7_(5JcTv{s!trg{>ZT6HE?gddSDqB`P8PF8xym2J6Khk$Knw#9@m$@<;6S|L@}SWV zna!}^3>p%ZhqA|8@BcP-Jr_VBot;d6M=BMn-N$pOjA9}+cw`-lw!=cm5d&-@T7rLF!??_eP zntpxp7J`Umt7zSG9JErawR8`xW+d3c@bYlJ*&9A|!wProJD|SP*gUaBoq&L+PSGmVK$CKECeLs+T zKfL~?*zi$R!;L`3qkYUt9hX4Q3DRPZcSBNsx26BNTwMI)uyRP(@I)8z+9G!J^I6KA zQYCin*CstI(b_oOO*1uHucbzBEK*gB{=$BbQH8hm^;g&=+pkjce1CrgP_6fLVMf={ z7^xm}hbuw5!v=D9&gbrIBeOcf(WGBZBeAZ%{!R;JV*@T!95Hk?O;v-1)bs~Wd8tl7 zKH=UI_HyM3$K;qNMF{5bMAz}kJ$ZBN$Wd3{E*6L&j|{1h@qu%0lFK>cALo*RVHrb!HB+r%~KGU3u5nd4B^rpv)UoLo40@3;+p)3=Y7A2KGX1(Kaxps5f@N z=5R63kwlaO_W`!S-k{7*kb))>jYy zH^soK8jm!15p`~15j?L=+fzI>X7gUb3P42)?Ct^9HACJ>uGTG!4ok;Z^^pM@17JHS zVa4c!{W(@`fY&qt3Js7OW-}l&pempyj}6nnpTn}Y16FuWlhWTBF?i7lw!;grP&`cs z72PgVutMBB!@b^l-Ddt}99HR|${dSRQy}#hy{ZdZ4O>djov#qqpgETt1d}|pY44vp zygChR!6Nk!^PtQ`4W6?bhzP=qE)?5Ea}^()58c-|tPyn42`T5C3*fmgjfzYT^z%HZ z;k^I?msO2TYnicZ$U8g}4gyRjGGkzcFKT0TI?ybcUHG%f(@*NLlhCkpDGWfn!S3L2 zdIxJ{Z3H>9il9IIm+^p&=4K~0x_QmR*1%ZQW;l?AUH} z_gRNvyEeIq|EvG%A{@!xSC_cW7tP#v)nvgDlha77&zFxNA9?@&vl8Yy0jEe;3kRqr z_oToD1Z+Hx2hq}1&A3~k+G-|W`yZ6mEM`tBBa?}FB}fWaqM&U>LoZAk_l7~>2U|zw znw6qRN}4V$d|@o4#m(L@>fTQaGVs*PFy|8$3pmDNFC50n^lb-~qUjW~@P%Yb$w8>F z7L;xBg5C%Dl|(qWWNc!_{U!8*uS5Itg5djyt8XbsA>eCHEcaruFgCWZl343%JxJ<& z|I(^#Bbn1vc)pj(c)u+q1?Z@GINLm}`25pHojy6!qT(p4b1Y@PoSI>jmT(x$;89v; zB83}DS{x`ph*OKNK&iDI`ax=U<=!LEa&Ui;qu~Z>%*9PFt+`$4?sO0gPy?Lyu}TXF zMQW|yS-q9oIr|QAJGsJh>UufRw#U0(pX2&=nU?btyr^ZfdY(G_oX>AfC-i0I423};&8dXgQo&!0k7N(60 z_{!ckXu<_^7V^4zu~agqP5yTly?Cl6<1|_|T<&L#dHg+PSb6J=ao#uuySC9V>xN=B z!Iz=F;|HBiQk%dwKRNj&TubWTTK+^V=R7M)rv25spHARjT8#a;CzI*P_2B-KmitHs zZpz8I$r&cDQPI0)i3gloY#?Z7J@1Ve>YR~44R_^~sxYw=> zeEnY#$aYVB04!pz)L&TiYD9El76uJ+L4QclYrST78y*LmhKH0hRR zik0`W%jtEdh|$M*m5|Oks+l$XtrgFdPB+fptrhsIfE3q_DRcC9_DC{r)lA!%HLn`B JIcLln{{_^SsNVnp diff --git a/__pycache__/find_ip_addr.cpython-36.pyc b/__pycache__/find_ip_addr.cpython-36.pyc deleted file mode 100644 index 80f2a4d6da502864878876421eae003fa156cd51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4586 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 p9&{~L>dt!w}Q diff --git a/__pycache__/wavegen_control.cpython-35.pyc b/__pycache__/wavegen_control.cpython-35.pyc deleted file mode 100644 index f4ec6341705c1a8272b0792ff3420cb2c97de8b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4966 zcmbVQTW=f36`tAUU6f?mmSn}bjO8>n6I*TSHgVKT;?h(i1W^=;iELHrcEuf9E0Md* z?9etBR)ALNYt!dE}iqg#r;kocBN4LNc5vX zDzQG$dvPSL*SM*+!zl2=p63UFYSAL2r+~&gc$05HB=m+RpjOvyXb8EWl53Sg1OK5_ zCOA6LfYfDD0xAU+7EIVSI;$+0wCyqrrdTj-+h91uf*ISMV8K}yoU?5(=a`&i5}fB* zFw25D_D7d}0ozZrV4ejREF0$LV4(#weIEvbeY~M%(#xZcM5=pIjZ~FM;*&xm#Jr;+kS^dWf~$LP;0FN zm#GG|snccACv0$o=4PKdM~%#TaLixMu|xFa*nXZJjd-@e{n5tlt>_}l=>j{bF!dGV zoDUZ%vO5uHw{aMUdAk@62BKlx1FlQM9(W@8W{x@szhxSB&vpj$=*+Ofk>hZZ2S;I# z4k8^E*h8EodKmk?0~epLYQMy3jVie~$5~?Q=oP!{lx4@k*t0xxxn(??Fb3HjGM@wVd-TZ2l2AFzc&z3tcBi_SWqe1(n86k7e|SF zJFQ|>9d>DpzD}zfe$v~ON)5z%_{i#Uu^Gpr>qi68i<2bW?Z}}P$+Adi*5Z*)RniVZ+i8c_4gXy%9@$#CSlLdg3fD4X6krAnq1tIktr$Z2c0mI zW@aVq$hBCnkm3!cVr8a}O$n57JD8I1sW8%}oWQQ0mJhV4HlY@jva^&6t8O2ksuEM( z=trb|wz8XOW%Bn`sAa8aa*6D;)mb`{86wjlhPSsTA}Iqek-lo}8Lt1t)Fq5OzENM^ z`52-lJAwb%&Mlc7=(xAD*@8met(zb1;PtNG+8HIHVP;zD4NS@N!YI_9cMYbWD6yG%JV+NS3;sO=QKSsrek`LE>@2U z8krtP6qG!@^h9W!FvTQImv9yBlZ49x(!7jW&k(BUd6?&UO|Xn)n*X+KEzdEL#-^Pd ziv)WjF_S6Z7rSxXk$xm>tcPuJ&+mkRxF-B0>33x^{Kf!r} zh}|_vPM-P<1z=U$%kyqOrNJrQkue=pVQkf0rUKdX3JzK%J=qHV4%{GaK^n5E-`2nt zBPY936ZT-AAye7&V1LwNZ|5nYMwx9?xtGRVEfRnp`aLEUOiK3r&Qh&qV&$v@nv#6b z^7No5O_^FagFc#C`7OEYw+>EmQ2Bs@^*0bB!OKo_&y3~ShWtN8K0RjOo`J;Sw#E{j z;+&SF=9nU-J7h&u$O5_Lk`8#vcqz}>5JKrBKze8q9`MM6e-b1C_91NhUp9DyX`3jB zqRN62a1W!_#L}e1|S}Nd#&ZEzR4GbT=>kx}Q_CwP^h5?%0bJ6bh*eA+;_G2j z8s-4HTtt)zAd!;YSW5th)*dp{+i6jV4XM@OG5>*a;wZg*dp*H#yt(47t~HuwV)MiL``%`AqjB>CQyiMcrd)Gw>*gno zcN=ToW@F=%#)h~4;YQQU)yIdkkr^+8As1j>lOrun9!J-e>UlEybJU#=qaFe?Zx2T; z*sk3HiUUEBC@?udw|l1a%a2#Q&DHIODFhOFNDEAAPgNG`G0XXl|@FHq8Vg zT@8>?fprW|jJw-!n_S>)-wvUgTN|FpbXI^pER?(f!rTI33}BB7xdomF;-~`P{7o;d$Dh7-nB8bu#?FtA!han%$Ba_g@fa6NKxpjwb zG!+KE&mDF<`V^D%cJg12O`iBJlf^i*{f)8_i9Ng+VW;eJRzN&Yrr(IV-|3)YpNLrc zM!-C|%#Z55<&8L9L+z^Peb)Co*@z;qS8oz|hsb3jghJK#h`d7N`$S$Nauvk5xZ-39gR+BKBXa3D zAr!3$A`u)+$Yxbuz}29TpZ#$)U(MNnZZ&`L70XpC8-fpU3(~pC05_r`n8%d_HHU5_ u>N<$YNBwSZpx&Ymmk8}~+UBP8vrOM# Date: Mon, 13 Apr 2026 15:13:23 -0700 Subject: [PATCH 15/16] initial .gitignore --- .gitignore | 219 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 219 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1fec9e7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,219 @@ +### Windows template +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +### macOS template +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Python template +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/latest/usage/project/#working-with-version-control +.pdm.toml +.pdm-python +.pdm-build/ + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +.venvs +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + From ed3e72d06079bff5a2bae36fa971335c7fb02398 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 13 Apr 2026 15:58:30 -0700 Subject: [PATCH 16/16] add to .gitignore --- .gitignore | 111 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 104 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 1fec9e7..4fb4cf7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ +# bapsfdaq_180e ignores +.hdf5_files +scope_screen_dump.png + ### Windows template # Windows thumbnail cache files Thumbs.db @@ -210,10 +214,103 @@ dmypy.json # Cython debug symbols cython_debug/ -# PyCharm -# JetBrains specific template is maintained in a separate JetBrains.gitignore that can -# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore -# and can be added to the global gitignore or merged into this file. For a more nuclear -# option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ - +# Covers JetBrains IDEs: IntelliJ, GoLand, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ +.idea/sonarlint.xml # see https://community.sonarsource.com/t/is-the-file-idea-idea-idea-sonarlint-xml-intended-to-be-under-source-control/121119 + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based HTTP Client +.idea/httpRequests +http-client.private.env.json + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +# Apifox Helper cache +.idea/.cache/.Apifox_Helper +.idea/ApifoxUploaderProjectSetting.xml + +# Github Copilot persisted session migrations, see: https://github.com/microsoft/copilot-intellij-feedback/issues/712#issuecomment-3322062215 +.idea/**/copilot.data.migration.*.xml + +# Covers VSCode IDE: +# source: https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore + +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets +!*.code-workspace + +# Built Visual Studio Code Extensions +*.vsix