From c274dae725b387423cddcdb98dfe25eb825cd494 Mon Sep 17 00:00:00 2001 From: adamr Date: Mon, 3 Jul 2023 13:04:38 +0200 Subject: [PATCH] improvement and stability --- EStiMo_GUI.py | 13 +++++++++---- Electrode_selection.txt | 2 ++ README.md | 6 ------ connection/__init__.py | 3 +++ connection/__pycache__/NeurOne.cpython-38.pyc | Bin 4954 -> 5023 bytes connection/__pycache__/RDA.cpython-38.pyc | Bin 6244 -> 6313 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 156 -> 324 bytes settings/Electrode_selection.txt | 4 ++-- utils/__pycache__/FirstWindow.cpython-38.pyc | Bin 32911 -> 32980 bytes utils/__pycache__/Functions.cpython-38.pyc | Bin 5514 -> 5583 bytes utils/__pycache__/Waiting.cpython-38.pyc | Bin 1144 -> 1213 bytes utils/__pycache__/__init__.cpython-38.pyc | Bin 250 -> 319 bytes utils/features.py | 0 13 files changed, 16 insertions(+), 12 deletions(-) create mode 100644 Electrode_selection.txt mode change 100755 => 100644 utils/features.py diff --git a/EStiMo_GUI.py b/EStiMo_GUI.py index 90fe5bd..ef3128f 100644 --- a/EStiMo_GUI.py +++ b/EStiMo_GUI.py @@ -5,6 +5,9 @@ Created on Tue Nov 23 11:11:41 2021 @author: adamr """ +import sys, os +sys.path.append(os.path.dirname(os.path.abspath(__file__))) + from connection import NeurOne, RDA # import RDA @@ -215,7 +218,7 @@ def acquire_data(q, size, run, speed, downsample, sleep_time, ip = '192.168.200. run: Value class from multiprocessing library. That value can be changed in main process downsample: boolean value. Says if data will be downsampled to 1000 Hz sleep_time: int, set how often function should refresh. Usually it takes a bit more that that""" - offline = 'offline' + # offline = 'offline' #import NeurOne_v3 if offline=="offline": NO = NeurOneOffline() @@ -247,7 +250,7 @@ class AppForm(QMainWindow): def __init__(self, passed_params = None, parent=None): super().__init__() #self.setStyleSheet("background: whitesmoke") - self.offline = "offline" #'NeurOne' #"BrainProducts"#False + self.offline = None #"offline" #'NeurOne' #"BrainProducts"#False self.time_start = time.time() QMainWindow.__init__(self, parent) self.montage_file_path = 'montage_18ch.csv' @@ -416,12 +419,13 @@ class AppForm(QMainWindow): self.remove_outliers = passed_params['remove_outliers'] self.ip = passed_params['ip'] self.port = passed_params['port'] - self.offline = self.offline if not None else passed_params['offline'] + self.offline = self.offline if not self.offline==None else passed_params['offline'] self.exp_trig = passed_params['exp_trig'] self.exp_time = passed_params['exp_time'] self.if_percentage = passed_params['percentages'] self.received_thr_values = passed_params['thr_values'] self.plot_len = passed_params['plot_len'] + print(self.offline) else: self.montage_file_path = 'montage_18ch.csv' self.time_between_bursts = int(settings_file[settings_file[0]=='time_between_trains'].values[0][1]) @@ -445,6 +449,7 @@ class AppForm(QMainWindow): self.offline = False self.plot_len = 4 #length of data to plot (last seconds of data array) + self.unit_label = np.array(self.unit_label)[self.used_features] self.log_file_writer.writerow(['time', 'state', self.used_features]) @@ -743,7 +748,7 @@ class AppForm(QMainWindow): self.timer.setInterval(int(self.speed_general*1.03)) times = time.time() - self.offline='offline' #remove this! + # self.offline='offline' #remove this! if self.offline=="offline": incl = [0,2,6,7,8,10,13,16,18,22,25,28,31,34,41,43,-3,-2,-1] # For offline only loaded_temp = self.q.get()[incl]/10 # Load data diff --git a/Electrode_selection.txt b/Electrode_selection.txt new file mode 100644 index 0000000..af376a5 --- /dev/null +++ b/Electrode_selection.txt @@ -0,0 +1,2 @@ +full_cap_file_path: C:/Users/Basics/Desktop/new_super_important_study/TMS Trains/Up to date version/estimo-master (1)/estimo-master/settings/easycap-M10_63_NO.txt +cap_file_path: C:/Users/Basics/Desktop/new_super_important_study/TMS Trains/Up to date version/estimo-master (1)/estimo-master/settings/easycap-M10_16_NO.txt \ No newline at end of file diff --git a/README.md b/README.md index a8cea76..2ef0811 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,6 @@ EStiMo is a sophisticated software developed for the purpose of real-time monitoring during Transcranial Magnetic Stimulation (TMS) sessions. This is accomplished by conducting a real-time analysis of Electroencephalography (EEG) signals. Its operational mechanics are contingent on a suite of features that are computed online and visually represented on the display interface. The computation of these values takes place in between the trains of TMS. ## Installation -To install all required library use: - -``` -pip install -r requirements.txt -``` - EStiMo is designed to be conveniently portable and as such, does not necessitate a typical installation procedure. However, the pre-requisite for running this software smoothly is a Python 3 environment, ideally version 3.8. Alongside Python, several other libraries are necessary for full functionality, including: time, matplotlib, mne, inspect, sys, os, random, scipy, PyQt5, multiprocessing, pandas, json, cycler, traceback, and csv. The EStiMo package is comprised of 6 distinct Python script files namely: FirstWindow.py, Functions.py, NeurOne.py, RDA.py, and EStiMo_GUI.py. Additionally, there are certain auxiliary files that facilitate the running of the software. The 'TMS_protocol.txt' file includes the default settings for the application. The 'electrode_selection.txt' file contains the directories for files related to electrode placement. Lastly, the package also includes a csv file that possesses a square matrix, which is integral for defining the relationships between the various channels. diff --git a/connection/__init__.py b/connection/__init__.py index e69de29..da00392 100644 --- a/connection/__init__.py +++ b/connection/__init__.py @@ -0,0 +1,3 @@ +import sys, os +# sys.path.append("..") +sys.path.append(os.path.dirname(os.path.abspath(__file__))) diff --git a/connection/__pycache__/NeurOne.cpython-38.pyc b/connection/__pycache__/NeurOne.cpython-38.pyc index ae586c6790bfb24f2c28771744dacf8c297ec16a..465cd503da787ba58c4b597f4e10aac6346e1a88 100644 GIT binary patch delta 617 zcmY+BJ&)5s5QZ^uF&D++?1=Bi5$GU%2oZ!pK*hl|Cvt&HD8eGMvDaiF-Ziu9Gj|0? z0}Ta2OGiNs9ZG>j&ksOCLUPML;1{stt8npn=ACzEXSCJwr_-&G=Qa1(4?et4zP5fj zJFi!+laXSe$StaPtjKMqo@tpA!OBP#IfIC2xdcsxj+8EvEi$~j5e|WJp~xr?wG0!g zS-5F?a485=nrHGtMwMm|p1IWhUm>v+g2fuGeOAnm?|tPuWAkzGgypxz-_H8{UGt~o ztQp#R+j)qi5{s%iDbf_L*k(Xcy@{C2J@2ox^BCinMYUkdQtdh>wVvf{*q*_p#g8uC6UgYEP8UaS7S@red zP4w@7D!G6jsw;>WrsK8EAOGyJdzjuwY*_SHVTivzjLdS-J2b_@4Fn)c#J0(Tqt3v* z2~PS0D|G$JjiN-xQ3Man_n>$F5!&jZ59BkdQwdqsP+RtGGdP8{HUbxcfo*ogTx_5F E2dG7{{Qv*} delta 459 zcmXAjy-EW?6onndL_=cS)gZwpK~PdH2$Dht5fzL4m}HIrE|c9!cGc|Y&4ysa$}(2Y z1K0`LNghG0tOP;W%4e_^bnZIEH|L&v?wz@x^Jk;mu~=k4o{`%t^EvuKvMZX+n@pn? zZGyJO&32QyUQ65B(>IF+P0v?SdR1Gmcut;cCU;$CdJcEB{^8(FnE2vrbXxLf^plkO zACY%La^fM{OCQN6;8?@z&eiRf()=TMq4Zs0vpY7G>H>5_ru`04fzFMyu@GAxDz6Wc3e?eSGNv diff --git a/connection/__pycache__/RDA.cpython-38.pyc b/connection/__pycache__/RDA.cpython-38.pyc index 1d7c382734ad7b87eeaa7f24b1118940141a54f2..c16abde0db8b42881689e3478ac9161a0e1d9670 100644 GIT binary patch delta 613 zcmY+=&1(}u6aa817DKn@qZ*Syq;4zNiVDUQL_LVM2nIyV2PJVJY&Vl;nq+4CX0{u9j}o z)6CtrGq@C#Db0KGM$c24fxDEy`hSM{QV8a2EG?}*7=Me*MM>TKntn=(<3;E2G%1?t z_=i~CX>m|`y(|4r-F%IAY|(t;wzZb{PTJ-$k{T~1i^MJ4%S@vGrcNBiv^}56P(ux` z`OJ)F?~s!DIlFdc3lo6#&U)Bt;ScXHc!}B9$P1)4ethl+Dequ>7D=3JC2cf`wz|^O zgU_B%3&A0MTXch z<;!4jT>H-G3t!@|Fngxb2Ie)PZI;uEWMpVM$d#~X@2F=}asl`T@Eo~p=CkL`pY*l# zCN4Wj*YXH@7z%SQvyiM~_#PP{`zAJ(CEN@%m#iN%D+N3lwvja?hg?LiBg@Erq=>W; LZf9gnA)EgTv+T2a delta 476 zcmXYs%}X0W7{;9_4Q$MZ60?FIwL;Bt>q!J}eh>(LVAj@;BCMMUPIYJEyAxv+G>TqS zJotj*Me!)~(3(^GFXRs>?5)sSp?`oU_pQ$1$1~47&pR^@!+$=+7UFTEC0scT-(!Ac zWXxJu9=DvLHRA5*uNtlpG0poBYYV#!_mP4cOrWg6QkG!0@@& z!sDuHhb}p$wvqyHyduVV`zJ(a}y-$fByk4kc^&HQmo@*h~+y75ta})v zOZFUpbUh}H$bDn419ytxVJ(wo*La^PXA0E0`rrAYgarC3e8#Lfo>3&rgsl)$03>~^ sn}ewpl9z;Q!VNmzW&|WQ&9_YAUvoT07s4K45l6fGVtJAtL5AVnGgRq~PXGV_ diff --git a/connection/__pycache__/__init__.cpython-38.pyc b/connection/__pycache__/__init__.cpython-38.pyc index 494ef4b6bf33295f2c9f9d0dcd1ac0cf823df20b..0d96a45058feac2375449fcfb69fd802cce27295 100644 GIT binary patch literal 324 zcmY+8u};J=42F~5aXpYu;t@L10R$@`gn$*6yE2?2MWHbeXp<;TL45(9fCqq)SIWx7 zD=^`f1#J1VZ2z`gEf!mh?E2_c-%U{wn#S2s9L=2G682BiF8VUw0e ze7~F@iV7j1I8$h96c>Px(RpFvSz_lQNYi>3qOwt9>~t?ym&;-ml(8r(Uqn}E6`^>d y8^&1y7)|STTZIuqv2#%V?}*x23w0c%QW|TblzYBU^W)a(u7MLyuVF^m&VB%T5@8+y literal 156 zcmWIL<>g`k0^f>`6cGIwL?8o3AjbiSi&=m~3PUi1CZpdE8eEd;o3EdopO=@KT#}ieryn1mnU`4- ZAFo$Xd5gm)H$SB`C)EyQ^k*Pu005(2Bq#s? diff --git a/settings/Electrode_selection.txt b/settings/Electrode_selection.txt index 2fe9b3b..bc31696 100644 --- a/settings/Electrode_selection.txt +++ b/settings/Electrode_selection.txt @@ -1,2 +1,2 @@ -full_cap_file_path: /home/adamr/Documents/PYTHON/TMS TV/EStiMo/settings/easycap-M10_63_NO.txt -cap_file_path: /home/adamr/Documents/PYTHON/TMS TV/EStiMo/settings/easycap-M10_16_NO.txt +full_cap_file_path: settings/easycap-M10_63_NO.txt +cap_file_path: settings/easycap-M10_16_NO.txt \ No newline at end of file diff --git a/utils/__pycache__/FirstWindow.cpython-38.pyc b/utils/__pycache__/FirstWindow.cpython-38.pyc index c2318e452e0f190e4edd440f9636df03f2bcb468..f058d16a19119d95e25e563c6fe3a2a38f790773 100644 GIT binary patch delta 919 zcmZ|N%}*0S6aa7r3I!^rXb1`#d+>v*s1O2zL81j}3`9a(2(a2N?H0FXKb+YXw9wih zib_OyexL{c0})&k;UIc|c))`PKaw8Qi^huw4@6^Z;yySS4{ox*ym|BH&CX;el9_Lk znHEn$L4Jnu&|8ypmP6*mB}X0SVFG2`ah{2O#x)8otSKrd3jFY!OcN!gT;iD~P+M7r{of21(ZqhnHH(yK zouaHq%u@{{rRO?VP1b5+eAjLyAF0s`TH3Qno$fouvMjBb@*o}Xp}ocG{yWBqgF06Y zX#nb4DLI0P!-ySEx)0fpIH1!#WIkccxampw=-y6Tkaibm(jF-Ee6pOzC1((?{@att zYYQ2%{R%Z3Yg74>abjQw!XLDJk zSM66cMjK$oYbW)v>UEa*u*Fe?M|zR1h#xw9P7;O(zAocle)>iUNkP1Kg2=GZpWai2 zHI2yH9a%7{G3d_Ggh7o}(p|XmIj9W0Hr8bc&x#c+!8@>(So}Z6-1dWg!m% zh=&f65ts?Z$*f);{zk|QluEUv3p`S+=n<}(Mdpylhz_5n?wpGl&O?)2OOkp*ULw|q zn3+M0H-j#KOWpaO2IFc48Pyln`E0TX15uSM=wG8vguK!Z3_i`=a^Gl>$`hI6tl$p| zfmC*|U*R=+57HN^cZ}l>g~$zL0=bDyB2&;FtFFI|;a%hoGL3}sqc&l*8M%sFL#`uB zhzU!UVL7(f@*KzCar^{+#Y(rm!13Cde;7%7-unOb60`51V#rO#;POzqXap1UND>)E Z#$bAQfXsq5{+7hxOT3i?^{PY<`2%-h5A^^5 delta 826 zcmZ|NOH30{6b9fPC?FJ)sv#&~F!7awW)x!)VnIPDCan-UB~nyc$^b3&;Y`aTtuzfm z#TV-F6?AJNq7oeve8vYPF4#z-n-iCZzv!Mo-R*77LJCz(SQ_;C_;0a*w}Pj5bchwVyjT^i1_Rw zAsX@ZD}wqwYqEx1s@?iaZ#+OcoxBs|0JGX+Ye}a{^+A)8Zm^*w0w-^C*o=;UIihw> zI4Y=`=NyZLRVY*dlXf_{4D1HAd|!;`TD1{TK8A5SmpHdjD_fie+~!<1oJ8>yIISLO zO=OdgKXeovY(S+59lToP(s%oM%2T-wzMiNo)p>#g9z|Zk=wWR%wN8n4hWkSiMXqL} z+eC-B%55#|Knn|S0}t2?I{BX4N`C(4Zqx3;;u#}y@qFh51=!(T*|i^Y>cHxq7!a8? zT$vGRD58|hJFsz>2fIFN>l&rE1wl-~H=FcwE#kH7P>Z{p^%UcP-$~ba-Y-y+fBHvg zT9y006HT!@P)R3vG7!sugjLhvF?a%=a%s?&If78-i@{1ts0+abGCo9Q3TUrRp5?pY z?f+@86y8UpYWkTM8T69h41{S`-7{EE^hs5Q=F&FZ)*7U;eM()g1yaRendCxiVQo}3c zKakIGO}wc1HS*PO{;d^F*=zsPM^u-1ATH7vFUD8$lPIVl0YIl3JWyl3x&$ms%cQ zTw0J?6rY(}kY7}im{$^CTvD1+8580gtPoO^n3-1`6I!59lCO}GSdywx1~elxKQAV= zxFj<-UpF_gxFoemLBmiJRV1dgBr~Tt#;r6jxdfL;co<`(I@jy-Jc=-G2 zhxi67goNq42A5>|=IfW1Wabp>Z%$!)#LakXvOAwHW6AAdU;-0k-sFkGPZ$#>mx)x%mw@D%LW%@IG^3j)v!9=zCSy?& pm|K)TSwK{eI~>R<5(g0}lRZV%MT0=hL=ce$BJw~)$>dg1F94LKI5+?R diff --git a/utils/__pycache__/Waiting.cpython-38.pyc b/utils/__pycache__/Waiting.cpython-38.pyc index 8014d83a64a0badc6fe4dc2b3b7c7419cdac3f95..961d161aeb92a6b42f88ab27029b299f363f43b6 100644 GIT binary patch delta 154 zcmeytv6qu4l$V!_0SJnxOibCxvw*3-!PzP%v^ce>IL0ZlI5W98#wE2lyClCLCNH%- zzPPj?wJ1I_w;;c$Br&ffzPO|`r7|YOH&`L0C^0jyI3~0}p(I}+C9xz`p$uq7W`15w rYH>+sZoY1AVsS}ok%ESyCaOqGX-Q^IaZGq(W=UpVy58nzOp_P^&RaQf delta 77 zcmdnX`GbQel$V!_0SGvHs*^YJEMPLS*3Zb#P1R3KNz5(McgasK%}vcKDb^2&4Ds;y f(+}|tRtO2xcMUGd^v%~VEy>I&*59nmJc|(ka$pzO diff --git a/utils/__pycache__/__init__.cpython-38.pyc b/utils/__pycache__/__init__.cpython-38.pyc index 3873aa11b56f046160bcb0827182e161cd955624..ba7cdaedd638af46ada2fc78d9720d55ff2c487a 100644 GIT binary patch delta 150 zcmY++Ee--P5I|u-vRRL;1cAUJ0gGbmCYdzshzay3ohbxGI6@OFXW=d!1I1dN{KWf? z-;>6+?Q}FG&sv+;{jptx70Ln|Cwvsxk(@Lp2y{g$i88WJF{=xTqNTq=I0hh5_HpT*C}lHWE&c_H@>u|p11n delta 74 zcmdnb^ox-@l$V!_0SG3n>zv3v*T_acBR@A)KQSdSw@BY5Ke;qFHLs*tKOi#1!{1Lo c#5Y(WBuw8mxFpjzU%#{@GpAU8vOJ>#09s@hTmS$7 diff --git a/utils/features.py b/utils/features.py old mode 100755 new mode 100644