From 3ff58565879fa4f37616fff748beaf54c342ec29 Mon Sep 17 00:00:00 2001 From: David Railton Garrett Date: Mon, 10 Jun 2024 15:37:10 -0700 Subject: [PATCH] ERPLAB v11 --- GUIs/DQ_Spectra_GUI.fig | Bin 30965 -> 31012 bytes GUIs/DQ_Spectra_GUI.m | 4 +- GUIs/DQ_Table_GUI.fig | Bin 38271 -> 38543 bytes GUIs/DQ_Table_GUI.m | 668 ++-- GUIs/abouterplabGUI.fig | Bin 5345 -> 22457 bytes GUIs/abouterplabGUI.m | 332 +- GUIs/aboutext_estudio.txt | 71 + GUIs/artifactinterpGUI.fig | Bin 37623 -> 36744 bytes GUIs/artifactinterpGUI.m | 30 +- GUIs/basicfilterGUI2.fig | Bin 72398 -> 71099 bytes GUIs/basicfilterGUI2.m | 3291 +++++++++-------- GUIs/binoperGUI.m | 19 +- GUIs/blcerpGUI.fig | Bin 4454 -> 17703 bytes GUIs/blcerpGUI.m | 501 ++- GUIs/browsechanbinGUI.fig | Bin 2528 -> 6672 bytes GUIs/chanoperGUI.fig | Bin 32309 -> 32479 bytes GUIs/chanoperGUI.m | 774 ++-- GUIs/creabasiceventlistGUI.fig | Bin 6473 -> 18268 bytes GUIs/creabasiceventlistGUI.m | 306 +- GUIs/errorGUI.fig | Bin 21821 -> 24172 bytes GUIs/errorGUI.m | 150 +- GUIs/geterpvaluesGUI2.fig | Bin 75330 -> 74518 bytes GUIs/grandaveragerGUI.fig | Bin 30888 -> 30716 bytes GUIs/grandaverager_DQ.m | 5 +- GUIs/gui_eegtrim.m | 16 +- GUIs/gui_erplabShiftEventCodes.m | 45 +- GUIs/saveRTGUI.fig | Bin 5109 -> 15219 bytes GUIs/saveRTGUI.m | 11 +- GUIs/scalplotGUI.fig | Bin 43837 -> 45386 bytes README.md | 64 +- eegplugin_erplab.m | 25 +- erplab_default_values.m | 4 +- functions/averager.m | 17 +- functions/delerpchan.m | 32 +- functions/erpworkingmemory.m | 62 +- functions/filterp.m | 136 +- functions/gaverager.m | 4 +- functions/geterpvalues.m | 842 +++-- functions/inputvalue.m | 6 + functions/localpeak.m | 5 +- functions/setcodebit.m | 82 +- functions/summary_rejectflags.m | 64 +- images/EstudioLogo.jpg | Bin 0 -> 74343 bytes images/EstudioLogo.png | Bin 0 -> 587982 bytes pop_functions/pop_DQ_preavg.m | 48 +- pop_functions/pop_ERP_simulation.m | 0 pop_functions/pop_artextval.m | 2 +- pop_functions/pop_artinterp.m | 434 +-- pop_functions/pop_basicfilter.m | 4 +- pop_functions/pop_blcerp.m | 40 +- pop_functions/pop_creabasiceventlist.m | 420 +-- pop_functions/pop_currentsourcedensity.m | 27 +- pop_functions/pop_deleterpset.m | 235 +- pop_functions/pop_eeglindetrend.m | 272 +- pop_functions/pop_eegtrim.m | 144 +- pop_functions/pop_epoch2continuous.m | 3 +- pop_functions/pop_eraseventcodes.m | 2 +- pop_functions/pop_erplindetrend.m | 266 +- pop_functions/pop_exporteegeventlist.m | 325 +- pop_functions/pop_exporterpeventlist.m | 7 + pop_functions/pop_filterp.m | 30 +- pop_functions/pop_gaverager.m | 2 +- pop_functions/pop_geterpvalues.m | 1330 +++---- pop_functions/pop_importeegeventlist.m | 306 +- pop_functions/pop_importerpeventlist.m | 249 +- pop_functions/pop_remove_response_mistakes.m | 10 +- pop_functions/pop_squeezevents.m | 101 +- pop_functions/pop_summary_AR_eeg_detection.m | 266 +- pop_functions/pop_summary_AR_erp_detection.m | 5 +- pop_functions/pop_syncroartifacts.m | 316 +- studio_functions/.txt | 1028 +++++ .../EStudio/EEG Tab/EStudio_EEG_Tab.m | 172 + .../EEG Tab/f_check_eegtab_panelchanges.m | 181 + .../EEG Tab/f_eeg_read_chan_IC_names.m | 57 + .../{ => EEG Tab}/f_get_default_fontsize.m | 9 +- .../Functions/EStudio/EEG Tab/f_ploteeg.m | 71 + .../Functions/EStudio/EEG Tab/f_ploteegwave.m | 952 +++++ .../EStudio/EEG Tab/f_preparms_eegwaviewer.m | 269 ++ .../EStudio/EEG Tab/f_redrawEEG_Wave_Viewer.m | 1984 ++++++++++ .../EStudio/EEG Tab/pop_duplicateeg.m | 193 + .../EStudio/EEG Tab/pop_editdatachanlocs.m | 267 ++ .../EStudio/EEG Tab/pop_eeg_ar_summary.m | 48 + .../EStudio/EEG Tab/pop_eeg_eventlist_view.m | 144 + .../EEG Tab/pop_eeg_save_trial_information.m | 287 ++ .../EStudio/EEG Tab/pop_ploteegset.m | 405 ++ .../EStudio/EEG Tab/pop_rename2chan.m | 272 ++ .../Functions/EStudio/EEG Tab/pop_renameeg.m | 180 + .../EStudio/EEG Tab/pop_resampleeg.m | 306 ++ .../Functions/EStudio/EEG Tab/pop_suffixeeg.m | 165 + .../ERP wave viewer/ERPLAB_ERP_Viewer.m | 225 +- .../ERP wave viewer/ERP_layoutstringGUI.fig | Bin 18568 -> 18056 bytes .../ERP wave viewer/ERP_layoutstringGUI.m | 206 +- .../default_amp_ticks_viewer.m | 2 +- .../f_ERP_Binchan_waviewer_GUI.m | 945 +---- .../f_ERP_labelset_waveviewer_GUI.m | 446 ++- .../f_ERP_lineset_waveviewer_GUI.m | 687 ++-- .../f_ERP_otherset_waveviewer_GUI.m | 471 ++- .../f_ERP_plotorg_waveviewer_GUI.m | 1178 +++--- .../f_ERP_property_waveviewer_GUI.m | 415 ++- .../f_ERP_timeampscal_waveviewer_GUI.m | 1614 +++----- .../ERP wave viewer/f_ERPsets_waviewer_GUI.m | 580 +-- .../f_MarkLabels_gridlocations_ERP_Waveiwer.m | 16 +- .../f_check_erpviewerpanelchanges.m | 12 +- .../f_checktable_gridlocations_waviewer.m | 0 .../ERP Tab/ERP wave viewer/f_decimal.m | 0 .../f_display_binstr_chanstr.m | 121 + .../f_erpwave_viewer_update_parameter.m | 0 .../ERP Tab/ERP wave viewer/f_geterpdata.m | 36 +- .../ERP wave viewer/f_geterpschanbin.m | 25 +- .../ERP wave viewer/f_ploterpserpviewer.m | 177 +- .../ERP wave viewer/f_preparms_erpwaviewer.m | 194 +- .../ERP wave viewer/f_redrawERP_viewer_test.m | 397 +- .../ERP Tab/ERP wave viewer/f_setdiffstr.m | 0 .../ERP wave viewer/pop_plotERPwaviewer.m | 23 +- .../ERP Tab/ERP wave viewer/v_ERPDAT.m | 18 - .../{ERPLAB_ERP_Tab.m => EStudio_ERP_Tab.m} | 88 +- .../Functions/EStudio/ERP Tab/README.md | 14 - .../Functions/EStudio/ERP Tab/dummy.erp | Bin 76622 -> 0 bytes .../EStudio/ERP Tab/erplabstudioamnesia.m | 114 - .../ERP Tab/export2csv_spectranl_analysis.m | 6 +- .../EStudio/ERP Tab/f_ERP_duplicate.fig | Bin 17041 -> 13630 bytes .../EStudio/ERP Tab/f_ERP_duplicate.m | 59 +- .../EStudio/ERP Tab/f_ERP_plot_wav.m | 199 +- .../EStudio/ERP Tab/f_ERPplot_Parameter.m | 218 -- .../EStudio/ERP Tab/f_checkerpsets.m | 16 +- .../Functions/EStudio/ERP Tab/f_dq_summary.m | 92 +- .../EStudio/ERP Tab/f_erpset_geterpvalues.m | 289 -- .../EStudio/ERP Tab/f_getFFTfromERP.m | 2 +- .../EStudio/ERP Tab/f_preparms_erptab.m | 449 +++ .../ERP Tab/f_preparms_mtviewer_erptab.m | 299 ++ .../Functions/EStudio/ERP Tab/f_redrawERP.m | 2035 +++++----- .../EStudio/ERP Tab/f_redrawERP_mt_viewer.m | 1533 -------- .../EStudio/ERP Tab/f_redrawERP_try.m | 942 ----- .../ERP Tab/f_spectral_analysis_advance.fig | Bin 24999 -> 0 bytes .../ERP Tab/f_spectral_analysis_advance.m | 814 ---- .../EStudio/ERP Tab/geterplabstudiodef.m | 8 +- .../Functions/EStudio/ERP Tab/mini_viewer.m | 434 --- .../Functions/EStudio/ERP Tab/ms_to_sample.m | 67 - .../ERP Tab/pop_ERP_spectralanalysis.m | 420 +++ .../EStudio/ERP Tab/pop_duplicaterp.m | 225 ++ .../EStudio/ERP Tab/pop_erp_ar_summary.m | 66 + .../EStudio/ERP Tab/pop_erp_eventlist_view.m | 166 + .../Functions/EStudio/ERP Tab/pop_renamerp.m | 187 + .../EStudio/ERP Tab/pop_resamplerp.m | 305 ++ .../Functions/EStudio/ERP Tab/pop_suffixerp.m | 172 + .../Functions/EStudio/ERP Tab/redrawERP.m | 769 ---- .../EStudio/ERP Tab/working_mem_save_load.m | 4 - .../Functions/estudioworking_mem_save_load.m | 68 + .../{ => Functions}/estudioworkingmemory.m | 22 +- studio_functions/Functions/etudioamnesia.m | 97 + .../Functions/get_studio_indexes.m | 28 + .../{ => Functions}/painterplabstudio.m | 4 +- .../{ => Functions}/setfonterplabestudio.m | 0 .../GUI Layout Toolbox/layout/+uix/BoxPanel.m | 367 +- .../GUI Layout Toolbox/layout/+uix/Panel.m | 35 +- .../layout/+uix/ScrollingPanel.m | 10 +- .../GUI Layout Toolbox/layout/+uix/Text.m | 406 +- .../GUI Layout Toolbox/layout/Contents.m | 4 +- .../layoutdoc/AxesExample.html | 2 +- .../layoutdoc/AxesLegendsColorbars.html | 2 +- .../layoutdoc/BoxPanelFancyStuff.html | 2 +- .../layoutdoc/Compiling.html | 2 +- .../layoutdoc/ExampleApp.html | 2 +- .../layoutdoc/Examples.html | 6 +- .../layoutdoc/Function_reference.html | 6 +- .../layoutdoc/Function_reference1_1.html | 4 +- .../layoutdoc/Function_reference1_2.html | 4 +- .../layoutdoc/Function_reference1_3.html | 4 +- .../layoutdoc/Function_reference1_4.html | 4 +- .../layoutdoc/Function_reference1_5.html | 4 +- .../layoutdoc/Function_reference2_1.html | 4 +- .../layoutdoc/Function_reference2_2.html | 4 +- .../layoutdoc/Function_reference2_3.html | 4 +- .../layoutdoc/Function_reference2_4.html | 4 +- .../layoutdoc/Function_reference2_5.html | 4 +- .../layoutdoc/Function_reference2_6.html | 4 +- .../layoutdoc/Function_reference3_1.html | 4 +- .../layoutdoc/Function_reference3_2.html | 4 +- .../layoutdoc/Function_reference4_1.html | 4 +- .../layoutdoc/Function_reference4_2.html | 4 +- .../layoutdoc/Function_reference4_3.html | 4 +- .../layoutdoc/GUI Layout.html | 2 +- .../layoutdoc/Getting_Started.html | 6 +- .../layoutdoc/Getting_Started1.html | 4 +- .../layoutdoc/Getting_Started2.html | 16 +- .../layoutdoc/Getting_Started3.html | 67 +- .../layoutdoc/Getting_Started4.html | 4 +- .../layoutdoc/Getting_Started5.html | 4 +- .../layoutdoc/Getting_Started6.html | 4 +- .../layoutdoc/HierarchyExample.html | 2 +- .../layoutdoc/Images/BoxPanel2.png | Bin 4069 -> 3965 bytes .../layoutdoc/Images/Panel2.png | Bin 2839 -> 2736 bytes .../layoutdoc/Images/ScrollingPanel.png | Bin 146927 -> 148319 bytes .../layoutdoc/Images/axes_inner.png | Bin 1028 -> 974 bytes .../Images/axes_layout_example_2.png | Bin 7491 -> 6669 bytes .../Images/axes_layout_example_3.png | Bin 28401 -> 28438 bytes .../layoutdoc/Images/axes_outer.png | Bin 4312 -> 3859 bytes .../layoutdoc/Images/colorbar_example_2.png | Bin 10538 -> 10363 bytes .../layoutdoc/Images/colorbar_example_3.png | Bin 54781 -> 55300 bytes .../layoutdoc/Images/why_fixed1.png | Bin 3805 -> 3732 bytes .../layoutdoc/Images/why_fixed2.png | Bin 4487 -> 4401 bytes .../layoutdoc/Images/why_layout0_1.png | Bin 2941 -> 2877 bytes .../layoutdoc/Images/why_layout0_2.png | Bin 2925 -> 2804 bytes .../layoutdoc/Images/why_layout1.png | Bin 2925 -> 2804 bytes .../layoutdoc/Images/why_layout2.png | Bin 4074 -> 4012 bytes .../layoutdoc/Images/why_normalized1.png | Bin 3202 -> 3034 bytes .../layoutdoc/Images/why_normalized2.png | Bin 5274 -> 5201 bytes .../layoutdoc/LayoutsGUIDE.html | 2 +- .../layoutdoc/PanelDock.html | 2 +- .../layoutdoc/PanelHelp.html | 2 +- .../layoutdoc/PanelMinimize.html | 2 +- .../layoutdoc/User_guide.html | 6 +- .../layoutdoc/User_guide1.html | 4 +- .../layoutdoc/User_guide1_1.html | 4 +- .../layoutdoc/User_guide1_2.html | 4 +- .../layoutdoc/User_guide1_3.html | 4 +- .../layoutdoc/User_guide1_4.html | 4 +- .../layoutdoc/User_guide1_5.html | 4 +- .../layoutdoc/User_guide2.html | 4 +- .../layoutdoc/User_guide2_1.html | 4 +- .../layoutdoc/User_guide2_2.html | 4 +- .../layoutdoc/User_guide2_3.html | 4 +- .../layoutdoc/User_guide3.html | 4 +- .../layoutdoc/User_guide3_1.html | 4 +- .../layoutdoc/User_guide4.html | 4 +- .../layoutdoc/User_guide4_1.html | 4 +- .../layoutdoc/User_guide4_2.html | 4 +- .../layoutdoc/User_guide4_3.html | 4 +- .../layoutdoc/User_guide5.html | 4 +- .../layoutdoc/User_guide6.html | 4 +- .../layoutdoc/User_guide7.html | 4 +- .../layoutdoc/User_guide7_1.html | 4 +- .../layoutdoc/User_guide7_2.html | 4 +- .../layoutdoc/User_guide7_3.html | 4 +- .../layoutdoc/User_guide7_4.html | 4 +- .../layoutdoc/User_guide7_5.html | 4 +- .../layoutdoc/User_guide7_6.html | 4 +- .../layoutdoc/VisibleExample.html | 2 +- .../GUI Layout Toolbox/layoutdoc/about.html | 2 +- .../GUI Layout Toolbox/layoutdoc/atoz.html | 6 +- .../layoutdoc/compatibility.html | 2 +- .../layoutdoc/demoBrowserCreateInterface.html | 2 +- .../layoutdoc/demoBrowserOnListSelection.html | 2 +- .../layoutdoc/demoBrowserRun.html | 2 +- .../layoutdoc/demoBrowserScalability.html | 2 +- .../layoutdoc/demoBrowserStructure.html | 2 +- .../layoutdoc/demoBrowserUpdateInterface.html | 2 +- .../helpsearch-v4_en/store/000000000002.zap | Bin 305927 -> 305777 bytes .../helpsearch-v4_en/store/root.bolt | Bin 131072 -> 131072 bytes .../GUI Layout Toolbox/layoutdoc/helptoc.xml | 2 +- .../GUI Layout Toolbox/layoutdoc/index.html | 4 +- .../layoutdoc/layoutRoot.html | 2 +- .../layoutdoc/releasenotes.html | 2 +- .../layoutdoc/uix.BoxPanel.html | 2 +- .../layoutdoc/uix.CardPanel.html | 2 +- .../layoutdoc/uix.Empty.html | 2 +- .../layoutdoc/uix.Grid.html | 2 +- .../layoutdoc/uix.GridFlex.html | 2 +- .../layoutdoc/uix.HBox.html | 2 +- .../layoutdoc/uix.HBoxFlex.html | 2 +- .../layoutdoc/uix.HButtonBox.html | 2 +- .../layoutdoc/uix.Panel.html | 2 +- .../layoutdoc/uix.ScrollingPanel.html | 2 +- .../layoutdoc/uix.TabPanel.html | 2 +- .../layoutdoc/uix.VBox.html | 2 +- .../layoutdoc/uix.VBoxFlex.html | 2 +- .../layoutdoc/uix.VButtonBox.html | 2 +- .../layoutdoc/uix.tracking.html | 2 +- .../GUI Layout Toolbox/license.txt | 2 +- studio_functions/GUIs/.txt | 1028 +++++ studio_functions/GUIs/EEG Tab/.erp | Bin 0 -> 247064 bytes studio_functions/GUIs/EEG Tab/.txt | 388 ++ studio_functions/GUIs/EEG Tab/f_EEG_CSD_GUI.m | 372 ++ .../GUIs/EEG Tab/f_EEG_IC_channel_GUI.m | 528 +++ .../GUIs/EEG Tab/f_EEG_Plot_setting_GUI.m | 1449 ++++++++ .../GUIs/EEG Tab/f_EEG_arf_det_conus_GUI.m | 1952 ++++++++++ .../GUIs/EEG Tab/f_EEG_arf_det_epoch_GUI.m | 2021 ++++++++++ .../EEG Tab/f_EEG_arf_det_segmt_conus_GUI.m | 734 ++++ .../GUIs/EEG Tab/f_EEG_arf_sumop_GUI.m | 530 +++ .../GUIs/EEG Tab/f_EEG_avg_erp_GUI.m | 815 ++++ .../EEG Tab/f_EEG_baselinecorr_detrend_GUI.m | 766 ++++ .../GUIs/EEG Tab/f_EEG_binepoch_GUI.m | 867 +++++ .../GUIs/EEG Tab/f_EEG_chanoperation_GUI.m | 863 +++++ .../GUIs/EEG Tab/f_EEG_dq_epoch_GUI.m | 662 ++++ .../GUIs/EEG Tab/f_EEG_dq_fre_conus_GUI.m | 564 +++ .../GUIs/EEG Tab/f_EEG_duplicate_GUI.fig | Bin 0 -> 11966 bytes .../GUIs/EEG Tab/f_EEG_duplicate_GUI.m | 248 ++ .../GUIs/EEG Tab/f_EEG_edit_channel_GUI.m | 663 ++++ .../GUIs/EEG Tab/f_EEG_eeg_sets_GUI.m | 1441 ++++++++ .../GUIs/EEG Tab/f_EEG_eeglabica_GUI.m | 1068 ++++++ .../GUIs/EEG Tab/f_EEG_eeglabtool_GUI.m | 872 +++++ .../GUIs/EEG Tab/f_EEG_event2bin_GUI.m | 718 ++++ .../GUIs/EEG Tab/f_EEG_events_GUI.m | 1356 +++++++ .../GUIs/EEG Tab/f_EEG_filtering_GUI.m | 1503 ++++++++ .../GUIs/EEG Tab/f_EEG_history_GUI.m | 326 ++ .../GUIs/EEG Tab/f_EEG_import_GUI.fig | Bin 0 -> 15868 bytes .../GUIs/EEG Tab/f_EEG_import_GUI.m | 845 +++++ .../GUIs/EEG Tab/f_EEG_informtion_GUI.m | 292 ++ .../f_EEG_interpolate_chan_epoch_GUI.m | 1576 ++++++++ .../GUIs/EEG Tab/f_EEG_resample_GUI.m | 895 +++++ .../GUIs/EEG Tab/f_EEG_save_multi_file.fig | Bin 0 -> 19540 bytes .../GUIs/EEG Tab/f_EEG_save_multi_file.m | 435 +++ .../GUIs/EEG Tab/f_EEG_save_single_file.fig | Bin 0 -> 15080 bytes .../GUIs/EEG Tab/f_EEG_save_single_file.m | 305 ++ .../GUIs/EEG Tab/f_EEG_saveas_multi_file.fig | Bin 0 -> 20409 bytes .../GUIs/EEG Tab/f_EEG_saveas_multi_file.m | 455 +++ .../EEG Tab/f_EEG_shift_eventcode_conus_GUI.m | 715 ++++ .../GUIs/EEG Tab/f_EEG_suffix_gui.fig | Bin 0 -> 11857 bytes .../f_EEG_suffix_gui.m} | 71 +- .../GUIs/EEG Tab/f_EEG_update_gui.fig | Bin 0 -> 9989 bytes .../GUIs/EEG Tab/f_EEG_update_gui.m | 157 + .../GUIs/EEG Tab/f_EEG_utilities_GUI.m | 888 +++++ .../GUIs/EEG Tab/f_change_chan_name_GUI.fig | Bin 0 -> 9544 bytes .../GUIs/EEG Tab/f_change_chan_name_GUI.m | 174 + .../GUIs/EEG Tab/f_editchan_gui.mlapp | Bin 0 -> 72377 bytes .../f_estudio_chan_frontback_left_right.m | 166 + .../GUIs/EEG Tab/f_estudio_iclabel.m | 174 + .../EEG Tab/pop_ERP_save_trial_information.m | 292 ++ studio_functions/GUIs/EEG Tab/pop_blceeg.m | 285 ++ .../GUIs/EEG Tab/pop_eegplot_estudio.m | 223 ++ .../GUIs/EEG Tab/str2html_v01/license.txt | 27 + .../GUIs/EEG Tab/str2html_v01/str2html.m | 341 ++ .../GUIs/EEG Tab/str2html_v01/test_str2html.m | 85 + .../GUIs/EEG_Tab_rename_gui.mlapp | Bin 0 -> 21740 bytes studio_functions/GUIs/EEG_evenlist_gui.mlapp | Bin 0 -> 28351 bytes .../EEG_select_segement_artifact_GUI.mlapp | Bin 0 -> 84263 bytes .../GUIs/EEG_trial_rejection_sumr.mlapp | Bin 0 -> 32243 bytes studio_functions/GUIs/ERP Tab/.txt | 1029 ++++++ .../GUIs/ERP Tab/binoper_studioGUI.m | 5 +- studio_functions/GUIs/ERP Tab/f_ERP_CSD_GUI.m | 432 ++- .../GUIs/ERP Tab/f_ERP_append_GUI.m | 840 +++-- .../ERP Tab/f_ERP_baselinecorr_detrend_GUI.m | 769 ++-- .../GUIs/ERP Tab/f_ERP_bin_channel_GUI.m | 725 ++-- .../GUIs/ERP Tab/f_ERP_binoperation_GUI.m | 599 +-- .../GUIs/ERP Tab/f_ERP_chanoperation_GUI.m | 689 ++-- .../GUIs/ERP Tab/f_ERP_edit_channel_GUI.m | 688 ++++ .../GUIs/ERP Tab/f_ERP_erpsetsGUI.m | 2095 +++++------ .../GUIs/ERP Tab/f_ERP_events_GUI.m | 681 ++++ .../GUIs/ERP Tab/f_ERP_filtering_GUI.m | 1282 ++++--- .../GUIs/ERP Tab/f_ERP_grandaverageGUI.m | 604 ++- .../GUIs/ERP Tab/f_ERP_history_GUI.m | 214 +- .../GUIs/ERP Tab/f_ERP_meas_basecorr.m | 4 +- .../GUIs/ERP Tab/f_ERP_meas_format_path.fig | Bin 15379 -> 18068 bytes .../GUIs/ERP Tab/f_ERP_meas_format_path.m | 72 +- .../GUIs/ERP Tab/f_ERP_measurement_GUI.m | 2349 ++++++------ .../GUIs/ERP Tab/f_ERP_plot_scalp_GUI.m | 1978 +++++----- .../GUIs/ERP Tab/f_ERP_plot_setting_GUI.m | 2840 ++++++++++---- .../GUIs/ERP Tab/f_ERP_rename_gui.fig | Bin 12427 -> 0 bytes .../GUIs/ERP Tab/f_ERP_resample_GUI.m | 677 ++++ .../GUIs/ERP Tab/f_ERP_save_as_GUI.fig | Bin 0 -> 20275 bytes .../GUIs/ERP Tab/f_ERP_save_as_GUI.m | 481 +++ .../GUIs/ERP Tab/f_ERP_save_multi_file.fig | Bin 18023 -> 19642 bytes .../GUIs/ERP Tab/f_ERP_save_multi_file.m | 293 +- .../GUIs/ERP Tab/f_ERP_save_single_GUI.m | 231 -- .../GUIs/ERP Tab/f_ERP_save_single_file.fig | Bin 16748 -> 15022 bytes .../GUIs/ERP Tab/f_ERP_save_single_file.m | 32 +- .../GUIs/ERP Tab/f_ERP_simulation_panel.m | 1356 ++++--- .../GUIs/ERP Tab/f_ERP_spectral_GUI.m | 1161 +++--- .../GUIs/ERP Tab/f_ERP_suffix_gui.m | 15 +- .../GUIs/ERP Tab/f_appenderpGUI.fig | Bin 29034 -> 27716 bytes .../GUIs/ERP Tab/f_appenderpGUI.m | 12 +- .../GUIs/ERP Tab/f_basicfilterGUI2.m | 8 +- studio_functions/GUIs/ERP Tab/f_chanoperGUI.m | 3 +- .../ERP Tab/f_check_erptab_panelchanges.m | 135 + studio_functions/GUIs/ERP Tab/f_erp2ascGUI.m | 6 +- .../GUIs/ERP Tab/f_erp_dataquality_SME_GUI.m | 355 +- .../GUIs/ERP Tab/f_erp_informtion_GUI.m | 441 ++- .../GUIs/ERP Tab/f_erp_save_history.m | 19 + .../GUIs/ERP Tab/f_erp_viewerGUI.fig | Bin 0 -> 36472 bytes .../GUIs/ERP Tab/f_erp_viewerGUI.m | 2959 +++++++++++++++ .../GUIs/ERP Tab/f_export2csvGUI.fig | Bin 18515 -> 19056 bytes .../GUIs/ERP Tab/f_export2csvGUI.m | 50 +- .../GUIs/ERP Tab/f_export2textGUI.m | 4 +- .../GUIs/ERP Tab/f_rerefassistantGUI.m | 4 +- .../GUIs/ERP Tab/f_scalplotadvanceGUI.m | 4 +- .../GUIs/ERP Tab/geterpvaluesparasGUI2.fig | Bin 35944 -> 31584 bytes .../GUIs/ERP Tab/geterpvaluesparasGUI2.m | 242 +- .../GUIs/ERP_Tab_rename_gui.mlapp | Bin 0 -> 21748 bytes studio_functions/GUIs/ERP_evenlist_gui.mlapp | Bin 0 -> 28247 bytes .../GUIs/ERP_spectral_analysis_GUI.mlapp | Bin 0 -> 36157 bytes .../GUIs/EStudio_plot_set_waves.mlapp | Bin 0 -> 17528 bytes studio_functions/GUIs/EStudio_pos_gui.mlapp | Bin 0 -> 31203 bytes .../GUIs/dq_trial_rejection.mlapp | Bin 0 -> 47255 bytes .../GUIs/estudio_classic_ar_summary_gui.mlapp | Bin 0 -> 23249 bytes .../GUIs/estudio_epoch2contn_gui.mlapp | Bin 0 -> 23080 bytes .../GUIs/estudio_reset_paras.mlapp | Bin 0 -> 23995 bytes studio_functions/GUIs/estudio_warning.m | 42 + studio_functions/GUIs/f_creaeventlist_excel.m | 307 ++ studio_functions/GUIs/f_readeventlist_excel.m | 168 + studio_functions/erplab_running_version.erpm | Bin 187 -> 186 bytes studio_functions/erplab_running_version.m | 0 .../erplab_studio_default_values.m | 2 +- studio_functions/estudio.m | 791 ++++ studio_functions/memoryerpstudio.erpm | Bin 5807 -> 7145 bytes studio_functions/o_EEGDATA.m | 0 studio_functions/o_ERPDAT.m | 109 +- 396 files changed, 70406 insertions(+), 26127 deletions(-) create mode 100644 GUIs/aboutext_estudio.txt mode change 100644 => 100755 functions/gaverager.m create mode 100644 images/EstudioLogo.jpg create mode 100644 images/EstudioLogo.png mode change 100644 => 100755 pop_functions/pop_ERP_simulation.m mode change 100644 => 100755 pop_functions/pop_epoch2continuous.m create mode 100644 studio_functions/.txt create mode 100755 studio_functions/Functions/EStudio/EEG Tab/EStudio_EEG_Tab.m create mode 100755 studio_functions/Functions/EStudio/EEG Tab/f_check_eegtab_panelchanges.m create mode 100755 studio_functions/Functions/EStudio/EEG Tab/f_eeg_read_chan_IC_names.m rename studio_functions/Functions/EStudio/{ => EEG Tab}/f_get_default_fontsize.m (54%) mode change 100644 => 100755 create mode 100644 studio_functions/Functions/EStudio/EEG Tab/f_ploteeg.m create mode 100644 studio_functions/Functions/EStudio/EEG Tab/f_ploteegwave.m create mode 100755 studio_functions/Functions/EStudio/EEG Tab/f_preparms_eegwaviewer.m create mode 100644 studio_functions/Functions/EStudio/EEG Tab/f_redrawEEG_Wave_Viewer.m create mode 100644 studio_functions/Functions/EStudio/EEG Tab/pop_duplicateeg.m create mode 100644 studio_functions/Functions/EStudio/EEG Tab/pop_editdatachanlocs.m create mode 100644 studio_functions/Functions/EStudio/EEG Tab/pop_eeg_ar_summary.m create mode 100644 studio_functions/Functions/EStudio/EEG Tab/pop_eeg_eventlist_view.m create mode 100644 studio_functions/Functions/EStudio/EEG Tab/pop_eeg_save_trial_information.m create mode 100644 studio_functions/Functions/EStudio/EEG Tab/pop_ploteegset.m create mode 100644 studio_functions/Functions/EStudio/EEG Tab/pop_rename2chan.m create mode 100644 studio_functions/Functions/EStudio/EEG Tab/pop_renameeg.m create mode 100644 studio_functions/Functions/EStudio/EEG Tab/pop_resampleeg.m create mode 100644 studio_functions/Functions/EStudio/EEG Tab/pop_suffixeeg.m mode change 100644 => 100755 studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/ERP_layoutstringGUI.fig mode change 100644 => 100755 studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/ERP_layoutstringGUI.m mode change 100644 => 100755 studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_MarkLabels_gridlocations_ERP_Waveiwer.m mode change 100644 => 100755 studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_check_erpviewerpanelchanges.m mode change 100644 => 100755 studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_checktable_gridlocations_waviewer.m mode change 100644 => 100755 studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_decimal.m create mode 100755 studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_display_binstr_chanstr.m mode change 100644 => 100755 studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_erpwave_viewer_update_parameter.m mode change 100644 => 100755 studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_setdiffstr.m rename studio_functions/Functions/EStudio/ERP Tab/{ERPLAB_ERP_Tab.m => EStudio_ERP_Tab.m} (64%) mode change 100644 => 100755 delete mode 100755 studio_functions/Functions/EStudio/ERP Tab/README.md delete mode 100755 studio_functions/Functions/EStudio/ERP Tab/dummy.erp delete mode 100755 studio_functions/Functions/EStudio/ERP Tab/erplabstudioamnesia.m delete mode 100755 studio_functions/Functions/EStudio/ERP Tab/f_ERPplot_Parameter.m delete mode 100755 studio_functions/Functions/EStudio/ERP Tab/f_erpset_geterpvalues.m create mode 100644 studio_functions/Functions/EStudio/ERP Tab/f_preparms_erptab.m create mode 100644 studio_functions/Functions/EStudio/ERP Tab/f_preparms_mtviewer_erptab.m delete mode 100755 studio_functions/Functions/EStudio/ERP Tab/f_redrawERP_mt_viewer.m delete mode 100755 studio_functions/Functions/EStudio/ERP Tab/f_redrawERP_try.m delete mode 100755 studio_functions/Functions/EStudio/ERP Tab/f_spectral_analysis_advance.fig delete mode 100755 studio_functions/Functions/EStudio/ERP Tab/f_spectral_analysis_advance.m delete mode 100755 studio_functions/Functions/EStudio/ERP Tab/mini_viewer.m delete mode 100755 studio_functions/Functions/EStudio/ERP Tab/ms_to_sample.m create mode 100644 studio_functions/Functions/EStudio/ERP Tab/pop_ERP_spectralanalysis.m create mode 100644 studio_functions/Functions/EStudio/ERP Tab/pop_duplicaterp.m create mode 100644 studio_functions/Functions/EStudio/ERP Tab/pop_erp_ar_summary.m create mode 100644 studio_functions/Functions/EStudio/ERP Tab/pop_erp_eventlist_view.m create mode 100644 studio_functions/Functions/EStudio/ERP Tab/pop_renamerp.m create mode 100644 studio_functions/Functions/EStudio/ERP Tab/pop_resamplerp.m create mode 100644 studio_functions/Functions/EStudio/ERP Tab/pop_suffixerp.m delete mode 100755 studio_functions/Functions/EStudio/ERP Tab/redrawERP.m create mode 100644 studio_functions/Functions/estudioworking_mem_save_load.m rename studio_functions/{ => Functions}/estudioworkingmemory.m (86%) create mode 100644 studio_functions/Functions/etudioamnesia.m create mode 100644 studio_functions/Functions/get_studio_indexes.m rename studio_functions/{ => Functions}/painterplabstudio.m (97%) rename studio_functions/{ => Functions}/setfonterplabestudio.m (100%) create mode 100644 studio_functions/GUIs/.txt create mode 100644 studio_functions/GUIs/EEG Tab/.erp create mode 100644 studio_functions/GUIs/EEG Tab/.txt create mode 100644 studio_functions/GUIs/EEG Tab/f_EEG_CSD_GUI.m create mode 100755 studio_functions/GUIs/EEG Tab/f_EEG_IC_channel_GUI.m create mode 100755 studio_functions/GUIs/EEG Tab/f_EEG_Plot_setting_GUI.m create mode 100644 studio_functions/GUIs/EEG Tab/f_EEG_arf_det_conus_GUI.m create mode 100644 studio_functions/GUIs/EEG Tab/f_EEG_arf_det_epoch_GUI.m create mode 100644 studio_functions/GUIs/EEG Tab/f_EEG_arf_det_segmt_conus_GUI.m create mode 100644 studio_functions/GUIs/EEG Tab/f_EEG_arf_sumop_GUI.m create mode 100644 studio_functions/GUIs/EEG Tab/f_EEG_avg_erp_GUI.m create mode 100644 studio_functions/GUIs/EEG Tab/f_EEG_baselinecorr_detrend_GUI.m create mode 100755 studio_functions/GUIs/EEG Tab/f_EEG_binepoch_GUI.m create mode 100755 studio_functions/GUIs/EEG Tab/f_EEG_chanoperation_GUI.m create mode 100644 studio_functions/GUIs/EEG Tab/f_EEG_dq_epoch_GUI.m create mode 100644 studio_functions/GUIs/EEG Tab/f_EEG_dq_fre_conus_GUI.m create mode 100755 studio_functions/GUIs/EEG Tab/f_EEG_duplicate_GUI.fig create mode 100755 studio_functions/GUIs/EEG Tab/f_EEG_duplicate_GUI.m create mode 100644 studio_functions/GUIs/EEG Tab/f_EEG_edit_channel_GUI.m create mode 100755 studio_functions/GUIs/EEG Tab/f_EEG_eeg_sets_GUI.m create mode 100644 studio_functions/GUIs/EEG Tab/f_EEG_eeglabica_GUI.m create mode 100644 studio_functions/GUIs/EEG Tab/f_EEG_eeglabtool_GUI.m create mode 100644 studio_functions/GUIs/EEG Tab/f_EEG_event2bin_GUI.m create mode 100644 studio_functions/GUIs/EEG Tab/f_EEG_events_GUI.m create mode 100755 studio_functions/GUIs/EEG Tab/f_EEG_filtering_GUI.m create mode 100644 studio_functions/GUIs/EEG Tab/f_EEG_history_GUI.m create mode 100755 studio_functions/GUIs/EEG Tab/f_EEG_import_GUI.fig create mode 100755 studio_functions/GUIs/EEG Tab/f_EEG_import_GUI.m create mode 100755 studio_functions/GUIs/EEG Tab/f_EEG_informtion_GUI.m create mode 100644 studio_functions/GUIs/EEG Tab/f_EEG_interpolate_chan_epoch_GUI.m create mode 100644 studio_functions/GUIs/EEG Tab/f_EEG_resample_GUI.m create mode 100644 studio_functions/GUIs/EEG Tab/f_EEG_save_multi_file.fig create mode 100644 studio_functions/GUIs/EEG Tab/f_EEG_save_multi_file.m create mode 100644 studio_functions/GUIs/EEG Tab/f_EEG_save_single_file.fig create mode 100644 studio_functions/GUIs/EEG Tab/f_EEG_save_single_file.m create mode 100644 studio_functions/GUIs/EEG Tab/f_EEG_saveas_multi_file.fig create mode 100644 studio_functions/GUIs/EEG Tab/f_EEG_saveas_multi_file.m create mode 100644 studio_functions/GUIs/EEG Tab/f_EEG_shift_eventcode_conus_GUI.m create mode 100755 studio_functions/GUIs/EEG Tab/f_EEG_suffix_gui.fig rename studio_functions/GUIs/{ERP Tab/f_ERP_rename_gui.m => EEG Tab/f_EEG_suffix_gui.m} (65%) create mode 100644 studio_functions/GUIs/EEG Tab/f_EEG_update_gui.fig create mode 100644 studio_functions/GUIs/EEG Tab/f_EEG_update_gui.m create mode 100644 studio_functions/GUIs/EEG Tab/f_EEG_utilities_GUI.m create mode 100644 studio_functions/GUIs/EEG Tab/f_change_chan_name_GUI.fig create mode 100644 studio_functions/GUIs/EEG Tab/f_change_chan_name_GUI.m create mode 100644 studio_functions/GUIs/EEG Tab/f_editchan_gui.mlapp create mode 100644 studio_functions/GUIs/EEG Tab/f_estudio_chan_frontback_left_right.m create mode 100644 studio_functions/GUIs/EEG Tab/f_estudio_iclabel.m create mode 100644 studio_functions/GUIs/EEG Tab/pop_ERP_save_trial_information.m create mode 100644 studio_functions/GUIs/EEG Tab/pop_blceeg.m create mode 100644 studio_functions/GUIs/EEG Tab/pop_eegplot_estudio.m create mode 100755 studio_functions/GUIs/EEG Tab/str2html_v01/license.txt create mode 100755 studio_functions/GUIs/EEG Tab/str2html_v01/str2html.m create mode 100755 studio_functions/GUIs/EEG Tab/str2html_v01/test_str2html.m create mode 100644 studio_functions/GUIs/EEG_Tab_rename_gui.mlapp create mode 100644 studio_functions/GUIs/EEG_evenlist_gui.mlapp create mode 100644 studio_functions/GUIs/EEG_select_segement_artifact_GUI.mlapp create mode 100644 studio_functions/GUIs/EEG_trial_rejection_sumr.mlapp create mode 100644 studio_functions/GUIs/ERP Tab/.txt mode change 100644 => 100755 studio_functions/GUIs/ERP Tab/f_ERP_append_GUI.m create mode 100644 studio_functions/GUIs/ERP Tab/f_ERP_edit_channel_GUI.m create mode 100644 studio_functions/GUIs/ERP Tab/f_ERP_events_GUI.m delete mode 100755 studio_functions/GUIs/ERP Tab/f_ERP_rename_gui.fig create mode 100644 studio_functions/GUIs/ERP Tab/f_ERP_resample_GUI.m create mode 100644 studio_functions/GUIs/ERP Tab/f_ERP_save_as_GUI.fig create mode 100644 studio_functions/GUIs/ERP Tab/f_ERP_save_as_GUI.m mode change 100755 => 100644 studio_functions/GUIs/ERP Tab/f_ERP_save_multi_file.fig mode change 100755 => 100644 studio_functions/GUIs/ERP Tab/f_ERP_save_multi_file.m delete mode 100755 studio_functions/GUIs/ERP Tab/f_ERP_save_single_GUI.m mode change 100644 => 100755 studio_functions/GUIs/ERP Tab/f_ERP_simulation_panel.m mode change 100644 => 100755 studio_functions/GUIs/ERP Tab/f_appenderpGUI.fig mode change 100644 => 100755 studio_functions/GUIs/ERP Tab/f_appenderpGUI.m create mode 100644 studio_functions/GUIs/ERP Tab/f_check_erptab_panelchanges.m create mode 100644 studio_functions/GUIs/ERP Tab/f_erp_save_history.m create mode 100644 studio_functions/GUIs/ERP Tab/f_erp_viewerGUI.fig create mode 100644 studio_functions/GUIs/ERP Tab/f_erp_viewerGUI.m create mode 100644 studio_functions/GUIs/ERP_Tab_rename_gui.mlapp create mode 100644 studio_functions/GUIs/ERP_evenlist_gui.mlapp create mode 100644 studio_functions/GUIs/ERP_spectral_analysis_GUI.mlapp create mode 100644 studio_functions/GUIs/EStudio_plot_set_waves.mlapp create mode 100644 studio_functions/GUIs/EStudio_pos_gui.mlapp create mode 100644 studio_functions/GUIs/dq_trial_rejection.mlapp create mode 100644 studio_functions/GUIs/estudio_classic_ar_summary_gui.mlapp create mode 100644 studio_functions/GUIs/estudio_epoch2contn_gui.mlapp create mode 100644 studio_functions/GUIs/estudio_reset_paras.mlapp create mode 100644 studio_functions/GUIs/estudio_warning.m create mode 100644 studio_functions/GUIs/f_creaeventlist_excel.m create mode 100644 studio_functions/GUIs/f_readeventlist_excel.m mode change 100644 => 100755 studio_functions/erplab_running_version.m create mode 100755 studio_functions/estudio.m mode change 100644 => 100755 studio_functions/o_EEGDATA.m diff --git a/GUIs/DQ_Spectra_GUI.fig b/GUIs/DQ_Spectra_GUI.fig index 8afcda3959bc62e0627cbe16901ab05920a3a99b..e91298200d9732b2fa83bfd15d840e85ad14ed18 100755 GIT binary patch delta 30815 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 Prmd}7KWHFBc=rDRUZ^w0 delta 30773 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 bD(QxtRmdRC*`=BJ(SZ5rddRbR-u(XuF1&Cn diff --git a/GUIs/DQ_Spectra_GUI.m b/GUIs/DQ_Spectra_GUI.m index 5cd89270..bec11ad9 100755 --- a/GUIs/DQ_Spectra_GUI.m +++ b/GUIs/DQ_Spectra_GUI.m @@ -155,8 +155,8 @@ function DQ_Spectra_GUI_OpeningFcn(hObject, eventdata, handles, varargin) handles.orig_ColName = fft_labels; % Set font size of DQ Table -desired_fontsize = erpworkingmemory('fontsizeGUI'); -handles.dq_table.FontSize = desired_fontsize; +FonsizeDefault = f_get_default_fontsize(); if isempty(FonsizeDefault) FonsizeDefault=12; end +handles.dq_table.FontSize = FonsizeDefault; handles.heatmap_on = 0; % Set outliers text window off diff --git a/GUIs/DQ_Table_GUI.fig b/GUIs/DQ_Table_GUI.fig index 64a7f676c8fbea7a256cc853fa569596692c1052..c75e3e1d033c820ecdd291502f86f57d3f93c245 100755 GIT binary patch literal 38543 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 Kw9Ej0V@YKUo5oWB literal 38271 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 We&l>WYP$1v_78@c0|EeIqn-BsoF;An diff --git a/GUIs/DQ_Table_GUI.m b/GUIs/DQ_Table_GUI.m index 8d7cba39..93e7bdbd 100755 --- a/GUIs/DQ_Table_GUI.m +++ b/GUIs/DQ_Table_GUI.m @@ -22,7 +22,7 @@ % Edit the above text to modify the response to pushbutton_help DQ_Table_GUI -% Last Modified by GUIDE v2.5 26-Jan-2023 16:54:38 +% Last Modified by GUIDE v2.5 14-Mar-2024 12:22:31 % Begin initialization code - DO NOT EDIT gui_Singleton = 0; @@ -59,7 +59,7 @@ function DQ_Table_GUI_OpeningFcn(hObject, eventdata, handles, varargin) ERP = varargin{1}; ALLERP = varargin{2}; current_ERP = varargin{3}; -guiwin_num = varargin{4}; +guiwin_num = varargin{4}; %GUI positions (for multiple DQ tables) @@ -73,7 +73,7 @@ function DQ_Table_GUI_OpeningFcn(hObject, eventdata, handles, varargin) end -%check contents +%check contents try assert(exist('ERP','var')==1) @@ -88,20 +88,20 @@ function DQ_Table_GUI_OpeningFcn(hObject, eventdata, handles, varargin) end % Update GUI with ERPSET info -n_erp = numel(ALLERP); +n_erp = numel(ALLERP); if n_erp == 0 %for the case of showing aSME preavg - erp_names = ERP.erpname; + erp_names = ERP.erpname; handles.text_ERPSET_title.String = 'Selected EEG Dataset:'; handles.text_ERPSET_title.FontSize = 12; - handles.text11.Visible = 0; + handles.text11.Visible = 0; handles.newerpwin.Visible = 0; handles.pushbutton_selERP.Visible = 0; - handles.active_erpset.Style = 'text'; + handles.active_erpset.Style = 'text'; if numel(erp_names) > 15 handles.active_erpset.FontSize = 12.0; - set(handles.active_erpset,'FontUnits', 'normalized'); + set(handles.active_erpset,'FontUnits', 'normalized'); end %update handles guidata(hObject, handles); @@ -118,9 +118,9 @@ function DQ_Table_GUI_OpeningFcn(hObject, eventdata, handles, varargin) handles.active_erpset.String = erp_names; handles.active_erpset.Value = current_ERP; -%AMS: Multiple ERPset options -handles.newerpwin.String = erp_names; -handles.newerpwin.Value = current_ERP; +%AMS: Multiple ERPset options +handles.newerpwin.String = erp_names; +handles.newerpwin.Value = current_ERP; @@ -130,27 +130,27 @@ function DQ_Table_GUI_OpeningFcn(hObject, eventdata, handles, varargin) end handles.popupmenu_DQ_type.String = type_names; -%handles.popupmenu_DQ_type.Value = n_dq; +%handles.popupmenu_DQ_type.Value = n_dq; %default to aSME (if available) or end of list -where_aSME = strcmpi('aSME',type_names); -where_aSME_corr = strcmpi('aSME (Corrected)',type_names); +where_aSME = strcmpi('aSME',type_names); +where_aSME_corr = strcmpi('aSME (Corrected)',type_names); if any(where_aSME) - indx_type = find(where_aSME); + indx_type = find(where_aSME); -elseif any(where_aSME_corr) - indx_type = find(where_aSME_corr); +elseif any(where_aSME_corr) + indx_type = find(where_aSME_corr); else - indx_type = n_dq; + indx_type = n_dq; end handles.popupmenu_DQ_type.Value = indx_type; try -[n_elec, n_tw, n_bin] = size(ERP.dataquality(indx_type).data); %default to aSME (or last metric) + [n_elec, n_tw, n_bin] = size(ERP.dataquality(indx_type).data); %default to aSME (or last metric) catch -[n_elec, n_tw, n_bin] = size(ERP.dataquality.data); %if only one measure + [n_elec, n_tw, n_bin] = size(ERP.dataquality.data); %if only one measure end if n_elec == 0 @@ -159,24 +159,21 @@ function DQ_Table_GUI_OpeningFcn(hObject, eventdata, handles, varargin) n_bin = ERP.nbin; end -bin_names = numel(ERP.bindescr); -if bin_names == n_bin +n_bin_names = numel(ERP.bindescr); +if n_bin_names == n_bin + for i=1:n_bin - n_bin_names{i} = ['BIN ' num2str(i) ' - ' ERP.bindescr{i}]; + bin_names{i} = ['BIN ' num2str(i) ' - ' ERP.bindescr{i}]; end -elseif bin_names ~= n_bin +else % if not every bin has a bin description, leave then off - for i=1:bin_names - if i <= n_bin - n_bin_names{i} = ['BIN ' num2str(i) ' - ' ERP.bindescr{i}]; - elseif i > n_bin - n_bin_names{i} = ['BIN ' num2str(i) ' - NO DQ INFO EXISTS' ]; - end + for i=1:n_bin + bin_names{i} = ['BIN ' num2str(i)]; end end -handles.popupmenu_bin.String = n_bin_names; +handles.popupmenu_bin.String = bin_names; % handles.popupmenu_DQ_type.Value saves the indx of the selected DQ Measure selected_DQ_type = handles.popupmenu_DQ_type.Value; @@ -187,30 +184,30 @@ function DQ_Table_GUI_OpeningFcn(hObject, eventdata, handles, varargin) pSEM = 0; pointwise_str = {'Point-wise SEM', 'Point-wise SEM, GrandAvg RMS', ... - 'Point-wise SEM Pool ERPSETs, RMS GrandAvg Combine','Point-wise SEM Pool ERPSETs, mean GrandAvg combine',... - 'Point-wise SEM (Corrected), GrandAvg RMS', ... - 'Point-wise SEM Pool ERPSETs(Corrected), RMS GrandAvg Combine',... - 'Point-wise SEM Pool ERPSETs(Corrected), mean GrandAvg combine'}; + 'Point-wise SEM Pool ERPSETs, RMS GrandAvg Combine','Point-wise SEM Pool ERPSETs, mean GrandAvg combine',... + 'Point-wise SEM (Corrected), GrandAvg RMS', ... + 'Point-wise SEM Pool ERPSETs(Corrected), RMS GrandAvg Combine',... + 'Point-wise SEM Pool ERPSETs(Corrected), mean GrandAvg combine'}; -handles.pointwise_str = pointwise_str; +handles.pointwise_str = pointwise_str; if isempty(table_data) %check if potentially pointwise SEM if any(strcmpi(pointwise_str, ERP.dataquality(selected_DQ_type).type)) && isempty(ERP.binerror) == 0 table_data = ERP.binerror(:,:,selected_bin); - pSEM = 1; + pSEM = 1; -% elseif strcmp(ERP.dataquality(selected_DQ_type).type,'Point-wise SEM (Corrected)') && isempty(ERP.binerror) == 0 -% table_data = ERP.binerror(:,:,selected_bin); -% pSEM = 1; -% - - else + % elseif strcmp(ERP.dataquality(selected_DQ_type).type,'Point-wise SEM (Corrected)') && isempty(ERP.binerror) == 0 + % table_data = ERP.binerror(:,:,selected_bin); + % pSEM = 1; + % + + else % Data empty here. table_data = nan(1); disp('DQ data not found for this DQ type and bin. Perhaps it has been cleared?'); end - + end @@ -222,14 +219,14 @@ function DQ_Table_GUI_OpeningFcn(hObject, eventdata, handles, varargin) for i=1:n_elec elec_labels{i} = ERP.chanlocs(i).labels; end -else - +else + for i=1:ERP.nchan elec_labels{i} = i; end end handles.dq_table.RowName = elec_labels; -handles.orig_RowName = elec_labels; +handles.orig_RowName = elec_labels; % Time-window labels if isfield(ERP.dataquality(selected_DQ_type),'time_window_labels') && isempty(ERP.dataquality(selected_DQ_type).time_window_labels) == 0 && handles.checkbox_text_labels.Value == 1 @@ -254,7 +251,11 @@ function DQ_Table_GUI_OpeningFcn(hObject, eventdata, handles, varargin) % Set font size of DQ Table desired_fontsize = erpworkingmemory('fontsizeGUI'); -handles.dq_table.FontSize = desired_fontsize; +try + handles.dq_table.FontSize = desired_fontsize; +catch + handles.dq_table.FontSize =11; +end handles.heatmap_on = 0; % @@ -262,31 +263,31 @@ function DQ_Table_GUI_OpeningFcn(hObject, eventdata, handles, varargin) % nchan = ERP.nchan; % Total number of channels if ~isfield(ERP.chanlocs,'labels') - for e=1:nchan - ERP.chanlocs(e).labels = ['Ch' num2str(e)]; - end + for e=1:nchan + ERP.chanlocs(e).labels = ['Ch' num2str(e)]; + end end listch = {''}; for ch =1:nchan - listch{ch} = [num2str(ch) ' = ' ERP.chanlocs(ch).labels ]; + listch{ch} = [num2str(ch) ' = ' ERP.chanlocs(ch).labels ]; end handles.listch = listch; -chanArray = 1:ERP.nchan; %default +chanArray = 1:ERP.nchan; %default handles.indxlistch = chanArray; %default -handles.orig_indxlistch = chanArray; +handles.orig_indxlistch = chanArray; set(handles.chwindow, 'String', vect2colon(chanArray, 'Delimiter', 'off')); % Set outliers text window off -set(handles.stdwindow,'Enable','Off'); +set(handles.stdwindow,'Enable','Off'); set(handles.chwindow,'Enable','Off'); set(handles.chbutton,'Enable','Off'); set(handles.sdcorrection,'Enable','Off'); -set(handles.sdcorrection,'Visible','Off'); +set(handles.sdcorrection,'Visible','Off'); %set outliers value in handles off initially -handles.outliers_on = 0; +handles.outliers_on = 0; % Update handles structure handles.ERP = ERP; @@ -297,6 +298,25 @@ function DQ_Table_GUI_OpeningFcn(hObject, eventdata, handles, varargin) else handles.ALLERP = ALLERP; end +handles.checkbox_heatmap.BackgroundColor = [0.94 0.94 0.94]; +handles.checkbox_outliers.BackgroundColor = [0.94 0.94 0.94]; +handles.checkbox_text_labels.BackgroundColor = [0.94 0.94 0.94]; +handles.chbutton.BackgroundColor = [0.94 0.94 0.94]; +handles.text13.BackgroundColor = [0.94 0.94 0.94]; +handles.text6.BackgroundColor = [0.94 0.94 0.94]; +handles.text_ERPSET_title.BackgroundColor = [0.94 0.94 0.94]; +handles.text_DQ_type.BackgroundColor = [0.94 0.94 0.94]; +handles.text9.BackgroundColor = [0.94 0.94 0.94]; +handles.pushbutton_mat.BackgroundColor = [1 1 1]; +handles.pushbutton_xls.BackgroundColor = [1 1 1]; +handles.text11.BackgroundColor = [0.94 0.94 0.94]; +handles.pushbutton_selERP.BackgroundColor = [1 1 1]; +handles.pushbutton_help.BackgroundColor = [1 1 1]; +handles.pushbutton_done.BackgroundColor = [1 1 1]; +handles.chbutton.BackgroundColor = [1 1 1]; +handles.text12.BackgroundColor = [0.94 0.94 0.94]; +handles.stdwindow.BackgroundColor = [1 1 1]; +handles.chwindow.BackgroundColor = [1 1 1]; guidata(hObject, handles); @@ -333,30 +353,33 @@ function popupmenu_DQ_type_Callback(hObject, eventdata, handles) % handles.popupmenu_DQ_type.Value saves the indx of the selected DQ Measure selected_DQ_type = handles.popupmenu_DQ_type.Value; selected_bin = handles.popupmenu_bin.Value; -pointwise_str = handles.pointwise_str; +pointwise_str = handles.pointwise_str; % Check data exists, plot if isempty(handles.ERP.dataquality(selected_DQ_type).data) % if pointwise SEM, use ERP.binerror if any(strcmpi(pointwise_str, handles.ERP.dataquality(selected_DQ_type).type)) && isempty(handles.ERP.binerror) == 0 - table_data = real(handles.ERP.binerror(:,:,selected_bin)); + table_data = handles.ERP.binerror(:,:,selected_bin); else + % elseif strcmp(handles.ERP.dataquality(selected_DQ_type).type,'Point-wise SEM (Corrected)') && isempty(handles.ERP.binerror) == 0 + % table_data = handles.ERP.binerror(:,:,selected_bin); + % else + % + + % Data empty here. table_data = nan(1); disp('DQ data not found for this DQ type and bin. Perhaps it has been cleared?'); end - -elseif selected_bin > length(handles.ERP.dataquality(1).data) - table_data = nan(1); - disp('DQ data not found for this DQ type and bin. Perhaps it has been cleared?'); else % data is present and correct - + + if strcmp(handles.ERP.dataquality(selected_DQ_type).type,'SD Across Trials') && isempty(handles.ERP.binerror) == 0 table_data = handles.ERP.dataquality(selected_DQ_type).data.SD_bias(:,:,selected_bin); %SD (Divided by N-1) set(handles.sdcorrection,'Enable','On'); - set(handles.sdcorrection,'Visible','On'); + set(handles.sdcorrection,'Visible','On'); else table_data = handles.ERP.dataquality(selected_DQ_type).data(:,:,selected_bin); set(handles.sdcorrection,'Enable','Off'); @@ -365,6 +388,10 @@ function popupmenu_DQ_type_Callback(hObject, eventdata, handles) end +handles.dq_table.Data = table_data; +handles.orig_data = table_data; + + % Time-window labels clear tw_labels ERP = handles.ERP; @@ -375,10 +402,6 @@ function popupmenu_DQ_type_Callback(hObject, eventdata, handles) [n_elec, n_tw, n_bin] = size(ERP.dataquality(selected_DQ_type).data); end -if selected_DQ_type == 2 % if Point-wise SEM - [n_elec, n_tw, n_bin] = size(ERP.dataquality(selected_DQ_type-1).data); -end - if isfield(ERP.dataquality(selected_DQ_type),'time_window_labels') && isempty(ERP.dataquality(selected_DQ_type).time_window_labels) == 0 && handles.checkbox_text_labels.Value == 1 tw_labels = ERP.dataquality(selected_DQ_type).time_window_labels; elseif isempty(ERP.dataquality(selected_DQ_type).times) @@ -392,38 +415,17 @@ function popupmenu_DQ_type_Callback(hObject, eventdata, handles) end handles.dq_table.ColumnName = tw_labels; -bin_names = numel(ERP.bindescr); -% Bin refresh -if bin_names == n_bin - for i=1:n_bin - n_bin_names{i} = ['BIN ' num2str(i) ' - ' ERP.bindescr{i}]; - end -elseif bin_names ~= n_bin - % if not every bin has a bin description, leave then off - for i=1:bin_names - if i <= n_bin - n_bin_names{i} = ['BIN ' num2str(i) ' - ' ERP.bindescr{i}]; - elseif i > n_bin - n_bin_names{i} = ['BIN ' num2str(i) ' - NO DQ INFO EXISTS' ]; - end - end -end - -handles.popupmenu_bin.String = n_bin_names; -handles.dq_table.Data = table_data; -handles.orig_data = table_data; - if handles.heatmap_on redraw_heatmap(hObject, eventdata, handles); end -if handles.outliers_on - clear_heatmap(hObject, eventdata, handles); - handles.heatmap_on = 0; - - redraw_outliers(hObject, eventdata, handles); - set(handles.checkbox_outliers,'Value',1); +if handles.outliers_on + clear_heatmap(hObject, eventdata, handles); + handles.heatmap_on = 0; + + redraw_outliers(hObject, eventdata, handles); + set(handles.checkbox_outliers,'Value',1); end @@ -456,51 +458,48 @@ function popupmenu_bin_Callback(hObject, eventdata, handles) % handles.popupmenu_DQ_type.Value saves the indx of the selected DQ Measure selected_DQ_type = handles.popupmenu_DQ_type.Value; selected_bin = handles.popupmenu_bin.Value; -pointwise_str = handles.pointwise_str; +pointwise_str = handles.pointwise_str; % Check data exists, plot if isempty(handles.ERP.dataquality(selected_DQ_type).data) % if pointwise SEM, use ERP.binerror - if any(strcmpi(pointwise_str,handles.ERP.dataquality(selected_DQ_type).type)) && isempty(handles.ERP.binerror) == 0 - table_data = real(handles.ERP.binerror(:,:,selected_bin)); + if any(strcmpi(pointwise_str,handles.ERP.dataquality(selected_DQ_type).type)) && isempty(handles.ERP.binerror) == 0 + table_data = handles.ERP.binerror(:,:,selected_bin); else % Data empty here. table_data = nan(1); disp('DQ data not found for this DQ type and bin. Perhaps it has been cleared?'); end - -elseif selected_bin > length(handles.ERP.dataquality(1).data) - table_data = nan(1); - disp('DQ data not found for this DQ type and bin. Perhaps it has been cleared?'); else % data is present and correct table_data = handles.ERP.dataquality(selected_DQ_type).data(:,:,selected_bin); end + handles.dq_table.Data = table_data; handles.orig_data = table_data; %if user switches bin and both heatmap & outliers on, %use shortcircuit to clear outliers and redraw heatmap only -if handles.heatmap_on %|| handles.outliers_on +if handles.heatmap_on %|| handles.outliers_on clear_outliers(hObject, eventdata, handles); redraw_heatmap(hObject, eventdata, handles); - %turn outliers off + %turn outliers off handles.outliers = 0; - set(handles.checkbox_outliers,'Value',0); + set(handles.checkbox_outliers,'Value',0); end %if only outliers on, then clear heatmap and redraw outliers -if handles.outliers_on - clear_heatmap(hObject, eventdata, handles); - handles.heatmap_on = 0; - - redraw_outliers(hObject, eventdata, handles); - set(handles.checkbox_outliers,'Value',1); +if handles.outliers_on + clear_heatmap(hObject, eventdata, handles); + handles.heatmap_on = 0; + + redraw_outliers(hObject, eventdata, handles); + set(handles.checkbox_outliers,'Value',1); end @@ -535,7 +534,7 @@ function checkbox_text_labels_Callback(hObject, eventdata, handles) % table_data = handles.ERP.dataquality(selected_DQ_type).data.SD_bias(:,:,selected_bin); % else % table_data = handles.ERP.dataquality(selected_DQ_type).data(:,:,selected_bin); -% +% % end % handles.dq_table.Data = table_data; % handles.orig_data = table_data; @@ -568,8 +567,8 @@ function checkbox_text_labels_Callback(hObject, eventdata, handles) end - % Update handles structure - guidata(hObject, handles); +% Update handles structure +guidata(hObject, handles); % --- Executes on button press in pushbutton_xls. @@ -579,7 +578,7 @@ function pushbutton_xls_Callback(hObject, eventdata, handles) % handles structure with handles and user data (see GUIDATA) empty_filename = []; selected_DQ_type = handles.popupmenu_DQ_type.Value; -%sd_correction = handles.sdcorrection.Value; +%sd_correction = handles.sdcorrection.Value; save_data_quality(handles.ERP,empty_filename,'xlsx',selected_DQ_type) @@ -631,26 +630,27 @@ function checkbox_heatmap_Callback(hObject, eventdata, handles) heatmap_on = get(hObject,'Value'); if heatmap_on == 1 - + %if heatmap_on, then outliers not possible so clear outliers clear_outliers(hObject, eventdata, handles); - handles.outliers_on = 0; - set(handles.checkbox_outliers, 'Value', 0); - + handles.outliers_on = 0; + set(handles.checkbox_outliers, 'Value', 0); + redraw_heatmap(hObject, eventdata, handles); handles.heatmap_on = 1; -else +else clear_heatmap(hObject, eventdata, handles); handles.heatmap_on = 0; + %if outliers is on, then keep outliers active if handles.outliers_on == 1 - redraw_outliers(hObject, eventdata,handles); + redraw_outliers(hOBject, eventdata,handles); end end % Update handles structure guidata(hObject, handles); - + function redraw_heatmap(hObject, eventdata, handles) @@ -735,8 +735,8 @@ function pushbutton_selERP_Callback(hObject, eventdata, handles) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) selected_erpset = handles.newerpwin.Value; -sel_ERP = handles.ALLERP(selected_erpset); -DQ_Table_GUI(sel_ERP, handles.ALLERP, selected_erpset,2); +sel_ERP = handles.ALLERP(selected_erpset); +DQ_Table_GUI(sel_ERP, handles.ALLERP, selected_erpset,2); % --- Executes on button press in checkbox_outliers. @@ -750,11 +750,11 @@ function checkbox_outliers_Callback(hObject, eventdata, handles) % Hint: get(hObject,'Value') returns toggle state of checkbox_heatmap outliers_on = get(hObject,'Value'); % this is not the same as handles.outliers_on -if outliers_on == 1 +if outliers_on == 1 set(handles.stdwindow,'Enable','On'); set(handles.chwindow,'Enable','On'); set(handles.chbutton,'Enable','On'); -else +else set(handles.stdwindow,'Enable','Off'); set(handles.chwindow,'Enable','Off'); set(handles.chbutton,'Enable','Off'); @@ -764,7 +764,7 @@ function checkbox_outliers_Callback(hObject, eventdata, handles) if outliers_on == 1 handles.outliers_on = 1; else - handles.outliers_on = 0; + handles.outliers_on = 0; end @@ -775,15 +775,15 @@ function checkbox_outliers_Callback(hObject, eventdata, handles) if handles.heatmap_on == 1 clear_heatmap(hObject, eventdata, handles); - handles.heatmap_on = 0; - set(handles.checkbox_heatmap, 'Value', 0); + handles.heatmap_on = 0; + set(handles.checkbox_heatmap, 'Value', 0); %handles.outliers_on = 1; redraw_outliers(hObject, eventdata, handles); else %handles.outliers_on = 1; - clear_outliers(hObject, eventdata, handles); + clear_outliers(hObject, eventdata, handles); %guidata(hObject, handles); redraw_outliers(hObject, eventdata, handles); @@ -792,19 +792,19 @@ function checkbox_outliers_Callback(hObject, eventdata, handles) else %but if outliers is off, and heatmap is wanted, you can do it -% if handles.heatmap_on ==1 -% -% clear_outliers(hObject, eventdata, handles); -% redraw_heatmap(hObject, eventdata, handles); -% handles.outliers_on = 0; -% -% else -% clear_outliers(hObject, eventdata, handles); -% handles.outliers_on = 0; -% -% end + % if handles.heatmap_on ==1 + % + % clear_outliers(hObject, eventdata, handles); + % redraw_heatmap(hObject, eventdata, handles); + % handles.outliers_on = 0; + % + % else + % clear_outliers(hObject, eventdata, handles); + % handles.outliers_on = 0; + % + % end - %also, redraw initial data/channels without outliers + %also, redraw initial data/channels without outliers clear_outliers(hObject, eventdata, handles) end @@ -813,54 +813,54 @@ function checkbox_outliers_Callback(hObject, eventdata, handles) % %if heatmap is currently on, stop it and turn its states off % %before applying outliers fxn % if handles.heatmap_on == 1 -% +% % clear_heatmap(hObject, eventdata, handles); -% handles.heatmap_on = 0; -% set(handles.checkbox_heatmap, 'Value', 0); -% +% handles.heatmap_on = 0; +% set(handles.checkbox_heatmap, 'Value', 0); +% % if outliers_on == 1 % handles.outliers_on = 1; % redraw_outliers(hObject, eventdata, handles); % else -% +% % set(handles.stdwindow,'Enable','Off'); % set(handles.chwindow,'Enable','Off'); -% set(handles.chbutton,'Enable','Off'); +% set(handles.chbutton,'Enable','Off'); % clear_outliers(hObject, eventdata, handles); -% handles.outliers_on = 0; -% +% handles.outliers_on = 0; +% % end -% +% % else -% +% % if outliers_on == 1 % handles.outliers_on = 1; % redraw_outliers(hObject, eventdata, handles); -% else +% else % set(handles.stdwindow,'Enable','Off'); % set(handles.chwindow,'Enable','Off'); -% set(handles.chbutton,'Enable','Off'); +% set(handles.chbutton,'Enable','Off'); % clear_outliers(hObject, eventdata, handles); -% handles.outliers_on = 0; -% -% end -% +% handles.outliers_on = 0; +% +% end +% % end % Update handles structure guidata(hObject, handles); -function redraw_outliers(hObject, eventdata, handles) -handles = guidata(hObject); %get the most updated handles struct +function redraw_outliers(hObject, eventdata, handles) +handles = guidata(hObject); %get the most updated handles struct data = handles.dq_table.Data; -if iscell(data) +if iscell(data) %in case of new std from stdwindow data = handles.orig_data; end -%either default(all) or from chbutton -chans_to_use = handles.indxlistch; -data = data(chans_to_use,:); +%either default(all) or from chbutton +chans_to_use = handles.indxlistch; +data = data(chans_to_use,:); n_elec = length(chans_to_use); ERPtouse = handles.ERP.chanlocs; @@ -874,9 +874,9 @@ function redraw_outliers(hObject, eventdata, handles) %compute outliers as X standard deviations from mean across channels -col_means = mean(data,1); +col_means = mean(data,1); col_std = std(data,0,1); -chosen_std = str2double((handles.stdwindow.String)); +chosen_std = str2double((handles.stdwindow.String)); % Use this @ anonymous function to make HTML tag in box in loop below colergen = @(color,text) ['
',text,'
']; @@ -884,7 +884,7 @@ function redraw_outliers(hObject, eventdata, handles) for cell = 1:numel(data) data_here = data(cell); - [d_row,d_col] = ind2sub(size(data),cell); + [d_row,d_col] = ind2sub(size(data),cell); neg_thresh = col_means(d_col) - (chosen_std*col_std(d_col)); pos_thresh = col_means(d_col) + (chosen_std*col_std(d_col)); @@ -906,14 +906,14 @@ function clear_outliers(hObject, eventdata, handles) %handles = guidata(hObject); handles.dq_table.Data = handles.orig_data; handles.dq_table.RowName = handles.orig_RowName; -handles.indxlistch = handles.orig_indxlistch; +handles.indxlistch = handles.orig_indxlistch; % Re-Prepare List of current Channels -chanArray = handles.orig_indxlistch; %default +chanArray = handles.orig_indxlistch; %default %handles.indxlistch = chanArray; %default set(handles.chwindow, 'String', vect2colon(chanArray, 'Delimiter', 'off')); - % Update handles structure +% Update handles structure guidata(hObject, handles); @@ -926,7 +926,7 @@ function stdwindow_Callback(hObject, eventdata, handles) % handles structure with handles and user data (see GUIDATA) newstd = get(hObject,'String'); -handles.stdwindow.String= newstd; +handles.stdwindow.String= newstd; redraw_outliers(hObject, eventdata, handles); guidata(hObject, handles); @@ -960,61 +960,61 @@ function chwindow_Callback(hObject, eventdata, handles) % Hints: get(hObject,'String') returns contents of chwindow as text % str2double(get(hObject,'String')) returns contents of chwindow as a double -ch = get(hObject,'string'); +ch = get(hObject,'string'); nch = length(handles.listch); -ch_val = eval(ch); +ch_val = eval(ch); if ~isempty(ch) -% testch = regexpi(ch,':') ; -% -% if isempty(testch) -% -% try -% ch_val = eval(ch); -% handles.listch(ch_val); %attempt to index -% -% catch -% msgboxText = 'Invalid channel input: please enter channels as integers, with a space between each number, or ch1:chN array syntax'; -% title = 'ERPLAB: channel GUI input'; -% errorfound(msgboxText, title); -% -% end -% else -% ch_val = eval(ch); -% -% end -% - - tf = checkchannels(ch_val, nch, 1); + % testch = regexpi(ch,':') ; + % + % if isempty(testch) + % + % try + % ch_val = eval(ch); + % handles.listch(ch_val); %attempt to index + % + % catch + % msgboxText = 'Invalid channel input: please enter channels as integers, with a space between each number, or ch1:chN array syntax'; + % title = 'ERPLAB: channel GUI input'; + % errorfound(msgboxText, title); + % + % end + % else + % ch_val = eval(ch); + % + % end + % + + tf = checkchannels(ch_val, nch, 1); if tf return end - -% if length(ch_val) > length(handles.orig_indxlistch) -% msgboxText = 'Exceeded Number of Available Channels'; -% title = 'ERPLAB: channel GUI input'; -% errorfound(msgboxText, title); -% return -% end -% + + % if length(ch_val) > length(handles.orig_indxlistch) + % msgboxText = 'Exceeded Number of Available Channels'; + % title = 'ERPLAB: channel GUI input'; + % errorfound(msgboxText, title); + % return + % end + % set(handles.chwindow, 'String', vect2colon(ch_val, 'Delimiter', 'off')); handles.indxlistch = ch_val; % Update handles structure guidata(hObject, handles); redraw_outliers(hObject, eventdata, handles); guidata(hObject, handles); - + else msgboxText = 'Not valid channel'; title = 'ERPLAB: channel GUI input'; errorfound(msgboxText, title); return end - + % --- Executes during object creation, after setting all properties. @@ -1039,31 +1039,31 @@ function chbutton_Callback(hObject, eventdata, handles) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) listch = handles.listch; %true channels list as labels -indxlistch = handles.indxlistch; %true array of channel indexs +indxlistch = handles.indxlistch; %true array of channel indexs indxlistch = indxlistch(indxlistch<=length(listch)); % true array of channel index if less than expected labels titlename = 'Select Channel(s)'; if get(hObject, 'Value') - if ~isempty(listch) - ch = browsechanbinGUI(listch, indxlistch, titlename); - if ~isempty(ch) - set(handles.chwindow, 'String', vect2colon(ch, 'Delimiter', 'off')); - handles.indxlistch = ch; - % Update handles structure - guidata(hObject, handles); - redraw_outliers(hObject, eventdata, handles); - guidata(hObject, handles); - - - else - disp('User selected Cancel') - return - end + if ~isempty(listch) + ch = browsechanbinGUI(listch, indxlistch, titlename); + if ~isempty(ch) + set(handles.chwindow, 'String', vect2colon(ch, 'Delimiter', 'off')); + handles.indxlistch = ch; + % Update handles structure + guidata(hObject, handles); + redraw_outliers(hObject, eventdata, handles); + guidata(hObject, handles); + + else - msgboxText = 'No channel information was found'; - title = 'ERPLAB: ploterp GUI input'; - errorfound(msgboxText, title); - return + disp('User selected Cancel') + return end + else + msgboxText = 'No channel information was found'; + title = 'ERPLAB: ploterp GUI input'; + errorfound(msgboxText, title); + return + end end @@ -1081,9 +1081,8 @@ function active_erpset_Callback(hObject, eventdata, handles) % handles structure with handles and user data (see GUIDATA) newactive = get(hObject,'Value'); -ERPs = handles.ALLERP; -ERP = ERPs(newactive); -handles.ERP = ERP; +ERPs = handles.ALLERP; +ERP = ERPs(newactive); n_dq = numel(ERP.dataquality); for i=1:n_dq @@ -1091,10 +1090,10 @@ function active_erpset_Callback(hObject, eventdata, handles) end handles.popupmenu_DQ_type.String = type_names; -%handles.popupmenu_DQ_type.Value = n_dq; +handles.popupmenu_DQ_type.Value = n_dq; -[n_elec, n_tw, n_bin] = size(ERP.dataquality(handles.popupmenu_DQ_type.Value).data); +[n_elec, n_tw, n_bin] = size(ERP.dataquality(n_dq).data); if n_elec == 0 % if the dq data is of zero size, then the 3rd dim may be mis-sized. @@ -1102,74 +1101,41 @@ function active_erpset_Callback(hObject, eventdata, handles) n_bin = ERP.nbin; end -bin_names = numel(ERP.bindescr); -if bin_names == n_bin +n_bin_names = numel(ERP.bindescr); +if n_bin_names == n_bin + for i=1:n_bin - n_bin_names{i} = ['BIN ' num2str(i) ' - ' ERP.bindescr{i}]; + bin_names{i} = ['BIN ' num2str(i) ' - ' ERP.bindescr{i}]; end -elseif bin_names ~= n_bin +else % if not every bin has a bin description, leave then off - for i=1:bin_names - if i <= n_bin - n_bin_names{i} = ['BIN ' num2str(i) ' - ' ERP.bindescr{i}]; - elseif i > n_bin - n_bin_names{i} = ['BIN ' num2str(i) ' - NO DQ INFO EXISTS' ]; - end + for i=1:n_bin + bin_names{i} = ['BIN ' num2str(i)]; end end -handles.popupmenu_bin.String = n_bin_names; + +handles.popupmenu_bin.String = bin_names; % handles.popupmenu_DQ_type.Value saves the indx of the selected DQ Measure selected_DQ_type = handles.popupmenu_DQ_type.Value; selected_bin = handles.popupmenu_bin.Value; -if selected_bin > length(handles.ERP.bindescr) % this fixes issue when switching to ERP with fewer bins - selected_bin = 1; - handles.popupmenu_bin.Value = selected_bin; -else -end - - -% if pointwise SEM, do the following (DRG 05/2024): -if isempty(handles.ERP.dataquality(selected_DQ_type).data) - - % if pointwise SEM, use ERP.binerror - if selected_DQ_type == 2 && isempty(handles.ERP.binerror) == 0 - table_data = real(handles.ERP.binerror(:,:,selected_bin)); - else - - % Data empty here. - table_data = nan(1); - disp('DQ data not found for this DQ type and bin. Perhaps it has been cleared?'); - end - - elseif selected_bin > length(handles.ERP.dataquality(1).data) - table_data = nan(1); - disp('DQ data not found for this DQ type and bin. Perhaps it has been cleared?'); - -else - % data is present and correct - table_data = handles.ERP.dataquality(selected_DQ_type).data(:,:,selected_bin); -end - +table_data = ERP.dataquality(selected_DQ_type).data(:,:,selected_bin); handles.dq_table.Data = table_data; handles.orig_data = table_data; -% electrode labels from ERPset, if present and number matches - +% electrode labels from ERPset, iff present and number matches if isfield(ERP.chanlocs,'labels') && numel(ERP.chanlocs) == n_elec for i=1:n_elec elec_labels{i} = ERP.chanlocs(i).labels; end else - + for i=1:ERP.nchan - elec_labels{i} = ERP.chanlocs(i).labels; - + elec_labels{i} = i; end end - handles.dq_table.RowName = elec_labels; % Time-window labels @@ -1182,68 +1148,51 @@ function active_erpset_Callback(hObject, eventdata, handles) tw_labels{i} = [num2str(ERP.dataquality(selected_DQ_type).times(i,1)) ' : ' num2str(ERP.dataquality(selected_DQ_type).times(i,2))]; end end - -% Time-window labels for SEM (DRG 05/2024): -if n_tw == 0 && selected_DQ_type ~= 2 +if n_tw == 0 tw_labels = 'No data here. Perhaps it was cleared?'; -elseif n_tw == 0 && selected_DQ_type == 2 - tw_labels = []; end - handles.dq_table.ColumnName = tw_labels; - + % Set font size of DQ Table desired_fontsize = erpworkingmemory('fontsizeGUI'); handles.dq_table.FontSize = desired_fontsize; - - -% DRG 05/2024 -% We want heatmap to remain on when users switch erpset -if handles.heatmap_on == 1 - redraw_heatmap(hObject, eventdata, handles); -end - -% We want outliers to remain on when users switch erpset -if handles.outliers_on == 1 - redraw_outliers(hObject, eventdata, handles); -end - +handles.heatmap_on = handles.checkbox_heatmap.Value; % % Prepare List of current Channels % nchan = ERP.nchan; % Total number of channels if ~isfield(ERP.chanlocs,'labels') - for e=1:nchan - ERP.chanlocs(e).labels = ['Ch' num2str(e)]; - end + for e=1:nchan + ERP.chanlocs(e).labels = ['Ch' num2str(e)]; + end end listch = {''}; for ch =1:nchan - listch{ch} = [num2str(ch) ' = ' ERP.chanlocs(ch).labels ]; + listch{ch} = [num2str(ch) ' = ' ERP.chanlocs(ch).labels ]; end handles.listch = listch; -chanArray = 1:ERP.nchan; %default +chanArray = 1:ERP.nchan; %default handles.indxlistch = chanArray; %default set(handles.chwindow, 'String', vect2colon(chanArray, 'Delimiter', 'off')); % Set outliers text window off -set(handles.stdwindow,'Enable','Off'); +set(handles.stdwindow,'Enable','Off'); set(handles.chwindow,'Enable','Off'); -set(handles.chbutton,'Enable','Off'); +set(handles.chbutton,'Enable','Off'); % Update handles structure handles.ERP = ERP; -handles.ALLERP = ERPs; +handles.ALLERP = ERPs; %clear all perviously set options -% set(handles.checkbox_outliers,'Value',0); +set(handles.checkbox_outliers,'Value',0); % set(handles.checkbox_heatmap,'Value',0); -% set(handles.checkbox_text_labels,'Value',0); +set(handles.checkbox_text_labels,'Value',0); set(handles.stdwindow,'Enable','Off'); set(handles.chwindow,'Enable','Off'); set(handles.chbutton,'Enable','Off'); @@ -1251,25 +1200,25 @@ function active_erpset_Callback(hObject, eventdata, handles) %check to see if outliers is on prior to switching active erpset? %checkbox_outliers_Callback(hObject, eventdata, handles) -% outliers_on = get(handles.checkbox_outliers,'Value'); -% -% if outliers_on == 1 -% handles.outliers_on = 1; -% set(handles.stdwindow,'Enable','On'); -% set(handles.chwindow,'Enable','On'); -% set(handles.chbutton,'Enable','On'); -% redraw_outliers(hObject, eventdata, handles); -% -% else -% handles.heatmap_on = 0; -% set(handles.stdwindow,'Enable','Off'); -% set(handles.chwindow,'Enable','Off'); -% set(handles.chbutton,'Enable','Off'); -% clear_outliers(hObject, eventdata, handles); -% -% -% end -%handles.popupmenu_bin.String = bin_names; +heatmap_on = handles.heatmap_on ; +if heatmap_on == 1 + + %if heatmap_on, then outliers not possible so clear outliers + clear_outliers(hObject, eventdata, handles); + handles.outliers_on = 0; + set(handles.checkbox_outliers, 'Value', 0); + redraw_heatmap(hObject, eventdata, handles); + handles.heatmap_on = 1; +else + clear_heatmap(hObject, eventdata, handles); + handles.heatmap_on = 0; + + %if outliers is on, then keep outliers active + if handles.outliers_on == 1 + redraw_outliers(hOBject, eventdata,handles); + end +end + guidata(hObject, handles); % Hints: contents = cellstr(get(hObject,'String')) returns active_erpset contents as cell array @@ -1292,7 +1241,7 @@ function active_erpset_CreateFcn(hObject, eventdata, handles) function tf = checkchannels(chx, nchan, showmsg) if nargin<3 - showmsg = 1; + showmsg = 1; end tf = 0; % no problem by default @@ -1307,42 +1256,42 @@ function active_erpset_CreateFcn(hObject, eventdata, handles) end if isempty(chx) - if showmsg - msgboxText = 'Invalid channel indexing.'; - title = 'ERPLAB: basicfilterGUI() error:'; - errorfound(msgboxText, title); - end - tf = 1; % - return + if showmsg + msgboxText = 'Invalid channel indexing.'; + title = 'ERPLAB: basicfilterGUI() error:'; + errorfound(msgboxText, title); + end + tf = 1; % + return end if ~isempty(find(chx>nchan)) - if showmsg - msgboxText = ['You only have %g channels,\n'... - 'so you cannot specify indices greater than this.']; - title = 'ERPLAB: basicfilterGUI() error:'; - errorfound(sprintf(msgboxText, nchan), title); - end - tf = 1; % - return + if showmsg + msgboxText = ['You only have %g channels,\n'... + 'so you cannot specify indices greater than this.']; + title = 'ERPLAB: basicfilterGUI() error:'; + errorfound(sprintf(msgboxText, nchan), title); + end + tf = 1; % + return end if ~isempty(find(chx<1)) - if showmsg - msgboxText = 'You cannot use zero or a negative number as a channel indexing'; - title = 'ERPLAB: basicfilterGUI() error:'; - errorfound(msgboxText, title); - end - tf = 1; % - return + if showmsg + msgboxText = 'You cannot use zero or a negative number as a channel indexing'; + title = 'ERPLAB: basicfilterGUI() error:'; + errorfound(msgboxText, title); + end + tf = 1; % + return end if length(chx)>length(unique_bc2(chx)) - if showmsg - msgboxText = ['Repeated channels are not allowed.\n'... - 'Therefore, ERPLAB will get rid of them.']; - title = 'ERPLAB: basicfilterGUI() error:'; - errorfound(sprintf(msgboxText), title, [1 1 0], [0 0 0], 0) - end - tf = 0; % - return + if showmsg + msgboxText = ['Repeated channels are not allowed.\n'... + 'Therefore, ERPLAB will get rid of them.']; + title = 'ERPLAB: basicfilterGUI() error:'; + errorfound(sprintf(msgboxText), title, [1 1 0], [0 0 0], 0) + end + tf = 0; % + return end @@ -1366,3 +1315,10 @@ function sdcorrection_Callback(hObject, eventdata, handles) guidata(hObject, handles); % Hint: get(hObject,'Value') returns toggle state of sdcorrection + + +% --- Executes during object creation, after setting all properties. +function checkbox_outliers_CreateFcn(hObject, eventdata, handles) +% hObject handle to checkbox_outliers (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called diff --git a/GUIs/abouterplabGUI.fig b/GUIs/abouterplabGUI.fig index de92c5e918e929340c693cbb0999bdd001313177..41f8cf378d885b771609834228b5b0e2cab3417b 100755 GIT binary patch literal 22457 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 delta 5309 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 Phd(9l0}ucJfk8D17U6>r diff --git a/GUIs/abouterplabGUI.m b/GUIs/abouterplabGUI.m index 60449b9a..f7a12d7b 100755 --- a/GUIs/abouterplabGUI.m +++ b/GUIs/abouterplabGUI.m @@ -31,19 +31,19 @@ % Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... - 'gui_Singleton', gui_Singleton, ... - 'gui_OpeningFcn', @abouterplabGUI_OpeningFcn, ... - 'gui_OutputFcn', @abouterplabGUI_OutputFcn, ... - 'gui_LayoutFcn', [] , ... - 'gui_Callback', []); + 'gui_Singleton', gui_Singleton, ... + 'gui_OpeningFcn', @abouterplabGUI_OpeningFcn, ... + 'gui_OutputFcn', @abouterplabGUI_OutputFcn, ... + 'gui_LayoutFcn', [] , ... + 'gui_Callback', []); if nargin && ischar(varargin{1}) - gui_State.gui_Callback = str2func(varargin{1}); + gui_State.gui_Callback = str2func(varargin{1}); end if nargout - [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); + [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else - gui_mainfcn(gui_State, varargin{:}); + gui_mainfcn(gui_State, varargin{:}); end % ----------------------------------------------------------------------- @@ -52,19 +52,30 @@ function abouterplabGUI_OpeningFcn(hObject, eventdata, handles, varargin) handles.running = 1; handles.numfig = 1; try - if ispc - opengl software - end + if ispc + opengl software + end catch end [version, reldate] = geterplabversion; howold = num2str(datenum(date)-datenum(reldate)); -set(handles.gui_chassis,'Name', ['ABOUT ERPLAB ' version ' (' howold ' days old)']) +ERPtooltype = erpgettoolversion('tooltype'); +handles.ERPtooltype=ERPtooltype; +if strcmpi(ERPtooltype,'estudio') + set(handles.gui_chassis,'Name', ['ABOUT Estudio ' version ' (' howold ' days old)']); + handles.pushbutton_erpinfo.String = 'ESTUDIOINFO'; +else + set(handles.gui_chassis,'Name', ['ABOUT ERPLAB ' version ' (' howold ' days old)']); + handles.pushbutton_erpinfo.String = 'ERPINFO'; +end p = which('eegplugin_erplab'); p = p(1:findstr(p,'eegplugin_erplab.m')-1); - -fid_about = fopen( fullfile(p, 'GUIs', 'aboutext.txt')); +if strcmpi(ERPtooltype,'estudio') + fid_about = fopen( fullfile(p, 'GUIs', 'aboutext_estudio.txt')); +else + fid_about = fopen( fullfile(p, 'GUIs', 'aboutext.txt')); +end formcell = textscan(fid_about, '%s','delimiter', '#'); firstline = {['ERPLAB version ' version]}; handles.textabout = cat(1,firstline, formcell{:}); @@ -72,15 +83,15 @@ function abouterplabGUI_OpeningFcn(hObject, eventdata, handles, varargin) handles.fontcred = 10; try - posgui = erpworkingmemory('abouterplabGUI'); - xfig = posgui(1); - yfig = posgui(2); + posgui = erpworkingmemory('abouterplabGUI'); + xfig = posgui(1); + yfig = posgui(2); catch - valscr = get(0,'MonitorPosition'); - % posgui = plotset.ptime.posgui; - % set(handles.gui_chassis,'Position', posgui) - xfig = min(valscr(:,3))/2; % half width screen pos - yfig = 300; % half width screen pos + valscr = get(0,'MonitorPosition'); + % posgui = plotset.ptime.posgui; + % set(handles.gui_chassis,'Position', posgui) + xfig = min(valscr(:,3))/2; % half width screen pos + yfig = 300; % half width screen pos end % @@ -100,120 +111,120 @@ function abouterplabGUI_OpeningFcn(hObject, eventdata, handles, varargin) % ----------------------------------------------------------------------- function playcredit(numfig, xfig, yfig, hObject, eventdata, handles) try - textabout = handles.textabout; - fontcred = handles.fontcred; - [banner, fcolor1, fcolor2, info ] = loadtheme(numfig, hObject, eventdata, handles); - %set(handles.gui_chassis, 'Position', [xfig-(0.6*info.Width) 100 1.2*info.Width 1.1*info.Height]) - set(handles.gui_chassis, 'Position', [xfig yfig 1.2*info.Width 1.1*info.Height]) - set(handles.axes1, 'Visible', 'off', 'Units', 'pixels', 'Position', [0 50 1.2*info.Width info.Height]) - set(handles.text_cover,'Position', [0 0 1.2*info.Width 0.007*info.Height]); - wb = 88; - hb = 40.92; - yb = 6.38; - wfig = get(handles.gui_chassis, 'Position'); - nbuttons = 5; % number of buttons - kk = 1/(nbuttons*1.03); - x1 = wfig(3)*kk-9*wb/10; - x2 = wfig(3)*2*kk-9*wb/10; - x3 = wfig(3)*3*kk-9*wb/10; - x4 = wfig(3)*4*kk-9*wb/10; - x5 = wfig(3)*5*kk-9*wb/10; - set(handles.pushbutton_erpinfo,'Units', 'pixels'); - set(handles.pushbutton_publication,'Units', 'pixels'); - set(handles.pushbutton_relaunch,'Units', 'pixels'); - set(handles.pushbutton_youtube,'Units', 'pixels'); - set(handles.pushbutton_close,'Units', 'pixels'); - set(handles.pushbutton_erpinfo,'Position', [x1 yb wb hb]); - set(handles.pushbutton_publication,'Position', [x2 yb wb hb]); - set(handles.pushbutton_relaunch,'Position', [x3 yb wb hb]); - set(handles.pushbutton_youtube,'Position', [x4 yb wb hb]); - set(handles.pushbutton_close,'Position', [x5 yb wb hb]); - - axes(handles.axes1) - holgu = 0.12*info.Width; - dimmer = 0.98*sin(0:pi/160:0.8*pi); %[0:9 9 9 9 9:-1:4]; - banner = loadtheme(numfig, hObject, eventdata, handles); - i=1; - - % - % dim the light down effect - % - while i<=length(dimmer) && get(handles.pushbutton_close,'Value')==0 && get(handles.pushbutton_relaunch,'Value')==0 - image(banner); - set(handles.axes1, 'Visible', 'off', 'Units', 'pixels', 'Xlim',[-holgu info.Width+holgu]); - alpha(dimmer(i)) - drawnow - i=i+1; - %pause(0.15) + textabout = handles.textabout; + fontcred = handles.fontcred; + [banner, fcolor1, fcolor2, info ] = loadtheme(numfig, hObject, eventdata, handles); + %set(handles.gui_chassis, 'Position', [xfig-(0.6*info.Width) 100 1.2*info.Width 1.1*info.Height]) + set(handles.gui_chassis, 'Position', [xfig yfig 1.2*info.Width 1.1*info.Height]) + set(handles.axes1, 'Visible', 'off', 'Units', 'pixels', 'Position', [0 50 1.2*info.Width info.Height]) + set(handles.text_cover,'Position', [0 0 1.2*info.Width 0.007*info.Height]); + wb = 88; + hb = 40.92; + yb = 6.38; + wfig = get(handles.gui_chassis, 'Position'); + nbuttons = 5; % number of buttons + kk = 1/(nbuttons*1.03); + x1 = wfig(3)*kk-9*wb/10; + x2 = wfig(3)*2*kk-9*wb/10; + x3 = wfig(3)*3*kk-9*wb/10; + x4 = wfig(3)*4*kk-9*wb/10; + x5 = wfig(3)*5*kk-9*wb/10; + set(handles.pushbutton_erpinfo,'Units', 'pixels'); + set(handles.pushbutton_publication,'Units', 'pixels'); + set(handles.pushbutton_relaunch,'Units', 'pixels'); + set(handles.pushbutton_youtube,'Units', 'pixels'); + set(handles.pushbutton_close,'Units', 'pixels'); + set(handles.pushbutton_erpinfo,'Position', [x1 yb wb hb]); + set(handles.pushbutton_publication,'Position', [x2 yb wb hb]); + set(handles.pushbutton_relaunch,'Position', [x3 yb wb hb]); + set(handles.pushbutton_youtube,'Position', [x4 yb wb hb]); + set(handles.pushbutton_close,'Position', [x5 yb wb hb]); + + axes(handles.axes1) + holgu = 0.12*info.Width; + dimmer = 0.98*sin(0:pi/160:0.8*pi); %[0:9 9 9 9 9:-1:4]; + banner = loadtheme(numfig, hObject, eventdata, handles); + i=1; + + % + % dim the light down effect + % + while i<=length(dimmer) && get(handles.pushbutton_close,'Value')==0 && get(handles.pushbutton_relaunch,'Value')==0 + image(banner); + set(handles.axes1, 'Visible', 'off', 'Units', 'pixels', 'Xlim',[-holgu info.Width+holgu]); + alpha(dimmer(i)) + drawnow + i=i+1; + %pause(0.15) + end + + % + % Displaying text + % + namefont = 'Arial'; + mleft = -holgu*0.65; + kbottom = 2.1; + i = 0; + banner = loadtheme(numfig, hObject, eventdata, handles); + while i<=2.72*info.Height && get(handles.pushbutton_close,'Value')==0 && get(handles.pushbutton_relaunch,'Value')==0 + text(mleft, kbottom*info.Height-i, textabout,'FontName', namefont, 'Fontsize', fontcred,'Color', fcolor1) + drawnow + image(banner); + set(handles.axes1, 'Visible', 'off', 'Units', 'pixels', 'Xlim',[-holgu info.Width+holgu]); + alpha(dimmer(end)) + i = i + 1; + end + + % + % checking "Theme" button + % + if get(handles.pushbutton_relaunch,'Value')==1 + set(handles.pushbutton_relaunch,'Value', 0) + numfig = round(rand*9) + 1; + while numfig==handles.numfig + numfig = round(rand*9) + 1; end - - % - % Displaying text - % - namefont = 'Arial'; - mleft = -holgu*0.65; - kbottom = 2.1; - i = 0; - banner = loadtheme(numfig, hObject, eventdata, handles); - while i<=2.72*info.Height && get(handles.pushbutton_close,'Value')==0 && get(handles.pushbutton_relaunch,'Value')==0 - text(mleft, kbottom*info.Height-i, textabout,'FontName', namefont, 'Fontsize', fontcred,'Color', fcolor1) - drawnow - image(banner); - set(handles.axes1, 'Visible', 'off', 'Units', 'pixels', 'Xlim',[-holgu info.Width+holgu]); - alpha(dimmer(end)) - i = i + 1; - end - - % - % checking "Theme" button - % - if get(handles.pushbutton_relaunch,'Value')==1 - set(handles.pushbutton_relaunch,'Value', 0) - numfig = round(rand*9) + 1; - while numfig==handles.numfig - numfig = round(rand*9) + 1; - end - handles.numfig = numfig; - % Update handles structure - guidata(hObject, handles); - - posgui = get(handles.gui_chassis,'Position'); - xfig = posgui(1); - yfig = posgui(2); - playcredit(numfig, xfig, yfig, hObject, eventdata, handles) - return - end - - % - % dim the light up effect - % - i=length(dimmer); - while i>length(dimmer)/2 && get(handles.pushbutton_close,'Value')==0 && get(handles.pushbutton_relaunch,'Value')==0 - image(banner); - set(handles.axes1, 'Visible', 'off', 'Units', 'pixels', 'Xlim',[-holgu info.Width+holgu]); - alpha(dimmer(i)) - drawnow - i=i-1; - %pause(0.15) - end - - handles.running = 0; + handles.numfig = numfig; % Update handles structure guidata(hObject, handles); - if get(handles.pushbutton_close,'Value')==1 - delete(handles.gui_chassis) - end + posgui = get(handles.gui_chassis,'Position'); + xfig = posgui(1); + yfig = posgui(2); + playcredit(numfig, xfig, yfig, hObject, eventdata, handles) return + end + + % + % dim the light up effect + % + i=length(dimmer); + while i>length(dimmer)/2 && get(handles.pushbutton_close,'Value')==0 && get(handles.pushbutton_relaunch,'Value')==0 + image(banner); + set(handles.axes1, 'Visible', 'off', 'Units', 'pixels', 'Xlim',[-holgu info.Width+holgu]); + alpha(dimmer(i)) + drawnow + i=i-1; + %pause(0.15) + end + + handles.running = 0; + % Update handles structure + guidata(hObject, handles); + + if get(handles.pushbutton_close,'Value')==1 + delete(handles.gui_chassis) + end + return catch - try - posgui = get(handles.gui_chassis,'Position'); - erpworkingmemory('abouterplabGUI', posgui); - catch - end - if handles.running == 0; - delete(handles.gui_chassis) - end + try + posgui = get(handles.gui_chassis,'Position'); + erpworkingmemory('abouterplabGUI', posgui); + catch + end + if handles.running == 0; + delete(handles.gui_chassis) + end end % ----------------------------------------------------------------------- @@ -221,7 +232,7 @@ function pushbutton_close_Callback(hObject, eventdata, handles) posgui = get(handles.gui_chassis,'Position'); erpworkingmemory('abouterplabGUI', posgui); if handles.running == 0; - delete(handles.gui_chassis) + delete(handles.gui_chassis) end % ----------------------------------------------------------------------- @@ -231,8 +242,8 @@ function pushbutton_relaunch_Callback(hObject, eventdata, handles) yfig = posgui(2); if handles.running==0 - %abouterplabGUI - playcredit(1, xfig, yfig, hObject, eventdata, handles) + %abouterplabGUI + playcredit(1, xfig, yfig, hObject, eventdata, handles) end % ----------------------------------------------------------------------- @@ -242,10 +253,14 @@ function pushbutton_erpinfo_Callback(hObject, eventdata, handles) set(handles.pushbutton_close,'Value', 1) if handles.running == 0; - delete(handles.gui_chassis) + delete(handles.gui_chassis) end pause(0.2) -web('https://github.com/lucklab/erplab/','-browser') +if strcmpi(handles.ERPtooltype,'estudio') + web('https://github.com/lucklab/erplab/','-browser') +else + web('https://github.com/lucklab/erplab/','-browser') +end % ----------------------------------------------------------------------- function pushbutton_publication_Callback(hObject, eventdata, handles) @@ -254,29 +269,37 @@ function pushbutton_publication_Callback(hObject, eventdata, handles) set(handles.pushbutton_close,'Value', 1) if handles.running == 0; - delete(handles.gui_chassis) + delete(handles.gui_chassis) end pause(0.2) -web('http://journal.frontiersin.org/article/10.3389/fnhum.2014.00213/abstract','-browser') - +if strcmpi(handles.ERPtooltype,'estudio') + +else + web('http://journal.frontiersin.org/article/10.3389/fnhum.2014.00213/abstract','-browser') +end % ----------------------------------------------------------------------- function [banner, fcolor1, fcolor2, info ] = loadtheme(numfig, hObject, eventdata, handles) if numfig==8 || numfig==1 - set(handles.gui_chassis,'Color',[0 0 0]); - set(handles.text_cover,'BackgroundColor',[0 0 0]); - fcolor1 = [1 1 1]; - fcolor2 = [0 0 0]; + set(handles.gui_chassis,'Color',[0 0 0]); + set(handles.text_cover,'BackgroundColor',[0 0 0]); + fcolor1 = [1 1 1]; + fcolor2 = [0 0 0]; else - set(handles.gui_chassis,'Color',[1 1 1]); - set(handles.text_cover,'BackgroundColor',[1 1 1]); - fcolor1 = [0 0 0]; - fcolor2 = [1 1 1]; + set(handles.gui_chassis,'Color',[1 1 1]); + set(handles.text_cover,'BackgroundColor',[1 1 1]); + fcolor1 = [0 0 0]; + fcolor2 = [1 1 1]; end %if numfig==9 % namefig = 'logoerplab2010ny.jpg'; %else +ERPtooltype = handles.ERPtooltype; +if strcmpi(ERPtooltype,'estudio') + namefig = ['EstudioLogo.jpg']; +else namefig = ['logoerplab' num2str(numfig) '.jpg']; +end %end set(hObject, 'Units', 'pixels'); @@ -293,14 +316,14 @@ function pushbutton_publication_Callback(hObject, eventdata, handles) % bindx = ismember_bc2(edmask(:,:,2),255); % cindx = ismember_bc2(edmask(:,:,3),0); % edmask = repmat(aindx&bindx&cindx, [1 1 3]); -% +% % edsum = edition; % aindx = ~ismember_bc2(edsum(:,:,1),12); % bindx = ~ismember_bc2(edsum(:,:,2),255); % cindx = ~ismember_bc2(edsum(:,:,3),0); % edsum = repmat(aindx&bindx&cindx, [1 1 3]); % edsum = edition.*edsum; -% +% % banner = banner .* edmask; % banner = banner + edsum*0.9; @@ -316,23 +339,26 @@ function pushbutton_youtube_Callback(hObject, eventdata, handles) set(handles.pushbutton_close,'Value', 1) if handles.running == 0; - delete(handles.gui_chassis) + delete(handles.gui_chassis) end pause(0.2) -web('https://github.com/lucklab/erplab/wiki/Videos','-browser') - +if strcmpi(handles.ERPtooltype,'estudio') + +else + web('https://github.com/lucklab/erplab/wiki/Videos','-browser') +end %-------------------------------------------------------------------------- function gui_chassis_CloseRequestFcn(hObject, eventdata, handles) posgui = get(handles.gui_chassis,'Position'); erpworkingmemory('abouterplabGUI', posgui); if get(handles.pushbutton_close,'Value')==1 % in case of problems... - delete(handles.gui_chassis) + delete(handles.gui_chassis) end % or set(handles.pushbutton_close,'Value', 1) % normal closing if handles.running == 0; - delete(handles.gui_chassis) + delete(handles.gui_chassis) end diff --git a/GUIs/aboutext_estudio.txt b/GUIs/aboutext_estudio.txt new file mode 100644 index 00000000..103a791d --- /dev/null +++ b/GUIs/aboutext_estudio.txt @@ -0,0 +1,71 @@ +# +# +ERPLAB Studio designed by Steve Luck, Guanghui Zhang, and Andrew X Stewart# +# +Main developers of ERPLAB Studio: # +Guanghui Zhang # +ghzhang@ucdavis.edu # +Andrew X Stewart # +axstewart@ucdavis.edu # +Center for Mind and Brain, University of California, Davis # +# +# +Find latest on Github: +https://github.com/lucklab/erplab +# +# +Makes extensive use of: # +ERPLAB Classic designed by Javier Lopez-Calderon and Steve Luck # +at UC Davis # +and EEGLAB Toolbox designed by Scott Makeig and Arnauld Delorme # +at UCSD. # +# +ERPLAB Studio Development Assistants: # +Carter Luck # +# +UC-Davis Testing Team: # +[To be added]. # +# +# +# +This is not commercial software, and bugs can happen # +In some cases, errors will occur leading to a message that # +instructs you to report the error to the EEGLAB developers. # +If this happens, please report the error to erplabtoolbox@gmail.com # +and not to the EEGLAB developers. ERPLAB has primarily been # +tested using EEG collected with a Biosemi ActiveTwo System, # +along with a smaller amount of testing using EEG collected # +with Neuroscan and EGI systems. Consequently, you should be # +particularly careful when using this version of ERPLAB with # +data collected with systems other than the Biosemi ActiveTwo. # +# +# +This program is free software: you can redistribute it and/or # +modify it under the terms of the GNU General Public License # +as published by the Free Software Foundation, either version # +3 of the License, or at your option) any later version. # +# +This program is distributed in the hope that it will be useful, # +but WITHOUT ANY WARRANTY; without even the implied warranty of # +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # +See the GNU General Public License for more details. # +# +This software is intended for research purposes only and is # +not approved for use in medical diagnosis or treatment. # +# +You should have received a copy of the GNU General Public # +License long with this program. If not, see # +. # +# +# +# +# +# +# +# +# +# +# +Davis, California # +a great place to live, work, and study # +# diff --git a/GUIs/artifactinterpGUI.fig b/GUIs/artifactinterpGUI.fig index c42bb3dd0da897aaae59b02b0ef0f9bce2a9a9a2..13351e8417f0f31a4532a83dcc75ad67f5643c40 100755 GIT binary patch literal 36744 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 literal 37623 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 I20)<4M{h5D`Tzg` diff --git a/GUIs/artifactinterpGUI.m b/GUIs/artifactinterpGUI.m index 752a2b83..09ba0508 100755 --- a/GUIs/artifactinterpGUI.m +++ b/GUIs/artifactinterpGUI.m @@ -43,7 +43,7 @@ % Edit the above text to modify the response to help artifactinterpGUI -% Last Modified by GUIDE v2.5 31-May-2023 11:45:41 +% Last Modified by GUIDE v2.5 25-Apr-2024 15:15:16 % Begin initialization code - DO NOT EDIT gui_Singleton = 1; @@ -179,7 +179,7 @@ function artifactinterpGUI_OpeningFcn(hObject, eventdata, handles, varargin) set(handles.flag_1, 'Value',1); %flag 1 is reserved set(handles.flag_1, 'Enable', 'inactive');% flag 1 is pressed but inactive %set(handles.flag_1, 'Visible', 'off'); -set(handles.radiobutton1, 'Enable', 'inactive'); +set(handles.radiobutton1, 'Enable', 'on'); %set(handles.radiobutton1, 'Visibile', 'off'); %set interpolate method choice @@ -337,7 +337,7 @@ function pushbutton_interpolate_Callback(hObject, eventdata, handles) % handles structure with handles and user data (see GUIDATA) %query flag selected -for i=2:8 %only flags 2-8 for now +for i=1:8 %only flags 2-8 for now if get(handles.(['radiobutton' num2str(i)]),'Value') handles.flagx = i; end; @@ -348,7 +348,6 @@ function pushbutton_interpolate_Callback(hObject, eventdata, handles) error_msg = sprintf('Error: No flags on epoched data. Cannot selectively interpolate epochs!'); error(error_msg); - end %query interpolation method @@ -356,7 +355,7 @@ function pushbutton_interpolate_Callback(hObject, eventdata, handles) if get(handles.radiobutton_spherical,'Value') handles.methodx = 'spherical'; else - handles.methodx = 'inverse_distance'; + handles.methodx = 'invdist'; end %query channel selected @@ -509,12 +508,12 @@ function flag_2_CreateFcn(hObject, eventdata, handles) % --- Executes on button press in pushbutton_help. -function pushbutton_help_Callback(hObject, eventdata, handles) -% hObject handle to pushbutton_help (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) -web('https://github.com/lucklab/erplab/wiki/Artifact-Detection-in-Epoched-Data#ERPLAB-Post-Artifact-Detection-Epoch-Interpolation',... - '-browser'); +% function pushbutton_help_Callback(hObject, eventdata, handles) +% % hObject handle to pushbutton_help (see GCBO) +% % eventdata reserved - to be defined in a future version of MATLAB +% % handles structure with handles and user data (see GUIDATA) +% web('https://github.com/lucklab/erplab/wiki/Artifact-Detection-in-Epoched-Data#ERPLAB-Post-Artifact-Detection-Epoch-Interpolation',... +% '-browser'); % --- Executes on button press in pushbutton_cancel. @@ -718,3 +717,12 @@ function pushbutton14_Callback(hObject, eventdata, handles) %set channels popup menu set(handles.popupmenu1, 'string', listch); + + +% --- Executes on button press in radiobutton2. +function radiobutton2_Callback(hObject, eventdata, handles) +% hObject handle to radiobutton2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hint: get(hObject,'Value') returns toggle state of radiobutton2 diff --git a/GUIs/basicfilterGUI2.fig b/GUIs/basicfilterGUI2.fig index 5d697c6370be70048e61f87703984373e6954185..b4cc7962f78cba2d603e58982516e18c762ca8d0 100755 GIT binary patch delta 70863 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 && valueh<=handles.maxsliders-5 - set(handles.slider_lowpass, 'Value', valueh); - valuehstr = sprintf('%.1f', valueh); - set(handles.edit_highpass, 'String', valuehstr); - else - if valueh<5 - nvaln = 5; - elseif valueh>handles.maxsliders-5 - nvaln = handles.maxsliders-5; - end - - nvalstr = sprintf('%.1f',nvaln); - set(handles.edit_highpass, 'String', nvalstr); - set(handles.slider_highpass, 'Value', nvaln); + if valueh>=5 && valueh<=handles.maxsliders-5 + set(handles.slider_lowpass, 'Value', valueh); + valuehstr = sprintf('%.1f', valueh); + set(handles.edit_highpass, 'String', valuehstr); + else + if valueh<5 + nvaln = 5; + elseif valueh>handles.maxsliders-5 + nvaln = handles.maxsliders-5; end + + nvalstr = sprintf('%.1f',nvaln); + set(handles.edit_highpass, 'String', nvalstr); + set(handles.slider_highpass, 'Value', nvaln); + end else - if tonhp - if valueh==0 - set(handles.edit_highpass, 'String', '0'); - set(handles.edit_highpass, 'Enable', 'off'); - set(handles.togglebutton_highpass, 'Value', 0); - set(handles.slider_highpass, 'Enable','off'); - set(handles.checkbox_removedc, 'Enable', 'off') - %set(handles.edit_highpass, 'BackgroundColor', [0.75 0.75 0.75]); - set(handles.togglebutton_highpass, 'BackgroundColor', [0.8 0.8 0.75]); - else - valuehstr = sprintf('%.1f', valueh); - set(handles.edit_highpass, 'String', valuehstr); - set(handles.edit_highpass, 'Enable', 'on'); - set(handles.checkbox_removedc, 'Enable', 'on') - %set(handles.edit_highpass, 'BackgroundColor', [1 1 1]); - end + if tonhp + if valueh==0 + set(handles.edit_highpass, 'String', '0'); + set(handles.edit_highpass, 'Enable', 'off'); + set(handles.togglebutton_highpass, 'Value', 0); + set(handles.slider_highpass, 'Enable','off'); + set(handles.checkbox_removedc, 'Enable', 'off') + %set(handles.edit_highpass, 'BackgroundColor', [0.75 0.75 0.75]); + set(handles.togglebutton_highpass, 'BackgroundColor', [0.8 0.8 0.75]); else - set(handles.edit_highpass, 'String', '0'); - set(handles.edit_highpass, 'Enable', 'off'); - set(handles.togglebutton_highpass, 'Value', 0); - set(handles.slider_highpass, 'Enable','off'); - set(handles.checkbox_removedc, 'Enable', 'off') - %set(handles.edit_highpass, 'BackgroundColor', [0.75 0.75 0.75]); + valuehstr = sprintf('%.1f', valueh); + set(handles.edit_highpass, 'String', valuehstr); + set(handles.edit_highpass, 'Enable', 'on'); + set(handles.checkbox_removedc, 'Enable', 'on') + %set(handles.edit_highpass, 'BackgroundColor', [1 1 1]); end + else + set(handles.edit_highpass, 'String', '0'); + set(handles.edit_highpass, 'Enable', 'off'); + set(handles.togglebutton_highpass, 'Value', 0); + set(handles.slider_highpass, 'Enable','off'); + set(handles.checkbox_removedc, 'Enable', 'off') + %set(handles.edit_highpass, 'BackgroundColor', [0.75 0.75 0.75]); + end end if typef==0 && autorder==1 - % order starts again for auto butter - orderlist = cellstr(get(handles.popupmenu_order, 'String')); % whole list - orderlist{1} = 'automin:2'; - set(handles.popupmenu_order, 'String', orderlist); - set(handles.popupmenu_order, 'Value',1); - set(handles.popupmenu_dboct, 'Value',1); - set(handles.popupmenu_dbdec, 'Value',1); + % order starts again for auto butter + orderlist = cellstr(get(handles.popupmenu_order, 'String')); % whole list + orderlist{1} = 'automin:2'; + set(handles.popupmenu_order, 'String', orderlist); + set(handles.popupmenu_order, 'Value',1); + set(handles.popupmenu_dboct, 'Value',1); + set(handles.popupmenu_dbdec, 'Value',1); end % % Plot corresponding response % if get(handles.radiobutton_fdatafr,'Value') - plotresponse_fd_data(hObject, eventdata, handles) + plotresponse_fd_data(hObject, eventdata, handles) elseif get(handles.radiobutton_freqr,'Value') || get(handles.radiobutton_impr,'Value') - plotresponsefilter(hObject, eventdata, handles); + plotresponsefilter(hObject, eventdata, handles); end % ------------------------------------------------------------------------- function slider_highpass_CreateFcn(hObject, eventdata, handles) if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor',[.9 .9 .9]); + set(hObject,'BackgroundColor',[.9 .9 .9]); end %-------------------------------------------------------------------------- @@ -292,26 +315,26 @@ function slider_lowpass_Callback(hObject, eventdata, handles) fs = handles.fs; if valuel<0.1; - valuel = 0; - set(handles.slider_lowpass, 'Value', 0); + valuel = 0; + set(handles.slider_lowpass, 'Value', 0); end if valuel>round(fs/10) && (get(handles.radiobutton_freqr,'Value') || get(handles.radiobutton_fdatafr,'Value')) - handles.xmaxfreqr = [0 round(fs/2)]; %100 - set(handles.edit_xmaxplot, 'String', sprintf('%d %d', handles.xmaxfreqr)); - % Update handles structure - guidata(hObject, handles); + handles.xmaxfreqr = [0 round(fs/2)]; %100 + set(handles.edit_xmaxplot, 'String', sprintf('%d %d', handles.xmaxfreqr)); + % Update handles structure + guidata(hObject, handles); elseif valuel<=round(fs/10) && (get(handles.radiobutton_freqr,'Value') || get(handles.radiobutton_fdatafr,'Value')) - handles.xmaxfreqr = [0 round(fs/10)]; %100 - set(handles.edit_xmaxplot, 'String', sprintf('%d %d', handles.xmaxfreqr)); - % Update handles structure - guidata(hObject, handles); + handles.xmaxfreqr = [0 round(fs/10)]; %100 + set(handles.edit_xmaxplot, 'String', sprintf('%d %d', handles.xmaxfreqr)); + % Update handles structure + guidata(hObject, handles); end if get(handles.radiobutton_butter, 'Value'); - typef = 0; % 0 means Butterworth + typef = 0; % 0 means Butterworth elseif get(handles.radiobutton_fir, 'Value'); - typef = 1;% 1 means FIR + typef = 1;% 1 means FIR elseif get(handles.radiobutton_PM_notch, 'Value'); - typef = 2; % 2 means PM Notch + typef = 2; % 2 means PM Notch end autorder = handles.autorder; @@ -322,54 +345,54 @@ function slider_lowpass_Callback(hObject, eventdata, handles) order = getorder(handles); if isempty(order) - return + return end tonlp = get(handles.togglebutton_lowpass, 'Value'); if tonlp - if valuel==0 - set(handles.edit_lowpass, 'String', '0'); - set(handles.edit_lowpass, 'Enable', 'off'); - set(handles.togglebutton_lowpass, 'Value', 0); - set(handles.slider_lowpass, 'Enable','off'); - %set(handles.edit_lowpass, 'BackgroundColor', [0.75 0.75 0.75]); - set(handles.togglebutton_lowpass, 'BackgroundColor', [0.8 0.8 0.75]); - else - valuelstr = sprintf('%.1f', valuel); - set(handles.edit_lowpass, 'String', valuelstr); - set(handles.edit_lowpass, 'Enable', 'on'); - %set(handles.edit_lowpass, 'BackgroundColor', [1 1 1]); - end -else + if valuel==0 set(handles.edit_lowpass, 'String', '0'); set(handles.edit_lowpass, 'Enable', 'off'); set(handles.togglebutton_lowpass, 'Value', 0); set(handles.slider_lowpass, 'Enable','off'); %set(handles.edit_lowpass, 'BackgroundColor', [0.75 0.75 0.75]); + set(handles.togglebutton_lowpass, 'BackgroundColor', [0.8 0.8 0.75]); + else + valuelstr = sprintf('%.1f', valuel); + set(handles.edit_lowpass, 'String', valuelstr); + set(handles.edit_lowpass, 'Enable', 'on'); + %set(handles.edit_lowpass, 'BackgroundColor', [1 1 1]); + end +else + set(handles.edit_lowpass, 'String', '0'); + set(handles.edit_lowpass, 'Enable', 'off'); + set(handles.togglebutton_lowpass, 'Value', 0); + set(handles.slider_lowpass, 'Enable','off'); + %set(handles.edit_lowpass, 'BackgroundColor', [0.75 0.75 0.75]); end if typef==0 && autorder==1 - % order starts again for auto butter - orderlist = cellstr(get(handles.popupmenu_order, 'String')); % whole list - orderlist{1} = 'automin:2'; - set(handles.popupmenu_order, 'String', orderlist); - set(handles.popupmenu_order, 'Value',1); - set(handles.popupmenu_dboct, 'Value',1); - set(handles.popupmenu_dbdec, 'Value',1); + % order starts again for auto butter + orderlist = cellstr(get(handles.popupmenu_order, 'String')); % whole list + orderlist{1} = 'automin:2'; + set(handles.popupmenu_order, 'String', orderlist); + set(handles.popupmenu_order, 'Value',1); + set(handles.popupmenu_dboct, 'Value',1); + set(handles.popupmenu_dbdec, 'Value',1); end % % Plot corresponding response % if get(handles.radiobutton_fdatafr,'Value') - plotresponse_fd_data(hObject, eventdata, handles) + plotresponse_fd_data(hObject, eventdata, handles) elseif get(handles.radiobutton_freqr,'Value') || get(handles.radiobutton_impr,'Value') - plotresponsefilter(hObject, eventdata, handles); + plotresponsefilter(hObject, eventdata, handles); end %-------------------------------------------------------------------------- function slider_lowpass_CreateFcn(hObject, eventdata, handles) if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor',[.9 .9 .9]); + set(hObject,'BackgroundColor',[.9 .9 .9]); end %-------------------------------------------------------------------------- @@ -379,26 +402,26 @@ function popupmenu_order_Callback(hObject, eventdata, handles) orderlist = cellstr(get(handles.popupmenu_order, 'String')); if orderindx==1 - orderlist = regexprep(orderlist,'automin:','','ignorecase'); %get rid of auto: (if any) - newlaborder = ['automin:' orderlist{2}]; - orderlist{1} = newlaborder; - set(handles.popupmenu_order,'String', orderlist); - handles.autorder = 1; - - if get(handles.radiobutton_butter,'Value') - order = str2num(strrep(orderlist{1},'automin:','')); % get rid of auto (in case of) - set(handles.popupmenu_dboct,'Value', 1); - set(handles.popupmenu_dbdec,'Value', 1); - end + orderlist = regexprep(orderlist,'automin:','','ignorecase'); %get rid of auto: (if any) + newlaborder = ['automin:' orderlist{2}]; + orderlist{1} = newlaborder; + set(handles.popupmenu_order,'String', orderlist); + handles.autorder = 1; + + if get(handles.radiobutton_butter,'Value') + order = str2num(strrep(orderlist{1},'automin:','')); % get rid of auto (in case of) + set(handles.popupmenu_dboct,'Value', 1); + set(handles.popupmenu_dbdec,'Value', 1); + end else - orderlist{1} = 'automin'; - set(handles.popupmenu_order,'String', orderlist); - handles.autorder = 0; - - if get(handles.radiobutton_butter,'Value') - set(handles.popupmenu_dboct,'Value', orderindx-1); - set(handles.popupmenu_dbdec,'Value', orderindx-1); - end + orderlist{1} = 'automin'; + set(handles.popupmenu_order,'String', orderlist); + handles.autorder = 0; + + if get(handles.radiobutton_butter,'Value') + set(handles.popupmenu_dboct,'Value', orderindx-1); + set(handles.popupmenu_dbdec,'Value', orderindx-1); + end end % Update handles structure @@ -407,16 +430,16 @@ function popupmenu_order_Callback(hObject, eventdata, handles) % Plot corresponding response % if get(handles.radiobutton_fdatafr,'Value') - plotresponse_fd_data(hObject, eventdata, handles) + plotresponse_fd_data(hObject, eventdata, handles) elseif get(handles.radiobutton_freqr,'Value') || get(handles.radiobutton_impr,'Value') - plotresponsefilter(hObject, eventdata, handles); + plotresponsefilter(hObject, eventdata, handles); end %-------------------------------------------------------------------------- function popupmenu_order_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); + set(hObject,'BackgroundColor','white'); end %-------------------------------------------------------------------------- @@ -425,110 +448,110 @@ function edit_highpass_Callback(hObject, eventdata, handles) valueh = str2num(get(handles.edit_highpass, 'String')); if length(valueh)~=1 - msgboxText = 'Invalid input for high pass cutoff'; - title = 'ERPLAB: basicfilterGUI2() error'; - errorfound(msgboxText, title); - return + msgboxText = 'Invalid input for high pass cutoff'; + title = 'ERPLAB: basicfilterGUI2() error'; + errorfound(msgboxText, title); + return end if valueh<0.001; - set(handles.edit_highpass, 'String', num2str(handles.maxsliders)) - set(handles.slider_highpass, 'Value', handles.maxsliders); - set(handles.slider_highpass, 'Enable', 'on'); - set(handles.togglebutton_highpass, 'Value', 1); - set(handles.togglebutton_highpass, 'BackgroundColor', [1 1 0.5]); - plotresponsefilter(hObject, eventdata, handles); - return + set(handles.edit_highpass, 'String', num2str(handles.maxsliders)) + set(handles.slider_highpass, 'Value', handles.maxsliders); + set(handles.slider_highpass, 'Enable', 'on'); + set(handles.togglebutton_highpass, 'Value', 1); + set(handles.togglebutton_highpass, 'BackgroundColor', [1 1 0.5]); + plotresponsefilter(hObject, eventdata, handles); + return end if valueh<0 - msgboxText = 'Invalid input for high pass cutoff'; - title = 'ERPLAB: basicfilterGUI2() error'; - errorfound(msgboxText, title); - set(handles.edit_highpass, 'String', '0') - set(handles.edit_highpass, 'Enable', 'off') - %set(handles.edit_highpass, 'BackgroundColor', [0.75 0.75 0.75]); - set(handles.slider_highpass, 'Value', 0); - set(handles.slider_highpass, 'Enable', 'off'); - set(handles.togglebutton_highpass, 'Value', 0); - set(handles.togglebutton_highpass, 'BackgroundColor', [0.8 0.8 0.75]); - plotresponsefilter(hObject, eventdata, handles); - return + msgboxText = 'Invalid input for high pass cutoff'; + title = 'ERPLAB: basicfilterGUI2() error'; + errorfound(msgboxText, title); + set(handles.edit_highpass, 'String', '0') + set(handles.edit_highpass, 'Enable', 'off') + %set(handles.edit_highpass, 'BackgroundColor', [0.75 0.75 0.75]); + set(handles.slider_highpass, 'Value', 0); + set(handles.slider_highpass, 'Enable', 'off'); + set(handles.togglebutton_highpass, 'Value', 0); + set(handles.togglebutton_highpass, 'BackgroundColor', [0.8 0.8 0.75]); + plotresponsefilter(hObject, eventdata, handles); + return end if valueh>handles.maxsliders - msgboxText = 'Too high!!!'; - title = 'ERPLAB: basicfilterGUI2() error'; - errorfound(msgboxText, title); - set(handles.edit_highpass, 'String', num2str(handles.maxsliders)) - set(handles.slider_highpass, 'Value', handles.maxsliders); - set(handles.slider_highpass, 'Enable', 'on'); - set(handles.togglebutton_highpass, 'Value', 1); - set(handles.togglebutton_highpass, 'BackgroundColor', [1 1 0.5]); - plotresponsefilter(hObject, eventdata, handles); - return + msgboxText = 'Too high!!!'; + title = 'ERPLAB: basicfilterGUI2() error'; + errorfound(msgboxText, title); + set(handles.edit_highpass, 'String', num2str(handles.maxsliders)) + set(handles.slider_highpass, 'Value', handles.maxsliders); + set(handles.slider_highpass, 'Enable', 'on'); + set(handles.togglebutton_highpass, 'Value', 1); + set(handles.togglebutton_highpass, 'BackgroundColor', [1 1 0.5]); + plotresponsefilter(hObject, eventdata, handles); + return end set(handles.edit_highpass, 'String', num2str(valueh)); autorder = handles.autorder; if get(handles.radiobutton_butter, 'Value'); - typef = 0; % 0 means Butterworth + typef = 0; % 0 means Butterworth elseif get(handles.radiobutton_fir, 'Value'); - typef = 1;% 1 means FIR + typef = 1;% 1 means FIR elseif get(handles.radiobutton_PM_notch, 'Value'); - typef = 2; % 2 means PM Notch + typef = 2; % 2 means PM Notch end notchpm = get(handles.radiobutton_PM_notch,'Value'); if notchpm - if valueh>=5 && valueh<=handles.maxsliders-5 - set(handles.slider_highpass, 'Value', valueh); - else - if valueh<5 - nvaln = 5; - elseif valueh>handles.maxsliders-5 - nvaln = handles.maxsliders-5; - end - - nvalstr = sprintf('%.1f',nvaln); - set(handles.edit_highpass, 'String', nvalstr); - set(handles.slider_highpass, 'Value', nvaln); - end - - % - % Plot corresponding response - % - - if get(handles.radiobutton_fdatafr,'Value') - plotresponse_fd_data(hObject, eventdata, handles) - elseif get(handles.radiobutton_freqr,'Value') || get(handles.radiobutton_impr,'Value') - plotresponsefilter(hObject, eventdata, handles); - end -else + if valueh>=5 && valueh<=handles.maxsliders-5 set(handles.slider_highpass, 'Value', valueh); - - if typef==0 && autorder==1 - % order starts again for auto butter - orderlist = cellstr(get(handles.popupmenu_order, 'String')); % whole list - orderlist{1} = 'automin:2'; - set(handles.popupmenu_order, 'String', orderlist); - set(handles.popupmenu_order, 'Value',1); + else + if valueh<5 + nvaln = 5; + elseif valueh>handles.maxsliders-5 + nvaln = handles.maxsliders-5; end - % - % Plot corresponding response - % - if get(handles.radiobutton_fdatafr,'Value') - plotresponse_fd_data(hObject, eventdata, handles) - elseif get(handles.radiobutton_freqr,'Value') || get(handles.radiobutton_impr,'Value') - plotresponsefilter(hObject, eventdata, handles); - end + nvalstr = sprintf('%.1f',nvaln); + set(handles.edit_highpass, 'String', nvalstr); + set(handles.slider_highpass, 'Value', nvaln); + end + + % + % Plot corresponding response + % + + if get(handles.radiobutton_fdatafr,'Value') + plotresponse_fd_data(hObject, eventdata, handles) + elseif get(handles.radiobutton_freqr,'Value') || get(handles.radiobutton_impr,'Value') + plotresponsefilter(hObject, eventdata, handles); + end +else + set(handles.slider_highpass, 'Value', valueh); + + if typef==0 && autorder==1 + % order starts again for auto butter + orderlist = cellstr(get(handles.popupmenu_order, 'String')); % whole list + orderlist{1} = 'automin:2'; + set(handles.popupmenu_order, 'String', orderlist); + set(handles.popupmenu_order, 'Value',1); + end + + % + % Plot corresponding response + % + if get(handles.radiobutton_fdatafr,'Value') + plotresponse_fd_data(hObject, eventdata, handles) + elseif get(handles.radiobutton_freqr,'Value') || get(handles.radiobutton_impr,'Value') + plotresponsefilter(hObject, eventdata, handles); + end end %-------------------------------------------------------------------------- function edit_highpass_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); + set(hObject,'BackgroundColor','white'); end %-------------------------------------------------------------------------- @@ -537,45 +560,45 @@ function edit_lowpass_Callback(hObject, eventdata, handles) valuel = str2num(get(handles.edit_lowpass, 'String')); if length(valuel)~=1 - msgboxText = 'Invalid input for low pass cutoff'; - title = 'ERPLAB: basicfilterGUI2() error'; - errorfound(msgboxText, title); - return + msgboxText = 'Invalid input for low pass cutoff'; + title = 'ERPLAB: basicfilterGUI2() error'; + errorfound(msgboxText, title); + return end if valuel<0.001; - set(handles.edit_lowpass, 'String', num2str(handles.maxsliders)) - set(handles.slider_lowpass, 'Value', handles.maxsliders); - set(handles.slider_lowpass, 'Enable', 'on'); - set(handles.togglebutton_lowpass, 'Value', 1); - set(handles.togglebutton_lowpass, 'BackgroundColor', [1 1 0.5]); - plotresponsefilter(hObject, eventdata, handles); - return + set(handles.edit_lowpass, 'String', num2str(handles.maxsliders)) + set(handles.slider_lowpass, 'Value', handles.maxsliders); + set(handles.slider_lowpass, 'Enable', 'on'); + set(handles.togglebutton_lowpass, 'Value', 1); + set(handles.togglebutton_lowpass, 'BackgroundColor', [1 1 0.5]); + plotresponsefilter(hObject, eventdata, handles); + return end if valuel<0 - msgboxText = 'Invalid input for low pass cutoff'; - title = 'ERPLAB: basicfilterGUI2() error'; - errorfound(msgboxText, title); - set(handles.edit_lowpass, 'String', '0') - set(handles.edit_lowpass, 'Enable', 'off') - %set(handles.edit_lowpass, 'BackgroundColor', [0.75 0.75 0.75]); - set(handles.slider_lowpass, 'Value', 0); - set(handles.slider_lowpass, 'Enable', 'off'); - set(handles.togglebutton_lowpass, 'Value', 0); - set(handles.togglebutton_lowpass, 'BackgroundColor', [0.8 0.8 0.75]); - plotresponsefilter(hObject, eventdata, handles); - return + msgboxText = 'Invalid input for low pass cutoff'; + title = 'ERPLAB: basicfilterGUI2() error'; + errorfound(msgboxText, title); + set(handles.edit_lowpass, 'String', '0') + set(handles.edit_lowpass, 'Enable', 'off') + %set(handles.edit_lowpass, 'BackgroundColor', [0.75 0.75 0.75]); + set(handles.slider_lowpass, 'Value', 0); + set(handles.slider_lowpass, 'Enable', 'off'); + set(handles.togglebutton_lowpass, 'Value', 0); + set(handles.togglebutton_lowpass, 'BackgroundColor', [0.8 0.8 0.75]); + plotresponsefilter(hObject, eventdata, handles); + return end if valuel>handles.maxsliders - msgboxText = 'Too high!!!'; - title = 'ERPLAB: basicfilterGUI2() error'; - errorfound(msgboxText, title); - set(handles.edit_lowpass, 'String', num2str(handles.maxsliders)) - set(handles.slider_lowpass, 'Value', handles.maxsliders); - set(handles.slider_lowpass, 'Enable', 'on'); - set(handles.togglebutton_lowpass, 'Value', 1); - set(handles.togglebutton_lowpass, 'BackgroundColor', [1 1 0.5]); - plotresponsefilter(hObject, eventdata, handles); - return + msgboxText = 'Too high!!!'; + title = 'ERPLAB: basicfilterGUI2() error'; + errorfound(msgboxText, title); + set(handles.edit_lowpass, 'String', num2str(handles.maxsliders)) + set(handles.slider_lowpass, 'Value', handles.maxsliders); + set(handles.slider_lowpass, 'Enable', 'on'); + set(handles.togglebutton_lowpass, 'Value', 1); + set(handles.togglebutton_lowpass, 'BackgroundColor', [1 1 0.5]); + plotresponsefilter(hObject, eventdata, handles); + return end set(handles.edit_lowpass, 'String', num2str(valuel)); @@ -583,39 +606,39 @@ function edit_lowpass_Callback(hObject, eventdata, handles) set(handles.slider_lowpass, 'Value', valuel); if get(handles.radiobutton_butter, 'Value'); - typef = 0; % 0 means Butterworth + typef = 0; % 0 means Butterworth elseif get(handles.radiobutton_fir, 'Value'); - typef = 1;% 1 means FIR + typef = 1;% 1 means FIR elseif get(handles.radiobutton_PM_notch, 'Value'); - typef = 2; % 2 means PM Notch + typef = 2; % 2 means PM Notch end if typef==0 && autorder==1 - % order starts again for auto butter - orderlist = cellstr(get(handles.popupmenu_order, 'String')); % whole list - orderlist{1} = 'automin:2'; - set(handles.popupmenu_order, 'String', orderlist); - set(handles.popupmenu_order, 'Value',1); + % order starts again for auto butter + orderlist = cellstr(get(handles.popupmenu_order, 'String')); % whole list + orderlist{1} = 'automin:2'; + set(handles.popupmenu_order, 'String', orderlist); + set(handles.popupmenu_order, 'Value',1); end % % Plot corresponding response % if get(handles.radiobutton_fdatafr,'Value') - plotresponse_fd_data(hObject, eventdata, handles) + plotresponse_fd_data(hObject, eventdata, handles) elseif get(handles.radiobutton_freqr,'Value') || get(handles.radiobutton_impr,'Value') - plotresponsefilter(hObject, eventdata, handles); + plotresponsefilter(hObject, eventdata, handles); end %-------------------------------------------------------------------------- function edit_lowpass_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); + set(hObject,'BackgroundColor','white'); end %-------------------------------------------------------------------------- % % % function popupmenu_channels_Callback(hObject, eventdata, handles) -% % % +% % % % % % numch = get(hObject, 'Value'); % % % nums = str2num(get(handles.edit_channels, 'String')); % % % nums = [nums numch]; @@ -633,7 +656,7 @@ function edit_lowpass_CreateFcn(hObject, eventdata, handles) %-------------------------------------------------------------------------- % % function popupmenu_channels_CreateFcn(hObject, eventdata, handles) -% % +% % % % if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) % % set(hObject,'BackgroundColor','white'); % % end @@ -645,67 +668,60 @@ function edit_channels_Callback(hObject, eventdata, handles) chx = str2num(get(handles.edit_channels,'String')); tf = checkchannels(chx, nchan); if tf - return -end -if length(chx)==nchan - set(handles.checkbox_filterallchannels, 'Value', 1) - set(handles.edit_channels, 'String', vect2colon([1:nchan], 'Delimiter', 'off')); - set(handles.edit_channels, 'Enable', 'off'); - set(handles.pushbutton_browsechan, 'Enable', 'off'); -else - chxstr = vect2colon(chx,'Delimiter','off', 'Repeat', 'off'); - set(handles.edit_channels,'String', chxstr) + return end +chxstr = vect2colon(chx,'Delimiter','off', 'Repeat', 'off'); +set(handles.edit_channels,'String', chxstr) if get(handles.radiobutton_ufdatafr,'Value'); - plotresponse_uf_data(hObject, eventdata, handles); + plotresponse_uf_data(hObject, eventdata, handles); elseif get(handles.radiobutton_fdatafr,'Value'); - plotresponse_fd_data(hObject, eventdata, handles); + plotresponse_fd_data(hObject, eventdata, handles); end %-------------------------------------------------------------------------- function tf = checkchannels(chx, nchan, showmsg) if nargin<3 - showmsg = 1; + showmsg = 1; end tf = 0; % no problem by default if isempty(chx) - if showmsg - msgboxText = 'Invalid channel indexing.'; - title = 'ERPLAB: basicfilterGUI() error:'; - errorfound(msgboxText, title); - end - tf = 1; % - return + if showmsg + msgboxText = 'Invalid channel indexing.'; + title = 'ERPLAB: basicfilterGUI() error:'; + errorfound(msgboxText, title); + end + tf = 1; % + return end if ~isempty(find(chx>nchan)) - if showmsg - msgboxText = ['You only have %g channels,\n'... - 'so you cannot specify indices greater than this.']; - title = 'ERPLAB: basicfilterGUI() error:'; - errorfound(sprintf(msgboxText, nchan), title); - end - tf = 1; % - return + if showmsg + msgboxText = ['You only have %g channels,\n'... + 'so you cannot specify indices greater than this.']; + title = 'ERPLAB: basicfilterGUI() error:'; + errorfound(sprintf(msgboxText, nchan), title); + end + tf = 1; % + return end if ~isempty(find(chx<1)) - if showmsg - msgboxText = 'You cannot use zero or a negative number as a channel indexing'; - title = 'ERPLAB: basicfilterGUI() error:'; - errorfound(msgboxText, title); - end - tf = 1; % - return + if showmsg + msgboxText = 'You cannot use zero or a negative number as a channel indexing'; + title = 'ERPLAB: basicfilterGUI() error:'; + errorfound(msgboxText, title); + end + tf = 1; % + return end if length(chx)>length(unique_bc2(chx)) - if showmsg - msgboxText = ['Repeated channels are not allowed.\n'... - 'Therefore, ERPLAB will get rid of them.']; - title = 'ERPLAB: basicfilterGUI() error:'; - errorfound(sprintf(msgboxText), title, [1 1 0], [0 0 0], 0) - end - tf = 0; % - return + if showmsg + msgboxText = ['Repeated channels are not allowed.\n'... + 'Therefore, ERPLAB will get rid of them.']; + title = 'ERPLAB: basicfilterGUI() error:'; + errorfound(sprintf(msgboxText), title, [1 1 0], [0 0 0], 0) + end + tf = 0; % + return end return @@ -713,7 +729,7 @@ function edit_channels_Callback(hObject, eventdata, handles) function edit_channels_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); + set(hObject,'BackgroundColor','white'); end %-------------------------------------------------------------------------- @@ -741,7 +757,7 @@ function pushbutton_apply_Callback(hObject, eventdata, handles) [readobjects v] = read_GUI(hObject, eventdata, handles); % v=1 means everythink is ok. if v~=1 % means something was wrong - return + return end channelArray = readobjects{1}; @@ -758,102 +774,110 @@ function pushbutton_apply_Callback(hObject, eventdata, handles) iswarnroff = handles.iswarnroff; if (iswarngain==1 || iswarngain==2) && ~strcmpi(typefilter,'notch') - - BackERPLABcolor = [1 0.9 0.3]; % yellow - - if iswarngain==1 - question = ['With this filter setting, there will be significant \n'... - 'attenuation at passband. This is almost always a \n'... - 'bad thing. This problem can usually be eliminated by \n'... - 'selecting a lower high-pass cuttoff, higher low-pass \n'... - 'cuttoff, and/or a higher filter order. ']; - elseif iswarngain==2 - question = ['With this filter setting, there will be some \n'... - 'amplification at the passband frequencies. \n'... - 'This problem can be eliminated by selecting \n'... - 'a higher filter order. ']; - end - - title = 'WARNING!'; - oldcolor = get(0,'DefaultUicontrolBackgroundColor'); - set(0,'DefaultUicontrolBackgroundColor',BackERPLABcolor) - button = questdlg(sprintf(question), title,'Proceed anyway', 'Cancel','Proceed anyway'); - set(0,'DefaultUicontrolBackgroundColor',oldcolor) - - if ~strcmpi(button,'Proceed anyway') - disp('User selected Cancel') - return - end + + BackERPLABcolor = [1 0.9 0.3]; % yellow + + if iswarngain==1 + question = ['With this filter setting, there will be significant \n'... + 'attenuation at passband. This is almost always a \n'... + 'bad thing. This problem can usually be eliminated by \n'... + 'selecting a lower high-pass cuttoff, higher low-pass \n'... + 'cuttoff, and/or a higher filter order. ']; + elseif iswarngain==2 + question = ['With this filter setting, there will be some \n'... + 'amplification at the passband frequencies. \n'... + 'This problem can be eliminated by selecting \n'... + 'a higher filter order. ']; + end + + title = 'WARNING!'; + oldcolor = get(0,'DefaultUicontrolBackgroundColor'); + set(0,'DefaultUicontrolBackgroundColor',BackERPLABcolor) + button = questdlg(sprintf(question), title,'Proceed anyway', 'Cancel','Proceed anyway'); + set(0,'DefaultUicontrolBackgroundColor',oldcolor) + + if ~strcmpi(button,'Proceed anyway') + disp('User selected Cancel') + return + end end if highpasscutoff==0 && lowpasscutoff==0 - msgboxText = ['I beg your pardon?\n\n'... - 'You must define one frequency cutoff at least.']; - title = 'ERPLAB: basicfilterGUI() error:'; - errorfound(sprintf(msgboxText), title); - return + msgboxText = ['I beg your pardon?\n\n'... + 'You must define one frequency cutoff at least.']; + title = 'ERPLAB: basicfilterGUI() error:'; + errorfound(sprintf(msgboxText), title); + return end if strcmp(typefilter, 'fir') || strcmp(typefilter, 'notch') - - minboundarysamdist = handles.minboundarysamdist; - if boundarycheck==1 - if minboundarysamdist<3*order - BackERPLABcolor = [ 1 1 0]; - question = ['You have set the checkbox for filtering between boundary events.\n'... - 'Event codes ''boundary'' or -99 were found in you dataset.\n\n'... - 'However, at least one of the segments among boundaries \n'... - 'has less samples than 3 times the filter order you are currently setting.\n\n'... - 'You may either decrese the order of the filter - if it is possible - (recommended),\n'... - 'or uncheck the option for filtering between boundary events (not recommended).']; - - questionstr = sprintf(question); - titlex = 'ERPLAB: Filter order vs number of samples'; - oldcolor = get(0,'DefaultUicontrolBackgroundColor'); - set(0,'DefaultUicontrolBackgroundColor',BackERPLABcolor) - button = questdlg(questionstr, titlex,'OK','OK'); - set(0,'DefaultUicontrolBackgroundColor',oldcolor) - return - end + + minboundarysamdist = handles.minboundarysamdist; + if boundarycheck==1 + if minboundarysamdist<3*order + BackERPLABcolor = [ 1 1 0]; + question = ['You have set the checkbox for filtering between boundary events.\n'... + 'Event codes ''boundary'' or -99 were found in you dataset.\n\n'... + 'However, at least one of the segments among boundaries \n'... + 'has less samples than 3 times the filter order you are currently setting.\n\n'... + 'You may either decrese the order of the filter - if it is possible - (recommended),\n'... + 'or uncheck the option for filtering between boundary events (not recommended).']; + + questionstr = sprintf(question); + titlex = 'ERPLAB: Filter order vs number of samples'; + oldcolor = get(0,'DefaultUicontrolBackgroundColor'); + set(0,'DefaultUicontrolBackgroundColor',BackERPLABcolor) + button = questdlg(questionstr, titlex,'OK','OK'); + set(0,'DefaultUicontrolBackgroundColor',oldcolor) + return end + end end if boundarycheck==1 - if strcmpi(boundarystr,'boundary')||strcmpi(boundarystr,'''boundary''') - boundary = 'boundary'; + if strcmpi(boundarystr,'boundary')||strcmpi(boundarystr,'''boundary''') + boundary = 'boundary'; + else + if ~strcmp(boundarystr,'') + boundary = str2num(boundarystr); + if isempty(boundary); + boundary = boundarystr; + end else - if ~strcmp(boundarystr,'') - boundary = str2num(boundarystr); - if isempty(boundary); - boundary = boundarystr; - end - else - %boundary = []; - msgboxText = ['You have set the checkbox for filtering between boundary events.\n'... - 'So, you must define a boundary event code.']; - title = 'ERPLAB: basicfilterGUI() error:'; - errorfound(sprintf(msgboxText), title); - return - end + %boundary = []; + msgboxText = ['You have set the checkbox for filtering between boundary events.\n'... + 'So, you must define a boundary event code.']; + title = 'ERPLAB: basicfilterGUI() error:'; + errorfound(sprintf(msgboxText), title); + return end + end else - boundary = []; + boundary = []; end nchan = handles.nchan; tf = checkchannels(channelArray, nchan, 0); % 0 means no problems if tf - return + return end + +binArray = str2num(handles.edit_bin.String); +if iserpstruct(handles.ERPLAB) && handles.nbin>0 + if isempty(binArray) || any(binArray(:)>handles.ERPLAB.nbin) || any(binArray(:)<1) + binArray = [1:handles.ERPLAB.nbin]; + end +end +filterallch=0; if ~isempty(highpasscutoff) && ~isempty(lowpasscutoff) && ~isempty(order) && ~isempty(channelArray) - %v=1; - outstr = {highpasscutoff, lowpasscutoff, order, channelArray, filterallch, typefilter, remove_dc, boundary}; - %handles.output = outstr; - %guidata(hObject, handles); - uiresume(handles.gui_chassis); + %v=1; + outstr = {highpasscutoff, lowpasscutoff, order, channelArray, filterallch, typefilter, remove_dc, boundary,binArray}; + %handles.output = outstr; + %guidata(hObject, handles); + uiresume(handles.gui_chassis); else - msgboxText = 'Something went wrong...Please try again'; - title = 'ERPLAB: basicfilterGUI() error:'; - errorfound(msgboxText, title); - return + msgboxText = 'Something went wrong...Please try again'; + title = 'ERPLAB: basicfilterGUI() error:'; + errorfound(msgboxText, title); + return end %-------------------------------------------------------------------------- @@ -864,55 +888,48 @@ function pushbutton_apply_Callback(hObject, eventdata, handles) channelArray = str2num(get(handles.edit_channels, 'string')); channelArray = unique_bc2(channelArray); len1 = length(channelArray); -filterallch = get(handles.checkbox_filterallchannels, 'Value'); -if filterallch - nchan = handles.nchan; - channelArray = 1:nchan; % all channels - len2 = length(channelArray); - if len1~=len2 - fprintf('Index of channels to be filtered was adjusted since current %s has %g channels.\n', typedata, nchan); - end - if len2==nchan - set(handles.checkbox_filterallchannels, 'Value', 1) - set(handles.edit_channels, 'String', vect2colon([1:nchan], 'Delimiter', 'off')); - set(handles.edit_channels, 'Enable', 'off'); - set(handles.pushbutton_browsechan, 'Enable', 'off'); - end -end + highpasscutoff = str2num(get(handles.edit_highpass, 'string')); if length(highpasscutoff)~=1 - msgboxText = 'Invalid input for high pass cutoff'; - title = 'ERPLAB: basicfilterGUI2() error'; - errorfound(msgboxText, title); - v=0; - return + msgboxText = 'Invalid input for high pass cutoff'; + title = 'ERPLAB: basicfilterGUI2() error'; + errorfound(msgboxText, title); + v=0; + return end remove_dc = get(handles.checkbox_removedc, 'Value'); boundarystr = get(handles.edit_boundary, 'String'); boundarycheck = get(handles.checkbox_boundary,'Value'); if get(handles.radiobutton_butter, 'Value'); % 0 means Butterworth - typefilter = 'butter'; + typefilter = 'butter'; elseif get(handles.radiobutton_fir, 'Value'); % 1 means FIR - typefilter = 'fir'; + typefilter = 'fir'; elseif get(handles.radiobutton_PM_notch, 'Value'); % 2 means PM Notch - typefilter = 'notch'; + typefilter = 'notch'; end if strcmp(typefilter, 'notch') - lowpasscutoff = highpasscutoff; - order = 180; + lowpasscutoff = highpasscutoff; + order = 180; else - lowpasscutoff = str2num(get(handles.edit_lowpass, 'string')); - - if length(lowpasscutoff)~=1 - msgboxText = 'Invalid input for low pass cutoff'; - title = 'ERPLAB: basicfilterGUI2() error'; - errorfound(msgboxText, title); - v=0; - return - end - order = getorder(handles); + lowpasscutoff = str2num(get(handles.edit_lowpass, 'string')); + + if length(lowpasscutoff)~=1 + msgboxText = 'Invalid input for low pass cutoff'; + title = 'ERPLAB: basicfilterGUI2() error'; + errorfound(msgboxText, title); + v=0; + return + end + order = getorder(handles); +end +filterallch=0; +binArray = str2num(handles.edit_bin.String); +if iserpstruct(handles.ERPLAB) && handles.nbin>0 + if isempty(binArray) || any(binArray(:)>handles.ERPLAB.nbin) || any(binArray(:)<1) + binArray = [1:handles.ERPLAB.nbin]; + end end -readobjects = {channelArray, filterallch, highpasscutoff, lowpasscutoff, order, typefilter, remove_dc, boundarycheck, boundarystr}; +readobjects = {channelArray, filterallch, highpasscutoff, lowpasscutoff, order, typefilter, remove_dc, boundarycheck, boundarystr,binArray}; %-------------------------------------------------------------------------- function checkbox_removedc_Callback(hObject, eventdata, handles) @@ -920,220 +937,220 @@ function checkbox_removedc_Callback(hObject, eventdata, handles) % ------------------------------------------------------------------------- function togglebutton_highpass_Callback(hObject, eventdata, handles) if get(hObject,'Value') - set(handles.edit_highpass, 'Enable', 'on'); - set(handles.edit2_highpass, 'Enable', 'on'); - set(handles.edit2_highpass, 'BackgroundColor', [1 1 0.5]); - set(handles.edit2_highpass, 'Enable', 'inactive'); - set(handles.togglebutton_highpass, 'Value', 1); - set(handles.slider_highpass, 'Enable','on'); - mvalueh = round(handles.mvalueh*10)/10; - - if mvalueh<0.1 - handles.mvalueh = 0.1; - end - - set(handles.slider_highpass, 'Value', handles.mvalueh); - set(handles.edit_highpass, 'String', num2str(handles.mvalueh)); - set(handles.checkbox_removedc, 'Enable', 'on') - set(handles.togglebutton_highpass, 'BackgroundColor', [1 1 0.5]); - - % - % Roll off - % - set(handles.popupmenu_dboct, 'Enable', 'on'); - set(handles.popupmenu_dbdec, 'Enable', 'on'); - set(handles.popupmenu_order, 'Enable', 'on'); - - % - % Plot filter related responses - % - set(handles.radiobutton_freqr, 'Enable', 'on'); - set(handles.radiobutton_impr, 'Enable', 'on'); - set(handles.radiobutton_fdatafr, 'Enable', 'on'); - - % Update handles structure - guidata(hObject, handles); + set(handles.edit_highpass, 'Enable', 'on'); + set(handles.edit2_highpass, 'Enable', 'on'); + set(handles.edit2_highpass, 'BackgroundColor', [1 1 0.5]); + set(handles.edit2_highpass, 'Enable', 'inactive'); + set(handles.togglebutton_highpass, 'Value', 1); + set(handles.slider_highpass, 'Enable','on'); + mvalueh = round(handles.mvalueh*10)/10; + + if mvalueh<0.1 + handles.mvalueh = 0.1; + end + + set(handles.slider_highpass, 'Value', handles.mvalueh); + set(handles.edit_highpass, 'String', num2str(handles.mvalueh)); + set(handles.checkbox_removedc, 'Enable', 'on') + set(handles.togglebutton_highpass, 'BackgroundColor', [1 1 0.5]); + + % + % Roll off + % + set(handles.popupmenu_dboct, 'Enable', 'on'); + set(handles.popupmenu_dbdec, 'Enable', 'on'); + set(handles.popupmenu_order, 'Enable', 'on'); + + % + % Plot filter related responses + % + set(handles.radiobutton_freqr, 'Enable', 'on'); + set(handles.radiobutton_impr, 'Enable', 'on'); + set(handles.radiobutton_fdatafr, 'Enable', 'on'); + + % Update handles structure + guidata(hObject, handles); else - set(handles.togglebutton_highpass, 'Value', 0); - set(handles.slider_highpass, 'Value', 0); - set(handles.slider_highpass, 'Enable','off'); - set(handles.edit_highpass, 'String', '0'); - set(handles.edit_highpass, 'Enable', 'off'); - set(handles.edit2_highpass, 'String', '---'); - set(handles.edit2_highpass, 'Enable', 'off'); - set(handles.checkbox_removedc, 'Enable', 'off') - %set(handles.edit_highpass, 'BackgroundColor', [0.75 0.75 0.75]); - set(handles.togglebutton_highpass, 'BackgroundColor', [0.8 0.8 0.75]); + set(handles.togglebutton_highpass, 'Value', 0); + set(handles.slider_highpass, 'Value', 0); + set(handles.slider_highpass, 'Enable','off'); + set(handles.edit_highpass, 'String', '0'); + set(handles.edit_highpass, 'Enable', 'off'); + set(handles.edit2_highpass, 'String', '---'); + set(handles.edit2_highpass, 'Enable', 'off'); + set(handles.checkbox_removedc, 'Enable', 'off') + %set(handles.edit_highpass, 'BackgroundColor', [0.75 0.75 0.75]); + set(handles.togglebutton_highpass, 'BackgroundColor', [0.8 0.8 0.75]); end if get(handles.radiobutton_fdatafr,'Value') - plotresponse_fd_data(hObject, eventdata, handles) + plotresponse_fd_data(hObject, eventdata, handles) else - plotresponsefilter(hObject, eventdata, handles); + plotresponsefilter(hObject, eventdata, handles); end %-------------------------------------------------------------------------- function togglebutton_lowpass_Callback(hObject, eventdata, handles) if get(hObject,'Value') - set(handles.edit_lowpass, 'Enable', 'on'); - set(handles.edit2_lowpass, 'Enable', 'on'); - set(handles.edit2_lowpass, 'BackgroundColor', [1 1 0.5]); - set(handles.edit2_lowpass, 'Enable', 'inactive'); - set(handles.slider_lowpass, 'Enable','on'); - fc = round(handles.mvaluel*10)/10; - - if fc==0 - fc = round(handles.maxsliders*5)/10; - end - - set(handles.slider_lowpass, 'Value', fc); - set(handles.edit_lowpass, 'String', num2str(fc)); - %set(handles.edit_lowpass, 'BackgroundColor', [1 1 1]); - set(handles.togglebutton_lowpass, 'BackgroundColor', [1 1 0.5]); - - % - % Roll off - % - set(handles.popupmenu_dboct, 'Enable', 'on'); - set(handles.popupmenu_dbdec, 'Enable', 'on'); - set(handles.popupmenu_order, 'Enable', 'on'); - - % - % Plot filter related responses - % - set(handles.radiobutton_freqr, 'Enable', 'on'); - set(handles.radiobutton_impr, 'Enable', 'on'); - set(handles.radiobutton_fdatafr, 'Enable', 'on'); + set(handles.edit_lowpass, 'Enable', 'on'); + set(handles.edit2_lowpass, 'Enable', 'on'); + set(handles.edit2_lowpass, 'BackgroundColor', [1 1 0.5]); + set(handles.edit2_lowpass, 'Enable', 'inactive'); + set(handles.slider_lowpass, 'Enable','on'); + fc = round(handles.mvaluel*10)/10; + + if fc==0 + fc = round(handles.maxsliders*5)/10; + end + + set(handles.slider_lowpass, 'Value', fc); + set(handles.edit_lowpass, 'String', num2str(fc)); + %set(handles.edit_lowpass, 'BackgroundColor', [1 1 1]); + set(handles.togglebutton_lowpass, 'BackgroundColor', [1 1 0.5]); + + % + % Roll off + % + set(handles.popupmenu_dboct, 'Enable', 'on'); + set(handles.popupmenu_dbdec, 'Enable', 'on'); + set(handles.popupmenu_order, 'Enable', 'on'); + + % + % Plot filter related responses + % + set(handles.radiobutton_freqr, 'Enable', 'on'); + set(handles.radiobutton_impr, 'Enable', 'on'); + set(handles.radiobutton_fdatafr, 'Enable', 'on'); else - set(handles.edit_lowpass, 'String', '0'); - set(handles.edit_lowpass, 'Enable', 'off'); - set(handles.edit2_lowpass, 'String', '---'); - set(handles.edit2_lowpass, 'Enable', 'off'); - set(handles.slider_lowpass, 'Enable','off'); - set(handles.slider_lowpass, 'Value', 0); - %set(handles.edit_lowpass, 'BackgroundColor', [0.75 0.75 0.75]); - set(handles.togglebutton_lowpass, 'BackgroundColor', [0.8 0.8 0.75]); + set(handles.edit_lowpass, 'String', '0'); + set(handles.edit_lowpass, 'Enable', 'off'); + set(handles.edit2_lowpass, 'String', '---'); + set(handles.edit2_lowpass, 'Enable', 'off'); + set(handles.slider_lowpass, 'Enable','off'); + set(handles.slider_lowpass, 'Value', 0); + %set(handles.edit_lowpass, 'BackgroundColor', [0.75 0.75 0.75]); + set(handles.togglebutton_lowpass, 'BackgroundColor', [0.8 0.8 0.75]); end if get(handles.radiobutton_fdatafr,'Value') - plotresponse_fd_data(hObject, eventdata, handles) + plotresponse_fd_data(hObject, eventdata, handles) else - plotresponsefilter(hObject, eventdata, handles); + plotresponsefilter(hObject, eventdata, handles); end %-------------------------------------------------------------------------- function radiobutton_freqr_Callback(hObject, eventdata, handles) if get(hObject,'Value') - set(handles.radiobutton_impr,'Value', 0); - set(handles.radiobutton_ufdatafr,'Value', 0); - set(handles.radiobutton_fdatafr,'Value', 0); - %set(handles.popupmenu_FRscale,'Value', 1); - set(handles.popupmenu_FRscale,'Enable', 'on'); - set(handles.radiobutton_butter, 'Enable', 'on') - set(handles.radiobutton_fir, 'Enable', 'on') - set(handles.radiobutton_PM_notch,'Enable','on') - set(handles.radiobutton_ideal, 'Enable','on') - plotresponsefilter(hObject, eventdata, handles); + set(handles.radiobutton_impr,'Value', 0); + set(handles.radiobutton_ufdatafr,'Value', 0); + set(handles.radiobutton_fdatafr,'Value', 0); + %set(handles.popupmenu_FRscale,'Value', 1); + set(handles.popupmenu_FRscale,'Enable', 'on'); + set(handles.radiobutton_butter, 'Enable', 'on') + set(handles.radiobutton_fir, 'Enable', 'on') + set(handles.radiobutton_PM_notch,'Enable','on') + set(handles.radiobutton_ideal, 'Enable','on') + plotresponsefilter(hObject, eventdata, handles); else - set(handles.radiobutton_freqr,'Value', 1); + set(handles.radiobutton_freqr,'Value', 1); end %-------------------------------------------------------------------------- function radiobutton_impr_Callback(hObject, eventdata, handles) if get(hObject,'Value') - set(handles.radiobutton_freqr,'Value', 0); - set(handles.radiobutton_ufdatafr,'Value', 0); - set(handles.radiobutton_fdatafr,'Value', 0); - %set(handles.popupmenu_FRscale,'Value', 1); - set(handles.popupmenu_FRscale,'Enable', 'off'); - set(handles.radiobutton_butter, 'Enable', 'on') - set(handles.radiobutton_fir, 'Enable', 'on') - set(handles.radiobutton_PM_notch,'Enable','on') - set(handles.radiobutton_ideal, 'Enable','off') - plotresponsefilter(hObject, eventdata, handles); + set(handles.radiobutton_freqr,'Value', 0); + set(handles.radiobutton_ufdatafr,'Value', 0); + set(handles.radiobutton_fdatafr,'Value', 0); + %set(handles.popupmenu_FRscale,'Value', 1); + set(handles.popupmenu_FRscale,'Enable', 'off'); + set(handles.radiobutton_butter, 'Enable', 'on') + set(handles.radiobutton_fir, 'Enable', 'on') + set(handles.radiobutton_PM_notch,'Enable','on') + set(handles.radiobutton_ideal, 'Enable','off') + plotresponsefilter(hObject, eventdata, handles); else - set(handles.radiobutton_impr,'Value', 1); + set(handles.radiobutton_impr,'Value', 1); end %-------------------------------------------------------------------------- function radiobutton_ufdatafr_Callback(hObject, eventdata, handles) if get(hObject,'Value') - set(handles.radiobutton_freqr,'Value', 0); - set(handles.radiobutton_impr,'Value', 0); - set(handles.radiobutton_fdatafr,'Value', 0); - % set(handles.popupmenu_FRscale,'Value', 1); - set(handles.popupmenu_FRscale,'Enable', 'on'); - set(handles.radiobutton_butter, 'Enable', 'off') - set(handles.radiobutton_fir, 'Enable', 'off') - set(handles.radiobutton_PM_notch,'Enable','off') - set(handles.radiobutton_ideal, 'Enable','off') - drawnow - plotresponse_uf_data(hObject, eventdata, handles); + set(handles.radiobutton_freqr,'Value', 0); + set(handles.radiobutton_impr,'Value', 0); + set(handles.radiobutton_fdatafr,'Value', 0); + % set(handles.popupmenu_FRscale,'Value', 1); + set(handles.popupmenu_FRscale,'Enable', 'on'); + set(handles.radiobutton_butter, 'Enable', 'off') + set(handles.radiobutton_fir, 'Enable', 'off') + set(handles.radiobutton_PM_notch,'Enable','off') + set(handles.radiobutton_ideal, 'Enable','off') + drawnow + plotresponse_uf_data(hObject, eventdata, handles); else - set(handles.radiobutton_ufdatafr,'Value', 1); + set(handles.radiobutton_ufdatafr,'Value', 1); end %-------------------------------------------------------------------------- function radiobutton_fdatafr_Callback(hObject, eventdata, handles) if get(hObject,'Value') - set(handles.radiobutton_freqr,'Value', 0); - set(handles.radiobutton_impr,'Value', 0); - set(handles.radiobutton_ufdatafr,'Value', 0); - % set(handles.popupmenu_FRscale,'Value', 1); - set(handles.popupmenu_FRscale,'Enable', 'on'); - set(handles.radiobutton_butter, 'Enable', 'on') - set(handles.radiobutton_fir, 'Enable', 'on') - set(handles.radiobutton_PM_notch,'Enable','on') - set(handles.radiobutton_ideal, 'Enable','on') - drawnow - plotresponse_fd_data(hObject, eventdata, handles); + set(handles.radiobutton_freqr,'Value', 0); + set(handles.radiobutton_impr,'Value', 0); + set(handles.radiobutton_ufdatafr,'Value', 0); + % set(handles.popupmenu_FRscale,'Value', 1); + set(handles.popupmenu_FRscale,'Enable', 'on'); + set(handles.radiobutton_butter, 'Enable', 'on') + set(handles.radiobutton_fir, 'Enable', 'on') + set(handles.radiobutton_PM_notch,'Enable','on') + set(handles.radiobutton_ideal, 'Enable','on') + drawnow + plotresponse_fd_data(hObject, eventdata, handles); else - set(handles.radiobutton_fdatafr,'Value', 1); + set(handles.radiobutton_fdatafr,'Value', 1); end %-------------------------------------------------------------------------- function checkbox_boundary_Callback(hObject, eventdata, handles) if get(hObject, 'Value') + + set(handles.edit_boundary,'Enable', 'on'); + %set(handles.edit_boundary,'BackgroundColor', [1 1 1]); + + if get(handles.radiobutton_butter, 'Value'); % 0 means Butterworth + typef = 0; + elseif get(handles.radiobutton_fir, 'Value'); % 1 means FIR + typef = 1; + elseif get(handles.radiobutton_PM_notch, 'Value'); % 2 means PM Notch + typef = 2; + end + if typef==1 || typef==2 - set(handles.edit_boundary,'Enable', 'on'); - %set(handles.edit_boundary,'BackgroundColor', [1 1 1]); + % + % FILTER order + % + order = getorder(handles); - if get(handles.radiobutton_butter, 'Value'); % 0 means Butterworth - typef = 0; - elseif get(handles.radiobutton_fir, 'Value'); % 1 means FIR - typef = 1; - elseif get(handles.radiobutton_PM_notch, 'Value'); % 2 means PM Notch - typef = 2; - end - if typef==1 || typef==2 - - % - % FILTER order - % - order = getorder(handles); - - minboundarysamdist = handles.minboundarysamdist; - - if get(handles.checkbox_boundary,'Value') - if minboundarysamdist<3*order - BackERPLABcolor = [ 1 1 0]; - question = ['You have set the checkbox for filtering between boundary events.\n'... - 'Event codes ''boundary'' or -99 were found in you dataset.\n\n'... - 'However, at least one of the segments among boundaries \n'... - 'has less samples than 3 times the filter order you are currently setting.\n\n'... - 'You may either decrese the order of the filter - if it is possible - (recommended),\n'... - 'or uncheck the option for filtering between boundary events (not recommended).']; - questionstr = sprintf(question); - titlex = 'ERPLAB: Filter order vs number of samples'; - oldcolor = get(0,'DefaultUicontrolBackgroundColor'); - set(0,'DefaultUicontrolBackgroundColor',BackERPLABcolor) - button = questdlg(questionstr, titlex,'OK','OK'); - set(0,'DefaultUicontrolBackgroundColor',oldcolor) - return - end - end + minboundarysamdist = handles.minboundarysamdist; + + if get(handles.checkbox_boundary,'Value') + if minboundarysamdist<3*order + BackERPLABcolor = [ 1 1 0]; + question = ['You have set the checkbox for filtering between boundary events.\n'... + 'Event codes ''boundary'' or -99 were found in you dataset.\n\n'... + 'However, at least one of the segments among boundaries \n'... + 'has less samples than 3 times the filter order you are currently setting.\n\n'... + 'You may either decrese the order of the filter - if it is possible - (recommended),\n'... + 'or uncheck the option for filtering between boundary events (not recommended).']; + questionstr = sprintf(question); + titlex = 'ERPLAB: Filter order vs number of samples'; + oldcolor = get(0,'DefaultUicontrolBackgroundColor'); + set(0,'DefaultUicontrolBackgroundColor',BackERPLABcolor) + button = questdlg(questionstr, titlex,'OK','OK'); + set(0,'DefaultUicontrolBackgroundColor',oldcolor) + return + end end + end else - set(handles.edit_boundary,'Enable', 'off'); - set(handles.edit_boundary,'BackgroundColor', [0.75 0.75 0.75]); + set(handles.edit_boundary,'Enable', 'off'); + set(handles.edit_boundary,'BackgroundColor', [0.75 0.75 0.75]); end %-------------------------------------------------------------------------- @@ -1185,25 +1202,25 @@ function no_filter(hObject,handles, msgtx) axes(handles.axes1); if valueh==0 && valuel==0 - if get(handles.radiobutton_freqr, 'Value') ||... - get(handles.radiobutton_impr, 'Value') ||... - get(handles.radiobutton_fdatafr, 'Value') - msgtx = '--NO FILTERING--'; - no_filter(hObject, handles, msgtx) - end - return + if get(handles.radiobutton_freqr, 'Value') ||... + get(handles.radiobutton_impr, 'Value') ||... + get(handles.radiobutton_fdatafr, 'Value') + msgtx = '--NO FILTERING--'; + no_filter(hObject, handles, msgtx) + end + return else - xmaxp = handles.xmaxfreqr; - if nargout==0 - %if ~isempty(xmaxp) - if get(handles.radiobutton_freqr, 'Value') || get(handles.radiobutton_impr, 'Value') - % posaxes1 = get(gca,'YLim'); - msgtx = 'Working, please wait...'; - text(mean(xmaxp)/3, 1.12, msgtx,'FontSize',14, 'color', 'k') - drawnow - end - %end + xmaxp = handles.xmaxfreqr; + if nargout==0 + %if ~isempty(xmaxp) + if get(handles.radiobutton_freqr, 'Value') || get(handles.radiobutton_impr, 'Value') + % posaxes1 = get(gca,'YLim'); + msgtx = 'Working, please wait...'; + text(mean(xmaxp)/3, 1.12, msgtx,'FontSize',14, 'color', 'k') + drawnow end + %end + end end fs = handles.fs; @@ -1215,15 +1232,15 @@ function no_filter(hObject,handles, msgtx) order = getorder(handles); if isempty(order) - disp('Still busy...') - return + disp('Still busy...') + return end if get(handles.radiobutton_butter, 'Value'); % 0 means Butterworth - typef = 0; + typef = 0; elseif get(handles.radiobutton_fir, 'Value'); % 1 means FIR - typef = 1; + typef = 1; elseif get(handles.radiobutton_PM_notch, 'Value'); % 2 means PM Notch - typef = 2; + typef = 2; end n = round(fnyq); % number of points for frequency response. @@ -1233,12 +1250,12 @@ function no_filter(hObject,handles, msgtx) % Augmented number of points for frequency response. % if hpzoom<=5 - n = n*50; + n = n*50; elseif hpzoom<=0.5 - n = n*1000; + n = n*1000; end if typef==2 % PM Notch - valuel = valueh; + valuel = valueh; end bt = []; @@ -1247,171 +1264,171 @@ function no_filter(hObject,handles, msgtx) [bt, at, labelf, v, frec3dB, xdB_at_fx, orderx] = filter_tf(typef, order, valuel, valueh, fs); if ~v % something is wrong or turned off - disp('Filter coefficient calculation failed...') - if get(handles.radiobutton_freqr, 'Value') ||... - get(handles.radiobutton_impr, 'Value') ||... - get(handles.radiobutton_fdatafr, 'Value') - msgtx = '--NO FILTERING--'; - no_filter(hObject, handles, msgtx) - end - - handles.autorder = 0; - % Update handles structure - guidata(hObject, handles); - return + disp('Filter coefficient calculation failed...') + if get(handles.radiobutton_freqr, 'Value') ||... + get(handles.radiobutton_impr, 'Value') ||... + get(handles.radiobutton_fdatafr, 'Value') + msgtx = '--NO FILTERING--'; + no_filter(hObject, handles, msgtx) + end + + handles.autorder = 0; + % Update handles structure + guidata(hObject, handles); + return else - autorder = handles.autorder; + autorder = handles.autorder; end if ~isempty(orderx) - if orderx~=order - order = orderx; - str = ['\nWARNING: Odd order symmetric FIR filters must have a gain of zero \n'... - 'at the Nyquist frequency. The order has been increased to %g.\n']; - fprintf(str, order); - end + if orderx~=order + order = orderx; + str = ['\nWARNING: Odd order symmetric FIR filters must have a gain of zero \n'... + 'at the Nyquist frequency. The order has been increased to %g.\n']; + fprintf(str, order); + end end % % Automin for FIR % if autorder == 1 && typef==1 - slidersoff(hObject, eventdata, handles) - orderlist = cellstr(get(handles.popupmenu_order,'String')); - orderlist{1} = 'automin...'; - set(handles.popupmenu_order, 'String', orderlist) - set(handles.popupmenu_order, 'Value', 1) - set(handles.text_halfamp, 'String','updating...'); - set(handles.text_halfpow, 'String','updating...'); - drawnow - xdB_at_fx = 0; - order = 4; - j=1; + slidersoff(hObject, eventdata, handles) + orderlist = cellstr(get(handles.popupmenu_order,'String')); + orderlist{1} = 'automin...'; + set(handles.popupmenu_order, 'String', orderlist) + set(handles.popupmenu_order, 'Value', 1) + set(handles.text_halfamp, 'String','updating...'); + set(handles.text_halfpow, 'String','updating...'); + drawnow + xdB_at_fx = 0; + order = 4; + j=1; + + while mean(xdB_at_fx)~=-6 && order<=4096-2 && j<=2000% && get(handles.popupmenu_order,'Value')==1 - while mean(xdB_at_fx)~=-6 && order<=4096-2 && j<=2000% && get(handles.popupmenu_order,'Value')==1 - - if mean(xdB_at_fx)==0 - order = order + 32; - elseif mean(xdB_at_fx)>-3 && mean(xdB_at_fx)<0 - order = order + 8; - else - order = order + 4; - end - - [bt, at, labelf, v, frec3dB, xdB_at_fx, orderx] = filter_tf(typef, order, valuel, valueh, fs); - - if isempty(xdB_at_fx) - xdB_at_fx = 0; - end - if v - if orderx~=order - if mod(orderx,4)==0 - order = orderx; - else - order = orderx + 2; - end - str = ['\nWARNING: Odd order symmetric FIR filters must have a gain of zero \n'... - 'at the Nyquist frequency. The order has been increased to %g.\n']; - fprintf(str, order); - end - end - end - if mean(xdB_at_fx)==-6 - orderlist{1} = ['automin:' num2str(order)]; - set(handles.popupmenu_order, 'String', orderlist) - set(handles.popupmenu_order, 'Value', 1) - disp('min order was found.') - iswarnroff = 0; + if mean(xdB_at_fx)==0 + order = order + 32; + elseif mean(xdB_at_fx)>-3 && mean(xdB_at_fx)<0 + order = order + 8; else - orderlist{1} = 'automin'; - set(handles.popupmenu_order, 'String', orderlist) - set(handles.popupmenu_order, 'Value', length(orderlist)) - handles.autorder = 0; - iswarnroff = 1; % atenuation at frquency cutoff was impposible... - - % Update handles structure - guidata(hObject, handles); - disp('min order was not found...') + order = order + 4; end - sliderson(hObject, eventdata, handles) - drawnow -else - if mean(xdB_at_fx)==-6 - iswarnroff =0; - else - iswarnroff =1; + [bt, at, labelf, v, frec3dB, xdB_at_fx, orderx] = filter_tf(typef, order, valuel, valueh, fs); + + if isempty(xdB_at_fx) + xdB_at_fx = 0; end -end -if ~v % something is wrong or turned off (1 means everything is ok) - if get(handles.radiobutton_freqr, 'Value') ||... - get(handles.radiobutton_impr, 'Value') ||... - get(handles.radiobutton_fdatafr, 'Value') - - msgtx = '--NO FILTERING--'; - no_filter(hObject, handles, msgtx) + if v + if orderx~=order + if mod(orderx,4)==0 + order = orderx; + else + order = orderx + 2; + end + str = ['\nWARNING: Odd order symmetric FIR filters must have a gain of zero \n'... + 'at the Nyquist frequency. The order has been increased to %g.\n']; + fprintf(str, order); + end end - disp('Filter coefficient calculation failed....') + end + if mean(xdB_at_fx)==-6 + orderlist{1} = ['automin:' num2str(order)]; + set(handles.popupmenu_order, 'String', orderlist) + set(handles.popupmenu_order, 'Value', 1) + disp('min order was found.') + iswarnroff = 0; + else + orderlist{1} = 'automin'; + set(handles.popupmenu_order, 'String', orderlist) + set(handles.popupmenu_order, 'Value', length(orderlist)) handles.autorder = 0; + iswarnroff = 1; % atenuation at frquency cutoff was impposible... + % Update handles structure guidata(hObject, handles); - return + disp('min order was not found...') + end + + sliderson(hObject, eventdata, handles) + drawnow +else + if mean(xdB_at_fx)==-6 + iswarnroff =0; + else + iswarnroff =1; + end +end +if ~v % something is wrong or turned off (1 means everything is ok) + if get(handles.radiobutton_freqr, 'Value') ||... + get(handles.radiobutton_impr, 'Value') ||... + get(handles.radiobutton_fdatafr, 'Value') + + msgtx = '--NO FILTERING--'; + no_filter(hObject, handles, msgtx) + end + disp('Filter coefficient calculation failed....') + handles.autorder = 0; + % Update handles structure + guidata(hObject, handles); + return end % % Final filter coefficients % if size(bt,1)==2 - if strcmpi(labelf,'Band-Pass') - % cascade filter transfer function - b = conv(bt(1,:),bt(2,:)); - a = conv(at(1,:),at(2,:)); - else - % parallel filter transfer function - b = conv(bt(1,:),at(2,:)) + conv(bt(2,:),at(1,:)); - a = conv(at(1,:),at(2,:)); - end + if strcmpi(labelf,'Band-Pass') + % cascade filter transfer function + b = conv(bt(1,:),bt(2,:)); + a = conv(at(1,:),at(2,:)); + else + % parallel filter transfer function + b = conv(bt(1,:),at(2,:)) + conv(bt(2,:),at(1,:)); + a = conv(at(1,:),at(2,:)); + end else - b = bt; - a = at; + b = bt; + a = at; end % % Half power cuttoff (-3 dB) (ONLY FOR FILTFILT!) % if ~isempty(frec3dB) - if strcmpi(labelf, 'Low-pass') - f3str = sprintf('%7.2f', frec3dB); - set(handles.edit2_highpass,'String','---') - set(handles.edit2_highpass,'Enable','off') - set(handles.edit2_lowpass,'String', f3str) - set(handles.edit2_lowpass, 'BackgroundColor', [1 1 0.5]); - elseif strcmpi(labelf, 'High-pass') - f3str = sprintf('%7.2f', frec3dB); - set(handles.edit2_highpass,'String',f3str) - set(handles.edit2_highpass, 'BackgroundColor', [1 1 0.5]); - set(handles.edit2_lowpass,'String', '---') - set(handles.edit2_lowpass,'Enable','off') - else - try - f3str1 = sprintf('%7.2f', frec3dB(1)); - f3str2 = sprintf('%7.2f', frec3dB(2)); - set(handles.edit2_highpass,'String', f3str2) - set(handles.edit2_lowpass,'String', f3str1) - %set(handles.edit2_lowpass, 'BackgroundColor', [1 1 0.5]); - set(handles.edit2_highpass, 'BackgroundColor', [1 1 0.5]); - set(handles.edit2_lowpass, 'BackgroundColor', [1 1 0.5]); - catch - set(handles.edit2_highpass,'String','---') - set(handles.edit2_lowpass,'String', '---') - set(handles.edit2_highpass,'Enable','off') - set(handles.edit2_lowpass,'Enable','off') - end - end -else + if strcmpi(labelf, 'Low-pass') + f3str = sprintf('%7.2f', frec3dB); set(handles.edit2_highpass,'String','---') - set(handles.edit2_lowpass,'String','---') set(handles.edit2_highpass,'Enable','off') + set(handles.edit2_lowpass,'String', f3str) + set(handles.edit2_lowpass, 'BackgroundColor', [1 1 0.5]); + elseif strcmpi(labelf, 'High-pass') + f3str = sprintf('%7.2f', frec3dB); + set(handles.edit2_highpass,'String',f3str) + set(handles.edit2_highpass, 'BackgroundColor', [1 1 0.5]); + set(handles.edit2_lowpass,'String', '---') set(handles.edit2_lowpass,'Enable','off') + else + try + f3str1 = sprintf('%7.2f', frec3dB(1)); + f3str2 = sprintf('%7.2f', frec3dB(2)); + set(handles.edit2_highpass,'String', f3str2) + set(handles.edit2_lowpass,'String', f3str1) + %set(handles.edit2_lowpass, 'BackgroundColor', [1 1 0.5]); + set(handles.edit2_highpass, 'BackgroundColor', [1 1 0.5]); + set(handles.edit2_lowpass, 'BackgroundColor', [1 1 0.5]); + catch + set(handles.edit2_highpass,'String','---') + set(handles.edit2_lowpass,'String', '---') + set(handles.edit2_highpass,'Enable','off') + set(handles.edit2_lowpass,'Enable','off') + end + end +else + set(handles.edit2_highpass,'String','---') + set(handles.edit2_lowpass,'String','---') + set(handles.edit2_highpass,'Enable','off') + set(handles.edit2_lowpass,'Enable','off') end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1436,365 +1453,365 @@ function no_filter(hObject,handles, msgtx) gain_postU = 1+0.05; % 5% criteria if max(abs(hfr))>=gain_postL && max(abs(hfr))<=gain_postU && (max(abs(hfr))-min(abs(hfr)))>0.95 + + iswarngain = 0; % gain is fine + + % + % Slider memory + % + handles.memvaluel = round(valuel); + handles.memvalueh = round(valueh); + handles.mem6dbl = num2str(ceil(str2num(get(handles.edit_lowpass,'String')))); + handles.mem6dbh = num2str(floor(str2num(get(handles.edit_highpass,'String')))); + handles.mem3dbl = num2str(ceil(str2num(get(handles.edit2_lowpass,'String')))); + handles.mem3dbh = num2str(floor(str2num(get(handles.edit2_highpass,'String')))); + +elseif max(abs(hfr))>=gain_postL && max(abs(hfr))<=gain_postU && (max(abs(hfr))-min(abs(hfr)))<=0.75 + iswarngain = 3; + xdB_at_fx = []; +else + if max(abs(hfr))=4096 + BackERPLABcolor = [ 1 1 0]; - iswarngain = 0; % gain is fine + question = ['Unable to achieve specified cutoff (-6dB). Higher filter order is needed,\n'... + 'but order greater than 4096 is not allowed for this ERPLAB version.\n'... + 'You may either select a wider passband with automin (recommended),\n'... + 'or turn off automin and leave with the reduced attenuation (not recommended)']; + + questionstr = sprintf(question); + titlex = 'ERPLAB: Filter order'; + oldcolor = get(0,'DefaultUicontrolBackgroundColor'); + set(0,'DefaultUicontrolBackgroundColor',BackERPLABcolor) + button = questdlg(questionstr, titlex,'OK','Reset filters','OK'); + set(0,'DefaultUicontrolBackgroundColor',oldcolor) % - % Slider memory + % reset order % - handles.memvaluel = round(valuel); - handles.memvalueh = round(valueh); - handles.mem6dbl = num2str(ceil(str2num(get(handles.edit_lowpass,'String')))); - handles.mem6dbh = num2str(floor(str2num(get(handles.edit_highpass,'String')))); - handles.mem3dbl = num2str(ceil(str2num(get(handles.edit2_lowpass,'String')))); - handles.mem3dbh = num2str(floor(str2num(get(handles.edit2_highpass,'String')))); + orderlist = cellstr(get(handles.popupmenu_order, 'String')); + orderindx = get(handles.popupmenu_order, 'Value'); + order = str2num(strrep(orderlist{orderindx},'automin:','')); + orderlist{1} = 'automin'; + [tfx, posord] = ismember_bc2(order,[-1 4:4:4096]); -elseif max(abs(hfr))>=gain_postL && max(abs(hfr))<=gain_postU && (max(abs(hfr))-min(abs(hfr)))<=0.75 - iswarngain = 3; - xdB_at_fx = []; -else - if max(abs(hfr))=4096 - BackERPLABcolor = [ 1 1 0]; - - question = ['Unable to achieve specified cutoff (-6dB). Higher filter order is needed,\n'... - 'but order greater than 4096 is not allowed for this ERPLAB version.\n'... - 'You may either select a wider passband with automin (recommended),\n'... - 'or turn off automin and leave with the reduced attenuation (not recommended)']; - - questionstr = sprintf(question); - titlex = 'ERPLAB: Filter order'; - oldcolor = get(0,'DefaultUicontrolBackgroundColor'); - set(0,'DefaultUicontrolBackgroundColor',BackERPLABcolor) - button = questdlg(questionstr, titlex,'OK','Reset filters','OK'); - set(0,'DefaultUicontrolBackgroundColor',oldcolor) - - % - % reset order - % - orderlist = cellstr(get(handles.popupmenu_order, 'String')); - orderindx = get(handles.popupmenu_order, 'Value'); - order = str2num(strrep(orderlist{orderindx},'automin:','')); - orderlist{1} = 'automin'; - [tfx, posord] = ismember_bc2(order,[-1 4:4:4096]); - - set(handles.popupmenu_order, 'String',orderlist) - set(handles.popupmenu_order, 'Value',posord) - set(handles.popupmenu_dboct, 'String','---') - set(handles.popupmenu_dbdec, 'String','---') - set(handles.popupmenu_dboct, 'Value',1) - set(handles.popupmenu_dbdec, 'Value',1) - handles.autorder = 0; + end +elseif iswarngain~=0 && iswarnroff==0 + if autorder == 1 && typef==0 + slidersoff(hObject, eventdata, handles) + + % + % Filter order + % + order = getorder(handles); + + if isempty(order) + disp('Ops, I could not read the filter order...') + sliderson(hObject, eventdata, handles) + return + end + + order = order + 2; % increase the order + ishopermission = handles.ishopermission; % permission for higher order when high-pass filter cutoff is <=0.5 + + if order>2 && order<=8 && valueh>0 && valueh<=0.5 && ~ishopermission + question = ['We do not recommend a filter order greater than 2 for a Butterworth filter\n '... + 'when the high-pass cutoff is <= 0.5 Hz\n'... + 'Continue anyway?']; + titlex = 'ERPLAB: Filter order'; + button = askquest(sprintf(question), titlex); + + if ~strcmpi(button,'yes') + set(handles.slider_highpass, 'Value', 0); + set(handles.slider_lowpass, 'Value', handles.memvaluel); - if strcmpi(button,'OK') - set(handles.slider_highpass, 'Value', handles.memvalueh); - set(handles.slider_lowpass, 'Value', handles.memvaluel); - chksliders(hObject, eventdata, handles) - set(handles.edit_highpass, 'String', handles.mem6dbh); - set(handles.edit_lowpass, 'String', handles.mem6dbl); - set(handles.edit2_highpass, 'String', handles.mem3dbh); - set(handles.edit2_lowpass, 'String', handles.mem3dbl); - set(handles.edit2_highpass, 'BackgroundColor', [1 1 0.5]); - set(handles.edit2_lowpass, 'BackgroundColor', [1 1 0.5]); - sliderson(hObject, eventdata, handles) - - % Update handles structure - guidata(hObject, handles); - plotresponsefilter(hObject, eventdata, handles); - return + if handles.memvaluel==0 + set(handles.slider_lowpass, 'Enable', 'off'); + set(handles.togglebutton_lowpass,'Value',0) + set(handles.edit_lowpass, 'String', '0'); + set(handles.edit_lowpass, 'Enable', 'off'); + set(handles.edit2_lowpass, 'String', '---'); + set(handles.edit2_lowpass, 'Enable', 'off'); else - sliderson(hObject, eventdata, handles) - set(handles.slider_highpass, 'Value', 0); - set(handles.slider_lowpass, 'Value', fnyq/2); - chksliders(hObject, eventdata, handles) - handles.memvalueh = 0.1; - handles.mvalueh = 0.1; % memory value highpass - - % Update handles structure - guidata(hObject, handles); - plotresponsefilter(hObject, eventdata, handles); - return + set(handles.edit_lowpass, 'String', handles.mem6dbl); + set(handles.edit2_lowpass, 'String', handles.mem3dbl); + set(handles.edit2_lowpass, 'BackgroundColor', [1 1 0.5]); end - end -elseif iswarngain~=0 && iswarnroff==0 - if autorder == 1 && typef==0 - slidersoff(hObject, eventdata, handles) - % - % Filter order - % - order = getorder(handles); + set(handles.edit_highpass, 'String', handles.mem6dbh); + set(handles.edit2_highpass, 'String', handles.mem3dbh); + set(handles.edit2_highpass, 'BackgroundColor', [1 1 0.5]); + set(handles.popupmenu_order, 'Value', 2); + handles.autorder = 0; + handles.ishopermission =0; + chksliders(hObject, eventdata, handles) - if isempty(order) - disp('Ops, I could not read the filter order...') - sliderson(hObject, eventdata, handles) - return - end + % Update handles structure + guidata(hObject, handles); + plotresponsefilter(hObject, eventdata, handles); + sliderson(hObject, eventdata, handles) + return + else + chksliders(hObject, eventdata, handles) + handles.ishopermission = 1; + % Update handles structure + guidata(hObject, handles); + end + + sliderson(hObject, eventdata, handles) + return + end + if order>8 + + BackERPLABcolor = [ 1 1 0]; + + if iswarngain==3 + line01 = 'You are losing stopband attenuation!'; + else + line01 = 'You are losing passband gain!'; + end + + question = ['WARNING: %s \n\n'... + 'In order to use the automin feature, a higher Butterworth filter order is needed, '... + 'but an order greater than 8 is not allowed for this ERPLAB version. '... + 'You may select a wider passband with automin (recommended), '... + 'or turn off automin and leave with the reduced gain (not recommended).']; + + titlex = 'ERPLAB: Filter order'; + + oldcolor = get(0,'DefaultUicontrolBackgroundColor'); + set(0,'DefaultUicontrolBackgroundColor',BackERPLABcolor) + button = questdlg(sprintf(question, line01), titlex,'OK','Reset filters','OK'); + set(0,'DefaultUicontrolBackgroundColor',oldcolor) + + % + % reset order + % + orderlist = cellstr(get(handles.popupmenu_order, 'String')); + orderindx = get(handles.popupmenu_order, 'Value'); + order = str2num(strrep(orderlist{orderindx},'automin:','')); + orderlist{1} = 'automin'; + [tfx, posord] = ismember_bc2(order,[-1 2 4 6 8]); + + set(handles.popupmenu_order, 'String',orderlist) + set(handles.popupmenu_order, 'Value',posord) + set(handles.popupmenu_dboct, 'Value',posord-1) + set(handles.popupmenu_dbdec, 'Value',posord-1) + handles.autorder = 0; + + if strcmpi(button,'OK') + set(handles.slider_highpass, 'Value', handles.memvalueh); + set(handles.slider_lowpass, 'Value', handles.memvaluel); + chksliders(hObject, eventdata, handles) + set(handles.edit_highpass, 'String', handles.mem6dbh); + set(handles.edit_lowpass, 'String', handles.mem6dbl); + set(handles.edit2_highpass, 'String', handles.mem3dbh); + set(handles.edit2_lowpass, 'String', handles.mem3dbl); + set(handles.edit2_highpass, 'BackgroundColor', [1 1 0.5]); + set(handles.edit2_lowpass, 'BackgroundColor', [1 1 0.5]); + % Update handles structure + guidata(hObject, handles); - order = order + 2; % increase the order - ishopermission = handles.ishopermission; % permission for higher order when high-pass filter cutoff is <=0.5 + sliderson(hObject, eventdata, handles) + plotresponsefilter(hObject, eventdata, handles); + return + else + sliderson(hObject, eventdata, handles) + set(handles.slider_highpass, 'Value', 0); + set(handles.slider_lowpass, 'Value', fnyq/2); + chksliders(hObject, eventdata, handles) + handles.memvalueh = 0.1; + handles.mvalueh = 0.1; % memory value highpass - if order>2 && order<=8 && valueh>0 && valueh<=0.5 && ~ishopermission - question = ['We do not recommend a filter order greater than 2 for a Butterworth filter\n '... - 'when the high-pass cutoff is <= 0.5 Hz\n'... - 'Continue anyway?']; - titlex = 'ERPLAB: Filter order'; - button = askquest(sprintf(question), titlex); - - if ~strcmpi(button,'yes') - set(handles.slider_highpass, 'Value', 0); - set(handles.slider_lowpass, 'Value', handles.memvaluel); - - if handles.memvaluel==0 - set(handles.slider_lowpass, 'Enable', 'off'); - set(handles.togglebutton_lowpass,'Value',0) - set(handles.edit_lowpass, 'String', '0'); - set(handles.edit_lowpass, 'Enable', 'off'); - set(handles.edit2_lowpass, 'String', '---'); - set(handles.edit2_lowpass, 'Enable', 'off'); - else - set(handles.edit_lowpass, 'String', handles.mem6dbl); - set(handles.edit2_lowpass, 'String', handles.mem3dbl); - set(handles.edit2_lowpass, 'BackgroundColor', [1 1 0.5]); - end - - set(handles.edit_highpass, 'String', handles.mem6dbh); - set(handles.edit2_highpass, 'String', handles.mem3dbh); - set(handles.edit2_highpass, 'BackgroundColor', [1 1 0.5]); - set(handles.popupmenu_order, 'Value', 2); - handles.autorder = 0; - handles.ishopermission =0; - chksliders(hObject, eventdata, handles) - - % Update handles structure - guidata(hObject, handles); - plotresponsefilter(hObject, eventdata, handles); - sliderson(hObject, eventdata, handles) - return - else - chksliders(hObject, eventdata, handles) - handles.ishopermission = 1; - % Update handles structure - guidata(hObject, handles); - end - - sliderson(hObject, eventdata, handles) - return - end - if order>8 - - BackERPLABcolor = [ 1 1 0]; - - if iswarngain==3 - line01 = 'You are losing stopband attenuation!'; - else - line01 = 'You are losing passband gain!'; - end - - question = ['WARNING: %s \n\n'... - 'In order to use the automin feature, a higher Butterworth filter order is needed, '... - 'but an order greater than 8 is not allowed for this ERPLAB version. '... - 'You may select a wider passband with automin (recommended), '... - 'or turn off automin and leave with the reduced gain (not recommended).']; - - titlex = 'ERPLAB: Filter order'; - - oldcolor = get(0,'DefaultUicontrolBackgroundColor'); - set(0,'DefaultUicontrolBackgroundColor',BackERPLABcolor) - button = questdlg(sprintf(question, line01), titlex,'OK','Reset filters','OK'); - set(0,'DefaultUicontrolBackgroundColor',oldcolor) - - % - % reset order - % - orderlist = cellstr(get(handles.popupmenu_order, 'String')); - orderindx = get(handles.popupmenu_order, 'Value'); - order = str2num(strrep(orderlist{orderindx},'automin:','')); - orderlist{1} = 'automin'; - [tfx, posord] = ismember_bc2(order,[-1 2 4 6 8]); - - set(handles.popupmenu_order, 'String',orderlist) - set(handles.popupmenu_order, 'Value',posord) - set(handles.popupmenu_dboct, 'Value',posord-1) - set(handles.popupmenu_dbdec, 'Value',posord-1) - handles.autorder = 0; - - if strcmpi(button,'OK') - set(handles.slider_highpass, 'Value', handles.memvalueh); - set(handles.slider_lowpass, 'Value', handles.memvaluel); - chksliders(hObject, eventdata, handles) - set(handles.edit_highpass, 'String', handles.mem6dbh); - set(handles.edit_lowpass, 'String', handles.mem6dbl); - set(handles.edit2_highpass, 'String', handles.mem3dbh); - set(handles.edit2_lowpass, 'String', handles.mem3dbl); - set(handles.edit2_highpass, 'BackgroundColor', [1 1 0.5]); - set(handles.edit2_lowpass, 'BackgroundColor', [1 1 0.5]); - % Update handles structure - guidata(hObject, handles); - - sliderson(hObject, eventdata, handles) - plotresponsefilter(hObject, eventdata, handles); - return - else - sliderson(hObject, eventdata, handles) - set(handles.slider_highpass, 'Value', 0); - set(handles.slider_lowpass, 'Value', fnyq/2); - chksliders(hObject, eventdata, handles) - handles.memvalueh = 0.1; - handles.mvalueh = 0.1; % memory value highpass - - ordervector = 2:2:8; - set(handles.popupmenu_order,'String', char([{'automin'}; cellstr(num2str(ordervector'))])) % set order list - set(handles.popupmenu_order,'Value', 2); - - % Update handles structure - guidata(hObject, handles); - - plotresponsefilter(hObject, eventdata, handles); - return - end - else - rolloffindx = get(handles.popupmenu_dboct,'Value'); - rolloffindx = rolloffindx + 1; - set(handles.popupmenu_dboct,'Value', rolloffindx); - set(handles.popupmenu_dbdec,'Value', rolloffindx); - end + ordervector = 2:2:8; + set(handles.popupmenu_order,'String', char([{'automin'}; cellstr(num2str(ordervector'))])) % set order list + set(handles.popupmenu_order,'Value', 2); - orderlist = cellstr(get(handles.popupmenu_order, 'String')); - orderlist{1} = ['automin:' num2str(order)]; - set(handles.popupmenu_order, 'String', orderlist) - set(handles.popupmenu_order, 'Value', 1) - sliderson(hObject, eventdata, handles) + % Update handles structure + guidata(hObject, handles); plotresponsefilter(hObject, eventdata, handles); return + end + else + rolloffindx = get(handles.popupmenu_dboct,'Value'); + rolloffindx = rolloffindx + 1; + set(handles.popupmenu_dboct,'Value', rolloffindx); + set(handles.popupmenu_dbdec,'Value', rolloffindx); end + + orderlist = cellstr(get(handles.popupmenu_order, 'String')); + orderlist{1} = ['automin:' num2str(order)]; + set(handles.popupmenu_order, 'String', orderlist) + set(handles.popupmenu_order, 'Value', 1) + sliderson(hObject, eventdata, handles) + + plotresponsefilter(hObject, eventdata, handles); + return + end end % hfig = axes(handles.axes1); if get(handles.radiobutton_freqr,'Value') - h = hfr; - f = f1; - color = [0 0 0.75]; - FRscale = get(handles.popupmenu_FRscale, 'Value'); - - if FRscale==1 - ymax = 1.25; - ymin = -0.075; %6.25% of ymax - - ymaxb = 1; - yminb = 0; - plot(f, h, 'linewidth', 2, 'LineSmoothing','on','Color', color) - ylabel('passband gain') - else - ymax = 10; - ymin = -65; - ymaxb = 0; - yminb = -90; - plot(f, 20*log10(h), 'linewidth', 2, 'LineSmoothing','on','Color', color) - ylabel('passband gain in dB') - end - - xlabel('frequency (Hz)') - - if get(handles.radiobutton_ideal, 'Value') - drawidealresp(handles, labelf, fnyq, valuel, valueh, yminb, ymaxb) - end - if typef~=2 - if iswarngain==1 - yym = max(hfr); - - if yym>1 - yym=0.3; - end - - xxm = hpzoom/5; - text(xxm, yym+0.2,' Losing passband gain!','FontSize',10) - text(xxm, yym+0.1,' Increase the order of the filter or select automin.','FontSize',10) - set(gca,'Color', 'y') - - elseif iswarngain==2 - - yym = max(hfr); - - if yym>1 - yym=0.3; - end - - xxm = hpzoom/5; - text(xxm, yym+0.2,' Passband gain of 1 was overpassed!','FontSize',10) - text(xxm, yym+0.1,' Increase the order of the filter or select automin.','FontSize',10) - set(gca,'Color', 'y') - - elseif iswarngain==3 - - yym = max(hfr); - - if yym>1 - yym=0.3; - end - - xxm = hpzoom/5; - text(xxm, yym+0.2,' Losing stopband attenuation','FontSize',10) - text(xxm, yym+0.1,' Increase the order of the filter or select automin.','FontSize',10) - set(gca,'Color', 'y') - - elseif iswarnroff==0 && iswarngain==0 - set(gca,'Color', 'w') - end - else - set(gca,'Color', 'w') + h = hfr; + f = f1; + color = [0 0 0.75]; + FRscale = get(handles.popupmenu_FRscale, 'Value'); + + if FRscale==1 + ymax = 1.25; + ymin = -0.075; %6.25% of ymax - + ymaxb = 1; + yminb = 0; + plot(f, h, 'linewidth', 2, 'LineSmoothing','on','Color', color) + ylabel('passband gain') + else + ymax = 10; + ymin = -65; + ymaxb = 0; + yminb = -90; + plot(f, 20*log10(h), 'linewidth', 2, 'LineSmoothing','on','Color', color) + ylabel('passband gain in dB') + end + + xlabel('frequency (Hz)') + + if get(handles.radiobutton_ideal, 'Value') + drawidealresp(handles, labelf, fnyq, valuel, valueh, yminb, ymaxb) + end + if typef~=2 + if iswarngain==1 + yym = max(hfr); + + if yym>1 + yym=0.3; + end + + xxm = hpzoom/5; + text(xxm, yym+0.2,' Losing passband gain!','FontSize',10) + text(xxm, yym+0.1,' Increase the order of the filter or select automin.','FontSize',10) + set(gca,'Color', 'y') + + elseif iswarngain==2 + + yym = max(hfr); + + if yym>1 + yym=0.3; + end + + xxm = hpzoom/5; + text(xxm, yym+0.2,' Passband gain of 1 was overpassed!','FontSize',10) + text(xxm, yym+0.1,' Increase the order of the filter or select automin.','FontSize',10) + set(gca,'Color', 'y') + + elseif iswarngain==3 + + yym = max(hfr); + + if yym>1 + yym=0.3; + end + + xxm = hpzoom/5; + text(xxm, yym+0.2,' Losing stopband attenuation','FontSize',10) + text(xxm, yym+0.1,' Increase the order of the filter or select automin.','FontSize',10) + set(gca,'Color', 'y') + + elseif iswarnroff==0 && iswarngain==0 + set(gca,'Color', 'w') end - + else + set(gca,'Color', 'w') + end + elseif get(handles.radiobutton_impr,'Value') - h = hir; % impulse - f = f3; %1:length(h); - ymax = max(h)*1.2; - ymin = min(h)*1.2; - color = [0.78 0 0.1]; - stem(f, h, 'linewidth', 2, 'Color', color); - xlabel('time (msec)') - ylabel('amplitude') + h = hir; % impulse + f = f3; %1:length(h); + ymax = max(h)*1.2; + ymin = min(h)*1.2; + color = [0.78 0 0.1]; + stem(f, h, 'linewidth', 2, 'Color', color); + xlabel('time (msec)') + ylabel('amplitude') else - return + return end % % True attenuation value at specified cutoff frequency (it must be -6db, otherwise...) % if ~isempty(xdB_at_fx) - - attvaldB = round(mean(xdB_at_fx)); - - if attvaldB==-6 && typef==0 - string4HA = ['Half-Amp(' num2str(attvaldB) 'dB)']; + + attvaldB = round(mean(xdB_at_fx)); + + if attvaldB==-6 && typef==0 + string4HA = ['Half-Amp(' num2str(attvaldB) 'dB)']; + coloratt = 'k'; + else + if typef~=2 + attvalgain = 10^(attvaldB/20); + string4HA = [sprintf('%.2f',attvalgain) '-Amp(' num2str(attvaldB) 'dB)']; + + if attvaldB==-6 && typef==1 coloratt = 'k'; + else + coloratt = 'r'; + end else - if typef~=2 - attvalgain = 10^(attvaldB/20); - string4HA = [sprintf('%.2f',attvalgain) '-Amp(' num2str(attvaldB) 'dB)']; - - if attvaldB==-6 && typef==1 - coloratt = 'k'; - else - coloratt = 'r'; - end - else - string4HA = 'Center frequency'; - coloratt = 'k'; - end + string4HA = 'Center frequency'; + coloratt = 'k'; end - set(handles.text_halfamp,'String', string4HA, 'ForegroundColor', coloratt) - set(handles.text_halfpow,'String', 'Half-Power(-3dB)', 'ForegroundColor', 'k') + end + set(handles.text_halfamp,'String', string4HA, 'ForegroundColor', coloratt) + set(handles.text_halfpow,'String', 'Half-Power(-3dB)', 'ForegroundColor', 'k') else - set(handles.text_halfamp,'String', '--- ???dB ---', 'ForegroundColor', 'r') - set(handles.text_halfpow,'String', '--- ???dB ---', 'ForegroundColor', 'r') + set(handles.text_halfamp,'String', '--- ???dB ---', 'ForegroundColor', 'r') + set(handles.text_halfpow,'String', '--- ???dB ---', 'ForegroundColor', 'r') end % @@ -1803,18 +1820,18 @@ function no_filter(hObject,handles, msgtx) xmaxp = str2num(char(get(handles.edit_xmaxplot, 'String'))); if isempty(xmaxp) - xmaxp = [0 max(f)]; - if get(handles.radiobutton_fdatafr,'Value') || get(handles.radiobutton_freqr,'Value') - handles.xmaxfreqr = xmaxp; - else - handles.xmaxpimpz = xmaxp; - end + xmaxp = [0 max(f)]; + if get(handles.radiobutton_fdatafr,'Value') || get(handles.radiobutton_freqr,'Value') + handles.xmaxfreqr = xmaxp; + else + handles.xmaxpimpz = xmaxp; + end else - if get(handles.radiobutton_fdatafr,'Value') || get(handles.radiobutton_freqr,'Value') - xmaxp = handles.xmaxfreqr; - else - xmaxp = handles.xmaxpimpz; - end + if get(handles.radiobutton_fdatafr,'Value') || get(handles.radiobutton_freqr,'Value') + xmaxp = handles.xmaxfreqr; + else + xmaxp = handles.xmaxpimpz; + end end set(handles.edit_xmaxplot, 'String', num2str(xmaxp)); @@ -1834,27 +1851,27 @@ function no_filter(hObject,handles, msgtx) handles.datafr.yf = hfr; if typef==1 || typef==2 - - minboundarysamdist = handles.minboundarysamdist; - - if get(handles.checkbox_boundary,'Value') - if minboundarysamdist<3*order - BackERPLABcolor = [ 1 1 0]; - question = ['You have set the checkbox for filtering between boundary events.\n'... - 'Event codes ''boundary'' or -99 were found in your dataset.\n\n'... - 'However, at least one of the segments among boundaries \n'... - 'has fewer samples than 3 times the filter order you are currently setting.\n\n'... - 'You may either decrese the order of the filter - if it is possible - (recommended),\n'... - 'or uncheck the option for filtering between boundary events.']; - questionstr = sprintf(question); - titlex = 'ERPLAB: Filter order vs number of samples'; - oldcolor = get(0,'DefaultUicontrolBackgroundColor'); - set(0,'DefaultUicontrolBackgroundColor',BackERPLABcolor) - button = questdlg(questionstr, titlex,'OK','OK'); - set(0,'DefaultUicontrolBackgroundColor',oldcolor) - return - end + + minboundarysamdist = handles.minboundarysamdist; + + if get(handles.checkbox_boundary,'Value') + if minboundarysamdist<3*order + BackERPLABcolor = [ 1 1 0]; + question = ['You have set the checkbox for filtering between boundary events.\n'... + 'Event codes ''boundary'' or -99 were found in your dataset.\n\n'... + 'However, at least one of the segments among boundaries \n'... + 'has fewer samples than 3 times the filter order you are currently setting.\n\n'... + 'You may either decrese the order of the filter - if it is possible - (recommended),\n'... + 'or uncheck the option for filtering between boundary events.']; + questionstr = sprintf(question); + titlex = 'ERPLAB: Filter order vs number of samples'; + oldcolor = get(0,'DefaultUicontrolBackgroundColor'); + set(0,'DefaultUicontrolBackgroundColor',BackERPLABcolor) + button = questdlg(questionstr, titlex,'OK','OK'); + set(0,'DefaultUicontrolBackgroundColor',oldcolor) + return end + end end % Update handles structure @@ -1871,35 +1888,35 @@ function drawidealresp(handles, labelf, fnyq, valuel, valueh, yminb, ymaxb) alphaval = 0.7; if ismember_bc2(labelf, {'Low-pass','High-pass','Band-pass'}) - - if strcmpi(labelf,'High-pass') - valuelx = fnyq; - else - valuelx = valuel; - end - - patch([valueh valueh valuelx valuelx],[yminb ymaxb ymaxb yminb],'r',... - 'facecolor',colorband,... - 'edgecolor',colorband,... - 'facealpha',alphaval) + + if strcmpi(labelf,'High-pass') + valuelx = fnyq; + else + valuelx = valuel; + end + + patch([valueh valueh valuelx valuelx],[yminb ymaxb ymaxb yminb],'r',... + 'facecolor',colorband,... + 'edgecolor',colorband,... + 'facealpha',alphaval) elseif ismember_bc2(labelf,'Stop-band (Parks-McClellan Notch)') - patch([0 0 valuel-1.5 valuel-1.5],[yminb ymaxb ymaxb yminb],'r',... - 'facecolor',colorband,... - 'edgecolor',colorband,... - 'facealpha',alphaval) - patch([valueh+1.5 valueh+1.5 fnyq fnyq],[yminb ymaxb ymaxb yminb],'r',... - 'facecolor',colorband,... - 'edgecolor',colorband,... - 'facealpha',alphaval) + patch([0 0 valuel-1.5 valuel-1.5],[yminb ymaxb ymaxb yminb],'r',... + 'facecolor',colorband,... + 'edgecolor',colorband,... + 'facealpha',alphaval) + patch([valueh+1.5 valueh+1.5 fnyq fnyq],[yminb ymaxb ymaxb yminb],'r',... + 'facecolor',colorband,... + 'edgecolor',colorband,... + 'facealpha',alphaval) else - patch([0 0 valuel valuel],[yminb ymaxb ymaxb yminb],'r',... - 'facecolor',colorband,... - 'edgecolor',colorband,... - 'facealpha',alphaval) - patch([valueh valueh fnyq fnyq],[yminb ymaxb ymaxb yminb],'r',... - 'facecolor',colorband,... - 'edgecolor',colorband,... - 'facealpha',alphaval) + patch([0 0 valuel valuel],[yminb ymaxb ymaxb yminb],'r',... + 'facecolor',colorband,... + 'edgecolor',colorband,... + 'facealpha',alphaval) + patch([valueh valueh fnyq fnyq],[yminb ymaxb ymaxb yminb],'r',... + 'facecolor',colorband,... + 'edgecolor',colorband,... + 'facealpha',alphaval) end return @@ -1909,23 +1926,23 @@ function popupmenu_dboct_Callback(hObject, eventdata, handles) dboct = get(handles.popupmenu_dboct,'Value'); if get(handles.radiobutton_butter,'Value') - set(handles.popupmenu_order,'Value', dboct+1) - set(handles.popupmenu_dbdec,'Value', dboct) + set(handles.popupmenu_order,'Value', dboct+1) + set(handles.popupmenu_dbdec,'Value', dboct) end % % Plot corresponding response % if get(handles.radiobutton_fdatafr,'Value') - plotresponse_fd_data(hObject, eventdata, handles) + plotresponse_fd_data(hObject, eventdata, handles) elseif get(handles.radiobutton_freqr,'Value') || get(handles.radiobutton_impr,'Value') - plotresponsefilter(hObject, eventdata, handles); + plotresponsefilter(hObject, eventdata, handles); end %-------------------------------------------------------------------------- function popupmenu_dboct_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); + set(hObject,'BackgroundColor','white'); end %-------------------------------------------------------------------------- @@ -1934,144 +1951,144 @@ function popupmenu_dbdec_Callback(hObject, eventdata, handles) dbdec = get(handles.popupmenu_dbdec,'Value'); if get(handles.radiobutton_butter,'Value') - set(handles.popupmenu_order,'Value', dbdec+1); - set(handles.popupmenu_dboct,'Value', dbdec); + set(handles.popupmenu_order,'Value', dbdec+1); + set(handles.popupmenu_dboct,'Value', dbdec); end % % Plot corresponding response % if get(handles.radiobutton_fdatafr,'Value') - plotresponse_fd_data(hObject, eventdata, handles) + plotresponse_fd_data(hObject, eventdata, handles) elseif get(handles.radiobutton_freqr,'Value') || get(handles.radiobutton_impr,'Value') - plotresponsefilter(hObject, eventdata, handles); + plotresponsefilter(hObject, eventdata, handles); end %-------------------------------------------------------------------------- function popupmenu_dbdec_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); + set(hObject,'BackgroundColor','white'); end %-------------------------------------------------------------------------- function radiobutton_butter_Callback(hObject, eventdata, handles) if get(hObject,'Value') + + unsetnotchpm(hObject, eventdata, handles) + + if get(handles.togglebutton_lowpass,'Value')==1 && get(handles.togglebutton_highpass,'Value')==0 + set(handles.checkbox_removedc, 'Value', 0); + set(handles.checkbox_removedc, 'Enable', 'off'); + set(handles.slider_highpass, 'Value', 0); + set(handles.slider_highpass, 'Enable', 'off') + set(handles.togglebutton_highpass, 'Value', 0) + set(handles.edit_highpass,'String','0') + set(handles.edit_highpass,'Enable','off') + %set(handles.edit_highpass, 'BackgroundColor', [0.75 0.75 0.75]); + set(handles.togglebutton_highpass, 'BackgroundColor', [0.8 0.8 0.75]); - unsetnotchpm(hObject, eventdata, handles) - - if get(handles.togglebutton_lowpass,'Value')==1 && get(handles.togglebutton_highpass,'Value')==0 - set(handles.checkbox_removedc, 'Value', 0); - set(handles.checkbox_removedc, 'Enable', 'off'); - set(handles.slider_highpass, 'Value', 0); - set(handles.slider_highpass, 'Enable', 'off') - set(handles.togglebutton_highpass, 'Value', 0) - set(handles.edit_highpass,'String','0') - set(handles.edit_highpass,'Enable','off') - %set(handles.edit_highpass, 'BackgroundColor', [0.75 0.75 0.75]); - set(handles.togglebutton_highpass, 'BackgroundColor', [0.8 0.8 0.75]); - - elseif get(handles.togglebutton_lowpass,'Value')==0 && get(handles.togglebutton_highpass,'Value')==1 - colorband = [0.9922 0.9176 0.7961]; - set(handles.checkbox_removedc, 'Value', 1); - set(handles.checkbox_removedc, 'Enable', 'on'); - set(handles.slider_highpass, 'Enable', 'on') - set(handles.togglebutton_highpass, 'Value', 1) - %set(handles.edit_highpass, 'BackgroundColor', [1 1 1]); - end - - set(handles.radiobutton_fir,'Value',0) - ordervector = 2:2:8; - set(handles.popupmenu_order,'Enable','on') - set(handles.popupmenu_dboct,'Enable','on') - set(handles.popupmenu_dbdec,'Enable','on') - set(handles.popupmenu_order,'String', char([{'automin'}; cellstr(num2str(ordervector'))])) % set order list - set(handles.popupmenu_dboct,'String', num2str(6*ordervector')) % set db/oct list - set(handles.popupmenu_dbdec,'String', num2str(20*ordervector')) % set db/dec list - set(handles.popupmenu_order,'Value',2) - set(handles.popupmenu_dboct,'Value',1) - set(handles.popupmenu_dbdec,'Value',1) - if get(handles.radiobutton_ufdatafr,'Value') - plotresponse_uf_data(hObject, eventdata, handles); - else - plotresponsefilter(hObject, eventdata, handles); - end + elseif get(handles.togglebutton_lowpass,'Value')==0 && get(handles.togglebutton_highpass,'Value')==1 + colorband = [0.9922 0.9176 0.7961]; + set(handles.checkbox_removedc, 'Value', 1); + set(handles.checkbox_removedc, 'Enable', 'on'); + set(handles.slider_highpass, 'Enable', 'on') + set(handles.togglebutton_highpass, 'Value', 1) + %set(handles.edit_highpass, 'BackgroundColor', [1 1 1]); + end + + set(handles.radiobutton_fir,'Value',0) + ordervector = 2:2:8; + set(handles.popupmenu_order,'Enable','on') + set(handles.popupmenu_dboct,'Enable','on') + set(handles.popupmenu_dbdec,'Enable','on') + set(handles.popupmenu_order,'String', char([{'automin'}; cellstr(num2str(ordervector'))])) % set order list + set(handles.popupmenu_dboct,'String', num2str(6*ordervector')) % set db/oct list + set(handles.popupmenu_dbdec,'String', num2str(20*ordervector')) % set db/dec list + set(handles.popupmenu_order,'Value',2) + set(handles.popupmenu_dboct,'Value',1) + set(handles.popupmenu_dbdec,'Value',1) + if get(handles.radiobutton_ufdatafr,'Value') + plotresponse_uf_data(hObject, eventdata, handles); + else + plotresponsefilter(hObject, eventdata, handles); + end else - set(handles.radiobutton_butter,'Value',1) + set(handles.radiobutton_butter,'Value',1) end %-------------------------------------------------------------------------- function radiobutton_fir_Callback(hObject, eventdata, handles) if get(hObject,'Value') - - unsetnotchpm(hObject, eventdata, handles) - - if get(handles.togglebutton_lowpass,'Value')==1 && get(handles.togglebutton_highpass,'Value')==0 - set(handles.checkbox_removedc, 'Value', 0); - set(handles.checkbox_removedc, 'Enable', 'off'); - set(handles.slider_highpass, 'Value', 0); - set(handles.slider_highpass, 'Enable', 'off') - set(handles.togglebutton_highpass, 'Value', 0) - set(handles.edit_highpass,'String','0') - %set(handles.edit_highpass, 'BackgroundColor', [0.75 0.75 0.75]); - set(handles.togglebutton_highpass, 'BackgroundColor', [0.8 0.8 0.75]); - elseif get(handles.togglebutton_lowpass,'Value')==0 && get(handles.togglebutton_highpass,'Value')==1 - colorband = [0.9922 0.9176 0.7961]; - set(handles.checkbox_removedc, 'Value', 1); - set(handles.checkbox_removedc, 'Enable', 'on'); - set(handles.slider_highpass, 'Enable', 'on') - set(handles.togglebutton_highpass, 'Value', 1) - %set(handles.edit_highpass, 'BackgroundColor', [1 1 1]) - else - %... - end - - highpasscutoff = str2num(get(handles.edit_highpass, 'string')); - %lowpasscutoff = str2num(get(handles.edit_lowpass, 'string')); - - if highpasscutoff>0 && highpasscutoff<0.2 - set(handles.edit_highpass, 'string','0.4') - set(handles.slider_highpass, 'Value', 0.4) - end - - set(handles.radiobutton_butter,'Value',0) - ordervector = 4:4:4096; - set(handles.popupmenu_order,'String', char([{'automin'}; cellstr(num2str(ordervector'))])) % set order list - set(handles.popupmenu_dboct,'String', '---') % set db/oct list - set(handles.popupmenu_dbdec,'String', '---') % set db/dec list - set(handles.popupmenu_order,'Value',10) - set(handles.popupmenu_dboct,'Value',1) - set(handles.popupmenu_dbdec,'Value',1) - - handles.ishopermission = 0; - % Update handles structure - guidata(hObject, handles); - if get(handles.radiobutton_ufdatafr,'Value') - plotresponse_uf_data(hObject, eventdata, handles); - else - plotresponsefilter(hObject, eventdata, handles); - end + + unsetnotchpm(hObject, eventdata, handles) + + if get(handles.togglebutton_lowpass,'Value')==1 && get(handles.togglebutton_highpass,'Value')==0 + set(handles.checkbox_removedc, 'Value', 0); + set(handles.checkbox_removedc, 'Enable', 'off'); + set(handles.slider_highpass, 'Value', 0); + set(handles.slider_highpass, 'Enable', 'off') + set(handles.togglebutton_highpass, 'Value', 0) + set(handles.edit_highpass,'String','0') + %set(handles.edit_highpass, 'BackgroundColor', [0.75 0.75 0.75]); + set(handles.togglebutton_highpass, 'BackgroundColor', [0.8 0.8 0.75]); + elseif get(handles.togglebutton_lowpass,'Value')==0 && get(handles.togglebutton_highpass,'Value')==1 + colorband = [0.9922 0.9176 0.7961]; + set(handles.checkbox_removedc, 'Value', 1); + set(handles.checkbox_removedc, 'Enable', 'on'); + set(handles.slider_highpass, 'Enable', 'on') + set(handles.togglebutton_highpass, 'Value', 1) + %set(handles.edit_highpass, 'BackgroundColor', [1 1 1]) + else + %... + end + + highpasscutoff = str2num(get(handles.edit_highpass, 'string')); + %lowpasscutoff = str2num(get(handles.edit_lowpass, 'string')); + + if highpasscutoff>0 && highpasscutoff<0.2 + set(handles.edit_highpass, 'string','0.4') + set(handles.slider_highpass, 'Value', 0.4) + end + + set(handles.radiobutton_butter,'Value',0) + ordervector = 4:4:4096; + set(handles.popupmenu_order,'String', char([{'automin'}; cellstr(num2str(ordervector'))])) % set order list + set(handles.popupmenu_dboct,'String', '---') % set db/oct list + set(handles.popupmenu_dbdec,'String', '---') % set db/dec list + set(handles.popupmenu_order,'Value',10) + set(handles.popupmenu_dboct,'Value',1) + set(handles.popupmenu_dbdec,'Value',1) + + handles.ishopermission = 0; + % Update handles structure + guidata(hObject, handles); + if get(handles.radiobutton_ufdatafr,'Value') + plotresponse_uf_data(hObject, eventdata, handles); + else + plotresponsefilter(hObject, eventdata, handles); + end else - set(handles.radiobutton_fir,'Value',1) + set(handles.radiobutton_fir,'Value',1) end %-------------------------------------------------------------------------- function radiobutton_PM_notch_Callback(hObject, eventdata, handles) if get(hObject,'Value') - valhp = get(handles.edit_highpass,'String'); - vallp = get(handles.edit_lowpass,'String'); - handles.valhp = valhp; - handles.vallp = vallp; - - % Update handles structure - guidata(hObject, handles); - setnotchpm(handles) - if get(handles.radiobutton_ufdatafr,'Value') - plotresponse_uf_data(hObject, eventdata, handles); - else - plotresponsefilter(hObject, eventdata, handles); - end + valhp = get(handles.edit_highpass,'String'); + vallp = get(handles.edit_lowpass,'String'); + handles.valhp = valhp; + handles.vallp = vallp; + + % Update handles structure + guidata(hObject, handles); + setnotchpm(handles) + if get(handles.radiobutton_ufdatafr,'Value') + plotresponse_uf_data(hObject, eventdata, handles); + else + plotresponsefilter(hObject, eventdata, handles); + end else - set(handles.radiobutton_PM_notch,'Value',1) + set(handles.radiobutton_PM_notch,'Value',1) end %-------------------------------------------------------------------------- @@ -2116,27 +2133,27 @@ function setnotchpm(handles) %------------------------------------------------------------------------ function unsetnotchpm(hObject, eventdata, handles) if strcmp(get(handles.slider_lowpass,'Visible'),'off') - set(handles.togglebutton_highpass, 'Visible', 'on') - set(handles.togglebutton_highpass,'Value',1) - set(handles.togglebutton_highpass, 'BackgroundColor', [1 1 0.5]); - set(handles.checkbox_removedc, 'Enable', 'on'); - set(handles.togglebutton_lowpass, 'BackgroundColor', [0.8 0.8 0.75]); - vals = get(handles.slider_highpass, 'Value'); - set(handles.edit_highpass,'String',sprintf('%.1f',vals)); - set(handles.slider_lowpass, 'Visible', 'on') - set(handles.slider_lowpass, 'Value', 0) - set(handles.slider_lowpass, 'Enable', 'off') - set(handles.togglebutton_lowpass, 'Visible', 'on') - set(handles.togglebutton_lowpass,'Value',0) - set(handles.edit_lowpass,'String','0'); - set(handles.edit_lowpass,'Enable','off'); - %set(handles.edit_lowpass, 'BackgroundColor', [1 1 1]); - set(handles.text_hzlp,'Visible','on') + set(handles.togglebutton_highpass, 'Visible', 'on') + set(handles.togglebutton_highpass,'Value',1) + set(handles.togglebutton_highpass, 'BackgroundColor', [1 1 0.5]); + set(handles.checkbox_removedc, 'Enable', 'on'); + set(handles.togglebutton_lowpass, 'BackgroundColor', [0.8 0.8 0.75]); + vals = get(handles.slider_highpass, 'Value'); + set(handles.edit_highpass,'String',sprintf('%.1f',vals)); + set(handles.slider_lowpass, 'Visible', 'on') + set(handles.slider_lowpass, 'Value', 0) + set(handles.slider_lowpass, 'Enable', 'off') + set(handles.togglebutton_lowpass, 'Visible', 'on') + set(handles.togglebutton_lowpass,'Value',0) + set(handles.edit_lowpass,'String','0'); + set(handles.edit_lowpass,'Enable','off'); + %set(handles.edit_lowpass, 'BackgroundColor', [1 1 1]); + set(handles.text_hzlp,'Visible','on') else - set(handles.togglebutton_highpass, 'Visible', 'on') - set(handles.togglebutton_lowpass, 'Visible', 'on') - %set(handles.edit_lowpass, 'BackgroundColor', [1 1 1]); - set(handles.text_hzlp,'Visible','on') + set(handles.togglebutton_highpass, 'Visible', 'on') + set(handles.togglebutton_lowpass, 'Visible', 'on') + %set(handles.edit_lowpass, 'BackgroundColor', [1 1 1]); + set(handles.text_hzlp,'Visible','on') end set(handles.edit_lowpass,'Visible','on'); @@ -2154,7 +2171,7 @@ function edit_boundary_Callback(hObject, eventdata, handles) % ------------------------------------------------------------------------- function edit_boundary_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); + set(hObject,'BackgroundColor','white'); end %-------------------------------------------------------------------------- @@ -2166,93 +2183,93 @@ function edit_xmaxplot_Callback(hObject, eventdata, handles) xmaxp = str2num(xmaxpstr); if isempty(xmaxp) + msgboxText{1} = 'Your must enter a positive number greater than 0.1!'; + title = 'ERPLAB: Basic Filter Error'; + errorfound(msgboxText, title); + set(handles.edit_xmaxplot, 'String', num2str(handles.xmaxfreqr)) + + if get(handles.radiobutton_ufdatafr,'Value') + plotresponse_uf_data(hObject, eventdata, handles); + elseif get(handles.radiobutton_fdatafr,'Value') + plotresponse_fd_data(hObject, eventdata, handles); + else + plotresponsefilter(hObject, eventdata, handles); + end + return +elseif length(xmaxp)==1 + if xmaxp<0.1 msgboxText{1} = 'Your must enter a positive number greater than 0.1!'; title = 'ERPLAB: Basic Filter Error'; errorfound(msgboxText, title); set(handles.edit_xmaxplot, 'String', num2str(handles.xmaxfreqr)) if get(handles.radiobutton_ufdatafr,'Value') - plotresponse_uf_data(hObject, eventdata, handles); + plotresponse_uf_data(hObject, eventdata, handles); elseif get(handles.radiobutton_fdatafr,'Value') - plotresponse_fd_data(hObject, eventdata, handles); + plotresponse_fd_data(hObject, eventdata, handles); else - plotresponsefilter(hObject, eventdata, handles); + plotresponsefilter(hObject, eventdata, handles); end return -elseif length(xmaxp)==1 - if xmaxp<0.1 - msgboxText{1} = 'Your must enter a positive number greater than 0.1!'; - title = 'ERPLAB: Basic Filter Error'; - errorfound(msgboxText, title); - set(handles.edit_xmaxplot, 'String', num2str(handles.xmaxfreqr)) - - if get(handles.radiobutton_ufdatafr,'Value') - plotresponse_uf_data(hObject, eventdata, handles); - elseif get(handles.radiobutton_fdatafr,'Value') - plotresponse_fd_data(hObject, eventdata, handles); - else - plotresponsefilter(hObject, eventdata, handles); - end - return - end - xmaxp = [0 xmaxp]; + end + xmaxp = [0 xmaxp]; elseif length(xmaxp)==2 - if xmaxp(1)>=xmaxp(2) - msgboxText{1} = 'Frenquency range must be sorted [minf maxf].'; - title = 'ERPLAB: Basic Filter Error'; - errorfound(msgboxText, title); - set(handles.edit_xmaxplot, 'String', num2str(handles.xmaxfreqr)) - - if get(handles.radiobutton_ufdatafr,'Value') - plotresponse_uf_data(hObject, eventdata, handles); - elseif get(handles.radiobutton_fdatafr,'Value') - plotresponse_fd_data(hObject, eventdata, handles); - else - plotresponsefilter(hObject, eventdata, handles); - end - return - end - if xmaxp(1)<0 || xmaxp(2)<0 - msgboxText{1} = 'Your must enter 1 or 2 positive numbers.'; - title = 'ERPLAB: Basic Filter Error'; - errorfound(msgboxText, title); - set(handles.edit_xmaxplot, 'String', num2str(handles.xmaxfreqr)) - - if get(handles.radiobutton_ufdatafr,'Value') - plotresponse_uf_data(hObject, eventdata, handles); - elseif get(handles.radiobutton_fdatafr,'Value') - plotresponse_fd_data(hObject, eventdata, handles); - else - plotresponsefilter(hObject, eventdata, handles); - end - return + if xmaxp(1)>=xmaxp(2) + msgboxText{1} = 'Frenquency range must be sorted [minf maxf].'; + title = 'ERPLAB: Basic Filter Error'; + errorfound(msgboxText, title); + set(handles.edit_xmaxplot, 'String', num2str(handles.xmaxfreqr)) + + if get(handles.radiobutton_ufdatafr,'Value') + plotresponse_uf_data(hObject, eventdata, handles); + elseif get(handles.radiobutton_fdatafr,'Value') + plotresponse_fd_data(hObject, eventdata, handles); + else + plotresponsefilter(hObject, eventdata, handles); end - if abs(xmaxp(2)-xmaxp(1))<0.1 - msgboxText{1} = 'Bandwidth for plotting must be greater than 0.1 Hz.'; - title = 'ERPLAB: Basic Filter Error'; - errorfound(msgboxText, title); - set(handles.edit_xmaxplot, 'String', num2str(handles.xmaxfreqr)) - - if get(handles.radiobutton_ufdatafr,'Value') - plotresponse_uf_data(hObject, eventdata, handles); - elseif get(handles.radiobutton_fdatafr,'Value') - plotresponse_fd_data(hObject, eventdata, handles); - else - plotresponsefilter(hObject, eventdata, handles); - end - return + return + end + if xmaxp(1)<0 || xmaxp(2)<0 + msgboxText{1} = 'Your must enter 1 or 2 positive numbers.'; + title = 'ERPLAB: Basic Filter Error'; + errorfound(msgboxText, title); + set(handles.edit_xmaxplot, 'String', num2str(handles.xmaxfreqr)) + + if get(handles.radiobutton_ufdatafr,'Value') + plotresponse_uf_data(hObject, eventdata, handles); + elseif get(handles.radiobutton_fdatafr,'Value') + plotresponse_fd_data(hObject, eventdata, handles); + else + plotresponsefilter(hObject, eventdata, handles); end -else - msgboxText = 'Wrong frenquency range!'; + return + end + if abs(xmaxp(2)-xmaxp(1))<0.1 + msgboxText{1} = 'Bandwidth for plotting must be greater than 0.1 Hz.'; title = 'ERPLAB: Basic Filter Error'; errorfound(msgboxText, title); set(handles.edit_xmaxplot, 'String', num2str(handles.xmaxfreqr)) + + if get(handles.radiobutton_ufdatafr,'Value') + plotresponse_uf_data(hObject, eventdata, handles); + elseif get(handles.radiobutton_fdatafr,'Value') + plotresponse_fd_data(hObject, eventdata, handles); + else + plotresponsefilter(hObject, eventdata, handles); + end return + end +else + msgboxText = 'Wrong frenquency range!'; + title = 'ERPLAB: Basic Filter Error'; + errorfound(msgboxText, title); + set(handles.edit_xmaxplot, 'String', num2str(handles.xmaxfreqr)) + return end if get(handles.radiobutton_impr,'Value') - handles.xmaxpimpz = xmaxp; + handles.xmaxpimpz = xmaxp; else - handles.xmaxfreqr = xmaxp; + handles.xmaxfreqr = xmaxp; end % Update handles structure @@ -2260,24 +2277,24 @@ function edit_xmaxplot_Callback(hObject, eventdata, handles) if get(handles.radiobutton_ufdatafr,'Value') - plotresponse_uf_data(hObject, eventdata, handles); + plotresponse_uf_data(hObject, eventdata, handles); elseif get(handles.radiobutton_fdatafr,'Value') - plotresponse_fd_data(hObject, eventdata, handles); + plotresponse_fd_data(hObject, eventdata, handles); else - plotresponsefilter(hObject, eventdata, handles); + plotresponsefilter(hObject, eventdata, handles); end return %-------------------------------------------------------------------------- function edit_xmaxplot_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); + set(hObject,'BackgroundColor','white'); end %-------------------------------------------------------------------------- function noncausal_Callback(hObject, eventdata, handles) if ~get(hObject,'Value') - set(hObject,'Value',1) + set(hObject,'Value',1) end %-------------------------------------------------------------------------- @@ -2286,11 +2303,11 @@ function causal_Callback(hObject, eventdata, handles) %-------------------------------------------------------------------------- function popupmenu_FRscale_Callback(hObject, eventdata, handles) if get(handles.radiobutton_ufdatafr,'Value') - plotresponse_uf_data(hObject, eventdata, handles); + plotresponse_uf_data(hObject, eventdata, handles); elseif get(handles.radiobutton_fdatafr,'Value') - plotresponse_fd_data(hObject, eventdata, handles); + plotresponse_fd_data(hObject, eventdata, handles); else - plotresponsefilter(hObject, eventdata, handles); + plotresponsefilter(hObject, eventdata, handles); end %-------------------------------------------------------------------------- @@ -2298,32 +2315,32 @@ function chksliders(hObject, eventdata, handles) sH = get(handles.slider_highpass,'Value'); sL = get(handles.slider_lowpass,'Value'); if sH<0.001 - set(handles.slider_highpass,'Value', 0) - set(handles.edit_highpass,'String', '0') - set(handles.edit2_highpass,'String', '---') - set(handles.slider_highpass,'Enable', 'off') - set(handles.edit_highpass,'Enable', 'off') - set(handles.edit2_highpass,'Enable', 'off') - set(handles.togglebutton_highpass,'Value', 0) - set(handles.checkbox_removedc,'Value', 0) + set(handles.slider_highpass,'Value', 0) + set(handles.edit_highpass,'String', '0') + set(handles.edit2_highpass,'String', '---') + set(handles.slider_highpass,'Enable', 'off') + set(handles.edit_highpass,'Enable', 'off') + set(handles.edit2_highpass,'Enable', 'off') + set(handles.togglebutton_highpass,'Value', 0) + set(handles.checkbox_removedc,'Value', 0) else - set(handles.edit_highpass, 'String', sprintf('%.1f',sH)); - set(handles.edit2_highpass, 'BackgroundColor', [1 1 0.5]); + set(handles.edit_highpass, 'String', sprintf('%.1f',sH)); + set(handles.edit2_highpass, 'BackgroundColor', [1 1 0.5]); end if sL<0.001 - set(handles.slider_lowpass,'Value', 0) - set(handles.edit_lowpass,'String', '0') - set(handles.edit2_lowpass,'String', '---') - set(handles.slider_lowpass,'Enable', 'off') - set(handles.edit_lowpass,'Enable', 'off') - set(handles.edit2_lowpass,'Enable', 'off') - set(handles.togglebutton_lowpass,'Value', 0) + set(handles.slider_lowpass,'Value', 0) + set(handles.edit_lowpass,'String', '0') + set(handles.edit2_lowpass,'String', '---') + set(handles.slider_lowpass,'Enable', 'off') + set(handles.edit_lowpass,'Enable', 'off') + set(handles.edit2_lowpass,'Enable', 'off') + set(handles.togglebutton_lowpass,'Value', 0) else - set(handles.edit_lowpass, 'String', sprintf('%.1f',sL)); - set(handles.edit2_lowpass, 'BackgroundColor', [1 1 0.5]); + set(handles.edit_lowpass, 'String', sprintf('%.1f',sL)); + set(handles.edit2_lowpass, 'BackgroundColor', [1 1 0.5]); end if sL<0.001 && sH<0.001 - set(handles.popupmenu_order,'Value', 2) + set(handles.popupmenu_order,'Value', 2) end drawnow return @@ -2341,22 +2358,22 @@ function pushbutton_refresh_Callback(hObject, eventdata, handles) %-------------------------------------------------------------------------- function sliderson(hObject, eventdata, handles) if get(handles.togglebutton_highpass,'value') - set(handles.slider_highpass,'Enable','on') + set(handles.slider_highpass,'Enable','on') end if get(handles.togglebutton_lowpass,'value') - set(handles.slider_lowpass,'Enable','on') + set(handles.slider_lowpass,'Enable','on') end drawnow %-------------------------------------------------------------------------- function slidersoff(hObject, eventdata, handles) if get(handles.togglebutton_highpass,'value') - set(handles.slider_highpass,'Enable','off') + set(handles.slider_highpass,'Enable','off') end if get(handles.togglebutton_lowpass,'value') - set(handles.slider_lowpass,'Enable','off') + set(handles.slider_lowpass,'Enable','off') end drawnow @@ -2373,13 +2390,13 @@ function edit_tip_cutoff_CreateFcn(hObject, eventdata, handles) frecp = str2num(get(handles.edit_xmaxplot,'String')); if isempty(frecp) - return + return end ch = str2num(get(handles.edit_channels,'String')); if isempty(ch) - return + return end axes(handles.axes1); @@ -2389,21 +2406,21 @@ function edit_tip_cutoff_CreateFcn(hObject, eventdata, handles) drawnow if isempty(setxor(ch, [handles.datafr.chan])) % are equal? - ym = handles.datafr.ym; - f = handles.datafr.f; + ym = handles.datafr.ym; + f = handles.datafr.f; else - ERPLAB = handles.ERPLAB; - np = round(ERPLAB.srate/2); - - if iserpstruct(ERPLAB) % for erpset - % [ym f] = fourierp(ERPLAB,ch,frecp(1),np,np); - [ym f] = fourierp(ERPLAB,ch,[], 0,np,np); - elseif iseegstruct(ERPLAB) % for erpset - % [ym f] = fourieeg(ERPLAB,ch,frecp(1),np,np); - [ym f] = fourieeg(ERPLAB,ch,[],0,np,np); - else - return - end + ERPLAB = handles.ERPLAB; + np = round(ERPLAB.srate/2); + + if iserpstruct(ERPLAB) % for erpset + % [ym f] = fourierp(ERPLAB,ch,frecp(1),np,np); + [ym f] = fourierp(ERPLAB,ch,[], 0,np,np); + elseif iseegstruct(ERPLAB) % for erpset + % [ym f] = fourieeg(ERPLAB,ch,frecp(1),np,np); + [ym f] = fourieeg(ERPLAB,ch,[],0,np,np); + else + return + end end [frecpxx frecpsam2] = min(abs(f-frecp(2))); @@ -2413,15 +2430,15 @@ function edit_tip_cutoff_CreateFcn(hObject, eventdata, handles) color = [0 0.2 0]; if FRscale==1 - ymax = max(ym)+0.2; - ymin = -0.0625*ymax; %6.25% of ymax - - plot(f(frecpsam1:frecpsam2), ym(frecpsam1:frecpsam2), 'linewidth', 2, 'LineSmoothing','on','Color', color) - ylabel('Data amplitude') + ymax = max(ym)+0.2; + ymin = -0.0625*ymax; %6.25% of ymax - + plot(f(frecpsam1:frecpsam2), ym(frecpsam1:frecpsam2), 'linewidth', 2, 'LineSmoothing','on','Color', color) + ylabel('Data amplitude') else - ymax = 20*log(max(ym))+0.2; - ymin = -65; - plot(f(frecpsam1:frecpsam2), 20*log10(ym(frecpsam1:frecpsam2)), 'linewidth', 2, 'LineSmoothing','on','Color', color) - ylabel('Data amplitude in dB') + ymax = 20*log(max(ym))+0.2; + ymin = -65; + plot(f(frecpsam1:frecpsam2), 20*log10(ym(frecpsam1:frecpsam2)), 'linewidth', 2, 'LineSmoothing','on','Color', color) + ylabel('Data amplitude in dB') end ylim = [ymin ymax]; @@ -2444,17 +2461,17 @@ function plotresponse_fd_data(hObject, eventdata, handles) valuel = get(handles.slider_lowpass, 'Value'); if valueh==0 && valuel==0 - msgtx = '--NO FILTERING--'; - no_filter(hObject, handles, msgtx) - return + msgtx = '--NO FILTERING--'; + no_filter(hObject, handles, msgtx) + return end frecp = str2num(get(handles.edit_xmaxplot,'String')); if isempty(frecp) - return + return end ch = str2num(get(handles.edit_channels,'String')); if isempty(ch) - return + return end axes(handles.axes1); @@ -2469,23 +2486,23 @@ function plotresponse_fd_data(hObject, eventdata, handles) ymax = ylim(2); if FRscale==1 - %ymax = max(yfildata)+0.2; - %ymin = -0.075; - ymaxb = 1; - yminb = 0; - plot(f, yfildata, 'linewidth', 2, 'LineSmoothing','on','Color', color) - ylabel('Data amplitude') + %ymax = max(yfildata)+0.2; + %ymin = -0.075; + ymaxb = 1; + yminb = 0; + plot(f, yfildata, 'linewidth', 2, 'LineSmoothing','on','Color', color) + ylabel('Data amplitude') else - %ymax = 20*log(ymax)+0.2; - %ymin = -65; - ymaxb = 0; - yminb = -90; - plot(f, 20*log10(yfildata), 'linewidth', 2, 'LineSmoothing','on','Color', color) - ylabel('Data amplitude in dB') + %ymax = 20*log(ymax)+0.2; + %ymin = -65; + ymaxb = 0; + yminb = -90; + plot(f, 20*log10(yfildata), 'linewidth', 2, 'LineSmoothing','on','Color', color) + ylabel('Data amplitude in dB') end fnyq = round(handles.fs/2); if get(handles.radiobutton_ideal, 'Value') - drawidealresp(handles, labelf, fnyq, valuel, valueh, yminb, ymaxb) + drawidealresp(handles, labelf, fnyq, valuel, valueh, yminb, ymaxb) end % text(mean(frecp), posaxes1(2)/2, msgtx,'FontSize',14, 'color', 'w') % erase text...temporary... @@ -2502,39 +2519,39 @@ function plotresponse_fd_data(hObject, eventdata, handles) % Minimum number of sample among boundaries % if isempty(EVENTSTRUCT) - minboundarysamdist = inf; - return + minboundarysamdist = inf; + return end if ischar(EVENTSTRUCT(1).type) - ecpos = strmatch('boundary', {EVENTSTRUCT.type}); + ecpos = strmatch('boundary', {EVENTSTRUCT.type}); else - ecpos = find([EVENTSTRUCT.type]==-99); + ecpos = find([EVENTSTRUCT.type]==-99); end if isempty(ecpos) - minboundarysamdist = inf; + minboundarysamdist = inf; else - minboundarysamdist = min(diff([EVENTSTRUCT(ecpos).latency])); + minboundarysamdist = min(diff([EVENTSTRUCT(ecpos).latency])); end %-------------------------------------------------------------------------- function setall(hObject, eventdata, handles, ERPLAB, def) if nargin<5 - def = handles.def; + def = handles.def; end if nargin<4 - ERPLAB = handles.ERPLAB; + ERPLAB = handles.ERPLAB; end if isempty(ERPLAB) - try - ERPLAB = handles.ERPLAB; - catch - ERPLAB = buildERPstruct([]); - end + try + ERPLAB = handles.ERPLAB; + catch + ERPLAB = buildERPstruct([]); + end end fs = ERPLAB.srate; if isempty(fs) - fs=1000; + fs=1000; end % def = {highpasscutoff, lowpasscutoff, order, channelArray, typefilter, remove_dc, boundary}; @@ -2549,64 +2566,69 @@ function setall(hObject, eventdata, handles, ERPLAB, def) remove_dc = def{7}; boundary = def{8}; colorband = [0.9922 0.9176 0.7961]; - +try binArray = def{9}; catch binArray = []; end if iserpstruct(ERPLAB) % for erpset - typedata = 'ERP'; - set(handles.checkbox_removedc, 'Visible', 'on') + typedata = 'ERP'; + set(handles.checkbox_removedc, 'Visible', 'on') + set(handles.checkbox_removedc, 'Value', remove_dc) + set(handles.checkbox_removedc, 'String', 'Remove mean value (DC bias) before filtering (not usually appropriate for baseline-corrected data)') + %set(handles.checkbox_removedc, 'Enable', 'off') + set(handles.checkbox_boundary, 'Visible', 'off') + set(handles.edit_boundary,'Visible', 'off'); + set(handles.text_boundary,'Visible', 'off'); + minboundarysamdist = inf; + %nchan = ERPLAB.nchan; +else + if isempty(ERPLAB.epoch) % for continuous dataset + set(handles.checkbox_boundary, 'Enable', 'on') + + if isempty(boundary) + set(handles.checkbox_boundary, 'Value', 0) + set(handles.edit_boundary, 'string', 'boundary'); % default + set(handles.edit_boundary,'Enable', 'off'); + %set(handles.edit_boundary,'BackgroundColor', [0.75 0.75 0.75]); + else + set(handles.checkbox_boundary, 'Value', 1) + set(handles.edit_boundary,'Enable', 'on'); + %set(handles.edit_boundary,'BackgroundColor', [1 1 1]); + set(handles.edit_boundary, 'string', boundary); + end + + label1 = 'Apply filter to segments defined'; + label2 = 'by boundary events (Strongly Recommended)'; + set(handles.checkbox_boundary, 'string',[label1 '
' label2]); set(handles.checkbox_removedc, 'Value', remove_dc) + typedata = 'continuous EEG'; + minboundarysamdist = boundarydistance(ERPLAB.event); + else % for epoched dataset + set(handles.checkbox_boundary, 'Value', 0) + set(handles.checkbox_boundary, 'Enable', 'off') + set(handles.edit_boundary, 'string', ''); + set(handles.edit_boundary,'Enable', 'off'); + %set(handles.edit_boundary,'BackgroundColor', [0.75 0.75 0.75]); + label1 = 'Apply filter to segments defined'; + label2 = 'by boundary events (Strongly Recommended)'; + set(handles.checkbox_boundary, 'string',[label1 '
' label2]); + set(handles.text_boundary,'Enable', 'off'); set(handles.checkbox_removedc, 'String', 'Remove mean value (DC bias) before filtering (not usually appropriate for baseline-corrected data)') + set(handles.checkbox_removedc, 'Value', remove_dc) %set(handles.checkbox_removedc, 'Enable', 'off') - set(handles.checkbox_boundary, 'Visible', 'off') - set(handles.edit_boundary,'Visible', 'off'); - set(handles.text_boundary,'Visible', 'off'); + typedata = 'epoched EEG'; minboundarysamdist = inf; - %nchan = ERPLAB.nchan; -else - if isempty(ERPLAB.epoch) % for continuous dataset - set(handles.checkbox_boundary, 'Enable', 'on') - - if isempty(boundary) - set(handles.checkbox_boundary, 'Value', 0) - set(handles.edit_boundary, 'string', 'boundary'); % default - set(handles.edit_boundary,'Enable', 'off'); - %set(handles.edit_boundary,'BackgroundColor', [0.75 0.75 0.75]); - else - set(handles.checkbox_boundary, 'Value', 1) - set(handles.edit_boundary,'Enable', 'on'); - %set(handles.edit_boundary,'BackgroundColor', [1 1 1]); - set(handles.edit_boundary, 'string', boundary); - end - - label1 = 'Apply filter to segments defined'; - label2 = 'by boundary events (Strongly Recommended)'; - set(handles.checkbox_boundary, 'string',[label1 '
' label2]); - set(handles.checkbox_removedc, 'Value', remove_dc) - typedata = 'continuous EEG'; - minboundarysamdist = boundarydistance(ERPLAB.event); - else % for epoched dataset - set(handles.checkbox_boundary, 'Value', 0) - set(handles.checkbox_boundary, 'Enable', 'off') - set(handles.edit_boundary, 'string', ''); - set(handles.edit_boundary,'Enable', 'off'); - %set(handles.edit_boundary,'BackgroundColor', [0.75 0.75 0.75]); - label1 = 'Apply filter to segments defined'; - label2 = 'by boundary events (Strongly Recommended)'; - set(handles.checkbox_boundary, 'string',[label1 '
' label2]); - set(handles.text_boundary,'Enable', 'off'); - set(handles.checkbox_removedc, 'String', 'Remove mean value (DC bias) before filtering (not usually appropriate for baseline-corrected data)') - set(handles.checkbox_removedc, 'Value', remove_dc) - %set(handles.checkbox_removedc, 'Enable', 'off') - typedata = 'epoched EEG'; - minboundarysamdist = inf; - end - %nchan = ERPLAB.nbchan; + end + %nchan = ERPLAB.nbchan; end % % Name & version % version = geterplabversion; -set(handles.gui_chassis,'Name', ['ERPLAB ' version ' - Basic Filter GUI for ' typedata]) +ERPtooltype = erpgettoolversion('tooltype'); +if strcmpi(ERPtooltype,'estudio') + set(handles.gui_chassis,'Name', ['Estudio ' version ' - Basic Filter GUI for ' typedata]); +else + set(handles.gui_chassis,'Name', ['ERPLAB ' version ' - Basic Filter GUI for ' typedata]); +end highpasscutoff = locutoff; lowpasscutoff = hicutoff; maxsliders = handles.maxsliders; @@ -2620,28 +2642,28 @@ function setall(hObject, eventdata, handles, ERPLAB, def) slider_step(2) = 0.5/maxsliders; switch typefilter - case 'butter' - set(handles.radiobutton_butter, 'Value', 1); % 0 means Butterworth - ordervector = 2:2:8; - [tf, ordenp] = ismember_bc2(filterorder, ordervector); - set(handles.popupmenu_order,'String', char([{'automin'}; cellstr(num2str(ordervector'))])) % set order list - set(handles.popupmenu_order,'Value', ordenp+1); - set(handles.popupmenu_dboct,'String', num2str(6*ordervector')) % set db/oct list - set(handles.popupmenu_dbdec,'String', num2str(20*ordervector')) % set db/dec list - set(handles.popupmenu_dboct,'Value', ordenp) % set db/oct list - set(handles.popupmenu_dbdec,'Value', ordenp) % set db/dec list - case 'fir' - set(handles.radiobutton_fir, 'Value', 1); % 1 means FIR - ordervector = 4:4:4096; - [tf, ordenp] = ismember_bc2(filterorder, ordervector); - set(handles.popupmenu_order,'String', char([{'automin'}; cellstr(num2str(ordervector'))])) % set order list - set(handles.popupmenu_order,'Value', ordenp+1); - set(handles.popupmenu_dboct,'String', '---') % set db/oct list - set(handles.popupmenu_dbdec,'String', '---') % set db/dec list - case 'notch' - set(handles.radiobutton_PM_notch, 'Value', 1); - setnotchpm(handles) - handles.freqdef = highpasscutoff; + case 'butter' + set(handles.radiobutton_butter, 'Value', 1); % 0 means Butterworth + ordervector = 2:2:8; + [tf, ordenp] = ismember_bc2(filterorder, ordervector); + set(handles.popupmenu_order,'String', char([{'automin'}; cellstr(num2str(ordervector'))])) % set order list + set(handles.popupmenu_order,'Value', ordenp+1); + set(handles.popupmenu_dboct,'String', num2str(6*ordervector')) % set db/oct list + set(handles.popupmenu_dbdec,'String', num2str(20*ordervector')) % set db/dec list + set(handles.popupmenu_dboct,'Value', ordenp) % set db/oct list + set(handles.popupmenu_dbdec,'Value', ordenp) % set db/dec list + case 'fir' + set(handles.radiobutton_fir, 'Value', 1); % 1 means FIR + ordervector = 4:4:4096; + [tf, ordenp] = ismember_bc2(filterorder, ordervector); + set(handles.popupmenu_order,'String', char([{'automin'}; cellstr(num2str(ordervector'))])) % set order list + set(handles.popupmenu_order,'Value', ordenp+1); + set(handles.popupmenu_dboct,'String', '---') % set db/oct list + set(handles.popupmenu_dbdec,'String', '---') % set db/dec list + case 'notch' + set(handles.radiobutton_PM_notch, 'Value', 1); + setnotchpm(handles) + handles.freqdef = highpasscutoff; end set(handles.slider_highpass, 'Value', highpasscutoff, 'Max', maxsliders, 'Min', 0, 'SliderStep', slider_step) @@ -2653,30 +2675,31 @@ function setall(hObject, eventdata, handles, ERPLAB, def) set(handles.radiobutton_ufdatafr,'Value', 0); set(handles.radiobutton_fdatafr,'Value', 0); set(handles.radiobutton_ideal, 'Enable','on') -nchan = handles.nchan; -if filterallch - set(handles.checkbox_filterallchannels, 'Value', 1) - set(handles.edit_channels, 'String', vect2colon([1:nchan], 'Delimiter', 'off')); - set(handles.edit_channels, 'Enable', 'off'); - set(handles.pushbutton_browsechan, 'Enable', 'off'); +nchan = handles.nchan;%%et for chans +len1 = length(chanArray); +chanArray = chanArray(chanArray<=nchan); +len2 = length(chanArray); +if len1~=len2 + fprintf('Index of channels to be filtered was adjusted since current %s has only %g channels.\n', typedata, nchan); +end +chanArraystr = vect2colon(chanArray, 'Delimiter','off', 'Repeat', 'off'); +set(handles.edit_channels, 'String', chanArraystr) + +if handles.nbin~=0 && iserpstruct(ERPLAB) + handles.edit_bin.Enable = 'on'; + handles.pushbutton_bin_browse.Enable = 'on'; + if isempty(binArray) || any(binArray(:)>ERPLAB.nbin) || any(binArray(:)<1) + binArray=1:ERPLAB.nbin; + end + binArraystr = vect2colon(binArray, 'Delimiter','off', 'Repeat', 'off'); + handles.edit_bin.String = binArraystr; else - len1 = length(chanArray); - chanArray = chanArray(chanArray<=nchan); - len2 = length(chanArray); - if len1~=len2 - fprintf('Index of channels to be filtered was adjusted since current %s has only %g channels.\n', typedata, nchan); - end - if len2==nchan - set(handles.checkbox_filterallchannels, 'Value', 1) - set(handles.edit_channels, 'String', vect2colon([1:nchan], 'Delimiter', 'off')); - set(handles.edit_channels, 'Enable', 'off'); - set(handles.pushbutton_browsechan, 'Enable', 'off'); - else - chanArraystr = vect2colon(chanArray, 'Delimiter','off', 'Repeat', 'off'); - set(handles.edit_channels, 'String', chanArraystr) - end + handles.edit_bin.String = ''; + handles.edit_bin.Enable = 'off'; + handles.pushbutton_bin_browse.Enable = 'off'; end + % % Causality (pending) % @@ -2686,44 +2709,44 @@ function setall(hObject, eventdata, handles, ERPLAB, def) tooltip1 = 'Cutoff frequency = frequency where the magnitude
response of the filter is either 0.5 (-6dB) or 0.707 (-3dB)'; tooltip2 = ['The filter does not attenuate all frequencies outside the desired frequency range completely;
'... - 'in particular, there is a region just outside the intended passband where frequencies are attenuated,
'... - 'but not rejected. This is known as the filter roll-off, and it is usually expressed in dB of attenuation
'... - 'per octave or decade of frequency. In general, the roll-off for an order-n filter is 6n dB per octave or
'... - '20n dB per decade.']; + 'in particular, there is a region just outside the intended passband where frequencies are attenuated,
'... + 'but not rejected. This is known as the filter roll-off, and it is usually expressed in dB of attenuation
'... + 'per octave or decade of frequency. In general, the roll-off for an order-n filter is 6n dB per octave or
'... + '20n dB per decade.']; set(handles.edit_tip_cutoff, 'tooltip',tooltip1); set(handles.edit_tip_rolloff, 'tooltip',tooltip2); if highpasscutoff== 0 - set(handles.togglebutton_highpass, 'Value',0); - set(handles.togglebutton_highpass, 'BackgroundColor', [0.8 0.8 0.75]); - set(handles.slider_highpass, 'Enable', 'off'); - set(handles.edit_highpass, 'String', '0'); - - set(handles.edit_highpass, 'Enable', 'off'); - %set(handles.edit_highpass, 'BackgroundColor', [0.75 0.75 0.75]); + set(handles.togglebutton_highpass, 'Value',0); + set(handles.togglebutton_highpass, 'BackgroundColor', [0.8 0.8 0.75]); + set(handles.slider_highpass, 'Enable', 'off'); + set(handles.edit_highpass, 'String', '0'); + + set(handles.edit_highpass, 'Enable', 'off'); + %set(handles.edit_highpass, 'BackgroundColor', [0.75 0.75 0.75]); else - set(handles.togglebutton_highpass, 'Value',1); - set(handles.togglebutton_highpass, 'BackgroundColor', [1 1 0.5]); - set(handles.edit_highpass, 'Enable', 'on'); - - set(handles.edit_highpass, 'String', sprintf('%.1f',highpasscutoff)); - %set(handles.edit_highpass, 'BackgroundColor', [1 1 1]); + set(handles.togglebutton_highpass, 'Value',1); + set(handles.togglebutton_highpass, 'BackgroundColor', [1 1 0.5]); + set(handles.edit_highpass, 'Enable', 'on'); + + set(handles.edit_highpass, 'String', sprintf('%.1f',highpasscutoff)); + %set(handles.edit_highpass, 'BackgroundColor', [1 1 1]); end if lowpasscutoff== 0 - set(handles.togglebutton_lowpass, 'Value',0); - set(handles.togglebutton_lowpass, 'BackgroundColor', [0.8 0.8 0.75]); - set(handles.slider_lowpass, 'Enable', 'off'); - set(handles.edit_lowpass, 'String', '0'); - set(handles.edit_lowpass, 'Enable', 'off'); - %set(handles.edit_lowpass, 'BackgroundColor', [0.75 0.75 0.75]); + set(handles.togglebutton_lowpass, 'Value',0); + set(handles.togglebutton_lowpass, 'BackgroundColor', [0.8 0.8 0.75]); + set(handles.slider_lowpass, 'Enable', 'off'); + set(handles.edit_lowpass, 'String', '0'); + set(handles.edit_lowpass, 'Enable', 'off'); + %set(handles.edit_lowpass, 'BackgroundColor', [0.75 0.75 0.75]); else - set(handles.togglebutton_lowpass, 'Value',1); - set(handles.togglebutton_lowpass, 'BackgroundColor', [1 1 0.5]); - set(handles.edit_lowpass, 'Enable', 'on'); - - set(handles.edit_lowpass, 'String', sprintf('%.1f',lowpasscutoff)); - %set(handles.edit_lowpass, 'BackgroundColor', [1 1 1]); + set(handles.togglebutton_lowpass, 'Value',1); + set(handles.togglebutton_lowpass, 'BackgroundColor', [1 1 0.5]); + set(handles.edit_lowpass, 'Enable', 'on'); + + set(handles.edit_lowpass, 'String', sprintf('%.1f',lowpasscutoff)); + %set(handles.edit_lowpass, 'BackgroundColor', [1 1 1]); end set(handles.radiobutton_gaussian,'Enable','off') @@ -2746,17 +2769,17 @@ function radiobutton_ideal_Callback(hObject, eventdata, handles) % Plot corresponding response % if get(handles.radiobutton_fdatafr,'Value') - plotresponse_fd_data(hObject, eventdata, handles) + plotresponse_fd_data(hObject, eventdata, handles) elseif get(handles.radiobutton_freqr,'Value') || get(handles.radiobutton_impr,'Value') - plotresponsefilter(hObject, eventdata, handles); + plotresponsefilter(hObject, eventdata, handles); end %-------------------------------------------------------------------------- function pushbutton_import_settings_Callback(hObject, eventdata, handles) [filename, pathname] = uigetfile({'*.bfil','Basic Filter seetings (*.bfil)'}, 'Load settings'); if isequal(filename,0) - disp('User selected Cancel') - return + disp('User selected Cancel') + return end L = load(fullfile(pathname, filename), '-mat'); readobjects = L.outstr; @@ -2781,17 +2804,17 @@ function pushbutton_save_settings_Callback(hObject, eventdata, handles) % global readobjects [readobjects v] = read_GUI(hObject, eventdata, handles); if v~=1 % means something was going wrong - msgboxText = 'Setting is not ready to be saved. Please check it out.'; - title = 'ERPLAB: basicfilterGUI() error:'; - errorfound(sprintf(msgboxText), title); - return + msgboxText = 'Setting is not ready to be saved. Please check it out.'; + title = 'ERPLAB: basicfilterGUI() error:'; + errorfound(sprintf(msgboxText), title); + return end channelArray = readobjects{1}; -filterallch = readobjects{2}; +filterallch = readobjects{2}; if filterallch - nchan = handles.nchan; - channelArray = 1:nchan; + nchan = handles.nchan; + channelArray = 1:nchan; end highpasscutoff = readobjects{3}; lowpasscutoff = readobjects{4}; @@ -2802,25 +2825,25 @@ function pushbutton_save_settings_Callback(hObject, eventdata, handles) boundarystr = readobjects{9}; if boundarycheck==1 - if strcmpi(boundarystr,'boundary')||strcmpi(boundarystr,'''boundary''') - boundary = 'boundary'; + if strcmpi(boundarystr,'boundary')||strcmpi(boundarystr,'''boundary''') + boundary = 'boundary'; + else + if ~strcmp(boundarystr,'') + boundary = str2num(boundarystr); + if isempty(boundary); + boundary = boundarystr; + end else - if ~strcmp(boundarystr,'') - boundary = str2num(boundarystr); - if isempty(boundary); - boundary = boundarystr; - end - else - %boundary = []; - msgboxText = ['You have set the checkbox for filtering between boundary events.\n'... - 'So, you must define a boundary event code.']; - title = 'ERPLAB: basicfilterGUI() error:'; - errorfound(sprintf(msgboxText), title); - return - end + %boundary = []; + msgboxText = ['You have set the checkbox for filtering between boundary events.\n'... + 'So, you must define a boundary event code.']; + title = 'ERPLAB: basicfilterGUI() error:'; + errorfound(sprintf(msgboxText), title); + return end + end else - boundary = []; + boundary = []; end % @@ -2829,30 +2852,30 @@ function pushbutton_save_settings_Callback(hObject, eventdata, handles) [filename, filepath, filterindex] = uiputfile({'*.bfil','Basic Filter settings (*.bfil)'},'Save filter settings as'); if isequal(filename,0) - disp('User selected Cancel') - return + disp('User selected Cancel') + return else - outstr = {highpasscutoff, lowpasscutoff, order, channelArray, filterallch, typefilter, remove_dc, boundary}; - - [px, fname, ext] = fileparts(filename); - if strcmp(ext,'') - if filterindex==1 - ext = '.bfil'; - end + outstr = {highpasscutoff, lowpasscutoff, order, channelArray, filterallch, typefilter, remove_dc, boundary}; + + [px, fname, ext] = fileparts(filename); + if strcmp(ext,'') + if filterindex==1 + ext = '.bfil'; end - - fname = [ fname ext]; - fullname = fullfile(filepath, fname); - save(fullname, 'outstr'); - - % fid_list = fopen( fullname , 'w'); - % - % for i=1:size(fulltext,1) - % fprintf(fid_list,'%s\n', fulltext(i,:)); - % end - % - % fclose(fid_list); - % set(handles.button_savelist, 'Enable','on') + end + + fname = [ fname ext]; + fullname = fullfile(filepath, fname); + save(fullname, 'outstr'); + + % fid_list = fopen( fullname , 'w'); + % + % for i=1:size(fulltext,1) + % fprintf(fid_list,'%s\n', fulltext(i,:)); + % end + % + % fclose(fid_list); + % set(handles.button_savelist, 'Enable','on') end %-------------------------------------------------------------------------- @@ -2871,11 +2894,11 @@ function togglebutton_highpass_CreateFcn(hObject, eventdata, handles) function gui_chassis_CloseRequestFcn(hObject, eventdata, handles) if isequal(get(handles.gui_chassis, 'waitstatus'), 'waiting') - % The GUI is still in UIWAIT, us UIRESUME - uiresume(handles.gui_chassis); + % The GUI is still in UIWAIT, us UIRESUME + uiresume(handles.gui_chassis); else - % The GUI is no longer waiting, just close it - delete(handles.gui_chassis); + % The GUI is no longer waiting, just close it + delete(handles.gui_chassis); end @@ -2887,33 +2910,77 @@ function pushbutton_browsechan_Callback(hObject, eventdata, handles) titlename = 'Select Channel(s)'; if get(hObject, 'Value') - if ~isempty(listch) - ch = browsechanbinGUI(listch, indxlistch, titlename); - if ~isempty(ch) - set(handles.edit_channels, 'String', vect2colon(ch, 'Delimiter', 'off')); - handles.indxlistch = ch; - % Update handles structure - guidata(hObject, handles); - else - disp('User selected Cancel') - return - end + if ~isempty(listch) + ch = browsechanbinGUI(listch, indxlistch, titlename); + if ~isempty(ch) + set(handles.edit_channels, 'String', vect2colon(ch, 'Delimiter', 'off')); + handles.indxlistch = ch; + % Update handles structure + guidata(hObject, handles); else - msgboxText = 'No channel information was found'; - title = 'ERPLAB: basicfilter GUI input'; - errorfound(msgboxText, title); - return + disp('User selected Cancel') + return end + else + msgboxText = 'No channel information was found'; + title = 'ERPLAB: basicfilter GUI input'; + errorfound(msgboxText, title); + return + end end -function checkbox_filterallchannels_Callback(hObject, eventdata, handles) -if get(hObject, 'Value') - nchan = handles.nchan; - set(handles.edit_channels, 'String', vect2colon([1:nchan], 'Delimiter', 'off')); - set(handles.edit_channels, 'Enable', 'off'); - set(handles.pushbutton_browsechan, 'Enable', 'off'); -else - set(handles.edit_channels, 'Enable', 'on'); - set(handles.pushbutton_browsechan, 'Enable', 'on'); +% function checkbox_filterallchannels_Callback(hObject, eventdata, handles) +% if get(hObject, 'Value') +% nchan = handles.nchan; +% set(handles.edit_channels, 'String', vect2colon([1:nchan], 'Delimiter', 'off')); +% set(handles.edit_channels, 'Enable', 'off'); +% set(handles.pushbutton_browsechan, 'Enable', 'off'); +% else +% set(handles.edit_channels, 'Enable', 'on'); +% set(handles.pushbutton_browsechan, 'Enable', 'on'); +% end + + + +function edit_bin_Callback(hObject, eventdata, handles) + + +nbin = handles.nbin; +chx = str2num(handles.edit_bin.String); +if isempty(chx) || any(chx(:)>nbin) || any(chx(:)<1) + chx = 1:nbin; +end +handles.edit_bin.String = vect2colon(chx, 'Delimiter','off', 'Repeat', 'off'); + + + + + + + +% --- Executes during object creation, after setting all properties. +function edit_bin_CreateFcn(hObject, eventdata, handles) + +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on button press in pushbutton_bin_browse. +function pushbutton_bin_browse_Callback(hObject, eventdata, handles) +listbin = handles.listbin; +indxlistbin = handles.indxlistbin; +indxlistbin = indxlistbin(indxlistbin<=length(listbin)); +titlename = 'Select Bin(s)'; + +if ~isempty(listbin) + bins = browsechanbinGUI(listbin, indxlistbin, titlename); + if ~isempty(bins) + set(handles.edit_bin, 'String', vect2colon(bins, 'Delimiter', 'off')); + handles.indxlistbin = bins; + guidata(hObject, handles); + else + return + end end diff --git a/GUIs/binoperGUI.m b/GUIs/binoperGUI.m index 56b3c7b7..8e45dbc4 100755 --- a/GUIs/binoperGUI.m +++ b/GUIs/binoperGUI.m @@ -175,17 +175,16 @@ function binoperGUI_OpeningFcn(hObject, eventdata, handles, varargin) else Toolabel = 1; end - +handles.Toolabel=Toolabel; +version = geterplabversion; if Toolabel - erplab_studio_default_values; - version = erplabstudiover; set(handles.gui_chassis,'Name', ['EStudio',version,' - Bin Operation > Advanced GUI for ']) handles = painterplabstudio(handles); handles = setfonterplabestudio(handles); handles.RUN.String = 'OK'; else - version = geterplabversion; + set(handles.gui_chassis,'Name', ['ERPLAB ' version ' - Bin Operation GUI ']) % handles = painterplab(handles); @@ -203,7 +202,11 @@ function binoperGUI_OpeningFcn(hObject, eventdata, handles, varargin) % % Gui memory % -binopGUI = erpworkingmemory('binopGUI'); +if Toolabel==0 + binopGUI = erpworkingmemory('binopGUI'); +else + binopGUI = estudioworkingmemory('binopGUI'); +end if isempty(binopGUI) set(handles.button_recursive,'Value', 1); % default is Modify existing ERPset (recursive updating) @@ -378,7 +381,11 @@ function RUN_Callback(hObject, eventdata, handles) binopGUI.emode = editormode; binopGUI.hmode = get(handles.checkbox_sendfile2history,'Value'); binopGUI.listname = listname; -erpworkingmemory('binopGUI', binopGUI); +if handles.Toolabel==0 + erpworkingmemory('binopGUI', binopGUI); +else + estudioworkingmemory('binopGUI', binopGUI); +end % Update handles structure guidata(hObject, handles); diff --git a/GUIs/blcerpGUI.fig b/GUIs/blcerpGUI.fig index 0daf0601f59978853d2a75d18639177f73531716..8380915bb2eb28b9c95c40789c9505cb65e2f6b8 100755 GIT binary patch literal 17703 zcma&NWmp`)_dZ;#K=I;k#VJytI237tV#P{v_u_5~#ob+YixihqihGg87mDiwi`%j+ zw&=f~-}lY)^2v2&l1Xx9&SY}uoH@CpE~l#|C(k6pC%~jGr~BI0;j0ZV)2FW%Ube0t z&JzF16ja^{^D-%T*jRYkSTni0NHFPo+c3$wc`z}FGYN`G2ntFFi7~wqcq7d8|2JsS zJo{fjQ&A`SmlLFZ_RO!~*kHnyPK3<2*&$E(V+O-_MtK(O?}=nK=^plMgtWb+# z=UTBdqmoC*dE-gt%^VX~p&p8K#Mp!}ERPta1!8-O;#a-jFqBCms}w7?|I(r#QwRDE zNsgROe&A9L{(HP43cKFz0-fybA()<-KhZu5z=V_QKacSGJYtf1)Y&@vWA6SY(Os_H zM08&t;u;gLFI}pZQDo#L-&ZoAkYP0tYBHpe%A&t&!|+ScD~uw1s~z_c;Kgw>UD8_0 z%;vh0rm0l|fC#!PAL?AQov6`ie0;E@H0qZF2dj*9Y}u_17JU0KN)jc`Ug!VBXWP2* zJ?ctmfLXY2GC_gLQ0_Wt;HJPtR5Y6YHzp536oqlp$C$~5J0{B>bm_(i7LNyq#hYEW z9_@Et1fKm1Q*OjqJ_7ZJcRIj5bK21qJLc%7E2p0s#F@Q`%rs6F_E>`V-$@u!!Y!HD zLfbc7V$t3bIZU&gHUUEB%5d7mI}_=$6ukPH#^Ot3!Vs3E;>F`xDLe0XQ^ebURmDEP7m=eAz6;2kS&i>O?u*^h!meB&&W0>cg=kwUXJ89*?4 zk{kr1_CiU2+=X(OTWWc(F=HK^d*#;oeftuJkEYz-^7F8T)ki3YSGxaH-C9?&KXr%y zk^o%J^!aE#f8Kx?ac;8(YQnyT3t_XaO4 z@f$l+PwSH2+9$>Bra9%avc9{s6G7BN&NN4-*j$?Ag9`ieFZ0VP3SR~BQJu6${20vL z(c?0EP5={i^$8OPVdKkQA!2Jbpnil09i5Kx9z;d&YAER3HyRjv!>pT8)LhE}z zFSmy7!1ODkz~x5Sifz|Hwkr)kyq&R49m2t|9ywhjmS#6HO1%Sx)NrO5Z{oxg>>_8@ z&np3+Eq~N}V5!-r@=+z+sv@@4vmGOF`=UxlXXzTZR|LfOA$KV%Ue(4woFKv!Y)ZFLZCP!V1^o304J}d_L)BwJ-4MP2AZD?&jJHlQZp;$_{}d- zJZqyB{FO{jgmkZ>Yss)(sI7bcquoG{+Q+Wbi~t3$%gGi*c%jX7?0sTZ=N-~bK zTjE@j6Sw38x8$!5n{={EQIphZbwnMtDMUPg$`W{i!z3Q})a6cU_$>74e%~9#Yj2#b zd04=DE6p(iU%>DAacrd#(?7IT?H#?xP#^v*r2fvHF71%?q02|p*mGcKx{(M;XPx&+ zOS5Kf>W${hviF2p4XuM`+x=3qIYl@gy0QoX2#GD-v40ay9inrGu;!(#_MLKwK5M4+ zvimj`$BWvDz0VMmzl&VoUu$ttItezv0fky99Ti@*_1S&za{qD7oR)8t{M%ngZ`?l> zV)REz=cPp6*V=`tR$4(@+cOU>L|tX2Z(Jn(*VrdUblI(`ED#a4ug4p65S5-d|nt;a71+ zbwel5ZWjMe2->q}Pfy2RAeyu9$bf4$)0v@T1PQSb5zj_G5c97${~ThB#c?-~u4`PA zSBh$OuzN4%f3ZJZfeiuP<4FZxSW5Y`dz>rJRtTNot3`k8_{qI=qRM`fKY4e%JCQGH z_B`}mmNOBFwUIFv-X}9N&y%dVn#DyQIV{W7@4;JvgNm&OG=Z=^dTdtuH!;;I?|z~$ zgz_$Yjn|#FQrK7c?eP0@#wV{?W*xK_5Y;SnKTB|r^weD={(?qJ(f-p(>l`%>+pV7UbC9dS#^Fgpx5>BV(`2FGy zQQHGzDF@;I!gO20D49T6;A?BMdKetIITgVy93JUHVojY>ZQf*a!0T|t{yT3`jCi5K zyX)DXqtOd$2Mj-IQ_;&eE>A_z!US z{XOLUV}m9YC-%Bunw7PTsM58l8>XG7+RLz91@NDxHpV@v>8Dkdh^-ANneKsudVF+b zJXlaM0X_0o?;k}Oac`7V@Sy2xrPr@ahLr+tfCEKFue&(V3Sn%;Sr_R1u^mvim-C2H zu{E&jkdEm~L1@UJ>eewbPI?BO+sxQQI;iQmva@lNK_NABm*%p?Asu8UU#%Hn_7~Tb z#W7c+9{SG^`wwmtnxt}MpsaHntaxk;)2|6HL==hna;Q2!y;px1^MfIwEZ2on;@7c@ zPdN)vEMVJy7Q;^S9&0EfUWxw$KTwKF++SFb#LmZe`M|5+CA*3#c*Oe7cK6|SJzvyy zT@7DsR>P38LVMtWebtrUp`_Hi6)6$4U0ksGoP&~lo5k4k*6KTW=RiM_q8nRJ*Em!a zUvulslEIGy^MT9t56fRXn*{IIM0!n?Vx)mL?|;{?oIKr>UC;Sl)Xa{dxGI9z!b~&x zSq&C`R#ww#P<3%SH-j24X$~E~uD#^zd2gtpu!ydg$G(gRHu%coTqyw@bgKF@0a|z+ zky`b&z*@%k1ArJ){Z$MR@jKrOq4OW__iBiBenobNkW5e()n(x(c2G z=}fYVu(_FW?++H4Y0W9D7n^ajjnV-@fz?L8P^%&b3w%F74sn5F z*e&Y4Cmbg`cpoJXX5OBZVt>80g=xK~GW~;*oNOlX6l~P$R}L`w_9YTaXQ4sJh3h#k zz8Xs=g62cspJt9PyiRWjCWCMt-@io3%|9gkl*wS+L|>!HEi}%_Ef|H;)6#d~^UL*D zjIEfqrqZn9P@!F-WMT@oN2TN6?t*2qA?^SR0J`7A1`<8@+w5|Z-kNbUKBs0cXWqek(2NzpQTZ3bJ40?G{7J%u^K-|3 z-Lnq3ni^xe%USMA_$%wKSpkd+qU~4rjOB+L5QbHXQm@n|zMo&oBwxx)N;CC_-LZkA|GA~4x z7qm{ZyR2{;*I}XPx0wvdQ3mHGOKOZWn5eEBM?1OGX^vIBQfZ#ZUiuF-zU$bZ=_dOe z?U01#u?R2qGyRrHv{zV&e)RpxHEDey6QwSBmm#Vq6GAg$M}+mH-8~&NGz$8TTbl{# zL{c{f%lfDU4vVBICgj9G+I}_Z?*l z&>6D=Y>mC{pE7*n50kgZyQa%JgQutHomJ@?cpg??PX>|ODUD6_fN9)!b{@wVyNP)e zUMIxN7OCa8aE#G(tJBTbD)x|&dqL*w0O{BC(Npd9gO;q6sU3eaO)*IiLp z{vLfGQnKZ0IFdH=owOG7Kq~EcqjX23>sr9cS1gvh-z7^B;I$NT7ZvE*c@S89;7*dN zOT)6g&UY}{%;?@1thqTh+ucQb+pti1SI3wp;l0+}S$4WWf9fMYPv1j=$=AY_(<+a} zCaEjLXQLz2(+7VOsX1ml@|JA{cZt362>j;ju+N(#x!pHkC520y%`IjdJ&SrL$$nvo zZGZ$tKVB}pxZt?G;22Kay^CFME)&fx5v@E>A8USPB$UcC52N1?sbUi)ny>Ym#l<`B zHZu1`Uoy!!dDLgpbmV6{FZE$hg*uwU>tlgkZFGTAwnRg+vqSk0R5D)i`O|u(F*`^{`)PJ-a7hp3)Fmw0cK0s#+K4W8;<9 z)pmEl$-U8qIt`}6N#nHL0#mhh>rHRK=Q3aOEF>%_DnHLG0~E7J)XuMYD1LfnwutOs z(Rz1sIw#FXciLob&hz~b^HOIw=NC;p6s4Qj(WS^yfoIo)VB_G6J6#tmrS82k=LK5} zw`WA3u_;J0Xl?7C+MO(Ga2B*I~ECsO>@LapznT z1?b%IzJHCq%uH!Z$o#l`nkZqCKJ3KRdd3MOMO~L)3V!>Yxq$liF5Lr2{|!dl{i%Q`XZ8jdB`wg1Lmv8qW{Ii-SDrYO&qMFM zVAo-|6;8R?gQ2QU&r<05Ztd|FaNm1Bs}ri54wj|py30hiK%_|$o0BT?>f?d3@j#+h zK7UTb0ISN0E@kPSQQt5n+3bpRuh?YkB_$=P?o{H4?0qznybyTQwW z>2$>KwC0B0St)~ffZ(*>nQiBR`d%iXBz~rIhw8vj{uMQ-*ZNVXs4Dql zTl0hj%FM^w{%OE$x#z)}8xm05tZz&@EtcXsbD@%Uds|GgU1POvelM<0=%-!WX`bCc zJ9|+9hsR8pEL+8OoMIy17I!b-tq|9_%~y}hR??f~(f8_COcA~MZ%Sk zQCR0YlX;y6O5G;ozxlVW2by-Z8QO$P{RJhPTqEyh*D9pVHua)8Vc7=n#BJ)f?Han; zHXGxNMunnLoXPa%oVVM^pj-(y5M2TYAr-w$r8{nsq_xhGlkRUs_+@Z(tOQj%wWqj8 zX%MR%V#paB6gzd^FcDinu%JsXO`pfGA^pL`&Ga+M0OXAQs)OE?jgyk6V2m71dTjsZ zMjJ-I<@8SC8r3i8L7L#kURSDy{d9)jM zwx8jM!Q8nHp~lF-bkg(%1l3iiqL?+^U#IWx8TdV3;yh_9f-@+D++@W5`#cIB6$ zwBF>@Vk=Up(U%TsDKa2Mq-AT-i+N{nyEphq4E9f9>lXJP zq8-itH2GrY2hUz@O4IXNU*;!ILohS|^>QEU{v@RFY{&oU+M&zY`pI?>N?Fl%W8@mV zGQD|;#V~LGQY5NlA_#6Uu(EJs#k_ucW!=9rHxt!jnD`=tEZnZ&&?(8eLxe7=e@A>P z<<*zqXx;4KmzamcPvkvEgOc)yJE0SqZ>|ain^!9hI4wQu(f7R*I4vO{?p2q$iQ0B? z^|kwVNd7b2!`(9-r_{JNtj^O3hTcf%;V$0(@$7{AQ6RByNCQVAqoLU1pFUx+n@|5* zAGm#D_Zs>3Gcp_@#(Dj@(d}n0bVY-vWinu`)lMVAyJRktAX!Uo?WX>ze)dSV>uTmm zrfYZRs4M+31o@xC_~~ix^Mvb+0GaPEZ_60^yGzXOoGT7W8ZoRP7}$>lV&_Cm-&)-_UML;UmL<_|38uR=<$rSwcKOM><@S78vkFJvyBlzLQOk@RT0u_|hwBdDbrPLB}z-2UaH1pX?KV zu2C1_TH}j1pB*7$!=}1J#LV%NT5zZXZbkM7$AbdxwN4Tj%kp+t#4VlBG7gh7$?RTF zXK*XpuRErl$R>eTi_vL3ri+FvZ9SizrHoCDO~YC&sL)qJ{5v(G7SQlU8N;`vA|>6i zk+6(3UxFTcSu_9{i+QuO+AmUi3i<)&i;xK)0U`nC;mAbd^Jko0rsRvr#q;_MSeH@! zy7AAoRVA7F?{=27Mk)O$c7zt0%jtT4zH^+b$P8?@LQXz!N;aqVf|>gSb4<%~;-51% zTmSn)>yPXVW}A!s6gKWeveRrA_T-_iw{AM~5=sKjbInKE-Oq2gnk^*F&eue4*mo&*Kd9Coo#T(+^)-W=I5%oZPWBcy-%{!_>OGG0|s zVAN$lsP{qjYIhFL^T`PtC3=6} zXY%oAH~p`dB`kkNq4aP}<)OwE+Cmivv3q$RHN z9F_lihqW}boasrdA(gOYJ6C$f zlFl|=!4d-6YXDOnu8h(&);czJB8^;TT7JDYV}%eW2&USG7|1e-M- zDNlE4o{vhrdGJ9Z5f?3bfl?3@LvvE+GfE?+xUFK$U+&B{ZA!kqPkOR^eoaupdl2&(YYJ0_Ug znyNTznOY{98rlXJ+GN43lx*Ho{mRpA=FtGNR@hoqNGSHU=1;A8&totYnz^)AvKFf( zl%8u~^a3kFwaTy9uheh1a14)sRh#S+)?m-ZH_$tTVu;Y5eLzwGR`WAJT0@KmO} zXU5aVn9F<5NBxAoE&8;ps?~?O>%%o$fT_?;&a_^wI9_nUDI;GNJQ)|h($VX?3vnE> zZ5CW;2C(OX6o$H+nSFPgr--JcPp|{H5L;h3#>RGo2iN&wlDvawAU@h;B$Iom)(rux+f zoCcS_su#M(b!s^;EktN9e;Z!@DWa?xoPzwNv$xaQx@;2R2J(vP`EIb8iq5E1?Ou+0 zZPgyGu5(-eJ!LnHMoJ`xZGL!0`KlwzyJ`FSmz;}UWb1_b$u+jYTt)9Nw`Sd@H?|Ff zdRP$une4Rm`vX|vDhC*iLPjj0Yi_&BBo8H&?L8g3Qs|sdagJBn(8|qQ;T_IRnxreP+4#EHi}_ z+x3HiWYU}79SQFe0p$HBj?1B;irVy`TxrANp|;y( z)be(%L#CeEI)0paVYcvX@}~{yiOuq4#k<<(jmz579bj3|m`}5R&%FMFh-^*&SJP-= z3^gJBiC@)J8ClH%Yr3VAx04i~wN;n@tRBc3efexesu{fP<@&zS^zU`Qux2nH{`|k; zxy{_QDI{;=2y-c`arBd$Dk9JprYtdsg?wKyiq+6DqFX~Y{tEa>Y_*dQ#ZsCq+p@gC zY({ibg$x-bN9B@u3NpAGVh+NxC>?!c&)IdB>f)-7sSp8dFLBhq*9n|a(7YTB! zrbqMoIwwi!glKkmOuA>GxfM(o99;tUx-d!VUYTa}^tyf;Fja!??I%m#0+eJo_F+kn z5haXX7dlCg-6c@(3t&me?!K(|1xWlBO8>x^^ysQ2t6P0oFL5iP1aiMfDybL0P3Gl_ zsAf-aB9s|=1@;vfK@_Ta1W~5bK_^~;8LiS_fjQeZrtIR~$tp>*ldr(nLL&%_e=Q3B z-S)i#6TKNhD5xb>A7XXLDt$!rhzw%NBY@#gB?1VJ zyH>wlL8~T>zs6bkGSK%pnZ{pk7`v&B^QLbVNO3NAJQgNxDaCW6R0||M)=F0m3z;oF z-3}Qa-ouium?LNAYds4yPd4o09C%-A>b=Dvdd}8I;fPb~|h* zy^cst4`X!Ol>YZ50k*|(Jc56jDX%S{@Of|_QLFgt0W2jKoU4stbv=OOF;>!myv)Y% zYYvdk2Y|sD(P zkUPU5
b%4L9?=2Z?y7oME`ElWc|Mn~@(kaGbty=QwzriVd6`uEzuPF1g~k_bmm6 zNsD#x4h))3Ypfza1pJe;jdcJkyCY1xb(M50Y>ZLdou8_W<)&}_5YN4D=bJeZ-yJ$3 zAC%I~O`O>6xJVBT8?3<0=q9DTlRII$aSpDMYFxrI*2qb^{JA$PyAUU12dRu{%1=D; zCxwou+a{R$#w``t!i0vNH``GICO3XcL(cG?g99n4AAeJqfMv(d_7eX2>Md_Us;PA(ZmPFgS{2odyZRF#!^srqWfmhkdqUnW&iq) z%H;`TBd8g)i9K!{QZp(f?iN@kTQiEh=R?Yzu~tdx!}WFy$ecVg5|bMc?r(ttfMWxX z4y0J~gg+glU~;UIFj3%#KAB&8Z`|%}D3Ijg;c$Iw7fA5NqmwPZY0u=>bpbIkm$nB_ zHqRT%kGp65dLtHY@E-RY{i+*w^Lr<~AZ&rh#H#tY>s+G5iM^^D!tDoT@-9YLPerk) z;hlK+)13Lr4qCv3kDr^?h}1jR05U1R-KPTZj`Ji8MS^TSkJ+^d9zC}aiLU!*-YHbo%$@>v9FJ21=>JVH;;5|IC%Ar<$A{S6w->K?u*MxDK|U9mZa+Q@%)T zPQJdiHC(@(}Y;Eu+<)w>mcXF3+M zx%(YdbwW?o9ZwRVUM|`0Twnd~=xsIO!Qj2#Ld6mF!h-1G^ABq&rsV}aG}HlBe|c_r zA`hz`<3#IJzDwXej63^FRTtTnEbyGxA4dVhJIhc!vsj7kDO!|e3taCF=ZP8B<%3=s2EC$&I6EFMjaQ@}c#o#DPc#(Ugz$ksZg|$< zi;90{uH|GwQXlIiG3X-;?f0n@+gVIXcDsKUWq-3}nwv68HH{CdY=7H@tygVO|Izi`02|z#`NX{%biu*B`;4=LXR7aQGd5>%pDc-_rY1gCOOb zT%|l=Fjm$>8y#gB#GPbyyEW&x03b`=hp`1;N@%Po*8pu|-0*C?1_Lr4Fnqf9HgwO9 z)eq484%tY0dSifV0M-8nzjOT8CC$Gszy7*OIcv-nc1SXMedj6ef&qg0w2rtdCCK>T z1|Jh58o;T^U4plZ92X6;17I{I8N#7`SjrT5lbBJ74kboYl58c<2v!IxaNCBxa`+3$ z)uCWagXGSXR$dPk>f7}~?+UR(k_y9Rz>^9fEB)Sou@7XmKnzH7-<$JRe0=-)lAu(! zqn*~>vul0fLk^Q2zKp5XaQLROId+xgWqZd~c7y`o8nMm#xe@AtbrW z)6*ILFMupI6i(?j1J5p1Y4f*3FmLWkJN%`SHN4vMxW|+ML)_9~lz;!UqMifu;Tvrz zG+;hxYV|&BcL?d{vLyw~#|I|lCzyJyK9Dj(eRM_>e ze>m>CUMC;p0oQN(3W{da!X_eD_HsMV22aM*Cu|xa=a5~>c>#PY%o?{Z>^0^BBvE&6 zgGyFXm};+v!Y$qxF%s}Z-82j&vv$*8ol(0}yi!J1R_Q z`qZc>Ft@LH6(GwxO*GUPPktJJ6C1q+m^S~A+Dafo(CVnV#lT=i#b6cbm(c%+W8wAt zpLZ>4N=xIkmI+ex3P64;LS6@ako!AY`Z?PAEx+?yR`zqW@pH8DbJX9i>_^vJizs*gBjv1p96q7O z_?6@^oI)Ka5$SjMce_%lA*oA^{x0IMb&g1Lh1`F+@9cN_rUT`sgXpG%Z2t^eRC#!u z)TPnJ0nX+@seoo6*6fBf&sf1;dqkXA#O;V5<*cQf7Kh5pOB|Swz@0LR%TkqfYNi=G|%I)k*pnVX6aGdQT6c zq6bBK1x*(SK_hm@eS-kR{$(>~T`ekCK5y!jF?^L_@%( z-A(8#6k(bxa+K(N)c2veV-30p|U#pposP{O;?ke7KEI`m<0#`|Z0JE2$(Eo>fiZL5}?Z4Sns=?4!GkfGk;_ z9Y+20^p7&}kSJNvIa9%PSM9^{OQ#3Jp85L!Px1ts3o)wF{4mQ=dXLr~)eHC%?Oi1k zQB_yb{VNHro6)jj>=s|@xXlCKjB;~mG%_(0zOb1LA~W0FRHdj-?k~xMauH8{ykm5) zbB*5=@AVq)K%Q~+@5HhqpM)2YW~Y=tgzEOKAAnM}6*iCstubIVOy?@ZkMS#5at0*x zuIIMXI{45$eNGQnctE!;Sn5QLddsbAyg>BCv8X`4-9gS|32veLiXPOT8_Vf;6iQ1dv#{98OMD@}MHsB!rTNQudl|NajT6XGNbU;4p@i z6P~w^bWa9Jjlc@F9Luw=b~-fd#`W{umYT#e^z1kDgFJr(%RT_!aSEoBY}DhMDXJI5LausWfR+&?3Gd7P8yf z?|;n?qknIwE)LG}&~QI>DSB|7pR0WOgS{DlrgFm`MArQR6bWCGzhm^MzlYNwLK7b! zdT7IgM1n6%z^fwFn7NlfdI&8lOG)w~vzS&yUIbvcZsGHl8I`4Bx zcY9;a`|0kIqG5^oVlQ+td4c!Qnl(;xC!99jZG{MBgI)(xtUZlif*fa8zCNEDywU+G z1WQ(TNmj3suLh#Klt<*J`AxS*KeWdJjuB3Sa<3!QGNAjz_d5S`c zczx${QS180v@;wuio78`jR4fgfbD9d;cO?|({RMGQi53$>YQhH^FX$4VIB#sFy&X! zt9QlhY>nW63#okZJ>JvW%FWhj(SSrZ15cpMl>3#UY8E*fuhOvAZ|%*X`qG0Mod_dp?tvRQn{m zJa9|``SHG({u}k^V3%qNJ_|7KH(J^x+X@LH3-^g($vg+nQV8$9VgwmBS*+j~e_AWWFd>2DLm*3X*|lGcry46SJ*fxC$MO@ zQ0tOSdI;W)=04ZcbOL4GBF`^3=eg7 znBq50MO)U;W?8osv<~kyCUsx+wwUdxo=D#!x$K!mU$0kRm8?Asl^N?Y8w|iJd3x^_ zR9FyhXfoYuSn&1n)$PVlzsU8LELRW;aKo+maON<7BvLV74GkvxRBaU+y4Nf{baz+( zH6+()--=Bp=Jqpa?|rb-Y)gA5PzCkF9V58faEdPSF{C51`LgH0=#Kf&2y!pI@2MG4 z6pkj=)je0O@reF^v=#%o|Dml2jT|EuoA8y#C(h+5ZE0e00j%&md*SC7=Hs?Ll2e&B zzH9WDgzR+E)FDYqnuj1JLBvL8zS7#kF(dZ*}Xhkacw z?-{Hflj~cndde=D-AmlZpp3Dv;|Rk0K+*da4uAU=5?pw71jjCJXV5c##|O*d+nK+& z=XT;rExemM7=CTN1zO4eDUf=3*ZXRd8|($1+bjtSBq3fGqG0>Y`7J})^Uw5S#gBV@ z4GrOyJE1A+Rrv!OEMMXIG;^b3y`S6p^Sj5}&0L0Jsnih^a?ot^-b@+0T#I|x#I#BW``7OnEp z?|zzbQ{)8@X3_cv;+}FH_;&N&@XcL_k)rH6#IIhqTBeZvqKoaxNPX;)?F`cX9cTgI z-D^Tn`&b{B+uyqInXSx6I15p9H$$ELXCgD}PChwF(~@)Pcjb&2uhv># zEbPVALyuqFay^`;&(#{N<;~TGKbQ?b6uLgwW|zBkVH>PTT=)yHXqIkbUo&^Q{AYyy zBZM0Kj}Y4Y3GKbAJj+Yn;v9Kx=g112p~5%>D~X`8h#rEkDJ(2hr-o`{HxjQ^?)(Aj}3O5Zp=W=jAg|Gmgmk zp!)pBHfl_^hGWuB2)?O%8ww!# z?1w9TKfe{n8(kophN-+yRb(LHeJzt);Gfc&31rZ~H~WyCQhW^S#})k)Mf=Pho1vN- zyVkvL+3)zxC0T#`AZag8+_Nvaq(9EF$NatJbclPdy$lA#wKUTC%g7@1eVNg)J#}&^(UYzIs7faoL`;ABu!W`9mftQ*_4rO*KVe? zb#z*qU-w~rfTopu7Kt?E`KV>LxeIL_;#b6A!;pU}T>l*x^ysobG1~E3^KJ4ULb2EQ zgqyz@Ta^WI^TY6-7wO-diGYQ7_nrw$gnDqNsl;^cctk>gJ) z=_==ZS7Y?>X9&#ow1^b7JjBwHyKQ*;H=+H9R>+|NKNm|6RPI*z#nbWOIg((m$MMOJ z;nvz}mnJ1`g`W@sg2rg;seE+g5?vC)s_nkLb2`U0uDk_>xDx*w*qAJPceh;WS zX~uaMH9$8|CX!03XT9QSwbGZK*t~k(961sH1ZJ)%;NWj_m{m6Ev(#C*P@Js zN}oRL>C*}BEqwNU=)C$i{C2@<_^t0~3M1g**b-6?BC>n9r~E&B{v&MvV@ZW{@X(6A z%NkI;U|~*8j==d7X=G>eDMb@^tZ&S=*=X^jL%y^AAG!Xyc!d3IPj63edPq3s*1y9P zcpjOOfNp$pIgdn2QudUcxKtLTh6T zeTf_fR#vbrH&>Yvt?$sZo4fdvZt98FPHyoE)>l|+Cp!-t(!$5ZZ zNU)xtL{^716AuaFkI3>RiJb6J@v&h3ahz2|g8)1)4b;BpQ z&KAh&Ez_G}9iCl)$jQL#(kawMwx%?k1BOwAXd|~z)a-b9>C}h{!OsK`V7R8%zK1J4 zwi=6PC6$?`Lch~OHdzdP(Yr|uWozXh;7Yv{_u_QB-4DLaG{hvvR5sJ%5u;^4ACf+{Y0O`ZjCS2>oM_-%lBsh4B zQsRB2MY}I#c>FEyhu7_t^mabvj)N=dEZ`;TJg2k)n-|k9Z&DtC6 zqOSA%3$=iYSLdc(uYOL_H<=gG{@jpM+TNk|FO)fd7Jf%ZH*e;OQy_(1{<`%@Y9{KR(YqGB^c!GwKcl`1+l9P*cO(E6t3-K1b9dqdr0>FOlHjA4A0=7 z&SNB!5Qf}D-r{bssblhvfBY3_DL1!AK!E#XOZmz;HG>6ZrKQk{PS*v*Ui5^(%;aes z!AJp}Hq!v67h)VT!YvI60;5^hadNODVpmin*E*|z}m_-KjTqvXV-E*eH<8@SW!~;cSk(Z<2L5 z6R$YFdlbhA-9EH-yF7Nab`M=<9*V#a{6$8!_3be~{p3F7z5W^aqg&(K)sa&QW1h5Z z|H53NIj@(=3XV(IH2i{jzH(&QGPYo9rp|3t9K*m{QcGC<$ zP^Xt35&^8L_?+u9rXhpvzaY(w;e5|?nhx`AGl6nM`)A+b{ZHKqy3V{K>wYC%TxA$G z@aanhx1RHln5ds#W8}}@6&K6nDo|c;i6t5>G#}&rz^LG%Wkm;|^@PSkd&6?L8_-O0 zzC1(o?e4e;QqkdPRdIMI%^s7y3kJZ?*Vib^pFJZlzAUS?nrZk(+zF$3m(}hN$UU34MG)!4OKHsux*p$%6|Q2Zpwcv0vl)o1w{7U*FscaF zi5ULrPGBKy*5uXi>8gJ^IT27{D>27DlvK++_SYpfnftG(9n#qaby=pOgeE4d2@6vi z5UCn??`$o3HJLSYfsz{J^6DdDf#LK>ra@b`vUgq2i__@u^fxmdqjR@ zc&@PH8EaB#<^Rp>N9*A;k{`{>t`1n56P^)@(v!{-hQnZ@RGaxxdwMr1oc8MxEaEyI zN1h34qr%udFtz^EWkAev)@@yO|2C{6c0u&-j6hvLr3a|gtlyuY%FNqss($UtS!9x~ z;WHg0I1L)DHGE8cb4Qd3az=Uonc!>{?$PJ3JkGAe{AJcoH@xr+UK^3EeYP!v#?TZo%K&3V#|*WE?MOGVHV z;j9dmIe%IGijc1Tc1*+U<0$Q2)nEOtPQjL+x2?|RFvjx#1waJ9`}qsYOXYh@H?;@F zLh(AfhFmvNeWyaWDX`FC9i#X`?zfokZ5=Oi`?z`VizD(u%KB2fM;`2wt)Vv}%%68! z_^<&IKK$RDuMy6le(RtPhR26(g(AmPKq>{oh7M&-jY|I86< z#cSs;QS*Bf$d8iX`yxMfS3BQN_%JE!0rBC-2_KGy4;M}-A0EJaVb?Rx=6m4{knrG> ze6IF-?(|y+o8aWW7k2r%J!l>rHLkPBgDsHo;9>Ub7C7kFwJvyL9q{rJo_JoF=qgc- zXpN{zbXm%K82iE)2=^bgo2H8h9n;7;-im9``$E*X`l+9wT)sbpY<8CYfBN>6+3)?K z^~GNR00960?N?806G0T8uKkm0TLTI$;vs@m@z4$RQc%gF)wXD?P+N+ZGP{{>hD>(X zo!!#*P&}%KegVOcAs+n*{Q`negx>Tbcv5FFGs$+lO=ET;J>@PFF-@NyBGBW{y z+pICcK3^~&W}cHRw;_oKm=DU9+bHt_^VNoZFTFpU+dtf%Hbn1p(SDh1=q^Td$78y~ zQd8-2JS85#YLPyNImfBu{Pj-8cgy(mm)Va!fe&aS&bc#m2V%N8psbLR-+lds9hG?b z=k{g&zm<)(M#9gh`k*IRF+cQHZlc0^Crdy@GB<`0=KFn=bwTtA;{>1#3l__`coRT-D~ z8rND~nt#0P1=w{cAdm)Ykl@NoXv^_jzdG`N`V$g=Vh*hUZ=sE<=nbHaolRGcb+?f3 z;|dbUM+8AC0Yen;D!^1ML@72g!NCrwZ(`Ey0v061gjS6<5XFv7P~bWO?NG}luD^+S zJ|=Ok8tWH4p6m+TLX{_6jU)cxz&cWS7s2W43xJcqcg6dybyu%F<}A|CZzdOF4?2jb zn!pNn%`gzzp$ZO~MF3t%tIaMDpzTPXRYg|KbhnkJ7-#!#=mE;!Hu76z)9rI0T&*Q>!0iK{At(U9V7m`9ZcXy&xJfgj_aWKyh*&=F`mF`_emG`&(e9| zN9#7KwdZT{DU0|02DGpHQ*gZQ9P6tT`Bb-etI)CadDjZ-$O)*vfP=-*)Df}?G-r#m zcV~*aM?!Y&P#yUm`%-5|9@R}^F~}Zg>K(^Xj>S>VG!Ah_@i>e#;JWT=Fc*&cIT?%C!MR^-}eqmG8;p*1=&tzcHg5i-)!%tH)NdCnZ?Pk1!Lgs z_0g%`70Km#UPNy!rgu4}$G^XSYTlh2pZDlOYu>1S(!BBgD(QX(j_C~c`F(z$e~$QX oBmB_>{(5A*CNUUTDl2|;-|OW6nK~qI9_Z1K=~`qI7owVE_OC delta 4407 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 diff --git a/GUIs/blcerpGUI.m b/GUIs/blcerpGUI.m index 425b9393..2d6c7786 100755 --- a/GUIs/blcerpGUI.m +++ b/GUIs/blcerpGUI.m @@ -8,7 +8,7 @@ %b8d3721ed219e65100184c6b95db209bb8d3721ed219e65100184c6b95db209b % % ERPLAB Toolbox -% Copyright 2007 The Regents of the University of California +% Copyright © 2007 The Regents of the University of California % Created by Javier Lopez-Calderon and Steven Luck % Center for Mind and Brain, University of California, Davis, % javlopez@ucdavis.edu, sjluck@ucdavis.edu @@ -31,19 +31,19 @@ % Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... - 'gui_Singleton', gui_Singleton, ... - 'gui_OpeningFcn', @blcerpGUI_OpeningFcn, ... - 'gui_OutputFcn', @blcerpGUI_OutputFcn, ... - 'gui_LayoutFcn', [] , ... - 'gui_Callback', []); + 'gui_Singleton', gui_Singleton, ... + 'gui_OpeningFcn', @blcerpGUI_OpeningFcn, ... + 'gui_OutputFcn', @blcerpGUI_OutputFcn, ... + 'gui_LayoutFcn', [] , ... + 'gui_Callback', []); if nargin && ischar(varargin{1}) - gui_State.gui_Callback = str2func(varargin{1}); + gui_State.gui_Callback = str2func(varargin{1}); end if nargout - [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); + [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else - gui_mainfcn(gui_State, varargin{:}); + gui_mainfcn(gui_State, varargin{:}); end % End initialization code - DO NOT EDIT @@ -54,57 +54,58 @@ function blcerpGUI_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = []; try - ERP = varargin{1}; - xmin = 1000*ERP.xmin; - xmax = 1000*ERP.xmax; + ERP = varargin{1}; + xmin = 1000*ERP.xmin; + xmax = 1000*ERP.xmax; catch - ERP = []; - xmin = -200; - xmax = 800; + ERP = []; + xmin = -200; + xmax = 800; end +handles.ERP = ERP; try - Titlegui = varargin{2}; + Titlegui = varargin{2}; catch - Titlegui = 'Testing this GUI...'; + Titlegui = 'Testing this GUI...'; end try - interval = varargin{3}; + interval = varargin{3}; catch - interval = 'pre'; + interval = 'pre'; end set(handles.uipanel_blc,'Title', Titlegui) if strcmpi(interval,'pre') - intvl = [xmin 0]; - set(handles.edit_custom,'Enable','off') - set(handles.radiobutton_pre,'Value', 1) + intvl = [xmin 0]; + set(handles.edit_custom,'Enable','off') + set(handles.radiobutton_pre,'Value', 1) elseif strcmpi(interval,'post') - intvl = [0 xmax]; - set(handles.edit_custom,'Enable','off') - set(handles.radiobutton_post,'Value', 1) + intvl = [0 xmax]; + set(handles.edit_custom,'Enable','off') + set(handles.radiobutton_post,'Value', 1) elseif strcmpi(interval,'all') - intvl = [xmin xmax]; - set(handles.edit_custom,'Enable','off') - set(handles.radiobutton_all,'Value', 1) + intvl = [xmin xmax]; + set(handles.edit_custom,'Enable','off') + set(handles.radiobutton_all,'Value', 1) else - if ischar(interval) - intvl = str2num(interval); % interv in ms - else - intvl = interval; - end - if length(intvl)~=2 - intvl = []; - else - set(handles.edit_custom,'Enable','on') - set(handles.radiobutton_custom,'Value', 1) - end + if ischar(interval) + intvl = str2num(interval); % interv in ms + else + intvl = interval; + end + if length(intvl)~=2 + intvl = []; + else + set(handles.edit_custom,'Enable','on') + set(handles.radiobutton_custom,'Value', 1) + end end if ~isempty(intvl) - blcstr = sprintf('%.1f %.1f',intvl); - set(handles.edit_custom,'String',blcstr); + blcstr = sprintf('%.1f %.1f',intvl); + set(handles.edit_custom,'String',blcstr); else - set(handles.edit_custom,'Enable','off') - set(handles.radiobutton_none,'Value', 1) + set(handles.edit_custom,'Enable','off') + set(handles.radiobutton_none,'Value', 1) end handles.xmin = xmin; @@ -121,6 +122,36 @@ function blcerpGUI_OpeningFcn(hObject, eventdata, handles, varargin) % handles = setfonterplab(handles); +handles.bin_browse.BackgroundColor = [1 1 1]; +handles.chans_browse.BackgroundColor = [1 1 1]; + +if ~isempty(ERP) && ~iserpstruct(ERP) + handles.bin_browse.Enable = 'off'; + handles.edit_bins.Enable = 'off'; +elseif ~isempty(ERP) && iserpstruct(ERP) + handles.bin_browse.Enable = 'on'; + handles.edit_bins.Enable = 'on'; + BinArray = 1:ERP.nbin; + BinArray = vect2colon(BinArray,'Sort', 'on'); + BinArray = erase(BinArray,{'[',']'}); + handles.edit_bins.String = BinArray; +end + +if ~isempty(ERP) + try + chanArray = 1:ERP.nbchan; + catch + chanArray = 1:ERP.nchan; + end + chanArray = vect2colon(chanArray,'Sort', 'on'); + chanArray = erase(chanArray,{'[',']'}); + handles.edit_chans.String = chanArray; +end + + + + + % Update handles structure guidata(hObject, handles); @@ -154,7 +185,7 @@ function edit_custom_Callback(hObject, eventdata, handles) % ------------------------------------------------------------------------- function edit_custom_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); + set(hObject,'BackgroundColor','white'); end % ------------------------------------------------------------------------- @@ -170,7 +201,7 @@ function pushbutton_help_Callback(hObject, eventdata, handles) % doc pop_blcerp % fctn = dbstack; % fctn = fctn(end).name; -% doc(fctn) +% doc(fctn) web https://github.com/lucklab/erplab/wiki/ERP-Bin-Operations -browser % ------------------------------------------------------------------------- @@ -181,105 +212,125 @@ function pushbutton_run_Callback(hObject, eventdata, handles) epoch = [xmin xmax]; if isempty(epoch) - msgboxText = 'Wrong epoch range!'; - title = 'ERPLAB: Bin-based epoch inputs'; - errorfound(msgboxText, title); - return -else - repoch = size(epoch,1); % rows for epoch - cepoch = size(epoch,2); % columns for epoch - blc = handles.blc; - cusbutt = get(handles.radiobutton_custom,'Value'); + msgboxText = 'Wrong epoch range!'; + title = 'ERPLAB: Bin-based epoch inputs'; + errorfound(msgboxText, title); + return +else + repoch = size(epoch,1); % rows for epoch + cepoch = size(epoch,2); % columns for epoch + blc = handles.blc; + cusbutt = get(handles.radiobutton_custom,'Value'); + + % + % Checks updated custom blc values + % + if cusbutt + blctest = get(handles.edit_custom,'String'); + if isempty(blctest) + msgboxText = 'You must enter 2 values first.'; + title = 'ERPLAB: Time range inputs'; + errorfound(sprintf(msgboxText), title); + return + end + blctest = str2num(blctest); + if isempty(blctest) + if strcmpi(get(handles.edit_custom,'String'),'none') + custupdated = 1; + blc = 'none'; + elseif strcmpi(get(handles.edit_custom,'String'),'pre') + custupdated = 1; + blc = 'pre'; + elseif strcmpi(get(handles.edit_custom,'String'),'post') + custupdated = 1; + blc = 'post'; + elseif strcmpi(get(handles.edit_custom,'String'),'all')|| strcmpi(get(handles.edit_custom,'String'),'whole') + custupdated = 1; + blc = 'all'; + else + custupdated = 0; + end + else + rblc = size(blctest,1); + cblc = size(blctest,2); + extvalcond = max(epoch)>=max(blctest) && min(epoch)<=min(blctest); + custupdated = rblc==1 && cblc==2 && extvalcond; + blc = blctest; + end + else + custupdated = 1; + end + + if repoch==1 && cepoch==2 && custupdated + if isnumeric(blc) && blc(1)>=blc(2) + msgboxText = ['For time range, lower limit must be on the left.\n'... + 'Additionally, lower time limit must be at least 1/samplerate seconds lesser than the higher one.']; + title = 'ERPLAB: Time range inputs'; + errorfound(sprintf(msgboxText), title); + return + end + if epoch(1)>0 || epoch(2)<0 + msgboxText = 'Epoch range must span across time zero.'; + title = 'ERPLAB: Time range inputs'; + errorfound(msgboxText, title); + return + end + if epoch(1)>=0 && ~isnumeric(blc) && strcmpi(blc,'pre') + msgboxText = 'There is no pre-stimulus interval.'; + title = 'ERPLAB: Time range inputs'; + errorfound(msgboxText, title); + return + end + if epoch(2)<=0 && ~isnumeric(blc) && strcmpi(blc,'post') + msgboxText = 'There is no post-stimulus interval.'; + title = 'ERPLAB: Time range inputs'; + errorfound(msgboxText, title); + return + end + ERP = handles.ERP; + try + chanArraydef = 1:ERP.nbchan; + nchan = ERP.nbchan; + catch + chanArraydef = 1:ERP.nchan; + nchan = ERP.nchan; + end + chanArray = str2num(handles.edit_chans.String); + if isempty(chanArray) || any(chanArray(:)>nchan) || any(chanArray(:)<1) + chanArray = chanArraydef; + end - % - % Checks updated custom blc values - % - if cusbutt - blctest = get(handles.edit_custom,'String'); - if isempty(blctest) - msgboxText = 'You must enter 2 values first.'; - title = 'ERPLAB: Time range inputs'; - errorfound(sprintf(msgboxText), title); - return - end - blctest = str2num(blctest); - if isempty(blctest) - if strcmpi(get(handles.edit_custom,'String'),'none') - custupdated = 1; - blc = 'none'; - elseif strcmpi(get(handles.edit_custom,'String'),'pre') - custupdated = 1; - blc = 'pre'; - elseif strcmpi(get(handles.edit_custom,'String'),'post') - custupdated = 1; - blc = 'post'; - elseif strcmpi(get(handles.edit_custom,'String'),'all')|| strcmpi(get(handles.edit_custom,'String'),'whole') - custupdated = 1; - blc = 'all'; - else - custupdated = 0; - end - else - rblc = size(blctest,1); - cblc = size(blctest,2); - extvalcond = max(epoch)>=max(blctest) && min(epoch)<=min(blctest); - custupdated = rblc==1 && cblc==2 && extvalcond; - blc = blctest; - end + if iserpstruct(ERP) + binArray = str2num( handles.edit_bins.String); + if isempty(binArray) || any(binArray(:)>ERP.nbin) || any(binArray(:)<1) + binArray = 1:ERP.nbin; + end else - custupdated = 1; + binArray = []; end + handles.output = {blc,chanArray,binArray}; - if repoch==1 && cepoch==2 && custupdated - if isnumeric(blc) && blc(1)>=blc(2) - msgboxText = ['For time range, lower limit must be on the left.\n'... - 'Additionally, lower time limit must be at least 1/samplerate seconds lesser than the higher one.']; - title = 'ERPLAB: Time range inputs'; - errorfound(sprintf(msgboxText), title); - return - end - if epoch(1)>0 || epoch(2)<0 - msgboxText = 'Epoch range must span across time zero.'; - title = 'ERPLAB: Time range inputs'; - errorfound(msgboxText, title); - return - end - if epoch(1)>=0 && ~isnumeric(blc) && strcmpi(blc,'pre') - msgboxText = 'There is no pre-stimulus interval.'; - title = 'ERPLAB: Time range inputs'; - errorfound(msgboxText, title); - return - end - if epoch(2)<=0 && ~isnumeric(blc) && strcmpi(blc,'post') - msgboxText = 'There is no post-stimulus interval.'; - title = 'ERPLAB: Time range inputs'; - errorfound(msgboxText, title); - return - end - - handles.output = {blc}; - - % Update handles structure - guidata(hObject, handles); - uiresume(handles.gui_chassis); + % Update handles structure + guidata(hObject, handles); + uiresume(handles.gui_chassis); + else + if custupdated + msgboxText = 'Wrong time range! Please, enter 2 values.'; + title = 'ERPLAB: Time range inputs'; + errorfound(msgboxText, title); else - if custupdated - msgboxText = 'Wrong time range! Please, enter 2 values.'; - title = 'ERPLAB: Time range inputs'; - errorfound(msgboxText, title); - else - msgboxText = 'Wrong baseline range! Please, enter 2 values.'; - title = 'ERPLAB: Time range inputs'; - errorfound(msgboxText, title); - end - return + msgboxText = 'Wrong baseline range! Please, enter 2 values.'; + title = 'ERPLAB: Time range inputs'; + errorfound(msgboxText, title); end + return + end end % ------------------------------------------------------------------------- function radiobutton_none_Callback(hObject, eventdata, handles) if ~get(hObject,'Value') - set(hObject,'Value',1) + set(hObject,'Value',1) end set(handles.edit_custom,'Enable','off') set(handles.edit_custom,'String','') @@ -293,9 +344,9 @@ function radiobutton_none_Callback(hObject, eventdata, handles) % ------------------------------------------------------------------------- function radiobutton_pre_Callback(hObject, eventdata, handles) if ~get(hObject,'Value') - set(hObject,'Value',1) + set(hObject,'Value',1) end - + set(handles.edit_custom,'Enable','off') set(handles.edit_custom,'String','') blc = 'pre'; @@ -310,7 +361,7 @@ function radiobutton_pre_Callback(hObject, eventdata, handles) % ------------------------------------------------------------------------- function radiobutton_post_Callback(hObject, eventdata, handles) if ~get(hObject,'Value') - set(hObject,'Value',1) + set(hObject,'Value',1) end set(handles.edit_custom,'Enable','off') set(handles.edit_custom,'String','') @@ -326,7 +377,7 @@ function radiobutton_post_Callback(hObject, eventdata, handles) % ------------------------------------------------------------------------- function radiobutton_all_Callback(hObject, eventdata, handles) if ~get(hObject,'Value') - set(hObject,'Value',1) + set(hObject,'Value',1) end set(handles.edit_custom,'Enable','off') set(handles.edit_custom,'String','') @@ -344,7 +395,7 @@ function radiobutton_all_Callback(hObject, eventdata, handles) function radiobutton_custom_Callback(hObject, eventdata, handles) if ~get(hObject,'Value') - set(hObject,'Value',1) + set(hObject,'Value',1) end set(handles.edit_custom,'Enable','on') @@ -359,31 +410,167 @@ function radiobutton_custom_Callback(hObject, eventdata, handles) % ------------------------------------------------------------------------- function checkbox_blc_Callback(hObject, eventdata, handles) if get(hObject,'Value') - set(handles.radiobutton_none,'Enable','on') - set(handles.radiobutton_pre,'Enable','on') - set(handles.radiobutton_post,'Enable','on') - set(handles.radiobutton_all,'Enable','on') - set(handles.radiobutton_custom,'Enable','on') - set(handles.edit_custom,'Enable','on') + set(handles.radiobutton_none,'Enable','on') + set(handles.radiobutton_pre,'Enable','on') + set(handles.radiobutton_post,'Enable','on') + set(handles.radiobutton_all,'Enable','on') + set(handles.radiobutton_custom,'Enable','on') + set(handles.edit_custom,'Enable','on') else - set(handles.radiobutton_none,'Enable','off') - set(handles.radiobutton_pre,'Enable','off') - set(handles.radiobutton_post,'Enable','off') - set(handles.radiobutton_all,'Enable','off') - set(handles.radiobutton_custom,'Enable','off') - set(handles.edit_custom,'Enable','off') + set(handles.radiobutton_none,'Enable','off') + set(handles.radiobutton_pre,'Enable','off') + set(handles.radiobutton_post,'Enable','off') + set(handles.radiobutton_all,'Enable','off') + set(handles.radiobutton_custom,'Enable','off') + set(handles.edit_custom,'Enable','off') end %-------------------------------------------------------------------------- function gui_chassis_CloseRequestFcn(hObject, eventdata, handles) if isequal(get(handles.gui_chassis, 'waitstatus'), 'waiting') - %The GUI is still in UIWAIT, us UIRESUME - handles.output = []; - %Update handles structure - guidata(hObject, handles); - uiresume(handles.gui_chassis); + %The GUI is still in UIWAIT, us UIRESUME + handles.output = []; + %Update handles structure + guidata(hObject, handles); + uiresume(handles.gui_chassis); +else + % The GUI is no longer waiting, just close it + delete(handles.gui_chassis); +end + + + +function edit_chans_Callback(hObject, eventdata, handles) +chanArray = str2num(handles.edit_chans.String); +ERP = handles.ERP; +if ~isempty(ERP) + if iserpstruct(ERP) + bchan = ERP.nchan; + else + bchan = ERP.nbchan; + end + if isempty(chanArray) || any(chanArray(:)>bchan) || any(chanArray(:)<1) + msgboxText = ['Channel index(es) should be between 1 and',32,num2str(bchan)]; + title = 'ERPLAB: channel inputs'; + errorfound(sprintf(msgboxText), title); + end + chanArray = 1:bchan; + chanArray = vect2colon(chanArray,'Sort', 'on'); + chanArray = erase(chanArray,{'[',']'}); + handles.edit_chans.String = chanArray; +end + + + + + + +% --- Executes during object creation, after setting all properties. +function edit_chans_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit_chans (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on button press in chans_browse. +function chans_browse_Callback(hObject, eventdata, handles) +ERP = handles.ERP; +chanArray = str2num(handles.edit_chans.String); +if ~isempty(ERP) + if iserpstruct(ERP) + bchan = ERP.nchan; + else + bchan = ERP.nbchan; + end + if isempty(chanArray) || any(chanArray(:)>bchan) || any(chanArray(:)<1) + chanArray = 1:bchan; + end + + for Numofchan = 1:bchan + try + listb{Numofchan}= strcat(num2str(Numofchan),'.',ERP.chanlocs(Numofchan).labels); + catch + listb{Numofchan}= strcat(num2str(Numofchan),'.','chan',num2str(Numofchan)); + end + end + titlename = 'Select Channel(s):'; + chan_label_select = browsechanbinGUI(listb, chanArray, titlename); + if ~isempty(chan_label_select) + chanset = vect2colon(chan_label_select,'Sort', 'on'); + chanset = erase(chanset,{'[',']'}); + handles.edit_chans.String=chanset; + end +end + + + + +function edit_bins_Callback(hObject, eventdata, handles) +binArray = str2num(handles.edit_bins.String); + +ERP = handles.ERP; +if ~isempty(ERP) && iserpstruct(ERP) + if isempty(binArray) || any(binArray(:)>ERP.nbin) || any(binArray(:)<1) + msgboxText = ['Bin index(es) should be between 1 and',32,num2str(ERP.nbin)]; + title = 'ERPLAB: bin inputs'; + errorfound(sprintf(msgboxText), title); + end + handles.bin_browse.Enable = 'on'; + handles.edit_bins.Enable = 'on'; + BinArray = 1:ERP.nbin; + BinArray = vect2colon(BinArray,'Sort', 'on'); + BinArray = erase(BinArray,{'[',']'}); + handles.edit_bins.String = BinArray; +else + handles.bin_browse.Enable = 'off'; + handles.edit_bins.Enable = 'off'; + handles.edit_bins.String = ''; +end + + +% --- Executes during object creation, after setting all properties. +function edit_bins_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit_bins (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on button press in bin_browse. +function bin_browse_Callback(hObject, eventdata, handles) + +ERP = handles.ERP; +if ~isempty(ERP) && iserpstruct(ERP) + BinArray = str2num(handles.edit_bins.String); + if isempty(BinArray) || any(BinArray(:)>ERP.nbin) || any(BinArray(:)<1) + BinArray = 1:ERP.nbin; + end + + for Numofbin = 1:length(ERP.bindescr) + listb{Numofbin} = char(strcat(num2str(Numofbin),'.',ERP.bindescr{Numofbin})); + end + titlename = 'Select Bin(s):'; + %----------------judge the number of latency/latencies-------- + bin_label_select = browsechanbinGUI(listb, BinArray, titlename); + if ~isempty(bin_label_select) + binset = vect2colon(bin_label_select,'Sort', 'on'); + binset = erase(binset,{'[',']'}); + handles.edit_bins.String=binset; + end else - % The GUI is no longer waiting, just close it - delete(handles.gui_chassis); + handles.bin_browse.Enable = 'off'; + handles.edit_bins.Enable = 'off'; + handles.edit_bins.String = ''; end diff --git a/GUIs/browsechanbinGUI.fig b/GUIs/browsechanbinGUI.fig index e951a90c7410deb63ae17683ac47fafd672715d8..c12a8284650c03c700f7f6c96802be81e6aeee73 100755 GIT binary patch delta 6644 zcmV$J^LzhqhFC z()#($&U^dbn>RCW-b?|10FG}1FedQ0c=8~E3yRLgo(b_Z>SeolyC^{S8wHoudm#q! zmXDN(2K1_KMEI2Wh;ob=a2nXHQsjwN<|79~H|#Mbp7%gUkI@u8#uSz?t>_xA2NZSl zkDX$NgiESj!kgA-mgIl%T7Q1fcF!vMq4?SLFlV3}wg|%<6VGgazl#~JxTvdtiMWKO z$SJvmp>6befEZtKI^tHai#~?UE++mmLZ4j{yVUqCLZiEL=znqY$Jw`QZ(9vBEV9dz3v@| zz*~c~>JY!xX)il}6d`X5-$O3jLUi488XKgF!Z@

2Wv#l5r?$rvWK+IHD>Dq?|2q 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 diff --git a/GUIs/chanoperGUI.fig b/GUIs/chanoperGUI.fig index 274c65c89466832e8ce4551a0251eddfd878b261..9f99916c78a6ad823692f6351f1b348989c7914f 100755 GIT binary patch literal 32479 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

OA@{ee%J*_<^=^)4_QbtE9 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 Advanced GUI for ',typedata]) handles = painterplabstudio(handles); handles = setfonterplabestudio(handles); handles.pushbutton_RUN.String = 'OK'; else - version = geterplabversion; -set(handles.gui_chassis,'Name', ['ERPLAB ' version ' - Channel Operation GUI for ' typedata]) + set(handles.gui_chassis,'Name', ['ERPLAB ' version ' - Channel Operation GUI for ' typedata]) % handles = painterplab(handles); handles = setfonterplab(handles); @@ -107,9 +105,9 @@ function chanoperGUI_OpeningFcn(hObject, eventdata, handles, varargin) % formulas = erpworkingmemory(formtype); if isempty(formulas) - set(handles.editor,'String',''); + set(handles.editor,'String',''); else - set(handles.editor, 'String', formulas) + set(handles.editor, 'String', formulas) end % For undo & redo @@ -123,13 +121,13 @@ function chanoperGUI_OpeningFcn(hObject, eventdata, handles, varargin) % listch=[]; if isempty(ERPLAB.chanlocs) - for e=1:nchan - ERPLAB.chanlocs(e).labels = ['Ch' num2str(e)]; - end + for e=1:nchan + ERPLAB.chanlocs(e).labels = ['Ch' num2str(e)]; + end end listch = cell(1,nchan); for ch =1:nchan - listch{ch} = [num2str(ch) ' = ' ERPLAB.chanlocs(ch).labels ]; + listch{ch} = [num2str(ch) ' = ' ERPLAB.chanlocs(ch).labels ]; end set(handles.listboxchan1,'String', listch) @@ -147,50 +145,54 @@ function chanoperGUI_OpeningFcn(hObject, eventdata, handles, varargin) % % Gui memory % -chanopGUI = erpworkingmemory('chanopGUI'); +if Toolabel==0 + chanopGUI = erpworkingmemory('chanopGUI'); +else + chanopGUI = estudioworkingmemory('chanopGUI'); +end if isempty(chanopGUI) - set(handles.button_recursive,'Value', 1); % default is Modify existing ERPset (recursive updating) - set(handles.button_savelist, 'Enable','off') - set(handles.chkeeplocs,'Value', 1) %default is Preserve Channel locations - - % - % File List - % - set(handles.edit_filelist,'String',''); - set(handles.checkbox_sendfile2history,'Value',0) - handles.listname = []; + set(handles.button_recursive,'Value', 1); % default is Modify existing ERPset (recursive updating) + set(handles.button_savelist, 'Enable','off') + set(handles.chkeeplocs,'Value', 1) %default is Preserve Channel locations + + % + % File List + % + set(handles.edit_filelist,'String',''); + set(handles.checkbox_sendfile2history,'Value',0) + handles.listname = []; else - if chanopGUI.emode==0 - set(handles.button_recursive,'Value', 1); - set(handles.button_no_recu,'Value', 0); - else - set(handles.button_recursive,'Value', 0); - set(handles.button_no_recu,'Value', 1); - end - if chanopGUI.hmode==0 - set(handles.checkbox_sendfile2history,'Value', 0); - else - set(handles.checkbox_sendfile2history,'Value', 1); - end - if chanopGUI.keeplocs ==1 - set(handles.chkeeplocs,'Value',1); - else - set(handles.chkeeplocs,'Value',0); - end - listname = chanopGUI.listname; - set(handles.edit_filelist,'String', listname ); - handles.listname = listname; % JLC Sept 1, 2012 + if chanopGUI.emode==0 + set(handles.button_recursive,'Value', 1); + set(handles.button_no_recu,'Value', 0); + else + set(handles.button_recursive,'Value', 0); + set(handles.button_no_recu,'Value', 1); + end + if chanopGUI.hmode==0 + set(handles.checkbox_sendfile2history,'Value', 0); + else + set(handles.checkbox_sendfile2history,'Value', 1); + end + if chanopGUI.keeplocs ==1 + set(handles.chkeeplocs,'Value',1); + else + set(handles.chkeeplocs,'Value',0); + end + listname = chanopGUI.listname; + set(handles.edit_filelist,'String', listname ); + handles.listname = listname; % JLC Sept 1, 2012 end % wchmsgon = erpworkingmemory('wchmsgon'); if isempty(wchmsgon) || wchmsgon==0 - set(handles.chwarning,'Value', 0) + set(handles.chwarning,'Value', 0) elseif wchmsgon==1 - set(handles.chwarning,'Value', 1) + set(handles.chwarning,'Value', 1) else - error('Oops...checkbox_warning memory failed') + error('Oops...checkbox_warning memory failed') end handles.locs = ERPLAB.chanlocs; @@ -245,7 +247,7 @@ function editor_Callback(hObject, eventdata, handles) %-------------------------------------------------------------------------- function editor_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); + set(hObject,'BackgroundColor','white'); end %-------------------------------------------------------------------------- @@ -263,65 +265,65 @@ function pushbutton_RUN_Callback(hObject, eventdata, handles) if strcmp(formulalist,'') - msgboxText = 'You have not written any formula!'; - title = 'ERPLAB: chanoperGUI few inputs'; - errorfound(msgboxText, title); - return + msgboxText = 'You have not written any formula!'; + title = 'ERPLAB: chanoperGUI few inputs'; + errorfound(msgboxText, title); + return end if size(formulalist,2)>256 - msgboxText = ['Formulas length exceed 256 characters.\n\n'... - 'Be sure to press [Enter] after you have entered each formula.']; - title = 'ERPLAB: chanoperGUI few inputs'; - errorfound(sprintf(msgboxText), title); - return + msgboxText = ['Formulas length exceed 256 characters.\n\n'... + 'Be sure to press [Enter] after you have entered each formula.']; + title = 'ERPLAB: chanoperGUI few inputs'; + errorfound(sprintf(msgboxText), title); + return end % % Check formulas % if get(handles.button_recursive,'Value') - editormode = 0; + editormode = 0; else - editormode = 1; + editormode = 1; end typedata = lower(handles.typedata); [option, recall, goeson] = checkformulas(cellstr(formulalist), [typedata 'chanoperGUI'], editormode); if goeson==0 - return + return end if isempty(listname) && get(handles.checkbox_sendfile2history,'Value')==1 - BackERPLABcolor = [1 0.9 0.3]; % yellow - question = ['Equations at editor window have not been saved yet.\n\n'... - 'What would you like to do?']; - title = 'WARNING: Save List of edited chans'; - oldcolor = get(0,'DefaultUicontrolBackgroundColor'); - set(0,'DefaultUicontrolBackgroundColor',BackERPLABcolor) - button = questdlg(sprintf(question), title,'Save and run','Run without saving', 'Cancel','Run without saving'); - set(0,'DefaultUicontrolBackgroundColor',oldcolor) - - if strcmpi(button,'Save and run') - fullname = savelist(hObject, eventdata, handles); - listname = fullname; - handles.output = {listname, wchmsgon}; % sent filenam string) - elseif strcmpi(button,'Run without saving') - handles.output = {cellstr(formulalist), wchmsgon}; % sent like a cell string (with formulas) - elseif strcmpi(button,'Cancel') || strcmpi(button,'') - handles.output = []; - handles.listname = []; - % Update handles structure - guidata(hObject, handles); - return - end -elseif isempty(listname) && get(handles.checkbox_sendfile2history,'Value')==0 + BackERPLABcolor = [1 0.9 0.3]; % yellow + question = ['Equations at editor window have not been saved yet.\n\n'... + 'What would you like to do?']; + title = 'WARNING: Save List of edited chans'; + oldcolor = get(0,'DefaultUicontrolBackgroundColor'); + set(0,'DefaultUicontrolBackgroundColor',BackERPLABcolor) + button = questdlg(sprintf(question), title,'Save and run','Run without saving', 'Cancel','Run without saving'); + set(0,'DefaultUicontrolBackgroundColor',oldcolor) + + if strcmpi(button,'Save and run') + fullname = savelist(hObject, eventdata, handles); + listname = fullname; + handles.output = {listname, wchmsgon}; % sent filenam string) + elseif strcmpi(button,'Run without saving') handles.output = {cellstr(formulalist), wchmsgon}; % sent like a cell string (with formulas) - + elseif strcmpi(button,'Cancel') || strcmpi(button,'') + handles.output = []; + handles.listname = []; + % Update handles structure + guidata(hObject, handles); + return + end +elseif isempty(listname) && get(handles.checkbox_sendfile2history,'Value')==0 + handles.output = {cellstr(formulalist), wchmsgon}; % sent like a cell string (with formulas) + elseif ~isempty(listname) && get(handles.checkbox_sendfile2history,'Value')==1 - handles.output = {listname, wchmsgon}; % sent filename string - + handles.output = {listname, wchmsgon}; % sent filename string + elseif ~isempty(listname) && get(handles.checkbox_sendfile2history,'Value')==0 - handles.output = {cellstr(formulalist), wchmsgon}; % sent like a cell string (with formulas) + handles.output = {cellstr(formulalist), wchmsgon}; % sent like a cell string (with formulas) end % handles.output @@ -337,12 +339,16 @@ function pushbutton_RUN_Callback(hObject, eventdata, handles) chanopGUI.keeplocs = keeplocs; chanopGUI.chanlocs = handles.locs; disp(chanopGUI.chanlocs) -erpworkingmemory('chanopGUI', chanopGUI); +if handles.Toolabel==0 + erpworkingmemory('chanopGUI', chanopGUI); +else + estudioworkingmemory('chanopGUI', chanopGUI); +end try handles.output{3} = keeplocs; catch - disp('Problem setting location preference') + disp('Problem setting location preference') end @@ -370,7 +376,7 @@ function eraser_Callback(hObject, eventdata, handles) % handles.undocount = undocount; formulas = get(handles.editor, 'String'); if isempty(formulas) - return + return end % handles = editorbackup(hObject, eventdata, handles); @@ -395,29 +401,29 @@ function button_saveaslist_Callback(hObject, eventdata, handles) fulltext = strtrim(get(handles.editor,'String')); if size(fulltext,2)>256 - msgboxText = ['Formulas length exceed 256 characters.\n\n'... - 'Be sure to press [Enter] after you have entered each formula.']; - title = 'ERPLAB: chanoperGUI few inputs'; - errorfound(sprintf(msgboxText), title); - return + msgboxText = ['Formulas length exceed 256 characters.\n\n'... + 'Be sure to press [Enter] after you have entered each formula.']; + title = 'ERPLAB: chanoperGUI few inputs'; + errorfound(sprintf(msgboxText), title); + return end if ~strcmp(fulltext,'') - fullname = savelist(hObject, eventdata, handles); - if isempty(fullname) - return - end - set(handles.edit_filelist, 'String', fullname ) - set(handles.button_savelist, 'Enable', 'on') - handles.listname = fullname; - % Update handles structure - guidata(hObject, handles); -else - set(handles.button_saveaslist,'Enable','off') - msgboxText = 'You have not written any formula yet!'; - title = 'ERPLAB: chanoperGUI few inputs'; - errorfound(msgboxText, title); - set(handles.button_saveaslist,'Enable','on') + fullname = savelist(hObject, eventdata, handles); + if isempty(fullname) return + end + set(handles.edit_filelist, 'String', fullname ) + set(handles.button_savelist, 'Enable', 'on') + handles.listname = fullname; + % Update handles structure + guidata(hObject, handles); +else + set(handles.button_saveaslist,'Enable','off') + msgboxText = 'You have not written any formula yet!'; + title = 'ERPLAB: chanoperGUI few inputs'; + errorfound(msgboxText, title); + set(handles.button_saveaslist,'Enable','on') + return end %-------------------------------------------------------------------------- @@ -425,34 +431,34 @@ function button_loadlist_Callback(hObject, eventdata, handles) [filename, filepath] = uigetfile({'*.txt';'*.*'},'Select a formulas-file'); if isequal(filename,0) - disp('User selected Cancel') - return + disp('User selected Cancel') + return else - fullname = fullfile(filepath, filename); - disp(['pop_chanoperation(): For formulas-file, user selected ', fullname]) + fullname = fullfile(filepath, filename); + disp(['pop_chanoperation(): For formulas-file, user selected ', fullname]) end set(handles.edit_filelist,'String',fullname); fid_formula = fopen( fullname ); try - formcell = textscan(fid_formula, '%s','delimiter', '\r'); - formulas = char(formcell{:}); + formcell = textscan(fid_formula, '%s','delimiter', '\r'); + formulas = char(formcell{:}); catch - serr = lasterror; - msgboxText = ['Please, check your file: \n'; - fullname '\n'... - serr.message]; - title = 'ERPLAB: pop_chanoperation() error:'; - errorfound(sprintf(msgboxText), title); - return + serr = lasterror; + msgboxText = ['Please, check your file: \n'; + fullname '\n'... + serr.message]; + title = 'ERPLAB: pop_chanoperation() error:'; + errorfound(sprintf(msgboxText), title); + return end if size(formulas,2)>256 - msgboxText = ['Formulas length exceed 256 characters.\n\n'... - 'Be sure to press [Enter] after you have entered each formula.']; - title = 'ERPLAB: chanoperGUI few inputs'; - errorfound(sprintf(msgboxText), title); - return + msgboxText = ['Formulas length exceed 256 characters.\n\n'... + 'Be sure to press [Enter] after you have entered each formula.']; + title = 'ERPLAB: chanoperGUI few inputs'; + errorfound(sprintf(msgboxText), title); + return end compacteditor(hObject, eventdata, handles); @@ -469,13 +475,13 @@ function listboxchan1_Callback(hObject, eventdata, handles) numchan = get(hObject, 'Value'); if isempty(numchan) - return + return end linet = get(handles.editor, 'Value'); if nnz(linet) == 0 - linet = 1; + linet = 1; end formulas = cellstr(get(handles.editor, 'String')); @@ -486,7 +492,7 @@ function listboxchan1_Callback(hObject, eventdata, handles) function listboxchan1_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); + set(hObject,'BackgroundColor','white'); end %-------------------------------------------------------------------------- @@ -508,19 +514,19 @@ function button_example_Callback(hObject, eventdata, handles) text = cellstr(get(handles.editor, 'String')); if get(handles.button_no_recu,'Value') - prechar = 'n'; + prechar = 'n'; else - prechar = ''; + prechar = ''; end if isempty([text{:}]) || exacounter>length(example) - exacounter = 1; + exacounter = 1; end if length(text)==1 && strcmp(text{1}, '') - exacurr = char(regexprep(example{exacounter},'@',num2str(nchan+exacounter))); - text{1} = [prechar exacurr]; + exacurr = char(regexprep(example{exacounter},'@',num2str(nchan+exacounter))); + text{1} = [prechar exacurr]; else - exacurr = char(regexprep(example{exacounter},'@',num2str(nchan+exacounter))); - text{end+1} = [prechar exacurr]; + exacurr = char(regexprep(example{exacounter},'@',num2str(nchan+exacounter))); + text{end+1} = [prechar exacurr]; end set(handles.editor, 'String', char(text)); @@ -534,7 +540,7 @@ function button_example_Callback(hObject, eventdata, handles) fulltext = char(get(handles.editor,'String')); if isempty(fulltext) - return + return end fullnamepre = get(handles.edit_filelist,'String'); @@ -545,31 +551,31 @@ function button_example_Callback(hObject, eventdata, handles) [filename, filepath, filterindex] = uiputfile({'*.txt';'*.dat';'*.*'},'Save formulas-file as', fullnamepre); if isequal(filename,0) - disp('User selected Cancel') - fullname = []; - return + disp('User selected Cancel') + fullname = []; + return else - [px, fname, ext] = fileparts(filename); - - if strcmp(ext,'') - if filterindex==1 || filterindex==3 - ext = '.txt'; - else - ext = '.dat'; - end - end - - fname = [ fname ext]; - fullname = fullfile(filepath, fname); - - fid_list = fopen( fullname , 'w'); - - for i=1:size(fulltext,1) - fprintf(fid_list,'%s\n', fulltext(i,:)); + [px, fname, ext] = fileparts(filename); + + if strcmp(ext,'') + if filterindex==1 || filterindex==3 + ext = '.txt'; + else + ext = '.dat'; end - - fclose(fid_list); - set(handles.button_savelist, 'Enable','on') + end + + fname = [ fname ext]; + fullname = fullfile(filepath, fname); + + fid_list = fopen( fullname , 'w'); + + for i=1:size(fulltext,1) + fprintf(fid_list,'%s\n', fulltext(i,:)); + end + + fclose(fid_list); + set(handles.button_savelist, 'Enable','on') end %-------------------------------------------------------------------------- @@ -577,7 +583,7 @@ function compacteditor(hObject, eventdata, handles) texteditor = strtrim(get(handles.editor,'String')); if isempty(texteditor) - return + return end formul = cellstr(texteditor); @@ -587,11 +593,11 @@ function compacteditor(hObject, eventdata, handles) % removes blank lines for i=1:nfl - if ~strcmp(formul{i},'') - % removes blank lines - formulalist{k} = regexprep(formul{i},'[^\s](label)[^\s]',' $1 ', 'ignorecase'); - k = k+1; - end + if ~strcmp(formul{i},'') + % removes blank lines + formulalist{k} = regexprep(formul{i},'[^\s](label)[^\s]',' $1 ', 'ignorecase'); + k = k+1; + end end formulalist = strtrimx(formulalist); % special white space removing @@ -602,7 +608,7 @@ function compacteditor(hObject, eventdata, handles) function check_aoperations(hObject, eventdata, handles) texteditor = strtrim(get(handles.editor,'String')); if isempty(texteditor) - return + return end formul = cellstr(texteditor); @@ -611,10 +617,10 @@ function check_aoperations(hObject, eventdata, handles) formulalist = cell(1); for i=1:nfl - if ~strcmp(formul{i},'') - formulalist{k} = formul{i}; - k = k+1; - end + if ~strcmp(formul{i},'') + formulalist{k} = formul{i}; + k = k+1; + end end formulalist = strtrimx(formulalist); @@ -626,39 +632,39 @@ function button_savelist_Callback(hObject, eventdata, handles) fulltext = strtrim(get(handles.editor,'String')); if size(fulltext,2)>256 - msgboxText = ['Formulas length exceed 256 characters.\n\n'... - 'Be sure to press [Enter] after you have entered each formula.']; - title = 'ERPLAB: chanoperGUI few inputs'; - errorfound(sprintf(msgboxText), title); - return + msgboxText = ['Formulas length exceed 256 characters.\n\n'... + 'Be sure to press [Enter] after you have entered each formula.']; + title = 'ERPLAB: chanoperGUI few inputs'; + errorfound(sprintf(msgboxText), title); + return end if ~isempty(fulltext) + + fullname = get(handles.edit_filelist, 'String'); + + if ~strcmp(fullname,'') + fid_list = fopen( fullname , 'w'); - fullname = get(handles.edit_filelist, 'String'); - - if ~strcmp(fullname,'') - fid_list = fopen( fullname , 'w'); - - for i=1:size(fulltext,1) - fprintf(fid_list,'%s\n', fulltext(i,:)); - end - - fclose(fid_list); - handles.listname = fullname; - % Update handles structure - guidata(hObject, handles); - disp(['Saving equation list at ' fullname '']) - else - button_saveaslist_Callback(hObject, eventdata, handles) - return + for i=1:size(fulltext,1) + fprintf(fid_list,'%s\n', fulltext(i,:)); end -else - set(handles.button_saveaslist,'Enable','off') - msgboxText = 'You have not written any formula yet!'; - title = 'ERPLAB: chanoperGUI few inputs'; - errorfound(msgboxText, title); - set(handles.button_saveaslist,'Enable','on') + + fclose(fid_list); + handles.listname = fullname; + % Update handles structure + guidata(hObject, handles); + disp(['Saving equation list at ' fullname '']) + else + button_saveaslist_Callback(hObject, eventdata, handles) return + end +else + set(handles.button_saveaslist,'Enable','off') + msgboxText = 'You have not written any formula yet!'; + title = 'ERPLAB: chanoperGUI few inputs'; + errorfound(msgboxText, title); + set(handles.button_saveaslist,'Enable','on') + return end %-------------------------------------------------------------------------- @@ -671,7 +677,7 @@ function edit_filelist_Callback(hObject, eventdata, handles) function edit_filelist_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); + set(hObject,'BackgroundColor','white'); end %-------------------------------------------------------------------------- @@ -682,35 +688,35 @@ function button_clearfile_Callback(hObject, eventdata, handles) %-------------------------------------------------------------------------- function button_recursive_Callback(hObject, eventdata, handles) if get(hObject,'Value') - set(handles.button_no_recu,'Value',0) - val = testsyntaxtype(hObject, eventdata, handles, 'recu'); - - if val==0; - set(handles.button_recursive, 'Value', 0) - set(handles.button_no_recu, 'Value', 1) - end - - %%% handles = editorbackup(hObject, eventdata, handles); - %%% Update handles structure - %%guidata(hObject, handles); + set(handles.button_no_recu,'Value',0) + val = testsyntaxtype(hObject, eventdata, handles, 'recu'); + + if val==0; + set(handles.button_recursive, 'Value', 0) + set(handles.button_no_recu, 'Value', 1) + end + + %%% handles = editorbackup(hObject, eventdata, handles); + %%% Update handles structure + %%guidata(hObject, handles); else - set(hObject,'Value',1) + set(hObject,'Value',1) end %-------------------------------------------------------------------------- function button_no_recu_Callback(hObject, eventdata, handles) if get(hObject,'Value') - set(handles.button_recursive,'Value',0) - val = testsyntaxtype(hObject, eventdata, handles, 'norecu'); - if val==0 - set(handles.button_recursive, 'Value', 1) - set(handles.button_no_recu, 'Value', 0) - end - %%% handles = editorbackup(hObject, eventdata, handles); - %%% Update handles structure - %%%guidata(hObject, handles); + set(handles.button_recursive,'Value',0) + val = testsyntaxtype(hObject, eventdata, handles, 'norecu'); + if val==0 + set(handles.button_recursive, 'Value', 1) + set(handles.button_no_recu, 'Value', 0) + end + %%% handles = editorbackup(hObject, eventdata, handles); + %%% Update handles structure + %%%guidata(hObject, handles); else - set(hObject,'Value',1) + set(hObject,'Value',1) end %-------------------------------------------------------------------------- @@ -719,9 +725,9 @@ function button_no_recu_Callback(hObject, eventdata, handles) formulaArray = get(handles.editor,'String'); if isempty(formulaArray) - return + return else - formulaArray = strtrim(cellstr(formulaArray)); + formulaArray = strtrim(cellstr(formulaArray)); end nformulas = length(formulaArray); @@ -730,81 +736,81 @@ function button_no_recu_Callback(hObject, eventdata, handles) wantfix = 0; newnumchan = 1; -for t=1:nformulas - fcomm = formulaArray{t}; - tokcommentb = regexpi(fcomm, '^#', 'match'); % comment symbol (June 3, 2013) +for t=1:nformulas + fcomm = formulaArray{t}; + tokcommentb = regexpi(fcomm, '^#', 'match'); % comment symbol (June 3, 2013) + + if isempty(tokcommentb) % skip comment symbol + pleft = regexpi(parts{t}{1}, '(\s*nch[an]*\d+)', 'tokens'); + plcom = regexpi(parts{t}{1}, '(\s*ch[an]*\d+)', 'tokens'); - if isempty(tokcommentb) % skip comment symbol - pleft = regexpi(parts{t}{1}, '(\s*nch[an]*\d+)', 'tokens'); - plcom = regexpi(parts{t}{1}, '(\s*ch[an]*\d+)', 'tokens'); + if isempty(pleft) && ~isempty(plcom) && strcmpi(whocall,'norecu') + if ask4fix + BackERPLABcolor = [1 0.9 0.3]; % yellow + question = ['For non recursive mode, left side of equation\nmust be define as a new channel.\n'... + 'For instance, nchan1 = ...\n\n'... + 'Do you want that ERPLAB corrects the syntax for you?']; + title = 'WARNING: Syntax is not proper for non recursive mode'; + oldcolor = get(0,'DefaultUicontrolBackgroundColor'); + set(0,'DefaultUicontrolBackgroundColor',BackERPLABcolor) + button = questdlg(sprintf(question), title,'Cancel','No', 'Yes','Yes'); + set(0,'DefaultUicontrolBackgroundColor',oldcolor) - if isempty(pleft) && ~isempty(plcom) && strcmpi(whocall,'norecu') - if ask4fix - BackERPLABcolor = [1 0.9 0.3]; % yellow - question = ['For non recursive mode, left side of equation\nmust be define as a new channel.\n'... - 'For instance, nchan1 = ...\n\n'... - 'Do you want that ERPLAB corrects the syntax for you?']; - title = 'WARNING: Syntax is not proper for non recursive mode'; - oldcolor = get(0,'DefaultUicontrolBackgroundColor'); - set(0,'DefaultUicontrolBackgroundColor',BackERPLABcolor) - button = questdlg(sprintf(question), title,'Cancel','No', 'Yes','Yes'); - set(0,'DefaultUicontrolBackgroundColor',oldcolor) - - if strcmpi(button,'Yes') - ask4fix = 0; - wantfix = 1; - elseif strcmpi(button,'Cancel') - val = 0; % cancel - break - else - ask4fix = 0; - wantfix = 0; - end - %else - % wantfix =1; - end - elseif ~isempty(pleft) && strcmpi(whocall,'recu') - if ask4fix - BackERPLABcolor = [1 0.9 0.3]; % yellow - question = ['For recursive mode, left side of equation cannot\nbe define as a new channel.\n'... - 'For instance, you must write chan1 = ...\n\n'... - 'Do you want that ERPLAB corrects the syntax for you?']; - title = 'WARNING: Syntax is not proper for recursive mode'; - oldcolor = get(0,'DefaultUicontrolBackgroundColor'); - set(0,'DefaultUicontrolBackgroundColor',BackERPLABcolor) - button = questdlg(sprintf(question), title,'Cancel','No', 'Yes','Yes'); - set(0,'DefaultUicontrolBackgroundColor',oldcolor) - - if strcmpi(button,'Yes') - ask4fix = 0; - wantfix =1; - elseif strcmpi(button,'Cancel') - val = 0; % cancel - break - else - ask4fix = 0; - wantfix = 0; - end - %else - % wantfix =1; - end - %else - % wantfix = 0; + if strcmpi(button,'Yes') + ask4fix = 0; + wantfix = 1; + elseif strcmpi(button,'Cancel') + val = 0; % cancel + break + else + ask4fix = 0; + wantfix = 0; end - if wantfix && (~isempty(pleft) || ~isempty(plcom))% fixed (June 3, 2013): JLC - fprintf('WARNING: equation %s ', formulaArray{t}) - if strcmpi(whocall,'recu') % for recursive mode delete the n in nch - formulaArray{t} = sprintf('%s = %s', strtrim(regexprep(parts{t}{1}, '^n*','','ignorecase')), strtrim(parts{t}{2})); - else - formulaArray{t} = sprintf('%s = %s', strtrim(regexprep(parts{t}{1}, '^n*ch(\D*)(\d*)',['nch$1' num2str(newnumchan)],'ignorecase')), strtrim(parts{t}{2})); - newnumchan = newnumchan+1; - end - fprintf('was changed to equation %s \n', formulaArray{t}) + %else + % wantfix =1; + end + elseif ~isempty(pleft) && strcmpi(whocall,'recu') + if ask4fix + BackERPLABcolor = [1 0.9 0.3]; % yellow + question = ['For recursive mode, left side of equation cannot\nbe define as a new channel.\n'... + 'For instance, you must write chan1 = ...\n\n'... + 'Do you want that ERPLAB corrects the syntax for you?']; + title = 'WARNING: Syntax is not proper for recursive mode'; + oldcolor = get(0,'DefaultUicontrolBackgroundColor'); + set(0,'DefaultUicontrolBackgroundColor',BackERPLABcolor) + button = questdlg(sprintf(question), title,'Cancel','No', 'Yes','Yes'); + set(0,'DefaultUicontrolBackgroundColor',oldcolor) + + if strcmpi(button,'Yes') + ask4fix = 0; + wantfix =1; + elseif strcmpi(button,'Cancel') + val = 0; % cancel + break + else + ask4fix = 0; + wantfix = 0; end + %else + % wantfix =1; + end + %else + % wantfix = 0; end + if wantfix && (~isempty(pleft) || ~isempty(plcom))% fixed (June 3, 2013): JLC + fprintf('WARNING: equation %s ', formulaArray{t}) + if strcmpi(whocall,'recu') % for recursive mode delete the n in nch + formulaArray{t} = sprintf('%s = %s', strtrim(regexprep(parts{t}{1}, '^n*','','ignorecase')), strtrim(parts{t}{2})); + else + formulaArray{t} = sprintf('%s = %s', strtrim(regexprep(parts{t}{1}, '^n*ch(\D*)(\d*)',['nch$1' num2str(newnumchan)],'ignorecase')), strtrim(parts{t}{2})); + newnumchan = newnumchan+1; + end + fprintf('was changed to equation %s \n', formulaArray{t}) + end + end end if val==1 - set(handles.editor,'String', char(formulaArray)); + set(handles.editor,'String', char(formulaArray)); end %-------------------------------------------------------------------------- @@ -828,7 +834,7 @@ function pushbutton_export_chan_list_Callback(hObject, eventdata, handles) nloch = length(list_of_chans); for i=1:nloch - fprintf('%s\n',list_of_chans{i}); + fprintf('%s\n',list_of_chans{i}); end fprintf('\n\nEnd of list.\n\n') @@ -840,45 +846,45 @@ function pushbutton_removechan_Callback(hObject, eventdata, handles) nchan = handles.nchan; keeplocs = get(handles.chkeeplocs,'Value'); -if ~isempty(chan2del) - chan2del = unique_bc2(cell2mat(chan2del)); - if max(chan2del)>nchan && nnz(isinf(chan2del))==0 - msgboxText = 'You are specifying non-existing channels!'; - title = 'ERPLAB: chanoperGUI remove channels'; - errorfound(sprintf(msgboxText), title); - return - end - if min(chan2del)<1 && nnz(isinf(chan2del))==0 - msgboxText = 'You are specifying freaky non-existing channels!'; - title = 'ERPLAB: chanoperGUI remove channels'; - errorfound(sprintf(msgboxText), title); - return - end - if nnz(isnan(chan2del))>0 || nnz(isinf(chan2del))>0 - msgboxText = ['Channel problem\n'... - 'You are specifying freaky non-existing channels!']; - title = 'ERPLAB: chanoperGUI remove channels'; - errorfound(sprintf(msgboxText), title); - return - end - if strcmpi(typedata, 'EEG') - eqtn = sprintf('deletechan(%s)', vect2colon(chan2del, 'Delimiter','off')); - else - eqtn = sprintf('delerpchan(%s)', vect2colon(chan2del, 'Delimiter','off')); - end - - wchmsgon = get(handles.chwarning,'Value'); - handles.output = {{eqtn}, wchmsgon}; % sent like a cell string (with formulas) - try - handles.output{3} = keeplocs; - catch - disp('Problem setting location preference') - end - % Update handles structure - guidata(hObject, handles); - uiresume(handles.gui_chassis); -else +if ~isempty(chan2del) + chan2del = unique_bc2(cell2mat(chan2del)); + if max(chan2del)>nchan && nnz(isinf(chan2del))==0 + msgboxText = 'You are specifying non-existing channels!'; + title = 'ERPLAB: chanoperGUI remove channels'; + errorfound(sprintf(msgboxText), title); + return + end + if min(chan2del)<1 && nnz(isinf(chan2del))==0 + msgboxText = 'You are specifying freaky non-existing channels!'; + title = 'ERPLAB: chanoperGUI remove channels'; + errorfound(sprintf(msgboxText), title); return + end + if nnz(isnan(chan2del))>0 || nnz(isinf(chan2del))>0 + msgboxText = ['Channel problem\n'... + 'You are specifying freaky non-existing channels!']; + title = 'ERPLAB: chanoperGUI remove channels'; + errorfound(sprintf(msgboxText), title); + return + end + if strcmpi(typedata, 'EEG') + eqtn = sprintf('deletechan(%s)', vect2colon(chan2del, 'Delimiter','off')); + else + eqtn = sprintf('delerpchan(%s)', vect2colon(chan2del, 'Delimiter','off')); + end + + wchmsgon = get(handles.chwarning,'Value'); + handles.output = {{eqtn}, wchmsgon}; % sent like a cell string (with formulas) + try + handles.output{3} = keeplocs; + catch + disp('Problem setting location preference') + end + % Update handles structure + guidata(hObject, handles); + uiresume(handles.gui_chassis); +else + return end %-------------------------------------------------------------------------- @@ -890,29 +896,29 @@ function pushbutton_rerefwizard_Callback(hObject, eventdata, handles) % open reference wizard formulalist = rerefassistantGUI(handles.nchan, handles.listch); if isempty(formulalist) - return + return end compacteditor(hObject, eventdata, handles); formulas = get(handles.editor, 'String'); if get(handles.button_no_recu,'Value') - formulalist = cellstr([formulalist{:}]); - for t=1:length(formulalist) - [expspliter parts] = regexp(formulalist, '=','match','split'); - formulalist{t} = sprintf('%s = %s', strtrim(regexprep(parts{t}{1}, '[^n]*ch','nch','ignorecase')), strtrim(parts{t}{2})); - end - formulalist = char(formulalist); + formulalist = cellstr([formulalist{:}]); + for t=1:length(formulalist) + [expspliter parts] = regexp(formulalist, '=','match','split'); + formulalist{t} = sprintf('%s = %s', strtrim(regexprep(parts{t}{1}, '[^n]*ch','nch','ignorecase')), strtrim(parts{t}{2})); + end + formulalist = char(formulalist); end if isempty(formulas) - set(handles.editor,'String',formulalist); + set(handles.editor,'String',formulalist); else - formulalist = cellstr(formulalist); - formulas = cellstr(formulas); - formt = [formulas ;formulalist]; - formt = char(formt); - set(handles.editor,'String',formt); + formulalist = cellstr(formulalist); + formulas = cellstr(formulas); + formt = [formulas ;formulalist]; + formt = char(formt); + set(handles.editor,'String',formt); end % %-------------------------------------------------------------------------- @@ -1022,11 +1028,11 @@ function cancel_CreateFcn(hObject, eventdata, handles) function gui_chassis_CloseRequestFcn(hObject, eventdata, handles) if isequal(get(handles.gui_chassis, 'waitstatus'), 'waiting') - % The GUI is still in UIWAIT, us UIRESUME - uiresume(handles.gui_chassis); + % The GUI is still in UIWAIT, us UIRESUME + uiresume(handles.gui_chassis); else - % The GUI is no longer waiting, just close it - delete(handles.gui_chassis); + % The GUI is no longer waiting, just close it + delete(handles.gui_chassis); end diff --git a/GUIs/creabasiceventlistGUI.fig b/GUIs/creabasiceventlistGUI.fig index e4ce87eaf6433030a081c803c8bbe2873481ea18..1bf57055f69a40e6f2809b5da0df95232c9519e5 100755 GIT binary patch literal 18268 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 Pa(}fXd6@hK4y_w(Z&P)$ delta 6446 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 diff --git a/GUIs/creabasiceventlistGUI.m b/GUIs/creabasiceventlistGUI.m index 188cb5ef..b3c6af60 100755 --- a/GUIs/creabasiceventlistGUI.m +++ b/GUIs/creabasiceventlistGUI.m @@ -31,33 +31,33 @@ % Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... - 'gui_Singleton', gui_Singleton, ... - 'gui_OpeningFcn', @creabasiceventlistGUI_OpeningFcn, ... - 'gui_OutputFcn', @creabasiceventlistGUI_OutputFcn, ... - 'gui_LayoutFcn', [] , ... - 'gui_Callback', []); + 'gui_Singleton', gui_Singleton, ... + 'gui_OpeningFcn', @creabasiceventlistGUI_OpeningFcn, ... + 'gui_OutputFcn', @creabasiceventlistGUI_OutputFcn, ... + 'gui_LayoutFcn', [] , ... + 'gui_Callback', []); if nargin && ischar(varargin{1}) - gui_State.gui_Callback = str2func(varargin{1}); + gui_State.gui_Callback = str2func(varargin{1}); end if nargout - [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); + [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else - gui_mainfcn(gui_State, varargin{:}); + gui_mainfcn(gui_State, varargin{:}); end % End initialization code - DO NOT EDIT %-------------------------------------------------------------------------- function creabasiceventlistGUI_OpeningFcn(hObject, eventdata, handles, varargin) try - def = varargin{1}; + def = varargin{1}; catch - def = {'' 'boundary' -99 1 1}; + def = {'' 'boundary' -99 1 1}; end try - multieeg = varargin{2}; + multieeg = varargin{2}; catch - multieeg = 0; + multieeg = 0; end elname = def{1}; @@ -67,7 +67,7 @@ function creabasiceventlistGUI_OpeningFcn(hObject, eventdata, handles, varargin) alphanum = def{5}; if iscell(newboundarynumcode) - newboundarynumcode = cell2mat(newboundarynumcode); + newboundarynumcode = cell2mat(newboundarynumcode); end handles.output = []; @@ -75,46 +75,60 @@ function creabasiceventlistGUI_OpeningFcn(hObject, eventdata, handles, varargin) set(handles.edit_elname,'String',elname); if isempty(elname) - set(handles.edit_elname,'Enable','off'); - set(handles.pushbutton_browse,'Enable','off'); - set(handles.checkbox_create_eventlist,'Value',0); + set(handles.edit_elname,'Enable','off'); + set(handles.pushbutton_browse,'Enable','off'); + set(handles.checkbox_create_eventlist,'Value',0); else - set(handles.checkbox_create_eventlist,'Value',1); - set(handles.edit_elname,'Enable','on'); - set(handles.pushbutton_browse,'Enable','on'); + set(handles.checkbox_create_eventlist,'Value',1); + set(handles.edit_elname,'Enable','on'); + set(handles.pushbutton_browse,'Enable','on'); end set(handles.checkbox_addm99,'Value',0); if isempty(boundarystrcode) - set(handles.checkbox_convert_boundary,'Value',0); - set(handles.edit_boundarycode,'Enable', 'off'); - set(handles.edit_numericode,'Enable', 'off'); + set(handles.checkbox_convert_boundary,'Value',0); + set(handles.edit_boundarycode,'Enable', 'off'); + set(handles.edit_numericode,'Enable', 'off'); else - set(handles.checkbox_convert_boundary,'Value',1); - set(handles.edit_boundarycode,'Enable', 'on'); - set(handles.edit_numericode,'Enable', 'on'); - - if iscell(boundarystrcode) - bb = sprintf('%s ', boundarystrcode{:}); - else - bb = char(boundarystrcode); - end - set(handles.edit_boundarycode, 'String', bb); - set(handles.edit_numericode, 'String',num2str(newboundarynumcode)); + set(handles.checkbox_convert_boundary,'Value',1); + set(handles.edit_boundarycode,'Enable', 'on'); + set(handles.edit_numericode,'Enable', 'on'); + + if iscell(boundarystrcode) + bb = sprintf('%s ', boundarystrcode{:}); + else + bb = char(boundarystrcode); + end + set(handles.edit_boundarycode, 'String', bb); + set(handles.edit_numericode, 'String',num2str(newboundarynumcode)); end set(handles.ELwarning,'Value', rwwarn); set(handles.checkbox_alphanum,'Value', alphanum); if multieeg==1 - set(handles.pushbutton_advanced, 'Enable', 'off') + set(handles.pushbutton_advanced, 'Enable', 'off') else - set(handles.pushbutton_advanced, 'Enable', 'on') + set(handles.pushbutton_advanced, 'Enable', 'on') end % % Name & version % version = geterplabversion; -set(handles.gui_chassis,'Name', ['ERPLAB ' version ' - CREATE BASIC EVENTLIST GUI']) +ERPtooltype = erpgettoolversion('tooltype');%%GH Jan 2024 +if strcmpi(ERPtooltype,'EStudio') + set(handles.gui_chassis,'Name', ['Estudio ' version ' - CREATE BASIC EVENTLIST GUI']); +else + set(handles.gui_chassis,'Name', ['ERPLAB ' version ' - CREATE BASIC EVENTLIST GUI']); +end +if multieeg==1 + set(handles.checkbox_create_eventlist,'Enable','off','Value',0); + set(handles.pushbutton_browse,'Enable','off'); + set(handles.edit_elname,'Enable','off'); + set(handles.edit_elname,'String','Export to text file is unavailable when multiple EEGsets are selected'); + set(handles.pushbutton_advanced,'String','Unavailable for
multi-EEGsets') +else + set(handles.pushbutton_advanced,'String','Advanced') ; +end % % Color GUI @@ -150,11 +164,11 @@ function creabasiceventlistGUI_OpeningFcn(hObject, eventdata, handles, varargin) function checkbox_create_eventlist_Callback(hObject, eventdata, handles) if get(hObject,'Value') - set(handles.edit_elname,'Enable','on'); - set(handles.pushbutton_browse,'Enable','on'); + set(handles.edit_elname,'Enable','on'); + set(handles.pushbutton_browse,'Enable','on'); else - set(handles.edit_elname,'Enable','off'); - set(handles.pushbutton_browse,'Enable','off'); + set(handles.edit_elname,'Enable','off'); + set(handles.pushbutton_browse,'Enable','off'); end %-------------------------------------------------------------------------- @@ -164,10 +178,10 @@ function edit_elname_Callback(hObject, eventdata, handles) [elpathname, elfilename, ext] = fileparts(fullname); if strcmpi(elpathname,'') - elpathname = cd; + elpathname = cd; end if ~strcmpi(ext,'.txt') - ext='.txt'; + ext='.txt'; end elfilename = [elfilename ext]; @@ -181,7 +195,7 @@ function edit_elname_Callback(hObject, eventdata, handles) function edit_elname_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); + set(hObject,'BackgroundColor','white'); end %-------------------------------------------------------------------------- @@ -194,26 +208,26 @@ function pushbutton_browse_Callback(hObject, eventdata, handles) [elfname, elpathname] = uiputfile({'*.txt';'*.*'},'Save EVENTLIST text file as', prename); if isequal(elfname,0) - disp('User selected Cancel') - handles.owfp = 0; % over write file permission - guidata(hObject, handles); - return + disp('User selected Cancel') + handles.owfp = 0; % over write file permission + guidata(hObject, handles); + return else - [pathx, elfilename, ext] = fileparts(elfname); - - if ~strcmpi(ext,'.txt') - ext='.txt'; - end - - elfilename = [elfilename ext]; - handles.elfilename = elfilename; - handles.elpathname = elpathname; - set(handles.edit_elname,'String', fullfile(elpathname, elfilename)); - handles.owfp = 1; % over write file permission - - % Update handles structure - guidata(hObject, handles); - disp(['For EVENTLIST text file, user selected ', fullfile(elpathname, elfilename)]) + [pathx, elfilename, ext] = fileparts(elfname); + + if ~strcmpi(ext,'.txt') + ext='.txt'; + end + + elfilename = [elfilename ext]; + handles.elfilename = elfilename; + handles.elpathname = elpathname; + set(handles.edit_elname,'String', fullfile(elpathname, elfilename)); + handles.owfp = 1; % over write file permission + + % Update handles structure + guidata(hObject, handles); + disp(['For EVENTLIST text file, user selected ', fullfile(elpathname, elfilename)]) end %-------------------------------------------------------------------------- @@ -227,83 +241,83 @@ function pushbutton_apply_Callback(hObject, eventdata, handles) fullname = char(get(handles.edit_elname, 'String')); if get(handles.checkbox_create_eventlist, 'Value') && ~strcmp(fullname,'') + + [elpathname, elfilename, ext] = fileparts(fullname); + + if strcmpi(elpathname,'') + elpathname = cd; + end + if ~strcmpi(ext,'.txt') + ext='.txt'; + end + + elfilename = fullfile(elpathname, [elfilename ext]); + owfp = handles.owfp; % over write file permission + + if exist(elfilename, 'file')~=0 && owfp==0 + question = ['%s already exists!\n\n'... + 'Do you want to replace it?']; + title = 'ERPLAB: Overwriting Confirmation'; + button = askquest(sprintf(question, elfilename), title); - [elpathname, elfilename, ext] = fileparts(fullname); - - if strcmpi(elpathname,'') - elpathname = cd; - end - if ~strcmpi(ext,'.txt') - ext='.txt'; - end - - elfilename = fullfile(elpathname, [elfilename ext]); - owfp = handles.owfp; % over write file permission - - if exist(elfilename, 'file')~=0 && owfp==0 - question = ['%s already exists!\n\n'... - 'Do you want to replace it?']; - title = 'ERPLAB: Overwriting Confirmation'; - button = askquest(sprintf(question, elfilename), title); - - if ~strcmpi(button, 'yes') - return - end + if ~strcmpi(button, 'yes') + return end - - disp(['For EVENTLIST text file, user selected ', fullfile(elpathname, elfilename)]) + end + + disp(['For EVENTLIST text file, user selected ', fullfile(elpathname, elfilename)]) else - elfilename = ''; + elfilename = ''; end if get(handles.checkbox_addm99,'Value') - boundarystrcode1 = {'boundary'}; - newboundarynumcode1 = -99; + boundarystrcode1 = {'boundary'}; + newboundarynumcode1 = -99; else - boundarystrcode1 = {''}; - newboundarynumcode1 = []; + boundarystrcode1 = {''}; + newboundarynumcode1 = []; end if get(handles.checkbox_convert_boundary,'Value') - boundarystrcode2 = strtrim(char(get(handles.edit_boundarycode, 'String'))); - boundarystrcode2 = regexp(boundarystrcode2,'\s*\w*\s*', 'match'); - newboundarynumcode2 = str2num(get(handles.edit_numericode, 'String')); - - if isempty(newboundarynumcode2) - msgboxText = 'You must specify a numeric code!'; - title = 'ERPLAB: empty input'; - errorfound(msgboxText, title); - return - end - if isempty(boundarystrcode2) - msgboxText = 'You must specify a boundary code!'; - title = 'ERPLAB: empty input'; - errorfound(msgboxText, title); - return - end - if length(newboundarynumcode2)~=length(boundarystrcode2) - msgboxText = 'You must specify the same amount of numeric and string codes!'; - title = 'ERPLAB: different inputs'; - errorfound(msgboxText, title); - return - end - if get(handles.checkbox_addm99,'Value') - newboundarynumcode2 = newboundarynumcode2(~ismember_bc2(boundarystrcode2, 'boundary')); - boundarystrcode2 = boundarystrcode2(~ismember_bc2(boundarystrcode2, 'boundary')); - if isempty(boundarystrcode2) - msgboxText = '''boundary'' event is already specified!\nUncheck one option or change the event name.'; - title = 'ERPLAB: redundant input'; - errorfound(sprintf(msgboxText), title); - return - end - end - if strcmp(boundarystrcode2, boundarystrcode1) - msgboxText = '''boundary'' event is already specified to be numerically encoded.'; - title = 'ERPLAB: duplicated inputs'; - errorfound(msgboxText, title); + boundarystrcode2 = strtrim(char(get(handles.edit_boundarycode, 'String'))); + boundarystrcode2 = regexp(boundarystrcode2,'\s*\w*\s*', 'match'); + newboundarynumcode2 = str2num(get(handles.edit_numericode, 'String')); + + if isempty(newboundarynumcode2) + msgboxText = 'You must specify a numeric code!'; + title = 'ERPLAB: empty input'; + errorfound(msgboxText, title); + return + end + if isempty(boundarystrcode2) + msgboxText = 'You must specify a boundary code!'; + title = 'ERPLAB: empty input'; + errorfound(msgboxText, title); + return + end + if length(newboundarynumcode2)~=length(boundarystrcode2) + msgboxText = 'You must specify the same amount of numeric and string codes!'; + title = 'ERPLAB: different inputs'; + errorfound(msgboxText, title); + return + end + if get(handles.checkbox_addm99,'Value') + newboundarynumcode2 = newboundarynumcode2(~ismember_bc2(boundarystrcode2, 'boundary')); + boundarystrcode2 = boundarystrcode2(~ismember_bc2(boundarystrcode2, 'boundary')); + if isempty(boundarystrcode2) + msgboxText = '''boundary'' event is already specified!\nUncheck one option or change the event name.'; + title = 'ERPLAB: redundant input'; + errorfound(sprintf(msgboxText), title); return - end + end + end + if strcmp(boundarystrcode2, boundarystrcode1) + msgboxText = '''boundary'' event is already specified to be numerically encoded.'; + title = 'ERPLAB: duplicated inputs'; + errorfound(msgboxText, title); + return + end else - boundarystrcode2 = []; - newboundarynumcode2 = []; + boundarystrcode2 = []; + newboundarynumcode2 = []; end alphanum = get(handles.checkbox_alphanum, 'Value'); % for letterkilla. Oct 10, 2012 @@ -340,7 +354,7 @@ function edit_boundarycode_Callback(hObject, eventdata, handles) %-------------------------------------------------------------------------- function edit_boundarycode_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); + set(hObject,'BackgroundColor','white'); end %-------------------------------------------------------------------------- @@ -349,27 +363,27 @@ function edit_numericode_Callback(hObject, eventdata, handles) %-------------------------------------------------------------------------- function edit_numericode_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); + set(hObject,'BackgroundColor','white'); end %-------------------------------------------------------------------------- function checkbox_addm99_Callback(hObject, eventdata, handles) if get(hObject,'Value') - set(handles.checkbox_convert_boundary,'Value', 0); - set(handles.edit_boundarycode,'Enable', 'off'); - set(handles.edit_numericode,'Enable', 'off'); + set(handles.checkbox_convert_boundary,'Value', 0); + set(handles.edit_boundarycode,'Enable', 'off'); + set(handles.edit_numericode,'Enable', 'off'); else - set(hObject, 'Value', 1) + set(hObject, 'Value', 1) end %-------------------------------------------------------------------------- function checkbox_convert_boundary_Callback(hObject, eventdata, handles) if get(hObject,'Value') - set(handles.checkbox_addm99,'Value', 0); - set(handles.edit_boundarycode,'Enable', 'on'); - set(handles.edit_numericode,'Enable', 'on'); + set(handles.checkbox_addm99,'Value', 0); + set(handles.edit_boundarycode,'Enable', 'on'); + set(handles.edit_numericode,'Enable', 'on'); else - set(hObject, 'Value', 1) + set(hObject, 'Value', 1) end %-------------------------------------------------------------------------- @@ -388,13 +402,13 @@ function pushbutton_advanced_Callback(hObject, eventdata, handles) %-------------------------------------------------------------------------- function gui_chassis_CloseRequestFcn(hObject, eventdata, handles) if isequal(get(handles.gui_chassis, 'waitstatus'), 'waiting') - % The GUI is still in UIWAIT, us UIRESUME - handles.output = []; - % Update handles structure - guidata(hObject, handles); - uiresume(handles.gui_chassis); + % The GUI is still in UIWAIT, us UIRESUME + handles.output = []; + % Update handles structure + guidata(hObject, handles); + uiresume(handles.gui_chassis); else - % The GUI is no longer waiting, just close it - delete(handles.gui_chassis); + % The GUI is no longer waiting, just close it + delete(handles.gui_chassis); end diff --git a/GUIs/errorGUI.fig b/GUIs/errorGUI.fig index 94d1647c27c9b6d74b6dc8d9db620dc1de9728ad..404a047eaa93a614d4866d4f2309d27c4242af70 100755 GIT binary patch literal 24172 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
XgBe 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

%Bmr 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 Lj&6SgSAAKK7C2gX delta 70171 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 R-j5y}pJZ}m`vrtF}$QmLP&HTMtdxn0>`m4RQ zY7nys-q0L^ZU)trkoukA+)?DIzpDRRF(ncM(xVkBpW=+Gk-lkC6aHKx5dQ*#5@p066-{lL z527++)TYMMnGzS3W{#A7#jI8=mF(hOu9J3pNtl+%jH#j^6E}Fc{q1K=V0c&{J}cAH zs}Fzng>3iPw{LQ4IT)wRNH$$A<%xhPRiDA4-yKm@KJbgD!!k@0zq_7Oy#(T%wobu8=6mBNYLL}|Ac*(k%ahS&A^YPS9eqGPasr~w1 zQ{6mru@Dw&wr9!8=5;SMO{U>Yp9-82?ieUpyKg_izoH2zHTEH6P`hR>l9-76@C(Vj zM|w2B)00i^gUi*~b^IA*+7EOmTd%@2^!Y@b=3!4`%oW=|(|@f$suk6nV4!lKi8gg? z`{R3+ObN+0u!^<#AmrJv_E7@Qgu0(&p}5v0YGZZ$npyBX_4WDp7Vxv+jqUcyf{0ee zNu+)(tV7UAR>jD;wVC@LaUpxW!`_$7L*KP&g@P=ju2RmD?rv(?S7rdgb<^RdpuZbB zy_fS}!`i;#avT4V`&i7t!|cxlhCXzNv_dnbk;mg^ye-ID^|SyHmpX&+@7KkRyv6bY z^sa8|&+v>2oDLlXia@NatE-Q}r!zNS@V}j;RLf!gyd@bn3#bB%PeBi{#izRAfIcd# zubT%Q*$1KyEIKXf0|0Kc&gMs~Ao}k#V!Cd-&7%BwySeu^w$#iJQ;R9Y6k|#;KQI-T zpO`Al27d<}2s6*XnzNj{Z44kV59Fd!?_VTmq|2VIrJgrPB30cFAUvHPjfiMDC;x7h zm*M}dN(r3mc0!&$RXJd{BmU#WWF(P{9b9(2`qx^_uiE|-_!YwfKI{L+(3%KeogVbO zNvGX&rrRyhJtr@YlAzyEY*so?RY=luq!dmka@KMDH5dJqM(ziKH@nqKeq6rFWAN*9 z9qZ#LF5NFn?j{5JeUq129Q+XNWF4=lX7+q#|G!J>Nux_=sw_HZ3FRl?J^yT0J=>)ecMGL9~7|k$MOotVGfr$E5dQYSX|52vY4eU6E422+hxb8a8Xx=T{GIDq+2)c00=(9Yrp1ck}a`n{`vUpOF?c%AAh>hfh%C|BeITV>h7%9PTP3v}7akn*SgC>qGxcBi;)%FCXJ^P>evv@;zCXHX6 z!aE4Cti3x_<(_#Fhfi}8$OApBB3}=?d1hO#SQMC3KOy9ti?S#yX}MT&2w+dh6LuLfV@`VGU@U8y zHDToBPRbX*`pG3O2YHbhRZwi^mY;!?uQZ@63-!;R3pDt*g>1T(4|-YumwN`kD)4gf zY32ir=?l*UD1dYC9u|9K0CJ`hp}ORKrxK(m=MrQ#f`gZ&LlMYWC{@*;-lW1R-*@@v zY|7i~eaCjvFr^AM#Owu|2GO&Df}SWf{tBBHt~hLuwnz@DDI(2`{A_ZCtw)X=RZ@UH z0|%dtCD!2@*4W%z`;s*b_&DN|KhOeO71WE@KA8z?Qd(;{oE2DO7_*AAAv-`0@ z-cb1qQ<{hESF@<9y=I=T`dKPgi-0m?+kHeur2BJ1n}I%UHx;K(^c>eRd;75F^E642 zq0Je3OFnGyON>?(W)0NgY3!}KH^N>;N1VhL+-E4@qV&oof+SbakkhKu<**Jdc3O!& z6v8IVo(}d;jYop#HgT7~nRWeIK}`0oTWm5XUYs!LZ+z%JNpG1CT|fH~1Bi&v_2-QA zxRXc<-(JOUpj4;4g{IQXB~-NLc4DJSW%`Oph}hWm#)DaLepC_}xk7#xI-3=y5$?)_bxk8y|6$8g$c=F1Li(|WqvxVz*bU6=$?u1hMI-(NU=h`!Pu zc3nS>xuksbt0;?nhe#d_0IqrPU9Pt$E31cZQO|5Eg5w@NU@7%n2W5d8cFj4ItJxb* zGl4cA(!1w!?TFR+7v?N`_ckY6eD}E_bmVoorE*-}Ut7V0QN8Ku<$wFL+*< zAmy}Nh&MHKWu*L=Ka#7BJ1nV;IHJStykNw)`Lq}>6}o%D z`Dq)iSQF5Z<^N+y5TNkhn8&@MuE<5 z?F;+L1{O~Vmid$?jFFfn%d`CGRL0?VmxgkIh|(RAf-o?;LH#PuN5g7zxCQ-d=k`kd zPbht6B+daOWar0@@N$O|?6?{tEFxDgI<+nA!gP~2XFVGT=pR?SfPLNVtlsa8Gq}}1 zQ##B3p@#vljQOn&pXKbmWyqp2QLa@nquXH?^h0iVb-2+wfo>+3YfKY7$plSRjt^R7p69C=-y4UO?}~NILj{`uqX*g) zh)17?0#s*`YwJRTGKJ|-mrF58lHVu!aC1Or-Fdlor)qzNw*v&d`PahHeQ!0=Jl6PH z)og(2cZeUArB)!^Ym9#jtmk8@?t25J!QTJhQ=(IoL6FKzo~ZQ2OBJRxTYBny9e3a}oLESTH;u4epdsmV%Oj2 ztdnFW!&QFTsC2G7Hi(kF3sjF%qvh=JG{Ms|8ZHg^yjsMNPdvGI^v3$hZyx!&EqQC4 ze~V@lKHs01_xc?o%i~-f+OD5uIZ^;$;jb51Ln%GR5Ckoc!ad#=)OIqmxCelKUdO_7 z7aqyYT|D}g%F3p1>lCZbEGTG*tVcx*aXy!qiKCSv&MpXv{A~$y6z}4MZlBR4+jGv{ zl%S8|+s;l}0z{+1cE+3>HK1$Qvy_Q*ES(+I>hc7zWI8S0l%@Xm3WuyZ0q`@!wwD|{qo&+ z#x=enW$}n;V-WTTE)GH#<2sbYELo2E%y|jC0Ep>( zM?M>K((%Wk*oq0IGXI8e?%z>}k`Lf4p3+_1;z6Zs6E9ak=oSbAX8>W-PY0=IT8qhZ zS!$N>M-N2FKGF`O_|KgjZi&r){j6DO6BpfbJq<+vd!+1-3r%2GrIL$yGNA?exgGrq zmbczR4Pafb1sqCSi{-d$YzN`0n-3E-f3y}mv_6%*5gw+t(9e58W>b&d9b(tik)&|l zhzU_HMsq#J`?oKTAO-fR5?Ut!&g;yQ+0#5F7 z5U$2?8_X<6G{Yms#`m28u^@DLwDhgxZYO@K`#eQN0=7HpC)DlZ+|oyPkyD{e9e9)^ z9pf4L-Hjd<4IVn_d`>JL*vaUPqhNL9BP{qMKf`$Lm(brFY*B*4pT25=^NJX`UEvAA z7eXOoZ6_~+rGP3r_I+On;vuH0eA8owab{0Zf@7tMu^`1?qiOLAxn5$&Y9C2^Ze2w! zG$1D5M}hp5P3o!HT$*{y2)lwA#yn@uQQqlElK3ub%dgQ%BZYVjou_wX5$@03fE$G69Is78JBh6i|*4Cr2ta z2_jwM@Nr<$2`XIoCkLnWIzW}0l2)!I+wFB%KVKd#4i3G>i1RYT3coN0^V>6sz1Ub= zSzTVK+1M}uw?@}O1Q@xe+QK#%Ulh+=Msh<{+HS7C1)8LzyY^^yIR_FHm2J>A~IVNn-0~+eZOy-LrR9)52wl&s#nSfb{%$P!|M4?KR1uQ zT|33GXnnV&d?UhV8aDeFtC^tG@$+}pqg+o8(LjjI{vT!?9nbR{#Z0=${HwlxC>7U#v zo*yP=DUF*A@wND)y5@xvQmm{%$lttBj!^~J=67%}bM<(PZ7QZdEcxE7X zHIsmbAp!^n#m2k<(LbgwZxv;v(JX`KXX(OEsLt%Pz1a+Z*X!dl-%!rZ7Q2*4Jk3dZ^0gR_!8Y zGF~V`@{~GQkVoP(c@0EmIjM}Vjnrc#XH^3#QE2{!$#p(y_SGT>Im!;0K=Hv@C3z3`8u({u{|$r?dS+OIOD{S{H1~WFTeXU*6Fd_ep3X06FLA&{Yy_>0 zoZSX;&I3qQi#H54Knwxmfe?6!%pk9>lUe0hJ3ok1sJm{L+$tfWD7`-OYK#n!CKKjNJ{r#s>IfmH?y*?fEu`MfgJ}e( zZNXG-;t@wXM+KZV0I&X*uhVeSY!!5IAf*H1)@DLeuDf6deYFAobkwAAxM-(oJ|jMP znLj6tCiWjgmWG8teuurVZMaxYQUs+J5qghHzc^z(weQugZwJNH0YrZ>>jX09SH%C@ zKFB$*zM--{e(mw(nY*WIB+hJ+0wr(tESas4V`f^bnsH%P=)lQ*3CGH3_L%#M&2SBg zOFb$n4<3P?X_mTzI$e;|NdwNR#-Zy{rG#TC?=n@%hu=qzz4U#rFSt526EqVNSe9`* zUx5xS&B}dVp8f$IT^1a)=zjX8vrc_xXlC4HDeyiw0-tGCDb6qK#E0*7VwjggUk>q& zX5`to?@XJ-KJ{K#x*C5(Xnx;!*6+*FIW4Bxq~?(L()o|7Gq)6}^>>`xw_JAZc6P0J zK3DVs;p+A29m!4U9Fky09HBl%3eS`(_tRx}iw*`*EjP zciT6!=pLo;rz6upHgnCzO8@-5thZ&K-rXIMmKyA$8;q287#;p8wa+9KNbuvpuBD_6fDy6XF=q`-Ciq61M^36aK<0fuG)`8ns3eYi zF{TS~Wx-#!EX150Wi4yfqhOiTpAoz!!N1pc0%kDL;a^jVZxK2u^X(MMuyO5)d{eYO zHVx=UVO~B$wkMLt@Dmd#%rQW!${_FWczeR78>A9_)|X04O9HwYC%1L_u-WiX; zna2SmO;Blrm3KF|I;~hD`Ea;n|stI zNi_NXJYz9u?Q%Za(hR9!+>XBQ{+q*S;DLE2p1HU8`>Q^=G4B(uTk5k@f4OY#fR#tj zD~k;KzxXIDc)&$#kj|l4Cz)qAmJ~N^%PjA}NT$I+HkSCB;DD4Nzr2Du_#SGW}X|9cs7&ja%>d(?6>Ef<#}#b})qz{9@^ zxe^jc)p0*|geSk?G&<@u`er!wV`-iO>tMG$bN#}Lqs%r?8kmiNDMfVPa+%MCWign&Si-~kf*WSwTEg^&KSu& zm=}mCV@cyLg$GB+nST7t`U2Yu;I|LhghEqL{jG;x`NcB4*pZOg9lL2IYaq5iw!9ER z)OPT&R_=z&yFWl+*{8tDe-n+erMNCRll*IMwda#CwZ79WGX_XkcljHcPKV~0gBJi( zzth!~Q1T1cGuH)wkJH^>-B4apv{XsgFIFWP`5(`t)uLj!`bV}YOS%EJQBY>~(F zy6C{Uo64vAdB)gN{*&^*Q;}HE4L6S>Ho2I8=i$FrX@zXHx_-Xb?KC08la?W7I=Tv} z6hD(bxah3O3ApJkbbK-xS#n6m)L*);?G~6(mKDY<-;PurYGX^0rr0~r`hPx@Zg)yC zs`P-i#CvTI2=S*22>=zR`=i=r?WAm*!xke0a8tV-(`BBgY7)tBG;D3T{}q;&l$Gvi z78aIuN8CC^&?PRkU)G#{0SzTSxN{b_7c{|USIeO-;0nBZT!ZUP1-*EgarGsB4BXN5 zA@1{e8KScHx%p&6vYwL6(uP=%m?(<=y7}%y6>5II6mgRBM-%ubJ!4!RGbv7^a|jyp zcI6=Aa!uMyj!8?aZs%D%%vnsY!Nk`Tvwru^aPwB9+n_L*Thu@xjusKQNO%>Bo;QakBUcO? zxXtD{e}7|Ubsu00-!qnnF|737Z?0=KY?ty{zNl|shqPZD7?pKJbA4s?x;g8k`9WNr znCT!dE>nPl?w~}zUfBqI&b{*oa&5yq0@RGMZM6I~3_)qHb*(M}=OONp7*%(wbn#>8L(tpY@tR&frqp`gMJ(x~w)irgRG>5->4^yf(DCnj#Om_y6{ zU>Lvb5oDvwrVM(Vrmml;e_Xgvk& zt{(ac)a29!mn!ATJ^9UGAiEJJKEY+k2?B9D#pE>)>3z+Rk_t)~&QJaSx@-K}|xzaCiZBOrE%=|uX z`^j^1#^;^&IhNf{%M54{3Xb6PHlra5P3rw?w--_-d;>K3?KDc(_43)@C1(lS@TuNmK z7+$2gqMjVGIITB4`j-x9#C|}6gW!khhkvY_@W``T#wu@pV~vOX3I2ERlKb!A#oYex zOUaY67t=1ElXQfWWYL4(m-qLE7*T?q8`bqwZIW=IOl7eC@ zVjzlT8kgo78LR6~$Uu}3VZ4gfhVOGa&5wq)$G>rWQfH1@Bw)um$UP~barw;TLw$Fl zO4Fjxa0du(1_@AFE1(t~zH#^*_J+T1`6-Sd9ciDg6w8nOtl9H>m&be_eO>E^+SuZK-QNg#mz@NYrgEfjUD z1)m_@pDfaUy(T@qTbJmU3ECSTzrRS;ts=v=fY40-1ruAP>zILuluUE(jjqQ}8vQno zjPfX`dqUwEkk!DfhTw;so*F&iZ@#1_uNeKXFGyaZNNeasAnCM|Nl^MORMUP{ZIO-m z;OpOY({A(XjHvC`-+h2@0lQ)|Y1Uu*xzhOf)oxs(0~9Bvdj>An%vNLGE~~`lIKK0# zy@oct;U5-0PDj270xN-z!GD?sm(mODPQe~ zl+yAgoFmxco63kZXZ%k+eJ&s?#4m9nz8L_J5d;xmD_3^+rdMohXuUcoqtHI2IcT)W;X;iS0H)1Jd zlFBne(WU`;BA?sIl&bu+kPbDII~$?D2di~q`UaocCugD53k)jY0RE5ol%ZM}Bf71shQJ}(4&;xnvjK4~eKu!KLmFkv&M z;P?LCaQy4FS>lrf!`HOrJ&+vo=g$f}yL1*)pdV>wK6Q;hE?e4U~6k8#kcalSzRAl3GAAv*=R@0+bGYM;uLg-)aAfBWMkZxU)h`2G9ShNpWK$=N4 z?rj`uwJ(33dvzTf=C@(+u;O3y>RfY0vt;f%{&8oxH)c-K-g~|NfY=MuGE9yFw~HzP zdM?cbFC#tj6ED~ApWoLMjbANrxF))ONaurf*4>bKyn#jKp4~d@EV!3m(VU)km|Lr0 zrsS@izS`ITmN!n9AbQ=~gybu%{%dJ0OImluZ6+R|jY*;c^JHU!C_QO>wXYk_a-NFU zqW7%P?G0Lt)iv1gA*hJt>Vcy?EqT+K#Tg&e_v>2mE4wg zj1HQ`!c;oKZ+{jvZk8kT)IO*&*6%S$azSV%H4J!cei8jR{Hak2M9vWLcA?f4HOnuf zaO3w4Sy^%)ozJpX-A8sPY=EP=0PX5WU?R|{h z2O7h?M{btI*w&tg3g39ODN)&z3aCVq!0q>^8J3#5@?^GOS0tY|!^Ozz6-^E(m1i2) zLZwp1&}W}UzaNdX?7DNGZBP6S0eaf2obEga(cKG~9tZ987xfM;-HZG2p{ci^Ldu`5 zs`uXux^nO-3|A^RxU;m>&7RKOB9ozFOCctu_qp+`SmdG?c$YW1^$2J#=TCoO*xC&v zDGS}1M1LDiM?O&uoL*?mEw+)L?XOp^8_%1M^EXR@wgzVle6vmTFh|t|1Mj3t^;#v> z{1b@U?4#Fc_hb8uy$NDC`kl_s+&KbWXHe%!87w>|&Vg0cEs2F6n2Z7DCZ?!y zp)3OTSN*ghE>L(>)ko@DxPPl+1g4t|jK@-$Vo=)x$NSH*1$d!j&Q5R9*8J? zBABzRdE4+8Usi!QvA8Mc7b9|n@Vpz_@`DoAL@9zSZ0WMAP6~ACA+GB0=qJlRQ=Fi) zFUiLyY&;jmuO?3B*$U{+vL^h8=F#J>p3;=C%#Ee@m;Sf4h%9#qc2mek_(n`4zNY(7 z+U^k)yxpl&+j01t`0(fbyvVY3_IDi`^eVtL=pJEhzc&156H2;d)ZIj( ziK|tA*EPq?DnEmU;AObk#c*v;_Tv`w&w=_K!aE-o0zKX%6^}>W;J)SP{H)w}+NCm+ zk!GGpI6PeY_p;Y^*t;a?bq=mO=)Al_k|dz>EPdAW`r{-PKjM?hI|^`8by6{`&PNl6 zihTq3)mc73Ug)(^g2>fRcX2ETb1Hey==t!%7ySAZJASIR^X;me_g$BXuR#~4(EJvM zT@E!j zIbC-8f`O38i|13G^XkPa=Rq7cXK`N4`E;wgxIsQrJc;qf1QHAHukW>ylotpX*g%S#D zT7mjmaqq>IgATBxlQbv8GZO5<*Ytf4rE~G=>2LI6izApSlHH-G?d0Cb4<-$w!GDOj zm$tvdwTH4|HMSDHaZl)UaVVM4b(9p;cU!ZDFEYF|<^%AV#vkqUN1h3l>`Z=__s$LS)m4yG1it!qu%Na3HhAqi=sD;t;Sn$lVQ&zV%uhk&FMs5lEdE z8Rnx?p|Wz@k=av#PrKJhHqJK&{E;%eZ9s17fE0T5Jm0u>{M}gY2%r|+Bws{+nK<%u zQ3JCFKBJs*P^&RdJ8~LbSjE}y{0@+HwZy}JciHr$PJYJ(T)Mj0#8W~g+C zqLo}-b7Riu?gk!tlzZmg;YC=8GFgGyXb1ih$Oe}$?{z!3--y>_=(K!3&TQl2xw3s7D z=vCwcgRXYfREVCjNoX{DO2HpLY8(|abZHnD&pB$)&_^C-9b_kK?7LsybVf*6xAn%7$-OdU51yuR`puTRAZjnvP zCkJZPuRzqv(29ft+LcZp-mQL@spaV^@w{h4)zw!}=qRG(;vu?LN}rh)xK?Q1_WMQt z3!bt;XgBBQ68KH4lAMftUb1-3TvNV=Jo;w0s3h13rYvW@ZChPlqG7wh$2#o9uKw-Q zoXOD}kISX1sV4iO%E5~8R?E2`@z>&dG*45$aO>b~q_lAJ0k*oUWHA);+X9{?JpSzh z8j}reb0T(cXsE(JcQq^Vz}f~Ira6L!8S1{#j3vU{0vor2zk3IC8aV25mZahIbmCK9 z*nE>4F%K1qW-p0|xe9-Blk;`^gX3NX8|}%P?GA$Ke2w=^#>8T}Q2*TKWKjiVg_9hk z)r!*4{6YV(bimbTSva+7qtRkGi|F9MaqdDrD&s0yF<{e8iIBmR23ayy(KQj7wqUVD z;H-^Do;dB2CC?LE7}IYg)%1Mq0B(K1EUFD`8%+aRR82IU5NEcG)=ei^qZ-X89RXs2& z)@aq|raxM;}8-|^XS~r&#+OvHN7_(OR9E;F9M|+`YD+Ms>|BfH4liLiM=oCHYSyC^LqPq@&%Bv5{+y|~+-5>P zLj1F&u=L~DC;iTpXk$?@8!eF1{cDK)7CAh?2YuG>N4qh8Djk6o@~7@c!-{Z8SiS(L zNBxTe{+XNH5eWkRFZ-40y5ctv>AHe98R)vAHgo8@!Z$5RSZq)qBAhKzRQ(CB{PQPJi;4?*3JY za5M^SYF`?D*265rJz$vtu2wSQB0qxr;Y%-VlfRPY?C8`SN$3PrA)%c>_oIZ109i=r z4Lp(Fu1>NJ*%BtXbVE)Yc!bHO2l$UL!+IB;C+C-s*~sm;n(j1n19WW6!ay)s_|~i< zN|V@Mi!wn-+RNvLj!njXxA8v9+!!>>`!2(mu1Mp=yUX~6q&YhSbVd^BuS0qW{V*}| zl9%Thc+#ADaKAJ}Z>LW-ylr*Wj!kC4NeL1P)1uiDT&(ILY!>A_m8+KQN3Cri8{XNr zGJ}K~*%84j(rStP0WBWro$Z+)iG;#UtW_~ahE!YHJZgP^DxwhoW%~Nn{hb?p#8=up zFP{JfEj;%%=ce)R#(*sDp=`d;59YMrH+Edt-3U}4Nm#l5b9cK7Qa0x13-w@f`|H)a zQJD0g)?mlki7dj%J2JxM;ofs5#*onLLn42z!*l@d(__rO1E^91JZ{nzgEfy5jE)}o zYsG;6%LKO(g)I#7fw`nbcZS=!2TGLK@9e&Qyro@|fhS`>_u#In5~6%;eMigI91=?3 zSv7PRN{@;Exd3HzZVC5reM1uFp*;&ChF7f9+zoUc_7e_!WsjthXP!Gj;>iH^NX5Ge z5LG+HlAd=mUtZqaHC&U=q5O(|09*qlKY-F9FtIQu`Hnh9d|MZBX~iZpmHE*C&Awsw z*n7*-TYn@}2qGK|ZFK2k8`viC);--OK}A7^ml3+X35}aJ_ce2IWN1(j5>y#Ij4&4m z`{?Yhm)hy}(N!9KEg&;RfG&7k4YhLyKRJUqqMCbHZ2FzUymLuWSiC!83>(xa$op&d zZTF#7WEfghEpT{?<>C@~XI2n+bOwp_DL6&5{GStlz>qLOU;mLbh_f)L^Z8R9#X4f% z!Vr9(g^KUt&pqWHEt&TGuENLD#$k9ea6e?pPXUj69N>dQ%asVu447~E`+#?*+Ozx$ zBGE4p; zqUwbJAO%7>TyPbl$#i4gYZEV%@Sy9im&xhZu>$dUb8&7fkGbC~5-&rH z4;H(XGjbbM*dw|*W0SXaPI9U&9*UiGA9KBA%w^qHN z_`vYO^_lLcsKJ@;7faiyt8B=};ethcKm2u_>$DIs-n#C!2wt}YqKX1-(Zyb46%RxS zs0?AQ82k?%cleqPUy8<`MTIaA?Rm2!ODFI3K2QS3TnFc>T?AA_k_W_fu>iZb{sjkw z)3;xG-zmu?p0VEkxYo5zfa{gWOx{I*d_BFPONHNLr5cZ?HU0qc6~!XHIjLOwJUd<; z2&B3|1u_rk6?Z58R(`0&z{2+mVgCNcba#v{tfSpT%-p_lPO^PsKV!D5(`3|r#BVH( z@k0)^(hzi7s}oA7C9O3*zYny#N*{T7mB@T|2-hTJz_2yJM!hO-1rCx}B6GZ$EIzxZ zCMCQ%6I7B;N1U$=dz?p^D1&1?&UtK^FqQqt#tA>VAHSKe`qa(7E`9wH8BxDYBiD63>2USPDDOaHG(~Q z!OjCs-!TjAEe=ECd?172kz9{hL6DinhEG{i?UrOoMNHiGl^6`UvMH?t9 z=>YE^NIb>e(tRews{HxP*YOlVFQ)(2ETM!ion;7G#U8=(T#JTb_}zaDMa59A18rPS z<8><<(Lsn(w2O@jYO^Nsw11s#Gty7Kj~p2h#&SaZ0FZf4%G6IjD=#c_UI;^deI77e zP8mRc?)P&>vjoH2i%HckIQ7Q8cz{`LE!%PLi%$kUs4f%Lu;tM|AhDl)8{k)|BNEin zqL){Yj+4u4+rq9q|L9 zg&9C=TAaRe{12fvXO7ePM&9?8OfO^+!4EH%12bPFo0m1MUmSE~*~h!!or)OyR<>|_Cxo1-~rej6YMz~oRBNY(>lU-IIv!aKp~PFVPHCy+6@k{1VN zbP-Ag%Dx;p>*pPVh$Zl7@xxp1Ur6pgoI6eB*&w-l2UGtPE83W-L)`IW40jEmy00g@<9^r96*F)tn~3Q;@4%;RUeVDKf=FG^Z^a z{6nr=hB^0NTERz6N(z+y&T}R6t7F(xj(h#2zvgH~m*Q=ZFy17rES(6z@Dd)40UFw5_Pl zhjpYBttiepXRp*=EEk$bUT5eZD9B`Af7GMb3eYcmJl~>6-;Z4kyKd3X?n9LJ3g>78 zuy|FH3!aJrc`4>8%^-2I1MfdmrfE^rck<(dXX04dvX}Fk`ffd0CVJ2x1x0~@EO?kt ze>Q~EB&R`YLMk6e2{DhvfxHuV3yTtl;lV^qd7@2vMn8}p&8-Nj5(s_?d8s)I5skNd^>R0mCmkhrFF#awux z)B!-{Ya{(&I1AM0x)(VufzbWpxmWwL8_zjrDlyg>>&E`;+u8`n@gKNiCUAW7u?UQG z?wjfY%JVB3bXHv1W6-lgd6sWvkc*Ro?Q2# z`Y7(SlM>Is_ScnNk6^bVM~o=-Az zo%99kKxBQ!$*5kff%_(IBLL$SFwu&+E}?3x%codW3oeJ0xYmkGyj7-Hdh_dHH+sSs zLAcbt!Kx5hE0@BDqFU696$E5@$m)O zgd$!`OGRRNR&%UqCtYg84*I+-xIZo!9;GSz|7vK0=dIE=KFN7S?6L|&czkh1MhN>g-H(+FC0n%H~Eh>x1$7xy8L&NnO|VCX+MV70WL1#+hPHca!v$ zp2ahWT%tG96w>c>YC(>wqw!xNls+O)BqubvcA1`zREQ;y?2TlH^uHU5)Qu%CCk+tY z?u&GX^!otg(u~4uhn5p&EGqPtDUQtmsj)? zBNLtFw=Gf!0dc-lTgR1CPXa!EarW2XV~Qw69t-2@>rMCe`!`JIywQ}l?1;MV07 zQ0_q|p##$=xH2vOm_tdBhaGk1G`z=)iV4t@EG7Q zE4I^%;#WiBCGIL#Ol%?X26Drl@4sc9o_9qkkOwJ{2P-55DI^3dXa*^01}lJq6hOEG zMKoBKk?xZVi*@?bj*KsEvK?&0=1G7Z9(;%qQ2+5@Ajb_&nq_^|%`qE-(fnf62fGW| z27M`pc(v>y`M<2d*HmAxgo1JM872|k$^VGp8j#`BT$V4sbu6Vj9q{h=h=V)}vrd|` zgV3^$>wUr6F2k{3Fy^cCSr;bY!69n(uedd%!A__S9}DB|8C#^=RibX2KQK~eBE9p0 zkL8RjgS_{JfIpEofGBzvSC2N7e)zm^<$1kK{E+u|O~}>b*D_fcc~wwcA64yeV8~yg zqJlegzq0JRmtFAC{qL)V=q=(UmJ4#i#9(3{4T?#_f!nudG>tOvtR{0Sd8b~JpS@_5 zB+|c@B+~UfV_hqWS5aWP0`QsedH->Zh)3U?d(;sHNI%}vT`t(0T^ug%6XXAJeo-Ih zc4+x-cVXB~o-dWgttiBTPj6z#u)28d+F;f#fY-{KOqCc~7+dD9l}@wLB>iFRZRERv zsw2UIpY%1B!WK-wjE#orv#$+^4=le{BzP1`FN9wkkRMnER3wlVN&|05v;rJUD-*<> zUO#CS1eZgVD1#Z)@ts~1IyK#MYI@u{^8upN{=QWZH$SHjA;Bf3S=`v0LJN5(GA?On zmq}P1Ci%S~m9Sdsth9t9|J&I}ib21}5pR_xjoRUoet*hIPYQESN`6m@Sx?GFPl|L; ziYVlre~|azj~Fl(pOB3HWRcaPo4|ObmW>&-p0XkR1W-Azu*@xrhlj*JNdNZCZ|C0^ zHOai<&FR;W>2Hu}63Fy>$TTlx+7U9%2$^2H=W3h(qjt0v$**ONybT}gMDkN!XYbyX zuy5y5<9y2C#v{*(6LCLAOeavgy>WvSGX&otB~CiAb$7J{QA4Ek-RmXOj(JLCqMwS5 z9MFBaYmu#-&--ew-e9_ZAUVFQO5qxdd{_pX{rC{-lQvym8zCJ)dj5|gTsk0Sy4-oH zRC6)!>gDqOaEpRWSHGJ~*Mdv;;)9#cjlY4;rv@^=jefGMHjL!R{O_2$?4zacK}C3a zc+(af6dfY}t}Ws2-#8EJ>Ap);w#GaJ_=N3##D>Yq#Wi?wb=`_3XD8~UFP^qp!WixE*pMp{cQ!oJ{IxYVG{c09{aBgbz`Qs zg0|nvN+pw}<*JHnYdMc#)b?}Y3O6zj)hd}MF9gKZMMcUeamAjv35`r%d8Fe5Kka*= zP`9sQ^AWCrS!XU&wOY)*KKQ#yxgT|y2Ysk_XL8NUBqI389kAXLwV0 z7b$e!J9|5lQV6_~srk`Iwg0YgmU?eF?q)%&pQHk`WujF6X0F{GYjmI)=1X2vTjHx( z!RZ8ZtsxeUcrtdkpb`ND@i(1KsK)kfwVq1k;RIy(tKP`Y#_w+ptTg?H8SYrm z0~qOrV@~%g8Lj(%jY%z8UvEZHOGg3&3@p_-JdAs3BiqTECyQ;cuvnM$1SD}_d zscm|qK@N3&-?|g%PmqEZ-3i7kFiPn>)Ic(2d4M>)a+4AC&|T8TF22An7j-`uMUjho zn2Vy%MG@qRl4}4a_c*&qlPJMH-?sdEqhdlRWr#G;cRxH0G_NQ;1~Sl$-5l^B*FckL zpzUU&)FN&I43}U$>6bS@H8}&DcLtoL^I9!LhjaQEv30M9jp;dW?{nS~aNgo@GVY3N ztF>w1r5=Xq)KE6-+vZl3IC(wwUKi&)c+p9Dk-8Ce4XDE2wz}on7MgI+cSD5xGwt{1ja?Lly9KCd)sTAy|Gy^QGAOQS=>kQ9lMo<*;O;KLT>=CP?hptX zJh&bR?ry<@Cb$I~T!UM12G_v{8yJ|!z4v>s-mk7xwQHZftGa7<_v*Fqyh89eowBO28*mP8}5{{fPO`wJ?d4O3#3>CUCA5YI&XE)i2g?DJBDTDaeu!6L+u z{p7ksBH+OKZ^Y@ddA?*`FL?_4IFG@$EcRU@wnT9--r7$ zgH)-G)Q2+6Jh5lrh}`&FwDDK_+%kOQuS!o!?=#UNfRk7GFqh?WW6Z&2&u(-=g%2c2 zNqCxYn0}ft6d(c(Ww41307Rh0o8-!&!s&)TwzWuYM!K`Ux$Kd+>>0T13A^n1xLCgu z;uDmc7^~P*0Tp>!cW$U872R3}Z~T?%Nx?qfkw4#I=t=q5lOj)vkbn{YcLYvXNnK0h zO=rSP_%9vwwEXU94hLhBG-(+WW(z92&)s>!rc6J4J!b?4eYmo_K22{eFyuMvZP8 ztCwbDhi77c->wAFiF6!BUX!r(HdtImFyfSY4RcYQr%N(%BB_qJAt30OA+aLWm1K=C zXc9#Nqa|ls47V6?L?fkWBBiLKbDs-#7T*D(v;=SCx&_)%DTD=(&t6^BsRxkTP*eki zD~x~V$L_E;i3ZiN%&f%Z??|`pdaGh>FwJbllw0C1_<9BPEBt;2IiomXtoAHkpS|!S z-f-$}4qES<+)up~a4ClRvg9nVje|@d_-lmw*4IFvhRA@p_-2VieeStB=DE7!>AK^T z_}g%iEg1@|xOhB?!#mp+bv^&(vI>KnDbnLYk44%1&v=gAl=rxP2RO%tHMJ3)xl@$O zSI32~uLMf#Z>NGO2l)dYD9;5=c}K|uyU7E4$^V$Y66KCC$?W6G?4ul`@sM%5JIM+W z9};ysV+{r1Bfyv*!%jZ&B^M^FNhWZc$A{y4%K`D*%l0t1sLYcI4I(cnA@DW~ZWu0qmcK_&NQ7u0;QODqFfx!;=A7bjj>aeB{kw@l<%2<&)=N|!Q9(D z!LGw&cQXQ{DFs86(D_j~=lswESCW9TVR8VV@h<<(pcdlmovZR#+Gp6Q+@%K=j6g<( z>%eXcN<+W}Q+`VB+TnsVPa-tvB}fR@2}#z~f1tdo7vv7QCjPYZHbZcvDE~U5l$%2KQY}Gsk=b`+;&mvpe6*h*7+lQGMu# z3+$yqhMhwEHJS$?T(>sF{dni{Hax<8o!QoEr!Cwl^S3@{UY~lvu`k~bVgBXR&#Aa& z!&(Wkp-}Yuri~@8^I{2J4!5eWFwVtEx5X#dn7vI`Cf6s7o+p?jYeF26$QX|6oF0_Z z(^v=iFp*ZRX7t01A-etR#JTn3&*(a}cot#G=AoJ2CKnz+NDk@oVzCxOyCO3uNRMrPIWE@_h~Jf9@c{4Q-%FkJH8lV!`eON4pcrgL~Z?(GxL z>Ra#mP!9(j$PPrJTIrF@$K$u;LNKJ)W2?=TqP5!CruxBE^@wWA;1KYfpFoJ9@q@q2 zO-}nM{;daM6kAJFVAVD{X@^52sX82nJpprG=K-k}RhtsO&01_8MU$B|e#%7=Fyt{t zUx&5a(*g-)9}t4)Uf+1sEAC$-U7TGjRQEZl$%-@g2il0Cn@0wydMtWEN+S;4!H`nX zGHpQ<1dhk-|MJ1({|g{Z+o=~}wz0lI9gn{j%SK5~+grHpix?^w$I{W6Y85ZR_6Gk| z5Eik87>lWx%O%(OFjYYm0x61$Nf^KHZ;GgBgQq78=NjinOEZz&&aBSnvvI$!C7&YH zkKx6i4U%4e>G}REQeQXC0*w`_h_YW|$LrO$Pz-mU+ z7X#hl;RV&hg!eI>n6|c6)9)YXWVbQdvLH%@Q%a_V%_LuJ?)bFa++F!pTx zSGP@T6CvxWMwL(zs$dqow0A&f|D$nPRHhyBUA!fC{ST~Rl0~wCbJ6D%c)sPd5ma=k z7@qlhj_YW$_*0Je zyj350Z#)s%QNDec`SM$#>WG=gz02KCM=v?de6v(S^_tD*^0$ZVsmeFg7WB9hxRAXl z2_hn&|Xp7WCi1)9uj7f!`85_IfjD>5* zI@z8LdJgwa53syhV(7s(&j)695XvV}oA)s(D)wJ)ps?en^#{-kAP)X2>EVs@*o4|3 zj&6la?DOGtRQ6vgg^2Y3entLtHK%9K)Y$0@*-kh%FzdzmT_aZ>N$|C{_vahy+@`G} zru}JI?|lD{Uv%UdJQ!4=;;O5O2VQBFw=QXZf$tuMsUwe?2!SX2jQ}Ekyl|-#_|SSv zs74Jex34Wov<4FZkWL()gpU5yo`}X>8)3^`uXOdFy?p)8S>ut&>5*u2F=qSmxHN8? z^C&@pX|>Ugo1Z+z*v;jb80a*GSo%xTF)2s>ylZ{*UCM2ikgR_&3d=V_BkHno>s=Td zY#tl@WP3q|c740aeM$nq>BH&H#R~=4H;Zja^{W_}s2JseCPU2=*q)0^L^ai&%DT;8 z*UfDV89&58z_2NZ=OF|fQ7L~*Q@9#|$#f^N^PFG(hd*Q>{huLUPd#0ps6rZ=Ml#W$ zd8M$lms9A9Zsw#a78V6@_B*9cr0I;hTMkEIbX!cZWRfA$Bxo)u#UIi#=uOk5j)nJ9~(86Y+5Uk>YxGjeCza?)pxH z@n`c*5hKESjic>-?SA!Yx|KRn$D!MPw|K3S5P(j8Ajz}lP5WV_iPEB?X!RsIK&j5$ z#SsGo!82nowoA7nQh$DLuG&bW^+wyw?%(Fg6_syAMW``Rg=G1Ek1)%0UryYvrr-D- zs1|l3F8K42fZWlHtS7L0vZ*^)=WbgxBc-YGa)XAQ^a^o-ARN(^?hueQbDWKZH=$`#M~K{;$znU%W&?nCczc^|j3 z09!cw;-cH71oOuUg=Rsr1qQ0)Dm_-^I^~;9A{=Ov{kdFnEHG<^Pg`C^4*Dg!$^AoI zOBDC7IrlABUDdG#HF&X|w5Y+`td5p|m9o)WYA*BM`vqEvo463>zI&O8mnC_4b#~E9 z+jD3QOtd_^$gi*sR=Pn%+w#>>QL?_A4{74QL<9OzoH+r!$18eLSYShQKF(YT;4Fo@ zeK<&r6ZlE=yFFeuWL;b(F{XSQ<=4twV;zI`)RklIk7Hejy3UnelQT)q1g8+dh0-;k z?gOT>Wq%!LplW#nvg~%Urs;8r+?Ieza$w9F>Vor`hcP~6QQ91XX=dOee99}WWmpJ# zndV*j41d*m2oF&($+I+MS^*J&`fkx&9Go5v(5$VcOWb(==WuG%H!!H6rayo$ng$%NWVJC@G`f zS0*;-nv|Nz_|}=qVfN9`>;!5P3dYs2~Upr=uR}uTvSeXD$9$~ z`|!f^*GuN5CK?7i)s_GA3slNl*L%)?6(5Io+qESToP?A2|4k@?|L;MhCP3}^94n}Y zDwD#RMo4V6{C!dXb>sWhABUdHoNG153d&sJDHpavo8#Gt?+OT{M?yt0k_2)wpXsbq z&Rov0k`tuBV`ZjU!Ij%=LFe`CEVE}xJ#|Ggh7)YN?d~Ley|QimW@NptLx1si7I_RN z*;q3I??8YC73JdzcZlGJA4p*SX|s@;%_mV>RW!}j0VL!3Ngl6Nd~>M>G@+?B z0wsMGEm-SL6?D{wHA4AKh5}rxSYs_gaCKmk3>REnVWW*h#+sbrO0rbnWNv#;Izs`H zLo#hd<-$%}e(~guht}^GO5JcTU(-iOGzl#-YX=6jj%f=Xoy0|dLp(Lo<(_UjcH2`j zjF6$~4|`?4hFa0d(P37WH0HA(>Mh@+q0!9>)RGW8Xlb&oZOtYCk7s<{Rb5nS;@Ehb zTndIQR3xjBco|i~&JvL6ipMp>wN1cI(3JMT2t*eB^XjIRw`$zpWL7yjC_Csk4F z@(laQdN>qd3+O_#S`F%=2Mjeb^^@e!fs0o>hPJo$jO z!tYXnx8nk97t%Lglpb9u%N_t_V66Maw#aq_lLk5$sO#F(^n5sEs2~9F!|`1K@CHqC zZ+LmDGIr)TcBiI=ae59tzP)wdd;2fz=mq7g1TpB|{^0`B+4T#hmp{0ehE0aq%ygxP zn>iaySw0Lm%XAK;I3FTIB`?R-uhS?r{wV8H3saZ>VaEv#z_OCndhu<#b)j3cQ}~)rult*>BtY5YW;%al`@pvvY<( zGxhYA1|6#okG7oi-bGy2-y%bP!M2pICA^nLbbZD1$4hx32p&m4Y?;6t!PVOd-&fb! z7zR_FXLX2}^9>v6+iI4nEIsWr&5{B#O1!+m70FZ3SHS=^|C3kEa065tz^r}jzGR8` zvMI6VV#mG%%x2Rabd6xas6tO;VYa*}Hm~~l!ms{_#sK} zoKBHZ>6zbtk=g2DVO{RWwm^Q*Gwv>WQtj}Z!)h&?_NVY{TC@c5TwvVch`F3wY~^p9 zCKWL<3e8T;9R8^V9K8mlZWvMyn^$h1B~8x8vni0e17Gmdk37UQa!eByIVRq!pbMQA zRpsBRgxjXX>kpb&iF#|DjeEJ=(xrXH=LHMnnU)EILKHyB>W>BoqczTUiX$qVvMjCQ zd8?GcaMifmq;ApUt+>`>3-8LO1_8uGds!pT*c}+hADz=pwa`7gD0?1{Vdq}<@VIdfQl+>6(Se6(kVldUpYEazccl>XCreIKX85dp{_{~ z8$r(7iUwOZyey`0o*NKlyxTq{S=S4$!Huh@Ed#=GF!vC;l4th9Pp`~)6ktbfhJz5#sBEf<*=dI3x3B>XqUhdtv)>J(Mx z>FWKKe~6}!4{NqKD(GE?c*@6ODyBWY(T0nq>;rV(@%WpjPDZc<_pCLg=yZs&Gv~~j znCX_cd?v9?9@4KL?;?}+n)WcP`V5;@>8ZpyD&#b-aUZ@6%E=+GR-51f->P9&ixXxs zeM*28&jabGC8_h2)fmn9Qfwjf# z{vFCFS#`*Yyx(2K5I-jSwlu^&^RmN`|DynKYD0xbd!{E%cZLX~$jx)>J1hTuq+a7% zi%z=Vh*!}5*bNcI{+8QQTo4;? z^MS(IO;|0ktl|igZ0Qv}f9X0p{HlCMP(A!^pZ@1(tnBbgMIvi1yUmhGb_cfbbReZ# zx${=z&fW%kJF#b_ub}P?rU<{4q}&eMpE)-s9c$Irtp(-1XU&=mq2vsj7;U|Jdk%2E z+-iqct|H)Q|I0@w{}YjUnzr=lA=B@+2jY^X2vHWboYmxi7RbvOCZsQ&G@7*Kt{qSO zxuMMw^Fu|TAkYx6t5-V`0hhV{a=tZ#OwJO?18n)*l9j{elZUP6{O063hu?^g*+-BTGFXn9 zGycqv3U8?R3|trUW#U$8iwwdufkkwk+6{W2D7#K8%eD831XF?;xQO%G$WFd1MVn{U zulT+9AmeGp$K>4>=k~Kt=%ZT3MTA_)%OMXSn`;xy!;4#8bOyPWf;V(#s_-uqXy565<+< zkyH;7;J~$H0}ekt#D&}GQQ+7yd69`!9Tay1`n9ijtyZJ$yN0|QyW!uCQ?1iCjCbSO z;@*oSKpaS7B7a&gSwk3)mIIT_amt!YN7{Ll}Pj zf+Ud%U*uF~DzmETPVpMdA~bHF$e*f&?!^}d89EQd0D(m)ZLApc_lj9{L1{lzS9Tqy zb01D4$!jvbOp*PC_tWa{K|@T(#hyQC)k8an~x&hCfe#1PXTs zIejhg1$;j5Uez2hQpmL(isbaQiF5T1hd6ToM2KD-y`a16N_nGqaBuD9v*V%l_IU{_ zB#lbt$!6^ezN;o!tKO-d9R-%nyqE~ec!2t{sDLB!1v{j5s)<5?gZ5uE*+`@VL%y)Y(EikSP! z;P74izgT9=jxs#qDGc^26P^3xp?3jw6Zc>KT$4yJWYm82el_}CE}SpT{3L{pkbW0P zOy2gEPkO61;Z{8C#z3h=daG?cFVbVwAi$t$@X7y z@cay=GTQT6*^6+1k_74?R-2&MLCXQQZd0QlXQi7ON1=3!IdEN|Y1G+_tN84gv&aZb zfXQaDo5qnrPA*l$GV1^_D)s@JwjMxHF{b_AAA^p4`8$>2J9|mY9FJV5H6j;&f?j?j z7@nZ=S%rd<$8eP!%cZbbP)^{Jt$=u#98X9+&ZF%6Vp%ku z&mDi=U8Yj;=96kh8L9e`=#|rwE7Rj#1!2oEEg3x;tIaa;uP}tG^>?^wY&X5`LCY9T zPKYY-wwKG76q%A2Yq?xG%J%@K!>-R}7}Zp=Y)ru58J#UBl{=XbL|&T_s`%y`*C*tl z!L1#F@*B2rqoUcJ?XdhTh#yNvOn^8#h$6^gKgbBl3 zxyo<82;ROLWYQntQk-mzX7boxpX+;pc)doGrD9*8tKNN?81YtgQ4J1OyE?e99P4wQZaSN8YR}u%^W@-%RyYF> zFwfU37W-GF=71R95b(ZbJL^$rV+Fzf2;kq{NGc=DP$sU|>?Y~7Zs%9oc8J#WocydO ztz6vAE+AH2rZ+!Lojlj~H78dGs8o8tr+ak{UIjmVIuo_u>W`|?p&ZN@_*=$-?pFsP zJszmGJLlW$lFb3-Azo=zEg;~pdRC4{&j;6OY7IH9wPg5^fsuE5U>a~xQH$i{ z+3UFZ4&eXVJpcEsmVf?UuJLoQe=zbp%^M|^^Q~9W7IdK>f>AR>9Gg#ipRo=#9fJ3^ zZ{)c8QzSX*!En@Ag-EP>u6IQ}MLCfdKPla9yyn%KaaK%-z87b5WR}WnIh$>fq$$`>~FdWohosY^%Gkk4dvdpN=RF-#N z9q&jsIW1Uy;>&NO3`_}67X5_X?f{ye8$Vvvt1n8(N!9g^wy9zf3{KCb|E2@ zkJ~{TF~4(g%vuOWp+fA6<~h5n{6M#ISna+L>{@}?Ny=CyCdRC#(45xB{1b2_*o^*g|ZIu9u&UrG;?HP265R#TqPUZ1}g85dN{oApGJ_& z^Aoq`=B0v>dO0)0aAWGGjyyody0xFg%=qaWT+WX~+OL#4u|a8V-Wt@LEb_a@f~iL_ zxg;vbcsPVMVZkGV3Wh*>0|n@g%Nr$L^7?}pIEFTgO@T%!3RW!_wV`Q*r>U1Ho=;pz zM1fF^B_u_Oa-+jweVEP`#(by>DQ;UA!`_0xV+5nhO-7)B7c-guwCNA zTm+PbATK@yp-wtN5fW-ee_mXpg4bS~ekR^1VF0z1Ln+s-~#t$WgN|0__+eW0`#q#eim>?&%+t8wJR0q)r#skvp#=6N6;-yF@$BmegX%k513 z$)gJ7AKyLJe?28JFc+DzJ#={`6%m1oaES%T7!XoSrB)LHRq1Tis1srDax}0ot}=yy z5x!Ag*7-0H)xM7{>NSwv4ehip4}1&T=KZ>#@NbJd(Zw(MGK-%oV#rDW#fCZ*H6U5m zl{Z{xo5<9XsVDRM9e}@nc}0-EAI7|z8oF|Nwn};uBMy~3 z#2Qp5ZhmTRxu!aKQ%;req-YG$4{8`PafGM}r3d6J z{=M`qMdj*q8>>wAfvf(ZODqRXRjl>s9BY=ZH3w51cvkez{`P%1-Fj?g9BL=efJ~3H ztnMPNw|FDReN2gDu2D}J=1h$HtBSV0v1?Ed_Av~1%9OlT^Aj{9=Y77{klIXfw%<0 zHAR~t5|S?vH*Y3LZvT+o){opFkgs7t_66|rzXm}UZQ6A$LWSn2_Xw_iVSanEFtV=T z4^tt@mn^(_Pz1zR%>cX#Q@mR!?XdF6v@GYge3!Twm+yTa>d4^5WO**}_8^7KwClo| z;4hPAGuy6ls(ZJm!~?<3yz`Zc>h+BkyE%WNT^k`Yr#Ie$&Oz+<`QG)FCs#XJ={urp z5#@ZZq$K67ZJmt04C1}>CH!{Jif~bnS!-hWo5RB%&yD{goyv^j3o2m1jbnNhY{)k#5F>sHWs4#4 z4owk`{0bfx&2}|MrssL$(crmuho7OanO((KFGq$yIR0McDlmP zl|z$XVfkk9@p}S1Q6VrVwu!Y6it`;7HgjA5=nklTmTYiwc59)dT>Y-VHIlGo=GCy; zK*7tbev#+uy%glJ7d1~8Tc$@sdWW1^GAQDJ96kgQ+zIhY?<2GFU+dS``HH?OQ~xa9 zSGz9_8Gop}C2uy3AQz99?Gk!e%_p*WPzTzQGZCQAydj6eH2#kt4*mx8STqgER45(D zE&wwPZ-V^X;cKo^+^S0g+^x*e5pDYS{ke8p<@*MBTf&ud$jfZ z8xpI@Mw3^jTj)OGN`!ptf?RxSB<+6KO3K-pLU_d9+9bVyXSWFU5GXv>N!4_EchP00 zD-s&Gi$*H&4{}U?9z`f=48~(QeHQ^S2AcD=?(M41_#!ecHZJORE7_uiJRH*H{Ncm$ zv-#`lHBVp|_D%emW~)N0t#3T9DfJgZ3zB&coq-!SRJ%_R`u~Fa*z`3M$MmQ8-{LFN zH~cA_Nt~tuE}?y+-6s*L`Bk>0ST7XoVwciJ?$<_S934A_Br$5FRdGD3t&Cep0B*>a zA?|M|DQs3nOVhtZf9IHxiz2W7d%f|C%NIYovDI9^kRCoA50%<2rh7!X;&75-l;Xa*E<(8&zR#JHvb;gN-3u?w^uV{`bSjA zzEIf0BkZQ=S!(t1>Zm|Xo$oOe=@AGQzt^B-{XMg$t=h>M;}_3_e_JEXb($cXQ0w6w z-=_>|yn``SQ-P2>L{3;DJt<#w*kBa^Ik8C1W*XqPxf|Z#ni;X|y(Ruh^!=sM=R+mr z+IYO+F(gP!jJhe_S!(`#E=FbI0~0K0nRo!C1PO>BH(@ir@2m8X zG4*Qxh~Jd>-}$CJhA_^A^!^ahv_B}GtDx%Hxc*9T2C*|^HhhA;{BNoLJa;iC^#-sC z?v@_te|JsGLrP79;m3Me7iiBw`tSLOdoX2*m5f7%32GU?OX@>1e|#U;%r3uCI_rqeo2g@5m0N~GnYE> zH^oN{4XnO)D^qX#Gl0Gz3?{^?;R-DaJx4ECH`2nlCv-mup!WqlNFdbb+E_J`D9&=d zWcWqLnqNsvu&1Z059REeCxasc@{(>2W4Z!=1ac?|h2RT45=?ND6-}w_%@y@@q#AaD z-UviMq4oE>Y$-!t+UiY|zphDBh*c*imjqfqVtU!)d0i#mz~Z;N#;tDCj{^5DtESpS zilSFEV-Nzz3l%^taoUg#P3DkszF@gEnPRp5dv`38dR2S;Dk88u8ORuk3&WP5hWtz@ zKz9BaMfFd*@Rt;6%6^Q=MR}N5@; z{K_`#$`TtMs?KI!HO9C*zd*Tp_Epg=B?nE@Ns{;gi1idNtCE~vjGVByX9?oz@}*o7eaP4BpvQmrwfi!oi%l1uRI=iI%+H=V+j26S7sS$b75BC z;a9}gs7INnl_7=mDre2tw<5nBYlrmZqX|8-#RcaH9V+c_;?iIjJgyes7U|6ce!9QJ zV)9gAd6e`j;`q9k=(~ak2oOxC6xF+5of%58zE;zc^x#9(24q z4|^z^74v?%wrx;GovCMxr(^TgCq2|=;2I)ySt*!!QRy@fF&g&P9c*ZuY#>spEbVFd zV+eeD!<(0OQ5kFV7$Fu@`@uEVXI}Jq5m)|7awi}%9&$UCA~sqxVY+RA+!aqZd5=Ug z2^?8>1ct`iFf0xIk5_%Hr~aR2a{i1YJ|Qk+e>ri~G!oXP`gM1e)*LgI9Q8(1mS@?? zNWJJ%ZrIh{U+;6&cOBlBeC3&uIbwHjG4&WI6+!=jWZBnps~y_e)4HFM|6Y0Qb@=c> z!P$>iK_Tq+#8Nmc(|FNO1om2$z-~WCh1i!*;h>~HQ!in(pVR&;L*S!vP~b?>`q|2) zbTFhZ@fxG}x)l_=5cg6H-c3(bxi-%@bvIupOqOzx041noTU1{1amRI8k>5mx;qr&*Lqt~Xz?NGN*!--8Ea__YTUWSNl6EP0U&2a~_LA3wX zG0J^vy2jRd*`ck__H*-(H+J+WSvOUNaUMHCF9E8n(fp2#t5v6vk>P~;ZrSt;T6+G; z-GG<%W+}+~i&2zsd~0ifb~h0Fj?QFj%l-@7kk1?PI{)B+1L@um`A@s&>#Aw6kw~sNue3^;D`NW}HUZZ zDm(#5Rd7ix$$I2K+-H7p(#>LwW(~#ace5@YknwlbB(aDl*1mRhF|Z%MzsjT7@juZw z?_Wuvl%c!$)kt}H^aMos)X>C8NdNd4;XZ&hphT2bKd;EHv9v(y4 zh3IwIxf3Q8{1OA?a}=iR)Bt83BkSq~X$a0oxp(|zf)q21x zfTA{mYAjQlTpWf)B*u2IH!nH72a^=fH!;yWjc~fZ;Tf9|F~MHRM-I6u;c9ShK3lm3 zcV^vMBdHw{Y_PDhEeQ_tf9apo@V-9HjNPs$Ee3FpFozC1NPBNF_3*(;-WU(g3@PHF z+YZIrqn3QWi+I^v#IkzD+)ha!7~U!XuRo0Qp#H+=XC+}~B-s!5%_e=j)K7Er^%JlA zTLyYQZ&H?zm|+T}M)S`Cxyif~jvIT{U#Z;doHP0)Sm|`Mw6Hkr>L1<=bs@*Aip5uX z<;_-j9_a8;7$uB6RF0NlpDvLJIHgmh2_Kj5AJ_gJ-Mn`5)_Em{*DyX<#B*Ks6X5S| z^^s}j>}f1Fi>PBR{Pm`|C6}{>62ocG*(~b*q*lL6BwpkGt<+qCZO87yapL>$MW3`O zK@2KZ(OwaK6)qdXkCpVgdVE>&*t{3qnmfbP(a7N#J%i9qZ(%O-U80%H&Ez`T^BS!N4Ge=9IWbW?zy~9NT5btS&&$0 zx9IEiQH1yPJnrXF)^r^ubJ|G8f86Qs-@jvmyk{Yw@JV3Ad1<8KDND&ein1j=Uy+s|5|c^;q0m>3Es>RMnz!t+AG zvp-{`WX?cVM*j$_!so5w4Hzf^ccPXo7&Qy+wC53-*(?;E`A&N{iC?Nqh}miLV^+Ai zsg$kSSUxoA1U!#89rAgDjD0}Fmis(uemd+VteO*w8mZdPw2H$3#YtzA8|zJ9Hc1ww~ytg^I*iZ7tel4PZk9zxE`Q)6*&9 z$%8T#+!ehzlrb68KUZi0{fumRFZ7h7+wYTPB)*PX4~-rXwq_X)W7=9(Yz&~iRn9oH z$$Ks-sH~@H%pZah3P5-d+0a`;=Ci($2kyFuS|NQ&F8l6f&~YQ@tdHHT#4VO2?K5$J zWRtjic^^az|8b51lxCkoq|ISlx?ZbWLuXoFvvN{B@FimbJ$2`Bd$EP)eOA zZYD~1*96&H0gILD3OmVC06j0(OPu2DYcsr60G9(uz^Sm$m$o)}q}u*pnRlY6Z2w03 z_34_}s@OP<;<<&~>$k2lFR-MCzfaSDR^-M54dg9N01heOEOSblzbu&{dw6%KVoHHQ z`>PkohOf-)xTLvOZhMhJa^VXc-D*=5SyX!Y5$*~n?NLKvTbr9A!2nBb2grP5m&K3H5aVyqaOCPG{b)XyUz*xDjXmF7hPHCbxxX;}ng7mh~MSv5>*bm?u?TJtnQ(DAb+DTliMsp za-=ZU)=1w)8Wkii>}cyZ(Q}Hy;c37-f8&B`LkoUPRWI53QpL*mVKViu!xzR}mmmA1 zM%b!f%2z~Ih>@NFsV+~i7OaAl&RJ?ri91q$M^zdKCNnea-^L<@77Jb{WM`}y3Ngj9jzY^*RLXyVg<-_ufjBq zHvgCd^%}*rTGJHf;@L8O2{20+_wAR#m|IX6cv1`mHr4br?jI48y=#` zt*%IgSP7mCwWu;CBD^6_IlW5S@J%x9%a7Zj!W(tIYD1{uMa4K|aFXGS(Ne(2l_Gti zaBhMj->UO4FQ0Q%XjW7*0NM0Rz6z=Zfv19DEODJ6`c~t~*(={KzWW*=s@H8X$zg%-H?aoGUqOJjFN;AYMD+W7>ouyOk3%o&*5A=q5t N-tvg%k3A9n{{VD1c1r*N delta 30776 zcmZU(bzD@>_dl*u(g;Yy5=w`ZG)pK*mmo+=2#82G?4`S^b!sgbqRjrn)Hp0812VK<9jXhYGjF7 zp2Oi>QiSR=7kPz9H8@AVQ<wOto1s0p(|U*6?h>@Q$6if(=@> z-Qt=8F-le3ji-|nE$d!aOH81fJ~sgS$??X(6AEH?-CDfotNyuIb92R3b$hPXm;cJ1 zEb`#?PTuL~o&<*^gi<-%vb+*k6n`foho>ueFhkn3#&#APltXgf_-f88*IME?uO}WG z=NFmrmj)MXdmA9p9s+EpJ&)&!9{q%cQfiPfS2gzA)N8ip6#g;n^uRCCVK$P$at~fI z?c_KRCLGw?r|0-wR)0qe#M^FK_ov(h%jfw%t^YrR=wG1~^}X3D5L(Z#C|Vhs`eEuq z#r?hu@-Ibl4$F91cNcuQVky-AGVh<2RtI>fzfH`7^DjNXkFs_Vusr80Cz-X!;-20IZ)qi-EZX zCoX-ox`lzq#}cwx_QH0(M6%p)ZbwpV_I8{85_QeepCWV)5HGZMaP7Z0^BhCtIdaEMk?(=$J~CG+ zSmj$2cPZ0V`th_%bQ^-%!1--qgv1pdN-<4)DTB+P(l!CX5HXtV!y8%u{BD>1di3U&?VqQ!YWqq~+U zXt1kD8e;Hm`=A``DTB3-wVD23t!y*8z)f^vWSAu?fER-01Wn3%DEly+KMG#MQ$Z{xjD1Z3r(DLvK zvYLpJMgB&jPP3D}*IbAeuU>Jvia^6?BO}gq^)gyKXB&RM5YeO8B%V|agAA12nsxJMVx_ZoS4jXeT6 z1`&4d(#-@keb?O1Rg0n)n69rA0EO}82<8!YcTnQDRegf@Mw$%2cwQ{!&*+p;z9;Zk z-nJHS{1KECq5R<%^M}UgKmSO10ox>R>GV7>Ul#ZoMT$Rl7LH6ORyH^^lE$Z)dyMk@&_)%!ucCNR}r0(4_@`A4(Thw=&B$ z7D+kb6H#w3VX#rtqM@yI7hk){!uz#?UxHI47<6R{vzC`b4(4yP#Kt4)oF0rmx7R`_ zRr`gUM?47%H_+H_dd;rm%TV_f4GI@gVk}ug%O8M3G0=w_iD9>yo=Ok}B=LMU({f*8 z-@#~mPljBg7f<5VqN~kB?RMFQGxaAT%1=at$*(FEoS@YHBS1|M(Kcz;!M>!B3T**_ zp>dMwD-qN^V;Z)nv89Wt}N{u8pD;BRDE&`OPv@PXwFA#BCrWOZ_8syZ zV+3;E=8CBxQeMWtuinyOJ24b1dy?w%qK5AGhRLYSmV2g4VM~=XQiqCkr(rS4x-gT) zNS$(*%gC!dBtK3|?v630KK<<_F;7Qq-pw3BVKn#Qgy>beyeLo7jCfl9B3#>GK^*tt z%z!+g`ClGv8|Gtw*Milsjng^Uy;!y6at{1}H>Yg0#yi76THb^aEHT^9cW6dyJ`>^^ zBI!QG99O?)%p^8E-mB++zG*x#GaG&i&5J|27*-T7JOX z^=%+Jg$>te%{}C9>Fn&RM&gNYQ7L=g@1u!j8xu^rSX({U$eo9HI_iJ5+sA|f3~wrS z1@%f_yujW`^dQ4-u~V=o7W7(IGEFqKd3dH2O3%r6F0#QRBw`~k9i-7KjiK>5+2?C3 zF)@{Wt0cf3&2|#!FC2sZY&!13@^cpO`gHKtnB9kAXICsC7XeXPc2K!vSnDHCVUfrH z@!8AK(7cClkQFK4*Nc->fvgTeu!~9Oskia&%Dq$PuN`PpG<7pPu?DxA{$kON@#(j)*1uEGX3^# zJ1#mB>gA0ji*J4;pU#e7I{;I^BdSS=N~>uJH}GVHTo=r}MZ)4>OI|-iW8Vo1R+BNk zc*Zroi06|;d&e$nO#=;P=`Ov1R`W2Qgd6lq^~QxUC+`RAypdNK0)82ZdUVaP)nVrO z;b91pWU4B+2fdm7PBKMx5Qc5C5lHD6E$YZl^`7&yZFPOyvXDMl>pMWxeHGHb$#*Y<|ojm1%hhVd{Z790)z$HWtG`lX7%PM9YhU6P+;(k{B$fZ$>ddxP zk~sBQvYprsF4D28@c|(EE&;^ZEH90C7k2RyyDtfmNERZQ_r0Ie`+zL(5k?_u;|Z^F zM}FXMEHfYB#a|71=M4<%O{#Aa9pEihy6W3gT{6XFUM0NR^e}RRZVuVek=+b?_1i%f z3vQx(R10=VL@%|SQ8!Ub(t<RXhLzz6MXZh zrF)**4t5+zwjK!EKh>4F4aC#Ric_fa^2UZXj`q|HD-O?2mFv?#iPA?eCfpuwD%6-?9jZ2>*77JAhEmJ=j~_FZ%nJ*)AGga3QA=to{2qruZ}j9BNRF15FKu* z$3;wdfbZM;csh>yd3tFe?|Ih9^gG)~nd~4ZnEx{mEo#)f6mBx^`RrUDXtR}SKKcd@ znB^YE27EkcAgcANh;!l7r^%t0fmreT4eZ`7n4QXM7`p z4n7weo%E|%TsCt83vke(og#o>4Fp0wh+9vX8zuHhUcPBIH z@7A!M*~FmProZXC{ktWnOgqhf3;kq{S}KlOCNj57N0PEf^9t~@_3VvLFJXa@XW!@F zOBDzzr(xC8G#@pMmBsw{^7Tv0E3za5ppTROV$Svp;W(1R-R^KTpZ6PA;xfa}s5}+A zUL14#GDVMt73SQk@SU@%=wF|?V^wBXsRe7xa{xDzJE-cm_2A6D=0 zoRbq)IhHyTTE}Cq2Z#9Zs}1+k>!ADr>?zKXOjJ1d+7-KxHu)tW+bT>o4LaP`WuVQ&JL zlT*eRJ711B=8_xGRLnd*IcW?>^zUsdp%@N+}>iX;x`ZAZKDs=ia$ST9q~u+Y;OJm0VP?ZI8Q!^Z5!K)p9;9UCE0f@x$@7Cioc3{!Qi;x+aGQiPqN0*A{aO+o&8oJ92cJ}^^R>3E9PlL498;@5U3_zdmd4X&0#YDuH#kcD&f;$w$3fJxclbA{;$Aw?;uw9kn?Z>CAs zwudZXkhP-Z*r_-wZEA}&IQlnF=IEc7KY2<|X6^Oh)2;a>JY$(h#4F%;{Ue>N`K!CD zq03!#<^2&>Dc33T4nDro?+X(6JA1IXnLB%$A2run&mE`*t32^f-6EP9Wi9=R`W5oXYm0Wy>WxM%Csvn8 z5?Yri>)LtuQ&F1trW5OdorKN`CPQn5p`Gt(*d+c=z81H< zZ=5h$@!*2$=Lfq|UH2zn!-IE1Og4nsg`|}(0ZH9bj6|wv+!fAE%1KzW* z>#Pp8x#!NDo(~|zmmn3pJjwAx-soGI1~@&6JG=2g>gs)R;d0|<+lcBGq-G5!LORMZ zRCKtMCU}n4{9YE%UPKY%VAt$ax#6^Hf6ulz$};3_#$+PcRo_Bir{aN^HH7R+0+Rv~ zRKcHnO}9AGuj#E$mTskQdecWpf`>o-?JL0vJ^xVN0@qk-i57!4#`H#@Suc6@IaR+U zfTSB1nIg4Vi>I}=0m2a@5&$5RY`VYinFkv=%>BIjA;Ob&h&=sn`HvC<`g3i{p}*mx zv-Cdo{r$tox|P?YN=oLKSX}1PA1HvLSHxJk`oixR9M~?KZ$-&kU^mS+<+g}>l3n`~ z5zo8jROaQxhed?qA>xAt+{3~B6w&GmUTS+(ml&d}UYcE9p|4P$0!z2wml-V$f1drf)%4$L0vP^3Ta`hW zA*Yb}3#*uY3X7dsaODY>Kl@aABR+kc=m6Fyn^v*0I=II_4bZjTI^? zoUBf*e{Tma%M+*Owl)iZ!Q?&i>ir~iGuO<+#5vuWMx$@HlZ=a~L(IDVp0|4gW#3~g z(i6CN<_%_mUv9MW`-yvGJC+tU*U{LBvbrj>*?iZS6T{ISW)0+`I&wJho+L+-@-`Y7 z04cmXOU`h#V{Y|_z3y3V+~SGvGnNjMtxH#~9%OTkA#KU{>V^aKtV3g8ysz$>>dk75 zvi)Ye{&i#2T^?y7RNg}h#e`C2n?JEACdMLr5Q3(POMAdHhkaN@cj%>U0v z;xsfuge)@egB!X_DD9?3X~fDsHQV}wGPTeSn@i?r!rMli(@)q1(;D%aFXq|?@RQ+9 z>dP9Z#GBY*(MquZdliit?QOiwRk4*u5hme31J2LSFDmErPjo*+q_3!;Jd|hU-|h)` zdl;KIipIO1@dz|!2ze*lFT6tDjtt+NDPsI%&oGhxr@W0ch3+zDhqub9l9T0LMJ9jqyVHd@Pz3*MKPJQ6p%N?Br- zL+mGbRG%~#uP4o;SB7+u=3%%SBF)5q1fiqB&{2zdhvLw06y_>&MVGeNs+n64_gv#) zogJ8G#o^SYGYhtkTVgsvv&2ChGxhtwd76!_HRjjyuUa)9j0bzdx(->%M#=6gt_Gw} zAD)J9(>m7xuNyG5h>i~L^i)syOKzSn7I^)+RNwM3i>h%wNgu}7OMbsc`aa^_oTvlR zbjx#lCb#Se_l0T@ow252RGz!xOAD_vWBN^(JBx0}jg5yF)&_?er~BUW?`T{F2wVW> zi>n4f_b_~T6+69I8kE7q%26OsEfY(X zA{dz@WWGoqvj#yicmmrDf}lKM!jhX0Y0ELS*V2f}iu-H1LxiEnUwHaYSfP3bZ08fx z>-O#~{wtQ#r%(@XQR;T^`|h*U^&#WGmr>Oz_Y`vrH*fhXpZ}S8lLq!h>KwTm@HbB% zwZ;HxpRyS|dP+%*c!`ZpRzgq1YY{~626=V@&Tyu$J~OBrR}!eOsb0V1gNFW_aky?5 z4Olw~pez0L;*K&2tej`Q6kAW2`ETv%Vi7l{u=sOh_c#s;tQ!d4GT0fCeHNnK%hlE3 zMPIA(9uMN&9@~q>{?^4X$ZrR^PImOh_y7z*|9}XZ5!7s#0jDvXkUe5dThohP;Xe1% zG|*Tnw>kcNNGCO2_ISk|=Q{2*JW*qYaPUkwFD`Z42RJH3-nAe{YxdGDr$m?zi?_8xpZ#520fZU;L!$3|F@%Z$^E6y8XM;|)|?U-I%Aw>yyHL)F-cNj zu6)RUtW_rtiuerAKl%h1LS@J>0b0INdc7)?q-6C3+rmXdG1jBl1Gj5)PP zIBWFM>kNs!yqTEnP#@XXnJ&+rfA^O{b5nh3u1fNwCoD}J&Cwo9&Mf? z7OQ*VI;!Vdx%2jHx@}tR>(Wxamzf=}nO$zjsCATje&aYlNy*ar^EO4f(K6KC!qV-x z&fBxOYiIxAt-B8z8#p6V_C{+&*!hi5*uI9pQJ#3>%CyDSrN<&QR3r>R<@x(Sp!3^A zJe(m6uj%;eH)NbV)~7cCvCIqohz5wWUG5w7kTB!dmJQFy;@u-lw_kYzAK?+}1?Ua@ z4hrk&lRrYGb(#aWurLk2_Y-+Q<*?pi1iB1$sfK=hLJTt^JAgN=*;E}E89RRs2stu4 zDDh}5j~SQ88NLXV6snEF*!$v8+4k0}8@H-q^E6Y{reM~ZUeRy^uw6`9E)rdi2;J4n zb8;#HRQ-UTNdP8O@9Yn#JRc>GXv4?fu5vxw@pTosT!Peu`j`Oj<)$5661{~$Sr0NP zB}s_a&gYFRN=sF8T6elkoT}N6EB`dSBZ0QQdGgU;MJ?_lj6o5JKdE#mf^}_o&aL}E zoiY4tz1~UP;NTw6zL+r2#VTv>gKBtCzlh;~Ej&DipOe6FWx7=j0ZaI?N3GGFFqs!Ye!FSCr6d7pc?VBzjv57~f)M z(6$R;oIX$k8H2yf>YY5V|4v;mdFY)Mkn|_}Kf8aew7ep?HQon5ZjYWIV=~0E*kHcU z?b1^-$v>9`=Y|K8b|+rQ6LW}M6?kZ!4VPls8ToAg`EXWv1u|_iJS|-H?oU^xvpX%j zrt(H#az-VefcXD)Z8ozm-`ih` zo1sW1=Uite=NxS#Rw)Ng=Vg`CmXLLejdLh&4X27Ct8{%Gu(+4=<>KqMghZPM;_z-* zhkE8Mr>3pQk{`k}Gn=lhzZd>}s5;IJSeFq7Q=h)63`7e;inUe3z6N?ltiC)i$G-g? zFR5y<>~9jnDn!nd{9?oCxg({5s&v5RC|?A3ptu3o!Nh2l1(k)t_HC`%!M0=WeaAk2 zE@(2twXU)06Ws(M%gNnuum#L~rr}1NKw(CIBz=j z!#oArJA{SNF2J(1o5#O|2Ig?1CCU+7-b3z&`3_F z&l4j%6TRP@}>LmaJ$pFo4MSTVQSc4y9nmXfky6UI=w05@M%b zcD0tjTfHd-L1CXKA0DuFWVs9qqvApQABJKm^H~*ncz*jd1w9wxCHQi$#=pBp7HMnx zZ8dFMxYli%g?nCofHC^)t)Ok!1l}Q5J%O~&;gr{_JDvdqBB%5I8ASUzpbOMB8Z8+u z7auKtZgHt`MQb_wa94u2qdmq>#YJE)!j<5aq_72#U@(4x?79!Mg1#q}kbj-fI&YwdnS3d-!m1IE%a>~|rTkn1NZP#2Kd@2n#0gJ6~kPiaJgvyPM1sog;l3cy*#kWzm@FRgt-)Xo*mSrx$ zt+-EGSfV?__7ufU6~0We|A{*fr3P~}`VDgD{neOdZJ7SA?v+c_qi{)E!}Y_l;vn14 z)4BU|`c}y1LRzNe{H*-ltLb*+UUahFUsVJuKoiX!Amzb^WRUZ%FD z=!Ajp#>XV{3#a#RdRYpL54~(sd~a9ZMqCF@=ykCmZDAE@P;RJX%Glk)xVfj375|6{Zs)4~!ZfD~Y zy33tB?0y!BPa;5!>VDHe-4Ac;CTE|8tDW=A(u@KpQX#pAidTflulfzo0*Ysjid{|g zz75w-`HWisDywc0LS-zJ2^dJ`u$zIlY!bvMTA^yT>`@meah$o(s$`&JLY*28ZMM?%s1VI48imeHy! zLLhQF?fM3xdb-!(iqthK(kPoHx%Kt5+WUx|7=?45TyXB?RlGU)_{DgTs^T)R-KNog zXV9Oi6f!+9uyH~a5oD4}p}H62E7#*f{j?y`<+CeFA^~ZHvm;p@Do!4R4Q9wRjJa-a zJmp;Z0|$6dmEy&ZF^c*{d2;>vr_|7rR%`R#VqchF-GrW4t92#-^8*nMi#SESx^y0T)k>Xe!^C3Z;mB7vvOt#OzVSRY z6K`}nDUui?<#UWkEHxwNLNVN$?!6y_Fk&&F|IK~jna};h(9pwgbKm7#D@2jRdoLc4 z-r(OXEP0iiYri@ut_mAU>gKQ^X#b=4JFnpR{&zEnaR*ygAfJX)Tj2c8U!2biqtnPP z659RIpRQ9m#^=QjzWh!Bx;gVf9IfKyGqdm z`hTioDPL6`>9O-xX^-b<^J|=4O`EN?(uPkYTZY%$Qn8!YFQiVbZB4A1Zq6Ef`B5*5 zZ%h5E-qCa0wC7^B0n5djX`?;6umA$5u)#3_)V|H*xVmX{- z{a5tlAv;8y&GutbwzW=9vxKCJjFaLS-doJKEG*J1P~vrCozs~9v95ncXkOgVm{R?* zcVZehlyUzGiVLO+>iB-bJHqbu<09yn(PZO6ltfEd$|E-*Sbh+~(OX=_AUDe!1oV4a zOCz4t*2jc24#|-;Z-@v)%`s0t^BMpnEj`iVQOabl+UDYiTdR!cqHIgW+p)SZfqQ|D z3txfWo)<3M60$vH4pnS3sdk;vGNR>($=a^-v)O-_>#WI6=c7p$u`AKf=lCwvvv^40 zRkg>>e6v3*44&*PU2ZhF98l%70O|GbJ#oJgT$ardzrC4IPt)%aME9rGnl${2U$d1R zE3xYEDYu~*HXmX7#SIhMo?i)ULMX?~@246WY}GtyTeMls`e9BO3Y;X0Ow$-wB(6@u+S z5N*%Td#=-sZEm$JY&AM(R<-u1FnH4G;KqiyLRDdEA2==5LnTUBcnj<}yioB#FO+&iQFvHlkJM5BszC{cxCLdS0 z4B2QPb!36n9~;^W#cTN|uQuE2n-1+ohHOKw zniu|U)^m*7CM6g%H;mdo^xIw}nk3KXHXV{(1C57;8{nULZqrkqJTqYq#k0OYfnSC_4Ck+< zb1<6gn4`_q9KLdT4ds<`x0uhugVk0^nhy#ixCcKu|M>p%wp+I8eUvuy8%VJl8 z>v^Pu75hYJPF=;ufB}bHc~bI)kWz$F%rD#-mvIUiD~(77-ryeAY;{bgjGvf&jg9Q# zP1F)xf5nCx&QB>l1G-M%1vc~)V@>+%s&gVc1miee)?V2i@Y=!MsvSJtV(in^X^kcg zhipl2ToPWyq=&Nnf!wd=zO||Rw490w6>?Jalz|Bx? zn69~4^%9GMos0($3un3ZKcS~;IXZ35`Wvzv`dpYZUJSF;+DHnSe#jGXN~4E9rO~5z zXV5>d_wg-ufX&e{rBb+*Y1`93dl&WMM&_VMIf}1XcStVR54O1a)*i}dW}0Et$9jf0 zLI;`2#)3<&jZ`fr5L|39&U37cD1{3RORjFCxd-gfPS&dwrdf{#X>q3FDS7yf{^tqk z>c}3LZk36*o^AES2-AbP^(VsCF-E=g!aLyRoup7Q(Bo(3!I@o$wO0QuW1$5^lH*+-x>{GC(hP4Fp0rfK+96Lx*cN{bC|Lhu zgDI*2U|cS*b+*e5i2qd)?&1XqeY|6#Q#*#2PV!3S6KQmWYB=v^VA_eR1`N&CL#1@k zC!q{?#T0a!ia@bJ85AK;-FhtXl<_BaBm3U%U&fCfSkACWJ-A{F z{1Obq@4J$b{R{(nj2oUK+{Z1>(yS3v=%igl`rp>C@=iqsAQo zHTQ8NQd~|pJd0m{8I&wO)+Ms>TF-~`EWTB$$)ImaBLulV-|-T)gMqr9DMHFhq9)d= z6Ohl2!hxB>b=N-0iU)axZQQFd*g9@VagF528t$CPL%@0(l~^7?6?-Q#g< zEX~hF<_y4C{lANM3AzeS3;$j~^2zk$-|HE@o~^bRjA)JG5=+nHWDY45uKo}$oRE^~ z8Q_uO!Tel`kRsg7QtdlOQl^9h@x0!Tl8qH5f(Pu9f!Eq1jgEsN$qSCELdS0=cC3G! ze$1gV&KpN~MLkf-stW6VC#C`Tg!lmcYB!X;z%{S^j5;`MhnG zpzXn$W5h5*0bfGn9>5 zqC6ccYtCUAzEs+)<_XHzKy=+q2Pn1yA4&%0O;APj)1ZjE&73^H&j@+xuj^LjMR}@L z{}?KIe=w;yn@k!Uymh%8DjTW&)?3n39MotwSr~mQ`jMRJXELki)Bc}(tlWUP);vK3 z@znYo*F25|LyDrWvj)5A0_nKnGQ7*5^AfKXO!an%JJ#`an{h4rmK`7W=lw$6ecE)t zYq8`dKJ92r6egI^d3zkgol*?WqiqY$W{r-dsyLiBJg}>e(yvYh5=!={Zu35a9*S|&S zSTATBS}1s|rt37)w2Z^M0O{0M%Mc6Sg#Pek{ClCLxNojRyDHQhYn+_}^pt)|q6cVQ zPXulLcFev4sn%cylBE$`Wb)5C6Qu|QVRBb~Rq?lD8OV0X6PU2)T~y_#>H5~Q%liI( zvB$h0g>u!TYSjDyb*r}Y#Nmv^ie`j*l_r|XVbvI}D6Xf9rI}@oAMjbw6KyH=DO;E2 zAfmfrOUm|{gF4mF^TPJj8ENv>E!R40aoV~)aK0E&KX}i*>>d6Q|?F+`g|UhG%+R%8K(;07itz7B9cD*{O+Q zcdfZ<$p@D*0@?#|W7)2Q#bbq(NnfXGL!9(qF83ktzROxQwWckE1zi}23`oJAb7iVI zUQ265H>?rEV`Mc#Q+k;m1Dchq~=PBC*R>deKdygH0 z)!ulMcf0X>r>z!Iws#y4;-S)3uP7gUS5bW4UvtAp`MmvBQ&xp2ANadbU#|a{zXT83 zXRhw!p~6;SZ;(R4sNrKj3GK(~PIzvV?On%$q%!~kJkVaE6Z!LxCW_9q1mLNjgvIFY zEvs=}EK5D&1Lp;ZKIxW_Sm{0_wBRBA5#5ihq}7u^pza(NB!eH}<+WMlsDd4c z?9>baCA&63fEoXo`G8(tuiUvCL<#89&D`nB&>h^fpo1?VDp3erFBGNr;Srg&QZhlu9^lj{V`JmbXJ^*N4C)=uYY7&dea@de(sB@OMh{_LboR) zzLoa!`tcSJx@2)8IRzA}O@d`ZzI+JRTb%=+0idfp_3$J7w%Ph9d5-inJD4ocMS~+k zM*N$Ff-bqBgY;ui{p**Dd*8eT1Nd7(&l>2`_5Dg1RWs{`^q~>4dv1L@{qZ||pTu&n zxp^L(8x4J9;_K}CcFsR}_3ezu(kg(;N+>e5tK8MN=*I`H&Hv!R) zP5MCzm2VT2dD#AV;>Nfg@c97eq_`*RvEVxQF`(d=jPYn;*nrOx;draJq(7=A@F+o! zgn>@b^Zjw2T;>XVHWmjm`GfiRUDV~{SI0}gwLXTGrQdw$u3YtX$t}C39-DC=PZTrf zqqh<;cOOiJ;?8pg*f#*_Lx|RKo-6FJFM?_|?tV2_vb5gU$70nz&a&(Onr>P_BIx#ULw0*QNBf6cj}#Y3q%SlEm@qXdEM#zv5cfFV|zSc z{pa2P(Zh<-)+UmiX36$#V`gN0kKWRyNopV#&c$w;6J{9qdyu=Q%OA%-_u1Qz=r7T$ zuY#XzCIN;WF9YPva>HPMZcf|#Guu+{vfvBmLN|`v!|7fl86r;YXRd|ZfmL#2uWM1I ziSPLl;?W##L{oY z>G4V+#w#)x*6XuSt+IAbcj=)H#0g|4# zyB$EuzPlnld%L6B*x5{zE z`slv@z5fr&d-l#s|0BwKYX9X72OV695cI_~F%$^5PZKBHa62xqiE9}>~ zW%gych5DYsV4JlwM-HGk^l~Ja0!d4pZhYXM)?ns_Q{3n>fh;%HMO1nAOsB`i9BF+V z|BW|fyPW3{KrgN^wzC~t&<`A!jE z2aer1EjE_95?-|EvoU2gXvm4%5$@hlSZ$q0@U7~X7)aCOIEwN zQKySTI@&#v_J+qdPq&BGL#Sm22t$ib(bm>a&`dW^(ALPh2}5lKAt^+f5UH~84Xh0% zWuq8uh!GPkyl=mHvgfqB5obSiHRNQnr`N$W=%!6r6$e7&AQv9GZobC}Uir@Ue^?;V zgft4}Bkhep05_`-v8UZ=44WZXvhd^Xgt07;=a{j#P{6}lCCNShxl8ys_}!go=f{C! zE%#PG(Vz$JAFAG}Gl|z3WAT3+WNb7mK*cH~7q$vbs!u$Czmi}sEbi=K(0}AjWxfHL zFVamj)9GOqoL{~Dgf~hAODg~%C=4WP0^_$`&O)0v{93rivh*SD*T=Z z)pt=tEqCg;6D@=nJZ*Qe@)J?_cmsV3Jg7JuqX#C0=_yE%EghQnvzT{RA{6yLq7_SH zIbs&!(YcH$R3Czj7I7o!$_Dk|T{!y`woB!%gxtB@Z=)kPh7dgt3difAp2ja6CU1k< z04xpIm=}=?W*e4<<^M0?H1SweAKi$hvER28KnKpQu)N91;&UHd$C*?SuaGiSYkF2E zz8Nmqxg97Z>!oV-#_XSF2;?0dSb*wIPwvtk%_n?T&iF7|7A$jvF5%C3gMKlT;#9?c zz5T>xgmI+v8?a}3V{RMd^5?i;bkB6XvAqjvL?eU_j^3es`2rp_sV6B7Qh2P&u}N|s zm!LMrq$w$F{NV<@js7tMc+9ZbdoC$m*?)??w?YTah9|&ToFXCIhvQzS?wD;XF_vTV znpx5?1rJOK<`~O*bW{WU-|=!|&pOF@z%PfsXdu?{`7Mt}6K(p{PHNA_ec{Tsgs1iU zjr*^Uika#Erx@JzKgDYPQ!G6IB!9jZ9%_c`k^~-uYCTBtsNbO7i)<2}ZzO=nLLM^^ zDvud&H)DYR+wu7`eWgY!O^S6)`TiZLbdNvdrBR-*DUrH5Dd(SO&!4f+0A5cyW?HJR zmh=x^pOB-l^$*&vsJv1mMi0pOoQ}RTi^Riy&L~`Glii>+

JRx#86?<9h~6sgb~p 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 diff --git a/GUIs/grandaverager_DQ.m b/GUIs/grandaverager_DQ.m index d21a8c89..ef3197b2 100755 --- a/GUIs/grandaverager_DQ.m +++ b/GUIs/grandaverager_DQ.m @@ -370,8 +370,9 @@ function pushbutton_apply_Callback(hObject, eventdata, handles) else % DQ mismatch beep - errordlg('Not all requested measures are present in all ERPsets to be averaged. Please check requested measures and ERPsets.') - pause(0.1) +% errordlg('Not all requested measures are present in all ERPsets to be averaged. Please check requested measures and ERPsets.') + errordlg('ERPLAB cannot average the data quality measures across ERPsets unless all ERPsets have the same data quality measures. The data quality measures are not identical across the selected ERPsets, so this grand average cannot be computed. You can either make sure that all selected ERPsets have the same data quality measures, or you can disable the computation of data quality measures in the grand average.') + pause(0.1);%%GH Feb 20 2024 end diff --git a/GUIs/gui_eegtrim.m b/GUIs/gui_eegtrim.m index 9f661db1..1b27d4d8 100755 --- a/GUIs/gui_eegtrim.m +++ b/GUIs/gui_eegtrim.m @@ -35,9 +35,23 @@ function gui_eegtrim_OpeningFcn(hObject, eventdata, handles, varargin) % % Name & version % +ERPtooltype = erpgettoolversion('tooltype'); +if ~isempty(ERPtooltype) + if strcmpi(ERPtooltype,'EStudio') + Toolabel = 1;%%Get label from work space to confirm whether EStudio was executed. + else + Toolabel = 0; + end +else + Toolabel = 0; +end + version = geterplabversion; +if Toolabel==1 + set(handles.gui_chassis,'Name', ['EStudio ' version ' - Data Trimmer GUI']) +else set(handles.gui_chassis,'Name', ['ERPLAB ' version ' - Data Trimmer GUI']) - +end % memory set(handles.edit_pretime, 'String', sprintf('%g', pretime)); set(handles.edit_posttime, 'String', sprintf('%g', posttime)); diff --git a/GUIs/gui_erplabShiftEventCodes.m b/GUIs/gui_erplabShiftEventCodes.m index 9ed7a6a2..11e33ef4 100755 --- a/GUIs/gui_erplabShiftEventCodes.m +++ b/GUIs/gui_erplabShiftEventCodes.m @@ -1,4 +1,4 @@ - function varargout = gui_erplabShiftEventCodes(varargin) +function varargout = gui_erplabShiftEventCodes(varargin) % GUI_ERPLABSHIFTEVENTCODES MATLAB code for gui_erplabShiftEventCodes.fig % GUI_ERPLABSHIFTEVENTCODES, by itself, creates a new GUI_ERPLABSHIFTEVENTCODES or raises the existing % singleton*. @@ -27,11 +27,11 @@ % Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... - 'gui_Singleton', gui_Singleton, ... - 'gui_OpeningFcn', @gui_erplabShiftEventCodes_OpeningFcn, ... - 'gui_OutputFcn', @gui_erplabShiftEventCodes_OutputFcn, ... - 'gui_LayoutFcn', [] , ... - 'gui_Callback', []); + 'gui_Singleton', gui_Singleton, ... + 'gui_OpeningFcn', @gui_erplabShiftEventCodes_OpeningFcn, ... + 'gui_OutputFcn', @gui_erplabShiftEventCodes_OutputFcn, ... + 'gui_LayoutFcn', [] , ... + 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end @@ -74,7 +74,7 @@ function gui_erplabShiftEventCodes_OpeningFcn(hObject, eventdata, handles, varar if iscell(handles.eventcodes) handles.eventcodes_txt = strjoin(handles.eventcodes, ','); else - handles.eventcodes_txt = handles.eventcodes; + handles.eventcodes_txt = handles.eventcodes; end set(handles.editboxEventCodes, ... @@ -101,6 +101,14 @@ function gui_erplabShiftEventCodes_OpeningFcn(hObject, eventdata, handles, varar 'SelectedObject', handles.radioBtnRoundEarlier); end +ERPtooltype = erpgettoolversion('tooltype');%%GH Jan 2024 +if strcmpi(ERPtooltype,'EStudio') + handles.checkbox_displayEEG.Enable = 'off'; + handles.checkbox_displayEEG.Value = 0; +else + handles.checkbox_displayEEG.Enable = 'on'; +end%%end + % Set Window title windowTitle = ['ERPLAB ' geterplabversion() ' - Shift Event Codes GUI']; @@ -168,7 +176,7 @@ function pushbutton_shiftEvents_Callback(hObject, eventdata, handles) %#ok<*DEFN % editString = editString(~cellfun('isempty',editString)); % handles.eventcodes = (editString); % end -% +% %handles.eventcodes = str2num(editString); %#ok % Save the input variables to output @@ -193,7 +201,7 @@ function pushbutton_cancel_Callback(hObject, eventdata, handles) disp('User selected Cancel') % Clear all input variables -handles.output = []; +handles.output = []; % Update handles structure guidata(hObject, handles); @@ -201,7 +209,7 @@ function pushbutton_cancel_Callback(hObject, eventdata, handles) % --- Executes when selected object changed in uipanelRounding. function uipanelRounding_SelectionChangedFcn(hObject, eventdata, handles) -% hObject handle to the selected object in uipanelRounding +% hObject handle to the selected object in uipanelRounding % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) @@ -239,8 +247,8 @@ function editboxEventCodes_Callback(hObject, eventdata, handles) % Strip any non-numeric token and replace w/ whitespace (' ') %editString = regexprep(get(hObject,'String'), '[^0-9:]', ' '); -%in 2023, accept both non-numeric and numeric ecodes -try +%in 2023, accept both non-numeric and numeric ecodes +try editString = eval(num2str(get(hObject,'String'))); %if numeric catch editString = regexp(get(hObject,'String'),'(?<=\d)\s(?=\d)|,\s*','split'); %remove commas if exist @@ -248,19 +256,18 @@ function editboxEventCodes_Callback(hObject, eventdata, handles) end %handles.eventcodes = str2num(editString); %#ok %numeric events -need_to_flat = 0; +need_to_flat = 0; for ec = 1:length(editString); - try - + try temp_nums = num2cell(eval(num2str(editString{ec}))); %evaluate & flatten any numeric expression editString{ec} = cellfun(@num2str,temp_nums,'UniformOutput',false); %change to string - need_to_flat = 1; + need_to_flat = 1; catch - end + end end - + %flatten cell array if need_to_flat == 1 editString =[editString{:}]; @@ -315,7 +322,7 @@ function checkbox_displayEEG_Callback(hObject, eventdata, handles) % Hint: get(hObject,'Value') returns toggle state of checkbox_displayEEG % returns contents of editbox_EndEventCodeBufferMS as a double -handles.displayEEG = get(hObject,'Value'); +handles.displayEEG = get(hObject,'Value'); % Save the new value guidata(hObject,handles); diff --git a/GUIs/saveRTGUI.fig b/GUIs/saveRTGUI.fig index ab3a5b33be86e2e9728220d28a58e5c3bf7b892b..6bd3b9c4bbb95fdbd3958aa7c84744867a97d86d 100755 GIT binary patch literal 15219 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 delta 5066 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 diff --git a/GUIs/saveRTGUI.m b/GUIs/saveRTGUI.m index b880ec8d..14c0b213 100755 --- a/GUIs/saveRTGUI.m +++ b/GUIs/saveRTGUI.m @@ -69,7 +69,7 @@ function saveRTGUI_OpeningFcn(hObject, eventdata, handles, varargin) % Name & version % version = geterplabversion; -set(handles.gui_chassis,'Name', ['ERPLAB ' version ' - Save Reaction Time GUI']) +% set(handles.gui_chassis,'Name', ['ERPLAB ' version ' - Save Reaction Time GUI']) set(handles.edit_saveas,'String', filename) set(handles.checkbox_header,'Value', header) @@ -79,6 +79,15 @@ function saveRTGUI_OpeningFcn(hObject, eventdata, handles, varargin) set(handles.popupmenu_elindex,'String', cellstr(num2str([1:numEL]'))) set(handles.popupmenu_elindex,'Value', indexel) +ERPtooltype = erpgettoolversion('tooltype');%%GH Jan 2024 +if strcmpi(ERPtooltype,'EStudio') + handles.uipanel1.Title = 'File name suffix (will be added to dataset name)'; + set(handles.gui_chassis,'Name', ['Estudio ' version ' - Save Reaction Time GUI']) +else + handles.uipanel1.Title = 'File name'; + set(handles.gui_chassis,'Name', ['ERPLAB ' version ' - Save Reaction Time GUI']) +end%%end + % % Color GUI % diff --git a/GUIs/scalplotGUI.fig b/GUIs/scalplotGUI.fig index fa559078d4c32db2bc947dce63e8c8c0204081e8..1ee5d4e7ae67a2e5eb8f4f465704e2883170f5e3 100755 GIT binary patch literal 45386 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 Ym$reK-8AJtac6&-DX_5Yet2&Fe?ri9qyPW_ diff --git a/README.md b/README.md index cdd2def7..ab433e38 100755 --- a/README.md +++ b/README.md @@ -4,10 +4,10 @@ Click the Wiki icon at the top of the page for documentation, tutorials, and FAQ

To ask questions, subscribe to the ERPLAB email list (https://erpinfo.org/erplab-email-list). Bug reports can be submitted via GitHub or by sending an email to erplab-bugreports@ucdavis.edu. -## ERPLAB v10.11 +## ERPLAB v11

- +
@@ -15,56 +15,34 @@ To ask questions, subscribe to the ERPLAB email list (https://erpinfo.org/erplab

-To install ERPLAB v10.11, download the zip file (linked above), unzip and place the folder in the 'plugins' folder of your existing [EEGLAB](https://sccn.ucsd.edu/eeglab/download.php) installation (e.g. `/Users/Steve/Documents/MATLAB/eeglab2019_1/plugins/erplab/`). More [installation help can be found here](https://github.com/lucklab/erplab/wiki/Installation). +This download contains both [ERPLAB Studio](./ERPLAB-Studio-Manual) (our standalone Matlab program) and [ERPLAB Classic](./Manual) (an EEGLAB plugin). If you are new to ERPLAB, we strongly recommend that you go through the [ERPLAB Studio Tutorial](./ERPLAB-Studio-Tutorial) or ERPLAB Classic Tutorial before trying to analyze your own data. -To run ERPLAB, ensure that the correct EEGLAB folder is in your current Matlab path, and run `eeglab` as a command from the Matlab Command Window. If you are new to ERPLAB, we strongly recommend that you go through the [ERPLAB Tutorial](https://github.com/lucklab/erplab/wiki/Tutorial) before using ERPLAB with your own data. +[Click here](./Installation) for installation instructions. + +[Click here](./Compatability-and-Required-Toolboxes) for information about required Matlab toolboxes and compatibility with different versions of Matlab, EEGLAB, Windows, MacOS, and Linux. We encourage most users to use this latest major version. - ---- -## Compatibility and Required Toolboxes - -We anticipate that ERPLAB will work with most recent OSs, Matlab versions and EEGLAB versions. - -- The [Matlab Signal Processing Toolbox](https://www.mathworks.com/products/signal.html) is required. -- [EEGLAB v2021 or later](https://sccn.ucsd.edu/eeglab/download.php) is almost always necessary. - -However, in order to use the latest MVPC routines (see [here](https://github.com/ucdavis/erplab/wiki/Decoding-Tutorial)), Matlab versions and EEGLAB versions must be recent. In addition, some MATLAB toolboxes are required. -- Matlab 2020b + is REQUIRED for MVPC routines. -- EEGLAB 2023.1 + is REQUIRED for MVPC routines. -- The [Matlab Statistics and Machine Learning Toolbox](https://www.mathworks.com/products/statistics.html) -- The [Matlab Parallel Processing Toolbox](https://www.mathworks.com/products/parallel-computing.html) (recommended) - -Find [more ERPLAB installation help here](http://erpinfo.org/erplab). - - -### ERPLAB compatibility table - -Here is a list of some confirmed-working environments for ERPLAB. - -**ERPLAB v10.0+ works with...** -| **OS** | **Matlab** | **EEGLAB** | Working? | -| --- | --- | --- | --- | -| Mac OS 14.2.1 'Sonoma' | Matlab R 2023a | EEGLAB v2023.1 | ✓| -| Mac OS 11.7.6 'Big Sur' | Matlab R 2020a | EEGLAB v2023.0 | ✓| -| Mac OS 10.15.7 'Catalina' | Matlab R2020b | EEGLAB v2023.0 | ✓ | -| Mac OS 10.15 'Catalina' | Matlab R2016a | EEGLAB v2019_1 | ✓ | -(https://www.mathworks.com/downloads/web_downloads/download_update?release=R2018a&s_tid=ebrg_R2018a_2_1757132&s_tid=mwa_osa_a) | -| Mac OS 10.13.5 'High Sierra' | Matlab R2015a | EEGLAB v14.1.2 | ✓ | -| Windows 10 | Matlab R2021a | EEGLAB v2023.0 | ✓ | -| Windows 10 | Matlab R2020b | EEGLAB v2021.1 | ✓ | -| Ubuntu 18.04 LTS | Matlab R2019a | EEGLAB v2020 | ✓ | -| Ubuntu 18.04 LTS | Matlab R2019a | EEGLAB v2019_1 | ✓ | - -ERPLAB should work with most modern OSs, Matlab versions, and EEGLAB releases. Let us know if you see any incompatibility. -**Starting in ERPLAB v10.0, MATLAB'S "App Designer" was the default GUI system used for the MVPC routines and require at least MATLAB 2020a+ & EEGLAB 2023.1+ in order to work as expected.** -

## Release Notes +### ERPLAB v11.0 Release Notes + +ERPLAB can now be accessed from two different user interfaces: +- [ERPLAB Classic](./Manual) (our original software, which operates as an EEGLAB plugin) +- [ERPLAB Studio](./ERPLAB-Studio-Manual) (a standalone application that provides a more user-friendly GUI) + +ERPLAB Studio makes use of the same underlying code as EEGLAB and ERPLAB Classic. It is essentially a different user interface for the same functions. You will therefore get identical results with ERPLAB Studio and ERPLAB Classic, and scripting is the same for both packages. But ERPLAB Studio is much easier to use. + +[Click here](https://www.youtube.com/watch?v=lIaKVQ9DD6E) for a 2-minute video overview of ERPLAB Studio. + +The most commonly used EEGLAB functions are available from within ERPLAB Studio. For example, you can import EEG data into ERPLAB Studio, filter the EEG, apply ICA for artifact correction, etc. If you need an EEGLAB function that is not implemented within ERPLAB Studio, you can apply that function using the EEGLAB GUI or a script. + +If you are already familiar with ERPLAB, you can rapidly learn how to use ERPLAB Studio with our [Transition Guide](). If you are new to ERPLAB, please go through the [ERPLAB Studio Tutorial](./ERPLAB-Studio-Tutorial) before attempting to process your own data. Once you understand the basics of ERPLAB Studio, you can get detailed information about the individual processing steps in the [ERPLAB Studio Manual](./ERPLAB-Studio-Manual). + + ### ERPLAB v10.1 Release Notes Now Includes: Update to decoding toolbox. By default, beta weights will no longer be saved with MVPC files, dramatically reducing file size. diff --git a/eegplugin_erplab.m b/eegplugin_erplab.m index c0d851e6..fc6bc192 100755 --- a/eegplugin_erplab.m +++ b/eegplugin_erplab.m @@ -1,10 +1,10 @@ -% Author: Aaron Matthew Simmons, Guanghui Zhang, David R Garrett, -% Andrew X Stewart, Javier Lopez-Calderon & Steven Luck +% Author: Aaron Matthew Simmons, Guanghui Zhang, Andrew X Stewart, +% Javier Lopez-Calderon & Steven Luck % Center for Mind and Brain % University of California, Davis, % Davis, CA -% 2007-2024 -% Version 10.1 +% 2007-2023 +% Version 10.0 %b8d3721ed219e65100184c6b95db209bb8d3721ed219e65100184c6b95db209b % @@ -64,8 +64,13 @@ catch end +%%running erplab%%GH 2024 +p_location = which('o_ERPDAT'); +p_location = p_location(1:findstr(p_location,'o_ERPDAT.m')-1); +tooltype = 'ERPLAB'; +save(fullfile(p_location,'erplab_running_version.erpm'),'tooltype'); + -%erplab_running_version('Version',erplabver,'tooltype','ERPLAB');%%GH,Mar 2023 global observe_EEGDAT; observe_EEGDAT = o_EEGDATA; @@ -87,6 +92,7 @@ observe_ERPDAT.Count_ERP = 0; observe_ERPDAT.Count_currentERP = 0; observe_ERPDAT.Process_messg = 0;%%change end +observe_ERPDAT.erp_between_panels = 0; % % CHECK VERSION NUMBER & FOLDER NAME @@ -105,11 +111,6 @@ fprintf('\nERPLAB''s folder does not show the current version number.\n') end -%%running estudio -p_location = which('o_ERPDAT'); -p_location = p_location(1:findstr(p_location,'o_ERPDAT.m')-1); -tooltype = 'erplab'; -save(fullfile(p_location,'erplab_running_version.erpm'),'tooltype'); % % CHECK EEGLAB Version @@ -200,7 +201,7 @@ ERP = []; % Start ERP Structure on workspace ALLERPCOM = []; CURRENTERP = 0; -BEST = []; %Start BEST structure on workspace +BEST = []; %Start BEST structure on workspace CURRENTBEST = 0; plotset.ptime = []; plotset.pscalp = []; @@ -293,10 +294,10 @@ comDeleteTimeSegments = [trystrs.no_check '[EEG, LASTCOM] = pop_erplabDeleteTimeSegments(EEG);' catchstrs.new_and_hist]; comRemoveResponseMistakes = [trystrs.no_check '[ALLEEG,EEG,LASTCOM] = pop_remove_response_mistakes(ALLEEG,EEG,CURRENTSET);' catchstrs.new_and_hist]; comInterpolateElectrodes = [trystrs.no_check '[EEG, LASTCOM] = pop_erplabInterpolateElectrodes(EEG);' catchstrs.new_and_hist]; -%comDFT = [trystrs.no_check '[EEG, fft_out, LASTCOM] = pop_continuousFFT(EEG);' catchstrs.add_to_hist]; comDFT = ['[EEG, fft_out, LASTCOM] = pop_continuousFFT(EEG);']; + % % EVENTLIST callback % diff --git a/erplab_default_values.m b/erplab_default_values.m index d1a4a294..4c9a07c8 100755 --- a/erplab_default_values.m +++ b/erplab_default_values.m @@ -1,5 +1,5 @@ -erplabver = '10.11'; % current erplab version -erplabrel = '17-May-2024'; % DOB +erplabver = '11'; % current erplab version +erplabrel = '10-June-2024'; % DOB erplabdeveloper = 'Simmons,Zhang,Garrett'; %ColorB = [170 180 195]/255; % old background color (until version 3) %ColorB = [0.9216 0.8353 0.6078]; % background color for version 4 diff --git a/functions/averager.m b/functions/averager.m index de43db75..6f5367ac 100755 --- a/functions/averager.m +++ b/functions/averager.m @@ -66,7 +66,12 @@ end if nargin<8 - avgText = 1; + ERPtooltype = erpgettoolversion('tooltype'); + if strcmpi(ERPtooltype,'EStudio') + avgText = 0; + else + avgText = 1; + end end if nargin<7 @@ -401,9 +406,9 @@ if stderror == 1 sample_SD_rearrange = sqrt((sumERP2(:,:,k) - N*ERP.bindata(:,:,k).^2)/(N-1)); % get ERP's standard deviation elseif stderror == 2 %corrected point-wise SEM - sample_SD_rearrange = sqrt((sumERP2(:,:,k) - N*ERP.bindata(:,:,k).^2)/(N-(3/2)+(1/(8*(N-1))))); + sample_SD_rearrange = sqrt((sumERP2(:,:,k) - N*ERP.bindata(:,:,k).^2)/(N-(3/2)+(1/(8*(N-1))))); end - + % The Standard Error of the Mean is then: ERP.binerror(:,:,k) = sample_SD_rearrange./sqrt(N); % get ERP's standard error end @@ -441,7 +446,7 @@ ERP.datatype = 'TFFT'; end ERP.pnts = size(ERP.bindata, 2); -if ~iscell(artcrite) +if ~iscell(artcrite) && avgText == 1 fprintf('----------------------------------------------------------------------------------------\n'); else countbiORI = countbinOK; @@ -472,8 +477,8 @@ tapwin(s1:s2,1) = hann(winpnts); case 'blackmanharris' tapwin(s1:s2,1) = blackmanharris(winpnts); - case 'rectangular' - tapwin(s1:s2,1) = rectwin(winpnts); + case 'rectangular' + tapwin(s1:s2,1) = rectwin(winpnts); otherwise error('Invalid taper function name (only ''Hamming'', ''Hanning'', ''blackmanharris'' or ''rectangular'' can be used)') end diff --git a/functions/delerpchan.m b/functions/delerpchan.m index 4061f184..83aaad13 100755 --- a/functions/delerpchan.m +++ b/functions/delerpchan.m @@ -42,39 +42,39 @@ cherror = 0; if nargin<1 - help avgchan - return + help avgchan + return end if ~iserpstruct(ERP) - error('ERPLAB says: delerpchan() only works with ERP structure.') + error('ERPLAB says: delerpchan() only works with ERP structure.') end if ischar(chin) - chin = str2num(char(regexp(chin,'\d+','match')'))'; + chin = str2num(char(regexp(chin,'\d+','match')'))'; end if size(chin,1)>1 - error('ERPLAB says: error, delerpchan works with row-array inputs') + error('ERPLAB says: error, delerpchan works with row-array inputs') end chanarray = unique_bc2(chin); if length(chanarray)~=length(chin) - fprintf('\n*** WARNING: Repeated channels were ignored.\n\n') + fprintf('\n*** WARNING: Repeated channels were ignored.\n\n') end nchan = ERP.nchan; if max(chanarray)>nchan - error('ERPLAB says: error at delerpchan. Some specified channels do not exist!') + error('ERPLAB says: error at delerpchan. Some specified channels do not exist!') end ERP.bindata(chanarray,:,:)=[]; -if ~isempty(ERP.binerror) %% GH March 2024 +if ~isempty(ERP.binerror)%%GH Mar 2024 ERP.binerror(chanarray,:,:)=[]; end ERP.nchan = size(ERP.bindata, 1); if isfield(ERP.chanlocs, 'labels') - if ~isempty([ERP.chanlocs.labels]) - labaux = {ERP.chanlocs.labels}; - [labaux{chanarray}] = deal([]); - indxl = ~cellfun(@isempty, labaux); - labelout = labaux(indxl); - ERP.chanlocs = []; - [ERP.chanlocs(1:ERP.nchan).labels] = labelout{:}; - end + if ~isempty([ERP.chanlocs.labels]) + labaux = {ERP.chanlocs.labels}; + [labaux{chanarray}] = deal([]); + indxl = ~cellfun(@isempty, labaux); + labelout = labaux(indxl); + ERP.chanlocs = []; + [ERP.chanlocs(1:ERP.nchan).labels] = labelout{:}; + end end diff --git a/functions/erpworkingmemory.m b/functions/erpworkingmemory.m index a123ea27..677c4245 100755 --- a/functions/erpworkingmemory.m +++ b/functions/erpworkingmemory.m @@ -65,17 +65,6 @@ vmemoryerp = []; end -ERPtooltype = erpgettoolversion('tooltype'); -if ~isempty(ERPtooltype) - if strcmpi(ERPtooltype,'EStudio') - Toolabel = 1;%%Get label from work space to confirm whether EStudio was executed. - else - Toolabel = 0; - end -else - Toolabel = 1; -end - if nargin==1 % read if ~isempty(vmemoryerp) % variable at the workspace for storing/reading memory @@ -98,25 +87,12 @@ end else % file for storing/reading memory try - if Toolabel==1%%When using EStudio - p = which('o_ERPDAT'); - p = p(1:findstr(p,'o_ERPDAT.m')-1); - v = load(fullfile(p,'memoryerpstudio.erpm'), '-mat'); - else%%When using ERPLAB - p = which('eegplugin_erplab'); - p = p(1:findstr(p,'eegplugin_erplab.m')-1); - v = load(fullfile(p,'memoryerp.erpm'), '-mat'); - end + p = which('eegplugin_erplab'); + p = p(1:findstr(p,'eegplugin_erplab.m')-1); + v = load(fullfile(p,'memoryerp.erpm'), '-mat'); catch - if Toolabel==1%%When using EStudio - msgboxText = ['ERPLAB Studio (erpworkingmemory.m) could not find "memoryerpstudio.erpm" or does not have permission for reading it.\n'... - 'Please, run EEGLAB once again or go to ERPLAB''s Setting menu and specify/create a new memory file.\n']; - else - msgboxText = ['ERPLAB Studio (erpworkingmemory.m) could not find "memoryerpstudio.erpm" or does not have permission for reading it.\n'... - 'Please, run EEGLAB Studio once again or go to EStudio''s Setting menu and specify/create a new memory file.\n']; - - end - + msgboxText = ['ERPLAB Studio (erpworkingmemory.m) could not find "memoryerpstudio.erpm" or does not have permission for reading it.\n'... + 'Please, run EEGLAB Studio once again or go to EStudio''s Setting menu and specify/create a new memory file.\n']; try cprintf([0.45 0.45 0.45], msgboxText'); catch @@ -148,26 +124,16 @@ end else % file for storing/reading memory try - if Toolabel==1%%When using EStudio - eval([field '=input2store;']) - p = which('o_ERPDAT'); - p = p(1:findstr(p,'o_ERPDAT.m')-1); - save(fullfile(p,'memoryerpstudio.erpm'), field,'-append'); - - else%%When using ERPLAB - eval([field '=input2store;']) - p = which('eegplugin_erplab'); - p = p(1:findstr(p,'eegplugin_erplab.m')-1); - save(fullfile(p,'memoryerp.erpm'), field,'-append'); - end + + eval([field '=input2store;']) + p = which('eegplugin_erplab'); + p = p(1:findstr(p,'eegplugin_erplab.m')-1); + save(fullfile(p,'memoryerp.erpm'), field,'-append'); + catch - if Toolabel==1%%When using EStudio - msgboxText = ['ERPLAB Studio could not find "memoryerpstudio.erpm" or does not have permission for writting on it.\n'... - 'Please, run EEGLAB Studio once again or go to EStudio''s Setting menu and specify/create a new memory file.\n']; - else - msgboxText = ['ERPLAB could not find "memoryerp.erpm" or does not have permission for writting on it.\n'... - 'Please, run EEGLAB once again or go to ERPLAB''s Setting menu and specify/create a new memory file.\n']; - end + + msgboxText = ['ERPLAB could not find "memoryerp.erpm" or does not have permission for writting on it.\n'... + 'Please, run EEGLAB once again or go to ERPLAB''s Setting menu and specify/create a new memory file.\n']; try cprintf([0.45 0.45 0.45], msgboxText'); catch diff --git a/functions/filterp.m b/functions/filterp.m index 57f41738..a4db05b8 100755 --- a/functions/filterp.m +++ b/functions/filterp.m @@ -48,106 +48,114 @@ % You should have received a copy of the GNU General Public License % along with this program. If not, see . -function ERP = filterp(ERP, chanArray, locutoff, hicutoff, filterorder, typef, remove_dc) +function ERP = filterp(ERP, chanArray, locutoff, hicutoff, filterorder, typef, remove_dc,binArray) if nargin < 1 - help filterp - return + help filterp + return end if exist('filtfilt','file') ~= 2 - disp('filterp error: cannot find the Signal Processing Toolbox'); - return + disp('filterp error: cannot find the Signal Processing Toolbox'); + return end if isempty(ERP.bindata) - disp('filterp error: cannot filter an empty erpset') - return + disp('filterp error: cannot filter an empty erpset') + return end -if nargin < 7 - disp('filterp error: please, enter all arguments!') - return +if nargin < 8%%GH Apr. 2024 + disp('filterp error: please, enter all arguments!') + return end + + if ERP.pnts <= 3*filterorder - msgboxText = 'Error: The length of the data must be more than three times the filter order.'; - title = 'ERPLAB: filterp(), filtfilt constraint'; - errorfound(msgboxText, title); - return + msgboxText = 'Error: The length of the data must be more than three times the filter order.'; + title = 'ERPLAB: filterp(), filtfilt constraint'; + errorfound(msgboxText, title); + return end if locutoff == 0 && hicutoff == 0, - msgboxText = 'Error: What???? low cutoff == 0 && high cutoff == 0?'; - title = 'ERPLAB: filterp(), Cutoff frequency'; - errorfound(msgboxText, title); - return + msgboxText = 'Error: What???? low cutoff == 0 && high cutoff == 0?'; + title = 'ERPLAB: filterp(), Cutoff frequency'; + errorfound(msgboxText, title); + return end chanArray = unique_bc2(chanArray); % does not allow repeated channels fnyquist = 0.5*ERP.srate; % half sample rate pnts = size(ERP.bindata,2); numchan = length(chanArray); +binArray = unique_bc2(binArray);%%GH Apr. 2024 +nbin = ERP(1).nbin; +if isempty(binArray) || any(binArray(:)>nbin) || any(binArray(:)<1) + binArray = [1:nbin]; +end + if numchan>ERP.nchan - msgboxText = 'Error: You have selected more channels than are contained within your data!'; - title = 'ERPLAB: filterp() error:'; - errorfound(msgboxText, title); - return + msgboxText = 'Error: You have selected more channels than are contained within your data!'; + title = 'ERPLAB: filterp() error:'; + errorfound(msgboxText, title); + return end nbin = ERP.nbin; fprintf('Channels to be filtered : %s\n\n', vect2colon(chanArray, 'Delimiter', 'on')); if locutoff >= fnyquist - error('ERPLAB says: errot at filterp(). Low cutoff frequency cannot be >= srate/2'); + error('ERPLAB says: errot at filterp(). Low cutoff frequency cannot be >= srate/2'); end if hicutoff >= fnyquist - error('ERPLAB says: errot at filterp().High cutoff frequency cannot be >= srate/2'); + error('ERPLAB says: errot at filterp().High cutoff frequency cannot be >= srate/2'); end if ~typef && filterorder*3 > pnts % filtfilt restriction - fprintf('filterp: filter order too high'); - error('ERPLAB says: errot at filterp(). Samples must be at least 3 times the filter order.'); + fprintf('filterp: filter order too high'); + error('ERPLAB says: errot at filterp(). Samples must be at least 3 times the filter order.'); end if locutoff >0 % option in order to remove dc value is only for high-pass filtering - if remove_dc - disp('Removing DC bias from ERPs...') - for i = 1:nbin - auxdata = ERP.bindata(chanArray,:,i); - ERP.bindata(chanArray,:,i) = detrend(auxdata', 'constant')'; - end - fprintf('\n') + if remove_dc + disp('Removing DC bias from ERPs...') + for i = binArray + auxdata = ERP.bindata(chanArray,:,i); + ERP.bindata(chanArray,:,i) = detrend(auxdata', 'constant')'; end + fprintf('\n') + end end [b, a, labelf, v] = filter_tf(typef, filterorder, hicutoff, locutoff, ERP.srate); if ~v % something is wrong or turned off - msgboxText = 'filterp() error: Wrong parameters for filtering.'; - title = 'ERPLAB: filterp():'; - errorfound(msgboxText, title); - return + msgboxText = 'filterp() error: Wrong parameters for filtering.'; + title = 'ERPLAB: filterp():'; + errorfound(msgboxText, title); + return end disp([labelf ' filtering input data, please wait...']) -for j=1:nbin - if size(b,1)>1 - if strcmpi(labelf,'Band-Pass') - % Butterworth bandpass (cascade) - ERP.bindata(chanArray,:,j) = filtfilt(b(1,:),a(1,:), ERP.bindata(chanArray,:,j)')'; - ERP.bindata(chanArray,:,j) = filtfilt(b(2,:),a(2,:), ERP.bindata(chanArray,:,j)')'; - else - %Butterworth Notch (parallel) - datalowpass = filtfilt(b(1,:),a(1,:), ERP.bindata(chanArray,:,j)')'; - datahighpass = filtfilt(b(2,:),a(2,:), ERP.bindata(chanArray,:,j)')'; - ERP.bindata(chanArray,:,j) = datalowpass + datahighpass; - end +for j= binArray%%GH Apr. 2024 + if size(b,1)>1 + if strcmpi(labelf,'Band-Pass') + % Butterworth bandpass (cascade) + ERP.bindata(chanArray,:,j) = filtfilt(b(1,:),a(1,:), ERP.bindata(chanArray,:,j)')'; + ERP.bindata(chanArray,:,j) = filtfilt(b(2,:),a(2,:), ERP.bindata(chanArray,:,j)')'; else - % Butterworth lowpass) - % Butterworth highpass - % FIR lowpass - % FIR highpass - % FIR bandpass - % FIR notch - % Parks-McClellan Notch - ERP.bindata(chanArray,:,j) = filtfilt(b,a, ERP.bindata(chanArray,:,j)')'; + %Butterworth Notch (parallel) + datalowpass = filtfilt(b(1,:),a(1,:), ERP.bindata(chanArray,:,j)')'; + datahighpass = filtfilt(b(2,:),a(2,:), ERP.bindata(chanArray,:,j)')'; + ERP.bindata(chanArray,:,j) = datalowpass + datahighpass; end + else + % Butterworth lowpass) + % Butterworth highpass + % FIR lowpass + % FIR highpass + % FIR bandpass + % FIR notch + % Parks-McClellan Notch + ERP.bindata(chanArray,:,j) = filtfilt(b,a, ERP.bindata(chanArray,:,j)')'; + end end % @@ -155,14 +163,14 @@ % ERP = clear_dq(ERP); if isfield(ERP, 'binerror') - if ~isempty(ERP.binerror) - - if numchan ERP.binerror = []; - end + if ~isempty(ERP.binerror) + + if numchan ERP.binerror = []; end + end end ERP.isfilt = 1; diff --git a/functions/gaverager.m b/functions/gaverager.m old mode 100644 new mode 100755 index 71ee08c1..c25b88dd --- a/functions/gaverager.m +++ b/functions/gaverager.m @@ -122,8 +122,8 @@ % basic test for number of points (for now...) if pre_pnts ~= ERPT.pnts msgboxText = sprintf('Erpsets #%g and #%g have different number of points!', j-1, j); - msgboxText = sprintf([msgboxText,'\n','ERPset',32, num2str(j-1),32,'has',32,num2str(ALLERP(j-1).pnts),32,'points.\n',... - 'ERPset',32, num2str(j),32,'has',32,num2str(ALLERP(j).pnts),32,'points.\n']); + msgboxText = sprintf([msgboxText,'\n','ERPset',32, num2str(j-1),32,'has',32,num2str(ALLERP(j-1).pnts),32,'points (from',32,num2str(ALLERP(j-1).times(1)),32,'to',32,num2str(ALLERP(j-1).times(end)),'ms; fs=',num2str(ALLERP(j-1).srate),'Hz).\n',... + 'ERPset',32, num2str(j),32,'has',32,num2str(ALLERP(j).pnts),32,'points (from',32,num2str(ALLERP(j).times(1)),32,'to',32,num2str(ALLERP(j).times(end)),'ms; fs=',num2str(ALLERP(j).srate),'Hz).\n']); %title = 'ERPLAB: pop_gaverager() Error'; %errorfound(msgboxText, title); %return diff --git a/functions/geterpvalues.m b/functions/geterpvalues.m index 1ef90de5..e60d04c3 100755 --- a/functions/geterpvalues.m +++ b/functions/geterpvalues.m @@ -90,95 +90,95 @@ function varargout = geterpvalues(ERP, latency, binArray, chanArray, moption, blc, coi, polpeak, sampeak, localopt, frac, fracmearep, intfactor,peakonset) if nargin<1 - help geterpvalues - return + help geterpvalues + return end if nargin<2 - error('ERROR geterpvalues(): You must specify ERP struct and latency(ies), at least.') + error('ERROR geterpvalues(): You must specify ERP struct and latency(ies), at least.') end if nargin<14 peakonset = 1; end if nargin<13 - intfactor = 1; + intfactor = 1; end if nargin<12 - fracmearep = 0; %0=write a NaN when frac measure is not found. 1 = export frac absolute peak when frac local peak is not found.; 2=shows error message + fracmearep = 0; %0=write a NaN when frac measure is not found. 1 = export frac absolute peak when frac local peak is not found.; 2=shows error message end if nargin<11 - frac = 0.5; % 50% area latency (if needed, by default) + frac = 0.5; % 50% area latency (if needed, by default) end if nargin<10 - localopt = 0; % 0=write a NaN when local peak is not found. 1=export absolute peak when local peak is not found. + localopt = 0; % 0=write a NaN when local peak is not found. 1=export absolute peak when local peak is not found.; 2=shows error message end if nargin<9 - sampeak = 0; % absolute peak. No neighbor samples + sampeak = 0; % absolute peak. No neighbor samples end if nargin<8 - polpeak = 1; % positive + polpeak = 1; % positive end if nargin<7 - coi = 0; % 0= as it is; 1=first component; 2=2nd component + coi = 0; % 0= as it is; 1=first component; 2=2nd component end if nargin<6 - blc = 'pre'; + blc = 'pre'; end if nargin<5 - moption = 'instabl'; + moption = 'instabl'; end if nargin<4 - chanArray = 1:ERP.nchan; + chanArray = 1:ERP.nchan; end if nargin<3 - binArray = 1:ERP.nbin; + binArray = 1:ERP.nbin; end if ischar(blc) - blcnum = str2num(blc); - if isempty(blcnum) - if ~ismember_bc2(blc,{'no','none','pre','post','all','whole'}) - msgboxText = 'Invalid baseline range dude!'; - %title = 'ERPLAB: geterpvalues() baseline input'; - %errorfound(msgboxText, title); - %return - varargout{1} = msgboxText; - varargout{2} = []; - return - end - else - if size(blcnum,1)>1 || size(blcnum,2)>2 - msgboxText = 'Invalid baseline range, dude!'; - %title = 'ERPLAB: geterpvalues() baseline input'; - %errorfound(msgboxText, title); - %return - varargout{1} = msgboxText; - varargout{2} = []; - return - end + blcnum = str2num(blc); + if isempty(blcnum) + if ~ismember_bc2(blc,{'no','none','pre','post','all','whole'}) + msgboxText = 'Invalid baseline range dude!'; + %title = 'ERPLAB: geterpvalues() baseline input'; + %errorfound(msgboxText, title); + %return + varargout{1} = msgboxText; + varargout{2} = []; + return end + else + if size(blcnum,1)>1 || size(blcnum,2)>2 + msgboxText = 'Invalid baseline range, dude!'; + %title = 'ERPLAB: geterpvalues() baseline input'; + %errorfound(msgboxText, title); + %return + varargout{1} = msgboxText; + varargout{2} = []; + return + end + end end if ~ismember_bc2({moption}, {'instabl', 'meanbl', 'peakampbl', 'peaklatbl', 'fpeaklat',... - 'area','areat', 'areap', 'arean','areazt','areazp','areazn','fareatlat',... - 'fareaplat', 'fninteglat', 'fareanlat', 'ninteg','nintegz' }); - msgboxText = [moption ' is not a valid option for geterpvalues!']; - %title = 'ERPLAB: geterpvalues wrong inputs'; - %errorfound(msgboxText, title); - %return - varargout{1} = msgboxText; - varargout{2} = []; - return + 'area','areat', 'areap', 'arean','areazt','areazp','areazn','fareatlat',... + 'fareaplat', 'fninteglat', 'fareanlat', 'ninteg','nintegz' }); + msgboxText = [moption ' is not a valid option for geterpvalues!']; + %title = 'ERPLAB: geterpvalues wrong inputs'; + %errorfound(msgboxText, title); + %return + varargout{1} = msgboxText; + varargout{2} = []; + return end if isempty(coi) - coi = 1; + coi = 1; end if nargout==1 - condf = 0; % only includes area values + condf = 0; % only includes area values elseif nargout==2 - condf = 1; % include latency values and limits... + condf = 1; % include latency values and limits... else - error('ERPLAB says: error at geterpvalues(). Too many output arguments!') + error('ERPLAB says: error at geterpvalues(). Too many output arguments!') end if isempty(sampeak) - sampeak =0; + sampeak =0; end fs = ERP.srate; @@ -195,19 +195,19 @@ p1 = timeor(1); p2 = timeor(end); if intfactor~=1 - timex = linspace(p1,p2,round(pnts*intfactor)); - pnts = length(timex); - fs = round(fs*intfactor); + timex = linspace(p1,p2,round(pnts*intfactor)); + pnts = length(timex); + fs = round(fs*intfactor); else - timex = timeor; + timex = timeor; end msgboxText4peak = ['The requested measurement window is invalid given the number of points specified for finding a local peak '... - 'and the epoch length of the ERP waveform.\n\n You have specified a local peak over %g points, which means that '... - 'there must be %g sample points between the onset of your measurement window and the onset of the waveform, '... - 'and/or %g sample points between the end of your measurement window and the end of the waveform.\n\n'... - 'Because the waveform starts at %.1f ms and ends at %.1f ms, your measurement window cannot go beyond [%.1f %.1f] ms (unless you reduce '... - 'the number of points required to define the local peak).']; + 'and the epoch length of the ERP waveform.\n\n You have specified a local peak over %g points, which means that '... + 'there must be %g sample points between the onset of your measurement window and the onset of the waveform, '... + 'and/or %g sample points between the end of your measurement window and the end of the waveform.\n\n'... + 'Because the waveform starts at %.1f ms and ends at %.1f ms, your measurement window cannot go beyond [%.1f %.1f] ms (unless you reduce '... + 'the number of points required to define the local peak).']; % latsamp = [find(ERP.times>=latency(1), 1, 'first') find(ERP.times<=550, 1, 'last')]; % % its fields are "value" and "ilimits" @@ -217,366 +217,402 @@ [worklate{1:nbin,1:nchan}] = deal(latency); % specified latency(ies) for getting measurements. if length(latency)==2 - [xxx, latsamp, latdiffms] = closest(timex, latency); - if latency(1)2 %JLC.10/16/2013 - msgboxText = sprintf('The onset of your measurement window cannot be more than 2 samples earlier than the ERP window (%.1f ms)\n', timex(1)); - varargout{1} = msgboxText; - varargout{2} = 'limit'; - return - end - if latency(2)2 %JLC.10/16/2013 + msgboxText = sprintf('The onset of your measurement window cannot be more than 2 samples earlier than the ERP window (%.1f ms)\n', timex(1)); + varargout{1} = msgboxText; + varargout{2} = 'limit'; + return + end + if latency(2)=(pnts-sampeak)) && (ms2sample(latdiffms(1),fs)<(-2+sampeak) || ms2sample(latdiffms(1),fs)>(2-sampeak)) %JLC.20/08/13 - msgboxText = sprintf('The specified latency is more than 2 samples away from the ERP window [%.1f %.1f] ms\n', timex(1), timex(end)); - varargout{1} = msgboxText; - varargout{2} = 'limit'; - return - end - if latsamp(1)<1 - latsamp(1) = 1; - fprintf('\n%s\n', repmat('*',1,60)); - fprintf('WARNING: Latency %.1f ms was adjusted to %.1f ms \n', latency(2), mintime); - fprintf('%s\n\n', repmat('*',1,60)); - elseif latsamp(1)>pnts - latsamp(1) = pnts; - fprintf('\n%s\n', repmat('*',1,60)); - fprintf('WARNING: Latency %.1f ms was adjusted to %.1f ms \n', latency(2), maxtime); - fprintf('%s\n\n', repmat('*',1,60)); - end + [xxx, latsamp, latdiffms] = closest(timex, latency(1)); + if (latsamp(1)<=(1+sampeak) || latsamp(1)>=(pnts-sampeak)) && (ms2sample(latdiffms(1),fs)<(-2+sampeak) || ms2sample(latdiffms(1),fs)>(2-sampeak)) %JLC.20/08/13 + msgboxText = sprintf('The specified latency is more than 2 samples away from the ERP window [%.1f %.1f] ms\n', timex(1), timex(end)); + varargout{1} = msgboxText; + varargout{2} = 'limit'; + return + end + if latsamp(1)<1 + latsamp(1) = 1; + fprintf('\n%s\n', repmat('*',1,60)); + fprintf('WARNING: Latency %.1f ms was adjusted to %.1f ms \n', latency(2), mintime); + fprintf('%s\n\n', repmat('*',1,60)); + elseif latsamp(1)>pnts + latsamp(1) = pnts; + fprintf('\n%s\n', repmat('*',1,60)); + fprintf('WARNING: Latency %.1f ms was adjusted to %.1f ms \n', latency(2), maxtime); + fprintf('%s\n\n', repmat('*',1,60)); + end else - error('Wrong number of latencies...') + error('Wrong number of latencies...') end try - for b=1:nbin - for ch = 1:nchan - % - % Get data - % - dataux = ERP.bindata(chanArray(ch), :, binArray(b)); - - % - % re-sampling - % - if intfactor~=1 - dataux = spline(timeor, dataux, timex); % re-sampled data - end + for b=1:nbin + for ch = 1:nchan + % + % Get data + % + dataux = ERP.bindata(chanArray(ch), :, binArray(b)); + + % + % re-sampling + % + if intfactor~=1 + dataux = spline(timeor, dataux, timex); % re-sampled data + end + + % + % Baseline correction + % + blv = blvalue2(dataux, timex, blc); + dataux = dataux - blv; + + if nlat==1 % 1 latency was specified + if strcmpi(moption,'areazt') || strcmpi(moption,'areazp') || strcmpi(moption,'areazn') + + % + % get area (automatic limits, 1 seed latency) + % + %blv = blvalue(ERP, chanArray(ch), binArray(b), blc); % baseline value + %dataux = ERP.bindata(chanArray(ch), :, binArray(b)) - blv; + + switch moption + case 'areazt' + aoption = 'autot'; + case 'areazp' + aoption = 'autop'; + case 'areazn' + aoption = 'auton'; + end + + % gets values + [A, Lx, il] = areaerp(dataux, fs, latsamp, aoption, coi); + worklate{b,ch} = sample2ms((il-1),fs,0) + mintime; % integratin limits + VALUES(b,ch) = A; + elseif strcmpi(moption,'nintegz') + + % + % get numerical integration (automatic limits) + % + %blv = blvalue(ERP, chanArray(ch), binArray(b), blc); % baseline value + %dataux = ERP.bindata(chanArray(ch), :, binArray(b)) - blv; + + % gets values + [A, Lx, il] = areaerp(dataux, fs,latsamp, 'auto', coi); + worklate{b,ch} = sample2ms((il-1),fs,0) + mintime; % integratin limits + VALUES(b,ch) = A; + elseif strcmpi(moption,'instabl') + + % + % get instantaneous amplitud (at 1 latency) + % + %blv = blvalue(ERP, chanArray(ch), binArray(b), blc); % baseline value + VALUES(b,ch) = dataux(latsamp); + else + stre1 = 'ERROR in geterpvalues.m: You must enter 2 latencies for '; + stre2 = '''meanbl'', ''peakampbl'', ''peaklatbl'', or ''area'''; + strerr = [stre1 stre2]; + error( strerr ) + end + else % between 2 latencies measurements. + if strcmpi(moption,'meanbl') + + % + % get mean value + % + %blv = blvalue(ERP, chanArray(ch), binArray(b), blc); % baseline value + VALUES(b,ch) = mean(dataux(latsamp(1):latsamp(2))); + elseif strcmpi(moption,'peakampbl') + + % + % get peak amplitude + % + %blv = blvalue(ERP, chanArray(ch), binArray(b), blc); % baseline value + try + dataux = dataux(latsamp(1)-sampeak:latsamp(2)+sampeak); % no filtered + timex2 = timex(latsamp(1)-sampeak:latsamp(2)+sampeak); + catch + extrastr = msgboxText4peak; + error('Error:peakampbl', extrastr, sampeak, sampeak, sampeak, mintime, maxtime, mintime+sample2ms(sampeak,fs), maxtime-sample2ms(sampeak,fs)); + end + + if localopt==1 %0=writes a NaN when local peak is not found. 1=export absolute peak when local peak is not found. + localoptstr = 'abs'; + elseif localopt==2 %% GH May 2024 + localoptstr = 'errormsg'; + else + localoptstr = 'NaN'; + end + + % gets values + [valx, latpeak] = localpeak(dataux, timex2, 'Neighborhood',sampeak, 'Peakpolarity', polpeak, 'Measure','amplitude',... + 'Peakreplace', localoptstr); + + if isempty(valx) + error('Peak-related measurement failed...') + end + + worklate{b,ch} = latpeak; %((il-1)/fs + ERP.xmin)*1000; + VALUES(b,ch) = valx; % value of amplitude + elseif strcmpi(moption,'peaklatbl') + + % + % get peak latency + % + %blv = blvalue(ERP, chanArray(ch), binArray(b), blc); % baseline value + + try + dataux = dataux(latsamp(1)-sampeak:latsamp(2)+sampeak); % no filtered + timex2 = timex(latsamp(1)-sampeak:latsamp(2)+sampeak); + catch + extrastr = msgboxText4peak; + error('Error:peaklatbl', extrastr, sampeak, sampeak, sampeak, mintime, maxtime, mintime+sample2ms(sampeak,fs), maxtime-sample2ms(sampeak,fs)); + end + if localopt==1 %0=writes a NaN when local peak is not found. 1=export absolute peak when local peak is not found. + localoptstr = 'abs'; + elseif localopt==2 %% GH May 2024 + localoptstr = 'errormsg'; - % - % Baseline correction - % - blv = blvalue2(dataux, timex, blc); - dataux = dataux - blv; + else + localoptstr = 'NaN'; + end + + % gets values + valx = localpeak(dataux, timex2, 'Neighborhood', sampeak, 'Peakpolarity', polpeak, 'Measure','peaklat',... + 'Peakreplace', localoptstr); + if isempty(valx) + error('Peak-related measurement failed...') + end + + VALUES(b,ch) = valx; + elseif strcmpi(moption,'area') || strcmpi(moption,'areat') || strcmpi(moption,'areap') || strcmpi(moption,'arean') + + % + % get area + % + switch moption + case {'areat', 'area'} + aoption = 'total'; + case 'areap' + aoption = 'positive'; + case 'arean' + aoption = 'negative'; + end + + %blv = blvalue(ERP, chanArray(ch), binArray(b), blc); % baseline value + %dataux = ERP.bindata(chanArray(ch), :, binArray(b)) - blv; + + % gets values + A = areaerp(dataux, fs, latsamp, aoption, coi); + VALUES(b,ch) = A; + elseif strcmpi(moption,'50arealat') % deprecated + + % + % get 50% area latency (old) + % + %blv = blvalue(ERP, chanArray(ch), binArray(b), blc); % baseline value + %dataux = ERP.bindata(chanArray(ch), :, binArray(b)) - blv; + + % gets values + [aaaxxx, L] = areaerp(dataux, fs,latsamp, 'total', coi); + VALUES(b,ch) = sample2ms((L-1),fs,0) + mintime; % 50 % area latency (temporary) + elseif strcmpi(moption,'fareatlat') || strcmpi(moption,'fninteglat') || strcmpi(moption,'fareaplat') || strcmpi(moption,'fareanlat') + + % + % get fractional area latency + % + if frac<0 || frac>1 + error('ERPLAB says: error at geterpvalues(). Fractional area value must be between 0 and 1') + end + switch moption + case 'fareatlat' + aoption = 'total'; + case 'fninteglat' + aoption = 'integral'; % default + case 'fareaplat' + aoption = 'positive'; + case 'fareanlat' + aoption = 'negative'; + end + + %blv = blvalue(ERP, chanArray(ch), binArray(b), blc); % baseline value + %dataux = ERP.bindata(chanArray(ch), :, binArray(b)) - blv; + + % gets values + [aaaxxx, L] = areaerp(dataux, fs,latsamp, aoption, coi, frac, fracmearep); + VALUES(b,ch) = sample2ms((L-1),fs,0) + mintime; % frac area latency + elseif strcmpi(moption,'fpeaklat') + + % + % get fractional "peak" latency + % + if frac<0 || frac>1 + error('ERPLAB says: error at geterpvalues(). Fractional peak value must be between 0 and 1') + end + + % try + %blv = blvalue(ERP, chanArray(ch), binArray(b), blc); % baseline value + + try + dataux = dataux(latsamp(1)-sampeak:latsamp(2)+sampeak); % no filtered + timex2 = timex(latsamp(1)-sampeak:latsamp(2)+sampeak); + catch + extrastr = msgboxText4peak; + error('Error:fpeaklat', extrastr, sampeak, sampeak, sampeak, mintime, maxtime, mintime+sample2ms(sampeak,fs), maxtime-sample2ms(sampeak,fs)); + end + if localopt==1 %0=writes a NaN when local peak is not found. 1=export absolute peak when local peak is not found. + localoptstr = 'abs'; + elseif localopt==2 %% GH May 2024 + localoptstr = 'errormsg'; + else + localoptstr = 'NaN'; + end + if fracmearep==1 %0=writes a NaN when local peak is not found. 1=export absolute peak when local peak is not found. + fracmearepstr = 'abs'; - if nlat==1 % 1 latency was specified - if strcmpi(moption,'areazt') || strcmpi(moption,'areazp') || strcmpi(moption,'areazn') - - % - % get area (automatic limits, 1 seed latency) - % - %blv = blvalue(ERP, chanArray(ch), binArray(b), blc); % baseline value - %dataux = ERP.bindata(chanArray(ch), :, binArray(b)) - blv; - - switch moption - case 'areazt' - aoption = 'autot'; - case 'areazp' - aoption = 'autop'; - case 'areazn' - aoption = 'auton'; - end - - % gets values - [A, Lx, il] = areaerp(dataux, fs, latsamp, aoption, coi); - worklate{b,ch} = sample2ms((il-1),fs,0) + mintime; % integratin limits - VALUES(b,ch) = A; - elseif strcmpi(moption,'nintegz') - - % - % get numerical integration (automatic limits) - % - %blv = blvalue(ERP, chanArray(ch), binArray(b), blc); % baseline value - %dataux = ERP.bindata(chanArray(ch), :, binArray(b)) - blv; - - % gets values - [A, Lx, il] = areaerp(dataux, fs,latsamp, 'auto', coi); - worklate{b,ch} = sample2ms((il-1),fs,0) + mintime; % integratin limits - VALUES(b,ch) = A; - elseif strcmpi(moption,'instabl') - - % - % get instantaneous amplitud (at 1 latency) - % - %blv = blvalue(ERP, chanArray(ch), binArray(b), blc); % baseline value - VALUES(b,ch) = dataux(latsamp); - else - stre1 = 'ERROR in geterpvalues.m: You must enter 2 latencies for '; - stre2 = '''meanbl'', ''peakampbl'', ''peaklatbl'', or ''area'''; - strerr = [stre1 stre2]; - error( strerr ) - end - else % between 2 latencies measurements. - if strcmpi(moption,'meanbl') - - % - % get mean value - % - %blv = blvalue(ERP, chanArray(ch), binArray(b), blc); % baseline value - VALUES(b,ch) = mean(dataux(latsamp(1):latsamp(2))); - elseif strcmpi(moption,'peakampbl') - - % - % get peak amplitude - % - %blv = blvalue(ERP, chanArray(ch), binArray(b), blc); % baseline value - try - dataux = dataux(latsamp(1)-sampeak:latsamp(2)+sampeak); % no filtered - timex2 = timex(latsamp(1)-sampeak:latsamp(2)+sampeak); - catch - extrastr = msgboxText4peak; - error('Error:peakampbl', extrastr, sampeak, sampeak, sampeak, mintime, maxtime, mintime+sample2ms(sampeak,fs), maxtime-sample2ms(sampeak,fs)); - end - - if localopt==1 %0=writes a NaN when local peak is not found. 1=export absolute peak when local peak is not found. - localoptstr = 'abs'; - else - localoptstr = 'NaN'; - end - - % gets values - [valx, latpeak] = localpeak(dataux, timex2, 'Neighborhood',sampeak, 'Peakpolarity', polpeak, 'Measure','amplitude',... - 'Peakreplace', localoptstr); - - if isempty(valx) - error('Peak-related measurement failed...') - end - - worklate{b,ch} = latpeak; %((il-1)/fs + ERP.xmin)*1000; - VALUES(b,ch) = valx; % value of amplitude - elseif strcmpi(moption,'peaklatbl') - - % - % get peak latency - % - %blv = blvalue(ERP, chanArray(ch), binArray(b), blc); % baseline value - - try - dataux = dataux(latsamp(1)-sampeak:latsamp(2)+sampeak); % no filtered - timex2 = timex(latsamp(1)-sampeak:latsamp(2)+sampeak); - catch - extrastr = msgboxText4peak; - error('Error:peaklatbl', extrastr, sampeak, sampeak, sampeak, mintime, maxtime, mintime+sample2ms(sampeak,fs), maxtime-sample2ms(sampeak,fs)); - end - if localopt==1 %0=writes a NaN when local peak is not found. 1=export absolute peak when local peak is not found. - localoptstr = 'abs'; - else - localoptstr = 'NaN'; - end - - % gets values - valx = localpeak(dataux, timex2, 'Neighborhood', sampeak, 'Peakpolarity', polpeak, 'Measure','peaklat',... - 'Peakreplace', localoptstr); - if isempty(valx) - error('Peak-related measurement failed...') - end - - VALUES(b,ch) = valx; - elseif strcmpi(moption,'area') || strcmpi(moption,'areat') || strcmpi(moption,'areap') || strcmpi(moption,'arean') - - % - % get area - % - switch moption - case {'areat', 'area'} - aoption = 'total'; - case 'areap' - aoption = 'positive'; - case 'arean' - aoption = 'negative'; - end - - %blv = blvalue(ERP, chanArray(ch), binArray(b), blc); % baseline value - %dataux = ERP.bindata(chanArray(ch), :, binArray(b)) - blv; - - % gets values - A = areaerp(dataux, fs, latsamp, aoption, coi); - VALUES(b,ch) = A; - elseif strcmpi(moption,'50arealat') % deprecated - - % - % get 50% area latency (old) - % - %blv = blvalue(ERP, chanArray(ch), binArray(b), blc); % baseline value - %dataux = ERP.bindata(chanArray(ch), :, binArray(b)) - blv; - - % gets values - [aaaxxx, L] = areaerp(dataux, fs,latsamp, 'total', coi); - VALUES(b,ch) = sample2ms((L-1),fs,0) + mintime; % 50 % area latency (temporary) - elseif strcmpi(moption,'fareatlat') || strcmpi(moption,'fninteglat') || strcmpi(moption,'fareaplat') || strcmpi(moption,'fareanlat') - - % - % get fractional area latency - % - if frac<0 || frac>1 - error('ERPLAB says: error at geterpvalues(). Fractional area value must be between 0 and 1') - end - switch moption - case 'fareatlat' - aoption = 'total'; - case 'fninteglat' - aoption = 'integral'; % default - case 'fareaplat' - aoption = 'positive'; - case 'fareanlat' - aoption = 'negative'; - end - - %blv = blvalue(ERP, chanArray(ch), binArray(b), blc); % baseline value - %dataux = ERP.bindata(chanArray(ch), :, binArray(b)) - blv; - - % gets values - [aaaxxx, L] = areaerp(dataux, fs,latsamp, aoption, coi, frac, fracmearep); - VALUES(b,ch) = sample2ms((L-1),fs,0) + mintime; % frac area latency - elseif strcmpi(moption,'fpeaklat') - - % - % get fractional "peak" latency - % - if frac<0 || frac>1 - error('ERPLAB says: error at geterpvalues(). Fractional peak value must be between 0 and 1') - end - - % try - %blv = blvalue(ERP, chanArray(ch), binArray(b), blc); % baseline value - - try - dataux = dataux(latsamp(1)-sampeak:latsamp(2)+sampeak); % no filtered - timex2 = timex(latsamp(1)-sampeak:latsamp(2)+sampeak); - catch - extrastr = msgboxText4peak; - error('Error:fpeaklat', extrastr, sampeak, sampeak, sampeak, mintime, maxtime, mintime+sample2ms(sampeak,fs), maxtime-sample2ms(sampeak,fs)); - end - if localopt==1 %0=writes a NaN when local peak is not found. 1=export absolute peak when local peak is not found. - localoptstr = 'abs'; - else - localoptstr = 'NaN'; - end - if fracmearep==1 %0=writes a NaN when local peak is not found. 1=export absolute peak when local peak is not found. - fracmearepstr = 'abs'; - else - fracmearepstr = 'NaN'; - end - - % gets values - [aaaxxx, latpeak, latfracpeak] = localpeak(dataux, timex2, 'Neighborhood',sampeak, 'Peakpolarity', polpeak, 'Measure','fraclat',... - 'Peakreplace', localoptstr, 'Fraction', frac, 'Fracpeakreplace', fracmearepstr, 'Peakonset',peakonset); - - if isempty(aaaxxx) - error('Peak-related measurement failed...') - end - - worklate{b,ch} = latpeak; % peak - VALUES(b,ch) = latfracpeak; % fractional peak - elseif strcmpi(moption,'areazt') || strcmpi(moption,'areazp') || strcmpi(moption,'areazn') - - % - % get area (automatic limits) - % - switch moption - case 'areazt' - aoption = 'autot'; - case 'areazp' - aoption = 'autop'; - case 'areazn' - aoption = 'auton'; - end - - %blv = blvalue(ERP, chanArray(ch), binArray(b), blc); % baseline value - %dataux = ERP.bindata(chanArray(ch), :, binArray(b)) - blv; - - % gets values - [A, L, il] = areaerp(dataux, fs,latsamp, aoption, coi); - worklate{b,ch} = sample2ms((il-1),fs,0) + mintime; % integration limits - VALUES(b,ch) = A; - elseif strcmpi(moption,'errorbl') % for Rick Addante - - % - % get standard deviation - % - if isempty(ERP.binerror) - error('ERPLAB says: The data field for standard deviation is empty!') - end - - dataux = ERP.bindata; % temporary store for data field - ERP.bindata = ERP.binerror; % error data to data - blv = blvalue(ERP, chanArray(ch), binArray(b), blc); % baseline value - VALUES(b,ch) = mean(ERP.bindata(chanArray(ch),latsamp(1):latsamp(2), binArray(b))) - blv; - ERP.bindata = dataux; % recover original data - elseif strcmpi(moption,'rmsbl') - - % - % get root mean square value (RMS) - % - VALUES(b,ch) = sqrt(mean(dataux(latsamp(1):latsamp(2)).^2)); - elseif strcmpi(moption,'ninteg') - - % - % get numerical integration - % - %blv = blvalue(ERP, chanArray(ch), binArray(b), blc); % baseline value - %dataux = ERP.bindata(chanArray(ch), :, binArray(b)) - blv; - - % gets values - A = areaerp(dataux, fs,latsamp, 'integral', coi); - VALUES(b,ch) = A; - elseif strcmpi(moption,'nintegz') - - % - % get numerical integration (automatic limits) - % - %blv = blvalue(ERP, chanArray(ch), binArray(b), blc); % baseline value - %dataux = ERP.bindata(chanArray(ch), :, binArray(b)) - blv; - - % gets values - [A, Lx, il] = areaerp(dataux, fs,latsamp, 'auto', coi); - worklate{b,ch} = sample2ms((il-1),fs,0) + mintime; % integratin limits - VALUES(b,ch) = A; - end - end + else + fracmearepstr = 'NaN'; + end + + % gets values + [aaaxxx, latpeak, latfracpeak] = localpeak(dataux, timex2, 'Neighborhood',sampeak, 'Peakpolarity', polpeak, 'Measure','fraclat',... + 'Peakreplace', localoptstr, 'Fraction', frac, 'Fracpeakreplace', fracmearepstr, 'Peakonset',peakonset); + + if isempty(aaaxxx) + error('Peak-related measurement failed...') + end + + worklate{b,ch} = latpeak; % peak + VALUES(b,ch) = latfracpeak; % fractional peak + elseif strcmpi(moption,'areazt') || strcmpi(moption,'areazp') || strcmpi(moption,'areazn') + + % + % get area (automatic limits) + % + switch moption + case 'areazt' + aoption = 'autot'; + case 'areazp' + aoption = 'autop'; + case 'areazn' + aoption = 'auton'; + end + + %blv = blvalue(ERP, chanArray(ch), binArray(b), blc); % baseline value + %dataux = ERP.bindata(chanArray(ch), :, binArray(b)) - blv; + + % gets values + [A, L, il] = areaerp(dataux, fs,latsamp, aoption, coi); + worklate{b,ch} = sample2ms((il-1),fs,0) + mintime; % integration limits + VALUES(b,ch) = A; + elseif strcmpi(moption,'errorbl') % for Rick Addante + + % + % get standard deviation + % + if isempty(ERP.binerror) + error('ERPLAB says: The data field for standard deviation is empty!') + end + + dataux = ERP.bindata; % temporary store for data field + ERP.bindata = ERP.binerror; % error data to data + blv = blvalue(ERP, chanArray(ch), binArray(b), blc); % baseline value + VALUES(b,ch) = mean(ERP.bindata(chanArray(ch),latsamp(1):latsamp(2), binArray(b))) - blv; + ERP.bindata = dataux; % recover original data + elseif strcmpi(moption,'rmsbl') + + % + % get root mean square value (RMS) + % + VALUES(b,ch) = sqrt(mean(dataux(latsamp(1):latsamp(2)).^2)); + elseif strcmpi(moption,'ninteg') + + % + % get numerical integration + % + %blv = blvalue(ERP, chanArray(ch), binArray(b), blc); % baseline value + %dataux = ERP.bindata(chanArray(ch), :, binArray(b)) - blv; + + % gets values + A = areaerp(dataux, fs,latsamp, 'integral', coi); + VALUES(b,ch) = A; + elseif strcmpi(moption,'nintegz') + + % + % get numerical integration (automatic limits) + % + %blv = blvalue(ERP, chanArray(ch), binArray(b), blc); % baseline value + %dataux = ERP.bindata(chanArray(ch), :, binArray(b)) - blv; + + % gets values + [A, Lx, il] = areaerp(dataux, fs,latsamp, 'auto', coi); + worklate{b,ch} = sample2ms((il-1),fs,0) + mintime; % integratin limits + VALUES(b,ch) = A; end + end end + end catch - serr = lasterror; - varargout{1} = serr.message; - varargout{2} = []; - return + serr = lasterror; + switch moption%%GH May 2024 + case 'fareanlat' + varargout{1} = ['Error: There was no negative area (i.e., area below the baseline) in one or more of the waveforms during the specified measurement window. It is impossible to quantify the fractional area latency when there is no negative area. To solve this problem, you can either change the measurement parameters (e.g., the time window) so that a negative area exists for all waveforms, or you can use the Options button to output a value of "not a number (NaN)" when there is no negative area. Here is the first waveform in which there was no negative area detected: bin',num2str(b),', chan',num2str(ch)]; + case 'fareaplat' + varargout{1} = ['Error: There was no positive area (i.e., area above the baseline) in one or more of the waveforms during the specified measurement window. It is impossible to quantify the fractional area latency when there is no positive area. To solve this problem, you can either change the measurement parameters (e.g., the time window) so that a positive area exists for all waveforms, or you can use the Options button to output a value of "not a number (NaN)" when there is no positive area. Here is the first waveform in which there was no positive area detected: bin',num2str(b),', chan',num2str(ch)]; + case 'peakampbl' + varargout{1} = ['Error: There was no local peak in one or more of the waveforms during the specified measurement window. To solve this problem, you can either change the measurement parameters (e.g., reducing the number of points required for a local peak) so that a local peak exists for all waveforms, or you can use the Options button to output a value of "non a number (NaN)" when there is no local peak. Here is the first waveform in which there was no local peak detected: bin',num2str(b),', chan',num2str(ch)]; + case 'peaklatbl' + if polpeak==1 + polpeakstr = 'positive'; + else + polpeakstr = 'negative'; + end + varargout{1} = ['Error: There was no',32,polpeakstr,32,'latency in one or more of the waveforms during the specified measurement window. It is impossible to quantify the peak latency when there is no',... + 32,polpeakstr,32,'latency. To solve this problem, you can either change the measurement parameters (e.g., the time window) so that a',32,polpeakstr,32,'latency exists for all waveforms, or you can use the Options button to output a value of "not a number (NaN)" when there is no',32,polpeakstr,32,... + 'latency. Here is the first waveform in which there was no',32,polpeakstr,32,'latency detected: bin',num2str(b),', chan',num2str(ch)]; + case 'fpeaklat' + if polpeak==1 + polpeakstr = 'positive'; + else + polpeakstr = 'negative'; + end + varargout{1} = ['Error: There was no',32,polpeakstr,32,'latency in one or more of the waveforms during the specified measurement window. It is impossible to quantify the fractional peak latency when there is no',... + 32,polpeakstr,32,'latency. To solve this problem, you can either change the measurement parameters (e.g., the time window) so that a',32,polpeakstr,32,'latency exists for all waveforms, or you can use the Options button to output a value of "not a number (NaN)" when there is no',32,polpeakstr,32,... + 'latency. Here is the first waveform in which there was no',32,polpeakstr,32,'latency detected: bin',num2str(b),', chan',num2str(ch)]; + otherwise + varargout{1} = serr.message; + end + + varargout{2} = []; + return end % % Creates Output % if ~condf - varargout{1} = VALUES; + varargout{1} = VALUES; elseif condf - varargout{1} = VALUES; - varargout{2} = worklate; + varargout{1} = VALUES; + varargout{2} = worklate; else - error('ERPLAB says: error at geterpvalues. Too many output arguments!') + error('ERPLAB says: error at geterpvalues. Too many output arguments!') end diff --git a/functions/inputvalue.m b/functions/inputvalue.m index 1f5ffee6..f716993c 100755 --- a/functions/inputvalue.m +++ b/functions/inputvalue.m @@ -1,7 +1,13 @@ function [response] = inputvalue(prompt,dlg_title,num_lines,def) BackERPLABcolor = erpworkingmemory('ColorB'); +if isempty(BackERPLABcolor) || numel(BackERPLABcolor)~=3 || any(BackERPLABcolor(:)>1) || any(BackERPLABcolor(:)<0) + BackERPLABcolor = [0.7020 0.77 0.85]; +end ForeERPLABcolor = erpworkingmemory('ColorF'); +if isempty(ForeERPLABcolor) || numel(ForeERPLABcolor)~=3 || any(ForeERPLABcolor(:)>1) || any(ForeERPLABcolor(:)<0) + ForeERPLABcolor = [0 0 0]; +end BKGoldcolor = get(0,'DefaultUicontrolBackgroundColor'); % current background color FORoldcolor = get(0,'DefaultUicontrolForegroundColor'); % current foreground color oldimage = get(0,'DefaultImageVisible'); diff --git a/functions/localpeak.m b/functions/localpeak.m index ebbc066e..489eeb9b 100755 --- a/functions/localpeak.m +++ b/functions/localpeak.m @@ -226,11 +226,14 @@ poslocalpf = posabspf; latlocalpeak = timex(posabspf); ltypeoutput = 2; % abs peak - else % replace with NaN + elseif strcmpi(p.Results.Peakreplace,'NaN') % replace with NaN %%GH May 2024 vlocalpf = NaN; poslocalpf = NaN; latlocalpeak = NaN; ltypeoutput = 3; % NaN instead of a peak + else%%GH May 2024 + errorcode = 1; % no fractional value was specified + return end end diff --git a/functions/setcodebit.m b/functions/setcodebit.m index a48b4503..483a8b65 100755 --- a/functions/setcodebit.m +++ b/functions/setcodebit.m @@ -1,9 +1,9 @@ % PURPOSE: subroutine for pop_setcodebit.m % sets the bit(s) at position(s) "bitindex" in each EEG.event(i).type value to 0 (off). % "bitindex" must contain number(s) between 1 and 16. -% +% % EEG = setcodebit(EEG, bitindex, newvalue) sets the bit(s) at position(s) "bitindex" to the value "newvalue", which must be either 0 or 1. -% +% % Example: % In Biosemi system you have a 16-bit word for sending your event codes. However, you generally use event codes from 1 to 255 % (8-bit numbers). In this case, the upper byte (bits 9 to 16) should be silent, and these bits should be zero. @@ -13,11 +13,11 @@ % Hence, you will be able to set each bit, or a group of them, to either "0" or "1", using a single line command. % For example, if you want to assure that your event codes keep values from 1 to 255, you must set the upper byte % (bits 9 to 16) to zero (cleaning any spuriously activated bit), using a command like the following: -% +% % EEG = setcodebit(EEG, 9:16, 0); -% +% % Note, EEG = setcodebit(EEG, 9:16); will work as well, since "0" is the default value for "newvalue". -% +% % % *** This function is part of ERPLAB Toolbox *** % Author: Javier Lopez-Calderon & Johanna Kreither @@ -30,53 +30,53 @@ function EEG = setcodebit(EEG,bitindex, newvalue) if nargin<1 - help setcodebit - return + help setcodebit + return end if nargin<3 - newvalue = 0; + newvalue = 0; end if nargin<2 - msgboxText = 'Error: setcodebit() works with 3 inputs.'; - error(msgboxText) + msgboxText = 'Error: setcodebit() works with 3 inputs.'; + error(msgboxText) end if ~isempty(EEG.epoch) - msgboxText = 'setcodebit.m only works for continuous dataset.'; - error(msgboxText) + msgboxText = 'setcodebit.m only works for continuous dataset.'; + error(msgboxText) end if isempty(bitindex) - msgboxText = 'Error: you must specify one bit index, at least.'; - error(msgboxText) + msgboxText = 'Error: you must specify one bit index, at least.'; + error(msgboxText) else - if isnumeric(bitindex) - if min(bitindex)<1 || max(bitindex)>16 - msgboxText = 'Error: bit index must be a positive integer between 1 and 16.'; - error(msgboxText) - end - else - msgboxText = 'Error: bit index must be numeric.'; - error(msgboxText) - end - bitindex = unique_bc2(bitindex); + if isnumeric(bitindex) + if min(bitindex)<1 || max(bitindex)>16 + msgboxText = 'Error: bit index must be a positive integer between 1 and 16.'; + error(msgboxText) + end + else + msgboxText = 'Error: bit index must be numeric.'; + error(msgboxText) + end + bitindex = unique_bc2(bitindex); end if ischar(newvalue) - msgboxText = 'Error: new value must be numeric.'; - error(msgboxText) + msgboxText = 'Error: new value must be numeric.'; + error(msgboxText) else - if length(newvalue)~=1 - msgboxText = 'Error: new value must be a single value, either 0 or 1.'; - error(msgboxText) - end - if newvalue~=0 && newvalue~=1 - msgboxText = 'Error: new value must be a single value, either 0 or 1.'; - error(msgboxText) - end + if length(newvalue)~=1 + msgboxText = 'Error: new value must be a single value, either 0 or 1.'; + error(msgboxText) + end + if newvalue~=0 && newvalue~=1 + msgboxText = 'Error: new value must be a single value, either 0 or 1.'; + error(msgboxText) + end end if ischar(EEG.event(1).type) - msgboxText = 'Your event codes are not numeric.'; - error(msgboxText) + msgboxText = 'Your event codes are not numeric.'; + error(msgboxText) else - currentcodes = uint16([EEG.event.type]); %numeric codes + currentcodes = uint16([EEG.event.type]); %numeric codes end nevents = length(currentcodes); bitbase = dec2bin(0,16); @@ -85,9 +85,13 @@ for i=1:nevents if newvalue==0 % set to zero - EEG.event(i).type = double(bitand(currentcodes(i), bitcmp(bitbase,16))); + try %%GH June 2024 + EEG.event(i).type = double(bitand(currentcodes(i), bitcmp(bitbase,16))); + catch + EEG.event(i).type = double(bitand(currentcodes(i), bitcmp(bitbase,'uint16'))); + end else % set to one - EEG.event(i).type = double(bitor(currentcodes(i), bitbase)); + EEG.event(i).type = double(bitor(currentcodes(i), bitbase)); end end EEG = eeg_checkset( EEG, 'eventconsistency' ); diff --git a/functions/summary_rejectflags.m b/functions/summary_rejectflags.m index 08fa3ee2..a1e43ad0 100755 --- a/functions/summary_rejectflags.m +++ b/functions/summary_rejectflags.m @@ -1,12 +1,12 @@ % PURPOSE: summarizes marked flag for artifact detection % % FORMAT -% +% % histoflags = summary_rejectflags(EEG); -% +% % % *** This function is part of ERPLAB Toolbox *** -% Author: Javier Lopez-Calderon +% Author: Javier Lopez-Calderon % Center for Mind and Brain % University of California, Davis, % Davis, CA @@ -36,7 +36,7 @@ function histoflags = summary_rejectflags(EEG) if isempty(EEG.epoch) - error('ERPLAB: summary_rejectflags() only works with epoched dataset') + error('ERPLAB: summary_rejectflags() only works with epoched dataset') end ntrial = EEG.trials; @@ -44,40 +44,40 @@ oldflag = zeros(1,ntrial); for b=1:nbin - for i=1:ntrial - if length(EEG.epoch(i).eventlatency) == 1 - binix = [EEG.epoch(i).eventbini]; - if iscell(binix) - binix = cell2mat(binix); - end - if ismember(b, binix) - flagx = [EEG.epoch(i).eventflag]; - if iscell(flagx) - flagx = cell2mat(flagx); - end - oldflag(b,i) = flagx; - else - oldflag(b,i) =0; - end - elseif length(EEG.epoch(i).eventlatency) > 1 - indxtimelock = find(cell2mat(EEG.epoch(i).eventlatency) == 0,1,'first'); % catch zero-time locked type - if ismember(b, EEG.epoch(i).eventbini{indxtimelock}) - oldflag(b,i) = EEG.epoch(i).eventflag{indxtimelock}; - else - oldflag(b,i) =0; - end - else - errorm = 1; + for i=1:ntrial + if length(EEG.epoch(i).eventlatency) == 1 + binix = [EEG.epoch(i).eventbini]; + if iscell(binix) + binix = cell2mat(binix); + end + if ismember(b, binix) + flagx = [EEG.epoch(i).eventflag]; + if iscell(flagx) + flagx = cell2mat(flagx); end + oldflag(b,i) = flagx; + else + oldflag(b,i) =0; + end + elseif length(EEG.epoch(i).eventlatency) > 1 + indxtimelock = find(cell2mat(EEG.epoch(i).eventlatency) == 0,1,'first'); % catch zero-time locked type + if ismember(b, EEG.epoch(i).eventbini{indxtimelock}) + oldflag(b,i) = EEG.epoch(i).eventflag{indxtimelock}; + else + oldflag(b,i) =0; + end + else + errorm = 1; end + end end histoflags = zeros(1,16); flagbit = bitshift(1, 0:15); for b=1:nbin - for j=1:16 - C = bitand(flagbit(j), oldflag(b,:)); - histoflags(b,j) = nnz(C); - end + for j=1:16 + C = bitand(flagbit(j), oldflag(b,:)); + histoflags(b,j) = nnz(C); + end end diff --git a/images/EstudioLogo.jpg b/images/EstudioLogo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..37d891b5962955381ec02f9d29d94ef957169701 GIT binary patch literal 74343 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±ls(svU}USbhpUAZ>$CuX#p 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⋘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⩔ILr1t6m8M z@|$JLmrKp(8woXUk|uYDxOq77*uAiXgJsUlSu%Cx7)b$ax$v?K0oVACi)V?`4Xy1=7CX43OLid$@MZD*1BV8c5zSxfn)#@|5YE zw-8hPMJuJ~I@K)ulf|FN;)M&T*t0|?P8cV*{o*#6I(D34!)syv-k$$=S;%}1SC1Mw zTpsxSeJH$#N)!MWEt4^AkB^U*(&`4e?T)+U{Y8t3)bkKPnt|SDG>_D+PTqkQngZ8=mc(ngnlRh+YK`{lhRDH)aogYkK z=-=Pe)ZgvunGBrGgYVe@Fg$qs^k?n>Fw|D+MtgeO2;5Mt#_M|lbuY>S!Iz)4y!Ac+ z4E1Iln7%E*Ffi0x0}jV#4p76E^ct9@D8hmrgcF+^%H^W(U5I7O&E)A(3XMT03f4;d z#J;LJ`O_nhQ>Jby9&!~hBL=VrCK@9Z1VUr~xgUTGK ziQa{;DWS*MLk7k2PZ7=u_CgSj(8nb?5(TA4Q+LI)4~7y=7vN8xI#BP^ znbVM`liIyrRNY<}B%>gvjX(>5P6*p)CItmByoQNWX3^@T=CtZOav5QC4H9KPIH`eU z0g0h8sC)@+s$$zeEYpZrLdkQqVIKs&CHBNviJ)Rl48oESme+fQ*PjU6Xcs4=Upt`D z;~>>QL8an5uwDpCWaKasT33mvr442g)9^C#JjpYy+_^*i)JX>Y6FXL*NIUrerV1GK zCex3aE(HMXRGOfyXpgK|yGhn<+bH{*Y6(A6kC{!PPM=asfKtYMIn#41^7sOLbh_zwk!T{~~R?H3s8Ozr!$ z9&KWQ!@lF1F4bRvrpq4AslVGD0EP!{_5QZuf!EM`&Hymf_UJ}?Iy&g9XX<+abuY>y z1HiCru)wr=iYH1Pnz*d*zqE{2wVUEDH%Qoa_Ni8^ANV-7WE*J_&_Q^=%;Yz$mn@t`^pIF)ZGDLOq4}baH!|Ynv~tszjZmK zBz65!s-WdvSw97lDu}TM7#H(1^Lv(6z^mKU?ZKAm%LaRB#|P4Z*>nhPsWv`d)W(U3 zK%!veoa9cnqmtIT&6*$SAx7;d%;$i;%WNd=01(PYV?E@Ak+T7oIux)Ml}PQLV(Hwo zSCEAxRqhhBuy7>p=i(ekMA6TnB*S7uW$H0A5gMH)Gp0?IXxgV4AirhH4q5rx3faD6 z3+K~qKyDZ&=u3{z7i^j64gM7%`oE-Vhop;KN38SPIc3e%sjh7+} z_i_X{=UjRjIfp3ZNssV^Xds`d8w6_FhfbVB^D=(`fV%oeH;~d(uS*7&4lMPr`?ueW zVbJ~`cyATP)8D#|FHjR)yFLB3&!qRWf9Fa4UHc;=eA3+%U;D#= z_+o;12$=128m1?8Oe`p1bdo^Uj{fFr@sN-FWtC!vE*gIDY!6 zXJrqAdpLe^Pdxsl3@gY2?7#s6Sk!;+E%LAyEnX}eHg1raGiS;@(|RlN|UKbNRfz(SHS=^iT}Htl`)EG1N~GqB6nHUH8AlCK>r1~^1+^Ju z6=l!#YSkFFl;ESSRnS zu7f+g6FM=BbOIx6>GViEY-$wYa}6~&?Aj^yB^ZD2*d@MgyJ@Qi`X0*nR#f5u|4uv$ z)%HcAy^?@u;#nu3BHzOpJ&#H>Dze$Ib+`QO-M6H$Vy_94hX8)nk8Lb0^T{X8k!aec z9xI_N!0ecuTnXcFn*rsTU8{CLt+0sOcJ4G~49AQfXAZXt18uElqdtnts4idmnY{7F z8%ro-JtFKEGef;^CUXt-+$C^`HTu~*r z+;W>?%Xf0TT66o3+kYWfUxIkc*$M_{Kd|fxrz%e+edT+XUcoi7Q6lJXJrDWh0kbxR z5?v=baE|q_|F3|d9=&>g(jS>jDg~eQp3`^wwg5xD9tXrHeb4Sc_V)l|sO{BF16ntc zo<{8ZWYxVWi|BB4ph+(~{jGTgu1T|~-l(knH2orYeZik~-r;@<&~^4_8UTj-Z>5m1 z7;4=zFfl+X2vmWHf+D}yX{F^WEOrV)FKy+nVK_cixeQAAXd9(FiKlUa#NkO!z_7F zUsuCGc3@WmH3$>fLWc*?=p{&Anu*UNcnRd$@trbyFkHsogh+ zJi@u*l=-j!^?5`T9LpwevC7JA|9VGBadQZmuL}q)Yp_VdOEwI-&~qV}9MHIjgjBIILnAA!il4!~!B+ z5j=3Pf4c43?R%t({8ASJB@H=yumPgunFki1qd_}PAYT!insd%NSI+s)cVyhip%RVQ zWE(3gP3jZV`|@|>8Ij{8O!mDJow-v7_qm?nvH8^&C*Zg`fGn8w_W!$ ztbHh%$ir0wW%Ls8OROfX;PyN3kvEr+cgS_1rs@H*7daTI310rtYtpVDo<3k^a%%qL zL&^PO3^~qj22~F_Fj+v+`di<>Ex=H3A^MzX#Ao`MNyp)@95eT?0r5$oefs`801UN7 zx)GUnDbuaG+i3t82AV+`oIlx);}3N8Q?HlNnu1q{G?&75(B z+;{JKpMGt?SL80A#@?gNJu4jkV+geokEw21JmqKaveia)`sBeXXibNFl{K{CLVBQ4^5#G1}rFm#RoHJ2Ov5LmHJ=~ zmF1$Djh~_FUzDvKLSrYk3i%7jHy8;eZzPLsT}|r`u5=j3`9` ztqe|qRZNs<4Ljot8JWdPKWhk{FurLW7)z(JgY37~yjGUlPCIw*t0mkH>$-KPv~4XU zR&OnmjT_fXO)V(}fW*x7 zK{6b0m^Ulz#33fTr0J(AFC&-{78KxF^7!OPi zKv)am@GVr_S<1u31|C$BlTzfIbIz3+RN7J2&xa?b3WwAt=b;Dxhz-sXIgZ@KU*7gh z%0&*7PR_yS>o&=w&p#=f*RK^PxsX%Fj+VQBdAm#;JCW;yI@EyiSn@pe?ELz%$K~-S zo;JA81+aGzZg%PQNS>nta|Mfo+{Ub^YMq^G&ate%Z!wsM-Pp!0_vz#{podZ8rc6d-b3J#;{j&bpHXC zU@%5$OTv8wcW*aJ-|t;;j@)qVe@QB~E1e9|(Xc*x%iX?Xr`&bdoiKrG36(|5{lC9o zX3w03S#*nJAV~S!dmqaJLV8V24aPKBS;FIvpM&~15f8*RJlf)A^VZGs^s~>%woRKP zJ1a{ryx;-@44n*mwKa$d+zg83X1M?iYLHzE8y6iPE7_D_%Z9lN0f1`WW6_>M24I`X zFH9mg%ny534Wp?y&sa=}tIDfo&FAYGn3u`M&D#+c0IUd;`e6w>?f4nOj#95o!Y7TE z*b&1dZrpJ42D8MGNa&cnI2Fx=yI|$GA*;xssRr}p(o(Te)x<-7oU6DT6)r$feFKFO zeE>!yCIDF36c}o#m%6y@jM%9RGl-CDa#p^CAnNcX#bRfJA$Ll=v_bfU5UNyDa1U*u zHK(H-fHMGsmp0Jv6nF*lKC!alJFkAH14=!XI)tJ1rFm9f-u1FqrcgnlgK%{S$Lu6B ztzkA5IjC8-g49sJumVq2AS>`xZ^Kx3qyhi>z~qA&EN(Sc2_rHIc{OIBfq_W*36^&JLBfgz&Tr2x% z!zj`r?!Wi9a^`8Lf_E`f=b>&QpWSd1m|QKCRCq#PqfK1^P_@U=ee$tC zX8Ml@hDu2XPx>gs^c9A%4^Y%a^x>z^^sfSj-NSF6{ptIs<{0YhkQ0jx0K-GJ(m@v( z0EXH;-91ygQ}2stfH4g8p8>{Ddj<+p0E8bv){GC})jzsi?)=4#q@N*6;rj>%xJDS4 zFIKFTyYIdm<6v^NvNK4ge~BEdcoWKvBT@fPk344b3F~UAfPp|{7nQz z4Mx4(jHz(Zo;^fqn^CQ1lV6CMlpAJqOS?2-Q9}JQsl`k2gLgla58q#eu`$e}GJLQs z3ZziW5S|6BC1p$M5#uCj;&6$dP$14E-AITmWC;y!5@3oJKcd9i+!pFhS@63nfEyBn`lkG#HjF7UOOF6zdRo_!Xcj z8_1$wz*ej(GnzXjLc_HUZDJ!tySHJrv|*mD0N4XSu)%-|tR2!-UNBOf#9;x4B<(4M z01{+A`)(QoaZZ3a0XS;Tl>$_RFXmmD#ZZ7Dp?+Z>OsE>*7J_)hR8L9Elc;D)%HgjU zj^IS|aK*o!w5)35sr&E^s#Q2 z?ZG!IE26}y2S$w&Ie=zFPpF**#xyZ!tfUXik)+|-;=+T_oj|EOl*#R!3pYSJE-Vt` z@^DE&sL@XDX643hQoia-@ow6NXoc`HeN{ag{iHEyI6i$yx}1t|>7-LmmT{vqq_Ckw zmVT}e2pdtd*U*$LDCS4W_vf7|Uh)DxE=qI|K`Sa(? zgAY9-Vbozh|NM*OzpnVc)B;G=qw*dMvgg0`4g#+PDMiS2J9&pcz52&olj<7|5NAEH zq-f~F*JW2;g}R>y6WUY#4K>W&$wNaZp?r1zG1GrMFw_H~eY>Zw&%J7;1YA0K;CrVt_I1)g0Y_*r^l|szL>T&8;{6Os@UGg;GN}H`S15VadNu?mG~C80ZN=~4wF5|wdnV>93ZrjyTA4Gr@5g`db@U;7)jAe1zV zP7o*Tpa+l#(lMdUkRfRjQ7}UCryV7!`9q~Wih&hI#tC9^6S58ksJW^dqz-RW`tij>2$v`W18^ZI^;?Aqw4?Jn|k#;hm_ zTN}dM%B+U*5RgDO?@R@+e)OltWtak zOMD!cPu16&6Q|o&;6xs40MOEqFmj+TiOGdU96em(@^Ve6-9~ubP1v*rRxlhu8_qUE z0LBhN`1QMXOF8194pIetD)3ROAI>4(J{%XJalqX1fWx!SJxhiU%b+x%$fAXd@G9KE z1I|8ip(s9^5cG6}MMXPzNFxg7#JCulG@f#d;pBD#NaJJT=>mIX5A)j)Q>kz&F*z0H zF_j#`X2R12nru7_ZnaDrH%6}c@zr47!6uX+2KZn0*-E+hH@}nJgv6CO zy!M)_2n&-_NC~_*{`!_Yfru-P$~^1Wu9Ax{x{zz}27ES$V0YvqYTrS<>=?t?UUkiX z%epPw$)9yfcnr)s;L@Bvm2d0xtpJAF8TF-8SDzjLhNeXZLdk(%@pb+k0EXIX1HiCX z-x&agJ_^VZvG|P22 z-Xzyv`(wlUsE^>L4eRCQm;Y=kl;q^(%4w&aCMUucsv^`0VA~5QT(oGhEL*W0^Wqrt z5igKg#~cIpX_Q7(!mTiW%9MnJgv*At>rLI^G(;oQrcRSAa>3dF67_f$)}au!u|4&+ zi-yr6f=uZ%@&my>6$lLe_AW-kA1#&Unoh8qn(R>BgIHz;Rj6aTp%++fZIM*tC#_7HQvBD6JcJO8cHNaqcdIp=$zDRS|w9{E2OiUqJ`tTqn6` zjs!xk*%(^qWlJbbW^4X5avYPuRe)HBzivU&hFAArk?sicO5fdIyETEmpe3WmUbs(p`Eby1&1 zWzDokw6c08D!{vrrz)t>>M1Jt(Xh0#j2efPBQ?j9A9BEe zIe?!5zzQf~7bP}X;>j6|fgO#=N*5csdLG)uQU>hM+zfA!t#|6`>;4pqfo`eq1mB`G&(t_y52HQxW zoxDmITR>10;v!e!UTI#wMqFE9lL7VadYE07@xpZLehd72mkPhd;&O~d+afC z%P()oNr*gFu<{%4FO~Zrc!-Cj5GlvjXb4Q|z5jE&oHT8U5t_7fo>b%$&iVe`!%xVQ zFT5;Gu*nYc8rAa1;e$O^R{WsAP{9_<{0k<%-ug9R_oQtZnDnC17gIMdwB`lA4*vH) zkuh}Wy;vXO4l$XdX0gKt4B4LErw`|}zxMyXtly-v{9jhk=eOO!Fm8XflKU)d{?r>_ zKc;T1)sJO$k-j0@e*Ww$i}ly8hT)+5lG5v6PkUe=Gz8SMTGJhZ{yxwN(B+JgYS&No zC%QfZDuOyQUE2&SJzMw&KXu)_M=LKqwcz9ZFAS0Ul+X01i5?dl)QJuwZGfM@0)0F#=QL`+oZynK5Gu z%tR;Ng0Mp@w|UntdGUppNB6r^wmo zoFlopxe$+j46!@#Zd)b`7cG<;a`R^MJ6$F26uR`U^s> zA%yZqP);~QGO?IxA#_@_rC+|wxvyIz#$Q$pxC(Bl^#Z;TJ zc>Yj{^H9@RL%RSTUv8cdN0gYUlO%QQNC`~>Py)8}CLGUl&boSOW1z0vyhS?68+7e0 zqA+uVguu`kt%d?Jl%fj9Y@x8H09Z*$702)biO+*aSzyMg8=wh@<9p^1V%J$}0aMJtC9 zfarw5RB-5SuQw`XXA?D`0drEvOI5+JT1aU*4rTcC3LsRhwl%DeI41i_+u(EPCsZ1a zpJY;ch78Wk6kBc<`Jwn90-~JkS0~$U(eQXvBh2hRX)i02hV5HKidA_`$Xr=c_Ql3S zh4x<$h{;Pj0W}RJCMQRtMog4p2sILOGo&-xF7*g<6sU)@51|}~x1muA0r$;-GfV@q z3DVF%V4HQ@$)Ozzh@Er7iSpg^&X$7V*ea2;S42NADI)}q(%ub=8P5ZZD&7-FKd6Jr zjYbWeoEl4wXZkAuuc^9G%FC-{AKpFCu`oB(rbp(FZcm08u>DxZmv0CrCj=sMPth?{O|0-Z;?Ot$unZ^p*K|O-TymB6s;24?MK_rdh;@Ora6oRihAhjX3%S(i@^kCqSZ}r+|-M zU=557|p)oDL7+g#7$4QaV7o+hD^y9Wt4a*TWC~R&roewE9N`j10r5tX#EL z9(m+X^6`QXq+rBIx%I{yWY0@~O zN{wW{t4k_n@2)~gr&3970jvxiwu4Y_7-igwOUvc;x94L!vs#)M*gLR3aRIdK?7wzZ zU-nQ*!C*Lb=1lVZhKe^4&qP$RVLCwIU)YAywR!yx`~`Q37h!@A_RdCrWeD@Vgouq_ zo|b(9aQPz%Z?eBJ_!nkOLGhZCD=h%V5KM;^XnA1-+h9Fgi&4&Eg<~tLCKs_(P~H$$ zZ39CgcnMMF4dx0zJ^_#hLbZS@!r!4-u0*9Gs6mMwqhVB7xCj`|u-H^^BiEDyS#kkG z$nonWG^&5Q*iV z3WNYk6-+ANtAoK*yYn#aHxX*EOq++d!_VP0*iyPr>dVU!;WSD|(Q1G&+cu$FY-<#a zD2vH@p$j<|om4-eC*{H>A{vSsGfENwMlqZl8$u$xwk`ARw7UzS6bIA0Z#RbJ8^{|h zDkN{P*6ce8pWNSBC;QG$vfn7VGf)W=Y92Iclnk0MO4_0k6VXPh_SMKb2PW}Yy>zg? z@-^$kxptjEX>)#2)zfx9>~7*<0Oy@?x}1B`aWXOoW*Q~_9@O@Yt&LI#1Fdbnl+Wdn7Nr zK>kXIc=5-JC5;E5Q|6u|-=X$$D-UB~0NK~@_q^kdJ7h5D{1>;~E^}ehn_+Z!0BC=} zHItQk{##%No+Zs!{ zZ@YXQJcj5}+7EmGO27SvCi-~4ChI_~g}V<(f8Wn_Sik)T-UDo5VEuhZsP0{0eaZ?e zI6Ty(Z5`bH)@KtX3i`3GDS!!r&N<)dRsxgtuIuZ&XI+c*dHZ(;hT0AdCI8<7L*)px zYxHzw3&4CGV5p!l_;vF5R5>_2iUj4)Tvt8 z>uNL)#vTn3^Bq4krsAsTwZcSt-d#-q1VE*!gG}0hop7+5JEennt(_bS@C;KmbSmwp zOeyp9r7C7Sz|qFBm{2z0R8s`}RVb7dFd0>Hx%dHIe%Le0j2J+y;ubsU2*%qKme(-c zNdS_;$=CtqN+QP7Q8~lJPZb;of}>EFR0T`nFoX@XV=;Cx&h=jc5Mf_c$kM{P0jUlc zQZMYEF&|GO_i_9f89C<|iObJNc!a{6d!H8o8R~;UBy_6}0u6+ji$7T+7#xZpz!}Ol z;ORiHLY?J&@=U*b#%c1MQ|D1GF=vR77y?@oU;5YI19|R1wIf5Zr zaGM?uV5sZYbD@)-kHFX-bk5E9*5B4U`!oOywaE@VSr@^9m*_pm0%g6w{m1|6KV$e+ zV5m>fItA~0@MoPD+yV8o)p_;@49)Ug>+Ctc0me|<<(rre1PpcC=H_diOwN%}Pby17 z&RZmmmFAc^uo9U%d4fFg*uz9E!-Z;N3?wd8kIkkWomOiogYgp7_L!h zQD z`RjbyzNduHC3Srf1Zb^e8|vA}VZ$VA>QspsGhFJhKZ%V2*txi=5zclrwn@`=s%os; zD6Ly}1j?=vO1Jsi$xzm{HVW>K3A3I@OR}1Th@o~e#b+)6Xrd>6x3RQ}#Siuk{n0&f!F^XZ)VCD3r>u1ih zxpHY2bIn@=q5@R~NeVDw6$3xuNBRiOLxM7K2FwBuX;_#{jsqYb2Gbgu9FK@5L44tW z$~Y9tNpTQ@Ezwt1mg!oZE`4iw_|7H zM{VrKk5bYz#ZI_?@YpdDpPP%gA{u6tswq6s*bxmy08m>2p0y~6+jedeXHl_us>@+1 zX%|h(gRM0P4nIoC%aiO`GbL^OSOelKITv2S^geE2s%8$ubFl+}SOE}gUHiHCs!Pc& zZNStUu@A=E(>vj*3ia>YS;tB;A@dgcff|Ze z*6x$^Y|7{n>i4p&8^O&huf9sfp6P^*N5Gb+aUKax$0gET%H_QU@4=YwqIzPiTzuj8 zWKpJ6H(AEqM>9x_kJz&Xier` zp>y@6Q_%YWFbp(_X%nkmy1qJ$Z^4YAu2#ohYy7ot<@){C1%}=0=(-((P00EXJK z2bp>R&OsJpR$oAM@TEDyT>$D(%N=U|KMD+kyRjyfTRqL%f1R%{hK%m1y94R>T`SOz zqu{XbWF43Ft{X7h>AT=J@wb%=V{NPZKy(o7nZ7NdWIbi;X3d&KIj}2XGct|pws`Me6IT9w)fY06oTUHZ8lWZ0@Ob--f z02smeIRJ8+o2U7F&Pazu=VwdO*zt%P2ze%Az8sy5AcLC601#)@PN^v>6(1~CYh|@~ zRWw4_5ekO8DuBliIDwHR&L|OB)I<*<2N8ix0st_C9JLSzS62(RBpnRSbjJ=FyB+q+ z)=mx|Akd?Ej@5)s$?eq2BbYdv{qu$?;8d0eaIe=dpEV~?^Z5*Qt1E*IH5akYH#dFW z737(Dx_@0Af$tpH+2|#$*=F67{ziYRfUzqF)vQOK0(5D;2@s++>jNl}1S+8bmN3}B z*u04_eX$aP_#`wnUc&HW4A-1UKq#cIcmXB#)IRp?tQ8mi$z8S=o0&@TIyuke;rVnQ z*|wi^X>uwv0Ok1wk~C(5M5hnM1RFIkjGCQ&x1*N#&|Yd)yuBG$oucVNAI@D2}d6%Q+c2nMgHu@ zT|4D>zxzGc$Y*lNrI)}e{!p@E>$mX`^3KQaQ&PJ@CQh0n3;w=9z9c+;$%Plle_wr- zA*DNca8mEfYWn33H~(A~ezKf0e}GjR=>r_M-Wvi*1%Wf){a_iCryQ6=TLw?oebwAg zgXaZ*rh9aCsqWh@>#)WTYjwIv?_XJSzJYh^0qIbivJS*ruKR#=&;NOQ-xnC_=C!@L znzfs>(XJ&?M#LVq z)Wc0D_bi41v>AXD0wCD2yI3B7@)=pW;xh*HNOBCr0(=MI$Ov+=vX484P-K=V5!d2| zv1B9)bu#>w)l2Dyjnc99OL3Q%@m+_w3E?q%n`Ie6*=>CO!c!%3_%KPIHcmo@4VFgo z&eWPD(o192wn^ot-QvPx$6LM?K?Y2h55|lqBp($gNNF@6L&*1%A;}V(F+`$9j+NN7 z6o|(-+M9jFf39NlE~(sJ$Z-PlxHH>e(U5_DM>7{)blE;)ed2AKI^jSJ~>bB{Vo63D-;>S!iM5kNQp9T`N9 z?5tVG$S}grYAmkov*y}r&E;nLeqLU_%sGCJ%$_(!c604L{q)oF_WZYD;-|@-FoT(h zP|BNY5PJPpK3cd$Zn^ar^6H;ol~r7;GpA0LXa7LiJ-~J}pdIrgnlMc6xc6RaG`}u! zNrTV~(O)sc)_Y&zo)2(0%LSVItN-d!U6XZR9RP+jNKm_2?Q_`P17}88XANC?wU$57dw+qUJ`L)B)}$xi z+J~%GBS{uRVMMKH0>Wb4Wnt8}k;8H%cfuG` z>dk>5rjgLL=D^uGHV>kjy=ym!lUl#wgiJ5G@(1DpB)#~`OA@x|9dkiBI37+5QDFeQ z0x?)P1+9$mh&Oo04knfmZhUeg9}^`46}g>|r-ONRn9fi_)}eg%c~K<;67?Ea%Nn(+ zF@p!IG}kWYSXnnOYFnL*AO$d}AT$!DQ%eadI8^HzJ?9=+&<=o3dsBZ$Ys;eC!txWNz}*yUwvo*;AQbZ;fRBg<$OTdNi3TW z0nF9y+%0>^S#1ZnaS-f;4xap8+0K+y5!lBl*tUWrj+8jSVhwCx2ehUSws>=|*seUqu>NIDad#apu)_24o8$ksU9x4FQFTU`+toq_JnKgTs%sAo* zSneUx4x_w}hnZ>9r%3A1H2RIru!f6SZ&On#a9SKEkj{ESnyE;yKws?&V{TJ%K6q-Li7Y zVwpZ^to-5r-*c$sR>Hz|0`TKvlI6x<{z{(Y8j49Erxz&bgN;{ks1K0?z)(Btex|+y zorS2nAoYHJahSf+{;Dso&%m1*!MTKcO@|v8nys3R=$)cx8W5lKw1v5`2K{-!kA3^j z0T=9=VS%zkEqAE-{RM_dsdqR!~~Wlsmy&eOdfU8rla zj>~%2U;jIWk^}0f-W{Hi)7t&R^4@dohh=sBUWu;{Fl00h00T~zQKl+u#MA~W5*Llf z9iZp#+i#Zdo&8-x%K#;qo;HBMn)Msy{)hf3D^@Ny^=7ZQ;&Q;>RZ@XPM`9vE5`-SF zk~39}@7~X@yH36b8>sbki%ZJngAYEypKzh^Z~Mtle=2F%(Ci=_ruC3R=v3=guffml zGb1!P`si6Q6NRvzlQu$vO)65LPx|A?BLieKinFrQp$w1wu>IZ&&H0*qORrb-euh|U0VSb#lgvv7Ni?-J*!^?TniYLbZ5KyjGH}053 z!|ZD9WjF2M2gni3C55t08UVaC9Gjm!OaG3o;^S{GOq+T%sz;xnHaGc%A*?-2?;HR~ z4R<39lI%Q5DWLQq?;V6akWAPU-sAK^|s4l4k7twj1A#-7MD zmxj;@)jJAiN#;m$5_5*YB1VV@PeU6Z4>=7?_p-x+r>mh|))=>IQ+2?DdW+{S`ojbUAU@}#p;%t(|mhhzj06+jqL_t&u z2(QjL_bizP2#k-Wlp*c9f*Rm2z4Edopl&|<%(G-vE}|lE?KWy356w!J0$5JH7spd2 zMa5c+7cHV0qU5yG&w$B8Y{T*Rc-VOU`R8THk|pHvj*#PyJq}x^qfG^%=bn3BUVH5| z84j?%|DHQwCx=NB=lsG;e!xRPl-!8u>o2drOv%R;k^pFZ>1jk{LA^-4bFuf|Wd4S;l;X}5Shu&Uyh}~MWdvMg_?S0JFB8TU__xigx+qH78STprrs_Q%M zBL_M@>vugr4je=9xe1Kzy~oJ`U>Imy^KX9#c?(bl{q&$8`@7zQu7sKW1%`$#?Apoh zeeD8jD^M8IR=bU~LY!QBM3>*p+-v8)hdHktoWCMU`5IJ!- z{P(rgc|DWgdteSb<+$?lE(t(PyhCDH4QxY%)_LBGL1*CdCHu?C& zPvw~>UXW7qxNHn+ZdLTgM@#zL<0X!KL{C;GVN94#1~(TWxTc~qEMiKroY^ft42RhP zfEuB31~VJs#8yAd5#ot3a?WCh50}iblQ3RRlNPUo>Jj9HH55xHCf2Q63dLViBOw4p zHFfqOHZhW5ea9y-EO)ZR4jqh@4EclUDMmqDPlc6E*hM#fb{(bF(vH$qT2Rg^qXxh* z{(cO;v19Y)%v%82KqkL$kUfMheK3A%IkWl4H;Ef1ZaC`Elr$8&0OM#tl8fbCu%Iop zeJh5~Hdf;T^toZc+=x$nnqSENnTwGSud$~AC^%r&G$~!n7jj|)7qkjY*!{pnM`6C5 zoJmz18=$E(bUy5&GL;GfLlg)DRzlOV4U-FzDW)VIY-KoVay4*{fDP22h0wpWib*@n zS0gqpjR-3|l#FYwpu$NL6=FCS%C;H?(937G&yUy^p?3f^=9LnOz$al?J_Ta{+4P$z z{P#QvYuX8m))W^>9S<3;rNyYf>&Zz}n;r5wVPxqPBFQO)ieUlsb0l^&d5PJXFsU$= zgyxlnt=wBC9u&<@7>b@R|aVO$x#I$&w3;=+DiOYM5mk;pxGcYBwSH zD92N?VdHxG)gI0%p>;yZv4Fan6DP3c|(59e;w1A3q)e3xEuOw&4Bu0eNpw z@^P@7amE>P%q(h;)4rw$Q_65n##ZJkHa~zPjvGSV-AC})g^f1RBArX=BKw;`;laHy_wW`(iUCZ+I zfQ#;q!+GoaYzB$o8&2@&K8taNbP5I^`nRsB_pkKZZ)WN_wu5i)-xU~Y+ga_`w+;2! z4s?87XV3iBG`?Pkx-M%aED-oO01QpT?C+l*fV023J>OZ^O3yb3|J2|09(*l&@o`h@ z*JO30z{0w});+SPHy}49WrM0 zXu?t9QbYdJE3dqU58?X^T0VK`!3RxES!JZwtXd_1heg~??%gF9Uo0n|bh6Ym)&cB% z22|`Kgu8k3CIFmACQqCsqwxN7063fgO3kg>Q&dD>bVzPqt{IdZA>pzMrRd`fXv>zb zHo_5GXcU7V5yWGUl9XdnERV>M8jh{C6TyfAue}Hvc9n{=utZ$NW#sZ zx-Wjh#^Iw;6^|P(v6&cAqjFYpZ&P)PG*)3ijk49f`6C1+8ZIVh4!i-R1dP&h34j+E zpCo>tfD$w^mRirMOm=DbyULVMQG0C)3lDvlz-JGa@FCbI7**+d1+Q@w^|7->43V_G? zHKQa81D zJayj5a>6MmNgE8Q4}r>u%a_T5g&$+>lqQ#c_q#Hbc8MX(zX5{G1cO*UctR@v-~wml?BXp-{d} zvJrFb=0W5;Z0Fqb&Lcd1G}clNpx=p*U7xLzM;?7dX3sc^GJ8#gtD~hA5ct+R@5yyH z{el#bIAadqOn;9cl&!VNl`ZVx*z}>mOlDxP`bXfaKp*RxZNP>0o1V!UORRg5&KUrP zJ?(R-PXYhgK$}`^XuVs%)iGI@=-u-CeGp(6{9FC3%l2JwU>Uu^^h^VcVNY9duk3p< z1kDWkXk7$BUmf&gf7g4^l`!+`07GkEt$heS{nk8dyTKi102o@Wa`1PnT@Sw0;h*ab zpbAzTIHN#v#!AE!gv_)|S{qExUi)I z4cBdqlhes#8;yx|Ci!PDSloqe7$ukN-Y#vJYWrY;3^>tk0m9Y$kb?wpu%j?)6xpRx zNhEEaYrF@%ULYiEI8a6q0NjNtd1u>R_T7Y>*#`x7x-5Ob03ZdEx_|l#=QCfM36Nq=g87^K zp5FUlkwMjjBWW`QR;=64dez6!ub@tEkFZ<1oO&AC$Bo91F%>_=aIjgbBvBJMDl&o3 zY1j!S12#}4Q#GZctwbsd_ee)cAyi%&!k#KHG{>!i7FLIQH~R-TA52&oHqkLOUxrUV z3RQ9jf*BZaKxL?l1yOSE;i02(`%*w2>?|s8>0qCYx*QfzbLR-hC&I2}jiuU6MizCq zNh=_oA{4K|ovT(#3xXtL`(xNl(gg^kQ~X(MIk__UsOge4b(Ay^npTtVc)(*iit^5F zyJg$LPenFt6nhPfDBs6&zGu&xE~lP-8lh^KIr?2O{)dk|_9(v#m&?vLQzniYDd{Q6 z^2&41NFHqW1XV3_0y0snSHZGA@zhfW2%m7=9GNs`JgFT{S+Qaz`HL^$eV8G$j+!ke zpLjfku7m6KCAsbP+vMcAbLGyv?vSAwnG}ktlnXDuRL;NfLYXmZHno*6k{_ORj(qU( z`|{|Y{wNbikCVdkJ*I4*9RU8(l4Ww)53i8;gk(T|y3`^BN`iUSywXUnA*Z&96*{Ih zdrf9=pskq#>{Q^hwTv~En8muj{C5I|{ZaDjZaV^TRqL?mo7QpayY;ze_Tl;z3=DOh z-J9+6d4JpcM}cAA^#|5zZUo({9{`5kO~J|dmIK4SUE8{tttJTWj0_>&Q{UfNGpzQq z-f6)B#?Weuog{Hr_ekn`tEHRje%5DvVKyz=^+ z^3X#M8Jv(kG*cdV_>VG(L9Lm=ejg#O2Yz?IY*@cmCX5>|x7~8HWMpQLD6igzAINKO zye?TVGdEs$J?!FGDcoDgz>A`ouxcIQ;ceTt%2+_%vBw;X0W|C$>{MNS19^u7ngB-A>LXrhMvSoWgM|`?@L|Th(`4|NG4k2kHB$S+^LSuu z?jGyYbt%|V007{33{hyOrN6a8c)3*a8%;utlI z?B@Jy8p;4L)Tf`Ise4e=`>ekHInzHI80t~!D*);Pmu~MP832a8+au_&9)J_{<$gZ) z1yuW4q}NydU2m@+?dOmG3uD+f#CxD)=)MlvKDSCU9q5v~%2uGe=vU90%#zge~l z)|PbOSC)jEaIdMGY3udv*Z!mD*uVBFzSa-juq>AOgwifXN&qvWb}*5Em3!{}mCT(p zOJdvW8T`Vek!l=&d3%BUiJZb(a^t2>og#mD;C@&_Y%IuW+gw&AkNxQ}*-Zt7v7^Vx z_1FEkWW%0mg^O2Te^uW3`@1sj$Z2x(_18)mOwZ@dJk#U*3Mj{`Hn zIsth05q?vVN&|y&+K>#%Ef|Rpp$~jU^@i78mqni}h7E}m7fJDv!?Puo&|DHZTrK1g z)?qmlQSX+TRokRvXDPmfHR5ltAb+fbkeLcnoP?XnlL8Dy=TnsgtB;ht5ilX~#%#M| zAIFX7VDp}0Le9lhqico@P_thQuia{gLufP?W^l|%i5;0Mp2S#bBG&A#BJ{YU7~jKv zVy|zL5Lhn{+x2Uh8o*|U4YHBT7J>0~2m+J{z-}0JA`VU7Z(@1!$b2QGC~ixot*R33 zLNzumuz!eHPy?7+!*)MxB_Yr-jGS#)r-TwZwZpcBAUHvu%`1U&crjq4RC7KRb0l2Y97Fk7x1cm-+In9mjMi--va;wteazj@l%3O)y+zh zXcZJKQRfCMd3;oY0o?i&Gyvd3VMiMgocLg&eN=n#0vuhu9I$_C-mJaPYx4J4k>>L0 zjU$AW!;VTS3}VzULcK6~1$p8Jgu7y?JDie&io95Aw{K@Xm3SPM;}=O77beXBWkR`n zshTSoupI@+sRutvh&EPeKis)Bh;SjWRl$3M=EV z5*h`YoD4wpNf_(88OnNfuy+Y`{ zgD9XVh(1w3c_4y_A}E%J`UJs(&!-~2LqbR+y_ZQcGs*Pcd%JV*|F`y?Gr4m!Nd|~d z|H?`3oO{kaWuLwGIr}@`TI*ZcvUKSpnK5m$>@O*kzrZl=-n>b&iORn5^2=l%x{5nD zeJE}CC8{92GP2=-;6B_C)^FG#B{1Q0=ggC3u!l+bbAGUOE1>Z?i2-Df&diW=ue?Iy z!o%g8cYj^hzWb(J1X#TP-Us+SR&M;#e@IDrm0W+rjk2D5YV(I10EuIXh%S~VpL~MM zE*V@G!B_Y*`uPUSt8cw7H{bIU05)cD7-oMMPz8o2ceZ(s(s%f$4T*CAb0#w|Xlu}a zl#TWRN!EBWWc<+0JtjS(*D8-+|Gr=U9T`Jy6VLY08n$!{z1Mq>lm8ZsVOaV!(;q!6 zLp!PGq`!Hy$ol(m1HW|>cD`zFaWi-w8>vzcu{_fIjRxnF{8%}BC|_PhPi;E`=*1UZBo|+J0Sp7tw@t8T z48EG?ZYzS;aj--R3ghtOQwBo8!r_DD4aUq|2SYS%IwI8Q!ugV|az!C|E8h zSuARhDQP8eq8Fgi-_i)Xr5FchQZuI@ob6EkK!98Pm~08hL?09y!S!f9V4Kuc*ORJ@ zXy~e9>Cp139-gv+ATnRf#|o}YfCuba7+|1hRFp(Vgi8dzYJmX6C`{1)0G)nJww=my zVn*%+kP9Yk1$cb`y>5bbGXN8Kj@H2fui0D z3JjI;Q}D#c4zSiJXAMfxT*(@Q;sl5(d!+f5b)Fa-2Uc^M3^~EDq;|lB4lwnYzcm9$ z53(_>2wAsc+BA%;n&tu2YL-@d*xrX(TEQayP0j7LG&COxx=F@dpF9e!L;UnwFb$WK zXl9uv=`1f5DK8QmzN2-;YmXL62U$>TNasLNbDaQnf@GWu z;>V7`yu64$HVLVt5NUO^E?>HkfUJ7i3tKsb;Fm03ESm8l)b?Nd!D=~l@E~$Ev*c_7 zQ{uVS1N#r*AN*TGW{#OLQO-Z>EP}EVcJJKH%iA~PvMa7cz&l88x&3R}xbofm z?vpp)ctd{whi8zxL|+ot`HruANiM(aQuGYzL-gq=(nvo4+FH5grduQ~J&UZ6NayfE z)l0w9exw$MJ^;Q3h^d+1{T#w7K{MzoWtw$CpQY}PE^6l*It}-vHGOdCX8$KkBhmiz zE{IirYwmvbT3elXz1A-uXYQHfUibH`ry<|XZ^zHAYpx~Jo^d88J=)36tLL$P^E~U|IzhjkawS{9&>Uo7Z)-Y=Q9JyVCZUQVn>t`3YtC$5vuZV!(qBDB>!#MOG%*9nM#P5b#1 zKa^`Oz5o+$EqQq(B)_6gHmqAO4?XxGsmts#4zt`-Pd$aT&W=W2l)UuXtMc?SzmZPF zm@m2LVg``Q&>74mFY5vM!?VAWN(RguZn$19Jnww`qN=3|u%&}TGeH3BHmsEe3l_)> z7!Y5LIHix27Hgi_GN}U8lw)#RdDaq%##c_IF`oME?_|}c-T0iT>C`5E)91+y%*H9o zXu$sE9oQ$e1jDpp!gbcv!C3VY0ZbqY(j}V8OQT?IQ7M4J5J_2ao7anfuUCg1_-o!IP5qdgc1p!5k1!qp8xw;#spSS2zwFp}u- z1qHyG*@(*Ss23;9RzNDiC4Q77VvdYRNdn9w?*R~M#|+w7j64k@%T6_kwj!|I(`*KD z)rvE|egHi+Zz{VOgGn_Uf36^WJ$nFJ{jio@fSKNI#F}B-8p=vxZZVZ&a_uJ&zzHz4 z8I$)wzXs^(!&kKjbr9CHhQ=n(Is+8-fyRKX_p=Wm%KczBOKdRkw9|*2PS(Scx&C6- zDv+dM?XZ&=e2Jj}RB30Ve(fryqx;Z*Y_O#^%=EsP{cUJUYOqo`3|Clin1u3Ov$ph* zle($A26JzPw9t;yjyYca*9bN-CSyRTk7_W&DB9yA#Aj5Jq;agEl<{Qc>4uGL!UvT4 zEh?0n0|(s^&ak;YfOzxb+1Y0_9DT{T+|LV45+ctkeWPOOK79NDiX{j4OXsfrn5v0z z*9SYkiW(5)3+VO32Qd-zt}oZ6R&1ZPMycAnQ@Y5KBlybtQIFbR`(c4?q?HTE8Y>wK zm-9lAA`L#B2*Udk6;H;Rl1gdVxI^0a;(Lh3U{rd%jLJ%p31idcx(hGl*uJs_38mlQ z)2mUy=Us4~oC7#aC!h1))gPdZ9v}-A&66WAomrWh3wf_>TE9^;GcwUMygk|_Qh97>e%s8&h^+aZ990OQT8`D1Oa&1 zW2a!5(5^xI+jtgHU8WyumvRTd@j}8n8+A64$?Ae5+4f9sqrhn-llA=7ZLPBEHJ>=? zRiC-Zx<#!cT0l#eJ-^$`J$w9GbUzCio~lFxPZ6`N=kcub@$fkQm2d9nhpsxlUY~2; zbum~+$BV=s9t%T``tcUDO|0`+N3gEJyFAwK)_k~jZ~1oxh96hp+NwZ6|&msQB2 z{CwGRV3*u==hr3DFNEmOUb*|;`(;OA5t&%<0|R)bEm|WWtaqe z2#66tu5Wg_Or1H6tPq)U1mD8uhDO}T`lP$D@ z7)nc>@$s`Eh}{PRM3Q2$XJ<*wxG@royoaWgYb>vpR(#Ytk@#SwG`@Q#nppkZ@Ws>s z79Y%mei=y;L$FL(1lP#(v7h>Af+1?8yj^G=x+o`zoTnBIgo)Q6QAEQ*;Fz?-B?tfz zkDpxt(Y#KW8t%|5g_o6_|7eQ5xSqHw?_-9u(knOF3#Oyl&2#+6!01iJ`PGwp3Ji4!L zqvugzr|kz=MDP$<9>5-~rv}@E;GY)@0~nSVC;nWo9cdSHAvQlLZ#X6mm9^4S3P7xC z5SK=lceoiMO6o#j#iBAQhFJJ;r1x znnpyn`W0uSj3(vY8X}v=8tugIVm;WqcMqDI!SdjP56QXbolSG9pQ#J1-Y=^+Zjl?m z@MTHBKevsXlT8956CbiR)yJex*4(}1UbZ^Awa#p( z4`T0Wm{s1JcrKqY@Gx9iJWn+6T}{dQ&zkhQ2Fq}Kwe|C9=eqCU{-@jeV;uipQ4}Eih@U|{OVV~k~n<380HbKehq!J|CJgv2XDLmHo4}?t8s`&N&{i( z|0c4sl0ouve4{>d{q=IV5atFmp=Q@OaOe;^h4n_zH<46d0WeFofI)=JLTj;XL${o%^WIXCR52Iwf@QWG8^&F9gE^b(9iss2iZ6lAMKQy^~J__8w@D&$p$ZlASn~XNZ(IcyXy$@ zsVtLPSiY*_La87^w*^;&uJ&eJ4MQY7B~8YTpC~aIqa^?{vJGEK4L0h>oJ&d@W5(@2 zwpZE!WtI8#H=@uvn=!SA05mmSVs!Rsv8N^jZYdLW;WWWOfH%Ol`Y6^O%#+%NHi?f- zp|<>`HJHGlz1CV!o8<;ENiZ7J@;^L^~wI4{^fND>wMPS>*rH0 z_Ow)g_ump2x(Q!*l?}cD>C?fZ78M+fbovw+p1h{cG%(bR1o~R8CbNNe^y72$K&BD# z{c?3RJ$(VTnivBzZ07#I)O zg7?T)^6RI5ZGsrSaO}Y6+pVS>fK4!~KlXA|7fRPYJFdqPs3$Wpvk}QccNK-a%EG@I};ANrWq5rI?h1B`5|!Fqz2LSyLnuHb~jKrixl=*p(+OyAMk%GAI4` zUm`e2M*v(9pFoa5u>rtC@R5tm&Xjlt_E5k}FlJRv^VbBhuFX3vEk_EZhpZ}6i`F6x zroU6cSTAH6k52#%{s0J1<1q?DXy=15Ru2tUbpbp`ZwC-mT}ssp48+W<r}Y zK`4x*?(auA`Z0y#!YZ0^*GCyl+Sg&n?Crz(csX$r%wo`@o*zF}5E?p zj$>8QK|AyTVndOXNl-t}QOOcYFp3{_)=l5#QpnK5BfAwrZ-ObB0YV)m>bHq@BmgWR zAx1(oM@yOp4W*{xRzQAcfN(Fqa|YpS{%Js2{odWugDAEw8ZE&n+yManK?Dc|CE*r8 z|Lp_#x?sypia$Vld&yCf)U+B?YH&2E`*`6A1bFoV$ol}i`VtU<8$ddJxRcVtMWZ{^tl&2o9^<(FmU%9SQpc`2?P^XAQmIovDHKmP*R z1v6mdC(uj;Xwi|T=T4KDsAyUB&U?IY1_K1CQ@Xhw86Y3}yMY7Lg$^L*AAQ4^^tH*E z%)sr5sNAcE{X4MBu)qB?tn|DLtE|?1X!*20&fw&A63<2N@1Dyv$l!FU5_xRqxy#_b zC&D@FXx3ae{S+7uR@kruzh^BEZh7)A!ye=0o1gp_Zv2r<22|*_1Dl&0cVOR-0tl^h zeF_Y%nmBQO#@cq^&~P)fn>L*Lqg;{aq;OF&MIh0&DvW&dXK$4IzWFu7=;+AWN>uEY z&70*_jFzK6dyK1lc6 zeV43Qu?!%%ivfZtSHR?(Z@vyo5ij$m&z2MhO_fWjL^`IavrTsH-;YM&VOfCO#=`jv z@e^~(lTZ9Y{_wX~r4ciu%$g>nuDVomh`J261xWtpU9#tmRYVMzkiQvoEP*rOxf5mV z!a34G+KT<#cE}jgf8B_AdrCIuNLG9Ht?Jwf_NF{qf$0B~|U z_c{o~snndxNF$Y20p@U_z!xqEhBhjLi173@@rjG)9EfFeStjVGn}C=)f|v65OLuvR zsrw{?HvGbH5x|`y7!ajwWgk(^wjNkPXP0zU;@et*XgXD){)*v%v7s|TPG>{ zni2A*jtN?cCR2?vfezZXja=B>L>k)&qDoFrmsW092QM()u<9yQu31>Bi8wAgnlFnM zEtE7&!|};UQczl9q>J+LFTC*Li%b@vJ-ockojqHcaGQvLQJp?xnh}fNvSpK`rf15O zsZ$IqymswcqaT{gbxg;!oRpj>KYskjFo+0ZlWpkgtFM$t9(e>^!X8<^XpzZ;@{1>b zB@aFHU4Z2ldF{2=#TVQ8f_V!Jmgh}|+~(s5+K!P|UU{AV7)H=h5bPupL%zH~P$zD` zb?R3K6J7|-L&)RNbV9}uZNgzDk6niO^&h|LQ($PdfdvSyxvu{d7+SSsX!F4Z>&r*% z-DeCu41hbU7$=`=0X+)ISE~%3&3y9xhyJ4bTKf0N-*MGH=ENheml0mM zapgActk=T>*i7!Zn?r=v;U_;=o6MY%D~~_=ed7!oU7hZx`Z#tTWEo5i7Pu6TdNRUN>#I9H(ldiqQ zX#KTS)=9zot#a(GRWP0!SQ5rL+a+SoRGEoWekr+zD~rn{1V66NoOii|blZu&_QPik zc^NKxB625HXb~RWu^p2gDdsQ;hNqvp#YL2{njBF`qzM2%YJ#M!A+S|( z6A{lw;wA`lo(73D!Z=j{4jNzvyQ>LcA!60l(G4TnuWtK*N@d#kuI65vQJKOX8-mTS zfOf!^gA6fU1YBr3yIyB6b0-nWnmUkU090MHDU~z;+yIlTGiE()8^E4AqZ@!|fEgS! zzuOtOwT~#fsQ!v-Hqno^C5xt4DNCroX|%Cw8!D*O)NKkdT>+>tQceYh{ghp!S=oZJ z5|9Cy)qkcgsTXY*6ctSbbD#~=Eo_n>a}^bL!2;r;CcW{hDakcpri=ji`89V-i|R|3 zS4ve4%qrLIj0%*j)X9=ca8yzb{%(NL9w*nXbx&D9rhs%(?qQOzDJ_)hh8n0<%)dnR zhM)No2;R~kC0*Oer@v;(wsXrQKPJMOzS~-@M z0cN|am~9D|=~s|W9_L72HsW|mX{ArLmlV(=IwciTY$EOrYL*qu&UJ+_q74MuP!>CE za{|n<3kJTksvc<{SViua!lFXi5Bt7y#o0(bCQEWgh8%-cuCA#zY4WbQ`f6j^*UUmG zfaQL`x%ve!TsU90ZQUlDHf=>IV3JHm4yp-OaWgM}F|eD;+^hUeHPT4G|LyN&!Q5Gx zxtonH;{EsEFS#>j5=@pw3cqo3@4fe$7sltG|C_w>=4+CinkwnIX9TPC4}D-Bpj2N- zHo*P|!A{bY+G%J(y~_+&$ec-mp-$Q^W<7IHL}h*){*U&*f9A>aGOV&%^P%O|Yd?dN z*GW7Vy}x@dQ~iU}sY>LrnddHp`_h0O-}S4tY|VAur@&Ba!A!#r{GPRJZFq|Lu*W#X z_9y*GpY|h~bUXL9R!4W6CXer|>qmSv&O73380kTe7v+q6^Jdo0$U#qW5Ur09*U2f4 zE;dP$yn<{1-Jd)sZd$psf&fE-JYyiJbQKmOr46K8PuU3baig^Og{ zwynnbT*Z3VeDJNq<_7#4TAS3og0PuuL5cp2yx>BTYEF+tFEch6RcP1}<*d42c_?CdHU)H7FsZ z8R6jiPPusYa{TW4k)|Pcu%3%Svah2@#^5t`w16xc4MZMyksFz;EUEKnNj&pf%2Snp zL~1symVWdYeOd`D>A<{*4OD&F0w;`@)CCJ9VbWCb!{psoUM3~@Mb_@l6UUx>vDF|) zf?t(_8;1)(5&~nF7)>UPg_1R6Hkmz=j9Xzd0HucGHy=47-Bo3jL*;1zBVbQI8p=Na znGgk4FkZ^M1pqMY1S2>BnNIu??P~G{r1b*E)Hjo_%&Ad8S|99<(|GgyiXZFLv}=8o z<9JYCVGNj585#wZebkr!b8-yB zT(VBVpbKEACTWdabzsu>?F8(RO2>{kG#-w?LmwDW7*!7HRPX@!)sF+_Nr9pd*Q&BR zsy}JRr0OJiLm9sQqEhKNkS`^zwPgS3knrRL88v09M30*y{YW4=R5-h}jq@wG$45}3 zzpG#!F*P^9Lh3pD=u^H4vG^gTOGJ8xbm4~JYK5+Afz5PKo@)F8(Jbt1Y2alDs6(4{ zMuv%RRt93~F@Qpjucm0W72G2_3i64(=34N@3bXJ!*|oFuvF2{7i#_;?1O9at_C zNTsL3*mZ{vNegCde;@jEWE}SjFCdto8*%mM?r0G^V6=>vh+TX3$=J-Xk`36@bdfs` z@5A+@QQm)l4M8PWAuZJ^h4`VS11|e`VF(8NjvG5x4jnF#EnBz9k_C$-6F>nmrpPsjk*T%8klw8dix!+9sCbkgk=(l!~7$Ud|#F~)OA@i5Y(n#DgcWO`v78QWW%{eHR`fVcA)dID4j~W13SY zsFdJ{(!70Azi+qn0Rn8w@S(e>ff^3Z=Mx();g}HP)qMO6JLvwd>$Hda(kFC0*6;e!^?HX}%cq*_*802WWNmM)vwm0b>B}goeuerS zMIiHCmo;EUKmC-|#kHubK|g@j0Yj*oi+yV9=K9q9sH|it46Z-l6?FQ-oT}@9Ll3GK z!hgdia(t;Tm(EgxPYMeNaB2o**(Ecb0HU-}w8v;z#R%!7tx-vbEhJJHleLS0jg}HJ z)WFzvYP(|s4ad}*n3^H6De1Tv1d*B#z^CAay6-6?3l94@xu5(1r}oeQ2_cd>B5e%K z7l>Jyb_Mh*TJFd%kS4ZOL351~{>;_q$R&$m&0!k%?;wbYmz7fbPdWgv1uemz+Inf< zcSw5L(K-wb!~B~{@QNSWl-<&ei-#|4qUv4lCeSJ)GD&g>sLEM1OA0to8`1G^zxkFd z<7G;Ngz|amNCen*5tO9BcS`OI*$$hyb;mY@u;-W;zI8DD?d@%VHeVT=ku7JRvqHY} z?QcsmjAJN%n-eEaG+=Zi4B%y#ULvz*&ymL-`=LpH_n!|wBHK1^g=PFLa*eoOq$Hc? zNH-}OFT3JmS+nLn0?>+iHlS%qdGt9Ggb81DN>yxqaH0)q1s1KIGx*D}Uq-gou)F@B zto#%hTGgy=s*^R>@1Fugtpzg;3jjW1?;iFT)(Jk!+#B4TWM8*qFohf_r@3uC_O&|y zNH614V0dChpRqReI`kkg)W$Py=3*RWK*!XDgfnIzn>_L8!?F;d)24D73}DIx{OspH zBYkW$>Fe6$?t8u|XPvzg#s@R-pZ_Gk!^EW8WnaAgcJiry#(=l=>(|R~o_d-H&RF@@ zJ@=TbCi@TUGpF1~G-L@*|0{81Pfa6#F#d0~bquBeohE_}%82gmfn8ZNd!a;yMWciG zNBPBXek*mD^W)#G+dwKv*kW9PC;~Y08UE)&{G5b|X z4Ze`w$BIPo+ag|-K_4GEOku%e#*p4@o}^8mE`1E1<%RiDw{N?29z7_o`Z5APhy(_# zY2CWeZ3{?=mN0@(lE_{Wm!3iJs?(St8}^Z(_h1eTe6v z2Pj%PKI#2x`ki(S{eJu>zMuY|iE5@#S@-kF=9(*6KMDfPhhn$^p&KA-*+}>yJ+N}x zVU(e9LVFrLMXt#ONK|&y1jGR9!<1E||LL_m0TOuXG3R$KK(AMWS$qM<>R+qT(6)9Y zeJU!YsjyIL`Lt1gp)iM$8JQ9?b^@l@EToYFq=&ZPpqz{LhTZNfg?X&3B7mb!dkaK5K$199$XB1DvCK@H$al0lz?dQkBK5cB^LG;6Lei2Z3I(~ zL{e*U34N+pvNKZ2+EZvErN<+G^ujCeN;_b)gO>x9cge~gDq&f%JLF=dYC<=fa?$zn>dSwX zMi~466c7|2nAZ=UH%3oa`;l405BeiZBbi3F)ku!?_u0l88};Z`S*`idGwL;;!O80+ zo{Qe!J(mXyNl{K!BF}w1zaPH>@4c;MYpz>rn-86=Woxd#dhRiF>yNjjZQ^-+J&Lt# z%|FVK|81j^%@cR9>IQCGeF`%T*YQtRsn!5;y6w#GAE%{8bl_8Oq&Zae+D`X5Q^hj_ z^r?&Vv3@-f7`n}qerkq9rscn$_@P{Q_HyY2ee__4JBnlb{rCme)i)AwTPoj!DLflc z7=pIo>eZ_W0{IEx#g|Mcx5;NdbG=kE;H_P^j&xgpFp;KD|N58YN=}eH`*vcYX23dp zL^iBnE1$dRCK)p})16MCQ+6VUF=5+vETjqZ}O90J|!I?==L$d zWzJbBQ|2!rA8wiKdh=~SSc&AMrAtjyqx2$O5`ft^ia|A6&1^*L+8aBi7BgZe0ULxj z8_5`ZYMi7Ku+j(9W(Qy-kYS{|%^?XXb_T0=rK-GG;_>;b!*pGZ|CJLHUI^yKKBPzN z1eNrsXUXWri-=6lC76ZCY06Twd!I>v)?ZrzFhFhw^PUMWh8=We696%Nf}~6xFaGS` z1Up!EI3H7Sfpk%)eXXSid?0;oKqnSg1AYQreiDSKEvOG!7m6NAgt0Fystthb17J|l zYfQSzjIoas)Cze<#tlxbfQZ$~z3>ws1(kqB1%?A3eZg}-inZ6eKW;tI*xN*Ve~Qvp89$eUl=_D5?QB!T(5yE#5YlaADLzdI>GbR zZ6arV59@mIw^K8;3L^UhE&~BD0RZD*#gaV$NY1C=+DE!Em6PeEgA|1X0M#EpMx=MM zL^;DGE(;KpHAcc<&f7VML;d>{M7NOv1rhYV`Z~)C;R? zf^>A-M%7kCpR=?HU(;xqLl`lni$Y<~e50eJi+*LImjS9BL|ISF&Lr}`S2~H>wM8e& zJ1@T}4tyq?%SfpQ&{rSE2{4LB$wcD-1UBwFC?rXgQQ6tB-}nsr($Y1`gd)=e(91iP z&;3}7D!};&&rjeQd@$o~mk&36D3hm6L(tl-Mff3^QbwnxA*mB&awosfeO*bNECB?L zAD1I9zx0ynXKH?qh>VsM%g>SrzVm=2CMKC^=bLW2N&fRc@5L1&PHw#6I-V0{@(KYc z8JMI$d-Kf%q`fY0u39A%r%Xc1CJx|>C_8?p7oN9L{!9RwDiRp?2U6Su+1zpi2R&7ZJooYZ ze!M*1dt1xaT({IG!O+QCw&wb)=N?11{&-8;CZ5OFqgcz<{G%NCQ(!nyTiQ^AK*pmc zJ-(i@UjKgphK40QezwymkD!58sG6TD)F+0Y1Ql}XW09e`5PF$GC=sq^wD3)002M$Nkl#vY90)20rzc9-*epq&HeDj{`>HA{lWH2rAwNq0}AOw-zod7~7sqwJ?G6(`-V2c!7 z+h`0QOrdJJQ*rS?OloTG)u>}X4cx##PJQN-DO0~Ix5%{m1u}Rl>kH5`Kv4bIn9O~p z%?#qwk3n7lC=Osg!(}=ezTb`PQS3hZ={ux8h^>#Z&XfkQ=iX1(o2N2!WjakZ34a6_Eod6XDxh`B2`eCVC3l1ynmn7UXTmY~j0G2Z{ma+rpxM&ymhKu9- zV8XUXM9J#yyAX!g^og*QL@nEcL(%%I;H4)Mf$l6AXj16GnD@bA*EY2x6@`065c#PQC^Zju1~cY zZFbnhfev6Ik+tt?|8RGY)Be?M|CuM#zXu9vmDQRLE%!*Tc<5dyUGh4K=c4y_&t+5j z0|z}-i9Gl5{C>PV-g{fi)?Byz6c`TH*RT)b;cIqqAMY>29>aU1kt`3eey82kZ09bd zKGe;m>%7YCwP}<_HWlfe#US$7V?Sna5Lvxujr`;%Pw>_sBA>bLTKVFaZY6rST3!a& zslHh(=Ht8XzFTH85FJKquMrdJ!6OId-S^(X0HHu$zYKksglohtgLW^Gkt$205z1S) zZpPd+OKw_vrBomj^X-QpmRH|-Q}Co08-r=qg2ggv`T{w)yFhlV+9E!+hXwaK!!Bsx zNbHO`5=lmjK5_%cM8rr(S*6r%+i8S`)yx)$zjX6F5)3QIn#IF|y5Ff8TUsC$H zF!d6Q5QOiRN|to@!c1Wn@9u>Obu>zkt5v!gG<#LkkM>dxW>Axf99E4$WyjR~8VJZG z*xFEqDhH#cRW++RK`HuAnKmc;>3TO0$INq57ZQ1mhfTOtn*==8wglTrIy=(TfjdKgJ691nFQDYE^N3SI50VzZPb*m zW^?VN07H$0?SqZ#2XOas%^g0lY6>b5@3#4)2MHUib)X>I7Y5Pp+fH;h(da#m(p_{! zDh?e$@{nBCvGEc+Ggl%e(!Y2q@&Uj&dnpse(U%U#F{Eygys@F3(*lPVM&MQmX%Tzu zX!iMp5uk!!EK&a5n2c-6s>MGjS~>&6Bm+NJ7ba0U!WNt!{`{B*V_>{Ukl6I|6fgzpr zlTUhIdQ6^+p5M6@%`H5*smG7{#5mdHvDwi52Y2w^+gi5fy5YY8FjO&63-IV%>2Q7c zd9E`L*ujeP_~Kd19;;9G^`yrc*ulJ|=rK?8(Kj@!W0)fF$J)j7+-{I$wm808uh;7o z$A299?Zi6pK9+9JI`0E|Z8r3%A8*P1*ct9bC$2kj&51?yZg=l%wU&pAY_nLO)3xVt zS9-jSbr98Zal`S3@2*C@N@ZLiJ7CBdFHPnOA53mOWL;RkWUl<+q5CBaCe4>9$u@x2 zFQ5LM?BBEBh~!QfH^Jzb#gY&B-FM!TpYrf;X>O4_zI+?3!7WmTPtw-y+vMl?8YLwq z%Qx@2SEfzNg)um2oZffCKI|nM$jzU<$(XFV0YfUC5)=_C>$h$q+sR=$d)ZmCc-DN` zy62dD>ygI+pC5{h&qYU$0FXHgWNPkgIk0_)?0fqSvDcPDoMA*mTQGdWWa&>$BX}Sk zGjE7QGtf2=(ObTL1JR$g$k>F4KP=0rG2_t13p390swdZ0ULxDxeqBn7isW!biR{?B z%>}%AJ6`M-PJ1h0?iWpLCa$5>V0wAk)ZN;7T;o z9+kPhi9ruWspZgqX(Up$r}!8q$VSY8UFbuCCSVHHBD#4;V0Cr%XOi&SLQuDCh zor(p0u~Yj%&-p6D=wJ@rsD04@E4}&ouD_Z7$@X@R<4ZWSKb^;ctW20j=kmLzN>t#c zfjKUKsscP81dCmi#ZYma$7af)C{+VP$eMz$q{)x0gS{4$+a(7l;cIz3c zU2*VUplqsls2YrFYINT#?(+8a<15NF`2()iOs-~RHJKZ;GZD(l3icCm9Kbn!@$1w4 z)(RSpzomILyCE`%Wm}FrWGGdy`8XpJ%FMJOv_<0VbV=> zd0%)4Fci*kG2rzG0Vks~vSjwmSwspa%F+B|1c9uVaoj^W zS=kbZn?oUfvVK%VF8Z4qA-)l_b09BP=U#Xz4-J2Li-c%IZ{jn_@8nA_}ZOcHD>3RUVK@4xKD2S+)eZ)o4oPbYtlpn_^f#gB!Duyh_+v} zV4jq7KW*gNB6-HB6qaV((f;bp&j?NyFE_rqekDpHb zI&{|)fA?B5`0(^vZ!M1Wyzb%Scn2D`ayY2D35QnW@dvnd(v!@GFRNbg@r$;~tJ_+Q zW`1Uq<6E8N1Rr^|Clt2IapL^MHOK2|$ZuZleyZZ=^?83zwf(7n8>}-naz8j31-XUX z#c_9N{ca-)kf$w!Cw^EANE647mdC#L9Z86b0(dwXq@42H^UuqwH{X{QGy{VHTEF@A z(~^~uMz)g=%`?xE);3(e^{xA4G7=R91xJZA zL=1b|7THcD^5;}?X7VHe6ATLjvp>wn^Dn=ENOX-{f8C8Td)i!Czh;Ac`P)B`gRm-o z6Q@XU_BhPPOOUcbhl8BH<1d!`t`u0c{fgTB?lB9viV_(=pjp{5rl5Ym}uIdI8{ppA%joG9O z;FD306m~I$f)^M55|j%_CeK0)IJKdK90#Z~~5XX9GN`8@)3PV5BS>P}0k>)dj(Q zy#Q4`1+dl6Kb-60JoH^xQ}zUBicq0ZE7>?Ba5?HDIF79Gg5!8V(~_M4*QY^Ro|b2QBz61_uYgNQX!W5<2Ywzc5@B{O~QU#|@&D zNOK$g&_6a5mM&b{t11DQ^`ty3lXmVw7a-jg7A%uy=SpXPm((637dU-74B4Y@#Lwf? z(xr|xdX9E{A<@&+OehCezc14X1W6|ndltH!o4Kz(ShE(^kYKB%L^6~_0U~+%K`?w= z&RCO)Xal0vDu6v_?tCdfRv_955MLvYZ^Y$9+5H#)^uJQk*dhyf8T9XIF;U5L=glEsdZ8TVMJh5nM!Kj! z&4Q#p2E7_wWH*kp^c(t+`A2&jVCe4a7F<;G{Xg?$J*Tydl-x|#d|+{4_K&#`Hz*tm z42PC$_$AM4@ce#!Yh7!7bnU?PnT?OHH;c!28n%wkbj=LcCRzmVvUn8hlwbd4fuUZt zXJvWU!f=e?@PN;IPb%AuRJ?vT-Z9J%11(~<^=cijMX%$0oW(PH#Nn@RWaauK`)YgX z+p@VD{iF5FAnBg-C}nU}7O5RAJ|70k5F}j!c#1yxUr)$11eLpCQi3o|y@rqAU;g?$ ziY%Q{T3TXK*yR9v^79Mv4ZI(~S0Fdtd=uv5FX*ripWv#jPro`7(34Kgq-n5umlB-XE4hg@8j-1)^j8Px6a{A+K?S04B_ra0Ap z%NEHd)BX$N@eMa$~hyZCL(oR$pn~W=ZGHzW^5|?Y8e=dK3FT=M~=dr zAfl{wKuWo=nKP&u427f~t07B?1HcM(C{bgwrIj4Hqj9M3!GzbG2UvvdY$6q)BRW7L z=S`Cc0B2WKBT>nRrENFbiRB0i13**@5Mee6W#Eh-KSm-*SEiXl$`6yG?m(V6F{`_f z2XPURY6GkV!r1r&bTpk{5DcM>@+g4n22^#SgXkhMRiiwWtsDtu~9D7@-w-Ik;Kt+DXVBeBy68XwJInLAZM@UKGrhy5Te@)qo&(vW)#hB z+{1PFFt@`Bwc{7+#LU+PV9A;^8Kx{#CIb5BFIpf=<}Z|4lcvZd0L3T<^7P0U@duDa zaBhG4m*8X9*F#^!)axS1qZf9KP!FPc0h@pZ|3F{N=7ADGWOzW3W@Q1;K`uIYVd=(~ zvb((rbGID;N`x<<(FO~rAl{)s*%#1g4*~?E*9eg7QrRJTqt>(>ea{hjRnliI3Rb;#YAnJbE zzx|%fnmZeJ1Rt5dY>5%Z zUj5GNCg*ZE%wfkU*=?F$wd15s#R;S7&M!{nuzA&If%y> zl~g0J1p5IS?oPl$AZS1u;ST~;QKYHm-UJCui zY7;$&bsqE1;jx>w-ec8CzbY^^+lQr38!W4JKz-PHPTFDhp)``oD(FbI)oq3wL_GI} zco@;74^L}T&ob!64PGGMO@!{?mhMBJt_)TIhTl%lYMt4mp{PU8a_BLv`n8VtN$1L2 zoXKhU>pSrbZkA%``jPHCbT9Xkwy}9AnhLU7%c@iNJ2o8!C;J`=hh=bfcgT+)`<`5O z!C8ppHj&yclxW2*@;HoOJA+4KO_OmZzyA8G`MrgplUq&ttV=GrSbq4!M{z)J#4m80 z{MRpj%Ao2p`BWDzStjLW6;fJODw<)Tw4_LuE?X*7rc7a+?vZ95_zE~)e)%;?B{<{r z*WASRHS*^--jW|NkdT@}d?Uw7;OG=doijmV@YO1ZWog=e2w+x#DHa_-0GHqRY>A&a zUqTXN(Jf>k?rW8DSjqOSyBM|c-wT2L1km_!oJq@;N#5>V(pPYRJjTUT7AfM=vt{zi zbLCil70&yB!gU)Mn(UIwz*N#&C80A(W5)p9Opr_c_B{L<(VoMM=3>xSrjLN{I#yB3$0K0 zlf})5cJU%)?hNY80BiG%W*c>Kq|Hnla2)kX)bgk%qPc@~JAiXL46&1X2C;DQti!|_ zL^hPP3F!1?rOSr3>u_^ulHMj<1v=QajdlnMk;o}oVn?`I<%&9SB?zO=%hzrZM6n5IOt0o28r=m>qxktvG9oC2Pri{B9>nFaC=q2MY`1kGP(b! zKNQ~x@^-g2$zPs%QtI)6y#2P@W&X_RGB!0;{tWXsA#03`%gB_Mcv(#0{Fh#Ri4?Kj zkAC!oWby(xIvw%rvsd!`h?4I<{4g&ae)5&C{s-wWKWhN}pUG;}fF#b%pZ~l>#?)f`#u)pifb1b&XYWmm-XSJ^FgdhH{D>O@yJ|jNrM0YaN zkZ03L55j$Don!Dp#%bB!yDkRn$QshvhP(WvNB%fJSZ!jROON4EEOSUL*GT(JOUWKy z-I)R+6CcvKPS%Ba5Ax=~){pK@PyTnL+YKDS`&`}!_6Aqpzgx@t81ycuXBRQYVFP7~ zj$f&J@6(mRI>+$ac^yv|nas8W-`#7x&uXpxBy+D5e3C=4@9@_*vV(rIeQ7Crv$lYAM5M{>MN1l|22wf0F#lD>7r0-7$S#tyV1e}Go0SAGYr;3Fa@#I4Nt6J}7?62F#g5CC z%$d0+$%HTB()BPXggu+zLdRvHJ(nV}=+;#pJR&W-_p%>Rp8&zwNjVZqTDn*Uu&M(E z(n-LGZ*?nC!90rmI53$?>_nf&kIf-~#%*4%#*eZOKQxqp@k#4|;c$W%fSE92O3?*j z?(+u>shPA7K+%S8rkY=!fHM^i_rnydFJyKGY;Aw@&zifJ2LCD;(a2l94;5gkkD^X~ zuvyybY6|Ydq}vBN1KXI)7V2N8V#^9byD(X6o?-=%dKW8m=Kz4I307SnL($0Vq7K#6 ztyTfJK6K|IqmVIH8YGE+$fTZiqL162D-Qa zhFaj`b<84_sSj~TQ3KL7Z#2!p?pzEebv3vv`>G~yKiZSZ#LrQqlR1_$z0Dn@D?|$s z_X3UXoj7MU!6AXt+1M=o061Twox2G*>a1@v1B+^CIys)5$mP)ZXqb6`A!bvJeAj@M zetuI496uy*;$o4s!5_~_WPCIIyQP_6DP(aHVY0)MqD}jCp#4WlTBIfVz%woR=5HA0oGhZi5fFd* z#TUs27-dp8YTk8qbJ3PF&o<6!S*_dvU$02Pz5)gs{hxU99E+`zTJxdBKC|Fw=&?_+ zWa{vvpWE{qJinj(Oatfe+SqGxur)o`fArFwycGJ29^3Qy);eqM{hO{o)%34tO6G?1 ztRcM>t;w@P4_B2V1vSHO=hZX=En&9xY89_Vt9YMaerAt2{Pmq!Jl)RwbK+JbUjr9N zv*@+BKMD-3vY0je(TAw5uTjoF=PX30zd-~hK2U&wc0kSdzW0dHDy$|SulgSS`0*bY zU$49F{-*5Pw?{_dbpN9tKaNjSAP@HgWIp*G#7U=oo#V{l!Cp~bL52~03eiN{vwOE( zaoMFZb;?9ch-8Cc@NQ2v1GjM)n?Ntes_AOE?$vwn+YFI*g+Xa7?5`&%~Ed^W641 zrDkuwwC*hw{}z1yG(r?}XJAGWsq4lgU6N+<6;~a>j}Vs72mdOZtPE9_h)FprkraYN zr}hC5V-e?8K+z4$)e0-yiQl8iGt84sp`5aL2Ba{oX2;xL-*DEtqb*2x@5oU|+X;2ldu_iRk*GXYY$Q>P$VqTi=W2Ilh= zz=acrtrZZ^*NKS~rj3vcth7Wv16pl3{5u%@%VFvYsH2F8NZAA{TLZu(VVso02)4tZ zb`VKjMj%ip=5ht29hAL`IS?IPLGT9yjUHFu%JqS+cnU8{KqpPc$E+LJPQAyp8P!}% zGqA7f6mm_Nrqu!y4r><^6)KZ+$ilIBrkt~E5zv3COP=!^#+GY>%pT` z7@1TElId!xmF&qm5`zz957|+w*KZal?gJr!^GF!rHVyoOk#)dY+hITV;A1!`d#r>f zgv!FD%kekdAQe@0_$Ic5+`VM|)jQ)KF#Q_>L+@I)*uvr4#e3@$m;d#Ep;s3j(lv+Fk}eEcF$h9V ztfrxBEU@CWcIfd24sEs_dK#~@4n4}pTk<-=$2-X2Uc+DC;Lm@zFNPPf5Co4%oz$mL zADa4}?MrXhD@~5J%a0!ap`?<9K>g0_jOI@fT(S`}avwlJKfnC-FC;2FQl5PBm-5CN zufvXop;`DS4)8Hjk6Gy3-^Le^0qios-;(7^O@wkcroF9Ow#b%En}|UCtYk1a60*Qx z;FJbH(dxHW$?~(#meHBxFqtu!Mgia|4*?trG;vj6zEx8oY*)r2^1M!)C{+N#gKOWH zK1|wi0JV0iAt`&jjF~)x!O9P_+5u@iu!n(`zz_zbl*LOVVpIw_WDiNxz9Z60>byW? zY818f1mJ&{8jBz{d3EuFt0v;Pt5hSG5wT{l_v1ktP5s0IE)~eM;U8xMNQPn_>_QT! z5mRU63~%2431rn-no; z{Oa2AL({z0no(l;S;1?YjE_JwA_%IKGX>C>0Kl`~VDv`Az z`%qOGflkp9iz&B>tHEF`eP|vAA{5_Th4~!@+!t0n6Hr%_Um!gI&(O#y+(YW{Bb`hkWZ3QwiU`4^l|UgdX9zVv52Wj^}X{e06k z`n&T}U`S1Tg6UIWIMB1K9`@1e@?RPl@~AYE86)(r8<^bo_~SRGwf>U=q9OYaoX@QD zIJch5YtcIWCzzkvBM!NaPf)6lyepu@n2k*h!3+XCbU;%xn33>cfa@dr_OXY*B~vF) zHUnG_?9VIc4*u`~?8OV~!ty-)mPJF0lV{Qrv43%B0UY7$SZ5<5di0V7g8k93 zMu*pYAWa*#i46wE#d%PImK<2nAk3Ftn2hr=fAtp~GXW5iL|{sM3>t3ZqzzW*z`Gwv z5Uh>{3i!l_6LpOKA*SQv14kHK0eg)=Bz*1q(F^Pk2L$A#O46ikKo}9vY~unH`T=yE zZLLHV12|z}?7`%E#Z2o9dl!S#yt0gS#TBqOYy*Sl1XTDiSN2eSYXTUM6>#)oQVxMN z0jn5xR(qn!v5Tp)AD=5VL7S*u+EMe{1`*)U1u%$0<|hL{@yK@{mOH<3r#$}M`{jyD zE&w2nV!#ch9B%(T=wK6!ftwcRaGO{iJoxSWu7N3jl+t@ZZG?*8oUU3qI?2B1jBeCrOUlkr#V5lHO zO|Tk~&ZWSv28ti1b>9#_=_dD}10dzEa2j^6nE<3J1gRro1Z@O@B#z0H==3zHK1RR9 z)Y?^n2z5yfX7m6ukc=aO*5--qnMzZxF>wkER2*1WK~hY`i%5US-W-};Btlu!n)!5>&V&sCM@K7 zS+Q)nOr5`2_U+#->sPNb_k=#10*LeuhV4{Q?ms^F94?k*9YWkv1KRYtrh!Oq0H`qW zI55=q`4kv_p86R49;0^y^4(Vy#I2*P#KI9rh!$1m136l&(Li@86e`!bg02;;Hz2Zv08ukS{&Tv z<9|7`M;vk;AHPr^V^5&GzAdY{g}T%T*C713`tcz%>FzK$-gM&)a>o~LR2v<>5yjk=)!Fn2ry~1K+;ifV*?fSt(z-^=1aST6yM~-9Iog#jFNP6NcHb z1LiGr{#+Amk&ij6w;YKaj^_ldK?6zrR8rW@m`E^8kTf?mN(*Iol~jryP!Ws|VKBi0 zfz+?2^HR;iaKKNn-Cyb}t4VoRhb)TrRq7d_p^?C9^wPHI1MuiWC@lrQE_}OsFzNNc zxEZHyx}qIQuwNrM*xm_4re=6$urvkX>Kzqinc;f!TN|VWz^VI`xY}t)v=b?RBTSPIK)8`(^iXDhK>D)zbL2|;>8RvHlY6@X zDWZ-}#K-}Is)wjAzir4Tsi=5sd#hY=&DHYNJO4v2x%5&Ag*ojeP^+P-p8EqA06?*t zm{m7Yv!C?xn+o1&3ch~&lA2|W{v+uMAqg?l1L9hmjp;T#CWh=J4Tjkbh>13SvCxPd z3#lZ06N`=(N(gn5K%W5f!AJx8Xg?|#2C$T}!3%~3N_x&1@x|{>8AomK#;R&wF4`qL zE=&TV!U%%Nq0PaKn5!LtL(R~FB%|bxpCTp4ilm~jkQbH`0%j5<9(RpyUdnm^ybg^% zXTP0WcH;j#&S;TNojOg99M~`GHgBY;EkvR(B-kX=_#8%ZJ);oC)|}_Tw9WDru>Rcd z`(ffWDqQc0S<`Zj?9ovGrcRnBQ?*U~c)`ic$dChUyAxf~<>y}{xv-M?`G*Z)oP)@H zOiV05-A@u@5+svMLz*qg-#6Hd5$bQ)&3&Y8XeMnF0}kDHjAp0#XPykvGEhKkf&E50^E|%pqs!LEI>t!P`!5F! z-Bn>#0}U`xTUsGQnM3a?V^2?Dcl;0|{Prm@9AQPBbTfC#GunlA(1=sLJAL`?fSC!! z89!@ulKkig5Ai?+tT5eS#TZ1WYo?LL=`3yE)QVobKB$(w0 z>_{d9&D;e`h+y6?Pd@!y$-`eNcvJ@Bzyx0~U{7LDiN!>{`~5Z2iYYgw4LKW|zw}{R zvl9rCh#AX8M6C;!rD)ar(wTQif*A0e-To39&A_p6mP98B^6hs>dU^&?+a);s7t^MI6h>xc7quOo_|$2jKo4MPY|dD@wUyCZ*Ui7@HXADonJPM!VQYS^N$@b=?3=n6G{KJhpMucGCXGYU`u{u-i$W za1e3a3_H{TuyMk~?L+{)23D*RcJfVpLkls3*0ZnrKDN>hZ2-JpeB@Lc&_v|5Dk~Z! zVF2hl%{`55iVbiWOa_t0!^PrDKu~3Vv9#5;$f(qG%!5Y((2-IKSnk7Tu>{GKI#|F! zf;8#?e6@U(@hawbjr8_GmL!jUlbDeqJM!`fn3yK(_U1`!X11)|y-z{`_^WsBmOud1 zR)D^cgL`{TIWjhOIaG%+o5clYcl&+KI3aBH-l^{&HJ4ZNxBZBg+16x$>IJWcuvcl8}}xm1qw(5_RsNEqxHT z_6HDkE2sjXYUUX~z_=YI%O3`@4>q$GP_6amAb6{-x`x0beER@2v4Ao=FFERi>1aZd z2LDbPUOHjAyV_vq66m*a5kw;6Zod%e;pIx-o_ecF zc-iQdVERM|zq!y7ZGpjcX`RD>H}Jitp+U-;>SQ+ecRQ?G9WQJ#(fADFFWb=7D!l+$ zI{;gyfDU20jVJmzmP{+tcu7#!^U%J%=A~o8q{%WmITb(REd-0CNJ?_D?AWngQehx- z@$Idres=BNX`V5aUg@3E_o81Jh>BoF&=W*@)?fB82_Fq@s+ITzm=> zafjHB~8u-FDGy-|<+&M%Z-XQVu@p=mLz+bg$6)a;e z5u;ZacB>6WEx)k9fPqP{kGbSYT}RN#<3D>^O7SO(U{I(f0@Fow<%)|hHGW=s+qOvq z>;v{X3H1p!rozCCQIY^777$79SZI_I{0@5xivc6B8~B$6F$kvM;Ge`GTS!nu_GRYm=OVnsrMV<6AF!myhEy3K{fXEmIqV5JFgpVK;d^n%_!ep(%2{^hZ za9-6VY^?*t95_fmTtExQi6#OzmY@J1{0EyIMD`LLfr5tk5!v9vNXhP!=L~BXZUWufoZtmk_b>+%Q)H~`RVL6Ce$MLAk{ z)FX|w3x=qU`fFp*_oXbgojp?7-ifKvSGJcH$sYW;T41>j<{go0%$x1CjdFPF4rzr! zc5+NRVA2M#IfHjgiv@cJRkg#dSudWkTFCjQms`ecM=OxQA7+^hb z8=$nlu7Ui;nSiu9fL|Z^iBn|b-u*J3KBeOxYcR~hnZ7R>TCjt zrZ1c=mt2l{H8@1_j^yEI3($kLRMW8o&{SVvD@XDQTkW^T)b1zyZGv?2eORl_B zX3SfFr$M_E@dDFBTl-^*w*yZ4Ifs)M7hh#$6`WvNwv(?>&CmY4X!#S>-iwObVl*)tjfqiXtk@7mrFU4i_ulL5?$rJN&Rs?p#E8adzVBmn znAw>-x4ieg_kG^yJm)!a;)w7i;!MUelOSzpKPEYv80G{#XQGz{({c`}y5dD&WZm6V zREY@%bP}3&b1ae3VbaFL%-Prt$R|U3NQ{ieZ_ppMyo%%NKzo?VH6BeizJufMqCBKd zz7(+T-nmV(M~)!$i-l8Cq7-mF??T>TL3ccciQe#$Bjrshm}rt%Vq$`P@c#Q4TaP4+ zKZGQxcGgPh@QW7mw1cO`jK2pr z;lKjNfZ=!14xYyT=C4{|!a!@V9ja&33_WErnqgF~y>f+|cls&PM@YygC|vG+@DUii z?NS4)kjRby`4?W0sPI5u|7HLdEqV3GBaaZ$!FLTHcK-S2qdf}7o9tpyvuhQHD^u|D z%P$jlikIaVUP!nNQ(p$cZ98@n`s$IPBS`kh9s_GwCJ#LFsMK~iB`7hOS1KK(q{@Pm zPbG1~B%l7{b?GcBfz7kQyr>8)TwJgoLr5Ztgt=>H@Teu!Yuh~#+Jr`v zh!82+y+<1GXmbNd*;%oqrOFrpY&*cNwy20~QLRmjP7Y5&Q&N(UtpGT2Nz;x!)Jn!e z1kpTnAzm#(RFIfx99wBFfDlmR#sb8Gek}?HDhU0VlYz%dSkwu)QB!K9UE%;VX;!y} zvqD0H7z7dZ!{lUU4wYZt_zOby|4+_3V+mT!X1V-|E9J3=9wy_njR6m1X4a)(UYRBv z`p*u4;{4+l@SESr)mL9FBSxkJ76SlW1B_h-5`Y#!WG}xd=yOOhq1iozx%FAjx=J`# zO&m%U;LXYT>Hrw#6C&?|da2`_1OuGPo7-hiNtx6G5KC*TWXska=ob5^(_1C&1%NsL zLMQr2&DOTif9#wuKfIrYzEgh7P^QT%!H~ZI8P$r2mi+P*2Nk({#?EY+{Bv9{q z`+FZy5hq7>{rzQGbo^pj`|7JQdD3K2zrbOcBauSvmiVZ6*}=phioUgF4$czG8O zz=_jl%7*=W(e1@Z1&mk&44#!qg9~O7x=I$$nkEa+SSHo%Zw>6Y4JOluF%pb*Ub73dbEG_mfO5nj-V~J$e#2dA1 zY9afb?|NB(H%x8{+SY(r>|A{CprkF`U3RH0C`Aj}X)v7O$??c2(xj=Nf}ROGpPVdx zoWl`WS%#*zV)qVdMY1q5d!(^1-sS*l1E7*}O=X-u+41>$8J#nl%;XH(dbsS|lPfz( z_Odg{95;Tf#Bd$$q}_)kBpLv5Bel-wVwSDiVr2=n#GOq+E$y=Glv89Qkp<0w-+`y- ze00dFOJ1^M2{n>Gl^6cDTH*(3lFqj=+1sjMMy4C?1tDEXU@9)o`Ie;gQkTH+A6qg{*VF<_{zbD(96#u(H} zI^!8&76*N(iyK#_{_vYWjP(uv{ee{*>pXNbp56N98~Ms#9JYb4T<++;_;=dj=(cd= zrM_q@jla;A#*7Dn`BXwY_uTSJ0~AKUVtll9ALZ-*Ko|zC89?e*^lB-o>9PyPW#!Lr zAOks2E?;qp%$+}%Ow=Z9Y3?x$YOlWfN~}&M8X?7E7=%9~3Xg;JTYm9{45lVyfXqdc zq~X{IG(tHOCP-;zwcNPsR%vI@jY!RsCRiT}p|qKVQ*E#)8{dAP@^ttVGLYH`nMG39 z*cy@`p=lWs1QXZ+sI5a&=qxH03(SiqZUkb2oqoc6Y3Qhtrm|vbCn3b_MAhXTEdH_a zM)e3^bccBxKc#jpS}i-_x>$hbxbYGZmLT4BJz^@UmR<%fw;P6!Y~qllG%=y!(~@;n zFo>@5N~(8|jZC()AK^$JKGzaoRt75tgqCJ1NdTt$U^wjxHb_(VWWa!B~@o-2au|{vz|A`I(*+|$m73zLT#C&y&15B^=Ng8{{rFSD^GPMuT6(>G z4YsTjCa(pcsLx(P;oEZeOF>nQRN<{xRg{l4&wjDD!){i$V2a!=z1RbJwd1LW_RT~% zRx@!O48&UH!wI+yBvh(;Lpydgpb(B4#>(A?&ah1!Xb?eI0Cd*FM8S{aYbT_r^@;ll zBP+A&jjv=s6+zS%s24qAdvS&Mp+oE>BuNy9Q>46BWB?e3By2>>8%qn~&u#6YgW zp23Q_0TlIU3e#!l^G;fV_uy2q!g@B5Wo@N|oS71YCIF4$w$yPwl|Grkvo~s z_{-SQlhF@W04%%2gch+6Psc9$R%rGp@kvUQmc}|}FPuBt+(}Z54>AouLe+h7WGV06 zF7;F+ibl)Vfh52LXzr^lHY&`x=-1^Xg+_EBj_WEtZJ2CfGTG5yZ-C$vICizV+6v$s zot+JkZU)qq%3LzvyU}rWb8MwWg~nJBPw0Qag868d_ri=)fB7@Q#nY#g$sa}bet@h4 z=*K1`%jgM{V5kGAlCs|bojHKklmwD@0K?%-7-o|_|0)wnA6RiM1?g0_njWL9A(s#j zg^9<2q0toI_MiWw!0>Ps;Q8C&TMo44w+4oumFap82MGGzU>fVy?gzUZfD1#R-jKl~8}@ohQh+;a^k%fi5+RZX6M?m03A1F)M|BFT~X`Z4ftK%`D; z1vhPfbVQWMYVML-?pQ6&guK#{)1*RK4OoyVXPrVhS*vV+<8^TX3j8^^APjB0VeNb| zxs4>e6`P=;T!3FezVuhu0xSSv40>T>hRgVcb0J_z_$aLuYkm>-9V8Rb9;p*Y%djcq zq!ImC9f=|iz?~*f2&_u*kOUb)`MhdEXzlqVk-!Fm4a5Q9i^B{%5YW(8T1-+v1zszy zR5w942=n33Q$d@WMl1WF)fpUU@A_fqz>DIr5*lQH&KjC3XPkQ`$Gb{yz4i)1ZNuc< zwQJ>xr=FF&2*ImKus@!3KIp8pD=S;l13MUlF6=nM#P_YbQC9u@N=b?(k%V*UrY#5} z3Mw+$$2qCsJm&(s-l9$SwY15){drOk`?IxxkRYHHhy>pA=XZbBWxN(fAsDrq+L-+eiVE*Ajn67Hq4?4on9}Q!~JA? z_u`-DZM7LJnA1z^|CUIoe~^^z*b6xHm)h;S@hA+G#!XuUwWkQnw~@Hei+5q9KQ=FQ z%`$x0D0%Ij_t6%PL;w0Q2{RUH?QD~LqzGo@0H5#QFRiez%>cKpgg0}>WXpI$o++58 zH*tchF+Mi~0BwMBf6hq{4BdtgKBl~5nfQi8NHgKuYWmKIA&D|?_6!+6YbJhs5eAc2 zUsDBe9;hqbLqB&DgV$_jb=VFA;F;*Vb~2Au_F&iK610xqApw$rp4MtX5E4iz81QVv zhRI6Bp?mOlRKf2@ zjKHcUOoopbB0CA`<|01{ii{>xc>-H9%jYn(qX36pTvs)fRdPIxU>5+KxrCIWp=|)f zPeraWGHaA<-MY>2G29K?t2Na}jLbIfs89X=_pp!gGLN<#morM!SgM z-(-_igEBB6;{y-Cp@Krac==zGBNQ%b6@Y$Nj({K-H^Q7+g3Z+1E-P1DBg2za=uTLf z@9w+zacLkiL{H+pdGqAtQ%*A2pGO~gP|9He)6<5^%4=6*JR2ylz44m-?Zv;!vNO(< z*(@7CXtEcu_%}*iX_)QGOIJunMyhy`^|0mhO@x!8qz$orCLv^B^kTQJglUuj2_V6w zLbE4R5@g1*lgW~`%C0rQWTg;} zb4guksWcZCV3G&uL0{&gy<*c+Ng^OCmc$iPcf0t)1}aVGYhoaxZ8fvi3E0*UU@vTq zi{tn4r(Ug-I_k2O;TNy4!Qv$L2~|&&nLuux=fppBjJSa^wGyTR&(eE&h37F+W|n$Wl*&OLiXh6 zOS4}bVccGrzG@kno{B!rhE}gpdH{xDgu88k+U_ve(E2)bkW{=t&)7#oKyqfLQ~(Mi z$o%f#$DkgET?s6#%|*|EiBvyF#BJE31j~#Cb0llb2+1OppEv{tmURsAjWRN@wN|mR zZANA;ZBHv3lOU~1VN`PATxddoLs>>%mAmQarX(H!Ms<_zgs02OO62)B*WszxD0$m< z(z#*SRIG_M(2s4|07@1U8NO{WXQ61`ItkOmX1QVD`s|!*4Xc*bh?C#<0FY|X69xu( zOY!S(NJ`FRY>+;e=%6U+d~bu;#?O%A&HH4=xJk0+t=A+eJ4f=U;_@+}?6c20Q(gmP zhH(C^^z9a`VHR=hrwmCWY<;3UcK2%J1eByB!A4oOAi(8r4A&dEzDAw2ND`(_5bqIb z5&^)>z)X5rdYYVi(rNPXnh)eJ&;MDf0Oi`3OlU1F-a&vsSkb;#7(#95aFUlu2qN=Z z8P-M;oHX;?f;E&0hSc9LSbFf%biy$A!Nyifk0cKtD#@17Qbp!4w5Rm9bV?5_c5dNb z2|;oY!F5zlJ#jDJcr=epDd;a1fV1wVZkaM`hIB8PCuJXR5qBZi2>m#cbD0{Kf)RGV z>{stPF2;d6WG8#aHDgE6$YQhyYo% zjgQR2ai9k2!1jIlGHc>^sVy&KBD77W!hl=3Ml_M-v-O|K>uBGkE`XaSuCq$mfUr z@vm2^_dcikY0+<1=WakSe#6tsEP?Rh=8r6aBH(BB?h_V9OK zz1*SO(dE8+*~8a*_}{v&L)Uls5&|3-+CfeGgC**`r4YY>1>*bDOND=#yE znPm07tNAPv@K`UaZn+7MzC>BRe7U3|D)+{p?EgLX7zqFkGGqEw89y!uy-_cEuk}<_ z0BGUQk`S99DMPd5;u~*~LXrzYf@7o(M#hmCDkuExr?5fj+tz#}&SID;27V`lLw|IH z_>t_9oSrUWXbYci`}m$?wduf$w_jWi zYz5iQb-OX;1so}h8apym{0RAlLhaR)5Yb%4HuZW@YmU$mi6WUJEF?r~OUuPpRR`dL zi+~;sqryih-)osTC*d^BENvy+rj;t+PKLRu!lkdC|=|v;xE~%29 z+7_{GDgdz4whf)qSJfiH4z#8_sTBA#ehBXrG7g}X9o z1=zsA6T|xAnW#({$F2`=COtiXdlO(<8LvLtRr_-{Af^rJ0#ucejoeX5ra25_BYMgN zKywiq)#+r;SCT~04$C-w!gzW6kIzuHaj|^<$$CP_ZG>)vB$sgYf|JN#o4vtc-o~l2&h*)C1I`qhgKgClg@3VDcDQx_B9Y*)4mD^4NWJ zhcKcTQNnKFzewoc#c}$xZ$7L8r$m69O{`1=LYR<6u&>%pwWhLWr>l0>0n=|G^F4)- zvpFJIT(F9E^t@V1&w(~EA#9c(IFC^l!QNM5Ux#>Oza>bsk;fSWufHEoF`!b zYPtV|Z|%JnuZOgLeFf zd#j{_(N5pZF6glx`S^4@U-{+0cVF@EcMS}WynkP@@uT?oVDiZ^V0hFZ?yCXOp{M5< zFdXQC3c_`Mt50nq4d@#W{xCox1GVvv*}J2+TLKuhV?r(R>xb@TAopTcO(`>&nLA)W z{J5z)n8iN=Lztc#kB(=r+)M~r1?1yqT=b5JHY)CQl-vqfe|bU-d8*CVT*+0z(Pk_KA-Ugp@%G^9_(q zudk8bD(pMZu0^FLpp^=vF7hymK&Mr>o=Pb`c+Y9BZIV3wf3-;n} zx$CamBxlr6BXOj@zD@r0=a=NRJMUo-`xs4`FMt)z6XwS@l0(b@OgC)VBoDwggLF_waG4$GV>64zN!)GgV5B$cBOz0lgr|^x+(8gz) z`K;gRvkS1UwmGQP3>zIA-_h#E6P#-JDcU(d>W$b(%shQ4iA&4RCkZ1K%bIFw)g%_3 zY6FOzoG%5LCcrfOp^>!x|jZ{RdOQG;l>Y7Me0Ce2_V+gN74%C zSrbnZ0Y#B1iQ+NyMCf;^-XdM!L~W=(wLrVW&>c&<-aL zPnS@xxi+K)PR&54&-F$J8`<3bMU7&uD-}EEFghho0$|{pxd)h>^eZoibT@ZMZM#** zW(|X(4Z@-(N#1|&J>)AS(gXxhBJU)5?e%|(e{diZ$^kg~}wS7k1f!B~!ed0BC<5Da-nG>qu-_ zDBiG~J&rC(Pfmc%PLvPc{TTL|Neh#&mZo|pZaP^RVBZJsmh`0~K4|>!5d0i*6JPP+ zK#k{tFZF(|56|nsUqA4_$AIC#eFBaF!$D2>)qro%LcIOzb# zXVg@r$bdWGRjAA%x+Df#WoUd6x|{4Ba?h<=-6Tu;317AW1n+(LQSd^$G~-EjHURK~ zvrm<>%0{{Rsw>eyk(oGrq^!8?QkV@V`oZVr?RVamE3ds$Mq*15P8qaZyv<&C{yCCE z!sOhu&H!Ba%hoM~rC`+JMx~Pd>_z?Eq4Ly=f0q}~|MYuN9uAhu4P%sZ`Vt8rnk4(* z`%qf9?G;NCW%#IK;0(4%Kvp^-;87q3hty)1(p*U52W(j&;j|7as)SMoZ!(D{ZLnO8 z`%9#!pq!Ckfv{78hb2om184{UtRc5ptT2Ls3@&D>M_3X_@L;*dT=Z-VW@>8zN){9L z8{UAT7&1Dm^Yh6{ZpUuLB*Cq;PfW!e9?M2IFCz(J8avuhxWHeqYF26+XyXOv> zH7;9msiD<+^|iO<4#Hx8dEu|U8YVN z1-NojYZxh?w^^!b`@MjRUFZV~03Nw8IVI?{N&p_sysCu=nFJgIwT!D_)d;cs03NJ` zMTW%*2o}^uMk^sjaRR|~gN%#bk$!~10TDwJBrXx=X6y)=IAyGy4I6mTMd!&ce{q#u zaK=IzO`?V``vK`P0QNwEy}s-l$Ja!Y)$&@wXT^YyD*9OsM^{N7sU%cf0U)bF!&#?K zKC6OpEn+QYFtVBmQ%RBx94&GJvZPtQg+AKMI)F0tIqE0Fo;d;I4z@9VY?jPEaf#Ho zHcC}RnPHm(C5Il5jkBy-L)2_XwV7@Jqeai91AA%K8w@+yr{@d%m>>X(jU)^wz&-$g zqh{q=vaq$G8N+daa;s*lmr6LSd2?|Yrqiu>d|D(Qu&BOyEii%Qr6ppc4YzIIBDLrR zn*nwaBqk~Na-rQd*|i!9nYZ-Wo}wBi4}Fw$E2ZvnsBCYh3Q#QGnHC?ywQiY|94i+t zJz0_xk|4-?@bSY&h;y#juL5t54q!_{6#y~VOi~IV-X3&^y~=!H)8x-})=&Qo#BN9J zajYbgwBe2E3h|TlF3qYHTj@bIJjwuGV-v*m$Ei8kr^pR*hH~kZ%#11G_y{gHC2PTs;FZxwH z;oJTSko@EwQn2=s$Dht$(~G1;__ZS-O}I zbQhC1Z>s#HWAA7uA!Zlg5IF+Q114|GZw4AQXlUm_f{`&%khaZP$`~T_JBela3w`tN!83U}~fM}Y==e!$j#^9o7 z$xWwI?V*pOQ_ekkfjn~GUDC!4-;45A4?pp=kwF|D?2j%jNuGG(Ns#Nx@5^OC}04u zlF{7At6kl&2syI$qtE63C!Z0UR|uuxV31%yhAmkjX;VhYrx;+{KEr1ab}b|%hI+!3 zf}5N}Vn_tD{~=OBwxciLsI8<36XR6a32bzxjhE0wvL#8BXd!9Di;PMuM!)J+mM~?4 z#8Mx(1;(syE4DL)4};>O*w$E*STOHqFt?Fp;%=ez8Qy(bM$VhpnB;gcD7rjCmktI~ z^_}x0DZrQ3^anKdvg1w$R;!i4k^x-(8qYcBEcwxSXG>c8Pzhp;wE{5Sdg~o|_PG~i z@6O#2k(923rLu9n-WqP@eJ2BBAWY3QD=w7_esZ$JC&e26gY|%$E>LAHfU^Lrms-Mr z?F`s;sujd)rU9VR0RZTP3G(7*;bkS6r<64|t&&4JQ;H0ay=@ zh(O~RCqvTGU|td=CMiN*F3f~{#;z#y|1b%6t=4*(YegVYQ2x%0CPa{n)Gl1@O6KL+Gl zlFhIsF*-a>GalNP)a{ghGqdk@ zJoy5A(F%5GW-${CJ?CiJ%rNp!f43x08!HWH2p6Auy3CwBNk)W6OFTM|XhPoPaRUk) z(Z#KoKRx%H6z1jQffx*nu9b|!K5fY3G*4JLMxoKqXG9WalS z8X+;rEEzMVOC8BWnsj7%9RkSFVi;bPF8Y6PP$D-6Tzu-r5K1pus?YRv7r-goU{k7LiTINuB{hzPPqYphIiZcvB+S50@M9U zgqE(9q>aliy9AbCtkl$0%SVJVPg%NDnn(b!5Ynk3^tLO~ezAvrY_lTvSTFeZFeGCi%X!J6%p3v$cO?idVwtW{YULpfh6Ir?VzojP06zbjX zAq3t+_!;94vA~{m_jE|o^ocTb*f7~i#-fApma`s1Xh2o;xGWhlYm(&d*-MscImsz- zQ!pW9WsqTNk>nv{Ps8|hlFZSK4G+R5j^Ce#Luik9-HQ?049le@>vRxVhF{$U7hFJ< zh77=0C=8TYHtyOXzx&-&vUcsKMo8WQIB<~w5r{5KlPe&%q@D2XafH?Gy!}=gHY@=~ z49gbIkLu!U0Xe%{>!lh1R7EmE6R*AOV{b!;0l2za@c*NIde}#QfR&r9RGVre8`xg} z*NHj9<>WI@9q^umQSzfrApDFls+J;CX+Z!0-qepVuu2PH@>Cb6K+p-0Qsz{jnvB#z z5>TZN$tdhw6YbK7hK?$O(m+3`gDq`^h3p0hw)Idsr#H}8mkt_6zvaek}fK|i0>S1RAEUSdU4hYap_YjPlM}@;e5dzIjOp*vo01RG$G@uF0 zOe7hCby=&M>D#cg-V4zjSl2urF4*NbEuZ}!8BjCy76REw&n;eBXdEwI!!5`%o$cL$84 zQHh0v>*x6SF~^8{7l7_!R_t$pSrU;<)bR$u^ugAe&=*n@5j&+Jl!#j(b7##a{NIAz zPNdAtNHxHrT10iXb<12B!Z3ATQ=1-7a5E5r16_t?%819nV zbsy5cSnu>u9*}-;&QC6o(P#$~NiMs4^*vIybE}+k;YG4&@o`K5NSb>6HAziRm6RbV zm|154qI*d;dCRcyDJ?BE>LiaJn`^Uw*mjm$Go~Jo#+XMp?CLmBdn) z`M1CQ9bhv=F1Y$i*}CClxqa0&a{gJ%0Ebi?LI?TRzrQ6n{PH%5q%T>SaJn7pMag)g z;K3M^JOJdtD=nuFWnzDb$1z}NwEq8kU}#K-k0qbzHTdl>G##7_Puf0muRSw%?3CD&ekjZwce7U1~M!w(x33x4~= z<9z3!>O-Ka~j<$-;T_q`R|I)>E=-0)B=*4CoBm5+0K(SKWMvRJ9_6cld~# z@QyhnK^B~Unr!^^Bk9<)Px{e%1*4_1I$>LqVY1F12n_KROyqJ)q!-30TfsI|SkO2V)k@uwY?1$6*`dL085OI)muj@4rg7KV5O=%8f;P`SDRcU)>N01OdV@h0)Y%)WX7(9HlL2OwSrko~Zm!Ax*$^p$=z zZE9KM&ABik9nk77cG{)9sKhWdFGerghvu$}aIVvv2@3r!nDaRwyPq>pIa7*D%cP>V zLR=OAs4tNL_Pq~g(~teo%y?x)ePG}mTpPW{F~tDNU=>?B&;p|w#TU_nB~A92F@WzN zX+}EX#ePQwkvv6-KlVtPW5UIf5r-8|hScrM6~BgVW8##kjNn9mN8(p=9XeGqpxu#3 zF#w%$0M6#^+h9p)a|x887+iPxQ?{?Ffa7OhnPjLZVRS^a!Aj4ZIaAhs_L=NQ9~==C z%|tVq{@70vR=z~?cQ5h`t)x=h&>(Gq@5z%U%6spwfrU?%Vc69)wcwP%`CGsKGwv;u zWX$Ls11PUu`vKKcYWX`G&G1Bdf6W?M&!lYOoP{LO`*ZIzVGWfg1xQc|xQ|%;!T^O{ zcrCV5x-wL{kXmR6+jtyK3w;q08~FPB`uA8U+0)X-sQ;~o>BCQ@XN}+X^}9w2$25k6 z&cs&%n?Z~Gi?^H_Zq|bzy1s9}PF>fb>l?i8|CaZIk8kk%!TYBik7gkc9M3>IIbcmf zLt%Rmv3KFm<^upZb@5y|b;%-$U?Ay1hxOzio|AVzTn8f(EWGkew_>-nl7iGb{d1G3s1OD zsFadoR5i&*8+KUl79%zADyDN_$r6;FD8bpoU|-s?F{u+X6(YRQR+$mon`2;cbZ{l4*GmRv9|Hz_!T=y3 zWb7nlXVsEuu!d0#G(WreXY$ZP56DDxgj$iLhlH4S5!kB<_+MXmk%0$>4o#!mNeB_J zs*ID3(6j>}z2KB3^4q6>hvmsE7(pt4Fv#yC^stljv#Y07_FLPegkvcMM0KDW>}te! zu$Tdv>|#?}gLD-ZkyT8FG)&Jh_T~7|qvhV)ZjlFXy-w!kWHG?eeqa*|$wd$%;>Y&Y z{>BN=3}AT^69mk0#Ew3$g~72IaM47_vzhCl3}BNFLsr7Qco)eHyD>}N-P9u6E9#}B zqFO2d%{_$Uy8t!qRrS&b1KfwE(GIY4kU*qy z^pzIF(qgefl7yXbt{RB<)8_ry)mV!Ps56cB(#C`XMr-f(9TEai>W0;=#mlmT{Yk~^ za>M$KMuu+}mPFln`33?|$S>*oYm(mSLkzd-6>e4Qj2l>h*% zsZHMN@P^T&1~}`9itv{c&o~Ls&O|hdu;w)tXjhrApeIxo8stYpSB!)*$s<)>`e5f> zP}1qJpXvtS@S;u76n2v(Z|8am#SmLHwaQ{Qku(*ZoIqJbKSIlq($dw6H)4;3z~ncP z@o#|@?Qjv!CxOcXfR2FmZ^7rV7q3u%lEtFK!U^vaYDb%>I!#|95WY-w?8!-D)(HWu zc0W4AD*8hzj9^lH0{X%nS@-IzQip^kBs5eeF@dvj9p(Yr^nOxBKheqM`t_e0b=YSR z3g5bQD;}oYFJ{l7&`u{t`mOT$h7B?rpgR>C9Q90HzkWTe;}97!ZiFPpB+G_RH_O(I z+hl>BS7a=Zlaftl^Gh$jLi=guA$&9Ap?-lU3SM#{y$G(0_Ou(j4CY0FPt9 z(9`J0fT7V6+9kj9Ny=eh%G2bBzaH&&4+SU2mBgw%uLsw9r1c&8+k?v<-8;5%*s*^k9Sj-*0{`352@tzUKki#sH~xO;@Z~LCHJnrdCyxjPOgu z;F)sS<(DCNw~**sDS!UUpUEhMbvgSiLdp^H38AQP0Nqd$Rd!(jJbuay`NOl%%Re@3 z(==2#vmMRUkOi|D2;%{F`O>s4S3=cNgRrI3 zWS5kwC*}wu!Xkn4mtUR<7M?d zcguO_oQ`_xLiS29Vc;kzPx zkL*V`SwtJccEO%&xk7LH z@T9EaR8d(7OXw%Xd$At^xCg-6xzW+Jk}RVkZ?%}x3}z>+rh|TL^22R_$xI}ko>RJ8%AIE^9r_B$vzn+qB_&CNGeqDp<-RmeG zM*?z3`q`o2#ItVC>%m_fX?=(O_TaKd_l|8Gb}YKSZ@*66=P&Q~(e2Ckx76U{8~lFo z9=HzxLjsn@F{up){uY2C<-Q0Lcel#@_uV672*J7uKdA=l7q{KbY}!OtWworn^LAM< zV;nXRpURU@{YgTwB>DNzZ-liAmm$pdSFgTLYGHnUe&b4`y%Q1=)23n=Tv3HRO}uQxO!x68pB5V|o)02=x3@(mpLQZzD}N~^3}xN7A0(%l zvgq*OUqT554bK`S<$LoC;AbM~!cGzef-sqW@(B`;2C%fS7#j@+Lj?YAKwA{{8*|TD z2JUDRD~To%FdoXv*a(~VQ_&mt87ZBZnFOd~FQ+PyF_2x$~~o#-L?~hO(e3(^p@T z8MOVq7__?pM;HHmrQCG)Z8CK9NC1ji8tAidfbw}wnG_SU%!Q$CV1FAJ_&ONS9E90> zD;vaJUMIc`(oR^n?)4wbvN_Y`(c6D1KRauQ%$+=1qQlWFvL2jc&?cgr<4J&Cnt4^d zqE_e7uy7^JR~c+&KF=KhwcQFr$*j(A>XY2MCdnhaxe|Mu27C}3&@t{MD?FI;fvxDe zgpi^;FAuO?CT>_j2f(F!+jfKDa|7^P73Jb4i=DU}8>~?ABxnOOY&2$?3Ei*2n(ZMT zV^)Ah4V_&-wYZ_XVAz1NFgMyy`$-rAuMuKy5F4S@wxWCqHsQ5bi9HR+9{|#}62h*= z`Urs-Ah1PB_T@?^j86-!qf&eA0B|qBq9$Ey_O}@sLjYcQakFPiEg-yyDk9y0!4BG? z&+H{u^q9DJ(n3fH46x{e!O8|qCCDcL7cb~n&2-jEA?jDDfMwvGMkYPy(2i_Dr(jIQ zSO=f+mmT1(2`etx%7>o%EqdHbWGo@k)Wji%b<6OSRH}bu$%2{Fxo#E_>I{|5>(kipOLx40KNu69STCyeXY%iHwGA3}g~Qc5`i|^pfox z8xk#vnd#CB^W96BR_mL0!NO~O=m;jKlVSN9&`s{y@Huu&fV;6{IX=7-u@%w`W%ajA zLn|4pL%N`0&JZH@Fdhi!VTHm3+J-F=A zy<;1P9gD8-+pkmi`OEu#bo=uCEj9S~2EQM?2mQ>986mj04IGocn7K0g8GL)Y+GNpj z^X1Z?Ef;T0t)sb_KSfC8HGBkn&_s==dc`d(uR+IEBUfK{y>t_rJ%0XlnLmG?M1+UQ zOE0}b2>Dt02}1G_Xn^8j*xr8oO{1{=q^XnTghj_mWho%1s7O>tRD(vy2_4~2S+L8m zxt>&002A6L7y7CQn2%I+OS^VsSWG6T33kc^!=htr=;*OB0Wp3#Ok>raJVtuJ2H?U! zHCDpnqm4nKaDSdu7nDjL``RBwXq3>^i5LBdP*jl=ZruSp)h#~gyojn48 zhesdmqq~7{EdPbE|G|{g>jhMH04jQ5E4?Wlrs1`|?sfnHx-AA`eJ0<2Mg!Tz}>ZFvm{~#^4C8< zE!UpASQ4WFv@l`V;2CA{IsrtDyzk-(Ji-RXE)@*k8V0T*JXQ%nSyz}Zn`*118chUp9rCIm=WwhN$GyLqd4saCMKOu9%&@M@xs%F4u5oX`F> zNWTFB$!HA;p!`{ejGs7G#*7<<=iv!5k9Jyg{34l0-lwEp0q|lw?2e&Z z^waP={c!sDY-#2kY~8q#$&44$3P3EtQ6Yj}Uz*IqyowO5LP1DMexr^64*hWmEFQr3 z#4A_Gxm<6iAZ3=(Qli;Z?VZxju&7}yVo$$um#|Wie*$gea;2zs0l+(uCEMquBsPw0}g%BGS(Cq zq2Z*qGT1b_;*8r_s5l^r5HX z8$ON!!>?;F11x;qLVDBt`ek&9L&1sXN1oS%>p0T-4*l)HWsmM1+c@l4bba4`ox0Co z-tVK^m+x<>!N)iF{op-ND;jMZ4IvNwr%^RT^w`KGBNBi7HxKiU$xu_u~`8NSCf1)VZubTh35eVf}{y%=Jx=e ziIXPC>1Qm(#M&zFu6al10P1`hXf>o7lQ2YXy5k{ILBkg6*CB=IgIs_$C=Sf6gC%{&1gt}XWap=wq`4G!3N}c> zf+Rj?gxDfrD_|rFKHEYF6VSr(XaY+3s5B~3gaJUf^>?8W&o;UkC`$nxwS@gT z3D0%Zwn`si+g?J)UHePLw!c73<;7@1=g13BJ|ZKOy#ZJ{0UsSE25DlM#jYNy<#;!? zp#fy~x7OClZgg#htTz|tZCg!+)U$jZA>2AZc_+>0#5b}cuZr?|v_Vaal;;x`I9|=&Vrmq=GCKn-aWxliyb*KU&G-odK zc0B-I)eV|qlY9X!YVkraRlESC5z{6Urbnw8YM~~#gN$knz+uw52-k*$sr`+EQg&zx z0g_$-_s({^oV9p1;Ll$+tlt206$WcXbrJf7i|<`b8eD{oy#ad)3cWc0dKYofhn!@@ z`)3T1bD3yaX?r)@3E{Vzq@w-H1ULl08TTxc4^}|f$P6dZYX0JdQcGyFlD2mMSXFcD zLTl*T+b{L?%~A+6+RlV!Ki;0v5kca|>uC$7O9t2KmW^A)+TKYrPOu?g=pl@&_W^H} zJHQM(*=}TX3=)z^W$jY6lI5`jiC-MD9IIY_lk(s4lVg#+V(o=tr!V~A$ec+boC_&5d( zJ&k<~7#c01-SJ3(%F|4Tyn6cY*S_ikU;jAT?HaeiFIM@*n-hSJyfXxJ1dh*F+^@YjD@2{0nLn)0mBo$pDn!xx3 zdG*~7<(;*k5%%F`OIXq!=PlEgEyFOog;I7^Vxlaa1)ZY$RQ1Caj9qXX)+l{a^U+qa zR~s2a;5VpoI%Ljlw1t!vgCXn#$hl!ebo7e`bYxAOU@#=*pKlS9`ri=7W0aPWFp|*; zF-Y7v#wrpY$euNX`ZQfE`>o-vHrNVA3Cd)VAq@ca(Lo+78r2fU5MI9X=2f!l`m2aG z2TCyQxodB(+T&TE~DOV6I@1022m+)^I2Ta4)6#&R>3k-0{c*;y)w_4IyD# z_A4J|tB8TF58t*1!q82vRw`XINh^B2o*g^I&8xGhO8N_m#kFUrWZ}1X{i^HbnjfEo z@0yo1v2P{x^AZvscA&$n0VI4@TMalQJWRsEJ_Pwqv`ZCwvbx@OsRN{zGAJ@VpgdU^ zV8AL>08VE+;Z%}EYKqGMf928zz;#zsEu*wTI$?0TcI*;L*NCOFRWg&}WC?aa7hJeh zuDRk;S@F{gWy$m@c+O>rH|I{Vw6aj@ZAcW-c;7>FG&0V1@QRU&Q3b`y-<>Q=BDBG@ z`33n)0+W@A6LVzAadYJKv(6;JX)d5(CWgf$B{4CE%wWQoZ6v2)&7&Lg1x&kPmV97K z4Lu(qMHy%f^Y#LMR3D&5>SoS?R!mW&cN^D0e@LJVA*;5ustl9$VMf+@V0bjPJ3VCi z!om^yRIODc(#3l#eMi|*7gjq>0FYXw1C0RpF2H0LvV*W7GNoy!02t=u zj$bH4Qd6XcFmZiZIgBFuzN$*2oS)j!bQ1F1Q;q8ex16TkC4$wOZ z*??~HgAYECjC8{I!!yLnWFj#=MJi$K3-F3mrr!rWr`C~IR@cRGnmDm06_@IX{vjS* z>oortPtPt4e5!wWzV&?bJ--_5^6$6J;G@v@H27f$a^P>h&<;Gb4Lra5%GZO7dw%wB zzYgr*zrC6-R`8$8O4d8Gf}*c`ez7b6`pwY;L!C)^PRUoVb6|;sCsBXm0fvX1H)BCQ z`C^s)MlTFw`2k=w019=1Lm&U!fuS-C2OCC@Ut8|*cHnQojTeKYg2Di9#9E5Zi<$n| ztW3EP@D~gy3=Oo%OCM~MmtOe?gF~OBW6`quo?B(xuHCZwzWa>|1y|rhI1HhABw52R z{r&Iq4ou*=KRQ>2rlrY<%%S*&{Xgo#cFSp}oGK&IGi39Q?GlI=-puh+WCy?^80}#x zV)Of-_&vZ0D~x`$J7~ocPM^To79kBgtEG2Sp;3xW>%-a!M-E+hJU(v$QuNs;Xx0ex zF)-Wutuk`qJn;z(m5NP!DEWo$2RC$*DkXFFEQuLAPHNFqHS8@U>4B_Pz@E1SMvy8J z>6vL#o>w3(fGi!<)blSC217mStZ1g()M#}Bpxm%X{jhI-fM9>vC@<`2Cgo(y?|$>B zoOB%FDFz5NW`6F4zsdD0ZFRk(o#e_Q1;J6(uPkd$3Uj28*t{#-z(={v0N@+ zd6`jGtc0_zI>7=gYt{ma_Y*$cOr~%NgZmy{%Lv;wgHsF9BH9_;${U-E49sryf;Pg^ zUTwV+Mv0Cd5?QqJiwm0<2VkpX|9R~cLqJVwUF$yFEsRIa}EV)-!@ zQ0AR*oJ<{=MHw2v2B6Q1fy zz$+R|4e?pX_%;$p0E@=K2C9StW*A!*)u;6X7|pb~o9)^8ES}PJt*}@+DQL!qCqSK(8-xeP1R(nxkw(3uziYT)YTjw*ySuI5!o@6N<=cFU5|fnC(@-!q?FMy6BHx zEZ@huB#>#am5FHo=FFWb{;*+XfWXd1!noKVIa}MvP;Uk-`oY$T>>;y0h>2S&jAs%+ zS^;)-MG566_X5PQ`$3|hRxMt%yM~wj_`8GtqJUW^jX~&Bds-UA3JX4J{5V5KQ3YVL zm6VbZ?T@Wzpfqtk_b{{ztVRa$h{=-y%w(5y-{=QestI~CrRh=tXK5K}GHvW6 z`Gm=3NlCHf!0JViU=kk@EqPeogs3q)(vOVfDA}=VJGM>bGL|YQE*Sj+Y;Gn^oyH`q zU0z@Fo-97~bjgfGf&fFgamzOBl)8|KMv8!X<_y5p4yyyAlt$V(qAASi)eR=8s$S2VFp?PfOvkrD4+VtA7Y9E#v%rs;>)Ge;WM!=6KL-pIIemwZ zqX&jZyIs%eJFt`dIRNkun-_d(b)5Jwj&1Ol2Rn!7u>bc1!^3Y(Uv2}va&%x+k+%Bj zsRx*5;F@7le*5UJ&=iJJWg<{o&}UtL)13e>e`#!LLO1vf^-BX~|k!ZPyYV*#%*W$MavDXVJU;gx^*8(HX*2~-0T|xAq92iGJV`6qXbwDjGl$^ zbJyH_Gi0S^d}65qJ2K>i*%F4Qp-v7R#-xqwuTH|YBK}qRLHO8-&BjW@^8<}B*KdQBo%DxpdNBc)aX zvF7E%y4H!C{q6@0+L~Y}8AJnNZ>CR~ERR3-E4g9i3Yjr;EXL{56BoDhTnmvV1uSCA}m)RiF>;1|(L~wodwGrDn3y zPpue)cLEk$Vb8j0*A~DeWH!ob zC51-mH*dDl2e@}(2JHjuqm@(~^f%Rts%FfDu24%CcCy}>=s3x%C;~(!OLbupm0yyK z@{gL?+=TWtIyQ!chz|VuFwzG2wd0u>!UV+&pfGj9STghDWzEYkOGpeAc>sCdOlZ^> z(rkc4Ld$H!4&XI(jwDz_;ECBurnj=n)!i*p2*4xgEzN{%djXy8^x1B@U=3~6003!Z z0@2Fk!jG(W&6J%AOEzWBTxkIex58}OnCQ7^r(O-!Vj-g$$L-DN1GznNq zL&-g~!fwL-H7#{AX6`gVH#$K2ct6qwJFH_pvWEl`UE=6#F@%ye(PTeha2^xCK+Z!G zeZ7sRgL5%$(paggsgY_tJWIe;e>b|{?)H#XKp^$ zGnI1XRacTAFkgQAtybU$5BBgMBaXLjZB_3M}GCx9|16AEfSXLX9gZLW~2;93)P%Q zX*XB|X=c!YX>q{Dg^iyq=_9hFB$v9W`Gl?jM;N?GU|OoAXOEM;8@7m}vBofU){tS= z%y|->kt%yWeuwPMb^}O(5DcawWoQP82Tp0l47nZV1EeKp0AV5md-dXRaeOyZ@o!vV?V=GxR-&^LRM=4 z0I3;mVt8x<`bHPwdAs}_<}@}tRW{dm6Eg0jlwF&Y0|Z-ONSXku75QlQFnw;`tESZT zSmt2r46EltQ`S$|*M#nE?(M6@iI#6?MX_uy*eg|3M=2lyrGTvACc=m42{# z+Z=qR+DWx2u>o!@X!X=EI;g4J_}c~8heVaqZPcqKJn!9$JqQE8orDAnj8#l@kX&-{ za(U?9yX5kpEG0oC(qQ$PVfE~U`N(4>E7mOyuuZ)jcLjraEywCYyH-gzs|V;*Ic%^* z0a6YK?4q43@gs6m1G|U5a8(KPr2eYSBGS2Fh4VyO+MrYzg|FOUZqTnzdSXLS}o%`uK+Q-yZMN8Jz00>Q? zuw@E=I-WLISE`ZF(hV%0w$3p%A%RG#D@veruW~50i)J5dlwWG#O2@uEMv;; z>y2+9_D3*#>S?K9uNwy4*~|oiYdbY#D3=tv*VY#7a6%-L1}tFD_&d)*v5APESSJf{8kbRhnef z&cvvXtp8xNgY#kNJL&KHHg7j0~9|9y6Im;`ryeg$gC9=t2K94eb>NQ$TvQ1J-s*IqF zUkCd?Y2sAwUEEKI0BGq;9f}+PLK5sL2Y>q7}np(d>SoEc>Eon zcJW{#&+FjNkCwU9&ih?Hj&{38kJxqp2JItnj{(DPcE+^U>%e314eG#Xb6nhG-c43i+A6U&zy+fj+B4rC1yHEb%86zB~#if-- zK_bEKf--sh=|2<73M1@<4vWEm9F`mvlt8oZX@)`Ag@#DWdReKmFkG@{&6D~{5+rhW ziU~$T`p6I*o*==5$ZBCE9Iz!`FcdEAV}>4239YCI{QYWR=Ky|$sSKMN074v@u~7`f z^_BSP5vtP)FFp)nNu#nz4uC;yXoOuMYzn((WWX{Q1_SmYV8j#@-f+#e^2_V4P@6>n zuUX!HZyjEZR}ebRC8QT**p?`R>SoaHhyBysQafyl8V9>!U+;POuVM#;?x^pOeGG(! zJj(!TRi)Joc7Vf*dg+GU?1LQ?*ccze%F;sO3j?l8MfoJsWa5q3i>7jSWvLXGm+-qb z%#0iHf&=i7h|xwBksf~2%K)ZcbWR3GGnz3cdchzw(g8GzT1mu=cF|pcAvlAsv!a3w zSVFkytz0CLxI3EBOM1!7iDTs_=bkQ)K5&nmGH0sz1^ZDC86XF+>Slh?2B2$Xa?wH8 zYaqN{4B)IHJG7lPv%=DC!OXguKGz0oSPL^++}$o6%CgZe`(Y%l^u?0KMyUgwgFs|o zGvJrRh&C(QI@mx5gKZP%yB7_f4Hi~GP&;kgOvqCAp%vz;mG0i{ge_y)PVRG!u;Hrn zQveqZV46FBj!ap!Na|R3@s?7~5j)Og#SGZdgd?4}xB;7n7a{A^iG>@DY+r4?#Kgr* zH4IWRhRQWCUC~KNR6c>TBs05~2?T}oq?_xG)F;@d0f4Eu+G&$#;I&sI#e^``_t1wV z7X^lzOrla+6&&jJ`e`ezIMU7eZG#ciGJo2)>+*{LFi}#*B%!CWQC`|B(9oNF6k zGJr&g9@?yjwzmRqss97`^TyLNMou70_@omT$q94jO4jUYGG^KYIr+HxShGxKQb%0I z_>tk<*F-r?lW;Q0v$IA^A?$ZyagmY9JQ~2iefti>9NP}yUi02sx%AR2hOWpFw2@jL-bw%S;{K(k z<7WE#fAiyi5-?P@aPVUgGB7?K`1`PhjF^>veem<6#~*{Y_V2$xe1HGlH6CLOJuOJf z9s`D+#yGlHPkS9)`oIO^;pC0pics1c>lOwRB23stw8-7J-b_XxOatsg2br%cSKWf} zA1xLBXb=DDSKK6HpHaP_`{ZPJ@|A=DXV3YI)kyGI)go4r|KLM8Ueb_*_9D(KBpk zv>HXPj6!t(z`b|N(#7-H4z4;pS3mfe+;!XSl;={562OFN$zXR(4ESDv4HGD!8y3t= zf=Umm+&}x>uf+?k=7y3YfDJXB0dBk5M@>j*-B(D(mPRr%0crUqWN_+n_J|p_&jr)s zB0L;Ga!UkYyd3~h3zOG}S+OqzrgYjN258{b4fAM*g;bWNAEwb4033)G&P4^6 zFz{C=z)&q_OaMj~z_b@|iGd2?^cM7)m}JA`Ex+&rS#{&}vixU1m5I~F83`S2b{Fg( zz>{!bHvpoZV{HOpXjPP*ZFK-Zk!rsnfT9z-mj-EMAPoed7okqKN*jAYkZb~wYdF4@?KT6Rx&b)N0KaCyUJ$@x9H!&3K?$;X-)_!59*_o7(^7w^ z!`OE>zw-rfwE+O*lH#Slv{b@j#_EwR{D1b&1Hi7TTL0_LojbjkOv=n;`XrOydk>)m z5=sC?iXaGrh~?Q3QHli>3&rwKii!e)AS6ISP49hXGQIcS=ia&P|64n`$)p$u%zNtp z<-+8)b5Gf4pR>RHt#5rR6c(9ebNBv4uC}k4<8@0tn?K>Vw+kkx}S6GpnnI!6WNx|o-eyM zZI#_Scgch)Q)C2;zp}TD^ygZx7kwQ_hu>{BQdBPXUI14-}p>jF~n*0RWFSx$nL2SM^#Pp| zr&$`@+Wl#EQ2yb-VXJ7viR`Nf($lpD-ldd$?Ht9IZ%@&9M zxihB7J)gfFFE>BPs8D$fBj!U#iW&GCCcoHjvP(FZntxLbl$qlWE>0M^nLE`hP|N)=3@OU3o*#7JS3%y|n* z7JxN^5wLh*F#sr|=gk)f16V`p5gDi~H)Y2>l!+rV#CRKOb(WHY2c)Nn!5sD_lH`fF z*kLe>^+t5x3*!h)Vg^L5Cp`jY5iymlShhrd^n(Xv!q_whQzTJr_qIFkk(dASiU}d9 zr_)2KX~6Y+VUJu@$i2M!2KhK$yBOwV%fQju4=y(`%?)(_wwOWbMi*dg7Dpx5%2uTp_oRgSg z@zPpU0BDUS8ruUvY$9=m5HanIUP5YMy7YMK0s0Yu8!fe{HZ^@D@~nordwuPCBm|ng z1khq1Z1f>bRtjc6-2gf@b5@qk&Avuby~Rt}I43N32p@N`tx%3b&8It<1T|FSugLlB z;rPMnuzP4Hxdz+$y^V>3hN1NcJZSVZYg*5nhRhutS0C)0pMMbZ1v1`Y@ce00xNQIp z+2{cBr7M<7es#SZp@f`^-+Gw@*kK5PJoI@qjkIlOP|(qRX1yNn116gocFo28qYq$Z z0e~iqN+7gO$x3v}&1K~zfXx*v8Q*PaTY~}4T8SkSbMSf?V^>WL!oMW4z%u}lm8M!w zJC-ql0Ip^t8j-2Vfbw`M{9sR1S4ol(7E1gsYiu?(tb-*L5V~XICMje)*^?(q9IU06 zia8yC)&bgW9tkRHwqJ#>Vhv#RipwvTeS7!95+YrR(-88@l=8ep5~%tz63z35x86pV zSRsp+E|V$K=13{8_wU&W<2Z^M@Dm6fQ=@r8j=cTmoAk{-q$d%CxLstxTdGgGR~Yqb@H_8pg~rTudiDeD8hFdN%$wWA?e;>Um)3JJH$^7<}|`;xzN-v=$!> z_D=iK{NDG^{~cg>qQ%?{m`7*+N83qr=rr_!x{AsNB0qfae&eI3b``~y)$-HFo@CH* zN>qG;{P>XvUIOZ5e>sP|$`M9ySyy+}yjdIRQk$>`}7<9Oyt4 zuT?DEgxLdR>B4#P0XU!|E^y12|2LuFzpCK!@5+T<`4MLELgCHseGX~ zBrm4K-RKK1`r=&@L^fz%8KU;X2c>c2W)ezjq*sl(NfL20U{Qz_55NvW$ADA*EU>j+ zm`V@(r~Bk(pl`!RPIY1yk|tb)iv!UJ+BD?d%`!bORtgpstN0) z_tqU))=jpX8OsUCDw>LmshjLC z5lkQ)BxQvsCc{XzqaUSR=|8ocLpv-O)wm@#f{-~Van+ht^0z-eFD`y(Vc$ZqwXp%_ zbi&gQTjr%-s}Xqsr>X~b%f&hZ**`bcNP4Tv(X7IxD_dHNbrTa159dy6KdX+k9ni1W zS8{r~R5HOSge|iG-UiSj_Arv#S-&#a9Y_iM>GS32Rn;aZlFBFzfbI@#k^GUBbkQ&T zZJ}uKE|KlK526z+H>{!sHd3|7F0_Q2UEN22iv*mj*|-ysrjY~n2DQN;yO~%z0e31X z9L}}Xag4Q21V~xqBBhy$M>vs)9~rS3J0x}m*;`u zkec}TLcaDo{s9A(4IP!1=hBDyUZ-8$=&i6&S6q6r+;H7B=1%)CXb-J-SVbVDyU?TIHU#$FusnVYHa38e1%Epm1FDuh13k)} zw|`c?bMIGR1Mr^XZ^w>Za?d?qk|Rg76jzA0sL>L_xxk$2olEUKP!$3U)Vjg}D2sx{ zNXkl+-3&}c=$i%<43<`k7uy_V@%#Z7abz|o4#SXl=2Tg}V79EhV2P|Gw7wK=oK|Jf zOzA#=T{~@H$0*psSRF+OJ^-OT{1RpN)D;h&h;!f%K=EU+w=yBn@Vb=&-vYa1C9D?= zn05dd2hjNi;kInGq0{VY2mCIOm!5k@md}|E$n%i>ibfDNt0{mGcQ~MszOvKVg&8(A zYGDT}ksCDF0YYd3izyG-MflU-LY-njc_oIy88CsuGCSW|FVjfih=fht56~OMIU0+W zbNx>rmBmy%DcrIR5bcr)8Cmkq&z_Wt%NI+*)6dC-x$`7{`*s;KIz_4}wHFI0Z!ayQ zUCG)#h#_$@9++FUvc4n|K1hC`9W4>j(gUjm%2A1)bi$}rHDJEXc@2$1tJgq=GGW1X zcbDv-^jQ?(sI8icI4q+!LqK{?9}@%aJH`MWxrOmU)LRm5Y9&10OgJ(|L#Lf&kRLjX zElQG~_(*Inn$Ibe*mbJaR%P?@kY$FWd*F~~YHvp@J>op>TNejTN zw7iUrTQsBWvl>Nj-LngG=qO{(-NQBCp?yCd8z@*-1=8IdS0l27KKi_ZZGxgyLLm|D z$}8jm5{Fuj*Ps5Ze_(yeXAzQ&HAzBoqgxVD>qAHwn@X`dDt z)($2tfiS9}fcd6_ho~e2$RoTQ1b_=fw_CMokI{Vw0$kPVsE;tUn`_4nTMBhdS8@;* zk4KVWla9g)PH~vjFhNi&oMCt~E?}~{`_Lh&A(L3^N{>xWBpjSf_B7=%0p0O1y&5fe z=iLotYCB*C@ncNGKI>o}HZ7J|roO zdh0O#t6>+l(vjMHRRUs*ipse5b+F<@YW>W?V;JxLogV)Qz);&uFFAeqp3NJ*Jk5*2 z|M1~S58r#=v;OAvU!C-m|DiYMdaLIdL*I#_Wqm;B#A)Ws(^~u}6L$1xr+w*Ln|apt z`PO;T7ejiZ>puJXhqRji!G%u4{t5zlD5%qF9hxkmpZLT0Xg2KwXbVRSi-J50L5Tg1 z@hlvGJ;@p~L2kYEHiX*STwoGU+R(1$jGtg`vcZJGl2g*;uKORBMv@VNNH}p4mI|a4RtDzN?F`QC zn|F~AK^;=SqCJ%oS+GsrtfRRkm#`>cm4QBX`a%iiW?fxgB>lB{(qCFGDf1UnR~SIU zAlbQVC*e_;Htx@%NokTuxT&+F4g=s)vV5_7VPK4+^j;!ip?1uv2YO)J7&tWi>#rb+ zkaHMWv<@nrsJ`wici(DEfVIy&{mh@SXZbn_2=!>e0JeOli4ioH2@x`SGcX)&U-iZC z@`W34WuY`)BjK{9!(_!4mBI`HaNE&N5<+B>!#GhoNzD^C5+T`(XVX<@XH)t2MbbTax&_5ahCuIP~y@Wpt zusb<`_OQ@GRxs5jXjDgMWXP^R|5=&!t?OhO2qHWiji0*qo4eF!-qOJdf7=1?tN^fI>r44trHYE3ZTXgU#wPUH@whzPVEEXFUBYBk|h zr{Vh3n$CS_R4rVWVf0J2#R?-vK6) z1(HK~y{ybE04<44#f6mP>m;Hv#aL?ZH$UX{<^btf9c zHmtZN%bV-gN?S{_Tz2tA5;t-L6;ZIq$vq?~$;s#wv&=m;D=SAn_;3@KJ$74q{*T>n zdHHYo_)h_b$1cI+ZD^X6YeXf%Is)t8QDRD4eelEg-uJA_>eB!Fk8{1%^T5z|4ry5* zh&yqb`SP?D9}MbvAF9EZ89iI6Z!~m7%$^fB+jg~B3A~R;p zkoOtf%V6tteQ7C4vUm4x%DXKf)LbMLfPh)^7RWQd|D&w?U?(;guwUq#JPZKI0H7d1 zNafCb;;N>uExYdyr?l3R1!Mw;!YFN`o-u~hFks=SnUVyHSXo~u_UcmcR+LFFpmZ{c zDeZMwQjoCWW?8K}=7o6}fw!U7M6Km!?j}qf7y}?AtgKncE)oxihH(F#_*CY;xEZ zOQDZ*ODp?iXF%5KAa>d%9_`vx2De#@mqJcN%RzkK9E47-nmr3s;R4jU2sdjO4`>3| z;kwX$(?-=l07gt?gxNm_HDJe(jr!tCFUn<$7Mq&5o&2T>{a`ssGMiy0_t?ASV1GM4 zi@mUi3WDJz=}TR$T~eQ4fczj^x=9o`^2RzCvs76yd5XNdcAeN6td}fZE;|`8y)dye zr_Ycre|=5Th9}bRJdy`%rtRNK*|KE(0;{%dM`A|C@BTy5PuQ=YgcvUxv@k$YF|1&A z<~Z38pqw;omgK(sp3EY%wurED&baYX4huUHkl#@S@E}wg3e)XiFi!!rHP%*R$V@n$ z^ASTrNiUi+C+ENquCqa~Y}3u>USd^xpV2|ck7LzDCJQH$vrMNX)XYAs z*3Lm?5Y6bf!1(nvw@4)RI|J1fG7Q_7CRp-lu9fDpGK`mpk-P=N3xMhZcs0US&VdQt z`sP~(NO3|ypGT8LGA4|dn52;gh#1xqCNGHV&jlby z;=<4wcF{Jyu;TGqspyFDHAF|-&pN|XM#AKelGd_v>EoRAkZ_g8q_LUy=_kxP03+$( zo}dzvei&3I%RqEXQw8j0Qlg|&#ibw1oNnY6s(OWxl8?V2?L43}>RU;l1}wRU{gO9`x_~_;&|}bSrw& ziHBZ``k6iy6#5?KrTJpehvrM)d*8GE-nRzdum5+R&-GT%14G|=qh-$nLtkSI?b+8} z$Cu{HQhlL@J~W){0oZBg?09a@U;oUqTCoYcc1^0 z?1nLHZEch9eEZvIaVjM>HC4X%&_n3EVvXg)wCU3TO9S%rM}BNFke5=0Vb`{8glST^ zM^cxU(CflQ%diP)m;3Jju2>_JA?*OG+|WZ)MoG%JENOwUY1zJyYAcB7dpjivf4}&w zu^0;z7KWK&RKltvM#e5!AT8anWd(TvtPU!QM2VF$S6=jO<@*RXlW7Atq$0+r=EPA?8W7t zu2y;Z>Nmb2--TISymSVYD27XLIEfPU^Cr$qAK*g^7fy8<;3)z2pjvt2Yw%+sHXMFwi4~1Na}JD{LVH(+;rlHg`+)uDy~23#eiD z!+(51#sR*EGl1{>^)ChGnygv9Qub`!BKi9d;;DC;>;yE12BGC7bhzuawK6UxU5elN zfb3^ zX{~CJzkY*ECIncOdk|)?N5TlpS03C?<(+hxM>3{sssSmDuxx%3%sCC}>X#5Sw0>wO z0|84GCLLM}+l(JvFOZ_tPX-8c9s*bw0#fiB@Q`q!SNkrL8b8+6qv30s*n#ddj0r&X zzFm@(o+-5e-2|i+-GCf5gm<8oYX!tP0iX)fr_7!!hu_&?tWTV12$fyTnKVfrd+uor zzfnw}*Xt(H!v%N`03cZj8!Jm_p^sRY2xyr)%{p=P0oJ^*T`+|GWURaBpK7rb?jI;s zg~iAz+%jY0R4F4|+Qoz<5|j0Q!rk?iRc0cT!afGV$W?GoT>#wx5^WqDb0o5kCNkR- z<0I%x0dm9jpTe{AH~9UjlL3=1?jLyS7;T}_Hac0=r@X$`qrdGTd zqs?`v0M)?+Gz_4XoSrI`+qN-Jx}3&^x=meNJ}NwPXNco3+BP_jgmwA_i_I! zLwYburn1a_?sd6&`7#NnS`)hV?%OX32_xjy*Ittq7hYtpUoAhlhYaNk%Il4vF-I=G z@B&%?)?3IXsA2@;ynsjr%|+5qysUrc9fMq)P``AEf7{1@0x%rheuG~R28O1A&6g(t z;L%3+z4twz2ZsN+GwNOJ96pXxx&L^DL%&pX{|4)3AUawnEO_TiA9PT9X9|L%Wp!Q;oKC_txMJS@C6S|EUf0g13GU;o_AGG+2))7)i* zC4cdY#|hi`lO>uUcYXeDG=yGx_`&ayT^KJHaidgLFchZjwO3yyo3>C=Qc|hadV#T~ z_}w$lP^LIYF1&CBl^C!T;RZZ@e2#3~yqQ|IlZ{^S>-XMA^pru+6^(%}A;2(y*h0R8 zov7P!K-_gOI1J*R5s?x-XM)&arP>a0<5$g?U$~5zJR570K&dS~Kn89xw46m|%)A7% z;XbJY{8<2uZnSUK6l^RqGf*BexZ?5Wgf$5b2E?L6>SYjaMx5Ra5U_9qk76+NqP2=( z!0Q8i497<1@t^)kE?&CG*wmE4I$X784HXu4OCZ^<>WgM)fL41A!@9z3M8(HSYEF)f zOiM-kM=}RMG7zRq&2Kf^)X93o0jn2XeWm>T$)8iDVK#{zgx3I(YS>JGTx!t*)-iB9 z-B{evj{PtjT_ko;hlS(;w{((#Qq@U`GtQ%?i4=5uB)^NWck(ca&B!9dnas|{b_wr; z86(jl%z;Ld@TG=C{Rj{0;BB*zDa|0}h3&fTy6fdHzxyRMf&pcS{P$rdTnyXzVpF+n zvbRgFKPJ+6B{pLwta>&N0H_^?Wpd~Uu@gEjeClaRi_McbLX?dCTz5q+2{15T*y;q)-&(MR2_y=xTFE{@OGr0b zK0t;OQ00dX&kMNd#N=Er<+dtVR{(5%ei7vrGo*U|e%cv^mp1O>JV#I>uMfSZ3wA3Q zKvlhUGr-*;aR6yM6A5Jx9fUz+`T@!GuSh^1XrD~^M$RkAP6iZGt_}dGX4DG&HQ7Qz zpo#SYQk0>!5H{3gj)89MgQ7@0=)w2Vr4~V$9>Yc}019wY&XCN08yVNi#z&#M(@9w! za)zYDkxWb|GswQ$XafyVH*tQa(S|ElUn;3&zAgfUM3RV6Px!YVP_Dp78ECC(tQtQD z{mg2^|Im&c0#K`A=3Zr5xn5jkEca_w7GC!^wGi@0`$$-Pcw{s-E)~>Mu8|QidNE9L z>Pjn2Qc66!N42~ON{GdtrH=4!f&s;TfZ|XRUox_@DD(F!lP$IlXti?Psu!Y`%d_iy z`blV5I1?#=HrLYt46L~q0agbZy9gmii$C?e?dstJv)hMsBz^ouX@GeSqY6uDUAd%Y zWMY5Qhi=(|e`CCnU!-THb8V8`f<=u#S^2#+-4c%Oe@JGdm44^#H>95o>2&Tb(Ig+0mzK$vja$fMUWHy1D=W@xdS)hu z*l)596%_pYKK@m}&}>&H6#w9H>Ii$%Xg=uY`uS1(G3Z0HZr^*~v)(!eujL=?z&ZT- zTyOO_V;F?NwXXcw_-=OjOdA^tK+|Q8gNAc-@I%?IZtCbhpStJz{!D*^c8;%o`+VXw zAN$?_!NI>jvFxBVnBVIT^m&;7ba=rilyE1FqG%`mk@FsIh*7!;C+Ux6O z-COTdxgiSw!Z?xz91@wBDkHMSNENkyyGS|-WFPJ9{7BXjM98%LAfOJGhe=#}OJU zJyK{q(n5m64B+TNcNEA#r4=EvGg9QoKYUOwnKc6jQsli&Tjbj7ualy3^l04t1JD#U zz<#Jv^~6OBW!0@W%2l_1T5h`gF3B7>MjBxROYu6>K_ZaB(+Lwf!0R#N$IIRSb+_Dn z*XP6yb5_ZK*$(Sc1+&!;)6+#bs~6U$h6IEDkPs1RM57MCE6<<(+Cx2SBFf)mYLRhE%BAN^hX1Jy|gp?>X4 zUzCS_biaTtO_E79-Q#I@n`~(%F$4XYTFwBQ(XSCUME?~72(nk#$uQX5^0k`*gfr1% zdSutLe&V|A7I5l(F< zycZ0(>IUqn0dq8LlYmrQUUQi@9+M=6`Y)@~ObhhGW z3FE6bT4m+TK5?zMV1<+sQuAx*Fmtz3ovw!DHCZbFHqgmA3Wf1=!GK0ZQ`WAs4nT!| zv$__Yoj*($lOX_O1npB<#v}!Rq;@mOfWE37J4k4OW#f9#TF3A2Js@dJz|zs_4$wE| z0=}=ha*ZSd)_Pm8USS{mI44@EMJ<#xYH5L?v%(-6u*yt8!`%ZgXy$XyaVy5seuO&% ztO3*;$4DCBW2JwE)303gmx}yC&J`K^Y_A?b*w4hLGB=-Vd;C!#3vjp47IU$aLh~Uz z-g}29YERQHR>I&mm_21dwVtv17Y5PC)r8xDf2Psl(uV#F6khsaKt!l9jc(vNw6h;6 z8I-*Q&?%VL$|hdgZDd*sz_m*3oGYzA9YbUzga|+r;d2iRZwLuaExj!gJw6lH0w#2| ztzsp?hZ(Qbwlzy+LX6B^xIPjy2N1saGrOhh-~jr*yJ3sciBxy zUC-OJ8M7#vmn(^hN%GfMUX~?`7gFgbj`QzAQ(P;1`R=kyE9v8pLiZTJ{}ta z&bYS!Enw(Nc09flW(NoF8zu^CPU` z)J1)3{D;q{9K+z_8T?v-pMpXUHzgffRTbsO&DoFHS_lkCKSs$9e(UQd5hM_6g?HXu zCvUvHfiPvD#G^mD{WCWJa1P01zj_i8c%)o^=|wUe!Ffz{l>8cd2hB80PDz%D6DOKX z#fKhz(Ad;m$c=OpzHliFcvkdSWn|q>Ua(LO7gx%I5B(I0R**y_rAu2Ni6Jn6={a)= zvwEdEZ#S_xN^AjSB4HP!)6lKeG)vdsBd{L;hp1r8t;b6TV6f{TeuZuQ2BeJ!Kpw2G zFviv{K$Vw4DhVINpfE)5r3Hkb84$Svr;TL*i4BlivWVRb1g;(ia9A8I_Z0%uBk}*mi{!K4`l?)Y&s~x_eWE}g zNK;QYCE^~!?Dha*aKe!cKu!fZ?C*7-yIsEWoqHt<9c4M;%gSyLC*ZZ3W-_sFKh6;g)Sa66i<4r9tcX}Ce(PO;!7M3zX&nhZ^>X25t4T7To-clHkuWsV z=Pi=`>o*aiCbWvytN+ap!~r|#!sf$W3b@yE2AEV9%?5x_J)aY{)DlAY5wPL__^Icf zGKC&Ap#uOHWylypNnQYa(D$`ZDTsp1Gz^=c0yuz|_G>qKGYji=HX;w8JuK+udaLWj z0b3TX*FOxJhBR#?YFG(@hIXQ5YpnxpHK3Oy>y>k+etn@NAn10LF1Ewi`q58Sg9;Ah zIzor4R}_;7D={r)x6MAVf7Sti_L1NAV)w!^DDZMIF@QQ08{pLg2nqn$xWdV*<-dNw zzn3JSa1y@S%FE5MS?H^p+))d2+?x<@G_nySX(Z71W=)zV7c5&U^Or1<%<)tYA}Pm& z_W^)j`jRFg(S$r`9Dt$%Ihu^m$WZ6ncN3yl@NGw?V5eWI5xb2fEM;%q&8?D_INT(; z^b+o_-Ft|TDjGn*(k7BuqT)H9FtVYTNza%%SvI|oA0t3J7+|RrE3JLp4+HPud~%9R z-DVFgwFR$4hvVqI$O^Cv2b4Kz|8Tb5NuPJYaCQ({kA<0Z=tb8DOB)-3ydr}80{dB0 z0ed;jd}if7=udqIbbLj}K0odKiO-K}tXaVKTb}i$J`|t(K0fh_qu>3#e+U1@_uDf)|GnRz z`nhkrzJ1c~HEe$BI*$XxAb{biD;e_p!CT=++Hp?#$gE01#m9YoBw%=aBfjnVo{xWV z`U@8E?VqplPG9J3pBx2*XItWqD;@IMhI*dN3b_Tby#A+`6ubu-Gs2V1 zs4rN$Q0}e|#0^Ml&OJ<+jsY7z*ytIvjee;CW^$mq zT)c$9W-Y%&Y_J7YTRwpGph_+ychb~Jgr6d%^dMS8G<160VWUUD5=2NVRX$qEYfTnq zID+z4O1=f4qjGc8o<3%*y!7-_lFa8#Xa^sE?6>m34}K_(BrrsgbYrz@=*%IjZ@*o> z`pAQloC7<^0MrgU^}=6XlInsI$tMxQPNp^Jl|XNRvFEw}$;aiw>#vsXFtU3YP`Y5j zoDqStzp92>!LV>JDBICUMKLfo0~BHj;je#dgN&p7iwcURhQt^RGw$BH%Oo*W9yloB zFt%N^Unq>Hwv(HI-h+-RfG}wggL+>bAx(t%Hmh0|d!E~i~O3A6s<(O<}CZoS!* zldE7(RtnHLjCOEebB)x)csKzFA+T*0yd0ai@20HUD5-z*U70XuycDlp&mal_KyTOx zNOTiEoj7kMwXqN3$GDryF+q}+lP!7c*NeTL@G9U-jhI~kgD^n2mJtgfv8P8FJHSgQ zVQPPvQq|XK1~t42V3zhlt7=i5Bw!|5lVoUj1viFSgoU#4r^5^Um^nU0KXhTk(kkN@ zfYwx#UEIh6+yF!ufUzHY6)&Mw4Yl`IQPD<2*lfe8lLY=OSo4_BF}>66aMHG+hLO}N zC4D-;>COS5y-=|hz-vFuG`7yBQjZ(9(@A*W1;Ev$AGMtU;*yjE^9h5bAaj5)yq1pZ zrEj@mUELT!TVcZb@u-ZC3S;lBx(V{x(6Uw@3R9Xt=2M` zW5y8C?0=~=F!a9dTVWg9B{MlivPP%K=n;wdkM5I3NLq!FytjArIN%xy+SB`{`>{lM@^)PN~u&- zlo2s0kgJK7Xh@xghZT*K1AF%a30#fvrszk8jn+FdC&)x{RM&A1AA`qY-l*xeS=$z4txql1E3v6TdkziVt4r;9m@0_SDyd ze{<@0|IGWr>mB^sx6bpx(AN^Q&OZeV6&&$*?jE|XbGg2cu(lx{$I(!M9=CRLy&xFe z7$CwJj3UssJ@&Ilxqu*ShhS3pt}01H8M>Hl7qWt3JD`xggyv%Ac<_i7csG3 zOGaZzT8628>%at7{R@Y~&~^2}eB~X)wgtNw^n#=3E;OOJma=l`EG`Doz^DM);xoob zWkH$PD~gQS?I=ErAS>|zHB7x^%W9Y|oY45labT*Rd+|m2>iyp_nZz-%@gzW?<0D-7z%QSa zPkiQ60#pUiSvl7Ivi6NP2$NP~%)Eolkxs&^ickHhqdQ6-{ln9eO$oU}t<6%!z*|G5 zgmReLMp%^^vQ#SwovG2V1wghJJCV$>V*ptNrqoy&nZ}`!vG^n&kyxrdG@?_BAiFgT z-^D(D8x|A>^8(`rIJGh0yBJ^@Ma8eBm5^@*VQ?M%0X%@XespW<3wJptzCZcNcclep zsT$^}0QO=>N4@N7s*wsOHEjXxL3(b`gZaVw^}e?m?P8|1y!^V60#t9`V>F+mW=xQ} zykcoQLbmXq58;$k9Xv9sh86G@vhlKIq4v+UE37 zhdB(etRYAn081@qG(pP3R9VXpswuI0mxVpruq;`MVeI7SYMAdRht2VlP2as?xFQ9DJLPx zY0Aynx!!_dztze|Z#x6%54FT#2#jYxETL*}b@JA$=MPmY2TiTEI(#bZ5VR;ph zjAadztbY2oCd5P$#_iOqD4LZF;8b05@TlQT768~~*yoUhVuyJi&4fftCaNE0s5UF? zZ#(Banu%Wq*HtrLSZMfN2i&#{qVz05(_&z8BL+u zY-t(KBZSn~Ffnc?D>@=HSn>-B%-@owOEK0?k++f196oeVT%A=^Ty4{B8ya^D?(Q`1 z?oP1a?jGD}ps|GD?(VKZg1ZEF2oT(YyB*$djC1qf@9P?C*RyKQ{WumfR5`1ihvbs6 z)ukoZH^ger;6k9S>febO7$p&|q$=wfuB6AC^%pl%{HN7R8-08GT<=3Ix2ym47dFw} z21gZhUz{$SRo?b<{dm29g&IFE`hI+?7qWN>)sdgWwW&IJ{cdVfHe9=W@3zueP`R3`4&eim?kGC=VO_ylr3s}x4So57%LLv1QH8L zcf1ExJod^+PwGXsH6=T2|Dukc=hUINQym?G5Kf{i84Ek)`?fv~hs)jd!K#PU)REza z;z%~6$;xSRtmHt}SD6q)xivo+p+1S$Dv7RGW~)CR?X8?lywjw9kXjzMws6wxtaxLf zlxfGhsBZur=-fu6UYKu|DhOJDYq@rskD=WD)0Ae)c<%qPU zQQ~TqZr(GCM|t;G=Q)W-jn?s(2-hz3Q#!rTO5{?o_G!XyF`8=q+^oSCNWTlo^y=vQ zw2~vPEn!ZTkqNn(4%C#ZHzwz`YicO^TlKQ)KJ$p;Ggn2v01<3uAc}V*QaNgS~_%8aai-IDT>U^NgbYKaR?l~YnvNNKJ}W3{CbV& zanw^;HXQSYC|Q$fjIlBDJrb}yO+_%jNYl$eZcgrTV-|2Of4FZdDfALYzx^IV-ye^O zDEKZ)v5qH$uh}0bPCx21HayHuPbG`7 zfKq4IbP6?%3Yg_u+mP<&%_@IGaVc75wRDFDhzlq&B|2Ib8i_T8S>L{%Nb+DPjcAMy zF-%WG&@ERAOtTs}X64j+Twbn{uLjvRsqAYEsZx!7+6+7gEnP<|#x4F>;>oZ6te@YC zVK*6p&8$kcbJs`f8&xsFwv{rEqCtBu;I0+#mT|>^ZR7#OeFc^{jHz+>V5Cj0Cm=;B zk@yyQQ$%(Vu#qs4h<^Oi~UxydJv;o!pmFf3yfBgFJ+Yf<=%H%oaa#m zo|zEz9MB?86je)}I7}Sr##5ZfI1J(J2bO$WakY81^ zC*bzGcVTh&Y8gE|bzn}wXzVHBNr+1nFpa*6i+6|!b`QyhHo2Ogn-)*_mKhbixP}%5 zL~&Jt@2s2D($Qz9D3c{3${h)ypqI)(7+)KyYT;aQXl?!aib4eq{qs+AEOn_>KP6ix zuWG^^R`JFR#rgS@+EC0`+`Rk5=#i-XQca>Ief9>YnwHp4~~hqZzsy@aJ<%Td%e^Dv1IRNO|^RFvNB;ENgh{1dKNV1e)9el%kX`K zUpN*0SGYg=rs8Jf`E}vcfoBI@?eppR?@m$4_sR62pySJjKhHTHuLrpJ8P{ck*XVD* zJG+D4z2VtJADYkc4ubP*X>77T3g|lKDDmuEikY6~bz;tCgjFVo*a*~*zXLWQWiFu1 zn7pL9O;DS#(qf6?{_hM1d;FV4=VkKe>u)AwzI!LeZy^KNPp7B%W364c%2CvA7mC!Z z1A`jBpr%_dL+?LsgGCsQ${FS{H&{N@w-yI~HaMJ)HO*zOA8G@cXx8To32c~qA&xUO zkDLIysSLWw1?pfNQd%B}kBbr|%3rR&4pc}?MR7!?AQdsit}TT08KJqCwBY=@pU>xS zNSKB2o#NvVIzCuVf*g|m%S6DGf!SdiZN(IY1>845kf_X1LkrnY;~=c>d?H+JdyD{q zKUxbfw}qmBk%9n9sDm~109Df0qbc^s7)Vs%fPqAaKc-*KTKA>Ts5!`bIcfdam642V zJc6x@G9NON;kgezhA_pR$Mnoe>T>bJ_)SW0MC{La&#GM6pMJ15R3f|C1O3<*N&LjT zlF#{>7fqJKOwl~bO4mQbQw|gT+~>yV9F9;m5-pvwRV)F<&+T%wGZ#BBtBw0EP^P@(QZs8zf*OEhQFmRRxGj3hb$ShucFgavM(Q9l%eID|`( zp7)T(Z(e0XzZyIji?O*1w*{<|%;3NbrlOvRfSx|QLBP*y=Ci)bVK5b{#V{=CM?j0Q+H5?YqECD@3Pj^oA5s|449` z_+>sjXYp@>0H4B`63?J6x*>MXVqgTOrjS%3C9R?n6?rgz$E3{{aP{!An?LAMuk9zy8zQ{9w=81m2s$+vf zTD3I}`Yn%<5Nr383~gbl`fBoS0C43FUqa%W^xfb*vOmZ`Y{@^^GvH63R~wTqK-}wF zaU<704bPyCm(M3FInqbhWrB)>zKSs2)POo6JT=yFrW85`cElCzJl;u#dm1hv>E2b_O z*t#9rjhT2%HGX8;ekl$&^tXP6lbDp&yo=(}JLyqlS`?yEhRN$}3K>;_aV*n-IrB$C zxJ0WG?Dkx&%;y&74vl=UvO6>URG+_cPBNO)mczMelhx@T-KQEpelm&LIv zSVfB+jj6Fxk$_5vm$~m8Ilb*wok%W6!zS}F@>ihpD&|5VQUNBoVs{D4FrrokJ5SnA z^!QQ)b#Qw0kEQJ#Tw%DVsvKa%{9O}3EQhn*$#!^@&r|Ev$Z|P04cWz|sn>Vn5Pe2! z}~qMlN(7iC+|G7{S4ASqvCG$i#dxNPUa#C3%Y)tL#P*K%d{xE&kB zoZE5G*x=apNJ%Tp~)? z66l_)fj5~f8~7Ay(D7nMz{?Z*Mg$YLjh}R99$>)JPJ2C}xMNWmQMU9wql>OLPC1iZ z1DDy5ncv3Pp75k7Dk{thO12krOK*-KroM&?kH|CweuWY%g2#=Q1Y7`Jpma72N~0JE zT;nFT+kLB%uqay6Y_QS=ig13I5pC5Yn=B8*lz%sO+V{1i{9KOOvn<|1!NMX8kR~sE z)abG4OE-YWU8RHiv2z%Wvl>`p;J%_DPsS;8cfM@<@-76ZC0zzpzZ6WkK~pSC;wS1C zn9rbxV+cnk@c@eM{bKte(`{dty+MJ zkj%u^jg@ySD}3U66D8l^vF6lLiG}!^yJrQ=o92tY6sa|scX09bgn;n z5tD7s+mG$symRqxi%xbSaQ2rK zT=nhmPS;!jXI{T8{R5TDV^(63)dho+wK4RG!qvZ>t{;i#lQk2Ed?{ZKXq;m{ZabHl5s; zfUu^sk{c3J9sL(M0u`D>47l>u>T@9e2rKQj`OO3@SfIi_Z*#`Qn;vB{ExoZkG}@>R zvjhObh!6pNJ=Fm(v38!}+t3H&<|HuBL?tnp1HNLWAen$7V<=vvQk=-2IbnMqQ#VDR zuoXsG;AYN+uOuJ$&T|p~%Of#0P6R1wv{O}n(i!t?@%ipV4wh_mhdu4L4_BY$Hx~nD zW&0$)NYj|WWAt`~#VW_Mysk@MASpC|bZBw7W1Qi;nD7Q}p^QwT7sK>_o<)F0uK z<5cE*S}SsfA^}kHySf+W!dPzls{|2VQ(#kAF__{5`zAP3SW^AEu3$%j4i0pk&DfxT zw1Ff-ogT3w=#4|3h?VjW=|UZ;nnV7t%+*Zll-~O0BF%!Ky4+8X2n>CVatHEKr6r{+pF6W8q6b9n|A_v5g0rRyd>Ztg2JZ_U^Qe5aV zCV$RL)dPyezRm*3&+^Y#AF0GYd~3L(J>sPy8>DJX0gw^msR|8heO^{QtKaFgt?RDB z3!d7E(&I(>6*0kS0p|M0OXV%BPLtF7LbmFW9N*Bu6%kLw8G`^$NU1IlLfz#k zQEe*O%Y|P8zrZMd(ldivsDK*)>66ZFLy++L!_$f^D4m^T>6zSn0^)vqmv`RGVireJ z7I-tpq^*eXT89CciBS3Ck;@ua5;lR`y!Unb?h>LP2=GfW5eZ%3eMTcclDg*Su_p%b z$i>9zc)&b{XO8z{irV0zn0%%X`IVjP&R?tXQB<<6zduaf%4q=?v@I1T+US0R!SMJ%B{0r|RP zu{1Pk!R(w!GoCu$EA02f4{Q~452Tcw5fQL8$2)KHX5fw3r0hmV99)ZYE7#_wpnfO| zZ2DpTnTfvj(GD~1RDO5GLj_q&m#-&1JZ_$N^V&Ly@f6%17%V|bkZhGqi~Yj5pl=A*?&KKfBO7# zcs)!guWB?n?CRlo8|B}=&{Hcf; z5t$*7mv-|!pz`G)=hi*@C@J8j8O_Jhw~%BkbTEkpC8YYuQmxgz)OGkQm;3gIBz~No zNovmPE7{ML0uSV-j~m?pz3=oRQ$g3vTDT#W`$g;x8G6HZhc6eZpkK6K|2Ak<(sPMI zsm(L6bzNAuSxqLdzsM-mhHGPZeMw3k%?cZ*!H;brdw)T68bWdK#)Xp_#`ZN`{O3NN zh0IpO7f_1htT$y-)Makb@H=BXT12Aa?rhK-zX#r%V9FKExvYtpAM9BZ6THUA$?$mr zX|8BX9{=>kwBD?74%F|M+=cXVf=~R4Eh{hKTfx=L@l zb~c+7_jIh)=W$x0zZbp1ud)L-={Oorz34jTGWnWClmR1U)O-QsR`4(mYl)@8Cb9;q~f46gFyrpu*Q#DS9ES zMSxFN(*8d7*sxQ$09z#j9FX4(G%Q- zr#^h}FX`v7=nmeh&S1I}0^sk8|?rg^@V^?$=JFAFKdNiNRe zk}6`D5nANh(0RAUfBxy>S|wxPyl2;jxi2ef>$w^(ZA=fo&3q%bdlQ z+qPqs&PRYt7s9OVsc=8s+rn+WqAVJ&0ug~Tgw|OIWs8*8u)rUhqLRrQ)~CAPxMyj* zTxGf}GSA#kJ9Kg=jN-A~t3}+fMSX3v?UA=??|*5Y2|5PAI^9%ywya1=e?ouaLPhQH zMza(R!xEC1aYo7aUw$(=}%_a%5GH&_k#9*qX%*rMv9nf5w0dM)Y7BgDVZ!Vx)aBLHE9Y7craJtu>ALw{&L%F>L$rnR}j3Yp3MRf6kIu| z_%iR7jiK0GY$#N1Q3xD@lZ*c9B4Qpss4>Q-XUC{ed??oyU7(;ad+~YsP^yq@B3Z?P zXeB+JBf4z(pP}F+3{&F$XaAtBEhxsk)41=K>?m}uYDg~spkVNDaYkO++`ii2%crIdum=~HBTYl$$ zi@CY_CVco1vduQmPCj&$scHI9Q2~OiN0r)hpNoXjPAkk!XZYNGjg+Tn=Qf7t!1sH+ zC;H7p5p>gT(LTnAPM#P`dUO`MS_f15s?=27$GQidw);%uoe~uLA=F1zwodA>L6B)2 zsCDB8F?|gD`tcN>Y%t+P@Vxu>-YzTgQ@s1BwYh<}+aTfN3QBjwY&n-M*IUBXL@b3_ zZzQrW52#^GEBwzVE9f8!O`^FxuRS8*q z79;yQAJg}5($IxgB_g+y@MyZjC6%@pwSOKycV4@B$*TJjd z>#u(|Wvr+swER_YbLekV^zmH*zT5!I-{CT#xJVo5U5q_OTb{)_5 zqAY`t?%`wZf7%JA3u634{O;r+h$NU0PvGhqFNsFQvF-Jm+L7#!}3KwWJiD2z~GzokQ~ECTcS7(PU1gxY`A~H z@dP|}FvD76v%vioX=#pc(`9&|&1fqIG`Mm^PoO&>Z=f;mqE=+h6iL|P%r|*7_;bVT zB2S+Ssl*X*y&hWUfUf(&M?RC&&=X2Wq>4VCR!l)&`V;MV{%oUgYJ#UG>dH^$zoYI> z3@phoN{~zh^o|(?J*e9aojr^T=skCnBZ+4$=-ZaW`iU-^YHMZsnHDV~v;}tGHXvHh z#1Sg?k|=h|4bXeJeykqwx9eh$ZS+3qCU4h*wpXoJuNMvtV0FA~ge+zah|4eea|T)k zqWsN1G#V-mABxCm@1@{Chs855`7SpLZD)x8Kg@^wR&k-0pLb>LvL(_8~Bo!-usL-9| zWz2zA$%&aV5wL8a`QAi&^7MeZ*^tRcRn_=0rUlZHPoO1Pea{BbTX2&|_Owe(27inv zu0urIu_;qV&)?Zm~-i&lG2f}WG4PnP%Nx0pkV`Ys=oqnLU0m8GqGx5XiiPw zXjd(zZ_6))cb`?XOz(yd)4QEsM(jPH7V5fvD&wg`+ z{wK(IC}xsfOE>&$)wz>*gp#@7-j%i-N%&HRe7ED8b~?zkKq-?a+ai%gJ=9VK9aoH# zeLQA(^YeXeU0&Skgbv16%d*P=ba^n3f=9+TDap2c^sni?CWE}{4>_tvu-V(jH+`+A7%D>q`nDC*ZW8zh>%A^^d@G_sl-6LQs^a= zjDiOp`hq2HbjM9;5N!PR)Cywd(RDj=l~yII8?b^hi(xQ> zg9=#8(i&7iLnD!Pe@z3O#v%-v%9TvHrax)(0+w)5MBIr-mD?MhI&gS;^r)|dlGbn&Llp|gOEPk(ThYygoL2Di zh#M$X(*_dFFC_q==Fp0LN@x6;v126?{ajEbdwzRh1}W*uWiZ;K4x%b5lg z_q{m5#W-+w-~dPX^?frUZ0JL06F);R65E+35bzC3j2qyszf8uIn2zuyL-afYE%|K# zdyx$=E_X}>R1>b#@UFn8#dO2inMAy_Jf@+;(#rzT>X-C-vWZc3WW5E<{0(a`+lEf( zwN8m9;FU3h!qLx0?XUzFpIZ1C5<3eHFZJG6gCK^044%8z^f%+s zY$T@yvrrm!?1MnCrla7hAgz>VHdj8w=^T~|$lM4p4af#X*gLQ%R=W21N}F~;SrGDk zsU)oaa%$BvQ1A&iHA_T4epL32#p{Csa?h>h?tRV@Uy%<@`|umpk z?>vA;&nG9*Xu67TVTsWpebZo8x`5FVJz3U3wjKdK@^ww0`so}89C@i$>VnuGr7CVD z@?R%M(E20_X);G7?d&peNclrrS`(tqbw)==<2?aZPJc`_{P;gkgfq(eyPP)kben82 zqiAndhTxXhL>TDlEfVVci1k@!(tz;jqgR&WbzM;*VGf+~EGL_Ru^1dtGFcz?F@Z6R z%G~WXe-zU1M{oPvA0;V4GW(B`)F-m*|COYei2hGW>H{DZbth2#X$shnt$clHY+IN! zTSpdTxt}U&w8jp8iRCHPD+f4T=v8tdo!8a|>~$;A(_vuVC3XiY9Lu}dSZ@8iANMlh zB4Se&zJ}M~TqddT^xvs8h8uv4adrn8`A(nFU}?7Y;_OL@NrE>CY7rF|ub3}7|E&v}Tz$NvPKQrAR1P!TaHox86;oTGo76$F8UfYU(- z{P_34WA;aIW+2{bS-(dz%1ySqu{z6}H@2ra>seWFInck&wEKzs38;@F;*-E^@JsJ_ z+LOD%K|`G1lVC>u+othVq|}j2+@`*)h5^?)!+W>q4i%c|v7>Yy=Lkk;{upOXiv-2Jby zMH3efF;<{lYR*Dlsfrflbp_A~ruq>kZGZiB(JA%iXpyvGvCN#mug8NM3@fiAlEJ`n zjxOLP{w6W4Ni@@7b^3{!2^I075!&H)d)6EAxss6mY&>JcGT0=- z!-oc#UFAE6x?vD4Lf6~W4>(!9CH`84_CyveaFcOb{f|?Th1{;Xx&VnCY(-f3q(|HJSgN3#~cA#2i_6t1Mbp zR-P(=FB}9=?z_-IJn&|;=TiaufL1vzMd6p7K#sldY5ua~LKTjh=GU4TUUDJRtL1y~ zix-OkP8J7=J;K0+T_kj+X61ART6w#BY{l*`xDA<6y5oO-c^i1DV+&+;BmBnON{$L9 z0pUpSX$ccHTjY|N+VVzU0Jd5p-U?E$aVbs-oEeCteR^;j@N<)oF-5_hfQhUL zE-WV2RMGb%8rp0d>2!J%CHk1B-( z8NKVW&#$sECFX6 z0M3K_O;ux$^k~zNm0q725vO2B)V`g1Jm=p{@=D?Iq;9V0-}0*cOjo(b@+==DY)h|Z z85#E5Cl$z|hIr?05-Y}#{$-*ala^*6uC02UM8D~AZWl^WS#D(7|M)fggLlJ(c8Fy? zV*W-{kV!Fx%~*VPgVwITzX5of%9@UDkMFoVOywQV!!~_ zeOs^;ajt8e3m?9UBunPr*Bg7?UzK)53<$EKAxW&IOy7=Uj?6FxCHUq4rD;swQQ!ospn znQ~K~ke*CS^XwUgJ(;(}rlY<;A*L^7xV;{Vg#fNs*BcY%&VfQ&tk6Qutv?VmUfeOg z2(kQ`O!V;T6|@Lm7lywd`Ou(`o?;|XZo>!tbA;t%u}$6QU#Bah z)>~w;`C$hZYcsF`5O~AZ$~9eqt4aI6{RET{KB<50hGs+0cU~aVLx{i4BZ&rksQ=2f zO4K)@36ZNh3`3no(WhG((!*5=xM*UGMEmU|9C+i8Xx?b?mfbq0$I*#gZ*Wv$JB&g^ zuBI8>#{V}+tn~YCGAo>lERD%`@ri!&Giv@3xWZl98F6t2K{TaMYN(= zCP|0W18BccbfClI?!Q5MS4TGubv(k&e zO^x$ZfR|A+lk_!J?rd64MKl2?JI)Qk=%ftEJZY_4MHbjH|H3`yFshSXEHHWs;6Q7L z^z)-iFfGi$x;9U^ccVB?+_mseP6s-^0GEwZGxW1k?t*HBO#$!C9!MD}`SQ@g9w5tV zwHr2X4Q1`0Ol%4k*>@xMkb!8IkE9B4`&w5FWkVe?>T(yP<4^t6z&A>H#6ZOo1`~?F zz)}nH7$)JGzu3h*d}mfSFb=btHHMzikl@NV)t6HND8x+|*P|Gkbl{vqlC3yCDHO=% zVUtjg>asc>h^^*YzCuN?cFOi6O5T}jZp;`+FE`DB3NO7y+M$R@s+BEpG;lE{^5w0v z;8JW0`w#-;`hOBzW31IN_K$gh5fZM^`AUL?44VkZ@%ZG+HkoEli9Q=BP;;CClwwpO z2P@CruAWZpC#7alEAdbcPs7^gy3Tex52+)q=#tKQUw&oPJr?g1mW3K#w|-v8+Bp(` z!w?%;8dC`e7H|typ1P4?hy6R2sll^=0aT7Cb)wJwvoo6$18TWPvU(pfMXfLpV*|1x z2PVBXe$)q4bl&}CO89YLjqPBFfh|-?i~U0>1rt=B-K>nIqLeO4_q|=dugoQhkFc6{ zs|B&q6FxA!Jn857h*+bN{vL^l+(NcX)z<{}-Inhm{qpOQvaw2GkEi{!_QK5OJo2-f-e;3qQ9raN%ImKbx!EXsex6f=4MoG9|X?ChQ!QMXBE`udTK>aQ&v zY+^jz-5j{0MNYP=pZA;8Qd5#k;=nGOU%G#z#$9Om6G!2qb7aE0ux~Ma$NjXA4)Bk! zLt3OmG4k5Ay?F9o9+H6|Ng=T)jqf&%M zk>$}LuEAT%S9rx;h(9c0@sY~|r0K*eJnu=(U5L?<)8p6)CslG#=FKjYCK&h_aW}M+ z2(p9@AusqB)pZc3J`ri^h!@ch0)Ji2@z|>VFTBdt zuyuJ)@RL2PRYe5yko#AVHW&IIl@F&?y3P@jy%~%c!jrm z&c85)t6AaYY$i(miG($7lu?7EL*~S{3C#vZ-1$oac1U0L_Y-yg())a%#tPe`(Z*t2 z;zPQi#M%>&tBCpSAA4Zmc>CA&w-bt3pB>krl0JaXO+~1APM) z!$tdWhZ?#33wK8rwTFGAaYY_M9wQn7X&j2?&YjvJ@>AjxEdd8D}Pmk^edzDgFZly(-$X>$1JO;~Z&GSLeq#qhXsA(g$ z=th`GNb_^-;$6}A9}mz%!ZVB<)Pc6j0W?t|PjB!2LtTEOh`cCR zyoh@Qo^gP?uo-DhnBuL^J$_yi%WR%bA-rQTUhM(g5g1{b|D4utk2}K*6slxB4pOs$%>3)5>(Sx>QPcLn@Udv}q@Z0v>{+ zsR@XFrnkqFN3|gTQc21djTs#Xza`J~>jvakWzZG!m)|iVImtm!Lsy`hF9fz_#-@U< zkmI1n!FU|GK?0O)w0_f0m$mWRWAa;Y`)n58Qy#2US0YTj2(E06|B!UB$dfXB0YEQY zO}ywbrRWFot+0&-_shS%CtHs~nHJi_9-U(m8!|Nw$1^Y1LtD1Zx{Ru4Nu0IblE|=x zCk@8J@(gp9?XnnzZ)n*%4wjb1Ty?XqZd zGRQbLXq`v0mH&n)H1{bw=rJMi{Q9j61w{NW^}WBxzP;bX#%4f|l3-@olwx9CnO{Bh9lD7{Ge)Z-E#9L@eMxLNOv#Za5K9kl# z)og(9A59AMz+Y~iI{KfXd#<?B7iVi&vHpdbDp6y)iJNR#>|1 zn%iL2uxx7OSP`jh`+%EqRvd-TLVSU|Fc%g)n+={nUS7L$;~j!a@$*jL?>CqZur)>t z{w1e>PZ>SW2~e*vy@|=&W|C^vnv^n5L0z7N=j(NEvM|98Wy`}(j3jzVUG%q9>7`;9 z*Gtp9CV22OwHH8Ky5&wtQx6Y7bvzl7I_;4vBG|qIT!{1;qRm6x>SW2_%3M9&p}9C2 zu5&Wp?fjtkpkhFpbyQ;mx6pc3N+YZwjgRBA05IVfokUhzZP=8dZ;=UJHPn;dckKGu z87IL%61Fh0e%h65&hzA9!>DOIPs_s7$*=a>siDEpG*vFB6}}9Dg|jLQsEE_09_ss0K{UyL*dC@1e19{ z?C>sJ7~RSdjvnwm2ige$z=^gL%bv&w&lh0M$Sx;86;>Tp!s9G53dIhoD5uEQrT>au zE7%$Dauiv1CfB<97q?I$=! zERdfrX#AmxUdl@GwwIDDCz!5CHW=hyK~Ymy7LhDr*BgMsRn7wbT7XPp~{O{ zLPQjd7q+rACVmL;d#YOu`&a0`2B<3F%u^IEOxbD#a;>_d-e41Y(ZFoLgO7`e^YN-O zuwUh#lalZ7x9*w4ZD~$pKWWh9{R-Kv4uw4dmp58BukcQ@^gbxo=n5KpcD9DHLZ&D_ zis{=sq%qydcWf||R))eTT&LAxfr+jnvZPPXn|s+y#yh@Z@8biGSV`VhR=0Y;r#Jc& zVSD7j3{h?XmW(N|3A{w_Tazxf(jj1&K!8#6^m6a!9+i$`n`zk1k2D)X{ z54YTl!iBVaaTvDlAbZ&_?Y8%G>R3`meGPZC@83A_V*QwR=Rr^0Yb_#|?Pr4&_rfd- z_na@TUms$gZs|l`EOQTI{g3ZvMjz)-@UGoIre?s~b*uFn;@YpX%>MOj%(Xk#yP^Oy zCOm;{I-_UxkGBCfv+nMBXOwqKeZgt+ReG|s@NhY}P4ihRGfx+(!%3;z#@uyDD@vnq zh%cGXDZ56qq;7CW(3J)OKZg|Q#uLi#w@>rJIdYK?NR7Vl&ywgFNOXzQuqrh9QuYHP zjkmUmZRKF8TU~i;EL0{O1-_Exs2kOw*Gx?ypIH3gP#L*i8SE|Ez$40uh?61~UgN4d z_x7nBYt_VrPN6cOuOzK8sE0er$7j=wC{7U|?mOkFKQ9$(4c#SC|{A$9G8 zxxMd?XU_6WRRcb7C;nW{lT}-)WJ1j5(6aKsp9Kf&QSZu=V9>L}Or3nwtIi%effS5> z?%;~*`PM3%F}URt>~ldd;U}T;h}@@phQx(1QYFcPv68Ysjp*9r3eT0f>4bmo8oM0= zF_te4nWk7E20tE=P34+f)tJzw4UsUIm7-}o$G_m{wAUd3SmT-z0b$LTX#$@+C1uRa z)x{5EG599(sCo*!(K;~GFp;bBLpDU*zrTVxUTu{rKTDcf0|1~;7x4JI@f<_i8^$7q zrr5V9jdkb0nZ>xSwYHJ)L(Jipui6)R{}r*E|2&{eQtDKn?<)=^qyPKzY=WIMK5#Mu zvnEqEI|-CYh}Lr!MdwEp6hw0#=d{s~m4*>>2xxJYyY(gkFs{v{Xq3VrRFs`lk{uH z=yM2ZbE51#koOse>(N9tslcPyL2x#XqIsS#Uy_d@6QUK|{6issFjZI9XF#~M8)7sO zt8UlzIUfs$j49Z>pq%E^`q+s{-!UKccs0}XTN$YY-xoS@WB_Xh$QwjZVawlUaeXI` zbM>uY%yqZ^5XQ$4Tl2|;W8+9av1Ahbcp9&SYyNwLi}|z?yIn0A=dh`GsV%uh%gxT( zy?}7+OUbg4acQnDp!c|c3Atmn8ifRz78$I)2al^XBFJ4yc40T{_IGGjyu*g%2w|CB zcKMI?O#l#J$=f%{2$=_YQ+-GJ?vyF=4>t1F#NpD5hyvN_cYHvH2=R+BZh;f?e$#|0 zC*ZU2)4C?qs98mVMIk1*+4$`W?`n3@dS+Z5IxfH+cI4!CdbI0-oV{+R{irzB&viXJ zTG12CdzKk!f!&I!d${8^*%Z2f+C2z)oE0C|tjsx`N3j)jOW8awNHW9-Uz<0XVg^qR zcp?J+;gNog$1zNXvf5e*Th^9&FHKNUMsE?uH-pRtFx)Gm8q= z%3}B9SsA7)sw$EzF$=@_Bu#0gp0K;WKbFF>)B~Ut2l(eI3Q=uCa=%pTQV|>-eb503 zd3e7#{jo@x3UMLk3-Kx^ZA?)j&LiQse>qCF>9DPxc@O^+-X(f-t14pENVegC?s!l3 z%aqh${Z8aDyY}x&X^_{58*Dh)hI_5(pX*pM)PN7J?6t|E*R98z+uE=kqx|7*?y9Ur=PY6 zy6LoN3rfoyXIidH_d)dW5Sew|(SrlL5vH}4bOns>xU6v=snw~R2fxRNoVy(jo@+by z2`{ZLv=X%^1<=eI^oF-eO6u2IeuacHjy(8bzH&?$kgl!O9VsOCxNeOgu6RB0>BK}) zbN$v-r~f^cRIivSkBFVX0nXN2DD)Gi~35m zP$0}Z*Da7ySoa$$r9b2<^6I_emH{y|d)4qW<4T=v`d-Gux@t2-NU11Ut2d!IPw#Y; zS#3zAS?m|ms@xNP@E;|*-F-cGH83K}re*0V9AGd&A4K(@uRbhm@LjMR-1z2b3 zej2JpjoSiO46G7;2bQq}dR(1^ZEr(i7dC{yuqNt#u!YWUUTo<UrX3dqb0d92aFDnzV2{`7eD z6mGr}y0UD+aeF9yHFJ!fkr zplnHQK9no%?D0AjXMd=6hNF`o%IHxdT7icd7H1VSB~KIiK)PL_DsL${zP%|kKJq4K zaEMt#$~wXZeEzd0Q=%PyllE#49eHHex>bU#kPe@RTOjhvrdN4TfcF$s4YG4Or*qeY zL92R6f0C-SIWB@XA%NNIl#Yu05Ob4^X$rN(q=a<9AVo8jTO3Fq9D7MlQ>=uqfzjQLx11YL9mH075` z&3(P;u;37%IkqFoReoPn3=i?LgW_E2q(zw}YC6H5B$Dsg3o!PR$AMxc$bhM^6RGq; z(mQ3Sg0S7RC%1Ab?A1|qx}*N!3eKBRrzd@)40Tk-dnl|-e)O8v16$R}dFA<_AjIgD&+WBR6|u_VIZXr@Vi;wjMvTM}t$fUe=1+JSGH z4S8B>geDHnwW_%Ss4OO&D+`CdQ0{vDd>n*^6wjg@%s6+rL+(AO_C&l`3B(q^A7J={ z4)dbb7{na2VR{&OF!mRb_{QwKTu5T5n11olZ8EnQpzuM$!WkBx#@Xfg8412r@W20Q zx`%wdv>_9wW)l1!cxIL$EpcHlB!QqiPEpZnip>$KQ9AN-f8F*$hs9Q+udiI_$db8N zCZXwzS{&U$d};Le*wp2jdg|QyjBkwaD_`hv2Lp1q&C8Y&-vay#KePV5+a$ved?F7g zUZOF1I2t0jd;D+g;MQOekrU4Ta5xWqdwrMfQR9|@dkr`)`-D+pB&*8_D`zetI}*_S zK+}VI(FeG{=tox+uH2JJOI&m6m`pntx&7-#t;wZGpSUuFnwlQ>2N?8-O)~_o9KKg2iju8eWw{NiH`$JCK@P#rNiApS@I7C@_H6e_mj>6&hKCskBTLE@Gt2hOZ_#T zA}h0jmm`1p2#ZdwxBNsjf$P5s%&+#87RC8hwn;5W=!pfK<+J*d4;s3-5@Q1jh$nv= zN8XO=2m9&E3BG=+N`y^Ojb#T{NjqGBB=`YLXpaLyrwRFY@6*ref&tLjnQ95FiZyMQ zR{it0{p&A>Y(Xg=CtpV4>oA)k*=~rAOy-*2w9-TH;RFtTvD7?0mukv033U}Ntj%2%wn3wK%mm0@7&!qyQY0@f<&I6 zRfP_pSrisAne|P9=V@m002r!o9Y_uPSp^6X+b}co+V0r0#24ooP^QBMDwv>%XYEIE zfbYO6OjDmA8L5xMeYt_g9r?njh0*!Y@|EFZrpBJ90blI$)U)OE%AmP!*~=@89L~$< zI4t*3_+?xNQF^G>E3$+Fv`e5Y6zdGiS*zj*J|u$QogGtA=TCl*(I>DD7QCnh>V-!u z%9*H(&~la&@5ukW{$*{PQa+yAqobU_DVqpI3!i3D-QYdR_!P{!eIUc1nrq(Ug@cH= z&Fr9H`@NHqqfu81*82(20ysCcLF1>R<6T7e?FA<^KV&Ku^B_z6QGZ zbpW7-n)RBoGKh?JtrXOZZnl%x`stT;yyniLkyRqs1JzFek}Z9((^L-f zq$~Ksvi;i)H^{*~d&$5q6?<=hAp5A*M_dWpcA^dKV6o%|;ClAyt@6l251576DRg`8 zuzi{Vtk+aOiy*boG7%5XQB-scncsTNu)kav%8t4)mbJ4`=xpwWjU&m1zFCg`&;?+e z1C!hX`>Bg9?|@+GBGILn@dAWuz@Zbr?*UkAEl0uvyQ|l54}GSO@OTUhMoq>k%E>Yr z$D{e}F>$d{it9mMex6L5K24&dqR>lbt$!cLMk(um7PiDn=1f}g9$eW_U}Vl&BD=+{bPt#4r8hWyIJPnKW*qtX{iTTF@iC`rf;U&Mk8LcfP|U z7%qoc#hy<&CzB^nl69+AG0=HZ`tD_{L&g#c8)<-HNog5+!3tThXo;yn@x;~_B%`31 zkSK#Otcj~vgfx}s$mn&;jdh3CMz&+(AAr3GpEH*MGDjS#7GfdfC*eUdVfi8x0;@%% z=&FE;&|lQ#@nkqtqqVr4gJr^FAAJJ?2oIJTuQO%rG(4;J8%EPaI8F;$sQ=!*cit&m zF2BqqbyVRkch^tvB|!mWUf7+hZoE;xe&1bk0;VLtw_VPmIqCun_2KWEezg||Z zULp$@&Xw5<=F&#|j|RRE%_v?danJ_wvtP^c)e zo&NOTQ;$jn8O2sU+eiqr6dm_iF#+F9vYk_r&0rfni4 zLuF>%BpKr!BE3|1$^CG@9C-VE$xciZdMg>kjuIIYEt3GX)8@{RX|ra^Bo;YS7tBNQ zuu!JK7==!XlYj`!$vK6^^_6lu?HqPMnVerc47O)d?>NG+m8a9wWE9MEXxwPn!(#FD z3!;4qZ^J@*;rG`AXi>Z$791d>!oy|%JMV}iA?_~NCIy5JoG7)|QHBnxkZX$&GYbs` zRH{8xD;W!*u8(t~;G>V%v>YK{1b8W6UQ@6?mFpH78Zh5wL79uXz9HXfU0hGCV>0PR;{M}3nhy&#MRwvFiW1E(g}0w z3Y)DRtcQI~Nlulgp7=kKmscvMNyhMGoKgO>7htG$uGR2b!{N%7tJ^_6ej4=@O0emft4I@LT>{D547CNA9u?N789v5d8 zf;}+k4lungfK5jhE`3NKLPA2Nsjgm12={Ass2PAkwUH{Nf3*{-2tnH#KW>5?CIX>j zu1ak*+xXhC;B$* z9x!r!@|mq@W6EHytn%xh{|d8NFARsDWb&+&sbj{-@)avgVf#lPd065Yydu# z5XRB)&x(~Rg&Ykga+nqLF;}9gX+r~5LAdfCZ@vSoLQ=wr0P$net*=ENG&TaGYcNSs zA&CxT3BoXpnlKjex+9r*F4CG+XeOx0nUkqY93tnB9>+J2tXU=+zvxg2iH*V+FdsJ1 zfs$)&=!3!tIW-~jXNAp#;mPXW*V~KGFf0gRQ>1l-soTkvTrcBE7 zGZ4mQDj~*|tCz{R2~!Af7Dy!%j>-N7q^T|uXm5rt2PS`JeU1wt25{5Rpw^((Pbh{1 zY4BLPz+fm?^-4JA5R&&`f7wUEZT%dFRwq#n88J@|gK#C_MnjA$`q%!Wz|ep~wyl#> zAIUE|DC&MFQ>wLwTLIf$3NUoCiWBt{evt{n=DR}=m!nB-|RV!x$2H%zqS6wYR$19=faMKM^iKzeJ^RJrZqpNSdn(dF0eR~c{ z>Ib_edf{wYzG$AfTb(8ST$-FZbeM`6qa|)MzzrX|48qol*sU~kUZ(@#XU?8TmbOJQ z-rOTu+uo6az5AsRtD^(}{?c`q$@~>dWa8w>5`iJOGP<=a3^Ma_$TlveQc$j(hndU+ zfY`Zko=G|wJ9COeQ*Sr~7TK4+nszo-@?a93{QYGnzvqtcVhVt_8(>yhjO2dF1Jg79>&k$!X_T?mPelDWt|rg8nQMhdcM z{d!rlaf2+se4`}5R3-pkqsNXRN6U`nb2O%$KLrj}vX1qgKWDj|8wL4rsasv#lEk!!qzg__F^jdDUl5r1H?82DiO8?c&`VGsL(&ibG zlabCsf+{MS*Gx#ipJPyK8XcR;SzPAf`}x;D{{i+bTZ$Mb=!&M4UOyn(gnt2YTAoh( zpjIjA02Hc@Qhhpgk=RAZxnE@wu3UF`8@AV@L2Uxak__aI45ov{;^??B5;Qtos>yO^ z-;$-ADb6Frnghxs;P6Wy#s#Q&7WE5HIrD(9vN=!@?WiF>0MzM$Um2y5!mMmRD zH6wrVCc1Ly5Dcd#(CI==FKqrF{Kq`dC+2+V{l~B9v(LU=0*1D>(UDAVwtIbi2^eZC zeD-aaUS&Za^mD`gnHg-jFMOfb zbe}I`zrWD7|Mi!Y#TrlwiQ}}j#eh!sIzuxE>jeJOpWG=Ewd@lscQsRWzyZHJB= zlTbiobR6ZQ7)<~4(8E$mf`+3Xx;tm`c0H*w0Mj#h{W@3zOqKBibRY!gOo(hWq1C+d zLMnDtivwh#_+u=+bTOvBnV8vDU}Mt_;INnJOvX7m*;FfNAe2irlMsJ2IYE@+s>KYN z5Hi3=$55>;>!A}Ap>kJN^?rbnciwy*dkkhfKCmB#=y$*UJ@^Vn1Hk#i-~U!ZVItom ziJ;xh0rTV{QPw~!q_k7=uO+=eoG`OiKR+v=08)$gp`4j3IxCV1$YTWMp(6xrKl$ud zxgX}yC(w^lc#eYF5XVLIRqRtWpR1q-Zv)7*M<+%mOef;DkTIsmSYZUm#YfAA%hsDr z?Y!I^GZAX|Pwi`5VPpEt>iJCr1teA#(!M-EJ@kZJd&hTV@4f@Fa{fYj z?V(3x))gD1wW3aDQ1xcV(@#?sXN0W3db5=07s{a*UXf8~zOK3Bo5&4%WY@MgrF!>= zGXK`ENmy*8xONT5hi?G#(D=nHnk_R4V|$W}bM&?MrQqH7Bz)<7nSbSK33GIp?AJe( zWB>klY0k}(-bs-%>6=%|!keiBJ}#EypceA}B*{6EBnM#-&%L)piccj=>V@|Z#0$UhPaq9a_(#z z)jawnn#Z|p$CG3%EsIwR+v(%)BZ07F^)Sswi~zxG|Sys)zDuiO`9s;yW>Jd1C(uR>TZpIXuIC~D)*dn>?%B$qo?|)w+0Jn_*D=lHC<3}$nx&t9x zU0`S!-k4ScJiB4WU47lCc;Y1$sp;ZPNlHYS(u+pbnQOd}q#41o#eq<*jym1!OMN%2 zKK;;{tm$vvaHS-1{MFSYiLtQKuX9NO3eiXMd1tQS?93eePyOWHyT2n(Jn@X_pIj<{ zH+A&X5I?d979d))*bVm1p0IBhV9$xgk7{t$`pLrc5gfNW<6(0}skj7qk!_9r65H3& zaW*=|da4-JRoBY^NjH65zv^-6$#tu?H$8;QTd-@23})fkOY#x@IT$usfm#*zIZc4+ zX;d|e1>mKpr5Y!OF%u?|d@@D$?AdK9x6GJ1ou;%WA!+|qgY&6U-@bDwxm zL6ZSapLq34Jkfo=i2eQ&zwlXK)!{+g`(t|p{UmGfk=E@REf@wJOxvg6zGBgy?_f%8b&K1D0ut=#T!6cBZSPQ7CxuQyXm_VFh zm^{K@05Oj4MW3e$8zTc_#CHbv4RwuDLe{C^qX)_$+cT2t6^xu~m6d}BK?6sK4bgo+Va5@FWJlPM z3F!CU13=H5GewZd6Jivp0ALjZq>5k>i!hU}fURo+gg27iSwTD1!Ps>>y21z!7|%K< z!n6bm(Hc3+(q&7j^w5AfJ%y-VznNIn_!p{$&vQOG&wXrjA;9APU*0EIZN37-+;Nh0 z`V>Hs>61{H_IC~UaT=(a;caw`R?X_>_Z?{?JHmKYCk8|&(g7GU^`BH`NNsX7p`@G1 zP}vJ_K*+i^E9B0f-7P=(@tyL^U)@dUeT$4IJiBD^EEzRDL1LH$*I&Jn$`cFZLqe^3 z1@xi!yzAe8BeRyzks?5hv$9@fJv#u}(`y=xA@pEXkXkgDakBkDqFG#w3>YP^KL4WJ zaP5`y>f^7-gcXZ9<$x1FWimD(SVGGzLUSFM9cKV8>yRSc{M~Pmpj0S(pM62R(ZODQ z`!_LJZ<5yl7G1Dz%f5EAOa>4+aqK&{y~=0vWX=`q3ID}YtGY<`Jo67}IG-t#V3rqM zz8tHhMmhZ4HpzPFbwagXviSC!W%W&05rPah{qpp#-IBCpr{wdUs{^oS_|7&Qcbxw223r%r?h(5=vcXW{TkVD-HqbL z`O!@0db}Am^WDRZ>|d@g3**E9UWfr?csH_O^91PikigW#b(=74x|F7;i38i${?o&8 z>GkgfD_YN@t%orqSjQoL^V*H;$re8)WtGMBXW)&+!7zfVJv7WAZMk#%4!QE`tL2JK zo8_H%-Zmxk92}_x4qNVR7C+R(CQ_jFo`V2W9b9YOTxV*c9f}=JCySg8Bq#Q0A_GST zkR;P719*TA5URBY9M)0GxEwFj5Y<96#+Zz4%;pEMr)g(9{a6`kCb=D!JZ?d>1q(%I z+A086RI`jriwjwNgqTDWH?qYuGtSeF&JrCJW$bD+D_PwfMzU{O{VAU)$7H~_3m~?x zu0hTbQjbT@FdKk=^3(|feyb~MOy#JNBvla$mp9(u&4P`3-+*Q<6*#CB)kwgFDa+hz zDESgFWVkUmnq-*Ur;&l}x$R!RatRm?({Mvx8m4831yn=6@~<9V0*3#pb-vp7R4b&z z#9$_=-m6rIiW-2x#=1(`a^)sjV89+3gaDl9zcql|08CT-)VVTa-9p%$R4gfK zj84sqstqA=QD_VCJ7jXA1cJmQB;ZHpO-Ko^Kqes#vFaeIVOM1px-fB83z++VexIye zwtzvKpM>$alcbwuCMEBnFv6cbvUU5L(m?q99Be{~0#A}~{Fy8&P9=*6wlqD2wd|-P zJiugZ$E=2;kU_hheMcw7=euC()}qUN{-tLLV^L3-iK~dow35L*86({)fN3jWt_`oq zE|^mb*`szaa1Jm)YOB%KPsTG99W=Dx50EA2!3lc13M)0J3afOYJ$b?Jmwajg9sU zn;f>I?c_jcUG-=RFqAP=p?@3MrJi`hty;5IzIE$2_1$nXN*@R zZJp1y&Y@9ELExWVTPFoDkuN;>h+#XrI4^2J^1Da>BDGA~?XZPy^sj8PfJei!9Lg&u zoE9m^V7n%htfbaNn!UbeeEm8Z3y5nkM(?-nZD~(DD~rE=lPp>?U$W6DCjad@DTihBCA_`zhhLYN1=FM` zJ6DpPeM8b-#gh|nMIS(q_q14vzG98UuZBIne2q+;ITfZ9uRWNcUVwL-_Rm(l{G2EQ z$wDS<(pVY4V3tHoNg%7;QOeUY<@|xehUJ~i`3nsWkuyj#+R#!?nK=tKshY)Gv5W>p zqyQ!&xL&GY2mJu-x`^QPN^Dpt7BF3spPGW40=*my2WObHP8f4P!k5{F#Zri#F&toe z80}gRVb9d;Y?wc9jKKS)0M^Xi-4kMd08c%nfyD+Fl@ztPGa=V1(hdJ+Io zeF=4O?8EPl8#m5mBy07j6)TrhX{L>&yyGPBdC00&tE3XfQCY`|@^V>EVxPj3Orj%Y zrR8W76C{8riyPWT)j^k+mNMP|{mep7uh@?#Xia!iV12PQm50v7wyoIi*@Ypup@3<~ z%m2?G4%v@OjNwJK{{Lu=;m{)-9(3BetL=X1H$L^4kJz>`q#J$eLxWFkpZmm{A1%K= z@#>d&qWgRi`~4+;;j_M~`Y;~aO2(9%qNhm1P zu(1>1qn|atfp~gYa>EI~7zgdWMBzvxZI6?qankT*YM7U0*AA-2GGe&2N8h42MgY zD6?T0@?fw|m6b>v;kFjCU@Z#DVBT$~K+MHO0O_n1b z#_C~XN|+#9XoCt6Nji+ofzTg|l8d%6|L`d(NK2M{Kx{!qHs89@@l$siZiAekXcm>ppG9WMSwJwY?PIiN@T=HKow__Q@R4M`5x_K<$71Go*lqS zRjC~$XLysLKLPNPa^L`rp0{x$2!zRUf=x_^iFEPOq!s`dB^1@1y;sA)^w$Y^F)l^- z7|eKZ{@gh{LmLQZyBTd{C!ni~W9Fho%I7XEgjStk&PD=^N(rZr9W#z&&cI+k0*}gK z%)H$VSZjx|_Cv0qS@rAJtwT>+MA^7vm_qz9Sukn&JAKcKy3pl>T{E)t3 zoo+JFU64JX-o>?`LwpE*H=;q*F-a|(LZf1EUl>K@8oWITe(X4;Fz!S|LS^6HeSlyy=$J8;rWw3&b*yK96&%`Y`uRoNE&)SZ zBiWFG?OtEM#2DIIXZU;i;HPiH0;*4c=rf)V?To{HWcY2{cEWZ)+&3@0#z$=17JtqS{fudDG1@(rbjANl%uFQY>K5sI6wD8^%Dj9X4wA z%$YC@ZsJd^)!n;xnX-3UUacFT^ZP&jg$ahS7_oLhXc#4?VBG*R6X(n$p`uvY0TUKY zKH$GFCjBPF`da50ic7o+&2-syOL1a~w6n_A)xHOspH`AgnwXRZ$Pl&ykRl1a)sh^e z41t>Us-L2UPhHU=syAS3Lmm4XEKfiFC;$qUfpPO}YL5Km-h0>%@QX>)gKhlcnTO>R z4B`1EG(Uv9y2`7h9)Qz)B3WG8`=y-_qx!pPeP0JAT-EOB?|2h_Z3WQY|Hr?`_erW~ zCEQ*No0W!EsRZUPTlGybQBvMRW+eMtif39m9*FhSov!5=8ekzhI7gjqvjdi*fwp%6 z>{i1*Dud__TcG9Hf?=Ne`Aj@EEW6+Pz?8@917x`aik)Bse^2SJehUmDzpvtZWm7cE z)0qi+2f8K|=WCzWa$CKGAfXUVXW}Q37Vx^h$K+{YAAOjJ+hHYt_rRa!XZQUW;XFwO zl#r_@dpL`Ba3vh)h>p*dM422CPTH6NpMC3nqfvY6>6fWYGD%K6@w`kK8!IXMkB9?d z`bVC6K#E~oThNlV(63VSi)1_@_d_SoO32t~GSkWaWPk`J!}#E#6Ebh%JY#6>U>QJb z7ccvLy#{jXymgoz$$g3-pyOzrI_7$H&NPue~WHfI@O^BpxPh4nB&JQzv1GQZ4)5dRq$9 zvm}!whGOh$+LO~T32$OimT9~LRKuwv8a%$6hcjpgb-!1a|1J34*(49P2o z74&gu!GixH9i+97J_<$X!TwKA7$+OAyd2EbDJd-cx>-nQl@%udr0RurQQ{5IYAz`? z3$;I(<(BdcxaW4}Jmu zXa~6_hzzKv*By_=5l)^cDSC;NkbFf}7Ex^RWualm!m|rz9@@}=GylK<&L0NnNM3rn zn~bTpr>D16!r;1a+#$guIUkyM)k%1H1R>xBl9`RHfcG^qWyXvdFuW%b>=Pec=B-LL=U+*6+OIcE%8NhExsNdpb!z z+`bdm%O1dZ3#PDPa^U1)DXA)DwK_(wTDy*_1opD^?Afe+IVyI!WO-Y-e(!w zG8e#0es&I^!ya?r8JI}-$$L9@OA4W}epo#>?-2~>&e95a8vzJwX8^6sDw2+xGA0Y+ zUxb*Q{6|U?gDK@tWJE-)Oj$4wHj~h5MkxSL4X52?%(MilDk~-tgzQ;DvT7Ks=Exn) z(pEr=lOuw3T{#1KFzP^nk4BD0J9X?B+PFc@VHHf--S^%r$tO=SdH7<{CUSyYCfUxBIoqGjS7&^UhoJKr{pk!lmwuEv>A znG0I38ovKJnYBFtP6!Qd0A|KOV`0OjK3FnQ0WV1g9k4Dimi++7UHd+ib!*Y{@tKw$ z!r`z@6_m*fjtr3=Kw%A9%ExxRCjn!|${!wmQm(z>T6y}hZL(zM5=q%}LgHsFlbmf^ zr5Esh&pr1_)abF|9N;3kOp0~@lUydrV3J_Ylgu+^W&$=zugXgLQZ-2=n&BJ=)3WoW zmt_tUWjUeRGFar;)e8u#IZ66c&x+gRi4rnpj2wRL9T_O9l!dq7A}#KAa^}$js6 zZvFXBq#!FxKK#Rj#)fC<&+d>g^jc|e?UsTa2gGLpTqaz7g{&a-=YUxCAfAee@9p5c zQo9=P)t!q0I*X;Cr3+;iV0Atj>9em~CsQ}AmT6no!u+l#S!cNT35Oa|2`BOXnWxg0Z&-YczDY^jxAx<965D5#pon^=({Kyq#w<)>QUWQ z$4cJ|!uzzH-}DO)#e+0S!ePX;N=^g7SQnHP+5edk5C4}tF zc+mp8X=!eS#d8-gbc${)Zd%&7wtA^BWoP{jy*@D(Ff#e=t;G8~v%CLo68n2TDqPB5pXsAhss^DB^ zq-Sy*i%clI5^2oo#4{xH%`q9vsVS*=u~wNXFVjc{?4bR1oIL>x@1$XKu46N(o9Shc zE!08j5-`*;Zt!NB#`ff+`=J0(U$i~9-Ro=r{{TbnC12_7^FZ7e`!PLL|LX5QzSW^y zGvB^&e*fw9Pi6=G{~b9e-9JLtZ9>}9ZFUs6RZVb zvv>Dy3}(I11;!D|m;mbO!#C?Fo@d>1`MR};_Ujmoj!GK?bSdH6c?jb*O#9ZGZ_506 z^T-}$kfPa6CMC(N`SYa;eVJO+?A>?JfFWl!uk{Hq^+DZuJZH{3FBg zbsLACuiWSb?O?S0vBJ>OSB==PFZw1pijbTtFktX&Ny696MKxm&*ZwVUMUzy7H-@UzuyKc$g& zg28AYOk4>Qb-t(?4Pt<_@VJ?FsUpN$2=kgxTNd(Hj=!2tG%lEWw{=;ho~%xb6Jd7z z^GYx|ZnOhT@m))xzoZiCuL0@ac-LJrfQHi%)RuG{6bv^u+hOmm& zI}(;ewN%ENhxXBYP8~1?xrGZ?3g6N2act~pIdo*dOrI1Z4XrS?)pe3mSSW1(P3N(r zrHFo%MX2!w49SBhPM24=@0IzhHpsR&_eyLKKo4N!$po44;V#O!b--9U$lO&6@w4la z8up>r&QaPqUJdotw{*aYS^-m_Z!)9(gGNXmZR19NR3A*xj!cY+Hpvuo0U|Z6by9rd zj9~DF9AUN;<>!etBVQZ#@`HPc(Z|#)@BDgk+pfmgH^k z0Uo_1g72-Ju=a< z?tJepdH0oP|FrgpH%!Em%9(Ur=sYNZ_vIMzDIiUq*&YS4N4?g;UTyyia(g?6LNo4e63*!$; zM#9j(a>ETblaRGiRuZ{T4^1uQsQ^=@ChELcf-S@xIRekBJrjH*+V<3vZU)E)1O~y1 zHWOy9HuayiB2GHs?_AF)XfP zxbD0F=*L*ZD$q^fTx^FDuX96lg_`RiZtLhKSxs|Wsc4syjG zeHMpWxx>DJ6NtbyF1D4x8K2}2nc7gQ{5&3V{={i!R#1uKd)$#iJAr{;1~JK3lGB@ z`Qts=B6WoQ8~HtlmbNMm{5!YEIlx~Y$4x{~syVCxLY-x>Ij(@8PC}L)xz!Rod9r*!cJADH z3#2e7j|sV2CI>}J(*C_Np6uWTp}z6++tJxsWISQu;zMVo^K`bve|>`l5?(t;l8C*B zt6Y2c9g>%lF3GO}sR=`$u zpu0`k`kD-suqXgT#eI7-+1Qv5Kll$an#&|`<6@b5(|W0eVLblF$BmJ?|C;#{7!x9) zv2ijmQZ1RB#J$ZTr}yoZOtP}Gx4kbV=n`wrBue9<6H>*#6(2s1wN0YrCZ08++g3t> zu`Jr+7tX_u$qfx+8r3zj1y8PyPXc zCgZohra>BEZXwad9u2Yw8oMI2corD$M*6VkN-Rt~ z*r!hFuUpw?4;IC`fa*in+T-p>wIM8SxaNBJ4zwQT?vCQY80JgpU$wZcWGp+uq^g!z z7tS5*XIBH#7OthJm{@6oscZ&3t8b=Dco2ywlWTtKOt0 zpM2$v;a72>|JmF4_*DL9|I+`w?L*37#Q-bFYT5-+x)nQy3FG5s-1u<@kn|uHfBp40 z84J-M!5*qzf+K^@&Rsj0Fx=#_4I7M>rMLuLAp>MP1L@`~HWIFMMgw+;tk(sw1X@~; zOh%ZCS+iytolQIJ)X`(d8LSy7J>1L+y$>|t&5Ab=olkiMrm)3DFnt5!gO6Mzrn3#_ zbFim@We5q9U_9Z9%kh0Htujd?8p`w|1Xc|w(aHv@l~aooS0~X99VK-D)oxe>0Jc&`gt9vb#asCu2PT?PXxbkB$6oPlD_2SVIOjuXNLz*fP0wv$Ao6PDV`XtjoZSPZQ|QO|qLw1IyRNffYGdW<7DzNXrG zjJXL-QD;?aB$rh;NgJRgtGrh7svBj>;`w;Qp{s%=QQhFre@%vU7NK|&YxK`Ez+G$2rkKvWJOEC!4+=`UY|W3&$0MMBwG;9w8H!P&InCGQgUJ@S8Jw z!sF-)D*>wxcGzo_)naJuB&{5yG9VVTa4qN&+W|4%dBwFug)S1*G=}l_?ofe@f;T|BO}8kiv*R1@^W#Y zk429iBO#7x@ZP~VxB$;T&p<$ok9YhU3dLxduw-~RmP)WyF7$=m0=)Gw40rN$k)R%3`eG~BMGslr!FWVEv(T_K1CsG z0p~4P+vL(#egJ0=#-)=aH66i%C2|3FhO__+Ti81^H-H+FKw${FWbLY@W?)j?VNHF5q-JIT(5$j@tR#!CqqmZp3IjKFAgW1-{YBr`pY zY6WD?0%(?K7%(>0WGZUq1qUXTa0bv;2IcPaj( z&D)`NjECo0}^x)l3XjTM@FQJ-a#9 zUXmdqA_$3jNDJW63NxVtv1V-k{jtADGm}OQZIXLp|7(Rq^%lWnv;Jh2M{c@#|=4l5ALoenP=o$}cxB7vo+} ztX)Xf;p`;k5EH?(Y?u(q&?lnPwGX|r5)^S9)W4?GToxJ;f!qi4rN)yn|c zual*L2s~lJtYf=ggwQ$wtRrD3UV0S`DVQOxfa(>RSOS=8ApHI+*^|Y9!hHN2n=$!z zq)JGz>KqZ%hXxQz%g&Q975SsBi}CRS9BpSofcG5>2GF})am5vq57=WymXeAx&WR_9 z8s)}{rxQS`Auyl`*`pTzI6x+OrG>0W4SWHJwe_&ZOw`pim6#txVR6p2TwWUtRxcUt z&LIIzo?e(qCmDt>d};#KdrGLjQOQADWzwQKNEyhhM%DVgRl-r;9yWIA>`{gIU{Ds{4 zqaVv1KmL(?|HpSy1?GD)b>kZPHSAU~W#Zm^LtY2$Xr}v3-?>%%IX7qDdyfhzNpcxp zi&ZcpIf+;R06+jqL_t(cT1$E6;zg2i@))|wVCg_7sNk=i{^SH#R!~?b&4g^vmDJ0c z>#wJuj1W?1jrL9_3I!)tu460Lh4C1qUA0nB6AOY$*r-0jq%$W@1}xIwSwOZBS?~tv z6$0#wkd_?JBf$o+l-1KJiBtkDa|DFIf61zD6?SzA^oHK7t zY~uVkrlm?4eX=+)Nvs-%)kO&Vor|tEpFUb{?p&$w zr$Mmk&0Om3CfVe@x8J5O2Fvn=3&n?|4@dg7>hO%mAIGUIoQ8^<(JiaVxiW&yj8ooR z&ptuHV$TAvodl6!Lc#<5rkjSH(GgnM_v~|Lq`tgJrXWEGpwIT?W|7rh2~!8?4fHc6 z-bF|(9B5a+XcFrHk_G8Gu($Ej1yjHKz&@;j3Sk*1v%vNwtGdE~_R+A6Wu;|+`AYmA zC&Nto%KPuXZvgAGY11SsDoWnteAm-g7jj%$YEPNO#Is4*MtL*F24n3M!?AJgaEwOp z!1Z(KcBuu1Yk~ijz;N)w7;Fv=ed|r<7G*_jH@#%^wf}85yz!X<(8w@oSjprK@^Y6& zWIJ{dj_~pElf*O0uy1x~j$j8@uL5AXn=E71wM}ymrL>P}WN5EvK6ar#Y1P-NSN`2|Mv=Gi^)MtfH zNK_dQR`f0aRZk|CJAd>eS-D`gbZIDwzVOD5?Pk9mdz5@)(qi!U!;HCSl(*y(_AJZI zk-nk|vBx^3D=Sa1nUDzbUFey$FbT>Knlfi- zq5@$EEF{->pv9}oEs`L>m$DI7CWty%iUH17CHl!S+QM6f{A{z63ErKgfmXoE`@8nY zy;u=t&}M26Wb{V>%sws<1zxr(#4Q}-UlLxtVP777`f(W*jN|~g?1x^jlfIGz_-Ng2o5$9`(qs}thPiN`M5H+a3eya5kKdMW#81xSFHv4-pvuTfgg3^tFxVuf*Y zr=5G5d^H`IO-N&DImW{Z=QI6hYV!p%hK2cIq~8)!kYaOa@ic&xb@Gn@~&@+J7MO+ zf&w}A=1$r1_&?;}_U&lRPDpMI>{^JoBwW2l){*oQ_028f6$8j1#JvA+Pf0q}QPywX zAOZ8HO1_4qlh4VtjjN<2@fcb?i-g5QNfL(0k${)tj1-BFivyhG!8XN8c4;NLy>998 zah1iFBl#c-piG)(qpSUqBmF_^C9Bur0N0r=#O$~qfNAXGu`<@Do$%_6Li(|{__&cdj|Mggpq2rnSInmKx!$h--q$G&xYWolTv?G0bTqLTQ@c!L z1%Ux#&qAaFkl#~QOs(-s>4!CLXlj?dhE}YddL<3!uY`o2eiBAv#z)D!yAR6uzV|J; z<(@mGt-FzW#SCj)hi!}pek6TtVBxr7^OeSzQ+1_|gvfgvV7*8}jQprL@Ukjyu znpvbMTkoK&AXri>V@*9;KT=<0G)%4?A^iq`?>Dc%QugC(dSur&smVGmcVm;&QkrM# zF#8e(PzJJ#?C@g1t~2rhQmCo4Q^W!gYn-rPDJ-v$M6|0Rj0b+c0Wh%z(uk~N*36mo zX$RT0caMZeMVb2Y+1c50gmF_%umf3i>3*L+ecCXHK`eq4+`j(CTV#^gnT5&q*IvUh zaEu(AF8AzUT0g$Bd3fn|sRb^yfR2@{#z+17!t;N5$0hO4w@nV zlOehsvtM0(Y=8efx#p@ZCR}@(EW_~(X6}Fk4O2b^D_4!S$`Or}2MmmQBzCeQUvuSV ztQ#sYDMqJ6om(B)$4;9nc?jG!>7XB=6gO)+rJ-QOn2UpU_8swYLx&Y+`VC+D(l2eZF>l-sd+Y>ChSS0v=P42D9fcgf);mV2x(kAuC z&Il1llWgM%i)aC?yTYRMqrgiuARQI|6W3EBUu)p1@*gn&bn} zTwx%qV4j-U?*m0eFov#@Tib|uK2H)RO(lFx#yD4&FIv=GLYkU!T6X5F#3K{Pp+by> z3D}d+u05v0#NH%w+ALYTX{{VWFX+c-vS3jB05d1Ca*0P=-$Hh%YUMm5f~EA}F$s(t zEgkgPT>90NMe`&T02M}vv?}wwvC?r3_LIirsp5%;rjwhCH0EH@GAqG^=Zg-J0ZRMD zU%pK8_8gH$VlP)G*ysEsRR(lr~X zC%jyu=g*UXNU~YcH?{+Yn<#%6&ha)@SIC0R8|63?c&PBZq^z}8G10No=ykc~ z)ZWM$|G^5vu7QjJMSxKY%%N5~i5)wRYDA#`BCM2PNt;=y^ugFS5z_W?r|+2+xt&}O zOPYKhyA_gyoJqz}NtikjXayY~G=9x29Qv`%>V;W$Cpuw)aYj{3gn`N|%w!r4@1!QR zpQj^0C{q6M_N%h_^2n>3+B!{HOgkEb0A2$?G{u4`g?JIBdW zKp+beu4@h7RuG}+0>r6lx|Qpoo9jgvY3jJ32KAjV)C=d%k|!SgKN14y*KtTAEK4Z{ z(8Kk<@4yKeNfbfD*WH>4?d3^-M4L$>RWFHU`dfa4o12J?)Dx9S7*F;*jAUL`wgG$^ z3f9GTF1pqUQzo0^C@n2D3+xqu+$tn9t%Sde=sTLRtks6p>ZXPT%dA;*#m_&;NJGwY zUNj7?A!XYfqmPWnko(WO>1QwIcCnwkm~DNz&*)jbaJv|dq3yG_uW&zjEJL{?-508bck6%y`5}w%zOb*3wY%x?j*ab7QaQ-0R`*6=5b2+Hzmhl8*C7pZ@BU@ORg^QOM@OJ#@QJG1&Lwy9x zSrMx~E;@EJ6C&BRfVYh7TvpsnA`Fh6=-(Q$bEtUYEoYKWn?X^lFGxqLjGHuxa0)gw zFciJ4y1iq=B``YNcoPngaH6YxzsPVM-3=QwcrG~*0HlUd>d-(r0wA>Rvzm5W`w1}; z;<3U?{QkH1i#s}`4hyEyu%j$$3o0GGL_xNzR<%z$_ZA=brFbHZ6?Zjj?f58&@>D}KGg4|NxitUA?Gx{iuwFgMRNzFtv zHUg~YNKIb!l4Q*E!KgTrc%miyx+t~PN6ppV8h(?IWp4?r3EDkvqfve&=)e+ome+_U z`)5(Ggg0O}tVlUNb-w7|8u7fd0_1y`fE*p%2#GbD-{)Yl2!YLH0vv$ZbtZ{GtwS6= zsD=USYX>k?fszB0yMjW^P}NDZlL_e7yM8RIRxZMH7~qK!bUB&FHBK(_n(75zy$mB% zMgq>Pd2=Y)c0{zkMqx?5G!Y*60FdV&J0@dbG*VzGd$6)`R`3o0(2|Rs8uVB(*lY;Z zGywKs)ZBt1X#)V;^BXnTl?0G!ou5ZIm){DGk4NX3A=Bu8jU~ls3aQi)7i%N~0)y3q zws8P}4fO+~MTRQd)v&VzY;GleNo5BfXh-|$@U>~VpbJOw1TbkPZadaUKKK(lQ=ukh z-$B}l@IC#y5Br=sFkJJl+knaSH0k$s5&zMlGIh-&xdKnhu*oDFWENn*MEiz~B1xl- zZKLA^2!*qt>Z8%C=<~XNeJ&1CiSBO2Z8yv4F){Ma))(a1pQ-w@>!dhUU=`y+M*g%p z@_*TT4>&o`^6dAXotf=@wX3b#s@|JrOIEjR%MD{}Ofw{e5BSm`e1VWaC`#bFB54;}`dZR5sa~4ftF?!;nUHb0*_RP0_K=m?~CD-q;ZSQ?Msd0*oj-RxB zKlmZV7;9}A#T%su4|1VrEDw!q!{MX03Gh&H=ztXf0_#tm!r>;*YRjuA=t#9vfcV9> z7Mlwg@c?$cTz6SH$@E&Dk%EL?0t_G-%sumzv5IA$h>0CyUe=zak8@#>b<{T4yxc<4 z_2=yL6VDLHv{O8W5981{#>}r*-IvP33OuvGeiMa$B=b%-!ve#=p}HeP7GNESfAQy*TbeZnm|yx%r%hzBe`wrWsanDKeaF z0xWevQFj#C)r>ID^u5~Wm6Vh?i<=4V^uvAyVV z{1^-`u#));9c!SdR6b`bSm0!i`!qmN)ync1OG-pzL&W|3kwdnW%}E08v%G#Sj74)R z`lF;2``R}#2qwA?0ci3|=DYMv7$B03|JMkj?(P~uB3H(bwnrx0Q?L#mHh66qv9NqY z=nn%UunI69aj*}?qa0jJey6bmc>25LhoZEh^8oE6tEc&%Mr~+awnU{ zO}Ac8k;aVcmnzoc@h6`IIL^3Yl`ETK!17=h%1g`XYSKvmDL_RdePCgS!m&|y_dk5v zzVg&VmI>Q*qQ26Ovv_xsCiHjp+dqHtQzqGWO+OXEfbBkxt)I`Tpenau!BT5x!wiwa zoa`mdMH{VHa<|%SquCn+HT9NAs&o0`rM6=JB3p_Usi2?;J=27Bp1Wx2q@06nz;mep z9fBE>=zNI3kuhcc+9Hw2@}`v+S)-3AmDm&E4av3NE^S$f0+6vLQit1E-9 zv5$>c8(fH|T9(P6Tpbw-*R8jY{N)Gj9LF99fNDopKq-gq1w_wTundhPz~D@oUAO%@ zJMq9CyJ6=xD=j?@15$*iAT7K|GcSS7sXKba{8K<>z>!j0A&zC5r~D;T=jGwii1v+n zF~Utb#dYISu(`$1sUnEh6K_j2Ytya$R=~K_o-1?Sdh6cvHo)dnwgQ$~-5fkA>E^vm z4;a{2&6f$7m`L6?g7*yqI!4jNsVZH?JQJ{>5fluu>suVvu4Bj*LRbK0&d;}wzAl@j zqBj~VAO|k5U2Y3DuAsOn8OGUbx#;MUm`Bq-K<2zO`}5C#!nJ)9h{(v#A+<~&U8;43 z!ejF1!u-%`kyNzirzegs7_g(uS1q&e{L7cE?fe;nsc|d5X`9{i`Mn)6(M;?QMVlrxss8HlLy$+AIRLQ(%@Gjvb}P@qAM3EiiLjcM2hfIrmQPy+Hz;y^K|V2La>Ap6lMAO>JcC$Ejwrn6VS)Iv_4hv;gGYyLJ;iPE%Bt?2N9%oYPPE z7gcQ6Ao-D&aPQu|uC3lGid4Lu*Hb@#n%>I2bh(*l%LsG^sIZR$z)r(@sw0&&m9NH! zG8q4}nYvfwDEw}Y`E?Hre>cPW>U~!+YTBs#U~+D~Wj6~?G#hf9H4(Lr0!GG1hwKmD z^-dO(8GH7*gKjY`VNsG(|2QdAHF_Upp}ggmo6)%V0R^SD>6%Th+EA$uFR5y^?@}7M z6ir<#US}~0NmN49@{NU4Y-AqnqAF?w2;GBhL}3>0Ica$M0hXqF0CYskF)4`@L8Ms4 zMbd>V&SBEel+D6O^qDs~fz&b^JC%yQIcd%pZ-meG!$L|QB?dBq)aCTVDC}jIeeT{* z(upCAH(r1g+_3%pz%w?851;H?v~W+d(ZnnS2m=E8TBts*5h#Q$#8Yhznz`>j{*b-( zz3;RKYtP$dScwxyj^J}c;RBW;|McZAnY2afPSPHpwsrtX6- zA4w#2+sB3-8YDHvrZ9e~+=|g{CIZ$j9zSKJM~+$fDJqcbnr$g&-pR0vEoUy+`pw&| z`si^Aa2DDa;7cef2hcsG3SGoi{=kd{s7m&d#-jy{jRR0s-R%beie=U2GRXB-AK6J5 zNbn0Ao5!()egID-fFXg6a0c-7(7rv^Fa*0ox^RHc=_K{Mx31QDy;1f6ZQP~+wd*%* zwj8I!k&>_!0CZ#2i>aDzZ zNjXix&j=XEXR9#q&Y~;MJOwk{>N)&b8snM7e4l{X@}xyt#?oR~P_%ktWhB_)G(?An zeXy>)5B@`rIhwb8k==IF&GzVh_uDkr)d1&L-EV(MJjT*nZL)(jB>`E{niW(jAG5-&T=aL7^fpeUh2$_A!yEuH;{}5jM{!db1w|{j zZ?g~pDM%hx8aAa|-DV8qq@KqStOM%o69Lnv{^Jn@kkgF!06=Gu?7-IRc3BqpcMU$3 z7h#CYpMB2SnZwrEZ*hRaajt7Sz_|@ga0S)cRWR=X?%(%)=5H~O9)>MfMKHEi+#^Be z+T;wu#LT4iP$=Yw;huqo^>R#;1cq&Z*=kyBHZo7z0gYYY#<#!Y?e^0j-EZG}>YyDv zEFV(9Jm5(t-B|#ouC_LJKHTZnKOggn!AIIcPjS|$FaWKkrjEG+ zYe?YN$k;u9{J1S%4x`Ar(*PSTz`B;TQ8BNi4PpgVk=)eOWX+6+icsXUs{)ik#zJlN zVtC&&vJ%bweG)}p^U!GDaKm*-F@_yD9AYh$7V*{i(7FCm zPbGK;bgyyso^)$e}|>zaIf7~y#& z8oe?!Zv&?6rs)!HO(5EyLlv3rqCeZwO0j3`43|Y`fgLU^EciP{5@^5Tj`W)vS zHwl2ALGKsOxT|tpmL2c==wDJ5jLi-k)eHnu*~qjV2Fx_Vw6z0-=Vs;Eyv$tJvMmAT z%E!i?hwicS%xUv6pHi^#7-xK^TABe(V_XMy(q?f7436ujqnbBk$toLVqkdmd z%p9xO%w&L{bZ*_3du`$RRW`&mEkAdbYqQ9*&|Mw*?)RAoacI|IkkL&}GA9(&j5f8v z%of8u4&h5j=M1h#2yh&yV1i?iO^SCqWI-x?qd7MZb34SbQ-S4r;I>^TcOWqci=GD4 zI&Vp_#c{k@jBOs^qlikSyr~GA1DpAAaTwR{!u5n5GZG;IeTumwkY4&oIYT*=;rd_YdvS zPyIjk)31HU@)ppJ@6SJISsSjh5!ln`sfO+%Re9rE@3xfUMb-d|I)!9n5%*!`zWtaT z)2fa8YY6r@3#PfdquupEm#%nh!Z@p+7d)i0zv8Q{XrM}S z+(){Xq^VQ&u8J}uqy1RdbXx&{>HNMY?ZkZ#SY$<=<${wkd1j3UZKAT?>YqPpJ@Qrr z^tAzIJDIaJ$W7|GUvI&*d*P1ltS|UGqLYjTq>mFwIKai24!6SKau6Yax+b2H#S*xJ(|9g+#Zz*$9DO$pHfX_2j`qH7UFG|2?jRN)~T>1S@kf)|$1J37IhIef&mG~9Xp6+`Zmr%pMR zFomF6>0$-r@`x2+JPwFl$+{`6qAIKp9XjM##QEquqp70avu6+MYab@rS$5+M*K?`S zS99ztx)Ioa|GdF3qp<2RihrTbrj7~A1S6C zTQ>s|x~#gc-rBpmT}oLg4p!GIz!35D4%i7FtL&j?pRpnqxhX)A`hyOleap(tVe|A` zRc)P}gNgC7K}BH7?DRb>lqyD%O@z9aOz~Byy?`p(K`K49a7VJpO~CXdvU#;#pa_Ly z^uyFFUa{PPoI#3EW=PXWKrTIws_>L5jAXG4!EOi?vQ0Zrz||{P*gb#nP8(#=pMe>x z;k-_k!TQ10MZ2LL`Mm}4 zXiK2Y-xyy#Z1g1?*4aDWe~-2D7BPtXf8IV|j{?fH0moB4ISNy&;-6kLPxa-OEEgM) z=8I((1(P#K<@QV$=QhelSX;wf(KP`CQ(!O+Ag65y#}ZBN=_Qu6Vy*STs)l2@vR)We zELGxRW=5Jjks~a(;}7mJKN>N$j?2S1xRJD4DW6w}wBc$xsa(RIB?yX1DK0`Emu*4P z{DXk>`SVLSKBNLLDIU_*(-iq+!ZuPek4_WTgw&%qiL@H?Wd>=2m@v&DiSonUoEz^M z3EP>ZRC8PcbBJ+ZZeq`eAu?<)GfVo#gotQ5b4*w)g&P929+*MNGX$)t^l);41Rtmx zz#-N=jw*q;#hoi97xR_xwxPak>CrU7U^x^*am^^!i1AQ;+t<1O~~5Bx8izw=s4 zxnVO_GJb1&>gV>@7r$ad)h%|zZMRt=1so&QHFo%s$IzUO+R81Pnfvkh8t%7Tq#=v2Cs=EB1%MI#8~5p86W|@zs{?SDl$S^F#`wS-Qv1!_ zqie(e#2)f#K5YCJP0rga8I;x{o@I67R@UFgeO`Ewm-U~-;!xOo`cWfibYE; zCob7WNTGH$by!VZlXbwLooZ^phGxn>_*WmrN(Ug%{Fr78yy#v%!^~fp{16)B2mo3n zRmkBfBmvCpX+ZY~flmh#fJ)Yj3$WuCho|gK6n)7b^ArF0C5vTVe&+|@Ab?=bp`BD4 zyjMPSYX}_5-_U9Bc#TrZO1(;t=u4nQ9)Xgov=xZN6a17SKT$(~AZtm8!3lDGXJABw z-2V)mRp6_+U|u1|I&FC{=*jqEO5Zv}Kq%=On6EU7O_I@cl_IvEh5=COyC0^YpS17*%$E>PUk%n6Y=CKO0)6PpBqrBx zrq)-}M9N|fM><;V-g`d-Fkw$)gQ%qca_8uP9XR+Li#Np>N+Sa>1uVUQi_0)^LDDsI z*yO(Xoqx0IZ{A|(RX_rmXb;f&z!z&Z`>9%O<~(2n-+bp=ES-XcDZp0;;7V!gNx(-7 zCc-I+bMU>UWftd{L>hM##zs|ybRU^ zOaRoxl2UCgFSlhIuC@t)rK+@b&O^1&-sqRu8sHivZ=y?0r)A!yBOv#-BPKjW{U%C3uK4w!+-PFu28~*jmhIR%~pe_WWvHl zmbY%1U4;29LA#X1CfRoGG=)YhtP;?e!F8%X^gQR9YIFS*6;+n=Rus1Ip0fQ=R}05D zF$Nxji-j8jJ99Fvjbr9=Svs3z4MiNw==s`JkNpoDXJmeXop|&S>q789cVVGrT(jQV z%ggNine$vo;%BGAp1WeCPY_u_d>?37u=Z9pAIpjy!jejzAl1!HqXr5LWvT*Cm!~ zvVO}po2st0^QUP)3H#Jab+x8|Sh)6vCQIOc9J$<02e=8+%E&Odj}yrRw6t|tGsiY( zUM_P>rbK`pj)&85G6Q!~4jeL%1n~LAB+Q@2&I{00Clfgd)UyuM9{9O+R8?3L!ONw6 zd+oxb58I`mJ!stx&49xc%ZvpCPlk|}P?Q2VJloe}{`m#A?S1cdM)K3F4I$8Vcmit~ zX+f#v?XRh}=;;ZnrkPK$hq_hiTc#1iqf+^m?e)P!wcInJn?3ki3oo~ZrKHj2Wz-Iu4GN(=le0!o` zMH#=#6o_SHWuy0uu~X+SpqcJ+vVkE0x1=+RiqIOeeh3WCBOR`EverPg#oM-Rn>&8V zLr$MQZA+FeVGblX=DL*klBPO=Kv%(gZ&!z7KBL5HzDggnpm6rAo#n&{mNi8h}|l58Jnp zh=0L?#Q-lai_#GrAWgSp#|}~)$#xQ-wACw@;~%C-mraL_Pp`)N!==wDS;AHZuE(c+bgM%?oI^2wy7Z?Ul>KwXE@Os#V=Eg>g zNQ0GN;q$N=M^iPZl*%}ZZWQTnMf=X^SQ{-BhHrkyyX?AauOYLF4h$gN2uOS6+5J{s z52MB69|6nhXJJ=ct`HT*a21xnc&R;b-;ZGN@~n<3-*LS5Dh7J&ER4(EA3tdQ7$5s! zE7D2Ned@Cxwmw*u21Mu$wEY_6bLJ+dS>%KVzdTH_S&TcNa#>)l2cN}DvfVscDO3(GvJpP(G^w^eiegq?yUC_045=Hy z`e(x`&e6}DJL~-LLd*lDcZ0CHvIL5TeVk#A4paG^hU`F9>it}oAn8pU(5WORNFey| zGW}G!I?Xj5ftl*3Y`O#N*g`hCk$trdz&p*jgc&3M2q|(}4=P9r!al}RG3xVhFAdPBs$g(yh5YteuBS}&9!KY1k~t0NC)&5Qt=#-9BW=!$5iwPqv%oh{p+{v zz_)*5W%~|U)7eT}M*z3|Lm%Y+q?6Er=d9}aGX!JnEflC=fZ(-e!Mz@5d~diXiF^wM49C!UUwiGfu44K5BS&Baldz0h;dHc*KK8Kd z-JG43MZfxMoO!q2GXiG()%Xw?oPEw7ztg|Y{^O0W|K$;Q-2%faxBP#3+woBkf7M9~)$)|*mVPbUm7P1VGyt%KsZ70ip$y^wD6QpM?DjX^LP5Zg zJ$Lw7SBS7^evuP1D}{04{6#8wqwN~lD_NWzdiJ1QwQenoj@g5cJY@3WngZDQ*=!%( z_c$AJysJh|N=tXvGD;gp6G2Y_kS1Ym5Jj<}lQLp(D=EV8^4=g&Qm{R2t{ral@(Kzq zk-zCCbrugZk_&*4VXU7I9T-4>jix4o_wliK>*?pXTx&UWKwqb$#AWOvyrfc^V5mBH zZDlzfU8r#MLIt5FqC$}hUDyE+tA93?%-{abHvqk{q&l&p!S1Ay1^y%~NON@~>0c}> z&}9WNIeyDqZeth0gc|Yr1nI94j;EPTwhfjeF@Y2-jAju3!bskKieisw7|PLljBFd| zh)_^Ki?~5cf-&l?sImojyvg!Ouh#aA*iWB6VU7J`w&uDUN!6h}6WD<98o@#*f$J9y z@R%fprrxnpFcm>q1X^jJ(ZaV3a1jJFLj6!#OTh~u%`d;gh$vgLdJU{8n=V5Fk>EwigYI43vbwEN1r?5+O%aMc5kk&b1m(> zq^HIJrqgJ?d;kq55Zy4)gaJ&{UsvrCJ*nxo{MyY{yn5}G^Mwr?fYnUnI@e*zlM8!1 z%0{P&o5FQa`?BLO)v2&q3vasB=>cP45sLvXTW-C{QUEye&+7n`M8zh+$fR1v>SY$i zrWs-^q!UZwXCvs}{83&uar_ghoL3d-NNblR=HxRTV4KT5=o?2kPAazhY5&JK3H+!7 zPcQ6E1meR1bf>M%140(-WK6pO4I_ZYZjCpWrJq2Bzo!0x%3Wy$W8?TayFLL>fH@sa z@szq{j5N2oq8WC5j-kU6Nc)0ZNdphsQUbI{#(Hv`qAkFHqy|c%`v4zdw0ZSs&f3HG z{lo=9+wOUn`2Z)iPw%%A6nJdixy@o1!?d3|V|A6)wq(P4X9-o02k3lQ#X;t6HbGvH z`$J~c`kIC=^D^f*mx7x~JoDra*b8_~%gJ>h+2KO;zCp%<}-}>Re;Bow;}p77U#(Y58n|o9OHu^AVUdp2YhQKvxI5 zdFISHtA|N1!>(!f-EZLr#zT`i7iJ!NxbGr4hA_Zy0%kOx*8~A+Q2^5zK=lmkhisfC z2<|Exo2{Q??BqUt|7ZW!nqf$P^59-ORX1RN{DHgeO?XTOoeKlHTvsK;nght5T`mPQ z1QJ!8q}HFxYA8@h!6aM0qRr)1tO@C^nz)KI@Mr$vpJ>h5ZG8aOW`cmn_8+uA{m92G zdEI&>7zwn)8>eGRCfSz}idWKbR!FreSi>QJa2oeK{UTjKOfS-m+<65U)JNIDBgX)k z=$w}>rC^PI)XdL?3l{RyXx82H^iy6y(4A+!TE|!$Rh_J_N<9xS?^mv*fDQJ(mV2|j zveK=USum1%oz{$yg0&Z6zFS&f_}`ULU^@TG-@g2n|GDpHM|bw?f9|hmU+u1qZZ;mX zfKYq!m5uJD_tu{L(&M)~o8RtLFTJb2oBhP!^z|42>i6?s|7~D6dvRX=_4o5sUplJU z3kOzs@!=){ztAEu`+V`2zu}wz2n@dRcfaASerLb-u&`ZuzI1-NW;#A;i3AMUzAbNF zlC8UX4OSs+Vl<)u{`Y^xf*Y`mxCjb4l57|~&(o)l*#i2%E-J{Sa3YFUY-O~p>#>!z z1k27Uuzim`WebZJlB$Y^vBT6BL4GFbD5V0AQ6X7YSBt@k*un%V{nGFk!`vFMFt@lE z!8_?$(!a7ziJMF7HL*-oE=CN}Uv$}0EJ{d?vLSfUL?xi(nj*bI*`kfYY{YW{k<+BG zumJJFhK@{ z-S4{_-6G6nh+-Ik!FXb(or5WOx~0i_xZ@x~vEpG9rBlOnE2+23V-^Eu^Y?PzFfSg! z?F8vh^5Zsl-6lIW(2ASX>^lBs63rq<$mW zIAelTSa;UKj0DhZBG!+~pbs^rJM$J;{F-Yl5+*0_>J65+da3mX2dIuE1)fG16#z*+ zEMV?}Vk?7vp1)^!ylby^rop2< z_&eeg*@U5W>W-~uq>)>j+H66}TuXp8^wNX4;>2np9xL^e`-2y)~RY zV%dQq3V1?R>5a88tY`#(FEG;uu<*W2H?YfVs1}4t?ba0ShMY0FVUkmpB;E z5Wk~>f#XMK$vP6EXldH*$Cx7Vxgmle6&k6KVHyA%2F$1%ij7QJ0A1m56Rh?ST2%mY zN^XJWu3lrwr0u7fKf?q#>ed4+gFR=?_0i1;U0@QeCEIITZ6DH!k~a}(0pNoKT0Yj2 zpm&OUbCUEvtn8&`D;#33lY*UWZm@VPgXYrGQj&=vKAVC5kR7k-vM2h-tu!moGM25y z3Z}|RVRSDLkbU_Z|7fe3H#FhI0w)@&3CypTv^nSJ)2lUIRYH5Y zkv#(xNKu3plR@X1q;&hnx9_vvZ+f?V;7>nc@BP5X?QL)SBa1JFtxU;g%&8LZ8?(xj zu%n(hEUR!kAj<*TwBg1k%c3~V=xC$$t_v%hnB=*ZF@G7^ffhSYXPQFRzy9EuHPlsD z4y<2hdIoJATU=IT8M;I1jn4xVbI2Uz7Z6|qc%OM@KOl0x6&4k{?9Ed@$8iDB9L0UH zW%D%v@j;7$4hP!5@N^gUg?&iiUr%XC83Ufb^}~&u#_omZi+`v$dHM6jU;L-P(f%bz z0X=6QP7}(tdFkuR4%!7VFCEkDp}qK(H<<;I8im>C?0f&FuP?sOOCRy#>A(DUzv+E` zSHFKbMw|Wq*L~JYBl_!J@y5?zlOv#s>e@dM0ZT_N(`QA)+qZ4A)D##Y7Ol>XHdqy+ zP9p!C&~Eu7qpg;Wu@BIalauFKG5KKn_8-8e1U72x)~#p^eRkx?VY~6B-7fXl+}>_$ zmM$lyfv_LV)?<4f<%T1wXLCuXUu!??M}Ungg*0AD3@jq=4HsZ(`MI`X%{qQZ^shx8 zw%}%%vPixv-IoZf(TlE8HX34BU1IYL5As=nhDq~KWsnJF$QW<139X(fyi7_65-k`nvBmc)@<^Z5c!S+M3)Ny`F`9uO*Cjll=Y@AVu z(L;cyAgolFarSTylYB3omO7BA54EengaL{GG|#|nWr+#73_F6Jimk&HY^25{Fcj0U zhotXFmrit}SHe(t9Ni!Vwdk?fJYn3#fD8kERq@SG*brbPinLWsNuF)IZ8yt4V3^Gr zqaru7!I*iY|sOzX|pZnG>}x(&cgwgGl(9(uwqJ@qVY1L-`&HC7dS z2xd45eQErX5>k;=DFf;&I@`=24@<~~ZdAvH8S_vyj8aP@tW7T+HL|%6s1|QRzskJo z9O||?^9$Tw791YK+QVxX=}3~&f>w~q=4kYW-CWBdu30Z;;<;g;9sSrihmE!~#GfKgQoyR~8M8aE~$ zrTZ9DJvC4C3^KuI0JUlncktndnDbG#YWofwgPE&1amu0qSc|XQZvCW*`>Prq(~9vW zM&syG0cXwSv>B_~T{bd)uBD_HI;jZc6;mypHhCJq$pg<@@BSkc$h6YZG2UX4MFe1P z!+;_g-j5U9OrR6=!uEx^_nWJ#C`9YFKl+=GI*-X9sciWs$~{3{as+Hzn`*hvkvsv# z6r}Z6R#ADKW@)SuZitguS7u_>Eq?^$1o@%ppY4rm<*1b^keA7SxAOG6*m zH=cks1hD)S53Nfc#$XajfxKR2R^9{4tjb^yEbt_2pjs)WX2KdWXZu^*&{WfrDUa%9yc^|RQZ4huIwo+v=Td}{ zl1l$(Bq0v`>HL1-yaf+<3Q)bqAC3%q;T&K4XZxEk<{M-1o5$!i`-<77@qQK}EeugG zdK+osq+Z4{a6NqJkTX;Q1udt2it|u-TwGvl{lVy!;Zs-)T8{xo$x$ zE-67y6@|tx+M3Y`ZCrB|olwRx&Arn3BnpOVT+uRMpbt=ixXt;y^_i-&3adFRD-*O|@-K@^iLp&L?XX_JUl)VbN*~=;KtTiPtat!) z2-ZX?u4F*0>{`eXI#BE!2t$GnRA~crUCKI}WLS-iLo{^F+P`NF+5XV92NRQ^<48|9X$T?+c%@ z>)-x1gCuoKkkVygK64b{J%(O%*=h$x!OVlG=N zDqur@ytIJSWLr? zDa{$j@jBoR0Co(Gc2XBo2p|Gb2|nb1>JI|!(E`dk$#=4FTtB~Pu5(isi|@4WSL{D zfbi6*Q*Mk>D9~H8W~B?@+$7SNx~IM9G)iTlvT!3n1xez?FKc_5=Q;y$jH# zA^_-{R4O_FHi8W#F(Jlw-?$BcfQ1ZuIGM~Y002M$NklqmlfH@s}|Wc>lRR;g66X9G*u7vHVS))(23^=x}#ng!D%YVsk(+Sl%0l` z?;`n8?b`L+6 z@g&-au`w?KL@iy6&m`K!4hjcatLo_s+-)7`!c>?v4m+xb)IeqniOt zL{i|ea_dH$Q8g~WSuMkS@hUoyZ)Di%MDx*MHsXJ|`|dlC7WA``9k(4f-E6h{eok6^ z#5UjYCJfFgV*36=R(9Yyij!LC!jfiduHR~NuSQFUaeCEb`{?vCU=e5Xq zYt{iI0yf-Fx)kO)7BD?f(+EH$t)5FYcj-CHDJ-^VSeYPcTtBJek&Xr%M}L`9JfCr- z@Pcdar+DM(FWhT;{_YFLQ@eFNb9d@0p`EcCOL_ zT(1E0H4&{Np$$xDyR*HKP0nM74_FcGXP97zJKeEu@UMI4kgoS@@WBwj@p#1uya5bfF(9v}e<~fM=vP)0bON>QRFtay zStOg8s*IHal_BfSo!7ZYQ(a63*qBQeETY0Q!&yD3)m(8&F^gH6H8eDkO7>eCi?X76 zRmm-9@mD2sDI)Ef3$Su(;YO+{4WKy2#uG!zCp$OC>2(xA%P2RVg|Uz5zq|}@Fc_yi zqF<#YCt(m&*_l5tkB%VA%mYZ1ADP%SF;eQ~I|_J{H(3mJ4Jux7$b^k5jF|t=KlyRe zR`ijjYO$XUrVTw)H`F^LB081ciLt4#sM~|CN_#T7_)JZrjALe+PR3&gS!TFUyTlz^4L)Y(Um9X|U=+3NpA} z;6s-J*0mG(P=QD~sm+qrORSMJU@PZ$zOfDr+y?Myv|+$h3~XCozKW0Xob5>nc4-)} zEa2ngyruCH2=g(&)F#XikYSK4d&M$~fFT|NcuUo))bc3jUS3v8fl0J&TC?7z{nl=} z7Q2=GjOjg2>TnKCF}GE;4mD)4E*b?*G7 zuJA%>!VsFSGq9w~)^AWxKJF32PuRns{ha;ufB%J@{qi@=Q&xlNvR^JY zFrjLSc7@5F;69Q$b>e(BYQ|@nO+6BNDJp*+AT3}`v=L0o$~F(F#&Ou?PJm|asx@2` zpBE<#9P>mzCpNMui!2PAFd{xw| z%a97hbQzVJRO(dyk_F}kBvjl5Y~=Xx^5b^_Ktw>rHpl{e1OZdnNwwBgIY1hKVUMK< zBZcwIh6&7ASd2`C^l5#QO}4aBTrx!f6z5pW?&dZJdIB(Fa~I7we<9aTGf63Hfm8sV z3aTamNAcYEsm!+#*hVkxXPBp#x$6gXMRDLhzK(LNllXH6SW7x8u<$v1(JF?!t#oq0 z{{5T(hKYO;mq?$$ICHLga$@?I{>S%xE}x;4x_km7IeA$ysmn<6S{9nwkL!0IK_mjIPUAn`K)gmaqxUt$^dEO;qPImX+umIS|zW$ZkKDd zbQXr9gAHZlwHqxbHya>$ly*xuxTtlQh*S(i762m&?aO12K4yNz+3HCfmjY|S_7Y@) z6%&$;uBQ4@xr@p}{C-Kv0+(hPrrI_c#xR@IqRfHC4tiln)N=1KzJ1}uMAyw?0PqUW z=s<{%4P=aC9S2}39p+Vj2SAqyn7s4dZ?`Uh-xx2xOcmt$^Oe?m@F=NSQl79vp(qwV z^iDZ>`Syh`ec8$Y32pr7Bp|DrisE((IeIZh4q}NCq7U*kRw}aQ5RhE7q;X|(Eqpi;hm7Uc=fImm__$0nnc zdJ*ZhbXd`ar!9fwz+ow)@{~E(Lf3*PE}rOqly&TjOW5aeyT8XqG-_3w%v=K(|*~?e2w0?l%aHO9~XiSMS zvMetfK%OKN?J_B@1kQ5|W@v`v2n#5SsRcNQSqcJTqIe%4I?@C- zF)xhi1fZ2@z=EXi)f2n1w9FP3727E)Fb63bTD)wzbyDem3UIidwu8$^c^$oQ(h6Yx znyV`9A_c4ez+i zLa?9HoU3L&TQ<5@dMNXIRnOL!V$My0OH|feY-tEYxc+5;vyug*dI?I@q7iW@^KpzZ z4bj$({>WVOSmskK(t=1pz0#3U87W-*B+ikyAOHxX_fuyaa>zD9#q|V?QpRF7WB}0M zi8IazFSAKLnHQC^||vHl#@cGO1$-anPn8`Tez#+;sD4I$TU=et)NO(woOfq zHXljIq%^aPPy&J15UJ7#UK=F9(!&{rs01oAk zCL0<$V4Uxr~*uN9|a@n*_jx$du*t_0g&G9QsoFkD1;fd23Xa0 zDtT9I*~$S>os1Mj*G3vqAL;!d%;rEd<4RzpYcj)}4RS9;1B?=3uzfJt>Mk_RwFq!e z5xv?dmFRVhO#`+^l|y}G9HQ)>KKE&~(OSFQslM<(K8O#~n0px~fjN0l>ff%dq5vvu z%_zqp;H4IrS|>*VrjgtiS-JCE&vDmIkZW30Tm;Cbw>H;flmM!D;e6x+%msk!WII6w z>GM+6fnLPAFn*E z*)!J9U-`S&;`#r&bNYqp|Lb1##?N0G0WAi<{Cw&6zt7)k(|`FxS|M4@%n=hF>DF6W>}ci2=2Hz5p|(!TmMo>ZuHOzkchGqgE?7XCjfJJIt{N}2 z0=MXuS5(RH4p+ zv4|$(cJ>|swUf_LQ~=W=mL?S~TR#hGH-dW~o4Z=1jlg=yxY`FW(uSo}@hHV6Y6az) zVgZNkyKdJmDumGj!7lW$(C&ZcfHhvMwh+LEU66&BkH@I`U%&nhdtlFF7Nh{Do~q0v zm{m98OE(Cx8^`<3*Gq?m>J|$(bWn8(qXOeKJlbbBy!9>CObTw2az^}(>22ChhL_iJ z9$|o|7X1+bt$;!VV*Q?`MoU4T6h>d>*M`d`kN_YH0peu5E888sL(mn$_@u?#Z6A7{ zt+;K6?fT$5ZQHKRcJ$;S`Wv^C5@*As!gz}FjYD6kmTNwJ9$KtPHslzpm4h5d6wIYk z^SRqL*$4n<1g2_+1NF3$Vj`yA6`@@Bv-|eWbMkh7mAF9x_U1Z7E7 zIBV6PVouGFN)Ho^bet(g+>eFLrAkQP5zASzkU#-@Bi;uZ*&3^=?V6jecanuf^m5X7 zE?87V?G0=!z$OCe8x$IW1%)%PZDCkt9|cg+%%e0Iq3V;QsR?-4wFw3Qa{wI`-xwNA z%CwO*RM>*mD|8!KGsobSr(|&fuN||qhmKRtn`J%%ArD}l_`-Gand076mFxubt_!Vh zRw|$y{qAsGgX^8Uf+}R|QjhF$OU;6%%9vvl4ebD0fvnNbvt2S{wGj`#L$L-+W$L$;y@O@|O{YrOt2Q>e%I#O*4Acg)~<3Xa4KP3drAGRBs|m1yBM_6?XB&! z6z0LE)JZm>zt@my66ecb!;_+06FBDbJd6*H*rPF2VO zvIq`xb90@JP(>)W?7orf66s_?k-Xo6MT_0BK7Z_aGCl#=pi%7p*7R{eL{191PKO*)KSM?c#t|x@)uRugH z-5%=L6qRc6P;ionId&f+`Ek-L%E_tILlCxbf(^?XFZPW#QZNBZU8+5mMDc2wB~iGR zFf9&F93G7|4U2Xh=Mm<2TQ_ev59c;Rin+9|&f3^W%YJ?c&0-gTgoU0|*C+n*i+0EE z8!Rz*t~H@Mx`6ht3NYB!H|}&+L5|;o=z+~pMYX`Vs)dy@3o~{RN-49+iCOZ&D1>E2!hWPq8y+_O<9qhl zp(plYGZVDN^7HoOp8Ks9CQZI>>YFU^l}W+O5I{1Sjm8Ve3bV)uS@>lU6o&qg&Iu8j zEkZ6Z0SN3PomU8(J4TlU$UM2Rc#K0EvGN=E{o>$<2 z%`{9-{<0O=9$m0S%&#s|ikUe%^s>EdSHI~N^oTKb@JBzg(qpGMW|+&oEZcxV@>0b2 zK{l~V`yR8WfA%v9U{Y<3R8 z0WuZ1sM;0s9w@AGbxTmILhOSQO^g@%&9*Ns&d( zrT=q?Yl;2QBy#~}EMUrirP~Q(H_m(==Q^u<$qeI?IG-SjF>Xc&83njaL1!pNyGwx> zzmH`;PXVy&8tN=ZED~+;#+a)u=chLx2Wo<4>4x66uivn@bjTgwsTF{Kx{&O^u~){>TjNMU5+GzPS!mS&-ZF~i@(c3ax+~y0cP_RzJj=?;oK;OS!G}!TRdkXENK{v)L0EbD z8ZKK#aSr#c0Hvfsx|VZsC{Q|C*`i1mo?iwFvuEp0`Hla*4o2V&VE8(?$S<8DK*ep+ z+M8J5S(wDQrKhLb#trKLV5Hkv*!Mm8B*$G^Iz;2Le9PnFAby_MQ)Z(Ej&5_t4Q~0t=gI zJ2B8_wE)X*Qc(S!gErLGL9t1jg__ze8WvGZgxHh-EJrlVQ34BfAK+q`hs;Jrb$>*pSbL ztLyF90}oi;fkQUI_x_l8iza;;$!A2eLC2_?l#Vp9FcHImMTyB(&@nPhI*Scw9BpI% zjk_#yL6OrlO|VHx_o%KhQB06=z^XQG&5sSccGyH5n+Kr00gzq=gLP!z&+YgV`>mW* zZ7-}$=3I&?xc*8LlapdY4*+mwK72(V=|CbIW=Ko~$HHN{a}59zMqqE!mio5jdp#-)_(e=bpp72FfJvz6jl(B2!!@h0lpZ0A_MM#xocU+ zh8zSmMRN}Qjn(YL}oIL@?)u0HEHL{SxtW+K3Pl;rvhHZ5v@8OgmL!FWdix;m??t%Lw)bf}llqR%zg zD~9n@(MpKG%ENs0@x71xNP%Mn^Q(n9>*sHC_?$eR*`8?E=RHw2M#xak{P1B|ZsZyr z<5ojK_Nvfjj4?0vvRU59`I|(UIN%Yb+&cdyhV$c^{|Gl2Oh>Y4PdDE9q;KU zs2;LZQp3~y{Q2jPlf{X2`oe0)W0<+Mn7>uftn~6S7G``?buFmO>r1=SA>DU?iCJAXZzZH2mtBn9-Q(lTc~S0`<(st z>*?!@WAb`B>DTAE>PElv(05{Sd@v6I7Sf&Dx4Ry&>RVgM1|`vS7sVgfHRLCG{{4s5px@XA2-vk!n5cMqyzg@+lT^z(N&^)yh??U=jRw6g`m#Kq%+_ zI6$O_)YD*d8+V=0mdsy7mkiRLus&kF1P({hR81%qN>sb3sMz8FJRzz^qe#gu;NNaZ zhDp@1N^7W!N%aVJ=G{6yE!?~xI|hp?8zfP%3K^n^q6gWOhKRtWW9um`bHa2FoBBO} z_+I?qQ#zonT|#%2Qsv%mBb1siDY*uW#$dz)q4A)7nz5dh%J8!t>+ z%7<<$z_EELPPhuImujk&<+~OSAnnolV1*-KCNNF$v18!!=*4?!pw}ApT7cu6#TTw5qlvvFU*N)Hk(wX^|-c?Fj?|uOcl5Vq`2x-T~qzXFeybHP>PC;r-2PO z5wSfE2Dl}OkI>IOK`?1}8=bd(uU?LtnoCMFbXx~(uC@U~WTLv39UPCt7(&#jWs$y05nQlI7h-;COUjXX{OAA1lW^Ra)SA}deg-w@x zdnvSmB^Th}T)JwT04p9^t!3CmV=JH?5D(Ct0%WM$37%0lj@D6Kek8dF6U0d;8KgkP z6%4URNSff~wE~B3(*!WgFmJ;GZ&c9_aUUop2|Y|l7tGw5PcsCE9`1eJ>%?3z=Ge6G zUMh0(6A(r*rV-4|`cr4Dx3nC+T$B~ip(ZUalX>4_6QtP_FvpIedVCt-77Zwi;a0#O3!N_k5=I6@$;4og5q#+Yhk*3cG$sX6(Djsa|it!wUVw-f?$+Sa(> zXiObZa;Q>=!2`9Sv1WZi3gb_tV2w2R0H9xe=A)PoRj|Y7FqvPwcCE`k$eyMICR*8= zy1F{YAgUlm_f~s*J1!AdGc*Bgf1c+&BC)wqCzM3GT3sY?A7SoJ+3Hm*X@i=^`=Nn$ zH^fUI>7}#QdB1iZFI~@HJf~T3sGq*J&iEJ4^FR6*Gxv?h>th72O!1dbbk=vb*zMf8 z-4#$I(p}&P(Wt6ir&;iJ@4f|K;kT2dWE7q6*t*5B6ROgb4sG$`#WZPOj77~}3Iwj= zwO*>0iR{_5l+Ms+?LUkcBEE;(ETdWES{j-iN(fUiIRP8jR8i~FFp>N&IWEB!XlOl+ zM-$aj+u%g{ARa{WXrfwLiQH)=M@ra7G(LdVP-$89T-N3|#>T6{nHe^SC^m`!8w9kL z-TnvnSRaKXJ=o)%KXJ}#4?XYF&rxjfMGF_(pMB(`ZVC+Xxu+;Zm`=lA5mvMELKy;i zbb}Nj1QGRn(f`d***i5vb+5F2vWnr@ZhFg`t&4?x1hCgd`gxR1NsD`0EQ>leA^B|P zAG0b z{2))58h`^|i*jHOit_J@D?M;4%e@l^MKmBW%A2k;H@{h`{~=pdw8*82+m0V4`UjxF<`e)JK~+}U+Deu44Hn5fodU21 znL}Q{)YJrR+_<(w4Hz)TBwJcxp+zMDegTYi=qxjHN=$_*P}#K38=}ibI_A{b04=(b z!0g7+ZNOMEk3LyQiw($kaK2eB=@I_Km>gGc?3J!zplv`C_nH5rE(z zfHQ)7N(RpY`vK-a1OW7!yYH|i@4U<6w_Ic4JkASQMvzV#Q!uVd%Z3O(UHV%flY3JS znP7XkU*qwM6hQ3+5I2^W(t?q;mMd0Z0FHNJC0$IM;pnKP^EW^I!WZoC|M2bh=1o`G z9oskBxBvaC_VJH>1R#tJmE;p#I|mK{vLWWahjk%^`(Y0AZJYqIk4!;MaRFUrkggng z&T5YAr*jg(3=63+)nXpzSyjy?JKx=ERp95#WDUOY)&I*$RH9fzlv3uFeBq&$jnC64 z0RUy*9$@}Eb9Sz^fTCFOH1697=9N50GxBn5z5-kBKlOs|Ch+nC{8(6R44WPwb8rwB zf*9Ee5tPobZY016$5DJ2R@MTop+Kk@mIWYHtt`Jo6|4;4N}zPJUKh{%E~4stg0)C%sq?CwJ>A)_FGozX zKYNvaWm$52-|XS*)bukwX1`wf*X#5DFU|GW=lQ=*&-%*LpCQW41b~&WV6y7ai+0#f zP|X$(`>*f77Fq}o@^WoltAIxNzkXuc@nwdgs?=%&!H z@tQ~~Jg3ob)l#Jz1W*ce$}m__dKgwpy1WpK4t$i0gk`@I&1M$n_c3XBE^gUGMe!g) z@Gg7yCl8wSQgKQ8C4-3liKm`HgN70JWZ0S}`3%^$($34)PYO8HHDLWj-E;`HFx@0V z!&Eu~{ATb3^kC>KufsXTMYOw0wjmb#-Z2;$D3V@v8KDB!$CygEpUK#DvpFo5jt3?- zB90UzEZh_TFc~Wm6>dl~rj+0mi?sSwOU>0oDsU1eA;fWcIG=d_E*iubX0smZ?12UG zpml>Kc=lPR=NyL#3IQ5J(2Ek!C;Q^qRHkgfZMWIHb?fYWQv>NOI!#Eg$wt&p>UlIw zx}Cc~pD4hjFHIAJ^r!`-z;15av<2XMr)|CUW?Oj8dW%8>+KW+n4wcaYGgGjJ5p2e) zXjKJr3cy1ZM)I@+4ssTN8m%(CZ|?vMESqKofLxX_HD^y-GAYffDol=HN6#UM-+0#@ z)^@SN?*IOe?A`BupDlyQ@Bo4W)pb@uI(y#_evEc&%HHwrciW=tcUl<6XM#%c#wQQh zp*@e*014oA~bWCj2z4XHmp z!CjL{?!EXV<^*$bg8A5dz*XXR*Qg<3x{An{eV_pOZP`=Z1@Uu zC&i+USpm@~b5SYgSgOi<4xh$cyOY+ME4fD~c&n{|feqQ)Zo1KSE}mzJ0LnCUwvl1H z{_rOK*oQt~cinyqM%b(o+zTp*abj8k)&xvrHxH?6YB zIq`P(zyVva^Cp73c&04RN7adEK=j_c~{?b^+oUDuOl7)g20suRk2 zWI3|$QeR|g!H-k$lSlSo9xH~eqE)vvgj|J(2R$~XAWoV8y2o1U+H|Ns8K1)A7H_&=Y`qO53l2DWI) z!V;GzkseSficU0T%KdHGvW2R*J|}4IyL=h%td*`JSetk&Lhf~|SJK2i(vBWEVk@yh zkYCme3uJi(tV$Mc|E$r^K6{V@mkkD~px8KoAxxG|orQZT>B9u{Luy|qRxT04-#VBB zd8Z}hvSYAsb>7A7(-C=Ci6uJDxs&$wo+DW};nE zYcNovdDuup=z%R#vJC}1$!iye$o=PEb= z0Qv}Xn=2|TxuB475x5+7Eym;p>4y!PW+P2vgV=ueT~>z(URA-vFd2z#SV0)nA2ME!4+aCokh<0kW7A}+X~sDgWm2hs0Bde8+C2gXKft80puoz`oU}EYHd^dLgv%{Qk3tHN20KO{fqevT9UcBT$j4F6$2o3};K~-+vW@P8M zc9Ko=@ib?*Voc1W*)DJwVr0G>Cwui7tC`&L~Qb4Z=dUy0aCRw3Nuu^6vw@x z`G#)`MB=a|F?WM7!Em%Ly{jNXK7ax4hcLjd4>?A9I$)Er8sr`p<0YV}ZX0o&hkG!e z{9Joow>ZG*G_RFEpMseyrvO;ye6?tZiPO2e)kABCt~vKzFW2h9Jr5IHJp}{X1_<=q z@}1l4Z@=;{_Ob8$n=O0mosL}%5_rkNhnp2p$os?II_n!ipX3z+sUt9$$w>r@&Fxlu zshle5Y|`!&aL|JCj@?^1H`3(*JP%Bz0zZ!2$w@x`(GS!9E{RMw1t3ghS9k`P^}^uK zC{QAmEH?KtsoW&`5~mYX)}201fJH6V!lmeC`vKXQ;xOK$tZQM;_2`*OYo|B3;-oMA z)8E;=5?EWUm%_wMW>p*uJZU}Eny0zU?RdqjlYj`Aj%0-HD-?qXxcksyDm|`NgVJQ9 zdEotEl>zRuoAPme#<}kDag9Y+9L0PL5JYq}wK=dK$2zH^p+21Qz!mwA8us$ z?d;cI`@&b3~Hzv8QY^gs4M zRLo*LEw%~mnYbJuOi{#ipZ%W?z2Bt~W}=epyASNML8tK>wR_(AF4Ag~_VB}d(7=t^ z|I6Ncz{z=4=l^GCXSNq@)ArRi^)6Y(Dwbr+wv4+mwy`nrql4+;2T2Gfg!T_HH6{tc z6jSXO1MYH@W%VwtR;%s3_ugi9W`E!3t^|&O#QB7OVuW6Mw7b*Z``&xsd!GB8=bZDl zx4n&pJINlw5M<}&+d7gT=VfKuQ;+}JwqJ1t8o3NRPS8Lyk*8^yIaYAC!7S z6BS4FXpsJK#tp+bJr!w7Zo19-h_0-Qo+fEFY$n>B?wWclz-8GBNM5mUshvJ@+*U1G zW`}UcMgu~9faEY1da)&nP!zyZq<13Gw4+>?j|DppCefA5!i^XtjgF#>!>Hlw!RRU9 zp^wCIfgt)X0MP_SaNLj4nH`H8YSR4F=?x^!wg5W1<)8YfO%&(Bg2Dg-h=wpgd5I|` ziLSL+X}bVKR|0e*5P&&tB+SjJUIGNXBsq>xw+KFy2*^!~qb_q-k3~yAh+A_uprZL~ z1trUf9IYdw6#e5QZn$eUt+x}$$R)`4`T;Lq+>_IQ5V467R9=Y2ZK|;wgAwAkt^ zD=a-H-v%(8%V3I*|KuU_r6<{fOV<%)J7y<$??&U#1LSwBtg`Nk zdh_FjomG@cbbA)miLl<&j3aY!EP_A?u5*+? zhuE}COUTNx&a(}$tuSrWPfqhh+Zc0xDhbUX`n-XDMjY3of}WDOXQtLKv7X~)%q4=g zn1Asri*2B()4YR}5}bv^AwA0C(AN1QlgtYkQJ_>@7-jYdTA7LrLsF0iTTZ^v<~Ey? zNGcWq$U1^s01Rm{DX`pm)>~5o>X;yqoJ8i{StP|SXG5htc|?0!J`B zLGE=JM>cR`AjRk@U*|Z|25EQ0U`4}VU#DQk+5jER6*X3gOS%z;u@4!_0BcM<5x=W; zY`5I?>z%v4nQ;zsud8i}e4T=I*L|xTn$s}v(zS(PI^Fz`E0ym`A?4E58y4HOS8QVg zDW-WQ0lT8?qXA~pl;*JR95}R_DBGFj?QVVcYrXSXBtI1`uhN#@NV&iXOp#t9CK=bS z0=xz-15g&|Z6onFn}As`v0PIk04s8Ct|cG|$Yldmn2~1>Kl(G9BvH2j@ifWGeaJ=x z3bpf5aEi(SdH}6qtg|k44j@)lh_Z4s0f4ylp-i><=dkV#F#khHRVc8>CMLnHdlP`; zL{R5gJX%JoHccW^2=X&6Z8jSKDH#YN0~}|viD;u{-z*w;gK0v&{qO)JG!7#nrr2V^({Psot_QyCh?!UFoviJY_p?95sIJ3_E zgTKW+tCUSHccZiWzx!Q6Jv0AlRA(MD-}bxjef2YX_xbjo|M}|o{8#>d&3(xDy_REg zu;X)objI+tocO|f&ui=O|IO>3VkfLgIJ2V$6!Lo!JK=eA7qVDVLlf5S#TTCCcMM5Z zmP>3aH*rl(wbQFCKosAH%jV$019ts&*Rvx{W%qfK9Bru>6n41mnpFiw?g(iN_wL<8 z3N}E5Ty8LW;~17EqG>~j-6Im?>}++V4YPxePEN5Um#%d#DiwtH!uAXiC?K)7jGBT; zRL*LI?~*phi?I*`BIbnqQU7D`CWy4lwVQ9b`8SKh0K0SqUUvEVEjH2CV|yNZl9V?@ z24i4WQjY6=fALXwA0tnAMjkUlXFp`-ai%#jq9T&ap~dqVr(vTK4WGy+pqC!v@Yq&(%-*k#;nJ zMf7P;O{HTZ6fn{Q6PG|LjzN;`4)l<+2E&~YjrKAI*E0`kHB~-q3U+Foc1+NWNx-X^ zuBga(0F&Q_=p$cV77WplUH1NWTV_GN>$`rUsxy*OZ5S3JJ#{v2$yO2>!(3rF#UV)( z=;OMu*;Z9uVsO_NH5Hh_pRNo_^X6{^Cg+sA;zCH{WczS8b)1cCR&_IBC_#N?>%yZQ+V#mO8h< z1qYpd`b8_EtX$f%`M9P_Eq}>8m?5*)(`B%c;}$O$ABMXHBf2=h5KzE;(F)7_pQOD? zVysBeVdh2#t~co@nOvkJq0}9lk2qMnAfSc|rqVoY3LDJMs?iGRTBDm$oZ9`6wh`|=a1kL7Lj=Fah z={(K+(t*a6m%14vCO0E>N; zSe#40-~7S%*ry))p%rhxLLye!Spb$#5%}}~45y;@1#VRNXOzGY1w#ys62;B^uzc|{ zw6a9rvsuE??IQh^H&8MXm0r}bbjea1q7w4Bhs|O*fjK_q_8cMiB0(H@MYO355y%qO zJ#6FL&)S?#!sZDGwY5-@~8KJJT7=3)!MIvoK0ah9PSH*d3zmutQzDGqse9xmV|q_b|hrdv+%qInDu~SD?xO8}OOL zM2t6cMs9MA`?UUf-5;-iTl~83LK--8XZw z3|LFBx|3zLkG6~Lh(%NRxqti`ny&=w;hHMOr|b-=GFr$b)=DJtBoVvQoG%PuIEhi0 z)(lz`1O{V*R!EC}gd#uy+Jx)k#?7^QK#tOycro0H?2JHb7|$Y`io5VEz+=G`+wGa} ze$O`C^hWCD)|0T7R55a)!$8gG!f5h6_;JQf zIxU>(E>#S+htw$KcO>NrUt!_dxs(pOHUSW;G2(vQ-D8Z)?EHM^CayhG%5`Gs7<-jYgRFz) zBFzn}h{}Qm1PpVssCGlSMCO?~OZqDxKwj?c9Kh5d^Q?gP$XJVQTDp0wRX?-Sw$VqW zxLnI<+nR0L0NMmw01hj0{cqm7%~tN%;i59jo_pS&{K11R*W#w@uXnP93F*U5m04{~ z4e415Och3^Yn!d?@NwL3K8$9J?LB$K;z*A&)zC^ba5HVAY$8UnyR5>by^CK$bTRYV z0VUW1Mbr~@WCLg@#h#&8aPwJgXCHElWP*O+>4d7N($QlHxF~~ch!n*h#d}q^I~F&1 z0YL!DCAWO#O6F}39Ss{vA9^wN+)OTqogc6i3o`^g17i>KCDtMhpok&vr0ih=0SJiG z+(t>dGXXRoE^)oz0g+eOYXMpT66K_eL`osHR+~PRhzv2e6t%8KWF?z;c$=67v@H$m?j0`N`HA7a}GzGg1MMsispSj0)z zqIA3z9_}lp6msSF08|37;@@I8zm9C?yf+qL9EOWFTp*SlkBPjWK$rvomXAJ>t~Lnk zuYjEXs!GdZPIsR@18~X(KyyE9edN0}o(+}dq4Abh2)wE;-!0vB_!Zb2IFPJ$nGPfKB8H)#cSrm$+id60%BkqGN2g zRjXFJe6v*mNY${HbVd0NRhD$o;>B()S22S@?sMf{)mone!ze(gDku&VYTWt#;_>Ix z0~dkepUGHj$LbhE7G4n@lNj+!)?5NkBf^x$;=sQB&VXUkY}2MqxQ{1XN(3=?D+n}E z^zVMy!i}3Z(PN~-z!>&naN;p;ijb|XtFw6v7XT~?RykF|uAlP&j>3s{RY^QAMoJ)r zRS#oXfCZotyhl0d8XEyie7_izDBNyJr=ma%87*lMhcSj~J5E)%h)QE5c0tj|(yYa? za9(}oRd(#yamT1=A;ywgD#l8>#b2XIQ$p+rcJ80~{O2q>HO*vx>u@oZpbxAiz@s1F z(yufn9k{QjahJgqg|VnZ2a+!kK+So?uF)!22Fz`t3Ah0LT^q$=vJ$ zJMi3YTX6MNw)=ZOvdgw@wRV71E_oa40eh?GEdV%1SYr+O9_bsEkrPv@WVr%jT99QJ z!k|=SEXEiMrQK1b1i6&4&MqoeqI59@VX(4TH;fI&f0)SI54^|Hw{NzC9gXHkU)hEG zJQLti4+xqCJ5qi87_35~)s>V{r}yj(z$53JDwIIhFqZWQ_gifR33Zn&U*_uOX24?1 z0x0&A#w8r%ID~=oVeE!`06PQ=N$jt>wMhxFHov$KK%!L77#56Stbi52Hv%kG>h2VC zZTYgLRtK{rec7t(Zm?ZH{;6%+dIg}XgYt-HY~35KvBaWc>pgPPc0Ks83t-y(#_KHS zn(YAJ5qtVe_uFhX7|XA|l6eGk2Fufj2CJ^I&T<$RZ*07E961VDK%)wCJWT+{0Du`p zW~0<54#57#!al2dO&38P8FR9kGLbGCU*-CwgCp$MNgR|5(+kTj<0zmzLA11zEV~;C zR!`;aR23x1oL0&uuV^HI}706VB(|E zOA075*=-o`mV(<|FlmAyh7dQbmjDSdR0=8@;~w+DTIv39ZK7|_A8MbT4*>ENbu0iP zgRkgWtUU9H&jNy!`;!mzG1|=BmxomqIi!>H09eFgs;Y-rNk1S>0V85WrG1TLx<#@% zYCU|~p83WD_QL=7Z9Dj_2kpf7{>=uDp0Rl;>CBs@Hc9H5eI=*t6!%~SfVYu$uDJ7N zd)L2y+p;d*;PjI*=qHuqR3KErDnM&@Z)=@UI;UyU=tQ#yDbS0uLb&C-3cufZj@E`k_WQVUx3lSKvAljU4Qf_2t=di1e#DI;Om^Rh3UA|mFB~iF6 z>Rf(86=u)O%5*zWxxfl=O=M+f+3uHj+dA|^N^_v90DbJlQ_=f)Fgm4Z>*SWu23(QK z{TRM8>{25DWKn=Kfj(!zSgJG92+|YI zWkEbzg^QnP$I@Z6kVz!ptBM+7B>MGYNWyu90VrLbMhv(gm$fvR9{NGKA`t}IrjLExw!iN^ z=p~1(74RRV|Hc5mu>eQ~6Nm{C3p4>+>qj#=+|g?&6M3G0SooFjdlX<20<4z9_>}D5 zXWh-sxOv+xg7ZxCyi$S4jT_E9og_FQ9M@!kpq!la6xgybn@34AfpdxQv5fpA@DtE8 zSX~XPOq!XRTEJC@Wi44@_2^Kw`N&&+i5+yz*Et~FT~+N$;6=jJ)RdlLoSDvd zKuyQUxd{lvjjezLF@_*v2WI4TOTbl`mYV8`UmPpRm9A;ur1G_3IcXz7XxN(gUfUvg)D->0hz(jmN2^!(5dwcbtt3f=BK* zO4PAdDS`Qs@(ODvX?8Cs86a!H=lMp+ zCb!sVL5E$Lh8DVP<3@`ius~(+_8&ax@(+%}aBSMRiNy-NA#9FTF_pyA0=ECa0a%VG zcA&Fez(;9W84+-cEsY)NvEwIg{=!9W;ZVeK7fhS9O%jVo!|F`23m$H6MQ0Xf^A|62 zKtuIfGXPd{r;f2R*Eu3FtbP{0NftsSu#RU}T*e}us0C5cm@KZnEb3Y;<6$|)Hfd4+ z%TIg)R;C@-_Dg7aa0#)S_hC?@FbanczKr{B+7^=k?86^?zm2hzuf;V~iOc3RfT5|K zbUM_k?P~2Ll@9C|u0txFS^#z_M3k?9ff56U0Eg1dX;DR9g*(mTa?B0VmvSk^t43`@ zv*qQ_MVoir7H!>Xzy8@nb_Y7YQ%^l*itJv#X}ukL`DMFg+ZL;(|K{XTEd>THfyl%G z+}QCf=&F_i-O4!`CqPUP7p)S?OcE?4aef%aAe^@7`s5;$@Lfq^{Pf9fU-**E-F_AB zuR&{IEE8cUdkGW?o6wjCT@{43M(X3@f*Qb(Ps3i$Ey%|;P46?-lK?3}1ts;J!fjuG z`*YKV4c1msVO>=iXn_M*OXvuIEB!)81Yupn0mpvQ_!Q>lxLk^PIXUzW{lr`sv+KuI zm+C`nOT(cHUYpt6radDJJMAz8B24xzT?21jB zEsOL!r=NJ5K?bj)|#6uL|q~CKL!0N7*??;5a}=)VB<^d$<1Ow0vHN{!%(0X^F)Y z$%U`a2{5uNboZs+sryUP5^cx=%q0N;v7Opvh&9y4Ow6IA0zTR(mQX-hfLZ+`?On$5 zg|_gz?UuJ=s}&Vyl&C!k{JXqlb;!9!O0&|{PVhw?7g40u0SiP}aFVXP_@std)nOweXxz$(Ik}9X)F5A2b4+xcF(6EXnl$%_e ze{K9@Xh#W5uB1PCd3kK^+C_nBNP-^#Zyux08pVlJ+eby;&R! z5qoi1r4ehSa!5VF1!6+P>NMiI4I${3+rM ztad11C2i;yL)36??Y1EznWxd{gtMrQv^0{g1W*VwAP3YWKuGR3E%b>WrvxwO#JqQ>ngDpJ%@*bCrdK#B!v@9S-Gz>;bx!n|y5tJ?pz!U)VDAHVIwdUbU z_CftPGmg=pV7wBO5#Tc)h5_HB1OUvTyxXBi9wkBVToPOtTgfxeS_45j+pfIQk{1@z z?gs0}omYTPbQEw_dbWfb))^$hF0!_hr>yDdNt;ugZvnoqf#8xX@+vAqJq$2CSl0lF zHEy{@1wy&Fdi$)OjY*nxTEc6%^+H5_sy1>g8Z`XMq%o>;t}+L(0D0O3$RH{or(A~t z9(z*L!onm9+Ty*(RbCY90m7Yk6%#*kmngFc|UQm8Z zG3^38LFTkr!E{oz_?So9lnlWJE7g&J+b~Jh6{S8?-G`tfHZ)@Wys-UFV!@b+q0;XH zfnHM5jN@LF+ff@Ofj|LJv5hkJel{3*;^Y5a^`1oz(n{iG6^5~~Uz3Lpgmv`S4h zh-OW!q4a$r(R%d9TEO|DOIF$?o7dSTTQ0R#w_I%t-+GO$`skgu@e3ce+}p3Qaa^Kp zhmJZ{RRJ?6+8gZG6{U8D&$q-z+T~O+x%ms9wGbdlt&)~9h%_Qb!6wYNYTW!k_{k$+ zaf`k5+~aoB zjknoEJ!=h{9*;H$bd;+eBnFYbQR)}T45pbk5r9-}&Q6z~C8>JIY6uAGo;-%lw#$Hljl!b10bhhX8AH&NeRQc~iW$~9}&I1iCzKgR)%nnTi&uV2Ud#k!_s z`nnaQFLj$8HTiXYFs_Wps~>-;$*=W&f9UfU>hqen7mxq39&jtc|Jd1Hc_MB2mCatR zz9Ir9GBZ-0tFjv--3Du=V&dq7PgC4sgUEhW=dn`G>!(Bj-i6suCb9NK@-<>!-IL<{tkhn#cu zRTy87-TS%E+KMF$3yb< zjHXx)K`TCxM+zV&8qhSwYht{_F3NBUfGPz_$&sTN*IAZUP+*51$K?nZTCsVv_0X>8 zpMJ)oU_-WDaRqEfu2r2lX`|>_L+Dd0Do7E-W?>m3`iaJNYwVkRn-7N&68+AQ76?|3Wy9< z2}DJ;O5ZD4LKv*D+_}>*Vqt9B1mG0Fpc>cw0&<(l5z5Wr+`VG$Ini?YA??HUeR!MH{dS=;NRK6d||T7m5_V%pZ4yvAC{HcmrotGUj>G&fvfIhQ~ZM;-*4}I=eva1 z91xEIXvP4JRen+t++g0{05zZ7=*-hz*tQntRR?+gT3~o5p&JJYR=elpA90%vZ5pK| z)Vk^by1MukhwF0w)@xcTwIPTC+{xoH0SlR5RK%;2%@EkeoDh>2#hMrp&}(hAV@Hmd z2R2W&;uTDy@%QlgDaN}WovW%+O*1hiVR(M`E}MlkVcD`3^naxTeYs>EXm4+Gb7>j# zuCA_*5~t0!apOjp2wUm>nE0OGP`q+}A99_J z-vbwc;eWpm|BK(C#rm~8{)=DxpS*nnU=hJC*N?t%{hF149Od+iu+wMC*nMJ@SP*tx zxt-@j2$fGbV|vLYt6enk@smd_h23`!fU>Ej376QYEd?~H8o-&eWmZ^ROeAoem6QTF z01(sc_SsT9_Gt+5wyKo~AQTqPv1D9iqb#^d1ViW^o|GF7!=yz|#@ewPEVfFiA#IIg zY%q+G7!XC$MeuVHV=;lYDI4H$-L+e7=Q9V0WX3h<7GPX_Tvzn$Sui7Gwq*VSyOW)F z2Pdn;*c|Q~C*Y(D4JCQYdI3>@ogj;_kAQ$E0H$>U*wB3i*|p2fEjNycGI0V<*T{EF zh|VLQTmr0SPw81JBnq|`9pfre*Hk|9G+@q)YqQ86zW>{H+k4(=i($uxS?t%|@kX>t zV|J>e*|y$tv#tBkJ+_6qz*pXWqZO@Ni^z?HzMN}Rs~Z4l3UH;|a~_`bQR8=tbC1wR ze#X&@t7q=bH`oWh_Z_?BjyvoGEK?UiV+^o12@sErOt9z)+T5wg=741rbP|9aR0SI8 z`%-b64r9E1FkHX`mojGp_h=j-NdYD0$B)~i-}$a3p@QUEGkBm<;i zQKQ&s^y4ZH$2IOjpBc{F3dhadi*Zdt2RSuGEos=;33Rc3u|teyi0=;2*WqkXf?~!n zf)Vt$HaIE`C&MWB-i$tP#@*^nrF3Zk#R*t%RX+)1%*L6o{b zvzTjvLiJ4;jARIKl1K!8au7C@JwRMbk3}3hYh4dMZe@S}fE~K;yLSA+M{Jb9AThI% z+|$Gusb;PWe;~Y+0RBg?a0)))dO%o zegEH4H+>!5N5BuvdH}HJ#|7(W+*$S7KkxC=~7!Mb=Fd%$i0l0tFOf}$Lp>KWODw<2W*5uzzA&EmQ5RMn4i7`kL_WHoq(HGsUXDCwUb}( z-~lQ`03_zmN4JGxP_gxEuYH5lBtD6zYXjw#GFh%thxK(f;30Tl> z3AB};O$)2a^2v?-;SYZZCcb;NL-yG51DD&87kAmo{rk{5c4Hhd<`~5w*W}W_a9x>~tg*#wR@<`c zuCkmp%dHLreH_ zEwb|GpCMT?Y^5#-FfE&g{YSrun>>l<7f^Z&%~BYeIxlW`Y4ySc4l!(UC90x?fV`@` zNRm)oJWtk@F`=>x1}q{9rVsEF;JID^c>c0=)_dxdr4|&Dz?|sggNJM`U{JvY4X{k{ zuuAFk=2^ZZ2G!M8_4Etm{>!4qZ4u`pVfnEm764543h3tK@-xZCY5^l4_c5+15=PpC zdopa0o*N)F3rr{08y7s|4Vdoh>9#yv(X!TF=IE4MrgEz?uHg!(VeDnB1I%eD_g zZR469*yE?J!)5>9~vW(cAvH2L1;N!Y9#Qq#Kj9NZ`oqY&q}r?wj-()zW>lMn_M($ z>xtCgbj$TrVTrNt-+Ql(113F4LKL|h2iTTZf*_OG`y?3y~?H7(Lz>@4wI9aqDd^S7!{tLw>GX zWhDK8Uc$S$W+K70Mx`>hSx-Wv1TgXaXQI1oc_wlj^%1Q4mp}X0_R+umTjUqq_~#DC zsxcqb-|EBP9Q-XtZj62uo6ODPK)dv(k-9%5kKxT?<{}mC&U_N^_9an5P_qu;H_dp2 zao$M!0`W8~JkS|EViEx>twYprXG8ehOS|mW>)v2XU=2%7qvhRt8JqD!7j&{^>sIIS zIgTFj=9_MI9v{_7mIp@f5&NhTdwOow%Hu7FviK+z-hgc*P zIk$4<3YQzL0qvLE$jXa$3IX$MK%De1we@wbekUuRTNuSe$Zg_fK@kHo3#PD}#eSr^ zmXdc=so?p31x64tn?5Js5&$sL5^7OY)Se=cWki)PQQ&4kMxI4?N#`(gay#^ z9cb*JbQk)lewZG#l1eb1f*`$#KAwfUzPGO4rI?w*Xbc`bW^=Q0tq<{kG>N!J6leoj z$RLv3E%f{&S86=|-dIwRG@d$ht_lSKK3sDU&0B;F9{-6=!nQes2Jr?Mcd3V6RJ!Jw zK)XtH@pem1O9NN~p44R+7HPzW089A*fl(OCGl0WsbbzZ?uK|2aS=~!7SyN{lK{3Ua zm6AmQ@OmphfX;DF)=X|c#(%V}4d#kq8Z>wz0J;nM09b{g{Zm>Hxo8E{MgYvyu_W## z7(@%*zDnrv&Q6=qR|yMe54nYy8A?Yp(EK zpcT=%00~|S#}z2xqzXblz;Pn;RPKLO5E)|rsSKn*mRz?J0BaxLA4w#%H&Mh09mk8u>`J+vdB629qu{>orsxJGG3)J z5eSuQOgYT7?266XzWqvqTB7a8Kl!;!gstcFUV%da;ON9myK=`>)`6{P$GVk}*KC0I z48l^35ve-ZNIA6;0YUUz?702CT}0iov&Vpk0hqiX9=QnRzVTrrw9|KI*CGrU0X4zU zHCqyTx{f`22pk|iN^XYjdGZOn?v|TiPLu4{U-+Wiao_c(TkXB?zT0lN{WjakE! zT*C_l?36P$-MH|YntHABR6UX1Xd=m%7r>Z!WGFEtU9h!sy|tB=S|sjngUOl1{g=;} z^}%K);wDa{4>3(>5J_dEU>Dd@df(Q-I-Ee*9|IFOO)foGK?A*&Skqxu(qMf2xb(Hb z2w*tma#VU0jhh%KRnL)bPGd5Q{C!HXBjBHslY^$S!?7pXfJ3DaX(~HIr3tDw0IFvd z7FhqWlU7wzX|d@^7M>J`O`L-LY@)hN4s%P5^;m6Xxg~^VjN~NMY~&vG^bxSZ#=wsl zP7&~mCJx8gMbVxqSUCKlP97kao@({_VLh?dTswdZcXt2=M*085ernvqHU7LV-JMJA z0+3`P(g1)2{VPqL#QFML)nLRh;UmP&8D%+{IW9HKD8^U!Q3ji#*#!0Ubay-11s`$l zM77VW`NVzbfGP>enc-X}?o{qEm73;5_E~ zrCpR8*#RK>lRvpvxqiS9=)`@WqHG0P^?7&AfKxHTL0vcJ)}ilIzYtnx6OElVTHat2 zr)sSC`GeN-`15x5S37OrPkv#~Km02@g==zndeTys6xgDxH`(GFuZCd@Sj~e!vf5pH zEozX&-eKGTeAiiWY#yztwKlFRd-V#t_CxO`>^YTa_-c3mD`%9gakv#iu6>(HGx^jpTD$MQn6Y_J~9u-Zx<$Rp!@4&Wz}4dKT>`?0%5B^P&T zSX8YBJ*kFMwSof#;wh)(76Nn_Q)Tsni~qyvDcJdkXE?2{k;umgLpzqv64($&|m zJ`^;>?3x)VUXS8FVWPSFLzy9B*es|9`LJBb+*3&;^`4?Fqio1y*>oqcmS~J7U{7^F z`3N5Kc*v6paMhX{#e292`j#|YfIbE8WpSTX5>TbQgqkbT7AkL{BtN@%?{>eZ;N3YO z?-1OVN(!vv1O}$0>@1P3GrM?|tSf>o)54~bYF@ri z=l28tJTOYq$xLEEm4YUg*YrJI?QL%NEVrUYLX4pTQRGf`kPN0tuCIvztRf8L``-Ib zk`GVYk^P5Y8{=U+sd-8p<$9K$^1iQq6>u13-B`d@hN+ey3+y`qA7~0;ZpND$ERpxd zLem7%tc9Wdiv)1U2+s5u5y<*Y3%!goh8DQt7y>yO!_i5#H#88rjaCwdp=94d@+97E z9eWSh;}8FW+R}I1x;NixrALq2S3dtG`|?-5ZQuRj5A4C8{@iMs8Z8xJ_&6Y{jXvoF zFjaT=SUn)R68+8^id^kZvyyr4x@Vl;EutPOj1*| zzpK}L7_v^J0FfAe<-!Z6f0JMvdTVRZMx|OchBJz531H+#0c5FEf2pdfbVgR7LHP*1 z^haYwm9BoK=m8zjW*06fM;08tt>v4MJs$r31&(Ntt>7F9*WgeY}J zGCBDa=pa|ESP2sQSyy!>Y;c6lMuR6n)phKIHPzHxUS>A6g40}ulxf;COGXdIua!3C zWm5}QAcuJnpx?rHUbUj({%E_G6eB$@B}o{JGTaxe9>CNM9ZWNGOt-6J`ZT1pU#v(N z%&^?0j!A=Ac3{ul*?=#u%el}5Iss5FM<8D!@Sx3u<_3Hb=nJ3;c+;VjB7T_WRv73M zf&p}%IOcmxO|A7{oHGIay(CgrguAqZ0-E8jk`Cb00Z*MA_M7uf(|#_@Ful=6^s{WZ3Ze*bG9&!fw(osytDT`ubn5z4iJ}TY6-=5=s9sqrAzvDK$;gg@Rs9fX^v||D` zIAs8UaN`I-O+kW(leQlJsBOt2_dCIIwgdc6_SfAKs!*$$8yAN4;ON*6t zci5h;4jbh9wvyxUuRnV)dR*qXbewD)6m_jG^OAZh$i1V;Yz2a})Zz`{nrhfo4zhWg zpvwZRG53Dz9vIIk7hI(Iub?k>Ms&4$$c+L&H6}dc`knHL=p!|!G?3c3$Saec!-j|N zQ~p>V8)s=*#jcMq$H%$X(}-qQ)&K!xF`A01M=;@}68(5T5?Di-tehyEic{roE!?)1 z34^k~8e^p~IXv)$&-&wWez`y>Q_I2LSt7gL=?gYg)(0#ZdGB zPZFC;t-}JR7mq*G1OIW~oSzN)`KNF=VED>L|3|<7z6)}Tg%*rgJbvH%UQf?y0e$sD zJJ44@H^UIoMJxvHaqc2!u2l==`Nw}eDSmtH>RomDfA;uePaiZ;A@bUxznWWI1lvco z2DEc!<@M~26EWgBut?cNownNmfg;MGmVkDp9nrGtW-1Y?7R=`67F!8OjAHkG>i98R z533jjusl=UfIYxmg(H^tM3Z!Q7O7(3JoxN1ARsd-)7q<>+;z*4N5abVslrG!yL6(5 zrvM(_C<0FC7O^cg)pdXdQa9ibjK)0W>EsL06{u|(P47UMOns@LavRV4_GKA$M$%rI1&~Q3z}y282h;!w^{Yi zo+S_?$~NEec56Fu%pQK=hZajUg&iOHkgd7a`*X29!_mw60ik5 zxX?ZER@paUrw9Dj5S3&*+o@+7k!+84j@q%9czYh>R2qtaO{Cfc*>+nSaUn&d0yMgu zTQ@42C`ADMy!k7w4;OF}(YYPvr-}TEZrAaG=@f&DvwWuVb)^XSMHTM9-araYMCKMXA+LH$X3u%^|pHKNQqy|;g zWF|#T*4#YCAlzz>9xM=;L_ZI|=aZW-ifso?%YGl8(`K-Xm>lSZDwSi}wK*r}%q_DAWLR zDw6AsCOwVF$_eI196>#CfblRkC3b>SU?1nl%zTc243?|uEzwi zlDNf{8pyq$`^1Noz#GC1N?=ro{tf5n#P~4Z1yjXCHNY7h%E-Z1(HGJbD}lV2L*=<- zH$`+fTrt0g1Gpm@FAoSveH#W4^Kxwh&jG%73jC+spy9qri!UVo$tA^>vVOj0ZCOPb z##NTKj%qoD1(53T7T$|S_Ju=M{o`L*IV@oZ?atb8iDkWEhk4knHT?7;OKESh#dsAm z(wLjI_4agWl^vTV>G@rE*|PWEMczcpIr<~18O|n@%}F4JB=^%?+q8nLrU($}w771+ z#SAk}0I!kqvlci}VzbCRkU#0O;;ek@CwQx6R;v9dX}0b3hucx`>;HM*TkV#&+(-$` z8Vet2AR1n^l}U#)olMFaK=P#K>ln|gMtidD124TifL>P1cXT+_lRE9o_k6^HF#V#k z{T?=_v^5w6wsF6Pu~vlW;6Q{nAOdx;>*xvj7p)+j$o%PMBNrp{!RAQwA*L6=sLv%O z!03`c5{5Euc8d9C6YPSQLJ7wsVrE$!>k&S08)h!dDPGFGn{4CVL2B8bay8TwlcOz$ zc{YeXcwX^*^xLhhqvN)yXaV!gkPA^RZ}}>spQ#p9+emsFG@xw4d;s0j(^a%z8}eye zy<#ysaac$U0ClWr=>N_k%>BxTT5%q8IKV2wI2HXYdN&}`_CWTi@)c~euF8v z&$xBm<9xec`SbUD^pF0OHjA(2p%ZJ0Up)Q{dSHxb(p(Y{D_BI6qaEfL-gA-Bfqdydkn>{oHYWLa&oeq>qsv29{O@YQITU*he`Pp4XZkY{!VLuPjegPz6dNq&*;b1 z9|d4huuBUDG#YlI8zw~cl>2e>&LJRZxVeS;wX>-Q+=L4^)hb~S(s3DgQ4vJ0@d#Ln zAcB0=_U(aT(|GHUj)*DX4n@EQfP~VO=nc}ExwnbYVkOj==#Z;P>#{0h z=zW?etkN)E1Oqu17(0eh%!d6?y=B$KmV2~@=;Q)itZ}eww1S{;w0W`snjf6A4LzZ& z3(P!_E=$aX%E2j(k8&sKtxEE(=t;3QO4zOi*Hwq1rIQ#^ReEs@7{JCc!n9AV)@Q{U zN?WN1-^4ZWS^cJ;T#&9u-=}mV`dg9jeg-B05LU#xm=&>VV;J^0HbJrRagG^{2V{xC z_K?;kZ%%<@x#SX;yHeMnfRzwqA3<(M7n#p%(r3D)$(m>Mo#vrx6h^`Ht7fitXU@$_ z`}Exo)TsgP!H@F?Pl;I*`zKaV?Q_+D7!GOO9FwSPVw{ziQ|A<8to)$*>H3n_1q21S zb-(K#)%%d>a^$=y_ z#v5C0x~<1fu^zO7kDK|jd%y5^mQy?zttxei2~LX_aArfHzR}6#^-x0W9_FC{b!~H_ zOR7CZzmfIY-tzX_0C`kq!R_wF@=FdNS%UkpYpZ^xSLsj9FO8qv;)!@&w6^uKK6NUG zAueBea&X-9dDb}?da>+70NuvAdhQ*xwRj8Usqyi82zPfF_rWN#i~t^sXxP0WHUfQY zcvXf`@}MNx!MeISmpof~Lg_z?=N7x*yxO{2=PFi;uzmaXI(bl5R<>i_K2c~hY!2L>k;T$RCryBh{VqI_4SsFD?%!4AIFmR8VMZwka5$a7F2H9TQaHSbfD7+jPYyfZ?>Y(2ho2 zu(JrZ=q9(0)qc0}hnO?=Y_D{QN?zIB|-sHMo6guM&*6)}gH zZE|poppkyur7_lk3?Pp7i~tZ50TM|7jmFY52;1XnM=Lq@VDvC7la)vV(1kW0Blx6n zE-u_!i%8F8sDd_t(I_e?#1v^7DDD~?h5=KaJ*U0GwK_!~${^W?miRC-pmL5@@qsB4F!+y%O(>1(|*g+b*7 zAwB+{0dtxwGiF-Ya|S#)w<=G{eR}>l4+N#R3t+T$o!Uf9iF9Kl;w-BSKn4&FpqgNVmPm?`3FdW(fQi`HIJYrUgCclc0AL1y zkupa2D&Q^xSKctyh=ja#FRL8_F1jDwrR!4v-7y1dHAXb_T)zm|@+JX8=C97Dn&S=_ z!iXwgof3H~D97EaeD@464 zia`wm;IxJ|lf9sgb~6d-k7!g8G4|qI30u4O<_}bVDAAJ{FPf=Oisgc&Tpp8eN$7Dll~~pn5v*C3AUs_H8r(P-cwXm zOiO_r>GSq6aPl!#{&zc7~fpebc7REKuYDWQVK*P1H9t>S2^Z?z;p)r6a1TuXDRnX=-Eu{D3sELtYp`Em+dvNH3=6 zlw5iO{ZI@bLuqRKy!Kb`|F|V$5O%(>%O=5T_?k(2JC2Tq)Dy5@pZW6V4Q|DnIp2wv zMvKF>r^R!;t;?c_T#dq&OkM_Z-=TxzbHn8H3&*&JQ!QfQ#trt+?q}_dw_k7loU<91 zVHY{jW)~LViiRJsw?a!MCu#(xq0nc8-}$w@Z(?F$eD6mOQbg_+N#f-fiWz!l0AFr<03n?=YXXr zB$2-6h-D>{BeAr?a*3`S?-{UBBDuYC_Ynm<2jlgWRuX)2^rZFRDjwLm*P5T*WA#tGXpN8WvXT8~ETMJCqQ;pEIV9EJy4a?+Ewi4} zr>ti;>8(14EHf|H(h0WeeR;3-G?K^$ZK($^R(_(?1{n8&)Fiv}OMh#T>8UPhxzxWN zG>tCp6_*@IpOJi!5|(WI2Jiq(A}3%u8e!wu0cZ`KAi|!Yu7z2JINiw!ihKTObF=M& zm2YML5|K8`zVg)5Hr~}v?#Kv>0WfRxqxnn6!`QQ71k5QVQZKs#(%gGBHZYn1Xms?xUbp$<(SrMyzVxxX1uKkw0IDMITUeX2RBwNDJM{!2)VBUwLE z49=mAlJu03tgl{xpzdKs^T#0f(FQ^Z*xOs1U4F$7@(V8;+X^;TK2q}}5Jaf?qe?3Z zB$0kx0b&Y5(dJ&khzk}hAZoeY>AV%qtPS1-o57Rxn_ib5@(pje20)IiCY&!jcOC9x zF8*`D_P}|YaKT>Sg@0jMaQ@?m7Nw$sTx#>?xuA*0mR3s75tYjVuyEcyXNXjAUG57B zl$C-1&|!i)0CI8(w&H?SG+R+ovCGTWkM1lD)+w1Z5GPNUI0G*5faO6ClfhyKSb!Ok z=(&Z3UhIa9vZ9*>CRFlCbz*fM_c`r=0T2p=P@0o543E-$sPc&_qNrq-fXHkN@7;I4 zRkq$9Le#Fx6Dm~}$#)L|Cf07+U^(+Cr-pGmKzfP>v~@}>-HV3CC*zAzj)Z|Se)qrt zNjH^<4p7OmFTe46``)8JvqVMy5(sj-sl{4``|aTAN^6Ai31guZ=)ff5#sLiAB0NI` zUkcI4vGa@V*Cew};u<#IajPX3=Uc_zm+ipwyX-Kz)}H;B@7mGFciMB`{l3-gdfDca z@OsNFZ?x+D`>hj}cE#c)R*CyY;2;(Q5DsvOrbON}NteTd9_xWM9H-4=7?)@rXUeQNJJ%Xcms(La5y+L5mI`A~f9yDnLYj@y zFC)0GQ?jy19Yc;c`ctVWlzKxDAROjn98H}-q03uHKTX5js0?2?zsq2{_hA*Ci-3_%*C z<-kRzGK*bJt;`?#0A@|BNi>oJ%@r|sio}#lRBd*y@N?5&Y?jN%CveC^QS2^CUiSy* zl$%tBPVP}4jx*jtF>11&GU~8}V!6ct%CL*!aUbQpGTvfp9D7D&ZAjWZ-Y?yi0BA&N zDvTEG24u}H%Et{1xW>>o)WCw#PTey@^n+Z{K|sck7({{wRPS2MXbf82A>4ohp8|Et zGs;Df%TU*-^htm?zQ?hn=i2A2z8ZM$p=+9HumA~d=a4I0zX=fPH??1X%U!9%!}(MR zhRf%g7+;=K|7eWG7&?H&duFbi;SoqzI{+9^f)4pm0|-xpG`9e^6s`%TPyt9GuDA2Z zNvqv;z`Bl{ww|(THZ*?AC1XMAw#%4b({|?3Cy{@QxoihXTQ=DM(g)4=*+k|B0X+v# zp0Rd7>VnHJbD0jxkef2SDZa5khqHfrHKD9nu}68+^QK_1dE!+u4vj^*LH zjwGSI%G6B(Mk7dseH1`-5HOCD*w$>@K)%uIktYyE&W6uPA~-*Yi8%;sNZ(HJ{16({ zvYswODaxE7^^&{}aX!21%5648r4Zd80@T1g$Dr$N&d4&(>R&IPQQymrERT(%{k6Fg zFjVkK0H#yY5+z4h5S8YuQgz9F@6zJ%H<5c5LA1U$>FS3O*v{n4bhO18)Nu32;C6lS6d{8&cgvrDsZQ+45!1#avlcZCR`p+1WXGY@+Q9n^ixX zT%`wFyl4^cXA^{H=Hl_^(E}HO;h+3C|JE>^HxRG>sgxq?)~s>vA5}T2sIFyU!W{}* zb;V_u0gOiN6d*#8y#jB_TX+DVqFtt3M$)P1dAS{`tE(uNw3GmfSW=4AI(CFr14Dv$ z1w#=>q${f~6(=a~1XyuVpco^8M7g3uEX+z)oDM)~18`#PoLfja+oTIqsu@;8Mnwip zj17ziIxGFW^Uc%_MWp`RO9#1zO6Ouz{CO-&s5DI?>u`4d`?H82MhxUzLdw;cuVV zLfT4l8|QM9@t#81U9xA7t-b9=baMmt%mWWteM^IFdDG3dY|Ca#dEi`rJk;V&?z=KmbWZK~zp_qyIKud6hNcHcJ2u<+3Q(yu2U%);w#g zsI=TU1=b8RQ@miYHJ%0B!3HXqS%@fRKj1Dzx{74n?n=rVz<8*SJL_uIMb<@>rmOq` z`!NnkPhd=@5dJ5T>Z1#`FbXYPB-gNa-yV9IgWsKt5u+uyk>-Ygq4Md8e)9mpeV`?= zA!4xPdUSPl1vK~qu@~oA5g9_c&wO$ww8MeRr)Q2nv#X{_%aF6oM z`MC}+Z_xV{)#=h6Y1QLBnvXMJ3J@t^$UQL)=nyEB@s|8v?3(K!UUQ43{?_*}U*&f8 zOiOdhxzKEmi#4VFL9R`jN#)=3;YyEV+(y{sXkO3e9vTB^NY0=%K4SvloKyGH0OP3} z$$=L!hFpW(=Bm}L=jCQq8=U@;w(~Lv?K$_5E8h(U{dE3Uy+=9kC zrVbygi{?#YZj8Xx523s5cxjJy9WSE}cZ)^Gr`j>rgOcG18)A<9^?mob^jncIcCLC8 zYb84o?(+eQW4?r#hy8dhstJ~B7z6mzAK^$@6s7;}cfOsv;UvZe#JX9<0I2V0#sTok z*tv*r`d0H!LndIT2;@obGqJEq%#EM|QWOx!bBSy=v{q_v%cbiWLi#<4P4f@{R+$1k zfI!e5n~+J%EX+k`NYEAY^5n_W+&o_N;tQ>dD0sety6lBix+($uWdZ^-Nmq7+oQGMK zNuBW*cI|Tgy@<3mk!-^1>l+-?s64Vt-=lRSlGI7=qPVV$$A#SkS{p7N7g!HymnjBE zMnyYQu^pFQx|W?GizTk)!?-zPNQ9gY>$G5AF>G6}1Aikh8FDiy8-5kq9F@J(BBlhX z`T6;7*LfNMnVpr5$UedL?Abq)16r#EJ64fXYaJEHhtz9v}Q6llT|7{?^{no9!# z`zZH@(lKavnnQ3z42Ds8?o`89i>1Jb0PPeYAsRR72+Y>4H(!e&-R$#UxzA!@6qJM3 z3x@Oq`qr#nZyPS#K)j#X-u5Po=R2j5nNUqp#Mwkz*l=}~`TM#ZNb+F)Cov{-cU*2C z{rsn`6~kH2`9txs7Kf|V4?`GB^6F(vSCI4@)&Y0n6yTI3WJDNZP%)ah1#_(H=y7X2 zQ(-&a`woD>h}Ay)OMB@@KPUg6#}+Q0XP0c>Y@2Vp!Di2$p7(P+XBl$^AD@&PvP+v{qlR+pc(tlVs?DlfG;3+7o5;7h73#!6G;avAbjr_s}QxOpeA zB(y}IG4?7Q)`b2t3lIPS#+>3D09GH2$n4|@YBuKqTG$kDE|mon7?W!@p1GkEAQPNZ zOr97s%?CZ?E|u$7+EW)~0l1M?OB)OqdCQzvdO$Dl5r9-VMFmwT;D~0s?-GF3{c&FV zC0DAeRm{8-kd!-BfXw9=6jO!K_sB>qfk1#r)ejzVsX=C#RX_KiSSVMjj&sRv9T$TJO~6n9 zohAvqy1L4=n{GV^JosYXuZPmN@Gne{?gZM-btu=Og17Xy%AB2lUZ1BE-8hIHq|a0P7%nLZx##bNnQmq&jWg*|q9?;#Swdu;8k zZ?KK;yWLW+rsQKH8o`<>Yk2l0YdCz;5;Dksuxzd+&YNr9FYLCi)8&?vk!y)mRq3p) zac=tYjsa^Y0ILdl#4PP77?LJn>yA?oG+S5=&hvbBZT+h$XxB5Dg-lI95jhk7e@)QW8B-o`e_6mZ^FDP)p zaDeqzYqSn8=^_>{o)7+H9dh$ddP6o8T$2O2?p+uExsZAQfIxr0Kug2L;{xje-K@HC z#r8>4BCDT+_6hrLBkXS5S~^&~LR2$Z&Xp4xT2tfd5~s0P$R(*oL7!KiEB#b7TTV`n zTPXB*EXGbzkw;IQbc;h2?n`OOw8*u#v^$q%K5l2_Ckz6%5@8jbD^2VO)+aBI1rGo* z4xkgGBLJauICm9bR+Us_j}#Ch)^HLgU=!QH#Y$ydjSjdKP*NnF0x60T_VOK5@W4g zZhnl`D2CAws1u+G;yQ9<8!T0jWZnb4Bv?jVKZ#Z;AV%aBhX9h`L%4tdz$}&EAO$EW zgU?c!hp&I*AMAtoyw82FG@(NTL?jYGa-L1nSIJn&HR~dW=^KGL1qswvRm1uLI2kX2 z5f5!1!#(akLp!5jC4#g`b4czsY2vh@;R`W7@RS&~^8ikBP=_LnWvKL;J1;*KDJ;g@ zNBdNpS4LLP3G@iiD9@tatLtkAanRn=ea_^7h5+#i$X?7CK2Ln8X z0iIo0%w~g1G|ZtmBnHYM*^kRu(bMttK~h`{dct0tMEmAL*Bi}qV*(sR9jk2tSkeeK zSV}6b>-PyL@Kf${=i1cCIj7qHhmVfb-Rs=Zc4f1r5o-&TVY3j^-KH355I4XovpS`EaF{nvdAS1Ve@#sq|6TOdXZ%M z)aqS8t@Ydj>%;9V=CF{>s`Q&(q%V>SIE=oY1kjJdzQ?gXbpnD=o7!7H_+g7FDliX0 zBLj@Nqz8U9#42$ahh>YzBcT4C;GXFr2ty?ti;=oS1He1U6fjhQyOk7CUN)+~z%$SU z_P+Vs|A$r&2KSbg-PA0b$7 z7%+xjlyydHocc){m*01215d}hm!#{{-(hS#1@2TUxs?FESp~=vV4D@pm&B%nn*vQY z8)zgJ$^_t>*=ez9BY1|s31eeB$h|+nd%8QQ`_BC#9id#qdR=W&wuvR=t<{>V?=2`O zn5n7U)8(R*Rlq1TT7oYpn?tzQI@K1XD zw5Y&hz3Ra|%Z*J5C5$@1k<@fHIjYcau}al9BFH9yA;4m_0{2f4H|lk2Ki2sA2>p(5B09XjlQ<^bBEHYyHu0dnx#y2wr?zK%j?Bp0AujPuYg z8VkDgh03h2l6L}%(YV}{)aw+_{p}E-qLrfe!_B0CAlKYzU92Fov2+lVJmL-Y63d~0Ktg}3@*$|B>D5SAO>;$ z2)N|0T7}=X*GhN3U9{xAW0stnlaG!YcDZ66J7Hc|s#O4$hSlh9qBmqw$msl4${wl0+{ygib zDz{jw$F#wKreYM&9z0~}uvYDLwUoF^vF^GW7|J3WYHozd%EU!Wa7xx}0tUzfNPa-I^=uk+A(?C-Ixxyg!mV26s>iJ0nrK|nE(nBgijGu3 z)wt84Nyj(S9Qqmd+V$;BW7NsC>Xi?%n|e3xl_AH-pC6xp_mk1a$>|;n91G*2yoe!n zw3`Y1)bsj}bIp9C`&#;)aprp+lL*@=c|ia-Xn@>$9>y<*{`Qbp(dyf+{-=-G&Tlc*W+(8?fdR%c_A z(~BxFCS4mA+TG82ZzrWxko9Jo+^O0|Dvgc6&qxnxsQ^fmfWj~UA%1#TvQ!(asIvOK zdu*)qv_&HYF&N2-mOd+IEb6BT1mp7V|Nam04sh+Tx{?g|Ndq&5X3@hOoW||!2NZS! z4qKVq;egS{cRoY9BEMaO&M=n0wGk1>bE%M+qlz|H|LHhCZlpAHW1~5#jgZ)KWpj|e zSMFn_q|pXlG7wG7`r2Ao1;vdu_iPZ|a}4XKyena>t?c;u9AK0U?+Dkc>L>M84SY9l zXx4HCm`GQcz^3~&fj>oB=jgX`JPPwztK`-eU`%Bl$<57keW=P-V}M~X$f}+VGwkG5nIQ~gp2iMTI;o1Y z<*pd}r5iV~cuc$UcI(%zcP`}v2M^jpcAQ#l>i{0o7but8CF$_1-L5k}X-b72LrUY~X-t28;s)0)cS23E`4( z&!yyq;2gjQPMjF9!Bv)po3PcpR@z-{@4c7VGBZ2(`}}5CHim%tB;jI3e|xpNvortl zEARWf&)Yf#8nHB`1ZA0~Vui~3R*Y9fU7{B|-3Z15u zMKqvrG)T!8VvpYQ-~ZBf?7ZB%IA<@Pn*^*3q5zInH(Nb!&j4fe^1g#GmFoc0ji?-~ zWWEAnSWvaoAZWef<^8saOyh*ILJ;Y&HIs~T`0=O6j2yJfH*B;kZ@JmF-GnRc=IiaU zE4Er`NueFz`<(56f!@k%*V~-jeES8g;=IfZVt#V%@a|`9s=!uM_AqC=CHJF{8x*)MZN+G2MVQ=H;$;-Nk&xkk~Wg zN^7`yJkBGfq4lG~#Z)oZI+xte0bEw+0NJr9t_j!|)omN)9y@4b_xwvQ0iY;9f@@Zt z9^e3R<)MHCB4@yvWBvHqxu^lQAQINV%)LrUalgC>a|Jj7)XvFFv%BAWx4rYOcMxB@ z(R%1M6AN3YL?+dT)7rYA)VN3fzi>E!ID>-p@+@GCeCHZ~{7GEM-qd89w~5$YvS!Cv z=K{cK0F)TAP=_e@kpOF%1W+9ZoTLKyMu=ynC!Xs<6T|DnJ!I|!8a1y&%&W&e5NiyV zs7q4d;wpoqBpN}uSx|A|`-MB6{echgM~#I_*=V2XyT+0yyzskTQ_pC9S4f0ho|-q+ zIE@Sg56|<6`PJ`yb6>B!iaVb&#KSOS0*U&36yX@u5_fUM0p>xW2`a6W6bC48=(Lx= z|FBgaJZ7tjcV2zXcDFVHBzHCLKa62GY(<+^IbhVdcc0BA87CbhrnRby7~y)?H71(a zfFQL3hcOtYxNi^OJZet1t@+dglx`twoplx>=FSV4Maa>$gd{We070s-f{7N3JAR;! zun_iVKE1{lVmw6=($P!ltAywzd-7~0C2V+x!nt<&EjLjgQK1DAMeKPDXfc=8KLRT` zX59d$I_@DlI^G%qT|F3@@rkJzlULd>MyN82b;x+p-Vz|!KA8pPvjZxSr8qv#uRfPa ztnD<$g1Y-;QXygzVCX@vs;rgf(+5Kx#hURFPpfiP>KpIkLb;!=)^>}9xmFXD7!3WE znkGVd=tYlFFYl4AtyYyyfNUAxlH&q{$r$uy81g4hp5Pghtf;sI<0_u`@phJLw*!I- zL0G+Jg_~17*DP}=U32NU_(mY26)wK#`Y-)N+Oz^q%5;-pzw*i}oWPY3QYM;QqFKZj zsy z)hXO8pi%pQwnqKogcc_8o(`W+;cUIL^EYvY8zW!>`h)?G46E=!;(Gu>Y+oH zlQ-AZI&`jC6|qJ6szgR_brb!BkJzsFzt^JF0*>(uZDKTDSZp2)T0a(^=SkF|Ge~V%f$SW%@ z0N`N+p!layytB#uYc>?6w!tu z0hot~1x>^yC*Y`LkPyH_%%Q#m$2dD+fUgJ!j3^|5qzEw8)wyrp``OQa%69L0+`jhJ zzp}4><;(U@4}QnCU2_e0CN>&yC?(0y?qILzC*AqXE5G(#e{`A4dJjJXr&U#k0?unK zX;F#w^0No!8V>*p4pDoN1g2yFQ92-4uFN1V_e6}OJ{Vt>aFRi$tkY@sRtz16#J2f~ z;fxj#hc#3@rGTMa$cl{=$kt6ooY*oKd;pyqKfOWUmB6F@ec_9JDEXjx z&{*mw@?vb&P_OXWM;^8LgmK)UWHRK*V0EpXef1R*yMnfmwMLa@N;I7%mU%A8IRl(m z>jR^NbrFV*RCf;DP6aGlFW`1D{l_ygWCi#`7{h+nlfo^i%*?&OFvH{~@vOb<&1t%u zq-6l!0hx_-Kx#R4(gv%jHCowd<3W!d>!M#d4|@0gAH%o;5NfS31llvY4@15L$fE9t z$*qRW8>W2C)z@8bKYe^R0NCs^pZTood#v%3ywsQr9J(VisF9!fSB8|6)y#D?W2G2b z#dgN?3=_!6IAmc8;E*@Dv7X?X$r!)_;$nAIgxbfNaZ|&>9HDA~Dn%&fu@_^wm#!v~ zvmyx6@zkh0=~E~1_x-V5D#ZB324_6UhJ8#kbTy&nQ+SAA@$P<< zH9eUDGD(24Kzp}*PkgiIsZ5+urWjJWF~z)0&w;LFicxCj+^&kL^T?>HHduFMKCio>ulf@E_UOO=L6A;wUL zV8bjh)cR9gpaYD&DuW~j;P>=nkK2bo{(!yo>VA9trRVMQ|JRr7d;j#H&CAbayl~a& zMBKAu3PBnX#!%oxeC=z814@8PfkG)weNIU;a_w*1vE4rXXCHI1k4eeY=uC=-G0CzA z{`5~tb{ZnNB^e-|;@GkaV3^OVRFB+rYGJ0nRqi`KhxO&Ij&j%E^fPNTd-Eo`d@Qjx z*sB1stD46i6mbAHX-;Aq$x0*yw6>6_L_cxd{mnJRxG_&@Fquj!>BW7nBSB!DFb2gH z3XZvC9<43y34s!ayl~;+KGq2T=40l*-2FwKMF7?TJqNJ$9DI^7)pwmr-{mrn@Ze$; z1^ob^V%s#L%%3~~`f{)9RgL%TF*`Oo-^|w(7-f<#X2Qk(DvlKgx!L?Q3(cciL1q#y z0&%}nJM`KA^$>Bp0lWI{w{v3R5*rC|IdsyJ+4HH3i>!wm=#tukgnuL^5#kU{@%x4v z8#-~!g_y*{?j`c}Q2Piyl{@Vak6*a7*mmA=7p`QORpt=t))kb8=BDU7S;V+)>&ONk zW=@wcUSi+-!9#K)*yiKgaL zrGGA(5zzX(bo@I3Us#Enc*k z4gn{v1kkLKA1dH1P!a=34f1n{nqyG_lrz6P-~z>00{qs!{btKrwcLETbi{Tl<|z)4 z9e{mng9(&1U$B0at>wMdfbiPgyKU8#JM0w9WdG^Yw)MKV+1_WK#I+S=YiPxH;um{i zcGGZ6`m72-RYt+_dOjx?em^du9KdKjbC?Dw6nmJJm1&)g^$w84!5jscud=*6n*%sW z)F7hdwCRJ~kH%PP|HAscpuOaZjDQm{yvke@Gb^l^0^ro=nHC2M6&K~+JF^3HE-`pw z6;wA(#eDUCxt`}0mswSHHA?gcB(i+le(>OfFhDV`U#rfiwSqQvz*SkYavy7rij9&o z)cv~ib0fUW7b{tx;YBH7B`bXr060WG|^}J!bisXl-%%j$@Um%nV&hlb9 zyB=tEBs2_y%kDp}Appw1e2K+m3UdprXze;$qj7Dq*0>+X0Nu*UPs0T|1sEA)PsMUh zarQpm7vk^91$mZBy}4Fc8saM`=nc!veJhqzOr2O-0b^Htkmu6xQu;ik9+8_6bH_vJ z206C_WVmvrp!wh3r@)(I-({HbMzuDa0Nl{>81M=+1(PN>ek^M;X67rJwW^Lkv^xiE zu{IcRt#xO#@%*j~4(r}s(+xa73X5tmcsAD|h4(wxGoRIX#d)J~-NzC;=eJ&DiF!__ z^Xv)81W%Cn66&${vBz-nCfJheujQFYnj#^jrM8aj`7-k%6KaniqmMhuBAjys@T^2S zW!@&nCUPr;s1Spw>|77e6pswra@%dhHILe);xsYh#8#_=Nh~)siXj#R+-aQp277Fh zxLGlt>C|_fOX(KU%VBy+I_vDVJ;zR28vyVlpZzq99PRG(%o=pYQguB;fPX&#sT0}K ziwvCLPouD$Pd&3&xY6GCf%m!R(WkUf6|NDPBhAxmUpgnZDx@rpB4NI+PX7r4JMz+@)C524TWgz*rObby7t0Nwn^_Pl4+|=Ccm_*gAt*WXd2AncdfJ5z-It*LIIi>(sv$DvzXHRM$ zx>}ZcF1Humlj>h8bUx6htZ<1qX4?B7H<{LX{hP+;)y9!Dt$S^cu|IjE^7 zB`9Hpq@d{QxNTg8Tfjs1Z_+$FcXl6cMcR(xo?2X1KqlX)wIN*N5{N57II1V>xvKN_ zr=Pf=8d-5xi?#U9J8!2PMV$@zqV$Q6K>v*F zEZ62PjGH42m{AEDxksE(#nSAC*}{yb#0=mNu+lfGf~>?mA=okyQgU&K-ISFc;Por7 zxZH~8Wm#1-MW@RvQS?~G;KE5_{bH$uw{X*DYv$39OpI8$pAr(C)GTc4vG`uf(+rc2 zk}zQ-u#AaV_?}Rb-T1x_+d;WwTQB1g<;H8c?|z2hK=1aI6(nm+n!^+v_3d-b+~! zexK&~1Jn@OymgDMMCr{W?)c~s=MC7h_3NzWiRW-{lKe!>7(A2%JBk8R zNJI>%NavdN;JWszAPUNwIS++#bNeV81K7#Pr8~>L_gTH%et_<2T=enWYg|$aU}qE~ zi-aA3wBkJHQA+vuJe0Oc#Yhr^AJOCqroF2kGdST1^n}{u=n@N9j8(sk7B6&W=DS82q z1Qb{_;Q(Ghh~nUaO!qY9OvVAI(TrbQfUyh{@5lX!QI29RLv%g~4v~0<(UQrUp8&}9 z)Z(HXjj}xtK4jN__c6QA&$aN@Xk8TGjqTR*`Yo7U#1^4(~VLDD#y} zhz!q|hC!Olz6_4jFFYyJUcryMa@Td1y7xsJsyIa=iq_wg|S+c}_{`1FOW_=1Jxw<-s*t2FOg~bp9 zN1V(rfT?}u720OD(~@s!!cr6Iy$oQ?TQJ|bpA(W&!P0W^E2dEfOJto&o=6Tv5}0`L zcO8xif8Cp8Ra`jUjIzA&=HKfFUFHo_@_T*$Vt@0$2@Egx2mgh3~gc(^YW&>AZ5Cx|UG+BXjDP5zQRi}ur5eQqlYzYhxojlG}IM$=E zu+X`>^j>ADojiGh%;fo2h@w&LtV)>ylo5+!TuwUL!qmvY+l|xd*bImxAiMm+PSxi+Wvqfwx2qB2FAhMv1tSl})UI z&JTU}n=sYKVGnDpv9+6cMOI2KS20vx?$lW%?R-By9p?SK&v!4}1`76W4eVmJF>ws3>O&h#>OshO0AVy|@7 zv^e)>8Zo_-7(at;u*OVC3W{1rllDOTjBl6AX#i2Q5hh8`t=BZ>`a^6ibr@m9G)6vv znm|{Wgcq$zzrZCMaMh;uwqw@~wsg%hn^!c~qPT7#5wO9@{G5g;2x|veX}wGV@U&+I z&ebQlY{hchKzIb0)4aH6{qz<;ce=)^PaU(<2M^dVU=a$98lRkq@%ON(oa|F*2jD=S ziYXc0oYNV_pai#G_+7@qBy3+g%yuf_D87Os_FoHfB+d5z=wW-?yWVMou>1ogLo~d4 zm`)@+EETqJ;9Qk0gXvY(0x_6k?}CgER{_|J*#yQ}n023yi&Vw?Z~3!N*$?0MZj4Vt zDJXL#;2MR2pf-py7D9k6vGxg+*OIMMeWslDk32ASQN_xIBzIU#qnQ{_aoM*0-S=4C zq5CbG1S82DFGh-}=t;>w)?*)R=u|ok8wTEUFFb+kwaPXuUv78a`$2p7I}gFq5{t|I z{@e1L`_~+3iaGR*3geJWRJ}?)cMQ*_HKT9|C47m!nLy!mZ>NML(8XD=}= zQwXA1%6H`B!aPl;t^&B{!lw1(_K|B+*0CDJj{@|f05@a2KMvQQ4hIbRyShK{KUsbo zTuGBXd-k}b7Y}u0Xjg1u+$%fZb%(XU`gIaR*w@};;chJ7!4b#Ys3sf;*#XV~*8UvY zMcw(Q_Yqv)X+1EeK~FrjyjI$Y${JXlCNhI_oMKZjb}Rz%JRn-*G{Cvl!pz6`%w`qJ zbt54yf!)#CYU{RbC0>5e6~T@6W2v{nuELlFVX0K)H!dO8G64*+07e(<+0+TBq*Mll zyBA+ZtS5@{G;XsHKygkXC2C;(lu^9t`s?lV{{1Mxaa##k>|&gU0KEc4#ng#Bcj|=2 z;F=qtg;r`#rVX~XxNZrGO&Ui*eB{3O)BTS?ddxY#3uOf1T}h%ew$~v{eMiYX11gfz_Eub7z|UN2QlSpoeLJ9*;_lI9|u5 zDTo|{L2>67|H5h~3F>cPjc_gj(h*`jr%|wq`-}r+byc5tNkNJgY&(0_Vo20dd}bnR zs=XFq#hQ%cwG>#hA(SpR17KmH&m3G*L+$_}Hvs-(Hh4{7aD1eLLh+Pk5eo$XlYAJX zE03tvwL7o2yY79zt>3%`w{5KJH{3~be>-l^-u_AAX<>`#JKo0{kbB)nSV0ubp5S#5 zup=*mO8q3DqUmtG)%C7gAWj)q@MxSPq=07(ZMb*L!4mQ@{(*70XhANyku5#^pc8yemWbJnJh7U^p^P zA{{K^6tr(EQ&vY2&Cgffj z#?mkLyxoymk5|6@d zp#P{WM7>^8QiQ+>0P>og@F^-Pb{3ilZ+L7Z3G^}2o4S8>wB?XqUq{KQ=OcgxaKs!koxP6Tp zjVc`zKoQ2k6vlA#DyVzw=RRq@xMT)#mk&#zlZ9MC@7C;`4BJ89)>c5(B&<~*uCu({ zT#7|^xR@r5QEpkO?#O+KdYetmkiZ`T2%kN3##XQ2VA+e8S{U{qM9ssA0GZJWl81v* zd|@x~g>AgApX48+4=s=Q!R1>nbFo6@&;7!}u$Ni5Z$^pb3o@a_#f5h0>D@Mt;>iU> zbf%Tw1 ztl0>9AAn-}_U%qjsqd}p(%?p(e`Ww6BgRBTSgYAT>HDm>*9?gz*6$aL7e4C%TKc*6}k0SeqfIh3e?A-|)%bgV+BA}o6wb|;b(Vnt!aT&zAFJHz`Z5RPlbJ^ z?HX9v4+xN(e9NwD?b|>8i9PhM-?KGWUv4$r@9qh+AGHqJV|`t=heWVv0XmhiYJ&jz zsHAM%oY}EQ-D(KTU1#Imiw zZI^xZ=l|Po{np=FisEQ9$e8u9rx~Xy_IyyFTrN+BPLCn)ggcJ!j5gJP}U_fElW90C-a`5*O(x233H06{ArP zNSegB%*4QIIa`B!-D_hc0a z4C=7`?9rc-(AH|DgukpqFjkY`FVPB+qtvA{6{&s7ERgk+V zh4LA3#F~}kN_z6~r)&2gX^vQ$Pt@EqCge*p8_)}7!ix06xfk#)UjdQLqMzn zpr)G`vW~VE%S1TOTUBNm#2F?oFQh9&E-pGs0pS8noEaFPLth~=E8o_o%`bWoUIT%^IUuJcte6ysKU`Q^CaT5*$&TMGBA zKEgvNC?ASsf@B&GY>1Sg<~$wN0|J3iCE_*#V{&UtMJ+}7DvMU_;o_N#$jC+%6jSKd zgadY3OzwC65z`-tPJ&7TlRc`KcyzW39?-8r2-mL;bSB~J!-X0sSuFEYU2(M>6tX%}izi$@>@gR=1Lw*opt zxH?(gVl1`JkXatS6x$aPQ03kAKWhHp!!L*l`mpd?6f^Im&`W1jwl8Ts1mBmqs8{MONnU??< zl_aRxae;sSk8GR^Pjl&qxB3WZr(Qb#kR#xB(Qm(?RG+faoRXY*tA5tTeB+_h=~bsh z^qt?7aT?18Ua@=yf(nKKp;%RQ-T^~dfCXgmJ@Ld7j>#%pSPC#C>Ezrw;t2B`!#D)% zG>0blDY%pNzq;QEkvL*<>KhuZ8CR=^(jx%`mFixNV}<*$9IO1n&6Ky-H}xG9HzC41q0S<3-qtk-FpdTOBj7`?(j$s!MgR z$=x#@oUoN-|F+@QX{27^5QVG*onj0DhX_S4?lOX33lPl9CR4Pwo>p`{7D`T`mL5qn#EgkyOQVFu5a*18=@~;vt2eLe!ikNF z;#pKwH;j^N#`PXe=3o4RJQ59(Eg=<$5T6m7s|18FU_f>2+6TI*H%5I(KpYQlsRi@t zPJ(rhk{UtLOpxR=+R^1=nzG2^4DlRY)%DU6R!GadLF(eER-rm?XzZeRT}ngALZh&y z>VzN`VVL*%2|M%h9#?1_c*|%24?Nc0iyKPM0YK8T2>3>^wwMk66NKUbjIaPBKl86! zdt6KZ>5yR{U?@cv6e`f?wLSql7uGEdj$4tuEccx<&`XO7`7H5XoLc}EE$H5_^GvZO zq8M*+j1kq(2erB*r*$l$K&)VgT9a+L=We_IFFp&a1IQ)buC=ifmm1lyfVeaOc`EK; z#l-2!s$jq?aP4|yW;&p_=g|2hhn^}xqKwMIctJPQ9*i5t_4>d0l8w$uw=+#`#CK6& zv%S~iSPzL@XNtY0!qfr{iR^(eMn_jyJL@0tM%Js!dyKG`2KmzbDgIEUga!dQ>IkC_ zK~l_^W-~XTnc(1NbUy-!5v2r)~ZtnX+&2`aGvi}F+LiVxgwE4FX87k=>1cI+pQ0qVpJyXoQq1U-&K@ZV0{1=usU(%5o6oZ+zPl0+gUQ}H}1TW7K#~+HP<30vkYdjp}LyF z_k^5eQq_RODTk#o9(_Es4{%5gE5IGu;mmhUPp@50JZ7WIL`F7;Q0e2pit=a#|ers%ObfwO;FOx84T3TD^s+8@3p>)RSa}{`t zl*p(e;DQmaJ>#$0a=+!-Fa7C{a|A8{!$07>I5i~Y`6dp>O7Xr~C3``5{Mu(Ds#>gq z8Fq|3a$-TrK~@7E{O&VR92qDV(hZJ?|G+VeJUy{DPgn5DQgLZ zQrxGbFiNssRcJL0cf$)<@XGA-QHCNpJ$00E^04H8K{;qRH$o%7HE;IdVV0W#)FQD%_%LhQ@Duh8k=mamtd+cly5g*Fh;T5qpaL%T*fIR$85dnTH8Y==oCeo z<8V9q{r#2^pJJZ0XghRtAIzdz5ehd*?XNDLJs+2DS7oIG(2eC4mXGxv1uz{}Oe74M zi}_-#O4StC(3e=%wkZVEyOJ~23YQ?sdmhh7#J17l{j|b5Z5F~&Hb)2 z6)6DTAO7eO`_TLEWGqmeEDl$<5G?lS&wu91mIS%hBuZ7V1Rd^xirj80^`Xu<$|}|Q z1te5}dJ48=8YLH?5U}QrkH9R9qoV~VBWwp~fHf$j09N?sM5o=YfhsG@=*BDDhB}ndm;A8f-kKSjN76V&I z>?`x%($Q~yoM!@Hu;8-QfH&3_lO+)H#V>x*u^@?LYPt(^@4tF*Gh8PKAPlf(M*u%102kfey*AlG=_4=wc*iV4p%Y^IeGI}l8TQPU15ne@U1`h_uIO{ zLMtlGv-f=dQ?_*b<@Tdbe-6eTF9cde1)=34XGk=)#5KYc0-`*~AeC?$3$h;ABhAf? zmWh`lA11k@vDGFpT27ulZOc}#f;E4^nvS2a+xCjtFXi3`h6R_&At?K2h@di0LBg!w=H1UxkURTK*FQ9i4 z!!%4G>pl{=1}A%LeaQm5`Q7iaZ=Wo;0AS4UHu%_6Ll|)J<7L*$zTS>;=|Qfk&T9F& zv#`_6)Hf`!T{m8D2VU97d{Qw&12J=G&Ff41Xjaxs9=cm&+_aO`H+vkTV~X{zTCl1~ zI?2B5@1dQg_8q?~3?slAlt~etL=Sc3ryyn3*>e`hvjjUwT$wV32dT~8yt%pd{N6pd zrZ2Naix=W1ZYH#7p}UU`!X3mkDxpq9!PYICdH+1Hb*GCz-@c7lboT#pl2ji4KXjnN zy&sg|c>N(%_$J7Y*MH>F&wqR)p#6X8cuSAKYr+O;hZ2l1hVv!Nk;=*(>ryNY8dZgc z*Q{Ah2;Pt@Igo_nPyuVj`86~&5a7KM;T?1?xA`!DavzIbRLw5AUe5xS6l9)-@Q^D* z_1XdmNU?x@5|{|8Fu+V~lDeCyOhYU}rmd~bxtU!o8G=OM%(aT*{St2DGp;28Ep=5< zEX&Qblhg6?v9s3H(&oU{B-if8dM@6$(HgruNURvP5tQ#Vu2h1Lu;c*}fI`ezr`S9Q z?6teDLecqL3#&Qv@&U1cLxAm>(`W41@nf!aotUfgR}a`cgnI_pZ>c;_eZwqk#MLFY z(*%hnVm0N$W*`A4h;4+p3UP}8O2TrULk6Yd_~JOf59TARq!kpg%J2k9&M_0j3X? zz&!xmP;epQ5|!~Qbf;Q?N*Ynd@%J8j$T}&j5yg1N@wp&E`-we!$p)@WR}AmD@IUBC0Zi_ zgmC~pDac5HZ9pafWqiu-5+Y>Wa8}++4MfVY=xb7m5r8G1+DZVBrvdk0c<>+W{hxZk z0>n=?4O2(5xyufpueXYpPLct}?DY8t8vuyPhzJ61b6v z;A|LXE*;l??#6Xii`%}Mbr8fwTYzyeQr`r#)bBdch{03X!URcG8Qk9_fGGg5DWo=@ zdQk^hf0`%4aREpqJ;0cX&2>pIGgsC)`&s{SD0R7t2Vo&qK1!LpUiT#=+b6&9 zW&0}G-07vo)-dX|R~!56D6IB*fWru-f1-18?RZ6v)it!+de%?@3f<4TJx(@p`LUyv z92o?x`E80m#9E6v+~Z1G&~3SDlkMEK&92x*vOZQxm5|)0voO%~=S>Isv)iADOg%_8QWM z#2{)k@|s+_KluI+9ay{W<{MoYhuHnuJ)`v~FsLt`Yj$683b$6>`8kKyjMj>}Pw6#v zk>UsXloMBpyom-_YsYHOkFa)9kS}_lJTgCgb#ATqF5sW3N8oGAtv<8vx?WtCzmL zHAmnQF#Lngn>LT6*YEmz^P6neIMa72b^$jCLUE-?1T6THRjY&(DFY>^C^;a?$_cCYpsKLK)HV>NxHBu+ZPTlPi_1x~0oaSm zgGZ^`cEZN{sA-p;Y^f;frDPsQkv(2}{ImrCh0%1$C|$8!UO5<_^E?~8T6 zV90JB?<*lL>1N5w(D)z+dqEqN4EQgefIVL_wVT)d=Eg8q!ZSKvcq|s zV_zb!+sHh-f4QiXlDigf68w|WaR=9*jS1CjZtiCO#2rN5qW3dr4v3*_bvYDE0 zb1KUsmLm$#9VMkL;)=}H0Czx$zfssG0@8?sqm3H#t-6=0nYjpe-a~tzBVP0x8;lOx zS?c4RY;3dhlqot-c4<2xxNBhCPEq1y01%-h2nbMjP0b%S;22*Q7dx}2BR9h^@*nUS zR*(BEEwbxAcCXbA^;!+%o=Dh1I)qvq>{S#s@g@LQHZsV1Bl{lks%W&{Mi^gMs|>Qk zRfcE+qs0|1<^n83x3*P)TRTLD*wNV|E|E0`*o;TnCbAY)dZq{CEsCGh@{8;r|K$;T z-vf7BJ9PrjbWYj++9o?nXP-_6Y?%6c%_#2Ubn(c{ndADJw^Y~Ik$wBDv#HT?h*OP* zT52nA z+-eK1+H83kGfK9ofBA@w!OYI3o6->X{X$c3NQrJv6!=vmBV0P&yVhu3{dSM3VVzffO{t zdMEd@UWphbPBYhq+4y+oC!Tzg5R?hqxpOlB3J#CG@W$i9e&P>q59tl;arjEdF3XLp zI6?QU%2%BEja>Obr;W}6+WxHE}p0Q?N6fJKBJUf7N8Ra1g9@u;!4Aar8tH{Lw2~B zK{0(*=c`<{Z((7f1CP%?{|j5baWk1tBAtK07t>5UeOL{{T0H}dQufZ>G!3m^?8FgsdXC{L2=UW*6NNZ|;ui_HtsjboS^ zhkk;`)x*_GEK~xqJBjMsihEV1Jlc4kAy^)Kzm}MnXY+FBqo_u#oqG}3)7X#lcPTX0 zcvS3>ZbxxblF}*<0!hZt%32gNnrO`g=6~TYzvM~@O)^%g^XCEGDgBG}ultJvfW3BT zG3gLY;y-?s!V>GCLrOy|qFxv4plgdgb#@Lf&VpvWL7-4`t1suilv36wbf26~1%H(p zFVq{<_y{n#ze|-do{WKOWe9t^ZRZZ#4uiaD`(@UJPCnf=ZmlG9RFH7g%e;q3uo%TC z2w)tH!Ho9fN)*c?m%6g!^*p+F78?HphV?w|W&Oi3^UX&gYwA4NX4)H`$Msf^@{A&Z zAqWtfARaZ2^`%T?`ra{j09rn(x{M*dh%h8GG|knj9DvDFc!WDG_nl z>kqMF>JFstGLa}e=9h8aaqDe%@BJSl5h}}0_lNCJ_Xq&E&1C=^20}l~dOH9yEi;Q` zk(I=zcH24DN@#kRgeS5{G5(BaDl8!g&Z9+oaRM4L!{NBYnQeLkgpDqy&kLo;E=&zz;_{0htC_4*FNPynT~>reYfhkjRh z%4_?K`(kVq>#2<*)=7R>Z1X#is∓{4fgu4i|6V7ttXMfaZi2$6Uz-# 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%0AS06T`4~YJ$0fwubh0-gU5ZigfPe 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

35*b=xVy&yT8IKrmI=Gth^Fmg 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

)h8NQs&RXxgI@{jDu3J;TS+UiDp?w|#m6x%q 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

o;*oMIcZAw?iCkPebauW~%_X}(0 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%0AFj>`0a@L+L8ohEUO8LpmnJKn4aVWF3=b z(zZCKRFeyX#4Cs*>BlUt@c+BOVC{5a2ms@b3ED7KqbLV+h y>ho8?pfaJMHG)Tj&Mi8)e*yd7j|;`9b9(of>Euy_OgahSrTR!yu|nQ5?EeAc59$U0 literal 0 HcmV?d00001 diff --git a/pop_functions/pop_DQ_preavg.m b/pop_functions/pop_DQ_preavg.m index c7686e35..968a2288 100755 --- a/pop_functions/pop_DQ_preavg.m +++ b/pop_functions/pop_DQ_preavg.m @@ -1,4 +1,4 @@ -% Purpose: Outputs DQ Table on Epoched Dataset (not ERP) +% Purpose: Outputs DQ Table on Epoched Dataset (not ERP) % % Format : % @@ -11,16 +11,16 @@ % -function pop_DQ_preavg(ALLEEG, varargin) +function pop_DQ_preavg(ALLEEG, varargin) -%ERP = preloadERP; +%ERP = preloadERP; if nargin < 1 help pop_DQ_preavg return end -if isobject(ALLEEG) % eegobj +if isobject(ALLEEG) % eegobj whenEEGisanObject return end @@ -36,16 +36,16 @@ function pop_DQ_preavg(ALLEEG, varargin) end % read values in memory for this function - def = erpworkingmemory('pop_DQ_preavg'); + def = erpworkingmemory('pop_DQ_preavg'); % def{1} - dataset indx, def{2} - artcrit, def{3} - wavg, def{4} - stderror, def{5} - exclude boundaries, % def{6} - ERP type, def{7} - wintaper type, def{8} - wintaper function, - % def{9} - data quality flag, def{10} - DQ_spec_structure, + % def{9} - data quality flag, def{10} - DQ_spec_structure, % def{11} - DQ pre-avg flag, def {12} - DQ_custom_wins - - if isempty(def) || numel(def)~=12 + + if isempty(def) || numel(def)~=12 % Should not be empty, and have exactly 12 elements. Else, fallback to: - def = {1 1 1 1 1 0 0 [] 1 [] 1 0}; + def = {1 1 1 1 1 0 0 [] 1 [] 1 0}; end @@ -69,7 +69,7 @@ function pop_DQ_preavg(ALLEEG, varargin) answer = DQ_preavg(currdata, def, nepochperdata, timelimits); - + if isempty(answer) disp('User selected Cancel') return @@ -78,10 +78,10 @@ function pop_DQ_preavg(ALLEEG, varargin) if numel(setindex) > 1 disp('This tool cannot consider more than one .set file at a time!') - return + return end - + % % Artifact rejection criteria for averaging @@ -120,7 +120,7 @@ function pop_DQ_preavg(ALLEEG, varargin) % Write the analytic Standardized Measurment Error info DQ_flag = answer{9}; DQ_spec = answer{10}; - DQ_preavg_txt = answer{11}; + DQ_preavg_txt = answer{11}; DQcustom_wins = answer{12}; % store setting in erplab working memory @@ -150,28 +150,16 @@ function pop_DQ_preavg(ALLEEG, varargin) 'DQ_flag',DQ_flag,'DQ_spec',DQ_spec, 'DQ_preavg_txt', DQ_preavg_txt,'DQ_custom_wins', DQcustom_wins, 'History', ''); - pause(0.1); + pause(0.1); %Here, pass hidden ERP struct to DQTableGUI - ALLERP = []; - CURRENTPREAVG = 1; + ALLERP = []; + CURRENTPREAVG = 1; ERPpreavg.erpname = ALLEEG(setindex).setname; %setname instead of erpname in DQ Table - DQ_Table_GUI(ERPpreavg,ALLERP,CURRENTPREAVG,1); + DQ_Table_GUI(ERPpreavg,ALLERP,CURRENTPREAVG,1); end - - - - - - - - - - - - -end \ No newline at end of file +end \ No newline at end of file diff --git a/pop_functions/pop_ERP_simulation.m b/pop_functions/pop_ERP_simulation.m old mode 100644 new mode 100755 diff --git a/pop_functions/pop_artextval.m b/pop_functions/pop_artextval.m index 047102ce..5318d5e9 100755 --- a/pop_functions/pop_artextval.m +++ b/pop_functions/pop_artextval.m @@ -108,7 +108,7 @@ ampth = answer{2}; chanArray = unique_bc2(answer{3}); % avoids repeated channels lpfilt = answer{4}; - lpopt = answer{5} + lpopt = answer{5}; flag = answer{6}; viewer = answer{end}; diff --git a/pop_functions/pop_artinterp.m b/pop_functions/pop_artinterp.m index c17849a7..82fd6e4c 100755 --- a/pop_functions/pop_artinterp.m +++ b/pop_functions/pop_artinterp.m @@ -7,7 +7,7 @@ % INPUTS : % % EEG - input dataset -% +% % [EEG, com] = pop_artinterp(EEG, 'FlagToUse', replaceFlag, 'InterpMethod', interpolationMethod, ... % 'ChanToInterp', replaceChannelInd, ... % 'ChansToIgnore', ignoreChannels); @@ -20,14 +20,14 @@ % 'InterpMethod' - [string] method used for interpolation (default is 'spherical'). % 'invdist'/'v4' uses inverse distance on the scalp % 'spherical' uses superfast spherical interpolation. -% 'ChanToInterp' - [integer] Index of channel to interpolate. +% 'ChanToInterp' - [integer] Index of channel to interpolate. % 'ChansToIgnore' - [integer array] Do not include these electrodes % as input for interpolation. % 'InterpAnyChan' - default = 0; If 1, all channels that are flagged with artifacts % will be interpolated IF no more than THRESHOLD % percent of channels are flagged -% 'Threshold' - default = 10%; if greater than X% of channels are flagged, -% then interpolation routine will NOT work for that epoch +% 'Threshold' - default = 10%; if greater than X% of channels are flagged, +% then interpolation routine will NOT work for that epoch % % % OUTPUTS : @@ -73,112 +73,112 @@ function [EEG, com] = pop_artinterp(EEG, varargin) com = ''; if nargin<1 - help pop_artinterp - return + help pop_artinterp + return end if isobject(EEG) % eegobj - whenEEGisanObject % calls a script for showing an error window - return + whenEEGisanObject % calls a script for showing an error window + return end if nargin==1 - serror = erplab_eegscanner(EEG, 'pop_artinterp', 2, 0, 1, 2, 1); - if serror - return - end - - dlg_title = {'Interpolate Flagged Artifact Epochs'}; - - %defaults - defx = {0, 'spherical',[],[],[],0,10}; - %first pos: no previous flag selected - %second pos: no previous method selected (default to 'spherical') - %third pos: no prev electrode selected (should agree with fourth pos) - %fourth pos: no prev "channel-label" selected (should agree with third pos) - %fifth pos: no prev "channels" to ignore - %sixth pos: set to 0 = "interpolate only one" electrode option - %seventh pos: set to 10% default threshold (of artifacts across - % electrode) for 'any electrode interpolation' option - %eigth pos: set [] default, for measurment channel rule - - %take previously selected electrodes and flags used from previous - % artinterp() usage? - def = erpworkingmemory('pop_artinterp'); - - if isempty(def) - def = defx; - else - %make sure that electrode number exists in current list of - %available channels - %def{1} = def{1}(ismember_bc2(def{1},1:EEG(1).nbchan)); - def{3} = def{3}(ismember_bc2(def{3},1:EEG(1).nbchan)); - end - - try - chanlabels = {EEG(1).chanlocs.labels}; %only works on single datasets - catch - chanlabels = []; - end - - - - histoflags = summary_rejectflags(EEG); - - %check currently activated flags - flagcheck = sum(histoflags); - active_flags = (flagcheck>1); - - % def{end} = active_flags; - - - % - % Call GUI - % - answer = artifactinterpGUI(dlg_title, def, defx, chanlabels, active_flags); - - if isempty(answer) - disp('User selected Cancel') - return - end - - replaceFlag = answer{1}; - interpolationMethod = answer{2}; - replaceChannelInd = answer{3}; - replaceChannelLabel = answer{4}; - ignoreChannels = unique_bc2(answer{5}); % avoids repeted channels - many_electrodes = answer{6}; - threshold_perc = answer{7}; - % measurement_chan = answer{8}; - - % displayEEG = answer{6}; %no display EEG for now - % viewer = answer{end}; %no viewer for Now - - viewer = 0; % no viewer - if viewer - viewstr = 'on'; - else - viewstr = 'off'; - end - if ~isempty(find(replaceFlag<1 | replaceFlag>16, 1)) - msgboxText{1} = 'ERROR, flag cannot be greater than 16 nor lesser than 1'; - title = 'ERPLAB: Flag input'; - errorfound(msgboxText, title); - return - end - erpworkingmemory('pop_artinterp', {answer{1} answer{2} answer{3} answer{4} answer{5} ... - answer{6}, answer{7}}); - - if length(EEG)==1 - EEG.setname = [EEG.setname '_arInterp']; %suggest a new name - end - - % - % Somersault - % - [EEG, com] = pop_artinterp(EEG, 'FlagToUse', replaceFlag, 'InterpMethod', interpolationMethod, ... - 'ChanToInterp', replaceChannelInd, 'ChansToIgnore', ignoreChannels, ... - 'InterpAnyChan', many_electrodes, 'Threshold',threshold_perc,... - 'Review', viewstr, 'History', 'gui'); + serror = erplab_eegscanner(EEG, 'pop_artinterp', 2, 0, 1, 2, 1); + if serror return + end + + dlg_title = {'Interpolate Flagged Artifact Epochs'}; + + %defaults + defx = {0, 'spherical',[],[],[],0,10}; + %first pos: no previous flag selected + %second pos: no previous method selected (default to 'spherical') + %third pos: no prev electrode selected (should agree with fourth pos) + %fourth pos: no prev "channel-label" selected (should agree with third pos) + %fifth pos: no prev "channels" to ignore + %sixth pos: set to 0 = "interpolate only one" electrode option + %seventh pos: set to 10% default threshold (of artifacts across + % electrode) for 'any electrode interpolation' option + %eigth pos: set [] default, for measurment channel rule + + %take previously selected electrodes and flags used from previous + % artinterp() usage? + def = erpworkingmemory('pop_artinterp'); + + if isempty(def) + def = defx; + else + %make sure that electrode number exists in current list of + %available channels + %def{1} = def{1}(ismember_bc2(def{1},1:EEG(1).nbchan)); + def{3} = def{3}(ismember_bc2(def{3},1:EEG(1).nbchan)); + end + + try + chanlabels = {EEG(1).chanlocs.labels}; %only works on single datasets + catch + chanlabels = []; + end + + + + histoflags = summary_rejectflags(EEG); + + %check currently activated flags + flagcheck = sum(histoflags); + active_flags = (flagcheck>1); + + % def{end} = active_flags; + + + % + % Call GUI + % + answer = artifactinterpGUI(dlg_title, def, defx, chanlabels, active_flags); + + if isempty(answer) + disp('User selected Cancel') + return + end + + replaceFlag = answer{1}; + interpolationMethod = answer{2}; + replaceChannelInd = answer{3}; + replaceChannelLabel = answer{4}; + ignoreChannels = unique_bc2(answer{5}); % avoids repeted channels + many_electrodes = answer{6}; + threshold_perc = answer{7}; + % measurement_chan = answer{8}; + + % displayEEG = answer{6}; %no display EEG for now + % viewer = answer{end}; %no viewer for Now + + viewer = 0; % no viewer + if viewer + viewstr = 'on'; + else + viewstr = 'off'; + end + if ~isempty(find(replaceFlag<1 | replaceFlag>16, 1)) + msgboxText{1} = 'ERROR, flag cannot be greater than 16 nor lesser than 1'; + title = 'ERPLAB: Flag input'; + errorfound(msgboxText, title); + return + end + erpworkingmemory('pop_artinterp', {answer{1} answer{2} answer{3} answer{4} answer{5} ... + answer{6}, answer{7}}); + + if length(EEG)==1 + EEG.setname = [EEG.setname '_arInterp']; %suggest a new name + end + + % + % Somersault + % + [EEG, com] = pop_artinterp(EEG, 'FlagToUse', replaceFlag, 'InterpMethod', interpolationMethod, ... + 'ChanToInterp', replaceChannelInd, 'ChansToIgnore', ignoreChannels, ... + 'InterpAnyChan', many_electrodes, 'Threshold',threshold_perc,... + 'Review', viewstr, 'History', 'gui'); + return end % @@ -193,14 +193,14 @@ t2 = single(EEG(1).xmax*1000); %p.addParamValue('Twindow', [t1 t2], @isnumeric); %p.addParamValue('Channels', 1:EEG(1).nbchan, @isnumeric); %all channels -p.addParamValue('FlagToUse', 0, @isnumeric); -p.addParamValue('InterpMethod', 'spherical', @ischar); +p.addParamValue('FlagToUse', 0, @isnumeric); +p.addParamValue('InterpMethod', 'spherical', @ischar); p.addParamValue('ChanToInterp', 0, @isnumeric); %%%%%%%%%%%%% <<<< %p.addParamValue('ChanLabel', 'none', @ischar); -p.addParamValue('ChansToIgnore', [], @isnumeric); +p.addParamValue('ChansToIgnore', [], @isnumeric); p.addParamValue('InterpAnyChan', 0,@isnumeric); -p.addParamValue('Threshold', 10, @isnumeric); %percentage value -%p.addParamValue('MeasurementChanIdx',[],@isnumeric); +p.addParamValue('Threshold', 10, @isnumeric); %percentage value +%p.addParamValue('MeasurementChanIdx',[],@isnumeric); p.addParamValue('Review', 'off', @ischar); % to open a window with the marked epochs %p.addParamValue('Flag', 1, @isnumeric); %param for things to-be flagged p.addParamValue('History', 'script', @ischar); % history from scripting @@ -209,37 +209,37 @@ replaceFlag = p.Results.FlagToUse; interpolationMethod = p.Results.InterpMethod; -replaceChannelInd = p.Results.ChanToInterp; +replaceChannelInd = p.Results.ChanToInterp; %replaceChannelLabel = p.Results.ChanLabel; -ignoreChannels = p.Results.ChansToIgnore; -many_electrodes = p.Results.InterpAnyChan; -threshold_perc = p.Results.Threshold; -%meas_chan = p.Results.MeasurementChanIdx; +ignoreChannels = p.Results.ChansToIgnore; +many_electrodes = p.Results.InterpAnyChan; +threshold_perc = p.Results.Threshold; +%meas_chan = p.Results.MeasurementChanIdx; %flag = p.Results.Flag; -displayEEG = p.Results.Review; +displayEEG = p.Results.Review; if strcmpi(p.Results.Review, 'on')% to open a window with the marked epochs - eprev = 1; + eprev = 1; else - eprev = 0; + eprev = 0; end if ~isempty(find(ignoreChannels<1 | ignoreChannels>EEG(1).nbchan, 1)) - error('ERPLAB says: error at pop_artstep(). Channel indices cannot be greater than EEG.nbchan') + error('ERPLAB says: error at pop_artstep(). Channel indices cannot be greater than EEG.nbchan') end if ~isempty(find(replaceFlag<1 | replaceFlag>16, 1)) - error('ERPLAB says: error at pop_artstep(). Flag cannot be greater than 16 or lesser than 1') + error('ERPLAB says: error at pop_artstep(). Flag cannot be greater than 16 or lesser than 1') end if strcmpi(p.Results.History,'implicit') - shist = 3; % implicit + shist = 3; % implicit elseif strcmpi(p.Results.History,'script') - shist = 2; % script + shist = 2; % script elseif strcmpi(p.Results.History,'gui') - shist = 1; % gui + shist = 1; % gui else - shist = 0; % off + shist = 0; % off end % @@ -258,25 +258,25 @@ -%% first, index the epochs to interpolate based on the flag used -ntrial = EEG.trials; %number of original trials -oldflag = zeros(1,ntrial); +%% first, index the epochs to interpolate based on the flag used +ntrial = EEG.trials; %number of original trials +oldflag = zeros(1,ntrial); for i = 1:ntrial if length(EEG.epoch(i).eventlatency) == 1 - flagx = [EEG.epoch(i).eventflag]; + flagx = [EEG.epoch(i).eventflag]; - if iscell(flagx) - flagx = cell2mat(flagx) + if iscell(flagx) + flagx = cell2mat(flagx); end oldflag(i) = flagx; - + elseif length(EEG.epoch(i).eventlatency) > 1 - indxtimelock = find(cell2mat(EEG.epoch(i).eventlatency) == 0,1,'first');% catch zero-time locked type - oldflag(i) = EEG.epoch(i).eventflag{indxtimelock}; - + indxtimelock = find(cell2mat(EEG.epoch(i).eventlatency) == 0,1,'first');% catch zero-time locked type + oldflag(i) = EEG.epoch(i).eventflag{indxtimelock}; + end @@ -285,43 +285,39 @@ % filter oldflag by specified flag flagbit = bitshift(1,0:15); -flagged_epochs = bitand(flagbit(replaceFlag), oldflag); +flagged_epochs = bitand(flagbit(replaceFlag), oldflag); epoch_ind = find(flagged_epochs); %list of index of epochs, filtered by specified flag, to interpolate -%% interpolate only the epochs with the specified flag -N_interpolate = numel(epoch_ind); - +%% interpolate only the epochs with the specified flag - -for e = 1:N_interpolate - - tmpEEG = EEG; %temp EEG struct - - - tmpEEG.data = tmpEEG.data(:,:,epoch_ind(e)); %index current epoch - tmpEEG.trials = 1; %update temp single trial EEG struct - all_chans = EEG.reject.rejmanualE(:,epoch_ind(e)); - - ignoreChannelsE = ignoreChannels; - chanlocs = tmpEEG.chanlocs; +if many_electrodes == 1 - %skip epoch if the channel to be interpolated is itself a not-real - %channel (i.e. no theta information) - nonemptychans = find(~cellfun('isempty', { chanlocs.theta })); + epoch_ind = find(flagged_epochs); %list of index of epochs, filtered by specified flag, to interpolate + %% interpolate only the epochs with the specified flag + N_interpolate = numel(epoch_ind); - - if many_electrodes == 1 + for e = 1:N_interpolate + + tmpEEG = EEG; %temp EEG struct + tmpEEG.data = tmpEEG.data(:,:,epoch_ind(e)); %index current epoch + tmpEEG.trials = 1; %update temp single trial EEG struct + all_chans = EEG.reject.rejmanualE(:,epoch_ind(e)); + ignoreChannelsE = ignoreChannels; + chanlocs = tmpEEG.chanlocs; + %skip epoch if the channel to be interpolated is itself a not-real + %channel (i.e. no theta information) + nonemptychans = find(~cellfun('isempty', { chanlocs.theta })); chans_to_interp = find(all_chans)'; - + %skip channels to be interpolated is itself a not-real %channel (i.e. no theta information) - [~,chan_ind ] = intersect_bc(chans_to_interp,nonemptychans); - chans_to_interp2 = chans_to_interp(chan_ind); + [~,chan_ind ] = intersect_bc(chans_to_interp,nonemptychans); + chans_to_interp2 = chans_to_interp(chan_ind); if isempty(chans_to_interp2) @@ -330,8 +326,6 @@ continue end - - %fix redundancies between chan_to_interp & ignore channels if any(ismember(chans_to_interp,ignoreChannels)) @@ -352,9 +346,6 @@ continue else - - - fprintf('\nInterpolating epoch #%s by flag %s \n', num2str(epoch_ind(e)), ... num2str(replaceFlag)); @@ -366,76 +357,91 @@ %reset flag at EEG.reject.manual EEG.reject.rejmanual(epoch_ind(e)) = 0; - - - - end - - - - else - %one electrode case - - %skip channels to be interpolated is itself a not-real - %channel (i.e. no theta information) - [~,chan_ind ] = intersect_bc(replaceChannelInd,nonemptychans); - replaceChannelInd2 = replaceChannelInd(chan_ind); - - if isempty(replaceChannelInd2) - fprintf('\nSkipping epoch #%s since the channel(s) #%i to be interpolated are not real channels (no channel location theta info)', ... - num2str(epoch_ind(e)), replaceChannelInd); - continue - end - - %fix redundancies between chan_to_interp & ignore channels - if ismember(replaceChannelInd,ignoreChannels) - ignoreChannelsE = setdiff(ignoreChannels, replaceChannelInd); - end - - %fix ignoreChannels to not include channels that are bad (unless it's the chosen channel)! - include_to_ignore = double(find(all_chans)'); + %re-add interpolated temp EEG epoch into original EEG + EEG.data(:,:,epoch_ind(e)) = tmpEEG.data; + end +else + epochrej1 = EEG.reject.rejmanualE(replaceChannelInd,:); + [~,epoch_ind1] = find(epochrej1==1); + epoch_ind= intersect(epoch_ind,epoch_ind1); + N_interpolate = numel(epoch_ind); + + for e = 1:N_interpolate + tmpEEG = EEG; %temp EEG struct + tmpEEG.data = tmpEEG.data(:,:,epoch_ind(e)); %index current epoch + tmpEEG.trials = 1; %update temp single trial EEG struct + all_chans = EEG.reject.rejmanualE(:,epoch_ind(e)); - if replaceChannelInd ~= include_to_ignore - ignoreChannelsE = cat(2,ignoreChannelsE, include_to_ignore); - end + ignoreChannelsE = ignoreChannels; + chanlocs = tmpEEG.chanlocs; - %adjust bad channel count with updated ignored channels - total_chans = numel(all_chans) - numel(ignoreChannelsE); + %skip epoch if the channel to be interpolated is itself a not-real + %channel (i.e. no theta information) + nonemptychans = find(~cellfun('isempty', { chanlocs.theta })); - - if sum(all_chans)/(total_chans) >= (threshold_perc/100) + %one electrode case + if EEG.reject.rejmanualE(replaceChannelInd,epoch_ind(e))==1%%GH May 2024 + %skip channels to be interpolated is itself a not-real + %channel (i.e. no theta information) + [~,chan_ind ] = intersect_bc(replaceChannelInd,nonemptychans); + replaceChannelInd2 = replaceChannelInd(chan_ind); - fprintf('\nSkipping epoch #%s by flag %s since amount of channels with artifact threshold %i percent exceeded\n', ... - num2str(epoch_ind(e)),num2str(replaceFlag), threshold_perc); + if isempty(replaceChannelInd2) + fprintf('\nSkipping epoch #%s since the channel(s) #%i to be interpolated are not real channels (no channel location theta info)', ... + num2str(epoch_ind(e)), replaceChannelInd); + continue + end - continue - else + %fix redundancies between chan_to_interp & ignore channels + if ismember(replaceChannelInd,ignoreChannels) + ignoreChannelsE = setdiff(ignoreChannels, replaceChannelInd); + end + + %fix ignoreChannels to not include channels that are bad (unless it's the chosen channel)! + include_to_ignore = double(find(all_chans)'); + + + if replaceChannelInd ~= include_to_ignore + ignoreChannelsE = cat(2,ignoreChannelsE, include_to_ignore); + end + %adjust bad channel count with updated ignored channels +% total_chans = numel(all_chans) - numel(ignoreChannelsE); + + + % if sum(all_chans)/(total_chans) >= (threshold_perc/100) + % fprintf('\nSkipping epoch #%s by flag %s since amount of channels with artifact threshold %i percent exceeded\n', ... + % num2str(epoch_ind(e)),num2str(replaceFlag), threshold_perc); + % continue + % else + % fprintf('\nInterpolating epoch #%s by flag %s \n', num2str(epoch_ind(e)), ... num2str(replaceFlag)); fprintf('\nFlag for epoch %s has been reset in EEG.rejmanual \n', num2str(epoch_ind(e))); - tmpEEG = erplab_interpolateElectrodes(tmpEEG, replaceChannelInd, ... ignoreChannelsE,interpolationMethod); - %reset flag at EEG.reject.manual - EEG.reject.rejmanual(epoch_ind(e)) = 0; + %reset flag at EEG.reject.manual%%GH May 2024 + EEG.reject.rejmanualE(replaceChannelInd,epoch_ind(e))=0; + [xpos,~] = find(EEG.reject.rejmanualE(:,epoch_ind(e))==1); + if isempty(xpos) + EEG.reject.rejmanual(epoch_ind(e)) = 0; + end + % end + + %re-add interpolated temp EEG epoch into original EEG + EEG.data(:,:,epoch_ind(e)) = tmpEEG.data; end - end - - - %re-add interpolated temp EEG epoch into original EEG - EEG.data(:,:,epoch_ind(e)) = tmpEEG.data; - end + % transfer the EEG.reject artifact marks to EVENTLIST EEG = pop_syncroartifacts(EEG, 'Direction','eeglab2erplab'); % GUI: 30-May-2023 21:02:55 @@ -443,8 +449,8 @@ fprintf('\n'); if N_interpolate == 0 + warning('on'); warning('No epochs were actually flagged, so no epochs were interpolated!'); - else % performance @@ -460,9 +466,9 @@ com = sprintf( '%s = pop_artinterp( %s ', inputname(1), inputname(1)); if many_electrodes idx= strcmp(fn,'ChanToInterp'); - fn(idx) = []; + fn(idx) = []; end - + for q=1:length(fn) fn2com = fn{q}; diff --git a/pop_functions/pop_basicfilter.m b/pop_functions/pop_basicfilter.m index 4590066e..a3fa71d1 100755 --- a/pop_functions/pop_basicfilter.m +++ b/pop_functions/pop_basicfilter.m @@ -76,9 +76,7 @@ function [EEG, com] = pop_basicfilter( EEG, chanArray, varargin) com = ''; if exist('filtfilt','file') ~= 2 - msgboxText = ['ERPLAB''s filtering functions require the Matlab Signal Processing Toolbox.' ... - 'You do not appear to have this toolbox installed. The Signal Processing Toolbox can be purchased from The Mathworks (but it may be included in your institution''s license for no additional cost).'... - 'If you do not know how to obtain or install it, please contact your system administrator.']; + msgboxText = 'cannot find the signal processing toolbox'; title = 'ERPLAB: pop_basicfilter() error'; errorfound(msgboxText, title); return diff --git a/pop_functions/pop_blcerp.m b/pop_functions/pop_blcerp.m index c14cb03f..cedef571 100755 --- a/pop_functions/pop_blcerp.m +++ b/pop_functions/pop_blcerp.m @@ -2,16 +2,16 @@ % % FORMAT : % -% ERP = pop_blcerp(ERP, blc) +% ERP = pop_blcerp(ERP, 'Baseline',blc) % % ERP - ERPLAB structure % blc - window for baseline correction in msec or either a string like 'pre', 'post', or 'all' % (strings with the baseline interval also works. e.g. '-300 100') % % Example : -% >> ERP = pop_blcerp( ERP , [-200 800], [-100 0]); -% >> ERP = pop_blcerp( ERP , [-200 800], '-100 0'); -% >> ERP = pop_blcerp( ERP , [-400 2000], 'post'); +% >> ERP = pop_blcerp( ERP , [-200 800], 'Baseline', [-100 0]); +% >> ERP = pop_blcerp( ERP , [-200 800], 'Baseline', '-100 0'); +% >> ERP = pop_blcerp( ERP , [-400 2000], 'Baseline', 'post'); % % INPUTS : % @@ -91,10 +91,13 @@ end blcorr = answer{1}; + ChanArray = answer{2}; + BinArray = answer{3}; % % Somersault % - [ERP, erpcom] = pop_blcerp(ERP, 'Baseline', blcorr, 'Saveas', 'on', 'History', 'gui'); + [ERP, erpcom] = pop_blcerp(ERP, 'Baseline', blcorr,'ChanArray',ChanArray,... + 'BinArray',BinArray,'Saveas', 'on', 'History', 'gui'); return end @@ -108,9 +111,22 @@ % option(s) p.addParamValue('Baseline', 'pre'); % erpset index or input file p.addParamValue('Saveas', 'off', @ischar); % 'on', 'off' +p.addParamValue('ChanArray', [], @isnumeric); +p.addParamValue('BinArray', [], @isnumeric); p.addParamValue('History', 'script', @ischar); % history from scripting p.parse(ERP, varargin{:}); +ChanArray = p.Results.ChanArray; +if isempty(ChanArray) || any(ChanArray(:)>ERP.nchan) || any(ChanArray(:)<1) + ChanArray = [1:ERP.nchan]; +end + + +BinArray = p.Results.BinArray; +if isempty(BinArray) || any(BinArray(:)>ERP.nbin) || any(BinArray(:)<1) + BinArray = [1:ERP.nbin]; +end + @@ -192,6 +208,8 @@ ERPaux = ERP; % original ERP nbin = ERP.nbin; + + % % baseline correction 01-14-2009 % @@ -213,6 +231,18 @@ ERP.saved = 'no'; % erpcom = sprintf('%s = pop_blcerp( %s, %s);', inputname(1), inputname(1), blcorrcomm); +ChanArrayleft = setdiff([1:ERP.nchan],ChanArray);%% channles are not for baseline correction +if ~isempty(ChanArrayleft) + ERP.bindata(ChanArrayleft,:,:) = ERPaux.bindata(ChanArrayleft,:,:); +end + + +BinArrayleft = setdiff([1:ERP.nbin],BinArray);%% bins are not for baseline correction +if ~isempty(BinArrayleft) + ERP.bindata(:,:,BinArrayleft) = ERPaux.bindata(:,:,BinArrayleft); +end + + % % History % diff --git a/pop_functions/pop_creabasiceventlist.m b/pop_functions/pop_creabasiceventlist.m index 3b609ed4..15ff9d9d 100755 --- a/pop_functions/pop_creabasiceventlist.m +++ b/pop_functions/pop_creabasiceventlist.m @@ -65,88 +65,88 @@ function [EEG, com] = pop_creabasiceventlist(EEG, varargin) com = ''; if nargin < 1 - help pop_creabasiceventlist - return + help pop_creabasiceventlist + return end if isobject(EEG) % eegobj - whenEEGisanObject % calls a script for showing an error window - return + whenEEGisanObject % calls a script for showing an error window + return end if nargin==1 - serror = erplab_eegscanner(EEG, 'pop_creabasiceventlist', 2, 0, 0, 0, 2); - if serror - return - end - if isfield(EEG(1).event, 'type') - if ~all(cellfun(@isnumeric, { EEG(1).event.type })) - msgboxText = ['Some or all of your events contain a text-based event label, '... - 'and not a numeric event code.\n\nERPLAB must have a numeric code '... - 'for every event (a text label can also be present). For labels such as "S14", '... - 'you can automatically create an equivalent numeric event code (e.g., 14) by '... - 'checking the box labeled "Create numeric equivalents of nonnumeric event codes '... - 'when possible" when creating the EventList.\n\nFor labels that cannot be automatically '... - 'converted (e.g., "RESP"), or for ambiguous cases (e.g., when you have both "S14" and '... - '"R14"), you can flexibly create numeric versions using the Advanced button at EVENTLIST GUI.\n']; - - title_msg = 'ERPLAB: Warning'; - %button = askquest(sprintf(msgboxText), title_msg); - button = askquestpoly(sprintf(msgboxText), title_msg, {'Continue'}); - if ~strcmpi(button,'Continue') - disp('User selected Cancel') - return - end - end - end - - def = erpworkingmemory('pop_creabasiceventlist'); - if isempty(def) - def = {'' 'boundary' -99 1 1}; - end - - % - % Call GUI - % - if length(EEG)>1 - multieeg = 1; % when multi eeg - else - multieeg = 0; % just single eeg - end - inputstrMat = creabasiceventlistGUI(def, multieeg); % GUI - - if isempty(inputstrMat) && ~strcmp(inputstrMat,'') + serror = erplab_eegscanner(EEG, 'pop_creabasiceventlist', 2, 0, 0, 0, 2); + if serror + return + end + if isfield(EEG(1).event, 'type') + if ~all(cellfun(@isnumeric, { EEG(1).event.type })) + msgboxText = ['Some or all of your events contain a text-based event label, '... + 'and not a numeric event code.\n\nERPLAB must have a numeric code '... + 'for every event (a text label can also be present). For labels such as "S14", '... + 'you can automatically create an equivalent numeric event code (e.g., 14) by '... + 'checking the box labeled "Create numeric equivalents of nonnumeric event codes '... + 'when possible" when creating the EventList.\n\nFor labels that cannot be automatically '... + 'converted (e.g., "RESP"), or for ambiguous cases (e.g., when you have both "S14" and '... + '"R14"), you can flexibly create numeric versions using the Advanced button at EVENTLIST GUI.\n']; + + title_msg = 'ERPLAB: Warning'; + %button = askquest(sprintf(msgboxText), title_msg); + button = askquestpoly(sprintf(msgboxText), title_msg, {'Continue'}); + if ~strcmpi(button,'Continue') disp('User selected Cancel') return - elseif strcmp(inputstrMat,'advanced') - %[EEG, com ] = pop_editeventlist(EEG, 'History', 'off'); - [EEG, com ] = pop_editeventlist(EEG); - return - end - - elname = inputstrMat{1}; - boundarystrcode = inputstrMat{2}; - newboundarynumcode = inputstrMat{3}; - rwwarn = inputstrMat{4}; - alphanum = inputstrMat{5}; - - erpworkingmemory('pop_creabasiceventlist', {elname, boundarystrcode, newboundarynumcode, rwwarn, alphanum}); - - if rwwarn==1 - striswarning = 'on'; - else - striswarning = 'off'; - end - if alphanum==1 - stralphanum = 'on'; - else - stralphanum = 'off'; - end - if length(EEG)==1 - EEG.setname = [EEG.setname '_elist']; %suggest a new name + end end - - [EEG, com] = pop_creabasiceventlist(EEG, 'Eventlist', elname, 'BoundaryString', boundarystrcode,... - 'BoundaryNumeric', newboundarynumcode,'Warning', striswarning, 'AlphanumericCleaning', stralphanum, 'History', 'gui'); + end + + def = erpworkingmemory('pop_creabasiceventlist'); + if isempty(def) + def = {'' 'boundary' -99 1 1}; + end + + % + % Call GUI + % + if length(EEG)>1 + multieeg = 1; % when multi eeg + else + multieeg = 0; % just single eeg + end + inputstrMat = creabasiceventlistGUI(def, multieeg); % GUI + + if isempty(inputstrMat) && ~strcmp(inputstrMat,'') + disp('User selected Cancel') + return + elseif strcmp(inputstrMat,'advanced') + %[EEG, com ] = pop_editeventlist(EEG, 'History', 'off'); + [EEG, com ] = pop_editeventlist(EEG); return + end + + elname = inputstrMat{1}; + boundarystrcode = inputstrMat{2}; + newboundarynumcode = inputstrMat{3}; + rwwarn = inputstrMat{4}; + alphanum = inputstrMat{5}; + + erpworkingmemory('pop_creabasiceventlist', {elname, boundarystrcode, newboundarynumcode, rwwarn, alphanum}); + + if rwwarn==1 + striswarning = 'on'; + else + striswarning = 'off'; + end + if alphanum==1 + stralphanum = 'on'; + else + stralphanum = 'off'; + end + if length(EEG)==1 + EEG.setname = [EEG.setname '_elist']; %suggest a new name + end + + [EEG, com] = pop_creabasiceventlist(EEG, 'Eventlist', elname, 'BoundaryString', boundarystrcode,... + 'BoundaryNumeric', newboundarynumcode,'Warning', striswarning, 'AlphanumericCleaning', stralphanum, 'History', 'gui'); + return end % @@ -173,49 +173,49 @@ newboundarynumcode_old = p.Results.Newboundary; % new numeric code for replacing string boundaries (old versions) if isempty(boundarystrcode_old) - boundarystrcode = p.Results.BoundaryString; % current string for boundaries + boundarystrcode = p.Results.BoundaryString; % current string for boundaries else - boundarystrcode = boundarystrcode_old; % current string for boundaries + boundarystrcode = boundarystrcode_old; % current string for boundaries end if isempty(newboundarynumcode_old) - newboundarynumcode = p.Results.BoundaryNumeric; % new numeric code for replacing string boundaries + newboundarynumcode = p.Results.BoundaryNumeric; % new numeric code for replacing string boundaries else - newboundarynumcode = newboundarynumcode_old; % new numeric code for replacing string boundaries - + newboundarynumcode = newboundarynumcode_old; % new numeric code for replacing string boundaries + end boundarystrcode = strtrim(boundarystrcode); boundarystrcode = regexprep(boundarystrcode, '''|"',''); if strcmpi(p.Results.Warning, 'on') - rwwarn = 1; + rwwarn = 1; else - rwwarn = 0; + rwwarn = 0; end if strcmpi(p.Results.AlphanumericCleaning, 'on') - alphanum = 1; + alphanum = 1; else - alphanum = 0; + alphanum = 0; end if strcmpi(p.Results.History,'implicit') - shist = 3; % implicit + shist = 3; % implicit elseif strcmpi(p.Results.History,'script') - shist = 2; % script + shist = 2; % script elseif strcmpi(p.Results.History,'gui') - shist = 1; % gui + shist = 1; % gui else - shist = 0; % off + shist = 0; % off end % % process multiple datasets. Updated August 23, 2013 JLC % if length(EEG) > 1 - options1 = {'Eventlist', p.Results.Eventlist, 'BoundaryString', p.Results.BoundaryString,... - 'BoundaryNumeric', p.Results.BoundaryNumeric,'Warning', p.Results.Warning,... - 'AlphanumericCleaning', p.Results.AlphanumericCleaning, 'History', 'gui'}; - [ EEG, com ] = eeg_eval( 'pop_creabasiceventlist', EEG, 'warning', 'on', 'params', options1); - return; + options1 = {'Eventlist', p.Results.Eventlist, 'BoundaryString', p.Results.BoundaryString,... + 'BoundaryNumeric', p.Results.BoundaryNumeric,'Warning', p.Results.Warning,... + 'AlphanumericCleaning', p.Results.AlphanumericCleaning, 'History', 'gui'}; + [ EEG, com ] = eeg_eval( 'pop_creabasiceventlist', EEG, 'warning', 'on', 'params', options1); + return; end % @@ -225,108 +225,108 @@ auxEvent = EEG.event; if isfield(EEG, 'EVENTLIST') - auxEVENTLIST = EEG.EVENTLIST; % keep old EVENTLIST just in case - if rwwarn - if isfield(EEG.EVENTLIST, 'eventinfo') - if ~isempty(EEG.EVENTLIST.eventinfo) - if nargin==1 - question = ['dataset %s already has attached an EVENTLIST structure.\n'... - 'So, pop_creabasiceventlist() will totally overwrite it.\n'... - 'Do you want to continue anyway?']; - title = 'ERPLAB: binoperator, Overwriting Confirmation'; - button = askquest(sprintf(question, EEG.setname), title); - - if ~strcmpi(button,'yes') - disp('User selected Cancel') - return - end - else - fprintf('\n\nWARNING: Previous EVENTLIST structure will be overwritten.\n\n') - end - %if ischar(EEG.event(1).type) - % [ EEG.event.type ] = EEG.EVENTLIST.eventinfo.code; - %end - EEG.EVENTLIST = []; - end + auxEVENTLIST = EEG.EVENTLIST; % keep old EVENTLIST just in case + if rwwarn + if isfield(EEG.EVENTLIST, 'eventinfo') + if ~isempty(EEG.EVENTLIST.eventinfo) + if nargin==1 + question = ['dataset %s already has attached an EVENTLIST structure.\n'... + 'So, pop_creabasiceventlist() will totally overwrite it.\n'... + 'Do you want to continue anyway?']; + title = 'ERPLAB: binoperator, Overwriting Confirmation'; + button = askquest(sprintf(question, EEG.setname), title); + + if ~strcmpi(button,'yes') + disp('User selected Cancel') + return + end + else + fprintf('\n\nWARNING: Previous EVENTLIST structure will be overwritten.\n\n') end + %if ischar(EEG.event(1).type) + % [ EEG.event.type ] = EEG.EVENTLIST.eventinfo.code; + %end + EEG.EVENTLIST = []; + end end + end else - auxEVENTLIST = 'none'; + auxEVENTLIST = 'none'; end field2del = {'bepoch','bini','binlabel', 'code', 'codelabel','enable','flag','item'}; tf = ismember_bc2(field2del,fieldnames(EEG.event)'); if rwwarn && nnz(tf)>0 - question = ['The EEG.event field of %s contains subfield name(s) reserved for ERPLAB.\n\n'... - 'What would you like to do?\n\n']; - - BackERPLABcolor = [1 0.9 0.3]; % yellow - title = 'ERPLAB: pop_creabasiceventlist, Overwriting Confirmation'; - oldcolor = get(0,'DefaultUicontrolBackgroundColor'); - set(0,'DefaultUicontrolBackgroundColor',BackERPLABcolor) - button = questdlg(sprintf(question, EEG.setname), title,'Cancel','Overwrite them', 'Continue as it is', 'Overwrite them'); - set(0,'DefaultUicontrolBackgroundColor',oldcolor) - - if strcmpi(button,'Continue as it is') - fprintf('|WARNING: Fields found in EEG.event that has ERPLAB''s reserved names will not be overwritten.\n\n'); - elseif strcmpi(button,'Cancel') || strcmpi(button,'') - return - elseif strcmpi(button,'Overwrite them') - %bepoch bini binlabel codelabel duration enable flag item latency type urevent - EEG.event = rmfield(EEG.event, field2del(tf)); - fprintf('|WARNING: Fields found in EEG.event that has ERPLAB''s reserved names were overwritten.\n\n') - end + question = ['The EEG.event field of %s contains subfield name(s) reserved for ERPLAB.\n\n'... + 'What would you like to do?\n\n']; + + BackERPLABcolor = [1 0.9 0.3]; % yellow + title = 'ERPLAB: pop_creabasiceventlist, Overwriting Confirmation'; + oldcolor = get(0,'DefaultUicontrolBackgroundColor'); + set(0,'DefaultUicontrolBackgroundColor',BackERPLABcolor) + button = questdlg(sprintf(question, EEG.setname), title,'Cancel','Overwrite them', 'Continue as it is', 'Overwrite them'); + set(0,'DefaultUicontrolBackgroundColor',oldcolor) + + if strcmpi(button,'Continue as it is') + fprintf('|WARNING: Fields found in EEG.event that has ERPLAB''s reserved names will not be overwritten.\n\n'); + elseif strcmpi(button,'Cancel') || strcmpi(button,'') + return + elseif strcmpi(button,'Overwrite them') + %bepoch bini binlabel codelabel duration enable flag item latency type urevent + EEG.event = rmfield(EEG.event, field2del(tf)); + fprintf('|WARNING: Fields found in EEG.event that has ERPLAB''s reserved names were overwritten.\n\n') + end end if alphanum==1 - alphanstr = 'on'; + alphanstr = 'on'; else - alphanstr = 'off'; + alphanstr = 'off'; end % Warning if rwwarn==0 - striswarning = 'off'; + striswarning = 'off'; else - striswarning = 'on'; + striswarning = 'on'; end % Send EVENTLIST to... if strcmp(elname,'') || strcmp(elname,'no') || strcmp(elname,'none') - stroption2do = 'EEG'; + stroption2do = 'EEG'; else - stroption2do = 'EEG&Text'; + stroption2do = 'EEG&Text'; end EEG = pop_editeventlist(EEG, 'SendEL2', stroption2do, 'ExportEL', elname,... - 'BoundaryString', boundarystrcode,'BoundaryNumeric', newboundarynumcode, 'Warning', striswarning,... - 'AlphanumericCleaning', alphanstr, 'History', 'off'); + 'BoundaryString', boundarystrcode,'BoundaryNumeric', newboundarynumcode, 'Warning', striswarning,... + 'AlphanumericCleaning', alphanstr, 'History', 'off'); EEG = pop_overwritevent(EEG, 'code', 'History', 'off'); if rwwarn - if ~all(cellfun(@isnumeric, { EEG.event.type })) - msgboxText = ['Some or all of your events still contain a text-based event label, '... - 'and not a numeric event code.\n\nERPLAB must have a numeric code '... - 'for every event (a text label can also be present). For labels such as "S14", '... - 'you can automatically create an equivalent numeric event code (e.g., 14) by '... - 'checking the box labeled "Create numeric equivalents of nonnumeric event codes '... - 'when possible" when creating the EventList.\n\nFor labels that cannot be automatically '... - 'converted (e.g., "RESP"), or for ambiguous cases (e.g., when you have both "S14" and '... - '"R14"), you can flexibly create numeric versions using the Advanced button at EVENTLIST GUI.\n\n'... - 'Would you like to continue anyway?']; - title_msg = 'ERPLAB: Warning'; - button = askquest(sprintf(msgboxText), title_msg); - - if ~strcmpi(button,'yes') - if isempty(auxEVENTLIST) || isstruct(auxEVENTLIST) - EEG.EVENTLIST = auxEVENTLIST; - else - EEG = rmfield(EEG, 'EVENTLIST'); - end - EEG.event = auxEvent; - disp('User selected Cancel') - return - end + if ~all(cellfun(@isnumeric, { EEG.event.type })) + msgboxText = ['Some or all of your events still contain a text-based event label, '... + 'and not a numeric event code.\n\nERPLAB must have a numeric code '... + 'for every event (a text label can also be present). For labels such as "S14", '... + 'you can automatically create an equivalent numeric event code (e.g., 14) by '... + 'checking the box labeled "Create numeric equivalents of nonnumeric event codes '... + 'when possible" when creating the EventList.\n\nFor labels that cannot be automatically '... + 'converted (e.g., "RESP"), or for ambiguous cases (e.g., when you have both "S14" and '... + '"R14"), you can flexibly create numeric versions using the Advanced button at EVENTLIST GUI.\n\n'... + 'Would you like to continue anyway?']; + title_msg = 'ERPLAB: Warning'; + button = askquest(sprintf(msgboxText), title_msg); + + if ~strcmpi(button,'yes') + if isempty(auxEVENTLIST) || isstruct(auxEVENTLIST) + EEG.EVENTLIST = auxEVENTLIST; + else + EEG = rmfield(EEG, 'EVENTLIST'); + end + EEG.event = auxEvent; + disp('User selected Cancel') + return end + end end % @@ -336,56 +336,56 @@ fn = fieldnames(p.Results); com = sprintf( '%s = pop_creabasiceventlist( %s ', inputname(1), inputname(1)); for q=1:length(fn) - fn2com = fn{q}; % get fieldname - if ~ismember_bc2(fn2com, skipfields) - fn2res = p.Results.(fn2com); % get content of current field - if ~isempty(fn2res) - if iscell(fn2res) - com = sprintf( '%s, ''%s'', {', com, fn2com); - for c=1:length(fn2res) - getcont = fn2res{c}; - if ischar(getcont) - fnformat = '''%s'''; - else - fnformat = '%s'; - getcont = num2str(getcont); - end - com = sprintf( [ '%s ' fnformat], com, getcont); - end - com = sprintf( '%s }', com); - else - if ischar(fn2res) - if ~strcmpi(fn2res,'off') - com = sprintf( '%s, ''%s'', ''%s''', com, fn2com, fn2res); - end - else - %if iscell(fn2res) - % fn2resstr = vect2colon(cell2mat(fn2res), 'Sort','on'); - % fnformat = '{%s}'; - %else - fn2resstr = vect2colon(fn2res, 'Sort','on'); - fnformat = '%s'; - %end - com = sprintf( ['%s, ''%s'', ' fnformat], com, fn2com, fn2resstr); - end - end + fn2com = fn{q}; % get fieldname + if ~ismember_bc2(fn2com, skipfields) + fn2res = p.Results.(fn2com); % get content of current field + if ~isempty(fn2res) + if iscell(fn2res) + com = sprintf( '%s, ''%s'', {', com, fn2com); + for c=1:length(fn2res) + getcont = fn2res{c}; + if ischar(getcont) + fnformat = '''%s'''; + else + fnformat = '%s'; + getcont = num2str(getcont); + end + com = sprintf( [ '%s ' fnformat], com, getcont); + end + com = sprintf( '%s }', com); + else + if ischar(fn2res) + if ~strcmpi(fn2res,'off') + com = sprintf( '%s, ''%s'', ''%s''', com, fn2com, fn2res); + end + else + %if iscell(fn2res) + % fn2resstr = vect2colon(cell2mat(fn2res), 'Sort','on'); + % fnformat = '{%s}'; + %else + fn2resstr = vect2colon(fn2res, 'Sort','on'); + fnformat = '%s'; + %end + com = sprintf( ['%s, ''%s'', ' fnformat], com, fn2com, fn2resstr); end + end end + end end com = sprintf( '%s );', com); % get history from script. EEG switch shist - case 1 % from GUI - com = sprintf('%s %% GUI: %s', com, datestr(now)); - %fprintf('%%Equivalent command:\n%s\n\n', com); - displayEquiComERP(com); - case 2 % from script - EEG = erphistory(EEG, [], com, 1); - case 3 - % implicit - otherwise %off or none - com = ''; + case 1 % from GUI + com = sprintf('%s %% GUI: %s', com, datestr(now)); + %fprintf('%%Equivalent command:\n%s\n\n', com); + displayEquiComERP(com); + case 2 % from script + EEG = erphistory(EEG, [], com, 1); + case 3 + % implicit + otherwise %off or none + com = ''; end @@ -395,6 +395,6 @@ prefunc = dbstack; nf = length(unique_bc2({prefunc.name})); if nf==1 - msg2end + msg2end end return \ No newline at end of file diff --git a/pop_functions/pop_currentsourcedensity.m b/pop_functions/pop_currentsourcedensity.m index 40f26ef5..1c4a327a 100755 --- a/pop_functions/pop_currentsourcedensity.m +++ b/pop_functions/pop_currentsourcedensity.m @@ -49,6 +49,11 @@ else isERP = 0; end +try + ERPtooltype = varargin{1};%%GH 2024 +catch + ERPtooltype = 'erplab'; +end % check input dataset try @@ -124,15 +129,19 @@ MapMontage(M) %%%changed by Guanghui August 10 2022 -csd_param = erpworkingmemory('csd_param'); -ERPtooltype = erpgettoolversion('tooltype'); if strcmpi(ERPtooltype,'EStudio') + csd_param = estudioworkingmemory('csd_param'); + if isempty(csd_param) + csd_param = [4,0.00001,10,1]; + estudioworkingmemory('csd_param',csd_param); + end csd_param(4) = 0; erpworkingmemory('csd_param',csd_param); csd_param = csd_param(1:3); savepref=0; else + csd_param = erpworkingmemory('csd_param'); [csd_param] = csd_generate; csd_param(4) = 1; erpworkingmemory('csd_param',csd_param); @@ -218,9 +227,15 @@ erpcom = 'pop_currentsourcedensity(EEG)'; end + +else%%GH Mar. 2024 + if isERP + EEG.bindata = csd_data; + erpcom = sprintf('%s=pop_currentsourcedensity(%s, %s);', 'ERP','ERP', ['"',varargin{1},'"']); + else + EEG.data = csd_data; + erpcom = sprintf('%s=pop_currentsourcedensity(%s, %s);', 'EEG','EEG', ['"',varargin{1},'"']); + end end - - -%eeglab redraw - +%eeglab redraw \ No newline at end of file diff --git a/pop_functions/pop_deleterpset.m b/pop_functions/pop_deleterpset.m index 20bbf243..81fe343f 100755 --- a/pop_functions/pop_deleterpset.m +++ b/pop_functions/pop_deleterpset.m @@ -27,65 +27,65 @@ function [ALLERP, erpcom] = pop_deleterpset(ALLERP, varargin) erpcom = ''; if nargin<1 - help pop_deleterpset + help pop_deleterpset end if nargin==1 - try - CURRENTERP = evalin('base', 'CURRENTERP'); - catch - CURRENTERP = 0; - end - if CURRENTERP == 0 - msgboxText = 'ERPsets menu is already empty...'; - title = 'ERPLAB: no erpset(s)'; - errorfound(msgboxText, title); - return - end - - prompt = {'Erpset(s) to clear:'}; - dlg_title = 'Delete erpset(s)'; - num_lines = 1; - def = {num2str(CURRENTERP)}; %01-13-2009 - - % - % open window - % - answer = inputvalue(prompt,dlg_title,num_lines,def); - - if isempty(answer) - disp('User selected Cancel') - return - end - - erpindex = str2num(answer{1}); - nerpset = length(ALLERP); - erpindex = unique_bc2(erpindex); - - if isempty(erpindex) - msgboxText = 'Wrong erpset index(es)'; - title = 'ERPLAB: unrecognizable erpset(s)'; - errorfound(msgboxText, title); - return - end - if max(erpindex)>nerpset || min(erpindex)<1 - erpm = findobj('tag', 'linerp'); - nerpmenu = length(erpm); - if max(erpindex)<=nerpmenu && nerpmenu>=1 && max(erpindex)>=1 - %... - else - msgboxText = ['Wrong erpset index(es)\n'... - 'Check your erpset menu or write length(ALLERP) at command window for comprobation']; - title = 'ERPLAB: pop_deleterpset not existing erpset(s)'; - errorfound(sprintf(msgboxText), title); - return - end - end - - % - % Somersault - % - [ALLERP, erpcom] = pop_deleterpset(ALLERP, 'Erpsets', erpindex, 'Saveas', 'on','History', 'gui'); + try + CURRENTERP = evalin('base', 'CURRENTERP'); + catch + CURRENTERP = 0; + end + if CURRENTERP == 0 + msgboxText = 'ERPsets menu is already empty...'; + title = 'ERPLAB: no erpset(s)'; + errorfound(msgboxText, title); return + end + + prompt = {'Erpset(s) to clear:'}; + dlg_title = 'Delete erpset(s)'; + num_lines = 1; + def = {num2str(CURRENTERP)}; %01-13-2009 + + % + % open window + % + answer = inputvalue(prompt,dlg_title,num_lines,def); + + if isempty(answer) + disp('User selected Cancel') + return + end + + erpindex = str2num(answer{1}); + nerpset = length(ALLERP); + erpindex = unique_bc2(erpindex); + + if isempty(erpindex) + msgboxText = 'Wrong erpset index(es)'; + title = 'ERPLAB: unrecognizable erpset(s)'; + errorfound(msgboxText, title); + return + end + if max(erpindex)>nerpset || min(erpindex)<1 + erpm = findobj('tag', 'linerp'); + nerpmenu = length(erpm); + if max(erpindex)<=nerpmenu && nerpmenu>=1 && max(erpindex)>=1 + %... + else + msgboxText = ['Wrong erpset index(es)\n'... + 'Check your erpset menu or write length(ALLERP) at command window for comprobation']; + title = 'ERPLAB: pop_deleterpset not existing erpset(s)'; + errorfound(sprintf(msgboxText), title); + return + end + end + + % + % Somersault + % + [ALLERP, erpcom] = pop_deleterpset(ALLERP, 'Erpsets', erpindex, 'Saveas', 'on','History', 'gui'); + return end % @@ -105,45 +105,45 @@ erpindex = p.Results.Erpsets; if strcmpi(p.Results.Warning,'on') - warnop = 1; + warnop = 1; else - warnop = 0; + warnop = 0; end if ismember_bc2({p.Results.Saveas}, {'on','yes'}) - issaveas = 1; + issaveas = 1; else - issaveas = 0; + issaveas = 0; end if strcmpi(p.Results.History,'implicit') - shist = 3; % implicit + shist = 3; % implicit elseif strcmpi(p.Results.History,'script') - shist = 2; % script + shist = 2; % script elseif strcmpi(p.Results.History,'gui') - shist = 1; % gui + shist = 1; % gui else - shist = 0; % off + shist = 0; % off end nerpset = length(ALLERP); erpindex = unique_bc2(erpindex); if isempty(erpindex) - msgboxText = 'Wrong erpset index(es)'; - error(['ERPLAB says: ' msgboxText]) + msgboxText = 'Wrong erpset index(es)'; + error(['ERPLAB says: ' msgboxText]) end if max(erpindex)>nerpset || min(erpindex)<1 - msgboxText = 'Wrong erpset index(es)'; - error(['ERPLAB says: ' msgboxText]) + msgboxText = 'Wrong erpset index(es)'; + error(['ERPLAB says: ' msgboxText]) end detect = ~ismember_bc2(1:nerpset,erpindex); newindex = find(detect); if isempty(newindex) - ALLERP = []; + ALLERP = []; else - ALLERP = ALLERP(newindex); + ALLERP = ALLERP(newindex); end if issaveas - updatemenuerp(ALLERP, -1) - assignin('base','ALLERP',ALLERP); % save to workspace. Dec 5, 2012 + updatemenuerp(ALLERP, -1) + assignin('base','ALLERP',ALLERP); % save to workspace. Dec 5, 2012 end % erpcom = sprintf('ALLERP = pop_deleterpset( ALLERP, [%s]);', num2str(erpindex)); % @@ -153,61 +153,64 @@ fn = fieldnames(p.Results); erpcom = sprintf( '%s = pop_deleterpset( %s ', inputname(1), inputname(1) ); for q=1:length(fn) - fn2com = fn{q}; - if ~ismember_bc2(fn2com, skipfields) - fn2res = p.Results.(fn2com); - if ~isempty(fn2res) - if ischar(fn2res) - if ~strcmpi(fn2res,'off') - erpcom = sprintf( '%s, ''%s'', ''%s''', erpcom, fn2com, fn2res); - end - else - if iscell(fn2res) - if ischar([fn2res{:}]) - fn2resstr = sprintf('''%s'' ', fn2res{:}); - else - fn2resstr = vect2colon(cell2mat(fn2res), 'Sort','on'); - end - fnformat = '{%s}'; - else - fn2resstr = vect2colon(fn2res, 'Sort','on'); - fnformat = '%s'; - end - if strcmpi(fn2com,'Criterion') - if p.Results.Criterion<100 - erpcom = sprintf( ['%s, ''%s'', ' fnformat], erpcom, fn2com, fn2resstr); - end - else - erpcom = sprintf( ['%s, ''%s'', ' fnformat], erpcom, fn2com, fn2resstr); - end - end + fn2com = fn{q}; + if ~ismember_bc2(fn2com, skipfields) + fn2res = p.Results.(fn2com); + if ~isempty(fn2res) + if ischar(fn2res) + if ~strcmpi(fn2res,'off') + erpcom = sprintf( '%s, ''%s'', ''%s''', erpcom, fn2com, fn2res); + end + else + if iscell(fn2res) + if ischar([fn2res{:}]) + fn2resstr = sprintf('''%s'' ', fn2res{:}); + else + fn2resstr = vect2colon(cell2mat(fn2res), 'Sort','on'); + end + fnformat = '{%s}'; + else + fn2resstr = vect2colon(fn2res, 'Sort','on'); + fnformat = '%s'; end + if strcmpi(fn2com,'Criterion') + if p.Results.Criterion<100 + erpcom = sprintf( ['%s, ''%s'', ' fnformat], erpcom, fn2com, fn2resstr); + end + else + erpcom = sprintf( ['%s, ''%s'', ' fnformat], erpcom, fn2com, fn2resstr); + end + end end + end end erpcom = sprintf( '%s );', erpcom); % get history from script. ERP switch shist - case 1 % from GUI - displayEquiComERP(erpcom); - case 2 % from script - for i=1:length(ALLERP) - ALLERP(i) = erphistory(ALLERP(i), [], erpcom, 1); - end - case 3 - % implicit - - %for i=1:length(ALLERP) - % ALLERP(i) = erphistory(ALLERP(i), [], erpcom, 1); - %end - %fprintf('%%Equivalent command:\n%s\n\n', erpcom); - otherwise %off or none - erpcom = ''; + case 1 % from GUI + displayEquiComERP(erpcom); + case 2 % from script + for i=1:length(ALLERP) + ALLERP(i) = erphistory(ALLERP(i), [], erpcom, 1); + end + case 3 + % implicit + + %for i=1:length(ALLERP) + % ALLERP(i) = erphistory(ALLERP(i), [], erpcom, 1); + %end + %fprintf('%%Equivalent command:\n%s\n\n', erpcom); + otherwise %off or none + erpcom = ''; end % % Completion statement % msg2end -eeglab redraw +ERPtooltype = erpgettoolversion('tooltype'); +if ~strcmpi(ERPtooltype,'EStudio') + eeglab redraw +end return diff --git a/pop_functions/pop_eeglindetrend.m b/pop_functions/pop_eeglindetrend.m index b93f1ba4..f174f0b0 100755 --- a/pop_functions/pop_eeglindetrend.m +++ b/pop_functions/pop_eeglindetrend.m @@ -2,7 +2,7 @@ % % FORMAT : % -% >> EEG = pop_eeglindetrend( EEG, detwindow ); +% >> EEG = pop_eeglindetrend( EEG, 'Baseline',detwindow ); % % % INPUTS : @@ -17,8 +17,8 @@ % % EXAMPLE : % -% EEG = pop_eeglindetrend( EEG, 'pre'); -% EEG = pop_eeglindetrend( EEG, [-300 100]); +% EEG = pop_eeglindetrend( EEG, 'Baseline','pre'); +% EEG = pop_eeglindetrend( EEG, 'Baseline', [-300 100]); % % % See also blcerpGUI.m lindetrend.m @@ -51,65 +51,70 @@ % You should have received a copy of the GNU General Public License % along with this program. If not, see . -function [EEG, com] = pop_eeglindetrend( EEG, detwindow, varargin) +function [EEG, com] = pop_eeglindetrend( EEG, varargin) com = ''; if nargin < 1 - help pop_lindetrend - return + help pop_lindetrend + return end if isobject(EEG) % eegobj - whenEEGisanObject % calls a script for showing an error window - return + whenEEGisanObject % calls a script for showing an error window + return end if nargin==1 - if isempty(EEG(1).data) - msgboxText = 'pop_lindetrend() cannot read an empty dataset!'; - title = 'ERPLAB: pop_lindetrend error'; - errorfound(msgboxText, title); - return - end - if isempty(EEG(1).epoch) - msgboxText = 'pop_lindetrend has been tested for epoched data only'; - title = 'ERPLAB: pop_lindetrend error'; - errorfound(msgboxText, title); - return - end - - def = erpworkingmemory('pop_eeglindetrend'); - if isempty(def) - def = 'pre'; - end - - % - % Call GUI - % - titlegui = 'Linear Detrend'; - answer = blcerpGUI(EEG(1), titlegui, def); % open GUI - if isempty(answer) - disp('User selected Cancel') - return - end - detwindow = answer{1}; - if ischar(detwindow) && strcmpi(detwindow, 'none') - disp('User selected Cancel') - return - end - if isempty(detwindow) - disp('User selected Cancel') - return - end - - erpworkingmemory('pop_eeglindetrend', detwindow); - - if length(EEG)==1 - EEG.setname = [EEG.setname '_ld']; % suggested name (si queris no mas!) - end - % - % Somersault - % - wchmsgonstr ='off'; %temporary - [EEG, com] = pop_eeglindetrend( EEG, detwindow, 'Warning', wchmsgonstr, 'History', 'gui'); + if isempty(EEG(1).data) + msgboxText = 'pop_lindetrend() cannot read an empty dataset!'; + title = 'ERPLAB: pop_lindetrend error'; + errorfound(msgboxText, title); return + end + if isempty(EEG(1).epoch) + msgboxText = 'pop_lindetrend has been tested for epoched data only'; + title = 'ERPLAB: pop_lindetrend error'; + errorfound(msgboxText, title); + return + end + + def = erpworkingmemory('pop_eeglindetrend'); + if isempty(def) + def = 'pre'; + end + + % + % Call GUI + % + titlegui = 'Linear Detrend'; + answer = blcerpGUI(EEG(1), titlegui, def); % open GUI + if isempty(answer) + disp('User selected Cancel') + return + end + detwindow = answer{1}; + if ischar(detwindow) && strcmpi(detwindow, 'none') + disp('User selected Cancel') + return + end + if isempty(detwindow) + disp('User selected Cancel') + return + end + + erpworkingmemory('pop_eeglindetrend', detwindow); + + if length(EEG)==1 + EEG.setname = [EEG.setname '_ld']; % suggested name (si queris no mas!) + end + + ChanArray = answer{2}; + + + % + % Somersault + % + wchmsgonstr ='off'; %temporary + [EEG, com] = pop_eeglindetrend( EEG, 'Baseline', detwindow,'ChanArray',ChanArray,... + 'Warning', wchmsgonstr, 'History', 'gui'); + return end % @@ -119,116 +124,135 @@ p.FunctionName = mfilename; p.CaseSensitive = false; p.addRequired('EEG'); -p.addRequired('detwindow'); % option(s) +p.addParamValue('Baseline', 'pre'); p.addParamValue('Warning', 'off', @ischar); +p.addParamValue('ChanArray', [], @isnumeric); % 'on', 'off' p.addParamValue('History', 'script', @ischar); % history from scripting -p.parse(EEG, detwindow, varargin{:}); +p.parse(EEG, varargin{:}); if strcmpi(p.Results.Warning,'on') - wchmsgon = 1; + wchmsgon = 1; else - wchmsgon = 0; + wchmsgon = 0; end if strcmpi(p.Results.History,'implicit') - shist = 3; % implicit + shist = 3; % implicit elseif strcmpi(p.Results.History,'script') - shist = 2; % script + shist = 2; % script elseif strcmpi(p.Results.History,'gui') - shist = 1; % gui + shist = 1; % gui else - shist = 0; % off + shist = 0; % off end +ChanArray = p.Results.ChanArray; +if isempty(ChanArray) || any(ChanArray(:)>EEG.nbchan) || any(ChanArray(:)<1) + ChanArray = [1:EEG.nbchan]; +end + +detwindow = p.Results.Baseline; % in case of an error -if ischar(detwindow) && ~strcmpi(detwindow,'all') && ~strcmpi(detwindow,'pre') && ~strcmpi(detwindow,'post') - internum = str2num(detwindow); - if length(internum)~=2 - msgboxText = ['Unappropriated time range for detrending\n'... - 'lindetrend() was ended.\n']; - if shist == 1; % gui - title = 'ERPLAB: pop_eeglindetrend() error'; - errorfound(sprintf(msgboxText), title); - return - else - error('prog:input', msgboxText) - end +if ischar(detwindow) && ~strcmpi(detwindow,'all') && ~strcmpi(detwindow,'pre') && ~strcmpi(detwindow,'post') && ~strcmpi(detwindow,'none') + internum = str2num(detwindow); + if length(internum)~=2 + msgboxText = ['Unappropriated time range for detrending\n'... + 'lindetrend() was ended.\n']; + if shist == 1; % gui + title = 'ERPLAB: pop_eeglindetrend() error'; + errorfound(sprintf(msgboxText), title); + return + else + error('prog:input', msgboxText) end + end end % % process multiple datasets. Updated August 23, 2013 JLC % -options1 = {detwindow, 'Warning', p.Results.Warning, 'History', 'gui'}; +options1 = {'Baseline',detwindow,'ChanArray',ChanArray, 'Warning', p.Results.Warning, 'History', 'gui'}; +EEGaux = EEG; +ChanArrayleft = setdiff([1:EEG.nbchan],ChanArray); if length(EEG) > 1 - [ EEG, com ] = eeg_eval( 'pop_eeglindetrend', EEG, 'warning', 'on', 'params', options1); - return; + [ EEG, com ] = eeg_eval( 'pop_eeglindetrend', EEG, 'warning', 'on', 'params', options1); + if ~isempty(ChanArrayleft) + if length(EEG) > 1 + for Numofeeg = 1:length(EEG) + EEG(Numofeeg).data(ChanArrayleft,:,:) = EEGaux(Numofeeg).data(ChanArrayleft,:,:); + end + end + end + return; end; + + % % subroutine % EEG = lindetrend( EEG, detwindow); +if ~isempty(ChanArrayleft) + EEG.data(ChanArrayleft,:,:) = EEGaux.data(ChanArrayleft,:,:); +end + + % com = sprintf( '%s = pop_eeglindetrend( %s, ''%s'' );', inputname(1), inputname(1), detwindow); % % History % -skipfields = {'EEG', 'detwindow','Saveas','History'}; +skipfields = {'EEG','Saveas','History'}; fn = fieldnames(p.Results); -if isnumeric(detwindow) - dtwin = vect2colon(detwindow); -else - dtwin = ['''' detwindow '''']; -end -com = sprintf('%s = pop_eeglindetrend( %s, %s', inputname(1), inputname(1), dtwin); - + +com = sprintf('%s = pop_eeglindetrend( %s,', inputname(1), inputname(1)); + for q=1:length(fn) - fn2com = fn{q}; - if ~ismember_bc2(fn2com, skipfields) - fn2res = p.Results.(fn2com); - if ~isempty(fn2res) - if ischar(fn2res) - if ~strcmpi(fn2res,'off') - com = sprintf( '%s, ''%s'', ''%s''', com, fn2com, fn2res); - end - else - if iscell(fn2res) - if ischar([fn2res{:}]) - fn2resstr = sprintf('''%s'' ', fn2res{:}); - else - fn2resstr = vect2colon(cell2mat(fn2res), 'Sort','on'); - end - fnformat = '{%s}'; - else - fn2resstr = vect2colon(fn2res, 'Sort','on'); - fnformat = '%s'; - end - if strcmpi(fn2com,'Criterion') - if p.Results.Criterion<100 - com = sprintf( ['%s, ''%s'', ' fnformat], com, fn2com, fn2resstr); - end - else - com = sprintf( ['%s, ''%s'', ' fnformat], com, fn2com, fn2resstr); - end - end + fn2com = fn{q}; + if ~ismember_bc2(fn2com, skipfields) + fn2res = p.Results.(fn2com); + if ~isempty(fn2res) + if ischar(fn2res) + if ~strcmpi(fn2res,'off') + com = sprintf( '%s, ''%s'', ''%s''', com, fn2com, fn2res); + end + else + if iscell(fn2res) + if ischar([fn2res{:}]) + fn2resstr = sprintf('''%s'' ', fn2res{:}); + else + fn2resstr = vect2colon(cell2mat(fn2res), 'Sort','on'); + end + fnformat = '{%s}'; + else + fn2resstr = vect2colon(fn2res, 'Sort','on'); + fnformat = '%s'; + end + if strcmpi(fn2com,'Criterion') + if p.Results.Criterion<100 + com = sprintf( ['%s, ''%s'', ' fnformat], com, fn2com, fn2resstr); + end + else + com = sprintf( ['%s, ''%s'', ' fnformat], com, fn2com, fn2resstr); end + end end + end end com = sprintf( '%s );', com); % get history from script. EEG switch shist - case 1 % from GUI - com = sprintf('%s %% GUI: %s', com, datestr(now)); - %fprintf('%%Equivalent command:\n%s\n\n', com); - displayEquiComERP(com); - case 2 % from script - EEG = erphistory(EEG, [], com, 1); - case 3 - % implicit - otherwise %off or none - com = ''; + case 1 % from GUI + com = sprintf('%s %% GUI: %s', com, datestr(now)); + %fprintf('%%Equivalent command:\n%s\n\n', com); + displayEquiComERP(com); + case 2 % from script + EEG = erphistory(EEG, [], com, 1); + case 3 + % implicit + otherwise %off or none + com = ''; end % diff --git a/pop_functions/pop_eegtrim.m b/pop_functions/pop_eegtrim.m index cdf8e9ed..b5c2fa30 100755 --- a/pop_functions/pop_eegtrim.m +++ b/pop_functions/pop_eegtrim.m @@ -4,18 +4,18 @@ % % FORMAT: % EEG = pop_eegtrim(EEG, pre, post) -% +% % INPUT % % EEG - input dataset % pre - pre-stimulation window in ms (time left before the first event) % post - post-stimulation window in ms (time left after the last event) -% -% +% +% % OUTPUT % % EEG - trimmed continuous dataset () -% +% % Author: Javier Lopez-Calderon & Johanna Kreither % Center for Mind and Brain % University of California, Davis, @@ -25,39 +25,39 @@ function [EEG, com] = pop_eegtrim(EEG, pre, post, varargin) com = ''; if nargin<1 - help pop_eegtrim - return + help pop_eegtrim + return end if nargin==1 - serror = erplab_eegscanner(EEG, 'pop_creabasiceventlist', 2, 0, 0, 2, 2); % check for continuous dataset - if serror - return - end - def = erpworkingmemory('pop_eegtrim'); - - % - % Call GUI - % - answer = gui_eegtrim(def); - - if isempty(answer) - disp('User selected Cancel') - return - end - - pre = answer{1}; - post = answer{2}; - - erpworkingmemory('pop_eegtrim', {answer{1} answer{2}}); - if length(EEG)==1 - EEG.setname = [EEG.setname '_trim']; %suggest a new name - end - - % - % Somersault - % - [EEG, com] = pop_eegtrim(EEG, pre, post, 'History', 'gui'); - return + serror = erplab_eegscanner(EEG, 'pop_creabasiceventlist', 2, 0, 0, 2, 2); % check for continuous dataset + if serror + return + end + def = erpworkingmemory('pop_eegtrim'); + + % + % Call GUI + % + answer = gui_eegtrim(def); + + if isempty(answer) + disp('User selected Cancel') + return + end + + pre = answer{1}; + post = answer{2}; + + erpworkingmemory('pop_eegtrim', {answer{1} answer{2}}); + if length(EEG)==1 + EEG.setname = [EEG.setname '_trim']; %suggest a new name + end + + % + % Somersault + % + [EEG, com] = pop_eegtrim(EEG, pre, post, 'History', 'gui'); + return end % @@ -74,22 +74,22 @@ p.parse(EEG, pre, post, varargin{:}); if strcmpi(p.Results.History,'implicit') - shist = 3; % implicit + shist = 3; % implicit elseif strcmpi(p.Results.History,'script') - shist = 2; % script + shist = 2; % script elseif strcmpi(p.Results.History,'gui') - shist = 1; % gui + shist = 1; % gui else - shist = 0; % off + shist = 0; % off end t1 = EEG.event(1).latency; if t1<=2 - t1 = EEG.event(2).latency; + t1 = EEG.event(2).latency; end t2 = EEG.event(end).latency; if t2>=EEG.pnts-2 - t2 = EEG.event(end-1).latency; + t2 = EEG.event(end-1).latency; end pnts = EEG.pnts; fs = EEG.srate; @@ -101,55 +101,55 @@ post2 = pnts; if pre2<1 - error('There is not enough samples to keep the pre-stimulation window.') + error('There is not enough samples to keep the pre-stimulation window.') end if post1>pnts - error('There is not enough samples to keep the post-stimulation window.') + error('There is not enough samples to keep the post-stimulation window.') end % trimming disp('Trimming data...') EEG = eeg_eegrej( EEG, [pre1 pre2;post1 post2]); -skipfields = {'EEG', 'History'}; +skipfields = {'EEG', 'History','pre','post'};%%GH Mar. 2024 fn = fieldnames(p.Results); com = sprintf( '%s = pop_eegtrim( %s, %g, %g ', inputname(1), inputname(1), pre, post); for q=1:length(fn) - fn2com = fn{q}; - if ~ismember_bc2(fn2com, skipfields) - fn2res = p.Results.(fn2com); - if ~isempty(fn2res) - if ischar(fn2res) - if ~strcmpi(fn2res,'off') - com = sprintf( '%s, ''%s'', ''%s''', com, fn2com, fn2res); - end - else - if iscell(fn2res) - fn2resstr = vect2colon(cell2mat(fn2res), 'Sort','on'); - fnformat = '{%s}'; - else - fn2resstr = vect2colon(fn2res, 'Sort','on'); - fnformat = '%s'; - end - com = sprintf( ['%s, ''%s'', ' fnformat], com, fn2com, fn2resstr); - end + fn2com = fn{q}; + if ~ismember_bc2(fn2com, skipfields) + fn2res = p.Results.(fn2com); + if ~isempty(fn2res) + if ischar(fn2res) + if ~strcmpi(fn2res,'off') + com = sprintf( '%s, ''%s'', ''%s''', com, fn2com, fn2res); + end + else + if iscell(fn2res) + fn2resstr = vect2colon(cell2mat(fn2res), 'Sort','on'); + fnformat = '{%s}'; + else + fn2resstr = vect2colon(fn2res, 'Sort','on'); + fnformat = '%s'; end + com = sprintf( ['%s, ''%s'', ' fnformat], com, fn2com, fn2resstr); + end end + end end com = sprintf( '%s );', com); % get history from script switch shist - case 1 % from GUI - com = sprintf('%s %% GUI: %s', com, datestr(now)); - %fprintf('%%Equivalent command:\n%s\n\n', com); - displayEquiComERP(com); - case 2 % from script - EEG = erphistory(EEG, [], com, 1); - case 3 - % implicit - otherwise %off or none - com = ''; + case 1 % from GUI + com = sprintf('%s %% GUI: %s', com, datestr(now)); + %fprintf('%%Equivalent command:\n%s\n\n', com); + displayEquiComERP(com); + case 2 % from script + EEG = erphistory(EEG, [], com, 1); + case 3 + % implicit + otherwise %off or none + com = ''; end % diff --git a/pop_functions/pop_epoch2continuous.m b/pop_functions/pop_epoch2continuous.m old mode 100644 new mode 100755 index a24bd5b3..f6ac5170 --- a/pop_functions/pop_epoch2continuous.m +++ b/pop_functions/pop_epoch2continuous.m @@ -158,8 +158,7 @@ end -% com = sprintf('%s = pop_epoch2continuous(%s);', inputname(1), inputname(1)); -com = sprintf( '%s = pop_bdfrecovery( %s ', inputname(1), inputname(1) ); +com = sprintf( '%s = pop_epoch2continuous( %s ', inputname(1), inputname(1) ); skipfields = {'History'}; fn = fieldnames(p.Results); for q=1:length(fn) diff --git a/pop_functions/pop_eraseventcodes.m b/pop_functions/pop_eraseventcodes.m index 5e313d8d..42a8914e 100755 --- a/pop_functions/pop_eraseventcodes.m +++ b/pop_functions/pop_eraseventcodes.m @@ -95,7 +95,7 @@ errorfound(sprintf(msgboxText), title); return end - prompt = {'expression (>, < ==, ~=):'}; + prompt = {'expression (>, <, ==, ~=):'}; dlg_title = 'Input event-code condition to delete'; num_lines = 1; def = erpworkingmemory('pop_eraseventcodes'); diff --git a/pop_functions/pop_erplindetrend.m b/pop_functions/pop_erplindetrend.m index 706a7b60..6f233000 100755 --- a/pop_functions/pop_erplindetrend.m +++ b/pop_functions/pop_erplindetrend.m @@ -2,7 +2,7 @@ % % FORMAT : % -% ERP = pop_erplindetrend( ERP, detwindow ); +% ERP = pop_erplindetrend( ERP,'Baseline', detwindow ); % % INPUTS : % @@ -16,9 +16,9 @@ % % % EXAMPLE : -% ERP = pop_erplindetrend( ERP, 'post'); -% ERP = pop_erplindetrend( ERP, '0 798'); -% ERP = pop_erplindetrend( ERP, [0 798]); +% ERP = pop_erplindetrend( ERP, 'Baseline', 'post'); +% ERP = pop_erplindetrend( ERP,'Baseline', '0 798'); +% ERP = pop_erplindetrend( ERP, 'Baseline', [0 798]); % % See also blcerpGUI.m lindetrend.m % @@ -51,55 +51,57 @@ % You should have received a copy of the GNU General Public License % along with this program. If not, see . -function [ERP, erpcom] = pop_erplindetrend( ERP, detwindow, varargin) +function [ERP, erpcom] = pop_erplindetrend( ERP, varargin) erpcom = ''; if nargin < 1 - help pop_erplindetrend - return + help pop_erplindetrend + return end if isfield(ERP(1), 'datatype') - datatype = ERP.datatype; + datatype = ERP.datatype; else - datatype = 'ERP'; + datatype = 'ERP'; end if nargin==1 - title_msg = 'ERPLAB: pop_erplindetrend() error:'; - if isempty(ERP) - ERP = preloadERP; - if isempty(ERP) - msgboxText = 'No ERPset was found!'; - - errorfound(msgboxText, title_msg); - return - end - end - if ~strcmpi(datatype, 'ERP') - msgboxText = 'Cannot detrend Power Spectrum waveforms. Sorry'; + title_msg = 'ERPLAB: pop_erplindetrend() error:'; + if isempty(ERP) + ERP = preloadERP; + if isempty(ERP) + msgboxText = 'No ERPset was found!'; + errorfound(msgboxText, title_msg); return - end - def = erpworkingmemory('pop_erplindetrend'); - if isempty(def) - def = {'pre'}; - end - - % - % Call GUI - % - titlegui = 'Linear Detrend'; - answer = blcerpGUI(ERP, titlegui, def); - if isempty(answer) - disp('User selected Cancel') - return - end - detwindow = answer{1}; - erpworkingmemory('pop_erplindetrend', detwindow); - - % - % Somersault - % - [ERP, erpcom] = pop_erplindetrend(ERP, detwindow, 'Warning', 'on', 'Saveas', 'on','ErrorMsg', 'popup', 'History', 'gui'); - return + end + end + if ~strcmpi(datatype, 'ERP') + msgboxText = 'Cannot detrend Power Spectrum waveforms. Sorry'; + errorfound(msgboxText, title_msg); + return + end + def = erpworkingmemory('pop_erplindetrend'); + if isempty(def) + def = {'pre'}; + end + + % + % Call GUI + % + titlegui = 'Linear Detrend'; + answer = blcerpGUI(ERP, titlegui, def); + if isempty(answer) + disp('User selected Cancel') + return + end + detwindow = answer{1}; + erpworkingmemory('pop_erplindetrend', detwindow); + ChanArray = answer{2}; + BinArray = answer{3}; + % + % Somersault + % + [ERP, erpcom] = pop_erplindetrend(ERP,'Baseline', detwindow,'ChanArray',ChanArray,... + 'BinArray',BinArray, 'Warning', 'on', 'Saveas', 'on','ErrorMsg', 'popup', 'History', 'gui'); + return end % @@ -109,60 +111,76 @@ p.FunctionName = mfilename; p.CaseSensitive = false; p.addRequired('ERP'); -p.addRequired('detwindow'); % option(s) +p.addParamValue('Baseline', 'pre'); p.addParamValue('Warning', 'off', @ischar); +p.addParamValue('ChanArray', [], @isnumeric); +p.addParamValue('BinArray', [], @isnumeric); p.addParamValue('Saveas', 'off', @ischar); % 'on', 'off' p.addParamValue('ErrorMsg', 'cw', @ischar); % cw = command window p.addParamValue('History', 'script', @ischar); % history from scripting -p.parse(ERP, detwindow, varargin{:}); +p.parse(ERP, varargin{:}); if strcmpi(p.Results.Warning,'on') - wchmsgon = 1; + wchmsgon = 1; else - wchmsgon = 0; + wchmsgon = 0; end if ismember_bc2({p.Results.Saveas}, {'on','yes'}) - issaveas = 1; + issaveas = 1; else - issaveas = 0; + issaveas = 0; end if strcmpi(p.Results.History,'implicit') - shist = 3; % implicit + shist = 3; % implicit elseif strcmpi(p.Results.History,'script') - shist = 2; % script + shist = 2; % script elseif strcmpi(p.Results.History,'gui') - shist = 1; % gui + shist = 1; % gui else - shist = 0; % off + shist = 0; % off end if strcmpi(p.Results.ErrorMsg,'popup') - errormsgtype = 1; % open popup window + errormsgtype = 1; % open popup window else - errormsgtype = 0; % error in red at command window + errormsgtype = 0; % error in red at command window end + + +ChanArray = p.Results.ChanArray; +if isempty(ChanArray) || any(ChanArray(:)>ERP.nchan) || any(ChanArray(:)<1) + ChanArray = [1:ERP.nchan]; +end + + +BinArray = p.Results.BinArray; +if isempty(BinArray) || any(BinArray(:)>ERP.nbin) || any(BinArray(:)<1) + BinArray = [1:ERP.nbin]; +end +detwindow = p.Results.Baseline; + if ischar(detwindow) - if ~strcmpi(detwindow,'all') && ~strcmpi(detwindow,'pre') && ~strcmpi(detwindow,'post') - internum = str2num(detwindow); - if length(internum)~=2 - msgboxText = 'Wrong interval. Linear detrending will not be performed.'; - title = 'ERPLAB: pop_erplindetrend() error'; - errorfound(msgboxText, title); - return - end - detwindowstr = ['[ ' num2str(internum) ' ]']; - else - detwindowstr = ['''' detwindow '''']; - end -else - if length(detwindow)~=2 + if ~strcmpi(detwindow,'all') && ~strcmpi(detwindow,'pre') && ~strcmpi(detwindow,'post') && ~strcmpi(detwindow,'none') + internum = str2num(detwindow); + if length(internum)~=2 msgboxText = 'Wrong interval. Linear detrending will not be performed.'; title = 'ERPLAB: pop_erplindetrend() error'; errorfound(msgboxText, title); return - end - detwindowstr = ['[ ' num2str(detwindow) ' ]']; + end + detwindowstr = ['[ ' num2str(internum) ' ]']; + else + detwindowstr = ['''' detwindow '''']; + end +else + if length(detwindow)~=2 + msgboxText = 'Wrong interval. Linear detrending will not be performed.'; + title = 'ERPLAB: pop_erplindetrend() error'; + errorfound(msgboxText, title); + return + end + detwindowstr = ['[ ' num2str(detwindow) ' ]']; end ERPaux = ERP; @@ -172,42 +190,94 @@ % ERP = lindetrend( ERP, detwindow); + +ChanArrayleft = setdiff([1:ERP.nchan],ChanArray);%% channles are not for baseline correction +if ~isempty(ChanArrayleft) + ERP.bindata(ChanArrayleft,:,:) = ERPaux.bindata(ChanArrayleft,:,:); +end + + +BinArrayleft = setdiff([1:ERP.nbin],BinArray);%% channles are not for baseline correction +if ~isempty(BinArrayleft) + ERP.bindata(:,:,BinArrayleft) = ERPaux.bindata(:,:,BinArrayleft); +end + + % % Completion statement % msg2end ERP.saved = 'no'; -erpcom = sprintf( '%s = pop_erplindetrend( %s, %s );', inputname(1), inputname(1), detwindowstr); -if issaveas - [ERP, issave, erpcom_save] = pop_savemyerp(ERP,'gui','erplab', 'History', 'off'); - if issave>0 - if issave==2 - erpcom = sprintf('%s\n%s', erpcom, erpcom_save); - msgwrng = '*** Your ERPset was saved on your hard drive.***'; - mcolor = [0 0 1]; + + +skipfields = {'ERP', 'History'}; +fn = fieldnames(p.Results); +erpcom = sprintf( '%s = pop_erplindetrend( %s ', inputname(1), inputname(1) ); +for q=1:length(fn) + fn2com = fn{q}; + if ~ismember_bc2(fn2com, skipfields) + fn2res = p.Results.(fn2com); + if ~isempty(fn2res) + if ischar(fn2res) + if ~strcmpi(fn2res,'off') + erpcom = sprintf( '%s, ''%s'', ''%s''', erpcom, fn2com, fn2res); + end else - msgwrng = '*** Warning: Your ERPset was only saved on the workspace.***'; - mcolor = [1 0.52 0.2]; + if iscell(fn2res) + if ischar([fn2res{:}]) + fn2resstr = sprintf('''%s'' ', fn2res{:}); + else + fn2resstr = vect2colon(cell2mat(fn2res), 'Sort','on'); + end + fnformat = '{%s}'; + else + fn2resstr = vect2colon(fn2res, 'Sort','on'); + fnformat = '%s'; + end + if strcmpi(fn2com,'Criterion') + if p.Results.Criterion<100 + erpcom = sprintf( ['%s, ''%s'', ' fnformat], erpcom, fn2com, fn2resstr); + end + else + erpcom = sprintf( ['%s, ''%s'', ' fnformat], erpcom, fn2com, fn2resstr); + end end - else - ERP = ERPaux; - msgwrng = 'ERPLAB Warning: Your changes were not saved'; - mcolor = [1 0.22 0.2]; - end - try cprintf(mcolor, '%s\n\n', msgwrng);catch,fprintf('%s\n\n', msgwrng);end ; + end + end +end +erpcom = sprintf( '%s );', erpcom); + + +if issaveas + [ERP, issave, erpcom_save] = pop_savemyerp(ERP,'gui','erplab', 'History', 'off'); + if issave>0 + if issave==2 + erpcom = sprintf('%s\n%s', erpcom, erpcom_save); + msgwrng = '*** Your ERPset was saved on your hard drive.***'; + mcolor = [0 0 1]; + else + msgwrng = '*** Warning: Your ERPset was only saved on the workspace.***'; + mcolor = [1 0.52 0.2]; + end + else + ERP = ERPaux; + msgwrng = 'ERPLAB Warning: Your changes were not saved'; + mcolor = [1 0.22 0.2]; + end + try cprintf(mcolor, '%s\n\n', msgwrng);catch,fprintf('%s\n\n', msgwrng);end ; end % get history from script. ERP switch shist - case 1 % from GUI - displayEquiComERP(erpcom); - case 2 % from script - ERP = erphistory(ERP, [], erpcom, 1); - case 3 - % implicit - %ERP = erphistory(ERP, [], erpcom, 1); - %fprintf('%%Equivalent command:\n%s\n\n', erpcom); - otherwise %off or none - erpcom = ''; + case 1 % from GUI + displayEquiComERP(erpcom); + case 2 % from script + ERP = erphistory(ERP, [], erpcom, 1); + case 3 + % implicit + %ERP = erphistory(ERP, [], erpcom, 1); + %fprintf('%%Equivalent command:\n%s\n\n', erpcom); + otherwise %off or none + erpcom = ''; end return diff --git a/pop_functions/pop_exporteegeventlist.m b/pop_functions/pop_exporteegeventlist.m index f23745df..d33b244c 100755 --- a/pop_functions/pop_exporteegeventlist.m +++ b/pop_functions/pop_exporteegeventlist.m @@ -52,154 +52,156 @@ function [EEG, com] = pop_exporteegeventlist(EEG, varargin) com = ''; if nargin < 1 - help pop_exporteegeventlist - return + help pop_exporteegeventlist + return end if isobject(EEG) % eegobj - whenEEGisanObject % calls a script for showing an error window - return + whenEEGisanObject % calls a script for showing an error window + return end if length(EEG)>1 - msgboxText = 'Unfortunately, this function does not work with multiple datasets'; - title = 'ERPLAB: multiple inputs'; - errorfound(msgboxText, title); - return + msgboxText = 'Unfortunately, this function does not work with multiple datasets'; + title = 'ERPLAB: multiple inputs'; + errorfound(msgboxText, title); + return end if nargin==1 - if isempty(EEG) - msgboxText = 'pop_exporteegeventlist() error: cannot work with an empty dataset!'; - title = 'ERPLAB: No data'; - errorfound(msgboxText, title); - return - end - if isempty(EEG.data) - msgboxText = 'pop_exporteegeventlist() error: cannot work with an empty dataset!'; - title = 'ERPLAB: No data'; - errorfound(msgboxText, title); - return - end - if isfield(EEG, 'EVENTLIST') - if isempty(EEG.EVENTLIST) - msgboxText = ['EEG.EVENTLIST structure is empty.\n\n'... - 'Please, use ERPLAB --> EVENTLIST --> Create EEG EventList menu before exporting to text.']; - title = 'ERPLAB: pop_exporteegeventlist() error, EVENTLIST structure'; - errorfound(sprintf(msgboxText), title); - return - end - if isfield(EEG.EVENTLIST, 'eventinfo') - if isempty(EEG.EVENTLIST.eventinfo) - msgboxText = ['EEG.EVENTLIST.eventinfo structure is empty.\n\n'... - 'Please, use ERPLAB --> EVENTLIST --> Create EEG EventList menu before exporting to text.']; - title = 'ERPLAB: pop_exporteegeventlist() error, EVENTLIST structure'; - errorfound(sprintf(msgboxText), title); - return - end - else - msgboxText = ['EEG.EVENTLIST.eventinfo structure is empty.\n\n'... - 'Please, use ERPLAB --> EVENTLIST --> Create EEG EventList menu before exporting to text.']; - title = 'ERPLAB: pop_exporteegeventlist() error, EVENTLIST structure'; - errorfound(sprintf(msgboxText), title); - return - end - else - msgboxText = ['EEG.EVENTLIST structure is empty.\n\n'... - 'Please, use ERPLAB --> EVENTLIST --> Create EEG EventList menu before exporting to text.']; - title = 'ERPLAB: pop_exporteegeventlist() error, EVENTLIST structure'; - errorfound(sprintf(msgboxText), title); - return + if isempty(EEG) + msgboxText = 'pop_exporteegeventlist() error: cannot work with an empty dataset!'; + title = 'ERPLAB: No data'; + errorfound(msgboxText, title); + return + end + if isempty(EEG.data) + msgboxText = 'pop_exporteegeventlist() error: cannot work with an empty dataset!'; + title = 'ERPLAB: No data'; + errorfound(msgboxText, title); + return + end + if isfield(EEG, 'EVENTLIST') + if isempty(EEG.EVENTLIST) + msgboxText = ['EEG.EVENTLIST structure is empty.\n\n'... + 'Please, use ERPLAB --> EVENTLIST --> Create EEG EventList menu before exporting to text.']; + title = 'ERPLAB: pop_exporteegeventlist() error, EVENTLIST structure'; + errorfound(sprintf(msgboxText), title); + return end - if ~isfield(EEG.EVENTLIST, 'bdf') - msgboxText = ['EEG.EVENTLIST.bdf structure is empty.\n\n'... - 'Please, use ERPLAB --> EVENTLIST --> Create EEG EventList menu before exporting to text.']; + if isfield(EEG.EVENTLIST, 'eventinfo') + if isempty(EEG.EVENTLIST.eventinfo) + msgboxText = ['EEG.EVENTLIST.eventinfo structure is empty.\n\n'... + 'Please, use ERPLAB --> EVENTLIST --> Create EEG EventList menu before exporting to text.']; title = 'ERPLAB: pop_exporteegeventlist() error, EVENTLIST structure'; errorfound(sprintf(msgboxText), title); return + end + else + msgboxText = ['EEG.EVENTLIST.eventinfo structure is empty.\n\n'... + 'Please, use ERPLAB --> EVENTLIST --> Create EEG EventList menu before exporting to text.']; + title = 'ERPLAB: pop_exporteegeventlist() error, EVENTLIST structure'; + errorfound(sprintf(msgboxText), title); + return end + else + msgboxText = ['EEG.EVENTLIST structure is empty.\n\n'... + 'Please, use ERPLAB --> EVENTLIST --> Create EEG EventList menu before exporting to text.']; + title = 'ERPLAB: pop_exporteegeventlist() error, EVENTLIST structure'; + errorfound(sprintf(msgboxText), title); + return + end + if ~isfield(EEG.EVENTLIST, 'bdf') + msgboxText = ['EEG.EVENTLIST.bdf structure is empty.\n\n'... + 'Please, use ERPLAB --> EVENTLIST --> Create EEG EventList menu before exporting to text.']; + title = 'ERPLAB: pop_exporteegeventlist() error, EVENTLIST structure'; + errorfound(sprintf(msgboxText), title); + return + end + + % + % Save OUTPUT file + % + [fname, pathname,indx] = uiputfile({'*.txt';'*.xls,*.xlsx';'*.*'},'Save EVENTLIST file as');%%GH Mar 2024 + + if isequal(fname,0) + disp('User selected Cancel') + return + else + [xpath, fname, ext] = fileparts(fname); - % - % Save OUTPUT file - % - [fname, pathname] = uiputfile({'*.txt';'*.*'},'Save EVENTLIST file as'); - - if isequal(fname,0) - disp('User selected Cancel') - return + if indx==2 + ext = '.xls'; else - [xpath, fname, ext] = fileparts(fname); - - if ~strcmp(ext,'.txt') - ext = '.txt'; - end - - fname = [fname ext]; - elname = fullfile(pathname, fname); - disp(['For EVENTLIST output user selected ', elname]) + ext = '.txt'; end - % - % Somersault - % - [EEG, com] = pop_exporteegeventlist(EEG, 'Filename', elname, 'History', 'gui'); - return + fname = [fname ext]; + elname = fullfile(pathname, fname); + disp(['For EVENTLIST output user selected ', elname]) + end + + % + % Somersault + % + [EEG, com] = pop_exporteegeventlist(EEG, 'Filename', elname, 'History', 'gui'); + return end if nargin==2 - % - % Parsing inputs (versions<4.0) - % - p = inputParser; - p.FunctionName = mfilename; - p.CaseSensitive = false; - p.addRequired('EEG'); - p.addRequired('varargin'); - - % option(s) - p.addParamValue('History', 'script', @ischar); % history from scripting - p.parse(EEG, varargin{:}); - elname = varargin{:}; + % + % Parsing inputs (versions<4.0) + % + p = inputParser; + p.FunctionName = mfilename; + p.CaseSensitive = false; + p.addRequired('EEG'); + p.addRequired('varargin'); + + % option(s) + p.addParamValue('History', 'script', @ischar); % history from scripting + p.parse(EEG, varargin{:}); + elname = varargin{:}; else - % - % Parsing inputs - % - p = inputParser; - p.FunctionName = mfilename; - p.CaseSensitive = false; - p.addRequired('EEG'); - % option(s) - p.addParamValue('Filename', '', @ischar); % erpset index or input file - p.addParamValue('History', 'script', @ischar); % history from scripting - p.parse(EEG, varargin{:}); - elname = p.Results.Filename; + % + % Parsing inputs + % + p = inputParser; + p.FunctionName = mfilename; + p.CaseSensitive = false; + p.addRequired('EEG'); + % option(s) + p.addParamValue('Filename', '', @ischar); % erpset index or input file + p.addParamValue('History', 'script', @ischar); % history from scripting + p.parse(EEG, varargin{:}); + elname = p.Results.Filename; end if strcmpi(p.Results.History,'implicit') - shist = 3; % implicit + shist = 3; % implicit elseif strcmpi(p.Results.History,'script') - shist = 2; % script + shist = 2; % script elseif strcmpi(p.Results.History,'gui') - shist = 1; % gui + shist = 1; % gui else - shist = 0; % off + shist = 0; % off end if isempty(EEG.data) - error('ERPLAB says: error at pop_exporteegeventlist(). cannot work with an empty dataset!') + error('ERPLAB says: error at pop_exporteegeventlist(). cannot work with an empty dataset!') end if isfield(EEG, 'EVENTLIST') - if isempty(EEG.EVENTLIST) - error('ERPLAB says: error at pop_exporteegeventlist(). EEG.EVENTLIST structure is empty.'); - end - - if isfield(EEG.EVENTLIST, 'eventinfo') - if isempty(EEG.EVENTLIST.eventinfo) - error('ERPLAB says: error at pop_exporteegeventlist(). EEG.EVENTLIST.eventinfo structure is empty.'); - end - else - error('ERPLAB says: error at pop_exporteegeventlist(). EEG.EVENTLIST.eventinfo structure was not found.'); + if isempty(EEG.EVENTLIST) + error('ERPLAB says: error at pop_exporteegeventlist(). EEG.EVENTLIST structure is empty.'); + end + + if isfield(EEG.EVENTLIST, 'eventinfo') + if isempty(EEG.EVENTLIST.eventinfo) + error('ERPLAB says: error at pop_exporteegeventlist(). EEG.EVENTLIST.eventinfo structure is empty.'); end + else + error('ERPLAB says: error at pop_exporteegeventlist(). EEG.EVENTLIST.eventinfo structure was not found.'); + end else - error('ERPLAB says: error at pop_exporteegeventlist(). EEG.EVENTLIST structure was not found.'); + error('ERPLAB says: error at pop_exporteegeventlist(). EEG.EVENTLIST structure was not found.'); end if ~isfield(EEG.EVENTLIST, 'bdf') - error('ERPLAB says: error at pop_exporteegeventlist(). EEG.EVENTLIST.bdf structure was not found.'); + error('ERPLAB says: error at pop_exporteegeventlist(). EEG.EVENTLIST.bdf structure was not found.'); end @@ -208,7 +210,16 @@ % % subroutine % -creaeventlist(EEG, EVENTLIST, elname, 1); + + +%%GH Mar 2024 +[xpath, fname, ext] = fileparts(elname); + +if strcmpi(ext,'.txt') + creaeventlist(EEG, EVENTLIST, elname, 1); +else + f_creaeventlist_excel(EEG, EVENTLIST, elname, 1); +end % % History @@ -217,53 +228,53 @@ fn = fieldnames(p.Results); com = sprintf( '%s = pop_exporteegeventlist( %s ', inputname(1), inputname(1) ); for q=1:length(fn) - fn2com = fn{q}; - if ~ismember_bc2(fn2com, skipfields) - fn2res = p.Results.(fn2com); - if ~isempty(fn2res) - if ischar(fn2res) - if ~strcmpi(fn2res,'off') - com = sprintf( '%s, ''%s'', ''%s''', com, fn2com, fn2res); - end - else - if iscell(fn2res) - if ischar([fn2res{:}]) - fn2resstr = sprintf('''%s'' ', fn2res{:}); - else - fn2resstr = vect2colon(cell2mat(fn2res), 'Sort','on'); - end - fnformat = '{%s}'; - else - fn2resstr = vect2colon(fn2res, 'Sort','on'); - fnformat = '%s'; - end - if strcmpi(fn2com,'Criterion') - if p.Results.Criterion<100 - com = sprintf( ['%s, ''%s'', ' fnformat], com, fn2com, fn2resstr); - end - else - com = sprintf( ['%s, ''%s'', ' fnformat], com, fn2com, fn2resstr); - end - end + fn2com = fn{q}; + if ~ismember_bc2(fn2com, skipfields) + fn2res = p.Results.(fn2com); + if ~isempty(fn2res) + if ischar(fn2res) + if ~strcmpi(fn2res,'off') + com = sprintf( '%s, ''%s'', ''%s''', com, fn2com, fn2res); + end + else + if iscell(fn2res) + if ischar([fn2res{:}]) + fn2resstr = sprintf('''%s'' ', fn2res{:}); + else + fn2resstr = vect2colon(cell2mat(fn2res), 'Sort','on'); + end + fnformat = '{%s}'; + else + fn2resstr = vect2colon(fn2res, 'Sort','on'); + fnformat = '%s'; + end + if strcmpi(fn2com,'Criterion') + if p.Results.Criterion<100 + com = sprintf( ['%s, ''%s'', ' fnformat], com, fn2com, fn2resstr); + end + else + com = sprintf( ['%s, ''%s'', ' fnformat], com, fn2com, fn2resstr); end + end end + end end com = sprintf( '%s );', com); % get history from script. EEG switch shist - case 1 % from GUI - com = sprintf('%s %% GUI: %s', com, datestr(now)); - %fprintf('%%Equivalent command:\n%s\n\n', com); - displayEquiComERP(com); - case 2 % from script - EEG = erphistory(EEG, [], com, 1); - case 3 - % implicit - % EEG = erphistory(EEG, [], com, 1); - % fprintf('%%Equivalent command:\n%s\n\n', com); - otherwise %off or none - com = ''; + case 1 % from GUI + com = sprintf('%s %% GUI: %s', com, datestr(now)); + %fprintf('%%Equivalent command:\n%s\n\n', com); + displayEquiComERP(com); + case 2 % from script + EEG = erphistory(EEG, [], com, 1); + case 3 + % implicit + % EEG = erphistory(EEG, [], com, 1); + % fprintf('%%Equivalent command:\n%s\n\n', com); + otherwise %off or none + com = ''; end % diff --git a/pop_functions/pop_exporterpeventlist.m b/pop_functions/pop_exporterpeventlist.m index 17972003..a8893b1f 100755 --- a/pop_functions/pop_exporterpeventlist.m +++ b/pop_functions/pop_exporterpeventlist.m @@ -204,7 +204,14 @@ % % subroutine % +%%GH Mar 2024 +[xpath, fname, ext] = fileparts(elname); + +if strcmpi(ext,'.txt') exporterpeventlist(ERP, indexel, elname); +else + f_creaeventlist_excel(ERP, ERP.EVENTLIST, elname, 1); +end erpcom = sprintf( 'pop_exporterpeventlist(%s, %s, ''%s'');', inputname(1), num2str(indexel), elname); % get history from script. ERP switch shist diff --git a/pop_functions/pop_filterp.m b/pop_functions/pop_filterp.m index efdad214..17abfe55 100755 --- a/pop_functions/pop_filterp.m +++ b/pop_functions/pop_filterp.m @@ -94,13 +94,15 @@ return end nchan = ERP.nchan; - defx = {0 30 2 1:nchan 1 'butter' 0 []}; + nbin = ERP.nbin; + defx = {0 30 2 1:nchan 1 'butter' 0 [],1:nbin}; def = erpworkingmemory('pop_filterp'); if isempty(def) def = defx; else def{4} = def{4}(ismember_bc2(def{4},1:nchan)); + try def{9} = def{9}(ismember_bc2(def{9},1:nbin)); catch def{9} = 1:nbin; end end % @@ -117,13 +119,11 @@ hicutoff = answer{2}; % for low pass filter filterorder = answer{3}; chanArray = answer{4}; - filterallch = answer{5}; +% filterallch = answer{5}; fdesign = answer{6}; remove_dc = answer{7}; - - if filterallch - chanArray = 1:nchan; - end + binArray = answer{9}; + erpworkingmemory('pop_filterp', answer(:)'); @@ -155,11 +155,11 @@ else error('ERPLAB says: Invalid type of filter ') end - +% binArray = [1:ERP.nbin];%%GH Apr 2024 % % Somersault % - [ERP, erpcom] = pop_filterp( ERP, chanArray, 'Filter',ftype, 'Design', fdesign, 'Cutoff', cutoff, 'Order', filterorder, 'RemoveDC', rdc,... + [ERP, erpcom] = pop_filterp( ERP, chanArray, 'binArray',binArray,'Filter',ftype, 'Design', fdesign, 'Cutoff', cutoff, 'Order', filterorder, 'RemoveDC', rdc,... 'Saveas', 'on', 'History', 'gui'); return end @@ -176,6 +176,7 @@ p.addParamValue('Filter', 'lowpass',@ischar); p.addParamValue('Design', 'butter', @ischar); p.addParamValue('Cutoff', 30, @isnumeric); +p.addParamValue('binArray', [], @isnumeric); p.addParamValue('Order', 2, @isnumeric); p.addParamValue('RemoveDC', 'off', @ischar); p.addParamValue('Saveas', 'off', @ischar); @@ -183,13 +184,20 @@ p.parse(ERP, chanArray, varargin{:}); + +binArray = p.Results.binArray;%%GH Apr 2024 +nbin = ERP(1).nbin; +if isempty(binArray) || any(binArray(:)>nbin) || any(binArray(:)<1) + binArray = [1:nbin]; +end + filtp = p.Results.Filter; fdesign = p.Results.Design; filco = p.Results.Cutoff; if ~strcmpi(datatype, 'ERP') - msgboxText = 'Cannot filter Power Spectrum waveforms!'; - error(msgboxText); + msgboxText = 'Cannot filter Power Spectrum waveforms!'; + error(msgboxText); end if strcmpi(filtp, 'lowpass') if length(filco)~=1 @@ -286,7 +294,7 @@ % % subroutine % -options = { chanArray, locutoff, hicutoff, filterorder, fdesignnum, remove_dc}; +options = { chanArray, locutoff, hicutoff, filterorder, fdesignnum, remove_dc,binArray}; ERPaux = ERP; % store original ERP ERP = filterp(ERP, options{:}); ERP.saved = 'no'; diff --git a/pop_functions/pop_gaverager.m b/pop_functions/pop_gaverager.m index c26d3c21..477e1ec3 100755 --- a/pop_functions/pop_gaverager.m +++ b/pop_functions/pop_gaverager.m @@ -318,7 +318,7 @@ end catch - warning('Dataquality measures not found in all these ERPsets. Setting DQ_flag = 0'); + warning('Data quality measures not found in all these ERPsets. Setting DQ_flag = 0'); DQ_flag = 0; end end diff --git a/pop_functions/pop_geterpvalues.m b/pop_functions/pop_geterpvalues.m index 7c5629ff..95224f0d 100755 --- a/pop_functions/pop_geterpvalues.m +++ b/pop_functions/pop_geterpvalues.m @@ -9,7 +9,7 @@ % pop_geterpvalues(filename, latency, binArray, chanArray, parameters); % % -% INPUTS : +% INPUTS: % % ALLERP - structure array of ERP structures (ERPsets) % To read the ERPset from a list in a text file, @@ -106,180 +106,182 @@ Amp = []; Lat = []; if nargin<1 - help pop_geterpvalues - return + help pop_geterpvalues + return end if nargin==1 % GUI - if isstruct(ALLERP) - if ~iserpstruct(ALLERP(1)); - ALLERP = []; - nbinx = 1; - nchanx = 1; - else - nbinx = ALLERP(1).nbin; - nchanx = ALLERP(1).nchan; - end - else - ALLERP = []; - nbinx = 1; - nchanx = 1; - end - cerpi = evalin('base', 'CURRENTERP'); % current erp index - def = erpworkingmemory('pop_geterpvalues'); - if isempty(def) - if isempty(ALLERP) - inp1 = 1; %from hard drive - erpset = []; - else - inp1 = 0; %from erpset menu - erpset = 1:length(ALLERP); - end - - def = {inp1 erpset '' 0 1:nbinx 1:nchanx 'instabl' 1 3 'pre' 0 1 5 0 0.5 0 0 0 '' 0 1}; - else - if ~isempty(ALLERP) - if isnumeric(def{2}) % JavierLC 11-17-11 - [uu, mm] = unique_bc2(def{2}, 'first'); - erpset_list_sorted = [def{2}(sort(mm))]; - %def{2} = def{2}(def{2}<=length(ALLERP)); - % non-empty check, axs jul17 - erpset_list = erpset_list_sorted(erpset_list_sorted<=length(ALLERP)); - if isempty(erpset_list) - % if nothing in list, just go with current - def{2} = cerpi; - else - % use JLC's sorting, iff not empty - def{2} = erpset_list; - end - - end - end - end - - % - % call GUI - % - instr = geterpvaluesGUI2(ALLERP, def, cerpi);% open a GUI - - if isempty(instr) - disp('User selected Cancel') - return - end - - optioni = instr{1}; %1 means from hard drive, 0 means from erpsets menu - erpset = instr{2}; - fname = instr{3}; - latency = instr{4}; - binArray = instr{5}; - chanArray = instr{6}; - moption = instr{7}; % option: type of measurement ---> instabl, meanbl, peakampbl, peaklatbl, area, areaz, or errorbl. - coi = instr{8}; - dig = instr{9}; - blc = instr{10}; - binlabop = instr{11}; % 0: bin number as bin label, 1: bin descriptor as bin label for table. - polpeak = instr{12}; % local peak polarity - sampeak = instr{13}; % number of samples (one-side) for local peak detection criteria - locpeakrep = instr{14}; % 1 abs peak , 0 Nan - frac = instr{15}; - fracmearep = instr{16}; % 1 zero , 0 Nan. Fractional area latency replacement - send2ws = instr{17}; % send measurements to workspace - appfile = instr{18}; % 1 means append file (it wont get into wmemory), 3 means call filter GUI - foutput = instr{19}; - mlabel = instr{20}; - inclate = instr{21}; % include used latency values for measurements like mean, peak, area... - intfactor = instr{22}; - viewmea = instr{23}; % viewer - peak_onset = instr{24}; % 1 for - - if optioni==1 % from files - filelist = erpset; - disp(['pop_geterpvalues(): For file-List, user selected ', filelist]) - fid_list = fopen( filelist ); - inputfnamex = textscan(fid_list, '%[^\n]','CommentStyle','#'); - inputfname = cellstr(char(inputfnamex{:})); - fclose(fid_list); - ALLERP = {ALLERP, filelist}; % truco - elseif optioni==2 % from current erpset (single) - erpset = cerpi; - else % from erpsets menu - %erpset = erpset; - end - if strcmpi(fname,'no_save.no_save') %|| strcmpi(fname,'no_save.viewer') - fnamer = ''; - else - fnamer = fname; - end - if send2ws - s2ws = 'on'; % send to workspace + if isstruct(ALLERP) + if ~iserpstruct(ALLERP(1)); + ALLERP = []; + nbinx = 1; + nchanx = 1; else - s2ws = 'off'; - end - if viewmea - vmstr = 'on'; % open viewer + nbinx = ALLERP(1).nbin; + nchanx = ALLERP(1).nchan; + end + else + ALLERP = []; + nbinx = 1; + nchanx = 1; + end + cerpi = evalin('base', 'CURRENTERP'); % current erp index + def = erpworkingmemory('pop_geterpvalues'); + if isempty(def) + if isempty(ALLERP) + inp1 = 1; %from hard drive + erpset = []; else - vmstr = 'off'; + inp1 = 0; %from erpset menu + erpset = 1:length(ALLERP); end - erpworkingmemory('pop_geterpvalues', {optioni, erpset, fnamer, latency,... - binArray, chanArray, moption, coi, dig, blc, binlabop, polpeak,... - sampeak, locpeakrep, frac, fracmearep, send2ws, foutput, mlabel,... - inclate, intfactor, peak_onset}); - - if binlabop==0 - binlabopstr = 'off'; - else - binlabopstr = 'on'; - end - if polpeak==0 - polpeakstr = 'negative'; - else - polpeakstr = 'positive'; - end - if locpeakrep==0 - locpeakrepstr = 'NaN'; - else - locpeakrepstr = 'absolute'; - end - if fracmearep==0 % Fractional area latency replacement - fracmearepstr = 'NaN'; - else - if ismember_bc2({moption}, {'fareatlat', 'fninteglat','fareaplat','fareanlat'}) - fracmearepstr = 'errormsg'; + def = {inp1 erpset '' 0 1:nbinx 1:nchanx 'instabl' 1 3 'pre' 0 1 5 0 0.5 0 0 0 '' 0 1}; + else + if ~isempty(ALLERP) + if isnumeric(def{2}) % JavierLC 11-17-11 + [uu, mm] = unique_bc2(def{2}, 'first'); + erpset_list_sorted = [def{2}(sort(mm))]; + %def{2} = def{2}(def{2}<=length(ALLERP)); + % non-empty check, axs jul17 + erpset_list = erpset_list_sorted(erpset_list_sorted<=length(ALLERP)); + if isempty(erpset_list) + % if nothing in list, just go with current + def{2} = cerpi; else - fracmearepstr = 'absolute'; + % use JLC's sorting, iff not empty + def{2} = erpset_list; end - end - if appfile - appfstr = 'on'; - else - appfstr = 'off'; - end - if foutput % 1 means "long format"; 0 means "wide format" - foutputstr = 'long'; - else - foutputstr = 'wide'; - end - if inclate - inclatestr = 'yes'; - else - inclatestr = 'no'; - end - - % - % Somersault - % - - %latency, binArray, chanArray, erpset, moption, coi, dig, blc, binlabopstr, polpeakstr, sampeak, locpeakrepstr, fname, s2ws, appfstr, foutputstr, frac, mlabel, fracmearepstr, inclatestr, intfactor, vmstr - - [ALLERP, Amp, Lat, erpcom] = pop_geterpvalues(ALLERP, latency, binArray, chanArray, 'Erpsets', erpset, 'Measure',... - moption, 'Component', coi, 'Resolution', dig, 'Baseline', blc, 'Binlabel', binlabopstr, 'Peakpolarity',... - polpeakstr, 'Neighborhood', sampeak, 'Peakreplace', locpeakrepstr, 'Filename', fname, 'Warning','on',... - 'SendtoWorkspace', s2ws, 'Append', appfstr, 'FileFormat', foutputstr,'Afraction', frac, 'Mlabel', mlabel,... - 'Fracreplace', fracmearepstr,'IncludeLat', inclatestr, 'InterpFactor', intfactor, 'Viewer', vmstr,... - 'PeakOnset',peak_onset,'History', 'gui'); - - pause(0.1) + + end + end + end + + % + % call GUI + % + instr = geterpvaluesGUI2(ALLERP, def, cerpi);% open a GUI + + if isempty(instr) + disp('User selected Cancel') return + end + + optioni = instr{1}; %1 means from hard drive, 0 means from erpsets menu + erpset = instr{2}; + fname = instr{3}; + latency = instr{4}; + binArray = instr{5}; + chanArray = instr{6}; + moption = instr{7}; % option: type of measurement ---> instabl, meanbl, peakampbl, peaklatbl, area, areaz, or errorbl. + coi = instr{8}; + dig = instr{9}; + blc = instr{10}; + binlabop = instr{11}; % 0: bin number as bin label, 1: bin descriptor as bin label for table. + polpeak = instr{12}; % local peak polarity + sampeak = instr{13}; % number of samples (one-side) for local peak detection criteria + locpeakrep = instr{14}; % 1 abs peak , 0 Nan + frac = instr{15}; + fracmearep = instr{16}; % 1 zero , 0 Nan. Fractional area latency replacement + send2ws = instr{17}; % send measurements to workspace + appfile = instr{18}; % 1 means append file (it wont get into wmemory), 3 means call filter GUI + foutput = instr{19}; + mlabel = instr{20}; + inclate = instr{21}; % include used latency values for measurements like mean, peak, area... + intfactor = instr{22}; + viewmea = instr{23}; % viewer + peak_onset = instr{24}; % 1 for + + if optioni==1 % from files + filelist = erpset; + disp(['pop_geterpvalues(): For file-List, user selected ', filelist]) + fid_list = fopen( filelist ); + inputfnamex = textscan(fid_list, '%[^\n]','CommentStyle','#'); + inputfname = cellstr(char(inputfnamex{:})); + fclose(fid_list); + ALLERP = {ALLERP, filelist}; % truco + elseif optioni==2 % from current erpset (single) + erpset = cerpi; + else % from erpsets menu + %erpset = erpset; + end + if strcmpi(fname,'no_save.no_save') %|| strcmpi(fname,'no_save.viewer') + fnamer = ''; + else + fnamer = fname; + end + if send2ws + s2ws = 'on'; % send to workspace + else + s2ws = 'off'; + end + if viewmea + vmstr = 'on'; % open viewer + else + vmstr = 'off'; + end + + erpworkingmemory('pop_geterpvalues', {optioni, erpset, fnamer, latency,... + binArray, chanArray, moption, coi, dig, blc, binlabop, polpeak,... + sampeak, locpeakrep, frac, fracmearep, send2ws, foutput, mlabel,... + inclate, intfactor, peak_onset}); + + if binlabop==0 + binlabopstr = 'off'; + else + binlabopstr = 'on'; + end + if polpeak==0 + polpeakstr = 'negative'; + else + polpeakstr = 'positive'; + end + if locpeakrep==0 + locpeakrepstr = 'NaN'; + elseif locpeakrep==-1 + locpeakrepstr = 'errormsg';%%GH May 2024 + else + locpeakrepstr = 'absolute'; + end + if fracmearep==0 % Fractional area latency replacement + fracmearepstr = 'NaN'; + else + if ismember_bc2({moption}, {'fareatlat', 'fninteglat','fareaplat','fareanlat'}) + fracmearepstr = 'errormsg'; + else + fracmearepstr = 'absolute'; + end + end + if appfile + appfstr = 'on'; + else + appfstr = 'off'; + end + if foutput % 1 means "long format"; 0 means "wide format" + foutputstr = 'long'; + else + foutputstr = 'wide'; + end + if inclate + inclatestr = 'yes'; + else + inclatestr = 'no'; + end + + % + % Somersault + % + + %latency, binArray, chanArray, erpset, moption, coi, dig, blc, binlabopstr, polpeakstr, sampeak, locpeakrepstr, fname, s2ws, appfstr, foutputstr, frac, mlabel, fracmearepstr, inclatestr, intfactor, vmstr + + [ALLERP, Amp, Lat, erpcom] = pop_geterpvalues(ALLERP, latency, binArray, chanArray, 'Erpsets', erpset, 'Measure',... + moption, 'Component', coi, 'Resolution', dig, 'Baseline', blc, 'Binlabel', binlabopstr, 'Peakpolarity',... + polpeakstr, 'Neighborhood', sampeak, 'Peakreplace', locpeakrepstr, 'Filename', fname, 'Warning','on',... + 'SendtoWorkspace', s2ws, 'Append', appfstr, 'FileFormat', foutputstr,'Afraction', frac, 'Mlabel', mlabel,... + 'Fracreplace', fracmearepstr,'IncludeLat', inclatestr, 'InterpFactor', intfactor, 'Viewer', vmstr,... + 'PeakOnset',peak_onset,'History', 'gui'); + + pause(0.1) + return end % @@ -320,27 +322,27 @@ p.parse(ALLERP, latency, binArray, chanArray, varargin{:}); if strcmpi(p.Results.History,'implicit') - shist = 3; % implicit + shist = 3; % implicit elseif strcmpi(p.Results.History,'script') - shist = 2; % script + shist = 2; % script elseif strcmpi(p.Results.History,'gui') - shist = 1; % gui + shist = 1; % gui else - shist = 0; % off + shist = 0; % off end % % Measurement types % meacell = {'instabl', 'meanbl', 'peakampbl', 'peaklatbl', 'fpeaklat',... - 'areat', 'areap', 'arean','areazt','areazp','areazn','fareatlat',... - 'fareaplat','fninteglat','fareanlat', 'ninteg','nintegz' }; + 'areat', 'areap', 'arean','areazt','areazp','areazn','fareatlat',... + 'fareaplat','fninteglat','fareanlat', 'ninteg','nintegz' }; measurearray = {'Instantaneous amplitude','Mean amplitude between two fixed latencies',... - 'Peak amplitude','Peak latency','Fractional Peak latency',... - 'Numerical integration/Area between two fixed latencies',... - 'Numerical integration/Area between two (automatically detected) zero-crossing latencies'... - 'Fractional Area latency', ''}; + 'Peak amplitude','Peak latency','Fractional Peak latency',... + 'Numerical integration/Area between two fixed latencies',... + 'Numerical integration/Area between two (automatically detected) zero-crossing latencies'... + 'Fractional Area latency', ''}; % % Get inputs @@ -349,66 +351,66 @@ cond1 = iserpstruct(ALLERP); cond2 = isnumeric(erpsetArray); if isempty(latency) - latency = 0; -end -if cond1 && cond2 % either from GUI or script, when ALLERP exist and erpset indices were specified - if isempty(erpsetArray) - erpsetArray =1:length(ALLERP); - elseif erpsetArray==0 - try - erpsetArray = evalin('base', 'CURRENTERP'); % current erp index - catch - erpsetArray = length(ALLERP); - end - + latency = 0; +end +if cond1 && cond2 % either from GUI or script, when ALLERP exist and erpset indices were specified + if isempty(erpsetArray) + erpsetArray =1:length(ALLERP); + elseif erpsetArray==0 + try + erpsetArray = evalin('base', 'CURRENTERP'); % current erp index + catch + erpsetArray = length(ALLERP); end - nfile = length(erpsetArray); - optioni = 0; % from erpset menu or ALLERP struct - if isempty(binArray) % JLC - binArray = 1:min([ALLERP(erpsetArray).nbin]); - end - if isempty(chanArray) - chanArray = 1:min([ALLERP(erpsetArray).nchan]); - end + end + nfile = length(erpsetArray); + optioni = 0; % from erpset menu or ALLERP struct + + if isempty(binArray) % JLC + binArray = 1:min([ALLERP(erpsetArray).nbin]); + end + if isempty(chanArray) + chanArray = 1:min([ALLERP(erpsetArray).nchan]); + end else - filelist = ''; - optioni = 1; % from file - if iscell(ALLERP) % from the GUI, when ALLERP exist and user picks a list up as well - filelist = ALLERP{2}; - ALLERP = ALLERP{1}; - elseif ischar(ALLERP) % from script, when user picks a list. - filelist = ALLERP; - end - if isempty(binArray) % JLC - binArray = 1; - end - if isempty(chanArray) - chanArray = 1; - end - if ~iscell(filelist) && ~isempty(filelist) - disp(['For file-List, user selected ', filelist]) - fid_list = fopen( filelist ); - inputfnamex = textscan(fid_list, '%[^\n]','CommentStyle','#'); - inputfname = cellstr(char(inputfnamex{:})); - nfile = length(inputfname); - fclose(fid_list); - elseif ~isempty(filelist) && iscell(filelist) - inputfname = filelist; - nfile = length(inputfname); - else - error('ERPLAB says: error at pop_geterpvalues(). Unrecognizable input ') - end - if isempty(erpsetArray) - erpsetArray =1:nfile; - elseif erpsetArray==0 - try - erpsetArray = evalin('base', 'CURRENTERP'); % current erp index - catch - erpsetArray = nfile; - end - + filelist = ''; + optioni = 1; % from file + if iscell(ALLERP) % from the GUI, when ALLERP exist and user picks a list up as well + filelist = ALLERP{2}; + ALLERP = ALLERP{1}; + elseif ischar(ALLERP) % from script, when user picks a list. + filelist = ALLERP; + end + if isempty(binArray) % JLC + binArray = 1; + end + if isempty(chanArray) + chanArray = 1; + end + if ~iscell(filelist) && ~isempty(filelist) + disp(['For file-List, user selected ', filelist]) + fid_list = fopen( filelist ); + inputfnamex = textscan(fid_list, '%[^\n]','CommentStyle','#'); + inputfname = cellstr(char(inputfnamex{:})); + nfile = length(inputfname); + fclose(fid_list); + elseif ~isempty(filelist) && iscell(filelist) + inputfname = filelist; + nfile = length(inputfname); + else + error('ERPLAB says: error at pop_geterpvalues(). Unrecognizable input ') + end + if isempty(erpsetArray) + erpsetArray =1:nfile; + elseif erpsetArray==0 + try + erpsetArray = evalin('base', 'CURRENTERP'); % current erp index + catch + erpsetArray = nfile; end + + end end fname = p.Results.Filename; @@ -420,72 +422,75 @@ mlabel = strrep(mlabel, ' ', '_'); if ~isempty(frac) - if frac<0 || frac>1 - error('ERPLAB says: error at pop_geterpvalues(). Fractional area value must be between 0 and 1') - end + if frac<0 || frac>1 + error('ERPLAB says: error at pop_geterpvalues(). Fractional area value must be between 0 and 1') + end end if ischar(localrep) - lr = str2num(localrep); - if isempty(lr) - if strcmpi(localrep,'absolute') - locpeakrep = 1; - else - error(['ERPLAB says: error at pop_geterpvalues(). Unrecognizable input ' localrep]) - end + lr = str2num(localrep); + if isempty(lr) + if strcmpi(localrep,'absolute') + locpeakrep = 1; + elseif strcmpi(localrep,'error') || strcmpi(localrep,'errormsg') %%GH May 2024 + locpeakrep = 2; % shows error message. Stop measuring. else - if isnan(lr) - locpeakrep = 0; - else - error(['ERPLAB says: error at pop_geterpvalues(). Unrecognizable input ' localrep]) - end + error(['ERPLAB says: error at pop_geterpvalues(). Unrecognizable input ' localrep]) end -else - if isnan(localrep) - locpeakrep = 0; + else + if isnan(lr) + locpeakrep = 0; + else - error(['ERPLAB says: error at pop_geterpvalues(). Unrecognizable input ' num2str(localrep(1))]) + error(['ERPLAB says: error at pop_geterpvalues(). Unrecognizable input ' localrep]) end + end +else + if isnan(localrep) + locpeakrep = 0; + else + error(['ERPLAB says: error at pop_geterpvalues(). Unrecognizable input ' num2str(localrep(1))]) + end end if ischar(fraclocalrep) - flr = str2num(fraclocalrep); - if isempty(flr) - if strcmpi(fraclocalrep,'absolute') - fracmearep = 1; - elseif strcmpi(fraclocalrep,'error') || strcmpi(fraclocalrep,'errormsg') - fracmearep = 2; % shows error message. Stop measuring. - else - error(['ERPLAB says: error at pop_geterpvalues(). Unrecognizable input ' fraclocalrep]) - end + flr = str2num(fraclocalrep); + if isempty(flr) + if strcmpi(fraclocalrep,'absolute') + fracmearep = 1; + elseif strcmpi(fraclocalrep,'error') || strcmpi(fraclocalrep,'errormsg') + fracmearep = 2; % shows error message. Stop measuring. else - if isnan(flr) - fracmearep = 0; - else - error(['ERPLAB says: error at pop_geterpvalues(). Unrecognizable input ' fraclocalrep]) - end + error(['ERPLAB says: error at pop_geterpvalues(). Unrecognizable input ' fraclocalrep]) end -else - if isnan(fraclocalrep) - fracmearep = 0; + else + if isnan(flr) + fracmearep = 0; else - error(['ERPLAB says: error at pop_geterpvalues(). Unrecognizable input ' num2str(fraclocalrep(1))]) + error(['ERPLAB says: error at pop_geterpvalues(). Unrecognizable input ' fraclocalrep]) end + end +else + if isnan(fraclocalrep) + fracmearep = 0; + else + error(['ERPLAB says: error at pop_geterpvalues(). Unrecognizable input ' num2str(fraclocalrep(1))]) + end end sampeak = p.Results.Neighborhood; % samples around the peak if strcmpi(p.Results.Peakpolarity, 'positive') - polpeak = 1; % positive + polpeak = 1; % positive elseif strcmpi(p.Results.Peakpolarity, 'negative') - polpeak = 0; + polpeak = 0; else - error(['ERPLAB says: error at pop_geterpvalues(). Unrecognizable input ' p.Results.Peakpolarity]); + error(['ERPLAB says: error at pop_geterpvalues(). Unrecognizable input ' p.Results.Peakpolarity]); end if strcmpi(p.Results.Binlabel, 'on') - binlabop = 1; % bin descriptor as bin label for table + binlabop = 1; % bin descriptor as bin label for table elseif strcmpi(p.Results.Binlabel, 'off') - binlabop = 0; % bin# as bin label for table + binlabop = 0; % bin# as bin label for table else - error(['ERPLAB says: Unrecognizable input ' p.Results.Binlabel]); + error(['ERPLAB says: Unrecognizable input ' p.Results.Binlabel]); end blc = p.Results.Baseline; @@ -496,422 +501,435 @@ peak_onset = p.Results.PeakOnset; if isempty(moption) - error('ERPLAB says: User must specify a type of measurement.') + error('ERPLAB says: User must specify a type of measurement.') end if ismember_bc2({moption}, {'instabl', 'areazt','areazp','areazn', 'nintegz'}); - if length(latency)~=1 - error(['ERPLAB says: ' moption ' only needs 1 latency value.']) - end + if length(latency)~=1 + error(['ERPLAB says: ' moption ' only needs 1 latency value.']) + end else - if length(latency)~=2 - error(['ERPLAB says: ' moption ' needs 2 latency values.']) - else - if latency(1)>=latency(2) - msgboxText = ['For latency range, lower time limit must be on the left.\n'... - 'Additionally, lower time limit must be at least 1/samplerate seconds lesser than the higher one.']; - title = 'ERPLAB: pop_geterpvalues() inputs'; - errorfound(sprintf(msgboxText), title); - return - end - end + if length(latency)~=2 + error(['ERPLAB says: ' moption ' needs 2 latency values.']) + else + if latency(1)>=latency(2) + msgboxText = ['For latency range, lower time limit must be on the left.\n'... + 'Additionally, lower time limit must be at least 1/samplerate seconds lesser than the higher one.']; + title = 'ERPLAB: pop_geterpvalues() inputs'; + errorfound(sprintf(msgboxText), title); + return + end + end end if strcmpi(p.Results.Warning, 'on') - menup = 1; % enable warning message + menup = 1; % enable warning message else - menup = 0; + menup = 0; end if strcmpi(p.Results.SendtoWorkspace, 'on') - send2ws = 1; % send to workspace + send2ws = 1; % send to workspace else - send2ws = 0; + send2ws = 0; end if strcmpi(p.Results.Viewer, 'on') - viewmea = 1; % open viewer + viewmea = 1; % open viewer else - viewmea = 0; + viewmea = 0; end if strcmpi(p.Results.Append, 'on') - appendfile = 1; + appendfile = 1; else - appendfile = 0; + appendfile = 0; end if strcmpi(p.Results.FileFormat, 'long') - foutput = 1; % 1 means "long format"; 0 means "wide format" + foutput = 1; % 1 means "long format"; 0 means "wide format" else - foutput = 0; + foutput = 0; end if strcmpi(p.Results.IncludeLat, 'yes') || strcmpi(p.Results.IncludeLat, 'on') - inclate = 1; + inclate = 1; else - inclate = 0; + inclate = 0; end intfactor = p.Results.InterpFactor; if ~ismember_bc2({moption}, meacell); - msgboxText = [moption ' is not a valid option for pop_geterpvalues!']; - if shist == 1; % gui - title = 'ERPLAB: pop_geterpvalues wrong inputs'; - errorfound(msgboxText, title); - return - else - error(msgboxText) - end + msgboxText = [moption ' is not a valid option for pop_geterpvalues!']; + if shist == 1; % gui + title = 'ERPLAB: pop_geterpvalues wrong inputs'; + errorfound(msgboxText, title); + return + else + error(msgboxText) + end end if ischar(blc) - blcorrstr = ['''' blc '''' ]; + blcorrstr = ['''' blc '''' ]; else - blcorrstr = ['[' num2str(blc) ']']; + blcorrstr = ['[' num2str(blc) ']']; end if ~viewmea - [pathtest, filtest, ext] = fileparts(fname); + [pathtest, filtest, ext] = fileparts(fname); + + if isempty(filtest) + error('File name is empty.') + end + if strcmpi(ext,'.xls') + fprintf('\nWARNING:\n'); + title = 'ERPLAB: WARNING, pop_geterpvalues() export to Excel' ; + question = ['Sorry. Export to Excel is not longer supported by ERPLAB.\n\n'... + 'Do you want to continue anyway using a text file instead?']; + button = askquest(sprintf(question), title); - if isempty(filtest) - error('File name is empty.') - end - if strcmpi(ext,'.xls') - fprintf('\nWARNING:\n'); - title = 'ERPLAB: WARNING, pop_geterpvalues() export to Excel' ; - question = ['Sorry. Export to Excel is not longer supported by ERPLAB.\n\n'... - 'Do you want to continue anyway using a text file instead?']; - button = askquest(sprintf(question), title); - - if ~strcmpi(button,'yes') - disp('User selected Cancel') - return - end - if strcmp(pathtest,'') - pathtest = cd; - end - ext = '.txt'; - fname = fullfile(pathtest, [filtest ext]); - fprintf('\nOutput file will have extension %s\n', ext); - exceloption = 0; - send_to_file = 1; - % if ispc - % exceloption = 1; - % fprintf('\nOutput will be a Microsoft Excel spreadsheet file'); - % warning off MATLAB:xlswrite:AddSheet - % if strcmp(pathtest,'') - % pathtest = cd; - % fname = fullfile(pathtest, [filtest ext]); - % end - % else - % fprintf('\nWARNING:\n'); - % title = 'ERPLAB: WARNING, pop_geterpvalues() export to Excel' ; - % question = ['The full functionality of XLSWRITE depends on the ability '... - % 'to instantiate Microsoft Excel as a COM server.\n\n'... - % 'COM is a technology developed for Windows platforms and, '... - % 'at the current ERPLAB version, is not available for non-Windows machines\n\n'... - % 'Do you want to continue anyway with a text file instead?']; - % button = askquest(sprintf(question), title); - % - % if ~strcmpi(button,'yes') - % disp('User selected Cancel') - % return - % end - % if strcmp(pathtest,'') - % pathtest = cd; - % end - % ext = '.txt'; - % fname = fullfile(pathtest, [filtest ext]); - % fprintf('\nOutput file will have extension %s\n', ext); - % exceloption = 0; - % end - % send_to_file = 1; - elseif strcmpi(ext,'.no_save') - send_to_file = 0; - elseif strcmpi(ext,'.viewer') % temporary - send_to_file = 0; - else - exceloption = 0; - if strcmp(pathtest,'') - pathtest = cd; - end - if ~strcmpi(ext,'.txt')&& ~strcmpi(ext,'.dat') - ext = '.txt'; - fname = fullfile(pathtest, [filtest ext]); - end - fprintf('\nOutput file will have extension %s\n', ext); - send_to_file = 1; - end -else + if ~strcmpi(button,'yes') + disp('User selected Cancel') + return + end + if strcmp(pathtest,'') + pathtest = cd; + end + ext = '.txt'; + fname = fullfile(pathtest, [filtest ext]); + fprintf('\nOutput file will have extension %s\n', ext); + exceloption = 0; + send_to_file = 1; + % if ispc + % exceloption = 1; + % fprintf('\nOutput will be a Microsoft Excel spreadsheet file'); + % warning off MATLAB:xlswrite:AddSheet + % if strcmp(pathtest,'') + % pathtest = cd; + % fname = fullfile(pathtest, [filtest ext]); + % end + % else + % fprintf('\nWARNING:\n'); + % title = 'ERPLAB: WARNING, pop_geterpvalues() export to Excel' ; + % question = ['The full functionality of XLSWRITE depends on the ability '... + % 'to instantiate Microsoft Excel as a COM server.\n\n'... + % 'COM is a technology developed for Windows platforms and, '... + % 'at the current ERPLAB version, is not available for non-Windows machines\n\n'... + % 'Do you want to continue anyway with a text file instead?']; + % button = askquest(sprintf(question), title); + % + % if ~strcmpi(button,'yes') + % disp('User selected Cancel') + % return + % end + % if strcmp(pathtest,'') + % pathtest = cd; + % end + % ext = '.txt'; + % fname = fullfile(pathtest, [filtest ext]); + % fprintf('\nOutput file will have extension %s\n', ext); + % exceloption = 0; + % end + % send_to_file = 1; + elseif strcmpi(ext,'.no_save') send_to_file = 0; + elseif strcmpi(ext,'.viewer') % temporary + send_to_file = 0; + else + exceloption = 0; + if strcmp(pathtest,'') + pathtest = cd; + end + if ~strcmpi(ext,'.txt')&& ~strcmpi(ext,'.dat') + ext = '.txt'; + fname = fullfile(pathtest, [filtest ext]); + end + fprintf('\nOutput file will have extension %s\n', ext); + send_to_file = 1; + end +else + send_to_file = 0; end fprintf('\nBaseline period = %s will be used for measurements\n\n', blcorrstr); if optioni==1 % from files - erpsetArray = 1:nfile; % JLC. Sept 2012 + erpsetArray = 1:nfile; % JLC. Sept 2012 end conti = 1; Lat = {[]}; for k=1:nfile - if optioni==1 % from files - filex = load(inputfname{k}, '-mat'); - ERP = filex.ERP; - [ERP, conti, serror] = olderpscan(ERP, menup); - if viewmea==1 && conti==1 && serror==0 - if k==1 - ALLERPX = buildERPstruct([]); % auxiliar ALLERP - end - ALLERPX(k) = ERP; - end - else % from erpsets - ERP = ALLERP(erpsetArray(k)); - [ERP, conti, serror] = olderpscan(ERP, menup); - end - if conti==0 - break - end - if serror ==1 - kindex = k; - kname = ERP.erpname; - break - end - if k==1 - n1bin = ERP.nbin; - n1chan = ERP.nchan; - n1bdesc = ERP.bindescr; - - if isempty(binArray) % JLC - binArray = 1:n1bin; - end - if isempty(chanArray) - chanArray = 1:n1chan; - end - Amp = zeros(length(binArray), length(chanArray), nfile); - else - if ERP.nbin~=n1bin - serror = 2; - break - end - if ismember_bc2(0,ismember(lower(ERP.bindescr), lower(n1bdesc))) % May 25, 2010 - serror = 3; - break - end - end + if optioni==1 % from files + filex = load(inputfname{k}, '-mat'); + ERP = filex.ERP; + [ERP, conti, serror] = olderpscan(ERP, menup); + if viewmea==1 && conti==1 && serror==0 + if k==1 + ALLERPX = buildERPstruct([]); % auxiliar ALLERP + end + ALLERPX(k) = ERP; + end + else % from erpsets + ERP = ALLERP(erpsetArray(k)); + [ERP, conti, serror] = olderpscan(ERP, menup); + end + if conti==0 + break + end + if serror ==1 + kindex = k; + kname = ERP.erpname; + break + end + if k==1 + n1bin = ERP.nbin; + n1chan = ERP.nchan; + n1bdesc = ERP.bindescr; - datatype = checkdatatype(ERP); - if ~strcmpi(datatype, 'ERP') && ismember(moption, {'areazt','areazp','areazn', 'nintegz'} ) - error('This type of measurement (automatic area/integration) is not allowed for Power Spectrum data '); + if isempty(binArray) % JLC + binArray = 1:n1bin; end - - % - % subroutine - % - % - % Get measurements - % - fprintf('Taking measurements across ERPset #%g...\n', erpsetArray(k)) - - if inclate || viewmea % JLC. Sept 2012 - [A, lat4mea] = geterpvalues(ERP, latency, binArray, chanArray, moption, blc, coi, polpeak, sampeak, locpeakrep, frac, fracmearep, intfactor,peak_onset); + if isempty(chanArray) + chanArray = 1:n1chan; + end + Amp = zeros(length(binArray), length(chanArray), nfile); + else + if ERP.nbin~=n1bin + serror = 2; + break + end + if ismember_bc2(0,ismember(lower(ERP.bindescr), lower(n1bdesc))) % May 25, 2010 + serror = 3; + break + end + end + + datatype = checkdatatype(ERP); + if ~strcmpi(datatype, 'ERP') && ismember(moption, {'areazt','areazp','areazn', 'nintegz'} ) + error('This type of measurement (automatic area/integration) is not allowed for Power Spectrum data '); + end + + % + % subroutine + % + % + % Get measurements + % + fprintf('Taking measurements across ERPset #%g...\n', erpsetArray(k)) + + if inclate || viewmea % JLC. Sept 2012 + [A, lat4mea] = geterpvalues(ERP, latency, binArray, chanArray, moption, blc, coi, polpeak, sampeak, locpeakrep, frac, fracmearep, intfactor,peak_onset); + else + %ERP, latency, binArray, chanArray, moption, blc, coi, polpeak, sampeak, locpeakrep, frac, fracmearep, intfactor + A = geterpvalues(ERP, latency, binArray, chanArray, moption, blc, coi, polpeak, sampeak, locpeakrep, frac, fracmearep, intfactor,peak_onset); + lat4mea = []; + end + + % + % + % en vez de abortar la lectura de valores debido a un error, es mejor llenar con NAN y seguir midiendo la sgte medida.... + % Cambiar los "breaks"! + % + + if isempty(A) && viewmea==0 + errmsg = 'Empty outcome.'; + serror = 4; + break + elseif ischar(A) && viewmea==0 + errmsg = A; + serror = 4; + break + elseif (isempty(A) || ischar(A)) && viewmea==1 + if isempty(lat4mea) + A = NaN(length(binArray), length(chanArray)); % for viewer, when measurement was not possible. + lat4mea = {latency(1)}; else - %ERP, latency, binArray, chanArray, moption, blc, coi, polpeak, sampeak, locpeakrep, frac, fracmearep, intfactor - A = geterpvalues(ERP, latency, binArray, chanArray, moption, blc, coi, polpeak, sampeak, locpeakrep, frac, fracmearep, intfactor,peak_onset); - lat4mea = []; - end - - % - % - % en vez de abortar la lectura de valores debido a un error, es mejor llenar con NAN y seguir midiendo la sgte medida.... - % Cambiar los "breaks"! - % - - if isempty(A) && viewmea==0 - errmsg = 'Empty outcome.'; - serror = 4; - break - elseif ischar(A) && viewmea==0 - errmsg = A; - serror = 4; - break - elseif (isempty(A) || ischar(A)) && viewmea==1 - if isempty(lat4mea) - A = NaN(length(binArray), length(chanArray)); % for viewer, when measurement was not possible. - lat4mea = {latency(1)}; - else - errmsg = A; - serror = 4; - break - end - %lat4mea = {}; - %[lat4mea{1:length(binArray),1:length(chanArray)}] = deal(latency); % specified latency(ies) for getting measurements. - %lat4mea = {latency(1)}; - end - - % - % Store values - % - Amp(:,:,k) = A; % bin x channel x erpset - Lat{:,:,k} = lat4mea; % bin x channel x erpset - - if send_to_file && ~viewmea - if exceloption - % - % Excel - % - exportvalues2xls(ERP, {A}, binArray,chanArray, 0, moption, fname, k+appendfile) - else - % - % Text - % - % (ERP, values, binArray, chanArray, fname, dig, ncall, binlabop, formatout, mlabel, lat4mea) - exportvaluesV2(ERP, {A}, binArray, chanArray, fname, dig, k+appendfile, binlabop, foutput, mlabel, lat4mea) - end - - prew = 'Additionally, m'; + errmsg = A; + serror = 4; + break + end + %lat4mea = {}; + %[lat4mea{1:length(binArray),1:length(chanArray)}] = deal(latency); % specified latency(ies) for getting measurements. + %lat4mea = {latency(1)}; + end + + % + % Store values + % + Amp(:,:,k) = A; % bin x channel x erpset + Lat{:,:,k} = lat4mea; % bin x channel x erpset + + if send_to_file && ~viewmea + if exceloption + % + % Excel + % + exportvalues2xls(ERP, {A}, binArray,chanArray, 0, moption, fname, k+appendfile) else - prew = 'M'; + % + % Text + % + % (ERP, values, binArray, chanArray, fname, dig, ncall, binlabop, formatout, mlabel, lat4mea) + exportvaluesV2(ERP, {A}, binArray, chanArray, fname, dig, k+appendfile, binlabop, foutput, mlabel, lat4mea) end + + prew = 'Additionally, m'; + else + prew = 'M'; + end end % % Errors % if conti==0 - return + return end + +ERPtooltype = erpgettoolversion('tooltype');%%GH May 2024 + if serror~=0 - switch serror - case 1 - msgboxText = sprintf('A problem was found at ERPset %s (%gth).', kname, kindex); - case 2 - msgboxText = ['Number of bins is different across datasets .\n'... - 'You must use ERPset related to the same experiment.']; - case 3 - msgboxText = ['The bin description set among datasets is different.\n'... - 'You must use ERPset related to the same experiment.']; - case 4 - msgboxText = errmsg ; + switch serror + case 1 + msgboxText = sprintf('A problem was found at ERPset %s (%gth).', kname, kindex); + case 2 + msgboxText = ['Number of bins is different across datasets .\n'... + 'You must use ERPset related to the same experiment.']; + case 3 + msgboxText = ['The bin description set among datasets is different.\n'... + 'You must use ERPset related to the same experiment.']; + case 4 + + switch moption%%GH May 2024 + case {'fareanlat','fareaplat','peakampbl','peaklatbl','fpeaklat'} + msgboxText = [errmsg,', erpset',num2str(k) ]; otherwise - msgboxText = 'Sorry, something went wrong.'; - end - if shist == 1; % gui - tittle = 'ERPLAB: geterpvalues() error:'; - errorfound(sprintf(msgboxText), tittle); - [ALLERP, Amp, Lat, erpcom] = pop_geterpvalues(ALLERP); - pause(0.1) - return - else - error('Error:measurements', msgboxText) + msgboxText = errmsg ; + end + otherwise + msgboxText = 'Sorry, something went wrong.'; + end + if shist == 1; % gui + tittle = 'ERPLAB: geterpvalues() error:'; + errorfound(sprintf(msgboxText), tittle); + if strcmpi(ERPtooltype,'ERPLAB')%%GH May 2024 + [ALLERP, Amp, Lat, erpcom] = pop_geterpvalues(ALLERP); end + pause(0.1) + return + else + error('Error:measurements', msgboxText) + end end % % Send measurements to workspace (from GUI) % if send2ws==1 - assignin('base','ERP_MEASURES', Amp); - fprintf('\n%seasured values were sent to Workspace as ERP_MEASURES.\n', prew); + assignin('base','ERP_MEASURES', Amp); + fprintf('\n%seasured values were sent to Workspace as ERP_MEASURES.\n', prew); end % % Open Viewer ******** % if viewmea==1 - comme = ''; - switch moption - case 'instabl' - moptionstr = measurearray{1}; - case 'meanbl' - moptionstr = measurearray{2}; - case 'peakampbl' - moptionstr = measurearray{3}; - if polpeak - comme = ', positive'; - else - comme = ', negative'; - end - case 'peaklatbl' - moptionstr = measurearray{4}; - if polpeak - comme = ', positive'; - else - comme = ', negative'; - end - case 'fpeaklat' - moptionstr = measurearray{5}; - if polpeak - comme = ', positive'; - else - comme = ', negative'; - end - case {'areat', 'areap', 'arean', 'ninteg'} - moptionstr = measurearray{6}; - if strcmpi(moption, 'areat') - comme = ', total'; - elseif strcmpi(moption, 'areap') - comme = ', positive'; - elseif strcmpi(moption, 'arean') - comme = ', negative'; - else - comme = '. Integral'; - end - case {'areazt','areazp','areazn', 'nintegz'} - moptionstr = measurearray{7}; - if strcmpi(moption, 'areazt') - comme = ', total'; - elseif strcmpi(moption, 'areazp') - comme = ', positive'; - elseif strcmpi(moption, 'areazn') - comme = ', negative'; - else - comme = '. Integral'; - end - case {'fareatlat', 'fareaplat','fninteglat','fareanlat', } - moptionstr = measurearray{8}; - if strcmpi(moption, 'fareatlat') - comme = ', total'; - elseif strcmpi(moption, 'fareaplat') - comme = ', positive'; - elseif strcmpi(moption, 'fareanlat') - comme = ', negative'; - else - comme = '. Integral'; - end - otherwise - return - end - - moptionstr = [moptionstr comme]; - moreoptions = {blc, moption, moptionstr, dig, coi, polpeak, sampeak, locpeakrep, frac, fracmearep, intfactor}; - - % - % Call Viewer GUI - % - if optioni==1 % from files - mout = meaviewerGUI(ALLERPX, {Amp, Lat, binArray, chanArray, erpsetArray, latency, moreoptions}); - clear ALLERPX % auxiliar ALLERP - else - mout = meaviewerGUI(ALLERP, {Amp, Lat, binArray, chanArray, erpsetArray, latency, moreoptions}); - end - if ~isempty(mout) && iscell(mout) - %try - latfromviewer = mout{2}; - %catch - %end - if ~isempty(latfromviewer) - - if isnan(latfromviewer)% when viewer is open from plotted figure - return - end - - def = erpworkingmemory('pop_geterpvalues'); - def{4} = latfromviewer; - erpworkingmemory('pop_geterpvalues', def); - end - [ALLERP, Amp, Lat, erpcom] = pop_geterpvalues(ALLERP); - pause(0.1) - return - elseif isnan(mout) % when viewer is open from plotted figure - return - else - disp('User selected Cancel') + comme = ''; + switch moption + case 'instabl' + moptionstr = measurearray{1}; + case 'meanbl' + moptionstr = measurearray{2}; + case 'peakampbl' + moptionstr = measurearray{3}; + if polpeak + comme = ', positive'; + else + comme = ', negative'; + end + case 'peaklatbl' + moptionstr = measurearray{4}; + if polpeak + comme = ', positive'; + else + comme = ', negative'; + end + case 'fpeaklat' + moptionstr = measurearray{5}; + if polpeak + comme = ', positive'; + else + comme = ', negative'; + end + case {'areat', 'areap', 'arean', 'ninteg'} + moptionstr = measurearray{6}; + if strcmpi(moption, 'areat') + comme = ', total'; + elseif strcmpi(moption, 'areap') + comme = ', positive'; + elseif strcmpi(moption, 'arean') + comme = ', negative'; + else + comme = '. Integral'; + end + case {'areazt','areazp','areazn', 'nintegz'} + moptionstr = measurearray{7}; + if strcmpi(moption, 'areazt') + comme = ', total'; + elseif strcmpi(moption, 'areazp') + comme = ', positive'; + elseif strcmpi(moption, 'areazn') + comme = ', negative'; + else + comme = '. Integral'; + end + case {'fareatlat', 'fareaplat','fninteglat','fareanlat', } + moptionstr = measurearray{8}; + if strcmpi(moption, 'fareatlat') + comme = ', total'; + elseif strcmpi(moption, 'fareaplat') + comme = ', positive'; + elseif strcmpi(moption, 'fareanlat') + comme = ', negative'; + else + comme = '. Integral'; + end + otherwise + return + end + + moptionstr = [moptionstr comme]; + moreoptions = {blc, moption, moptionstr, dig, coi, polpeak, sampeak, locpeakrep, frac, fracmearep, intfactor}; + + % + % Call Viewer GUI + % + if optioni==1 % from files + mout = meaviewerGUI(ALLERPX, {Amp, Lat, binArray, chanArray, erpsetArray, latency, moreoptions}); + clear ALLERPX % auxiliar ALLERP + else + mout = meaviewerGUI(ALLERP, {Amp, Lat, binArray, chanArray, erpsetArray, latency, moreoptions}); + end + if ~isempty(mout) && iscell(mout) + %try + latfromviewer = mout{2}; + %catch + %end + if ~isempty(latfromviewer) + + if isnan(latfromviewer)% when viewer is open from plotted figure return + end + + def = erpworkingmemory('pop_geterpvalues'); + def{4} = latfromviewer; + erpworkingmemory('pop_geterpvalues', def); + end + if strcmpi(ERPtooltype,'ERPLAB')%%GH May 2024 + [ALLERP, Amp, Lat, erpcom] = pop_geterpvalues(ALLERP); end + pause(0.1) + return + elseif isnan(mout) % when viewer is open from plotted figure + return + else + disp('User selected Cancel') + return + end end @@ -934,57 +952,57 @@ skipfields = {'ALLERP', 'latency', 'binArray','chanArray', 'Component', 'Warning','History'}; if isstruct(ALLERP) && optioni~=1 % from files - if length(erpsetArray)==1 && erpsetArray==1 - DATIN = 'ERP'; - skipfields = [skipfields, 'Erpsets']; - else - DATIN = inputname(1); - end -else - %DATIN = ['''' ALLERP '''']; - DATIN = sprintf('''%s''', filelist); + if length(erpsetArray)==1 && erpsetArray==1 + DATIN = 'ERP'; skipfields = [skipfields, 'Erpsets']; + else + DATIN = inputname(1); + end +else + %DATIN = ['''' ALLERP '''']; + DATIN = sprintf('''%s''', filelist); + skipfields = [skipfields, 'Erpsets']; end if ~ismember_bc2({moption}, {'peakampbl', 'peaklatbl', 'fpeaklat'}) % JLC. 08/22/13 - skipfields = [skipfields {'Neighborhood', 'Peakpolarity', 'Peakreplace'}]; + skipfields = [skipfields {'Neighborhood', 'Peakpolarity', 'Peakreplace'}]; end if strcmpi(fname,'no_save.no_save') || strcmpi(fname,'tempofile.txt') - skipfields = [skipfields {'Filename'}]; + skipfields = [skipfields {'Filename'}]; end fn = fieldnames(p.Results); erpcom = sprintf( 'ALLERP = pop_geterpvalues( %s, %s, %s, %s ', DATIN, latencystr, binArraystr, chanArraystr); for q=1:length(fn) - fn2com = fn{q}; - if ~ismember_bc2(fn2com, skipfields) - fn2res = p.Results.(fn2com); - if ~isempty(fn2res) - if ischar(fn2res) - if ~strcmpi(fn2res,'off') && ~strcmpi(fn2res,'no') - erpcom = sprintf( '%s, ''%s'', ''%s''', erpcom, fn2com, fn2res); - end - else - erpcom = sprintf( '%s, ''%s'', %s', erpcom, fn2com, vect2colon(fn2res,'Repeat','on')); - end + fn2com = fn{q}; + if ~ismember_bc2(fn2com, skipfields) + fn2res = p.Results.(fn2com); + if ~isempty(fn2res) + if ischar(fn2res) + if ~strcmpi(fn2res,'off') && ~strcmpi(fn2res,'no') + erpcom = sprintf( '%s, ''%s'', ''%s''', erpcom, fn2com, fn2res); end + else + erpcom = sprintf( '%s, ''%s'', %s', erpcom, fn2com, vect2colon(fn2res,'Repeat','on')); + end end + end end erpcom = sprintf( '%s );', erpcom); % get history from script. ERP switch shist - case 1 % from GUI - displayEquiComERP(erpcom); - case 2 % from script - for i=1:length(ALLERP) - ALLERP(i) = erphistory(ALLERP(i), [], erpcom, 1); - end - case 3 - % implicit - %for i=1:length(ALLERP) - % ALLERP(i) = erphistory(ALLERP(i), [], erpcom, 1); - %end - %fprintf('%%Equivalent command:\n%s\n\n', erpcom); - otherwise %off or none - erpcom = ''; - return + case 1 % from GUI + displayEquiComERP(erpcom); + case 2 % from script + for i=1:length(ALLERP) + ALLERP(i) = erphistory(ALLERP(i), [], erpcom, 1); + end + case 3 + % implicit + %for i=1:length(ALLERP) + % ALLERP(i) = erphistory(ALLERP(i), [], erpcom, 1); + %end + %fprintf('%%Equivalent command:\n%s\n\n', erpcom); + otherwise %off or none + erpcom = ''; + return end return diff --git a/pop_functions/pop_importeegeventlist.m b/pop_functions/pop_importeegeventlist.m index 9d4703c3..0570ee66 100755 --- a/pop_functions/pop_importeegeventlist.m +++ b/pop_functions/pop_importeegeventlist.m @@ -54,68 +54,68 @@ function [EEG, com] = pop_importeegeventlist(EEG, ELfullname, varargin) com = ''; if nargin < 1 - help pop_importeegeventlist - return + help pop_importeegeventlist + return end if isobject(EEG) % eegobj - whenEEGisanObject % calls a script for showing an error window - return + whenEEGisanObject % calls a script for showing an error window + return end if nargin==1 - if length(EEG)>1 - msgboxText = 'Unfortunately, this function does not work with multiple datasets'; - title = 'ERPLAB: multiple inputs'; - errorfound(msgboxText, title); - return - end - if isempty(EEG) - msgboxText = 'pop_importeegeventlist() error: cannot work with an empty dataset!'; - title = 'ERPLAB: pop_importeegeventlist() error'; - errorfound(msgboxText, title); - return - end - if isempty(EEG.data) - msgboxText = 'pop_importeegeventlist() cannot work with an empty dataset!'; - title = 'ERPLAB: pop_importeegeventlist() error'; - errorfound(msgboxText, title); - return - end - if ~isempty(EEG.epoch) - msgboxText = 'pop_importeegeventlist() has been tested for continuous data only.'; - title = 'ERPLAB: pop_importeegeventlist Permission denied'; - errorfound(msgboxText, title); - return - end - [filename,pathname] = uigetfile({'*.*';'*.txt'},'Select a EVENTLIST file'); - ELfullname = fullfile(pathname, filename); - - if isequal(filename,0) - disp('User selected Cancel') - return - else - disp(['For read an EVENTLIST, user selected ', ELfullname]) - end - - question = ['Do you want to replace your EEG.EVENTLIST field with this file?\n\n'... - ' (YES: replace) (NO: sent EVENTLIST to workspace)']; - title = 'ERPLAB: Confirmation'; - button = askquest(sprintf(question), title); - - if strcmpi(button,'yes') - repEL = 'on'; - elseif strcmpi(button,'no') - repEL = 'off'; - else - disp('User selected Cancel') - return - end - - % - % Somersault - % - EEG.setname = [EEG.setname '_impel']; %suggest a new name (Imported Event List) - [EEG, com] = pop_importeegeventlist(EEG, ELfullname, 'ReplaceEventList', repEL, 'History', 'gui'); + if length(EEG)>1 + msgboxText = 'Unfortunately, this function does not work with multiple datasets'; + title = 'ERPLAB: multiple inputs'; + errorfound(msgboxText, title); + return + end + if isempty(EEG) + msgboxText = 'pop_importeegeventlist() error: cannot work with an empty dataset!'; + title = 'ERPLAB: pop_importeegeventlist() error'; + errorfound(msgboxText, title); + return + end + if isempty(EEG.data) + msgboxText = 'pop_importeegeventlist() cannot work with an empty dataset!'; + title = 'ERPLAB: pop_importeegeventlist() error'; + errorfound(msgboxText, title); return + end + if ~isempty(EEG.epoch) + msgboxText = 'pop_importeegeventlist() has been tested for continuous data only.'; + title = 'ERPLAB: pop_importeegeventlist Permission denied'; + errorfound(msgboxText, title); + return + end + [filename,pathname] = uigetfile({'*.txt';'*.xls,*.xlsx';'*.*'},'Select a EVENTLIST file'); + ELfullname = fullfile(pathname, filename); + + if isequal(filename,0) + disp('User selected Cancel') + return + else + disp(['For read an EVENTLIST, user selected ', ELfullname]) + end + + question = ['Do you want to replace your EEG.EVENTLIST field with this file?\n\n'... + ' (YES: replace) (NO: sent EVENTLIST to workspace)']; + title = 'ERPLAB: Confirmation'; + button = askquest(sprintf(question), title); + + if strcmpi(button,'yes') + repEL = 'on'; + elseif strcmpi(button,'no') + repEL = 'off'; + else + disp('User selected Cancel') + return + end + + % + % Somersault + % + EEG.setname = [EEG.setname '_impel']; %suggest a new name (Imported Event List) + [EEG, com] = pop_importeegeventlist(EEG, ELfullname, 'ReplaceEventList', repEL, 'History', 'gui'); + return end % @@ -134,134 +134,138 @@ p.parse(EEG, ELfullname, varargin{:}); if length(EEG)>1 - msgboxText = 'Unfortunately, this function does not work with multiple datasets'; - error('prog:input', ['ERPLAB says: ' msgboxText]); + msgboxText = 'Unfortunately, this function does not work with multiple datasets'; + error('prog:input', ['ERPLAB says: ' msgboxText]); end if isempty(EEG) - msgboxText = 'pop_importeegeventlist() error: cannot work with an empty dataset!'; - error('prog:input', ['ERPLAB says: ' msgboxText]); + msgboxText = 'pop_importeegeventlist() error: cannot work with an empty dataset!'; + error('prog:input', ['ERPLAB says: ' msgboxText]); end if isempty(EEG.data) - msgboxText = 'pop_importeegeventlist() cannot work with an empty dataset!'; - error('prog:input', ['ERPLAB says: ' msgboxText]); + msgboxText = 'pop_importeegeventlist() cannot work with an empty dataset!'; + error('prog:input', ['ERPLAB says: ' msgboxText]); end if ~isempty(EEG.epoch) - msgboxText = 'pop_importeegeventlist() has been tested for continuous data only.'; - error('prog:input', ['ERPLAB says: ' msgboxText]); + msgboxText = 'pop_importeegeventlist() has been tested for continuous data only.'; + error('prog:input', ['ERPLAB says: ' msgboxText]); end if strcmpi(p.Results.ReplaceEventList,'on') - repEL = 1; + repEL = 1; else - repEL = 0; + repEL = 0; end if strcmpi(p.Results.Warning, 'on') - rwwarn = 1; + rwwarn = 1; else - rwwarn = 0; + rwwarn = 0; end if strcmpi(p.Results.History,'implicit') - shist = 3; % implicit + shist = 3; % implicit elseif strcmpi(p.Results.History,'script') - shist = 2; % script + shist = 2; % script elseif strcmpi(p.Results.History,'gui') - shist = 1; % gui + shist = 1; % gui else - shist = 0; % off + shist = 0; % off end % % subroutine % -[EEG, EVENTLIST] = readeventlist(EEG, ELfullname); -[pathstr, filename, ext] = fileparts(ELfullname); +[pathstr, filename, ext] = fileparts(ELfullname);%%GH Mar 2024 +if strcmpi(ext,'.txt') + [EEG, EVENTLIST] = readeventlist(EEG, ELfullname); +else + [EEG, EVENTLIST] = f_readeventlist_excel(EEG, ELfullname); +end if repEL - if ~isempty(EVENTLIST) - EEG = pasteeventlist(EEG, EVENTLIST, 1); % joints both structs - EEG = pop_overwritevent(EEG, 'code'); - EEG.EVENTLIST = []; - [EEG, EVENTLIST] = creaeventlist(EEG, EVENTLIST, [filename '_new_' num2str((datenum(datestr(now))*1e10)) '.txt'], 0); - EEG = pasteeventlist(EEG, EVENTLIST, 1); % joints both structs - - disp('EVENTLIST was added to the current EEG structure') - else - EEG.EVENTLIST = []; - [EEG, EVENTLIST] = creaeventlist(EEG, EVENTLIST, [filename '_new_' num2str((datenum(datestr(now))*1e10)) '.txt'], 1); - EEG = pasteeventlist(EEG, EVENTLIST, 1); % joints both structs - end - - % - % History - % - skipfields = {'EEG', 'ELfullname','History'}; - fn = fieldnames(p.Results); + if ~isempty(EVENTLIST) + EEG = pasteeventlist(EEG, EVENTLIST, 1); % joints both structs + EEG = pop_overwritevent(EEG, 'code'); + EEG.EVENTLIST = []; + [EEG, EVENTLIST] = creaeventlist(EEG, EVENTLIST, [filename '_new_' num2str((datenum(datestr(now))*1e10)) '.txt'], 0); + EEG = pasteeventlist(EEG, EVENTLIST, 1); % joints both structs - com = sprintf('%s = pop_importeegeventlist( %s, ''%s'' ', inputname(1), inputname(1), ELfullname); - - for q=1:length(fn) - fn2com = fn{q}; - if ~ismember_bc2(fn2com, skipfields) - fn2res = p.Results.(fn2com); - if ~isempty(fn2res) - if ischar(fn2res) - if ~strcmpi(fn2res,'off') - com = sprintf( '%s, ''%s'', ''%s''', com, fn2com, fn2res); - end - else - if iscell(fn2res) - if ischar([fn2res{:}]) - fn2resstr = sprintf('''%s'' ', fn2res{:}); - else - fn2resstr = vect2colon(cell2mat(fn2res), 'Sort','on'); - end - fnformat = '{%s}'; - else - fn2resstr = vect2colon(fn2res, 'Sort','on'); - fnformat = '%s'; - end - if strcmpi(fn2com,'Criterion') - if p.Results.Criterion<100 - com = sprintf( ['%s, ''%s'', ' fnformat], com, fn2com, fn2resstr); - end - else - com = sprintf( ['%s, ''%s'', ' fnformat], com, fn2com, fn2resstr); - end - end + disp('EVENTLIST was added to the current EEG structure') + else + EEG.EVENTLIST = []; + [EEG, EVENTLIST] = creaeventlist(EEG, EVENTLIST, [filename '_new_' num2str((datenum(datestr(now))*1e10)) '.txt'], 1); + EEG = pasteeventlist(EEG, EVENTLIST, 1); % joints both structs + end + + % + % History + % + skipfields = {'EEG', 'ELfullname','History'}; + fn = fieldnames(p.Results); + + com = sprintf('%s = pop_importeegeventlist( %s, ''%s'' ', inputname(1), inputname(1), ELfullname); + + for q=1:length(fn) + fn2com = fn{q}; + if ~ismember_bc2(fn2com, skipfields) + fn2res = p.Results.(fn2com); + if ~isempty(fn2res) + if ischar(fn2res) + if ~strcmpi(fn2res,'off') + com = sprintf( '%s, ''%s'', ''%s''', com, fn2com, fn2res); + end + else + if iscell(fn2res) + if ischar([fn2res{:}]) + fn2resstr = sprintf('''%s'' ', fn2res{:}); + else + fn2resstr = vect2colon(cell2mat(fn2res), 'Sort','on'); + end + fnformat = '{%s}'; + else + fn2resstr = vect2colon(fn2res, 'Sort','on'); + fnformat = '%s'; + end + if strcmpi(fn2com,'Criterion') + if p.Results.Criterion<100 + com = sprintf( ['%s, ''%s'', ' fnformat], com, fn2com, fn2resstr); end + else + com = sprintf( ['%s, ''%s'', ' fnformat], com, fn2com, fn2resstr); + end end + end end - com = sprintf( '%s );', com); - - % com = sprintf( '%s = pop_importeegeventlist( %s, ''%s'', %s );', inputname(1), inputname(1),... - % ELfullname, num2str(repEL)); - % % get history from script - % if shist - % EEG = erphistory(EEG, [], com, 1); - % else - % com = sprintf('%s %% %s', com, datestr(now)); - % end + end + com = sprintf( '%s );', com); + + % com = sprintf( '%s = pop_importeegeventlist( %s, ''%s'', %s );', inputname(1), inputname(1),... + % ELfullname, num2str(repEL)); + % % get history from script + % if shist + % EEG = erphistory(EEG, [], com, 1); + % else + % com = sprintf('%s %% %s', com, datestr(now)); + % end else - filenamex = regexprep(filename, ' ', '_'); - assignin('base',filenamex,EVENTLIST); - disp(['EVENTLIST was added to WORKSPACE as ' filenamex] ) + filenamex = regexprep(filename, ' ', '_'); + assignin('base',filenamex,EVENTLIST); + disp(['EVENTLIST was added to WORKSPACE as ' filenamex] ) end % get history from script. EEG switch shist - case 1 % from GUI - com = sprintf('%s %% GUI: %s', com, datestr(now)); - %fprintf('%%Equivalent command:\n%s\n\n', com); - displayEquiComERP(com); - case 2 % from script - EEG = erphistory(EEG, [], com, 1); - case 3 - % implicit - %EEG = erphistory(EEG, [], com, 1); - %fprintf('%%Equivalent command:\n%s\n\n', erpcom); - otherwise %off or none - com = ''; - return + case 1 % from GUI + com = sprintf('%s %% GUI: %s', com, datestr(now)); + %fprintf('%%Equivalent command:\n%s\n\n', com); + displayEquiComERP(com); + case 2 % from script + EEG = erphistory(EEG, [], com, 1); + case 3 + % implicit + %EEG = erphistory(EEG, [], com, 1); + %fprintf('%%Equivalent command:\n%s\n\n', erpcom); + otherwise %off or none + com = ''; + return end % diff --git a/pop_functions/pop_importerpeventlist.m b/pop_functions/pop_importerpeventlist.m index 99786fff..51930ea9 100755 --- a/pop_functions/pop_importerpeventlist.m +++ b/pop_functions/pop_importerpeventlist.m @@ -59,54 +59,54 @@ function [ERP, erpcom] = pop_importerpeventlist(ERP, ELfullname, varargin) erpcom = ''; if nargin < 1 - help pop_importerpeventlist - return + help pop_importerpeventlist + return end if isempty(ERP) - msgboxText = 'pop_importerpeventlist() cannot work with an empty erpset!'; - title = 'ERPLAB: pop_importerpeventlist() error'; - errorfound(msgboxText, title); - return + msgboxText = 'pop_importerpeventlist() cannot work with an empty erpset!'; + title = 'ERPLAB: pop_importerpeventlist() error'; + errorfound(msgboxText, title); + return end if isempty(ERP.bindata) - msgboxText = 'pop_importerpeventlist() cannot work with an empty erpset!'; - title = 'ERPLAB: pop_importerpeventlist() error'; - errorfound(msgboxText, title); - return + msgboxText = 'pop_importerpeventlist() cannot work with an empty erpset!'; + title = 'ERPLAB: pop_importerpeventlist() error'; + errorfound(msgboxText, title); + return end if nargin==1 - % - % Call GUI - % - answer = eventlist2erpGUI(ERP); - - if isempty(answer) - disp('User selected Cancel') - return - end - - ELfullname = answer{1}; - repEL = answer{2}; - indexel = answer{3}; - - if repEL==0 - repEL = 'replaceall'; - elseif repEL==1 - repEL = 'replace'; - elseif repEL==2 - repEL = 'append'; - else - disp('User selected Cancel') - return - end - - ERP.erpname = [ERP.erpname '_impel']; %suggest a new name (Imported Event List) - - % - % Somersault - % - [ERP, erpcom] = pop_importerpeventlist(ERP, ELfullname, 'ReplaceEventList', repEL, 'EventListIndex', indexel, 'Saveas', 'on', 'History', 'gui'); + % + % Call GUI + % + answer = eventlist2erpGUI(ERP); + + if isempty(answer) + disp('User selected Cancel') + return + end + + ELfullname = answer{1}; + repEL = answer{2}; + indexel = answer{3}; + + if repEL==0 + repEL = 'replaceall'; + elseif repEL==1 + repEL = 'replace'; + elseif repEL==2 + repEL = 'append'; + else + disp('User selected Cancel') return + end + + ERP.erpname = [ERP.erpname '_impel']; %suggest a new name (Imported Event List) + + % + % Somersault + % + [ERP, erpcom] = pop_importerpeventlist(ERP, ELfullname, 'ReplaceEventList', repEL, 'EventListIndex', indexel, 'Saveas', 'on', 'History', 'gui'); + return end % @@ -129,59 +129,66 @@ indexel = p.Results.EventListIndex; if strcmpi(p.Results.ReplaceEventList,'replaceall') - repEL = 0; + repEL = 0; elseif strcmpi(p.Results.ReplaceEventList,'replace') - repEL = 1; + repEL = 1; elseif strcmpi(p.Results.ReplaceEventList,'append') - repEL = 2; + repEL = 2; else - error('ERPLAB says: Invalid value for "ReplaceEventList"') + error('ERPLAB says: Invalid value for "ReplaceEventList"') end if strcmpi(p.Results.Warning, 'on') - rwwarn = 1; + rwwarn = 1; else - rwwarn = 0; + rwwarn = 0; end if strcmpi(p.Results.History,'implicit') - shist = 3; % implicit + shist = 3; % implicit elseif strcmpi(p.Results.History,'script') - shist = 2; % script + shist = 2; % script elseif strcmpi(p.Results.History,'gui') - shist = 1; % gui + shist = 1; % gui else - shist = 0; % off + shist = 0; % off end if ismember_bc2({p.Results.Saveas}, {'on','yes'}) - issaveas = 1; + issaveas = 1; else - issaveas = 0; + issaveas = 0; end ERPaux = ERP; % % subroutine % -[ERP, EVENTLIST, serror] = importerpeventlist(ERP, ELfullname); +[pathstr, filename, ext] = fileparts(ELfullname);%%GH Mar 2024 +if strcmpi(ext,'.txt') + [ERP, EVENTLIST, serror] = importerpeventlist(ERP, ELfullname); +else + [ERP1, EVENTLIST] = f_readeventlist_excel(ERP, ELfullname); + ERP.EVENTLIST.eventinfo = EVENTLIST.eventinfo; + serror = 0; +end if serror==1 - return + return end % [pathstr, filename, ext] = fileparts(ELfullname); %#ok if repEL==0 % make #1 - ERP.EVENTLIST = []; - ERP = pasteeventlist(ERP, EVENTLIST, 1); + ERP.EVENTLIST = []; + ERP = pasteeventlist(ERP, EVENTLIST, 1); elseif repEL==1 % replace - ERP = pasteeventlist(ERP, EVENTLIST, 1, indexel); + ERP = pasteeventlist(ERP, EVENTLIST, 1, indexel); elseif repEL==2 % append - nelnext = length(ERP.EVENTLIST)+1; - ERP = pasteeventlist(ERP, EVENTLIST, 1, nelnext); + nelnext = length(ERP.EVENTLIST)+1; + ERP = pasteeventlist(ERP, EVENTLIST, 1, nelnext); else - ERP = pasteeventlist(ERP, EVENTLIST, 0); - %filenamex = regexprep(filename, ' ', '_'); - %assignin('base',filenamex,EVENTLIST); - %disp(['EVENTLIST was added to WORKSPACE as ' filenamex] ) - return + ERP = pasteeventlist(ERP, EVENTLIST, 0); + %filenamex = regexprep(filename, ' ', '_'); + %assignin('base',filenamex,EVENTLIST); + %disp(['EVENTLIST was added to WORKSPACE as ' filenamex] ) + return end ERP.saved = 'no'; @@ -192,70 +199,70 @@ fn = fieldnames(p.Results); erpcom = sprintf( '%s = pop_importerpeventlist( %s, "%s" ', inputname(1), inputname(1), ELfullname); for q=1:length(fn) - fn2com = fn{q}; - if ~ismember_bc2(fn2com, skipfields) - fn2res = p.Results.(fn2com); - if ~isempty(fn2res) - if ischar(fn2res) - if ~strcmpi(fn2res,'off') - erpcom = sprintf( '%s, ''%s'', ''%s''', erpcom, fn2com, fn2res); - end - else - if iscell(fn2res) - if ischar([fn2res{:}]) - fn2resstr = sprintf('''%s'' ', fn2res{:}); - else - fn2resstr = vect2colon(cell2mat(fn2res), 'Sort','on'); - end - fnformat = '{%s}'; - else - fn2resstr = vect2colon(fn2res, 'Sort','on'); - fnformat = '%s'; - end - if strcmpi(fn2com,'Criterion') - if p.Results.Criterion<100 - erpcom = sprintf( ['%s, ''%s'', ' fnformat], erpcom, fn2com, fn2resstr); - end - else - erpcom = sprintf( ['%s, ''%s'', ' fnformat], erpcom, fn2com, fn2resstr); - end - end + fn2com = fn{q}; + if ~ismember_bc2(fn2com, skipfields) + fn2res = p.Results.(fn2com); + if ~isempty(fn2res) + if ischar(fn2res) + if ~strcmpi(fn2res,'off') + erpcom = sprintf( '%s, ''%s'', ''%s''', erpcom, fn2com, fn2res); + end + else + if iscell(fn2res) + if ischar([fn2res{:}]) + fn2resstr = sprintf('''%s'' ', fn2res{:}); + else + fn2resstr = vect2colon(cell2mat(fn2res), 'Sort','on'); + end + fnformat = '{%s}'; + else + fn2resstr = vect2colon(fn2res, 'Sort','on'); + fnformat = '%s'; end + if strcmpi(fn2com,'Criterion') + if p.Results.Criterion<100 + erpcom = sprintf( ['%s, ''%s'', ' fnformat], erpcom, fn2com, fn2resstr); + end + else + erpcom = sprintf( ['%s, ''%s'', ' fnformat], erpcom, fn2com, fn2resstr); + end + end end + end end erpcom = sprintf( '%s );', erpcom); -if issaveas - [ERP, issave, erpcom_save] = pop_savemyerp(ERP,'gui','erplab', 'History', 'off'); - if issave>0 - % generate text command - if issave==2 - erpcom = sprintf('%s\n%s', erpcom, erpcom_save); - msgwrng = '*** Your ERPset was saved on your hard drive.***'; - else - msgwrng = '*** Warning: Your ERPset was only saved on the workspace.***'; - end - fprintf('\n%s\n\n', msgwrng) - try cprintf([0 0 1], 'COMPLETE\n\n');catch,fprintf('COMPLETE\n\n');end ; - else - ERP = ERPaux; - msgwrng = 'ERPLAB Warning: Your changes were not saved'; - try cprintf([1 0.52 0.2], '%s\n\n', msgwrng);catch,fprintf('%s\n\n', msgwrng);end ; - end +if issaveas + [ERP, issave, erpcom_save] = pop_savemyerp(ERP,'gui','erplab', 'History', 'off'); + if issave>0 + % generate text command + if issave==2 + erpcom = sprintf('%s\n%s', erpcom, erpcom_save); + msgwrng = '*** Your ERPset was saved on your hard drive.***'; + else + msgwrng = '*** Warning: Your ERPset was only saved on the workspace.***'; + end + fprintf('\n%s\n\n', msgwrng) + try cprintf([0 0 1], 'COMPLETE\n\n');catch,fprintf('COMPLETE\n\n');end ; + else + ERP = ERPaux; + msgwrng = 'ERPLAB Warning: Your changes were not saved'; + try cprintf([1 0.52 0.2], '%s\n\n', msgwrng);catch,fprintf('%s\n\n', msgwrng);end ; + end end % get history from script. ERP switch shist - case 1 % from GUI - displayEquiComERP(erpcom); - case 2 % from script - ERP = erphistory(ERP, [], erpcom, 1); - case 3 - % implicit - % ERP = erphistory(ERP, [], erpcom, 1); - % fprintf('%%Equivalent command:\n%s\n\n', erpcom); - otherwise %off or none - erpcom = ''; - return + case 1 % from GUI + displayEquiComERP(erpcom); + case 2 % from script + ERP = erphistory(ERP, [], erpcom, 1); + case 3 + % implicit + % ERP = erphistory(ERP, [], erpcom, 1); + % fprintf('%%Equivalent command:\n%s\n\n', erpcom); + otherwise %off or none + erpcom = ''; + return end % % Completion statement diff --git a/pop_functions/pop_remove_response_mistakes.m b/pop_functions/pop_remove_response_mistakes.m index 3e5aa916..8dae7042 100755 --- a/pop_functions/pop_remove_response_mistakes.m +++ b/pop_functions/pop_remove_response_mistakes.m @@ -12,8 +12,10 @@ end EEG = remove_response_mistakes(EEG,stim_codes,resp_codes,1); - -[ALLEEG,EEG] = pop_newset(ALLEEG,EEG,CURRENTSET); - -hist_com = ['[ALLEEG EEG] = pop_remove_response_mistakes(ALLEEG, EEG, CURRENTSET, ' num2str(stim_codes) ',' num2str(resp_codes) ]; +ERPtooltype = erpgettoolversion('tooltype'); +if ~strcmpi(ERPtooltype,'estudio') + [ALLEEG,EEG] = pop_newset(ALLEEG,EEG,CURRENTSET); +end +stim_codesstr = vect2colon(stim_codes);resp_codesstr = vect2colon(resp_codes); +hist_com = ['[ALLEEG EEG] = pop_remove_response_mistakes(ALLEEG, EEG, CURRENTSET,', stim_codesstr, ',',resp_codesstr,');' ]; diff --git a/pop_functions/pop_squeezevents.m b/pop_functions/pop_squeezevents.m index 30617952..9134d843 100755 --- a/pop_functions/pop_squeezevents.m +++ b/pop_functions/pop_squeezevents.m @@ -47,38 +47,38 @@ function [EEG, com] = pop_squeezevents(EEG, varargin) com = ''; if isobject(EEG) % eegobj - whenEEGisanObject % calls a script for showing an error window - return + whenEEGisanObject % calls a script for showing an error window + return end if isempty(EEG(1)) - msgboxText = 'pop_squeezevents() cannot work with an empty dataset.'; - title = 'ERPLAB: pop_squeezevents Permission denied'; - errorfound(msgboxText, title); - return + msgboxText = 'pop_squeezevents() cannot work with an empty dataset.'; + title = 'ERPLAB: pop_squeezevents Permission denied'; + errorfound(msgboxText, title); + return end if ~isempty(EEG(1).epoch) - msgboxText = 'pop_squeezevents() has been tested for continuous data only.'; - title = 'ERPLAB: pop_squeezevents Permission denied'; - errorfound(msgboxText, title); - return + msgboxText = 'pop_squeezevents() has been tested for continuous data only.'; + title = 'ERPLAB: pop_squeezevents Permission denied'; + errorfound(msgboxText, title); + return end if isempty(EEG(1).data) - msgboxText = 'pop_squeezevents() cannot work with an empty dataset.'; - title = 'ERPLAB: pop_squeezevents Permission denied'; - errorfound(msgboxText, title); - return + msgboxText = 'pop_squeezevents() cannot work with an empty dataset.'; + title = 'ERPLAB: pop_squeezevents Permission denied'; + errorfound(msgboxText, title); + return end if isempty(EEG(1).event) - msgboxText = 'pop_squeezevents() cannot work with an empty dataset.'; - title = 'ERPLAB: pop_squeezevents Permission denied'; - errorfound(msgboxText, title); - return + msgboxText = 'pop_squeezevents() cannot work with an empty dataset.'; + title = 'ERPLAB: pop_squeezevents Permission denied'; + errorfound(msgboxText, title); + return end if isempty([EEG(1).event.type]) - msgboxText = 'pop_squeezevents() cannot work with an empty dataset.'; - title = 'ERPLAB: pop_squeezevents Permission denied'; - errorfound(msgboxText, title); - return + msgboxText = 'pop_squeezevents() cannot work with an empty dataset.'; + title = 'ERPLAB: pop_squeezevents Permission denied'; + errorfound(msgboxText, title); + return end p = inputParser; @@ -89,41 +89,58 @@ p.parse(EEG, varargin{:}); if strcmpi(p.Results.History,'implicit') - shist = 3; % implicit + shist = 3; % implicit elseif strcmpi(p.Results.History,'script') - shist = 2; % script + shist = 2; % script elseif strcmpi(p.Results.History,'gui') - shist = 1; % gui + shist = 1; % gui else - shist = 0; % off + shist = 0; % off end % % process multiple datasets April 13, 2011 JLC % if length(EEG) > 1 - [EEG, com ] = eeg_eval( 'pop_squeezevents', EEG, 'warning', 'on'); - return; + [EEG, com ] = eeg_eval( 'pop_squeezevents', EEG, 'warning', 'on'); + return; end - +%%for events squeezevents(EEG.event); + +%%for bins if exist---Jan 09 2024 GH +if isfield(EEG,'EVENTLIST') && ~isempty(EEG.EVENTLIST) + if ~isempty(EEG.EVENTLIST.trialsperbin) + for jjj = 1:length(EEG.EVENTLIST.eventinfo) + eventbini(jjj,1) = EEG.EVENTLIST.eventinfo(jjj).bini; + end + if any(eventbini(:)>0) + fprintf('\n\n**Below is the number and description of each bin:\n\n') + for ii = 1:numel(EEG.EVENTLIST.trialsperbin) + fprintf(['bin',32,num2str(ii),', #',32,num2str(EEG.EVENTLIST.trialsperbin(ii)),',',32,EEG.EVENTLIST.bdf(ii).description,'\n']) + end + end + end +end%%change end + + com = sprintf( 'pop_squeezevents(%s);', inputname(1)); % get history from script. EEG switch shist - case 1 % from GUI - com = sprintf('%s %% GUI: %s', com, datestr(now)); - %fprintf('%%Equivalent command:\n%s\n\n', com); - displayEquiComERP(com); - case 2 % from script - EEG = erphistory(EEG, [], com, 1); - case 3 - % implicit - % EEG = erphistory(EEG, [], com, 1); - % fprintf('%%Equivalent command:\n%s\n\n', com); - otherwise %off or none - com = ''; - return + case 1 % from GUI + com = sprintf('%s %% GUI: %s', com, datestr(now)); + %fprintf('%%Equivalent command:\n%s\n\n', com); + displayEquiComERP(com); + case 2 % from script + EEG = erphistory(EEG, [], com, 1); + case 3 + % implicit + % EEG = erphistory(EEG, [], com, 1); + % fprintf('%%Equivalent command:\n%s\n\n', com); + otherwise %off or none + com = ''; + return end % diff --git a/pop_functions/pop_summary_AR_eeg_detection.m b/pop_functions/pop_summary_AR_eeg_detection.m index c31f03c5..40e32a7c 100755 --- a/pop_functions/pop_summary_AR_eeg_detection.m +++ b/pop_functions/pop_summary_AR_eeg_detection.m @@ -52,74 +52,80 @@ rej = []; histoflags = []; if nargin<1 - help pop_summary_AR_eeg_detection - return + help pop_summary_AR_eeg_detection + return end if isobject(EEG) % eegobj - whenEEGisanObject % calls a script for showing an error window - return + whenEEGisanObject % calls a script for showing an error window + return end if nargin==1 - if length(EEG)>1 - msgboxText = 'Unfortunately, pop_summary_AR_eeg_detection() does not work with multiple datasets'; - title = 'ERPLAB: multiple inputs'; - errorfound(msgboxText, title); - return - end - if isempty(EEG.epoch) - msgboxText = 'pop_summary_AR_eeg_detection() only works with epoched dataset.'; - title = 'ERPLAB: pop_summary_AR_eeg_detection'; - errorfound(sprintf(msgboxText), title); - return - end - - BackERPLABcolor = [1 0.9 0.3]; % ERPLAB main window background - question = 'In order to see your summary, what would you like to do?'; + if length(EEG)>1 + msgboxText = 'Unfortunately, pop_summary_AR_eeg_detection() does not work with multiple datasets'; + title = 'ERPLAB: multiple inputs'; + errorfound(msgboxText, title); + return + end + if isempty(EEG.epoch) + msgboxText = 'pop_summary_AR_eeg_detection() only works with epoched dataset.'; + title = 'ERPLAB: pop_summary_AR_eeg_detection'; + errorfound(sprintf(msgboxText), title); + return + end + + BackERPLABcolor = [1 0.9 0.3]; % ERPLAB main window background + question = 'In order to see your summary, what would you like to do?'; + + if isempty(EEG.setname)%%changed by GH Sep. 2023 title = 'Artifact detection summary'; - oldcolor = get(0,'DefaultUicontrolBackgroundColor'); - set(0,'DefaultUicontrolBackgroundColor',BackERPLABcolor) - button = questdlg(question, title,'Save in a file','Show at Command Window', 'Cancel','Show at Command Window'); - set(0,'DefaultUicontrolBackgroundColor',oldcolor) + else + title = ['Artifact detection summary for ',EEG.setname]; + end + + oldcolor = get(0,'DefaultUicontrolBackgroundColor'); + set(0,'DefaultUicontrolBackgroundColor',BackERPLABcolor) + button = questdlg(question, title,'Save in a file','Show at Command Window', 'Cancel','Show at Command Window'); + set(0,'DefaultUicontrolBackgroundColor',oldcolor) + + if strcmpi(button,'Show at Command Window') + fullname = ''; + elseif strcmpi(button,'Save in a file') - if strcmpi(button,'Show at Command Window') - fullname = ''; - elseif strcmpi(button,'Save in a file') - - % - % Save OUTPUT file - % - [filename, filepath, filterindex] = uiputfile({'*.txt';'*.dat';'*.*'},'Save Artifact Detection Summary as', ['AR_summary_' EEG.setname]); + % + % Save OUTPUT file + % + [filename, filepath, filterindex] = uiputfile({'*.txt';'*.dat';'*.*'},'Save Artifact Detection Summary as', ['AR_summary_' EEG.setname]); + + if isequal(filename,0) + disp('User selected Cancel') + return + else + [px, fname, ext] = fileparts(filename); + + if strcmp(ext,'') - if isequal(filename,0) - disp('User selected Cancel') - return + if filterindex==1 || filterindex==3 + ext = '.txt'; else - [px, fname, ext] = fileparts(filename); - - if strcmp(ext,'') - - if filterindex==1 || filterindex==3 - ext = '.txt'; - else - ext = '.dat'; - end - end - - fname = [ fname ext]; - fullname = fullfile(filepath, fname); - disp(['For saving artifact detection summary, user selected ' fullname '']) - + ext = '.dat'; end - elseif strcmpi(button,'Cancel') || strcmpi(button,'') - disp('User selected Cancel') - return + end + + fname = [ fname ext]; + fullname = fullfile(filepath, fname); + disp(['For saving artifact detection summary, user selected ' fullname '']) + end - - % - % Somersault - % - [EEG, tprej, acce, rej, histoflags, com] = pop_summary_AR_eeg_detection(EEG, fullname, 'History', 'gui'); + elseif strcmpi(button,'Cancel') || strcmpi(button,'') + disp('User selected Cancel') return + end + + % + % Somersault + % + [EEG, tprej, acce, rej, histoflags, com] = pop_summary_AR_eeg_detection(EEG, fullname, 'History', 'gui'); + return end % @@ -135,30 +141,30 @@ p.parse(EEG, fullname, varargin{:}); if length(EEG)>1 - msgboxText = 'Unfortunately, pop_summary_AR_eeg_detection() does not work with multiple datasets'; - error('prog:input', ['ERPLAB says: ' msgboxText]); + msgboxText = 'Unfortunately, pop_summary_AR_eeg_detection() does not work with multiple datasets'; + error('prog:input', ['ERPLAB says: ' msgboxText]); end if isempty(EEG.epoch) - msgboxText = 'pop_summary_AR_eeg_detection() only works with epoched dataset.'; - error('prog:input', ['ERPLAB says: ' msgboxText]); + msgboxText = 'pop_summary_AR_eeg_detection() only works with epoched dataset.'; + error('prog:input', ['ERPLAB says: ' msgboxText]); end if strcmpi(p.Results.History,'implicit') - shist = 3; % implicit + shist = 3; % implicit elseif strcmpi(p.Results.History,'script') - shist = 2; % script + shist = 2; % script elseif strcmpi(p.Results.History,'gui') - shist = 1; % gui + shist = 1; % gui else - shist = 0; % off + shist = 0; % off end if isempty(strtrim(fullname)) - fidsumm = 1; % to command window + fidsumm = 1; % to command window else - if strcmpi(strtrim(fullname), 'none') - fidsumm = -99; - else - fidsumm = fopen( fullname , 'w'); % to a file - end + if strcmpi(strtrim(fullname), 'none') + fidsumm = -99; + else + fidsumm = fopen( fullname , 'w'); % to a file + end end F = fieldnames(EEG.reject); @@ -170,66 +176,66 @@ histT = zeros(1, EEG.trials); for i=1:nfield - fieldnameE = char(sfields2{i}); - fieldnameT = char(rfields{i}); - - if ~isempty(EEG.reject.(fieldnameE)) - histE = histE | [EEG.reject.(fieldnameE)]; %electrodes - histT = histT | [EEG.reject.(fieldnameT)]; %trials (epochs) - end + fieldnameE = char(sfields2{i}); + fieldnameT = char(rfields{i}); + + if ~isempty(EEG.reject.(fieldnameE)) + histE = histE | [EEG.reject.(fieldnameE)]; %electrodes + histT = histT | [EEG.reject.(fieldnameT)]; %trials (epochs) + end end nbin = EEG.EVENTLIST.nbin; Sumbin = zeros(1,nbin); for i=1:nbin - for j=1:EEG.trials - if length(EEG.epoch(j).eventlatency) == 1 - binix = [EEG.epoch(j).eventbini]; - if iscell(binix) - binix = cell2mat(binix); - end - if ismember(i, binix) - Sumbin(i) = Sumbin(i) + histT(j); - end - elseif length(EEG.epoch(j).eventlatency) > 1 - indxtimelock = find(cell2mat(EEG.epoch(j).eventlatency) == 0,1,'first'); % catch zero-time locked type, - if ismember(i, EEG.epoch(j).eventbini{indxtimelock}) - Sumbin(i) = Sumbin(i) + histT(j); - end - end + for j=1:EEG.trials + if length(EEG.epoch(j).eventlatency) == 1 + binix = [EEG.epoch(j).eventbini]; + if iscell(binix) + binix = cell2mat(binix); + end + if ismember(i, binix) + Sumbin(i) = Sumbin(i) + histT(j); + end + elseif length(EEG.epoch(j).eventlatency) > 1 + indxtimelock = find(cell2mat(EEG.epoch(j).eventlatency) == 0,1,'first'); % catch zero-time locked type, + if ismember(i, EEG.epoch(j).eventbini{indxtimelock}) + Sumbin(i) = Sumbin(i) + histT(j); + end end + end end histoflags = summary_rejectflags(EEG); if fidsumm~=-99 - % - % Table - % - hdr = {'Bin' '#(%) accepted' '#(%) rejected' '# F2' '# F3' '# F4' '# F5' '# F6' '# F7' '# F8' }; - fprintf(fidsumm, '%s %15s %15s %7s %7s %7s %7s %7s %7s %7s\n', hdr{:}); + % + % Table + % + hdr = {'Bin' '#(%) accepted' '#(%) rejected' '# F2' '# F3' '# F4' '# F5' '# F6' '# F7' '# F8' }; + fprintf(fidsumm, '%s %15s %15s %7s %7s %7s %7s %7s %7s %7s\n', hdr{:}); end acce = zeros(1,nbin); rej = zeros(1,nbin); for i=1:nbin - rej(i) = Sumbin(i) ; - acce(i) = EEG.EVENTLIST.trialsperbin(i)-rej(i); - - if EEG.EVENTLIST.trialsperbin(i) ~= 0 - pacce = (acce(i)/EEG.EVENTLIST.trialsperbin(i))*100; - paccestr = sprintf('%.1f', pacce); - prej = (rej(i)/EEG.EVENTLIST.trialsperbin(i))*100; - prejstr = sprintf('%.1f', prej); - else - paccestr = 'error'; - prejstr = 'error'; - end - if fidsumm~=-99 - fprintf(fidsumm, '%3g %6g(%5s) %8g(%5s) %7g %7g %7g %7g %7g %7g %7g\n', i,acce(i), paccestr, rej(i), prejstr, histoflags(i,2:8)); - end + rej(i) = Sumbin(i) ; + acce(i) = EEG.EVENTLIST.trialsperbin(i)-rej(i); + + if EEG.EVENTLIST.trialsperbin(i) ~= 0 + pacce = (acce(i)/EEG.EVENTLIST.trialsperbin(i))*100; + paccestr = sprintf('%.1f', pacce); + prej = (rej(i)/EEG.EVENTLIST.trialsperbin(i))*100; + prejstr = sprintf('%.1f', prej); + else + paccestr = 'error'; + prejstr = 'error'; + end + if fidsumm~=-99 + fprintf(fidsumm, '%3g %6g(%5s) %8g(%5s) %7g %7g %7g %7g %7g %7g %7g\n', i,acce(i), paccestr, rej(i), prejstr, histoflags(i,2:8)); + end end trej = sum(Sumbin); @@ -240,29 +246,29 @@ tprejstr = sprintf('%.1f', tprej); thistoflags = sum(histoflags,1); if fidsumm~=-99 - fprintf(fidsumm, [repmat('_',1,100) '\n']); - fprintf(fidsumm, 'Total %5g(%5s) %8g(%5s) %7g %7g %7g %7g %7g %7g %7g\n', tacce, tpaccestr, trej, tprejstr, thistoflags(2:8)); - fprintf(fidsumm, '\n'); + fprintf(fidsumm, [repmat('_',1,100) '\n']); + fprintf(fidsumm, 'Total %5g(%5s) %8g(%5s) %7g %7g %7g %7g %7g %7g %7g\n', tacce, tpaccestr, trej, tprejstr, thistoflags(2:8)); + fprintf(fidsumm, '\n'); end if fidsumm>1 - fclose(fidsumm); - com = sprintf('EEG = pop_summary_AR_eeg_detection(EEG, ''%s'');', fullname); + fclose(fidsumm); + com = sprintf('EEG = pop_summary_AR_eeg_detection(EEG, ''%s'');', fullname); else - com = sprintf('[EEG, tprej, acce, rej, histoflags ] = pop_summary_AR_eeg_detection(EEG,''none'');'); + com = sprintf('[EEG, tprej, acce, rej, histoflags ] = pop_summary_AR_eeg_detection(EEG,''none'');'); end % get history from script. EEG switch shist - case 1 % from GUI - com = sprintf('%s %% GUI: %s', com, datestr(now)); - %fprintf('%%Equivalent command:\n%s\n\n', com); - displayEquiComERP(com); - case 2 % from script - EEG = erphistory(EEG, [], com, 1); - case 3 - % implicit - otherwise %off or none - com = ''; - return + case 1 % from GUI + com = sprintf('%s %% GUI: %s', com, datestr(now)); + %fprintf('%%Equivalent command:\n%s\n\n', com); + displayEquiComERP(com); + case 2 % from script + EEG = erphistory(EEG, [], com, 1); + case 3 + % implicit + otherwise %off or none + com = ''; + return end % diff --git a/pop_functions/pop_summary_AR_erp_detection.m b/pop_functions/pop_summary_AR_erp_detection.m index 69cbb978..d2900b04 100755 --- a/pop_functions/pop_summary_AR_erp_detection.m +++ b/pop_functions/pop_summary_AR_erp_detection.m @@ -84,7 +84,7 @@ oldcolor = get(0,'DefaultUicontrolBackgroundColor'); set(0,'DefaultUicontrolBackgroundColor',BackERPLABcolor) button = questdlg(question, title,'Save in a file','Show at Command Window', 'Cancel','Show at Command Window'); - set(0,'DefaultUicontrolBackgroundColor',oldcolor) + set(0,'DefaultUicontrolBackgroundColor',oldcolor); if strcmpi(button,'Show at Command Window') fullname = ''; @@ -184,6 +184,9 @@ % Table % if fidsumm~=-99 + fprintf(fidsumm, ['\n',repmat('_',1,100) '\n']); + fprintf(fidsumm, ['ERP Name:',32,ERP.erpname '\n']); + fprintf(fidsumm, [repmat('_',1,100) '\n']); hdr = {'Bin' '#(%) accepted' '#(%) rejected' '# F2' '# F3' '# F4' '# F5' '# F6' '# F7' '# F8' }; fprintf(fidsumm, '%s %15s %15s %7s %7s %7s %7s %7s %7s %7s\n', hdr{:}); end diff --git a/pop_functions/pop_syncroartifacts.m b/pop_functions/pop_syncroartifacts.m index 519b76f5..be3d3210 100755 --- a/pop_functions/pop_syncroartifacts.m +++ b/pop_functions/pop_syncroartifacts.m @@ -14,7 +14,7 @@ % 'Direction' 'erplab2eeglab' - erplab to eeglab synchro % 'eeglab2erplab' - eeglab to erplab synchro % 'bidirectional' - (default) both -% +% % OUTPUTS % % EEG - updated epoched dataset @@ -56,46 +56,46 @@ com = ''; if isobject(EEG) % eegobj - whenEEGisanObject % calls a script for showing an error window - return + whenEEGisanObject % calls a script for showing an error window + return end if nargin==1 - serror = erplab_eegscanner(EEG, 'pop_syncroartifacts', 2, 0, 1, 2, 1); - if serror - return - end - - % - % Call GUI - % - direction = synchroartifactsGUI; - % direction = 1; % erplab to eeglab synchro - % direction = 2; % eeglab to erplab synchro - % direction = 3; % both - % direction = 0; % none - if isempty(direction) - disp('User selected Cancel') - return - end - if direction==1 % erplab to eeglab synchro - dircom = 'erplab2eeglab'; - elseif direction==2 %eeglab to erplab synchro - dircom = 'eeglab2erplab'; - elseif direction==3 % both - dircom = 'bidirectional'; - else - dircom = 'none'; - end - if length(EEG)==1 - EEG.setname = [EEG.setname '_synctrej']; %suggest a new name - end - - % - % Somersault - % - [EEG, com] = pop_syncroartifacts(EEG, 'Direction', dircom, 'History', 'gui'); - pause(0.1); + serror = erplab_eegscanner(EEG, 'pop_syncroartifacts', 2, 0, 1, 2, 1); + if serror + return + end + + % + % Call GUI + % + direction = synchroartifactsGUI; + % direction = 1; % erplab to eeglab synchro + % direction = 2; % eeglab to erplab synchro + % direction = 3; % both + % direction = 0; % none + if isempty(direction) + disp('User selected Cancel') return + end + if direction==1 % erplab to eeglab synchro + dircom = 'erplab2eeglab'; + elseif direction==2 %eeglab to erplab synchro + dircom = 'eeglab2erplab'; + elseif direction==3 % both + dircom = 'bidirectional'; + else + dircom = 'none'; + end + if length(EEG)==1 + EEG.setname = [EEG.setname '_synctrej']; %suggest a new name + end + + % + % Somersault + % + [EEG, com] = pop_syncroartifacts(EEG, 'Direction', dircom, 'History', 'gui'); + pause(0.1); + return end % @@ -110,22 +110,22 @@ p.parse(EEG, varargin{:}); if strcmpi(p.Results.History,'implicit') - shist = 3; % implicit + shist = 3; % implicit elseif strcmpi(p.Results.History,'script') - shist = 2; % script + shist = 2; % script elseif strcmpi(p.Results.History,'gui') - shist = 1; % gui + shist = 1; % gui else - shist = 0; % off + shist = 0; % off end % % process multiple datasets. Updated August 23, 2013 JLC % if length(EEG) > 1 - options1 = {'Direction', p.Results.Direction, 'History', 'gui'}; - [ EEG, com ] = eeg_eval( 'pop_syncroartifacts', EEG, 'warning', 'on', 'params', options1); - return; + options1 = {'Direction', p.Results.Direction, 'History', 'gui'}; + [ EEG, com ] = eeg_eval( 'pop_syncroartifacts', EEG, 'warning', 'on', 'params', options1); + return; end %erplab_eegscanner(EEG, funcname, chckmultieeg, chckemptyeeg, chckepocheeg, chcknoevents, chckeventlist, varargin) @@ -133,20 +133,20 @@ if strcmpi(p.Results.Direction,'no') || strcmpi(p.Results.Direction,'none') - direction = 0; + direction = 0; elseif strcmpi(p.Results.Direction,'erplab2eeglab') - direction = 1; + direction = 1; elseif strcmpi(p.Results.Direction,'eeglab2erplab') - direction = 2; + direction = 2; elseif strcmpi(p.Results.Direction,'bidirectional') - direction = 3; + direction = 3; else - msgboxText = 'ERPLAB says: Invalid synchronization direction parameter.'; - error('prog:input', ['ERPLAB says: ' msgboxText]); + msgboxText = 'ERPLAB says: Invalid synchronization direction parameter.'; + error('prog:input', ['ERPLAB says: ' msgboxText]); end if direction==0 - fprintf('User decided not to synchronize.\n'); - return + fprintf('User decided not to synchronize.\n'); + return end % @@ -154,46 +154,46 @@ % isRT = 1; % there is RT info by default if ~isfield(EEG.EVENTLIST.bdf, 'rt') - isRT = 0; % no RT info + isRT = 0; % no RT info else - valid_rt = nnz(~cellfun(@isempty,{EEG.EVENTLIST.bdf.rt})); - if valid_rt==0 - isRT = 0; % no RT info - end + valid_rt = nnz(~cellfun(@isempty,{EEG.EVENTLIST.bdf.rt})); + if valid_rt==0 + isRT = 0; % no RT info + end end % % Synchronization % if direction==1 % erplab to eeglab synchro - EEG = synchroner1(EEG); + EEG = synchroner1(EEG); elseif direction==2 %eeglab to erplab synchro - EEG = synchroner2(EEG, isRT); + EEG = synchroner2(EEG, isRT); elseif direction==3 % both - %EEG = synchroner1(EEG); - %EEG = synchroner2(EEG, isRT); - EEG = synchroner3(EEG, isRT); + %EEG = synchroner1(EEG); + %EEG = synchroner2(EEG, isRT); + EEG = synchroner3(EEG, isRT); else - fprintf('no synchronization.\n'); + fprintf('no synchronization.\n'); end com = sprintf( '%s = pop_syncroartifacts(%s, %s);', inputname(1), inputname(1), num2str(direction)); % get history from script. EEG switch shist - case 1 % from GUI - com = sprintf('%s %% GUI: %s', com, datestr(now)); - %fprintf('%%Equivalent command:\n%s\n\n', com); - displayEquiComERP(com); - case 2 % from script - EEG = erphistory(EEG, [], com, 1); - case 3 - % implicit - % EEG = erphistory(EEG, [], com, 1); - % fprintf('%%Equivalent command:\n%s\n\n', com); - otherwise %off or none - com = ''; - return + case 1 % from GUI + com = sprintf('%s %% GUI: %s', com, datestr(now)); + %fprintf('%%Equivalent command:\n%s\n\n', com); + displayEquiComERP(com); + case 2 % from script + EEG = erphistory(EEG, [], com, 1); + case 3 + % implicit + % EEG = erphistory(EEG, [], com, 1); + % fprintf('%%Equivalent command:\n%s\n\n', com); + otherwise %off or none + com = ''; + return end % @@ -213,33 +213,39 @@ fprintf('---------------------------------------------------------\n\n'); nepoch = EEG.trials; for i=1:nepoch - cflag = EEG.epoch(i).eventflag; % flag(s) from event(s) within this epoch - if iscell(cflag) - %cflag = cell2mat(cflag); - cflag = uint16([cflag{:}]); % giving some problems with uint16 type of flags - end - laten = EEG.epoch(i).eventlatency;% latency(ies) from event(s) within this epoch - if iscell(laten) - laten = cell2mat(laten); + cflag = EEG.epoch(i).eventflag; % flag(s) from event(s) within this epoch + if iscell(cflag) + %cflag = cell2mat(cflag); + cflag = uint16([cflag{:}]); % giving some problems with uint16 type of flags + end + laten = EEG.epoch(i).eventlatency;% latency(ies) from event(s) within this epoch + if iscell(laten) + laten = cell2mat(laten); + end + + indxtimelock = find(laten == 0,1,'first'); % catch zero-time locked code position, + flag = cflag(indxtimelock); + + %sum(bitget(flag, 1:8))>0; + if sum(bitget(flag, 1:8))>0 + if ~isempty(EEG.reject.rejmanual)%%GH Jun 2024 + if EEG.reject.rejmanual(i)==0 + EEG.reject.rejmanual(i) = 1; % marks epoch with artifact + %EEG.reject.rejmanualE(chanArray(ch), i) = 1; % marks channel with artifact + iflag = find(bitget(flag,1:8)); + fprintf('Epoch # %g was marked due to flag(s) # %s was(were) set for its home item.\n',i, num2str(iflag)); + end + end - - indxtimelock = find(laten == 0,1,'first'); % catch zero-time locked code position, - flag = cflag(indxtimelock); - - %sum(bitget(flag, 1:8))>0; - if sum(bitget(flag, 1:8))>0 - if EEG.reject.rejmanual(i)==0 - EEG.reject.rejmanual(i) = 1; % marks epoch with artifact - %EEG.reject.rejmanualE(chanArray(ch), i) = 1; % marks channel with artifact - iflag = find(bitget(flag,1:8)); - fprintf('Epoch # %g was marked due to flag(s) # %s was(were) set for its home item.\n',i, num2str(iflag)); - end - else - if EEG.reject.rejmanual(i)==1 - EEG.reject.rejmanual(i)=0; - fprintf('The mark at epoch # %g was removed due to no set flag was found at its home item.\n',i); - end + else + if ~isempty(EEG.reject.rejmanual)%%GH Jun 2024 + if EEG.reject.rejmanual(i)==1 + EEG.reject.rejmanual(i)=0; + fprintf('The mark at epoch # %g was removed due to no set flag was found at its home item.\n',i); + end + end + end end % @@ -250,22 +256,28 @@ fprintf('---------------------------------------------------------\n\n'); nitem = length(EEG.EVENTLIST.eventinfo); for i=1:nitem - flag = EEG.EVENTLIST.eventinfo(i).flag; - bepoch = EEG.EVENTLIST.eventinfo(i).bepoch; - if bepoch>0 - if sum(bitget(flag, 1:8))>0 - if EEG.reject.rejmanual(bepoch)==0 - EEG.reject.rejmanual(bepoch) = 1; % marks epoch with artifact - iflag = find(bitget(flag,1:8)); - fprintf('Epoch # %g was marked due to flag(s) # %s was(were) set for item # %g.\n',bepoch, num2str(iflag), i); - end - else - if EEG.reject.rejmanual(bepoch)==1 - EEG.reject.rejmanual(bepoch)=0; - fprintf('The mark at epoch # %g was removed due to no set flag was found at item # %g.\n', bepoch, i); - end + flag = EEG.EVENTLIST.eventinfo(i).flag; + bepoch = EEG.EVENTLIST.eventinfo(i).bepoch; + if bepoch>0 + if sum(bitget(flag, 1:8))>0 + if ~isempty(EEG.reject.rejmanual)%%GH Jun 2024 + if EEG.reject.rejmanual(bepoch)==0 + EEG.reject.rejmanual(bepoch) = 1; % marks epoch with artifact + iflag = find(bitget(flag,1:8)); + fprintf('Epoch # %g was marked due to flag(s) # %s was(were) set for item # %g.\n',bepoch, num2str(iflag), i); end + + end + else + if ~isempty(EEG.reject.rejmanual)%%GH Jun 2024 + if EEG.reject.rejmanual(bepoch)==1 + EEG.reject.rejmanual(bepoch)=0; + fprintf('The mark at epoch # %g was removed due to no set flag was found at item # %g.\n', bepoch, i); + end + + end end + end end fprintf('\nEEG.reject.rejmanual(i) was synchronized according to EEG.epoch(i).eventflag values.\n') return @@ -287,9 +299,9 @@ indx = []; for i=1:length(arfields) - if ~isempty(EEG.reject.(arfields{i})) - indx = [indx i]; - end + if ~isempty(EEG.reject.(arfields{i})) + indx = [indx i]; + end end fprintf('\n---------------------------------------------------------\n'); @@ -299,23 +311,23 @@ selarfields = arfields(indx); % not empty EEGLAB's artifact rejection fields nsarf = length(selarfields); for i=1:ntrial; - r = zeros(1,nsarf); - for j=1:nsarf - r(j) = EEG.reject.(selarfields{j})(i); - end - if nnz(r)>0 - EEG = markartifacts(EEG, 1, [], [], i, isRT, 1); - else - EEG = markartifacts(EEG, 0, [], [], i, isRT, 1); % JLC Sept 1, 2012 - end + r = zeros(1,nsarf); + for j=1:nsarf + r(j) = EEG.reject.(selarfields{j})(i); + end + if nnz(r)>0 + EEG = markartifacts(EEG, 1, [], [], i, isRT, 1); + else + EEG = markartifacts(EEG, 0, [], [], i, isRT, 1); % JLC Sept 1, 2012 + end end fprintf('\nFlag 1 was marked at EEG.EVENTLIST.eventinfo and EEG.epoch, according to EEG.reject.{ar_tool}.\n'); if isRT - fprintf('For reaction time filtering, EEG.EVENTLIST.bdf was synchronized with artifact detection info as well.\n\n'); + fprintf('For reaction time filtering, EEG.EVENTLIST.bdf was synchronized with artifact detection info as well.\n\n'); else - fprintf('EEG.EVENTLIST.bdf was not synchronized due to reaction time measurement was not found in this dataset.\n\n'); + fprintf('EEG.EVENTLIST.bdf was not synchronized due to reaction time measurement was not found in this dataset.\n\n'); end return @@ -344,9 +356,9 @@ indx = []; for i=1:length(arfields) - if ~isempty(EEG.reject.(arfields{i})) - indx = [indx i]; - end + if ~isempty(EEG.reject.(arfields{i})) + indx = [indx i]; + end end fprintf('\n---------------------------------------------------------\n'); @@ -378,25 +390,25 @@ fprintf('---------------------------------------------------------\n\n'); for qEpoch=1:nepoch - cflag = EEG.epoch(qEpoch).eventflag; % flag(s) from event(s) within this epoch - if iscell(cflag) - %cflag = cell2mat(cflag); - cflag = uint16([cflag{:}]); % giving some problems with uint16 type of flags - end - laten = EEG.epoch(qEpoch).eventlatency;% latency(ies) from event(s) within this epoch - if iscell(laten) - laten = cell2mat(laten); - end - - indxtimelock = find(laten == 0,1,'first'); % catch zero-time locked code position, - flag = cflag(indxtimelock); - - if sum(bitget(flag, 1:8))>0 && EEG.reject.rejmanual(qEpoch) == 0 - EEG.reject.rejmanual(qEpoch) = 1; % % marks epoch with artifact only if flag is marked (no unmarking) - %EEG.reject.rejmanualE(chanArray(ch), qEpoch) = 1; % marks channel with artifact - iflag = find(bitget(flag,1:8)); - fprintf('Epoch # %g was marked due to flag(s) # %s was(were) set for its home item.\n',qEpoch, num2str(iflag)); - end + cflag = EEG.epoch(qEpoch).eventflag; % flag(s) from event(s) within this epoch + if iscell(cflag) + %cflag = cell2mat(cflag); + cflag = uint16([cflag{:}]); % giving some problems with uint16 type of flags + end + laten = EEG.epoch(qEpoch).eventlatency;% latency(ies) from event(s) within this epoch + if iscell(laten) + laten = cell2mat(laten); + end + + indxtimelock = find(laten == 0,1,'first'); % catch zero-time locked code position, + flag = cflag(indxtimelock); + + if sum(bitget(flag, 1:8))>0 && EEG.reject.rejmanual(qEpoch) == 0 + EEG.reject.rejmanual(qEpoch) = 1; % % marks epoch with artifact only if flag is marked (no unmarking) + %EEG.reject.rejmanualE(chanArray(ch), qEpoch) = 1; % marks channel with artifact + iflag = find(bitget(flag,1:8)); + fprintf('Epoch # %g was marked due to flag(s) # %s was(were) set for its home item.\n',qEpoch, num2str(iflag)); + end end % diff --git a/studio_functions/.txt b/studio_functions/.txt new file mode 100644 index 00000000..93380506 --- /dev/null +++ b/studio_functions/.txt @@ -0,0 +1,1028 @@ +# Non-editable header begin -------------------------------------------------------------------------------- +# +# data format...............: continuous +# setname...................: 1_MMN_shifted_ds_reref_ucbip_hpfilt_ica_weighted_new +# filename..................: 1_MMN_shifted_ds_reref_ucbip_hpfilt_ica_weighted_new.set +# filepath..................: /Users/gzhang/Documents/Demo data/EEGsets/EEG set/ +# nchan.....................: 30 +# pnts......................: 155648 +# srate.....................: 256 +# nevents...................: 1002 +# generated by (bdf)........: +# generated by (set)........: 1_MMN_shifted_ds_reref_ucbip_hpfilt_ica_weighted_new +# reported in ..............: +# prog Version..............: 11.0 +# creation date.............: 25-Apr-2024 14:39:36 +# user Account..............: +# +# Non-editable header end -------------------------------------------------------------------------------- + + + + +# item bepoch ecode label onset diff dura b_flags a_flags enable bin +# (sec) (msec) (msec) (binary) (binary) + + +1 0 1 "" 12.0752 0.00 0.0 00000000 00000000 1 [ ] +2 0 180 "" 15.1162 3041.02 0.0 00000000 00000000 1 [ ] +3 0 180 "" 15.7129 596.68 0.0 00000000 00000000 1 [ ] +4 0 180 "" 16.3330 620.12 0.0 00000000 00000000 1 [ ] +5 0 180 "" 16.9170 583.98 0.0 00000000 00000000 1 [ ] +6 0 180 "" 17.4834 566.41 0.0 00000000 00000000 1 [ ] +7 0 180 "" 18.1064 623.05 0.0 00000000 00000000 1 [ ] +8 0 180 "" 18.6465 540.04 0.0 00000000 00000000 1 [ ] +9 0 180 "" 19.2734 626.95 0.0 00000000 00000000 1 [ ] +10 0 180 "" 19.9033 629.88 0.0 00000000 00000000 1 [ ] +11 0 180 "" 20.4336 530.27 0.0 00000000 00000000 1 [ ] +12 0 180 "" 20.9932 559.57 0.0 00000000 00000000 1 [ ] +13 0 180 "" 21.5801 586.91 0.0 00000000 00000000 1 [ ] +14 0 180 "" 22.1895 609.38 0.0 00000000 00000000 1 [ ] +15 0 180 "" 22.7793 589.84 0.0 00000000 00000000 1 [ ] +16 0 180 "" 23.3398 560.55 0.0 00000000 00000000 1 [ ] +17 0 80 "" 23.8965 556.64 0.0 00000000 00000000 1 [ ] +18 0 80 "" 24.5264 629.88 0.0 00000000 00000000 1 [ ] +19 0 80 "" 25.1465 620.12 0.0 00000000 00000000 1 [ ] +20 0 80 "" 25.7568 610.35 0.0 00000000 00000000 1 [ ] +21 0 80 "" 26.3701 613.28 0.0 00000000 00000000 1 [ ] +22 0 80 "" 26.9160 545.90 0.0 00000000 00000000 1 [ ] +23 0 70 "" 27.5361 620.12 0.0 00000000 00000000 1 [ ] +24 0 80 "" 28.1533 617.19 0.0 00000000 00000000 1 [ ] +25 0 80 "" 28.7500 596.68 0.0 00000000 00000000 1 [ ] +26 0 80 "" 29.3799 629.88 0.0 00000000 00000000 1 [ ] +27 0 80 "" 29.9629 583.01 0.0 00000000 00000000 1 [ ] +28 0 80 "" 30.5830 620.12 0.0 00000000 00000000 1 [ ] +29 0 80 "" 31.1494 566.41 0.0 00000000 00000000 1 [ ] +30 0 80 "" 31.6934 543.95 0.0 00000000 00000000 1 [ ] +31 0 80 "" 32.3232 629.88 0.0 00000000 00000000 1 [ ] +32 0 80 "" 32.9365 613.28 0.0 00000000 00000000 1 [ ] +33 0 80 "" 33.4893 552.73 0.0 00000000 00000000 1 [ ] +34 0 70 "" 34.0527 563.48 0.0 00000000 00000000 1 [ ] +35 0 80 "" 34.6260 573.24 0.0 00000000 00000000 1 [ ] +36 0 70 "" 35.1797 553.71 0.0 00000000 00000000 1 [ ] +37 0 80 "" 35.7998 620.12 0.0 00000000 00000000 1 [ ] +38 0 80 "" 36.3691 569.34 0.0 00000000 00000000 1 [ ] +39 0 70 "" 36.9863 617.19 0.0 00000000 00000000 1 [ ] +40 0 80 "" 37.5664 580.08 0.0 00000000 00000000 1 [ ] +41 0 80 "" 38.1357 569.34 0.0 00000000 00000000 1 [ ] +42 0 80 "" 38.7725 636.72 0.0 00000000 00000000 1 [ ] +43 0 80 "" 39.4023 629.88 0.0 00000000 00000000 1 [ ] +44 0 80 "" 39.9658 563.48 0.0 00000000 00000000 1 [ ] +45 0 80 "" 40.5361 570.31 0.0 00000000 00000000 1 [ ] +46 0 80 "" 41.0996 563.48 0.0 00000000 00000000 1 [ ] +47 0 80 "" 41.6426 542.97 0.0 00000000 00000000 1 [ ] +48 0 80 "" 42.2197 577.15 0.0 00000000 00000000 1 [ ] +49 0 70 "" 42.8262 606.45 0.0 00000000 00000000 1 [ ] +50 0 80 "" 43.4023 576.17 0.0 00000000 00000000 1 [ ] +51 0 70 "" 43.9727 570.31 0.0 00000000 00000000 1 [ ] +52 0 80 "" 44.5391 566.41 0.0 00000000 00000000 1 [ ] +53 0 80 "" 45.0762 537.11 0.0 00000000 00000000 1 [ ] +54 0 80 "" 45.6826 606.45 0.0 00000000 00000000 1 [ ] +55 0 80 "" 46.2227 540.04 0.0 00000000 00000000 1 [ ] +56 0 80 "" 46.8330 610.35 0.0 00000000 00000000 1 [ ] +57 0 70 "" 47.4863 653.32 0.0 00000000 00000000 1 [ ] +58 0 80 "" 48.0791 592.77 0.0 00000000 00000000 1 [ ] +59 0 80 "" 48.6689 589.84 0.0 00000000 00000000 1 [ ] +60 0 80 "" 49.2793 610.35 0.0 00000000 00000000 1 [ ] +61 0 80 "" 49.8193 540.04 0.0 00000000 00000000 1 [ ] +62 0 80 "" 50.3691 549.80 0.0 00000000 00000000 1 [ ] +63 0 80 "" 50.9092 540.04 0.0 00000000 00000000 1 [ ] +64 0 80 "" 51.4922 583.01 0.0 00000000 00000000 1 [ ] +65 0 80 "" 52.0859 593.75 0.0 00000000 00000000 1 [ ] +66 0 80 "" 52.6689 583.01 0.0 00000000 00000000 1 [ ] +67 0 70 "" 53.2422 573.24 0.0 00000000 00000000 1 [ ] +68 0 80 "" 53.8721 629.88 0.0 00000000 00000000 1 [ ] +69 0 80 "" 54.4795 607.42 0.0 00000000 00000000 1 [ ] +70 0 70 "" 55.0557 576.17 0.0 00000000 00000000 1 [ ] +71 0 80 "" 55.6025 546.88 0.0 00000000 00000000 1 [ ] +72 0 80 "" 56.1455 542.97 0.0 00000000 00000000 1 [ ] +73 0 80 "" 56.6924 546.88 0.0 00000000 00000000 1 [ ] +74 0 80 "" 57.2422 549.80 0.0 00000000 00000000 1 [ ] +75 0 80 "" 57.7920 549.80 0.0 00000000 00000000 1 [ ] +76 0 80 "" 58.3359 543.95 0.0 00000000 00000000 1 [ ] +77 0 80 "" 58.8955 559.57 0.0 00000000 00000000 1 [ ] +78 0 80 "" 59.5186 623.05 0.0 00000000 00000000 1 [ ] +79 0 80 "" 60.1191 600.59 0.0 00000000 00000000 1 [ ] +80 0 80 "" 60.6758 556.64 0.0 00000000 00000000 1 [ ] +81 0 70 "" 61.2256 549.80 0.0 00000000 00000000 1 [ ] +82 0 80 "" 61.8320 606.45 0.0 00000000 00000000 1 [ ] +83 0 80 "" 62.4326 600.59 0.0 00000000 00000000 1 [ ] +84 0 80 "" 63.0557 623.05 0.0 00000000 00000000 1 [ ] +85 0 80 "" 63.6357 580.08 0.0 00000000 00000000 1 [ ] +86 0 70 "" 64.2588 623.05 0.0 00000000 00000000 1 [ ] +87 0 80 "" 64.8359 577.15 0.0 00000000 00000000 1 [ ] +88 0 70 "" 65.3818 545.90 0.0 00000000 00000000 1 [ ] +89 0 80 "" 65.9219 540.04 0.0 00000000 00000000 1 [ ] +90 0 80 "" 66.4893 567.38 0.0 00000000 00000000 1 [ ] +91 0 80 "" 67.1152 625.98 0.0 00000000 00000000 1 [ ] +92 0 80 "" 67.7393 624.02 0.0 00000000 00000000 1 [ ] +93 0 70 "" 68.3789 639.65 0.0 00000000 00000000 1 [ ] +94 0 80 "" 68.9756 596.68 0.0 00000000 00000000 1 [ ] +95 0 70 "" 69.5557 580.08 0.0 00000000 00000000 1 [ ] +96 0 80 "" 70.1221 566.41 0.0 00000000 00000000 1 [ ] +97 0 80 "" 70.7451 623.05 0.0 00000000 00000000 1 [ ] +98 0 70 "" 71.3350 589.84 0.0 00000000 00000000 1 [ ] +99 0 80 "" 71.8955 560.55 0.0 00000000 00000000 1 [ ] +100 0 70 "" 72.4883 592.77 0.0 00000000 00000000 1 [ ] +101 0 80 "" 73.0957 607.42 0.0 00000000 00000000 1 [ ] +102 0 70 "" 73.6621 566.41 0.0 00000000 00000000 1 [ ] +103 0 80 "" 74.2490 586.91 0.0 00000000 00000000 1 [ ] +104 0 80 "" 74.8457 596.68 0.0 00000000 00000000 1 [ ] +105 0 80 "" 75.3887 542.97 0.0 00000000 00000000 1 [ ] +106 0 80 "" 75.9355 546.88 0.0 00000000 00000000 1 [ ] +107 0 80 "" 76.5557 620.12 0.0 00000000 00000000 1 [ ] +108 0 80 "" 77.1816 625.98 0.0 00000000 00000000 1 [ ] +109 0 80 "" 77.7256 543.95 0.0 00000000 00000000 1 [ ] +110 0 80 "" 78.2715 545.90 0.0 00000000 00000000 1 [ ] +111 0 80 "" 78.8486 577.15 0.0 00000000 00000000 1 [ ] +112 0 80 "" 79.4648 616.21 0.0 00000000 00000000 1 [ ] +113 0 80 "" 80.0684 603.52 0.0 00000000 00000000 1 [ ] +114 0 80 "" 80.6123 543.95 0.0 00000000 00000000 1 [ ] +115 0 80 "" 81.2354 623.05 0.0 00000000 00000000 1 [ ] +116 0 80 "" 81.8623 626.95 0.0 00000000 00000000 1 [ ] +117 0 80 "" 82.4453 583.01 0.0 00000000 00000000 1 [ ] +118 0 80 "" 83.0723 626.95 0.0 00000000 00000000 1 [ ] +119 0 70 "" 83.6289 556.64 0.0 00000000 00000000 1 [ ] +120 0 80 "" 84.1787 549.80 0.0 00000000 00000000 1 [ ] +121 0 80 "" 84.8047 625.98 0.0 00000000 00000000 1 [ ] +122 0 80 "" 85.3721 567.38 0.0 00000000 00000000 1 [ ] +123 0 80 "" 85.9785 606.45 0.0 00000000 00000000 1 [ ] +124 0 80 "" 86.6084 629.88 0.0 00000000 00000000 1 [ ] +125 0 70 "" 87.2119 603.52 0.0 00000000 00000000 1 [ ] +126 0 80 "" 87.7783 566.41 0.0 00000000 00000000 1 [ ] +127 0 70 "" 88.3818 603.52 0.0 00000000 00000000 1 [ ] +128 0 80 "" 88.9688 586.91 0.0 00000000 00000000 1 [ ] +129 0 70 "" 89.5420 573.24 0.0 00000000 00000000 1 [ ] +130 0 80 "" 90.1016 559.57 0.0 00000000 00000000 1 [ ] +131 0 80 "" 90.7383 636.72 0.0 00000000 00000000 1 [ ] +132 0 80 "" 91.3682 629.88 0.0 00000000 00000000 1 [ ] +133 0 80 "" 91.9785 610.35 0.0 00000000 00000000 1 [ ] +134 0 80 "" 92.5879 609.38 0.0 00000000 00000000 1 [ ] +135 0 80 "" 93.1514 563.48 0.0 00000000 00000000 1 [ ] +136 0 80 "" 93.7520 600.59 0.0 00000000 00000000 1 [ ] +137 0 70 "" 94.3418 589.84 0.0 00000000 00000000 1 [ ] +138 0 80 "" 94.9053 563.48 0.0 00000000 00000000 1 [ ] +139 0 80 "" 95.5215 616.21 0.0 00000000 00000000 1 [ ] +140 0 80 "" 96.0752 553.71 0.0 00000000 00000000 1 [ ] +141 0 80 "" 96.6914 616.21 0.0 00000000 00000000 1 [ ] +142 0 80 "" 97.2480 556.64 0.0 00000000 00000000 1 [ ] +143 0 80 "" 97.7910 542.97 0.0 00000000 00000000 1 [ ] +144 0 80 "" 98.3779 586.91 0.0 00000000 00000000 1 [ ] +145 0 80 "" 98.9180 540.04 0.0 00000000 00000000 1 [ ] +146 0 80 "" 99.4648 546.88 0.0 00000000 00000000 1 [ ] +147 0 80 "" 100.0645 599.61 0.0 00000000 00000000 1 [ ] +148 0 70 "" 100.6582 593.75 0.0 00000000 00000000 1 [ ] +149 0 80 "" 101.2510 592.77 0.0 00000000 00000000 1 [ ] +150 0 80 "" 101.8652 614.26 0.0 00000000 00000000 1 [ ] +151 0 80 "" 102.4014 536.13 0.0 00000000 00000000 1 [ ] +152 0 70 "" 102.9883 586.91 0.0 00000000 00000000 1 [ ] +153 0 80 "" 103.5576 569.34 0.0 00000000 00000000 1 [ ] +154 0 80 "" 104.1084 550.78 0.0 00000000 00000000 1 [ ] +155 0 80 "" 104.6611 552.73 0.0 00000000 00000000 1 [ ] +156 0 80 "" 105.2783 617.19 0.0 00000000 00000000 1 [ ] +157 0 70 "" 105.8711 592.77 0.0 00000000 00000000 1 [ ] +158 0 80 "" 106.4248 553.71 0.0 00000000 00000000 1 [ ] +159 0 70 "" 106.9580 533.20 0.0 00000000 00000000 1 [ ] +160 0 80 "" 107.5576 599.61 0.0 00000000 00000000 1 [ ] +161 0 80 "" 108.1016 543.95 0.0 00000000 00000000 1 [ ] +162 0 80 "" 108.6816 580.08 0.0 00000000 00000000 1 [ ] +163 0 80 "" 109.2812 599.61 0.0 00000000 00000000 1 [ ] +164 0 80 "" 109.8408 559.57 0.0 00000000 00000000 1 [ ] +165 0 80 "" 110.4043 563.48 0.0 00000000 00000000 1 [ ] +166 0 70 "" 111.0010 596.68 0.0 00000000 00000000 1 [ ] +167 0 80 "" 111.5742 573.24 0.0 00000000 00000000 1 [ ] +168 0 70 "" 112.1680 593.75 0.0 00000000 00000000 1 [ ] +169 0 80 "" 112.7275 559.57 0.0 00000000 00000000 1 [ ] +170 0 70 "" 113.2676 540.04 0.0 00000000 00000000 1 [ ] +171 0 80 "" 113.8545 586.91 0.0 00000000 00000000 1 [ ] +172 0 70 "" 114.4346 580.08 0.0 00000000 00000000 1 [ ] +173 0 80 "" 115.0781 643.55 0.0 00000000 00000000 1 [ ] +174 0 80 "" 115.6445 566.41 0.0 00000000 00000000 1 [ ] +175 0 80 "" 116.2344 589.84 0.0 00000000 00000000 1 [ ] +176 0 70 "" 116.7744 540.04 0.0 00000000 00000000 1 [ ] +177 0 80 "" 117.3740 599.61 0.0 00000000 00000000 1 [ ] +178 0 80 "" 117.9277 553.71 0.0 00000000 00000000 1 [ ] +179 0 80 "" 118.4873 559.57 0.0 00000000 00000000 1 [ ] +180 0 80 "" 119.0713 583.98 0.0 00000000 00000000 1 [ ] +181 0 70 "" 119.6182 546.88 0.0 00000000 00000000 1 [ ] +182 0 80 "" 120.2080 589.84 0.0 00000000 00000000 1 [ ] +183 0 80 "" 120.8477 639.65 0.0 00000000 00000000 1 [ ] +184 0 70 "" 121.4814 633.79 0.0 00000000 00000000 1 [ ] +185 0 80 "" 122.0439 562.50 0.0 00000000 00000000 1 [ ] +186 0 80 "" 122.6875 643.55 0.0 00000000 00000000 1 [ ] +187 0 70 "" 123.2842 596.68 0.0 00000000 00000000 1 [ ] +188 0 80 "" 123.9238 639.65 0.0 00000000 00000000 1 [ ] +189 0 80 "" 124.4678 543.95 0.0 00000000 00000000 1 [ ] +190 0 80 "" 125.0811 613.28 0.0 00000000 00000000 1 [ ] +191 0 80 "" 125.7109 629.88 0.0 00000000 00000000 1 [ ] +192 0 80 "" 126.3340 623.05 0.0 00000000 00000000 1 [ ] +193 0 80 "" 126.8838 549.80 0.0 00000000 00000000 1 [ ] +194 0 80 "" 127.4307 546.88 0.0 00000000 00000000 1 [ ] +195 0 80 "" 128.0537 623.05 0.0 00000000 00000000 1 [ ] +196 0 70 "" 128.6543 600.59 0.0 00000000 00000000 1 [ ] +197 0 80 "" 129.1904 536.13 0.0 00000000 00000000 1 [ ] +198 0 70 "" 129.8145 624.02 0.0 00000000 00000000 1 [ ] +199 0 80 "" 130.3809 566.41 0.0 00000000 00000000 1 [ ] +200 0 70 "" 130.9609 580.08 0.0 00000000 00000000 1 [ ] +201 0 80 "" 131.5342 573.24 0.0 00000000 00000000 1 [ ] +202 0 80 "" 132.0811 546.88 0.0 00000000 00000000 1 [ ] +203 0 80 "" 132.6406 559.57 0.0 00000000 00000000 1 [ ] +204 0 70 "" 133.2637 623.05 0.0 00000000 00000000 1 [ ] +205 0 80 "" 133.8770 613.28 0.0 00000000 00000000 1 [ ] +206 0 80 "" 134.4609 583.98 0.0 00000000 00000000 1 [ ] +207 0 70 "" 135.0508 589.84 0.0 00000000 00000000 1 [ ] +208 0 80 "" 135.6270 576.17 0.0 00000000 00000000 1 [ ] +209 0 80 "" 136.2676 640.62 0.0 00000000 00000000 1 [ ] +210 0 80 "" 136.8838 616.21 0.0 00000000 00000000 1 [ ] +211 0 80 "" 137.4941 610.35 0.0 00000000 00000000 1 [ ] +212 0 80 "" 138.0840 589.84 0.0 00000000 00000000 1 [ ] +213 0 80 "" 138.6709 586.91 0.0 00000000 00000000 1 [ ] +214 0 80 "" 139.2070 536.13 0.0 00000000 00000000 1 [ ] +215 0 80 "" 139.8203 613.28 0.0 00000000 00000000 1 [ ] +216 0 80 "" 140.4502 629.88 0.0 00000000 00000000 1 [ ] +217 0 80 "" 141.0605 610.35 0.0 00000000 00000000 1 [ ] +218 0 80 "" 141.6377 577.15 0.0 00000000 00000000 1 [ ] +219 0 70 "" 142.2168 579.10 0.0 00000000 00000000 1 [ ] +220 0 80 "" 142.7637 546.88 0.0 00000000 00000000 1 [ ] +221 0 70 "" 143.3574 593.75 0.0 00000000 00000000 1 [ ] +222 0 80 "" 143.9434 585.94 0.0 00000000 00000000 1 [ ] +223 0 80 "" 144.4971 553.71 0.0 00000000 00000000 1 [ ] +224 0 80 "" 145.0840 586.91 0.0 00000000 00000000 1 [ ] +225 0 70 "" 145.7002 616.21 0.0 00000000 00000000 1 [ ] +226 0 80 "" 146.2734 573.24 0.0 00000000 00000000 1 [ ] +227 0 70 "" 146.8643 590.82 0.0 00000000 00000000 1 [ ] +228 0 80 "" 147.4307 566.41 0.0 00000000 00000000 1 [ ] +229 0 80 "" 148.0137 583.01 0.0 00000000 00000000 1 [ ] +230 0 70 "" 148.6201 606.45 0.0 00000000 00000000 1 [ ] +231 0 80 "" 149.1738 553.71 0.0 00000000 00000000 1 [ ] +232 0 80 "" 149.7266 552.73 0.0 00000000 00000000 1 [ ] +233 0 70 "" 150.3135 586.91 0.0 00000000 00000000 1 [ ] +234 0 80 "" 150.8506 537.11 0.0 00000000 00000000 1 [ ] +235 0 80 "" 151.4238 573.24 0.0 00000000 00000000 1 [ ] +236 0 80 "" 151.9766 552.73 0.0 00000000 00000000 1 [ ] +237 0 80 "" 152.6074 630.86 0.0 00000000 00000000 1 [ ] +238 0 80 "" 153.2207 613.28 0.0 00000000 00000000 1 [ ] +239 0 70 "" 153.8438 623.05 0.0 00000000 00000000 1 [ ] +240 0 80 "" 154.4766 632.81 0.0 00000000 00000000 1 [ ] +241 0 80 "" 155.0498 573.24 0.0 00000000 00000000 1 [ ] +242 0 80 "" 155.6865 636.72 0.0 00000000 00000000 1 [ ] +243 0 70 "" 156.3066 620.12 0.0 00000000 00000000 1 [ ] +244 0 80 "" 156.8740 567.38 0.0 00000000 00000000 1 [ ] +245 0 70 "" 157.5068 632.81 0.0 00000000 00000000 1 [ ] +246 0 80 "" 158.0771 570.31 0.0 00000000 00000000 1 [ ] +247 0 80 "" 158.6299 552.73 0.0 00000000 00000000 1 [ ] +248 0 80 "" 159.2168 586.91 0.0 00000000 00000000 1 [ ] +249 0 80 "" 159.8604 643.55 0.0 00000000 00000000 1 [ ] +250 0 80 "" 160.4600 599.61 0.0 00000000 00000000 1 [ ] +251 0 70 "" 161.0664 606.45 0.0 00000000 00000000 1 [ ] +252 0 80 "" 161.6299 563.48 0.0 00000000 00000000 1 [ ] +253 0 70 "" 162.2568 626.95 0.0 00000000 00000000 1 [ ] +254 0 80 "" 162.8896 632.81 0.0 00000000 00000000 1 [ ] +255 0 70 "" 163.4570 567.38 0.0 00000000 00000000 1 [ ] +256 0 80 "" 164.0566 599.61 0.0 00000000 00000000 1 [ ] +257 0 80 "" 164.6367 580.08 0.0 00000000 00000000 1 [ ] +258 0 80 "" 165.2100 573.24 0.0 00000000 00000000 1 [ ] +259 0 80 "" 165.7930 583.01 0.0 00000000 00000000 1 [ ] +260 0 80 "" 166.3730 580.08 0.0 00000000 00000000 1 [ ] +261 0 80 "" 166.9268 553.71 0.0 00000000 00000000 1 [ ] +262 0 80 "" 167.5068 580.08 0.0 00000000 00000000 1 [ ] +263 0 70 "" 168.1201 613.28 0.0 00000000 00000000 1 [ ] +264 0 80 "" 168.6865 566.41 0.0 00000000 00000000 1 [ ] +265 0 80 "" 169.2363 549.80 0.0 00000000 00000000 1 [ ] +266 0 80 "" 169.8535 617.19 0.0 00000000 00000000 1 [ ] +267 0 70 "" 170.4902 636.72 0.0 00000000 00000000 1 [ ] +268 0 80 "" 171.0596 569.34 0.0 00000000 00000000 1 [ ] +269 0 80 "" 171.6768 617.19 0.0 00000000 00000000 1 [ ] +270 0 80 "" 172.3037 626.95 0.0 00000000 00000000 1 [ ] +271 0 80 "" 172.8633 559.57 0.0 00000000 00000000 1 [ ] +272 0 80 "" 173.4531 589.84 0.0 00000000 00000000 1 [ ] +273 0 70 "" 174.0166 563.48 0.0 00000000 00000000 1 [ ] +274 0 80 "" 174.5830 566.41 0.0 00000000 00000000 1 [ ] +275 0 80 "" 175.1699 586.91 0.0 00000000 00000000 1 [ ] +276 0 80 "" 175.7266 556.64 0.0 00000000 00000000 1 [ ] +277 0 80 "" 176.2695 542.97 0.0 00000000 00000000 1 [ ] +278 0 80 "" 176.8936 624.02 0.0 00000000 00000000 1 [ ] +279 0 70 "" 177.5000 606.45 0.0 00000000 00000000 1 [ ] +280 0 80 "" 178.0898 589.84 0.0 00000000 00000000 1 [ ] +281 0 80 "" 178.7197 629.88 0.0 00000000 00000000 1 [ ] +282 0 70 "" 179.2930 573.24 0.0 00000000 00000000 1 [ ] +283 0 80 "" 179.8867 593.75 0.0 00000000 00000000 1 [ ] +284 0 70 "" 180.4434 556.64 0.0 00000000 00000000 1 [ ] +285 0 80 "" 181.0029 559.57 0.0 00000000 00000000 1 [ ] +286 0 80 "" 181.5664 563.48 0.0 00000000 00000000 1 [ ] +287 0 80 "" 182.1826 616.21 0.0 00000000 00000000 1 [ ] +288 0 70 "" 182.7959 613.28 0.0 00000000 00000000 1 [ ] +289 0 80 "" 183.3760 580.08 0.0 00000000 00000000 1 [ ] +290 0 80 "" 183.9893 613.28 0.0 00000000 00000000 1 [ ] +291 0 80 "" 184.6133 624.02 0.0 00000000 00000000 1 [ ] +292 0 70 "" 185.1895 576.17 0.0 00000000 00000000 1 [ ] +293 0 80 "" 185.7900 600.59 0.0 00000000 00000000 1 [ ] +294 0 80 "" 186.3564 566.41 0.0 00000000 00000000 1 [ ] +295 0 80 "" 186.9795 623.05 0.0 00000000 00000000 1 [ ] +296 0 70 "" 187.5859 606.45 0.0 00000000 00000000 1 [ ] +297 0 80 "" 188.2129 626.95 0.0 00000000 00000000 1 [ ] +298 0 70 "" 188.8359 623.05 0.0 00000000 00000000 1 [ ] +299 0 80 "" 189.3828 546.88 0.0 00000000 00000000 1 [ ] +300 0 80 "" 189.9463 563.48 0.0 00000000 00000000 1 [ ] +301 0 70 "" 190.5430 596.68 0.0 00000000 00000000 1 [ ] +302 0 80 "" 191.1631 620.12 0.0 00000000 00000000 1 [ ] +303 0 80 "" 191.8027 639.65 0.0 00000000 00000000 1 [ ] +304 0 70 "" 192.3965 593.75 0.0 00000000 00000000 1 [ ] +305 0 80 "" 192.9766 580.08 0.0 00000000 00000000 1 [ ] +306 0 80 "" 193.5996 623.05 0.0 00000000 00000000 1 [ ] +307 0 80 "" 194.1758 576.17 0.0 00000000 00000000 1 [ ] +308 0 80 "" 194.7490 573.24 0.0 00000000 00000000 1 [ ] +309 0 80 "" 195.3057 556.64 0.0 00000000 00000000 1 [ ] +310 0 80 "" 195.9160 610.35 0.0 00000000 00000000 1 [ ] +311 0 80 "" 196.5430 626.95 0.0 00000000 00000000 1 [ ] +312 0 80 "" 197.1289 585.94 0.0 00000000 00000000 1 [ ] +313 0 80 "" 197.7227 593.75 0.0 00000000 00000000 1 [ ] +314 0 70 "" 198.3262 603.52 0.0 00000000 00000000 1 [ ] +315 0 80 "" 198.9355 609.38 0.0 00000000 00000000 1 [ ] +316 0 80 "" 199.5527 617.19 0.0 00000000 00000000 1 [ ] +317 0 70 "" 200.1289 576.17 0.0 00000000 00000000 1 [ ] +318 0 80 "" 200.7627 633.79 0.0 00000000 00000000 1 [ ] +319 0 70 "" 201.3027 540.04 0.0 00000000 00000000 1 [ ] +320 0 80 "" 201.9092 606.45 0.0 00000000 00000000 1 [ ] +321 0 70 "" 202.4756 566.41 0.0 00000000 00000000 1 [ ] +322 0 80 "" 203.0762 600.59 0.0 00000000 00000000 1 [ ] +323 0 80 "" 203.6924 616.21 0.0 00000000 00000000 1 [ ] +324 0 80 "" 204.3457 653.32 0.0 00000000 00000000 1 [ ] +325 0 80 "" 204.9658 620.12 0.0 00000000 00000000 1 [ ] +326 0 80 "" 205.6025 636.72 0.0 00000000 00000000 1 [ ] +327 0 70 "" 206.2061 603.52 0.0 00000000 00000000 1 [ ] +328 0 80 "" 206.8057 599.61 0.0 00000000 00000000 1 [ ] +329 0 70 "" 207.3623 556.64 0.0 00000000 00000000 1 [ ] +330 0 80 "" 207.9922 629.88 0.0 00000000 00000000 1 [ ] +331 0 70 "" 208.5625 570.31 0.0 00000000 00000000 1 [ ] +332 0 80 "" 209.1162 553.71 0.0 00000000 00000000 1 [ ] +333 0 70 "" 209.6787 562.50 0.0 00000000 00000000 1 [ ] +334 0 80 "" 210.3096 630.86 0.0 00000000 00000000 1 [ ] +335 0 80 "" 210.9355 625.98 0.0 00000000 00000000 1 [ ] +336 0 80 "" 211.4922 556.64 0.0 00000000 00000000 1 [ ] +337 0 80 "" 212.1162 624.02 0.0 00000000 00000000 1 [ ] +338 0 80 "" 212.6729 556.64 0.0 00000000 00000000 1 [ ] +339 0 80 "" 213.2588 585.94 0.0 00000000 00000000 1 [ ] +340 0 80 "" 213.8828 624.02 0.0 00000000 00000000 1 [ ] +341 0 80 "" 214.4453 562.50 0.0 00000000 00000000 1 [ ] +342 0 80 "" 215.0723 626.95 0.0 00000000 00000000 1 [ ] +343 0 80 "" 215.6494 577.15 0.0 00000000 00000000 1 [ ] +344 0 80 "" 216.2061 556.64 0.0 00000000 00000000 1 [ ] +345 0 80 "" 216.7627 556.64 0.0 00000000 00000000 1 [ ] +346 0 80 "" 217.3057 542.97 0.0 00000000 00000000 1 [ ] +347 0 70 "" 217.9521 646.48 0.0 00000000 00000000 1 [ ] +348 0 80 "" 218.5322 580.08 0.0 00000000 00000000 1 [ ] +349 0 80 "" 219.0791 546.88 0.0 00000000 00000000 1 [ ] +350 0 80 "" 219.6660 586.91 0.0 00000000 00000000 1 [ ] +351 0 70 "" 220.2090 542.97 0.0 00000000 00000000 1 [ ] +352 0 80 "" 220.8223 613.28 0.0 00000000 00000000 1 [ ] +353 0 80 "" 221.4121 589.84 0.0 00000000 00000000 1 [ ] +354 0 80 "" 222.0322 620.12 0.0 00000000 00000000 1 [ ] +355 0 80 "" 222.6084 576.17 0.0 00000000 00000000 1 [ ] +356 0 80 "" 223.1758 567.38 0.0 00000000 00000000 1 [ ] +357 0 80 "" 223.7959 620.12 0.0 00000000 00000000 1 [ ] +358 0 80 "" 224.4053 609.38 0.0 00000000 00000000 1 [ ] +359 0 80 "" 224.9424 537.11 0.0 00000000 00000000 1 [ ] +360 0 80 "" 225.5283 585.94 0.0 00000000 00000000 1 [ ] +361 0 80 "" 226.0820 553.71 0.0 00000000 00000000 1 [ ] +362 0 80 "" 226.7090 626.95 0.0 00000000 00000000 1 [ ] +363 0 80 "" 227.2988 589.84 0.0 00000000 00000000 1 [ ] +364 0 80 "" 227.9258 626.95 0.0 00000000 00000000 1 [ ] +365 0 80 "" 228.5352 609.38 0.0 00000000 00000000 1 [ ] +366 0 80 "" 229.1016 566.41 0.0 00000000 00000000 1 [ ] +367 0 80 "" 229.6885 586.91 0.0 00000000 00000000 1 [ ] +368 0 80 "" 230.2617 573.24 0.0 00000000 00000000 1 [ ] +369 0 80 "" 230.8320 570.31 0.0 00000000 00000000 1 [ ] +370 0 80 "" 231.4082 576.17 0.0 00000000 00000000 1 [ ] +371 0 70 "" 232.0186 610.35 0.0 00000000 00000000 1 [ ] +372 0 80 "" 232.5850 566.41 0.0 00000000 00000000 1 [ ] +373 0 80 "" 233.2021 617.19 0.0 00000000 00000000 1 [ ] +374 0 80 "" 233.7549 552.73 0.0 00000000 00000000 1 [ ] +375 0 80 "" 234.3320 577.15 0.0 00000000 00000000 1 [ ] +376 0 70 "" 234.9424 610.35 0.0 00000000 00000000 1 [ ] +377 0 80 "" 235.5352 592.77 0.0 00000000 00000000 1 [ ] +378 0 80 "" 236.1123 577.15 0.0 00000000 00000000 1 [ ] +379 0 80 "" 236.6953 583.01 0.0 00000000 00000000 1 [ ] +380 0 70 "" 237.2822 586.91 0.0 00000000 00000000 1 [ ] +381 0 80 "" 237.8418 559.57 0.0 00000000 00000000 1 [ ] +382 0 80 "" 238.3848 542.97 0.0 00000000 00000000 1 [ ] +383 0 80 "" 239.0020 617.19 0.0 00000000 00000000 1 [ ] +384 0 80 "" 239.5547 552.73 0.0 00000000 00000000 1 [ ] +385 0 80 "" 240.1582 603.52 0.0 00000000 00000000 1 [ ] +386 0 70 "" 240.7188 560.55 0.0 00000000 00000000 1 [ ] +387 0 80 "" 241.2783 559.57 0.0 00000000 00000000 1 [ ] +388 0 80 "" 241.8682 589.84 0.0 00000000 00000000 1 [ ] +389 0 80 "" 242.4980 629.88 0.0 00000000 00000000 1 [ ] +390 0 80 "" 243.0684 570.31 0.0 00000000 00000000 1 [ ] +391 0 80 "" 243.6748 606.45 0.0 00000000 00000000 1 [ ] +392 0 70 "" 244.2188 543.95 0.0 00000000 00000000 1 [ ] +393 0 80 "" 244.8350 616.21 0.0 00000000 00000000 1 [ ] +394 0 70 "" 245.4150 580.08 0.0 00000000 00000000 1 [ ] +395 0 80 "" 246.0088 593.75 0.0 00000000 00000000 1 [ ] +396 0 80 "" 246.6445 635.74 0.0 00000000 00000000 1 [ ] +397 0 80 "" 247.1885 543.95 0.0 00000000 00000000 1 [ ] +398 0 80 "" 247.7852 596.68 0.0 00000000 00000000 1 [ ] +399 0 80 "" 248.3779 592.77 0.0 00000000 00000000 1 [ ] +400 0 80 "" 249.0146 636.72 0.0 00000000 00000000 1 [ ] +401 0 80 "" 249.5645 549.80 0.0 00000000 00000000 1 [ ] +402 0 80 "" 250.1250 560.55 0.0 00000000 00000000 1 [ ] +403 0 80 "" 250.7148 589.84 0.0 00000000 00000000 1 [ ] +404 0 80 "" 251.2920 577.15 0.0 00000000 00000000 1 [ ] +405 0 80 "" 251.8379 545.90 0.0 00000000 00000000 1 [ ] +406 0 80 "" 252.4150 577.15 0.0 00000000 00000000 1 [ ] +407 0 80 "" 253.0381 623.05 0.0 00000000 00000000 1 [ ] +408 0 80 "" 253.5645 526.37 0.0 00000000 00000000 1 [ ] +409 0 80 "" 254.1582 593.75 0.0 00000000 00000000 1 [ ] +410 0 80 "" 254.7383 580.08 0.0 00000000 00000000 1 [ ] +411 0 80 "" 255.3418 603.52 0.0 00000000 00000000 1 [ ] +412 0 80 "" 255.9180 576.17 0.0 00000000 00000000 1 [ ] +413 0 80 "" 256.4746 556.64 0.0 00000000 00000000 1 [ ] +414 0 70 "" 257.0449 570.31 0.0 00000000 00000000 1 [ ] +415 0 80 "" 257.6113 566.41 0.0 00000000 00000000 1 [ ] +416 0 80 "" 258.2080 596.68 0.0 00000000 00000000 1 [ ] +417 0 70 "" 258.7578 549.80 0.0 00000000 00000000 1 [ ] +418 0 80 "" 259.3545 596.68 0.0 00000000 00000000 1 [ ] +419 0 80 "" 259.9814 626.95 0.0 00000000 00000000 1 [ ] +420 0 80 "" 260.5713 589.84 0.0 00000000 00000000 1 [ ] +421 0 80 "" 261.1543 583.01 0.0 00000000 00000000 1 [ ] +422 0 70 "" 261.7744 620.12 0.0 00000000 00000000 1 [ ] +423 0 80 "" 262.3984 624.02 0.0 00000000 00000000 1 [ ] +424 0 80 "" 263.0244 625.98 0.0 00000000 00000000 1 [ ] +425 0 70 "" 263.6611 636.72 0.0 00000000 00000000 1 [ ] +426 0 80 "" 264.1943 533.20 0.0 00000000 00000000 1 [ ] +427 0 70 "" 264.7314 537.11 0.0 00000000 00000000 1 [ ] +428 0 80 "" 265.2783 546.88 0.0 00000000 00000000 1 [ ] +429 0 80 "" 265.8516 573.24 0.0 00000000 00000000 1 [ ] +430 0 80 "" 266.4443 592.77 0.0 00000000 00000000 1 [ ] +431 0 80 "" 266.9941 549.80 0.0 00000000 00000000 1 [ ] +432 0 80 "" 267.6377 643.55 0.0 00000000 00000000 1 [ ] +433 0 70 "" 268.2549 617.19 0.0 00000000 00000000 1 [ ] +434 0 80 "" 268.8613 606.45 0.0 00000000 00000000 1 [ ] +435 0 70 "" 269.4443 583.01 0.0 00000000 00000000 1 [ ] +436 0 80 "" 269.9941 549.80 0.0 00000000 00000000 1 [ ] +437 0 80 "" 270.5908 596.68 0.0 00000000 00000000 1 [ ] +438 0 80 "" 271.2109 620.12 0.0 00000000 00000000 1 [ ] +439 0 80 "" 271.7510 540.04 0.0 00000000 00000000 1 [ ] +440 0 80 "" 272.2949 543.95 0.0 00000000 00000000 1 [ ] +441 0 80 "" 272.9414 646.48 0.0 00000000 00000000 1 [ ] +442 0 80 "" 273.5312 589.84 0.0 00000000 00000000 1 [ ] +443 0 80 "" 274.0840 552.73 0.0 00000000 00000000 1 [ ] +444 0 80 "" 274.6514 567.38 0.0 00000000 00000000 1 [ ] +445 0 80 "" 275.2373 585.94 0.0 00000000 00000000 1 [ ] +446 0 70 "" 275.8145 577.15 0.0 00000000 00000000 1 [ ] +447 0 80 "" 276.4209 606.45 0.0 00000000 00000000 1 [ ] +448 0 80 "" 277.0479 626.95 0.0 00000000 00000000 1 [ ] +449 0 80 "" 277.6572 609.38 0.0 00000000 00000000 1 [ ] +450 0 80 "" 278.2578 600.59 0.0 00000000 00000000 1 [ ] +451 0 70 "" 278.8672 609.38 0.0 00000000 00000000 1 [ ] +452 0 80 "" 279.4512 583.98 0.0 00000000 00000000 1 [ ] +453 0 70 "" 280.0244 573.24 0.0 00000000 00000000 1 [ ] +454 0 80 "" 280.6514 626.95 0.0 00000000 00000000 1 [ ] +455 0 70 "" 281.2744 623.05 0.0 00000000 00000000 1 [ ] +456 0 80 "" 281.9180 643.55 0.0 00000000 00000000 1 [ ] +457 0 70 "" 282.4805 562.50 0.0 00000000 00000000 1 [ ] +458 0 80 "" 283.0674 586.91 0.0 00000000 00000000 1 [ ] +459 0 80 "" 283.6973 629.88 0.0 00000000 00000000 1 [ ] +460 0 80 "" 284.3037 606.45 0.0 00000000 00000000 1 [ ] +461 0 80 "" 284.9238 620.12 0.0 00000000 00000000 1 [ ] +462 0 80 "" 285.5273 603.52 0.0 00000000 00000000 1 [ ] +463 0 80 "" 286.1172 589.84 0.0 00000000 00000000 1 [ ] +464 0 80 "" 286.7246 607.42 0.0 00000000 00000000 1 [ ] +465 0 80 "" 287.3477 623.05 0.0 00000000 00000000 1 [ ] +466 0 80 "" 287.8877 540.04 0.0 00000000 00000000 1 [ ] +467 0 80 "" 288.4346 546.88 0.0 00000000 00000000 1 [ ] +468 0 80 "" 288.9941 559.57 0.0 00000000 00000000 1 [ ] +469 0 70 "" 289.5938 599.61 0.0 00000000 00000000 1 [ ] +470 0 80 "" 290.2275 633.79 0.0 00000000 00000000 1 [ ] +471 0 80 "" 290.8174 589.84 0.0 00000000 00000000 1 [ ] +472 0 80 "" 291.3945 577.15 0.0 00000000 00000000 1 [ ] +473 0 80 "" 291.9902 595.70 0.0 00000000 00000000 1 [ ] +474 0 80 "" 292.5742 583.98 0.0 00000000 00000000 1 [ ] +475 0 80 "" 293.1904 616.21 0.0 00000000 00000000 1 [ ] +476 0 80 "" 293.8008 610.35 0.0 00000000 00000000 1 [ ] +477 0 80 "" 294.4209 620.12 0.0 00000000 00000000 1 [ ] +478 0 70 "" 295.0469 625.98 0.0 00000000 00000000 1 [ ] +479 0 80 "" 295.6143 567.38 0.0 00000000 00000000 1 [ ] +480 0 70 "" 296.1709 556.64 0.0 00000000 00000000 1 [ ] +481 0 80 "" 296.7939 623.05 0.0 00000000 00000000 1 [ ] +482 0 80 "" 297.4238 629.88 0.0 00000000 00000000 1 [ ] +483 0 80 "" 297.9873 563.48 0.0 00000000 00000000 1 [ ] +484 0 70 "" 298.5977 610.35 0.0 00000000 00000000 1 [ ] +485 0 80 "" 299.2305 632.81 0.0 00000000 00000000 1 [ ] +486 0 70 "" 299.7705 540.04 0.0 00000000 00000000 1 [ ] +487 0 80 "" 300.3672 596.68 0.0 00000000 00000000 1 [ ] +488 0 80 "" 300.9434 576.17 0.0 00000000 00000000 1 [ ] +489 0 80 "" 301.5010 557.62 0.0 00000000 00000000 1 [ ] +490 0 70 "" 302.0508 549.80 0.0 00000000 00000000 1 [ ] +491 0 80 "" 302.5908 540.04 0.0 00000000 00000000 1 [ ] +492 0 70 "" 303.1973 606.45 0.0 00000000 00000000 1 [ ] +493 0 80 "" 303.8271 629.88 0.0 00000000 00000000 1 [ ] +494 0 80 "" 304.4434 616.21 0.0 00000000 00000000 1 [ ] +495 0 70 "" 304.9902 546.88 0.0 00000000 00000000 1 [ ] +496 0 80 "" 305.5605 570.31 0.0 00000000 00000000 1 [ ] +497 0 80 "" 306.1436 583.01 0.0 00000000 00000000 1 [ ] +498 0 80 "" 306.6807 537.11 0.0 00000000 00000000 1 [ ] +499 0 80 "" 307.2539 573.24 0.0 00000000 00000000 1 [ ] +500 0 80 "" 307.8467 592.77 0.0 00000000 00000000 1 [ ] +501 0 80 "" 308.4102 563.48 0.0 00000000 00000000 1 [ ] +502 0 80 "" 309.0137 603.52 0.0 00000000 00000000 1 [ ] +503 0 80 "" 309.5938 580.08 0.0 00000000 00000000 1 [ ] +504 0 80 "" 310.1465 552.73 0.0 00000000 00000000 1 [ ] +505 0 80 "" 310.6768 530.27 0.0 00000000 00000000 1 [ ] +506 0 70 "" 311.2471 570.31 0.0 00000000 00000000 1 [ ] +507 0 80 "" 311.8672 620.12 0.0 00000000 00000000 1 [ ] +508 0 80 "" 312.4199 552.73 0.0 00000000 00000000 1 [ ] +509 0 70 "" 312.9873 567.38 0.0 00000000 00000000 1 [ ] +510 0 80 "" 313.6006 613.28 0.0 00000000 00000000 1 [ ] +511 0 80 "" 314.2100 609.38 0.0 00000000 00000000 1 [ ] +512 0 80 "" 314.7773 567.38 0.0 00000000 00000000 1 [ ] +513 0 70 "" 315.3340 556.64 0.0 00000000 00000000 1 [ ] +514 0 80 "" 315.9199 585.94 0.0 00000000 00000000 1 [ ] +515 0 80 "" 316.4600 540.04 0.0 00000000 00000000 1 [ ] +516 0 80 "" 317.0166 556.64 0.0 00000000 00000000 1 [ ] +517 0 80 "" 317.6465 629.88 0.0 00000000 00000000 1 [ ] +518 0 80 "" 318.2471 600.59 0.0 00000000 00000000 1 [ ] +519 0 80 "" 318.8203 573.24 0.0 00000000 00000000 1 [ ] +520 0 80 "" 319.4131 592.77 0.0 00000000 00000000 1 [ ] +521 0 80 "" 320.0098 596.68 0.0 00000000 00000000 1 [ ] +522 0 80 "" 320.6035 593.75 0.0 00000000 00000000 1 [ ] +523 0 80 "" 321.1738 570.31 0.0 00000000 00000000 1 [ ] +524 0 70 "" 321.8037 629.88 0.0 00000000 00000000 1 [ ] +525 0 80 "" 322.3633 559.57 0.0 00000000 00000000 1 [ ] +526 0 80 "" 322.9834 620.12 0.0 00000000 00000000 1 [ ] +527 0 80 "" 323.5898 606.45 0.0 00000000 00000000 1 [ ] +528 0 80 "" 324.1934 603.52 0.0 00000000 00000000 1 [ ] +529 0 80 "" 324.7598 566.41 0.0 00000000 00000000 1 [ ] +530 0 80 "" 325.3867 626.95 0.0 00000000 00000000 1 [ ] +531 0 80 "" 325.9697 583.01 0.0 00000000 00000000 1 [ ] +532 0 80 "" 326.5635 593.75 0.0 00000000 00000000 1 [ ] +533 0 80 "" 327.1270 563.48 0.0 00000000 00000000 1 [ ] +534 0 80 "" 327.7002 573.24 0.0 00000000 00000000 1 [ ] +535 0 80 "" 328.2568 556.64 0.0 00000000 00000000 1 [ ] +536 0 70 "" 328.8301 573.24 0.0 00000000 00000000 1 [ ] +537 0 80 "" 329.3799 549.80 0.0 00000000 00000000 1 [ ] +538 0 80 "" 329.9531 573.24 0.0 00000000 00000000 1 [ ] +539 0 70 "" 330.5996 646.48 0.0 00000000 00000000 1 [ ] +540 0 80 "" 331.1836 583.98 0.0 00000000 00000000 1 [ ] +541 0 70 "" 331.7598 576.17 0.0 00000000 00000000 1 [ ] +542 0 80 "" 332.3428 583.01 0.0 00000000 00000000 1 [ ] +543 0 80 "" 332.9365 593.75 0.0 00000000 00000000 1 [ ] +544 0 80 "" 333.5303 593.75 0.0 00000000 00000000 1 [ ] +545 0 80 "" 334.1436 613.28 0.0 00000000 00000000 1 [ ] +546 0 70 "" 334.7363 592.77 0.0 00000000 00000000 1 [ ] +547 0 80 "" 335.3496 613.28 0.0 00000000 00000000 1 [ ] +548 0 80 "" 335.9268 577.15 0.0 00000000 00000000 1 [ ] +549 0 80 "" 336.5068 580.08 0.0 00000000 00000000 1 [ ] +550 0 80 "" 337.1094 602.54 0.0 00000000 00000000 1 [ ] +551 0 80 "" 337.6797 570.31 0.0 00000000 00000000 1 [ ] +552 0 80 "" 338.2832 603.52 0.0 00000000 00000000 1 [ ] +553 0 80 "" 338.9062 623.05 0.0 00000000 00000000 1 [ ] +554 0 80 "" 339.5361 629.88 0.0 00000000 00000000 1 [ ] +555 0 80 "" 340.1465 610.35 0.0 00000000 00000000 1 [ ] +556 0 80 "" 340.7363 589.84 0.0 00000000 00000000 1 [ ] +557 0 80 "" 341.2930 556.64 0.0 00000000 00000000 1 [ ] +558 0 80 "" 341.8730 580.08 0.0 00000000 00000000 1 [ ] +559 0 80 "" 342.4531 580.08 0.0 00000000 00000000 1 [ ] +560 0 80 "" 343.0000 546.88 0.0 00000000 00000000 1 [ ] +561 0 80 "" 343.6367 636.72 0.0 00000000 00000000 1 [ ] +562 0 80 "" 344.2334 596.68 0.0 00000000 00000000 1 [ ] +563 0 70 "" 344.8594 625.98 0.0 00000000 00000000 1 [ ] +564 0 80 "" 345.4697 610.35 0.0 00000000 00000000 1 [ ] +565 0 80 "" 346.0928 623.05 0.0 00000000 00000000 1 [ ] +566 0 70 "" 346.7031 610.35 0.0 00000000 00000000 1 [ ] +567 0 80 "" 347.3066 603.52 0.0 00000000 00000000 1 [ ] +568 0 80 "" 347.8594 552.73 0.0 00000000 00000000 1 [ ] +569 0 70 "" 348.4727 613.28 0.0 00000000 00000000 1 [ ] +570 0 80 "" 349.0830 610.35 0.0 00000000 00000000 1 [ ] +571 0 80 "" 349.6924 609.38 0.0 00000000 00000000 1 [ ] +572 0 80 "" 350.2725 580.08 0.0 00000000 00000000 1 [ ] +573 0 80 "" 350.8965 624.02 0.0 00000000 00000000 1 [ ] +574 0 80 "" 351.5225 625.98 0.0 00000000 00000000 1 [ ] +575 0 80 "" 352.1260 603.52 0.0 00000000 00000000 1 [ ] +576 0 80 "" 352.7393 613.28 0.0 00000000 00000000 1 [ ] +577 0 80 "" 353.3564 617.19 0.0 00000000 00000000 1 [ ] +578 0 80 "" 353.9932 636.72 0.0 00000000 00000000 1 [ ] +579 0 80 "" 354.6025 609.38 0.0 00000000 00000000 1 [ ] +580 0 80 "" 355.1963 593.75 0.0 00000000 00000000 1 [ ] +581 0 80 "" 355.7529 556.64 0.0 00000000 00000000 1 [ ] +582 0 80 "" 356.3125 559.57 0.0 00000000 00000000 1 [ ] +583 0 80 "" 356.9355 623.05 0.0 00000000 00000000 1 [ ] +584 0 80 "" 357.4795 543.95 0.0 00000000 00000000 1 [ ] +585 0 80 "" 358.0293 549.80 0.0 00000000 00000000 1 [ ] +586 0 80 "" 358.5693 540.04 0.0 00000000 00000000 1 [ ] +587 0 70 "" 359.1592 589.84 0.0 00000000 00000000 1 [ ] +588 0 80 "" 359.7021 542.97 0.0 00000000 00000000 1 [ ] +589 0 70 "" 360.2959 593.75 0.0 00000000 00000000 1 [ ] +590 0 80 "" 360.8496 553.71 0.0 00000000 00000000 1 [ ] +591 0 80 "" 361.4395 589.84 0.0 00000000 00000000 1 [ ] +592 0 70 "" 362.0029 563.48 0.0 00000000 00000000 1 [ ] +593 0 80 "" 362.6357 632.81 0.0 00000000 00000000 1 [ ] +594 0 80 "" 363.1855 549.80 0.0 00000000 00000000 1 [ ] +595 0 80 "" 363.7988 613.28 0.0 00000000 00000000 1 [ ] +596 0 70 "" 364.3457 546.88 0.0 00000000 00000000 1 [ ] +597 0 80 "" 364.9395 593.75 0.0 00000000 00000000 1 [ ] +598 0 80 "" 365.5156 576.17 0.0 00000000 00000000 1 [ ] +599 0 80 "" 366.1426 626.95 0.0 00000000 00000000 1 [ ] +600 0 70 "" 366.7129 570.31 0.0 00000000 00000000 1 [ ] +601 0 80 "" 367.3154 602.54 0.0 00000000 00000000 1 [ ] +602 0 80 "" 367.9492 633.79 0.0 00000000 00000000 1 [ ] +603 0 80 "" 368.5762 626.95 0.0 00000000 00000000 1 [ ] +604 0 80 "" 369.1729 596.68 0.0 00000000 00000000 1 [ ] +605 0 80 "" 369.7061 533.20 0.0 00000000 00000000 1 [ ] +606 0 80 "" 370.2490 542.97 0.0 00000000 00000000 1 [ ] +607 0 80 "" 370.7959 546.88 0.0 00000000 00000000 1 [ ] +608 0 70 "" 371.4326 636.72 0.0 00000000 00000000 1 [ ] +609 0 80 "" 372.0557 623.05 0.0 00000000 00000000 1 [ ] +610 0 70 "" 372.6455 589.84 0.0 00000000 00000000 1 [ ] +611 0 80 "" 373.1787 533.20 0.0 00000000 00000000 1 [ ] +612 0 80 "" 373.7793 600.59 0.0 00000000 00000000 1 [ ] +613 0 80 "" 374.3555 576.17 0.0 00000000 00000000 1 [ ] +614 0 80 "" 374.9756 620.12 0.0 00000000 00000000 1 [ ] +615 0 80 "" 375.5654 589.84 0.0 00000000 00000000 1 [ ] +616 0 80 "" 376.1455 580.08 0.0 00000000 00000000 1 [ ] +617 0 80 "" 376.7520 606.45 0.0 00000000 00000000 1 [ ] +618 0 80 "" 377.2959 543.95 0.0 00000000 00000000 1 [ ] +619 0 80 "" 377.8389 542.97 0.0 00000000 00000000 1 [ ] +620 0 80 "" 378.4756 636.72 0.0 00000000 00000000 1 [ ] +621 0 80 "" 379.1191 643.55 0.0 00000000 00000000 1 [ ] +622 0 70 "" 379.7188 599.61 0.0 00000000 00000000 1 [ ] +623 0 80 "" 380.3389 620.12 0.0 00000000 00000000 1 [ ] +624 0 80 "" 380.9355 596.68 0.0 00000000 00000000 1 [ ] +625 0 80 "" 381.5283 592.77 0.0 00000000 00000000 1 [ ] +626 0 80 "" 382.1221 593.75 0.0 00000000 00000000 1 [ ] +627 0 80 "" 382.7285 606.45 0.0 00000000 00000000 1 [ ] +628 0 80 "" 383.3389 610.35 0.0 00000000 00000000 1 [ ] +629 0 70 "" 383.9287 589.84 0.0 00000000 00000000 1 [ ] +630 0 80 "" 384.4951 566.41 0.0 00000000 00000000 1 [ ] +631 0 80 "" 385.0918 596.68 0.0 00000000 00000000 1 [ ] +632 0 80 "" 385.7256 633.79 0.0 00000000 00000000 1 [ ] +633 0 80 "" 386.3516 625.98 0.0 00000000 00000000 1 [ ] +634 0 80 "" 386.9385 586.91 0.0 00000000 00000000 1 [ ] +635 0 70 "" 387.5586 620.12 0.0 00000000 00000000 1 [ ] +636 0 80 "" 388.1953 636.72 0.0 00000000 00000000 1 [ ] +637 0 80 "" 388.7822 586.91 0.0 00000000 00000000 1 [ ] +638 0 80 "" 389.4189 636.72 0.0 00000000 00000000 1 [ ] +639 0 70 "" 389.9648 545.90 0.0 00000000 00000000 1 [ ] +640 0 80 "" 390.5850 620.12 0.0 00000000 00000000 1 [ ] +641 0 80 "" 391.1621 577.15 0.0 00000000 00000000 1 [ ] +642 0 70 "" 391.7891 626.95 0.0 00000000 00000000 1 [ ] +643 0 80 "" 392.4053 616.21 0.0 00000000 00000000 1 [ ] +644 0 70 "" 392.9717 566.41 0.0 00000000 00000000 1 [ ] +645 0 80 "" 393.5254 553.71 0.0 00000000 00000000 1 [ ] +646 0 70 "" 394.1387 613.28 0.0 00000000 00000000 1 [ ] +647 0 80 "" 394.7217 583.01 0.0 00000000 00000000 1 [ ] +648 0 80 "" 395.2783 556.64 0.0 00000000 00000000 1 [ ] +649 0 80 "" 395.8281 549.80 0.0 00000000 00000000 1 [ ] +650 0 70 "" 396.4082 580.08 0.0 00000000 00000000 1 [ ] +651 0 80 "" 396.9854 577.15 0.0 00000000 00000000 1 [ ] +652 0 80 "" 397.6221 636.72 0.0 00000000 00000000 1 [ ] +653 0 80 "" 398.1680 545.90 0.0 00000000 00000000 1 [ ] +654 0 80 "" 398.7285 560.55 0.0 00000000 00000000 1 [ ] +655 0 80 "" 399.2920 563.48 0.0 00000000 00000000 1 [ ] +656 0 80 "" 399.9082 616.21 0.0 00000000 00000000 1 [ ] +657 0 80 "" 400.5381 629.88 0.0 00000000 00000000 1 [ ] +658 0 80 "" 401.1582 620.12 0.0 00000000 00000000 1 [ ] +659 0 80 "" 401.7314 573.24 0.0 00000000 00000000 1 [ ] +660 0 80 "" 402.3516 620.12 0.0 00000000 00000000 1 [ ] +661 0 80 "" 402.9648 613.28 0.0 00000000 00000000 1 [ ] +662 0 80 "" 403.5820 617.19 0.0 00000000 00000000 1 [ ] +663 0 80 "" 404.1816 599.61 0.0 00000000 00000000 1 [ ] +664 0 80 "" 404.7783 596.68 0.0 00000000 00000000 1 [ ] +665 0 70 "" 405.3418 563.48 0.0 00000000 00000000 1 [ ] +666 0 80 "" 405.9414 599.61 0.0 00000000 00000000 1 [ ] +667 0 80 "" 406.5020 560.55 0.0 00000000 00000000 1 [ ] +668 0 80 "" 407.1182 616.21 0.0 00000000 00000000 1 [ ] +669 0 70 "" 407.7178 599.61 0.0 00000000 00000000 1 [ ] +670 0 80 "" 408.2744 556.64 0.0 00000000 00000000 1 [ ] +671 0 80 "" 408.8750 600.59 0.0 00000000 00000000 1 [ ] +672 0 80 "" 409.4678 592.77 0.0 00000000 00000000 1 [ ] +673 0 80 "" 410.0283 560.55 0.0 00000000 00000000 1 [ ] +674 0 80 "" 410.6211 592.77 0.0 00000000 00000000 1 [ ] +675 0 80 "" 411.1816 560.55 0.0 00000000 00000000 1 [ ] +676 0 80 "" 411.7520 570.31 0.0 00000000 00000000 1 [ ] +677 0 80 "" 412.2910 539.06 0.0 00000000 00000000 1 [ ] +678 0 70 "" 412.8516 560.55 0.0 00000000 00000000 1 [ ] +679 0 80 "" 413.4248 573.24 0.0 00000000 00000000 1 [ ] +680 0 80 "" 413.9746 549.80 0.0 00000000 00000000 1 [ ] +681 0 80 "" 414.5811 606.45 0.0 00000000 00000000 1 [ ] +682 0 80 "" 415.2178 636.72 0.0 00000000 00000000 1 [ ] +683 0 80 "" 415.7881 570.31 0.0 00000000 00000000 1 [ ] +684 0 80 "" 416.4111 623.05 0.0 00000000 00000000 1 [ ] +685 0 80 "" 416.9785 567.38 0.0 00000000 00000000 1 [ ] +686 0 80 "" 417.5684 589.84 0.0 00000000 00000000 1 [ ] +687 0 80 "" 418.1113 542.97 0.0 00000000 00000000 1 [ ] +688 0 70 "" 418.7217 610.35 0.0 00000000 00000000 1 [ ] +689 0 80 "" 419.3047 583.01 0.0 00000000 00000000 1 [ ] +690 0 80 "" 419.8984 593.75 0.0 00000000 00000000 1 [ ] +691 0 70 "" 420.5117 613.28 0.0 00000000 00000000 1 [ ] +692 0 80 "" 421.0615 549.80 0.0 00000000 00000000 1 [ ] +693 0 70 "" 421.6846 623.05 0.0 00000000 00000000 1 [ ] +694 0 80 "" 422.2480 563.48 0.0 00000000 00000000 1 [ ] +695 0 70 "" 422.8115 563.48 0.0 00000000 00000000 1 [ ] +696 0 80 "" 423.3975 585.94 0.0 00000000 00000000 1 [ ] +697 0 70 "" 423.9580 560.55 0.0 00000000 00000000 1 [ ] +698 0 80 "" 424.5713 613.28 0.0 00000000 00000000 1 [ ] +699 0 80 "" 425.1982 626.95 0.0 00000000 00000000 1 [ ] +700 0 70 "" 425.7676 569.34 0.0 00000000 00000000 1 [ ] +701 0 80 "" 426.3877 620.12 0.0 00000000 00000000 1 [ ] +702 0 80 "" 426.9980 610.35 0.0 00000000 00000000 1 [ ] +703 0 80 "" 427.5576 559.57 0.0 00000000 00000000 1 [ ] +704 0 80 "" 428.1377 580.08 0.0 00000000 00000000 1 [ ] +705 0 80 "" 428.7480 610.35 0.0 00000000 00000000 1 [ ] +706 0 80 "" 429.3242 576.17 0.0 00000000 00000000 1 [ ] +707 0 80 "" 429.9414 617.19 0.0 00000000 00000000 1 [ ] +708 0 80 "" 430.5674 625.98 0.0 00000000 00000000 1 [ ] +709 0 80 "" 431.1377 570.31 0.0 00000000 00000000 1 [ ] +710 0 80 "" 431.7646 626.95 0.0 00000000 00000000 1 [ ] +711 0 80 "" 432.3877 623.05 0.0 00000000 00000000 1 [ ] +712 0 80 "" 432.9443 556.64 0.0 00000000 00000000 1 [ ] +713 0 70 "" 433.5312 586.91 0.0 00000000 00000000 1 [ ] +714 0 80 "" 434.1113 580.08 0.0 00000000 00000000 1 [ ] +715 0 80 "" 434.7373 625.98 0.0 00000000 00000000 1 [ ] +716 0 70 "" 435.3076 570.31 0.0 00000000 00000000 1 [ ] +717 0 80 "" 435.8848 577.15 0.0 00000000 00000000 1 [ ] +718 0 70 "" 436.4512 566.41 0.0 00000000 00000000 1 [ ] +719 0 80 "" 437.0146 563.48 0.0 00000000 00000000 1 [ ] +720 0 80 "" 437.6113 596.68 0.0 00000000 00000000 1 [ ] +721 0 80 "" 438.1572 545.90 0.0 00000000 00000000 1 [ ] +722 0 70 "" 438.7979 640.62 0.0 00000000 00000000 1 [ ] +723 0 80 "" 439.3477 549.80 0.0 00000000 00000000 1 [ ] +724 0 80 "" 439.8975 549.80 0.0 00000000 00000000 1 [ ] +725 0 70 "" 440.5381 640.62 0.0 00000000 00000000 1 [ ] +726 0 80 "" 441.1475 609.38 0.0 00000000 00000000 1 [ ] +727 0 80 "" 441.7812 633.79 0.0 00000000 00000000 1 [ ] +728 0 80 "" 442.3711 589.84 0.0 00000000 00000000 1 [ ] +729 0 70 "" 442.9277 556.64 0.0 00000000 00000000 1 [ ] +730 0 80 "" 443.4873 559.57 0.0 00000000 00000000 1 [ ] +731 0 80 "" 444.0771 589.84 0.0 00000000 00000000 1 [ ] +732 0 80 "" 444.6504 573.24 0.0 00000000 00000000 1 [ ] +733 0 70 "" 445.2578 607.42 0.0 00000000 00000000 1 [ ] +734 0 80 "" 445.8574 599.61 0.0 00000000 00000000 1 [ ] +735 0 70 "" 446.4678 610.35 0.0 00000000 00000000 1 [ ] +736 0 80 "" 447.0205 552.73 0.0 00000000 00000000 1 [ ] +737 0 80 "" 447.5605 540.04 0.0 00000000 00000000 1 [ ] +738 0 80 "" 448.1172 556.64 0.0 00000000 00000000 1 [ ] +739 0 80 "" 448.6777 560.55 0.0 00000000 00000000 1 [ ] +740 0 70 "" 449.3242 646.48 0.0 00000000 00000000 1 [ ] +741 0 80 "" 449.9404 616.21 0.0 00000000 00000000 1 [ ] +742 0 80 "" 450.5537 613.28 0.0 00000000 00000000 1 [ ] +743 0 80 "" 451.1436 589.84 0.0 00000000 00000000 1 [ ] +744 0 80 "" 451.6973 553.71 0.0 00000000 00000000 1 [ ] +745 0 70 "" 452.2910 593.75 0.0 00000000 00000000 1 [ ] +746 0 80 "" 452.8271 536.13 0.0 00000000 00000000 1 [ ] +747 0 80 "" 453.4307 603.52 0.0 00000000 00000000 1 [ ] +748 0 80 "" 453.9736 542.97 0.0 00000000 00000000 1 [ ] +749 0 80 "" 454.5508 577.15 0.0 00000000 00000000 1 [ ] +750 0 80 "" 455.1738 623.05 0.0 00000000 00000000 1 [ ] +751 0 80 "" 455.7910 617.19 0.0 00000000 00000000 1 [ ] +752 0 80 "" 456.3242 533.20 0.0 00000000 00000000 1 [ ] +753 0 80 "" 456.8975 573.24 0.0 00000000 00000000 1 [ ] +754 0 80 "" 457.5039 606.45 0.0 00000000 00000000 1 [ ] +755 0 80 "" 458.1270 623.05 0.0 00000000 00000000 1 [ ] +756 0 70 "" 458.6934 566.41 0.0 00000000 00000000 1 [ ] +757 0 80 "" 459.2969 603.52 0.0 00000000 00000000 1 [ ] +758 0 80 "" 459.8740 577.15 0.0 00000000 00000000 1 [ ] +759 0 80 "" 460.4072 533.20 0.0 00000000 00000000 1 [ ] +760 0 70 "" 460.9570 549.80 0.0 00000000 00000000 1 [ ] +761 0 80 "" 461.5605 603.52 0.0 00000000 00000000 1 [ ] +762 0 70 "" 462.1572 596.68 0.0 00000000 00000000 1 [ ] +763 0 80 "" 462.7969 639.65 0.0 00000000 00000000 1 [ ] +764 0 80 "" 463.3633 566.41 0.0 00000000 00000000 1 [ ] +765 0 80 "" 463.9404 577.15 0.0 00000000 00000000 1 [ ] +766 0 80 "" 464.4873 546.88 0.0 00000000 00000000 1 [ ] +767 0 80 "" 465.0469 559.57 0.0 00000000 00000000 1 [ ] +768 0 80 "" 465.6533 606.45 0.0 00000000 00000000 1 [ ] +769 0 80 "" 466.2568 603.52 0.0 00000000 00000000 1 [ ] +770 0 70 "" 466.8672 610.35 0.0 00000000 00000000 1 [ ] +771 0 80 "" 467.5039 636.72 0.0 00000000 00000000 1 [ ] +772 0 70 "" 468.0605 556.64 0.0 00000000 00000000 1 [ ] +773 0 80 "" 468.6807 620.12 0.0 00000000 00000000 1 [ ] +774 0 80 "" 469.2705 589.84 0.0 00000000 00000000 1 [ ] +775 0 80 "" 469.8369 566.41 0.0 00000000 00000000 1 [ ] +776 0 70 "" 470.4404 603.52 0.0 00000000 00000000 1 [ ] +777 0 80 "" 471.0000 559.57 0.0 00000000 00000000 1 [ ] +778 0 70 "" 471.6104 610.35 0.0 00000000 00000000 1 [ ] +779 0 80 "" 472.1533 542.97 0.0 00000000 00000000 1 [ ] +780 0 70 "" 472.6865 533.20 0.0 00000000 00000000 1 [ ] +781 0 80 "" 473.2334 546.88 0.0 00000000 00000000 1 [ ] +782 0 70 "" 473.7969 563.48 0.0 00000000 00000000 1 [ ] +783 0 80 "" 474.4033 606.45 0.0 00000000 00000000 1 [ ] +784 0 80 "" 475.0039 600.59 0.0 00000000 00000000 1 [ ] +785 0 70 "" 475.6133 609.38 0.0 00000000 00000000 1 [ ] +786 0 80 "" 476.2305 617.19 0.0 00000000 00000000 1 [ ] +787 0 80 "" 476.8633 632.81 0.0 00000000 00000000 1 [ ] +788 0 80 "" 477.5000 636.72 0.0 00000000 00000000 1 [ ] +789 0 80 "" 478.0771 577.15 0.0 00000000 00000000 1 [ ] +790 0 80 "" 478.6934 616.21 0.0 00000000 00000000 1 [ ] +791 0 80 "" 479.2969 603.52 0.0 00000000 00000000 1 [ ] +792 0 80 "" 479.8867 589.84 0.0 00000000 00000000 1 [ ] +793 0 80 "" 480.5166 629.88 0.0 00000000 00000000 1 [ ] +794 0 80 "" 481.1035 586.91 0.0 00000000 00000000 1 [ ] +795 0 80 "" 481.6904 586.91 0.0 00000000 00000000 1 [ ] +796 0 80 "" 482.2236 533.20 0.0 00000000 00000000 1 [ ] +797 0 80 "" 482.7803 556.64 0.0 00000000 00000000 1 [ ] +798 0 80 "" 483.3369 556.64 0.0 00000000 00000000 1 [ ] +799 0 80 "" 483.9336 596.68 0.0 00000000 00000000 1 [ ] +800 0 80 "" 484.5264 592.77 0.0 00000000 00000000 1 [ ] +801 0 80 "" 485.0664 540.04 0.0 00000000 00000000 1 [ ] +802 0 80 "" 485.6768 610.35 0.0 00000000 00000000 1 [ ] +803 0 80 "" 486.3262 649.41 0.0 00000000 00000000 1 [ ] +804 0 70 "" 486.8701 543.95 0.0 00000000 00000000 1 [ ] +805 0 80 "" 487.4795 609.38 0.0 00000000 00000000 1 [ ] +806 0 80 "" 488.0400 560.55 0.0 00000000 00000000 1 [ ] +807 0 80 "" 488.6729 632.81 0.0 00000000 00000000 1 [ ] +808 0 70 "" 489.2402 567.38 0.0 00000000 00000000 1 [ ] +809 0 80 "" 489.7861 545.90 0.0 00000000 00000000 1 [ ] +810 0 70 "" 490.3633 577.15 0.0 00000000 00000000 1 [ ] +811 0 80 "" 490.9961 632.81 0.0 00000000 00000000 1 [ ] +812 0 70 "" 491.5693 573.24 0.0 00000000 00000000 1 [ ] +813 0 80 "" 492.1396 570.31 0.0 00000000 00000000 1 [ ] +814 0 80 "" 492.7529 613.28 0.0 00000000 00000000 1 [ ] +815 0 70 "" 493.3135 560.55 0.0 00000000 00000000 1 [ ] +816 0 80 "" 493.8936 580.08 0.0 00000000 00000000 1 [ ] +817 0 80 "" 494.4600 566.41 0.0 00000000 00000000 1 [ ] +818 0 70 "" 495.0830 623.05 0.0 00000000 00000000 1 [ ] +819 0 80 "" 495.6826 599.61 0.0 00000000 00000000 1 [ ] +820 0 80 "" 496.2900 607.42 0.0 00000000 00000000 1 [ ] +821 0 70 "" 496.8594 569.34 0.0 00000000 00000000 1 [ ] +822 0 80 "" 497.5059 646.48 0.0 00000000 00000000 1 [ ] +823 0 80 "" 498.0566 550.78 0.0 00000000 00000000 1 [ ] +824 0 80 "" 498.6631 606.45 0.0 00000000 00000000 1 [ ] +825 0 80 "" 499.2998 636.72 0.0 00000000 00000000 1 [ ] +826 0 70 "" 499.8564 556.64 0.0 00000000 00000000 1 [ ] +827 0 80 "" 500.4893 632.81 0.0 00000000 00000000 1 [ ] +828 0 80 "" 501.0566 567.38 0.0 00000000 00000000 1 [ ] +829 0 70 "" 501.5967 540.04 0.0 00000000 00000000 1 [ ] +830 0 80 "" 502.1826 585.94 0.0 00000000 00000000 1 [ ] +831 0 80 "" 502.7861 603.52 0.0 00000000 00000000 1 [ ] +832 0 70 "" 503.3857 599.61 0.0 00000000 00000000 1 [ ] +833 0 80 "" 504.0098 624.02 0.0 00000000 00000000 1 [ ] +834 0 80 "" 504.5732 563.48 0.0 00000000 00000000 1 [ ] +835 0 80 "" 505.1328 559.57 0.0 00000000 00000000 1 [ ] +836 0 70 "" 505.6924 559.57 0.0 00000000 00000000 1 [ ] +837 0 80 "" 506.2861 593.75 0.0 00000000 00000000 1 [ ] +838 0 80 "" 506.9092 623.05 0.0 00000000 00000000 1 [ ] +839 0 80 "" 507.4561 546.88 0.0 00000000 00000000 1 [ ] +840 0 80 "" 508.0557 599.61 0.0 00000000 00000000 1 [ ] +841 0 80 "" 508.5957 540.04 0.0 00000000 00000000 1 [ ] +842 0 70 "" 509.1865 590.82 0.0 00000000 00000000 1 [ ] +843 0 80 "" 509.8125 625.98 0.0 00000000 00000000 1 [ ] +844 0 70 "" 510.4160 603.52 0.0 00000000 00000000 1 [ ] +845 0 80 "" 510.9961 580.08 0.0 00000000 00000000 1 [ ] +846 0 80 "" 511.5498 553.71 0.0 00000000 00000000 1 [ ] +847 0 70 "" 512.1631 613.28 0.0 00000000 00000000 1 [ ] +848 0 80 "" 512.7764 613.28 0.0 00000000 00000000 1 [ ] +849 0 70 "" 513.3662 589.84 0.0 00000000 00000000 1 [ ] +850 0 80 "" 513.9824 616.21 0.0 00000000 00000000 1 [ ] +851 0 80 "" 514.5488 566.41 0.0 00000000 00000000 1 [ ] +852 0 70 "" 515.1162 567.38 0.0 00000000 00000000 1 [ ] +853 0 80 "" 515.7295 613.28 0.0 00000000 00000000 1 [ ] +854 0 70 "" 516.3330 603.52 0.0 00000000 00000000 1 [ ] +855 0 80 "" 516.9092 576.17 0.0 00000000 00000000 1 [ ] +856 0 80 "" 517.5195 610.35 0.0 00000000 00000000 1 [ ] +857 0 80 "" 518.1328 613.28 0.0 00000000 00000000 1 [ ] +858 0 80 "" 518.7588 625.98 0.0 00000000 00000000 1 [ ] +859 0 80 "" 519.3691 610.35 0.0 00000000 00000000 1 [ ] +860 0 70 "" 519.9062 537.11 0.0 00000000 00000000 1 [ ] +861 0 80 "" 520.4395 533.20 0.0 00000000 00000000 1 [ ] +862 0 80 "" 521.0654 625.98 0.0 00000000 00000000 1 [ ] +863 0 70 "" 521.6025 537.11 0.0 00000000 00000000 1 [ ] +864 0 80 "" 522.1855 583.01 0.0 00000000 00000000 1 [ ] +865 0 80 "" 522.7920 606.45 0.0 00000000 00000000 1 [ ] +866 0 70 "" 523.3691 577.15 0.0 00000000 00000000 1 [ ] +867 0 80 "" 523.9688 599.61 0.0 00000000 00000000 1 [ ] +868 0 70 "" 524.5625 593.75 0.0 00000000 00000000 1 [ ] +869 0 80 "" 525.1729 610.35 0.0 00000000 00000000 1 [ ] +870 0 70 "" 525.7461 573.24 0.0 00000000 00000000 1 [ ] +871 0 80 "" 526.2920 545.90 0.0 00000000 00000000 1 [ ] +872 0 80 "" 526.9229 630.86 0.0 00000000 00000000 1 [ ] +873 0 80 "" 527.5293 606.45 0.0 00000000 00000000 1 [ ] +874 0 80 "" 528.1328 603.52 0.0 00000000 00000000 1 [ ] +875 0 80 "" 528.7119 579.10 0.0 00000000 00000000 1 [ ] +876 0 80 "" 529.3428 630.86 0.0 00000000 00000000 1 [ ] +877 0 80 "" 529.9053 562.50 0.0 00000000 00000000 1 [ ] +878 0 80 "" 530.5059 600.59 0.0 00000000 00000000 1 [ ] +879 0 80 "" 531.0586 552.73 0.0 00000000 00000000 1 [ ] +880 0 70 "" 531.6758 617.19 0.0 00000000 00000000 1 [ ] +881 0 80 "" 532.2188 542.97 0.0 00000000 00000000 1 [ ] +882 0 80 "" 532.8193 600.59 0.0 00000000 00000000 1 [ ] +883 0 80 "" 533.3555 536.13 0.0 00000000 00000000 1 [ ] +884 0 80 "" 533.8818 526.37 0.0 00000000 00000000 1 [ ] +885 0 80 "" 534.4658 583.98 0.0 00000000 00000000 1 [ ] +886 0 80 "" 535.0322 566.41 0.0 00000000 00000000 1 [ ] +887 0 80 "" 535.6055 573.24 0.0 00000000 00000000 1 [ ] +888 0 80 "" 536.2393 633.79 0.0 00000000 00000000 1 [ ] +889 0 80 "" 536.8252 585.94 0.0 00000000 00000000 1 [ ] +890 0 70 "" 537.4092 583.98 0.0 00000000 00000000 1 [ ] +891 0 80 "" 538.0459 636.72 0.0 00000000 00000000 1 [ ] +892 0 80 "" 538.5918 545.90 0.0 00000000 00000000 1 [ ] +893 0 80 "" 539.1426 550.78 0.0 00000000 00000000 1 [ ] +894 0 80 "" 539.7324 589.84 0.0 00000000 00000000 1 [ ] +895 0 80 "" 540.3584 625.98 0.0 00000000 00000000 1 [ ] +896 0 70 "" 540.9756 617.19 0.0 00000000 00000000 1 [ ] +897 0 80 "" 541.5518 576.17 0.0 00000000 00000000 1 [ ] +898 0 80 "" 542.0791 527.34 0.0 00000000 00000000 1 [ ] +899 0 80 "" 542.6152 536.13 0.0 00000000 00000000 1 [ ] +900 0 80 "" 543.2021 586.91 0.0 00000000 00000000 1 [ ] +901 0 70 "" 543.7852 583.01 0.0 00000000 00000000 1 [ ] +902 0 80 "" 544.3555 570.31 0.0 00000000 00000000 1 [ ] +903 0 80 "" 544.9053 549.80 0.0 00000000 00000000 1 [ ] +904 0 70 "" 545.5254 620.12 0.0 00000000 00000000 1 [ ] +905 0 80 "" 546.1484 623.05 0.0 00000000 00000000 1 [ ] +906 0 80 "" 546.7490 600.59 0.0 00000000 00000000 1 [ ] +907 0 80 "" 547.3818 632.81 0.0 00000000 00000000 1 [ ] +908 0 80 "" 547.9756 593.75 0.0 00000000 00000000 1 [ ] +909 0 80 "" 548.5586 583.01 0.0 00000000 00000000 1 [ ] +910 0 80 "" 549.1123 553.71 0.0 00000000 00000000 1 [ ] +911 0 70 "" 549.6689 556.64 0.0 00000000 00000000 1 [ ] +912 0 80 "" 550.2920 623.05 0.0 00000000 00000000 1 [ ] +913 0 80 "" 550.8584 566.41 0.0 00000000 00000000 1 [ ] +914 0 80 "" 551.4287 570.31 0.0 00000000 00000000 1 [ ] +915 0 70 "" 552.0088 580.08 0.0 00000000 00000000 1 [ ] +916 0 80 "" 552.6484 639.65 0.0 00000000 00000000 1 [ ] +917 0 80 "" 553.2451 596.68 0.0 00000000 00000000 1 [ ] +918 0 80 "" 553.8682 623.05 0.0 00000000 00000000 1 [ ] +919 0 80 "" 554.4453 577.15 0.0 00000000 00000000 1 [ ] +920 0 80 "" 555.0420 596.68 0.0 00000000 00000000 1 [ ] +921 0 80 "" 555.5752 533.20 0.0 00000000 00000000 1 [ ] +922 0 80 "" 556.1748 599.61 0.0 00000000 00000000 1 [ ] +923 0 70 "" 556.7881 613.28 0.0 00000000 00000000 1 [ ] +924 0 80 "" 557.3848 596.68 0.0 00000000 00000000 1 [ ] +925 0 80 "" 557.9648 580.08 0.0 00000000 00000000 1 [ ] +926 0 70 "" 558.5420 577.15 0.0 00000000 00000000 1 [ ] +927 0 80 "" 559.1387 596.68 0.0 00000000 00000000 1 [ ] +928 0 70 "" 559.6914 552.73 0.0 00000000 00000000 1 [ ] +929 0 80 "" 560.2451 553.71 0.0 00000000 00000000 1 [ ] +930 0 70 "" 560.8086 563.48 0.0 00000000 00000000 1 [ ] +931 0 80 "" 561.3516 542.97 0.0 00000000 00000000 1 [ ] +932 0 80 "" 562.0049 653.32 0.0 00000000 00000000 1 [ ] +933 0 80 "" 562.5820 577.15 0.0 00000000 00000000 1 [ ] +934 0 80 "" 563.1650 583.01 0.0 00000000 00000000 1 [ ] +935 0 80 "" 563.7783 613.28 0.0 00000000 00000000 1 [ ] +936 0 80 "" 564.4150 636.72 0.0 00000000 00000000 1 [ ] +937 0 70 "" 565.0283 613.28 0.0 00000000 00000000 1 [ ] +938 0 80 "" 565.6514 623.05 0.0 00000000 00000000 1 [ ] +939 0 80 "" 566.1953 543.95 0.0 00000000 00000000 1 [ ] +940 0 70 "" 566.7852 589.84 0.0 00000000 00000000 1 [ ] +941 0 80 "" 567.3320 546.88 0.0 00000000 00000000 1 [ ] +942 0 80 "" 567.8750 542.97 0.0 00000000 00000000 1 [ ] +943 0 80 "" 568.4150 540.04 0.0 00000000 00000000 1 [ ] +944 0 70 "" 568.9580 542.97 0.0 00000000 00000000 1 [ ] +945 0 80 "" 569.5146 556.64 0.0 00000000 00000000 1 [ ] +946 0 80 "" 570.1445 629.88 0.0 00000000 00000000 1 [ ] +947 0 80 "" 570.7412 596.68 0.0 00000000 00000000 1 [ ] +948 0 80 "" 571.3379 596.68 0.0 00000000 00000000 1 [ ] +949 0 80 "" 571.9551 617.19 0.0 00000000 00000000 1 [ ] +950 0 80 "" 572.5576 602.54 0.0 00000000 00000000 1 [ ] +951 0 80 "" 573.1514 593.75 0.0 00000000 00000000 1 [ ] +952 0 80 "" 573.7451 593.75 0.0 00000000 00000000 1 [ ] +953 0 70 "" 574.2881 542.97 0.0 00000000 00000000 1 [ ] +954 0 80 "" 574.8682 580.08 0.0 00000000 00000000 1 [ ] +955 0 70 "" 575.4883 620.12 0.0 00000000 00000000 1 [ ] +956 0 80 "" 576.0811 592.77 0.0 00000000 00000000 1 [ ] +957 0 80 "" 576.6211 540.04 0.0 00000000 00000000 1 [ ] +958 0 70 "" 577.1680 546.88 0.0 00000000 00000000 1 [ ] +959 0 80 "" 577.7148 546.88 0.0 00000000 00000000 1 [ ] +960 0 80 "" 578.3145 599.61 0.0 00000000 00000000 1 [ ] +961 0 80 "" 578.8613 546.88 0.0 00000000 00000000 1 [ ] +962 0 80 "" 579.4912 629.88 0.0 00000000 00000000 1 [ ] +963 0 80 "" 580.0547 563.48 0.0 00000000 00000000 1 [ ] +964 0 70 "" 580.6777 623.05 0.0 00000000 00000000 1 [ ] +965 0 80 "" 581.2842 606.45 0.0 00000000 00000000 1 [ ] +966 0 80 "" 581.8779 593.75 0.0 00000000 00000000 1 [ ] +967 0 80 "" 582.4277 549.80 0.0 00000000 00000000 1 [ ] +968 0 80 "" 583.0078 580.08 0.0 00000000 00000000 1 [ ] +969 0 70 "" 583.5713 563.48 0.0 00000000 00000000 1 [ ] +970 0 80 "" 584.1143 542.97 0.0 00000000 00000000 1 [ ] +971 0 80 "" 584.7109 596.68 0.0 00000000 00000000 1 [ ] +972 0 70 "" 585.3311 620.12 0.0 00000000 00000000 1 [ ] +973 0 80 "" 585.9414 610.35 0.0 00000000 00000000 1 [ ] +974 0 80 "" 586.5146 573.24 0.0 00000000 00000000 1 [ ] +975 0 70 "" 587.1074 592.77 0.0 00000000 00000000 1 [ ] +976 0 80 "" 587.6875 580.08 0.0 00000000 00000000 1 [ ] +977 0 80 "" 588.2715 583.98 0.0 00000000 00000000 1 [ ] +978 0 80 "" 588.8379 566.41 0.0 00000000 00000000 1 [ ] +979 0 80 "" 589.3848 546.88 0.0 00000000 00000000 1 [ ] +980 0 80 "" 589.9814 596.68 0.0 00000000 00000000 1 [ ] +981 0 80 "" 590.5742 592.77 0.0 00000000 00000000 1 [ ] +982 0 80 "" 591.1914 617.19 0.0 00000000 00000000 1 [ ] +983 0 80 "" 591.8008 609.38 0.0 00000000 00000000 1 [ ] +984 0 80 "" 592.3877 586.91 0.0 00000000 00000000 1 [ ] +985 0 80 "" 593.0205 632.81 0.0 00000000 00000000 1 [ ] +986 0 80 "" 593.6309 610.35 0.0 00000000 00000000 1 [ ] +987 0 80 "" 594.2539 623.05 0.0 00000000 00000000 1 [ ] +988 0 80 "" 594.8174 563.48 0.0 00000000 00000000 1 [ ] +989 0 70 "" 595.4346 617.19 0.0 00000000 00000000 1 [ ] +990 0 80 "" 596.0439 609.38 0.0 00000000 00000000 1 [ ] +991 0 80 "" 596.6074 563.48 0.0 00000000 00000000 1 [ ] +992 0 80 "" 597.1777 570.31 0.0 00000000 00000000 1 [ ] +993 0 80 "" 597.7441 566.41 0.0 00000000 00000000 1 [ ] +994 0 80 "" 598.3047 560.55 0.0 00000000 00000000 1 [ ] +995 0 70 "" 598.9072 602.54 0.0 00000000 00000000 1 [ ] +996 0 80 "" 599.5371 629.88 0.0 00000000 00000000 1 [ ] +997 0 80 "" 600.1104 573.24 0.0 00000000 00000000 1 [ ] +998 0 80 "" 600.6943 583.98 0.0 00000000 00000000 1 [ ] +999 0 80 "" 601.3145 620.12 0.0 00000000 00000000 1 [ ] +1000 0 80 "" 601.9375 623.05 0.0 00000000 00000000 1 [ ] +1001 0 70 "" 602.5039 566.41 0.0 00000000 00000000 1 [ ] +1002 0 1 "" 605.8389 3334.96 0.0 00000000 00000000 1 [ ] diff --git a/studio_functions/Functions/EStudio/EEG Tab/EStudio_EEG_Tab.m b/studio_functions/Functions/EStudio/EEG Tab/EStudio_EEG_Tab.m new file mode 100755 index 00000000..65b63746 --- /dev/null +++ b/studio_functions/Functions/EStudio/EEG Tab/EStudio_EEG_Tab.m @@ -0,0 +1,172 @@ +%%This function is to create EEG Tab + + +% Author: Guanghui Zhang & Steve J. Luck +% Center for Mind and Brain +% University of California, Davis +% Davis, CA +% Aug. 2023 + + + +function EStudio_gui_erp_totl = EStudio_EEG_Tab(EStudio_gui_erp_totl,ColorB_def) + +if isempty(ColorB_def) + ColorB_def = [0.7020 0.77 0.85]; +end + +%% Arrange the main interface for ERP panel (Tab3) +EStudio_gui_erp_totl.eegViewBox = uix.VBox('Parent', EStudio_gui_erp_totl.tabEEG,'BackgroundColor',ColorB_def); +EStudio_gui_erp_totl.eegViewPanel = uix.BoxPanel('Parent', EStudio_gui_erp_totl.eegViewBox,'TitleColor',ColorB_def,'ForegroundColor','k');% +EStudio_gui_erp_totl.eegViewContainer = uicontainer('Parent', EStudio_gui_erp_totl.eegViewPanel); + +EStudio_gui_erp_totl.eegpanelscroll = uix.ScrollingPanel('Parent', EStudio_gui_erp_totl.tabEEG); +set(EStudio_gui_erp_totl.eegpanelscroll,'BackgroundColor',ColorB_def); +% + Adjust the main layout +set( EStudio_gui_erp_totl.tabEEG, 'Widths', [-4, 300]); % Viewpanel and settings panel + +%%-------------------------function panels--------------------------------- +EStudio_gui_erp_totl.eegpanel_fonts = f_get_default_fontsize(); + +EStudio_gui_erp_totl.eegsettingLayout = uiextras.VBox('Parent', EStudio_gui_erp_totl.eegpanelscroll,'BackgroundColor',ColorB_def); + +% + Create the settings window panels for ERP panel +EStudio_gui_erp_totl.eegpanel{1} = f_EEG_eeg_sets_GUI(EStudio_gui_erp_totl.eegsettingLayout,EStudio_gui_erp_totl.eegpanel_fonts); +EStudio_gui_erp_totl.eegpanelSizes(1) = 300; +EStudio_gui_erp_totl.eegpanel{2} = f_EEG_IC_channel_GUI(EStudio_gui_erp_totl.eegsettingLayout,EStudio_gui_erp_totl.eegpanel_fonts); +EStudio_gui_erp_totl.eegpanelSizes(2) = 320; +EStudio_gui_erp_totl.eegpanel{3} = f_EEG_Plot_setting_GUI(EStudio_gui_erp_totl.eegsettingLayout,EStudio_gui_erp_totl.eegpanel_fonts); +EStudio_gui_erp_totl.eegpanelSizes(3) = 290; +EStudio_gui_erp_totl.eegpanel{4} = f_EEG_edit_channel_GUI(EStudio_gui_erp_totl.eegsettingLayout,EStudio_gui_erp_totl.eegpanel_fonts); +EStudio_gui_erp_totl.eegpanelSizes(4) = 170; +disp('EEG Tab: Launching EEGsets, Channel and IC Selection, Plot Settings, Edit/Delete Channels & Locations,...'); +EStudio_gui_erp_totl.eegpanel{5} = f_EEG_interpolate_chan_epoch_GUI(EStudio_gui_erp_totl.eegsettingLayout,EStudio_gui_erp_totl.eegpanel_fonts); +EStudio_gui_erp_totl.eegpanelSizes(5) = 290; +EStudio_gui_erp_totl.eegpanel{6} = f_EEG_chanoperation_GUI(EStudio_gui_erp_totl.eegsettingLayout,EStudio_gui_erp_totl.eegpanel_fonts); +EStudio_gui_erp_totl.eegpanelSizes(6) = 330; +EStudio_gui_erp_totl.eegpanel{7} = f_EEG_informtion_GUI(EStudio_gui_erp_totl.eegsettingLayout,EStudio_gui_erp_totl.eegpanel_fonts); +EStudio_gui_erp_totl.eegpanelSizes(7) = 410; +EStudio_gui_erp_totl.eegpanel{8} = f_EEG_resample_GUI(EStudio_gui_erp_totl.eegsettingLayout,EStudio_gui_erp_totl.eegpanel_fonts); +EStudio_gui_erp_totl.eegpanelSizes(8) = 215; +disp([32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,... + 'Interpolate Channels, Channel Operations, EEG & Bin Information, Sampling Rate & Epoch,...']); +EStudio_gui_erp_totl.eegpanel{9} = f_EEG_events_GUI(EStudio_gui_erp_totl.eegsettingLayout,EStudio_gui_erp_totl.eegpanel_fonts); +EStudio_gui_erp_totl.eegpanelSizes(9) = 430; +EStudio_gui_erp_totl.eegpanel{10} = f_EEG_filtering_GUI(EStudio_gui_erp_totl.eegsettingLayout,EStudio_gui_erp_totl.eegpanel_fonts); +EStudio_gui_erp_totl.eegpanelSizes(10) = 245; +EStudio_gui_erp_totl.eegpanel{11} = f_EEG_eeglabtool_GUI(EStudio_gui_erp_totl.eegsettingLayout,EStudio_gui_erp_totl.eegpanel_fonts); +EStudio_gui_erp_totl.eegpanelSizes(11) = 210; +EStudio_gui_erp_totl.eegpanel{12} = f_EEG_eeglabica_GUI(EStudio_gui_erp_totl.eegsettingLayout,EStudio_gui_erp_totl.eegpanel_fonts); +EStudio_gui_erp_totl.eegpanelSizes(12) = 250; +disp([32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,... + 'EventList, Filtering, EEGLAB Tools (only for one selected dataset), EEGLAB ICA (only for one selected dataset),...']); +EStudio_gui_erp_totl.eegpanel{13} = f_EEG_event2bin_GUI(EStudio_gui_erp_totl.eegsettingLayout,EStudio_gui_erp_totl.eegpanel_fonts); +EStudio_gui_erp_totl.eegpanelSizes(13) = 200; +EStudio_gui_erp_totl.eegpanel{14} = f_EEG_binepoch_GUI(EStudio_gui_erp_totl.eegsettingLayout,EStudio_gui_erp_totl.eegpanel_fonts); +EStudio_gui_erp_totl.eegpanelSizes(14) = 160; +EStudio_gui_erp_totl.eegpanel{15} = f_EEG_arf_det_segmt_conus_GUI(EStudio_gui_erp_totl.eegsettingLayout,EStudio_gui_erp_totl.eegpanel_fonts); +EStudio_gui_erp_totl.eegpanelSizes(15) = 290; +EStudio_gui_erp_totl.eegpanel{16} = f_EEG_arf_det_conus_GUI(EStudio_gui_erp_totl.eegsettingLayout,EStudio_gui_erp_totl.eegpanel_fonts); +EStudio_gui_erp_totl.eegpanelSizes(16) = 470; +disp([32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,... + 'Assign Events to Bins (BINLISTER), Extract Bin-Based Epochs (Continuous EEG), Delete Time Segments (Continuous EEG), Reject Artifactual Time Segments (Continuous EEG),...']); +EStudio_gui_erp_totl.eegpanel{17} = f_EEG_shift_eventcode_conus_GUI(EStudio_gui_erp_totl.eegsettingLayout,EStudio_gui_erp_totl.eegpanel_fonts); +EStudio_gui_erp_totl.eegpanelSizes(17) = 200; +EStudio_gui_erp_totl.eegpanel{18} = f_EEG_dq_fre_conus_GUI(EStudio_gui_erp_totl.eegsettingLayout,EStudio_gui_erp_totl.eegpanel_fonts); +EStudio_gui_erp_totl.eegpanelSizes(18) = 290; +EStudio_gui_erp_totl.eegpanel{19} = f_EEG_arf_det_epoch_GUI(EStudio_gui_erp_totl.eegsettingLayout,EStudio_gui_erp_totl.eegpanel_fonts); +EStudio_gui_erp_totl.eegpanelSizes(19) = 380; +EStudio_gui_erp_totl.eegpanel{20} = f_EEG_arf_sumop_GUI(EStudio_gui_erp_totl.eegsettingLayout,EStudio_gui_erp_totl.eegpanel_fonts); +EStudio_gui_erp_totl.eegpanelSizes(20) = 160; +disp([32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,... + 'Shift Event Codes (Continuous EEG), Spectral Data Quality (Continuous EEG), Artifact Detection (Epoched EEG), Artifact Info & Tools (Epoched EEG),...']); +EStudio_gui_erp_totl.eegpanel{21} = f_EEG_baselinecorr_detrend_GUI(EStudio_gui_erp_totl.eegsettingLayout,EStudio_gui_erp_totl.eegpanel_fonts); +EStudio_gui_erp_totl.eegpanelSizes(21) = 220; +EStudio_gui_erp_totl.eegpanel{22} = f_EEG_dq_epoch_GUI(EStudio_gui_erp_totl.eegsettingLayout,EStudio_gui_erp_totl.eegpanel_fonts); +EStudio_gui_erp_totl.eegpanelSizes(22) = 240; +EStudio_gui_erp_totl.eegpanel{23} = f_EEG_avg_erp_GUI(EStudio_gui_erp_totl.eegsettingLayout,EStudio_gui_erp_totl.eegpanel_fonts); +EStudio_gui_erp_totl.eegpanelSizes(23) = 300; +disp([32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,... + 'Baseline Correction & Linear Detrend (Epoched EEG), Compute Data Quality Metrics (Epoched EEG), Compute Averaged ERPs (Epoched EEG),...']); +EStudio_gui_erp_totl.eegpanel{24} = f_EEG_CSD_GUI(EStudio_gui_erp_totl.eegsettingLayout,EStudio_gui_erp_totl.eegpanel_fonts); +EStudio_gui_erp_totl.eegpanelSizes(24) = 190; +EStudio_gui_erp_totl.eegpanel{25} = f_EEG_utilities_GUI(EStudio_gui_erp_totl.eegsettingLayout,EStudio_gui_erp_totl.eegpanel_fonts); +EStudio_gui_erp_totl.eegpanelSizes(25) = 190; +EStudio_gui_erp_totl.eegpanel{26} = f_EEG_history_GUI(EStudio_gui_erp_totl.eegsettingLayout,EStudio_gui_erp_totl.eegpanel_fonts); +EStudio_gui_erp_totl.eegpanelSizes(26) = 300; +disp([32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,... + 'Convert Voltage to CSD, EEG Utilities, and History panels.']); + +set(EStudio_gui_erp_totl.eegsettingLayout, 'Heights', EStudio_gui_erp_totl.eegpanelSizes); +EStudio_gui_erp_totl.eegpanelscroll.Heights = sum(EStudio_gui_erp_totl.eegpanelSizes); + +%% Hook up the minimize callback and IsMinimized +set( EStudio_gui_erp_totl.eegpanel{1}, 'MinimizeFcn', {@nMinimize, 1} ); +set( EStudio_gui_erp_totl.eegpanel{2}, 'MinimizeFcn', {@nMinimize, 2} ); +set( EStudio_gui_erp_totl.eegpanel{3}, 'MinimizeFcn', {@nMinimize, 3} ); +set( EStudio_gui_erp_totl.eegpanel{4}, 'MinimizeFcn', {@nMinimize, 4} ); +set( EStudio_gui_erp_totl.eegpanel{5}, 'MinimizeFcn', {@nMinimize, 5} ); +set( EStudio_gui_erp_totl.eegpanel{6}, 'MinimizeFcn', {@nMinimize, 6} ); +set( EStudio_gui_erp_totl.eegpanel{7}, 'MinimizeFcn', {@nMinimize, 7} ); +set( EStudio_gui_erp_totl.eegpanel{8}, 'MinimizeFcn', {@nMinimize, 8} ); +set( EStudio_gui_erp_totl.eegpanel{9}, 'MinimizeFcn', {@nMinimize, 9} ); +set( EStudio_gui_erp_totl.eegpanel{10}, 'MinimizeFcn', {@nMinimize, 10} ); +set( EStudio_gui_erp_totl.eegpanel{11}, 'MinimizeFcn', {@nMinimize, 11} ); +set( EStudio_gui_erp_totl.eegpanel{12}, 'MinimizeFcn', {@nMinimize, 12} ); +set( EStudio_gui_erp_totl.eegpanel{13}, 'MinimizeFcn', {@nMinimize, 13} ); +set( EStudio_gui_erp_totl.eegpanel{14}, 'MinimizeFcn', {@nMinimize, 14} ); +set( EStudio_gui_erp_totl.eegpanel{15}, 'MinimizeFcn', {@nMinimize, 15} ); +set( EStudio_gui_erp_totl.eegpanel{16}, 'MinimizeFcn', {@nMinimize, 16} ); +set( EStudio_gui_erp_totl.eegpanel{17}, 'MinimizeFcn', {@nMinimize, 17} ); +set( EStudio_gui_erp_totl.eegpanel{18}, 'MinimizeFcn', {@nMinimize, 18} ); +set( EStudio_gui_erp_totl.eegpanel{19}, 'MinimizeFcn', {@nMinimize, 19} ); +set( EStudio_gui_erp_totl.eegpanel{20}, 'MinimizeFcn', {@nMinimize, 20} ); +set( EStudio_gui_erp_totl.eegpanel{21}, 'MinimizeFcn', {@nMinimize, 21} ); +set( EStudio_gui_erp_totl.eegpanel{22}, 'MinimizeFcn', {@nMinimize, 22} ); +set( EStudio_gui_erp_totl.eegpanel{23}, 'MinimizeFcn', {@nMinimize, 23} ); +set( EStudio_gui_erp_totl.eegpanel{24}, 'MinimizeFcn', {@nMinimize, 24} ); +set( EStudio_gui_erp_totl.eegpanel{25}, 'MinimizeFcn', {@nMinimize, 25} ); +set( EStudio_gui_erp_totl.eegpanel{26}, 'MinimizeFcn', {@nMinimize, 26} ); +%%shrinking Panels 4-26 to just their title-bar +whichpanel = [4:26]; +for Numofpanel = 1:length(whichpanel) + minned = EStudio_gui_erp_totl.eegpanel{whichpanel(Numofpanel)}.IsMinimized; + szs = get( EStudio_gui_erp_totl.eegsettingLayout, 'Sizes' ); + if minned + set( EStudio_gui_erp_totl.eegpanel{whichpanel(Numofpanel)}, 'IsMinimized', false); + szs(whichpanel(Numofpanel)) = EStudio_gui_erp_totl.eegpanelSizes(whichpanel(Numofpanel)); + else + set( EStudio_gui_erp_totl.eegpanel{whichpanel(Numofpanel)}, 'IsMinimized', true); + szs(whichpanel(Numofpanel)) = 25; + end + set( EStudio_gui_erp_totl.eegsettingLayout, 'Sizes', szs ); + EStudio_gui_erp_totl.eegpanelscroll.Heights = sum(szs); +end %% End for shrinking panels 4-23 + +%% + Create the view +peeg = EStudio_gui_erp_totl.eegViewContainer; +EStudio_gui_erp_totl.eegViewAxes = uiextras.HBox( 'Parent', peeg,'BackgroundColor',ColorB_def); +end + + +function nMinimize( eventSource, eventData, whichpanel ) %#ok +global EStudio_gui_erp_totl; + +try + [version reldate,ColorB_def,ColorF_def,errorColorF_def] = geterplabstudiodef; +catch + ColorB_def = [0.7020 0.77 0.85]; +end +minned = EStudio_gui_erp_totl.eegpanel{whichpanel}.IsMinimized; +szs = get( EStudio_gui_erp_totl.eegsettingLayout, 'Sizes' ); +if minned + set( EStudio_gui_erp_totl.eegpanel{whichpanel}, 'IsMinimized', false); + szs(whichpanel) = EStudio_gui_erp_totl.eegpanelSizes(whichpanel); +else + set( EStudio_gui_erp_totl.eegpanel{whichpanel}, 'IsMinimized', true); + szs(whichpanel) = 25; +end +set( EStudio_gui_erp_totl.eegsettingLayout, 'Sizes', szs ,'BackgroundColor',ColorB_def); +EStudio_gui_erp_totl.eegpanelscroll.Heights = sum(szs); +set(EStudio_gui_erp_totl.eegpanelscroll,'BackgroundColor',ColorB_def); +end % nMinimize diff --git a/studio_functions/Functions/EStudio/EEG Tab/f_check_eegtab_panelchanges.m b/studio_functions/Functions/EStudio/EEG Tab/f_check_eegtab_panelchanges.m new file mode 100755 index 00000000..9463d918 --- /dev/null +++ b/studio_functions/Functions/EStudio/EEG Tab/f_check_eegtab_panelchanges.m @@ -0,0 +1,181 @@ +function [messgStr,eegpanelIndex]= f_check_eegtab_panelchanges() + +messgStr = ''; +eegpanelIndex = 0; + +MyViewer_eegset = estudioworkingmemory('EEGTab_eegset'); +if ~isempty(MyViewer_eegset) && MyViewer_eegset==1 + messgStr = char( 'Changes on "EEGsets" have not been applied'); + eegpanelIndex =100; + return; +end + + +MyViewer_chanic = estudioworkingmemory('EEGTab_chanic'); +if ~isempty(MyViewer_chanic) && MyViewer_chanic==1 + messgStr = char( 'Changes on "Channel and IC Selection" have not been applied'); + eegpanelIndex =1; + return; +end + + +MyViewer_plotset = estudioworkingmemory('EEGTab_plotset'); +if ~isempty(MyViewer_plotset) && MyViewer_plotset==1 + messgStr = char( 'Changes on "Plot Settings" have not been applied'); + eegpanelIndex =2; + return; +end + +%%filtering +MyViewer_filter = estudioworkingmemory('EEGTab_filter'); +if ~isempty(MyViewer_filter) && MyViewer_filter==1 + messgStr = char( 'Changes on "Filtering" have not been applied'); + eegpanelIndex =3; + return; +end + +%%Channel operations +MyViewer_chanop = estudioworkingmemory('EEGTab_chanop'); +if ~isempty(MyViewer_chanop) && MyViewer_chanop==1 + messgStr = char( 'Changes on "Channel Operations" have not been applied'); + eegpanelIndex =4; + return; +end + +%%Assign events to bins +MyViewer_event2bin = estudioworkingmemory('EEGTab_event2bin'); +if ~isempty(MyViewer_event2bin) && MyViewer_event2bin==1 + messgStr = char( 'Changes on "Assign Events to Bins (BINLISTER)" have not been applied'); + eegpanelIndex =5; + return; +end + + +%%Bin-based epoch +MyViewer_binepoch = estudioworkingmemory('EEGTab_binepoch'); +if ~isempty(MyViewer_binepoch) && MyViewer_binepoch==1 + messgStr = char( 'Changes on "Extract Bin-Based Epochs (Continuous EEG)" have not been applied'); + eegpanelIndex =6; + return; +end + + +%%edit chan +%%Bin-based epoch +MyViewer_editchan = estudioworkingmemory('EEGTab_editchan'); +if ~isempty(MyViewer_editchan) && MyViewer_editchan==1 + messgStr = char( 'Changes on "Edit Channel Info" have not been applied'); + eegpanelIndex =7; + return; +end + + + +%%interpolate +MyViewer_interpolatechan = estudioworkingmemory('EEGTab_interpolated_chan_epoch'); +if ~isempty(MyViewer_interpolatechan) && MyViewer_interpolatechan==1 + messgStr = char( 'Changes on "Interpolate Channels" have not been applied'); + eegpanelIndex =8; + return; +end + +%%detect artifact for epoched EEG +MyViewer_detectartepoch = estudioworkingmemory('EEGTab_detect_arts_epoch'); +if ~isempty(MyViewer_detectartepoch) && MyViewer_detectartepoch==1 + messgStr = char( 'Changes on "Artifact Detection (Epoched EEG)" have not been applied'); + eegpanelIndex =9; + return; +end + + + +%%detect artifact for continuous EEG +MyViewer_detectartepoch = estudioworkingmemory('EEGTab_detect_arts_conus'); +if ~isempty(MyViewer_detectartepoch) && MyViewer_detectartepoch==1 + messgStr = char( 'Changes on "Delete Time Segments (Continuous EEG)" have not been applied'); + eegpanelIndex =10; + return; +end + + +%%delete time segements +MyViewer_detectartepoch = estudioworkingmemory('EEGTab_detect_segmt_conus'); +if ~isempty(MyViewer_detectartepoch) && MyViewer_detectartepoch==1 + messgStr = char( 'Changes on "Reject Artifactual Time Segments (Continuous EEG)" have not been applied'); + eegpanelIndex =11; + return; +end + + + +%%Shift Event Codes for Continuous EEG +MyViewer_detectartepoch = estudioworkingmemory('EEGTab_shiftcodes_conus'); +if ~isempty(MyViewer_detectartepoch) && MyViewer_detectartepoch==1 + messgStr = char( 'Changes on "Shift Event Codes (Continuous EEG)" have not been applied'); + eegpanelIndex =12; + return; +end + + + +%%Remove response mistakes for Continuous EEG +MyViewer_detectartepoch = estudioworkingmemory('EEGTab_rmresposmistak_conus'); +if ~isempty(MyViewer_detectartepoch) && MyViewer_detectartepoch==1 + messgStr = char( 'Changes on "Remove Response Errors (Continuous EEG)" have not been applied'); + eegpanelIndex =13; + return; +end + + +%%spectral data quality +MyViewer_detectartepoch = estudioworkingmemory('EEGTab_dq_fre_conus'); +if ~isempty(MyViewer_detectartepoch) && MyViewer_detectartepoch==1 + messgStr = char( 'Changes on "Spectral Data Quality (Continuous EEG)" have not been applied'); + eegpanelIndex =14; + return; +end + + +%%linear detrend +MyViewer_detectartepoch = estudioworkingmemory('EEGTab_baseline_detrend'); +if ~isempty(MyViewer_detectartepoch) && MyViewer_detectartepoch==1 + messgStr = char( 'Changes on "Baseline Correction & Linear Detrend (Epoched EEG)" have not been applied'); + eegpanelIndex =15; + return; +end + +%%data quality for epoched eeg +MyViewer_detectartepoch = estudioworkingmemory('EEGTab_dq_epoch'); +if ~isempty(MyViewer_detectartepoch) && MyViewer_detectartepoch==1 + messgStr = char( 'Changes on "Data Quality Metrics (Epoched EEG)" have not been applied'); + eegpanelIndex =16; + return; +end + +%%compute averaged ERP +MyViewer_detectartepoch = estudioworkingmemory('EEGTab_avg_erp'); +if ~isempty(MyViewer_detectartepoch) && MyViewer_detectartepoch==1 + messgStr = char( 'Changes on "Compute Averaged ERPs (Epoched EEG)" have not been applied'); + eegpanelIndex =17; + return; +end + +%%compute averaged ERP +MyViewer_detectartepoch = estudioworkingmemory('EEGTab_resample'); +if ~isempty(MyViewer_detectartepoch) && MyViewer_detectartepoch==1 + messgStr = char( 'Changes on "Sampling Rate & Epoch" have not been applied'); + eegpanelIndex =18; + return; +end + + + +MyViewer_detectartepoch = estudioworkingmemory('EEGTab_csd'); +if ~isempty(MyViewer_detectartepoch) && MyViewer_detectartepoch==1 + messgStr = char( 'Changes on "Convert voltage to CSD" have not been applied'); + eegpanelIndex =19; + return; +end + + +return; diff --git a/studio_functions/Functions/EStudio/EEG Tab/f_eeg_read_chan_IC_names.m b/studio_functions/Functions/EStudio/EEG Tab/f_eeg_read_chan_IC_names.m new file mode 100755 index 00000000..69856d17 --- /dev/null +++ b/studio_functions/Functions/EStudio/EEG Tab/f_eeg_read_chan_IC_names.m @@ -0,0 +1,57 @@ + + + +function [AllStr,chanName,ICName] = f_eeg_read_chan_IC_names(chanlocs,ChanArray,ICArray,channeLabel) +chanName = ''; +ICName = ''; +AllStr = ''; +if isempty(chanlocs) && isempty(ChanArray) + return; +end + +if ~isempty(ChanArray) + if ~isempty(chanlocs) && channeLabel==1 + if any(ChanArray(:)>length(chanlocs) ) + ChanArray = [1:length(chanlocs)]; + end + chanlocs = chanlocs(ChanArray); + tmplocs = readlocs(chanlocs); + chanName = { tmplocs.labels }; + for ii = 1:length(chanName) + chanName{1,ii}= sprintf(chanName{1,ii},'_','\_'); + chanName{1,ii} = strcat(num2str(ChanArray(ii)),'.',32,chanName{1,ii}); + end + elseif (isempty(chanlocs) || channeLabel==0) && ~isempty(ChanArray) + count = 0; + for ii = ChanArray + count = count +1; + chanName{count,1} = ['Chan',32,num2str(ii)]; + end + end +end +AllStr = chanName; +chanName = char(chanName); +%%IC names +if isempty(ICArray) + AllStr = char(AllStr); + return; +end +count = 0; +for ii = ICArray + count = count +1; + ICName{count,1} = ['IC',32,num2str(ii)]; +end + +if isempty(AllStr) + AllStr = char(ICName); +else + count = 0; + for ii = ICArray + count = count +1; + AllStr{length(AllStr)+1} = ['IC',32,num2str(ii)]; + end + +end +AllStr = char(AllStr); +ICName = char(ICName); +end \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/f_get_default_fontsize.m b/studio_functions/Functions/EStudio/EEG Tab/f_get_default_fontsize.m old mode 100644 new mode 100755 similarity index 54% rename from studio_functions/Functions/EStudio/f_get_default_fontsize.m rename to studio_functions/Functions/EStudio/EEG Tab/f_get_default_fontsize.m index bb0af327..3e611376 --- a/studio_functions/Functions/EStudio/f_get_default_fontsize.m +++ b/studio_functions/Functions/EStudio/EEG Tab/f_get_default_fontsize.m @@ -1,5 +1,10 @@ +%%This function is to set the default fontsize for ERP wave viewer on different platforms - +%Author: Guanghui ZHANG && Steve Luck +%Center for Mind and Brain +%University of California, Davis +%Davis, CA, USA +% 2023 function FonsizeDefault = f_get_default_fontsize() @@ -9,7 +14,7 @@ FonsizeDefault = 12; elseif isunix % Code to run on Linux platform - FonsizeDefault = 9; + FonsizeDefault = 8.5; elseif ispc % Code to run on Windows platform FonsizeDefault = 9; diff --git a/studio_functions/Functions/EStudio/EEG Tab/f_ploteeg.m b/studio_functions/Functions/EStudio/EEG Tab/f_ploteeg.m new file mode 100644 index 00000000..0050aaa3 --- /dev/null +++ b/studio_functions/Functions/EStudio/EEG Tab/f_ploteeg.m @@ -0,0 +1,71 @@ + +%%This function is to manually detect segememnts with artifats for +%%continuous or epoched EEG + + +% FORMAT : [EEG, eegcom] = f_ploteeg(EEG,mflag) + +%INPUTS: +% +% EEG - structure array of EEG structures (EEGsets) +% mflag - flag value between 1 to 8 to be marked when an artifact is +% found.(1 value) for epoched EEG + + +% *** This function is part of ERPLAB Studio *** +% Author: Guanghui Zhang & Steven Luck +% ghzhang@ucdavis.edu, sjluck@ucdavis.edu +% Center for Mind and Brain +% University of California, Davis, +% Davis, CA +% Apr. 2024 + + + + +function [EEG, eegcom] = f_ploteeg(EEG,mflag) +eegcom = ''; +if nargin < 1 + help f_ploteeg + return +end + +if nargin < 2 + mflag=1; +end + + +if isempty(EEG) + msgboxText = 'Cannot handle an empty EEGset'; + title = 'ERPLAB: f_ploteeg() error'; + errorfound(msgboxText, title); + return +end +if isempty(EEG(1).data) + msgboxText = 'Cannot handle an empty EEGset'; + title = 'ERPLAB: f_ploteeg() error'; + errorfound(msgboxText, title); + return +end + +if length(EEG)>1 + msgboxText = 'Cannot handle multiple eegsets!'; + title = 'ERPLAB: f_ploteeg() error'; + errorfound(msgboxText, title); + return +end + +app = feval('EEG_select_segement_artifact_GUI',EEG,1,mflag); +waitfor(app,'Finishbutton',1); +try + EEG = app.Output; %NO you don't want to output EEG with edited channel locations, you want to output the parameters to run decoding + app.delete; %delete app from view + pause(0.1); %wait for app to leave +catch + EEG = []; + return; +end + + +eegcom = '[EEG, eegcom] = f_ploteeg(EEG);'; +end \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/EEG Tab/f_ploteegwave.m b/studio_functions/Functions/EStudio/EEG Tab/f_ploteegwave.m new file mode 100644 index 00000000..8eb1f9d3 --- /dev/null +++ b/studio_functions/Functions/EStudio/EEG Tab/f_ploteegwave.m @@ -0,0 +1,952 @@ +%%This is subfunction of the pop_ploteegset.m that is used to plot EEG wave + + +% *** This function is part of ERPLAB Studio *** +% Author: Guanghui Zhang & Steven Luck +% ghzhang@ucdavis.edu, sjluck@ucdavis.edu +% Center for Mind and Brain +% University of California, Davis, +% Davis, CA +% August 2023 + + +function errmeg = f_ploteegwave(EEG,ChanArray,ICArray,Winlength,... + AmpScale,ChanLabel,Submean,EventOnset,StackFlag,NormFlag,Startimes,... + AmpIC,bufftobo,FigOutpos,FigureName) + +errmeg = []; + +if nargin<1 + help f_ploteegwave; + return +end + +if isempty(EEG) + errmeg = 'EEG is empty'; + return; +end +%%selected channels +nbchan = EEG.nbchan; +if nargin<2 + ChanArray = 1:nbchan; +end +if ~isempty(ChanArray) &&( min(ChanArray(:)) >nbchan || max(ChanArray(:))> nbchan|| min(ChanArray(:))<=0) + ChanArray = 1:nbchan; +end + +%%selected ICs +if nargin<3 + ICArray = []; +end +if isempty(EEG.icachansind) + ICArray = []; +else + nIC = numel(EEG.icachansind); + if ~isempty(ICArray) + if min(ICArray(:))>nIC || max(ICArray(:)) > nIC || min(ICArray(:))<=0 + ICArray = []; + end + end +end + + +%%Time range that is to display (1s or 5s)? +if nargin<4 + Winlength=5; +end +if isempty(Winlength) || numel(Winlength)~=1 || min(Winlength(:))<=0 + Winlength=5; +end + +%%Vertical scale? +if nargin<5 + AmpScale = 50; +end +if isempty(AmpScale) || numel(AmpScale)~=1 || AmpScale==0 + AmpScale = 50; +end +OldAmpScale = AmpScale; + +%%channe labels (name or number) +if nargin<6 + ChanLabel = 1; +end +if ~isempty(ChanLabel) && numel(ChanLabel)~=1 + ChanLabel = ChanLabel(1); +end +if isempty(ChanLabel) || numel(ChanLabel)~=1 || (ChanLabel~=0 && ChanLabel~=1) + ChanLabel = 1; +end + +%%remove DC? +if nargin<7 + Submean = 0; +end +if ~isempty(Submean) && numel(Submean)~=1 + Submean = Submean(1); +end +if isempty(Submean) || numel(Submean)~=1 || (Submean~=0 && Submean~=1) + Submean = 0; +end + + +%%Display events? +if nargin<8 + EventOnset = 1; +end +if ~isempty(EventOnset) && numel(EventOnset)~=1 + EventOnset = EventOnset(1); +end +if isempty(EventOnset) || numel(EventOnset)~=1 || (EventOnset~=0 && EventOnset~=1) + EventOnset = 1; +end + + +%%Stack? +if nargin<9 + StackFlag = 0; +end +if ~isempty(StackFlag) && numel(StackFlag)~=1 + StackFlag = StackFlag(1); +end +if isempty(StackFlag) || numel(StackFlag)~=1 || (StackFlag~=0&&StackFlag~=1) + StackFlag = 0; +end + +%%Norm? +if nargin<10 + NormFlag = 0; +end +if ~isempty(NormFlag) && numel(NormFlag)~=1 + NormFlag = NormFlag(1); +end +if isempty(NormFlag) ||numel(NormFlag)~=1 || (NormFlag~=0 && NormFlag~=1) + NormFlag = 0; +end + +%%start time for the displayed data +if nargin < 11 + if ndims(EEG.data) ==3 + Startimes=1; + else + Startimes=0; + end +end +[ChanNum,Allsamples,tmpnb] = size(EEG.data); +Allsamples = Allsamples*tmpnb; +if ndims(EEG.data) > 2 + multiplier = size(EEG.data,2); +else + multiplier = EEG.srate; +end + +if isempty(Startimes) || Startimes<0 || Startimes>(ceil((Allsamples-1)/multiplier)-Winlength) + if ndims(EEG.data) ==3 + Startimes=1; + else + Startimes=0; + end +end + +%%VERTICAL SCALE for ICs +if nargin<12 + AmpIC = 20; +end + +if isempty(AmpIC) || numel(AmpIC)~=1 || AmpIC<=0 + AmpIC = 20; +end +OldAmpIC = AmpIC; + + +%%buffer at top and bottom +if nargin<13 + bufftobo = 100; +end +if isempty(bufftobo) || numel(bufftobo)~=1 || any(bufftobo(:)<=0) + bufftobo = 100; +end + + + + +if nargin <14 + FigOutpos = []; +end +if numel(FigOutpos)~=2 + FigOutpos = []; +end + +if nargin<15 + FigureName = ''; +end + +if isempty(FigureName) + FigureName ='none'; +end + +if isempty(EEG.setname) || strcmp(EEG.setname,'') + EEG.setname = 'still_not_saved!'; +end +if isempty(EEG.setname) + fname = 'none'; +else + [pathstr, fname, ext] = fileparts(EEG.setname); +end + +% FigbgColor = [1 1 1]; +extfig =''; +[pathstrfig, FigureName, extfig] = fileparts(FigureName) ; + +if isempty(FigureName) + fig_gui= figure('Name',['<< ' fname ' >> '],... + 'NumberTitle','on','color',[1 1 1]); + % fig_gui_wave = subplot(Numrows+1,1,[2:Numrows+1]); + hbig= axes('Parent',fig_gui,'Box','on','FontWeight','normal', 'XTick', [], 'YTick', []); + hold on +end + +if ~isempty(FigureName) + fig_gui= figure('Name',['<< ' FigureName ' >> '],... + 'NumberTitle','on','color',[1 1 1]); + hbig= axes('Parent',fig_gui,'Color','none','Box','on','FontWeight','normal', 'XTick', [], 'YTick', []); + hold on; +end +% drawnow; +try + Pos = hbig.Position; + hbig.Position = [Pos(1)*0.5,Pos(2)*0.95,Pos(3)*1.15,Pos(4)*0.95]; + outerpos = fig_gui.OuterPosition; + higpos = hbig.Position; + set(fig_gui,'outerposition',[1,1,(1.1/higpos(3))*FigOutpos(1) (1.1/higpos(4))*FigOutpos(2)]) +catch + set(fig_gui,'outerposition',get(0,'screensize'));%%Maximum figure +end + +if ~isempty(extfig) + set(fig_gui,'visible','off'); +end +set(fig_gui, 'Renderer', 'painters');%%vector figure + + +%%determine the time range that will be dispalyed +lowlim = round(Startimes*multiplier+1); +highlim = round(min((Startimes+Winlength)*multiplier+1,Allsamples)); + + +%%--------------------prepare event array if any -------------------------- +Events = EEG.event; +if ~isempty(Events) + if ~isfield(Events, 'type') || ~isfield(Events, 'latency'), Events = []; end +end +if ~isempty(Events) + if ischar(Events(1).type) + [Eventtypes tmpind indexcolor] = unique_bc({Events.type}); % indexcolor countinas the event type + else [Eventtypes tmpind indexcolor] = unique_bc([ Events.type ]); + end + Eventcolors = { 'r', [0 0.8 0], 'm', 'c', 'k', 'b', [0 0.8 0] }; + Eventstyle = { '-' '-' '-' '-' '-' '-' '-' '--' '--' '--' '--' '--' '--' '--'}; + Eventwidths = [ 2.5 1 ]; + Eventtypecolors = Eventcolors(mod([1:length(Eventtypes)]-1 ,length(Eventcolors))+1); + Eventcolors = Eventcolors(mod(indexcolor-1 ,length(Eventcolors))+1); + Eventtypestyle = Eventstyle (mod([1:length(Eventtypes)]-1 ,length(Eventstyle))+1); + Eventstyle = Eventstyle (mod(indexcolor-1 ,length(Eventstyle))+1); + + % for width, only boundary events have width 2 (for the line) + % ----------------------------------------------------------- + indexwidth = ones(1,length(Eventtypes))*2; + if iscell(Eventtypes) + for index = 1:length(Eventtypes) + if strcmpi(Eventtypes{index}, 'boundary'), indexwidth(index) = 1; end + end + else + % if option_boundary99 + % indexwidth = [ Eventtypes == -99 ]; + % end + end + Eventtypewidths = Eventwidths (mod(indexwidth([1:length(Eventtypes)])-1 ,length(Eventwidths))+1); + Eventwidths = Eventwidths (mod(indexwidth(indexcolor)-1 ,length(Eventwidths))+1); + + % latency and duration of events + % ------------------------------ + Eventlatencies = [ Events.latency ]+1; + if isfield(Events, 'duration') + durations = { Events.duration }; + durations(cellfun(@isempty, durations)) = { NaN }; + Eventlatencyend = Eventlatencies + [durations{:}]+1; + else Eventlatencyend = []; + end + % EventOnset = 1; +end + +if isempty(Events) + EventOnset = 0; +end + +chanNum = numel(ChanArray); + +%%-------------------------------IC and original data---------------------- +dataica = []; chaNum = 0; +if ~isempty(ICArray) + ICdispFlag=1; + if ~isempty(EEG.icaweights) && ~isempty(ICArray)%%pop_eegplot from eeglab + tmpdata = eeg_getdatact(EEG, 'component', [1:size(EEG.icaweights,1)]); + try + dataica = tmpdata(ICArray,:); + catch + dataica = tmpdata(:,:); + ICArray = [1:size(tmpdata,1)]; + end + end +else + ICdispFlag=0; +end + +if ~isempty(ChanArray) + EEGdispFlag=1; + dataeeg = EEG.data(ChanArray,:); + chaNum = numel(ChanArray); +else + dataeeg =[]; + EEGdispFlag=0; + chaNum = 0; +end + +%%---------------------------Normalize------------------------------------- +if NormFlag==1 + %%Norm for origanal + % data2 = []; + if ~isempty(dataeeg) + datastd = std(dataeeg(:,1:min(1000,Allsamples)),[],2);% + for i = 1:size(dataeeg,1) + dataeeg(i,:,:) = dataeeg(i,:,:)/datastd(i); + % if ~isempty(data2) + % data2(i,:,:) = data2(i,:,:)*datastd(i); + % end + end + end + + %%norm for IC data + if ~isempty(dataica) + dataicstd = std(dataica(:,1:min(1000,Allsamples)),[],2); + for i = 1:size(dataica,1) + dataica(i,:,:) = dataica(i,:,:)/dataicstd(i); + % if ~isempty(data2) + % data2(i,:,:) = data2(i,:,:)*dataicstd(i); + % end + end + end +end + +% Removing DC for IC data? +% ------------------------- +meandataica =[];ICNum = 0; +if ICdispFlag==1 + if ~isempty(EEG.icaweights) && ~isempty(ICArray) && ~isempty(dataica)%%pop_eegplot from eeglab + switch Submean % subtract the mean ? + case 1 + meandataica = mean(dataica(:,lowlim:highlim)'); + if any(isnan(meandataica)) + meandataica = nan_mean(dataica(:,lowlim:highlim)'); + end + otherwise, meandataica = zeros(1,numel(ICArray)); + end + end + ICNum = numel(ICArray); +else + ICNum = 0; +end + +% Removing DC for original data? +% ------------------------- +meandata = []; +if EEGdispFlag==1 && ~isempty(dataeeg) + switch Submean % subtract the mean ? + case 1 + meandata = mean(dataeeg(:,lowlim:highlim)'); + if any(isnan(meandata)) + meandata = nan_mean(dataeeg(:,lowlim:highlim)'); + end + otherwise, meandata = zeros(1,numel(ChanArray)); + end +end + +PlotNum = chaNum+ICNum; +if chaNum==0 && ICNum==0 + Ampscold = 0*[1:PlotNum]'; + if StackFlag==1 + Ampsc = 0*[1:PlotNum]'; + else + Ampsc = Ampscold; + end + AmpScaleold = 0; + ylims = [0 (PlotNum+1)*AmpScale]; + data = [dataeeg;dataica]; + meandata = [meandata,meandataica]; +elseif ICNum==0 && chaNum~=0 + Ampscold = AmpScale*[1:PlotNum]'; + if StackFlag==1 + Ampsc = ((Ampscold(end)+AmpScale)/2)*ones(1,PlotNum)'; + else + Ampsc = Ampscold; + end + AmpScaleold = AmpScale; + ylims = [AmpScale*(100-bufftobo)/100 PlotNum*AmpScale+AmpScale*bufftobo/100]; + data = [dataeeg;dataica]; + meandata = [meandata,meandataica]; +elseif ICNum~=0 && chaNum==0 + Ampscold = AmpIC*[1:PlotNum]'; + if StackFlag==1 + Ampsc = ((Ampscold(end)+AmpIC)/2)*ones(1,PlotNum)'; + else + Ampsc = Ampscold; + end + ylims = [AmpIC*(100-bufftobo)/100 PlotNum*AmpIC+AmpIC*bufftobo/100]; + AmpScaleold = AmpIC; + data = [dataeeg;dataica]; + meandata = [meandata,meandataica]; + AmpICNew = AmpIC; +elseif ICNum~=0 && chaNum~=0 + AmpICNew = (AmpScale*chaNum+AmpScale/2)/ICNum; + Ampscold1 = AmpICNew*[1:ICNum]'; + Ampscold2 = Ampscold1(end)+AmpScale/2+AmpScale*[1:chaNum]'; + Ampscold = [Ampscold1;Ampscold2]; + if StackFlag==1 + Ampsc = [(Ampscold1(end)/2)*ones(ICNum,1);((Ampscold2(end)+AmpScale+Ampscold2(1)+AmpIC)/2)*ones(chaNum,1)]; + else + Ampsc = Ampscold; + end + AmpScaleold = AmpScale; + ylims = [AmpICNew*(100-bufftobo)/100 Ampscold(end)+AmpScale*bufftobo/100]; + data = [dataeeg;(AmpICNew/AmpIC)*dataica]; + meandata = [meandata,(AmpICNew/AmpIC)*meandataica]; +end + + +Colorgbwave = []; +%%set the wave color for each channel +if ~isempty(data) + ColorNamergb = roundn([255 0 7;186 85 255;255 192 0;0 238 237;0 78 255;0 197 0]/255,-3); + Colorgb_chan = []; + if ~isempty(ChanArray) + chanNum = numel(ChanArray); + if chanNum<=6 + Colorgb_chan = ColorNamergb(1:chanNum,:); + else + jj = floor(chanNum/6); + Colorgb_chan = []; + for ii = 1:jj + Colorgb_chan = [Colorgb_chan; ColorNamergb]; + end + if jj*6~=chanNum + Colorgb_chan = [Colorgb_chan; ColorNamergb(1:chanNum-jj*6,:)]; + end + end + end + + %%colors for ICs + % Coloricrgb = roundn([211,211,211;169,169,16;128,128,128]/255,-3);three levels for gray + Coloricrgb = roundn([180 0 0;127 68 127;228 88 44;15 175 175;0 0 0;9 158 74]/255,-3); + Colorgb_IC = []; + if ~isempty(ICArray) + ICNum = numel(ICArray); + if ICNum<7 + Colorgb_IC = Coloricrgb(1:ICNum,:); + else + jj = floor(ICNum/6); + for ii = 1:jj + Colorgb_IC = [Colorgb_IC; Coloricrgb]; + end + + if jj*6~=ICNum + Colorgb_IC = [Colorgb_IC; Coloricrgb(1:ICNum-jj*6,:)]; + end + + end + end + Colorgbwave = [Colorgb_chan;Colorgb_IC]; +end + + +PlotNum =0; +if ICdispFlag==1 && EEGdispFlag==1 + if ~isempty(EEG.icaweights) && ~isempty(ICArray) + PlotNum = chanNum +numel(ICArray); + else + PlotNum = chanNum; + end +elseif ICdispFlag==0 && EEGdispFlag==1 + PlotNum = chanNum; +elseif ICdispFlag==1 && EEGdispFlag==0 + if ~isempty(EEG.icaweights) && ~isempty(ICArray) + PlotNum = numel(ICArray); + end +end +%% +EventOnsetdur =1; +Trialstag = size(EEG.data,2); +GapSize = ceil(numel([lowlim:highlim])/40); +if GapSize<=2 + GapSize=5; +end +% ------------------------------------------------------------------------- +% -------------------------draw events if any------------------------------ +% ------------------------------------------------------------------------- + +FonsizeDefault = f_get_default_fontsize(); +if isempty(FonsizeDefault) || numel(FonsizeDefault)~=1|| any(FonsizeDefault(:)<=0) + FonsizeDefault=10; +end + +if EventOnset==1 && ~isempty(data) + MAXEVENTSTRING = 75; + if MAXEVENTSTRING<0 + MAXEVENTSTRING = 0; + elseif MAXEVENTSTRING>75 + MAXEVENTSTRING=75; + end + % AXES_POSITION = [0.0964286 0.15 0.842 0.75-(MAXEVENTSTRING-5)/100]; + % + + % find event to plot + % ------------------ + event2plot = find ( Eventlatencies >=lowlim & Eventlatencies <= highlim ); + if ~isempty(Eventlatencyend) + event2plot2 = find ( Eventlatencyend >= lowlim & Eventlatencyend <= highlim ); + event2plot3 = find ( Eventlatencies < lowlim & Eventlatencyend > highlim ); + event2plot = setdiff(union(event2plot, event2plot2), event2plot3); + end + for index = 1:length(event2plot) + %Just repeat for the first one + if index == 1 + EVENTFONT = [' \fontsize{',num2str(FonsizeDefault),'} ']; + end + + % draw latency line + % ----------------- + if ndims(EEG.data)==2 + tmplat = Eventlatencies(event2plot(index))-lowlim-1; + else + % ----------------- + tmptaglat = [lowlim:highlim]; + tmpind = find(mod(tmptaglat-1,Trialstag) == 0); + tmpind = setdiff(tmpind,[1,numel(tmptaglat)]); + alltaglat = setdiff(tmptaglat(tmpind),[1,tmptaglat(end)]); + %%add gap between epochs if any + if ~isempty(tmpind) && ~isempty(alltaglat) %%two or multiple epochs were displayed + if length(alltaglat)==1 + if Eventlatencies(event2plot(index)) >= alltaglat + Singlat = Eventlatencies(event2plot(index))+GapSize; + else + Singlat = Eventlatencies(event2plot(index)); + end + else + if Eventlatencies(event2plot(index)) < alltaglat(1)%%check the first epoch + Singlat = Eventlatencies(event2plot(index)); + else%%the other epochs + for ii = 2:length(alltaglat) + if Eventlatencies(event2plot(index)) >= alltaglat(ii-1) && Eventlatencies(event2plot(index)) < alltaglat(ii) + Singlat = Eventlatencies(event2plot(index))+GapSize*(ii-1); + break; + elseif Eventlatencies(event2plot(index)) >= alltaglat(end) %%check the last epoch + Singlat = Eventlatencies(event2plot(index))+GapSize*length(alltaglat); + break; + end + end + end + end + tmplat = Singlat-lowlim;%%adjust the latency if any + else%%within one epoch + tmplat = Eventlatencies(event2plot(index))-lowlim;%-1; + end + + end + tmph = plot(hbig, [ tmplat tmplat ], ylims, 'color', Eventcolors{ event2plot(index) }, ... + 'linestyle', Eventstyle { event2plot(index) }, ... + 'linewidth', Eventwidths( event2plot(index) ) ); + + % schtefan: add Event types text above event latency line + % ------------------------------------------------------- + evntxt = strrep(num2str(Events(event2plot(index)).type),'_','-'); + if length(evntxt)>MAXEVENTSTRING, evntxt = [ evntxt(1:MAXEVENTSTRING-1) '...' ]; end % truncate + try, + if tmplat>=0 + tmph2 = text(hbig, [tmplat], ylims(2)-0.005, [EVENTFONT evntxt], ... + 'color', Eventcolors{ event2plot(index) }, ... + 'horizontalalignment', 'left',... + 'rotation',90,'FontSize',FonsizeDefault); + end + catch, end + + % draw duration is not 0 + % ---------------------- + % if EventOnsetdur && ~isempty(Eventlatencyend) ... + % && Eventwidths( event2plot(index) ) ~= 2.5 % do not plot length of boundary events + % tmplatend = Eventlatencyend(event2plot(index))-lowlim-1; + % if tmplatend ~= 0 + % tmplim = ylims; + % tmpcol = Eventcolors{ event2plot(index) }; + % h = patch(hbig, [ tmplat tmplatend tmplatend tmplat ], ... + % [ tmplim(1) tmplim(1) tmplim(2) tmplim(2) ], ... + % tmpcol ); % this argument is color + % set(h, 'EdgeColor', 'none') + % end + % end + end +else % JavierLC + MAXEVENTSTRING = 10; % default + % AXES_POSITION = [0.0964286 0.15 0.842 0.75-(MAXEVENTSTRING-5)/100]; +end + + +if StackFlag==1 + AmpScale=0; +end +DEFAULT_GRID_SPACING =Winlength/5; + +% ------------------------------------------------------------------------- +% -----------------draw EEG wave if any------------------------------------ +% ------------------------------------------------------------------------- +leftintv = []; +%%Plot continuous EEG +tmpcolor = [ 0 0 0.4 ]; +if EEG.trials==1 + if ~isempty(data) && PlotNum~=0 + + for ii = size(data,1):-1:1 + try + plot(hbig, (data(ii,lowlim:highlim)+ Ampsc(size(data,1)-ii+1)-meandata(ii))' , ... + 'color', Colorgbwave(ii,:), 'clipping','on','LineWidth',0.5);%% + catch + plot(hbig, (data(ii,lowlim:highlim)+ Ampsc(size(data,1)-ii+1)-meandata(ii))', ... + 'color', tmpcolor, 'clipping','on','LineWidth',0.5);%% + end + end + set(hbig,'TickDir', 'in','LineWidth',1); + %%xtick + AmpScale = OldAmpScale; + set(hbig, 'Xlim',[1 Winlength*multiplier+1],... + 'XTick',[1:multiplier*DEFAULT_GRID_SPACING:Winlength*multiplier+1]); + set(hbig, 'XTickLabel', num2str((Startimes:DEFAULT_GRID_SPACING:Startimes+Winlength)'),'FontSize',FonsizeDefault); + %% + %%-----------------plot scale------------------ + leftintv = Winlength*multiplier+1; + else + set(hbig, 'XTick', [], 'YTick', [],'Box','off', 'Color','none','xcolor','none','ycolor','none'); + end +end + +%%------------------------------plot single-trial EEG---------------------- +%%Thanks for the eeglab developers so that we can borrow their codes +isfreq = 0; +Limits = [EEG.times(1),EEG.times(end)]; +Srate = EEG.srate; +Freqlimits = []; +if EEG.trials>1 + if ~isempty(data) && PlotNum~=0 + + % plot trial limits + % ----------------- + tmptag = [lowlim:highlim]; + tmpind = find(mod(tmptag-1,Trialstag) == 0); + % for index = tmpind + % plot(ax0, [tmptag(index)-lowlim tmptag(index)-lowlim], [0 1], 'b--'); + % end + alltag = tmptag(tmpind); + if isempty(tmpind) + epochNum = 0; + else + epochNum = numel(setdiff(tmpind,[0 1 numel(tmptag)])); + end + % compute epoch number + % -------------- + alltag1 = alltag; + if ~isempty(tmpind) + tagnum = (alltag1-1)/Trialstag+1; + for ii = 1:numel(tmpind) + alltag1(ii) = alltag1(ii)+(ii-1)*GapSize; + end + % set(hbig1,'XTickLabel', tagnum,'YTickLabel', [],... + % 'Xlim',[1 (Winlength*multiplier+epochNum*GapSize)],... + % 'XTick',alltag-lowlim+Trialstag/2, 'YTick',[],'xaxislocation', 'top'); + for ii = 1:numel(tagnum) + text(hbig, [alltag1(ii)-lowlim+Trialstag/2],ylims(2)+1.1, [32,num2str(tagnum(ii))], ... + 'color', 'k','FontSize',FonsizeDefault, ... + 'horizontalalignment', 'left','rotation',90); %% + set(hbig,'Xlim',[1 (Winlength*multiplier+epochNum*GapSize)]); + end + end + + %%add the gap between epochs if any + Epochintv = []; + + if ~isempty(tmpind) + if (numel(tmpind)==1 && tmpind(end) == numel(tmptag)) || (numel(tmpind)==1 && tmpind(1) == 1) + dataplot = data(:,lowlim:highlim); + Epochintv(1,1) =1; + Epochintv(1,2) =numel(lowlim:highlim); + else + tmpind = unique(setdiff([0,tmpind, numel(tmptag)],1)); + dataplotold = data(:,lowlim:highlim); + dataplot_new = []; + for ii = 2:numel(tmpind) + GapLeft = tmpind(ii-1)+1; + GapRight = tmpind(ii); + if GapLeft<1 + GapLeft =1; + end + if GapRight > numel(tmptag) + GapRight = numel(tmptag); + end + dataplot_new = [dataplot_new,dataplotold(:,GapLeft:GapRight),nan(size(dataplotold,1),GapSize)]; + Epochintv(ii-1,1) = GapLeft+(ii-2)*GapSize; + Epochintv(ii-1,2) = GapRight+(ii-2)*GapSize; + end + if ~isempty(dataplot_new) + dataplot = dataplot_new; + else + dataplot = dataplotold; + end + end + end + + %%-----------plot background color for trias with artifact--------- + %%highlight waves with labels + Value_adjust = floor(Startimes+1); + if Value_adjust<1 + Value_adjust=1; + end + tagnum = unique([Value_adjust,tagnum]); + + try trialsMakrs = EEG.reject.rejmanual(tagnum);catch trialsMakrs = zeros(1,numel(tagnum)) ; end + try trialsMakrschan = EEG.reject.rejmanualE(:,tagnum);catch trialsMakrschan = zeros(EEG.nbchan,numel(tagnum)) ; end + tmpcolsbgc = [1 1 0.783]; + if ~isempty(Epochintv) %%&& chaNum~=0 + for jj = 1:size(Epochintv,1) + [xpos,~]=find(trialsMakrschan(:,jj)==1); + if jj<= numel(trialsMakrs) && ~isempty(xpos) + if trialsMakrs(jj)==1 + patch(hbig,[Epochintv(jj,1),Epochintv(jj,2),Epochintv(jj,2),Epochintv(jj,1)],... + [ylims(1),ylims(1),ylims(end),ylims(end)],tmpcolsbgc,'EdgeColor','none','FaceAlpha',.5); + %%highlight the wave if the channels that were + %%marked as artifacts + if chaNum~=0 + ChanArray = reshape(ChanArray,1,numel(ChanArray)); + [~,ypos1]=find(ChanArray==xpos); + if ~isempty(ypos1) + for kk = 1:numel(ypos1) + dataChan = nan(1,size(dataplot,2)); + dataChan (Epochintv(jj,1):Epochintv(jj,2)) = dataplot(ypos1(kk),Epochintv(jj,1):Epochintv(jj,2)); + dataChan1= nan(1,size(dataplot,2)); + dataChan1 (1,Epochintv(jj,1):Epochintv(jj,1)) = dataplot(ypos1(kk),Epochintv(jj,1):Epochintv(jj,1)); + try + plot(hbig, (dataChan+ Ampsc(size(dataplot,1)-ypos1(kk)+1)-meandata(ypos1(kk)))', ... + 'color', Colorgbwave(ypos1(kk),:), 'clipping','on','LineWidth',1.5);%% + plot(hbig, (dataChan1+ Ampsc(size(dataplot,1)-ypos1(kk)+1)-meandata(ypos1(kk)))' , ... + 'color', Colorgbwave(ypos1(kk),:), 'clipping','on','LineWidth',1.5,'Marker' ,'s','MarkerSize',8,... + 'MarkerEdgeColor',Colorgbwave(ypos1(kk),:),'MarkerFaceColor',Colorgbwave(ypos1(kk),:));%% + catch + plot(hbig, (dataChan+ Ampsc(size(dataplot,1)-ypos1(kk)+1)-meandata(ypos1(kk)))', ... + 'color', tmpcolor, 'clipping','on','LineWidth',1.5);%% + plot(hbig, (dataChan1+ Ampsc(size(dataplot,1)-ypos1(kk)+1)-meandata(ypos1(kk)))', ... + 'color', tmpcolor, 'clipping','on','LineWidth',1.5,'Marker' ,'s','MarkerSize',8,... + 'MarkerEdgeColor',Colorgbwave(ypos1(kk),:),'MarkerFaceColor',Colorgbwave(ypos1(kk),:));%% + end + end + end + end + end + end + end + end + + for ii = size(dataplot,1):-1:1 + try + plot(hbig, (dataplot(ii,:)+ Ampsc(size(dataplot,1)-ii+1)-meandata(ii))', ... + 'color', Colorgbwave(ii,:), 'clipping','on','LineWidth',0.5);%% + catch + plot(hbig, (dataplot(ii,:)+ Ampsc(size(dataplot,1)-ii+1)-meandata(ii))', ... + 'color', tmpcolor, 'clipping','on','LineWidth',0.5);%% + end + end + + %------------------------Xticks------------------------------------ + tagpos = []; + tagtext = []; + if ~isempty(alltag) + alltag = [alltag(1)-Trialstag alltag alltag(end)+Trialstag]; % add border trial limits + else + alltag = [ floor(lowlim/Trialstag)*Trialstag ceil(highlim/Trialstag)*Trialstag ]+1; + end + + nbdiv = 20/Winlength; % approximative number of divisions + divpossible = [ 100000./[1 2 4 5] 10000./[1 2 4 5] 1000./[1 2 4 5] 100./[1 2 4 5 10 20]]; % possible increments + [tmp indexdiv] = min(abs(nbdiv*divpossible-(Limits(2)-Limits(1)))); % closest possible increment + incrementpoint = divpossible(indexdiv)/1000*Srate; + + % tag zero below is an offset used to be sure that 0 is included + % in the absicia of the data epochs + if Limits(2) < 0, tagzerooffset = (Limits(2)-Limits(1))/1000*Srate+1; + else tagzerooffset = -Limits(1)/1000*Srate; + end + if tagzerooffset < 0, tagzerooffset = 0; end + + for i=1:length(alltag)-1 + if ~isempty(tagpos) && tagpos(end)-alltag(i)<2*incrementpoint/3 + tagpos = tagpos(1:end-1); + end + if ~isempty(Freqlimits) + tagpos = [ tagpos linspace(alltag(i),alltag(i+1)-1, nbdiv) ]; + else + if tagzerooffset ~= 0 + tmptagpos = [alltag(i)+tagzerooffset:-incrementpoint:alltag(i)]; + else + tmptagpos = []; + end + tagpos = [ tagpos [tmptagpos(end:-1:2) alltag(i)+tagzerooffset:incrementpoint:(alltag(i+1)-1)]]; + end + end + + % find corresponding epochs + % ------------------------- + if ~isfreq + tmplimit = Limits; + tpmorder = 1E-3; + else + tmplimit =Freqlimits; + tpmorder = 1; + end + tagtext = eeg_point2lat(tagpos, floor((tagpos)/Trialstag)+1, Srate, tmplimit,tpmorder); + + %%adjust xticks + EpochFlag = floor((tagpos)/Trialstag)+1;%% + + EpochFlag = reshape(EpochFlag,1,numel(EpochFlag)); + xtickstr = tagpos-lowlim+1; + [xpos,ypos] = find(xtickstr>0); + if ~isempty(ypos) + EpochFlag =EpochFlag(ypos); + xtickstr = xtickstr(ypos); + tagtext = tagtext(ypos); + end + + EpochFlagunique =unique(setdiff(EpochFlag,0)); + if numel(EpochFlagunique)~=1 + for ii = 2:numel(EpochFlagunique) + [xpos,ypos]= find(EpochFlag==EpochFlagunique(ii)); + if ~isempty(ypos) + xtickstr(ypos) = xtickstr(ypos)+(EpochFlagunique(ii)-EpochFlagunique(1))*GapSize;%*(1000/Srate); + end + end + end + set(hbig,'XTickLabel', tagtext,... + 'Xlim',[1 (Winlength*multiplier+epochNum*GapSize)],... + 'XTick',xtickstr,... + 'FontWeight','normal',... + 'xaxislocation', 'bottom','FontSize',FonsizeDefault); + XTickLabel = cellstr(hbig.XTickLabel); + for Numofxtick = 1:length(XTickLabel) + if strcmpi(XTickLabel{Numofxtick,:},'-0') + XTickLabel{Numofxtick} = '0'; + end + end + set(hbig,'XTickLabel',XTickLabel); + %% + %%-----------------plot scale------------------ + leftintv = (Winlength*multiplier+epochNum*GapSize); + else + set(hbig, 'XTick', [], 'YTick', [],'Box','off', 'Color','none','xcolor','none','ycolor','none'); + end +end + +%% +%%-----------------plot y scale------------------ +if ~isempty(data) && PlotNum~=0 && ~isempty(leftintv) + ytick_bottom = hbig.TickLength(1)*diff(hbig.XLim); + leftintv = leftintv+ytick_bottom*2.5; + rightintv = leftintv; + if ICdispFlag~=0 + line(hbig,[leftintv,rightintv],[ylims(1) AmpICNew+ylims(1)],'color','k','LineWidth',1, 'clipping','off'); + line(hbig,[leftintv-ytick_bottom,rightintv+ytick_bottom],[ylims(1) ylims(1)],'color','k','LineWidth',1, 'clipping','off'); + line(hbig,[leftintv-ytick_bottom,rightintv+ytick_bottom],[AmpICNew+ylims(1) AmpICNew+ylims(1)],'color','k','LineWidth',1, 'clipping','off'); + text(hbig,leftintv,((ylims(2)-ylims(1))/43+AmpICNew+ylims(1)), [num2str(AmpIC),32,'\muV'],'HorizontalAlignment', 'center','FontSize',FonsizeDefault); + text(hbig,leftintv,((ylims(2)-ylims(1))/20+AmpICNew+ylims(1)), ['ICs'],'HorizontalAlignment', 'center','FontSize',FonsizeDefault); + end + if EEGdispFlag~=0 + line(hbig,[leftintv,rightintv],[ylims(end)-OldAmpScale ylims(end)],'color','k','LineWidth',1, 'clipping','off'); + line(hbig,[leftintv-ytick_bottom,rightintv+ytick_bottom],[ylims(end)-OldAmpScale ylims(end)-OldAmpScale],'color','k','LineWidth',1, 'clipping','off'); + line(hbig,[leftintv-ytick_bottom,rightintv+ytick_bottom],[ylims(end) ylims(end)],'color','k','LineWidth',1, 'clipping','off'); + text(hbig,leftintv,(ylims(2)-ylims(1))/43+ylims(end), [num2str(OldAmpScale),32,'\muV'],'HorizontalAlignment', 'center','FontSize',FonsizeDefault); + text(hbig,leftintv,(ylims(2)-ylims(1))/20+ylims(end), ['Chans'],'HorizontalAlignment', 'center','FontSize',FonsizeDefault); + end + + + %%ytick ticklabels + if chaNum==0 + ChanArray = []; + end + set(hbig, 'ylim',[ylims(1) ylims(end)],'YTick',[ylims(1) Ampscold']); + [YLabels,chaName,ICName] = f_eeg_read_chan_IC_names(EEG.chanlocs,ChanArray,ICArray,ChanLabel); + YLabels = flipud(char(YLabels,'')); + set(hbig,'YTickLabel',cellstr(YLabels),... + 'TickLength',[.005 .005],... + 'Color','none',... + 'XColor','k',... + 'YColor','k',... + 'FontWeight','normal',... + 'TickDir', 'in',... + 'LineWidth',0.5,'FontSize',FonsizeDefault);%%,'HorizontalAlignment','center' + count=0; + for ii = length(hbig.YTickLabel):-1:2 + count = count+1; + hbig.YTickLabel{ii} = ['\color[rgb]{',num2str(Colorgbwave(count,:)),'}', strrep(hbig.YTickLabel{ii},'_','\_')]; + end +end + +set(gcf,'color',[1 1 1]); +prePaperType = get(fig_gui,'PaperType'); +prePaperUnits = get(fig_gui,'PaperUnits'); +preUnits = get(fig_gui,'Units'); +prePaperPosition = get(fig_gui,'PaperPosition'); +prePaperSize = get(fig_gui,'PaperSize'); +% Make changing paper type possible +set(fig_gui,'PaperType',''); + +% Set units to all be the same +set(fig_gui,'PaperUnits','inches'); +set(fig_gui,'Units','inches'); +% Set the page size and position to match the figure's dimensions +paperPosition = get(fig_gui,'PaperPosition'); +position = get(fig_gui,'Position'); +set(fig_gui,'PaperPosition',[0,0,position(3:4)]); +set(fig_gui,'PaperSize',position(3:4)); + +%%save figure with different formats +if ~isempty(extfig) + [C_style,IA_style] = ismember_bc2(extfig,{'.pdf','.svg','.jpg','.png','.tif','.bmp','.eps'}); + figFileName = fullfile(pathstrfig,FigureName); + try + switch IA_style + case 1 + print(fig_gui,'-dpdf',figFileName); + case 2 + print(fig_gui,'-dsvg',figFileName); + case 3 + print(fig_gui,'-djpeg',figFileName); + case 4 + print(fig_gui,'-dpng',figFileName); + + case 5 + print(fig_gui,'-dtiff',figFileName); + case 6 + print(fig_gui,'-dbmp',figFileName); + case 7 + print(fig_gui,'-depsc',figFileName); + otherwise + print(fig_gui,'-dpdf',figFileName); + end + catch + print(fig_gui,'-dpdf',figFileName); + end +end +return; \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/EEG Tab/f_preparms_eegwaviewer.m b/studio_functions/Functions/EStudio/EEG Tab/f_preparms_eegwaviewer.m new file mode 100755 index 00000000..d1ede027 --- /dev/null +++ b/studio_functions/Functions/EStudio/EEG Tab/f_preparms_eegwaviewer.m @@ -0,0 +1,269 @@ +%%this function is used to call back the parameters for plotting EEG wave + +% *** This function is part of EStudio Toolbox *** +% Author: Guanghui Zhang & Steven Luck +% Center for Mind and Brain +% University of California, Davis, +% Davis, CA +% 2023 && 2024 + +function OutputViewerpareeg = f_preparms_eegwaviewer(EEG,matlabfig,History,figureName) + +OutputViewerpareeg = ''; +if nargin<1 + help f_preparms_eegwaviewer(); + return +end +if isempty(EEG) + disp('f_preparms_eegwaviewer(): EEG is empty'); + return; +end + +if nargin<3 + History = 'gui'; +end + +if nargin <2 + matlabfig=1; +end +if nargin <4 + figureName = ''; +end + +%%channel array and IC array +%channels +ChanArray = estudioworkingmemory('EEG_ChanArray'); +nbchan = EEG.nbchan; +if isempty(ChanArray) || any(ChanArray(:)>nbchan) || any(ChanArray(:)<=0) + ChanArray = 1:nbchan; + estudioworkingmemory('EEG_ChanArray',ChanArray); +end + +EEG_plotset = estudioworkingmemory('EEG_plotset'); +ChanArray = reshape(ChanArray,1,[]); +try + chanOrder = EEG_plotset{10}; + if chanOrder==2 + if isfield(EEG,'chanlocs') && ~isempty(EEG.chanlocs) + chanindexnew = f_estudio_chan_frontback_left_right(EEG.chanlocs(ChanArray)); + if ~isempty(chanindexnew) + ChanArray = ChanArray(chanindexnew); + end + end + elseif chanOrder==3 + [eloc, labels, theta, radius, indices] = readlocs(EEG.chanlocs); + chanorders = EEG_plotset{11}; + chanorderindex = chanorders{1}; + chanorderindex1 = unique(chanorderindex,'stable'); + chanorderlabels = chanorders{2}; + [C,IA]= ismember_bc2(chanorderlabels,labels); + Chanlanelsinst = labels(ChanArray); + if ~any(IA==0) && numel(chanorderindex1) == length(labels) + [C,IA1]= ismember_bc2(Chanlanelsinst,chanorderlabels); + [C,IA2]= ismember_bc2(Chanlanelsinst,labels); + ChanArray = IA1(IA2); + end + end +catch +end + + +%%ICs +ICArray = estudioworkingmemory('EEG_ICArray'); +if isempty(EEG.icachansind) + ICArray = []; + estudioworkingmemory('EEG_ICArray',[]); +else + nIC = numel(EEG.icachansind); + if isempty(ICArray) || any(ICArray(:)>nIC) || any(ICArray(:)<=0) + ICArray = []; + estudioworkingmemory('EEG_ICArray',ICArray); + end +end + +%%Plot setting +EEG_plotset = estudioworkingmemory('EEG_plotset'); +if isempty(EEG_plotset) + EEGdisp = 1; + ICdisp = 0; + Winlength = 5;%%in second + AmpScale = 50; + ChanLabel = 1; + Submean=0; + EventOnset = 1; + StackFlag = 0; + NormFlag = 0; + AmpScale_ic=20; + buffer_topo_bottom = 100; +else + %%diaply original data? + try + EEGdisp = EEG_plotset{1}; + catch + EEGdisp = 1; + end + if isempty(EEGdisp) || (EEGdisp~=0 && EEGdisp~=1) + EEGdisp = 1; + end + + %%display ICs? + try + ICdisp = EEG_plotset{2}; + catch + ICdisp = 0; + end + if isempty(ICdisp) || (ICdisp~=0 && ICdisp~=1) + ICdisp = 0; + end + + %%Time range? + try + Winlength = EEG_plotset{3}; + catch + Winlength = 5; + end + if isempty(Winlength) || numel(Winlength)~=1 || min(Winlength(:))<=0 + Winlength=5; + end + + + %%Vertical scale for original data? + try + AmpScale = EEG_plotset{4}; + catch + AmpScale = 50; + end + if isempty(AmpScale) || numel(AmpScale)~=1 || AmpScale<=0 + AmpScale = 50; + end + + %%Vertical scale for IC data? + try + AmpScale_ic = EEG_plotset{5}; + catch + AmpScale_ic = 20; + end + if isempty(AmpScale_ic) || numel(AmpScale_ic)~=1 || AmpScale_ic<=0 + AmpScale_ic = 20; + end + + %%Channel labels? (1 is name, 0 is number) + try + ChanLabel = EEG_plotset{5}; + catch + ChanLabel = 1; + end + if isempty(ChanLabel) || numel(ChanLabel)~=1 || (ChanLabel~=0 && ChanLabel~=1) + ChanLabel = 1; + end + + %%Remove DC? (1 is "Yes", 0 is "no") + try + Submean = EEG_plotset{6}; + catch + Submean = 0; + end + if isempty(Submean) || numel(Submean)~=1 || (Submean~=0 && Submean~=1) + Submean = 0; + end + + %%Display events? + try + EventOnset = EEG_plotset{7}; + catch + EventOnset = 1; + end + if isempty(EventOnset) || numel(EventOnset)~=1 || (EventOnset~=0 && EventOnset~=1) + EventOnset = 1; + end + + + %%Stack? + try + StackFlag = EEG_plotset{8}; + catch + StackFlag = 0; + end + if isempty(StackFlag) || numel(StackFlag)~=1 || (StackFlag~=0&&StackFlag~=1) + StackFlag = 0; + end + + %%Norm? + try + NormFlag = EEG_plotset{9}; + catch + NormFlag = 0; + end + if isempty(NormFlag) ||numel(NormFlag)~=1 || (NormFlag~=0 && NormFlag~=1) + NormFlag = 0; + end + + %%buffer at top and bottom + try + buffer_topo_bottom = EEG_plotset{12}; + catch + buffer_topo_bottom=100; + end + if isempty(buffer_topo_bottom) || numel(buffer_topo_bottom)~=1 || any(buffer_topo_bottom(:)<=0) + buffer_topo_bottom=100; + end +end + + +%%Start time to display +Startimes = estudioworkingmemory('Startimes'); +[chaNum,sampleNum,trialNum]=size(EEG.data); +Frames = sampleNum*trialNum; +if EEG.trials>1 % time in second or in trials + multiplier = size(EEG.data,2); +else + multiplier = EEG.srate; +end + +StartimesMax = max(0,ceil((Frames-1)/multiplier)-Winlength); +if ndims(EEG.data)==3 + Startimes=Startimes-1; +end +if isempty(Startimes) || numel(Startimes)~=1 || Startimes<0 ||Startimes>StartimesMax + Startimes=0; + estudioworkingmemory('Startimes',Startimes); +end + +figSize = estudioworkingmemory('egfigsize'); +if isempty(figSize) + figSize = []; +end +if ICdisp==0 + ICArray = []; +end +if isempty(ICArray) + ICdisp=0; +end + + +if matlabfig==1 + if EEGdisp==0 + ChanArray = []; + end + [EEG, eegcom] = pop_ploteegset(EEG,'ChanArray',ChanArray,'ICArray',ICArray,'Winlength',Winlength,'bufftobo',buffer_topo_bottom,... + 'Ampchan',AmpScale,'ChanLabel',ChanLabel,'Submean',Submean,'EventOnset',EventOnset,'Ampic',AmpScale_ic,... + 'StackFlag',StackFlag,'NormFlag',NormFlag,'Startimes',Startimes,'figureName',figureName,'figSize',figSize,'History',History); +else + OutputViewerpareeg{1} = ChanArray; + OutputViewerpareeg{2} = ICArray; + OutputViewerpareeg{3} =EEGdisp; + OutputViewerpareeg{4} =ICdisp; + OutputViewerpareeg{5} =Winlength; + OutputViewerpareeg{6} =AmpScale; + OutputViewerpareeg{7} =ChanLabel; + OutputViewerpareeg{8} =Submean; + OutputViewerpareeg{9} = EventOnset; + OutputViewerpareeg{10} =StackFlag; + OutputViewerpareeg{11} =NormFlag; + OutputViewerpareeg{12} =Startimes; + OutputViewerpareeg{13} = AmpScale_ic; + OutputViewerpareeg{14} = buffer_topo_bottom; + OutputViewerpareeg{15} = figSize; +end + +end \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/EEG Tab/f_redrawEEG_Wave_Viewer.m b/studio_functions/Functions/EStudio/EEG Tab/f_redrawEEG_Wave_Viewer.m new file mode 100644 index 00000000..82dae362 --- /dev/null +++ b/studio_functions/Functions/EStudio/EEG Tab/f_redrawEEG_Wave_Viewer.m @@ -0,0 +1,1984 @@ +%PURPOSE : Plot EEG waves within one axes as EEGLAB + +% Author: Guanghui Zhang & Steve J. Luck +% Center for Mind and Brain +% University of California, Davis +% Davis, CA +% 2023 + + + +function f_redrawEEG_Wave_Viewer(Axesreset) + +global observe_EEGDAT; +global EStudio_gui_erp_totl;%%Global variable +addlistener(observe_EEGDAT,'eeg_panel_change_message',@eeg_panel_change_message); +addlistener(observe_EEGDAT,'count_current_eeg_change',@count_current_eeg_change); + + +if nargin>2 + help f_redrawEEG_Wave_Viewer; + return; +end +if nargin<1 + Axesreset=0; +end + +if isempty(observe_EEGDAT.EEG) + Startimes = 0; +else + Startimes= estudioworkingmemory('Startimes'); + if isempty(Startimes) || min(Startimes)<0 + Startimes = 0; + end + EEG_plotset = estudioworkingmemory('EEG_plotset'); + try + Winlength = EEG_plotset{3}; + catch + Winlength = 5; + end + + [chaNum,sampleNum,trialNum]=size(observe_EEGDAT.EEG.data); + Frames = sampleNum*trialNum; + if observe_EEGDAT.EEG.trials>1 % time in second or in trials + multiplier = size(observe_EEGDAT.EEG.data,2); + else + multiplier = observe_EEGDAT.EEG.srate; + end + if isempty(Winlength)|| Winlength<0 || (Winlength>floor(Frames/observe_EEGDAT.EEG.srate)) + Winlength = 5; + end + StartimesMax = max(0,ceil((Frames-1)/multiplier)-Winlength); + if observe_EEGDAT.EEG.trials>1 + StartimesMax =StartimesMax+1; + end + if Startimes > StartimesMax + Startimes = StartimesMax; + end +end +if ~isempty(observe_EEGDAT.EEG) + if observe_EEGDAT.EEG.trials>1 && Startimes ==0%%for epoched EEG, it should be from the first epoch + Startimes=1; + end +end +estudioworkingmemory('Startimes',Startimes); + +%%Selected EEGsets from memory file +EEGset_selected = estudioworkingmemory('EEGArray'); +if ~isempty(observe_EEGDAT.ALLEEG) && ~isempty(observe_EEGDAT.EEG) + if isempty(EEGset_selected) || min(EEGset_selected(:)) > length(observe_EEGDAT.ALLEEG) || max(EEGset_selected(:))>length(observe_EEGDAT.ALLEEG) + EEGset_selected = length(observe_EEGDAT.ALLEEG) ; + estudioworkingmemory('EEGArray',EEGset_selected); + observe_EEGDAT.CURRENTSET = EEGset_selected; + observe_EEGDAT.EEG = observe_EEGDAT.ALLEEG(EEGset_selected); + assignin('base','EEG',observe_EEGDAT.EEG); + assignin('base','ALLEEG', observe_EEGDAT.ALLEEG); + assignin('base','CURRENTSET', observe_EEGDAT.CURRENTSET); + end + [xpos,ypos] = find(EEGset_selected==observe_EEGDAT.CURRENTSET); + if ~isempty(ypos) + pagecurrentNum = ypos; + pageNum = numel(EEGset_selected); + PageStr = observe_EEGDAT.ALLEEG(observe_EEGDAT.CURRENTSET).setname; + else + pageNum=1; + pagecurrentNum=1; + PageStr = observe_EEGDAT.EEG.setname; + end + Enableflag = 'on'; +else + pageNum=1; + pagecurrentNum=1; + PageStr = 'No EEG was loaded'; + Enableflag = 'off'; +end + +EEG_autoplot = EStudio_gui_erp_totl.EEG_autoplot; + +EStudio_gui_erp_totl.eegpageinfo_text.String=['Page',32,num2str(pagecurrentNum),'/',num2str(pageNum),':',PageStr]; +EStudio_gui_erp_totl.eegpageinfo_minus.Callback=@page_minus; +set(EStudio_gui_erp_totl.eegpageinfo_edit,'String',num2str(pagecurrentNum),'Enable','on'); +if EEG_autoplot ==0 + EStudio_gui_erp_totl.eegpageinfo_text.String='Plotting is disabled, to enable it, please go to "Plotting Options" at the bottom of the plotting area to active it.'; + Enableflag = 'off'; +end +EStudio_gui_erp_totl.eegpageinfo_edit.Callback=@page_edit; +EStudio_gui_erp_totl.eegpageinfo_plus.Callback=@page_plus; +if pageNum ==1 + Enable_minus = 'off'; + Enable_plus = 'off'; + Enable_plus_BackgroundColor = [1 1 1]; + Enable_minus_BackgroundColor = [0 0 0]; +else + if pagecurrentNum ==1 + Enable_minus = 'off'; + Enable_plus = 'on'; + Enable_plus_BackgroundColor = [0 1 0]; + Enable_minus_BackgroundColor = [0 0 0]; + elseif pagecurrentNum == pageNum + Enable_minus = 'on'; + Enable_plus = 'off'; + Enable_plus_BackgroundColor = [0 0 0]; + Enable_minus_BackgroundColor = [0 1 0]; + else + Enable_minus = 'on'; + Enable_plus = 'on'; + Enable_plus_BackgroundColor = [0 1 0]; + Enable_minus_BackgroundColor = [0 1 0]; + end +end + +if ~isempty(observe_EEGDAT.ALLEEG) && ~isempty(observe_EEGDAT.EEG) && EEG_autoplot==0 + Enable_minus = 'off'; + Enable_plus = 'off'; + EStudio_gui_erp_totl.eegpageinfo_edit.Enable = 'off'; +end + +%%----Processing for label ICs or using IClabel +EEGUpdate = estudioworkingmemory('EEGUpdate'); +if isempty(EEGUpdate) || numel(EEGUpdate)~=1 || (EEGUpdate~=0 && EEGUpdate~=1) + EEGUpdate = 0; estudioworkingmemory('EEGUpdate',0); +end +if EEGUpdate==1 + Enableflag = 'off'; + Enable_minus = 'off'; + Enable_plus = 'off'; + EStudio_gui_erp_totl.eegpageinfo_edit.Enable = 'off'; +end + + +EStudio_gui_erp_totl.eegpageinfo_minus.Enable = Enable_minus; +EStudio_gui_erp_totl.eegpageinfo_plus.Enable = Enable_plus; +EStudio_gui_erp_totl.eegpageinfo_plus.ForegroundColor = Enable_plus_BackgroundColor; +EStudio_gui_erp_totl.eegpageinfo_minus.ForegroundColor = Enable_minus_BackgroundColor; +set(EStudio_gui_erp_totl.eegpageinfo_box, 'Sizes', [-1 70 50 70] ); +set(EStudio_gui_erp_totl.eeg_zoom_in_large,'Callback',@zoomin_large,'Enable',Enableflag); +set(EStudio_gui_erp_totl.eeg_zoom_in_fivesmall,'Callback',@zoomin_fivesmall,'Enable',Enableflag); +set(EStudio_gui_erp_totl.eeg_zoom_in_small,'Callback',@zoomin_small,'Enable',Enableflag); +set(EStudio_gui_erp_totl.eeg_zoom_edit,'String',num2str(Startimes),'Enable',Enableflag); +set(EStudio_gui_erp_totl.eeg_zoom_edit,'Callback',@zoomedit,'Enable',Enableflag); +set(EStudio_gui_erp_totl.eeg_zoom_out_small,'Callback',@zoomout_small,'Enable',Enableflag); +set(EStudio_gui_erp_totl.eeg_zoom_out_fivelarge,'Callback',@zoomout_fivelarge,'Enable',Enableflag); +set(EStudio_gui_erp_totl.eeg_zoom_out_large,'Callback',@zoomout_large,'Enable',Enableflag); +if ~isempty(observe_EEGDAT.ALLEEG) && ~isempty(observe_EEGDAT.EEG) + set(EStudio_gui_erp_totl.popmemu_eeg,'Callback',@popmemu_eeg,'Enable','on','String',... + {'Plotting Options','Automatic Plotting','Window Size','Show Command','Save Figure as','Create Static/Exportable Plot'}); +else + set(EStudio_gui_erp_totl.popmemu_eeg,'Callback',@popmemu_eeg,'Enable','on','String',{'Plotting Options','Automatic Plotting','Window Size'}); +end +popmemu_eeg = EStudio_gui_erp_totl.popmemu_eeg.String; +if EEG_autoplot==1 + popmemu_eeg{2} = 'Automatic Plotting: On'; +else + popmemu_eeg{2} = 'Automatic Plotting: Off'; +end +EStudio_gui_erp_totl.popmemu_eeg.String=popmemu_eeg; + + +set(EStudio_gui_erp_totl.eeg_reset,'Callback',@eeg_paras_reset,'Enable','on'); +set(EStudio_gui_erp_totl.eeg_plot_button_title, 'Sizes', [10 40 40 40 40 40 40 40 -1 150 50 5]); + +if ~isempty(observe_EEGDAT.ALLEEG) && ~isempty(observe_EEGDAT.EEG) && EEG_autoplot==1 + EEG = observe_EEGDAT.EEG; + OutputViewereegpar = f_preparms_eegwaviewer(EEG,0); + % %%Plot the eeg waves + if ~isempty(OutputViewereegpar) + EStudio_gui_erp_totl = f_plotviewereegwave(EEG,OutputViewereegpar{1},OutputViewereegpar{2},... + OutputViewereegpar{3},OutputViewereegpar{4},OutputViewereegpar{5},... + OutputViewereegpar{6},OutputViewereegpar{7},OutputViewereegpar{8},... + OutputViewereegpar{9},OutputViewereegpar{10},OutputViewereegpar{11},... + OutputViewereegpar{12},OutputViewereegpar{13},OutputViewereegpar{14},EStudio_gui_erp_totl,Axesreset); + else + return; + end +end + +if isempty(observe_EEGDAT.EEG) || EEG_autoplot==0 + EStudio_gui_erp_totl.myeegviewer = axes('Parent', EStudio_gui_erp_totl.eegViewAxes,'Color','none','Box','on','FontWeight','normal'); + hold(EStudio_gui_erp_totl.myeegviewer,'on'); + set(EStudio_gui_erp_totl.myeegviewer, 'XTick', [], 'YTick', [],'Box','off', 'Color','none','xcolor','none','ycolor','none'); +else +end +EStudio_gui_erp_totl.eegplotgrid.Heights(1) = 30; % set the first element (pageinfo) to 30px high +EStudio_gui_erp_totl.eegplotgrid.Heights(3) = 5; +EStudio_gui_erp_totl.eegplotgrid.Heights(4) = 30; % set the second element (x axis) to 30px high +EStudio_gui_erp_totl.eegplotgrid.Heights(5) = 30; % set the second element (x axis) to 30px high +end % redrawDemo + +%%------------------------------------------------------------------------- +%%-----------------------------Subfunctions-------------------------------- +%%------------------------------------------------------------------------- + +function popmemu_eeg(Source,~) +global EStudio_gui_erp_totl; +Value = Source.Value; +if Value==2 + app = feval('EStudio_plot_set_waves',EStudio_gui_erp_totl.EEG_autoplot,1); + waitfor(app,'Finishbutton',1); + try + plotSet = app.output; %NO you don't want to output EEG with edited channel locations, you want to output the parameters to run decoding + app.delete; %delete app from view + pause(0.01); %wait for app to leave + catch + return; + end + if isempty(plotSet)||numel(plotSet)~=1 || (plotSet~=0&&plotSet~=1) + plotSet=1; + end + popmemu_eegString = EStudio_gui_erp_totl.popmemu_eeg.String; + if plotSet==1 + popmemu_eegString{2} = 'Automatic Plotting: On'; + else + popmemu_eegString{2} = 'Automatic Plotting: Off'; + end + EStudio_gui_erp_totl.popmemu_eeg.String=popmemu_eegString; + EStudio_gui_erp_totl.EEG_autoplot = plotSet; + f_redrawEEG_Wave_Viewer(); +elseif Value==3 + EStudiowinsize(); +elseif Value==4 + Show_command(); +elseif Value==5 + figure_saveas(); +elseif Value==6 + figure_out(); +end +Source.Value=1; +end + + +%%--------------------Setting for EStudio window size---------------------- +function EStudiowinsize(~,~) +global observe_EEGDAT; +global EStudio_gui_erp_totl;%%Global variable +try + ScreenPos= EStudio_gui_erp_totl.ScreenPos; +catch + ScreenPos = get( 0, 'Screensize' ); +end +try + New_pos = EStudio_gui_erp_totl.Window.Position; +catch + return; +end +try + New_posin = estudioworkingmemory('EStudioScreenPos'); +catch + New_posin = [75,75]; +end +if isempty(New_posin) ||numel(New_posin)~=2 + New_posin = [75,75]; +end +New_posin(2) = abs(New_posin(2)); + +app = feval('EStudio_pos_gui',New_posin); +waitfor(app,'Finishbutton',1); +try + New_pos1 = app.output; %NO you don't want to output EEG with edited channel locations, you want to output the parameters to run decoding + app.delete; %delete app from view + pause(0.01); %wait for app to leave +catch + return; +end +try New_pos1(2) = abs(New_pos1(2));catch; end; + +if isempty(New_pos1) || numel(New_pos1)~=2 + estudioworkingmemory('f_EEG_proces_messg',['The defined Window Size for EStudio is invalid and it must be two numbers']); + observe_EEGDAT.eeg_panel_message =4; + return; +end +estudioworkingmemory('EStudioScreenPos',New_pos1); +try + POS4 = (New_pos1(2)-New_posin(2))/100; + new_pos =[New_pos(1),New_pos(2)-ScreenPos(4)*POS4,ScreenPos(3)*New_pos1(1)/100,ScreenPos(4)*New_pos1(2)/100]; + if new_pos(2) < -abs(new_pos(4))%%if + + end + set(EStudio_gui_erp_totl.Window, 'Position', new_pos); +catch + estudioworkingmemory('f_EEG_proces_messg',['The defined Window Size for EStudio is invalid and it must be two numbers']); + observe_EEGDAT.eeg_panel_message =4; + set(EStudio_gui_erp_totl.Window, 'Position', [0 0 0.75*ScreenPos(3) 0.75*ScreenPos(4)]); + estudioworkingmemory('EStudioScreenPos',[75 75]); +end +f_redrawEEG_Wave_Viewer(); +f_redrawERP(); +EStudio_gui_erp_totl.context_tabs.TabSize = (new_pos(3)-20)/2; +end + + +%%------------------set to 0---------------------------------------- +function zoomin_large(~,~) +global observe_EEGDAT; +global EStudio_gui_erp_totl;%%Global variable +if isempty(observe_EEGDAT.EEG) + return; +end +EStudio_gui_erp_totl.eegProcess_messg.String = ''; +try + [version reldate,ColorB_def,ColorF_def,errorColorF_def] = geterplabstudiodef;%%Get background color +catch + ColorB_def = [0.7020 0.77 0.85]; +end +if isempty(ColorB_def) || numel(ColorB_def)~=3 || min(ColorB_def(:))<0 || max(ColorB_def(:))>1 + ColorB_def = [0.7020 0.77 0.85]; +end +EStudio_gui_erp_totl.eegProcess_messg.BackgroundColor = ColorB_def; + +if observe_EEGDAT.EEG.trials>1 % time in second or in trials + Startimes =1; +else + Startimes = 0; +end +EStudio_gui_erp_totl.eeg_zoom_edit.String =num2str(Startimes); +estudioworkingmemory('Startimes',Startimes); +f_redrawEEG_Wave_Viewer(1); +end + + +%%reduce the start time of the displayed EEG +function zoomin_fivesmall(~,~) +global observe_EEGDAT; +global EStudio_gui_erp_totl;%%Global variable +if isempty(observe_EEGDAT.EEG) + return; +end +EStudio_gui_erp_totl.eegProcess_messg.String = ''; +try + [version reldate,ColorB_def,ColorF_def,errorColorF_def] = geterplabstudiodef;%%Get background color +catch + ColorB_def = [0.7020 0.77 0.85]; +end +if isempty(ColorB_def) || numel(ColorB_def)~=3 || min(ColorB_def(:))<0 || max(ColorB_def(:))>1 + ColorB_def = [0.7020 0.77 0.85]; +end +EStudio_gui_erp_totl.eegProcess_messg.BackgroundColor = ColorB_def; +EEG_plotset = estudioworkingmemory('EEG_plotset'); +try + Winlength = EEG_plotset{3}; +catch + Winlength = 5; + EEG_plotset{3} = 5; +end +[chaNum,sampleNum,trialNum]=size(observe_EEGDAT.EEG.data); +Frames = sampleNum*trialNum; +if observe_EEGDAT.EEG.trials>1 % time in second or in trials + multiplier_winleg = size(observe_EEGDAT.EEG.data,2); +else + multiplier_winleg = observe_EEGDAT.EEG.srate; +end +if isempty(Winlength)|| Winlength<0 || Winlength>floor(Frames/multiplier_winleg) + Winlength = 5; + EEG_plotset{3} = 5; +end +estudioworkingmemory('EEG_plotset',EEG_plotset); +Startimesdef = str2num(EStudio_gui_erp_totl.eeg_zoom_edit.String); +if ~isempty(Startimesdef) && isnumeric(Startimesdef) && numel(Startimesdef)==1 && Startimesdef>=0 +else + Startimesdef = 0; + EStudio_gui_erp_totl.eeg_zoom_edit.String = '0'; +end + +Startimes = Startimesdef-fastif(Winlength>=5, round(5*Winlength), 5*Winlength); +if Startimes<0 + if observe_EEGDAT.EEG.trials>1 + Startimes=1; + else + Startimes=0; + end +end + +estudioworkingmemory('Startimes',Startimes); +EStudio_gui_erp_totl.eeg_zoom_edit.String =num2str(Startimes); +f_redrawEEG_Wave_Viewer(1); +end + + +%%prev time period +function zoomin_small(~,~) + +global observe_EEGDAT; +global EStudio_gui_erp_totl;%%Global variable +if isempty(observe_EEGDAT.EEG) + return; +end +EStudio_gui_erp_totl.eegProcess_messg.String = ''; +try + [version reldate,ColorB_def,ColorF_def,errorColorF_def] = geterplabstudiodef;%%Get background color +catch + ColorB_def = [0.7020 0.77 0.85]; +end +if isempty(ColorB_def) || numel(ColorB_def)~=3 || min(ColorB_def(:))<0 || max(ColorB_def(:))>1 + ColorB_def = [0.7020 0.77 0.85]; +end +EStudio_gui_erp_totl.eegProcess_messg.BackgroundColor = ColorB_def; + +EEG_plotset = estudioworkingmemory('EEG_plotset'); +try + Winlength = EEG_plotset{3}; +catch + Winlength = 5; + EEG_plotset{3} = 5; +end +[chaNum,sampleNum,trialNum]=size(observe_EEGDAT.EEG.data); +Frames = sampleNum*trialNum; +if observe_EEGDAT.EEG.trials>1 % time in second or in trials + multiplier_winleg = size(observe_EEGDAT.EEG.data,2); +else + multiplier_winleg = observe_EEGDAT.EEG.srate; +end +if isempty(Winlength)|| Winlength<0 || Winlength>floor(Frames/multiplier_winleg) + Winlength = 5; + EEG_plotset{3} = 5; +end +estudioworkingmemory('EEG_plotset',EEG_plotset); +Startimesdef = str2num(EStudio_gui_erp_totl.eeg_zoom_edit.String); +if ~isempty(Startimesdef) && isnumeric(Startimesdef) && numel(Startimesdef)==1 && Startimesdef>=0 +else + Startimesdef = 0; + EStudio_gui_erp_totl.eeg_zoom_edit.String = '0'; +end + +Startimes = Startimesdef-fastif(Winlength>=5, round(Winlength), Winlength); +if Startimes<0 + if observe_EEGDAT.EEG.trials>1 + Startimes=1; + else + Startimes=0; + end +end + +estudioworkingmemory('Startimes',Startimes); +EStudio_gui_erp_totl.eeg_zoom_edit.String =num2str(Startimes); +f_redrawEEG_Wave_Viewer(1); +end + + +%%Editing the start the time for the displayed EEG data +function zoomedit(Source,~) +global observe_EEGDAT; +global EStudio_gui_erp_totl;%%Global variable +if isempty(observe_EEGDAT.EEG) + Source.String ='0'; + return; +end +EStudio_gui_erp_totl.eegProcess_messg.String = ''; +try + [version reldate,ColorB_def,ColorF_def,errorColorF_def] = geterplabstudiodef;%%Get background color +catch + ColorB_def = [0.7020 0.77 0.85]; +end +if isempty(ColorB_def) || numel(ColorB_def)~=3 || min(ColorB_def(:))<0 || max(ColorB_def(:))>1 + ColorB_def = [0.7020 0.77 0.85]; +end +EStudio_gui_erp_totl.eegProcess_messg.BackgroundColor = ColorB_def; + +Startimes = str2num(EStudio_gui_erp_totl.eeg_zoom_edit.String); +if isempty(Startimes) + Startimes = 0; + Source.String = '0'; + MessageViewer= char(strcat('Start time for the displayed EEG should be a number')); + estudioworkingmemory('f_EEG_proces_messg',MessageViewer); + observe_EEGDAT.eeg_panel_message=4; +end +if numel(Startimes)~=1 + Startimes = Startimes(1); +end + + +EEG_plotset = estudioworkingmemory('EEG_plotset'); +try + Winlength = EEG_plotset{3}; +catch + Winlength = 5; + EEG_plotset{3} = 5; +end +[chaNum,sampleNum,trialNum]=size(observe_EEGDAT.EEG.data); +Frames = sampleNum*trialNum; +if observe_EEGDAT.EEG.trials>1 % time in second or in trials + multiplier = size(observe_EEGDAT.EEG.data,2); + multiplier_winleg = size(observe_EEGDAT.EEG.data,2); +else + multiplier = observe_EEGDAT.EEG.srate; + multiplier_winleg = observe_EEGDAT.EEG.srate; +end + +if isempty(Winlength)|| Winlength<0 || (Winlength>floor(Frames/multiplier_winleg)) + Winlength = 5; + EEG_plotset{3} = 5; +end +estudioworkingmemory('EEG_plotset',EEG_plotset); +if ndims(observe_EEGDAT.EEG.data) ==3 + Startimes = Startimes-1; +end +Startimes = max(0,min(Startimes,ceil((Frames-1)/multiplier)-Winlength)); +if ndims(observe_EEGDAT.EEG.data) ==3 + Startimes = Startimes+1; +end +Source.String = num2str(Startimes); + + +estudioworkingmemory('Startimes',Startimes); +f_redrawEEG_Wave_Viewer(1); +end + + + + +%%-------------------% > add one second for displayed EEG------------------ +function zoomout_small(~,~) +global observe_EEGDAT; +global EStudio_gui_erp_totl;%%Global variable +EEG_plotset = estudioworkingmemory('EEG_plotset'); +try + Winlength = EEG_plotset{3}; +catch + Winlength = 5; + EEG_plotset{3} = 5; +end +if isempty(observe_EEGDAT.EEG) + return; +end +EStudio_gui_erp_totl.eegProcess_messg.String = ''; +try + [version reldate,ColorB_def,ColorF_def,errorColorF_def] = geterplabstudiodef;%%Get background color +catch + ColorB_def = [0.7020 0.77 0.85]; +end +if isempty(ColorB_def) || numel(ColorB_def)~=3 || min(ColorB_def(:))<0 || max(ColorB_def(:))>1 + ColorB_def = [0.7020 0.77 0.85]; +end +EStudio_gui_erp_totl.eegProcess_messg.BackgroundColor = ColorB_def; + +[chaNum,sampleNum,trialNum]=size(observe_EEGDAT.EEG.data); +Frames = sampleNum*trialNum; +if observe_EEGDAT.EEG.trials>1 % time in second or in trials + multiplier = size(observe_EEGDAT.EEG.data,2); + multiplier_winleg = size(observe_EEGDAT.EEG.data,2); +else + multiplier = observe_EEGDAT.EEG.srate; + multiplier_winleg = multiplier; +end + +if isempty(Winlength)|| Winlength<0 || Winlength>floor(Frames/multiplier_winleg) + Winlength = 5; + EEG_plotset{3} = 5; +end +estudioworkingmemory('EEG_plotset',EEG_plotset); +Startimesdef = str2num(EStudio_gui_erp_totl.eeg_zoom_edit.String); +if ~isempty(Startimesdef) && isnumeric(Startimesdef) && numel(Startimesdef)==1 && Startimesdef>=0 +else + Startimesdef = 0; +end + +Startimes = Startimesdef+fastif(Winlength>=5, round(Winlength), Winlength); %%> add one second +if Startimes<0 + Startimes=0; +end + +EEG_plotset = estudioworkingmemory('EEG_plotset'); +try + Winlength = EEG_plotset{3}; +catch + Winlength = 5; + EEG_plotset{3} = 5; +end + +if isempty(Winlength)|| Winlength<0 || (Winlength>floor(Frames/multiplier_winleg)) + Winlength = floor(Frames/multiplier_winleg); + EEG_plotset{3} = floor(Frames/multiplier_winleg); +end +estudioworkingmemory('EEG_plotset',EEG_plotset); +StartimesMax = max(0,ceil((Frames-1)/multiplier)-Winlength); +if ndims(observe_EEGDAT.EEG.data)==3 + StartimesMax = StartimesMax+1; +end +if Startimes>StartimesMax + Startimes=StartimesMax; +end +EStudio_gui_erp_totl.eeg_zoom_edit.String = num2str(Startimes); + +estudioworkingmemory('Startimes',Startimes); +f_redrawEEG_Wave_Viewer(1); + +end + + +function zoomout_fivelarge(~,~) +global observe_EEGDAT; +global EStudio_gui_erp_totl;%%Global variable +EEG_plotset = estudioworkingmemory('EEG_plotset'); +try + Winlength = EEG_plotset{3}; +catch + Winlength = 5; + EEG_plotset{3} = 5; +end +if isempty(observe_EEGDAT.EEG) + return; +end +EStudio_gui_erp_totl.eegProcess_messg.String = ''; +try + [version reldate,ColorB_def,ColorF_def,errorColorF_def] = geterplabstudiodef;%%Get background color +catch + ColorB_def = [0.7020 0.77 0.85]; +end +if isempty(ColorB_def) || numel(ColorB_def)~=3 || min(ColorB_def(:))<0 || max(ColorB_def(:))>1 + ColorB_def = [0.7020 0.77 0.85]; +end +EStudio_gui_erp_totl.eegProcess_messg.BackgroundColor = ColorB_def; + +[chaNum,sampleNum,trialNum]=size(observe_EEGDAT.EEG.data); +Frames = sampleNum*trialNum; +if observe_EEGDAT.EEG.trials>1 % time in second or in trials + multiplier = size(observe_EEGDAT.EEG.data,2); + multiplier_winleg = size(observe_EEGDAT.EEG.data,2); +else + multiplier = observe_EEGDAT.EEG.srate; + multiplier_winleg = multiplier; +end + +if isempty(Winlength)|| Winlength<0 || Winlength>floor(Frames/multiplier_winleg) + Winlength = 5; + EEG_plotset{3} = 5; +end +estudioworkingmemory('EEG_plotset',EEG_plotset); +Startimesdef = str2num(EStudio_gui_erp_totl.eeg_zoom_edit.String); +if ~isempty(Startimesdef) && isnumeric(Startimesdef) && numel(Startimesdef)==1 && Startimesdef>=0 +else + Startimesdef = 0; +end + +Startimes = Startimesdef+fastif(Winlength>=5, round(5*Winlength), 5*Winlength); %%> add one second +if Startimes<0 + Startimes=0; +end + +EEG_plotset = estudioworkingmemory('EEG_plotset'); +try + Winlength = EEG_plotset{3}; +catch + Winlength = 5; + EEG_plotset{3} = 5; +end + +if isempty(Winlength)|| Winlength<0 || (Winlength>floor(Frames/multiplier_winleg)) + Winlength = floor(Frames/multiplier_winleg); + EEG_plotset{3} = floor(Frames/multiplier_winleg); +end +estudioworkingmemory('EEG_plotset',EEG_plotset); +StartimesMax = max(0,ceil((Frames-1)/multiplier)-Winlength); +if ndims(observe_EEGDAT.EEG.data)==3 + StartimesMax = StartimesMax+1; +end +if Startimes>StartimesMax + Startimes=StartimesMax; +end +EStudio_gui_erp_totl.eeg_zoom_edit.String = num2str(Startimes); + +estudioworkingmemory('Startimes',Startimes); +f_redrawEEG_Wave_Viewer(1); +end + + + + +function zoomout_large(~,~) +global observe_EEGDAT; +global EStudio_gui_erp_totl;%%Global variable +if isempty(observe_EEGDAT.EEG) + return; +end +EStudio_gui_erp_totl.eegProcess_messg.String = ''; +try + [version reldate,ColorB_def,ColorF_def,errorColorF_def] = geterplabstudiodef;%%Get background color +catch + ColorB_def = [0.7020 0.77 0.85]; +end +if isempty(ColorB_def) || numel(ColorB_def)~=3 || min(ColorB_def(:))<0 || max(ColorB_def(:))>1 + ColorB_def = [0.7020 0.77 0.85]; +end +EStudio_gui_erp_totl.eegProcess_messg.BackgroundColor = ColorB_def; +EEG_plotset = estudioworkingmemory('EEG_plotset'); +try + Winlength = EEG_plotset{3}; +catch + Winlength = 5; + EEG_plotset{3} = 5; +end +[chaNum,sampleNum,trialNum]=size(observe_EEGDAT.EEG.data); +Frames = sampleNum*trialNum; +if observe_EEGDAT.EEG.trials>1 % time in second or in trials + multiplier = size(observe_EEGDAT.EEG.data,2); + multiplier_winleg = size(observe_EEGDAT.EEG.data,2); +else + multiplier = observe_EEGDAT.EEG.srate; + multiplier_winleg = multiplier; +end + +if isempty(Winlength)|| Winlength<0 || (Winlength>floor(Frames/multiplier_winleg)) + Winlength = 5; + EEG_plotset{3} = 5; +end +estudioworkingmemory('EEG_plotset',EEG_plotset); +StartimesMax = max(0,ceil((Frames-1)/multiplier)-Winlength); +if ndims(observe_EEGDAT.EEG.data)==3 + StartimesMax = StartimesMax+1; +end +Startimes = StartimesMax; + + +estudioworkingmemory('Startimes',Startimes); + +EStudio_gui_erp_totl.eeg_zoom_edit.String =num2str(Startimes); +f_redrawEEG_Wave_Viewer(1); +end + + +%%-------------------------------Page Editor------------------------------- +function page_edit(Source,~) +global observe_EEGDAT; +if isempty(observe_EEGDAT.EEG) + return; +end + +[messgStr,eegpanelIndex] = f_check_eegtab_panelchanges(); +if ~isempty(messgStr) + observe_EEGDAT.eeg_two_panels = observe_EEGDAT.eeg_two_panels+1; +end + +Pagecurrent = str2num(Source.String); + +EEGset_selected = estudioworkingmemory('EEGArray'); +if isempty(EEGset_selected) + EEGset_selected=observe_EEGDAT.CURRENTSET; + estudioworkingmemory('EEGArray',EEGset_selected); +end + +pageNum = numel(EEGset_selected); +if ~isempty(Pagecurrent) && numel(Pagecurrent)~=1 %%if two or more numbers are entered + Pagecurrent =Pagecurrent(1); +end + +if ~isempty(Pagecurrent) && Pagecurrent>0 && Pagecurrent<= pageNum%% + Source.String = num2str(Pagecurrent); + observe_EEGDAT.CURRENTSET = EEGset_selected(Pagecurrent); + observe_EEGDAT.EEG = observe_EEGDAT.ALLEEG(observe_EEGDAT.CURRENTSET); + estudioworkingmemory('Startimes',0); + f_redrawEEG_Wave_Viewer(); + observe_EEGDAT.count_current_eeg=2; +end +end + + + + +%------------------Display the waveform for proir ERPset-------------------- +function page_minus(~,~) +global observe_EEGDAT; +global EStudio_gui_erp_totl; +if isempty(observe_EEGDAT.EEG) + return; +end +%%first check if the changed parameters have been applied in any panels +[messgStr,eegpanelIndex] = f_check_eegtab_panelchanges(); +if ~isempty(messgStr) + observe_EEGDAT.eeg_two_panels = observe_EEGDAT.eeg_two_panels+1; +end +Pagecurrent = str2num(EStudio_gui_erp_totl.eegpageinfo_edit.String); +EEGset_selected = estudioworkingmemory('EEGArray'); +if isempty(EEGset_selected) + EEGset_selected=observe_EEGDAT.CURRENTSET; + estudioworkingmemory('EEGArray',EEGset_selected); +end + +pageNum = numel(EEGset_selected); +if ~isempty(Pagecurrent) && numel(Pagecurrent)~=1 %%if two or more numbers are entered + Pagecurrent =Pagecurrent(1); +elseif isempty(Pagecurrent) + [xpos, ypos] = find(EEGset_selected==observe_EEGDAT.CURRENTSET); + if isempty(ypos) + Pagecurrent=1; + observe_EEGDAT.CURRENTSET = EEGset_selected(1); + observe_EEGDAT.EEG = observe_EEGDAT.ALLEEG(observe_EEGDAT.CURRENTSET); + else + Pagecurrent = ypos; + end +end +Pagecurrent = Pagecurrent-1; +if Pagecurrent>0 && Pagecurrent<=pageNum + EStudio_gui_erp_totl.eegpageinfo_edit.String = num2str(Pagecurrent); + observe_EEGDAT.CURRENTSET = EEGset_selected(Pagecurrent); + observe_EEGDAT.EEG = observe_EEGDAT.ALLEEG(observe_EEGDAT.CURRENTSET); + estudioworkingmemory('Startimes',0); + f_redrawEEG_Wave_Viewer(1); + observe_EEGDAT.count_current_eeg=2; +else + return; +end +end + + +%------------------Display the waveform for next ERPset-------------------- +function page_plus(~,~) +global observe_EEGDAT; +global EStudio_gui_erp_totl; +if isempty(observe_EEGDAT.EEG) + return; +end +%%first check if the changed parameters have been applied in any panels +[messgStr,eegpanelIndex] = f_check_eegtab_panelchanges(); +if ~isempty(messgStr) + observe_EEGDAT.eeg_two_panels = observe_EEGDAT.eeg_two_panels+1; +end +Pagecurrent = str2num(EStudio_gui_erp_totl.eegpageinfo_edit.String); +EEGset_selected = estudioworkingmemory('EEGArray'); +if isempty(EEGset_selected) + EEGset_selected=observe_EEGDAT.CURRENTSET; + estudioworkingmemory('EEGArray',EEGset_selected); +end + +pageNum = numel(EEGset_selected); +if ~isempty(Pagecurrent) && numel(Pagecurrent)~=1 %%if two or more numbers are entered + Pagecurrent =Pagecurrent(1); +elseif isempty(Pagecurrent) + [xpos, ypos] = find(EEGset_selected==observe_EEGDAT.CURRENTSET); + if isempty(ypos) + Pagecurrent=1; + observe_EEGDAT.CURRENTSET = EEGset_selected(1); + observe_EEGDAT.EEG = observe_EEGDAT.ALLEEG(observe_EEGDAT.CURRENTSET); + observe_EEGDAT.count_current_eeg =2; + f_redrawEEG_Wave_Viewer(); + return; + else + Pagecurrent = ypos; + end +end +Pagecurrent = Pagecurrent+1; +if Pagecurrent>0 && Pagecurrent<=pageNum + EStudio_gui_erp_totl.eegpageinfo_edit.String = num2str(Pagecurrent); + observe_EEGDAT.CURRENTSET = EEGset_selected(Pagecurrent); + observe_EEGDAT.EEG = observe_EEGDAT.ALLEEG(observe_EEGDAT.CURRENTSET); + estudioworkingmemory('Startimes',0); + f_redrawEEG_Wave_Viewer(1); + observe_EEGDAT.count_current_eeg=2; +else + return; +end +end + + + + +function Show_command(~,~) +global observe_EEGDAT; +if isempty(observe_EEGDAT.EEG) + return; +end +%%first check if the changed parameters have been applied in any panels +[messgStr,eegpanelIndex] = f_check_eegtab_panelchanges(); +if ~isempty(messgStr) + observe_EEGDAT.eeg_two_panels = observe_EEGDAT.eeg_two_panels+1; +end +MessageViewer= char(strcat('Show Command')); +estudioworkingmemory('f_EEG_proces_messg',MessageViewer); +try + observe_EEGDAT.eeg_panel_message=1; + OutputViewereegpar = f_preparms_eegwaviewer(observe_EEGDAT.EEG,1,'command'); + observe_EEGDAT.eeg_panel_message=2; +catch + observe_EEGDAT.eeg_panel_message=3; +end +end + + + +%%-------------------------Save figure as---------------------------------- +function figure_saveas(~,~) +global observe_EEGDAT; +% addlistener(observe_EEGDAT,'Messg_EEG_change',@Messg_EEG_change); +if isempty(observe_EEGDAT.EEG) + return; +end + +%%first check if the changed parameters have been applied in any panels +[messgStr,eegpanelIndex] = f_check_eegtab_panelchanges(); +if ~isempty(messgStr) + observe_EEGDAT.eeg_two_panels = observe_EEGDAT.eeg_two_panels+1; +end +MessageViewer= char(strcat('Save Figure As')); +estudioworkingmemory('f_EEG_proces_messg',MessageViewer); + +pathstr = pwd; +[~, namedef, ~] = fileparts(observe_EEGDAT.EEG.setname); +[figurename, erppathname, indxs] = uiputfile({'*.pdf';'*.svg';'*.jpg';'*.png';'*.tif';'*.bmp';'*.eps'},... + 'Save as',[fullfile(pathstr,namedef)]); + +if isequal(figurename,0) + % observe_EEGDAT.eeg_panel_message=3; + return +end + +History = 'off'; +[pathstr, figurename1, ext] = fileparts(figurename) ; + +if isempty(ext) + figurename = fullfile(erppathname,char(strcat(figurename,'.pdf'))); +else + figurename = fullfile(erppathname,figurename); +end + +observe_EEGDAT.eeg_panel_message=1; +OutputViewereegpar = f_preparms_eegwaviewer(observe_EEGDAT.EEG,1,History,figurename); +observe_EEGDAT.eeg_panel_message=2; + +end + + +%%------------------------Reset parameters--------------------------------- +function eeg_paras_reset(~,~) +global observe_EEGDAT; +global observe_ERPDAT; +global EStudio_gui_erp_totl; + +estudioworkingmemory('EEGUpdate',0); +observe_EEGDAT.count_current_eeg =1; + +estudioworkingmemory('ViewerFlag', 0); +observe_ERPDAT.Count_currentERP=1; + +%%first check if the changed parameters have been applied in any panels +[messgStr,eegpanelIndex] = f_check_eegtab_panelchanges(); +if ~isempty(messgStr) + observe_EEGDAT.eeg_two_panels = observe_EEGDAT.eeg_two_panels+1; +end + +estudioworkingmemory('f_EEG_proces_messg','Reset parameters for EEG panels'); +app = feval('estudio_reset_paras',[1 0 0 0]); +waitfor(app,'Finishbutton',1); +reset_paras = [0 0 0 0]; +try + reset_paras = app.output; %NO you don't want to output EEG with edited channel locations, you want to output the parameters to run decoding + app.delete; %delete app from view + pause(0.1); %wait for app to leave +catch + return; +end +if isempty(reset_paras) + return; +end +EStudio_gui_erp_totl.ERP_autoplot=1; +EStudio_gui_erp_totl.EEG_autoplot = 1; + +observe_EEGDAT.eeg_panel_message=1; +if reset_paras(2)==1 + EStudio_gui_erp_totl.clear_alleeg = 1; +else + EStudio_gui_erp_totl.clear_alleeg = 0; +end + +if reset_paras(1)==1 + observe_EEGDAT.Reset_eeg_paras_panel=1; + if EStudio_gui_erp_totl.clear_alleeg == 0 + f_redrawEEG_Wave_Viewer(); + else + observe_EEGDAT.ALLEEG = []; + observe_EEGDAT.EEG = []; + observe_EEGDAT.CURRENTSET = 0; + estudioworkingmemory('EEGArray',1); + observe_EEGDAT.count_current_eeg =1; + end +else + if EStudio_gui_erp_totl.clear_alleeg == 1 + observe_EEGDAT.ALLEEG = []; + observe_EEGDAT.EEG = []; + observe_EEGDAT.CURRENTSET = 0; + estudioworkingmemory('EEGArray',1); + observe_EEGDAT.count_current_eeg =1; + end +end +observe_EEGDAT.eeg_panel_message=2; +%%---------------- -------------erp tab------------------------------------ +if reset_paras(4)==1 + EStudio_gui_erp_totl.clear_allerp = 1; +else + EStudio_gui_erp_totl.clear_allerp = 0; +end + +if reset_paras(3)==1 + observe_ERPDAT.Reset_erp_paras_panel = 1; + if EStudio_gui_erp_totl.clear_allerp == 0 + f_redrawERP(); + else + observe_ERPDAT.ALLERP = []; + observe_ERPDAT.ERP = []; + observe_ERPDAT.CURRENTERP = 1; + estudioworkingmemory('selectederpstudio',1); + observe_ERPDAT.Count_currentERP = 1; + end +else + if EStudio_gui_erp_totl.clear_allerp == 1 + + observe_ERPDAT.ALLERP = []; + observe_ERPDAT.ERP = []; + observe_ERPDAT.CURRENTERP = 1; + estudioworkingmemory('selectederpstudio',1); + observe_ERPDAT.Count_currentERP = 1; + end +end + +end + + + +%%-----------------Pop figure--------------------------------------------- +function figure_out(~,~) +global observe_EEGDAT; + +if isempty(observe_EEGDAT.EEG) + return; +end + +%%first check if the changed parameters have been applied in any panels +[messgStr,eegpanelIndex] = f_check_eegtab_panelchanges(); +if ~isempty(messgStr) + observe_EEGDAT.eeg_two_panels = observe_EEGDAT.eeg_two_panels+1; +end + + +MessageViewer= char(strcat('Create Static/Exportable Plot')); +estudioworkingmemory('f_EEG_proces_messg',MessageViewer); +try + figurename = observe_EEGDAT.EEG.setname; +catch + figurename = ''; +end +History = 'off'; +observe_EEGDAT.eeg_panel_message=1; +OutputViewereegpar = f_preparms_eegwaviewer(observe_EEGDAT.EEG,1,History,figurename); +observe_EEGDAT.eeg_panel_message=2; +end + + +% %%------------------------Message panel------------------------------------ +function eeg_panel_change_message(~,~) +global observe_EEGDAT; +global EStudio_gui_erp_totl; +% addlistener(observe_EEGDAT,'count_current_eeg_change',@count_current_eeg_change); + +if isempty(observe_EEGDAT.EEG) || isempty(observe_EEGDAT.ALLEEG) + return; +end +FonsizeDefault = f_get_default_fontsize(); +try + [version reldate,ColorB_def,ColorF_def,errorColorF_def] = geterplabstudiodef;%%Get background color +catch + ColorB_def = [0.7020 0.77 0.85]; +end +if isempty(ColorB_def) || numel(ColorB_def)~=3 || min(ColorB_def(:))<0 || max(ColorB_def(:))>1 + ColorB_def = [0.7020 0.77 0.85]; +end +Processed_Method=estudioworkingmemory('f_EEG_proces_messg'); +EEGMessagepre = estudioworkingmemory('f_EEG_proces_messg_pre'); +if isempty(EEGMessagepre) + EEGMessagepre = {'',0}; +end +try + if strcmpi(EEGMessagepre{1},Processed_Method) && observe_EEGDAT.eeg_panel_message == EEGMessagepre{2} + return; + end +catch +end +estudioworkingmemory('f_EEG_proces_messg_pre',{Processed_Method,observe_EEGDAT.eeg_panel_message}); + + +EStudio_gui_erp_totl.eegProcess_messg.BackgroundColor = [0.95 0.95 0.95]; +EStudio_gui_erp_totl.eegProcess_messg.FontSize = FonsizeDefault; + +if observe_EEGDAT.eeg_panel_message==1 + EStudio_gui_erp_totl.eegProcess_messg.String = strcat('1- ',Processed_Method,': Running....'); + EStudio_gui_erp_totl.eegProcess_messg.ForegroundColor = [0 0 0]; + pause(0.1); +elseif observe_EEGDAT.eeg_panel_message==2 + EStudio_gui_erp_totl.eegProcess_messg.String = strcat('2- ',Processed_Method,': Complete'); + EStudio_gui_erp_totl.eegProcess_messg.ForegroundColor = [0 0.5 0]; + pause(0.1); +elseif observe_EEGDAT.eeg_panel_message==3 + if ~strcmp(EStudio_gui_erp_totl.eegProcess_messg.String,strcat('3- ',Processed_Method,': Error (see Command Window)')) + fprintf([Processed_Method,32,32,32,datestr(datetime('now')),'\n.']); + end + EStudio_gui_erp_totl.eegProcess_messg.String = strcat('3- ',Processed_Method,': Error (see Command Window)'); + EStudio_gui_erp_totl.eegProcess_messg.ForegroundColor = [1 0 0]; +else + if ~strcmpi(EStudio_gui_erp_totl.eegProcess_messg.String,strcat('Warning:',32,Processed_Method,32,'(see Command Window).')) + fprintf([Processed_Method,32,32,32,datestr(datetime('now')),'\n.']); + end + EStudio_gui_erp_totl.eegProcess_messg.String = strcat('Warning:',32,Processed_Method,32,'(see Command Window).'); + + pause(0.1); + EStudio_gui_erp_totl.eegProcess_messg.ForegroundColor = [1 0.65 0]; +end +if observe_EEGDAT.eeg_panel_message==2 || observe_EEGDAT.eeg_panel_message==3 + pause(0.01); + EStudio_gui_erp_totl.eegProcess_messg.String = ''; + EStudio_gui_erp_totl.eegProcess_messg.BackgroundColor = ColorB_def;%[0.95 0.95 0.95]; +end +end + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%-------------------------------Plot eeg waves--------------------------%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +function [EStudio_gui_erp_totl,errmeg] = f_plotviewereegwave(EEG,ChanArray,ICArray,EEGdispFlag,ICdispFlag,Winlength,... + AmpScale,ChanLabel,Submean,EventOnset,StackFlag,NormFlag,Startimes,AmpIC,bufftobo,EStudio_gui_erp_totl,Axesreset) + +if nargin<17 + Axesreset=0; +end + +if isempty(Axesreset) || numel(Axesreset)~=1 || (Axesreset~=0 && Axesreset~=1) + Axesreset=0; +end + +if Axesreset ==1%%Speed up the execute time + cla(EStudio_gui_erp_totl.myeegviewer,'reset'); + set(EStudio_gui_erp_totl.myeegviewer,'Box','on'); +else + EStudio_gui_erp_totl.myeegviewer = axes('Parent', EStudio_gui_erp_totl.eegViewAxes,'Color','none','Box','on','FontWeight','normal'); + Pos = EStudio_gui_erp_totl.myeegviewer.Position; + EStudio_gui_erp_totl.myeegviewer.Position = [Pos(1)*0.5,Pos(2)*0.5,Pos(3)*1.15,Pos(4)*1.05];%%x,y,width,height + estudioworkingmemory('egfigsize',[EStudio_gui_erp_totl.myeegviewer.Position(3),EStudio_gui_erp_totl.myeegviewer.Position(4)]); +end + +hold(EStudio_gui_erp_totl.myeegviewer,'on'); + +myeegviewer = EStudio_gui_erp_totl.myeegviewer; + + +errmeg = []; +if nargin<1 + help f_plotviewereegwave; + return +end + +if isempty(EEG) + errmeg = 'EEG is empty'; + return; +end + + +%%selected channels +nbchan = EEG.nbchan; +if nargin<2 + ChanArray = 1:nbchan; +end +if isempty(ChanArray) || min(ChanArray(:)) >nbchan || max(ChanArray(:))> nbchan|| min(ChanArray(:))<=0 + ChanArray = 1:nbchan; +end + +%%selected ICs +if nargin<3 + ICArray = []; +end +if isempty(EEG.icachansind) + ICArray = []; +else + nIC = numel(EEG.icachansind); + if isempty(ICArray) || min(ICArray(:))>nIC || max(ICArray(:)) > nIC || min(ICArray(:))<=0 + ICArray = 1:nIC; + end +end + +%%display EEG? +if nargin<4 + EEGdispFlag=1; +end +if isempty(EEGdispFlag) || (EEGdispFlag~=0 && EEGdispFlag~=1) + EEGdispFlag = 1; +end + +%%Dispaly ICs? +if nargin<5 + ICdispFlag=0; +end +if isempty(ICdispFlag) || (ICdispFlag~=0 && ICdispFlag~=1) + ICdispFlag = 0; +end +if ICdispFlag==0 + ICArray = []; +end + +%%Time range that is to display (1s or 5s)? +if nargin<6 + Winlength=5; +end +if isempty(Winlength) || numel(Winlength)~=1 || min(Winlength(:))<=0 + Winlength=5; +end + +%%Vertical scale? +if nargin<7 + AmpScale = 50; +end +if isempty(AmpScale) || numel(AmpScale)~=1 || AmpScale<=0 + AmpScale = 50; +end +OldAmpScale = AmpScale; + +%%channe labels (name or number) +if nargin<8 + ChanLabel = 1; +end +if isempty(ChanLabel) || numel(ChanLabel)~=1 || (ChanLabel~=0 && ChanLabel~=1) + ChanLabel = 1; +end + +%%remove DC? +if nargin<9 + Submean = 0; +end +if isempty(Submean) || numel(Submean)~=1 || (Submean~=0 && Submean~=1) + Submean = 1; +end + + +%%Display events? +if nargin<10 + EventOnset = 1; +end +if isempty(EventOnset) || numel(EventOnset)~=1 || (EventOnset~=0 && EventOnset~=1) + EventOnset = 1; +end + + +%%Stack? +if nargin<11 + StackFlag = 0; +end +if isempty(StackFlag) || numel(StackFlag)~=1 || (StackFlag~=0&&StackFlag~=1) + StackFlag = 0; +end + +%%Norm? +if nargin<12 + NormFlag = 0; +end +if isempty(NormFlag) ||numel(NormFlag)~=1 || (NormFlag~=0 && NormFlag~=1) + NormFlag = 0; +end + +% Startimes =20; +%%start time for the displayed data +if nargin < 13 + if ndims(EEG.data) ==3 + Startimes=1; + else + Startimes=0; + end +end + +%%VERTICAL SCALE for ICs +if nargin<14 + AmpIC = 20; +end + +if isempty(AmpIC) || numel(AmpIC)~=1 || AmpIC<=0 + AmpIC = 20; +end +OldAmpIC = AmpIC; + +%%buffer at top and bottom +if nargin<15 + bufftobo = 100; +end +if isempty(bufftobo) || numel(bufftobo)~=1 || any(bufftobo(:)<=0) + bufftobo = 100; +end + + +[ChanNum,Allsamples,tmpnb] = size(EEG.data); +Allsamples = Allsamples*tmpnb; +if ndims(EEG.data) > 2 + multiplier = size(EEG.data,2); +else + multiplier = EEG.srate; +end + +if isempty(Startimes) || Startimes<0 || Startimes>(ceil((Allsamples-1)/multiplier)-Winlength) + if ndims(EEG.data) ==3 + Startimes=1; + else + Startimes=0; + end +end + +%%determine the time range that will be dispalyed +lowlim = round(Startimes*multiplier+1); +highlim = round(min((Startimes+Winlength)*multiplier+1,Allsamples)); + + +%%--------------------prepare event array if any -------------------------- +Events = EEG.event; +if ~isempty(Events) + if ~isfield(Events, 'type') || ~isfield(Events, 'latency'), Events = []; end +end +if ~isempty(Events) + if ischar(Events(1).type) + [Eventtypes tmpind indexcolor] = unique_bc({Events.type}); % indexcolor countinas the event type + else [Eventtypes tmpind indexcolor] = unique_bc([ Events.type ]); + end + Eventcolors = { 'r', [0 0.8 0], 'm', 'c', 'k', 'b', [0 0.8 0] }; + Eventstyle = { '-' '-' '-' '-' '-' '-' '-' '--' '--' '--' '--' '--' '--' '--'}; + Eventwidths = [ 2.5 1 ]; + Eventtypecolors = Eventcolors(mod([1:length(Eventtypes)]-1 ,length(Eventcolors))+1); + Eventcolors = Eventcolors(mod(indexcolor-1 ,length(Eventcolors))+1); + Eventtypestyle = Eventstyle (mod([1:length(Eventtypes)]-1 ,length(Eventstyle))+1); + Eventstyle = Eventstyle (mod(indexcolor-1 ,length(Eventstyle))+1); + + % for width, only boundary events have width 2 (for the line) + % ----------------------------------------------------------- + indexwidth = ones(1,length(Eventtypes))*2; + if iscell(Eventtypes) + for index = 1:length(Eventtypes) + if strcmpi(Eventtypes{index}, 'boundary'), indexwidth(index) = 1; end + end + else + end + Eventtypewidths = Eventwidths (mod(indexwidth([1:length(Eventtypes)])-1 ,length(Eventwidths))+1); + Eventwidths = Eventwidths (mod(indexwidth(indexcolor)-1 ,length(Eventwidths))+1); + + % latency and duration of events + % ------------------------------ + Eventlatencies = [ Events.latency ]+1; + if isfield(Events, 'duration') + durations = { Events.duration }; + durations(cellfun(@isempty, durations)) = { NaN }; + Eventlatencyend = Eventlatencies + [durations{:}]+1; + else Eventlatencyend = []; + end + % EventOnset = 1; +end + +if isempty(Events) + EventOnset = 0; +end + +chanNum = numel(ChanArray); + + +%%-------------------------------IC and original data---------------------- +dataica = [];chaNum=0; +if ~isempty(EEG.icaweights) && ~isempty(ICArray)%%pop_eegplot from eeglab + tmpdata = eeg_getdatact(EEG, 'component', [1:size(EEG.icaweights,1)]); + try + dataica = tmpdata(ICArray,:); + catch + dataica = tmpdata(:,:); + ICArray = [1:size(tmpdata,1)]; + end +end + +if EEGdispFlag==1 + dataeeg = EEG.data(ChanArray,:); + chaNum = numel(ChanArray); +else + dataeeg =[]; + chaNum = 0; +end + +%%---------------------------Normalize------------------------------------- +if NormFlag==1 + %%Norm for origanal + % data2 = []; + if ~isempty(dataeeg) + datastd = std(dataeeg(:,1:min(1000,Allsamples)),[],2);% + for i = 1:size(dataeeg,1) + dataeeg(i,:,:) = dataeeg(i,:,:)/datastd(i); + % if ~isempty(data2) + % data2(i,:,:) = data2(i,:,:)*datastd(i); + % end + end + end + + %%norm for IC data + if ~isempty(dataica) + dataicstd = std(dataica(:,1:min(1000,Allsamples)),[],2); + for i = 1:size(dataica,1) + dataica(i,:,:) = dataica(i,:,:)/dataicstd(i); + % if ~isempty(data2) + % data2(i,:,:) = data2(i,:,:)*dataicstd(i); + % end + end + end +end + +% Removing DC for IC data? +% ------------------------- +meandataica =[];ICNum=0; +if ICdispFlag==1 + if ~isempty(EEG.icaweights) && ~isempty(ICArray) && ~isempty(dataica)%%pop_eegplot from eeglab + switch Submean % subtract the mean ? + case 1 + meandataica = mean(dataica(:,lowlim:highlim)'); + if any(isnan(meandataica)) + meandataica = nan_mean(dataica(:,lowlim:highlim)'); + end + otherwise, meandataica = zeros(1,numel(ICArray)); + end + end + ICNum = numel(ICArray); +else + ICNum = 0; +end + +% Removing DC for original data? +% ------------------------- +meandata = []; +if EEGdispFlag==1 && ~isempty(dataeeg) + switch Submean % subtract the mean ? + case 1 + meandata = mean(dataeeg(:,lowlim:highlim)'); + if any(isnan(meandata)) + meandata = nan_mean(dataeeg(:,lowlim:highlim)'); + end + otherwise, meandata = zeros(1,numel(ChanArray)); + end +end + + +PlotNum = chaNum+ICNum; +if chaNum==0 && ICNum==0 + Ampscold = 0*[1:PlotNum]'; + if StackFlag==1 + Ampsc = 0*[1:PlotNum]'; + else + Ampsc = Ampscold; + end + AmpScaleold = 0; + ylims = [0 (PlotNum+1)*AmpScale]; + data = [dataeeg;dataica]; + meandata = [meandata,meandataica]; +elseif ICNum==0 && chaNum~=0 + Ampscold = AmpScale*[1:PlotNum]'; + if StackFlag==1 + Ampsc = ((Ampscold(end)+AmpScale)/2)*ones(1,PlotNum)'; + else + Ampsc = Ampscold; + end + AmpScaleold = AmpScale; + ylims = [AmpScale*(100-bufftobo)/100 PlotNum*AmpScale+AmpScale*bufftobo/100]; + data = [dataeeg;dataica]; + meandata = [meandata,meandataica]; +elseif ICNum~=0 && chaNum==0 + Ampscold = AmpIC*[1:PlotNum]'; + if StackFlag==1 + Ampsc = ((Ampscold(end)+AmpIC)/2)*ones(1,PlotNum)'; + else + Ampsc = Ampscold; + end + ylims = [AmpIC*(100-bufftobo)/100 PlotNum*AmpIC+AmpIC*bufftobo/100]; + AmpScaleold = AmpIC; + data = [dataeeg;dataica]; + meandata = [meandata,meandataica]; + AmpICNew = AmpIC; +elseif ICNum~=0 && chaNum~=0 + AmpICNew = (AmpScale*chaNum+AmpScale/2)/ICNum; + Ampscold1 = AmpICNew*[1:ICNum]'; + Ampscold2 = Ampscold1(end)+AmpScale/2+AmpScale*[1:chaNum]'; + Ampscold = [Ampscold1;Ampscold2]; + if StackFlag==1 + Ampsc = [(Ampscold1(end)/2)*ones(ICNum,1);((Ampscold2(end)+AmpScale+Ampscold2(1)+AmpIC)/2)*ones(chaNum,1)]; + else + Ampsc = Ampscold; + end + AmpScaleold = AmpScale; + ylims = [AmpICNew*(100-bufftobo)/100 Ampscold(end)+AmpScale*bufftobo/100]; + data = [dataeeg;(AmpICNew/AmpIC)*dataica]; + meandata = [meandata,(AmpICNew/AmpIC)*meandataica]; +end + + +Colorgbwave = []; +%%set the wave color for each channel +if ~isempty(data) + ColorNamergb = roundn([255 0 7;186 85 255;255 192 0;0 238 237;0 78 255;0 197 0]/255,-3); + Colorgb_chan = []; + if ~isempty(dataeeg) + chanNum = numel(ChanArray); + if chanNum<=6 + Colorgb_chan = ColorNamergb(1:chanNum,:); + else + jj = floor(chanNum/6); + Colorgb_chan = []; + for ii = 1:jj + Colorgb_chan = [Colorgb_chan; ColorNamergb]; + end + if jj*6~=chanNum + Colorgb_chan = [Colorgb_chan; ColorNamergb(1:chanNum-jj*6,:)]; + end + end + end + + %%colors for ICs + % Coloricrgb = roundn([211,211,211;169,169,16;128,128,128]/255,-3); + Coloricrgb = roundn([180 0 0;127 68 127;228 88 44;15 175 175;0 0 0;9 158 74]/255,-3); + Colorgb_IC = []; + if ~isempty(ICArray) + ICNum = numel(ICArray); + if ICNum<7 + Colorgb_IC = Coloricrgb(1:ICNum,:); + else + jj = floor(ICNum/6); + for ii = 1:jj + Colorgb_IC = [Colorgb_IC; Coloricrgb]; + end + + if jj*6~=ICNum + Colorgb_IC = [Colorgb_IC; Coloricrgb(1:ICNum-jj*6,:)]; + end + + end + end + Colorgbwave = [Colorgb_chan;Colorgb_IC]; +end + + +PlotNum =0; +if ICdispFlag==1 && EEGdispFlag==1 + if ~isempty(EEG.icaweights) && ~isempty(ICArray) + PlotNum = chanNum +numel(ICArray); + else + PlotNum = chanNum; + end +elseif ICdispFlag==0 && EEGdispFlag==1 + PlotNum = chanNum; +elseif ICdispFlag==1 && EEGdispFlag==0 + if ~isempty(EEG.icaweights) && ~isempty(ICArray) + PlotNum = numel(ICArray); + end +end +%% +EventOnsetdur =1; +Trialstag = size(EEG.data,2); +GapSize = ceil(numel([lowlim:highlim])/40); +if GapSize<=2 + GapSize=5; +end +% ------------------------------------------------------------------------- +% -------------------------draw events if any------------------------------ +% ------------------------------------------------------------------------- +% ylims = [0 (PlotNum+1)*AmpScale]; + +FonsizeDefault = f_get_default_fontsize(); +if isempty(FonsizeDefault) || numel(FonsizeDefault)~=1|| any(FonsizeDefault(:)<=0) + FonsizeDefault=10; +end + +if EventOnset==1 && ~isempty(data) && PlotNum~=0 + MAXEVENTSTRING = 75; + if MAXEVENTSTRING<0 + MAXEVENTSTRING = 0; + elseif MAXEVENTSTRING>75 + MAXEVENTSTRING=75; + end + % AXES_POSITION = [0.0964286 0.15 0.842 0.75-(MAXEVENTSTRING-5)/100]; + % + + % find event to plot + % ------------------ + event2plot = find ( Eventlatencies >=lowlim & Eventlatencies <= highlim ); + if ~isempty(Eventlatencyend) + event2plot2 = find ( Eventlatencyend >= lowlim & Eventlatencyend <= highlim ); + event2plot3 = find ( Eventlatencies < lowlim & Eventlatencyend > highlim ); + event2plot = setdiff(union(event2plot, event2plot2), event2plot3); + end + for index = 1:length(event2plot) + %Just repeat for the first one + if index == 1 + EVENTFONT = [' \fontsize{',num2str(FonsizeDefault),'} ']; + end + + % draw latency line + % ----------------- + if ndims(EEG.data)==2 + tmplat = Eventlatencies(event2plot(index))-lowlim-1; + else + % ----------------- + tmptaglat = [lowlim:highlim]; + tmpind = find(mod(tmptaglat-1,Trialstag) == 0); + tmpind = setdiff(tmpind,[1,numel(tmptaglat)]); + alltaglat = setdiff(tmptaglat(tmpind),[1,tmptaglat(end)]); + %%add gap between epochs if any + if ~isempty(tmpind) && ~isempty(alltaglat) %%two or multiple epochs were displayed + if length(alltaglat)==1 + if Eventlatencies(event2plot(index)) >= alltaglat + Singlat = Eventlatencies(event2plot(index))+GapSize; + else + Singlat = Eventlatencies(event2plot(index)); + end + else + if Eventlatencies(event2plot(index)) < alltaglat(1)%%check the first epoch + Singlat = Eventlatencies(event2plot(index)); + else%%the other epochs + for ii = 2:length(alltaglat) + if Eventlatencies(event2plot(index)) >= alltaglat(ii-1) && Eventlatencies(event2plot(index)) < alltaglat(ii) + Singlat = Eventlatencies(event2plot(index))+GapSize*(ii-1); + break; + elseif Eventlatencies(event2plot(index)) >= alltaglat(end) %%check the last epoch + Singlat = Eventlatencies(event2plot(index))+GapSize*length(alltaglat); + break; + end + end + end + end + tmplat = Singlat-lowlim;%%adjust the latency if any + else%%within one epoch + tmplat = Eventlatencies(event2plot(index))-lowlim;%-1; + end + end + tmph = plot(myeegviewer, [ tmplat tmplat ], ylims, 'color', Eventcolors{ event2plot(index) }, ... + 'linestyle', Eventstyle { event2plot(index) }, ... + 'linewidth', Eventwidths( event2plot(index) ) ); + + % schtefan: add Event types text above event latency line + % ------------------------------------------------------- + evntxt = strrep(num2str(Events(event2plot(index)).type),'_','-'); + if length(evntxt)>MAXEVENTSTRING, evntxt = [ evntxt(1:MAXEVENTSTRING-1) '...' ]; end % truncate + try, + if tmplat>=0 + tmph2 = text(myeegviewer, [tmplat], ylims(2)-0.005, [EVENTFONT evntxt], ... + 'color', Eventcolors{ event2plot(index) }, ... + 'horizontalalignment', 'left',... + 'rotation',90,'FontSize',FonsizeDefault); + end + catch, end + + % draw duration is not 0 + % ---------------------- + % if EventOnsetdur && ~isempty(Eventlatencyend) ... + % && Eventwidths( event2plot(index) ) ~= 2.5 % do not plot length of boundary events + % tmplatend = Eventlatencyend(event2plot(index))-lowlim-1; + % if tmplatend ~= 0 + % tmplim = ylims; + % tmpcol = Eventcolors{ event2plot(index) }; + % h = patch(myeegviewer, [ tmplat tmplatend tmplatend tmplat ], ... + % [ tmplim(1) tmplim(1) tmplim(2) tmplim(2) ], ... + % tmpcol ); % this argument is color + % set(h, 'EdgeColor', 'none') + % end + % end + end +else % JavierLC + MAXEVENTSTRING = 10; % default + % AXES_POSITION = [0.0964286 0.15 0.842 0.75-(MAXEVENTSTRING-5)/100]; +end + + +DEFAULT_GRID_SPACING =Winlength/5; + +% if StackFlag==1 +% AmpScale=0; +% end + +% Ampsc = AmpScale*[1:PlotNum]'; +% ------------------------------------------------------------------------- +% -----------------draw EEG wave if any------------------------------------ +% ------------------------------------------------------------------------- +leftintv = []; +%%Plot continuous EEG +tmpcolor = [ 0 0 0.4 ]; +if ndims(EEG.data)==2 + if ~isempty(data) && PlotNum~=0 + + for ii = size(data,1):-1:1 + try + plot(myeegviewer, (data(ii,lowlim:highlim)+ Ampsc(size(data,1)-ii+1)-meandata(ii))' , ... + 'color', Colorgbwave(ii,:), 'clipping','on','LineWidth',0.75);%% + catch + plot(myeegviewer, (data(ii,lowlim:highlim)+ Ampsc(size(data,1)-ii+1)-meandata(ii))', ... + 'color', tmpcolor, 'clipping','on','LineWidth',0.75);%% + end + end + set(myeegviewer,'TickDir', 'in','LineWidth',1); + %%xtick + set(myeegviewer, 'Xlim',[1 Winlength*multiplier+1],... + 'XTick',[1:multiplier*DEFAULT_GRID_SPACING:Winlength*multiplier+1]); + set(myeegviewer, 'XTickLabel', num2str((Startimes:DEFAULT_GRID_SPACING:Startimes+Winlength)')); + + %% + %%-----------------plot scale------------------ + leftintv = Winlength*multiplier+1; + else + set(myeegviewer, 'XTick', [], 'YTick', [],'Box','off', 'Color','none','xcolor','none','ycolor','none'); + end +end + +%%------------------------------plot single-trial EEG---------------------- +%%Thanks for the eeglab developers so that we can borrow their codes +isfreq = 0; +Limits = [EEG.times(1),EEG.times(end)]; +Srate = EEG.srate; +Freqlimits = []; +if EEG.trials>1 + if ~isempty(data) && PlotNum~=0 + % plot trial limits + % ----------------- + tmptag = [lowlim:highlim]; + tmpind = find(mod(tmptag-1,Trialstag) == 0); + % for index = tmpind + % plot(ax0, [tmptag(index)-lowlim tmptag(index)-lowlim], [0 1], 'b--'); + % end + alltag = tmptag(tmpind); + if isempty(tmpind) + epochNum = 0; + else + epochNum = numel(setdiff(tmpind,[0 1 numel(tmptag)])); + end + % compute epoch number + % -------------- + alltag1 = alltag; + if ~isempty(tmpind) + tagnum = (alltag1-1)/Trialstag+1; + for ii = 1:numel(tmpind) + alltag1(ii) = alltag1(ii)+(ii-1)*GapSize; + end + for ii = 1:numel(tagnum) + text(myeegviewer, [alltag1(ii)-lowlim+Trialstag/2],ylims(2)+1.1, [32,num2str(tagnum(ii))], ... + 'color', 'k','FontSize',FonsizeDefault, ... + 'horizontalalignment', 'left','rotation',90); %% + set(myeegviewer,'Xlim',[1 (Winlength*multiplier+epochNum*GapSize)]); + end + end + + %%add the gap between epochs if any + Epochintv = []; + + if ~isempty(tmpind) + if (numel(tmpind)==1 && tmpind(end) == numel(tmptag)) || (numel(tmpind)==1 && tmpind(1) == 1) + dataplot = data(:,lowlim:highlim); + Epochintv(1,1) =1; + Epochintv(1,2) =numel(lowlim:highlim); + else + tmpind = unique(setdiff([0,tmpind, numel(tmptag)],1)); + dataplotold = data(:,lowlim:highlim); + dataplot_new = []; + for ii = 2:numel(tmpind) + GapLeft = tmpind(ii-1)+1; + GapRight = tmpind(ii); + if GapLeft<1 + GapLeft =1; + end + if GapRight > numel(tmptag) + GapRight = numel(tmptag); + end + dataplot_new = [dataplot_new,dataplotold(:,GapLeft:GapRight),nan(size(dataplotold,1),GapSize)]; + Epochintv(ii-1,1) = GapLeft+(ii-2)*GapSize; + Epochintv(ii-1,2) = GapRight+(ii-2)*GapSize; + end + if ~isempty(dataplot_new) + dataplot = dataplot_new; + else + dataplot = dataplotold; + end + end + end + + %%-----------plot background color for trias with artifact--------- + %%highlight waves with labels + Value_adjust = floor(Startimes+1); + if Value_adjust<1 + Value_adjust=1; + end + tagnum = unique([Value_adjust,tagnum]); + + try trialsMakrs = EEG.reject.rejmanual(tagnum);catch trialsMakrs = zeros(1,numel(tagnum)) ; end + try trialsMakrschan = EEG.reject.rejmanualE(:,tagnum);catch trialsMakrschan = zeros(EEG.nbchan,numel(tagnum)) ; end + tmpcolsbgc = [1 1 0.783]; + if ~isempty(Epochintv) + for jj = 1:size(Epochintv,1) + [xpos,~]=find(trialsMakrschan(:,jj)==1); + if jj<= numel(trialsMakrs) && ~isempty(xpos) + if trialsMakrs(jj)==1 + patch(myeegviewer,[Epochintv(jj,1),Epochintv(jj,2),Epochintv(jj,2),Epochintv(jj,1)],... + [ylims(1),ylims(1),ylims(end),ylims(end)],tmpcolsbgc,'EdgeColor','none','FaceAlpha',.5); + %%highlight the wave if the channels exist + if chaNum~=0 + ChanArray = reshape(ChanArray,1,numel(ChanArray)); + [~,ypos1]=find(ChanArray==xpos); + if ~isempty(ypos1) + for kk = 1:numel(ypos1) + dataChan = nan(1,size(dataplot,2)); + dataChan (1,Epochintv(jj,1):Epochintv(jj,2)) = dataplot(ypos1(kk),Epochintv(jj,1):Epochintv(jj,2)); + dataChan1= nan(1,size(dataplot,2)); + dataChan1 (1,Epochintv(jj,1):Epochintv(jj,1)) = dataplot(ypos1(kk),Epochintv(jj,1):Epochintv(jj,1)); + try + plot(myeegviewer, (dataChan+ Ampsc(size(dataplot,1)-ypos1(kk)+1)-meandata(ypos1(kk)))' , ... + 'color', Colorgbwave(ypos1(kk),:), 'clipping','on','LineWidth',1.5);%% + + plot(myeegviewer, (dataChan1+ Ampsc(size(dataplot,1)-ypos1(kk)+1)-meandata(ypos1(kk)))' , ... + 'color', Colorgbwave(ypos1(kk),:), 'clipping','on','LineWidth',1.5,'Marker' ,'s','MarkerSize',8,... + 'MarkerEdgeColor',Colorgbwave(ypos1(kk),:),'MarkerFaceColor',Colorgbwave(ypos1(kk),:));%% + catch + plot(myeegviewer, (dataChan+ Ampsc(size(dataplot,1)-ypos1(kk)+1)-meandata(ypos1(kk)))', ... + 'color', tmpcolor, 'clipping','on','LineWidth',1.5);%% + plot(myeegviewer, (dataChan1+ Ampsc(size(dataplot,1)-ypos1(kk)+1)-meandata(ypos1(kk)))', ... + 'color', tmpcolor, 'clipping','on','LineWidth',1.5,'Marker' ,'s','MarkerSize',8,... + 'MarkerEdgeColor',Colorgbwave(ypos1(kk),:),'MarkerFaceColor',Colorgbwave(ypos1(kk),:));%% + end + end + end + end + end + end + end + end + + %% + for ii = size(dataplot,1):-1:1 + try + plot(myeegviewer, (dataplot(ii,:)+ Ampsc(size(dataplot,1)-ii+1)-meandata(ii))' + (PlotNum+1)*(OldAmpScale-AmpScale)/2, ... + 'color', Colorgbwave(ii,:), 'clipping','on','LineWidth',0.75);%% + catch + plot(myeegviewer, (dataplot(ii,:)+ Ampsc(size(dataplot,1)-ii+1)-meandata(ii))' + (PlotNum+1)*(OldAmpScale-AmpScale)/2, ... + 'color', tmpcolor, 'clipping','on','LineWidth',0.75);%% + end + end + + %------------------------Xticks------------------------------------ + tagpos = []; + tagtext = []; + if ~isempty(alltag) + alltag = [alltag(1)-Trialstag alltag alltag(end)+Trialstag]; % add border trial limits + else + alltag = [ floor(lowlim/Trialstag)*Trialstag ceil(highlim/Trialstag)*Trialstag ]+1; + end + + nbdiv = 20/Winlength; % approximative number of divisions + divpossible = [ 100000./[1 2 4 5] 10000./[1 2 4 5] 1000./[1 2 4 5] 100./[1 2 4 5 10 20]]; % possible increments + [tmp indexdiv] = min(abs(nbdiv*divpossible-(Limits(2)-Limits(1)))); % closest possible increment + incrementpoint = divpossible(indexdiv)/1000*Srate; + + % tag zero below is an offset used to be sure that 0 is included + % in the absicia of the data epochs + if Limits(2) < 0, tagzerooffset = (Limits(2)-Limits(1))/1000*Srate+1; + else tagzerooffset = -Limits(1)/1000*Srate; + end + if tagzerooffset < 0, tagzerooffset = 0; end + + for i=1:length(alltag)-1 + if ~isempty(tagpos) && tagpos(end)-alltag(i)<2*incrementpoint/3 + tagpos = tagpos(1:end-1); + end + if ~isempty(Freqlimits) + tagpos = [ tagpos linspace(alltag(i),alltag(i+1)-1, nbdiv) ]; + else + if tagzerooffset ~= 0 + tmptagpos = [alltag(i)+tagzerooffset:-incrementpoint:alltag(i)]; + else + tmptagpos = []; + end + tagpos = [ tagpos [tmptagpos(end:-1:2) alltag(i)+tagzerooffset:incrementpoint:(alltag(i+1)-1)]]; + end + end + + % find corresponding epochs + % ------------------------- + if ~isfreq + tmplimit = Limits; + tpmorder = 1E-3; + else + tmplimit =Freqlimits; + tpmorder = 1; + end + tagtext = eeg_point2lat(tagpos, floor((tagpos)/Trialstag)+1, Srate, tmplimit,tpmorder); + + %%adjust xticks + EpochFlag = floor((tagpos)/Trialstag)+1;%% + + EpochFlag = reshape(EpochFlag,1,numel(EpochFlag)); + xtickstr = tagpos-lowlim+1; + [xpos,ypos] = find(xtickstr>0); + if ~isempty(ypos) + EpochFlag =EpochFlag(ypos); + xtickstr = xtickstr(ypos); + tagtext = tagtext(ypos); + end + + EpochFlagunique =unique(setdiff(EpochFlag,0)); + if numel(EpochFlagunique)~=1 + for ii = 2:numel(EpochFlagunique) + [xpos,ypos]= find(EpochFlag==EpochFlagunique(ii)); + if ~isempty(ypos) + xtickstr(ypos) = xtickstr(ypos)+(EpochFlagunique(ii)-EpochFlagunique(1))*GapSize;%*(1000/Srate); + end + end + end + set(myeegviewer, 'Xlim',[1 (Winlength*multiplier+epochNum*GapSize)],... + 'XTick',xtickstr,... + 'XTickLabel', tagtext,... + 'FontWeight','normal',... + 'xaxislocation', 'bottom','FontSize',FonsizeDefault); + XTickLabel = cellstr(myeegviewer.XTickLabel); + for Numofxtick = 1:length(XTickLabel) + if strcmpi(XTickLabel{Numofxtick,:},'-0') + XTickLabel{Numofxtick} = '0'; + end + end + set(myeegviewer,'XTickLabel',XTickLabel); + %% + %%-----------------plot scale------------------ + leftintv = (Winlength*multiplier+epochNum*GapSize); + else + set(myeegviewer, 'XTick', [], 'YTick', [],'Box','off', 'Color','none','xcolor','none','ycolor','none'); + end +end + + +%% +%%----------------------------plot y scale--------------------------------- +if ~isempty(data) && PlotNum~=0 && ~isempty(leftintv) + ytick_bottom = myeegviewer.TickLength(1)*diff(myeegviewer.XLim); + % xtick_bottom = myeegviewer.TickLength(1)*diff(myeegviewer.YLim); + leftintv = leftintv+ytick_bottom*2.5; + rightintv = leftintv; + if ICdispFlag~=0 + line(myeegviewer,[leftintv,rightintv],[ylims(1) AmpICNew+ylims(1)],'color','k','LineWidth',1, 'clipping','off'); + line(myeegviewer,[leftintv-ytick_bottom,rightintv+ytick_bottom],[ylims(1) ylims(1)],'color','k','LineWidth',1, 'clipping','off'); + line(myeegviewer,[leftintv-ytick_bottom,rightintv+ytick_bottom],[AmpICNew+ylims(1) AmpICNew+ylims(1)],'color','k','LineWidth',1, 'clipping','off'); + text(myeegviewer,leftintv,((ylims(2)-ylims(1))/43+AmpICNew+ylims(1)), [num2str(AmpIC),32,'\muV'],'HorizontalAlignment', 'center','FontSize',FonsizeDefault); + text(myeegviewer,leftintv,((ylims(2)-ylims(1))/20+AmpICNew+ylims(1)), ['ICs'],'HorizontalAlignment', 'center','FontSize',FonsizeDefault); + end + if EEGdispFlag~=0 + line(myeegviewer,[leftintv,rightintv],[ylims(end)-AmpScale ylims(end)],'color','k','LineWidth',1, 'clipping','off'); + line(myeegviewer,[leftintv-ytick_bottom,rightintv+ytick_bottom],[ylims(end)-AmpScale ylims(end)-AmpScale],'color','k','LineWidth',1, 'clipping','off'); + line(myeegviewer,[leftintv-ytick_bottom,rightintv+ytick_bottom],[ylims(end) ylims(end)],'color','k','LineWidth',1, 'clipping','off'); + text(myeegviewer,leftintv,(ylims(2)-ylims(1))/43+ylims(end), [num2str(AmpScale),32,'\muV'],'HorizontalAlignment', 'center','FontSize',FonsizeDefault); + text(myeegviewer,leftintv,(ylims(2)-ylims(1))/20+ylims(end), ['Chans'],'HorizontalAlignment', 'center','FontSize',FonsizeDefault); + end +end + +%%---------------------------ytick ticklabels------------------------------ +if ~isempty(data) && PlotNum~=0 + if chaNum==0 + ChanArray = []; + end + set(myeegviewer, 'ylim',[ylims(1) ylims(end)],'YTick',[ylims(1) Ampscold']); + [YLabels,chaName,ICName] = f_eeg_read_chan_IC_names(EEG.chanlocs,ChanArray,ICArray,ChanLabel); + YLabels = flipud(char(YLabels,'')); + set(myeegviewer,'YTickLabel',cellstr(YLabels),... + 'TickLength',[.005 .005],... + 'Color','none',... + 'XColor','k',... + 'YColor','k',... + 'FontWeight','normal',... + 'TickDir', 'in',... + 'LineWidth',0.5,'FontSize',FonsizeDefault);%%,'HorizontalAlignment','center' + count=0; + for ii = length(myeegviewer.YTickLabel):-1:2 + count = count+1; + Cellsing = strrep(myeegviewer.YTickLabel{ii},'_','\_'); + myeegviewer.YTickLabel{ii} = strcat('\color[rgb]{',num2str(Colorgbwave(count,:)),'}', Cellsing); + end +end +end + diff --git a/studio_functions/Functions/EStudio/EEG Tab/pop_duplicateeg.m b/studio_functions/Functions/EStudio/EEG Tab/pop_duplicateeg.m new file mode 100644 index 00000000..ba0b1454 --- /dev/null +++ b/studio_functions/Functions/EStudio/EEG Tab/pop_duplicateeg.m @@ -0,0 +1,193 @@ +% PURPOSE: pop_duplicateeg.m +% duplicate ERPset +% + +% FORMAT: +% [EEG, erpcom] = pop_duplicateeg( EEG, 'ChanArray',ChanArray,... +% 'Saveas', 'off', 'History', 'gui'); + +% Inputs: +% +%EEG -EEG structure +%ChanArray -index(es) of channels + + + + +% *** This function is part of ERPLAB Studio *** +% Author: Guanghui Zhang & Steven Luck +% ghzhang@ucdavis.edu, sjluck@ucdavis.edu +% Center for Mind and Brain +% University of California, Davis, +% Davis, CA +% Dec. 2024 + + + + +function [EEG, erpcom] = pop_duplicateeg(EEG, varargin) +erpcom = ''; + +if nargin < 1 + help pop_duplicateeg + return +end +if isempty(EEG) + msgboxText = 'Cannot duplicate an empty EEGset'; + title = 'ERPLAB: pop_duplicateeg() error'; + errorfound(msgboxText, title); + return +end +if isempty(EEG(1).data) + msgboxText = 'Cannot duplicate an empty EEGset'; + title = 'ERPLAB: pop_duplicateeg() error'; + errorfound(msgboxText, title); + return +end + + + +if length(EEG)>1 + msgboxText = 'Cannot duplicate multiple EEGsets!'; + title = 'ERPLAB: pop_duplicateeg() error'; + errorfound(msgboxText, title); + return +end +if nargin==1 + def = erpworkingmemory('pop_duplicateeg'); + if isempty(def) + def = {[]}; + end + ChanArray =def{1}; + + def = f_ERP_duplicate(EEG,ChanArray); + if isempty(def) + return; + end + ChanArray = def{1}; + erpworkingmemory('pop_duplicateeg',def); + % + % Somersault + % + [EEG, erpcom] = pop_duplicateeg( EEG, 'ChanArray',ChanArray,... + 'Saveas', 'off', 'History', 'gui'); + return +end + +% +% Parsing inputs +% +p = inputParser; +p.FunctionName = mfilename; +p.CaseSensitive = false; +p.addRequired('EEG'); +% option(s) +p.addParamValue('ChanArray', [],@isnumeric); +p.addParamValue('Saveas', 'off', @ischar); +p.addParamValue('History', 'script', @ischar); % history from scripting + +p.parse(EEG, varargin{:}); + +ChanArray = p.Results.ChanArray; +if isempty(ChanArray) || any(ChanArray(:)>EEG.nbchan) || any(ChanArray(:)<=0) + ChanArray = [[1:EEG.nbchan]]; +end + + +if ~isempty(ChanArray) + EEG.saved = 'no'; + EEG.filepath = ''; + chanDelete = setdiff([1:EEG.nbchan],ChanArray); + if ~isempty(chanDelete) + count = 0; + for ii = chanDelete + count = count+1; + ChanArrayStr{count} = EEG.chanlocs(ii).labels; + end + EEG = pop_select( EEG, 'rmchannel', ChanArrayStr); + % EEG = eeg_checkset(EEG); + end +end + + + +if strcmpi(p.Results.Saveas,'on') + issaveas = 1; +else + issaveas = 0; +end +if strcmpi(p.Results.History,'implicit') + shist = 3; % implicit +elseif strcmpi(p.Results.History,'script') + shist = 2; % script +elseif strcmpi(p.Results.History,'gui') + shist = 1; % gui +else + shist = 0; % off +end + +EEG.saved = 'no'; + +% +% History +% + +skipfields = {'EEG', 'Saveas','History'}; +fn = fieldnames(p.Results); +erpcom = sprintf( '%s = pop_duplicateeg( %s ', inputname(1), inputname(1) ); +for q=1:length(fn) + fn2com = fn{q}; + if ~ismember_bc2(fn2com, skipfields) + fn2res = p.Results.(fn2com); + if ~isempty(fn2res) + if ischar(fn2res) + if ~strcmpi(fn2res,'off') + erpcom = sprintf( '%s, ''%s'', ''%s''', erpcom, fn2com, fn2res); + end + else + if iscell(fn2res) + if ischar([fn2res{:}]) + fn2resstr = sprintf('''%s'' ', fn2res{:}); + else + fn2resstr = vect2colon(cell2mat(fn2res), 'Sort','on'); + end + fnformat = '{%s}'; + else + fn2resstr = vect2colon(fn2res, 'Sort','on'); + fnformat = '%s'; + end + if strcmpi(fn2com,'Criterion') + if p.Results.Criterion<100 + erpcom = sprintf( ['%s, ''%s'', ' fnformat], erpcom, fn2com, fn2resstr); + end + else + erpcom = sprintf( ['%s, ''%s'', ' fnformat], erpcom, fn2com, fn2resstr); + end + end + end + end +end +erpcom = sprintf( '%s );', erpcom); + +% +% Save ERPset from GUI +% +if issaveas + [EEG, ~] = pop_saveset( EEG, 'filename',EEG.filename,'filepath',EEG.filepath); +end + + + +% get history from script. EEG +switch shist + case 1 % from GUI + displayEquiComERP(erpcom); + case 2 % from script + EEG = eegh(erpcom, EEG); + case 3 + % implicit + otherwise %off or none + erpcom = ''; + return +end +return \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/EEG Tab/pop_editdatachanlocs.m b/studio_functions/Functions/EStudio/EEG Tab/pop_editdatachanlocs.m new file mode 100644 index 00000000..5a763221 --- /dev/null +++ b/studio_functions/Functions/EStudio/EEG Tab/pop_editdatachanlocs.m @@ -0,0 +1,267 @@ +% PURPOSE: pop_editdatachanlocs.m is to edit the channel locations +% +% + +% FORMAT : +% +% pop_editdatachanlocs(ALLEEG, CURRENTSET, parameters); +% + +% ALLEEG - structure array of ALLEEG/ERP structures +% CURRENTSET - Index for current EEGset/ERPset + + + +% The available parameters are as follows: +% +%ChanArray -index(es) for the selected channels +%Chanlocs - channel locations for the selected channels + + + +%%Output +%%EEG -EEG/ERP structure with the changed chan locations of the selected channels + + +%%Example: +%EEG = pop_editdatachanlocs( ALLEEG, 2, 'ChanArray', [1 2 3], 'Chanlocs', chanlocs, 'History', 'implicit' ); + + + +% *** This function is part of ERPLAB Studio *** +% Author: Guanghui Zhang & Steven Luck +% ghzhang@ucdavis.edu, sjluck@ucdavis.edu +% Center for Mind and Brain +% University of California, Davis, +% Davis, CA +% Sep. 2023 + + + +function [EEG,eegcom] = pop_editdatachanlocs(ALLEEG,CURRENTSET,varargin) + +eegcom = ''; +if nargin < 1 + help pop_editdatachanlocs + return; +end + +if isempty(ALLEEG)%% + beep; + disp('ALLEEG is empty'); + return; +end + +if nargin< 3 + %%Do we need to create a GUI that the user can use it to define the + %%desired parameters? + + if nargin< 2 || isempty(CURRENTSET) || numel(CURRENTSET)~=1 || CURRENTSET>length(ALLEEG) || CURRENTSET<=0 + CURRENTSET = length(ALLEEG); + end + EEG = ALLEEG(CURRENTSET); + if ~isfield(EEG,'chanlocs') + beep; + disp('The current dataset donot have chanlocs field'); + return; + end + chanlocs = EEG.chanlocs; + if ~isfield(chanlocs,'labels') + beep; + disp('There is no labels for chanlocs for the current dataset'); + return; + end + + ChanArray = [1:length(EEG.chanlocs)]; + + + titleName= ['Dataset',32,num2str(CURRENTSET),': Add/Edit Channel locations']; + EEGIN = EEG; + EEGIN.chanlocs = EEG.chanlocs(ChanArray); + app = feval('f_editchan_gui',EEGIN,titleName); + waitfor(app,'Finishbutton',1); + try + EEGINOUT = app.output; %NO you don't want to output EEG with edited channel locations, you want to output the parameters to run decoding + app.delete; %delete app from view + pause(0.5); %wait for app to leave + catch + disp('User selected Cancel') + return + end + if isempty(EEGINOUT) + disp('User selected Cancel') + return + end + + Chanlocs = EEGINOUT.chanlocs; + %%add suffix + try + ALLEEG(CURRENTSET).setname = [ALLEEG(CURRENTSET).setname,'_editchan']; + catch + ALLEEG(CURRENTSET).erpname = [ALLEEG(CURRENTSET).erpname,'_editchan']; + end + [EEG, eegcom] = pop_editdatachanlocs(ALLEEG,CURRENTSET,'ChanArray',ChanArray,'Chanlocs',Chanlocs,'History', 'gui'); + pause(0.1); + return; +end + + +% +% Parsing inputs +% +% colordef = getcolorcellerps; %{'k' 'r' 'b' 'g' 'c' 'm' 'y' 'w'};% default colors +p = inputParser; +p.FunctionName = mfilename; +p.CaseSensitive = false; +p.addRequired('ALLEEG'); +p.addRequired('CURRENTSET'); + +%Option(s) +p.addParamValue('ChanArray',[],@isnumeric); +p.addParamValue('Chanlocs','', @isstruct); + +p.addParamValue('History', '', @ischar); % history from scripting + +p.parse(ALLEEG,CURRENTSET,varargin{:}); + +p_Results = p.Results; + +if strcmpi(p_Results.History,'command') + shist = 4;%%Show Maltab command only and donot plot the wave +elseif strcmpi(p_Results.History,'implicit') + shist = 3; % implicit +elseif strcmpi(p_Results.History,'script') + shist = 2; % script +elseif strcmpi(p_Results.History,'gui') + shist = 1; % gui +else + shist = 0; % off +end + + +if isempty(ALLEEG)%% + beep; + disp('ALLEEG is empty'); + return; +end + + +if isempty(CURRENTSET) || numel(CURRENTSET)~=1 || CURRENTSET>length(ALLEEG) || CURRENTSET<=0 + CURRENTSET = length(ALLEEG); +end + +EEG = ALLEEG(CURRENTSET); +if ~isfield(EEG,'chanlocs') + beep; + disp('The current dataset donot have chanlocs field'); + return; +end +chanlocs = EEG.chanlocs; +if ~isfield(chanlocs,'labels') + beep; + disp('There is no labels for chanlocs for the current dataset'); + return; +end + + +%%channel array +qchanArray = p_Results.ChanArray; +nbchan = length(EEG.chanlocs); +if isempty(qchanArray) || min(qchanArray(:))>nbchan || max(qchanArray(:))>nbchan || min(qchanArray(:))<=0 + qchanArray = [1:nbchan]; +end + + + +%%IC array (the default is empty, that is, donot display ICs) +qChanlocsnew = p_Results.Chanlocs; +if isempty(qChanlocsnew) + disp('Chanlocs is empty'); + return; +end + +% +%%adjust the number of channels and channel names +for Numofchan = 1:numel(qchanArray) + try + qChanlocsnew(Numofchan) = qChanlocsnew(Numofchan); + catch + qChanlocsnew(Numofchan) = EEG.chanlocs(qchanArray(Numofchan)); + fprintf(2,['\n Warning: Location for channel ',32,num2str(qchanArray(Numofchan)),32,'was not defined, we threfore used its original one.\n']); + end +end + + +%%--------------change the channel names----------------------------------- +for Numofchan = 1:numel(qchanArray) + fprintf(['Chan',32,num2str(qchanArray(Numofchan)),': Location was edited.\n']); + EEG.chanlocs(qchanArray(Numofchan)) = qChanlocsnew(Numofchan); +end + + + +%%history +fn = fieldnames(p.Results); +skipfields = {'ALLEEG','CURRENTSET'}; +if isfield(EEG,'datatype') && strcmpi(EEG.datatype,'ERP') + eegcom = sprintf( 'ERP = pop_editdatachanlocs( %s %s', 'ALLERP,',num2str(CURRENTSET)); +else +eegcom = sprintf( 'EEG = pop_editdatachanlocs( %s %s', 'ALLEEG,',num2str(CURRENTSET)); +end +for q=1:length(fn) + fn2com = fn{q}; % inputname + if ~ismember_bc2(fn2com, skipfields) + fn2res = p.Results.(fn2com); % input value + if ~isempty(fn2res) + if isstruct(fn2res) + eegcom = sprintf( '%s, ''%s'', %s', eegcom, fn2com, fn2com); + elseif iscell(fn2res) + nn = length(fn2res); + eegcom = sprintf( '%s, ''%s'', {''%s'' ', eegcom, fn2com, fn2res{1}); + for ff=2:nn + eegcom = sprintf( '%s, ''%s'' ', eegcom, fn2res{ff}); + end + eegcom = sprintf( '%s}', eegcom); + elseif isnumeric(fn2res) + + if size(fn2res,1)==1 + fn2res_trans = char(num2str(fn2res)); + else + fn2res_trans = vect2colon(fn2res); + end + fn2res = fn2res_trans; + eegcom = sprintf( '%s, ''%s'', [%s', eegcom,fn2com,fn2res); + eegcom = sprintf( '%s]', eegcom); + else + % if ~ismember_bc2(fn2com,{'xscale','yscale'}) + % eegcom = sprintf( '%s, ''%s'', %s', eegcom, fn2com, vect2colon(fn2res,'Repeat','on')); + % else + % xyscalestr = sprintf('[ %.1f %.1f %s ]', fn2res(1), fn2res(2), vect2colon(fn2res(3:end),'Delimiter','off')); + % eegcom = sprintf( '%s, ''%s'', %s', eegcom, fn2com, xyscalestr); + % end + end + end + end +end + +eegcom = sprintf( '%s );', eegcom); +% get history from script. ERP +% shist = 1; +switch shist + case 1 % from GUI + displayEquiComERP(eegcom); + case 2 % from script + for i=1:length(ALLEEG) + ALLEEG(i) = erphistory(ALLEEG(i), [], eegcom, 1); + end + case 3 + % implicit + case 4 + displayEquiComERP(eegcom); + + otherwise %off or none + eegcom = ''; + return +end + +return; \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/EEG Tab/pop_eeg_ar_summary.m b/studio_functions/Functions/EStudio/EEG Tab/pop_eeg_ar_summary.m new file mode 100644 index 00000000..7e705d42 --- /dev/null +++ b/studio_functions/Functions/EStudio/EEG Tab/pop_eeg_ar_summary.m @@ -0,0 +1,48 @@ +%%This function is to display the summary of trial information +% +% FORMAT : +% +% pop_eeg_ar_summary(ALLEEG,EEGArray); +% +% ALLEEG - structure array of EEG structures +% EEGArray -index of eegsets + + + + +% *** This function is part of ERPLAB Studio Toolbox *** +% Author: Guanghui Zhang & Steven Luck +% Center for Mind and Brain +% University of California, Davis, +% Davis, CA +% Apr. 2024 + + + +function eegcom = pop_eeg_ar_summary(ALLEEG,EEGArray) + +eegcom = ''; +if nargin < 1 || nargin >2 + help pop_eeg_ar_summary + return +end +if nargin < 2 + EEGArray = [1:length(ALLEEG)]; +end +if isempty(EEGArray) || any(EEGArray(:)>length(ALLEEG)) || any(EEGArray(:)<1) + EEGArray = [1:length(ALLEEG)]; +end +if isempty(ALLEEG) + msgboxText = ['ALLEEG is empty.']; + title = 'ERPLAB Studio: pop_eeg_ar_summary() inputs'; + errorfound(sprintf(msgboxText), title); + return +end + +if ~isempty(EEGArray) + app = feval('EEG_trial_rejection_sumr',ALLEEG(EEGArray),1); + waitfor(app,'Finishbutton',1); +end +EEGArraystr= vect2colon(EEGArray); +eegcom = sprintf('eegcom = pop_eeg_ar_summary(ALLEEG,%s);',EEGArraystr); +end \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/EEG Tab/pop_eeg_eventlist_view.m b/studio_functions/Functions/EStudio/EEG Tab/pop_eeg_eventlist_view.m new file mode 100644 index 00000000..973c23ff --- /dev/null +++ b/studio_functions/Functions/EStudio/EEG Tab/pop_eeg_eventlist_view.m @@ -0,0 +1,144 @@ +% PURPOSE: pop_eeg_eventlist_view.m +% display eventlist + +% FORMAT: +% [ALLEEG, erpcom] = pop_eeg_eventlist_view( ALLEEG, 'EEGArray',EEGArray,... +% 'Saveas', 'off', 'History', 'gui'); + +% Inputs: +% +%ALLEEG -ALLEEG structure +%EEGArray -index(es) of eegsets + + + +% *** This function is part of ALLEEGLAB Studio *** +% Author: Guanghui Zhang & Steven Luck +% ghzhang@ucdavis.edu, sjluck@ucdavis.edu +% Center for Mind and Brain +% University of California, Davis, +% Davis, CA +% May 2024 + + + + +function [ALLEEG, erpcom] = pop_eeg_eventlist_view(ALLEEG, varargin) +erpcom = ''; + +if nargin < 1 + help pop_eeg_eventlist_view + return +end +if isempty(ALLEEG) + msgboxText = 'Cannot handle an empty EEGset'; + title = 'ERPLAB: pop_eeg_eventlist_view() error'; + errorfound(msgboxText, title); + return +end +if isempty(ALLEEG(1)) + msgboxText = 'Cannot handle an empty EEGset'; + title = 'ERPLAB: pop_eeg_eventlist_view() error'; + errorfound(msgboxText, title); + return +end + + + +if nargin==1 + EEGArray = [1:length(ALLEEG)]; + [ALLEEG, erpcom] = pop_eeg_eventlist_view( ALLEEG, 'EEGArray',EEGArray,... + 'Saveas', 'off', 'History', 'gui'); + return +end + +% +% Parsing inputs +% +p = inputParser; +p.FunctionName = mfilename; +p.CaseSensitive = false; +p.addRequired('ALLEEG'); +% option(s) +p.addParamValue('EEGArray', [],@isnumeric); +p.addParamValue('Saveas', 'off', @ischar); +p.addParamValue('History', 'script', @ischar); % history from scripting + +p.parse(ALLEEG, varargin{:}); + + +EEGArray = p.Results.EEGArray; + +if isempty(EEGArray) || any(EEGArray(:)>length(ALLEEG)) || any(EEGArray(:)<1) + EEGArray = [1:length(ALLEEG)]; +end + +feval("EEG_evenlist_gui",ALLEEG(EEGArray)); + +if strcmpi(p.Results.Saveas,'on') + issaveas = 1; +else + issaveas = 0; +end +if strcmpi(p.Results.History,'implicit') + shist = 3; % implicit +elseif strcmpi(p.Results.History,'script') + shist = 2; % script +elseif strcmpi(p.Results.History,'gui') + shist = 1; % gui +else + shist = 0; % off +end + + + + +% +% History +% + +skipfields = {'ALLEEG', 'Saveas','History'}; +fn = fieldnames(p.Results); +erpcom = sprintf( '%s = pop_eeg_eventlist_view( %s ', inputname(1), inputname(1) ); +for q=1:length(fn) + fn2com = fn{q}; + if ~ismember_bc2(fn2com, skipfields) + fn2res = p.Results.(fn2com); + if ~isempty(fn2res) + if ischar(fn2res) + if ~strcmpi(fn2res,'off') && ~strcmpi(fn2res,'no') + erpcom = sprintf( '%s, ''%s'', ''%s''', erpcom, fn2com, fn2res); + end + else + erpcom = sprintf( '%s, ''%s'', %s', erpcom, fn2com, vect2colon(fn2res,'Repeat','on')); + end + end + end +end +erpcom = sprintf( '%s );', erpcom); + +% +% Save ALLEEGset from GUI +% +if issaveas + for ii = 1:length(ALLEEG) + [ALLEEG(ii), ~] = pop_saveset( ALLEEG(ii), 'filename',ALLEEG(ii).filename,'filepath',[ALLEEG(ii).filepath,filesep]); + end +end + + +% get history from script. ALLEEG +switch shist + case 1 % from GUI + displayEquiComERP(erpcom); + case 2 % from script + for ii = 1:length(EEGArray) + ALLEEG(EEGArray(ii)) = eegh(erpcom, ALLEEG(EEGArray(ii))); + end + case 3 + % implicit + otherwise %off or none + erpcom = ''; + return +end +return \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/EEG Tab/pop_eeg_save_trial_information.m b/studio_functions/Functions/EStudio/EEG Tab/pop_eeg_save_trial_information.m new file mode 100644 index 00000000..83975938 --- /dev/null +++ b/studio_functions/Functions/EStudio/EEG Tab/pop_eeg_save_trial_information.m @@ -0,0 +1,287 @@ +%write trial information to .text or .xls file + + + +function eegcom = pop_eeg_save_trial_information(ALLEEG, varargin) + +eegcom = ''; +if nargin<1 + help pop_eeg_save_trial_information + return +end + +if nargin==1 + if isempty(ALLEEG) + msgboxText = ['pop_eeg_save_trial_information: ALLEEG is empty!']; + titlNamerro = 'Error for pop_eeg_save_trial_information'; + estudio_warning(msgboxText,titlNamerro); + return; + end + EEGArray = [1:length(ALLEEG)]; + binArray = [1:ALLEEG(1).EVENTLIST.nbin]; + + eegcom = pop_eeg_save_trial_information(ALLEEG, 'EEGArray',EEGArray,'binArray',binArray,'History', 'gui'); + pause(0.01); + return +end + +p = inputParser; +p.FunctionName = mfilename; +p.CaseSensitive = false; +p.addRequired('ALLEEG'); + +p.addParamValue('EEGArray', [], @isnumeric); % +p.addParamValue('binArray', [], @isnumeric); +p.addParamValue('History', 'script', @ischar); % history from scripting + +p.parse(ALLEEG, varargin{:}); +p_Results = p.Results; + +if strcmpi(p.Results.History,'implicit') + shist = 3; % implicit +elseif strcmpi(p.Results.History,'script') + shist = 2; % script +elseif strcmpi(p.Results.History,'gui') + shist = 1; % gui +else + shist = 0; % off +end + + +BackERPLABcolor = [1 0.9 0.3]; % ERPLAB main window background +question = 'In order to see your summary, What would you like to do?'; +title = 'Artifact detection summary'; +oldcolor = get(0,'DefaultUicontrolBackgroundColor'); +set(0,'DefaultUicontrolBackgroundColor',BackERPLABcolor) +button = questdlg(question, title,'Save in a .txt file','Save in a .xls file', 'Cancel','Cancel'); +set(0,'DefaultUicontrolBackgroundColor',oldcolor); + +if strcmpi(button,'Save in a .txt file') + write_spreadsheet=1; + formatname = {'*.txt'}; +elseif strcmpi(button,'Save in a .xls file') + write_spreadsheet=2; + formatname = {'*.xls';'*.xlsx'}; +else + return; +end + +ERPtooltype = erpgettoolversion('tooltype'); +if strcmpi(ERPtooltype,'EStudio') + pathstr= estudioworkingmemory('EEG_save_folder'); + if isempty(pathstr) + pathstr = pwd; + end +else + pathstr = pwd; +end + +namedef ='EEG_Trial_information'; +[erpfilename, erppathname, indxs] = uiputfile(formatname, ... + ['Export trial informationb for epoched EEG'],... + fullfile(pathstr,namedef)); +if isequal(erpfilename,0) + return +end +if isequal(erpfilename,0) + return +end + +[pathstr, erpfilename, ext] = fileparts(erpfilename) ; +if write_spreadsheet==1 + ext = '.txt'; +else + if indxs==1 + ext = '.xls'; + elseif indxs==2 + ext = '.xlsx'; + else + ext = '.xls'; + end +end + +erpFilename = char(strcat(erppathname,erpfilename,ext)); + +delete(erpFilename);%%delete the exist file + +qEEGArray = p_Results.EEGArray; +EEGArray = qEEGArray; +if isempty(qEEGArray) || any(qEEGArray(:)>length(ALLEEG)) || any(qEEGArray(:)<1) + qEEGArray = 1:length(ALLEEG); +end + +qbinArray = p_Results.binArray; +binArray = qbinArray; + +for Numoferp = 1:numel(qEEGArray) + + EEG = ALLEEG(qEEGArray(Numoferp)); + [EEG, tprej, acce, rej, histoflags, com] = pop_summary_AR_eeg_detection(EEG, 'none'); + ERP = pop_averager(EEG, 'Criterion', 'good', 'DSindex', 1, 'SEM', 'off'); + + if isempty(qbinArray) || any(qbinArray(:)>ERP.nbin) || any(qbinArray(:)<1) + qbinArray = [1:ERP.nbin]; + end + %%txt file + if write_spreadsheet==1 + if Numoferp==1 + fileID = fopen(erpFilename,'w+'); + end + fprintf(fileID,'%s\n','*'); + fprintf(fileID,'%s\n','**'); + columName1{1,1} = ['Name:',32,EEG.setname]; + fprintf(fileID,'%s\n\n\n',columName1{1,:}); + + %%Table title + formatSpec2 =['%s\t',32,'%s\t',32,'%s\t',32,'%s\t',32,'%s\t',32,'%s\t',32,'%s\t',32,'%s\t',32,'%s\t',32,'%s\t',32,'%s\t',32,'%s\n']; + columName2 = {'Bin', 'Total trials','Included trials', 'Rejected trials', 'Invalid trials','F2','F3','F4','F5','F6','F7','F8'}; + fprintf(fileID,formatSpec2,columName2{1,:}); + for ii = 1:length(qbinArray) + try + data{1,1} = [num2str(qbinArray(ii)),'.',ERP.bindescr{qbinArray(ii)}]; + data{1,2} = [num2str(ERP.ntrials.accepted(qbinArray(ii))+ERP.ntrials.rejected(qbinArray(ii))+ERP.ntrials.invalid(qbinArray(ii)))]; + data{1,3} = [num2str(ERP.ntrials.accepted(qbinArray(ii)))]; + data{1,4} = [num2str(ERP.ntrials.rejected(qbinArray(ii)))]; + data{1,5} = [num2str(ERP.ntrials.invalid(qbinArray(ii)))]; + data{1,6} = [num2str(histoflags(ii,2))];%%F2 + data{1,7} = [num2str(histoflags(ii,3))];%%F3 + data{1,8} = [num2str(histoflags(ii,4))]; + data{1,9} = [num2str(histoflags(ii,5))]; + data{1,10} = [num2str(histoflags(ii,6))]; + data{1,11} = [num2str(histoflags(ii,7))]; + data{1,12} = [num2str(histoflags(ii,8))]; + catch + data{1,1} = ''; + data{1,3} = ''; + data{1,4} = ''; + data{1,5} = ''; + data{1,6} = '';%%F2 + data{1,7} = '';%%F3 + data{1,8} = ''; + data{1,9} = ''; + data{1,10} = ''; + data{1,11} = ''; + data{1,12} = ''; + end + fprintf(fileID,formatSpec2,data{1,:}); + end + + if Numoferp~=length(ALLEEG) + data1{1,1} = ''; + data1{1,2} = ''; + data1{1,3} = ''; + data1{1,4} = ''; + data1{1,5} = ''; + data1{1,6} = '';%%F2 + data1{1,7} = '';%%F3 + data1{1,8} = ''; + data1{1,9} = ''; + data1{1,10} = ''; + data1{1,11} = ''; + data1{1,12} = ''; + formatSpec3 =['%s\t',32,'%s\t',32,'%s\t',32,'%s\t',32,'%s\t',32,'%s\t',32,'%s\t',32,'%s\t',32,'%s\t',32,'%s\t',32,'%s\t','%s\n\n\n\n\n\n']; + fprintf(fileID,formatSpec3,data1{1,:}); + end + end + + %%xls file + if write_spreadsheet==2 + data = []; + binname = ''; + columName2 = {ERP.erpname,'Total trials','Included trials', 'Rejected trials', 'Invalid trials','F2','F3','F4','F5','F6','F7','F8'}; + for ii = 1:length(qbinArray) + try + data(ii,1) = [ERP.ntrials.accepted(qbinArray(ii))+ERP.ntrials.rejected(qbinArray(ii))+ERP.ntrials.invalid(qbinArray(ii))]; + data(ii,2) = [ERP.ntrials.accepted(qbinArray(ii))]; + data(ii,3) = [ERP.ntrials.rejected(qbinArray(ii))]; + data(ii,4) = [ERP.ntrials.invalid(qbinArray(ii))]; + data(ii,5) = histoflags(ii,2);%%F2 + data(ii,6) = histoflags(ii,3);%%F3 + data(ii,7) = histoflags(ii,4); + data(ii,8) = histoflags(ii,5); + data(ii,9) = histoflags(ii,6); + data(ii,10) = histoflags(ii,7); + data(ii,11) = histoflags(ii,8); + catch + data(ii,1) = []; + data(ii,2) = []; + data(ii,3) = []; + data(ii,4) = []; + data(ii,5) = [];%%F2 + data(ii,6) = [];%%F3 + data(ii,7) = []; + data(ii,8) = []; + data(ii,9) = []; + data(ii,10) = []; + data(ii,11) = []; + end + try + binname{ii,1} = ERP.bindescr{qbinArray(ii)}; + catch + binname{ii,1} = 'none'; + end + end + if Numoferp==1 + end + sheet_label_T = table(columName2); + sheetname = char(EEG.setname); + if length(sheetname)>31 + sheetname = sheetname(1:31); + end + writetable(sheet_label_T,erpFilename,'Sheet',Numoferp,'Range','A1','WriteVariableNames',false,'Sheet',sheetname,"AutoFitWidth",false); + xls_d = table(binname,data); + writetable(xls_d,erpFilename,'Sheet',Numoferp,'Range','A2','WriteVariableNames',false,'Sheet',sheetname,"AutoFitWidth",false); % write data + end +end + +if write_spreadsheet==1 + fclose(fileID); +end +disp(['A new file for trial information was created at ' erpFilename '']) + + +skipfields = {'ALLEEG', 'History'}; + +if isempty(EEGArray) + skipfields = [skipfields,{'EEGArray'}]; +end + +if isempty(binArray) + skipfields = [skipfields,{'binArray'}]; +end + +fn = fieldnames(p.Results); +eegcom = sprintf( 'eegcom = pop_eeg_save_trial_information( %s', 'ALLEEG'); +for q=1:length(fn) + fn2com = fn{q}; + if ~ismember_bc2(fn2com, skipfields) + fn2res = p.Results.(fn2com); + if ~isempty(fn2res) + if ischar(fn2res) + if ~strcmpi(fn2res,'off') && ~strcmpi(fn2res,'no') + eegcom = sprintf( '%s, ''%s'', ''%s''', eegcom, fn2com, fn2res); + end + else + eegcom = sprintf( '%s, ''%s'', %s', eegcom, fn2com, vect2colon(fn2res,'Repeat','on')); + end + end + end +end +eegcom = sprintf( '%s );', eegcom); + +% get history from script. ERP +switch shist + case 1 % from GUI + displayEquiComERP(eegcom); + case 2 % from script + for i=1:length(ALLEEG) + ALLEEG(i)= eegh(eegcom, ALLEEG(i)); + end + case 3 + + otherwise %off or none + eegcom = ''; + return +end + +end \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/EEG Tab/pop_ploteegset.m b/studio_functions/Functions/EStudio/EEG Tab/pop_ploteegset.m new file mode 100644 index 00000000..ad9e04d5 --- /dev/null +++ b/studio_functions/Functions/EStudio/EEG Tab/pop_ploteegset.m @@ -0,0 +1,405 @@ +% PURPOSE: pop_ploteegset.m +% plot continuous/epoched EEG waves +% + + +%%FORMAT: +% [EEG, eegcom] = pop_ploteegset(EEG,'ChanArray',ChanArray,'ICArray',ICArray,'Winlength',Winlength,... +% 'Ampchan',Ampchan,'ChanLabel',ChanLabel,'Submean',Submean,'EventOnset',EventOnset,... +% 'StackFlag',StackFlag,'NormFlag',NormFlag,'Startimes',Startimes,'figureName',figureName,'figSize',figSize,'History', 'gui'); + + +% Inputs: +% +%EEG -EEGSET +%ChanArray -index(es) of channel(s) to plot ( 5 10 11 ...) +%ICArray -index(es) of IC(s) to plot (1 2 5 3...). Please set +% empty if you donot want to display ICs +%Winlength -the length of time-wondow to display the wave e.g., +% 5s for continuous EEG; For epoched EEG, it is the +% number of epochs, e.g., 5 epochs +%Ampchan -Verticl amplitude scales for chans e.g., 50 +%ChanLabel -display channel names or numbers. 1 is name and 0 is +% number +%Submean -remove DC? 1 (yes) or 0 (no) +%EventOnset -display events? 1(yes) or 0 (no) +%StackFlag -stack the waves for different channels or ics. 1 or 0 +%NormFlag -normalize the data? 1 or 0 +%Startimes -the start time for the dispalyed data e.g.,from 2nd s +%figureName - figure name +%figSize -width and height for the figure e.g., [1800 900] + + + +% *** This function is part of ERPLAB Studio *** +% Author: Guanghui Zhang & Steven Luck +% ghzhang@ucdavis.edu, sjluck@ucdavis.edu +% Center for Mind and Brain +% University of California, Davis, +% Davis, CA +% August 2023 + + + + +function [EEG,eegcom] = pop_ploteegset(EEG,varargin) + +eegcom = ''; +if nargin < 1 + help pop_ploteegset + return; +end + +if isempty(EEG)%% + beep; + disp('EEG is empty'); + return; +end + +if nargin==1 + %%Do we need to create a GUI that the user can use it to define the + %%desired parameters? + + %%channels that will be plotted + nbchan = EEG.nbchan; + ChanArray = 1:nbchan; + + %%display ICs + ICArray = []; + + %%window length for displayed EEG + Winlength=5; + + %%vertical voltage + Ampchan = 50; + Ampic = 20;%%vertical voltage for ICs + bufftobo = 100;%%buffer at top and bottom + %%channel name (1) or number (0) + ChanLabel = 1; + + %%remove DC for the displayed EEG? + Submean = 0; + + %%Display events if any? + EventOnset = 1; + + %%Stack on/off? + StackFlag = 0; + + %%Norm on/off? + NormFlag = 0; + + %%start time for displayed EEG data + if ndims(EEG.data) ==3 + Startimes=1; + else + Startimes=0; + end + + [ChanNum,Allsamples,tmpnb] = size(EEG.data); + Allsamples = Allsamples*tmpnb; + if ndims(EEG.data) > 2 + multiplier = size(EEG.data,2); + else + multiplier = EEG.srate; + end + + if isempty(Startimes) || Startimes<0 || Startimes>(ceil((Allsamples-1)/multiplier)-Winlength) + if ndims(EEG.data) ==3 + Startimes=1; + else + Startimes=0; + end + end + + %%figure name if any + figureName = EEG.setname; + %%Figure position + figSize = []; + + [EEG, eegcom] = pop_ploteegset(EEG,'ChanArray',ChanArray,'ICArray',ICArray,'Winlength',Winlength,'bufftobo',bufftobo,... + 'Ampchan',Ampchan,'Ampic',Ampic,'ChanLabel',ChanLabel,'Submean',Submean,'EventOnset',EventOnset,... + 'StackFlag',StackFlag,'NormFlag',NormFlag,'Startimes',Startimes,'figureName',figureName,'figSize',figSize,'History', 'gui'); + pause(0.1); + return; +end + +% +% Parsing inputs +% +% colordef = getcolorcellerps; %{'k' 'r' 'b' 'g' 'c' 'm' 'y' 'w'};% default colors +p = inputParser; +p.FunctionName = mfilename; +p.CaseSensitive = false; +p.addRequired('EEG'); + +%Option(s) +p.addParamValue('ChanArray',[],@isnumeric); +p.addParamValue('ICArray',[], @isnumeric); +p.addParamValue('Winlength',[], @isnumeric); +p.addParamValue('Ampchan',[], @isnumeric); +p.addParamValue('Ampic',[], @isnumeric); +p.addParamValue('bufftobo',[], @isnumeric); +p.addParamValue('ChanLabel',[], @isnumeric); +p.addParamValue('Submean',[], @isnumeric); +p.addParamValue('EventOnset',[], @isnumeric); +p.addParamValue('StackFlag',[], @isnumeric); +p.addParamValue('NormFlag',[], @isnumeric); +p.addParamValue('Startimes',[], @isnumeric); +p.addParamValue('figureName','', @ischar); +p.addParamValue('figSize',[], @isnumeric); + +p.addParamValue('ErrorMsg', '', @ischar); +p.addParamValue('History', '', @ischar); % history from scripting + + +p.parse(EEG,varargin{:}); + +p_Results = p.Results; + +if strcmpi(p_Results.History,'command') + shist = 4;%%Show Maltab command only and donot plot the wave +elseif strcmpi(p_Results.History,'implicit') + shist = 3; % implicit +elseif strcmpi(p_Results.History,'script') + shist = 2; % script +elseif strcmpi(p_Results.History,'gui') + shist = 1; % gui +else + shist = 0; % off +end + +if strcmpi(p_Results.ErrorMsg,'popup') + errormsgtype = 1; % open popup window +else + errormsgtype = 0; % error in red at command window +end + +if isempty(EEG)%% + beep; + disp('EEG is empty'); + return; +end + + +%%channel array +qchanArray = p_Results.ChanArray; +nbchan = EEG.nbchan; +if ~isempty(qchanArray) + if min(qchanArray(:))>nbchan || max(qchanArray(:))>nbchan || min(qchanArray(:))<=0 + qchanArray = [1:nbchan]; + end +end + +%%IC array (the default is empty, that is, donot display ICs) +qICArray = p_Results.ICArray; +if isempty(EEG.icachansind) + qICArray = []; +else + if ~isempty(qICArray) && (min(qICArray(:))> numel(EEG.icachansind) || max(qICArray(:))> numel(EEG.icachansind) || min(qICArray(:))<=0) + qICArray = []; + end +end + + +%%the window length +qWinlength = p_Results.Winlength; +if ~isempty(qWinlength) && numel(qWinlength)~=1 + qWinlength = qWinlength(1); +end +if isempty(qWinlength) || numel(qWinlength)~=1 || min(qWinlength(:))<=0 + qWinlength=5; +end + +%%vertical amplitude scale for chans +qAmpchan = p_Results.Ampchan; +if ~isempty(qAmpchan) && numel(qAmpchan)~=1 + qAmpchan = qAmpchan(1); +end +if isempty(qAmpchan)|| qAmpchan<=0 + qAmpchan = 50; +end + + +%%vertical amplitude scale for ics +qAmpic = p_Results.Ampic; +if ~isempty(qAmpic) && numel(qAmpic)~=1 + qAmpic = qAmpic(1); +end +if isempty(qAmpic)|| qAmpic<=0 + qAmpic = 10; +end + +%%buffer at top and bottom +qbufftobo = p_Results.bufftobo; +if isempty(qbufftobo) || numel(qbufftobo)~=1 || any(qbufftobo(:)<=0) + qbufftobo = 100; +end + + + +%%channel with names (1) or numbers(0) +qChanLabel = p_Results.ChanLabel; +if ~isempty(qChanLabel) && numel(qChanLabel)~=1 + qChanLabel = qChanLabel(1); +end +if isempty(qChanLabel) || (qChanLabel~=0 && qChanLabel~=1) + qChanLabel =1; +end + + +%%remove DCs from the displayed EEG data? +qSubmean = p_Results.Submean; +if ~isempty(qSubmean) && numel(qSubmean)~=1 + qSubmean = qSubmean(1); +end +if isempty(qSubmean) || (qSubmean~=0 && qSubmean~=1) + qSubmean=0; +end + + +%%event onset or offset if any? +qEventOnset = p_Results.EventOnset; +if ~isempty(qEventOnset) && numel(qEventOnset)~=1 + qEventOnset = qEventOnset(1); +end +if isempty(qEventOnset) || (qEventOnset~=0 && qEventOnset~=1) + qEventOnset =1; +end + +%%stack on/off? +qStackFlag = p_Results.StackFlag; +if ~isempty(qStackFlag) && numel(qStackFlag)~=1 + qStackFlag = qStackFlag(1); +end +if isempty(qStackFlag) || (qStackFlag~=0 && qStackFlag~=1) + qStackFlag =1; +end + +%%normalization? +qNormFlag = p_Results.NormFlag; +if ~isempty(qNormFlag) && numel(qNormFlag)~=1 + qNormFlag = qNormFlag(1); +end +if isempty(qNormFlag) || (qNormFlag~=0 && qNormFlag~=1) + qNormFlag =1; +end + + +%%start time of the displayed EEG +qStartimes = p_Results.Startimes; +if ~isempty(qStartimes) && numel(qStartimes)~=1 + qStartimes = qStartimes(1); +end +[ChanNum,Allsamples,tmpnb] = size(EEG.data); +Allsamples = Allsamples*tmpnb; +if ndims(EEG.data) > 2 + multiplier = size(EEG.data,2); +else + multiplier = EEG.srate; +end + +if isempty(qStartimes) || qStartimes<0 || qStartimes>(ceil((Allsamples-1)/multiplier)-qWinlength) + if ndims(EEG.data) ==3 + qStartimes=1; + else + qStartimes=0; + end +end + + +%%figure name +qfigureName = p_Results.figureName; +if isempty(qfigureName) + qfigureName =EEG.setname; +end + +%%figure position +qfigSize = p_Results.figSize; +if ~isempty(qfigSize) && numel(qfigSize)~=2 + qfigSize = []; +end + +%%%%%%%%%%%%%%% +% insert the function that is to plot the EEG +if ~isempty(qfigureName) && shist~=4 + f_ploteegwave(EEG,qchanArray,qICArray,qWinlength,... + qAmpchan,qChanLabel,qSubmean,qEventOnset,qStackFlag,qNormFlag,qStartimes,... + qAmpic,qbufftobo,qfigSize,qfigureName) ; + +end + +%%history +fn = fieldnames(p.Results); +skipfields = {'EEG'}; +eegcom = sprintf( 'EEG = pop_ploteegset( %s', 'EEG'); + +for q=1:length(fn) + fn2com = fn{q}; % inputname + if ~ismember_bc2(fn2com, skipfields) + fn2res = p.Results.(fn2com); % input value + if ~isempty(fn2res) + if ischar(fn2res) + if strcmpi(fn2com,'History') && strcmpi(fn2res,'command') + fn2res = 'gui'; + end + if ~strcmpi(fn2res,'off') + eegcom = sprintf( '%s, ''%s'', ''%s''', eegcom, fn2com, fn2res); + end + elseif iscell(fn2res) + nn = length(fn2res); + eegcom = sprintf( '%s, ''%s'', {''%s'' ', eegcom, fn2com, fn2res{1}); + for ff=2:nn + eegcom = sprintf( '%s, ''%s'' ', eegcom, fn2res{ff}); + end + eegcom = sprintf( '%s}', eegcom); + elseif isnumeric(fn2res) + if ~ismember_bc2(fn2com,{'LineColor','GridSpace','GridposArray'}) + eegcom = sprintf( '%s, ''%s'', %s', eegcom, fn2com, vect2colon(fn2res,'Repeat','on')); + else + if size(fn2res,1)==1 + fn2res_trans = char(num2str(fn2res)); + else + fn2res_trans = char(num2str(fn2res(1,:))); + for ii = 2:size(fn2res,1) + fn2res_trans = char(strcat(fn2res_trans,';',num2str(fn2res(ii,:)))); + end + end + fn2res = fn2res_trans; + eegcom = sprintf( '%s, ''%s'', [%s', eegcom,fn2com,fn2res); + eegcom = sprintf( '%s]', eegcom); + end + + else + % if ~ismember_bc2(fn2com,{'xscale','yscale'}) + % eegcom = sprintf( '%s, ''%s'', %s', eegcom, fn2com, vect2colon(fn2res,'Repeat','on')); + % else + % xyscalestr = sprintf('[ %.1f %.1f %s ]', fn2res(1), fn2res(2), vect2colon(fn2res(3:end),'Delimiter','off')); + % eegcom = sprintf( '%s, ''%s'', %s', eegcom, fn2com, xyscalestr); + % end + end + end + end +end + + +eegcom = sprintf( '%s );', eegcom); +% get history from script. ERP +% shist = 1; +switch shist + case 1 % from GUI + displayEquiComERP(eegcom); + case 2 % from script + EEG = eegh(eegcom, EEG); + case 3 + % implicit + case 4 + displayEquiComERP(eegcom); + otherwise %off or none + eegcom = ''; + return +end + + + +return; \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/EEG Tab/pop_rename2chan.m b/studio_functions/Functions/EStudio/EEG Tab/pop_rename2chan.m new file mode 100644 index 00000000..ade149fc --- /dev/null +++ b/studio_functions/Functions/EStudio/EEG Tab/pop_rename2chan.m @@ -0,0 +1,272 @@ +% PURPOSE: pop_rename2chan.m is to change the channel names +% +% + +% FORMAT : +% +% pop_rename2chan(ALLEEG, CURRENTSET, parameters); +% + +% ALLEEG - structure array of EEG structures +% CURRENTSET - Index for current EEGset + + + +% The available parameters are as follows: +% +%ChanArray -index(es) for the selected channels +%Chanlabels - new names for the selected channels + + + +%%Output +%%EEG -EEG structure with the changed names of the selected channels + + +%%Example: +%EEG = pop_rename2chan( ALLEEG, 2, 'ChanArray', [1 2 3], 'Chanlabels', {'FP1-1' , 'F3-2' , 'F7-3' }, 'History', 'implicit' ); + + + +% *** This function is part of ERPLAB Studio *** +% Author: Guanghui Zhang & Steven Luck +% ghzhang@ucdavis.edu, sjluck@ucdavis.edu +% Center for Mind and Brain +% University of California, Davis, +% Davis, CA +% Sep. 2023 + + + +function [EEG,eegcom] = pop_rename2chan(ALLEEG,CURRENTSET,varargin) + +eegcom = ''; +if nargin < 1 + help pop_rename2chan + return; +end + +if isempty(ALLEEG)%% + beep; + disp('ALLEEG is empty'); + return; +end + +if nargin< 3 + %%Do we need to create a GUI that the user can use it to define the + %%desired parameters? + + if nargin< 2 || isempty(CURRENTSET) || numel(CURRENTSET)~=1 || CURRENTSET>length(ALLEEG) || CURRENTSET<=0 + CURRENTSET = length(ALLEEG); + end + EEG = ALLEEG(CURRENTSET); + if ~isfield(EEG,'chanlocs') + beep; + disp('The current dataset donot have chanlocs field'); + return; + end + chanlocs = EEG.chanlocs; + if ~isfield(chanlocs,'labels') + beep; + disp('There is no labels for chanlocs for the current dataset'); + return; + end + + ChanArray = [1:length(EEG.chanlocs)]; + [eloc, Chanlabelsold, theta, radius, indices] = readlocs( chanlocs); + + + def = erpworkingmemory('pop_rename2chan'); + if isempty(def) + def = Chanlabelsold; + end + erplab_studio_default_values; + version = erplabstudiover; + titleName= ['Dataset',32,num2str(CURRENTSET),': ERPLAB',32,num2str(version), 32,'Change Channel Name']; + Chanlabelsnew= f_change_chan_name_GUI(Chanlabelsold,def,titleName); + + if isempty(Chanlabelsnew) + return + end + erpworkingmemory('pop_rename2chan',Chanlabelsnew); + %%add suffix + try + ALLEEG(CURRENTSET).setname = [ALLEEG(CURRENTSET).setname,'_rnchan']; + catch + ALLEEG(CURRENTSET).erpname = [ALLEEG(CURRENTSET).erpname,'_rnchan']; + end + [EEG, eegcom] = pop_rename2chan(ALLEEG,CURRENTSET,'ChanArray',ChanArray,'Chanlabels',Chanlabelsnew,'History', 'gui'); + pause(0.1); + return; +end + + +% +% Parsing inputs +% +% colordef = getcolorcellerps; %{'k' 'r' 'b' 'g' 'c' 'm' 'y' 'w'};% default colors +p = inputParser; +p.FunctionName = mfilename; +p.CaseSensitive = false; +p.addRequired('ALLEEG'); +p.addRequired('CURRENTSET'); + +%Option(s) +p.addParamValue('ChanArray',[],@isnumeric); +p.addParamValue('Chanlabels','', @iscell); + +p.addParamValue('History', '', @ischar); % history from scripting + +p.parse(ALLEEG,CURRENTSET,varargin{:}); + +p_Results = p.Results; + +if strcmpi(p_Results.History,'command') + shist = 4;%%Show Maltab command only and donot plot the wave +elseif strcmpi(p_Results.History,'implicit') + shist = 3; % implicit +elseif strcmpi(p_Results.History,'script') + shist = 2; % script +elseif strcmpi(p_Results.History,'gui') + shist = 1; % gui +else + shist = 0; % off +end + + +if isempty(ALLEEG)%% + beep; + disp('ALLEEG is empty'); + return; +end + + +if isempty(CURRENTSET) || numel(CURRENTSET)~=1 || CURRENTSET>length(ALLEEG) || CURRENTSET<=0 + CURRENTSET = length(ALLEEG); +end + +EEG = ALLEEG(CURRENTSET); +if ~isfield(EEG,'chanlocs') + beep; + disp('The current dataset donot have chanlocs field'); + return; +end +chanlocs = EEG.chanlocs; +if ~isfield(chanlocs,'labels') + beep; + disp('There is no labels for chanlocs for the current dataset'); + return; +end + + +%%channel array +qchanArray = p_Results.ChanArray; +nbchan = length(EEG.chanlocs); +if isempty(qchanArray) || min(qchanArray(:))>nbchan || max(qchanArray(:))>nbchan || min(qchanArray(:))<=0 + qchanArray = [1:nbchan]; +end + + + +%%IC array (the default is empty, that is, donot display ICs) +qChanlabelsnew = p_Results.Chanlabels; +if isempty(qChanlabelsnew) + disp('Chanlabels is empty'); + return; +end + +% +%%adjust the number of channels and channel names +for Numofchan = 1:numel(qchanArray) + try + if isempty(char(qChanlabelsnew{Numofchan})) + qChanlabelsnew{Numofchan,1} = EEG.chanlocs(qchanArray(Numofchan)).labels; + fprintf(2,['\n Warning: name for channel ',32,num2str(qchanArray(Numofchan)),32,' was empty, we threfore used its original name',32,qChanlabelsnew{Numofchan,1},'.\n']); + else + qChanlabelsnew{Numofchan,1} = char(qChanlabelsnew{Numofchan}); + end + catch + qChanlabelsnew{Numofchan,1} = EEG.chanlocs(qchanArray(Numofchan)).labels; + fprintf(2,['\n Warning: name for channel ',32,num2str(qchanArray(Numofchan)),32,'was not defined, we threfore used its original name',32,qChanlabelsnew{Numofchan,1},'.\n']); + end +end + + +%%--------------change the channel names----------------------------------- +for Numofchan = 1:numel(qchanArray) + fprintf(['Chan',32,num2str(qchanArray(Numofchan)),':',32,EEG.chanlocs(qchanArray(Numofchan)).labels,32,'was changed to',32,qChanlabelsnew{Numofchan,1},'.\n']); + EEG.chanlocs(qchanArray(Numofchan)).labels = char(qChanlabelsnew{Numofchan,1}); +end + + + +%%history +fn = fieldnames(p.Results); +skipfields = {'ALLEEG','CURRENTSET'}; +if isfield(EEG,'datatype') && strcmpi(EEG.datatype,'ERP') + eegcom = sprintf( 'ERP = pop_rename2chan( %s %s', 'ALLERP,',num2str(CURRENTSET)); +else +eegcom = sprintf( 'EEG = pop_rename2chan( %s %s', 'ALLEEG,',num2str(CURRENTSET)); +end +for q=1:length(fn) + fn2com = fn{q}; % inputname + if ~ismember_bc2(fn2com, skipfields) + fn2res = p.Results.(fn2com); % input value + if ~isempty(fn2res) + if ischar(fn2res) + if ~strcmpi(fn2res,'off') + eegcom = sprintf( '%s, ''%s'', ''%s''', eegcom, fn2com, fn2res); + end + elseif iscell(fn2res) + nn = length(fn2res); + eegcom = sprintf( '%s, ''%s'', {''%s'' ', eegcom, fn2com, fn2res{1}); + for ff=2:nn + eegcom = sprintf( '%s, ''%s'' ', eegcom, fn2res{ff}); + end + eegcom = sprintf( '%s}', eegcom); + elseif isnumeric(fn2res) + + if size(fn2res,1)==1 + fn2res_trans = char(num2str(fn2res)); + else + fn2res_trans = char(num2str(fn2res(1,:))); + for ii = 2:size(fn2res,1) + fn2res_trans = char(strcat(fn2res_trans,';',num2str(fn2res(ii,:)))); + end + end + fn2res = fn2res_trans; + eegcom = sprintf( '%s, ''%s'', [%s', eegcom,fn2com,fn2res); + eegcom = sprintf( '%s]', eegcom); + else + % if ~ismember_bc2(fn2com,{'xscale','yscale'}) + % eegcom = sprintf( '%s, ''%s'', %s', eegcom, fn2com, vect2colon(fn2res,'Repeat','on')); + % else + % xyscalestr = sprintf('[ %.1f %.1f %s ]', fn2res(1), fn2res(2), vect2colon(fn2res(3:end),'Delimiter','off')); + % eegcom = sprintf( '%s, ''%s'', %s', eegcom, fn2com, xyscalestr); + % end + end + end + end +end + +eegcom = sprintf( '%s );', eegcom); +% get history from script. ERP +% shist = 1; +switch shist + case 1 % from GUI + displayEquiComERP(eegcom); + case 2 % from script + for i=1:length(ALLEEG) + ALLEEG(i) = erphistory(ALLEEG(i), [], eegcom, 1); + end + case 3 + % implicit + case 4 + displayEquiComERP(eegcom); + + otherwise %off or none + eegcom = ''; + return +end + +return; \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/EEG Tab/pop_renameeg.m b/studio_functions/Functions/EStudio/EEG Tab/pop_renameeg.m new file mode 100644 index 00000000..b011f3ce --- /dev/null +++ b/studio_functions/Functions/EStudio/EEG Tab/pop_renameeg.m @@ -0,0 +1,180 @@ +% PURPOSE: pop_renameeg.m +% rename ALLEEGset +% + +% FORMAT: +% [ALLEEG, erpcom] = pop_renameeg( ALLEEG, 'eegnames',eegnames,... +% 'Saveas', 'off', 'History', 'gui'); + +% Inputs: +% +%ALLEEG -ALLEEG structure +%eegnames -strings for erpsets + + + +% *** This function is part of ALLEEGLAB Studio *** +% Author: Guanghui Zhang & Steven Luck +% ghzhang@ucdavis.edu, sjluck@ucdavis.edu +% Center for Mind and Brain +% University of California, Davis, +% Davis, CA +% Dec. 2024 + + + + +function [ALLEEG, erpcom] = pop_renameeg(ALLEEG, varargin) +erpcom = ''; + +if nargin < 1 + help pop_renameeg + return +end +if isempty(ALLEEG) + msgboxText = 'Cannot rename an empty EEGset'; + title = 'ERPLAB: pop_renameeg() error'; + errorfound(msgboxText, title); + return +end +if isempty(ALLEEG(1).data) + msgboxText = 'Cannot rename an empty EEGset'; + title = 'ERPLAB: pop_renameeg() error'; + errorfound(msgboxText, title); + return +end + + + +if nargin==1 + + app = feval('EEG_Tab_rename_gui',ALLEEG,1:length(ALLEEG)); + waitfor(app,'Finishbutton',1); + try + eegnames = app.Output; %NO you don't want to output EEG with edited channel locations, you want to output the parameters to run decoding + app.delete; %delete app from view + pause(0.1); %wait for app to leave + catch + return; + end + if isempty(eegnames) + return; + end + % + % Somersault + % + [ALLEEG, erpcom] = pop_renameeg( ALLEEG, 'eegnames',eegnames,... + 'Saveas', 'off', 'History', 'gui'); + return +end + +% +% Parsing inputs +% +p = inputParser; +p.FunctionName = mfilename; +p.CaseSensitive = false; +p.addRequired('ALLEEG'); +% option(s) +p.addParamValue('eegnames', '',@iscell); +p.addParamValue('Saveas', 'off', @ischar); +p.addParamValue('History', 'script', @ischar); % history from scripting + +p.parse(ALLEEG, varargin{:}); + + +eegnames = p.Results.eegnames; +if ischar(eegnames) && numel(ALLEEG)==1 + ALLEEG.erpname = eegnames; + ALLEEG.saved = 'no'; +elseif iscell(eegnames) + for Numoferp = 1:numel(ALLEEG) + newName = eegnames{Numoferp}; + [~, newName, ~] = fileparts(newName) ; + if ~isempty(newName) + ALLEEG(Numoferp).setname = newName; + ALLEEG(Numoferp).saved = 'no'; + else + ALLEEG(Numoferp).saved = 'no'; + end + end +end + + + +if strcmpi(p.Results.Saveas,'on') + issaveas = 1; +else + issaveas = 0; +end +if strcmpi(p.Results.History,'implicit') + shist = 3; % implicit +elseif strcmpi(p.Results.History,'script') + shist = 2; % script +elseif strcmpi(p.Results.History,'gui') + shist = 1; % gui +else + shist = 0; % off +end + + + + +% +% History +% + +skipfields = {'ALLEEG', 'Saveas','History'}; +fn = fieldnames(p.Results); +erpcom = sprintf( '%s = pop_renameeg( %s ', inputname(1), inputname(1) ); +for q=1:length(fn) + fn2com = fn{q}; + if ~ismember_bc2(fn2com, skipfields) + fn2res = p.Results.(fn2com); + if ~isempty(fn2res) + if ischar(fn2res) + if ~strcmpi(fn2res,'off') + erpcom = sprintf( '%s, ''%s'', {''%s'' ', erpcom, fn2com, fn2res{1}); + end + else + if iscell(fn2res) + nn = length(fn2res); + erpcom = sprintf( '%s, ''%s'', {''%s'' ', erpcom, fn2com, fn2res{1}); + for ff=2:nn + erpcom = sprintf( '%s, ''%s'' ', erpcom, fn2res{ff}); + end + erpcom = sprintf( '%s}', erpcom); + end + + end + end + end +end +erpcom = sprintf( '%s );', erpcom); + +% +% Save ALLEEGset from GUI +% +if issaveas + for ii = 1:length(ALLEEG) + [ALLEEG(ii), ~] = pop_saveset( ALLEEG(ii), 'filename',ALLEEG(ii).filename,'filepath',[ALLEEG(ii).filepath,filesep]); + end +end + + + +% get history from script. ALLEEG +switch shist + case 1 % from GUI + displayEquiComERP(erpcom); + case 2 % from script + for ii = 1:length(ALLEEG) + ALLEEG(ii) = eegh(erpcom, ALLEEG(ii)); + end + case 3 + % implicit + otherwise %off or none + erpcom = ''; + return +end +return \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/EEG Tab/pop_resampleeg.m b/studio_functions/Functions/EStudio/EEG Tab/pop_resampleeg.m new file mode 100644 index 00000000..2774884a --- /dev/null +++ b/studio_functions/Functions/EStudio/EEG Tab/pop_resampleeg.m @@ -0,0 +1,306 @@ +% PURPOSE: pop_resampleeg.m +% resample ERPsets +% + +% FORMAT: +% [EEG, LASTCOM] = pop_resamplerp( EEG, 'Freq2resamp',Freq2resamp, 'TimeRange',TimeRange,... +% 'Saveas', 'off', 'History', 'gui'); + +% Inputs: +% +%EEG -EEG structure +%Freq2resamp -new sampling rate e.g., 200 Hz +%TimeRange -new time range e.g., [-300 900]ms + + +%%We used some functions from EEGlab in this routine + + +% *** This function is part of ERPLAB Studio *** +% Author: Guanghui Zhang & Steven Luck +% ghzhang@ucdavis.edu, sjluck@ucdavis.edu +% Center for Mind and Brain +% University of California, Davis, +% Davis, CA +% Mar. 2024 + +function [EEG, LASTCOM] = pop_resampleeg(EEG, varargin) +LASTCOM = ''; + +if nargin < 1 + help pop_resampleeg + return +end +if isempty(EEG) + msgboxText = 'Cannot resample an empty eegset'; + title = 'ERPLAB: pop_resampleeg() error'; + errorfound(msgboxText, title); + return +end +if isempty(EEG(1).data) + msgboxText = 'Cannot resample an empty EEGset'; + title = 'ERPLAB: pop_resampleeg() error'; + errorfound(msgboxText, title); + return +end + +if EEG(1).trials==1 + msgboxText = 'Cannot resample continous EEGset'; + title = 'ERPLAB: pop_resampleeg() error'; + errorfound(msgboxText, title); + return +end + +if nargin==1 + + Freq2resamp = EEG.srate; + TimeRange = [EEG.times(1),EEG.times(end)]; + % + % Somersault + % + [EEG, LASTCOM] = pop_resampleeg( EEG, 'Freq2resamp',Freq2resamp, 'TimeRange',TimeRange,... + 'Saveas', 'off', 'History', 'gui'); + return +end + +% +% Parsing inputs +% +p = inputParser; +p.FunctionName = mfilename; +p.CaseSensitive = false; +p.addRequired('EEG'); +% option(s) +p.addParamValue('Freq2resamp', [],@isnumeric); +p.addParamValue('TimeRange', [], @isnumeric); +p.addParamValue('Saveas', 'off', @ischar); +p.addParamValue('History', 'script', @ischar); % history from scripting + +p.parse(EEG, varargin{:}); + +Freq2resamp = p.Results.Freq2resamp; +if isempty(Freq2resamp) || numel(Freq2resamp)~=1 || any(Freq2resamp<=0) + Freq2resamp = EEG.srate; +end + +TimeRange= p.Results.TimeRange; +TimeRange = unique(TimeRange); +if isempty(TimeRange) || numel(TimeRange)~=2 || TimeRange(1)>=EEG.times(end) || TimeRange(2)<=EEG.times(1) + TimeRange = [EEG.times(1),EEG.times(end)]; +end +if TimeRange(1)>=0 + msgboxText = ['The left number of the new time range should be smaller than 0']; + title = 'ERPLAB: pop_resampleeg() inputs'; + errorfound(sprintf(msgboxText), title); + return +end + +if TimeRange(2)<=0 + msgboxText = ['The right number of the new time range should be larger than 0']; + title = 'ERPLAB: pop_resampleeg() inputs'; + errorfound(sprintf(msgboxText), title); + return +end + + +latency0_old = 1-(EEG.xmin*EEG.srate); % time 0 point +alllatencies_old = linspace( latency0_old, EEG.pnts*(EEG.trials-1)+latency0_old, EEG.trials); + + +%%-------------------------adjust the left edge---------------------------- +if roundn(TimeRange(1),-2)>= roundn(EEG.times(1),-2) + [xxx, latsamp, latdiffms] = closest(EEG.times, TimeRange(1)); + EEG.times = EEG.times(latsamp:end); + EEG.xmin = EEG.times(1)/1000; + EEG.data = EEG.data(:,latsamp:end,:); +else + TimesNew = EEG.times; + timeint = 1000/EEG.srate; + count=0; + for ii=1:10000 + timeStart = TimesNew(1)-timeint; + if timeStart>=TimeRange(1) + count = count+1; + TimesNew = [timeStart,TimesNew]; + else + break; + end + end + if count~=0 + EEG.times = TimesNew; + EEG.xmin = EEG.times(1)/1000; + datadd= zeros(size(EEG.data,1),count); + for ii = 1:size(EEG.data,3) + newdata(:,:,ii) = [datadd,squeeze(EEG.data(:,:,ii))]; + end + EEG.data = newdata; + end +end +%%-------------------------adjust the right edge--------------------------- +if roundn(TimeRange(2),-2)<= roundn(EEG.times(end),-2) + [xxx, latsamp, latdiffms] = closest(EEG.times, TimeRange(2)); + EEG.times = EEG.times(1:latsamp); + EEG.xmax = EEG.times(end)/1000; + EEG.data = EEG.data(:,1:latsamp,:); +else + TimesNew = EEG.times; + timeint = 1000/EEG.srate; + count=0; + for ii=1:10000 + timend = TimesNew(end)+timeint; + if timend<=TimeRange(2) + count = count+1; + TimesNew = [TimesNew,timend]; + else + break; + end + end + if count~=0 + newdata = []; + EEG.times = TimesNew; + EEG.xmax = EEG.times(end)/1000; + datadd= zeros(size(EEG.data,1),count); + for ii = 1:size(EEG.data,3) + newdata(:,:,ii) = [squeeze(EEG.data(:,:,ii)),datadd]; + end + EEG.data = newdata; + end +end + +count = 0; +check_left = []; +for ii = 1:numel(EEG.times) + if roundn(EEG.times(ii),-2)< roundn(TimeRange(1),-2) || roundn(EEG.times(ii),-2)> roundn(TimeRange(2),-2) + count = count+1; + check_left(count) = ii; + end +end +EEG.data(:,check_left,:) =[]; +EEG.times(check_left) = []; +EEG.pnts = size(EEG.data,2); +EEG.xmax = EEG.times(end)/1000; +EEG.xmin = EEG.times(1)/1000; + + +%%Adjust events +latency0_new = 1-(EEG.xmin*EEG.srate); % time 0 point +alllatencies_new = linspace( latency0_new, EEG.pnts*(EEG.trials-1)+latency0_new, EEG.trials); +Latency_all = []; +for Numofevent = 1:length( EEG.event) + epochindex(Numofevent,1) = EEG.event(Numofevent).epoch; + Latency_all(Numofevent,1) = EEG.event(Numofevent).latency; +end +%%adjust event latency +count = 0; +eventrm = []; +for Numoftrial = 1:EEG.trials + [xpos,ypos]= find(epochindex==Numoftrial); + count1= 0; + eventrm_epoch = []; + Latency_single= Latency_all(xpos); + Latency_single = Latency_single-alllatencies_old(Numoftrial); + for ii = 1:numel(xpos) + EEG.event(xpos(ii)).latency = Latency_single(ii)+alllatencies_new(Numoftrial);%%update latency for each epoch + if (EEG.event(xpos(ii)).latency-alllatencies_new(Numoftrial))<(1-latency0_new) || (EEG.event(xpos(ii)).latency-alllatencies_new(Numoftrial))>(numel(EEG.times)-latency0_new) + count = count+1; + eventrm(count) = xpos(ii);%%remove event exceeds the epoch + end + end +end +EEG.event(eventrm) = []; +EEG.urevent = []; +EEG = eeg_checkset(EEG, 'eventconsistency'); +% EEG = eeg_checkset(EEG,'epochconsist'); +%%resampling data based on eeglab routine +if EEG.srate~=Freq2resamp + setnameold = EEG.setname; + EEG = pop_resample( EEG, Freq2resamp); + EEG.setname = setnameold; +end +EEG = eeg_checkset(EEG); + +if strcmpi(p.Results.Saveas,'on') + issaveas = 1; +else + issaveas = 0; +end +if strcmpi(p.Results.History,'implicit') + shist = 3; % implicit +elseif strcmpi(p.Results.History,'script') + shist = 2; % script +elseif strcmpi(p.Results.History,'gui') + shist = 1; % gui +else + shist = 0; % off +end +EEG.saved = 'no'; +EEG = eeg_checkset(EEG); +% +% History +% +% +% Completion statement +% +% msg2end + +% +% History +% + +skipfields = {'EEG', 'Saveas','History'}; +fn = fieldnames(p.Results); +LASTCOM = sprintf( '%s = pop_resampleeg( %s ', inputname(1), inputname(1) ); +for q=1:length(fn) + fn2com = fn{q}; + if ~ismember_bc2(fn2com, skipfields) + fn2res = p.Results.(fn2com); + if ~isempty(fn2res) + if ischar(fn2res) + if ~strcmpi(fn2res,'off') + LASTCOM = sprintf( '%s, ''%s'', ''%s''', LASTCOM, fn2com, fn2res); + end + else + if iscell(fn2res) + if ischar([fn2res{:}]) + fn2resstr = sprintf('''%s'' ', fn2res{:}); + else + fn2resstr = vect2colon(cell2mat(fn2res), 'Sort','on'); + end + fnformat = '{%s}'; + else + fn2resstr = vect2colon(fn2res, 'Sort','on'); + fnformat = '%s'; + end + if strcmpi(fn2com,'Criterion') + if p.Results.Criterion<100 + LASTCOM = sprintf( ['%s, ''%s'', ' fnformat], LASTCOM, fn2com, fn2resstr); + end + else + LASTCOM = sprintf( ['%s, ''%s'', ' fnformat], LASTCOM, fn2com, fn2resstr); + end + end + end + end +end +LASTCOM = sprintf( '%s );', LASTCOM); + +% Save ERPset from GUI +% +if issaveas + [EEG, LASTCOM1] = pop_saveset(EEG,'filename', EEG.filename, 'filepath',EEG.filepath,'check','on'); + EEG = eegh(LASTCOM1, EEG); +end + +% get history from script. ERP +switch shist + case 1 % from GUI + displayEquiComERP(LASTCOM); + case 2 % from script + EEG = eegh(LASTCOM, EEG); + case 3 + % implicit + otherwise %off or none + LASTCOM = ''; + return +end +return \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/EEG Tab/pop_suffixeeg.m b/studio_functions/Functions/EStudio/EEG Tab/pop_suffixeeg.m new file mode 100644 index 00000000..27efe298 --- /dev/null +++ b/studio_functions/Functions/EStudio/EEG Tab/pop_suffixeeg.m @@ -0,0 +1,165 @@ +% PURPOSE: pop_suffixeeg.m +% add suffix to ALLEEG names +% + +% FORMAT: +% [ALLEEG, erpcom] = pop_suffixeeg( ALLEEG, 'suffixstr',suffixstr,... +% 'Saveas', 'off', 'History', 'gui'); + +% Inputs: +% +%ALLEEG -ALLEEG structure +%suffixstr -strings for erpsets + + + +% *** This function is part of ALLEEGLAB Studio *** +% Author: Guanghui Zhang & Steven Luck +% ghzhang@ucdavis.edu, sjluck@ucdavis.edu +% Center for Mind and Brain +% University of California, Davis, +% Davis, CA +% Dec. 2024 + + + + +function [ALLEEG, erpcom] = pop_suffixeeg(ALLEEG, varargin) +erpcom = ''; + +if nargin < 1 + help pop_suffixeeg + return +end +if isempty(ALLEEG) + msgboxText = 'Cannot rename an empty EEGset'; + title = 'ERPLAB: pop_suffixeeg() error'; + errorfound(msgboxText, title); + return +end +if isempty(ALLEEG(1).data) + msgboxText = 'Cannot rename an empty EEGset'; + title = 'ERPLAB: pop_suffixeeg() error'; + errorfound(msgboxText, title); + return +end + + +if nargin==1 + + suffixstr = f_EEG_suffix_gui('Suffix'); + + if isempty(suffixstr) + return; + end + % + % Somersault + % + [ALLEEG, erpcom] = pop_suffixeeg( ALLEEG, 'suffixstr',suffixstr,... + 'Saveas', 'off', 'History', 'gui'); + return +end + +% +% Parsing inputs +% +p = inputParser; +p.FunctionName = mfilename; +p.CaseSensitive = false; +p.addRequired('ALLEEG'); +% option(s) +p.addParamValue('suffixstr', '',@ischar); +p.addParamValue('Saveas', 'off', @ischar); +p.addParamValue('History', 'script', @ischar); % history from scripting + +p.parse(ALLEEG, varargin{:}); + + + +suffixstr = p.Results.suffixstr; + +for Numoferp = 1:numel(ALLEEG) + ALLEEG(Numoferp).setname = [ALLEEG(Numoferp).setname,'_',suffixstr]; + ALLEEG(Numoferp).saved = 'no'; + +end + + + + +if strcmpi(p.Results.Saveas,'on') + issaveas = 1; +else + issaveas = 0; +end +if strcmpi(p.Results.History,'implicit') + shist = 3; % implicit +elseif strcmpi(p.Results.History,'script') + shist = 2; % script +elseif strcmpi(p.Results.History,'gui') + shist = 1; % gui +else + shist = 0; % off +end + + + + +% +% History +% + +skipfields = {'ALLEEG', 'Saveas','History'}; +fn = fieldnames(p.Results); +erpcom = sprintf( '%s = pop_suffixeeg( %s ', inputname(1), inputname(1) ); +for q=1:length(fn) + fn2com = fn{q}; + if ~ismember_bc2(fn2com, skipfields) + fn2res = p.Results.(fn2com); + if ~isempty(fn2res) + if ischar(fn2res) + if ~strcmpi(fn2res,'off') + erpcom = sprintf( '%s, ''%s'', ''%s'' ', erpcom, fn2com, fn2res); + end + else + if iscell(fn2res) + nn = length(fn2res); + erpcom = sprintf( '%s, ''%s'', {''%s'' ', erpcom, fn2com, fn2res{1}); + for ff=2:nn + erpcom = sprintf( '%s, ''%s'' ', erpcom, fn2res{ff}); + end + erpcom = sprintf( '%s}', erpcom); + end + + end + end + end +end +erpcom = sprintf( '%s );', erpcom); + +% +% Save ALLEEGset from GUI +% +if issaveas + for ii = 1:length(ALLEEG) + [ALLEEG(ii), ~] = pop_saveset( ALLEEG(ii), 'filename',ALLEEG(ii).filename,'filepath',[ALLEEG(ii).filepath,filesep]); + end +end + + + +% get history from script. ALLEEG +switch shist + case 1 % from GUI + displayEquiComERP(erpcom); + case 2 % from script + for ii = 1:length(ALLEEG) + ALLEEG(ii) = eegh(erpcom, ALLEEG(ii)); + end + case 3 + % implicit + otherwise %off or none + erpcom = ''; + return +end +return \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/ERPLAB_ERP_Viewer.m b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/ERPLAB_ERP_Viewer.m index 2404bd3a..0024cd83 100755 --- a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/ERPLAB_ERP_Viewer.m +++ b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/ERPLAB_ERP_Viewer.m @@ -1,7 +1,6 @@ - -% New ERP viewer GUI Layout - Simple ERP viewer 0.014 +% New ERP viewer GUI Layout % -% Author: Guanghui Zhang & Steve J. Luck & Andrew Stewart +% Author: Guanghui Zhang & Steve J. Luck % Center for Mind and Brain % University of California, Davis, % Davis, CA @@ -36,14 +35,20 @@ function ERPLAB_ERP_Viewer(ALLERP,selectedERP_index,binArray,chanArray,Parameterfile) tic;% -disp(' ERP Waveform Viewer is launching...'); +disp('ERP Waveform Viewer is launching. Please be patient...'); +EStudioversion = geterplabeversion; global viewer_ERPDAT; global gui_erp_waviewer; ERPtooltype = erpgettoolversion('tooltype'); -% global observe_ERPDAT; -% if ~strcmpi(ERPtooltype,'EStudio') + +%%try to close existing Viewer +try + close(gui_erp_waviewer.Window);%%close previous GUI if exists +catch +end + viewer_ERPDAT = v_ERPDAT; % end % addlistener(observe_ERPDAT,'erpschange',@allErpChanged); @@ -58,21 +63,6 @@ function ERPLAB_ERP_Viewer(ALLERP,selectedERP_index,binArray,chanArray,Paramete observe_ERPDAT.Count_currentERP = 0; observe_ERPDAT.Process_messg = 0; end -try - close(EStudio_gui_erp_totl.Window); -catch -end - -if exist('memoryerpstudiopanels.erpm','file')==2 - iserpmem = 1; % file for memory exists -else - iserpmem = 0; % does not exist file for memory -end -if iserpmem==0 - p1 = which('o_ERPDAT'); - p1 = p1(1:findstr(p1,'o_ERPDAT.m')-1); - save(fullfile(p1,'memoryerpstudiopanels.erpm'),'ERPtooltype') -end @@ -81,10 +71,15 @@ function ERPLAB_ERP_Viewer(ALLERP,selectedERP_index,binArray,chanArray,Paramete else iserpmem = 0; % does not exist file for memory end + + if iserpmem==0 - p1 = which('o_ERPDAT'); - p1 = p1(1:findstr(p1,'o_ERPDAT.m')-1); - save(fullfile(p1,'memoryerpstudio.erpm'),'ERPtooltype') + mshock = 0; + if iserpmem==0 + p1 = which('o_ERPDAT'); + p1 = p1(1:findstr(p1,'o_ERPDAT.m')-1); + save(fullfile(p1,'memoryerpstudio.erpm'),'EStudioversion') + end end @@ -167,23 +162,13 @@ function ERPLAB_ERP_Viewer(ALLERP,selectedERP_index,binArray,chanArray,Paramete return; end -erpworkingmemory('ERPLAB_ERPWaviewer',0);%%Update the Viewer based on the changes in ERPLAB -% if ~strcmpi(ERPtooltype,'EStudio') -% addlistener(viewer_ERPDAT,'count_loadproper_change',@count_loadproper_change); -% addlistener(viewer_ERPDAT,'v_currentERP_change',@v_currentERP_change); -% addlistener(viewer_ERPDAT,'v_messg_change',@V_messg_change); -% addlistener(viewer_ERPDAT,'count_legend_change',@count_legend_change); -% addlistener(viewer_ERPDAT,'page_xyaxis_change',@page_xyaxis_change); -% % end - +estudioworkingmemory('ERPLAB_ERPWaviewer',0);%%Update the Viewer based on the changes in ERPLAB viewer_ERPDAT.Count_currentERP = 0; % viewer_ERPDAT.Process_messg = 0;%0 is the default means there is no message for processing procedure; %1 means the processign procedure is running %2 means the processign procedure is done %3 means there are some errors for processing procedure -viewer_ERPDAT.count_legend=0;%% this is to capture the changes of legend name -viewer_ERPDAT.page_xyaxis=0;%%get the changes of x/y axis based on the changed pages or selected ERPsets viewer_ERPDAT.loadproper_count = 0; viewer_ERPDAT.Process_messg = 0; viewer_ERPDAT.count_twopanels = 0;%% Automaticlly saving the changes on the other panel if the current panel is changed @@ -199,8 +184,7 @@ function ERPLAB_ERP_Viewer(ALLERP,selectedERP_index,binArray,chanArray,Paramete try test = uix.HBoxFlex(); catch - beep; - disp('The GUI Layout Toolbox might not be installed. Quitting') + disp('The GUI Layout Toolbox might not be included. Please download it from:https://www.mathworks.com/matlabcentral/fileexchange/47982-gui-layout-toolbox') return end @@ -214,38 +198,43 @@ function ERPLAB_ERP_Viewer(ALLERP,selectedERP_index,binArray,chanArray,Paramete estudioworkingmemory('MyViewer_linelegend',0); estudioworkingmemory('MyViewer_other',0); -ERPwaviewer.ALLERP =ALLERP; -ERPwaviewer.ERP = ALLERP(selectedERP_index(end)); -ERPwaviewer.CURRENTERP =selectedERP_index(end); -ERPwaviewer.SelectERPIdx =selectedERP_index; -ERPwaviewer.bin = binArray; -ERPwaviewer.chan = chanArray; -ERPwaviewer.binchan_op = 1;%% 1. Auto; 2.Custom - -ERPwaviewer.plot_org.Grid = 1; %1.Channels; 2.Bins; 3. ERPsets; 4. None -ERPwaviewer.plot_org.Overlay = 2; %1.Channels; 2.Bins; 3. ERPsets; 4. None -ERPwaviewer.plot_org.Pages = 3; %1.Channels; 2.Bins; 3. ERPsets; 4. None -ERPwaviewer.plot_org.gridlayout.op = 1; %1.Auto; 2. Custom -ERPwaviewer.plot_org.gridlayout.data = []; -ERPwaviewer.Lines = []; -ERPwaviewer.Legend = []; -ERPwaviewer.xaxis = []; -ERPwaviewer.yaxis = []; -ERPwaviewer.polarity = []; -ERPwaviewer.SEM = []; -ERPwaviewer.PageIndex = 1; -ERPwaviewer.baselinecorr = 'none'; -ERPwaviewer.chanbinsetlabel = []; -ERPwaviewer.figbackgdcolor = [1 1 1]; -ERPwaviewer.figname = 'My Viewer'; -ERPwaviewer.FigOutpos=[]; -assignin('base','ALLERPwaviewer',ERPwaviewer); - -% estudioworkingmemory('zoomSpace',0);%%sett for zoom in and zoom out +gui_erp_waviewer.ERPwaviewer.ALLERP =ALLERP; +gui_erp_waviewer.ERPwaviewer.ERP = ALLERP(selectedERP_index(end)); try - close(gui_erp_waviewer.Window);%%close previous GUI if exists + CURRENTERP = evalin('base','CURRENTERP'); catch + CURRENTERP = numel(selectedERP_index); +end +gui_erp_waviewer.ERPwaviewer.CURRENTERP =CURRENTERP; +[xpos,ypos] = find(selectedERP_index==CURRENTERP); +if ~isempty(ypos) + gui_erp_waviewer.ERPwaviewer.PageIndex =ypos; +else + gui_erp_waviewer.ERPwaviewer.PageIndex=numel(selectedERP_index); end +gui_erp_waviewer.ERPwaviewer.SelectERPIdx =selectedERP_index; +gui_erp_waviewer.ERPwaviewer.bin = binArray; +gui_erp_waviewer.ERPwaviewer.chan = chanArray; +gui_erp_waviewer.ERPwaviewer.binchan_op = 1;%% 1. Auto; 2.Custom + +gui_erp_waviewer.ERPwaviewer.plot_org.Grid = 1; %1.Channels; 2.Bins; 3. ERPsets; 4. None +gui_erp_waviewer.ERPwaviewer.plot_org.Overlay = 2; %1.Channels; 2.Bins; 3. ERPsets; 4. None +gui_erp_waviewer.ERPwaviewer.plot_org.Pages = 3; %1.Channels; 2.Bins; 3. ERPsets; 4. None +gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.op = 1; %1.Auto; 2. Custom +gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.data = []; +gui_erp_waviewer.ERPwaviewer.Lines = []; +gui_erp_waviewer.ERPwaviewer.Legend = []; +gui_erp_waviewer.ERPwaviewer.xaxis = []; +gui_erp_waviewer.ERPwaviewer.yaxis = []; +gui_erp_waviewer.ERPwaviewer.polarity = []; +gui_erp_waviewer.ERPwaviewer.SEM = []; +gui_erp_waviewer.ERPwaviewer.baselinecorr = 'none'; +gui_erp_waviewer.ERPwaviewer.chanbinsetlabel = []; +gui_erp_waviewer.ERPwaviewer.figbackgdcolor = [1 1 1]; +gui_erp_waviewer.ERPwaviewer.figname = 'My Viewer'; +gui_erp_waviewer.ERPwaviewer.FigOutpos=[]; +% +% estudioworkingmemory('zoomSpace',0);%%sett for zoom in and zoom out createInterface_ERPWave_viewer(ERPtooltype); @@ -263,23 +252,19 @@ function ERPLAB_ERP_Viewer(ALLERP,selectedERP_index,binArray,chanArray,Paramete set(0,'DefaultUicontrolBackgroundColor',oldcolor); if strcmpi(button,'Yes') - ERPwaviewerdef = evalin('base','ALLERPwaviewer'); - Parameterfile.ALLERP= ERPwaviewerdef.ALLERP; - Parameterfile.ERP = ERPwaviewerdef.ERP; + Parameterfile.ALLERP= gui_erp_waviewer.ERPwaviewer.ALLERP; + Parameterfile.ERP = gui_erp_waviewer.ERPwaviewer.ERP; else if strcmpi(button,'No') - beep; viewer_ERPDAT.Process_messg =3; fprintf(2,'\n\n My viewer > ERPLAB_ERP_Viewer: \n Cannot use the file because no ALLERP can be used.\n\n'); else - beep viewer_ERPDAT.Process_messg =3; fprintf(2,'\n\n My viewer > ERPLAB_ERP_Viewer: \n User selected cancel.\n\n'); end return; end end - assignin('base','ALLERPwaviewer',Parameterfile); viewer_ERPDAT.loadproper_count = 1; f_redrawERP_viewer_test(); end @@ -287,58 +272,56 @@ function ERPLAB_ERP_Viewer(ALLERP,selectedERP_index,binArray,chanArray,Paramete fprintf([32,'It took',32,num2str(timeElapsed),'s to launch ERP Waveform Viewer.\n\n']); function createInterface_ERPWave_viewer(ERPtooltype); + try + erplabstudiover = num2str(geterplabeversion); + catch + erplabstudiover = '??'; + end + if strcmpi(ERPtooltype,'EStudio') - try - [version reldate] = geterplabstudioversion; - erplabstudiover = version; - catch - erplabstudiover = '??'; - end - currvers = ['ERPLAB Studio ' erplabstudiover,'- My Viewer']; else - try - [version reldate] = geterplabversion; - erplabstudiover = version; - catch - erplabstudiover = '??'; - end - currvers = ['ERPLAB ' erplabstudiover,'- My Viewer']; end estudioworkingmemory('viewername','My Viewer'); try [version reldate,ColorB_def,ColorF_def,errorColorF_def,ColorBviewer_def] = geterplabstudiodef; catch - ColorBviewer_def = [0.7765,0.7294,0.8627]; + ColorBviewer_def = [0.8 0.8 0.9]; end - % gui_erp_waviewer = struct(); - % First, let's start the window + gui_erp_waviewer.Window = figure( 'Name', currvers, ... 'NumberTitle', 'off', ... 'MenuBar', 'none', ... 'Toolbar', 'none', ... - 'HandleVisibility', 'off', 'tag', 'rollover'); + 'HandleVisibility', 'on',... + 'tag', 'rollover',... + 'DockControls','off');%%donot allow to dock ScreenPos = []; - - new_pos= erpworkingmemory('ERPWaveScreenPos'); - if isempty(new_pos) - new_pos = [0.01,0.01,75,75]; - erpworkingmemory('ERPWaveScreenPos',new_pos); + new_pos= estudioworkingmemory('ERPWaviewerScreenPos'); + if isempty(new_pos) || numel(new_pos)~=2 + new_pos = [75,75]; + estudioworkingmemory('ERPWaviewerScreenPos',new_pos); end try ScreenPos = get( groot, 'Screensize' ); catch ScreenPos = get( 0, 'Screensize' ); end - gui_erp_waviewer.screen_pos = new_pos; - new_pos =[ScreenPos(3)*new_pos(1)/100,ScreenPos(4)*new_pos(2)/100,ScreenPos(3)*new_pos(3)/100,ScreenPos(4)*new_pos(4)/100]; + gui_erp_waviewer.monitor_size = ScreenPos;%%save monitor size + gui_erp_waviewer.screen_pos = new_pos;%%GUI size + if ~isempty(new_pos(2)) && new_pos(2) >100 + POS4 = (100-new_pos(2))/100; + new_pos =[0,ScreenPos(4)*POS4,ScreenPos(3)*new_pos(1)/100,ScreenPos(4)*new_pos(2)/100]; + else + new_pos =[0,0,ScreenPos(3)*new_pos(1)/100,ScreenPos(4)*new_pos(2)/100]; + end set(gui_erp_waviewer.Window, 'Position', new_pos); % + View menu gui_erp_waviewer.exit = uimenu( gui_erp_waviewer.Window, 'Label','Exit', 'Callback', @onExit); - gui_erp_waviewer.help = uimenu( gui_erp_waviewer.Window, 'Label', 'Help', 'Callback', @onhelp); +% gui_erp_waviewer.help = uimenu( gui_erp_waviewer.Window, 'Label', 'Help', 'Callback', @onhelp); %%-----------Setting------------------------------------------------ %% Create tabs @@ -357,37 +340,26 @@ function ERPLAB_ERP_Viewer(ALLERP,selectedERP_index,binArray,chanArray,Paramete set(gui_erp_waviewer.panelscroll,'BackgroundColor',ColorBviewer_def); % + Adjust the main layout set( gui_erp_waviewer.tabERP, 'Widths', [-4, 270]); % Viewpanel and settings panel - - gui_erp_waviewer.panel_fonts = f_get_default_fontsize(); %% get the default fontsize based on the different plat form, e.g., Mac - gui_erp_waviewer.settingLayout = uiextras.VBox('Parent', gui_erp_waviewer.panelscroll,'BackgroundColor',ColorBviewer_def); % + Create the settings window panels for ERP panel gui_erp_waviewer.panel{1} = f_ERPsets_waviewer_GUI(gui_erp_waviewer.settingLayout,gui_erp_waviewer.panel_fonts); - gui_erp_waviewer.panelSizes(1) = 255; - + gui_erp_waviewer.panelSizes(1) = 360; gui_erp_waviewer.panel{2} = f_ERP_Binchan_waviewer_GUI(gui_erp_waviewer.settingLayout,gui_erp_waviewer.panel_fonts); gui_erp_waviewer.panelSizes(2) = 280; - gui_erp_waviewer.panel{3} = f_ERP_timeampscal_waveviewer_GUI(gui_erp_waviewer.settingLayout,gui_erp_waviewer.panel_fonts); gui_erp_waviewer.panelSizes(3) = 490; - gui_erp_waviewer.panel{4} = f_ERP_plotorg_waveviewer_GUI(gui_erp_waviewer.settingLayout,gui_erp_waviewer.panel_fonts); gui_erp_waviewer.panelSizes(4) = 385; - gui_erp_waviewer.panel{5} = f_ERP_labelset_waveviewer_GUI(gui_erp_waviewer.settingLayout,gui_erp_waviewer.panel_fonts); gui_erp_waviewer.panelSizes(5) = 200; - gui_erp_waviewer.panel{6} = f_ERP_lineset_waveviewer_GUI(gui_erp_waviewer.settingLayout,gui_erp_waviewer.panel_fonts); gui_erp_waviewer.panelSizes(6) = 375; - gui_erp_waviewer.panel{7} = f_ERP_otherset_waveviewer_GUI(gui_erp_waviewer.settingLayout,gui_erp_waviewer.panel_fonts); gui_erp_waviewer.panelSizes(7) = 225; - gui_erp_waviewer.panel{8} = f_ERP_property_waveviewer_GUI(gui_erp_waviewer.settingLayout,gui_erp_waviewer.panel_fonts); - gui_erp_waviewer.panelSizes(8) = 130; - + gui_erp_waviewer.panelSizes(8) = 140; set(gui_erp_waviewer.settingLayout, 'Heights', gui_erp_waviewer.panelSizes); gui_erp_waviewer.panelscroll.Heights = sum(gui_erp_waviewer.panelSizes); @@ -417,16 +389,11 @@ function ERPLAB_ERP_Viewer(ALLERP,selectedERP_index,binArray,chanArray,Paramete %% + Create the view p = gui_erp_waviewer.ViewContainer; gui_erp_waviewer.ViewAxes = uiextras.HBox( 'Parent', p,'BackgroundColor',ColorBviewer_def); - gui_erp_waviewer.Resize=1; + gui_erp_waviewer.Resize=0; end % createInterface_ERPWave_viewer function nMinimize( eventSource, eventData, whichpanel) %#ok - try - [version reldate,ColorB_def,ColorF_def,errorColorF_def,ColorBviewer_def] = geterplabstudiodef; - catch - ColorBviewer_def = [0.7020 0.77 0.85]; - end minned = gui_erp_waviewer.panel{whichpanel}.IsMinimized; szs = get( gui_erp_waviewer.settingLayout, 'Sizes' ); if minned @@ -436,9 +403,8 @@ function nMinimize( eventSource, eventData, whichpanel) %#ok set( gui_erp_waviewer.panel{whichpanel}, 'IsMinimized', true); szs(whichpanel) = 25; end - set( gui_erp_waviewer.settingLayout, 'Sizes', szs ,'BackgroundColor',ColorBviewer_def); + set( gui_erp_waviewer.settingLayout, 'Sizes', szs); gui_erp_waviewer.panelscroll.Heights = sum(szs); - set(gui_erp_waviewer.panelscroll,'BackgroundColor',ColorBviewer_def); end % nMinimize @@ -454,7 +420,6 @@ function onExit(~,~) if strcmpi(button1,'Yes') try close(gui_erp_waviewer.Window); - clear ALLERPwaviewer; catch return; end @@ -468,17 +433,13 @@ function onhelp(~,~) end -%%Resize the GUI automatically as the user changes the size of the window at run-time. -% function WAviewerResize(~,~) -% if gui_erp_waviewer.Resize ~= 0 -% new_pos = gui_erp_waviewer.Window.Position; -% erpworkingmemory('ERPWaveScreenPos',new_pos); -% gui_erp_waviewer.screen_pos = new_pos; -% % set(gui_erp_waviewer.Window, 'Position', new_pos); -% f_redrawERP_viewer_test(); -% end -% end +%%%%%%%%%%%%%%%%%%%%%%% +end % end of the function -%%%%%%%%%%%%%%%%%%%%%%% -end % end of the function \ No newline at end of file +%%---------------------ERPLAB VERSION-------------------------------------- +function erplabver1 = geterplabeversion +erplab_default_values; +erplabver1 = str2num(erplabver); +estudioworkingmemory('erplabver', erplabver); +end \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/ERP_layoutstringGUI.fig b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/ERP_layoutstringGUI.fig old mode 100644 new mode 100755 index d56719870c8c076cc4560bd6084ba9e163dfb435..bb4964d2bb35e91fbb9d8c736b5e46e6af928b21 GIT binary patch delta 17980 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 delta 18506 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 X+fKrp-%-)J?X numel(plotArray) -% GridinforDatadef{Numofrows,Numofcolumns} = ''; -% else -% GridinforDatadef{Numofrows,Numofcolumns} = char(plotArray{count}); -% end -% end -% end try GridinforData = varargin{2}; @@ -87,37 +66,7 @@ function ERP_layoutstringGUI_OpeningFcn(hObject, eventdata, handles, varargin) end handles.GridinforData = GridinforData; handles.GridinforData_def = GridinforData; -% if isempty(GridinforData) -% GridinforData = GridinforDatadef; -% end -% if size(GridinforData,1)~= Numrows || size(GridinforData,2)~= Numcolumns -% GridinforData = GridinforDatadef; -% end - -% FonsizeDefault = f_get_default_fontsize(); -% % tablePosition = handles.uitable1_layout.Position; -% for Numofcolumns = 1:Numcolumns -% columFormat{Numofcolumns} = 'char'; -% ColumnEditable(Numofcolumns) =1; -% ColumnName{1,Numofcolumns} = char(['C',num2str(Numofcolumns)]); -% end -% -% for Numofrows = 1:Numrows -% RowName{1,Numofrows} = char(['R',num2str(Numofrows)]); -% end -% set(handles.uitable1_layout,'Data',GridinforData); -% handles.uitable1_layout.ColumnEditable = logical(ColumnEditable); -% handles.uitable1_layout.ColumnName = ColumnName; -% handles.uitable1_layout.RowName = RowName; -% handles.uitable1_layout.ColumnFormat = columFormat; -% handles.uitable1_layout.FontSize = FonsizeDefault; -% handles.uitable1_layout.CellEditCallback = {@MakerLabels,handles}; - -% f = waitbar(0.7,'Loading Custtom Grid Layout GUI...'); - -% [plotArrayFormt] = f_MarkLabels_gridlocations_ERP_Waveiwer(GridinforData,usedIndex,AllabelArray); -% handles.listbox_Labels.String = ''; -% handles.listbox_Labels.String = plotArrayFormt; + % % % Color GUI % @@ -127,25 +76,11 @@ function ERP_layoutstringGUI_OpeningFcn(hObject, eventdata, handles, varargin) handles.textrow5.BackgroundColor = ColorBviewer_def; handles.text6_columns.BackgroundColor = ColorBviewer_def; handles.text7_message.BackgroundColor = ColorBviewer_def; -% handles.listbox_Labels.Min = 0; -% handles.listbox_Labels.Max =1; -% handles.listbox_Labels.Enable = 'off'; -% handles.listbox_Labels.Value = 1; handles.text_rownum.String = num2str(Numrows); handles.edit1_columnsNum.String = num2str(Numcolumns); handles.text7_message.String = sprintf([' In the right panel:\n Blue labels: unused.\n Red labels: used more than once.\n Black labels: used once.\n *: Selected in main GUI.']); -% Data = handles.uitable1_layout.Data; -% -% Data = f_checktable_gridlocations_waviewer(Data,AllabelArray); -% try -% SingleCell = AllabelArray{handles.listbox_Labels.Value}; -% catch -% SingleCell = AllabelArray{1}; -% end -% Data = f_add_bgcolor_cell(Data,SingleCell); -% handles.uitable1_layout.Data=Data; %% handles = Datacreate(plotBox,GridinforData,plotArrayFormt,AllabelArray,handles); @@ -471,47 +406,6 @@ function text_rownum_Callback(hObject, eventdata, handles) -%%Mark the labels with different colors(blue: unused; black:used; red:Repeated;* means items were selected in the main GUI) -% function [LabelStrout] = f_MarkLabels_gridlocations_ERP_Waveiwer(Gridata,LabelStr,AllabelArray) -% usedIndex = zeros(length(AllabelArray),1); -% for jj = 1:length(AllabelArray) -% for ii = 1:length(LabelStr) -% if strcmp(AllabelArray{jj},LabelStr{ii}) -% usedIndex(jj) = 1; -% end -% end -% end -% -% LabelsFlag = [0 0 0]; -% for ii = 1:length(AllabelArray) -% code1 = 0; -% for jj = 1:size(Gridata,1) -% for kk = 1:size(Gridata,2) -% if strcmp(AllabelArray{ii},Gridata{jj,kk}) -% code1 = code1+1; -% end -% end -% end -% -% if usedIndex(ii)==1%% the item will be marked with * if the labels was selected -% % AllabelArray{ii} = strcat(AllabelArray{ii},'*'); -% Numstr = strcat('*',num2str(ii)); -% else -% Numstr = strcat(num2str(ii)); -% end -% -% if code1 ==0 -% LabelStrout{ii} = ['',Numstr,'.',32,AllabelArray{ii},'']; -% LabelsFlag(1) = 1; -% elseif code1 >1 -% LabelStrout{ii} = ['',Numstr,'.',32,AllabelArray{ii},'']; -% LabelsFlag(3) = 1; -% else -% LabelStrout{ii} = ['',Numstr,'.',32,AllabelArray{ii},'']; -% LabelsFlag(2) = 1; -% end -% end - function Data = f_add_bgcolor_cell(Data,SingleCell) colergen = @(color,text) ['
',text,'
']; @@ -525,49 +419,6 @@ function text_rownum_Callback(hObject, eventdata, handles) end -% function [Data, EPStr]= f_checktable_gridlocations_waviewer(Data,LabelStr) -% countEp = 0; -% EPStr = ''; -% for ii = 1:size(Data,1) -% for jj = 1:size(Data,2) -% count = 0; -% for kk = 1:length(LabelStr) -% Data1= strrep(Data{ii,jj},'
',''); -% Data1 = strrep(Data1,'
',''); -% Data{ii,jj} = char(Data1); -% if strcmp(strtrim(char(LabelStr{kk})),strtrim(char(Data{ii,jj}))) -% Data{ii,jj} = char(LabelStr{kk}); -% count = count +1; -% end -% end -% if count==0 -% countEp = countEp+1; -% if countEp==1 -% if ischar(Data{ii,jj}) -% if ~isempty(Data{ii,jj}) -% EPStr = char(Data{ii,jj}); -% end -% elseif isnumeric(Data{ii,jj}) -% if ~isempty(Data{ii,jj}) -% EPStr = num2str(Data{ii,jj}); -% end -% end -% else -% if ischar(Data{ii,jj}) -% if ~isempty(Data{ii,jj}) -% EPStr = strcat(EPStr,',',char(Data{ii,jj})); -% end -% elseif isnumeric(Data{ii,jj}) -% if ~isempty(Data{ii,jj}) -% EPStr = strcat(EPStr,',',num2str(Data{ii,jj})); -% end -% end -% end -% Data{ii,jj} = ''; -% end -% end -% end - function Labels_used = unique_str(Data) @@ -587,30 +438,31 @@ function text_rownum_Callback(hObject, eventdata, handles) % --- Executes on button press in pushbutton6_import. function pushbutton6_import_Callback(hObject, eventdata, handles) -[filename, filepath] = uigetfile('*.txt', ... - 'Load Gird Locations', ... - 'MultiSelect', 'off'); +[filename, filepath] = uigetfile({'*.tsv;*.txt'}, ... + 'Load Gird Locations'); if isequal(filename,0) - disp('User selected Cancel'); return; end try - % DataInput = importdata([filepath,filename]);%%There are some errors - % when using importdata - DataInput = readcell([filepath,filename]); + DataInput = readtable([filepath,filename], "FileType","text",'PreserveVariableNames',true); CellNum=2; catch - - DataInput = readcell([filepath,filename]); handles.text7_message.String = sprintf(['Cannot import:',filepath,filename]); return; - CellNum=2; end if isempty(DataInput) handles.text7_message.String = sprintf(['The file is empty.']); return; end +DataInput = table2cell(DataInput); +[rows,columns] = size(DataInput); +if columns==1 + handles.text7_message.String = sprintf(['Import is invalid']); + return; +end +DataInput = DataInput(:,2:end); + DataOutput = f_gridlocation_transcell(DataInput,CellNum); AllabelArray = handles.AllabelArray; @@ -744,8 +596,8 @@ function pushbutton6_import_Callback(hObject, eventdata, handles) function pushbutton8_Export_Callback(hObject, eventdata, handles) pathstr = pwd; -namedef ='GridLocations'; -[erpfilename, erppathname, indxs] = uiputfile({'*.txt'}, ... +namedef ='GridLocations_viewer'; +[erpfilename, erppathname, indxs] = uiputfile({'*.tsv'}, ... ['Save Grid Locations as'],... fullfile(pathstr,namedef)); if isequal(erpfilename,0) @@ -754,7 +606,7 @@ function pushbutton8_Export_Callback(hObject, eventdata, handles) end [pathstr, erpfilename, ext] = fileparts(erpfilename) ; -ext = '.txt'; +ext = '.tsv'; erpFilename = char(strcat(erppathname,erpfilename,ext)); AllabelArray = handles.AllabelArray; @@ -764,15 +616,30 @@ function pushbutton8_Export_Callback(hObject, eventdata, handles) [nrows,ncols] = size(Data); Data = f_gridlocation_respace_addnan(Data); formatSpec =''; -for jj = 1:ncols - formatSpec = strcat(formatSpec,'%s\t',32); +for jj = 1:ncols+1 + if jj==ncols+1 + formatSpec = strcat(formatSpec,'%s'); + else + formatSpec = strcat(formatSpec,'%s\t',32); + end + if jj==1 + columName{1,jj} = ''; + else + columName{1,jj} = ['Column',32,num2str(jj-1)]; + end end formatSpec = strcat(formatSpec,'\n'); - +fprintf(fileID,formatSpec,columName{1,:}); for row = 1:nrows - fprintf(fileID,formatSpec,Data{row,:}); + rowdata = cell(1,ncols+1); + rowdata{1,1} = char(['Row',num2str(row)]); + for jj = 1:ncols + rowdata{1,jj+1} = Data{row,jj}; + end + fprintf(fileID,formatSpec,rowdata{1,:}); end fclose(fileID); + disp(['The file for ERP Viewer Grid layout was created at ' erpFilename '']) function data = f_gridlocation_respace_addnan(data) @@ -784,7 +651,7 @@ function pushbutton8_Export_Callback(hObject, eventdata, handles) if ~isempty(labx) labx = regexprep(labx,'\\|\/|\*|\#|\$|\@','_'); else - labx = 'NaN'; + labx = ' '; end data{ii,jj} = labx; end @@ -844,6 +711,3 @@ function pushbutton8_Export_Callback(hObject, eventdata, handles) handles.listbox_Labels.Min = 0; handles.listbox_Labels.Max =1; handles.listbox_Labels.Value = 1; -% - - diff --git a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/default_amp_ticks_viewer.m b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/default_amp_ticks_viewer.m index f01c70e9..03bb292b 100755 --- a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/default_amp_ticks_viewer.m +++ b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/default_amp_ticks_viewer.m @@ -42,7 +42,7 @@ if yrange(1)>= yrange(2) beep; - disp('Please the left edge of y scale should be smaller than the righ edge.'); + disp('The left edge of y scale should be smaller than the righ edge.'); return; end diff --git a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ERP_Binchan_waviewer_GUI.m b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ERP_Binchan_waviewer_GUI.m index f6861d3c..61a7ece9 100755 --- a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ERP_Binchan_waviewer_GUI.m +++ b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ERP_Binchan_waviewer_GUI.m @@ -13,30 +13,21 @@ % Initial setup % function varargout = f_ERP_Binchan_waviewer_GUI(varargin) -% global viewer_ERPDAT -global observe_ERPDAT; - +global gui_erp_waviewer; addlistener(viewer_ERPDAT,'loadproper_change',@loadproper_change); addlistener(viewer_ERPDAT,'v_currentERP_change',@v_currentERP_change); addlistener(viewer_ERPDAT,'count_twopanels_change',@count_twopanels_change); addlistener(viewer_ERPDAT,'Reset_Waviewer_panel_change',@Reset_Waviewer_panel_change); -addlistener(viewer_ERPDAT,'ERPset_Chan_bin_label_change',@ERPset_Chan_bin_label_change); -addlistener(observe_ERPDAT,'ERP_chan_change',@ERP_chan_changed); -addlistener(observe_ERPDAT,'ERP_bin_change',@ERP_bin_changed); -addlistener(observe_ERPDAT,'Two_GUI_change',@Two_GUI_change); - ERPwaveview_binchan = struct(); -%---------Setting the parameter which will be used in the other panels----------- try [version reldate,ColorBviewer_def,ColorF_def,errorColorF_def,ColorBviewer_def] = geterplabstudiodef; catch - ColorBviewer_def = [0.7765 0.7294 0.8627]; + ColorBviewer_def = [0.8 0.8 0.9]; end -ERPdatasets = []; % Local data structure % global Chanbin_waveviewer_box; if nargin == 0 fig = figure(); % Parent figure @@ -51,7 +42,6 @@ elseif nargin == 4 Chanbin_waveviewer_box = uiextras.BoxPanel('Parent', varargin{1}, 'Title', 'Channels and Bins', 'Padding', 5, ... 'FontSize', varargin{2},'BackgroundColor',ColorBviewer_def,'TitleColor',[0.5 0.5 0.9],'ForegroundColor','w'); - end try @@ -73,57 +63,16 @@ function drawui_erpsetbinchan_viewer(FonsizeDefault) try [version reldate,ColorB_def,ColorF_def,errorColorF_def,ColorBviewer_def] = geterplabstudiodef; catch - ColorBviewer_def = [0.7765 0.7294 0.8627]; - end - try - ERPwaviewer = evalin('base','ALLERPwaviewer'); - SelectedIndex = ERPwaviewer.SelectERPIdx; - ALLERP = ERPwaviewer.ALLERP; - if max(SelectedIndex(:))> length(ALLERP) - SelectedIndex =length(ALLERP); - end - catch - beep; - disp('f_ERP_Binchan_waviewer_GUI error: Restart ERPwave Viewer'); - return; + ColorBviewer_def = [0.8 0.8 0.9]; end + ERPwaveview_binchan.vBox = uiextras.VBox('Parent', Chanbin_waveviewer_box, 'Spacing', 5,'BackgroundColor',ColorBviewer_def); % VBox for everything ERPtooltype = erpgettoolversion('tooltype'); + MERPWaveViewer_chanbin{1}=0; - if ~strcmpi(ERPtooltype,'EStudio') %&& ~strcmpi(ERPtooltype,'ERPLAB') - ERPwaviewer.erp_binchan_op = 0; - MERPWaveViewer_chanbin{1}=0; - end - try - Enable_auto = MERPWaveViewer_chanbin{1}; - catch - Enable_auto = 1; - MERPWaveViewer_chanbin{1}=1; - end - if numel(Enable_auto)~=1 || (Enable_auto~=0 && Enable_auto~=1) - Enable_auto = 1; - MERPWaveViewer_chanbin{1}=1; - end - if Enable_auto ==1 - Enable_label = 'off'; - elseif Enable_auto ==0 - Enable_label = 'on'; - end - %%---------------------Options for selecting channel and bins----------------------------------------------------- - ERPwaveview_binchan.opts_title = uiextras.HBox('Parent', ERPwaveview_binchan.vBox, 'Spacing', 5,'BackgroundColor',ColorBviewer_def); - ERPwaveview_binchan.auto = uicontrol('Style', 'radiobutton','Parent', ERPwaveview_binchan.opts_title,... - 'String','Same as EStudio','callback',@Chanbin_auto,'Value',Enable_auto,'Enable','on','FontSize',FonsizeDefault,'BackgroundColor',ColorBviewer_def); - ERPwaveview_binchan.auto.KeyPressFcn = @setbinchan_presskey; - - ERPwaveview_binchan.custom = uicontrol('Style', 'radiobutton','Parent', ERPwaveview_binchan.opts_title,... - 'String','Custom','callback',@Chanbin_custom,'Value',~Enable_auto,'Enable','on','FontSize',FonsizeDefault,'BackgroundColor',ColorBviewer_def); - ERPwaveview_binchan.custom.KeyPressFcn = @setbinchan_presskey; - - % %%---------------------Display channel and bin labels----------------------------------------------------- - ERPwaveview_binchan.DataSelGrid = uiextras.HBox('Parent', ERPwaveview_binchan.vBox,'BackgroundColor',ColorBviewer_def); - [chanStr,binStr,diff_mark] = f_geterpschanbin(ALLERP,SelectedIndex); + [chanStr,binStr,diff_mark] = f_geterpschanbin(gui_erp_waviewer.ERPwaviewer.ALLERP,gui_erp_waviewer.ERPwaviewer.SelectERPIdx); Chanlist_name = cell(length(chanStr)+1,1); Chanlist_name(1) = {'All'}; @@ -132,28 +81,29 @@ function drawui_erpsetbinchan_viewer(FonsizeDefault) end % Channel information Chanlist = chanStr; - Chan_seldef = ERPwaviewer.chan; + Chan_seldef = gui_erp_waviewer.ERPwaviewer.chan; if ~isempty(Chan_seldef) - if max(Chan_seldef)> numel(Chanlist) + if any(Chan_seldef> numel(Chanlist)) Chan_seldef= 1:length(Chanlist); end else Chan_seldef= 1:length(Chanlist); end - try - Chan_sel = MERPWaveViewer_chanbin{2}; - catch - MERPWaveViewer_chanbin{2} = Chan_seldef; + if strcmpi(ERPtooltype,'EStudio') Chan_sel = Chan_seldef; + MERPWaveViewer_chanbin{2} = Chan_seldef; + else + Chan_sel = 1:length(Chanlist); + MERPWaveViewer_chanbin{2} = Chan_sel; end Chan_sel = unique(Chan_sel); - if isempty(Chan_sel) || max(Chan_sel(:))> length(Chanlist) || min(Chan_sel(:))> length(Chanlist) || min(Chan_sel(:))<=0 + if isempty(Chan_sel) || any(Chan_sel(:)> length(Chanlist)) || any(Chan_sel(:)<=0) MERPWaveViewer_chanbin{2} = Chan_seldef; Chan_sel = Chan_seldef; end - ERPwaviewer.chan = Chan_sel; + gui_erp_waviewer.ERPwaviewer.chan = Chan_sel; ERPwaveview_binchan.ElecRange = uicontrol('Parent', ERPwaveview_binchan.DataSelGrid,'Style','listbox','min',1,'max',length(Chanlist_name),... - 'String', Chanlist_name,'Callback',@ViewerElecRange,'FontSize',FonsizeDefault,'Enable',Enable_label); % 2B + 'String', Chanlist_name,'Callback',@ViewerElecRange,'FontSize',FonsizeDefault,'Enable','on','BackgroundColor',[1 1 1]); % 2B ERPwaveview_binchan.ElecRange.KeyPressFcn = @setbinchan_presskey; if numel(Chan_sel) == numel(Chanlist) @@ -164,31 +114,32 @@ function drawui_erpsetbinchan_viewer(FonsizeDefault) %%Bin information brange = cell(length(binStr)+1,1); BinNum = length(binStr); - Bin_seldef = ERPwaviewer.bin; + Bin_seldef = gui_erp_waviewer.ERPwaviewer.bin; if ~isempty(Bin_seldef) - if max(Bin_seldef)> BinNum + if any(Bin_seldef> BinNum) Bin_seldef= 1:BinNum; end else Bin_seldef= 1:BinNum; end - try - Bin_sel = MERPWaveViewer_chanbin{3}; - catch + if strcmpi(ERPtooltype,'EStudio') MERPWaveViewer_chanbin{3} = Bin_seldef; Bin_sel = Bin_seldef; + else + Bin_sel = 1:BinNum; + MERPWaveViewer_chanbin{3} = Bin_sel; end - if isempty(Bin_sel) || max(Bin_sel(:))> length(binStr) || min(Bin_sel(:))> length(binStr) || min(Bin_sel(:))<=0 - MERPWaveViewer_chanbin{3} = Bin_seldef; - Bin_sel = Bin_seldef; + if isempty(Bin_sel) || any(Bin_sel(:)> length(binStr)) || any(Bin_sel(:)<=0) + Bin_sel = 1:BinNum; + MERPWaveViewer_chanbin{3} = Bin_sel; end - ERPwaviewer.bin=Bin_sel; + gui_erp_waviewer.ERPwaviewer.bin=Bin_sel; brange(1) = {'All'}; for Numofbin11 = 1:length(binStr) brange(Numofbin11+1) = {char(strcat(num2str(Numofbin11),'.',32,char(binStr(Numofbin11))))}; end ERPwaveview_binchan.BinRange = uicontrol('Parent', ERPwaveview_binchan.DataSelGrid,'Style','listbox','Min',1,'Max',BinNum+1,... - 'String', brange,'callback',@ViewerBinRange,'FontSize',FonsizeDefault,'Enable',Enable_label); % 2C + 'String', brange,'callback',@ViewerBinRange,'FontSize',FonsizeDefault,'Enable','on','BackgroundColor',[1 1 1]); % 2C ERPwaveview_binchan.BinRange.KeyPressFcn = @setbinchan_presskey; if BinNum== numel(Bin_sel) ERPwaveview_binchan.BinRange.Value =1; @@ -197,34 +148,25 @@ function drawui_erpsetbinchan_viewer(FonsizeDefault) end set(ERPwaveview_binchan.DataSelGrid, 'Sizes',[ -1.2 -2]); - if strcmpi(ERPtooltype,'EStudio') - ERPwaveview_binchan.auto.String = 'Same as EStudio'; - else - ERPwaveview_binchan.auto.String = ''; - ERPwaveview_binchan.auto.Enable = 'off'; - ERPwaveview_binchan.custom.Value =1; - ERPwaveview_binchan.custom.String = ''; - ERPwaveview_binchan.auto.Value = 0; - ERPwaveview_binchan.custom.Enable = 'off'; - ERPwaveview_binchan.ElecRange.Enable = 'on'; - ERPwaveview_binchan.BinRange.Enable = 'on'; - end - - %%Help and apply ERPwaveview_binchan.help_apply_title = uiextras.HBox('Parent', ERPwaveview_binchan.vBox,'BackgroundColor',ColorBviewer_def); uiextras.Empty('Parent',ERPwaveview_binchan.help_apply_title ); - uicontrol('Style','pushbutton','Parent', ERPwaveview_binchan.help_apply_title ,'String','Cancel',... - 'callback',@setbinchan_help,'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1]); %,'FontWeight','bold','HorizontalAlignment','left' + ERPwaveview_binchan.cancel = uicontrol('Style','pushbutton','Parent', ERPwaveview_binchan.help_apply_title ,'String','Cancel',... + 'callback',@setbinchan_cancel,'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1]); %,'FontWeight','bold','HorizontalAlignment','left' uiextras.Empty('Parent',ERPwaveview_binchan.help_apply_title ); ERPwaveview_binchan.apply = uicontrol('Style','pushbutton','Parent',ERPwaveview_binchan.help_apply_title ,'String','Apply',... 'callback',@setbinchan_apply,'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1]); %,'HorizontalAlignment','left' -% ERPwaveview_binchan.custom.KeyPressFcn = @setbinchan_presskey; + % ERPwaveview_binchan.custom.KeyPressFcn = @setbinchan_presskey; uiextras.Empty('Parent',ERPwaveview_binchan.help_apply_title ); set(ERPwaveview_binchan.help_apply_title ,'Sizes',[40 70 20 70 20]); - set(ERPwaveview_binchan.vBox, 'Sizes', [20 190 25]); - assignin('base','ALLERPwaviewer',ERPwaviewer); - estudioworkingmemory('MERPWaveViewer_chanbin',MERPWaveViewer_chanbin); + set(ERPwaveview_binchan.vBox, 'Sizes', [210 25]); + + estudioworkingmemory('MERPWaveViewer_chanbin',MERPWaveViewer_chanbin); %%save chan array and bin array + estudioworkingmemory('MyViewer_chanbin',0); + + gui_erp_waviewer.ERPwaviewer.bin = Bin_sel; + gui_erp_waviewer.ERPwaviewer.chan = Chan_sel; + end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -250,6 +192,8 @@ function ViewerElecRange(Source,~) ERPwaveview_binchan.apply.BackgroundColor = [0.4940 0.1840 0.5560]; ERPwaveview_binchan.apply.ForegroundColor = [1 1 1]; Chanbin_waveviewer_box.TitleColor= [0.4940 0.1840 0.5560]; + ERPwaveview_binchan.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + ERPwaveview_binchan.cancel.ForegroundColor = [1 1 1]; end @@ -269,193 +213,40 @@ function ViewerBinRange(BinSource,~) BinSource.Value = 1; end end - estudioworkingmemory('MyViewer_chanbin',1); ERPwaveview_binchan.apply.BackgroundColor = [0.4940 0.1840 0.5560]; ERPwaveview_binchan.apply.ForegroundColor = [1 1 1]; Chanbin_waveviewer_box.TitleColor= [0.4940 0.1840 0.5560]; + ERPwaveview_binchan.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + ERPwaveview_binchan.cancel.ForegroundColor = [1 1 1]; end -%%---------------Setting for auto option----------------------------------- - function Chanbin_auto(source,~) - [messgStr,viewerpanelIndex] = f_check_erpviewerpanelchanges(); - if ~isempty(messgStr) && viewerpanelIndex~=2 - viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; - end - estudioworkingmemory('MyViewer_chanbin',1); - ERPwaveview_binchan.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - ERPwaveview_binchan.apply.ForegroundColor = [1 1 1]; - Chanbin_waveviewer_box.TitleColor= [0.4940 0.1840 0.5560]; - ERPtooltype = erpgettoolversion('tooltype'); - if strcmpi(ERPtooltype,'EStudio') - ERPwaveview_binchan.auto.Value = 1; - ERPwaveview_binchan.custom.Value =0; - ERPwaveview_binchan.ElecRange.Enable = 'off'; - ERPwaveview_binchan.BinRange.Enable = 'off'; - Selected_erpset= estudioworkingmemory('selectederpstudio'); - Geterpbinchan = estudioworkingmemory('geterpbinchan'); - CurrentERPIndex = Geterpbinchan.Select_index; - try - ERPwaviewerIN = evalin('base','ALLERPwaviewer'); - ALLERPIN = ERPwaviewerIN.ALLERP; - if max(Selected_erpset(:))> length(ALLERPIN) - Selected_erpset =1; - CurrentERPIndex =1; - end - catch - beep; - disp('f_ERP_Binchan_waviewer_GUI error: Restart ERPwave Viewer'); - return; - end - - BinArray = Geterpbinchan.bins{Geterpbinchan.Select_index}; - chanArray = Geterpbinchan.elecs_shown{Geterpbinchan.Select_index}; - chan_bin = Geterpbinchan.bins_chans(CurrentERPIndex); - if chan_bin ==1 - ERPwaviewerIN.plot_org.Grid =2; - ERPwaviewerIN.plot_org.Overlay=1; - ERPwaviewerIN.plot_org.Pages=3; - elseif chan_bin==0 - ERPwaviewerIN.plot_org.Grid =1; - ERPwaviewerIN.plot_org.Overlay=2; - ERPwaviewerIN.plot_org.Pages=3; - end - - % Channel information - chanStr = [1:(numel(ERPwaveview_binchan.ElecRange.String)-1)]; - Chanlist = chanStr; - Chan_sel = chanArray; - if ~isempty(Chan_sel) - if max(Chan_sel)> numel(Chanlist) - Chan_sel= 1:length(Chanlist); - end - else - Chan_sel= 1:length(Chanlist); - end - try - if length(Chan_sel) == numel(chanStr) - ERPwaveview_binchan.ElecRange.Value =1; - else - ERPwaveview_binchan.ElecRange.Value =Chan_sel+1; - end - catch - ERPwaveview_binchan.ElecRange.Value =1; - end - - %%Bin information - binStr = ERPwaveview_binchan.BinRange.String; - BinNum = length(binStr)-1; - Bin_sel = BinArray; - if ~isempty(Bin_sel) - if max(Bin_sel)> BinNum - Bin_sel= 1:BinNum; - end - else - Bin_sel= 1:BinNum; - end - - if BinNum== numel(Bin_sel) - ERPwaveview_binchan.BinRange.Value =1; - else - ERPwaveview_binchan.BinRange.Value = Bin_sel+1; - end - - elseif strcmpi(ERPtooltype,'ERPLAB') - ERPwaveview_binchan.auto.Value = 1; - ERPwaveview_binchan.custom.Value =0; - ERPwaveview_binchan.ElecRange.Enable = 'off'; - ERPwaveview_binchan.BinRange.Enable = 'off'; - Selected_erpset = evalin('base','CURRENTERP'); - ALLERP = evalin('base','ALLERP'); - if ~isempty(Selected_erpset) && ~isempty(ALLERP) && (Selected_erpset<= length(ALLERP)) && min(Selected_erpset)>0 - [chanStr,binStr,diff_mark] = f_geterpschanbin(ALLERP,SelectedIndex); - Chanlist_name = cell(length(chanStr)+1,1); - Chanlist_name(1) = {'All'}; - for Numofchan11 = 1:length(chanStr) - Chanlist_name(Numofchan11+1) = {char(strcat(num2str(Numofchan11),'.',32,char(chanStr(Numofchan11))))}; - end - ERPwaveview_binchan.ElecRange.String = Chanlist_name; - ERPwaveview_binchan.ElecRange.Value =1; - - brange = cell(length(binStr)+1,1); - brange(1) = {'All'}; - for Numofbin11 = 1:length(binStr) - brange(Numofbin11+1) = {char(strcat(num2str(Numofbin11),'.',32,char(binStr(Numofbin11))))}; - end - ERPwaveview_binchan.BinRange.String = brange; - ERPwaveview_binchan.BinRange.Value = 1; - end - else - ERPwaveview_binchan.auto.Value = 0; - ERPwaveview_binchan.custom.Value =1; - ERPwaveview_binchan.ElecRange.Enable = 'on'; - ERPwaveview_binchan.BinRange.Enable = 'on'; - end - end -%%---------------Setting for custom option--------------------------------- - function Chanbin_custom(source,~) - [messgStr,viewerpanelIndex] = f_check_erpviewerpanelchanges(); - if ~isempty(messgStr) && viewerpanelIndex~=2 - viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; - end - - estudioworkingmemory('MyViewer_chanbin',1); - ERPwaveview_binchan.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - ERPwaveview_binchan.apply.ForegroundColor = [1 1 1]; - Chanbin_waveviewer_box.TitleColor= [0.4940 0.1840 0.5560]; - - ERPtooltype = erpgettoolversion('tooltype'); - if ~strcmpi(ERPtooltype,'EStudio') && ~strcmpi(ERPtooltype,'ERPLAB') - ERPwaveview_binchan.auto.Value = 0; - ERPwaveview_binchan.custom.Value =1; - ERPwaveview_binchan.ElecRange.Enable = 'on'; - ERPwaveview_binchan.BinRange.Enable = 'on'; - ERPwaveview_binchan.auto.Enable = 'off'; - else - ERPwaveview_binchan.auto.Value = 0; - ERPwaveview_binchan.custom.Value =1; - ERPwaveview_binchan.ElecRange.Enable = 'on'; - ERPwaveview_binchan.BinRange.Enable = 'on'; - end - end - - %%-------------------------------Help-------------------------------------- - function setbinchan_help(~,~) + function setbinchan_cancel(~,~) [messgStr,viewerpanelIndex] = f_check_erpviewerpanelchanges(); if ~isempty(messgStr) && viewerpanelIndex~=2 viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end - changeFlag = estudioworkingmemory('MyViewer_chanbin'); if changeFlag~=1 return; end MessageViewer= char(strcat('Channels and Bins > Cancel')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =1; - try - ERPwaviewer_apply = evalin('base','ALLERPwaviewer'); - catch - viewer_ERPDAT.Process_messg =3; - fprintf(2,'\nChannels and Bins > Cancel-f_ERP_Binchan_waviewer_GUI() error: Cannot get parameters for whole panel.\n Please run My viewer again.\n\n'); - return; - end - if ERPwaviewer_apply.binchan_op==1 - ERPwaveview_binchan.auto.Value = 1; - ERPwaveview_binchan.custom.Value =0; - ERPwaveview_binchan.ElecRange.Enable = 'off'; - ERPwaveview_binchan.BinRange.Enable = 'off'; - else - ERPwaveview_binchan.auto.Value = 0; - ERPwaveview_binchan.custom.Value =1; - ERPwaveview_binchan.ElecRange.Enable = 'on'; - ERPwaveview_binchan.BinRange.Enable = 'on'; + + binArray = gui_erp_waviewer.ERPwaviewer.bin; + if isempty(binArray) || any(binArray<=0) || any(binArray>length(ERPwaveview_binchan.BinRange.String)-1) + binArray = [1:length(ERPwaveview_binchan.BinRange.String)-1]; + gui_erp_waviewer.ERPwaviewer.bin=binArray; end - binArray = ERPwaviewer_apply.bin; - chanArray = ERPwaviewer_apply.chan; + chanArray = gui_erp_waviewer.ERPwaviewer.chan; + if isempty(chanArray) || any(chanArray<=0) || any(chanArray> length(ERPwaveview_binchan.ElecRange.String)-1) + chanArray = [1:length(ERPwaveview_binchan.BinRange.String)-1]; + gui_erp_waviewer.ERPwaviewer.chan= chanArray; + end if numel(binArray) == length(ERPwaveview_binchan.BinRange.String)-1 ERPwaveview_binchan.BinRange.Value =1; else @@ -467,18 +258,17 @@ function setbinchan_help(~,~) ERPwaveview_binchan.ElecRange.Value =chanArray+1; end - ERPtooltype = erpgettoolversion('tooltype'); - if ~strcmpi(ERPtooltype,'EStudio') %&& ~strcmpi(ERPtooltype,'ERPLAB') - ERPwaveview_binchan.ElecRange.Enable = 'on'; - ERPwaveview_binchan.BinRange.Enable = 'on'; - end + ERPwaveview_binchan.ElecRange.Enable = 'on'; + ERPwaveview_binchan.BinRange.Enable = 'on'; estudioworkingmemory('MyViewer_chanbin',0); ERPwaveview_binchan.apply.BackgroundColor = [1 1 1]; Chanbin_waveviewer_box.TitleColor= [0.5 0.5 0.9]; ERPwaveview_binchan.apply.ForegroundColor = [0 0 0]; - MessageViewer= char(strcat('Channels and Bins > Cancel')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + ERPwaveview_binchan.cancel.BackgroundColor = [1 1 1]; + ERPwaveview_binchan.cancel.ForegroundColor = [0 0 0]; + MessageViewer= char(strcat('Channels and Bins > Cancel')); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =2; end @@ -490,74 +280,79 @@ function setbinchan_apply(~,~) end MessageViewer= char(strcat('Channels and Bins > Apply')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =1; - try - ERPwaviewer_apply = evalin('base','ALLERPwaviewer'); - catch - viewer_ERPDAT.Process_messg =3; - fprintf(2,'\nChannels and Bins > Apply-f_ERP_Binchan_waviewer_GUI() error: Cannot get parameters for whole panel.\n Please run My viewer again.\n\n'); - return; - end - ERPwaviewer_apply.binchan_op = ERPwaveview_binchan.auto.Value; + gui_erp_waviewer.ERPwaviewer.binchan_op = 0; ChanArrayValue = ERPwaveview_binchan.ElecRange.Value; - if numel(ChanArrayValue)== 1&& ChanArrayValue ==1 + if numel(ChanArrayValue)== 1 && ChanArrayValue ==1 ChanArray = [1:length(ERPwaveview_binchan.ElecRange.String)-1]; else ChanArray = ChanArrayValue-1; end - ERPwaviewer_apply.chan = ChanArray; + chandef = gui_erp_waviewer.ERPwaviewer.chan; + if numel(ChanArray)> numel(chandef) + chandiff = setdiff(ChanArray,chandef); + else + chandiff = setdiff(chandef,ChanArray); + end + if ~isempty(chandiff) + gui_erp_waviewer.ERPwaviewer.chan = ChanArray; + end BinArrayValue = ERPwaveview_binchan.BinRange.Value; if BinArrayValue ==1 BinArray = [1:length(ERPwaveview_binchan.BinRange.String)-1]; else BinArray = BinArrayValue-1; end - ERPwaviewer_apply.bin = BinArray; - - %%recover the label for bin and channel panel, and reset - %%backgroundcolor of "Apply" + bindef = gui_erp_waviewer.ERPwaviewer.bin; + if numel(BinArray)>numel(bindef) + bindiff = setdiff(BinArray,bindef); + else + bindiff = setdiff(bindef,BinArray); + end + if ~isempty(bindiff) + gui_erp_waviewer.ERPwaviewer.bin = BinArray; + end estudioworkingmemory('MyViewer_chanbin',0); ERPwaveview_binchan.apply.BackgroundColor = [1 1 1]; Chanbin_waveviewer_box.TitleColor= [0.5 0.5 0.9]; ERPwaveview_binchan.apply.ForegroundColor = [0 0 0]; - assignin('base','ALLERPwaviewer',ERPwaviewer_apply); + ERPwaveview_binchan.cancel.BackgroundColor = [1 1 1]; + ERPwaveview_binchan.cancel.ForegroundColor = [0 0 0]; - %%save the parameters to memory file - MERPWaveViewer_chanbin{1} = ERPwaviewer_apply.binchan_op; - MERPWaveViewer_chanbin{2} =ERPwaviewer_apply.chan; - MERPWaveViewer_chanbin{3} =ERPwaviewer_apply.bin; + MERPWaveViewer_chanbin{1} = 0; + MERPWaveViewer_chanbin{2} =gui_erp_waviewer.ERPwaviewer.chan; + MERPWaveViewer_chanbin{3} =gui_erp_waviewer.ERPwaviewer.bin; estudioworkingmemory('MERPWaveViewer_chanbin',MERPWaveViewer_chanbin); %%change the other panels based on the changed bins and channels - viewer_ERPDAT.Count_currentERP = viewer_ERPDAT.Count_currentERP+1; - %%plot waves - f_redrawERP_viewer_test(); + viewer_ERPDAT.Count_currentERP = 1; viewer_ERPDAT.Process_messg =2; end %%---------change channels and bins based on the selected ERPsets---------- function v_currentERP_change(~,~) - try - ERPwaviewer_S = evalin('base','ALLERPwaviewer'); - catch + if viewer_ERPDAT.Count_currentERP~=2 return; end - ALLERP_S = ERPwaviewer_S.ALLERP; - Selected_ERPsetlabel = ERPwaviewer_S.SelectERPIdx; - if max(Selected_ERPsetlabel(:))> length(ALLERP_S) - Selected_ERPsetlabel =length(ALLERP_S); + ALLERP_S = gui_erp_waviewer.ERPwaviewer.ALLERP; + ERPsetArray = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + + if any(ERPsetArray(:)> length(ALLERP_S)) + ERPsetArray =length(ALLERP_S); + gui_erp_waviewer.ERPwaviewer.SelectERPIdx =ERPsetArray; end try - ERPwaviewer_S.ERP = ALLERP_S(Selected_ERPsetlabel(1)); - ERPwaviewer_S.CURRENTERP =Selected_ERPsetlabel(1); + gui_erp_waviewer.ERPwaviewer.ERP = ALLERP_S(ERPsetArray(1)); + gui_erp_waviewer.ERPwaviewer.CURRENTERP =ERPsetArray(1); catch - ERPwaviewer_S.ERP = ALLERP_S(Selected_ERPsetlabel(1)); - ERPwaviewer_S.CURRENTERP =Selected_ERPsetlabel(1); + gui_erp_waviewer.ERPwaviewer.ERP = ALLERP_S(ERPsetArray(1)); + gui_erp_waviewer.ERPwaviewer.CURRENTERP =ERPsetArray(1); + gui_erp_waviewer.ERPwaviewer.PageIndex=1; end - [chanStr,binStr,diff_mark] = f_geterpschanbin(ALLERP_S,Selected_ERPsetlabel); + [chanStr,binStr,diff_mark] = f_geterpschanbin(ALLERP_S,ERPsetArray); % Channel information Chanlist_name = cell(length(chanStr)+1,1); Chanlist_name(1) = {'All'}; @@ -566,19 +361,14 @@ function v_currentERP_change(~,~) end % Channel information Chanlist = chanStr; - Chan_selindex = ERPwaveview_binchan.ElecRange.Value; - if numel(Chan_selindex) ==1 && Chan_selindex==1 - Chan_sel = [1:numel(ERPwaveview_binchan.ElecRange.String)-1]; - else - Chan_sel =Chan_selindex-1; - end - if ~isempty(Chan_sel) - if max(Chan_sel)> numel(Chanlist) - Chan_sel= 1:length(Chanlist); - end - else - Chan_sel= 1:length(Chanlist); + Chan_selindex = gui_erp_waviewer.ERPwaviewer.chan; + if isempty(Chan_selindex) || any(Chan_selindex>length(Chanlist)) || any(Chan_selindex(:)<=0) + Chan_selindex =[1:length(Chanlist)]; + gui_erp_waviewer.ERPwaviewer.chan= Chan_selindex; end + + Chan_sel =Chan_selindex; + ERPwaveview_binchan.ElecRange.String = Chanlist_name; try if length(Chan_sel) == numel(chanStr) @@ -592,22 +382,15 @@ function v_currentERP_change(~,~) ERPwaveview_binchan.ElecRange.Min = 1; ERPwaveview_binchan.ElecRange.Max = length(ERPwaveview_binchan.ElecRange.String)+1; - %%Bin information + %%----------------------Bin information---------------------------- brange = cell(length(binStr)+1,1); BinNum = length(binStr); - Bin_selIndex = ERPwaveview_binchan.BinRange.Value; - if numel(Bin_selIndex) ==1 && Bin_selIndex==1 - Bin_sel = [1:numel(ERPwaveview_binchan.BinRange.String)-1]; - else - Bin_sel = Bin_selIndex-1; - end - if ~isempty(Bin_sel) - if max(Bin_sel)> BinNum - Bin_sel= 1:BinNum; - end - else - Bin_sel= 1:BinNum; + Bin_selIndex = gui_erp_waviewer.ERPwaviewer.bin; + if isempty(Bin_selIndex) || any(Bin_selIndex>BinNum) || any(Bin_selIndex<=0) + Bin_selIndex = [1:BinNum]; + gui_erp_waviewer.ERPwaviewer.bin=Bin_selIndex; end + Bin_sel = Bin_selIndex; brange(1) = {'All'}; for Numofbin11 = 1:length(binStr) brange(Numofbin11+1) = {char(strcat(num2str(Numofbin11),'.',32,char(binStr(Numofbin11))))}; @@ -625,7 +408,7 @@ function v_currentERP_change(~,~) else ChanArray = ChanArrayValue-1; end - ERPwaviewer_S.chan = ChanArray; + gui_erp_waviewer.ERPwaviewer.chan = ChanArray; BinArrayValue =ERPwaveview_binchan.BinRange.Value ; if BinArrayValue ==1 @@ -633,44 +416,38 @@ function v_currentERP_change(~,~) else BinArray = BinArrayValue-1; end - ERPwaviewer_S.bin = BinArray; - assignin('base','ALLERPwaviewer',ERPwaviewer_S); + gui_erp_waviewer.ERPwaviewer.bin = BinArray; + ERPwaveview_binchan.ElecRange.Enable = 'on'; + ERPwaveview_binchan.BinRange.Enable = 'on'; %%save the parameters to memory file - MERPWaveViewer_chanbin{1} = ERPwaviewer_S.binchan_op; - MERPWaveViewer_chanbin{2} =ERPwaviewer_S.chan; - MERPWaveViewer_chanbin{3} =ERPwaviewer_S.bin; + MERPWaveViewer_chanbin{1} = 0; + MERPWaveViewer_chanbin{2} =gui_erp_waviewer.ERPwaviewer.chan; + MERPWaveViewer_chanbin{3} =gui_erp_waviewer.ERPwaviewer.bin; estudioworkingmemory('MERPWaveViewer_chanbin',MERPWaveViewer_chanbin); + viewer_ERPDAT.Count_currentERP=3; end - - %%------------update this panel based on the imported parameters----------- function loadproper_change(~,~) if viewer_ERPDAT.loadproper_count ~=2 return; end - try - ERPwaviewer_S = evalin('base','ALLERPwaviewer'); - catch - return; - end - ALLERP_S = ERPwaviewer_S.ALLERP; - Selected_ERPsetlabel = ERPwaviewer_S.SelectERPIdx; - - if max(Selected_ERPsetlabel(:))> length(ALLERP_S) - Selected_ERPsetlabel =length(ALLERP_S); + ALLERP_S = gui_erp_waviewer.ERPwaviewer.ALLERP; + ERPsetArray = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + if max(ERPsetArray(:))> length(ALLERP_S) + ERPsetArray =length(ALLERP_S); end try - ERPwaviewer_S.ERP = ALLERP_S(Selected_ERPsetlabel(1)); - ERPwaviewer_S.CURRENTERP =Selected_ERPsetlabel(1); + gui_erp_waviewer.ERPwaviewer.ERP = ALLERP_S(ERPsetArray(1)); + gui_erp_waviewer.ERPwaviewer.CURRENTERP =ERPsetArray(1); catch - ERPwaviewer_S.ERP = ALLERP_S(Selected_ERPsetlabel(1)); - ERPwaviewer_S.CURRENTERP =Selected_ERPsetlabel(1); + gui_erp_waviewer.ERPwaviewer.ERP = ALLERP_S(ERPsetArray(1)); + gui_erp_waviewer.ERPwaviewer.CURRENTERP =ERPsetArray(1); end - [chanStr,binStr,diff_mark] = f_geterpschanbin(ALLERP_S,Selected_ERPsetlabel); + [chanStr,binStr,diff_mark] = f_geterpschanbin(ALLERP_S,ERPsetArray); % Channel information Chanlist_name = cell(length(chanStr)+1,1); Chanlist_name(1) = {'All'}; @@ -679,7 +456,7 @@ function loadproper_change(~,~) end % Channel information Chanlist = chanStr; - Chan_sel =ERPwaviewer_S.chan; + Chan_sel =gui_erp_waviewer.ERPwaviewer.chan; if ~isempty(Chan_sel) if max(Chan_sel)> numel(Chanlist) Chan_sel= 1:length(Chanlist); @@ -687,7 +464,7 @@ function loadproper_change(~,~) else Chan_sel= 1:length(Chanlist); end - ERPwaviewer_S.chan = Chan_sel; + gui_erp_waviewer.ERPwaviewer.chan = Chan_sel; ERPwaveview_binchan.ElecRange.String = Chanlist_name; try if length(Chan_sel) == numel(chanStr) @@ -704,7 +481,7 @@ function loadproper_change(~,~) %%Bin information brange = cell(length(binStr)+1,1); BinNum = length(binStr); - Bin_sel = ERPwaviewer_S.bin; + Bin_sel = gui_erp_waviewer.ERPwaviewer.bin; if ~isempty(Bin_sel) if max(Bin_sel)> BinNum Bin_sel= 1:BinNum; @@ -722,270 +499,32 @@ function loadproper_change(~,~) else ERPwaveview_binchan.BinRange.Value = Bin_sel+1; end - ERPwaviewer_S.bin = Bin_sel; + gui_erp_waviewer.ERPwaviewer.bin = Bin_sel; ERPtooltype = erpgettoolversion('tooltype'); if ~strcmpi(ERPtooltype,'EStudio') && ~strcmpi(ERPtooltype,'ERPLAB') - ERPwaviewer_S.erp_binchan_op = 0; + gui_erp_waviewer.ERPwaviewer.erp_binchan_op = 0; end %%Auto or Custom - binchanOp = ERPwaviewer_S.binchan_op; - if binchanOp ==1 - ERPwaveview_binchan.auto.Value = 1; - ERPwaveview_binchan.custom.Value =0; - ERPwaveview_binchan.ElecRange.Enable = 'off'; - ERPwaveview_binchan.BinRange.Enable = 'off'; - else - ERPwaveview_binchan.auto.Value = 0; - ERPwaveview_binchan.custom.Value =1; - ERPwaveview_binchan.ElecRange.Enable = 'on'; - ERPwaveview_binchan.BinRange.Enable = 'on'; - end + ERPwaveview_binchan.ElecRange.Enable = 'on'; + ERPwaveview_binchan.BinRange.Enable = 'on'; + %%settings dependent on runing EStudio or ERPLAB or other way (e.g.,script). - if strcmpi(ERPtooltype,'EStudio') - ERPwaveview_binchan.auto.String = 'Same as EStudio'; - elseif strcmpi(ERPtooltype,'ERPLAB') - ERPwaveview_binchan.auto.String = ''; - ERPwaveview_binchan.BinRange.Enable = 'on'; - ERPwaveview_binchan.ElecRange.Enable = 'on'; - ERPwaveview_binchan.auto.Enable = 'off'; - ERPwaveview_binchan.custom.Enable = 'off'; - else - ERPwaveview_binchan.auto.String = ''; - ERPwaveview_binchan.auto.Enable = 'off'; - ERPwaveview_binchan.custom.Value =1; - ERPwaveview_binchan.custom.String = ''; - ERPwaveview_binchan.auto.Value = 0; - ERPwaveview_binchan.custom.Enable = 'off'; - ERPwaveview_binchan.ElecRange.Enable = 'on'; - ERPwaveview_binchan.BinRange.Enable = 'on'; - end + ERPwaveview_binchan.ElecRange.Enable = 'on'; + ERPwaveview_binchan.BinRange.Enable = 'on'; - assignin('base','ALLERPwaviewer',ERPwaviewer_S); %%save the parameters to memory file - MERPWaveViewer_chanbin{1} = ERPwaviewer_S.binchan_op; - MERPWaveViewer_chanbin{2} =ERPwaviewer_S.chan; - MERPWaveViewer_chanbin{3} =ERPwaviewer_S.bin; + gui_erp_waviewer.ERPwaviewer.binchan_op=0; + MERPWaveViewer_chanbin{1} = 0; + MERPWaveViewer_chanbin{2} =gui_erp_waviewer.ERPwaviewer.chan; + MERPWaveViewer_chanbin{3} =gui_erp_waviewer.ERPwaviewer.bin; estudioworkingmemory('MERPWaveViewer_chanbin',MERPWaveViewer_chanbin); viewer_ERPDAT.loadproper_count=3; end -%%modify the channels based on the changes of main EStudio - function ERP_chan_changed(~,~) - ALLERPStudio = observe_ERPDAT.ALLERP; - if isempty(ALLERPStudio) || (length(ALLERPStudio)==1&& strcmpi(ALLERPStudio(1).erpname,'No ERPset loaded')) || strcmpi(ALLERPStudio(length(ALLERPStudio)).erpname,'No ERPset loaded') - return; - end - try - ChanBinAutoValue = ERPwaveview_binchan.auto.Value; - catch - return; - end - - ChanArrayStudio = observe_ERPDAT.ERP_chan; - chanNumdef = length(ERPwaveview_binchan.ElecRange.String)-1; - - if ~isempty(ChanArrayStudio) && ChanBinAutoValue==1 - if min(ChanArrayStudio(:))<=0 || max(ChanArrayStudio(:))>chanNumdef - return; - end - - MessageViewer= char(strcat('Channels and Bins > Channel')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); - % viewer_ERPDAT.Process_messg =1; - - try - ALLERPwaviewer_apply = evalin('base','ALLERPwaviewer'); - catch - viewer_ERPDAT.Process_messg =3; - fprintf(2,'\nChannels and Bins -f_ERP_Binchan_waviewer_GUI() error: Cannot get parameters for whole panel.\n Please run My viewer again.\n\n'); - return; - end - try - if numel(ChanArrayStudio)==chanNumdef - ERPwaveview_binchan.ElecRange.Value =1; - else - ERPwaveview_binchan.ElecRange.Value =ChanArrayStudio+1; - end - catch - ERPwaveview_binchan.ElecRange.Value =1; - end - ALLERPwaviewer_apply.chan = ChanArrayStudio; - assignin('base','ALLERPwaviewer',ALLERPwaviewer_apply); - %%change the other panels based on the changed bins and channels - viewer_ERPDAT.Count_currentERP = viewer_ERPDAT.Count_currentERP+1; - - %%save the parameters to memory file - MERPWaveViewer_chanbin{1} = ALLERPwaviewer_apply.binchan_op; - MERPWaveViewer_chanbin{2} =ALLERPwaviewer_apply.chan; - MERPWaveViewer_chanbin{3} =ALLERPwaviewer_apply.bin; - estudioworkingmemory('MERPWaveViewer_chanbin',MERPWaveViewer_chanbin); - %%plot waves - f_redrawERP_viewer_test(); - end - end - -%%modify the bins based on the changes of main EStudio - function ERP_bin_changed(~,~) - ALLERPStudio = observe_ERPDAT.ALLERP; - if isempty(ALLERPStudio) || (length(ALLERPStudio)==1&& strcmpi(ALLERPStudio(1).erpname,'No ERPset loaded')) || strcmpi(ALLERPStudio(length(ALLERPStudio)).erpname,'No ERPset loaded') - return; - end - - try - ChanBinAutoValue = ERPwaveview_binchan.auto.Value; - catch - return; - end - BinArrayStudio = observe_ERPDAT.ERP_bin; - binNumdef = length(ERPwaveview_binchan.BinRange.String)-1; - if ~isempty(BinArrayStudio) && ChanBinAutoValue==1 - if min(BinArrayStudio(:))<=0 || max(BinArrayStudio(:))> binNumdef - return; - end - MessageViewer= char(strcat('Channels and Bins > Bin')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); - % viewer_ERPDAT.Process_messg =1; - - try - ALLERPwaviewer_apply = evalin('base','ALLERPwaviewer'); - catch - viewer_ERPDAT.Process_messg =3; - fprintf(2,'\nChannels and Bins -f_ERP_Binchan_waviewer_GUI() error: Cannot get parameters for whole panel.\n Please run My viewer again.\n\n'); - return; - end - try - if numel(BinArrayStudio)==binNumdef - ERPwaveview_binchan.BinRange.Value =1; - else - ERPwaveview_binchan.BinRange.Value =BinArrayStudio+1; - end - catch - ERPwaveview_binchan.BinRange.Value =1; - end - ALLERPwaviewer_apply.bin = BinArrayStudio; - assignin('base','ALLERPwaviewer',ALLERPwaviewer_apply); - - %%save the parameters to memory file - MERPWaveViewer_chanbin{1} = ALLERPwaviewer_apply.binchan_op; - MERPWaveViewer_chanbin{2} =ALLERPwaviewer_apply.chan; - MERPWaveViewer_chanbin{3} =ALLERPwaviewer_apply.bin; - estudioworkingmemory('MERPWaveViewer_chanbin',MERPWaveViewer_chanbin); - - %%change the other panels based on the changed bins and channels - viewer_ERPDAT.Count_currentERP = viewer_ERPDAT.Count_currentERP+1; - %%plot waves - f_redrawERP_viewer_test(); - end - end -%%change channels and bins based on the main EStudio - function Two_GUI_change(~,~) - if observe_ERPDAT.Two_GUI~=2 - return; - end - - ERPtooltype = erpgettoolversion('tooltype'); - if isempty(observe_ERPDAT.ALLERP) - try - % % cprintf('red',['\n ERP Wave viewer will be closed because ALLERP is empty.\n\n']); - close(gui_erp_waviewer.Window); - catch - end - assignin('base','ALLERPwaviewer',[]); - return; - end - - - ALLERPStudio = observe_ERPDAT.ALLERP; - if strcmpi(ERPtooltype,'EStudio') - if (length(ALLERPStudio)==1&& strcmpi(ALLERPStudio(1).erpname,'No ERPset loaded')) || strcmpi(ALLERPStudio(length(ALLERPStudio)).erpname,'No ERPset loaded') - try - % cprintf('red',['\n ERP Wave viewer will be closed because ALLERP is empty.\n\n']); - close(gui_erp_waviewer.Window); - catch - end - assignin('base','ALLERPwaviewer',[]); - return; - end - end - - try - ALLERPwaviewer_apply = evalin('base','ALLERPwaviewer'); - catch - viewer_ERPDAT.Process_messg =3; - fprintf(2,'\nChannels and Bins -f_ERP_Binchan_waviewer_GUI() error: Cannot get parameters for whole panel.\n Please run My viewer again.\n\n'); - return; - end - - try - ChanBinAutoValue = ERPwaveview_binchan.auto.Value; - catch - return; - end - MessageViewer= char(strcat('Channels and Bins')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); - - if strcmpi(ERPtooltype,'EStudio') && ChanBinAutoValue==1 - ALLERPwaviewer_apply.bin=observe_ERPDAT.ERP_bin; - ALLERPwaviewer_apply.chan=observe_ERPDAT.ERP_chan; - end - - BinArrayStudio = ALLERPwaviewer_apply.bin; - binNumdef = length(ERPwaveview_binchan.BinRange.String)-1; - if ~isempty(BinArrayStudio) && ChanBinAutoValue==1 - if min(BinArrayStudio(:))<=0 || max(BinArrayStudio(:))> binNumdef - return; - end - try - if numel(BinArrayStudio)==binNumdef - ERPwaveview_binchan.BinRange.Value =1; - else - ERPwaveview_binchan.BinRange.Value =BinArrayStudio+1; - end - catch - ERPwaveview_binchan.BinRange.Value =1; - end - ALLERPwaviewer_apply.bin = BinArrayStudio; - end - - ChanArrayStudio = ALLERPwaviewer_apply.chan; - chanNumdef = length(ERPwaveview_binchan.ElecRange.String)-1; - if ~isempty(ChanArrayStudio) && ChanBinAutoValue==1 - if min(ChanArrayStudio(:))<=0 || max(ChanArrayStudio(:))>chanNumdef - return; - end - try - if numel(ChanArrayStudio)==chanNumdef - ERPwaveview_binchan.ElecRange.Value =1; - else - ERPwaveview_binchan.ElecRange.Value =ChanArrayStudio+1; - end - ERPwaveview_binchan.ElecRange.Max = length( ERPwaveview_binchan.ElecRange.String)+2; - catch - ERPwaveview_binchan.ElecRange.Value =1; - end - ALLERPwaviewer_apply.chan = ChanArrayStudio; - end - ERPwaveview_binchan.ElecRange.Max = length(ERPwaveview_binchan.ElecRange.String)+2; - assignin('base','ALLERPwaviewer',ALLERPwaviewer_apply); - - %%save the parameters to memory file - MERPWaveViewer_chanbin{1} = ALLERPwaviewer_apply.binchan_op; - MERPWaveViewer_chanbin{2} =ALLERPwaviewer_apply.chan; - MERPWaveViewer_chanbin{3} =ALLERPwaviewer_apply.bin; - estudioworkingmemory('MERPWaveViewer_chanbin',MERPWaveViewer_chanbin); - - - %%change the other panels based on the changed bins and channels - viewer_ERPDAT.Count_currentERP = viewer_ERPDAT.Count_currentERP+1; - %%plot waves - f_redrawERP_viewer_test(); - observe_ERPDAT.Two_GUI = 0; - end - %%------------------------------------------------------------------------- %%Automatically saving the changed parameters for the current panel if the %%user change parameters for the other panels. @@ -1003,171 +542,47 @@ function count_twopanels_change(~,~) %%Reset this panel with the default parameters function Reset_Waviewer_panel_change(~,~) - if viewer_ERPDAT.Reset_Waviewer_panel==2 - ERPtooltype = erpgettoolversion('tooltype'); - try - ERPwaviewerIN = evalin('base','ALLERPwaviewer'); - ALLERPIN = ERPwaviewerIN.ALLERP; - catch - beep; - disp('f_ERP_Binchan_waviewer_GUI error: Restart ERPwave Viewer'); - return; - end + if viewer_ERPDAT.Reset_Waviewer_panel~=2 + return; + end + ERPwaveview_binchan.ElecRange.Enable = 'on'; + ERPwaveview_binchan.BinRange.Enable = 'on'; + Selected_erpset = evalin('base','CURRENTERP'); + ALLERP = evalin('base','ALLERP'); + if ~isempty(Selected_erpset) && ~isempty(ALLERP) && (Selected_erpset<= length(ALLERP)) && min(Selected_erpset)>0 + [chanStr,binStr,diff_mark] = f_geterpschanbin(ALLERP,Selected_erpset); + Chanlist_name = cell(length(chanStr)+1,1); + Chanlist_name(1) = {'All'}; + for Numofchan11 = 1:length(chanStr) + Chanlist_name(Numofchan11+1) = {char(strcat(num2str(Numofchan11),'.',32,char(chanStr(Numofchan11))))}; + end + ERPwaveview_binchan.ElecRange.String = Chanlist_name; + ERPwaveview_binchan.ElecRange.Value =1; - if strcmpi(ERPtooltype,'EStudio') - ERPwaveview_binchan.auto.Value = 1; - ERPwaveview_binchan.custom.Value =0; - ERPwaveview_binchan.ElecRange.Enable = 'off'; - ERPwaveview_binchan.BinRange.Enable = 'off'; - Selected_erpset= estudioworkingmemory('selectederpstudio'); - Geterpbinchan = estudioworkingmemory('geterpbinchan'); - CurrentERPIndex = Geterpbinchan.Select_index; - - if max(Selected_erpset(:))> length(ALLERPIN) - Selected_erpset =1; - CurrentERPIndex =1; - end - BinArray = Geterpbinchan.bins{Geterpbinchan.Select_index}; - chanArray = Geterpbinchan.elecs_shown{Geterpbinchan.Select_index}; - chan_bin = Geterpbinchan.bins_chans(CurrentERPIndex); - if chan_bin ==1 - ERPwaviewerIN.plot_org.Grid =2; - ERPwaviewerIN.plot_org.Overlay=1; - ERPwaviewerIN.plot_org.Pages=3; - elseif chan_bin==0 - ERPwaviewerIN.plot_org.Grid =1; - ERPwaviewerIN.plot_org.Overlay=2; - ERPwaviewerIN.plot_org.Pages=3; - end - - % Channel information - chanStr = [1:(numel(ERPwaveview_binchan.ElecRange.String)-1)]; - Chanlist = chanStr; - Chan_sel = chanArray; - if ~isempty(Chan_sel) - if max(Chan_sel)> numel(Chanlist) - Chan_sel= 1:length(Chanlist); - end - else - Chan_sel= 1:length(Chanlist); - end - try - if length(Chan_sel) == numel(chanStr) - ERPwaveview_binchan.ElecRange.Value =1; - else - ERPwaveview_binchan.ElecRange.Value =Chan_sel+1; - end - catch - ERPwaveview_binchan.ElecRange.Value =1; - end - - %%Bin information - binStr = ERPwaveview_binchan.BinRange.String; - BinNum = length(binStr)-1; - Bin_sel = BinArray; - if ~isempty(Bin_sel) - if max(Bin_sel)> BinNum - Bin_sel= 1:BinNum; - end - else - Bin_sel= 1:BinNum; - end - - if BinNum== numel(Bin_sel) - ERPwaveview_binchan.BinRange.Value =1; - else - ERPwaveview_binchan.BinRange.Value = Bin_sel+1; - end - - ERPwaviewerIN.bin = Bin_sel; - ERPwaviewerIN.chan = Chan_sel; - ERPwaviewerIN.binchan_op = 1; - elseif strcmpi(ERPtooltype,'ERPLAB') - ERPwaveview_binchan.auto.Value = 0; - ERPwaveview_binchan.custom.Value =1; - ERPwaveview_binchan.auto.Enable = 'off'; - ERPwaveview_binchan.custom.Enable = 'off'; - ERPwaveview_binchan.ElecRange.Enable = 'on'; - ERPwaveview_binchan.BinRange.Enable = 'on'; - Selected_erpset = evalin('base','CURRENTERP'); - ALLERP = evalin('base','ALLERP'); - if ~isempty(Selected_erpset) && ~isempty(ALLERP) && (Selected_erpset<= length(ALLERP)) && min(Selected_erpset)>0 - [chanStr,binStr,diff_mark] = f_geterpschanbin(ALLERP,Selected_erpset); - Chanlist_name = cell(length(chanStr)+1,1); - Chanlist_name(1) = {'All'}; - for Numofchan11 = 1:length(chanStr) - Chanlist_name(Numofchan11+1) = {char(strcat(num2str(Numofchan11),'.',32,char(chanStr(Numofchan11))))}; - end - ERPwaveview_binchan.ElecRange.String = Chanlist_name; - ERPwaveview_binchan.ElecRange.Value =1; - - brange = cell(length(binStr)+1,1); - brange(1) = {'All'}; - for Numofbin11 = 1:length(binStr) - brange(Numofbin11+1) = {char(strcat(num2str(Numofbin11),'.',32,char(binStr(Numofbin11))))}; - end - ERPwaveview_binchan.BinRange.String = brange; - ERPwaveview_binchan.BinRange.Value = 1; - end - ERPwaviewerIN.bin = [1:length(ERPwaveview_binchan.BinRange.String)-1]; - ERPwaviewerIN.chan = [1:length(ERPwaveview_binchan.ElecRange.String)-1]; - ERPwaviewerIN.binchan_op = 0; + brange = cell(length(binStr)+1,1); + brange(1) = {'All'}; + for Numofbin11 = 1:length(binStr) + brange(Numofbin11+1) = {char(strcat(num2str(Numofbin11),'.',32,char(binStr(Numofbin11))))}; end - assignin('base','ALLERPwaviewer',ERPwaviewerIN); - - %%save the parameters to memory file - MERPWaveViewer_chanbin{1} = ERPwaviewerIN.binchan_op; - MERPWaveViewer_chanbin{2} =ERPwaviewerIN.chan; - MERPWaveViewer_chanbin{3} =ERPwaviewerIN.bin; - estudioworkingmemory('MERPWaveViewer_chanbin',MERPWaveViewer_chanbin); - - ERPwaveview_binchan.apply.BackgroundColor = [1 1 1]; - Chanbin_waveviewer_box.TitleColor= [0.5 0.5 0.9]; - ERPwaveview_binchan.apply.ForegroundColor = [0 0 0]; - viewer_ERPDAT.Reset_Waviewer_panel=3; + ERPwaveview_binchan.BinRange.String = brange; + ERPwaveview_binchan.BinRange.Value = 1; end + gui_erp_waviewer.ERPwaviewer.bin = [1:length(ERPwaveview_binchan.BinRange.String)-1]; + gui_erp_waviewer.ERPwaviewer.chan = [1:length(ERPwaveview_binchan.ElecRange.String)-1]; + gui_erp_waviewer.ERPwaviewer.binchan_op = 0; + + %%save the parameters to memory file + MERPWaveViewer_chanbin{1} = 0; + MERPWaveViewer_chanbin{2} =gui_erp_waviewer.ERPwaviewer.chan; + MERPWaveViewer_chanbin{3} =gui_erp_waviewer.ERPwaviewer.bin; + estudioworkingmemory('MERPWaveViewer_chanbin',MERPWaveViewer_chanbin); + + ERPwaveview_binchan.apply.BackgroundColor = [1 1 1]; + Chanbin_waveviewer_box.TitleColor= [0.5 0.5 0.9]; + ERPwaveview_binchan.apply.ForegroundColor = [0 0 0]; + viewer_ERPDAT.Reset_Waviewer_panel=3; end%%reset end -%%Update the change of label indeces - function ERPset_Chan_bin_label_change(~,~) - if viewer_ERPDAT.ERPset_Chan_bin_label~=1 - return; - end - try - ERPwaviewerIN = evalin('base','ALLERPwaviewer'); - catch - beep; - disp('f_ERP_Binchan_waviewer_GUI error: Restart ERPwave Viewer'); - return; - end - - if ERPwaveview_binchan.auto.Value ==0 - BinArray = ERPwaviewerIN.bin; - ChanArray = ERPwaviewerIN.chan; - ChaNum= length(ERPwaveview_binchan.ElecRange.String)-1; - if max(ChanArray(:)) <=ChaNum - if ChaNum== numel(ChanArray) - ERPwaveview_binchan.ElecRange.Value=1; - else - ERPwaveview_binchan.ElecRange.Value= ChanArray+1; - end - end - BiNum = length(ERPwaveview_binchan.BinRange.String)-1; - if max(BinArray(:)) <=BiNum - if numel(BinArray)==BiNum - ERPwaveview_binchan.BinRange.Value=1; - else - ERPwaveview_binchan.BinRange.Value=BinArray+1; - end - end - - %%save the parameters to memory file - MERPWaveViewer_chanbin{1} = ERPwaviewerIN.binchan_op; - MERPWaveViewer_chanbin{2} =ERPwaviewerIN.chan; - MERPWaveViewer_chanbin{3} =ERPwaviewerIN.bin; - estudioworkingmemory('MERPWaveViewer_chanbin',MERPWaveViewer_chanbin); - end - end %%Execute the panel when press "Return" or "Enter" diff --git a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ERP_labelset_waveviewer_GUI.m b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ERP_labelset_waveviewer_GUI.m index 580d9db3..a6b564ad 100755 --- a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ERP_labelset_waveviewer_GUI.m +++ b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ERP_labelset_waveviewer_GUI.m @@ -11,10 +11,11 @@ function varargout = f_ERP_labelset_waveviewer_GUI(varargin) global viewer_ERPDAT; +global gui_erp_waviewer; addlistener(viewer_ERPDAT,'loadproper_change',@loadproper_change); -% addlistener(viewer_ERPDAT,'Process_messg_change',@Process_messg_change); addlistener(viewer_ERPDAT,'count_twopanels_change',@count_twopanels_change); addlistener(viewer_ERPDAT,'Reset_Waviewer_panel_change',@Reset_Waviewer_panel_change); +addlistener(viewer_ERPDAT,'v_currentERP_change',@v_currentERP_change); gui_labelset_waveviewer = struct(); @@ -49,13 +50,6 @@ function drawui_plot_property(FonsizeDefault) [version reldate,ColorB_def,ColorF_def,errorColorF_def,ColorBviewer_def] = geterplabstudiodef; - try - ERPwaviewer = evalin('base','ALLERPwaviewer'); - catch - beep; - disp('f_ERP_labelset_waveviewer_GUI() error: Please run the ERP wave viewer again.'); - return; - end %%--------------------channel and bin setting---------------------- gui_labelset_waveviewer.DataSelBox = uiextras.VBox('Parent', box_erplabelset_viewer_property,'BackgroundColor',ColorBviewer_def); @@ -112,9 +106,9 @@ function drawui_plot_property(FonsizeDefault) gui_labelset_waveviewer.nolabel.Value = ~gui_labelset_waveviewer.customlabel.Value; customdefEnable = 'on'; end - ERPwaviewer.chanbinsetlabel.location.auto = gui_labelset_waveviewer.labelauto.Value; - ERPwaviewer.chanbinsetlabel.location.no = gui_labelset_waveviewer.nolabel.Value; - ERPwaviewer.chanbinsetlabel.location.custom =gui_labelset_waveviewer.customlabel.Value; + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.auto = gui_labelset_waveviewer.labelauto.Value; + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.no = gui_labelset_waveviewer.nolabel.Value; + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.custom =gui_labelset_waveviewer.customlabel.Value; if locationAuto ==1 xperDef = 50; yperDef = 100; @@ -150,9 +144,9 @@ function drawui_plot_property(FonsizeDefault) 'callback',@label_center,'FontSize',FonsizeDefault,'BackgroundColor',ColorBviewer_def,'Enable',customdefEnable,'Value',CenDef); % gui_labelset_waveviewer.center.KeyPressFcn = @labels_presskey; set(gui_labelset_waveviewer.labelloc_title,'Sizes',[30 45 30 45 80]); - ERPwaviewer.chanbinsetlabel.location.xperc = str2num(char(gui_labelset_waveviewer.xperc_edit.String)); - ERPwaviewer.chanbinsetlabel.location.yperc = str2num(char(gui_labelset_waveviewer.yperc_edit.String)); - ERPwaviewer.chanbinsetlabel.location.center = gui_labelset_waveviewer.center.Value; + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.xperc = str2num(char(gui_labelset_waveviewer.xperc_edit.String)); + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.yperc = str2num(char(gui_labelset_waveviewer.yperc_edit.String)); + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.center = gui_labelset_waveviewer.center.Value; % %%--------------------font and font size--------------------------- @@ -192,8 +186,8 @@ function drawui_plot_property(FonsizeDefault) 'callback',@label_fontsize,'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1],'Value',LabelfontsizeValue,'Enable',customdefEnable); % gui_labelset_waveviewer.font_custom_size.KeyPressFcn = @labels_presskey; set(gui_labelset_waveviewer.font_custom_title,'Sizes',[30 110 30 70]); - ERPwaviewer.chanbinsetlabel.font = gui_labelset_waveviewer.font_custom_type.Value; - ERPwaviewer.chanbinsetlabel.fontsize = labelfontsizeinum(gui_labelset_waveviewer.font_custom_size.Value); + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.font = gui_labelset_waveviewer.font_custom_type.Value; + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.fontsize = labelfontsizeinum(gui_labelset_waveviewer.font_custom_size.Value); %%--------------Label text color----------- try @@ -212,21 +206,22 @@ function drawui_plot_property(FonsizeDefault) uiextras.Empty('Parent',gui_labelset_waveviewer.labelcolor_title); uiextras.Empty('Parent',gui_labelset_waveviewer.labelcolor_title); set(gui_labelset_waveviewer.labelcolor_title,'Sizes',[40 100 30 70]); - ERPwaviewer.chanbinsetlabel.textcolor = gui_labelset_waveviewer.labelcolor.Value; + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.textcolor = gui_labelset_waveviewer.labelcolor.Value; %%-----------------------help and apply---------------------------- gui_labelset_waveviewer.help_apply_title = uiextras.HBox('Parent', gui_labelset_waveviewer.DataSelBox,'BackgroundColor',ColorBviewer_def); uiextras.Empty('Parent',gui_labelset_waveviewer.help_apply_title ); - uicontrol('Style','pushbutton','Parent', gui_labelset_waveviewer.help_apply_title ,'String','Cancel',... - 'callback',@label_help,'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1]); %,'FontWeight','bold','HorizontalAlignment','left' + gui_labelset_waveviewer.cancel = uicontrol('Style','pushbutton','Parent', gui_labelset_waveviewer.help_apply_title ,'String','Cancel',... + 'callback',@label_cancel,'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1]); %,'FontWeight','bold','HorizontalAlignment','left' uiextras.Empty('Parent',gui_labelset_waveviewer.help_apply_title ); gui_labelset_waveviewer.Apply= uicontrol('Style','pushbutton','Parent',gui_labelset_waveviewer.help_apply_title ,'String','Apply',... 'callback',@label_apply,'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1]); %,'HorizontalAlignment','left' uiextras.Empty('Parent',gui_labelset_waveviewer.help_apply_title ); set(gui_labelset_waveviewer.help_apply_title ,'Sizes',[40 70 20 70 20]); set(gui_labelset_waveviewer.DataSelBox ,'Sizes',[20 25 25 20 25 25 25]); - assignin('base','ALLERPwaviewer',ERPwaviewer); estudioworkingmemory('MERPWaveViewer_label',MERPWaveViewer_label); + + estudioworkingmemory('MyViewer_labels',0); end %%***********************************************************************%% @@ -242,6 +237,8 @@ function labelauto(~,~) gui_labelset_waveviewer.Apply.BackgroundColor = [0.4940 0.1840 0.5560]; gui_labelset_waveviewer.Apply.ForegroundColor = [1 1 1]; box_erplabelset_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + gui_labelset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_labelset_waveviewer.cancel.ForegroundColor = [1 1 1]; gui_labelset_waveviewer.labelauto.Value = 1; gui_labelset_waveviewer.nolabel.Value = 0; @@ -259,20 +256,12 @@ function labelauto(~,~) gui_labelset_waveviewer.labelcolor.Enable = Enable; gui_labelset_waveviewer.label_customtable.Enable = Enable; gui_labelset_waveviewer.labelcolor.Value = 1; - %%----------------Update the label----------------- - try - ALLERPwaviewer = evalin('base','ALLERPwaviewer'); - ERPwaviewer = ALLERPwaviewer; - catch - beep; - disp('f_ERP_labelset_waveviewer_GUI() error: Please run the ERP wave viewer again.'); - return; - end - binArray = ERPwaviewer.bin; - chanArray = ERPwaviewer.chan; - ERPsetArray = ERPwaviewer.SelectERPIdx; - ALLERPIN = ERPwaviewer.ALLERP; + %%----------------Update the label----------------- + binArray = gui_erp_waviewer.ERPwaviewer.bin; + chanArray = gui_erp_waviewer.ERPwaviewer.chan; + ERPsetArray = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + ALLERPIN = gui_erp_waviewer.ERPwaviewer.ALLERP; if max(ERPsetArray) >length(ALLERPIN) ERPsetArray =length(ALLERPIN); end @@ -281,17 +270,17 @@ function labelauto(~,~) LabelName{ii,1} = ''; LabelNamenum(ii,1) =ii; end - if ERPwaviewer.plot_org.Grid ==1 %% if the selected Channel is "Grid" + if gui_erp_waviewer.ERPwaviewer.plot_org.Grid ==1 %% if the selected Channel is "Grid" plotArray = chanArray; for Numofplot = 1:numel(plotArray) LabelName{Numofplot,1} = chanStr{plotArray(Numofplot)}; end - elseif ERPwaviewer.plot_org.Grid == 2 %% if the selected Bin is "Grid" + elseif gui_erp_waviewer.ERPwaviewer.plot_org.Grid == 2 %% if the selected Bin is "Grid" plotArray = binArray; for Numofplot = 1:numel(plotArray) LabelName{Numofplot,1} = chanStr{plotArray(Numofplot)}; end - elseif ERPwaviewer.plot_org.Grid == 3%% if the selected ERPset is "Grid" + elseif gui_erp_waviewer.ERPwaviewer.plot_org.Grid == 3%% if the selected ERPset is "Grid" plotArray = ERPsetArray; for Numoferpset = 1:numel(plotArray) LabelName{Numoferpset,1} = {char(ALLERPIN(plotArray(Numoferpset)).erpname)}; @@ -302,7 +291,6 @@ function labelauto(~,~) LabelName{Numofplot,1} = chanStr{plotArray(Numofplot)}; end end - labels_str = table(LabelNamenum,LabelName); labels_str = table2cell(labels_str); gui_labelset_waveviewer.label_customtable.Data = labels_str; @@ -318,18 +306,18 @@ function nolabel(~,~) gui_labelset_waveviewer.Apply.BackgroundColor = [0.4940 0.1840 0.5560]; gui_labelset_waveviewer.Apply.ForegroundColor = [1 1 1]; box_erplabelset_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; - + gui_labelset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_labelset_waveviewer.cancel.ForegroundColor = [1 1 1]; gui_labelset_waveviewer.labelauto.Value = 0; gui_labelset_waveviewer.nolabel.Value = 1; gui_labelset_waveviewer.customlabel.Value = 0; - Enable = 'off'; - gui_labelset_waveviewer.xperc_edit.Enable =Enable ; - gui_labelset_waveviewer.yperc_edit.Enable = Enable; - gui_labelset_waveviewer.center.Enable = Enable; - gui_labelset_waveviewer.font_custom_type.Enable = Enable; - gui_labelset_waveviewer.font_custom_size.Enable = Enable; - gui_labelset_waveviewer.labelcolor.Enable = Enable; - gui_labelset_waveviewer.label_customtable.Enable = Enable; + gui_labelset_waveviewer.xperc_edit.Enable ='off'; + gui_labelset_waveviewer.yperc_edit.Enable = 'off'; + gui_labelset_waveviewer.center.Enable = 'off'; + gui_labelset_waveviewer.font_custom_type.Enable = 'off'; + gui_labelset_waveviewer.font_custom_size.Enable = 'off'; + gui_labelset_waveviewer.labelcolor.Enable = 'off'; + gui_labelset_waveviewer.label_customtable.Enable = 'off'; end %%-------------------------Setting for Save as----------------------------- @@ -342,18 +330,19 @@ function customlabel(~,~) gui_labelset_waveviewer.Apply.BackgroundColor = [0.4940 0.1840 0.5560]; gui_labelset_waveviewer.Apply.ForegroundColor = [1 1 1]; box_erplabelset_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; - + gui_labelset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_labelset_waveviewer.cancel.ForegroundColor = [1 1 1]; gui_labelset_waveviewer.labelauto.Value = 0; gui_labelset_waveviewer.nolabel.Value =0; gui_labelset_waveviewer.customlabel.Value = 1; - Enable = 'on'; - gui_labelset_waveviewer.xperc_edit.Enable =Enable ; - gui_labelset_waveviewer.yperc_edit.Enable = Enable; - gui_labelset_waveviewer.center.Enable = Enable; - gui_labelset_waveviewer.font_custom_type.Enable = Enable; - gui_labelset_waveviewer.font_custom_size.Enable = Enable; - gui_labelset_waveviewer.labelcolor.Enable = Enable; - gui_labelset_waveviewer.label_customtable.Enable = Enable; + + gui_labelset_waveviewer.xperc_edit.Enable ='on'; + gui_labelset_waveviewer.yperc_edit.Enable = 'on'; + gui_labelset_waveviewer.center.Enable = 'on'; + gui_labelset_waveviewer.font_custom_type.Enable = 'on'; + gui_labelset_waveviewer.font_custom_size.Enable = 'on'; + gui_labelset_waveviewer.labelcolor.Enable = 'on'; + gui_labelset_waveviewer.label_customtable.Enable = 'on'; end %%-------------------X percentage------------------------------------------ @@ -366,10 +355,12 @@ function label_xperc(Source,~) gui_labelset_waveviewer.Apply.BackgroundColor = [0.4940 0.1840 0.5560]; gui_labelset_waveviewer.Apply.ForegroundColor = [1 1 1]; box_erplabelset_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + gui_labelset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_labelset_waveviewer.cancel.ForegroundColor = [1 1 1]; if isempty(str2num(Source.String)) || numel(str2num(Source.String))~=1 viewer_ERPDAT.Process_messg =4; messgStr = strcat('Chan/Bin/ERPset Label Properties > X% should a number and we therefore used 50'); - erpworkingmemory('ERPViewer_proces_messg',messgStr); + estudioworkingmemory('ERPViewer_proces_messg',messgStr); gui_labelset_waveviewer.xperc_edit.String ='50' ; end end @@ -384,10 +375,12 @@ function label_yperc(Source,~) gui_labelset_waveviewer.Apply.BackgroundColor = [0.4940 0.1840 0.5560]; gui_labelset_waveviewer.Apply.ForegroundColor = [1 1 1]; box_erplabelset_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + gui_labelset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_labelset_waveviewer.cancel.ForegroundColor = [1 1 1]; if isempty(str2num(Source.String)) || numel(str2num(Source.String))~=1 viewer_ERPDAT.Process_messg =4; messgStr = strcat('Chan/Bin/ERPset Label Properties > Y% should a number and we therefore used 100'); - erpworkingmemory('ERPViewer_proces_messg',messgStr); + estudioworkingmemory('ERPViewer_proces_messg',messgStr); gui_labelset_waveviewer.yperc_edit.String = '100'; end end @@ -402,6 +395,8 @@ function label_center(Source,~) gui_labelset_waveviewer.Apply.BackgroundColor = [0.4940 0.1840 0.5560]; gui_labelset_waveviewer.Apply.ForegroundColor = [1 1 1]; box_erplabelset_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + gui_labelset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_labelset_waveviewer.cancel.ForegroundColor = [1 1 1]; end %%--------------------------Font of label text----------------------------- @@ -414,6 +409,8 @@ function label_font(Source,~) gui_labelset_waveviewer.Apply.BackgroundColor = [0.4940 0.1840 0.5560]; gui_labelset_waveviewer.Apply.ForegroundColor = [1 1 1]; box_erplabelset_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + gui_labelset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_labelset_waveviewer.cancel.ForegroundColor = [1 1 1]; end %%------------------------Fontsize of label text--------------------------- @@ -426,6 +423,8 @@ function label_fontsize(Source,~) gui_labelset_waveviewer.Apply.BackgroundColor = [0.4940 0.1840 0.5560]; gui_labelset_waveviewer.Apply.ForegroundColor = [1 1 1]; box_erplabelset_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + gui_labelset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_labelset_waveviewer.cancel.ForegroundColor = [1 1 1]; end %%-----------------------color of label text------------------------------- @@ -438,57 +437,51 @@ function label_color(Source,~) gui_labelset_waveviewer.Apply.BackgroundColor = [0.4940 0.1840 0.5560]; gui_labelset_waveviewer.Apply.ForegroundColor = [1 1 1]; box_erplabelset_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + gui_labelset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_labelset_waveviewer.cancel.ForegroundColor = [1 1 1]; end %%--------------------------Help------------------------------------------- - function label_help(~,~) + function label_cancel(~,~) [messgStr,viewerpanelIndex] = f_check_erpviewerpanelchanges(); if ~isempty(messgStr) && viewerpanelIndex~=5 viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end MessageViewer= char(strcat('Chan/Bin/ERPset Labels > Cancel')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =1; changeFlag = estudioworkingmemory('MyViewer_labels'); if changeFlag~=1 MessageViewer= char(strcat('Chan/Bin/ERPset Labels > Cancel')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =2; return; end - try - ERPwaviewer_apply = evalin('base','ALLERPwaviewer'); - catch - viewer_ERPDAT.Process_messg =3; - fprintf(2,'\n Chan/Bin/ERPset Labels > Apply-f_ERP_labelset_waveviewer_GUI() error: Cannot get parameters for whole panel.\n Please run My viewer again.\n\n'); - return; - end - - if ERPwaviewer_apply.chanbinsetlabel.location.auto==1 + if gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.auto==1 Enable = 'off'; gui_labelset_waveviewer.labelauto.Value = 1; gui_labelset_waveviewer.nolabel.Value = 0; gui_labelset_waveviewer.customlabel.Value = 0; - elseif ERPwaviewer_apply.chanbinsetlabel.location.no==1 + elseif gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.no==1 Enable = 'off'; gui_labelset_waveviewer.labelauto.Value = 0; gui_labelset_waveviewer.nolabel.Value = 1; gui_labelset_waveviewer.customlabel.Value = 0; - elseif ERPwaviewer_apply.chanbinsetlabel.location.custom==1 + elseif gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.custom==1 Enable = 'on'; gui_labelset_waveviewer.labelauto.Value = 0; gui_labelset_waveviewer.nolabel.Value = 0; gui_labelset_waveviewer.customlabel.Value = 1; end gui_labelset_waveviewer.xperc_edit.Enable = Enable; - gui_labelset_waveviewer.xperc_edit.String = num2str( ERPwaviewer_apply.chanbinsetlabel.location.xperc); + gui_labelset_waveviewer.xperc_edit.String = num2str( gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.xperc); gui_labelset_waveviewer.yperc_edit.Enable = Enable; - gui_labelset_waveviewer.yperc_edit.String = num2str( ERPwaviewer_apply.chanbinsetlabel.location.yperc); + gui_labelset_waveviewer.yperc_edit.String = num2str( gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.yperc); gui_labelset_waveviewer.font_custom_type.Enable = Enable; - gui_labelset_waveviewer.font_custom_type.Value = ERPwaviewer_apply.chanbinsetlabel.font; + gui_labelset_waveviewer.font_custom_type.Value = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.font; gui_labelset_waveviewer.font_custom_size.Enable = Enable; - FontSize = ERPwaviewer_apply.chanbinsetlabel.fontsize; + FontSize = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.fontsize; fontsizeStr = {'4','6','8','10','12','14','16','18','20','24','28','32','36',... '40','50','60','70','80','90','100'}; labelfontsizeinum = str2num(char(fontsizeStr)); @@ -498,16 +491,18 @@ function label_help(~,~) end gui_labelset_waveviewer.font_custom_size.Value = X_label; gui_labelset_waveviewer.labelcolor.Enable = Enable; - gui_labelset_waveviewer.labelcolor.Value = ERPwaviewer_apply.chanbinsetlabel.textcolor; + gui_labelset_waveviewer.labelcolor.Value = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.textcolor; gui_labelset_waveviewer.center.Enable = Enable; - gui_labelset_waveviewer.center.Value = ERPwaviewer_apply.chanbinsetlabel.location.center; + gui_labelset_waveviewer.center.Value = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.center; estudioworkingmemory('MyViewer_labels',0); gui_labelset_waveviewer.Apply.BackgroundColor = [1 1 1]; gui_labelset_waveviewer.Apply.ForegroundColor = [0 0 0]; box_erplabelset_viewer_property.TitleColor= [0.5 0.5 0.9]; + gui_labelset_waveviewer.cancel.BackgroundColor = [1 1 1]; + gui_labelset_waveviewer.cancel.ForegroundColor = [0 0 0]; MessageViewer= char(strcat('Chan/Bin/ERPset Labels > Cancel')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =2; end @@ -522,53 +517,46 @@ function label_apply(~,~) gui_labelset_waveviewer.Apply.BackgroundColor = [1 1 1]; gui_labelset_waveviewer.Apply.ForegroundColor = [0 0 0]; box_erplabelset_viewer_property.TitleColor= [0.5 0.5 0.9]; - + gui_labelset_waveviewer.cancel.BackgroundColor = [1 1 1]; + gui_labelset_waveviewer.cancel.ForegroundColor = [0 0 0]; MessageViewer= char(strcat('Chan/Bin/ERPset Labels > Apply')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =1; - try - ERPwaviewer_apply = evalin('base','ALLERPwaviewer'); - catch - viewer_ERPDAT.Process_messg =3; - fprintf(2,'\n Chan/Bin/ERPset Labels > Apply-f_ERP_labelset_waveviewer_GUI() error: Cannot get parameters for whole panel.\n Please run My viewer again.\n\n'); - return; - end - ERPwaviewer_apply.chanbinsetlabel.location.auto = gui_labelset_waveviewer.labelauto.Value; - ERPwaviewer_apply.chanbinsetlabel.location.no = gui_labelset_waveviewer.nolabel.Value; - ERPwaviewer_apply.chanbinsetlabel.location.custom =gui_labelset_waveviewer.customlabel.Value; - ERPwaviewer_apply.chanbinsetlabel.location.xperc = str2num(char(gui_labelset_waveviewer.xperc_edit.String)); - ERPwaviewer_apply.chanbinsetlabel.location.yperc = str2num(char(gui_labelset_waveviewer.yperc_edit.String)); - MERPWaveViewer_label{1} = ERPwaviewer_apply.chanbinsetlabel.location.auto; - MERPWaveViewer_label{2} = ERPwaviewer_apply.chanbinsetlabel.location.no; - MERPWaveViewer_label{3} =ERPwaviewer_apply.chanbinsetlabel.location.custom; - MERPWaveViewer_label{4} =ERPwaviewer_apply.chanbinsetlabel.location.xperc; - MERPWaveViewer_label{5} =ERPwaviewer_apply.chanbinsetlabel.location.yperc; - if ( ERPwaviewer_apply.chanbinsetlabel.location.no==1 || ERPwaviewer_apply.chanbinsetlabel.location.custom ==1) && (isempty(ERPwaviewer_apply.chanbinsetlabel.location.xperc) || isempty(ERPwaviewer_apply.chanbinsetlabel.location.yperc)) - ERPwaviewer_apply.chanbinsetlabel.location.auto = 1; - ERPwaviewer_apply.chanbinsetlabel.location.no = 0; - ERPwaviewer_apply.chanbinsetlabel.location.custom =0; + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.auto = gui_labelset_waveviewer.labelauto.Value; + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.no = gui_labelset_waveviewer.nolabel.Value; + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.custom =gui_labelset_waveviewer.customlabel.Value; + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.xperc = str2num(char(gui_labelset_waveviewer.xperc_edit.String)); + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.yperc = str2num(char(gui_labelset_waveviewer.yperc_edit.String)); + MERPWaveViewer_label{1} = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.auto; + MERPWaveViewer_label{2} = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.no; + MERPWaveViewer_label{3} =gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.custom; + MERPWaveViewer_label{4} =gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.xperc; + MERPWaveViewer_label{5} =gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.yperc; + + if ( gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.no==1 || gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.custom ==1) && (isempty(gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.xperc) || isempty(gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.yperc)) + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.auto = 1; + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.no = 0; + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.custom =0; end - ERPwaviewer_apply.chanbinsetlabel.location.center = gui_labelset_waveviewer.center.Value; - MERPWaveViewer_label{6} = ERPwaviewer_apply.chanbinsetlabel.location.center; + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.center = gui_labelset_waveviewer.center.Value; + MERPWaveViewer_label{6} = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.center; fontsize = {'4','6','8','10','12','14','16','18','20','24','28','32','36',... '40','50','60','70','80','90','100'}; labelfontsizeinum = str2num(char(fontsize)); - ERPwaviewer_apply.chanbinsetlabel.font = gui_labelset_waveviewer.font_custom_type.Value; - MERPWaveViewer_label{7} = ERPwaviewer_apply.chanbinsetlabel.font; + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.font = gui_labelset_waveviewer.font_custom_type.Value; + MERPWaveViewer_label{7} = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.font; try - ERPwaviewer_apply.chanbinsetlabel.fontsize = labelfontsizeinum(gui_labelset_waveviewer.font_custom_size.Value); + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.fontsize = labelfontsizeinum(gui_labelset_waveviewer.font_custom_size.Value); catch - ERPwaviewer_apply.chanbinsetlabel.fontsize = 10; + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.fontsize = 10; end - ERPwaviewer_apply.chanbinsetlabel.textcolor = gui_labelset_waveviewer.labelcolor.Value; + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.textcolor = gui_labelset_waveviewer.labelcolor.Value; MERPWaveViewer_label{8} = gui_labelset_waveviewer.font_custom_size.Value; - MERPWaveViewer_label{9} = ERPwaviewer_apply.chanbinsetlabel.textcolor; + MERPWaveViewer_label{9} = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.textcolor; - ALLERPwaviewer=ERPwaviewer_apply; - assignin('base','ALLERPwaviewer',ALLERPwaviewer); - f_redrawERP_viewer_test(); + viewer_ERPDAT.Count_currentERP = 1; viewer_ERPDAT.Process_messg =2; estudioworkingmemory('MERPWaveViewer_label',MERPWaveViewer_label); end @@ -579,16 +567,10 @@ function loadproper_change(~,~) if viewer_ERPDAT.loadproper_count ~=5 return; end - try - ERPwaviewer_apply = evalin('base','ALLERPwaviewer'); - catch - beep; - disp('f_ERP_labelset_waveviewer_GUI() > Apply error: Please run the ERP wave viewer again.'); - return; - end - AutoValue = ERPwaviewer_apply.chanbinsetlabel.location.auto; - NoValue = ERPwaviewer_apply.chanbinsetlabel.location.no; - CustomValue = ERPwaviewer_apply.chanbinsetlabel.location.custom; + + AutoValue = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.auto; + NoValue = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.no; + CustomValue = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.custom; if AutoValue ==1 && NoValue==0 && CustomValue==0 gui_labelset_waveviewer.labelauto.Value = 1; gui_labelset_waveviewer.nolabel.Value = 0; @@ -630,39 +612,39 @@ function loadproper_change(~,~) gui_labelset_waveviewer.labelcolor.Enable = Enable; gui_labelset_waveviewer.label_customtable.Enable = Enable; end - Xperc = ERPwaviewer_apply.chanbinsetlabel.location.xperc; - Yperc = ERPwaviewer_apply.chanbinsetlabel.location.yperc; - Center = ERPwaviewer_apply.chanbinsetlabel.location.center; + Xperc = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.xperc; + Yperc = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.yperc; + Centerflag = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.center; gui_labelset_waveviewer.xperc_edit.String = num2str(Xperc); gui_labelset_waveviewer.yperc_edit.String = num2str(Yperc); - if Center ==1 + if Centerflag ==1 gui_labelset_waveviewer.center.Value = 1; else gui_labelset_waveviewer.center.Value = 0; end - Labelfont = ERPwaviewer_apply.chanbinsetlabel.font; + Labelfont = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.font; gui_labelset_waveviewer.font_custom_type.Value = Labelfont; - Labelfontsize = ERPwaviewer_apply.chanbinsetlabel.fontsize; + Labelfontsize = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.fontsize; fontsize = {'4','6','8','10','12','14','16','18','20','24','28','32','36',... '40','50','60','70','80','90','100'}; fontsize = str2num(char(fontsize)); [xsize,y] = find(fontsize ==Labelfontsize); gui_labelset_waveviewer.font_custom_size.Value = xsize; - textColor = ERPwaviewer_apply.chanbinsetlabel.textcolor; + textColor = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.textcolor; gui_labelset_waveviewer.labelcolor.Value = textColor; - viewer_ERPDAT.loadproper_count =6; %%save the parameters to memory file - MERPWaveViewer_label{1} = ERPwaviewer_apply.chanbinsetlabel.location.auto; - MERPWaveViewer_label{2} = ERPwaviewer_apply.chanbinsetlabel.location.no; - MERPWaveViewer_label{3} =ERPwaviewer_apply.chanbinsetlabel.location.custom; - MERPWaveViewer_label{4} =ERPwaviewer_apply.chanbinsetlabel.location.xperc; - MERPWaveViewer_label{5} =ERPwaviewer_apply.chanbinsetlabel.location.yperc; - MERPWaveViewer_label{6} = ERPwaviewer_apply.chanbinsetlabel.location.center; - MERPWaveViewer_label{7} = ERPwaviewer_apply.chanbinsetlabel.font; + MERPWaveViewer_label{1} = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.auto; + MERPWaveViewer_label{2} = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.no; + MERPWaveViewer_label{3} =gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.custom; + MERPWaveViewer_label{4} =gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.xperc; + MERPWaveViewer_label{5} =gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.yperc; + MERPWaveViewer_label{6} = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.center; + MERPWaveViewer_label{7} = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.font; MERPWaveViewer_label{8} = gui_labelset_waveviewer.font_custom_size.Value; - MERPWaveViewer_label{9} = ERPwaviewer_apply.chanbinsetlabel.textcolor; + MERPWaveViewer_label{9} = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.textcolor; estudioworkingmemory('MERPWaveViewer_label',MERPWaveViewer_label); + viewer_ERPDAT.loadproper_count =6; end @@ -685,64 +667,142 @@ function count_twopanels_change(~,~) %%-----------------Reset this panel with the default parameters------------ %%------------------------------------------------------------------------- function Reset_Waviewer_panel_change(~,~) - if viewer_ERPDAT.Reset_Waviewer_panel==5 - try - ERPwaviewerin = evalin('base','ALLERPwaviewer'); - catch - beep; - disp('f_ERP_labelset_waveviewer_GUI error: Restart ERPwave Viewer'); - return; - end - gui_labelset_waveviewer.labelauto.Value=1; % - gui_labelset_waveviewer.nolabel.Value=0; % - gui_labelset_waveviewer.customlabel.Value=0; % - ERPwaviewerin.chanbinsetlabel.location.auto =1; - ERPwaviewerin.chanbinsetlabel.location.no =0; - ERPwaviewerin.chanbinsetlabel.location.custom=0; - %%label position - gui_labelset_waveviewer.xperc_edit.String = '50'; - gui_labelset_waveviewer.xperc_edit.Enable ='off'; % - gui_labelset_waveviewer.yperc_edit.String ='100'; - gui_labelset_waveviewer.yperc_edit.Enable='off'; % - gui_labelset_waveviewer.center.Value =1; - gui_labelset_waveviewer.center.Enable='off'; % - ERPwaviewerin.chanbinsetlabel.location.xperc =50; - ERPwaviewerin.chanbinsetlabel.location.yperc = 100; - ERPwaviewerin.chanbinsetlabel.location.center =1; - %%label font, fontsize and color - ERPwaviewerin.chanbinsetlabel.font =3; - ERPwaviewerin.chanbinsetlabel.fontsize =10; - ERPwaviewerin.chanbinsetlabel.textcolor=1; - fonttype = {'Courier','Geneva','Helvetica','Monaco','Times'}; - gui_labelset_waveviewer.font_custom_type.Value=3; - gui_labelset_waveviewer.font_custom_type.String = fonttype; - gui_labelset_waveviewer.font_custom_type.Enable='off'; % - gui_labelset_waveviewer.font_custom_size.Value=4; - gui_labelset_waveviewer.font_custom_size.Enable='off'; % - gui_labelset_waveviewer.labelcolor.Value=1; - gui_labelset_waveviewer.labelcolor.Enable='off'; % - assignin('base','ALLERPwaviewer',ERPwaviewerin); - gui_labelset_waveviewer.Apply.BackgroundColor = [1 1 1]; - gui_labelset_waveviewer.Apply.ForegroundColor = [0 0 0]; - box_erplabelset_viewer_property.TitleColor= [0.5 0.5 0.9]; - - %%save the default parameters to memory file - MERPWaveViewer_label{1} = ERPwaviewerin.chanbinsetlabel.location.auto; - MERPWaveViewer_label{2} = ERPwaviewerin.chanbinsetlabel.location.no; - MERPWaveViewer_label{3} =ERPwaviewerin.chanbinsetlabel.location.custom; - MERPWaveViewer_label{4} =ERPwaviewerin.chanbinsetlabel.location.xperc; - MERPWaveViewer_label{5} =ERPwaviewerin.chanbinsetlabel.location.yperc; - MERPWaveViewer_label{6} = ERPwaviewerin.chanbinsetlabel.location.center; - MERPWaveViewer_label{7} = ERPwaviewerin.chanbinsetlabel.font; - MERPWaveViewer_label{8} = gui_labelset_waveviewer.font_custom_size.Value; - MERPWaveViewer_label{9} = ERPwaviewerin.chanbinsetlabel.textcolor; - estudioworkingmemory('MERPWaveViewer_label',MERPWaveViewer_label); - - viewer_ERPDAT.Reset_Waviewer_panel=6; + if viewer_ERPDAT.Reset_Waviewer_panel~=5 + return; end + gui_labelset_waveviewer.labelauto.Value=1; % + gui_labelset_waveviewer.nolabel.Value=0; % + gui_labelset_waveviewer.customlabel.Value=0; % + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.auto =1; + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.no =0; + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.custom=0; + %%label position + gui_labelset_waveviewer.xperc_edit.String = '50'; + gui_labelset_waveviewer.xperc_edit.Enable ='off'; % + gui_labelset_waveviewer.yperc_edit.String ='100'; + gui_labelset_waveviewer.yperc_edit.Enable='off'; % + gui_labelset_waveviewer.center.Value =1; + gui_labelset_waveviewer.center.Enable='off'; % + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.xperc =50; + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.yperc = 100; + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.center =1; + %%label font, fontsize and color + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.font =3; + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.fontsize =10; + gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.textcolor=1; + fonttype = {'Courier','Geneva','Helvetica','Monaco','Times'}; + gui_labelset_waveviewer.font_custom_type.Value=3; + gui_labelset_waveviewer.font_custom_type.String = fonttype; + gui_labelset_waveviewer.font_custom_type.Enable='off'; % + gui_labelset_waveviewer.font_custom_size.Value=4; + gui_labelset_waveviewer.font_custom_size.Enable='off'; % + gui_labelset_waveviewer.labelcolor.Value=1; + gui_labelset_waveviewer.labelcolor.Enable='off'; % + gui_labelset_waveviewer.Apply.BackgroundColor = [1 1 1]; + gui_labelset_waveviewer.Apply.ForegroundColor = [0 0 0]; + box_erplabelset_viewer_property.TitleColor= [0.5 0.5 0.9]; + + %%save the default parameters to memory file + MERPWaveViewer_label{1} = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.auto; + MERPWaveViewer_label{2} = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.no; + MERPWaveViewer_label{3} =gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.custom; + MERPWaveViewer_label{4} =gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.xperc; + MERPWaveViewer_label{5} =gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.yperc; + MERPWaveViewer_label{6} = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.center; + MERPWaveViewer_label{7} = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.font; + MERPWaveViewer_label{8} = gui_labelset_waveviewer.font_custom_size.Value; + MERPWaveViewer_label{9} = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.textcolor; + estudioworkingmemory('MERPWaveViewer_label',MERPWaveViewer_label); + viewer_ERPDAT.Reset_Waviewer_panel=6; end -%%using "Return" key to execute this panel + +%%------------------------change this panel-------------------------------- + function v_currentERP_change(~,~) + if viewer_ERPDAT.Count_currentERP~=5 + return; + end + AutoValue = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.auto; + NoValue = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.no; + CustomValue = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.custom; + if AutoValue ==1 && NoValue==0 && CustomValue==0 + gui_labelset_waveviewer.labelauto.Value = 1; + gui_labelset_waveviewer.nolabel.Value = 0; + gui_labelset_waveviewer.customlabel.Value = 0; + Enable = 'off'; + gui_labelset_waveviewer.xperc_edit.Enable =Enable ; + gui_labelset_waveviewer.yperc_edit.Enable = Enable; + gui_labelset_waveviewer.center.Enable = Enable; + gui_labelset_waveviewer.font_custom_type.Enable = Enable; + gui_labelset_waveviewer.font_custom_size.Enable = Enable; + gui_labelset_waveviewer.font_custom_type.Value = 2; + gui_labelset_waveviewer.font_custom_size.Value = 4; + gui_labelset_waveviewer.xperc_edit.String ='50' ; + gui_labelset_waveviewer.yperc_edit.String = '100'; + gui_labelset_waveviewer.labelcolor.Enable = Enable; + gui_labelset_waveviewer.label_customtable.Enable = Enable; + elseif AutoValue ==0 && NoValue==1 && CustomValue==0 + gui_labelset_waveviewer.labelauto.Value = 0; + gui_labelset_waveviewer.nolabel.Value = 1; + gui_labelset_waveviewer.customlabel.Value = 0; + Enable = 'off'; + gui_labelset_waveviewer.xperc_edit.Enable =Enable ; + gui_labelset_waveviewer.yperc_edit.Enable = Enable; + gui_labelset_waveviewer.center.Enable = Enable; + gui_labelset_waveviewer.font_custom_type.Enable = Enable; + gui_labelset_waveviewer.font_custom_size.Enable = Enable; + gui_labelset_waveviewer.labelcolor.Enable = Enable; + gui_labelset_waveviewer.label_customtable.Enable = Enable; + elseif AutoValue ==0 && NoValue==0 && CustomValue==1 + gui_labelset_waveviewer.labelauto.Value = 0; + gui_labelset_waveviewer.nolabel.Value =0; + gui_labelset_waveviewer.customlabel.Value = 1; + Enable = 'on'; + gui_labelset_waveviewer.xperc_edit.Enable =Enable ; + gui_labelset_waveviewer.yperc_edit.Enable = Enable; + gui_labelset_waveviewer.center.Enable = Enable; + gui_labelset_waveviewer.font_custom_type.Enable = Enable; + gui_labelset_waveviewer.font_custom_size.Enable = Enable; + gui_labelset_waveviewer.labelcolor.Enable = Enable; + gui_labelset_waveviewer.label_customtable.Enable = Enable; + end + Xperc = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.xperc; + Yperc = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.yperc; + Center = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.center; + gui_labelset_waveviewer.xperc_edit.String = num2str(Xperc); + gui_labelset_waveviewer.yperc_edit.String = num2str(Yperc); + if Center ==1 + gui_labelset_waveviewer.center.Value = 1; + else + gui_labelset_waveviewer.center.Value = 0; + end + Labelfont = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.font; + gui_labelset_waveviewer.font_custom_type.Value = Labelfont; + Labelfontsize = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.fontsize; + fontsize = {'4','6','8','10','12','14','16','18','20','24','28','32','36',... + '40','50','60','70','80','90','100'}; + fontsize = str2num(char(fontsize)); + [xsize,y] = find(fontsize ==Labelfontsize); + gui_labelset_waveviewer.font_custom_size.Value = xsize; + textColor = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.textcolor; + gui_labelset_waveviewer.labelcolor.Value = textColor; + + %%save the parameters to memory file + MERPWaveViewer_label{1} = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.auto; + MERPWaveViewer_label{2} = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.no; + MERPWaveViewer_label{3} =gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.custom; + MERPWaveViewer_label{4} =gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.xperc; + MERPWaveViewer_label{5} =gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.yperc; + MERPWaveViewer_label{6} = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.center; + MERPWaveViewer_label{7} = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.font; + MERPWaveViewer_label{8} = gui_labelset_waveviewer.font_custom_size.Value; + MERPWaveViewer_label{9} = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.textcolor; + estudioworkingmemory('MERPWaveViewer_label',MERPWaveViewer_label); + viewer_ERPDAT.Count_currentERP=6; + end + + +%%----------------using "Return" key to execute this panel----------------- function labels_presskey(hObject, eventdata) keypress = eventdata.Key; if strcmp (keypress, 'return') || strcmp (keypress , 'enter') diff --git a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ERP_lineset_waveviewer_GUI.m b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ERP_lineset_waveviewer_GUI.m index 85a35e47..57e1e448 100755 --- a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ERP_lineset_waveviewer_GUI.m +++ b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ERP_lineset_waveviewer_GUI.m @@ -5,14 +5,13 @@ % Center for Mind and Brain % University of California, Davis, % Davis, CA -% 2022 +% 2022 && Nov. 2023 function varargout = f_ERP_lineset_waveviewer_GUI(varargin) global viewer_ERPDAT; -addlistener(viewer_ERPDAT,'legend_change',@legend_change); -addlistener(viewer_ERPDAT,'page_xyaxis_change',@page_xyaxis_change); +global gui_erp_waviewer; addlistener(viewer_ERPDAT,'loadproper_change',@loadproper_change); addlistener(viewer_ERPDAT,'v_currentERP_change',@v_currentERP_change); addlistener(viewer_ERPDAT,'count_twopanels_change',@count_twopanels_change); @@ -50,13 +49,6 @@ function drawui_lineset_property(FonsizeDefault) [version reldate,ColorB_def,ColorF_def,errorColorF_def,ColorBviewer_def] = geterplabstudiodef; - try - ERPwaviewer = evalin('base','ALLERPwaviewer'); - catch - beep; - disp('f_ERP_lineset_waveviewer_GUI() error: Please run the ERP wave viewer again.'); - return; - end %%--------------------channel and bin setting---------------------- gui_erplinset_waveviewer.DataSelBox = uiextras.VBox('Parent', box_erplineset_viewer_property,'BackgroundColor',ColorBviewer_def); @@ -92,15 +84,15 @@ function drawui_lineset_property(FonsizeDefault) %%-----------Setting for line table----------------------------- gui_erplinset_waveviewer.line_customtable_title = uiextras.HBox('Parent', gui_erplinset_waveviewer.DataSelBox,'BackgroundColor',ColorBviewer_def); try - plot_org = ERPwaviewer.plot_org; + plot_org = gui_erp_waviewer.ERPwaviewer.plot_org; if plot_org.Grid ==1 - GridNum = numel(ERPwaviewer.chan); + GridNum = numel(gui_erp_waviewer.ERPwaviewer.chan); elseif plot_org.Grid ==2 - GridNum = numel(ERPwaviewer.bin); + GridNum = numel(gui_erp_waviewer.ERPwaviewer.bin); elseif plot_org.Grid ==3 - GridNum = numel(ERPwaviewer.SelectERPIdx); + GridNum = numel(gui_erp_waviewer.ERPwaviewer.SelectERPIdx); else - GridNum = numel(ERPwaviewer.chan); + GridNum = numel(gui_erp_waviewer.ERPwaviewer.chan); end catch GridNum = []; @@ -133,15 +125,14 @@ function drawui_lineset_property(FonsizeDefault) gui_erplinset_waveviewer.line_customtable.ColumnWidth = {25 80 65 50}; gui_erplinset_waveviewer.line_customtable.CellEditCallback = @line_customtable; gui_erplinset_waveviewer.line_customtable.KeyPressFcn = @line_presskey; - %%setting for uitable: https://undocumentedmatlab.com/artiALLERPwaviewercles/multi-line-uitable-column-headers + %%setting for uitable: https://undocumentedmatlab.com/articles/multi-line-uitable-column-headers if gui_erplinset_waveviewer.linesauto.Value ==1 gui_erplinset_waveviewer.line_customtable.Enable = 'off'; else gui_erplinset_waveviewer.line_customtable.Enable = 'on'; end - ERPwaviewer.Lines.auto =gui_erplinset_waveviewer.linesauto.Value; - ERPwaviewer.Lines.data =gui_erplinset_waveviewer.line_customtable.Data; - + gui_erp_waviewer.ERPwaviewer.Lines.auto =gui_erplinset_waveviewer.linesauto.Value; + gui_erp_waviewer.ERPwaviewer.Lines.data =gui_erplinset_waveviewer.line_customtable.Data; %%-----------Setting for legend table ----------------------------- % gui_erplinset_waveviewer.legend_customtable_title = uiextras.HBox('Parent', gui_erplinset_waveviewer.DataSelBox,'BackgroundColor',ColorBviewer_def); @@ -149,17 +140,17 @@ function drawui_lineset_property(FonsizeDefault) LegendName{ii,1} = ''; LegendNamenum(ii,1) =ii; end - ALLERPIN = ERPwaviewer.ALLERP; - ERPsetArray = ERPwaviewer.SelectERPIdx; + ALLERPIN = gui_erp_waviewer.ERPwaviewer.ALLERP; + ERPsetArray = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; if max(ERPsetArray(:))> length(ALLERPIN) ERPsetArray =length(ALLERPIN); end [chanStr,binStr,diff_mark] = f_geterpschanbin(ALLERPIN,ERPsetArray); try - plot_org = ERPwaviewer.plot_org; - ERPIN = ERPwaviewer.ERP; + plot_org = gui_erp_waviewer.ERPwaviewer.plot_org; + ERPIN = gui_erp_waviewer.ERPwaviewer.ERP; if plot_org.Overlay ==1 - ChanArray = ERPwaviewer.chan; + ChanArray = gui_erp_waviewer.ERPwaviewer.chan; for Numofchan = 1:numel(ChanArray) LegendName{Numofchan,1} = char(chanStr(ChanArray(Numofchan))); end @@ -167,7 +158,7 @@ function drawui_lineset_property(FonsizeDefault) legendset_str = table2cell(legendset_str); LegendArray = ChanArray; elseif plot_org.Overlay ==2 - binArray = ERPwaviewer.bin; + binArray = gui_erp_waviewer.ERPwaviewer.bin; for Numofbin = 1:numel(binArray) LegendName{Numofbin,1} = char(binStr(binArray(Numofbin))); end @@ -175,8 +166,8 @@ function drawui_lineset_property(FonsizeDefault) legendset_str = table2cell(legendset_str); LegendArray = binArray; elseif plot_org.Overlay ==3 - ALLERP = ERPwaviewer.ALLERP; - ERPsetArray = ERPwaviewer.SelectERPIdx; + ALLERP = gui_erp_waviewer.ERPwaviewer.ALLERP; + ERPsetArray = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; for Numoferpset = 1:numel(ERPsetArray) LegendName{Numoferpset,1} = char(ALLERP(Numoferpset).erpname); end @@ -184,7 +175,7 @@ function drawui_lineset_property(FonsizeDefault) legendset_str = table2cell(legendset_str); LegendArray = ERPsetArray; else - binArray = ERPwaviewer.bin; + binArray = gui_erp_waviewer.ERPwaviewer.bin; for Numofbin = 1:numel(binArray) LegendName{Numofbin,1} = char(binStr(binArray(Numofbin))); end @@ -196,7 +187,7 @@ function drawui_lineset_property(FonsizeDefault) legendset_str = table(LegendNamenum,LegendName); legendset_str = table2cell(legendset_str); end - ERPwaviewer.Legend.data = legendset_str; + gui_erp_waviewer.ERPwaviewer.Legend.data = legendset_str; % %%--------------------legend font and font size--------------------------- @@ -220,13 +211,12 @@ function drawui_lineset_property(FonsizeDefault) 'callback',@font_color_custom,'FontSize',FonsizeDefault,'BackgroundColor',ColorBviewer_def,'Value',~fontcolorAuto); % gui_erplinset_waveviewer.font_colorcustom.KeyPressFcn = @line_presskey; set(gui_erplinset_waveviewer.fontcolor_title,'Sizes',[60 70 70]); - ERPwaviewer.Legend.FontColorAuto = gui_erplinset_waveviewer.font_colorauto.Value; + gui_erp_waviewer.ERPwaviewer.Legend.FontColorAuto = gui_erplinset_waveviewer.font_colorauto.Value; if gui_erplinset_waveviewer.font_colorauto.Value==1 fontEnable = 'off'; else fontEnable = 'on'; end - gui_erplinset_waveviewer.labelfont_title = uiextras.HBox('Parent', gui_erplinset_waveviewer.DataSelBox,'BackgroundColor',ColorBviewer_def); try @@ -265,9 +255,8 @@ function drawui_lineset_property(FonsizeDefault) 'callback',@legendfontsize,'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1],'Value',LabelfontsizeValue,'Enable',fontEnable); % gui_erplinset_waveviewer.font_custom_size.KeyPressFcn = @line_presskey; set(gui_erplinset_waveviewer.labelfont_title,'Sizes',[30 110 30 70]); - ERPwaviewer.Legend.font = gui_erplinset_waveviewer.font_custom_type.Value; - ERPwaviewer.Legend.fontsize = labelfontsizeinum(gui_erplinset_waveviewer.font_custom_size.Value); - + gui_erp_waviewer.ERPwaviewer.Legend.font = gui_erplinset_waveviewer.font_custom_type.Value; + gui_erp_waviewer.ERPwaviewer.Legend.fontsize = labelfontsizeinum(gui_erplinset_waveviewer.font_custom_size.Value); %%----------------------------Legend textcolor--------------------- try @@ -294,10 +283,10 @@ function drawui_lineset_property(FonsizeDefault) 'callback',@legendtextcustom,'FontSize',FonsizeDefault,'BackgroundColor',ColorBviewer_def,'Value',~legendtextcolorAuto,'Enable',fontEnable,'HorizontalAlignment','left'); % gui_erplinset_waveviewer.legendtextcustom.KeyPressFcn = @line_presskey; set(gui_erplinset_waveviewer.legend_textitle,'Sizes',[70 60 150]); - ERPwaviewer.Legend.textcolor = gui_erplinset_waveviewer.legendtextauto.Value; + gui_erp_waviewer.ERPwaviewer.Legend.textcolor = gui_erplinset_waveviewer.legendtextauto.Value; %%------------------------Legend columns--------------------------- - legendcolumnsdef = round(sqrt( length(LegendArray))); + legendcolumnsdef = ceil(sqrt( length(LegendArray))); try legendcolumns= MERPWaveViewer_linelegend{7}; catch @@ -323,13 +312,13 @@ function drawui_lineset_property(FonsizeDefault) gui_erplinset_waveviewer.legendcolumns.KeyPressFcn = @line_presskey; uiextras.Empty('Parent', gui_erplinset_waveviewer.legend_columnstitle ); set(gui_erplinset_waveviewer.legend_columnstitle,'Sizes',[60 100 70]); - ERPwaviewer.Legend.columns = gui_erplinset_waveviewer.legendcolumns.Value; + gui_erp_waviewer.ERPwaviewer.Legend.columns = gui_erplinset_waveviewer.legendcolumns.Value; %%-------------------------help and apply-------------------------- gui_erplinset_waveviewer.help_apply_title = uiextras.HBox('Parent', gui_erplinset_waveviewer.DataSelBox,'BackgroundColor',ColorBviewer_def); uiextras.Empty('Parent',gui_erplinset_waveviewer.help_apply_title ); - uicontrol('Style','pushbutton','Parent', gui_erplinset_waveviewer.help_apply_title ,'String','Cancel',... + gui_erplinset_waveviewer.cancel = uicontrol('Style','pushbutton','Parent', gui_erplinset_waveviewer.help_apply_title ,'String','Cancel',... 'callback',@linelegend_help,'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1]); %,'FontWeight','bold','HorizontalAlignment','left' uiextras.Empty('Parent',gui_erplinset_waveviewer.help_apply_title ); gui_erplinset_waveviewer.apply = uicontrol('Style','pushbutton','Parent',gui_erplinset_waveviewer.help_apply_title ,'String','Apply',... @@ -338,8 +327,21 @@ function drawui_lineset_property(FonsizeDefault) set(gui_erplinset_waveviewer.help_apply_title ,'Sizes',[40 70 20 70 20]); set(gui_erplinset_waveviewer.DataSelBox ,'Sizes',[20 200 20 25 25 25 25]); - assignin('base','ALLERPwaviewer',ERPwaviewer); + estudioworkingmemory('MERPWaveViewer_linelegend',MERPWaveViewer_linelegend); + + gui_erp_waviewer.ERPwaviewer.Lines.auto = gui_erplinset_waveviewer.linesauto.Value; + gui_erp_waviewer.ERPwaviewer.Lines.data = gui_erplinset_waveviewer.line_customtable.Data; + fontsize = {'4','6','8','10','12','14','16','18','20','24','28','32','36',... + '40','50','60','70','80','90','100'}; + labelfontsizeinum = str2num(char(fontsize)); + gui_erp_waviewer.ERPwaviewer.Legend.font = gui_erplinset_waveviewer.font_custom_type.Value; + gui_erp_waviewer.ERPwaviewer.Legend.fontsize = labelfontsizeinum(gui_erplinset_waveviewer.font_custom_size.Value); + gui_erp_waviewer.ERPwaviewer.Legend.textcolor = gui_erplinset_waveviewer.legendtextauto.Value; + gui_erp_waviewer.ERPwaviewer.Legend.columns = gui_erplinset_waveviewer.legendcolumns.Value; + gui_erp_waviewer.ERPwaviewer.Legend.FontColorAuto = gui_erplinset_waveviewer.font_colorauto.Value; + + estudioworkingmemory('MyViewer_linelegend',0); end %%**************************************************************************%% @@ -356,29 +358,23 @@ function lines_auto(~,~) gui_erplinset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; %%mark the changes gui_erplinset_waveviewer.apply.ForegroundColor = [1 1 1]; box_erplineset_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; - + gui_erplinset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_erplinset_waveviewer.cancel.ForegroundColor = [1 1 1]; gui_erplinset_waveviewer.linesauto.Value =1; gui_erplinset_waveviewer.linescustom.Value = 0; gui_erplinset_waveviewer.line_customtable.Enable = 'off'; + try - ALLERPwaviewer = evalin('base','ALLERPwaviewer'); - ERPwaviewer = ALLERPwaviewer; - catch - beep; - disp('f_ERP_lineset_waveviewer_GUI() error: Please run the ERP wave viewer again.'); - return; - end - try - plot_org = ERPwaviewer.plot_org; + plot_org = gui_erp_waviewer.ERPwaviewer.plot_org; if plot_org.Grid ==1 - GridNum = numel(ERPwaviewer.chan); + GridNum = numel(gui_erp_waviewer.ERPwaviewer.chan); elseif plot_org.Grid ==2 - GridNum = numel(ERPwaviewer.bin); + GridNum = numel(gui_erp_waviewer.ERPwaviewer.bin); elseif plot_org.Grid ==3 - GridNum = numel(ERPwaviewer.SelectERPIdx); + GridNum = numel(gui_erp_waviewer.ERPwaviewer.SelectERPIdx); else - GridNum = numel(ERPwaviewer.chan); + GridNum = numel(gui_erp_waviewer.ERPwaviewer.chan); end catch GridNum = []; @@ -402,7 +398,8 @@ function lines_custom(~,~) gui_erplinset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; %%mark the changes gui_erplinset_waveviewer.apply.ForegroundColor = [1 1 1]; box_erplineset_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; - + gui_erplinset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_erplinset_waveviewer.cancel.ForegroundColor = [1 1 1]; gui_erplinset_waveviewer.linesauto.Value =0; gui_erplinset_waveviewer.linescustom.Value = 1; gui_erplinset_waveviewer.line_customtable.Enable = 'on'; @@ -427,11 +424,12 @@ function line_customtable(~,~) gui_erplinset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; %%mark the changes gui_erplinset_waveviewer.apply.ForegroundColor = [1 1 1]; box_erplineset_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + gui_erplinset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_erplinset_waveviewer.cancel.ForegroundColor = [1 1 1]; end - -%%Auto for font, fontsize, color, columns for legend +%%------------Auto for font, fontsize, color, columns for legend---------- function font_color_auto(Source,~) [messgStr,viewerpanelIndex] = f_check_erpviewerpanelchanges();%%check if the changes were applied for the other panels if ~isempty(messgStr) && viewerpanelIndex~=6 @@ -441,32 +439,26 @@ function font_color_auto(Source,~) gui_erplinset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; %%mark the changes gui_erplinset_waveviewer.apply.ForegroundColor = [1 1 1]; box_erplineset_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + gui_erplinset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_erplinset_waveviewer.cancel.ForegroundColor = [1 1 1]; - try - ERPwaviewer = evalin('base','ALLERPwaviewer'); - catch - beep; - disp(' Line & Legends> Legend Auto error: Please run the ERP wave viewer again.'); - return; - end - ALLERPIN = ERPwaviewer.ALLERP; - ERPsetArray = ERPwaviewer.SelectERPIdx; + ALLERPIN = gui_erp_waviewer.ERPwaviewer.ALLERP; + ERPsetArray = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; if max(ERPsetArray(:))> length(ALLERPIN) ERPsetArray =length(ALLERPIN); end [chanStr,binStr,diff_mark] = f_geterpschanbin(ALLERPIN,ERPsetArray); - plot_org = ERPwaviewer.plot_org; + plot_org = gui_erp_waviewer.ERPwaviewer.plot_org; if plot_org.Overlay ==1 - LegendArray = ERPwaviewer.chan; + LegendArray = gui_erp_waviewer.ERPwaviewer.chan; elseif plot_org.Overlay ==2 - LegendArray = ERPwaviewer.bin; + LegendArray = gui_erp_waviewer.ERPwaviewer.bin; elseif plot_org.Overlay ==3 - LegendArray = ERPwaviewer.SelectERPIdx; + LegendArray = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; else - LegendArray = ERPwaviewer.bin; + LegendArray = gui_erp_waviewer.ERPwaviewer.bin; end - gui_erplinset_waveviewer.font_colorauto.Value=1; % gui_erplinset_waveviewer.font_colorcustom.Value = 0; gui_erplinset_waveviewer.font_custom_type.Enable = 'off'; % @@ -479,7 +471,6 @@ function font_color_auto(Source,~) gui_erplinset_waveviewer.legendcolumns.Enable = 'off'; gui_erplinset_waveviewer.font_custom_size.Value = 4; gui_erplinset_waveviewer.font_custom_type.Value =3; - end %%Custom for font, fontsize, color, columns for legend @@ -492,7 +483,8 @@ function font_color_custom(Source,~) gui_erplinset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; %%mark the changes gui_erplinset_waveviewer.apply.ForegroundColor = [1 1 1]; box_erplineset_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; - + gui_erplinset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_erplinset_waveviewer.cancel.ForegroundColor = [1 1 1]; gui_erplinset_waveviewer.font_colorauto.Value=0; % gui_erplinset_waveviewer.font_colorcustom.Value = 1; gui_erplinset_waveviewer.font_custom_type.Enable = 'on'; % @@ -512,6 +504,8 @@ function legendfont(Source,~) gui_erplinset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; %%mark the changes gui_erplinset_waveviewer.apply.ForegroundColor = [1 1 1]; box_erplineset_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + gui_erplinset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_erplinset_waveviewer.cancel.ForegroundColor = [1 1 1]; end %%----------------------fontsize of legend text---------------------------- @@ -524,6 +518,8 @@ function legendfontsize(Source,~) gui_erplinset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; %%mark the changes gui_erplinset_waveviewer.apply.ForegroundColor = [1 1 1]; box_erplineset_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + gui_erplinset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_erplinset_waveviewer.cancel.ForegroundColor = [1 1 1]; end @@ -537,7 +533,8 @@ function legendtextauto(~,~) gui_erplinset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; %%mark the changes gui_erplinset_waveviewer.apply.ForegroundColor = [1 1 1]; box_erplineset_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; - + gui_erplinset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_erplinset_waveviewer.cancel.ForegroundColor = [1 1 1]; gui_erplinset_waveviewer.legendtextauto.Value =1; % gui_erplinset_waveviewer.legendtextcustom.Value =0; end @@ -553,7 +550,8 @@ function legendtextcustom(~,~) gui_erplinset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; %%mark the changes gui_erplinset_waveviewer.apply.ForegroundColor = [1 1 1]; box_erplineset_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; - + gui_erplinset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_erplinset_waveviewer.cancel.ForegroundColor = [1 1 1]; gui_erplinset_waveviewer.legendtextauto.Value =0; % gui_erplinset_waveviewer.legendtextcustom.Value =1; end @@ -568,6 +566,8 @@ function legendcolumns(~,~) gui_erplinset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; %%mark the changes gui_erplinset_waveviewer.apply.ForegroundColor = [1 1 1]; box_erplineset_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + gui_erplinset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_erplinset_waveviewer.cancel.ForegroundColor = [1 1 1]; end @@ -578,50 +578,41 @@ function linelegend_help(~,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end MessageViewer= char(strcat('Lines & Legends > Cancel')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =1; changeFlag = estudioworkingmemory('MyViewer_linelegend'); if changeFlag~=1 MessageViewer= char(strcat('Lines & Legends > Cancel')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =2; return; end - try - ERPwaviewer_apply = evalin('base','ALLERPwaviewer'); - catch - viewer_ERPDAT.Process_messg =3; - fprintf(2,'\nLines & Legends > Cancel-f_ERP_lineset_waveviewer_GUI() error: Cannot get parameters for whole panel.\n Please run My viewer again.\n\n'); - return; - end - - gui_erplinset_waveviewer.linesauto.Value= ERPwaviewer_apply.Lines.auto; - gui_erplinset_waveviewer.linescustom.Value= ~ERPwaviewer_apply.Lines.auto; - gui_erplinset_waveviewer.line_customtable.Data=ERPwaviewer_apply.Lines.data; + gui_erplinset_waveviewer.linesauto.Value= gui_erp_waviewer.ERPwaviewer.Lines.auto; + gui_erplinset_waveviewer.linescustom.Value= ~gui_erp_waviewer.ERPwaviewer.Lines.auto; + gui_erplinset_waveviewer.line_customtable.Data=gui_erp_waviewer.ERPwaviewer.Lines.data; if gui_erplinset_waveviewer.linesauto.Value==1 gui_erplinset_waveviewer.line_customtable.Enable = 'off'; else gui_erplinset_waveviewer.line_customtable.Enable = 'on'; end - fontsize = {'4','6','8','10','12','14','16','18','20','24','28','32','36',... '40','50','60','70','80','90','100'}; labelfontsizeinum = str2num(char(fontsize)); - gui_erplinset_waveviewer.font_custom_type.Value= ERPwaviewer_apply.Legend.font; - fontsizeValue = ERPwaviewer_apply.Legend.fontsize ; + gui_erplinset_waveviewer.font_custom_type.Value= gui_erp_waviewer.ERPwaviewer.Legend.font; + fontsizeValue = gui_erp_waviewer.ERPwaviewer.Legend.fontsize ; [x_label,y_label] = find(labelfontsizeinum==fontsizeValue); if isempty(x_label) x_label = 4; end gui_erplinset_waveviewer.font_custom_size.Value= x_label; - gui_erplinset_waveviewer.legendtextauto.Value= ERPwaviewer_apply.Legend.textcolor; - gui_erplinset_waveviewer.legendtextcustom.Value= ~ERPwaviewer_apply.Legend.textcolor; - gui_erplinset_waveviewer.legendcolumns.Value=ERPwaviewer_apply.Legend.columns; + gui_erplinset_waveviewer.legendtextauto.Value= gui_erp_waviewer.ERPwaviewer.Legend.textcolor; + gui_erplinset_waveviewer.legendtextcustom.Value= ~gui_erp_waviewer.ERPwaviewer.Legend.textcolor; + gui_erplinset_waveviewer.legendcolumns.Value=gui_erp_waviewer.ERPwaviewer.Legend.columns; try - FontColorAuto= ERPwaviewer_apply.Legend.FontColorAuto; + FontColorAuto= gui_erp_waviewer.ERPwaviewer.Legend.FontColorAuto; catch FontColorAuto=1; end @@ -639,13 +630,14 @@ function linelegend_help(~,~) gui_erplinset_waveviewer.legendtextcustom.Enable = LegendEnable; gui_erplinset_waveviewer.legendcolumns.Enable = LegendEnable; - estudioworkingmemory('MyViewer_linelegend',0); gui_erplinset_waveviewer.apply.BackgroundColor = [1 1 1]; gui_erplinset_waveviewer.apply.ForegroundColor = [0 0 0]; box_erplineset_viewer_property.TitleColor= [0.5 0.5 0.9]; + gui_erplinset_waveviewer.cancel.BackgroundColor = [1 1 1]; + gui_erplinset_waveviewer.cancel.ForegroundColor = [0 0 0]; MessageViewer= char(strcat('Lines & Legends > Cancel')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =2; end @@ -661,30 +653,22 @@ function LineLegend_apply(~,~) gui_erplinset_waveviewer.apply.BackgroundColor = [1 1 1]; gui_erplinset_waveviewer.apply.ForegroundColor = [0 0 0]; box_erplineset_viewer_property.TitleColor= [0.5 0.5 0.9]; - + gui_erplinset_waveviewer.cancel.BackgroundColor = [1 1 1]; + gui_erplinset_waveviewer.cancel.ForegroundColor = [0 0 0]; MessageViewer= char(strcat('Lines & Legends > Apply')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =1; - try - ALLERPwaviewer = evalin('base','ALLERPwaviewer'); - ERPwaviewer_apply = ALLERPwaviewer; - catch - viewer_ERPDAT.Process_messg =3; - fprintf(2,'\n Lines & Legends > Apply-f_ERP_lineset_waveviewer_GUI() error: Cannot get parameters for whole panel.\n Please run My viewer again.\n\n'); - return; - end - ERPwaviewer_apply.Lines.auto = gui_erplinset_waveviewer.linesauto.Value; - ERPwaviewer_apply.Lines.data = gui_erplinset_waveviewer.line_customtable.Data; + + gui_erp_waviewer.ERPwaviewer.Lines.auto = gui_erplinset_waveviewer.linesauto.Value; + gui_erp_waviewer.ERPwaviewer.Lines.data = gui_erplinset_waveviewer.line_customtable.Data; fontsize = {'4','6','8','10','12','14','16','18','20','24','28','32','36',... '40','50','60','70','80','90','100'}; labelfontsizeinum = str2num(char(fontsize)); - ERPwaviewer_apply.Legend.font = gui_erplinset_waveviewer.font_custom_type.Value; - ERPwaviewer_apply.Legend.fontsize = labelfontsizeinum(gui_erplinset_waveviewer.font_custom_size.Value); - ERPwaviewer_apply.Legend.textcolor = gui_erplinset_waveviewer.legendtextauto.Value; - ERPwaviewer_apply.Legend.columns = gui_erplinset_waveviewer.legendcolumns.Value; - ERPwaviewer_apply.Legend.FontColorAuto = gui_erplinset_waveviewer.font_colorauto.Value; - assignin('base','ALLERPwaviewer',ERPwaviewer_apply); - + gui_erp_waviewer.ERPwaviewer.Legend.font = gui_erplinset_waveviewer.font_custom_type.Value; + gui_erp_waviewer.ERPwaviewer.Legend.fontsize = labelfontsizeinum(gui_erplinset_waveviewer.font_custom_size.Value); + gui_erp_waviewer.ERPwaviewer.Legend.textcolor = gui_erplinset_waveviewer.legendtextauto.Value; + gui_erp_waviewer.ERPwaviewer.Legend.columns = gui_erplinset_waveviewer.legendcolumns.Value; + gui_erp_waviewer.ERPwaviewer.Legend.FontColorAuto = gui_erplinset_waveviewer.font_colorauto.Value; %%Save the parameters for this panel to memory file MERPWaveViewer_linelegend{1}=gui_erplinset_waveviewer.linesauto.Value; @@ -696,203 +680,40 @@ function LineLegend_apply(~,~) MERPWaveViewer_linelegend{7}=gui_erplinset_waveviewer.legendcolumns.Value; estudioworkingmemory('MERPWaveViewer_linelegend',MERPWaveViewer_linelegend);%%save the parameters for this panel to memory file - f_redrawERP_viewer_test(); - viewer_ERPDAT.Process_messg =2; - end - - -%%--------------change the legend name------------------------------------- - function legend_change(~,~) - if viewer_ERPDAT.count_legend==0 - return; - end - try - ERPwaviewer = evalin('base','ALLERPwaviewer'); - catch - beep; - disp('f_ERP_lineset_waveviewer_GUI() error: Please run the ERP wave viewer again.'); - return; - end - for ii = 1:100 - LegendName{ii,1} = ''; - LegendNamenum(ii,1) =ii; - end - ALLERPIN = ERPwaviewer.ALLERP; - ERPsetArray = ERPwaviewer.SelectERPIdx; - if max(ERPsetArray(:))> length(ALLERPIN) - ERPsetArray =length(ALLERPIN); - end - [chanStr,binStr,diff_mark] = f_geterpschanbin(ALLERPIN,ERPsetArray); - LegendArray = [1:4]; - try - plot_org = ERPwaviewer.plot_org; - ERPIN = ERPwaviewer.ERP; - if plot_org.Overlay ==1 - ChanArray = ERPwaviewer.chan; - for Numofchan = 1:numel(ChanArray) - LegendName{Numofchan,1} = char(chanStr(ChanArray(Numofchan))); - end - legendset_str = table(LegendNamenum,LegendName); - legendset_str = table2cell(legendset_str); - LegendArray = ChanArray; - elseif plot_org.Overlay ==2 - binArray = ERPwaviewer.bin; - for Numofbin = 1:numel(binArray) - LegendName{Numofbin,1} = char(binStr(binArray(Numofbin))); - end - legendset_str = table(LegendNamenum,LegendName); - legendset_str = table2cell(legendset_str); - LegendArray = binArray; - elseif plot_org.Overlay ==3 - ALLERP = ERPwaviewer.ALLERP; - ERPsetArray = ERPwaviewer.SelectERPIdx; - for Numoferpset = 1:numel(ERPsetArray) - LegendName{Numoferpset,1} = char(ALLERP(ERPsetArray(Numoferpset)).erpname); - end - legendset_str = table(LegendNamenum,LegendName); - legendset_str = table2cell(legendset_str); - LegendArray = ERPsetArray; - else - binArray = ERPwaviewer.bin; - for Numofbin = 1:numel(binArray) - LegendName{Numofbin,1} = char(binStr(binArray(Numofbin))); - end - legendset_str = table(LegendNamenum,LegendName); - legendset_str = table2cell(legendset_str); - LegendArray = binArray; - end - catch - legendset_str = table(LegendNamenum,LegendName); - legendset_str = table2cell(legendset_str); - end - ERPwaviewer.Legend.data = legendset_str; - if gui_erplinset_waveviewer.font_colorauto.Value==1 - gui_erplinset_waveviewer.legendcolumns.Value =round(sqrt(length(LegendArray))); - ERPwaviewer.Legend.columns = round(sqrt(length(LegendArray))); - end - assignin('base','ALLERPwaviewer',ERPwaviewer); + gui_erp_waviewer.ERPwaviewer.Lines.auto = gui_erplinset_waveviewer.linesauto.Value; + gui_erp_waviewer.ERPwaviewer.Lines.data = gui_erplinset_waveviewer.line_customtable.Data; + gui_erp_waviewer.ERPwaviewer.Legend.font = gui_erplinset_waveviewer.font_custom_type.Value; + gui_erp_waviewer.ERPwaviewer.Legend.fontsize = labelfontsizeinum(gui_erplinset_waveviewer.font_custom_size.Value); + gui_erp_waviewer.ERPwaviewer.Legend.textcolor = gui_erplinset_waveviewer.legendtextauto.Value; + gui_erp_waviewer.ERPwaviewer.Legend.columns = gui_erplinset_waveviewer.legendcolumns.Value; + gui_erp_waviewer.ERPwaviewer.Legend.FontColorAuto = gui_erplinset_waveviewer.font_colorauto.Value; - %%Save parameters for this panel to memory file - MERPWaveViewer_linelegend{1}=gui_erplinset_waveviewer.linesauto.Value; - MERPWaveViewer_linelegend{2}= gui_erplinset_waveviewer.line_customtable.Data; - MERPWaveViewer_linelegend{3}=gui_erplinset_waveviewer.font_colorauto.Value; - MERPWaveViewer_linelegend{4}=gui_erplinset_waveviewer.font_custom_type.Value; - MERPWaveViewer_linelegend{5}=gui_erplinset_waveviewer.font_custom_size.Value; - MERPWaveViewer_linelegend{6}= gui_erplinset_waveviewer.legendtextauto.Value; - MERPWaveViewer_linelegend{7}=gui_erplinset_waveviewer.legendcolumns.Value; - estudioworkingmemory('MERPWaveViewer_linelegend',MERPWaveViewer_linelegend);%%save the parameters for this panel to memory file - end - -%%--------changed the legend names based on the current page--------------- - function page_xyaxis_change(~,~) - if viewer_ERPDAT.page_xyaxis==0 - return; - end - try - ERPwaviewer = evalin('base','ALLERPwaviewer'); - catch - beep; - disp('f_ERP_lineset_waveviewer_GUI() error: Please run the ERP wave viewer again.'); - return; - end - for ii = 1:100 - LegendName{ii,1} = ''; - LegendNamenum(ii,1) =ii; - end - ALLERPIN = ERPwaviewer.ALLERP; - ERPsetArray = ERPwaviewer.SelectERPIdx; - if max(ERPsetArray(:))> length(ALLERPIN) - ERPsetArray =length(ALLERPIN); - end - [chanStr,binStr,diff_mark] = f_geterpschanbin(ALLERPIN,ERPsetArray); - LegendArray = [1:4]; - try - plot_org = ERPwaviewer.plot_org; - ERPIN = ERPwaviewer.ERP; - if plot_org.Overlay ==1 - ChanArray = ERPwaviewer.chan; - for Numofchan = 1:numel(ChanArray) - LegendName{Numofchan,1} = char(chanStr(ChanArray(Numofchan))); - end - legendset_str = table(LegendNamenum,LegendName); - legendset_str = table2cell(legendset_str); - LegendArray = ChanArray; - elseif plot_org.Overlay ==2 - binArray = ERPwaviewer.bin; - for Numofbin = 1:numel(binArray) - LegendName{Numofbin,1} = char(binStr(binArray(Numofbin))); - end - legendset_str = table(LegendNamenum,LegendName); - legendset_str = table2cell(legendset_str); - LegendArray = binArray; - elseif plot_org.Overlay ==3 - ALLERP = ERPwaviewer.ALLERP; - ERPsetArray = ERPwaviewer.SelectERPIdx; - for Numoferpset = 1:numel(ERPsetArray) - LegendName{Numoferpset,1} = char(ALLERP(ERPsetArray(Numoferpset)).erpname); - end - legendset_str = table(LegendNamenum,LegendName); - legendset_str = table2cell(legendset_str); - LegendArray = ERPsetArray; - else - binArray = ERPwaviewer.bin; - for Numofbin = 1:numel(binArray) - LegendName{Numofbin,1} = char(binStr(binArray(Numofbin))); - end - legendset_str = table(LegendNamenum,LegendName); - legendset_str = table2cell(legendset_str); - LegendArray = binArray; - end - catch - legendset_str = table(LegendNamenum,LegendName); - legendset_str = table2cell(legendset_str); - end - - ERPwaviewer.Legend.data = legendset_str; - if gui_erplinset_waveviewer.font_colorauto.Value==1 - gui_erplinset_waveviewer.legendcolumns.Value =round(sqrt(length(LegendArray))); - ERPwaviewer.Legend.columns = round(sqrt(length(LegendArray))); - end - assignin('base','ALLERPwaviewer',ERPwaviewer); - - MERPWaveViewer_linelegend{1}=gui_erplinset_waveviewer.linesauto.Value; - MERPWaveViewer_linelegend{2}= gui_erplinset_waveviewer.line_customtable.Data; - MERPWaveViewer_linelegend{3}=gui_erplinset_waveviewer.font_colorauto.Value; - MERPWaveViewer_linelegend{4}=gui_erplinset_waveviewer.font_custom_type.Value; - MERPWaveViewer_linelegend{5}=gui_erplinset_waveviewer.font_custom_size.Value; - MERPWaveViewer_linelegend{6}= gui_erplinset_waveviewer.legendtextauto.Value; - MERPWaveViewer_linelegend{7}=gui_erplinset_waveviewer.legendcolumns.Value; - estudioworkingmemory('MERPWaveViewer_linelegend',MERPWaveViewer_linelegend);%%save the parameters for this panel to memory file + viewer_ERPDAT.Count_currentERP = 1; + viewer_ERPDAT.Process_messg =2; end %%-----change legend if ERPsets is changed from the first two panels------- function v_currentERP_change(~,~) - if viewer_ERPDAT.Count_currentERP == 0 - return; - end - try - ERPwaviewer = evalin('base','ALLERPwaviewer'); - catch - beep; - disp('f_ERP_lineset_waveviewer_GUI() error: Please run the ERP wave viewer again.'); + if viewer_ERPDAT.Count_currentERP ~=6 return; end + for ii = 1:100 LegendName{ii,1} = ''; LegendNamenum(ii,1) =ii; end - ALLERP = ERPwaviewer.ALLERP; - ERPsetArray = ERPwaviewer.SelectERPIdx; + ALLERP = gui_erp_waviewer.ERPwaviewer.ALLERP; + ERPsetArray = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; if max(ERPsetArray(:))> length(ALLERP) ERPsetArray =length(ALLERP); end [chanStr,binStr,diff_mark] = f_geterpschanbin(ALLERP,ERPsetArray); LegendArray = [1:4]; try - plot_org = ERPwaviewer.plot_org; + plot_org = gui_erp_waviewer.ERPwaviewer.plot_org; if plot_org.Overlay ==1 - ChanArray = ERPwaviewer.chan; + ChanArray = gui_erp_waviewer.ERPwaviewer.chan; for Numofchan = 1:numel(ChanArray) LegendName{Numofchan,1} = char(chanStr(ChanArray(Numofchan))); end @@ -900,7 +721,7 @@ function v_currentERP_change(~,~) legendset_str = table2cell(legendset_str); LegendArray =ChanArray ; elseif plot_org.Overlay ==2 - binArray = ERPwaviewer.bin; + binArray = gui_erp_waviewer.ERPwaviewer.bin; for Numofbin = 1:numel(binArray) LegendName{Numofbin,1} = char(binStr(binArray(Numofbin))); end @@ -915,7 +736,7 @@ function v_currentERP_change(~,~) legendset_str = table2cell(legendset_str); LegendArray =ERPsetArray ; else - binArray = ERPwaviewer.bin; + binArray = gui_erp_waviewer.ERPwaviewer.bin; for Numofbin = 1:numel(binArray) LegendName{Numofbin,1} = char(binStr(binArray(Numofbin))); end @@ -927,13 +748,12 @@ function v_currentERP_change(~,~) legendset_str = table(LegendNamenum,LegendName); legendset_str = table2cell(legendset_str); end - ERPwaviewer.Legend.data = legendset_str; - if gui_erplinset_waveviewer.font_colorauto.Value==1 - gui_erplinset_waveviewer.legendcolumns.Value =round(sqrt(length(LegendArray))); - ERPwaviewer.Legend.columns = round(sqrt(length(LegendArray))); + gui_erp_waviewer.ERPwaviewer.Legend.data = legendset_str; + if gui_erp_waviewer.ERPwaviewer.Legend.FontColorAuto ==1 + gui_erplinset_waveviewer.legendcolumns.Value =ceil(sqrt(length(LegendArray))); + gui_erp_waviewer.ERPwaviewer.Legend.columns = ceil(sqrt(length(LegendArray))); end - assignin('base','ALLERPwaviewer',ERPwaviewer); - + MERPWaveViewer_linelegend{1}=gui_erplinset_waveviewer.linesauto.Value; MERPWaveViewer_linelegend{2}= gui_erplinset_waveviewer.line_customtable.Data; MERPWaveViewer_linelegend{3}=gui_erplinset_waveviewer.font_colorauto.Value; @@ -942,7 +762,18 @@ function v_currentERP_change(~,~) MERPWaveViewer_linelegend{6}= gui_erplinset_waveviewer.legendtextauto.Value; MERPWaveViewer_linelegend{7}=gui_erplinset_waveviewer.legendcolumns.Value; estudioworkingmemory('MERPWaveViewer_linelegend',MERPWaveViewer_linelegend);%%save the parameters for this panel to memory file - + gui_erp_waviewer.ERPwaviewer.Lines.auto = gui_erplinset_waveviewer.linesauto.Value; + gui_erp_waviewer.ERPwaviewer.Lines.data = gui_erplinset_waveviewer.line_customtable.Data; + fontsize = {'4','6','8','10','12','14','16','18','20','24','28','32','36',... + '40','50','60','70','80','90','100'}; + labelfontsizeinum = str2num(char(fontsize)); + gui_erp_waviewer.ERPwaviewer.Lines.auto = gui_erplinset_waveviewer.linesauto.Value; + gui_erp_waviewer.ERPwaviewer.Legend.font = gui_erplinset_waveviewer.font_custom_type.Value; + gui_erp_waviewer.ERPwaviewer.Legend.fontsize = labelfontsizeinum(gui_erplinset_waveviewer.font_custom_size.Value); + gui_erp_waviewer.ERPwaviewer.Legend.textcolor = gui_erplinset_waveviewer.legendtextauto.Value; + gui_erp_waviewer.ERPwaviewer.Legend.columns = gui_erplinset_waveviewer.legendcolumns.Value; + gui_erp_waviewer.ERPwaviewer.Legend.FontColorAuto = gui_erplinset_waveviewer.font_colorauto.Value; + viewer_ERPDAT.Count_currentERP =7; end @@ -952,18 +783,12 @@ function loadproper_change(~,~) if viewer_ERPDAT.loadproper_count ~=6 return; end - try - ERPwaviewer = evalin('base','ALLERPwaviewer'); - catch - beep; - disp('f_ERP_lineset_waveviewer_GUI() error: Please run the ERP wave viewer again.'); - return; - end + %%-----------------------Line settings----------------------------- - LineValue = ERPwaviewer.Lines.auto; + LineValue = gui_erp_waviewer.ERPwaviewer.Lines.auto; if numel(LineValue)~=1 || (LineValue~=1 && LineValue~=0) LineValue = 1; - ERPwaviewer.Lines.auto = 1; + gui_erp_waviewer.ERPwaviewer.Lines.auto = 1; end if LineValue==1 gui_erplinset_waveviewer.linesauto.Value =1; @@ -975,7 +800,6 @@ function loadproper_change(~,~) gui_erplinset_waveviewer.line_customtable.Enable = 'on'; end - [lineNameStr,linecolors,linetypes,linewidths,linecolors_str,linetypes_str,linewidths_str,linecolorsrgb] = f_get_lineset_ERPviewer(); lineset_str =table(lineNameStr,linecolors,linetypes,linewidths); lineset_str = table2cell(lineset_str); @@ -983,10 +807,10 @@ function loadproper_change(~,~) {'solid','dash','dot','dashdot','plus','circle','asterisk'},... {'0.25','0.5','1','1.5','2','2.5','3','3.5','4','4.5','5','5.5','6','6.5','7','7.5','8','8.5','9','9.5','10','10.5'}}; - LineData = ERPwaviewer.Lines.data; + LineData = gui_erp_waviewer.ERPwaviewer.Lines.data; if LineValue==1 LineData= lineset_str; - ERPwaviewer.Lines.data = LineData; + gui_erp_waviewer.ERPwaviewer.Lines.data = LineData; end gui_erplinset_waveviewer.line_customtable.Data = LineData; @@ -996,17 +820,17 @@ function loadproper_change(~,~) LegendName{ii,1} = ''; LegendNamenum(ii,1) =ii; end - ALLERP = ERPwaviewer.ALLERP; - ERPsetArray = ERPwaviewer.SelectERPIdx; + ALLERP = gui_erp_waviewer.ERPwaviewer.ALLERP; + ERPsetArray = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; if max(ERPsetArray(:))> length(ALLERP) ERPsetArray =length(ALLERP); end [chanStr,binStr,diff_mark] = f_geterpschanbin(ALLERP,ERPsetArray); LegendArray = [1:4]; try - plot_org = ERPwaviewer.plot_org; + plot_org = gui_erp_waviewer.ERPwaviewer.plot_org; if plot_org.Overlay ==1 - ChanArray = ERPwaviewer.chan; + ChanArray = gui_erp_waviewer.ERPwaviewer.chan; for Numofchan = 1:numel(ChanArray) LegendName{Numofchan,1} = char(chanStr(ChanArray(Numofchan))); end @@ -1014,7 +838,7 @@ function loadproper_change(~,~) legendset_str = table2cell(legendset_str); LegendArray = ChanArray; elseif plot_org.Overlay ==2 - binArray = ERPwaviewer.bin; + binArray = gui_erp_waviewer.ERPwaviewer.bin; for Numofbin = 1:numel(binArray) LegendName{Numofbin,1} = char(binStr(binArray(Numofbin))); end @@ -1029,7 +853,7 @@ function loadproper_change(~,~) legendset_str = table2cell(legendset_str); LegendArray = ERPsetArray; else - binArray = ERPwaviewer.bin; + binArray = gui_erp_waviewer.ERPwaviewer.bin; for Numofbin = 1:numel(binArray) LegendName{Numofbin,1} = char(binStr(binArray(Numofbin))); end @@ -1041,7 +865,7 @@ function loadproper_change(~,~) legendset_str = table(LegendNamenum,LegendName); legendset_str = table2cell(legendset_str); end - ERPwaviewer.Legend.data=legendset_str; + gui_erp_waviewer.ERPwaviewer.Legend.data=legendset_str; LegendfontColorAuto = gui_erplinset_waveviewer.font_colorauto.Value; if LegendfontColorAuto==1 @@ -1051,7 +875,6 @@ function loadproper_change(~,~) gui_erplinset_waveviewer.legendtextcustom.Enable = 'off'; gui_erplinset_waveviewer.legendtextauto.Value = 1; gui_erplinset_waveviewer.legendtextcustom.Value = 0; - % gui_erplinset_waveviewer.legendcolumns.Value =1; gui_erplinset_waveviewer.legendcolumns.Value =round(sqrt(length(LegendArray))); gui_erplinset_waveviewer.legendcolumns.Enable = 'off'; gui_erplinset_waveviewer.font_colorauto.Value=1; @@ -1067,9 +890,9 @@ function loadproper_change(~,~) end - legendfont =ERPwaviewer.Legend.font; + legendfont =gui_erp_waviewer.ERPwaviewer.Legend.font; gui_erplinset_waveviewer.font_custom_type.Value = legendfont; - legendfontsize = ERPwaviewer.Legend.fontsize; + legendfontsize = gui_erp_waviewer.ERPwaviewer.Legend.fontsize; fontsize = {'4','6','8','10','12','14','16','18','20','24','28','32','36',... '40','50','60','70','80','90','100'}; gui_erplinset_waveviewer.font_custom_size.String = fontsize; @@ -1077,7 +900,7 @@ function loadproper_change(~,~) [xsize,y] = find(fontsize ==legendfontsize); gui_erplinset_waveviewer.font_custom_size.Value = xsize; - Legendtextcolor = ERPwaviewer.Legend.textcolor; + Legendtextcolor = gui_erp_waviewer.ERPwaviewer.Legend.textcolor; if Legendtextcolor==1 gui_erplinset_waveviewer.legendtextauto.Value =1; % gui_erplinset_waveviewer.legendtextcustom.Value =0; @@ -1085,13 +908,12 @@ function loadproper_change(~,~) gui_erplinset_waveviewer.legendtextauto.Value =0; % gui_erplinset_waveviewer.legendtextcustom.Value =1; end - legendColumns = ERPwaviewer.Legend.columns; + legendColumns = gui_erp_waviewer.ERPwaviewer.Legend.columns; gui_erplinset_waveviewer.legendcolumns.Value = legendColumns; for Numoflegend = 1:100 columnStr{Numoflegend} = num2str(Numoflegend); end gui_erplinset_waveviewer.legendcolumns.String = columnStr; - assignin('base','ALLERPwaviewer',ERPwaviewer); %%save the parameters to memory file MERPWaveViewer_linelegend{1}=gui_erplinset_waveviewer.linesauto.Value; @@ -1102,7 +924,6 @@ function loadproper_change(~,~) MERPWaveViewer_linelegend{6}= gui_erplinset_waveviewer.legendtextauto.Value; MERPWaveViewer_linelegend{7}=gui_erplinset_waveviewer.legendcolumns.Value; estudioworkingmemory('MERPWaveViewer_linelegend',MERPWaveViewer_linelegend);%%save the parameters for this panel to memory file - viewer_ERPDAT.loadproper_count =7; end @@ -1125,117 +946,111 @@ function count_twopanels_change(~,~) %%-----------------Reset this panel with the default parameters------------ %%------------------------------------------------------------------------- function Reset_Waviewer_panel_change(~,~) - if viewer_ERPDAT.Reset_Waviewer_panel==6 - try - ERPwaviewerin = evalin('base','ALLERPwaviewer'); - catch - beep; - disp('f_ERP_lineset_waveviewer_GUI error: Restart ERPwave Viewer'); - return; - end - %%-------------------------Lines------------------------------- - gui_erplinset_waveviewer.linesauto.Value =1; - gui_erplinset_waveviewer.linescustom.Value = 0; - gui_erplinset_waveviewer.line_customtable.Enable = 'off'; - [lineNameStr,linecolors,linetypes,linewidths,linecolors_str,linetypes_str,linewidths_str,linecolorsrgb] = f_get_lineset_ERPviewer(); - lineset_str =table(lineNameStr,linecolors,linetypes,linewidths); - lineset_str = table2cell(lineset_str); - gui_erplinset_waveviewer.line_customtable.ColumnFormat = {'char', 'char',... - {'solid','dash','dot','dashdot','plus','circle','asterisk'},... - {'0.25','0.5','1','1.5','2','2.5','3','3.5','4','4.5','5','5.5','6','6.5','7','7.5','8','8.5','9','9.5','10','10.5'}}; - gui_erplinset_waveviewer.line_customtable.Data = lineset_str; - ERPwaviewerin.Lines.auto =1; - ERPwaviewerin.Lines.data = gui_erplinset_waveviewer.line_customtable.Data; - - %%-----------------------Legends------------------------------- - gui_erplinset_waveviewer.font_colorauto.Value =1; - gui_erplinset_waveviewer.font_colorcustom.Value =0; - - gui_erplinset_waveviewer.font_custom_type.Enable = 'off'; % - gui_erplinset_waveviewer.font_custom_size.Enable = 'off'; - gui_erplinset_waveviewer.legendtextauto.Enable = 'off'; - gui_erplinset_waveviewer.legendtextcustom.Enable = 'off'; - gui_erplinset_waveviewer.legendtextauto.Value = 1; - gui_erplinset_waveviewer.legendtextcustom.Value = 0; - % gui_erplinset_waveviewer.legendcolumns.Value =1; - gui_erplinset_waveviewer.legendcolumns.Enable = 'off'; - % - for ii = 1:100 - LegendName{ii,1} = ''; - LegendNamenum(ii,1) =ii; - end - ALLERP = ERPwaviewerin.ALLERP; - ERPsetArray = ERPwaviewerin.SelectERPIdx; - if max(ERPsetArray(:))> length(ALLERP) - ERPsetArray =length(ALLERP); - end - [chanStr,binStr,diff_mark] = f_geterpschanbin(ALLERP,ERPsetArray); - LegendArray = [1:4]; - try - plot_org = ERPwaviewerin.plot_org; - if plot_org.Overlay ==1 - ChanArray = ERPwaviewerin.chan; - for Numofchan = 1:numel(ChanArray) - LegendName{Numofchan,1} = char(chanStr(ChanArray(Numofchan))); - end - legendset_str = table(LegendNamenum,LegendName); - legendset_str = table2cell(legendset_str); - LegendArray =ChanArray; - elseif plot_org.Overlay ==2 - binArray = ERPwaviewerin.bin; - for Numofbin = 1:numel(binArray) - LegendName{Numofbin,1} = char(binStr(binArray(Numofbin))); - end - legendset_str = table(LegendNamenum,LegendName); - legendset_str = table2cell(legendset_str); - LegendArray =binArray; - elseif plot_org.Overlay ==3 - for Numoferpset = 1:numel(ERPsetArray) - LegendName{Numoferpset,1} = char(ALLERP(ERPsetArray(Numoferpset)).erpname); - end - legendset_str = table(LegendNamenum,LegendName); - legendset_str = table2cell(legendset_str); - LegendArray =ERPsetArray; - else - binArray = ERPwaviewerin.bin; - for Numofbin = 1:numel(binArray) - LegendName{Numofbin,1} = char(binStr(binArray(Numofbin))); - end - legendset_str = table(LegendNamenum,LegendName); - legendset_str = table2cell(legendset_str); - LegendArray =binArray; + if viewer_ERPDAT.Reset_Waviewer_panel~=6 + return; + end + + %%-------------------------Lines------------------------------- + gui_erplinset_waveviewer.linesauto.Value =1; + gui_erplinset_waveviewer.linescustom.Value = 0; + gui_erplinset_waveviewer.line_customtable.Enable = 'off'; + [lineNameStr,linecolors,linetypes,linewidths,linecolors_str,linetypes_str,linewidths_str,linecolorsrgb] = f_get_lineset_ERPviewer(); + lineset_str =table(lineNameStr,linecolors,linetypes,linewidths); + lineset_str = table2cell(lineset_str); + gui_erplinset_waveviewer.line_customtable.ColumnFormat = {'char', 'char',... + {'solid','dash','dot','dashdot','plus','circle','asterisk'},... + {'0.25','0.5','1','1.5','2','2.5','3','3.5','4','4.5','5','5.5','6','6.5','7','7.5','8','8.5','9','9.5','10','10.5'}}; + gui_erplinset_waveviewer.line_customtable.Data = lineset_str; + gui_erp_waviewer.ERPwaviewer.Lines.auto =1; + gui_erp_waviewer.ERPwaviewer.Lines.data = gui_erplinset_waveviewer.line_customtable.Data; + + %%-----------------------Legends------------------------------- + gui_erplinset_waveviewer.font_colorauto.Value =1; + gui_erplinset_waveviewer.font_colorcustom.Value =0; + + gui_erplinset_waveviewer.font_custom_type.Enable = 'off'; % + gui_erplinset_waveviewer.font_custom_size.Enable = 'off'; + gui_erplinset_waveviewer.legendtextauto.Enable = 'off'; + gui_erplinset_waveviewer.legendtextcustom.Enable = 'off'; + gui_erplinset_waveviewer.legendtextauto.Value = 1; + gui_erplinset_waveviewer.legendtextcustom.Value = 0; + gui_erplinset_waveviewer.legendcolumns.Enable = 'off'; + for ii = 1:100 + LegendName{ii,1} = ''; + LegendNamenum(ii,1) =ii; + end + ALLERP = gui_erp_waviewer.ERPwaviewer.ALLERP; + ERPsetArray = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + if max(ERPsetArray(:))> length(ALLERP) + ERPsetArray =length(ALLERP); + end + [chanStr,binStr,diff_mark] = f_geterpschanbin(ALLERP,ERPsetArray); + LegendArray = [1:4]; + try + plot_org = gui_erp_waviewer.ERPwaviewer.plot_org; + if plot_org.Overlay ==1 + ChanArray = gui_erp_waviewer.ERPwaviewer.chan; + for Numofchan = 1:numel(ChanArray) + LegendName{Numofchan,1} = char(chanStr(ChanArray(Numofchan))); end - catch legendset_str = table(LegendNamenum,LegendName); legendset_str = table2cell(legendset_str); + LegendArray =ChanArray; + elseif plot_org.Overlay ==2 + binArray = gui_erp_waviewer.ERPwaviewer.bin; + for Numofbin = 1:numel(binArray) + LegendName{Numofbin,1} = char(binStr(binArray(Numofbin))); + end + legendset_str = table(LegendNamenum,LegendName); + legendset_str = table2cell(legendset_str); + LegendArray =binArray; + elseif plot_org.Overlay ==3 + for Numoferpset = 1:numel(ERPsetArray) + LegendName{Numoferpset,1} = char(ALLERP(ERPsetArray(Numoferpset)).erpname); + end + legendset_str = table(LegendNamenum,LegendName); + legendset_str = table2cell(legendset_str); + LegendArray =ERPsetArray; + else + binArray = gui_erp_waviewer.ERPwaviewer.bin; + for Numofbin = 1:numel(binArray) + LegendName{Numofbin,1} = char(binStr(binArray(Numofbin))); + end + legendset_str = table(LegendNamenum,LegendName); + legendset_str = table2cell(legendset_str); + LegendArray =binArray; end - - gui_erplinset_waveviewer.legendcolumns.Value =round(sqrt(length(LegendArray))); - gui_erplinset_waveviewer.font_custom_size.Value = 4; - gui_erplinset_waveviewer.font_custom_type.Value =3; - ERPwaviewerin.Legend.data =legendset_str; - ERPwaviewerin.Legend.font=3; - ERPwaviewerin.Legend.fontsize=10; - ERPwaviewerin.Legend.textcolor=1; - ERPwaviewerin.Legend.columns=1; - ERPwaviewerin.Legend.FontColorAuto=1; - - assignin('base','ALLERPwaviewer',ERPwaviewerin); - gui_erplinset_waveviewer.apply.BackgroundColor = [1 1 1]; - gui_erplinset_waveviewer.apply.ForegroundColor = [0 0 0]; - box_erplineset_viewer_property.TitleColor= [0.5 0.5 0.9]; - - MERPWaveViewer_linelegend{1}=gui_erplinset_waveviewer.linesauto.Value; - MERPWaveViewer_linelegend{2}= gui_erplinset_waveviewer.line_customtable.Data; - MERPWaveViewer_linelegend{3}=gui_erplinset_waveviewer.font_colorauto.Value; - MERPWaveViewer_linelegend{4}=gui_erplinset_waveviewer.font_custom_type.Value; - MERPWaveViewer_linelegend{5}=gui_erplinset_waveviewer.font_custom_size.Value; - MERPWaveViewer_linelegend{6}= gui_erplinset_waveviewer.legendtextauto.Value; - MERPWaveViewer_linelegend{7}=gui_erplinset_waveviewer.legendcolumns.Value; - estudioworkingmemory('MERPWaveViewer_linelegend',MERPWaveViewer_linelegend);%%save the parameters for this panel to memory file - - viewer_ERPDAT.Reset_Waviewer_panel=7; + catch + legendset_str = table(LegendNamenum,LegendName); + legendset_str = table2cell(legendset_str); end + + gui_erplinset_waveviewer.legendcolumns.Value =round(sqrt(length(LegendArray))); + gui_erplinset_waveviewer.font_custom_size.Value = 4; + gui_erplinset_waveviewer.font_custom_type.Value =3; + gui_erp_waviewer.ERPwaviewer.Legend.data =legendset_str; + gui_erp_waviewer.ERPwaviewer.Legend.font=3; + gui_erp_waviewer.ERPwaviewer.Legend.fontsize=10; + gui_erp_waviewer.ERPwaviewer.Legend.textcolor=1; + gui_erp_waviewer.ERPwaviewer.Legend.columns=1; + gui_erp_waviewer.ERPwaviewer.Legend.FontColorAuto=1; + + gui_erplinset_waveviewer.apply.BackgroundColor = [1 1 1]; + gui_erplinset_waveviewer.apply.ForegroundColor = [0 0 0]; + box_erplineset_viewer_property.TitleColor= [0.5 0.5 0.9]; + gui_erplinset_waveviewer.cancel.BackgroundColor = [1 1 1]; + gui_erplinset_waveviewer.cancel.ForegroundColor = [0 0 0]; + + MERPWaveViewer_linelegend{1}=gui_erplinset_waveviewer.linesauto.Value; + MERPWaveViewer_linelegend{2}= gui_erplinset_waveviewer.line_customtable.Data; + MERPWaveViewer_linelegend{3}=gui_erplinset_waveviewer.font_colorauto.Value; + MERPWaveViewer_linelegend{4}=gui_erplinset_waveviewer.font_custom_type.Value; + MERPWaveViewer_linelegend{5}=gui_erplinset_waveviewer.font_custom_size.Value; + MERPWaveViewer_linelegend{6}= gui_erplinset_waveviewer.legendtextauto.Value; + MERPWaveViewer_linelegend{7}=gui_erplinset_waveviewer.legendcolumns.Value; + estudioworkingmemory('MERPWaveViewer_linelegend',MERPWaveViewer_linelegend);%%save the parameters for this panel to memory file + + viewer_ERPDAT.Reset_Waviewer_panel=7; end function line_presskey(hObject, eventdata) @@ -1246,6 +1061,8 @@ function line_presskey(hObject, eventdata) gui_erplinset_waveviewer.apply.BackgroundColor = [1 1 1]; gui_erplinset_waveviewer.apply.ForegroundColor = [0 0 0]; box_erplineset_viewer_property.TitleColor= [0.5 0.5 0.9]; + gui_erplinset_waveviewer.cancel.BackgroundColor = [1 1 1]; + gui_erplinset_waveviewer.cancel.ForegroundColor = [0 0 0]; else return; end diff --git a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ERP_otherset_waveviewer_GUI.m b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ERP_otherset_waveviewer_GUI.m index 9bd5503b..76a00bb6 100755 --- a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ERP_otherset_waveviewer_GUI.m +++ b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ERP_otherset_waveviewer_GUI.m @@ -11,12 +11,11 @@ function varargout = f_ERP_otherset_waveviewer_GUI(varargin) global viewer_ERPDAT; +global gui_erp_waviewer; addlistener(viewer_ERPDAT,'loadproper_change',@loadproper_change); -% addlistener(viewer_ERPDAT,'Process_messg_change',@Process_messg_change); addlistener(viewer_ERPDAT,'count_twopanels_change',@count_twopanels_change); addlistener(viewer_ERPDAT,'Reset_Waviewer_panel_change',@Reset_Waviewer_panel_change); - - +addlistener(viewer_ERPDAT,'v_currentERP_change',@v_currentERP_change); gui_otherset_waveviewer = struct(); %-----------------------------Name the title---------------------------------------------- @@ -48,14 +47,6 @@ function drawui_otherset_waviewer(FonsizeDefault) [version reldate,ColorB_def,ColorF_def,errorColorF_def,ColorBviewer_def] = geterplabstudiodef; - try - ERPwaviewer = evalin('base','ALLERPwaviewer'); - catch - beep; - disp('f_ERP_lineset_waveviewer_GUI() error: Please run the ERP wave viewer again.'); - return; - end - gui_otherset_waveviewer.DataSelBox = uiextras.VBox('Parent', box_erplabelset_viewer_otherset,'BackgroundColor',ColorBviewer_def); %%----------Polarity Setting--------------------------------------- MERPWaveViewer_others= estudioworkingmemory('MERPWaveViewer_others');%%call the parameters for this panel @@ -80,7 +71,7 @@ function drawui_otherset_waviewer(FonsizeDefault) 'callback',@polardown, 'FontSize',FonsizeDefault,'BackgroundColor',ColorBviewer_def,'Value',~Polaritylabel); %,'FontWeight','bold' gui_otherset_waveviewer.polarity_down.KeyPressFcn = @otherset_presskey; set(gui_otherset_waveviewer.polarity_title,'Sizes',[50 90 90]); - ERPwaviewer.polarity=gui_otherset_waveviewer.polarity_up.Value; + gui_erp_waviewer.ERPwaviewer.polarity=gui_otherset_waveviewer.polarity_up.Value; %%----------------SEM of wave-------------------------------------- try @@ -104,8 +95,8 @@ function drawui_otherset_waviewer(FonsizeDefault) 'callback',@SEMerror,'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1],'Value',SEMCustomValue+1); % gui_otherset_waveviewer.SEM_custom.KeyPressFcn = @otherset_presskey; set(gui_otherset_waveviewer.SEM_title,'Sizes',[160 80]); - ERPwaviewer.SEM.active =gui_otherset_waveviewer.show_SEM.Value; - ERPwaviewer.SEM.error = gui_otherset_waveviewer.SEM_custom.Value-1; + gui_erp_waviewer.ERPwaviewer.SEM.active =gui_otherset_waveviewer.show_SEM.Value; + gui_erp_waviewer.ERPwaviewer.SEM.error = gui_otherset_waveviewer.SEM_custom.Value-1; try SEMtransValue= MERPWaveViewer_others{4}; catch @@ -127,7 +118,7 @@ function drawui_otherset_waviewer(FonsizeDefault) gui_otherset_waveviewer.SEM_custom.Enable = 'off'; gui_otherset_waveviewer.SEMtrans_custom.Enable = 'off'; end - ERPwaviewer.SEM.trans = (gui_otherset_waveviewer.SEMtrans_custom.Value-1)/10; + gui_erp_waviewer.ERPwaviewer.SEM.trans = (gui_otherset_waveviewer.SEMtrans_custom.Value-1)/10; %%----------------baseline correction------------------------------ try @@ -207,17 +198,17 @@ function drawui_otherset_waviewer(FonsizeDefault) set( gui_otherset_waveviewer.bsl_title_3,'Sizes',[80 155]); if gui_otherset_waveviewer.bsl_none.Value ==1 - ERPwaviewer.baselinecorr = 'none'; + gui_erp_waviewer.ERPwaviewer.baselinecorr = 'none'; elseif gui_otherset_waveviewer.bsl_pre.Value ==1 - ERPwaviewer.baselinecorr = 'pre'; + gui_erp_waviewer.ERPwaviewer.baselinecorr = 'pre'; elseif gui_otherset_waveviewer.bsl_post.Value ==1 - ERPwaviewer.baselinecorr = 'post'; + gui_erp_waviewer.ERPwaviewer.baselinecorr = 'post'; elseif gui_otherset_waveviewer.bsl_whole.Value ==1 - ERPwaviewer.baselinecorr = 'whole'; + gui_erp_waviewer.ERPwaviewer.baselinecorr = 'whole'; elseif gui_otherset_waveviewer.bsl_custom.Value ==1 - ERPwaviewer.baselinecorr = str2num(char(gui_otherset_waveviewer.bsl_customedit.String)); + gui_erp_waviewer.ERPwaviewer.baselinecorr = str2num(char(gui_otherset_waveviewer.bsl_customedit.String)); else - ERPwaviewer.baselinecorr = 'none'; + gui_erp_waviewer.ERPwaviewer.baselinecorr = 'none'; end %%Figure background color: the default is white @@ -238,13 +229,13 @@ function drawui_otherset_waviewer(FonsizeDefault) 'callback',@figbackcolor,'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1]); %,'HorizontalAlignment','left' gui_otherset_waveviewer.figurebakcolor.KeyPressFcn = @otherset_presskey; set(gui_otherset_waveviewer.figurebakcolor_title,'Sizes',[150 85]); - ERPwaviewer.figbackgdcolor = str2num(gui_otherset_waveviewer.figurebakcolor.String); + gui_erp_waviewer.ERPwaviewer.figbackgdcolor = str2num(gui_otherset_waveviewer.figurebakcolor.String); %%Apply and save the changed parameters gui_otherset_waveviewer.help_run_title = uiextras.HBox('Parent', gui_otherset_waveviewer.DataSelBox,'BackgroundColor',ColorBviewer_def); uiextras.Empty('Parent', gui_otherset_waveviewer.help_run_title ); - uicontrol('Style','pushbutton','Parent', gui_otherset_waveviewer.help_run_title,'String','Cancel',... + gui_otherset_waveviewer.cancel = uicontrol('Style','pushbutton','Parent', gui_otherset_waveviewer.help_run_title,'String','Cancel',... 'callback',@other_help,'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1]); %,'FontWeight','bold'%,'HorizontalAlignment','left' uiextras.Empty('Parent', gui_otherset_waveviewer.help_run_title ); gui_otherset_waveviewer.apply = uicontrol('Style','pushbutton','Parent', gui_otherset_waveviewer.help_run_title ,'String','Apply',... @@ -253,8 +244,9 @@ function drawui_otherset_waviewer(FonsizeDefault) set(gui_otherset_waveviewer.help_run_title,'Sizes',[40 70 20 70 20]); set(gui_otherset_waveviewer.DataSelBox,'Sizes',[25 25 25 20 20 25 25 25]); - assignin('base','ALLERPwaviewer',ERPwaviewer); estudioworkingmemory('MERPWaveViewer_others',MERPWaveViewer_others); + + estudioworkingmemory('MyViewer_other',0); end %%**************************************************************************%% @@ -274,6 +266,8 @@ function polarup(~,~) box_erplabelset_viewer_otherset.TitleColor= [0.4940 0.1840 0.5560]; gui_otherset_waveviewer.polarity_up.Value = 1; gui_otherset_waveviewer.polarity_down.Value = 0; + gui_otherset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_otherset_waveviewer.cancel.ForegroundColor = [1 1 1]; end %%-------------------------Setting for Polarity down----------------------- @@ -282,12 +276,12 @@ function polardown(~,~) if ~isempty(messgStr) && viewerpanelIndex~=7 viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end - estudioworkingmemory('MyViewer_other',1); gui_otherset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; gui_otherset_waveviewer.apply.ForegroundColor = [1 1 1]; box_erplabelset_viewer_otherset.TitleColor= [0.4940 0.1840 0.5560]; - + gui_otherset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_otherset_waveviewer.cancel.ForegroundColor = [1 1 1]; gui_otherset_waveviewer.polarity_up.Value = 0; gui_otherset_waveviewer.polarity_down.Value = 1; end @@ -303,7 +297,8 @@ function showSEM(Str,~) gui_otherset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; gui_otherset_waveviewer.apply.ForegroundColor = [1 1 1]; box_erplabelset_viewer_otherset.TitleColor= [0.4940 0.1840 0.5560]; - + gui_otherset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_otherset_waveviewer.cancel.ForegroundColor = [1 1 1]; Value = Str.Value; if Value ==1 gui_otherset_waveviewer.SEM_custom.Enable = 'on'; @@ -311,8 +306,8 @@ function showSEM(Str,~) else gui_otherset_waveviewer.SEM_custom.Enable = 'off'; gui_otherset_waveviewer.SEMtrans_custom.Enable = 'off'; - gui_otherset_waveviewer.SEM_custom.Value = 1; - gui_otherset_waveviewer.SEMtrans_custom.Value = 1; + % gui_otherset_waveviewer.SEM_custom.Value = 1; + % gui_otherset_waveviewer.SEMtrans_custom.Value = 1; end end @@ -327,6 +322,8 @@ function SEMerror(~,~) gui_otherset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; gui_otherset_waveviewer.apply.ForegroundColor = [1 1 1]; box_erplabelset_viewer_otherset.TitleColor= [0.4940 0.1840 0.5560]; + gui_otherset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_otherset_waveviewer.cancel.ForegroundColor = [1 1 1]; end %%---------------------------SEM trans.------------------------------------ function SEMtrans(~,~) @@ -338,6 +335,8 @@ function SEMtrans(~,~) gui_otherset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; gui_otherset_waveviewer.apply.ForegroundColor = [1 1 1]; box_erplabelset_viewer_otherset.TitleColor= [0.4940 0.1840 0.5560]; + gui_otherset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_otherset_waveviewer.cancel.ForegroundColor = [1 1 1]; end @@ -347,12 +346,12 @@ function bsl_none(~,~) if ~isempty(messgStr) && viewerpanelIndex~=7 viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end - estudioworkingmemory('MyViewer_other',1); gui_otherset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; gui_otherset_waveviewer.apply.ForegroundColor = [1 1 1]; box_erplabelset_viewer_otherset.TitleColor= [0.4940 0.1840 0.5560]; - + gui_otherset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_otherset_waveviewer.cancel.ForegroundColor = [1 1 1]; gui_otherset_waveviewer.bsl_none.Value =1; gui_otherset_waveviewer.bsl_pre.Value =0; gui_otherset_waveviewer.bsl_post.Value =0; @@ -372,7 +371,8 @@ function bsl_pre(~,~) gui_otherset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; gui_otherset_waveviewer.apply.ForegroundColor = [1 1 1]; box_erplabelset_viewer_otherset.TitleColor= [0.4940 0.1840 0.5560]; - + gui_otherset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_otherset_waveviewer.cancel.ForegroundColor = [1 1 1]; gui_otherset_waveviewer.bsl_none.Value =0; gui_otherset_waveviewer.bsl_pre.Value =1; gui_otherset_waveviewer.bsl_post.Value =0; @@ -384,7 +384,6 @@ function bsl_pre(~,~) %%--------------------Baseline correction:post----------------------------- function bsl_post(~,~) - [messgStr,viewerpanelIndex] = f_check_erpviewerpanelchanges(); if ~isempty(messgStr) && viewerpanelIndex~=7 viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; @@ -393,7 +392,8 @@ function bsl_post(~,~) gui_otherset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; gui_otherset_waveviewer.apply.ForegroundColor = [1 1 1]; box_erplabelset_viewer_otherset.TitleColor= [0.4940 0.1840 0.5560]; - + gui_otherset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_otherset_waveviewer.cancel.ForegroundColor = [1 1 1]; gui_otherset_waveviewer.bsl_none.Value =0; gui_otherset_waveviewer.bsl_pre.Value =0; gui_otherset_waveviewer.bsl_post.Value =1; @@ -413,7 +413,8 @@ function bsl_whole(~,~) gui_otherset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; gui_otherset_waveviewer.apply.ForegroundColor = [1 1 1]; box_erplabelset_viewer_otherset.TitleColor= [0.4940 0.1840 0.5560]; - + gui_otherset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_otherset_waveviewer.cancel.ForegroundColor = [1 1 1]; gui_otherset_waveviewer.bsl_none.Value =0; gui_otherset_waveviewer.bsl_pre.Value =0; gui_otherset_waveviewer.bsl_post.Value =0; @@ -432,7 +433,8 @@ function bsl_custom(~,~) gui_otherset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; gui_otherset_waveviewer.apply.ForegroundColor = [1 1 1]; box_erplabelset_viewer_otherset.TitleColor= [0.4940 0.1840 0.5560]; - + gui_otherset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_otherset_waveviewer.cancel.ForegroundColor = [1 1 1]; gui_otherset_waveviewer.bsl_none.Value =0; gui_otherset_waveviewer.bsl_pre.Value =0; gui_otherset_waveviewer.bsl_post.Value =0; @@ -450,45 +452,40 @@ function bsl_customedit(Str,~) gui_otherset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; gui_otherset_waveviewer.apply.ForegroundColor = [1 1 1]; box_erplabelset_viewer_otherset.TitleColor= [0.4940 0.1840 0.5560]; - + gui_otherset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_otherset_waveviewer.cancel.ForegroundColor = [1 1 1]; MessageViewer= char(strcat('Other > Baseline Correction > Custom')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); - try - ALLERPwaviewer = evalin('base','ALLERPwaviewer'); - ERPwaviewer = ALLERPwaviewer; - catch - viewer_ERPDAT.Process_messg =3; - fprintf(2,'\n Other > Baseline Correction > Custom() error: Cannot get parameters for whole panel.\n Please run My viewer again.\n\n'); - return; - end + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); + bacselinePeriod = str2num(char(Str.String)); if isempty(bacselinePeriod) || numel(bacselinePeriod)==1 - viewer_ERPDAT.Process_messg =3; Str.String = ''; - fprintf(2,'\n Other > Baseline Correction > Custom() error: \n Inputs must be two numbers.\n\n'); + msgboxText = strcat('Other > Baseline Correction > Custom() error: Inputs must be two numbers'); + estudioworkingmemory('ERPViewer_proces_messg',msgboxText); + viewer_ERPDAT.Process_messg =4; return; end - TimeRange = ERPwaviewer.ERP.times; + TimeRange = gui_erp_waviewer.ERPwaviewer.ERP.times; if bacselinePeriod(1) Baseline Correction > Custom(): Left edge of baseline period should be larger than',32,num2str(TimeRange(1)),'ms'); + estudioworkingmemory('ERPViewer_proces_messg',msgboxText); Str.String = ''; - fprintf(2,['\n Other > Baseline Correction > Custom() error: \n',32,msgboxText,'.\n\n']); + viewer_ERPDAT.Process_messg =4; return; end if bacselinePeriod(2)>TimeRange(end) - msgboxText = strcat('Right edge of baseline period should be smaller than',32,num2str(TimeRange(end)),'ms'); - viewer_ERPDAT.Process_messg =3; + msgboxText = strcat('Other > Baseline Correction > Custom(): Right edge of baseline period should be smaller than',32,num2str(TimeRange(end)),'ms'); + estudioworkingmemory('ERPViewer_proces_messg',msgboxText); + viewer_ERPDAT.Process_messg =4; Str.String = ''; - fprintf(2,['\n Other > Baseline Correction > Custom() error: \n',32,msgboxText,'.\n\n']); return; end if bacselinePeriod(1)>=bacselinePeriod(end) - msgboxText = strcat('Right edge of baseline period should be larger than left edge'); - viewer_ERPDAT.Process_messg =3; + msgboxText = strcat('Other > Baseline Correction > Custom(): Right edge of baseline period should be larger than left edge'); + estudioworkingmemory('ERPViewer_proces_messg',msgboxText); + viewer_ERPDAT.Process_messg =4; Str.String = ''; - fprintf(2,['\n Other > Baseline Correction > Custom() error: \n',32,msgboxText,'.\n\n']); return; end end @@ -496,7 +493,6 @@ function bsl_customedit(Str,~) %%-------------------figure background color------------------------------- function figbackcolor(Str,~) - [messgStr,viewerpanelIndex] = f_check_erpviewerpanelchanges(); if ~isempty(messgStr) && viewerpanelIndex~=7 viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; @@ -505,21 +501,22 @@ function figbackcolor(Str,~) gui_otherset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; gui_otherset_waveviewer.apply.ForegroundColor = [1 1 1]; box_erplabelset_viewer_otherset.TitleColor= [0.4940 0.1840 0.5560]; - + gui_otherset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_otherset_waveviewer.cancel.ForegroundColor = [1 1 1]; bgColor = str2num(Str.String); if isempty(bgColor) - viewer_ERPDAT.Process_messg =4; msgboxText = strcat('Other > Figure Background Color: Inputs are invalid and it should be,e.g., [1 1 1]'); - erpworkingmemory('ERPViewer_proces_messg',msgboxText); + estudioworkingmemory('ERPViewer_proces_messg',msgboxText); Str.String = num2str([1 1 1]); + viewer_ERPDAT.Process_messg =4; return; end if max(bgColor)>1 || min(bgColor) <0 || numel(bgColor)~=3 - viewer_ERPDAT.Process_messg =4; msgboxText = strcat('Other > Figure Background Color: Inputs are invalid and it should be,e.g., [1 1 1]'); - erpworkingmemory('ERPViewer_proces_messg',msgboxText); + estudioworkingmemory('ERPViewer_proces_messg',msgboxText); Str.String = num2str([1 1 1]); + viewer_ERPDAT.Process_messg =4; return; end end @@ -531,33 +528,25 @@ function other_help(~,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end MessageViewer= char(strcat('Other > Cancel')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =1; changeFlag = estudioworkingmemory('MyViewer_other'); if changeFlag~=1 MessageViewer= char(strcat('Other > Cancel')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =2; return; end - try - ERPwaviewer_apply = evalin('base','ALLERPwaviewer'); - catch - viewer_ERPDAT.Process_messg =3; - fprintf(2,'\nOther > Cancel-f_ERP_otherset_waveviewer_GUI() error: Cannot get parameters for whole panel.\n Please run My viewer again.\n\n'); - return; - end - - gui_otherset_waveviewer.polarity_up.Value=ERPwaviewer_apply.polarity;%% the polarity of wave - gui_otherset_waveviewer.polarity_down.Value = ~ERPwaviewer_apply.polarity; + gui_otherset_waveviewer.polarity_up.Value=gui_erp_waviewer.ERPwaviewer.polarity;%% the polarity of wave + gui_otherset_waveviewer.polarity_down.Value = ~gui_erp_waviewer.ERPwaviewer.polarity; %%SME - SMEActiveFlag = ERPwaviewer_apply.SEM.active; + SMEActiveFlag = gui_erp_waviewer.ERPwaviewer.SEM.active; gui_otherset_waveviewer.show_SEM.Value=SMEActiveFlag; - gui_otherset_waveviewer.SEM_custom.Value=ERPwaviewer_apply.SEM.error +1; + gui_otherset_waveviewer.SEM_custom.Value=gui_erp_waviewer.ERPwaviewer.SEM.error +1; %%trans - gui_otherset_waveviewer.SEMtrans_custom.Value = 10* ERPwaviewer_apply.SEM.trans +1; + gui_otherset_waveviewer.SEMtrans_custom.Value = 10* gui_erp_waviewer.ERPwaviewer.SEM.trans +1; if SMEActiveFlag==1 Enable = 'on'; else @@ -565,9 +554,9 @@ function other_help(~,~) end gui_otherset_waveviewer.SEM_custom.Enable = Enable; gui_otherset_waveviewer.SEMtrans_custom.Enable = Enable; - gui_otherset_waveviewer.figurebakcolor.String=num2str(ERPwaviewer_apply.figbackgdcolor); + gui_otherset_waveviewer.figurebakcolor.String=num2str(gui_erp_waviewer.ERPwaviewer.figbackgdcolor); %%baseline correction method - BslMethod = ERPwaviewer_apply.baselinecorr; + BslMethod = gui_erp_waviewer.ERPwaviewer.baselinecorr; gui_otherset_waveviewer.bsl_customedit.Enable = 'off'; gui_otherset_waveviewer.bsl_customedit.String = ''; if ischar(BslMethod) @@ -595,7 +584,6 @@ function other_help(~,~) gui_otherset_waveviewer.bsl_pre.Value=0; gui_otherset_waveviewer.bsl_post.Value=0; gui_otherset_waveviewer.bsl_whole.Value=1; - end elseif isnumeric(BslMethod) gui_otherset_waveviewer.bsl_custom.Value =1; @@ -610,8 +598,10 @@ function other_help(~,~) gui_otherset_waveviewer.apply.BackgroundColor = [1 1 1]; gui_otherset_waveviewer.apply.ForegroundColor = [0 0 0]; box_erplabelset_viewer_otherset.TitleColor= [0.5 0.5 0.9]; + gui_otherset_waveviewer.cancel.BackgroundColor = [1 1 1]; + gui_otherset_waveviewer.cancel.ForegroundColor = [0 0 0]; MessageViewer= char(strcat('Other > Cancel')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =2; end @@ -627,60 +617,53 @@ function other_apply(~,~) gui_otherset_waveviewer.apply.BackgroundColor = [1 1 1]; gui_otherset_waveviewer.apply.ForegroundColor = [0 0 0]; box_erplabelset_viewer_otherset.TitleColor= [0.5 0.5 0.9]; + gui_otherset_waveviewer.cancel.BackgroundColor = [1 1 1]; + gui_otherset_waveviewer.cancel.ForegroundColor = [0 0 0]; MessageViewer= char(strcat('Other > Apply')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =1; - try - ERPwaviewer_apply = evalin('base','ALLERPwaviewer'); - catch - viewer_ERPDAT.Process_messg =3; - fprintf(2,'\n Other > Apply-f_ERP_otherset_waveviewer_GUI() error: Cannot get parameters for whole panel.\n Please run My viewer again.\n\n'); - return; - end - ERPwaviewer_apply.polarity = gui_otherset_waveviewer.polarity_up.Value;%% the polarity of wave - MERPWaveViewer_others{1} = ERPwaviewer_apply.polarity; + + gui_erp_waviewer.ERPwaviewer.polarity = gui_otherset_waveviewer.polarity_up.Value;%% the polarity of wave + MERPWaveViewer_others{1} = gui_erp_waviewer.ERPwaviewer.polarity; %%SME - ERPwaviewer_apply.SEM.active = gui_otherset_waveviewer.show_SEM.Value; - ERPwaviewer_apply.SEM.error = gui_otherset_waveviewer.SEM_custom.Value-1; - MERPWaveViewer_others{2} = ERPwaviewer_apply.SEM.active; - MERPWaveViewer_others{3} = ERPwaviewer_apply.SEM.error; + gui_erp_waviewer.ERPwaviewer.SEM.active = gui_otherset_waveviewer.show_SEM.Value; + gui_erp_waviewer.ERPwaviewer.SEM.error = gui_otherset_waveviewer.SEM_custom.Value-1; + + MERPWaveViewer_others{2} = gui_erp_waviewer.ERPwaviewer.SEM.active; + MERPWaveViewer_others{3} = gui_erp_waviewer.ERPwaviewer.SEM.error; %%trans - ERPwaviewer_apply.SEM.trans = (gui_otherset_waveviewer.SEMtrans_custom.Value-1)/10; - MERPWaveViewer_others{4} = ERPwaviewer_apply.SEM.trans; + gui_erp_waviewer.ERPwaviewer.SEM.trans = (gui_otherset_waveviewer.SEMtrans_custom.Value-1)/10; + MERPWaveViewer_others{4} = gui_erp_waviewer.ERPwaviewer.SEM.trans; %%baseline correction - ERPwaviewer_apply.figbackgdcolor = str2num(gui_otherset_waveviewer.figurebakcolor.String); - MERPWaveViewer_others{6} = ERPwaviewer_apply.figbackgdcolor; + gui_erp_waviewer.ERPwaviewer.figbackgdcolor = str2num(gui_otherset_waveviewer.figurebakcolor.String); + MERPWaveViewer_others{6} = gui_erp_waviewer.ERPwaviewer.figbackgdcolor; %%baseline correction method if gui_otherset_waveviewer.bsl_none.Value ==1 - ERPwaviewer_apply.baselinecorr = 'none'; + gui_erp_waviewer.ERPwaviewer.baselinecorr = 'none'; elseif gui_otherset_waveviewer.bsl_pre.Value ==1 - ERPwaviewer_apply.baselinecorr = 'pre'; + gui_erp_waviewer.ERPwaviewer.baselinecorr = 'pre'; elseif gui_otherset_waveviewer.bsl_post.Value ==1 - ERPwaviewer_apply.baselinecorr = 'post'; + gui_erp_waviewer.ERPwaviewer.baselinecorr = 'post'; elseif gui_otherset_waveviewer.bsl_whole.Value ==1 - ERPwaviewer_apply.baselinecorr = 'whole'; + gui_erp_waviewer.ERPwaviewer.baselinecorr = 'whole'; elseif gui_otherset_waveviewer.bsl_custom.Value ==1 - ERPwaviewer_apply.baselinecorr = str2num(char(gui_otherset_waveviewer.bsl_customedit.String)); + gui_erp_waviewer.ERPwaviewer.baselinecorr = str2num(char(gui_otherset_waveviewer.bsl_customedit.String)); %checking the defined time-window for baselne correction - if isempty(ERPwaviewer_apply.baselinecorr)|| numel(ERPwaviewer_apply.baselinecorr)==1 - msgboxText = strcat(' Inputs must be two numbers! If you donot change it, "none" will be used for baseline correction!'); - title = 'EStudio>ERP Wave Viewer: Baseline period for "Baseline Correction" on "Other"'; - errorfound(msgboxText, title); - ERPwaviewer_apply.baselinecorr = 'none'; + if isempty(gui_erp_waviewer.ERPwaviewer.baselinecorr)|| numel(gui_erp_waviewer.ERPwaviewer.baselinecorr)==1 + msgboxText = strcat('Other > Baseline Period: Inputs must be two numbers! If you donot change it, "none" will be used for baseline correction!'); + estudioworkingmemory('ERPViewer_proces_messg',msgboxText); + viewer_ERPDAT.Process_messg =4; return; end - %%may check the left and right edges for the defined - %%time=window else - ERPwaviewer_apply.baselinecorr = 'none'; + gui_erp_waviewer.ERPwaviewer.baselinecorr = 'none'; end - MERPWaveViewer_others{5} = ERPwaviewer_apply.baselinecorr; + MERPWaveViewer_others{5} = gui_erp_waviewer.ERPwaviewer.baselinecorr; + estudioworkingmemory('MERPWaveViewer_others',MERPWaveViewer_others); - assignin('base','ALLERPwaviewer',ERPwaviewer_apply); - f_redrawERP_viewer_test(); + viewer_ERPDAT.Count_currentERP=1; viewer_ERPDAT.Process_messg =2; - estudioworkingmemory('MERPWaveViewer_others',MERPWaveViewer_others); end %%---------change this panel based on the loaded paras.-------------------- @@ -688,15 +671,8 @@ function loadproper_change(~,~) if viewer_ERPDAT.loadproper_count ~=7 return; end - try - ERPwaviewer_apply = evalin('base','ALLERPwaviewer'); - catch - beep; - disp('f_ERP_otherset_waveviewer_GUI() error: Please run the ERP wave viewer again.'); - return; - end - PolirityValue = ERPwaviewer_apply.polarity; + PolirityValue = gui_erp_waviewer.ERPwaviewer.polarity; if PolirityValue ==1 gui_otherset_waveviewer.polarity_up.Value = 1; gui_otherset_waveviewer.polarity_down.Value = 0; @@ -707,25 +683,25 @@ function loadproper_change(~,~) % %%SEM settings - SEMValue = ERPwaviewer_apply.SEM.active; + SEMValue = gui_erp_waviewer.ERPwaviewer.SEM.active; if isempty(SEMValue) || numel(SEMValue)~=1 || (SEMValue~=0 && SEMValue~=1) SEMValue=0; - ERPwaviewer_apply.SEM.active=0; + gui_erp_waviewer.ERPwaviewer.SEM.active=0; end if SEMValue==1 gui_otherset_waveviewer.show_SEM.Value =1; gui_otherset_waveviewer.SEM_custom.Enable = 'on'; gui_otherset_waveviewer.SEMtrans_custom.Enable = 'on'; - ERRORValue = ERPwaviewer_apply.SEM.error; + ERRORValue = gui_erp_waviewer.ERPwaviewer.SEM.error; if isempty(ERRORValue) || ERRORValue<=0 || ERRORValue>10 ERRORValue = 1; - ERPwaviewer_apply.SEM.error = 1; + gui_erp_waviewer.ERPwaviewer.SEM.error = 1; end gui_otherset_waveviewer.SEM_custom.Value =ERRORValue+1; - SEMTrans = ERPwaviewer_apply.SEM.trans; + SEMTrans = gui_erp_waviewer.ERPwaviewer.SEM.trans; if isempty(SEMTrans) || SEMTrans<=0 || SEMTrans>1 SEMTrans = 2; - ERPwaviewer_apply.SEM.trans = 0.2; + gui_erp_waviewer.ERPwaviewer.SEM.trans = 0.2; end gui_otherset_waveviewer.SEMtrans_custom.Value = SEMTrans*10 +1; else @@ -734,13 +710,13 @@ function loadproper_change(~,~) gui_otherset_waveviewer.SEMtrans_custom.Enable = 'off'; gui_otherset_waveviewer.SEM_custom.Value =1; gui_otherset_waveviewer.SEMtrans_custom.Value =1; - ERPwaviewer_apply.SEM.error = 0; - ERPwaviewer_apply.SEM.trans = 0; + gui_erp_waviewer.ERPwaviewer.SEM.error = 0; + gui_erp_waviewer.ERPwaviewer.SEM.trans = 0; end % %%Baseline settings - BalineCorrection = ERPwaviewer_apply.baselinecorr; + BalineCorrection = gui_erp_waviewer.ERPwaviewer.baselinecorr; if numel(BalineCorrection) ==2 if ~isnumeric(BalineCorrection) gui_otherset_waveviewer.bsl_none.Value =1; @@ -749,7 +725,7 @@ function loadproper_change(~,~) gui_otherset_waveviewer.bsl_whole.Value =0; gui_otherset_waveviewer.bsl_custom.Value = 0; gui_otherset_waveviewer.bsl_customedit.Enable = 'off'; - ERPwaviewer_apply.baselinecorr = 'none'; + gui_erp_waviewer.ERPwaviewer.baselinecorr = 'none'; else gui_otherset_waveviewer.bsl_none.Value =0; gui_otherset_waveviewer.bsl_pre.Value =0; @@ -760,7 +736,6 @@ function loadproper_change(~,~) gui_otherset_waveviewer.bsl_customedit.String = num2str(BalineCorrection); end else - if strcmpi(BalineCorrection,'pre') gui_otherset_waveviewer.bsl_none.Value =0; gui_otherset_waveviewer.bsl_pre.Value =1; @@ -795,7 +770,7 @@ function loadproper_change(~,~) % %%Background color try - BackgroundColor = ERPwaviewer_apply.figbackgdcolor; + BackgroundColor = gui_erp_waviewer.ERPwaviewer.figbackgdcolor; catch BackgroundColor = [1 1 1]; end @@ -804,18 +779,16 @@ function loadproper_change(~,~) end gui_otherset_waveviewer.figurebakcolor.String = num2str(BackgroundColor); - ERPwaviewer_apply.figbackgdcolor = BackgroundColor; - assignin('base','ALLERPwaviewer',ERPwaviewer_apply); + gui_erp_waviewer.ERPwaviewer.figbackgdcolor = BackgroundColor; viewer_ERPDAT.loadproper_count =0; %%save the reset parameters for this panel - MERPWaveViewer_others{1} = ERPwaviewer_apply.polarity; - MERPWaveViewer_others{2} = ERPwaviewer_apply.SEM.active; - MERPWaveViewer_others{3} = ERPwaviewer_apply.SEM.error; - MERPWaveViewer_others{4} = ERPwaviewer_apply.SEM.trans; - MERPWaveViewer_others{6} = ERPwaviewer_apply.figbackgdcolor; - MERPWaveViewer_others{5} = ERPwaviewer_apply.baselinecorr; + MERPWaveViewer_others{1} = gui_erp_waviewer.ERPwaviewer.polarity; + MERPWaveViewer_others{2} = gui_erp_waviewer.ERPwaviewer.SEM.active; + MERPWaveViewer_others{3} = gui_erp_waviewer.ERPwaviewer.SEM.error; + MERPWaveViewer_others{4} = gui_erp_waviewer.ERPwaviewer.SEM.trans; + MERPWaveViewer_others{6} = gui_erp_waviewer.ERPwaviewer.figbackgdcolor; + MERPWaveViewer_others{5} = gui_erp_waviewer.ERPwaviewer.baselinecorr; estudioworkingmemory('MERPWaveViewer_others',MERPWaveViewer_others); - end @@ -839,56 +812,174 @@ function count_twopanels_change(~,~) %%-----------------Reset this panel with the default parameters------------ %%------------------------------------------------------------------------- function Reset_Waviewer_panel_change(~,~) - if viewer_ERPDAT.Reset_Waviewer_panel==7 - try - ERPwaviewerin = evalin('base','ALLERPwaviewer'); - catch - beep; - disp('f_ERP_otherset_waveviewer_GUI error: Restart ERPwave Viewer'); - return; + if viewer_ERPDAT.Reset_Waviewer_panel~=7 + return; + end + gui_otherset_waveviewer.polarity_up.Value =1; + gui_otherset_waveviewer.polarity_down.Value =0; + gui_erp_waviewer.ERPwaviewer.polarity = gui_otherset_waveviewer.polarity_up.Value;%% the polarity of wave + + %%SME + gui_otherset_waveviewer.show_SEM.Value =0; + gui_erp_waviewer.ERPwaviewer.SEM.active = gui_otherset_waveviewer.show_SEM.Value; + gui_otherset_waveviewer.SEM_custom.Value =2; + gui_otherset_waveviewer.SEM_custom.Enable = 'off'; + gui_erp_waviewer.ERPwaviewer.SEM.error = gui_otherset_waveviewer.SEM_custom.Value-1; + %%trans + gui_otherset_waveviewer.SEMtrans_custom.Value =3; + gui_erp_waviewer.ERPwaviewer.SEM.trans = (gui_otherset_waveviewer.SEMtrans_custom.Value-1)/10; + gui_otherset_waveviewer.SEMtrans_custom.Enable = 'off'; + gui_otherset_waveviewer.bsl_none.Value =1; + gui_erp_waviewer.ERPwaviewer.baselinecorr = 'none'; + gui_otherset_waveviewer.bsl_pre.Value =0; + gui_otherset_waveviewer.bsl_post.Value =0; + gui_otherset_waveviewer.bsl_whole.Value =0; + gui_otherset_waveviewer.bsl_custom.Value =0; + gui_otherset_waveviewer.bsl_customedit.String = ''; + gui_otherset_waveviewer.bsl_customedit.Enable = 'off'; + gui_otherset_waveviewer.figurebakcolor.String ='1,1,1'; + gui_erp_waviewer.ERPwaviewer.figbackgdcolor =[1 1 1]; + gui_otherset_waveviewer.apply.BackgroundColor = [1 1 1]; + gui_otherset_waveviewer.apply.ForegroundColor = [0 0 0]; + box_erplabelset_viewer_otherset.TitleColor= [0.5 0.5 0.9]; + gui_otherset_waveviewer.cancel.BackgroundColor = [1 1 1]; + gui_otherset_waveviewer.cancel.ForegroundColor = [0 0 0]; + %%save the reset parameters for this panel + MERPWaveViewer_others{1} = gui_erp_waviewer.ERPwaviewer.polarity; + MERPWaveViewer_others{2} = gui_erp_waviewer.ERPwaviewer.SEM.active; + MERPWaveViewer_others{3} = gui_erp_waviewer.ERPwaviewer.SEM.error; + MERPWaveViewer_others{4} = gui_erp_waviewer.ERPwaviewer.SEM.trans; + MERPWaveViewer_others{6} = gui_erp_waviewer.ERPwaviewer.figbackgdcolor; + MERPWaveViewer_others{5} = gui_erp_waviewer.ERPwaviewer.baselinecorr; + estudioworkingmemory('MERPWaveViewer_others',MERPWaveViewer_others); + + viewer_ERPDAT.Reset_Waviewer_panel=8; + end + +%%------------------------change this panel-------------------------------- + function v_currentERP_change(~,~) + if viewer_ERPDAT.Count_currentERP~=7 + return; + end + PolirityValue = gui_erp_waviewer.ERPwaviewer.polarity; + if PolirityValue ==1 + gui_otherset_waveviewer.polarity_up.Value = 1; + gui_otherset_waveviewer.polarity_down.Value = 0; + else + gui_otherset_waveviewer.polarity_up.Value = 0; + gui_otherset_waveviewer.polarity_down.Value = 1; + end + + % + %%SEM settings + SEMValue = gui_erp_waviewer.ERPwaviewer.SEM.active; + if isempty(SEMValue) || numel(SEMValue)~=1 || (SEMValue~=0 && SEMValue~=1) + SEMValue=0; + gui_erp_waviewer.ERPwaviewer.SEM.active=0; + end + if SEMValue==1 + gui_otherset_waveviewer.show_SEM.Value =1; + gui_otherset_waveviewer.SEM_custom.Enable = 'on'; + gui_otherset_waveviewer.SEMtrans_custom.Enable = 'on'; + ERRORValue = gui_erp_waviewer.ERPwaviewer.SEM.error; + if isempty(ERRORValue) || ERRORValue<=0 || ERRORValue>10 + ERRORValue = 1; + gui_erp_waviewer.ERPwaviewer.SEM.error = 1; end - - gui_otherset_waveviewer.polarity_up.Value =1; - gui_otherset_waveviewer.polarity_down.Value =0; - ERPwaviewerin.polarity = gui_otherset_waveviewer.polarity_up.Value;%% the polarity of wave - - %%SME + gui_otherset_waveviewer.SEM_custom.Value =ERRORValue+1; + SEMTrans = gui_erp_waviewer.ERPwaviewer.SEM.trans; + if isempty(SEMTrans) || SEMTrans<=0 || SEMTrans>1 + SEMTrans = 2; + gui_erp_waviewer.ERPwaviewer.SEM.trans = 0.2; + end + gui_otherset_waveviewer.SEMtrans_custom.Value = SEMTrans*10 +1; + else gui_otherset_waveviewer.show_SEM.Value =0; - ERPwaviewerin.SEM.active = gui_otherset_waveviewer.show_SEM.Value; - gui_otherset_waveviewer.SEM_custom.Value =2; gui_otherset_waveviewer.SEM_custom.Enable = 'off'; - ERPwaviewerin.SEM.error = gui_otherset_waveviewer.SEM_custom.Value-1; - %%trans - gui_otherset_waveviewer.SEMtrans_custom.Value =3; - ERPwaviewerin.SEM.trans = (gui_otherset_waveviewer.SEMtrans_custom.Value-1)/10; gui_otherset_waveviewer.SEMtrans_custom.Enable = 'off'; - gui_otherset_waveviewer.bsl_none.Value =1; - ERPwaviewerin.baselinecorr = 'none'; - gui_otherset_waveviewer.bsl_pre.Value =0; - gui_otherset_waveviewer.bsl_post.Value =0; - gui_otherset_waveviewer.bsl_whole.Value =0; - gui_otherset_waveviewer.bsl_custom.Value =0; - gui_otherset_waveviewer.bsl_customedit.String = ''; - gui_otherset_waveviewer.bsl_customedit.Enable = 'off'; - gui_otherset_waveviewer.figurebakcolor.String ='1,1,1'; - ERPwaviewerin.figbackgdcolor =[1 1 1]; - assignin('base','ALLERPwaviewer',ERPwaviewerin); - gui_otherset_waveviewer.apply.BackgroundColor = [1 1 1]; - gui_otherset_waveviewer.apply.ForegroundColor = [0 0 0]; - box_erplabelset_viewer_otherset.TitleColor= [0.5 0.5 0.9]; - - %%save the reset parameters for this panel - MERPWaveViewer_others{1} = ERPwaviewerin.polarity; - MERPWaveViewer_others{2} = ERPwaviewerin.SEM.active; - MERPWaveViewer_others{3} = ERPwaviewerin.SEM.error; - MERPWaveViewer_others{4} = ERPwaviewerin.SEM.trans; - MERPWaveViewer_others{6} = ERPwaviewerin.figbackgdcolor; - MERPWaveViewer_others{5} = ERPwaviewerin.baselinecorr; - estudioworkingmemory('MERPWaveViewer_others',MERPWaveViewer_others); end + gui_erp_waviewer.ERPwaviewer.SEM.error = gui_otherset_waveviewer.SEM_custom.Value-1; + gui_erp_waviewer.ERPwaviewer.SEM.trans = (gui_otherset_waveviewer.SEMtrans_custom.Value-1)/10; + % + %%Baseline settings + BalineCorrection = gui_erp_waviewer.ERPwaviewer.baselinecorr; + if numel(BalineCorrection) ==2 + if ~isnumeric(BalineCorrection) + gui_otherset_waveviewer.bsl_none.Value =1; + gui_otherset_waveviewer.bsl_pre.Value =0; + gui_otherset_waveviewer.bsl_post.Value =0; + gui_otherset_waveviewer.bsl_whole.Value =0; + gui_otherset_waveviewer.bsl_custom.Value = 0; + gui_otherset_waveviewer.bsl_customedit.Enable = 'off'; + gui_erp_waviewer.ERPwaviewer.baselinecorr = 'none'; + else + gui_otherset_waveviewer.bsl_none.Value =0; + gui_otherset_waveviewer.bsl_pre.Value =0; + gui_otherset_waveviewer.bsl_post.Value =0; + gui_otherset_waveviewer.bsl_whole.Value =0; + gui_otherset_waveviewer.bsl_custom.Value = 1; + gui_otherset_waveviewer.bsl_customedit.Enable = 'on'; + gui_otherset_waveviewer.bsl_customedit.String = num2str(BalineCorrection); + end + else + if strcmpi(BalineCorrection,'pre') + gui_otherset_waveviewer.bsl_none.Value =0; + gui_otherset_waveviewer.bsl_pre.Value =1; + gui_otherset_waveviewer.bsl_post.Value =0; + gui_otherset_waveviewer.bsl_whole.Value =0; + gui_otherset_waveviewer.bsl_custom.Value = 0; + gui_otherset_waveviewer.bsl_customedit.Enable = 'off'; + elseif strcmpi(BalineCorrection,'post') + gui_otherset_waveviewer.bsl_none.Value =0; + gui_otherset_waveviewer.bsl_pre.Value =0; + gui_otherset_waveviewer.bsl_post.Value =1; + gui_otherset_waveviewer.bsl_whole.Value =0; + gui_otherset_waveviewer.bsl_custom.Value = 0; + gui_otherset_waveviewer.bsl_customedit.Enable = 'off'; + elseif strcmpi(BalineCorrection,'all') || strcmpi(BalineCorrection,'whole') + gui_otherset_waveviewer.bsl_none.Value =0; + gui_otherset_waveviewer.bsl_pre.Value =0; + gui_otherset_waveviewer.bsl_post.Value =0; + gui_otherset_waveviewer.bsl_whole.Value =1; + gui_otherset_waveviewer.bsl_custom.Value = 0; + gui_otherset_waveviewer.bsl_customedit.Enable = 'off'; + else + gui_otherset_waveviewer.bsl_none.Value =1; + gui_otherset_waveviewer.bsl_pre.Value =0; + gui_otherset_waveviewer.bsl_post.Value =0; + gui_otherset_waveviewer.bsl_whole.Value =0; + gui_otherset_waveviewer.bsl_custom.Value = 0; + gui_otherset_waveviewer.bsl_customedit.Enable = 'off'; + end + end + + % + %%Background color + try + BackgroundColor = gui_erp_waviewer.ERPwaviewer.figbackgdcolor; + catch + BackgroundColor = [1 1 1]; + end + if isempty(BackgroundColor) || numel(BackgroundColor)~=3 || max(BackgroundColor)>1 ||min (BackgroundColor)<0 + BackgroundColor = [1 1 1]; + end + gui_otherset_waveviewer.figurebakcolor.String = num2str(BackgroundColor); + + gui_erp_waviewer.ERPwaviewer.figbackgdcolor = BackgroundColor; + viewer_ERPDAT.loadproper_count =0; + %%save the reset parameters for this panel + MERPWaveViewer_others{1} = gui_erp_waviewer.ERPwaviewer.polarity; + MERPWaveViewer_others{2} = gui_erp_waviewer.ERPwaviewer.SEM.active; + MERPWaveViewer_others{3} = gui_erp_waviewer.ERPwaviewer.SEM.error; + MERPWaveViewer_others{4} = gui_erp_waviewer.ERPwaviewer.SEM.trans; + MERPWaveViewer_others{6} = gui_erp_waviewer.ERPwaviewer.figbackgdcolor; + MERPWaveViewer_others{5} = gui_erp_waviewer.ERPwaviewer.baselinecorr; + estudioworkingmemory('MERPWaveViewer_others',MERPWaveViewer_others); + viewer_ERPDAT.Count_currentERP=8; end +%%----------------------execute "apply"------------------------------------ function otherset_presskey(hObject, eventdata) keypress = eventdata.Key; if strcmp (keypress, 'return') || strcmp (keypress , 'enter') @@ -897,6 +988,8 @@ function otherset_presskey(hObject, eventdata) gui_otherset_waveviewer.apply.BackgroundColor = [1 1 1]; gui_otherset_waveviewer.apply.ForegroundColor = [0 0 0]; box_erplabelset_viewer_otherset.TitleColor= [0.5 0.5 0.9]; + gui_otherset_waveviewer.cancel.BackgroundColor = [1 1 1]; + gui_otherset_waveviewer.cancel.ForegroundColor = [0 0 0]; else return; end diff --git a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ERP_plotorg_waveviewer_GUI.m b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ERP_plotorg_waveviewer_GUI.m index 9abe70a5..76d75ca5 100755 --- a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ERP_plotorg_waveviewer_GUI.m +++ b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ERP_plotorg_waveviewer_GUI.m @@ -5,13 +5,13 @@ % Center for Mind and Brain % University of California, Davis, % Davis, CA -% 2022 +% 2022 && Nov. 2023 function varargout = f_ERP_plotorg_waveviewer_GUI(varargin) global viewer_ERPDAT - +global gui_erp_waviewer; addlistener(viewer_ERPDAT,'v_currentERP_change',@v_currentERP_change); addlistener(viewer_ERPDAT,'loadproper_change',@loadproper_change); addlistener(viewer_ERPDAT,'count_twopanels_change',@count_twopanels_change); @@ -51,15 +51,10 @@ function drawui_plot_org(FonsizeDefault) [version reldate,ColorB_def,ColorF_def,errorColorF_def] = geterplabstudiodef; - try - ERPwaviewerin = evalin('base','ALLERPwaviewer'); - ALLERP = ERPwaviewerin.ALLERP; - indexerp = ERPwaviewerin.SelectERPIdx; - catch - beep; - disp('f_ERP_plotorg_waveviewer_GUI() error: Please run the ERP wave viewer again.'); - return; - end + + ALLERP = gui_erp_waviewer.ERPwaviewer.ALLERP; + indexerp = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + for Numofselectederp = 1:numel(indexerp) SrateNum_mp(Numofselectederp,1) = ALLERP(indexerp(Numofselectederp)).srate; @@ -76,10 +71,24 @@ function drawui_plot_org(FonsizeDefault) plotorg_Index=1; MERPWaveViewer_plotorg{1}=1; end + ERPtooltype = erpgettoolversion('tooltype'); + if strcmpi(ERPtooltype,'EStudio') + ERPTab_plotset_pars= estudioworkingmemory('ERPTab_plotset_pars'); + try + overlay = ERPTab_plotset_pars{7}; + catch + overlay=0; + end + if overlay==0 + plotorg_Index=1; + else + plotorg_Index=3; + end + end if numel(unique(SrateNum_mp))~=1 && (plotorg_Index~=1 && plotorg_Index~=3) MessageViewer= char(strcat('Plot Organization - We will use "Channels,Bins, ERPsets" because Sampling rate varies across the selected ERPsets')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =4; plotorg_Index=1; MERPWaveViewer_plotorg{1}=1; @@ -181,9 +190,9 @@ function drawui_plot_org(FonsizeDefault) elseif gui_plotorg_waveviewer.plotorg_c6.Value ==1 GridValue=3; OverlayValue = 2; PageValue =1; end - ERPwaviewerin.plot_org.Grid = GridValue; - ERPwaviewerin.plot_org.Overlay = OverlayValue; - ERPwaviewerin.plot_org.Pages =PageValue; + gui_erp_waviewer.ERPwaviewer.plot_org.Grid = GridValue; + gui_erp_waviewer.ERPwaviewer.plot_org.Overlay = OverlayValue; + gui_erp_waviewer.ERPwaviewer.plot_org.Pages =PageValue; gui_plotorg_waveviewer.LayoutFlag = plotorg_Value; %%----------------------Setting for grid layout------------------- @@ -209,13 +218,13 @@ function drawui_plot_org(FonsizeDefault) 'callback',@layout_custom,'FontSize',FonsizeDefault,'BackgroundColor',ColorBviewer_def,'Value',~gridlayoutValue); % gui_plotorg_waveviewer.layout_custom.KeyPressFcn = @plotorg_presskey; set(gui_plotorg_waveviewer.layout_title, 'Sizes',[90 60 70]); - ERPwaviewerin.plot_org.gridlayout.op = gui_plotorg_waveviewer.layout_auto.Value; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.op = gui_plotorg_waveviewer.layout_auto.Value; %%NUmber of rows and columns - binArray = ERPwaviewerin.bin; - chanArray = ERPwaviewerin.chan; - ERPsetArray = ERPwaviewerin.SelectERPIdx; - ALLERPIN = ERPwaviewerin.ALLERP; + binArray = gui_erp_waviewer.ERPwaviewer.bin; + chanArray = gui_erp_waviewer.ERPwaviewer.chan; + ERPsetArray = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + ALLERPIN = gui_erp_waviewer.ERPwaviewer.ALLERP; if max(ERPsetArray) >length(ALLERPIN) ERPsetArray =length(ALLERPIN); end @@ -250,6 +259,10 @@ function drawui_plot_org(FonsizeDefault) plotBox = plotBoxdef; MERPWaveViewer_plotorg{3}=plotBox; end + if gui_plotorg_waveviewer.layout_auto.Value==1 + plotBox = plotBoxdef; + MERPWaveViewer_plotorg{3}=plotBox; + end if isempty(plotBox) || numel(plotBox)~=2 || min(plotBox(:))<1 || max(plotBox(:))>256 plotBox = plotBoxdef; MERPWaveViewer_plotorg{3}=plotBox; @@ -283,8 +296,8 @@ function drawui_plot_org(FonsizeDefault) 'callback',@plotorg_columnnum,'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1],'Value',Numcolumns,'Enable',rowcolumnEnable); % 1B gui_plotorg_waveviewer.columnnum.KeyPressFcn = @plotorg_presskey; set(gui_plotorg_waveviewer.row_column_title, 'Sizes',[20 35 65 55 65]); - ERPwaviewerin.plot_org.gridlayout.rows = gui_plotorg_waveviewer.rownum.Value; - ERPwaviewerin.plot_org.gridlayout.columns =gui_plotorg_waveviewer.columnnum.Value; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rows = gui_plotorg_waveviewer.rownum.Value; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columns =gui_plotorg_waveviewer.columnnum.Value; %%-------------------------Grid information------------------------ count = 0; @@ -298,10 +311,10 @@ function drawui_plot_org(FonsizeDefault) end end end - ERPwaviewerin.plot_org.gridlayout.data =GridinforData; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.data =GridinforData; columFormat = plotArrayFormt'; - ERPwaviewerin.plot_org.gridlayout.columFormat = columFormat; - % ERPwaviewerin.plot_org.gridlayout.columFormatOrig = columFormat; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columFormat = columFormat; + % gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columFormatOrig = columFormat; %%---------------------Gap between rows---------------------------- try @@ -357,8 +370,8 @@ function drawui_plot_org(FonsizeDefault) gui_plotorg_waveviewer.rowgapGTPcustom.String = '10'; end set(gui_plotorg_waveviewer.rowgap_title, 'Sizes',[60 90 85]); - ERPwaviewerin.plot_org.gridlayout.rowgap.GTPOP = gui_plotorg_waveviewer.rowgap_auto.Value; - ERPwaviewerin.plot_org.gridlayout.rowgap.GTPValue = str2num(gui_plotorg_waveviewer.rowgapGTPcustom.String); + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.GTPOP = gui_plotorg_waveviewer.rowgap_auto.Value; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.GTPValue = str2num(gui_plotorg_waveviewer.rowgapGTPcustom.String); try RowoverlayStr= MERPWaveViewer_plotorg{6}; @@ -382,8 +395,8 @@ function drawui_plot_org(FonsizeDefault) 'callback',@rowoverlapcustom,'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1],'Enable',RowgapOVERLAPEnable); % gui_plotorg_waveviewer.rowgapoverlayedit.KeyPressFcn = @plotorg_presskey; set(gui_plotorg_waveviewer.rowgapcustom_title, 'Sizes',[60 90 85]); - ERPwaviewerin.plot_org.gridlayout.rowgap.OverlayOP = gui_plotorg_waveviewer.rowoverlap.Value; - ERPwaviewerin.plot_org.gridlayout.rowgap.OverlayValue = str2num(gui_plotorg_waveviewer.rowgapoverlayedit.String); + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.OverlayOP = gui_plotorg_waveviewer.rowoverlap.Value; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.OverlayValue = str2num(gui_plotorg_waveviewer.rowgapoverlayedit.String); %%---------------------Gap between columns------------------------ try @@ -433,8 +446,8 @@ function drawui_plot_org(FonsizeDefault) gui_plotorg_waveviewer.columngapgtpcustom.String = '10'; end set(gui_plotorg_waveviewer.columngap_title, 'Sizes',[60 90 85]); - ERPwaviewerin.plot_org.gridlayout.columngap.GTPOP = gui_plotorg_waveviewer.columngapgtpop.Value; - ERPwaviewerin.plot_org.gridlayout.columngap.GTPValue = str2num(gui_plotorg_waveviewer.columngapgtpcustom.String); + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.GTPOP = gui_plotorg_waveviewer.columngapgtpop.Value; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.GTPValue = str2num(gui_plotorg_waveviewer.columngapgtpcustom.String); try columnoverlayStr = MERPWaveViewer_plotorg{9}; catch @@ -464,8 +477,8 @@ function drawui_plot_org(FonsizeDefault) 'callback',@columnoverlaycustom,'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1],'Enable',columngapOVERLAPEnable); % gui_plotorg_waveviewer.columngapoverlapedit.KeyPressFcn = @plotorg_presskey; set(gui_plotorg_waveviewer.columngapcustom_title, 'Sizes',[60 90 85]); - ERPwaviewerin.plot_org.gridlayout.columngap.OverlayOP = gui_plotorg_waveviewer.columnoverlay.Value; - ERPwaviewerin.plot_org.gridlayout.columngap.OverlayValue = str2num(gui_plotorg_waveviewer.columngapoverlapedit.String); + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.OverlayOP = gui_plotorg_waveviewer.columnoverlay.Value; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.OverlayValue = str2num(gui_plotorg_waveviewer.columngapoverlapedit.String); %%---------------help and apply the changed parameters------------- try @@ -491,7 +504,7 @@ function drawui_plot_org(FonsizeDefault) end set( gui_plotorg_waveviewer.editgridlayout_title,'Sizes',[150 60]); MERPWaveViewer_plotorg{10}=gui_plotorg_waveviewer.layout_custom_edit_checkbox.Value; - ERPwaviewerin.plot_org.gridlayout.GridLayoutAuto=gui_plotorg_waveviewer.layout_custom_edit_checkbox.Value; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.GridLayoutAuto=gui_plotorg_waveviewer.layout_custom_edit_checkbox.Value; gui_plotorg_waveviewer.help_run_title = uiextras.HBox('Parent', gui_plotorg_waveviewer.DataSelBox,'BackgroundColor',ColorBviewer_def); @@ -509,8 +522,8 @@ function drawui_plot_org(FonsizeDefault) set(gui_plotorg_waveviewer.DataSelBox,'Sizes',[150 25 25 25 25 25 25 25 25]); gui_plotorg_waveviewer.columFormatStr = ''; - assignin('base','ALLERPwaviewer',ERPwaviewerin); estudioworkingmemory('MERPWaveViewer_plotorg',MERPWaveViewer_plotorg);%%save parameters for this panel to memory file + estudioworkingmemory('MyViewer_plotorg',0); end @@ -524,27 +537,21 @@ function plotorg_c1(source,~) if ~isempty(messgStr) && viewerpanelIndex~=4 viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end - try - ERPwaviewerin = evalin('base','ALLERPwaviewer'); - ALLERP = ERPwaviewerin.ALLERP; - indexerp = ERPwaviewerin.SelectERPIdx; - catch - beep; - disp('f_ERP_plotorg_waveviewer_GUI() error: Please run the ERP wave viewer again.'); - return; - end + ALLERP = gui_erp_waviewer.ERPwaviewer.ALLERP; + indexerp = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + for Numofselectederp = 1:numel(indexerp) SrateNum_mp(Numofselectederp,1) = ALLERP(indexerp(Numofselectederp)).srate; Datype{Numofselectederp} = ALLERP(indexerp(Numofselectederp)).datatype; end if length(unique(Datype))~=1 || (numel(indexerp)==1 && strcmpi(char(Datype),'ERP')~=1) MessageViewer= char(strcat('Warning: Type of data varies across ERPsets. We only plot waves for ERPset')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =4; return; end try - GridValueOld = ERPwaviewerin.plot_org.Grid; + GridValueOld = gui_erp_waviewer.ERPwaviewer.plot_org.Grid; catch GridValueOld=1; end @@ -557,7 +564,7 @@ function plotorg_c1(source,~) gui_plotorg_waveviewer.plotorg_c6.Enable = 'off'; if y_Flag~=1 && y_Flag~= 3 MessageViewer= char(strcat('Sampling rate varies across ERPsets. Please select the first or third options')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =4; gui_plotorg_waveviewer.plotorg_c1.Value = 1; gui_plotorg_waveviewer.plotorg_c2.Value = 0; @@ -601,9 +608,7 @@ function plotorg_c1(source,~) end estudioworkingmemory('MyViewer_plotorg',1); - gui_plotorg_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_plotorg_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpwave_viewer_plotorg.TitleColor= [0.4940 0.1840 0.5560]; + track_changes_title_color(); gui_plotorg_waveviewer.plotorg_c1.Value = 1; gui_plotorg_waveviewer.plotorg_c2.Value = 0; @@ -613,7 +618,7 @@ function plotorg_c1(source,~) gui_plotorg_waveviewer.plotorg_c6.Value = 0; gui_plotorg_waveviewer.LayoutFlag = [1,0,0,0,0,0]; try - chanArray = ERPwaviewerin.chan; + chanArray = gui_erp_waviewer.ERPwaviewer.chan; plotArray = chanArray; plotBox = f_getrow_columnautowaveplot(plotArray);%% the first element is number of rows and the second element is the number of columns catch @@ -624,7 +629,6 @@ function plotorg_c1(source,~) gui_plotorg_waveviewer.layout_custom.Value = 0; gui_plotorg_waveviewer.rownum.Enable = 'off'; gui_plotorg_waveviewer.columnnum.Enable = 'off'; - gui_plotorg_waveviewer.rowgap_auto.Value = 1; gui_plotorg_waveviewer.rowgap_auto.Enable = 'off'; gui_plotorg_waveviewer.rowgapGTPcustom.String = '10'; @@ -659,27 +663,21 @@ function plotorg_c2(source,~) if ~isempty(messgStr) && viewerpanelIndex~=4 viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end - try - ERPwaviewerin = evalin('base','ALLERPwaviewer'); - ALLERP = ERPwaviewerin.ALLERP; - indexerp = ERPwaviewerin.SelectERPIdx; - catch - beep; - disp('f_ERP_plotorg_waveviewer_GUI() error: Please run the ERP wave viewer again.'); - return; - end + ALLERP = gui_erp_waviewer.ERPwaviewer.ALLERP; + indexerp = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + for Numofselectederp = 1:numel(indexerp) SrateNum_mp(Numofselectederp,1) = ALLERP(indexerp(Numofselectederp)).srate; Datype{Numofselectederp} = ALLERP(indexerp(Numofselectederp)).datatype; end if length(unique(Datype))~=1 || (numel(indexerp)==1 && strcmpi(char(Datype),'ERP')~=1) MessageViewer= char(strcat('Type of data varies across ERPsets. We only plot waves for ERPset')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =4; return; end try - GridValueOld = ERPwaviewerin.plot_org.Grid; + GridValueOld = gui_erp_waviewer.ERPwaviewer.plot_org.Grid; catch GridValueOld=1; end @@ -693,7 +691,7 @@ function plotorg_c2(source,~) gui_plotorg_waveviewer.plotorg_c6.Enable = 'off'; if y_Flag~=1 && y_Flag~= 3 MessageViewer= char(strcat('Sampling rate varies across ERPsets. Please select the first or third options')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =4; gui_plotorg_waveviewer.plotorg_c1.Value = 1; gui_plotorg_waveviewer.plotorg_c2.Value = 0; @@ -739,10 +737,7 @@ function plotorg_c2(source,~) end estudioworkingmemory('MyViewer_plotorg',1); - gui_plotorg_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_plotorg_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpwave_viewer_plotorg.TitleColor= [0.4940 0.1840 0.5560]; - + track_changes_title_color(); gui_plotorg_waveviewer.plotorg_c1.Value = 0; gui_plotorg_waveviewer.plotorg_c2.Value = 1; gui_plotorg_waveviewer.plotorg_c3.Value = 0; @@ -750,7 +745,7 @@ function plotorg_c2(source,~) gui_plotorg_waveviewer.plotorg_c5.Value = 0; gui_plotorg_waveviewer.plotorg_c6.Value = 0; gui_plotorg_waveviewer.LayoutFlag = [0,1,0,0,0,0]; - chanArray = ERPwaviewerin.chan; + chanArray = gui_erp_waviewer.ERPwaviewer.chan; try plotArray = chanArray; plotBox = f_getrow_columnautowaveplot(plotArray);%% the first element is number of rows and the second element is the number of columns @@ -787,7 +782,6 @@ function plotorg_c2(source,~) catch end end - estudioworkingmemory('OverlayIndex',1); end @@ -797,27 +791,21 @@ function plotorg_c3(source,~) if ~isempty(messgStr) && viewerpanelIndex~=4 viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end - try - ERPwaviewerin = evalin('base','ALLERPwaviewer'); - ALLERP = ERPwaviewerin.ALLERP; - indexerp = ERPwaviewerin.SelectERPIdx; - catch - beep; - disp('f_ERP_plotorg_waveviewer_GUI() error: Please run the ERP wave viewer again.'); - return; - end + ALLERP = gui_erp_waviewer.ERPwaviewer.ALLERP; + indexerp = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + for Numofselectederp = 1:numel(indexerp) SrateNum_mp(Numofselectederp,1) = ALLERP(indexerp(Numofselectederp)).srate; Datype{Numofselectederp} = ALLERP(indexerp(Numofselectederp)).datatype; end if length(unique(Datype))~=1 || (numel(indexerp)==1 && strcmpi(char(Datype),'ERP')~=1) MessageViewer= char(strcat('Warning: Type of data varies across ERPsets. We only plot waves for ERPset')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =4; return; end try - GridValueOld = ERPwaviewerin.plot_org.Grid; + GridValueOld = gui_erp_waviewer.ERPwaviewer.plot_org.Grid; catch GridValueOld=1; end @@ -831,7 +819,7 @@ function plotorg_c3(source,~) gui_plotorg_waveviewer.plotorg_c6.Enable = 'off'; if y_Flag~=1 && y_Flag~=3 MessageViewer= char(strcat('Sampling rate varies across ERPsets. Please select the first or third options')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =4; gui_plotorg_waveviewer.plotorg_c1.Value = 1; gui_plotorg_waveviewer.plotorg_c2.Value = 0; @@ -845,7 +833,6 @@ function plotorg_c3(source,~) gui_plotorg_waveviewer.layout_custom.Value = 0; gui_plotorg_waveviewer.rownum.Enable = 'off'; gui_plotorg_waveviewer.columnnum.Enable = 'off'; - gui_plotorg_waveviewer.rowgap_auto.Value = 1; gui_plotorg_waveviewer.rowgap_auto.Enable = 'off'; gui_plotorg_waveviewer.rowgapGTPcustom.String = '10'; @@ -875,10 +862,7 @@ function plotorg_c3(source,~) end estudioworkingmemory('MyViewer_plotorg',1); - gui_plotorg_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_plotorg_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpwave_viewer_plotorg.TitleColor= [0.4940 0.1840 0.5560]; - + track_changes_title_color(); gui_plotorg_waveviewer.plotorg_c1.Value = 0; gui_plotorg_waveviewer.plotorg_c2.Value = 0; gui_plotorg_waveviewer.plotorg_c3.Value = 1; @@ -887,7 +871,7 @@ function plotorg_c3(source,~) gui_plotorg_waveviewer.plotorg_c6.Value = 0; gui_plotorg_waveviewer.LayoutFlag = [0,0,1,0,0,0]; try - plotArray = ERPwaviewerin.bin; + plotArray = gui_erp_waviewer.ERPwaviewer.bin; plotBox = f_getrow_columnautowaveplot(plotArray);%% the first element is number of rows and the second element is the number of columns catch plotBox = [1 1]; @@ -897,7 +881,6 @@ function plotorg_c3(source,~) gui_plotorg_waveviewer.layout_custom.Value = 0; gui_plotorg_waveviewer.rownum.Enable = 'off'; gui_plotorg_waveviewer.columnnum.Enable = 'off'; - gui_plotorg_waveviewer.rowgap_auto.Value = 1; gui_plotorg_waveviewer.rowgap_auto.Enable = 'off'; gui_plotorg_waveviewer.rowgapGTPcustom.String = '10'; @@ -922,7 +905,6 @@ function plotorg_c3(source,~) catch end end - estudioworkingmemory('OverlayIndex',1); end @@ -933,29 +915,21 @@ function plotorg_c4(source,~) if ~isempty(messgStr) && viewerpanelIndex~=4 viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end - - try - ERPwaviewerin = evalin('base','ALLERPwaviewer'); - ALLERP = ERPwaviewerin.ALLERP; - indexerp = ERPwaviewerin.SelectERPIdx; - catch - beep; - disp('f_ERP_plotorg_waveviewer_GUI() error: Please run the ERP wave viewer again.'); - return; - end + ALLERP = gui_erp_waviewer.ERPwaviewer.ALLERP; + indexerp = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; for Numofselectederp = 1:numel(indexerp) SrateNum_mp(Numofselectederp,1) = ALLERP(indexerp(Numofselectederp)).srate; Datype{Numofselectederp} = ALLERP(indexerp(Numofselectederp)).datatype; end if length(unique(Datype))~=1 || (numel(indexerp)==1 && strcmpi(char(Datype),'ERP')~=1) MessageViewer= char(strcat('Warning: Type of data varies across ERPsets. We only plot waves for ERPset')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =4; return; end try - GridValueOld = ERPwaviewerin.plot_org.Grid; + GridValueOld = gui_erp_waviewer.ERPwaviewer.plot_org.Grid; catch GridValueOld=1; end @@ -968,7 +942,7 @@ function plotorg_c4(source,~) gui_plotorg_waveviewer.plotorg_c6.Enable = 'off'; if y_Flag~=1 && y_Flag~= 3 MessageViewer= char(strcat('Sampling rate varies across ERPsets. Please select the first or third options')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =4; gui_plotorg_waveviewer.plotorg_c1.Value = 1; gui_plotorg_waveviewer.plotorg_c2.Value = 0; @@ -1013,10 +987,7 @@ function plotorg_c4(source,~) end estudioworkingmemory('MyViewer_plotorg',1); - gui_plotorg_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_plotorg_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpwave_viewer_plotorg.TitleColor= [0.4940 0.1840 0.5560]; - + track_changes_title_color(); gui_plotorg_waveviewer.plotorg_c1.Value = 0; gui_plotorg_waveviewer.plotorg_c2.Value = 0; gui_plotorg_waveviewer.plotorg_c3.Value = 0; @@ -1025,7 +996,7 @@ function plotorg_c4(source,~) gui_plotorg_waveviewer.plotorg_c6.Value = 0; gui_plotorg_waveviewer.LayoutFlag = [0,0,0,1,0,0]; try - plotArray = ERPwaviewerin.bin; + plotArray = gui_erp_waviewer.ERPwaviewer.bin; plotBox = f_getrow_columnautowaveplot(plotArray);%% the first element is number of rows and the second element is the number of columns catch plotBox = [1 1]; @@ -1062,8 +1033,6 @@ function plotorg_c4(source,~) end end estudioworkingmemory('OverlayIndex',1); - - end @@ -1074,27 +1043,21 @@ function plotorg_c5(source,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end - try - ERPwaviewerin = evalin('base','ALLERPwaviewer'); - ALLERP = ERPwaviewerin.ALLERP; - indexerp = ERPwaviewerin.SelectERPIdx; - catch - beep; - disp('f_ERP_plotorg_waveviewer_GUI() error: Please run the ERP wave viewer again.'); - return; - end + ALLERP = gui_erp_waviewer.ERPwaviewer.ALLERP; + indexerp = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + for Numofselectederp = 1:numel(indexerp) SrateNum_mp(Numofselectederp,1) = ALLERP(indexerp(Numofselectederp)).srate; Datype{Numofselectederp} = ALLERP(indexerp(Numofselectederp)).datatype; end if length(unique(Datype))~=1 || (numel(indexerp)==1 && strcmpi(char(Datype),'ERP')~=1) MessageViewer= char(strcat('Warning: Type of data varies across ERPsets. We only plot waves for ERPset')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =4; return; end try - GridValueOld = ERPwaviewerin.plot_org.Grid; + GridValueOld = gui_erp_waviewer.ERPwaviewer.plot_org.Grid; catch GridValueOld=1; end @@ -1107,7 +1070,7 @@ function plotorg_c5(source,~) gui_plotorg_waveviewer.plotorg_c6.Enable = 'off'; if y_Flag~=1 && y_Flag~= 3 MessageViewer= char(strcat('Sampling rate varies across ERPsets. Please select the first or third options')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =4; gui_plotorg_waveviewer.plotorg_c1.Value = 1; gui_plotorg_waveviewer.plotorg_c2.Value = 0; @@ -1152,10 +1115,7 @@ function plotorg_c5(source,~) end estudioworkingmemory('MyViewer_plotorg',1); - gui_plotorg_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_plotorg_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpwave_viewer_plotorg.TitleColor= [0.4940 0.1840 0.5560]; - + track_changes_title_color(); gui_plotorg_waveviewer.plotorg_c1.Value = 0; gui_plotorg_waveviewer.plotorg_c2.Value = 0; gui_plotorg_waveviewer.plotorg_c3.Value = 0; @@ -1201,7 +1161,6 @@ function plotorg_c5(source,~) end end estudioworkingmemory('OverlayIndex',1); - end @@ -1211,28 +1170,20 @@ function plotorg_c6(source,~) if ~isempty(messgStr) && viewerpanelIndex~=4 viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end - - try - ERPwaviewerin = evalin('base','ALLERPwaviewer'); - ALLERP = ERPwaviewerin.ALLERP; - indexerp = ERPwaviewerin.SelectERPIdx; - catch - beep; - disp('f_ERP_plotorg_waveviewer_GUI() error: Please run the ERP wave viewer again.'); - return; - end + ALLERP = gui_erp_waviewer.ERPwaviewer.ALLERP; + indexerp = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; for Numofselectederp = 1:numel(indexerp) SrateNum_mp(Numofselectederp,1) = ALLERP(indexerp(Numofselectederp)).srate; Datype{Numofselectederp} = ALLERP(indexerp(Numofselectederp)).datatype; end if length(unique(Datype))~=1 || (numel(indexerp)==1 && strcmpi(char(Datype),'ERP')~=1) MessageViewer= char(strcat('Warning: Type of data varies across ERPsets. We only plot waves for ERPset')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =4; return; end try - GridValueOld = ERPwaviewerin.plot_org.Grid; + GridValueOld = gui_erp_waviewer.ERPwaviewer.plot_org.Grid; catch GridValueOld=1; end @@ -1245,7 +1196,7 @@ function plotorg_c6(source,~) gui_plotorg_waveviewer.plotorg_c6.Enable = 'off'; if y_Flag~=1 && y_Flag~= 3 MessageViewer= char(strcat('Sampling rate varies across ERPsets. Please select the first or third options')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =4; gui_plotorg_waveviewer.plotorg_c1.Value = 1; gui_plotorg_waveviewer.plotorg_c2.Value = 0; @@ -1291,12 +1242,8 @@ function plotorg_c6(source,~) gui_plotorg_waveviewer.plotorg_c6.Enable = 'on'; end - estudioworkingmemory('MyViewer_plotorg',1); - gui_plotorg_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_plotorg_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpwave_viewer_plotorg.TitleColor= [0.4940 0.1840 0.5560]; - + track_changes_title_color(); gui_plotorg_waveviewer.plotorg_c1.Value = 0; gui_plotorg_waveviewer.plotorg_c2.Value = 0; gui_plotorg_waveviewer.plotorg_c3.Value = 0; @@ -1354,7 +1301,8 @@ function layout_auto(~,~) gui_plotorg_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; gui_plotorg_waveviewer.apply.ForegroundColor = [1 1 1]; box_erpwave_viewer_plotorg.TitleColor= [0.4940 0.1840 0.5560]; - + gui_plotorg_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_plotorg_waveviewer.cancel.ForegroundColor = [1 1 1]; gui_plotorg_waveviewer.layout_auto.Value =1; gui_plotorg_waveviewer.layout_custom.Value = 0; gui_plotorg_waveviewer.rownum.Enable = 'off'; @@ -1375,6 +1323,61 @@ function layout_auto(~,~) gui_plotorg_waveviewer.columnoverlay.Enable = 'off'; gui_plotorg_waveviewer.columngapoverlapedit.Enable = 'off'; + binArray = gui_erp_waviewer.ERPwaviewer.bin; + chanArray = gui_erp_waviewer.ERPwaviewer.chan; + ERPsetArray = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + ALLERPIN = gui_erp_waviewer.ERPwaviewer.ALLERP; + if max(ERPsetArray) >length(ALLERPIN) + ERPsetArray =length(ALLERPIN); + gui_erp_waviewer.ERPwaviewer.SelectERPIdx = ERPsetArray; + end + if gui_plotorg_waveviewer.plotorg_c1.Value ==1 + GridValue=1; OverlayValue = 2; PageValue =3; + elseif gui_plotorg_waveviewer.plotorg_c2.Value ==1 + GridValue=1; OverlayValue = 3; PageValue =2; + elseif gui_plotorg_waveviewer.plotorg_c3.Value ==1 + GridValue=2; OverlayValue = 1; PageValue =3; + elseif gui_plotorg_waveviewer.plotorg_c4.Value ==1 + GridValue=2; OverlayValue = 3; PageValue =1; + elseif gui_plotorg_waveviewer.plotorg_c5.Value ==1 + GridValue=3; OverlayValue = 1; PageValue =2; + elseif gui_plotorg_waveviewer.plotorg_c6.Value ==1 + GridValue=3; OverlayValue = 2; PageValue =1; + end + gui_erp_waviewer.ERPwaviewer.plot_org.Grid =GridValue; + gui_erp_waviewer.ERPwaviewer.plot_org.Overlay = OverlayValue; + gui_erp_waviewer.ERPwaviewer.plot_org.Pages = PageValue; + + [chanStr,binStr,diff_mark] = f_geterpschanbin(ALLERPIN,ERPsetArray); + if numel(binArray)> length(binStr) + binArray = [1:length(binStr)]; + gui_erp_waviewer.ERPwaviewer.bin = binArray; + end + if numel(chanArray)> length(chanStr) + chanArray = [1:length(chanStr)]; + gui_erp_waviewer.ERPwaviewer.chan = chanArray; + end + + if GridValue ==1 %% if the selected Channel is "Grid" + plotArray = chanArray; + elseif GridValue == 2 %% if the selected Bin is "Grid" + plotArray = binArray; + elseif GridValue == 3%% if the selected ERPset is "Grid" + plotArray = ERPsetArray; + else + plotArray = chanArray; + end + + plotBox = f_getrow_columnautowaveplot(plotArray);%% the first element is number of rows and the second element is the number of columns + if gui_plotorg_waveviewer.layout_auto.Value + try + gui_plotorg_waveviewer.rownum.Value = plotBox(1); + gui_plotorg_waveviewer.columnnum.Value = plotBox(2); + catch + gui_plotorg_waveviewer.rownum.Value=1; + gui_plotorg_waveviewer.columnnum.Value=1; + end + end end @@ -1386,9 +1389,7 @@ function layout_custom(~,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_plotorg',1); - gui_plotorg_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_plotorg_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpwave_viewer_plotorg.TitleColor= [0.4940 0.1840 0.5560]; + track_changes_title_color(); gui_plotorg_waveviewer.layout_auto.Value =0; gui_plotorg_waveviewer.layout_custom.Value = 1; gui_plotorg_waveviewer.rownum.Enable = 'on'; @@ -1442,11 +1443,8 @@ function plotorg_rownum(Str,~) if ~isempty(messgStr) && viewerpanelIndex~=4 viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end - estudioworkingmemory('MyViewer_plotorg',1); - gui_plotorg_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_plotorg_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpwave_viewer_plotorg.TitleColor= [0.4940 0.1840 0.5560]; + track_changes_title_color(); end @@ -1457,9 +1455,7 @@ function plotorg_columnnum(Str,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_plotorg',1); - gui_plotorg_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_plotorg_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpwave_viewer_plotorg.TitleColor= [0.4940 0.1840 0.5560]; + track_changes_title_color(); end @@ -1471,9 +1467,7 @@ function rowgapgtpauto(~,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_plotorg',1); - gui_plotorg_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_plotorg_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpwave_viewer_plotorg.TitleColor= [0.4940 0.1840 0.5560]; + track_changes_title_color(); gui_plotorg_waveviewer.rowgap_auto.Value = 1; gui_plotorg_waveviewer.rowgapGTPcustom.Enable = 'on'; gui_plotorg_waveviewer.rowoverlap.Value =0; @@ -1487,13 +1481,11 @@ function rowgapgtpcustom(Source,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_plotorg',1); - gui_plotorg_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_plotorg_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpwave_viewer_plotorg.TitleColor= [0.4940 0.1840 0.5560]; + track_changes_title_color(); rowgap = str2num(Source.String); if isempty(rowgap) || numel(rowgap)~=1 || rowgap<=0 MessageViewer= char(strcat('Plot Organization > Row > Gap should be larger than 0')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =4; Source.String = '10'; return; @@ -1508,9 +1500,7 @@ function rowoverlap(~,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_plotorg',1); - gui_plotorg_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_plotorg_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpwave_viewer_plotorg.TitleColor= [0.4940 0.1840 0.5560]; + track_changes_title_color(); gui_plotorg_waveviewer.rowgap_auto.Value = 0; gui_plotorg_waveviewer.rowgapGTPcustom.Enable = 'off'; gui_plotorg_waveviewer.rowoverlap.Value =1; @@ -1524,15 +1514,13 @@ function rowoverlapcustom(Source,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_plotorg',1); - gui_plotorg_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_plotorg_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpwave_viewer_plotorg.TitleColor= [0.4940 0.1840 0.5560]; + track_changes_title_color();%%change title color and background color for "cancel" and "apply" + rowoverlay = str2num(Source.String); if isempty(rowoverlay) || numel(rowoverlay)~=1 || rowoverlay<=0 || rowoverlay>=100 MessageViewer= char(strcat('Plot Organization > Column > Overlap should be larger than 0 and smaller than 100')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =4; - Source.String = '40'; return; end @@ -1549,6 +1537,8 @@ function columngapgtpop(~,~) gui_plotorg_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; gui_plotorg_waveviewer.apply.ForegroundColor = [1 1 1]; box_erpwave_viewer_plotorg.TitleColor= [0.4940 0.1840 0.5560]; + gui_plotorg_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_plotorg_waveviewer.cancel.ForegroundColor = [1 1 1]; gui_plotorg_waveviewer.columngapgtpop.Value =1; gui_plotorg_waveviewer.columngapgtpcustom.Enable = 'on'; @@ -1562,13 +1552,12 @@ function columngapGTPcustom(Source,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_plotorg',1); - gui_plotorg_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_plotorg_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpwave_viewer_plotorg.TitleColor= [0.4940 0.1840 0.5560]; + track_changes_title_color();%%change title color and background color for "cancel" and "apply" + columngap = str2num(Source.String); if isempty(columngap) || numel(columngap)~=1 || columngap<=0 MessageViewer= char(strcat('Plot Organization > Column > Gap should be larger than 0')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =4; Source.String = '10'; return; @@ -1583,9 +1572,7 @@ function columnoverlap(Source,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_plotorg',1); - gui_plotorg_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_plotorg_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpwave_viewer_plotorg.TitleColor= [0.4940 0.1840 0.5560]; + track_changes_title_color();%%change title color and background color for "cancel" and "apply" colnOverlay = str2num(char( gui_plotorg_waveviewer.columngapoverlapedit.String)); gui_plotorg_waveviewer.columngapgtpop.Value =0; @@ -1605,9 +1592,7 @@ function columnoverlaycustom(Source,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_plotorg',1); - gui_plotorg_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_plotorg_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpwave_viewer_plotorg.TitleColor= [0.4940 0.1840 0.5560]; + track_changes_title_color();%%change title color and background color for "cancel" and "apply" columnoverlay = str2num(Source.String); if isempty(columnoverlay) || numel(columnoverlay)~=1 || columnoverlay<=0 || columnoverlay>=100 @@ -1625,28 +1610,18 @@ function plotorg_edit_checkbox(Source,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_plotorg',1); - gui_plotorg_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_plotorg_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpwave_viewer_plotorg.TitleColor= [0.4940 0.1840 0.5560]; + track_changes_title_color();%%change title color and background color for "cancel" and "apply" if Source.Value==1 gui_plotorg_waveviewer.layout_custom_edit.Enable = 'on'; else gui_plotorg_waveviewer.layout_custom_edit.Enable = 'off'; end - if Source.Value==0 - try - ERPwaviewerin = evalin('base','ALLERPwaviewer'); - catch - beep; - disp('f_ERP_plotorg_waveviewer_GUI() error: Please run the ERP wave viewer again.'); - return; - end - binArray = ERPwaviewerin.bin; - chanArray = ERPwaviewerin.chan; - ERPsetArray = ERPwaviewerin.SelectERPIdx; - ALLERPIN = ERPwaviewerin.ALLERP; + binArray = gui_erp_waviewer.ERPwaviewer.bin; + chanArray = gui_erp_waviewer.ERPwaviewer.chan; + ERPsetArray = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + ALLERPIN = gui_erp_waviewer.ERPwaviewer.ALLERP; if max(ERPsetArray) >length(ALLERPIN) ERPsetArray =length(ALLERPIN); end @@ -1695,10 +1670,9 @@ function plotorg_edit_checkbox(Source,~) end end end - ERPwaviewerin.plot_org.gridlayout.data = GridinforData; - ERPwaviewerin.plot_org.gridlayout.columFormat = plotArrayStr'; - ERPwaviewerin.plot_org.gridlayout.GridLayoutAuto = 0; - assignin('base','ALLERPwaviewer',ERPwaviewerin); + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.data = GridinforData; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columFormat = plotArrayStr'; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.GridLayoutAuto = 0; end end @@ -1712,38 +1686,28 @@ function plotorg_edit(Source,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_plotorg',1); - gui_plotorg_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_plotorg_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpwave_viewer_plotorg.TitleColor= [0.4940 0.1840 0.5560]; - + track_changes_title_color();%%change title color and background color for "cancel" and "apply" MessageViewer= char(strcat('Plot Organization > Custom Grid Locations > Edit')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =1; - try - ERPwaviewerin = evalin('base','ALLERPwaviewer'); - catch - viewer_ERPDAT.Process_messg =3; - fprintf(2,'\n f_ERP_plotorg_waveviewer_GUI()> plotorg_edit() error: Cannot get parameters for whole panel.\n Please run My viewer again.\n\n'); - return; - end - columFormat = ERPwaviewerin.plot_org.gridlayout.columFormat; + columFormat = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columFormat; - plotBox(1) = ERPwaviewerin.plot_org.gridlayout.rows; - plotBox(2) = ERPwaviewerin.plot_org.gridlayout.columns; + plotBox(1) = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rows; + plotBox(2) = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columns; try - GridinforData = ERPwaviewerin.plot_org.gridlayout.data; + GridinforData = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.data; catch GridinforData = []; end - ERPsetArray = ERPwaviewerin.SelectERPIdx; - ALLERPIN = ERPwaviewerin.ALLERP; + ERPsetArray = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + ALLERPIN = gui_erp_waviewer.ERPwaviewer.ALLERP; if max(ERPsetArray) >length(ALLERPIN) ERPsetArray =length(ALLERPIN); end - GridValue= ERPwaviewerin.plot_org.Grid; + GridValue= gui_erp_waviewer.ERPwaviewer.plot_org.Grid; [chanStr,binStr,diff_mark] = f_geterpschanbin(ALLERPIN,ERPsetArray); if GridValue ==1 %% if the selected Channel is "Grid" AllabelArray = chanStr; @@ -1763,13 +1727,14 @@ function plotorg_edit(Source,~) gui_plotorg_waveviewer.apply.BackgroundColor = [1,1,1]; box_erpwave_viewer_plotorg.TitleColor= [0.5 0.5 0.9]; gui_plotorg_waveviewer.apply.ForegroundColor = [0 0 0]; - disp('User selected cancel'); + gui_plotorg_waveviewer.cancel.BackgroundColor = [1 1 1]; + gui_plotorg_waveviewer.cancel.ForegroundColor = [0 0 0]; return; end TableDataDf = def{1}; - ERPwaviewerin.plot_org.gridlayout.rows = size(TableDataDf,1); - ERPwaviewerin.plot_org.gridlayout.columns =size(TableDataDf,2); + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rows = size(TableDataDf,1); + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columns =size(TableDataDf,2); gui_plotorg_waveviewer.rownum.Value =size(TableDataDf,1); gui_plotorg_waveviewer.columnnum.Value =size(TableDataDf,2); try @@ -1778,31 +1743,31 @@ function plotorg_edit(Source,~) columFormatout = columFormat; end gui_plotorg_waveviewer.columFormatStr = columFormatout; - ERPwaviewerin.plot_org.gridlayout.columFormat = columFormatout; - ERPwaviewerin.plot_org.gridlayout.data =TableDataDf; - if ERPwaviewerin.plot_org.Grid==1 + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columFormat = columFormatout'; + + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.data =TableDataDf; + if gui_erp_waviewer.ERPwaviewer.plot_org.Grid==1 try - ERPwaviewerin.chan = def{3}; + gui_erp_waviewer.ERPwaviewer.chan = def{3}; catch end MERPWaveViewer_plotorg{1}=1; - elseif ERPwaviewerin.plot_org.Grid==2 + elseif gui_erp_waviewer.ERPwaviewer.plot_org.Grid==2 try - ERPwaviewerin.bin = def{3}; + gui_erp_waviewer.ERPwaviewer.bin = def{3}; catch end MERPWaveViewer_plotorg{1}=2; - elseif ERPwaviewerin.plot_org.Grid==3 + elseif gui_erp_waviewer.ERPwaviewer.plot_org.Grid==3 try - ERPwaviewerin.SelectERPIdx = def{3}; + gui_erp_waviewer.ERPwaviewer.SelectERPIdx = def{3}; catch end - if ERPwaviewerin.PageIndex> numel(ERPwaviewerin.SelectERPIdx) - ERPwaviewerin.PageIndex=1; + if gui_erp_waviewer.ERPwaviewer.PageIndex> numel(gui_erp_waviewer.ERPwaviewer.SelectERPIdx) + gui_erp_waviewer.ERPwaviewer.PageIndex=1; end MERPWaveViewer_plotorg{1}=3; end - assignin('base','ALLERPwaviewer',ERPwaviewerin); MERPWaveViewer_plotorg{2}=gui_plotorg_waveviewer.layout_auto.Value; plotBox(1) = gui_plotorg_waveviewer.rownum.Value; @@ -1818,20 +1783,20 @@ function plotorg_edit(Source,~) estudioworkingmemory('MERPWaveViewer_plotorg',MERPWaveViewer_plotorg);%%save parameters for this panel to memory file viewer_ERPDAT.ERPset_Chan_bin_label=1; - f_redrawERP_viewer_test(); + viewer_ERPDAT.Count_currentERP=1; estudioworkingmemory('MyViewer_plotorg',0); gui_plotorg_waveviewer.apply.BackgroundColor = [1,1,1]; box_erpwave_viewer_plotorg.TitleColor= [0.5 0.5 0.9]; gui_plotorg_waveviewer.apply.ForegroundColor = [0 0 0]; + gui_plotorg_waveviewer.cancel.BackgroundColor = [1 1 1]; + gui_plotorg_waveviewer.cancel.ForegroundColor = [0 0 0]; end - - %%-------load the saved parameters for plotting organization--------------- function layout_custom_load(~,~) MessageViewer= char(strcat('Plot Organization > Load')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =1; [messgStr,viewerpanelIndex] = f_check_erpviewerpanelchanges(); @@ -1853,13 +1818,6 @@ function layout_custom_load(~,~) disp('Cannot load the file.'); return; end - try - ERPwaviewerin = evalin('base','ALLERPwaviewer'); - catch - beep; - disp('f_ERP_plotorg_waveviewer_GUI() > layout_custom_load() error: Please run the ERP wave viewer again.'); - return; - end %%check current version ERPtooltype = erpgettoolversion('tooltype'); @@ -1890,7 +1848,7 @@ function layout_custom_load(~,~) elseif strcmpi(ERPtooltype,'ERPLAB') MessageViewer= char(strcat('Plot Organization > Load - This settings file was created using an older version of ERPLAB')); end - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =4; end @@ -1903,10 +1861,10 @@ function layout_custom_load(~,~) end %%------------------default labels--------------------------------- - binArray = ERPwaviewerin.bin; - chanArray = ERPwaviewerin.chan; - ERPsetArray = ERPwaviewerin.SelectERPIdx; - ALLERPIN = ERPwaviewerin.ALLERP; + binArray = gui_erp_waviewer.ERPwaviewer.bin; + chanArray = gui_erp_waviewer.ERPwaviewer.chan; + ERPsetArray = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + ALLERPIN = gui_erp_waviewer.ERPwaviewer.ALLERP; if max(ERPsetArray) >length(ALLERPIN) ERPsetArray =length(ALLERPIN); end @@ -1920,7 +1878,7 @@ function layout_custom_load(~,~) gui_plotorg_waveviewer.plotorg_c6.Enable = 'off'; if PageValue~= 3 MessageViewer= char(strcat('Plot Organization > Load - Sampling rate varies across ERPsets. We used the first option')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =4; GridValue = 1;OverlayValue = 2;PageValue=3; end @@ -1990,9 +1948,9 @@ function layout_custom_load(~,~) try gui_plotorg_waveviewer.layout_auto.Value=Plot_orgpar.gridlayout.op; gui_plotorg_waveviewer.layout_custom.Value = ~Plot_orgpar.gridlayout.op; - ERPwaviewerin.plot_org.Grid= GridValue; - ERPwaviewerin.plot_org.Overlay =OverlayValue; - ERPwaviewerin.plot_org.Pages=PageValue; + gui_erp_waviewer.ERPwaviewer.plot_org.Grid= GridValue; + gui_erp_waviewer.ERPwaviewer.plot_org.Overlay =OverlayValue; + gui_erp_waviewer.ERPwaviewer.plot_org.Pages=PageValue; catch beep; disp('The imported parameters were invalid.') @@ -2060,9 +2018,8 @@ function layout_custom_load(~,~) gui_plotorg_waveviewer.layoutinfor_table.Enable =LayOutauto; gui_plotorg_waveviewer.rownum.Enable=LayOutauto; gui_plotorg_waveviewer.columnnum.Enable=LayOutauto; - ERPwaviewerin.plot_org.gridlayout.rows = Plot_orgpar.gridlayout.rows; - ERPwaviewerin.plot_org.gridlayout.columns =Plot_orgpar.gridlayout.columns; - % ERPwaviewerin.plot_org.gridlayout.columFormat = plotArrayFormtimpChag; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rows = Plot_orgpar.gridlayout.rows; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columns =Plot_orgpar.gridlayout.columns; catch beep; disp('The imported parameters didnot match with those of "Plot Organization".') @@ -2123,16 +2080,14 @@ function layout_custom_load(~,~) if Plot_orgpar.gridlayout.GridLayoutAuto==0 gui_plotorg_waveviewer.layout_custom_edit_checkbox.Value = 0; gui_plotorg_waveviewer.layout_custom_edit.Enable = 'off'; - ERPwaviewerin.plot_org.gridlayout.data= GridinforDatadef; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.data= GridinforDatadef; else EmptyItemStr = ''; gui_plotorg_waveviewer.layout_custom_edit_checkbox.Value = 1; gui_plotorg_waveviewer.layout_custom_edit.Enable = 'on'; - ERPwaviewerin.plot_org.gridlayout.columFormat = plotArrayFormtdef; - plotArrayFormt= ERPwaviewerin.plot_org.gridlayout.columFormat'; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columFormat = plotArrayFormtdef; + plotArrayFormt= gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columFormat'; GridinforDataOrg = Plot_orgpar.gridlayout.data; - % LabelUsedIndex = []; - % countlabel=0; for ii = 1:size(GridinforDataOrg,1) for jj = 1:size(GridinforDataOrg,2) code = 0; @@ -2155,32 +2110,28 @@ function layout_custom_load(~,~) end if ~isempty(EmptyItemStr) MessageViewer= char(strcat('Plot Organization > Load - Undefined items in grid locations:',EmptyItemStr,32,'. Because they donot match with the selected labels')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =4; end - - - ERPwaviewerin.plot_org.gridlayout.data =GridinforDataOrg; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.data =GridinforDataOrg; gui_plotorg_waveviewer.rownum.Value = size(GridinforDataOrg,1); gui_plotorg_waveviewer.columnnum.Value= size(GridinforDataOrg,2); - ERPwaviewerin.plot_org.gridlayout.rows = gui_plotorg_waveviewer.rownum.Value; - ERPwaviewerin.plot_org.gridlayout.columns =gui_plotorg_waveviewer.columnnum.Value; - end - - - ERPwaviewerin.plot_org.gridlayout.op =gui_plotorg_waveviewer.layout_auto.Value; - ERPwaviewerin.plot_org.gridlayout.rows = gui_plotorg_waveviewer.rownum.Value; - ERPwaviewerin.plot_org.gridlayout.columns = gui_plotorg_waveviewer.columnnum.Value; - ERPwaviewerin.plot_org.gridlayout.rowgap.GTPOP = gui_plotorg_waveviewer.rowgap_auto.Value; - ERPwaviewerin.plot_org.gridlayout.rowgap.GTPValue = str2num(gui_plotorg_waveviewer.rowgapGTPcustom.String); - ERPwaviewerin.plot_org.gridlayout.rowgap.OverlayOP = gui_plotorg_waveviewer.rowoverlap.Value; - ERPwaviewerin.plot_org.gridlayout.rowgap.OverlayValue = str2num(gui_plotorg_waveviewer.rowgapoverlayedit.String); - ERPwaviewerin.plot_org.gridlayout.columngap.GTPOP = gui_plotorg_waveviewer.columngapgtpop.Value; - ERPwaviewerin.plot_org.gridlayout.columngap.GTPValue = str2num(gui_plotorg_waveviewer.columngapgtpcustom.String); - ERPwaviewerin.plot_org.gridlayout.columngap.OverlayOP = gui_plotorg_waveviewer.columnoverlay.Value; - ERPwaviewerin.plot_org.gridlayout.columngap.OverlayValue = str2num(gui_plotorg_waveviewer.columngapoverlapedit.String); - ERPwaviewerin.plot_org.gridlayout.GridLayoutAuto = gui_plotorg_waveviewer.layout_custom_edit_checkbox.Value; - + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rows = gui_plotorg_waveviewer.rownum.Value; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columns =gui_plotorg_waveviewer.columnnum.Value; + end + + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.op =gui_plotorg_waveviewer.layout_auto.Value; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rows = gui_plotorg_waveviewer.rownum.Value; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columns = gui_plotorg_waveviewer.columnnum.Value; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.GTPOP = gui_plotorg_waveviewer.rowgap_auto.Value; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.GTPValue = str2num(gui_plotorg_waveviewer.rowgapGTPcustom.String); + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.OverlayOP = gui_plotorg_waveviewer.rowoverlap.Value; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.OverlayValue = str2num(gui_plotorg_waveviewer.rowgapoverlayedit.String); + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.GTPOP = gui_plotorg_waveviewer.columngapgtpop.Value; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.GTPValue = str2num(gui_plotorg_waveviewer.columngapgtpcustom.String); + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.OverlayOP = gui_plotorg_waveviewer.columnoverlay.Value; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.OverlayValue = str2num(gui_plotorg_waveviewer.columngapoverlapedit.String); + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.GridLayoutAuto = gui_plotorg_waveviewer.layout_custom_edit_checkbox.Value; MERPWaveViewer_plotorg{2}=gui_plotorg_waveviewer.layout_auto.Value; plotBox(1) = gui_plotorg_waveviewer.rownum.Value; @@ -2195,14 +2146,10 @@ function layout_custom_load(~,~) MERPWaveViewer_plotorg{10}=gui_plotorg_waveviewer.layout_custom_edit_checkbox.Value; estudioworkingmemory('MERPWaveViewer_plotorg',MERPWaveViewer_plotorg);%%save parameters for this panel to memory file - assignin('base','ALLERPwaviewer',ERPwaviewerin); + viewer_ERPDAT.Count_currentERP=1; - viewer_ERPDAT.page_xyaxis = viewer_ERPDAT.page_xyaxis+1; - %%change the legend names based on the imported parameters - viewer_ERPDAT.count_legend = viewer_ERPDAT.count_legend+1; - f_redrawERP_viewer_test(); MessageViewer= char(strcat('Plot Organization > Load')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =2; end @@ -2211,14 +2158,13 @@ function layout_custom_load(~,~) function layout_custom_save(~,~) [messgStr,viewerpanelIndex] = f_check_erpviewerpanelchanges(); if ~isempty(messgStr) && viewerpanelIndex==4 - erpworkingmemory('ERPViewer_proces_messg',messgStr); - fprintf(2,['\n Warning: ',messgStr,'.\n']); + estudioworkingmemory('ERPViewer_proces_messg',messgStr); viewer_ERPDAT.Process_messg =4; return; end MessageViewer= char(strcat('Plot Organization > Save as')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =1; ERPtooltype = erpgettoolversion('tooltype'); @@ -2238,15 +2184,6 @@ function layout_custom_save(~,~) end end - - try - ERPwaviewerin = evalin('base','ALLERPwaviewer'); - catch - beep; - disp('f_ERP_plotorg_waveviewer_GUI() error: Please run the ERP wave viewer again.'); - return; - end - if gui_plotorg_waveviewer.plotorg_c1.Value ==1 GridValue=1; OverlayValue = 2; PageValue =3; elseif gui_plotorg_waveviewer.plotorg_c2.Value ==1 @@ -2265,22 +2202,22 @@ function layout_custom_save(~,~) Plot_orgpar.Overlay = OverlayValue; Plot_orgpar.Pages = PageValue; Plot_orgpar.gridlayout.op =gui_plotorg_waveviewer.layout_auto.Value; - Plot_orgpar.gridlayout.data =ERPwaviewerin.plot_org.gridlayout.data; + Plot_orgpar.gridlayout.data =gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.data; Plot_orgpar.gridlayout.rows = gui_plotorg_waveviewer.rownum.Value; Plot_orgpar.gridlayout.columns = gui_plotorg_waveviewer.columnnum.Value; - Plot_orgpar.gridlayout.columFormat = ERPwaviewerin.plot_org.gridlayout.columFormat; - Plot_orgpar.gridlayout.rowgap.GTPOP = ERPwaviewerin.plot_org.gridlayout.rowgap.GTPOP; - Plot_orgpar.gridlayout.rowgap.GTPValue = ERPwaviewerin.plot_org.gridlayout.rowgap.GTPValue; - Plot_orgpar.gridlayout.rowgap.OverlayOP = ERPwaviewerin.plot_org.gridlayout.rowgap.OverlayOP; - Plot_orgpar.gridlayout.rowgap.OverlayValue = ERPwaviewerin.plot_org.gridlayout.rowgap.OverlayValue; - - Plot_orgpar.gridlayout.columngap.GTPOP = ERPwaviewerin.plot_org.gridlayout.columngap.GTPOP; - Plot_orgpar.gridlayout.columngap.GTPValue = ERPwaviewerin.plot_org.gridlayout.columngap.GTPValue; - Plot_orgpar.gridlayout.columngap.OverlayOP = ERPwaviewerin.plot_org.gridlayout.columngap.OverlayOP; - Plot_orgpar.gridlayout.columngap.OverlayValue = ERPwaviewerin.plot_org.gridlayout.columngap.OverlayValue; - Plot_orgpar.gridlayout.GridLayoutAuto= ERPwaviewerin.plot_org.gridlayout.GridLayoutAuto; + Plot_orgpar.gridlayout.columFormat = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columFormat; + Plot_orgpar.gridlayout.rowgap.GTPOP = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.GTPOP; + Plot_orgpar.gridlayout.rowgap.GTPValue = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.GTPValue; + Plot_orgpar.gridlayout.rowgap.OverlayOP = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.OverlayOP; + Plot_orgpar.gridlayout.rowgap.OverlayValue = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.OverlayValue; + + Plot_orgpar.gridlayout.columngap.GTPOP = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.GTPOP; + Plot_orgpar.gridlayout.columngap.GTPValue = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.GTPValue; + Plot_orgpar.gridlayout.columngap.OverlayOP = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.OverlayOP; + Plot_orgpar.gridlayout.columngap.OverlayValue = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.OverlayValue; + Plot_orgpar.gridlayout.GridLayoutAuto= gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.GridLayoutAuto; pathstr = pwd; - namedef ='LayoutInfor'; + namedef ='LayoutInfor_viewer'; [erpfilename, erppathname, indxs] = uiputfile({'*.mat'}, ... ['Save "','Information of Plot Organization', '" as'],... fullfile(pathstr,namedef)); @@ -2288,7 +2225,7 @@ function layout_custom_save(~,~) disp('User selected Cancel') return end - % [pathx, filename, ext] = fileparts(erpfilename); + [pathstr, erpfilename, ext] = fileparts(erpfilename) ; ext = '.mat'; erpFilename = char(strcat(erpfilename,ext)); @@ -2296,14 +2233,13 @@ function layout_custom_save(~,~) save([erppathname,erpFilename],'Plot_orgpar','-v7.3'); catch MessageViewer = ['Plot Organization > Save as: Cannot save the parameters for "Plot Organization", please try again']; - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); - viewer_ERPDAT.Process_messg =3; + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); + viewer_ERPDAT.Process_messg =4; return; end MessageViewer= char(strcat('Plot Organization > Save as')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =2; - end @@ -2317,33 +2253,21 @@ function plotorg_cancel(~,~) if changeFlag~=1 return; end - MessageViewer= char(strcat('Plot Organization > Cancel')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); - viewer_ERPDAT.Process_messg =1; + MessageViewer= char(strcat('Plot Organization > Cancel')); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); + viewer_ERPDAT.Process_messg =1; try - ERPwaviewer_apply = evalin('base','ALLERPwaviewer'); - catch - viewer_ERPDAT.Process_messg =3; - fprintf(2,'\n Plot Organization > Cancel error: Cannot get parameters for whole panel.\n Please run My viewer again.\n\n'); - return; - end - try - GridValue=ERPwaviewer_apply.plot_org.Grid ; - OverlayValue=ERPwaviewer_apply.plot_org.Overlay; - PageValue=ERPwaviewer_apply.plot_org.Pages; + GridValue=gui_erp_waviewer.ERPwaviewer.plot_org.Grid ; + OverlayValue=gui_erp_waviewer.ERPwaviewer.plot_org.Overlay; + PageValue=gui_erp_waviewer.ERPwaviewer.plot_org.Pages; catch GridValue=1; OverlayValue = 2; PageValue =3; end - try - ALLERP = ERPwaviewer_apply.ALLERP; - indexerp = ERPwaviewer_apply.SelectERPIdx; - catch - beep; - disp('f_ERP_plotorg_waveviewer_GUI() error: Please run the ERP wave viewer again.'); - return; - end + ALLERP = gui_erp_waviewer.ERPwaviewer.ALLERP; + indexerp = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + for Numofselectederp = 1:numel(indexerp) SrateNum_mp(Numofselectederp) = ALLERP(indexerp(Numofselectederp)).srate; end @@ -2411,8 +2335,8 @@ function plotorg_cancel(~,~) gui_plotorg_waveviewer.plotorg_c6.Value =1; gui_plotorg_waveviewer.LayoutFlag = [0,0,0,0,0,1]; end - gui_plotorg_waveviewer.layout_auto.Value = ERPwaviewer_apply.plot_org.gridlayout.op; - gui_plotorg_waveviewer.layout_custom.Value = ~ERPwaviewer_apply.plot_org.gridlayout.op; + gui_plotorg_waveviewer.layout_auto.Value = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.op; + gui_plotorg_waveviewer.layout_custom.Value = ~gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.op; gui_plotorg_waveviewer.layout_auto.Enable = 'on'; gui_plotorg_waveviewer.layout_custom.Enable = 'on'; if gui_plotorg_waveviewer.layout_auto.Value==1 @@ -2422,18 +2346,18 @@ function plotorg_cancel(~,~) EnableFlag = 'on'; gui_plotorg_waveviewer.layout_custom_edit.Enable = 'on'; end - gui_plotorg_waveviewer.rownum.Value= ERPwaviewer_apply.plot_org.gridlayout.rows; - gui_plotorg_waveviewer.columnnum.Value=ERPwaviewer_apply.plot_org.gridlayout.columns; - rowGapValue = ERPwaviewer_apply.plot_org.gridlayout.rowgap.GTPOP; + gui_plotorg_waveviewer.rownum.Value= gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rows; + gui_plotorg_waveviewer.columnnum.Value=gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columns; + rowGapValue = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.GTPOP; gui_plotorg_waveviewer.rowgap_auto.Value=rowGapValue; gui_plotorg_waveviewer.rowoverlap.Value=~rowGapValue; - gui_plotorg_waveviewer.rowgapGTPcustom.String = num2str(ERPwaviewer_apply.plot_org.gridlayout.rowgap.GTPValue); - gui_plotorg_waveviewer.rowgapoverlayedit.String=num2str(ERPwaviewer_apply.plot_org.gridlayout.rowgap.OverlayValue); - columnGapValue =ERPwaviewer_apply.plot_org.gridlayout.columngap.GTPOP; + gui_plotorg_waveviewer.rowgapGTPcustom.String = num2str(gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.GTPValue); + gui_plotorg_waveviewer.rowgapoverlayedit.String=num2str(gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.OverlayValue); + columnGapValue =gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.GTPOP; gui_plotorg_waveviewer.columngapgtpop.Value= columnGapValue; gui_plotorg_waveviewer.columnoverlay.Value = ~columnGapValue; - gui_plotorg_waveviewer.columngapgtpcustom.String = num2str(ERPwaviewer_apply.plot_org.gridlayout.columngap.GTPValue); - gui_plotorg_waveviewer.columngapoverlapedit.String=num2str(ERPwaviewer_apply.plot_org.gridlayout.columngap.OverlayValue); + gui_plotorg_waveviewer.columngapgtpcustom.String = num2str(gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.GTPValue); + gui_plotorg_waveviewer.columngapoverlapedit.String=num2str(gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.OverlayValue); gui_plotorg_waveviewer.rownum.Enable = EnableFlag; gui_plotorg_waveviewer.columnnum.Enable = EnableFlag; @@ -2465,22 +2389,22 @@ function plotorg_cancel(~,~) gui_plotorg_waveviewer.columngapoverlapedit.Enable = 'on'; end end - - if ERPwaviewer_apply.plot_org.gridlayout.GridLayoutAuto ==0 + if gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.GridLayoutAuto ==0 gui_plotorg_waveviewer.layout_custom_edit_checkbox.Value = 0; gui_plotorg_waveviewer.layout_custom_edit.Enable = 'off'; else gui_plotorg_waveviewer.layout_custom_edit_checkbox.Value = 1; gui_plotorg_waveviewer.layout_custom_edit.Enable = 'on'; end - gui_plotorg_waveviewer.columFormatStr = ''; estudioworkingmemory('MyViewer_plotorg',0); gui_plotorg_waveviewer.apply.BackgroundColor = [1 1 1]; gui_plotorg_waveviewer.apply.ForegroundColor = [0 0 0]; box_erpwave_viewer_plotorg.TitleColor= [0.5 0.5 0.9]; - MessageViewer= char(strcat('Plot Organization > Cancel')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + gui_plotorg_waveviewer.cancel.BackgroundColor = [1 1 1]; + gui_plotorg_waveviewer.cancel.ForegroundColor = [0 0 0]; + MessageViewer= char(strcat('Plot Organization > Cancel')); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =2; end @@ -2496,26 +2420,19 @@ function plotorg_apply(~,~) gui_plotorg_waveviewer.apply.BackgroundColor = [1 1 1]; gui_plotorg_waveviewer.apply.ForegroundColor = [0 0 0]; box_erpwave_viewer_plotorg.TitleColor= [0.5 0.5 0.9]; - + gui_plotorg_waveviewer.cancel.BackgroundColor = [1 1 1]; + gui_plotorg_waveviewer.cancel.ForegroundColor = [0 0 0]; MessageViewer= char(strcat('Plot Organization > Apply')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =1; - %%checking the numbers of rows and columns - try - ERPwaviewerin = evalin('base','ALLERPwaviewer'); - catch - viewer_ERPDAT.Process_messg =3; - fprintf(2,'\n Plot Organization > Apply-f_ERP_plotorg_waveviewer_GUI() error: Cannot get parameters for whole panel.\n Please run My viewer again.\n\n'); - return; - end - binArray = ERPwaviewerin.bin; - chanArray = ERPwaviewerin.chan; - ERPsetArray = ERPwaviewerin.SelectERPIdx; - ALLERPIN = ERPwaviewerin.ALLERP; + + binArray = gui_erp_waviewer.ERPwaviewer.bin; + chanArray = gui_erp_waviewer.ERPwaviewer.chan; + ERPsetArray = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + ALLERPIN = gui_erp_waviewer.ERPwaviewer.ALLERP; if max(ERPsetArray) >length(ALLERPIN) ERPsetArray =length(ALLERPIN); end - if gui_plotorg_waveviewer.plotorg_c1.Value ==1 GridValue=1; OverlayValue = 2; PageValue =3; MERPWaveViewer_plotorg{1}=1; @@ -2580,14 +2497,14 @@ function plotorg_apply(~,~) end if gui_plotorg_waveviewer.layout_custom_edit_checkbox.Value ==0 - ERPwaviewerin.plot_org.gridlayout.rows = gui_plotorg_waveviewer.rownum.Value; - ERPwaviewerin.plot_org.gridlayout.columns =gui_plotorg_waveviewer.columnnum.Value; - ERPwaviewerin.plot_org.gridlayout.columFormat = plotArrayFormt'; - ERPwaviewerin.plot_org.gridlayout.data =GridinforDatadef; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rows = gui_plotorg_waveviewer.rownum.Value; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columns =gui_plotorg_waveviewer.columnnum.Value; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columFormat = plotArrayFormt'; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.data =GridinforDatadef; else EmptyItemStr = ''; - ERPwaviewerin.plot_org.gridlayout.columFormat=plotArrayFormt'; - GridinforDataOrg = ERPwaviewerin.plot_org.gridlayout.data; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columFormat=plotArrayFormt'; + GridinforDataOrg = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.data; countEmp = 0; for ii = 1:size(GridinforDataOrg,1) for jj = 1:size(GridinforDataOrg,2) @@ -2613,7 +2530,7 @@ function plotorg_apply(~,~) end if ~isempty(EmptyItemStr) MessageViewer= char(strcat('Plot Organization > Apply-Undefined item(s) in grid locations:',EmptyItemStr,32,'because they donot match with the selected labels')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =4; end if countEmp == size(GridinforDataOrg,1)*size(GridinforDataOrg,2) || isempty(EmptyItemStr) @@ -2623,32 +2540,30 @@ function plotorg_apply(~,~) end if ~isempty(EmptyItemStr) MessageViewer= char(strcat('Plot Organization > Apply-Undefined item(s) in grid locations:',EmptyItemStr,32,'because they donot match with the selected labels')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =4; end end - - ERPwaviewerin.plot_org.gridlayout.data =GridinforDataOrg; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.data =GridinforDataOrg; gui_plotorg_waveviewer.rownum.Value = size(GridinforDataOrg,1); gui_plotorg_waveviewer.columnnum.Value= size(GridinforDataOrg,2); end - ERPwaviewerin.plot_org.Grid = GridValue; - ERPwaviewerin.plot_org.Overlay = OverlayValue; - ERPwaviewerin.plot_org.Pages = PageValue; - ERPwaviewerin.plot_org.gridlayout.op =gui_plotorg_waveviewer.layout_auto.Value; - ERPwaviewerin.plot_org.gridlayout.rows = gui_plotorg_waveviewer.rownum.Value; - ERPwaviewerin.plot_org.gridlayout.columns = gui_plotorg_waveviewer.columnnum.Value; - ERPwaviewerin.plot_org.gridlayout.rowgap.GTPOP = gui_plotorg_waveviewer.rowgap_auto.Value; - ERPwaviewerin.plot_org.gridlayout.rowgap.GTPValue = str2num(gui_plotorg_waveviewer.rowgapGTPcustom.String); - ERPwaviewerin.plot_org.gridlayout.rowgap.OverlayOP = gui_plotorg_waveviewer.rowoverlap.Value; - ERPwaviewerin.plot_org.gridlayout.rowgap.OverlayValue = str2num(gui_plotorg_waveviewer.rowgapoverlayedit.String); - ERPwaviewerin.plot_org.gridlayout.columngap.GTPOP = gui_plotorg_waveviewer.columngapgtpop.Value; - ERPwaviewerin.plot_org.gridlayout.columngap.GTPValue = str2num(gui_plotorg_waveviewer.columngapgtpcustom.String); - ERPwaviewerin.plot_org.gridlayout.columngap.OverlayOP = gui_plotorg_waveviewer.columnoverlay.Value; - ERPwaviewerin.plot_org.gridlayout.columngap.OverlayValue = str2num(gui_plotorg_waveviewer.columngapoverlapedit.String); - ERPwaviewerin.plot_org.gridlayout.GridLayoutAuto = gui_plotorg_waveviewer.layout_custom_edit_checkbox.Value; - + gui_erp_waviewer.ERPwaviewer.plot_org.Grid = GridValue; + gui_erp_waviewer.ERPwaviewer.plot_org.Overlay = OverlayValue; + gui_erp_waviewer.ERPwaviewer.plot_org.Pages = PageValue; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.op =gui_plotorg_waveviewer.layout_auto.Value; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rows = gui_plotorg_waveviewer.rownum.Value; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columns = gui_plotorg_waveviewer.columnnum.Value; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.GTPOP = gui_plotorg_waveviewer.rowgap_auto.Value; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.GTPValue = str2num(gui_plotorg_waveviewer.rowgapGTPcustom.String); + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.OverlayOP = gui_plotorg_waveviewer.rowoverlap.Value; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.OverlayValue = str2num(gui_plotorg_waveviewer.rowgapoverlayedit.String); + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.GTPOP = gui_plotorg_waveviewer.columngapgtpop.Value; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.GTPValue = str2num(gui_plotorg_waveviewer.columngapgtpcustom.String); + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.OverlayOP = gui_plotorg_waveviewer.columnoverlay.Value; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.OverlayValue = str2num(gui_plotorg_waveviewer.columngapoverlapedit.String); + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.GridLayoutAuto = gui_plotorg_waveviewer.layout_custom_edit_checkbox.Value; MERPWaveViewer_plotorg{2}=gui_plotorg_waveviewer.layout_auto.Value; plotBox(1) = gui_plotorg_waveviewer.rownum.Value; @@ -2662,32 +2577,18 @@ function plotorg_apply(~,~) MERPWaveViewer_plotorg{9}=str2num(gui_plotorg_waveviewer.columngapoverlapedit.String); MERPWaveViewer_plotorg{10}=gui_plotorg_waveviewer.layout_custom_edit_checkbox.Value; estudioworkingmemory('MERPWaveViewer_plotorg',MERPWaveViewer_plotorg);%%save parameters for this panel to memory file - - assignin('base','ALLERPwaviewer',ERPwaviewerin); - overlayIndex = estudioworkingmemory('OverlayIndex'); - if ~isempty(overlayIndex) && overlayIndex==1 - viewer_ERPDAT.count_legend = viewer_ERPDAT.count_legend+1; - end - f_redrawERP_viewer_test();%%plot ERP waves + viewer_ERPDAT.Count_currentERP=1; viewer_ERPDAT.Process_messg =2; end %%----------------change ORG based on the selected ERPsets----------------- function v_currentERP_change(~,~) - if viewer_ERPDAT.Count_currentERP == 0 - return; - end - try - ERPwaviewer_apply = evalin('base','ALLERPwaviewer'); - catch - beep; - disp('f_ERP_plotorg_waveviewer_GUI() error: Please run the ERP wave viewer again.'); + if viewer_ERPDAT.Count_currentERP ~=4 return; end - %%Force Grid, Overlay, and Pages to be 1,2,3, respectively if "Same as ERPLAB" - indexerp = ERPwaviewer_apply.SelectERPIdx; - ALLERP = ERPwaviewer_apply.ALLERP; + indexerp = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + ALLERP = gui_erp_waviewer.ERPwaviewer.ALLERP; for Numofselectederp = 1:numel(indexerp) SrateNum_mp(Numofselectederp,1) = ALLERP(indexerp(Numofselectederp)).srate; end @@ -2700,7 +2601,7 @@ function v_currentERP_change(~,~) gui_plotorg_waveviewer.plotorg_c6.Enable = 'off'; if y_Flag~=1 && y_Flag~= 3 MessageViewer= char(strcat('Sampling rate varies across ERPsets.\n We used the first option (i.e., Channels, Bins, ERPsets)')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =4; gui_plotorg_waveviewer.plotorg_c1.Value = 1; gui_plotorg_waveviewer.plotorg_c2.Value = 0; @@ -2716,15 +2617,14 @@ function v_currentERP_change(~,~) gui_plotorg_waveviewer.plotorg_c5.Enable = 'on'; gui_plotorg_waveviewer.plotorg_c6.Enable = 'on'; end - binArray = ERPwaviewer_apply.bin; - chanArray = ERPwaviewer_apply.chan; - ERPsetArray = ERPwaviewer_apply.SelectERPIdx; - ALLERPIN = ERPwaviewer_apply.ALLERP; + binArray = gui_erp_waviewer.ERPwaviewer.bin; + chanArray = gui_erp_waviewer.ERPwaviewer.chan; + ERPsetArray = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + ALLERPIN = gui_erp_waviewer.ERPwaviewer.ALLERP; if max(ERPsetArray) >length(ALLERPIN) ERPsetArray =length(ALLERPIN); - ERPwaviewer_apply.SelectERPIdx = ERPsetArray; + gui_erp_waviewer.ERPwaviewer.SelectERPIdx = ERPsetArray; end - if gui_plotorg_waveviewer.plotorg_c1.Value ==1 GridValue=1; OverlayValue = 2; PageValue =3; elseif gui_plotorg_waveviewer.plotorg_c2.Value ==1 @@ -2738,18 +2638,18 @@ function v_currentERP_change(~,~) elseif gui_plotorg_waveviewer.plotorg_c6.Value ==1 GridValue=3; OverlayValue = 2; PageValue =1; end - ERPwaviewer_apply.plot_org.Grid =GridValue; - ERPwaviewer_apply.plot_org.Overlay = OverlayValue; - ERPwaviewer_apply.plot_org.Pages = PageValue; + gui_erp_waviewer.ERPwaviewer.plot_org.Grid =GridValue; + gui_erp_waviewer.ERPwaviewer.plot_org.Overlay = OverlayValue; + gui_erp_waviewer.ERPwaviewer.plot_org.Pages = PageValue; [chanStr,binStr,diff_mark] = f_geterpschanbin(ALLERPIN,ERPsetArray); if numel(binArray)> length(binStr) binArray = [1:length(binStr)]; - ERPwaviewer_apply.bin = binArray; + gui_erp_waviewer.ERPwaviewer.bin = binArray; end if numel(chanArray)> length(chanStr) chanArray = [1:length(chanStr)]; - ERPwaviewer_apply.chan = chanArray; + gui_erp_waviewer.ERPwaviewer.chan = chanArray; end if GridValue ==1 %% if the selected Channel is "Grid" @@ -2796,14 +2696,14 @@ function v_currentERP_change(~,~) end end if gui_plotorg_waveviewer.layout_custom_edit_checkbox.Value==0 - ERPwaviewer_apply.plot_org.gridlayout.data =GridinforData; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.data =GridinforData; gui_plotorg_waveviewer.rownum.Value = size(GridinforData,1); gui_plotorg_waveviewer.columnnum.Value= size(GridinforData,2); - ERPwaviewer_apply.plot_org.gridlayout.columFormat = plotArrayFormt'; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columFormat = plotArrayFormt'; else EmptyItemStr = ''; - ERPwaviewer_apply.plot_org.gridlayout.columFormat=plotArrayFormt'; - GridinforDataOrg = ERPwaviewer_apply.plot_org.gridlayout.data; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columFormat=plotArrayFormt'; + GridinforDataOrg = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.data; for ii = 1:size(GridinforDataOrg,1) for jj = 1:size(GridinforDataOrg,2) code = 0; @@ -2827,17 +2727,16 @@ function v_currentERP_change(~,~) if ~isempty(EmptyItemStr) MessageViewer= char(strcat('Plot Organization > v_currentERP_change() - Undefined items in grid locations:',EmptyItemStr,32,'. Because they donot match with the selected labels')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =4; + return; end - - ERPwaviewer_apply.plot_org.gridlayout.data =GridinforDataOrg; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.data =GridinforDataOrg; gui_plotorg_waveviewer.rownum.Value = size(GridinforDataOrg,1); gui_plotorg_waveviewer.columnnum.Value= size(GridinforDataOrg,2); end - ERPwaviewer_apply.plot_org.gridlayout.rows = gui_plotorg_waveviewer.rownum.Value; - ERPwaviewer_apply.plot_org.gridlayout.columns =gui_plotorg_waveviewer.columnnum.Value; - assignin('base','ALLERPwaviewer',ERPwaviewer_apply); + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rows = gui_plotorg_waveviewer.rownum.Value; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columns =gui_plotorg_waveviewer.columnnum.Value; %%save the parameters for this panel to memory file if gui_plotorg_waveviewer.plotorg_c1.Value ==1 @@ -2865,7 +2764,7 @@ function v_currentERP_change(~,~) MERPWaveViewer_plotorg{9}=str2num(gui_plotorg_waveviewer.columngapoverlapedit.String); MERPWaveViewer_plotorg{10}=gui_plotorg_waveviewer.layout_custom_edit_checkbox.Value; estudioworkingmemory('MERPWaveViewer_plotorg',MERPWaveViewer_plotorg);%%save parameters for this panel to memory file - + viewer_ERPDAT.Count_currentERP =5; end @@ -2875,27 +2774,18 @@ function loadproper_change(~,~) return; end try - ERPwaviewer_apply = evalin('base','ALLERPwaviewer'); - catch - beep; - disp('f_ERP_plotorg_waveviewer_GUI() error: Please run the ERP wave viewer again.'); - return; - end - - try - GridValue=ERPwaviewer_apply.plot_org.Grid ; - OverlayValue=ERPwaviewer_apply.plot_org.Overlay; - PageValue=ERPwaviewer_apply.plot_org.Pages; + GridValue=gui_erp_waviewer.ERPwaviewer.plot_org.Grid ; + OverlayValue=gui_erp_waviewer.ERPwaviewer.plot_org.Overlay; + PageValue=gui_erp_waviewer.ERPwaviewer.plot_org.Pages; catch GridValue=1; OverlayValue = 2; PageValue =3; end - try - ALLERP = ERPwaviewer_apply.ALLERP; - indexerp = ERPwaviewer_apply.SelectERPIdx; - ERPsetArray = ERPwaviewer_apply.SelectERPIdx; - chanArray = ERPwaviewer_apply.chan; - binArray = ERPwaviewer_apply.bin; + ALLERP = gui_erp_waviewer.ERPwaviewer.ALLERP; + indexerp = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + ERPsetArray = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + chanArray = gui_erp_waviewer.ERPwaviewer.chan; + binArray = gui_erp_waviewer.ERPwaviewer.bin; catch beep; disp('f_ERP_plotorg_waveviewer_GUI() error: Please run the ERP wave viewer again.'); @@ -2911,16 +2801,16 @@ function loadproper_change(~,~) gui_plotorg_waveviewer.plotorg_c6.Enable = 'off'; if PageValue ~=3 MessageViewer= char(strcat('Warning: Sampling rate varies across ERPsets. We used the first option')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =4; GridValue=1; OverlayValue = 2; PageValue =3; - ERPwaviewer_apply.plot_org.Grid = 1; - ERPwaviewer_apply.plot_org.Overlay = 2; - ERPwaviewer_apply.plot_org.Pages = 3; - ALLERPIN = ERPwaviewer_apply.ALLERP; + gui_erp_waviewer.ERPwaviewer.plot_org.Grid = 1; + gui_erp_waviewer.ERPwaviewer.plot_org.Overlay = 2; + gui_erp_waviewer.ERPwaviewer.plot_org.Pages = 3; + ALLERPIN = gui_erp_waviewer.ERPwaviewer.ALLERP; if max(ERPsetArray) >length(ALLERPIN) ERPsetArray =length(ALLERPIN); - ERPwaviewer_apply.SelectERPIdx = ERPsetArray; + gui_erp_waviewer.ERPwaviewer.SelectERPIdx = ERPsetArray; end [chanStr,binStr,diff_mark] = f_geterpschanbin(ALLERPIN,ERPsetArray); plotArray = chanArray; @@ -2945,10 +2835,10 @@ function loadproper_change(~,~) end end end - ERPwaviewer_apply.plot_org.gridlayout.data =GridinforData; - ERPwaviewer_apply.plot_org.gridlayout.rows = Numrows; - ERPwaviewer_apply.plot_org.gridlayout.columns =Numcolumns; - ERPwaviewer_apply.plot_org.gridlayout.columFormat = plotArrayFormt'; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.data =GridinforData; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rows = Numrows; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columns =Numcolumns; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columFormat = plotArrayFormt'; end else gui_plotorg_waveviewer.plotorg_c2.Enable = 'on'; @@ -2956,8 +2846,6 @@ function loadproper_change(~,~) gui_plotorg_waveviewer.plotorg_c5.Enable = 'on'; gui_plotorg_waveviewer.plotorg_c6.Enable = 'on'; end - - if GridValue==1 && OverlayValue == 2&& PageValue ==3 gui_plotorg_waveviewer.plotorg_c1.Value =1; gui_plotorg_waveviewer.plotorg_c2.Value =0; @@ -3008,7 +2896,6 @@ function loadproper_change(~,~) gui_plotorg_waveviewer.LayoutFlag = [0,0,0,0,0,1]; end - [chanStr,binStr,diff_mark] = f_geterpschanbin(ALLERP,ERPsetArray); if GridValue ==1 %% if the selected Channel is "Grid" plotArray = chanArray; @@ -3050,45 +2937,43 @@ function loadproper_change(~,~) end end end - AutoValue = ERPwaviewer_apply.plot_org.gridlayout.op; + AutoValue = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.op; if AutoValue ==1 Enable = 'off'; gui_plotorg_waveviewer.layout_auto.Value =1; gui_plotorg_waveviewer.layout_custom.Value = 0; - ERPwaviewer_apply.plot_org.gridlayout.rows =NumrowsDef; - ERPwaviewer_apply.plot_org.gridlayout.columns = NumcolumnsDef; - ERPwaviewer_apply.plot_org.gridlayout.rowgap.GTPOP=1; - ERPwaviewer_apply.plot_org.gridlayout.rowgap.GTPValue=10; - ERPwaviewer_apply.plot_org.gridlayout.rowgap.OverlayOP=0; - ERPwaviewer_apply.plot_org.gridlayout.rowgap.OverlayValue=40; - ERPwaviewer_apply.plot_org.gridlayout.columngap.GTPOP=1; - ERPwaviewer_apply.plot_org.gridlayout.columngap.GTPValue=10; - ERPwaviewer_apply.plot_org.gridlayout.columngap.OverlayOP=0; - ERPwaviewer_apply.plot_org.gridlayout.columngap.OverlayValue=40; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rows =NumrowsDef; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columns = NumcolumnsDef; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.GTPOP=1; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.GTPValue=10; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.OverlayOP=0; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.OverlayValue=40; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.GTPOP=1; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.GTPValue=10; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.OverlayOP=0; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.OverlayValue=40; else Enable = 'on'; gui_plotorg_waveviewer.layout_auto.Value =0; gui_plotorg_waveviewer.layout_custom.Value = 1; - - end try - GridLayoutAuto = ERPwaviewer_apply.plot_org.gridlayout.GridLayoutAuto; + GridLayoutAuto = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.GridLayoutAuto; catch GridLayoutAuto=0; end if GridLayoutAuto==0 - ERPwaviewer_apply.plot_org.gridlayout.data = GridinforDatadef; - ERPwaviewer_apply.plot_org.gridlayout.columFormat=plotArrayFormtdef; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.data = GridinforDatadef; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columFormat=plotArrayFormtdef; gui_plotorg_waveviewer.layout_custom_edit.Enable = 'off'; gui_plotorg_waveviewer.layout_custom_edit_checkbox.Value =0; else gui_plotorg_waveviewer.layout_custom_edit.Enable = 'on'; gui_plotorg_waveviewer.layout_custom_edit_checkbox.Value =1; - ERPwaviewer_apply.plot_org.gridlayout.columFormat=plotArrayFormtdef; - Datanew = ERPwaviewer_apply.plot_org.gridlayout.data; - ERPwaviewer_apply.plot_org.gridlayout.rows =size(Datanew,1); - ERPwaviewer_apply.plot_org.gridlayout.columns = size(Datanew,2); + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columFormat=plotArrayFormtdef; + Datanew = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.data; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rows =size(Datanew,1); + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columns = size(Datanew,2); LabelUsedIndex = []; countlabel=0; EmptyItemStr =''; @@ -3112,15 +2997,13 @@ function loadproper_change(~,~) end end end - ERPwaviewer_apply.plot_org.gridlayout.data = Datanew; - + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.data = Datanew; if ~isempty(EmptyItemStr) MessageViewer= char(strcat('Plot Organization > loadproper_change() - Undefined items in grid locations:',EmptyItemStr,32,'. Because they donot match with the selected labels')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =4; + return; end - - end gui_plotorg_waveviewer.layout_auto.Enable ='on'; @@ -3135,16 +3018,16 @@ function loadproper_change(~,~) gui_plotorg_waveviewer.columngapgtpcustom.Enable = Enable; gui_plotorg_waveviewer.columnoverlay.Enable = Enable; gui_plotorg_waveviewer.columngapoverlapedit.Enable = Enable; - RowNum = ERPwaviewer_apply.plot_org.gridlayout.rows; - columNum = ERPwaviewer_apply.plot_org.gridlayout.columns; + RowNum = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rows; + columNum = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columns; gui_plotorg_waveviewer.rownum.Value = RowNum; gui_plotorg_waveviewer.columnnum.Value = columNum; %%Row gap and overlay - rowgapValue = ERPwaviewer_apply.plot_org.gridlayout.rowgap.GTPOP; - rowgapCustom = ERPwaviewer_apply.plot_org.gridlayout.rowgap.GTPValue; - rowoverlayValue = ERPwaviewer_apply.plot_org.gridlayout.rowgap.OverlayOP; - rowoverlayCustom = ERPwaviewer_apply.plot_org.gridlayout.rowgap.OverlayValue; + rowgapValue = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.GTPOP; + rowgapCustom = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.GTPValue; + rowoverlayValue = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.OverlayOP; + rowoverlayCustom = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.OverlayValue; gui_plotorg_waveviewer.rowgap_auto.Value = rowgapValue; gui_plotorg_waveviewer.rowgapGTPcustom.String = num2str(rowgapCustom); gui_plotorg_waveviewer.rowoverlap.Value = rowoverlayValue; @@ -3163,10 +3046,10 @@ function loadproper_change(~,~) end %%column gap and overlay - columnGapValue = ERPwaviewer_apply.plot_org.gridlayout.columngap.GTPOP; - columnGapcustom = ERPwaviewer_apply.plot_org.gridlayout.columngap.GTPValue; - columnoverlayValue = ERPwaviewer_apply.plot_org.gridlayout.columngap.OverlayOP; - columnoverlaycustom = ERPwaviewer_apply.plot_org.gridlayout.columngap.OverlayValue; + columnGapValue = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.GTPOP; + columnGapcustom = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.GTPValue; + columnoverlayValue = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.OverlayOP; + columnoverlaycustom = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.OverlayValue; gui_plotorg_waveviewer.columngapgtpop.Value = columnGapValue; gui_plotorg_waveviewer.columngapgtpcustom.String = num2str(columnGapcustom); gui_plotorg_waveviewer.columnoverlay.Value = columnoverlayValue; @@ -3183,7 +3066,6 @@ function loadproper_change(~,~) gui_plotorg_waveviewer.columngapoverlapedit.Enable = 'on'; end end - assignin('base','ALLERPwaviewer',ERPwaviewer_apply); %%save the parameters for this panel to memory file if gui_plotorg_waveviewer.plotorg_c1.Value ==1 @@ -3211,7 +3093,6 @@ function loadproper_change(~,~) MERPWaveViewer_plotorg{9}=str2num(gui_plotorg_waveviewer.columngapoverlapedit.String); MERPWaveViewer_plotorg{10}=gui_plotorg_waveviewer.layout_custom_edit_checkbox.Value; estudioworkingmemory('MERPWaveViewer_plotorg',MERPWaveViewer_plotorg);%%save parameters for this panel to memory file - viewer_ERPDAT.loadproper_count =5; end @@ -3230,16 +3111,8 @@ function count_twopanels_change(~,~) return; end - %%checking the numbers of rows and columns - try - ERPwaviewerin = evalin('base','ALLERPwaviewer'); - catch - viewer_ERPDAT.Process_messg =3; - fprintf(2,'\n Plot Organization > Apply-f_ERP_plotorg_waveviewer_GUI() error: Cannot get parameters for whole panel.\n Please run My viewer again.\n\n'); - return; - end - ERPsetArray = ERPwaviewerin.SelectERPIdx; - ALLERPIN = ERPwaviewerin.ALLERP; + ERPsetArray = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + ALLERPIN = gui_erp_waviewer.ERPwaviewer.ALLERP; if max(ERPsetArray) >length(ALLERPIN) ERPsetArray =length(ALLERPIN); end @@ -3255,7 +3128,7 @@ function count_twopanels_change(~,~) gui_plotorg_waveviewer.plotorg_c6.Enable = 'off'; if y_Flag~=1 && y_Flag~= 3 MessageViewer= char(strcat('Warning: Sampling rate varies across ERPsets. We used the first option')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =4; gui_plotorg_waveviewer.plotorg_c1.Value = 1; gui_plotorg_waveviewer.plotorg_c2.Value = 0; @@ -3264,10 +3137,9 @@ function count_twopanels_change(~,~) gui_plotorg_waveviewer.plotorg_c5.Value = 0; gui_plotorg_waveviewer.plotorg_c6.Value = 0; gui_plotorg_waveviewer.LayoutFlag = [1,0,0,0,0,0]; - ERPwaviewerin.plot_org.Grid = 1; - ERPwaviewerin.plot_org.Overlay = 2; - ERPwaviewerin.plot_org.Pages = 3; - assignin('base','ALLERPwaviewer',ERPwaviewerin); + gui_erp_waviewer.ERPwaviewer.plot_org.Grid = 1; + gui_erp_waviewer.ERPwaviewer.plot_org.Overlay = 2; + gui_erp_waviewer.ERPwaviewer.plot_org.Pages = 3; end else gui_plotorg_waveviewer.plotorg_c2.Enable = 'on'; @@ -3278,149 +3150,140 @@ function count_twopanels_change(~,~) plotorg_apply(); end - %%------------------------------------------------------------------------- %%-----------------Reset this panel with the default parameters------------ %%------------------------------------------------------------------------- function Reset_Waviewer_panel_change(~,~) - if viewer_ERPDAT.Reset_Waviewer_panel==4 - try - ERPwaviewerin = evalin('base','ALLERPwaviewer'); - ALLERP = ERPwaviewerin.ALLERP; - indexerp = ERPwaviewerin.SelectERPIdx; - catch - beep; - disp('f_ERP_plotorg_waveviewer_GUI error: Restart ERPwave Viewer'); - return; - end - gui_plotorg_waveviewer.plotorg_c1.Value = 1; - gui_plotorg_waveviewer.plotorg_c2.Value = 0; - gui_plotorg_waveviewer.plotorg_c3.Value = 0; - gui_plotorg_waveviewer.plotorg_c4.Value = 0; - gui_plotorg_waveviewer.plotorg_c5.Value = 0; - gui_plotorg_waveviewer.plotorg_c6.Value = 0; - gui_plotorg_waveviewer.LayoutFlag = [1,0,0,0,0,0]; - ERPwaviewerin.plot_org.Grid = 1; - ERPwaviewerin.plot_org.Overlay = 2; - ERPwaviewerin.plot_org.Pages = 3; - estudioworkingmemory('OverlayIndex',1); - %%check sampling rate and data type - for Numofselectederp = 1:numel(indexerp) - SrateNum_mp(Numofselectederp,1) = ALLERP(indexerp(Numofselectederp)).srate; - Datype{Numofselectederp} = ALLERP(indexerp(Numofselectederp)).datatype; - end - if length(unique(Datype))~=1 || (numel(indexerp)==1 && strcmpi(char(Datype),'ERP')~=1) - MessageViewer= char(strcat('Warning: Type of data varies across ERPsets. We only plot waves for ERPset')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); - viewer_ERPDAT.Process_messg =4; - return; - end - gui_plotorg_waveviewer.plotorg_c2.Enable = 'on'; - gui_plotorg_waveviewer.plotorg_c4.Enable = 'on'; - gui_plotorg_waveviewer.plotorg_c5.Enable = 'on'; - gui_plotorg_waveviewer.plotorg_c6.Enable = 'on'; - ERPwaviewerin.plot_org.gridlayout.op = 1; - gui_plotorg_waveviewer.layout_auto.Value =1; - gui_plotorg_waveviewer.layout_custom.Value =0; - %%row and column numbers - plotArray = ERPwaviewerin.chan; - if isempty(plotArray) - plotArray = [1:ERPwaviewerin.ERP.nchan]; - end - plotBox = f_getrow_columnautowaveplot(plotArray); - try - NumrowsDef = plotBox(1); - NumcolumnsDef = plotBox(2); - catch - NumrowsDef = 1; - NumcolumnsDef = 1; - end - gui_plotorg_waveviewer.rownum.Value=NumrowsDef; - gui_plotorg_waveviewer.columnnum.Value=NumcolumnsDef; - gui_plotorg_waveviewer.rownum.Enable='off'; - gui_plotorg_waveviewer.columnnum.Enable='off'; - - ERPwaviewerin.plot_org.gridlayout.rows = NumrowsDef; - ERPwaviewerin.plot_org.gridlayout.columns=NumcolumnsDef; - ERPsetArray = ERPwaviewerin.SelectERPIdx; - ALLERPIN = ERPwaviewerin.ALLERP; - if max(ERPsetArray) >length(ALLERPIN) - ERPsetArray =length(ALLERPIN); - end - [chanStr,binStr,diff_mark] = f_geterpschanbin(ALLERPIN,ERPsetArray); - plotArrayStr = chanStr(plotArray); - count = 0; - for Numofrows = 1:NumrowsDef - for Numofcolumns = 1:NumcolumnsDef - count = count +1; - if count> numel(plotArray) - GridinforData{Numofrows,Numofcolumns} = ''; - else - GridinforData{Numofrows,Numofcolumns} = char(plotArrayStr(count)); - end + if viewer_ERPDAT.Reset_Waviewer_panel~=4 + return; + end + ALLERP = gui_erp_waviewer.ERPwaviewer.ALLERP; + indexerp = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + gui_plotorg_waveviewer.plotorg_c1.Value = 1; + gui_plotorg_waveviewer.plotorg_c2.Value = 0; + gui_plotorg_waveviewer.plotorg_c3.Value = 0; + gui_plotorg_waveviewer.plotorg_c4.Value = 0; + gui_plotorg_waveviewer.plotorg_c5.Value = 0; + gui_plotorg_waveviewer.plotorg_c6.Value = 0; + gui_plotorg_waveviewer.LayoutFlag = [1,0,0,0,0,0]; + gui_erp_waviewer.ERPwaviewer.plot_org.Grid = 1; + gui_erp_waviewer.ERPwaviewer.plot_org.Overlay = 2; + gui_erp_waviewer.ERPwaviewer.plot_org.Pages = 3; + estudioworkingmemory('OverlayIndex',1); + %%check sampling rate and data type + for Numofselectederp = 1:numel(indexerp) + SrateNum_mp(Numofselectederp,1) = ALLERP(indexerp(Numofselectederp)).srate; + Datype{Numofselectederp} = ALLERP(indexerp(Numofselectederp)).datatype; + end + if length(unique(Datype))~=1 || (numel(indexerp)==1 && strcmpi(char(Datype),'ERP')~=1) + MessageViewer= char(strcat('Warning: Type of data varies across ERPsets. We only plot waves for ERPset')); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); + viewer_ERPDAT.Process_messg =4; + return; + end + gui_plotorg_waveviewer.plotorg_c2.Enable = 'on'; + gui_plotorg_waveviewer.plotorg_c4.Enable = 'on'; + gui_plotorg_waveviewer.plotorg_c5.Enable = 'on'; + gui_plotorg_waveviewer.plotorg_c6.Enable = 'on'; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.op = 1; + gui_plotorg_waveviewer.layout_auto.Value =1; + gui_plotorg_waveviewer.layout_custom.Value =0; + %%row and column numbers + plotArray = gui_erp_waviewer.ERPwaviewer.chan; + if isempty(plotArray) + plotArray = [1:gui_erp_waviewer.ERPwaviewer.ERP.nchan]; + end + plotBox = f_getrow_columnautowaveplot(plotArray); + try + NumrowsDef = plotBox(1); + NumcolumnsDef = plotBox(2); + catch + NumrowsDef = 1; + NumcolumnsDef = 1; + end + gui_plotorg_waveviewer.rownum.Value=NumrowsDef; + gui_plotorg_waveviewer.columnnum.Value=NumcolumnsDef; + gui_plotorg_waveviewer.rownum.Enable='off'; + gui_plotorg_waveviewer.columnnum.Enable='off'; + + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rows = NumrowsDef; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columns=NumcolumnsDef; + ERPsetArray = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + ALLERPIN = gui_erp_waviewer.ERPwaviewer.ALLERP; + if max(ERPsetArray) >length(ALLERPIN) + ERPsetArray =length(ALLERPIN); + end + [chanStr,binStr,diff_mark] = f_geterpschanbin(ALLERPIN,ERPsetArray); + plotArrayStr = chanStr(plotArray); + count = 0; + for Numofrows = 1:NumrowsDef + for Numofcolumns = 1:NumcolumnsDef + count = count +1; + if count> numel(plotArray) + GridinforData{Numofrows,Numofcolumns} = ''; + else + GridinforData{Numofrows,Numofcolumns} = char(plotArrayStr(count)); end end - ERPwaviewerin.plot_org.gridlayout.data =GridinforData; - plotArrayFormt = plotArrayStr; - ERPwaviewerin.plot_org.gridlayout.columFormat = plotArrayFormt'; - %%Grid spacing - gui_plotorg_waveviewer.rowgap_auto.Value =1; - gui_plotorg_waveviewer.rowgapGTPcustom.String = '10'; - gui_plotorg_waveviewer.rowoverlap.Value = 0; - gui_plotorg_waveviewer.rowgapoverlayedit.String = '40'; - gui_plotorg_waveviewer.columngapgtpop.Value =1; - gui_plotorg_waveviewer.columngapgtpcustom.String = '10'; - gui_plotorg_waveviewer.columnoverlay.Value=0; - gui_plotorg_waveviewer.columngapoverlapedit.String = '40'; - gui_plotorg_waveviewer.rowgap_auto.Enable ='off'; - gui_plotorg_waveviewer.rowgapGTPcustom.Enable ='off'; - gui_plotorg_waveviewer.rowoverlap.Enable ='off'; - gui_plotorg_waveviewer.rowgapoverlayedit.Enable ='off'; - gui_plotorg_waveviewer.columngapgtpop.Enable ='off'; - gui_plotorg_waveviewer.columngapgtpcustom.Enable ='off'; - gui_plotorg_waveviewer.columnoverlay.Enable ='off'; - gui_plotorg_waveviewer.columngapoverlapedit.Enable ='off'; - - ERPwaviewerin.plot_org.gridlayout.rowgap.GTPOP = gui_plotorg_waveviewer.rowgap_auto.Value; - ERPwaviewerin.plot_org.gridlayout.rowgap.GTPValue = str2num(gui_plotorg_waveviewer.rowgapGTPcustom.String); - ERPwaviewerin.plot_org.gridlayout.rowgap.OverlayOP = gui_plotorg_waveviewer.rowoverlap.Value; - ERPwaviewerin.plot_org.gridlayout.rowgap.OverlayValue = str2num(gui_plotorg_waveviewer.rowgapoverlayedit.String); - ERPwaviewerin.plot_org.gridlayout.columngap.GTPOP = gui_plotorg_waveviewer.columngapgtpop.Value; - ERPwaviewerin.plot_org.gridlayout.columngap.GTPValue = str2num(gui_plotorg_waveviewer.columngapgtpcustom.String); - ERPwaviewerin.plot_org.gridlayout.columngap.OverlayOP = gui_plotorg_waveviewer.columnoverlay.Value; - ERPwaviewerin.plot_org.gridlayout.columngap.OverlayValue = str2num(gui_plotorg_waveviewer.columngapoverlapedit.String); - - gui_plotorg_waveviewer.layout_custom_edit_checkbox.Value=0; %,'HorizontalAlignment','left' - gui_plotorg_waveviewer.layout_custom_edit.Enable='off'; - - assignin('base','ALLERPwaviewer',ERPwaviewerin); - - %%Using the default background color for "apply" and title bar - gui_plotorg_waveviewer.apply.BackgroundColor = [1 1 1]; - gui_plotorg_waveviewer.apply.ForegroundColor = [0 0 0]; - box_erpwave_viewer_plotorg.TitleColor= [0.5 0.5 0.9]; - - %%save the parameters for this panel to memory file - MERPWaveViewer_plotorg{1}=1; - MERPWaveViewer_plotorg{2}=gui_plotorg_waveviewer.layout_auto.Value; - plotBox(1) = gui_plotorg_waveviewer.rownum.Value; - plotBox(2) = gui_plotorg_waveviewer.columnnum.Value; - MERPWaveViewer_plotorg{3}=plotBox; - MERPWaveViewer_plotorg{4}= gui_plotorg_waveviewer.rowgap_auto.Value; - MERPWaveViewer_plotorg{5}=str2num(gui_plotorg_waveviewer.rowgapGTPcustom.String); - MERPWaveViewer_plotorg{6}=str2num(gui_plotorg_waveviewer.rowgapoverlayedit.String); - MERPWaveViewer_plotorg{7} = gui_plotorg_waveviewer.columngapgtpop.Value; - MERPWaveViewer_plotorg{8}=str2num(gui_plotorg_waveviewer.columngapgtpcustom.String); - MERPWaveViewer_plotorg{9}=str2num(gui_plotorg_waveviewer.columngapoverlapedit.String); - MERPWaveViewer_plotorg{10}=gui_plotorg_waveviewer.layout_custom_edit_checkbox.Value; - estudioworkingmemory('MERPWaveViewer_plotorg',MERPWaveViewer_plotorg);%%save parameters for this panel to memory file - - %%execute next panel - viewer_ERPDAT.Reset_Waviewer_panel=5; end + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.data =GridinforData; + plotArrayFormt = plotArrayStr; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columFormat = plotArrayFormt'; + %%Grid spacing + gui_plotorg_waveviewer.rowgap_auto.Value =1; + gui_plotorg_waveviewer.rowgapGTPcustom.String = '10'; + gui_plotorg_waveviewer.rowoverlap.Value = 0; + gui_plotorg_waveviewer.rowgapoverlayedit.String = '40'; + gui_plotorg_waveviewer.columngapgtpop.Value =1; + gui_plotorg_waveviewer.columngapgtpcustom.String = '10'; + gui_plotorg_waveviewer.columnoverlay.Value=0; + gui_plotorg_waveviewer.columngapoverlapedit.String = '40'; + gui_plotorg_waveviewer.rowgap_auto.Enable ='off'; + gui_plotorg_waveviewer.rowgapGTPcustom.Enable ='off'; + gui_plotorg_waveviewer.rowoverlap.Enable ='off'; + gui_plotorg_waveviewer.rowgapoverlayedit.Enable ='off'; + gui_plotorg_waveviewer.columngapgtpop.Enable ='off'; + gui_plotorg_waveviewer.columngapgtpcustom.Enable ='off'; + gui_plotorg_waveviewer.columnoverlay.Enable ='off'; + gui_plotorg_waveviewer.columngapoverlapedit.Enable ='off'; + + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.GTPOP = gui_plotorg_waveviewer.rowgap_auto.Value; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.GTPValue = str2num(gui_plotorg_waveviewer.rowgapGTPcustom.String); + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.OverlayOP = gui_plotorg_waveviewer.rowoverlap.Value; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.OverlayValue = str2num(gui_plotorg_waveviewer.rowgapoverlayedit.String); + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.GTPOP = gui_plotorg_waveviewer.columngapgtpop.Value; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.GTPValue = str2num(gui_plotorg_waveviewer.columngapgtpcustom.String); + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.OverlayOP = gui_plotorg_waveviewer.columnoverlay.Value; + gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.OverlayValue = str2num(gui_plotorg_waveviewer.columngapoverlapedit.String); + + gui_plotorg_waveviewer.layout_custom_edit_checkbox.Value=0; %,'HorizontalAlignment','left' + gui_plotorg_waveviewer.layout_custom_edit.Enable='off'; + + %%Using the default background color for "apply" and title bar + gui_plotorg_waveviewer.apply.BackgroundColor = [1 1 1]; + gui_plotorg_waveviewer.apply.ForegroundColor = [0 0 0]; + box_erpwave_viewer_plotorg.TitleColor= [0.5 0.5 0.9]; + + %%save the parameters for this panel to memory file + MERPWaveViewer_plotorg{1}=1; + MERPWaveViewer_plotorg{2}=gui_plotorg_waveviewer.layout_auto.Value; + plotBox(1) = gui_plotorg_waveviewer.rownum.Value; + plotBox(2) = gui_plotorg_waveviewer.columnnum.Value; + MERPWaveViewer_plotorg{3}=plotBox; + MERPWaveViewer_plotorg{4}= gui_plotorg_waveviewer.rowgap_auto.Value; + MERPWaveViewer_plotorg{5}=str2num(gui_plotorg_waveviewer.rowgapGTPcustom.String); + MERPWaveViewer_plotorg{6}=str2num(gui_plotorg_waveviewer.rowgapoverlayedit.String); + MERPWaveViewer_plotorg{7} = gui_plotorg_waveviewer.columngapgtpop.Value; + MERPWaveViewer_plotorg{8}=str2num(gui_plotorg_waveviewer.columngapgtpcustom.String); + MERPWaveViewer_plotorg{9}=str2num(gui_plotorg_waveviewer.columngapoverlapedit.String); + MERPWaveViewer_plotorg{10}=gui_plotorg_waveviewer.layout_custom_edit_checkbox.Value; + estudioworkingmemory('MERPWaveViewer_plotorg',MERPWaveViewer_plotorg);%%save parameters for this panel to memory file + %%execute next panel + viewer_ERPDAT.Reset_Waviewer_panel=5; end%%end of reset +%%----------------Press Return key to execute the function----------------- function plotorg_presskey(hObject, eventdata) keypress = eventdata.Key; if strcmp (keypress, 'return') || strcmp (keypress, 'enter') @@ -3433,4 +3296,15 @@ function plotorg_presskey(hObject, eventdata) return; end end + +%%----------change the title color and backgroundcolor for "cancel" and---- +%%--------------"Apply" if any of parameters was changed------------------- + function track_changes_title_color(~,~) + gui_plotorg_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_plotorg_waveviewer.apply.ForegroundColor = [1 1 1]; + box_erpwave_viewer_plotorg.TitleColor= [0.4940 0.1840 0.5560]; + gui_plotorg_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_plotorg_waveviewer.cancel.ForegroundColor = [1 1 1]; + end + end \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ERP_property_waveviewer_GUI.m b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ERP_property_waveviewer_GUI.m index 3dc6d2f2..e44deb8e 100755 --- a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ERP_property_waveviewer_GUI.m +++ b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ERP_property_waveviewer_GUI.m @@ -5,16 +5,13 @@ % Center for Mind and Brain % University of California, Davis, % Davis, CA -% 2022 +% 2022 && Nov 2023 function varargout = f_ERP_property_waveviewer_GUI(varargin) global gui_erp_waviewer; global viewer_ERPDAT; -% addlistener(viewer_ERPDAT,'v_currentERP_change',@Count_currentERPChanged); -% addlistener(viewer_ERPDAT,'loadproper_change',@loadproper_change); - - +addlistener(viewer_ERPDAT,'Reset_Waviewer_panel_change',@Reset_Waviewer_panel_change); gui_property_waveviewer = struct(); %-----------------------------Name the title---------------------------------------------- @@ -31,7 +28,7 @@ box_erpwave_viewer_property = uiextras.BoxPanel('Parent', varargin{1}, 'Title', 'Viewer Properties', 'Padding', 5,... 'FontSize', varargin{2},'BackgroundColor',ColorBviewer_def,'TitleColor',[0.5 0.5 0.9],'ForegroundColor','w'); end -gui_erp_waviewer.Window.WindowButtonMotionFcn = {@ViewerPos}; +% gui_erp_waviewer.Window.WindowButtonMotionFcn = {@Viewerpos_width}; %-----------------------------Draw the panel------------------------------------- try FonsizeDefault = varargin{2}; @@ -75,29 +72,34 @@ function drawui_plot_property(FonsizeDefault) 'callback',@viewer_TN,'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1]); % set(gui_property_waveviewer.viewer_TN_title, 'Sizes',[70 165]); - - gui_property_waveviewer.viewer_pos_title = uiextras.HBox('Parent', gui_property_waveviewer.DataSelBox,'BackgroundColor',ColorBviewer_def); - uicontrol('Style','text','Parent', gui_property_waveviewer.viewer_pos_title,'String','Position:',... - 'FontSize',FonsizeDefault,'BackgroundColor',ColorBviewer_def); %1A New_pos = gui_erp_waviewer.screen_pos; - if isempty(New_pos) - New_pos = [0.01,0.01,75,75]; - erpworkingmemory('ERPWaveScreenPos',New_pos); + if isempty(New_pos) || numel(New_pos)~=2 + New_pos = [75,75]; + estudioworkingmemory('ERPWaveScreenPos',New_pos); end - New_pos1 = roundn(New_pos,-3); - New_poStr = char([num2str(New_pos1(1)),32,num2str(New_pos1(2)),32,num2str(New_pos1(3)),32,num2str(New_pos1(4))]); - - gui_property_waveviewer.parameters_pos = uicontrol('Style','edit','Parent',gui_property_waveviewer.viewer_pos_title,'String',New_poStr,... - 'callback',@Viewerpos,'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1]); % - set(gui_property_waveviewer.viewer_pos_title, 'Sizes',[70 165]); + New_pos = roundn(New_pos,-3); gui_property_waveviewer.viewer_pos_title1 = uiextras.HBox('Parent', gui_property_waveviewer.DataSelBox,'BackgroundColor',ColorBviewer_def); - uicontrol('Style','text','Parent', gui_property_waveviewer.viewer_pos_title1,'String','',... + uicontrol('Style','text','Parent', gui_property_waveviewer.viewer_pos_title1,'String','Window size:',... + 'FontSize',FonsizeDefault,'BackgroundColor',ColorBviewer_def,'FontWeight','bold'); %1A + + gui_property_waveviewer.viewer_wz_title = uiextras.HBox('Parent', gui_property_waveviewer.DataSelBox,'BackgroundColor',ColorBviewer_def); + uicontrol('Style','text','Parent', gui_property_waveviewer.viewer_wz_title,'String','Width:',... + 'FontSize',FonsizeDefault,'BackgroundColor',ColorBviewer_def); %1A + gui_property_waveviewer.parameters_pos_width = uicontrol('Style','edit','Parent',gui_property_waveviewer.viewer_wz_title,'String',num2str(New_pos(1)),... + 'callback',@Viewerpos_width,'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1]); % + uicontrol('Style','text','Parent', gui_property_waveviewer.viewer_wz_title,'String','%,',... + 'FontSize',FonsizeDefault,'BackgroundColor',ColorBviewer_def); %1A + uicontrol('Style','text','Parent', gui_property_waveviewer.viewer_wz_title,'String','Height:',... 'FontSize',FonsizeDefault,'BackgroundColor',ColorBviewer_def); %1A - uicontrol('Style','text','Parent',gui_property_waveviewer.viewer_pos_title1,'String','(left bottom width height) in %',... - 'FontSize',FonsizeDefault,'BackgroundColor',ColorBviewer_def); % - set(gui_property_waveviewer.viewer_pos_title1, 'Sizes',[68 165]); + gui_property_waveviewer.parameters_pos_height = uicontrol('Style','edit','Parent',gui_property_waveviewer.viewer_wz_title,'String',num2str(New_pos(2)),... + 'callback',@Viewerpos_height,'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1]); % + uicontrol('Style','text','Parent', gui_property_waveviewer.viewer_wz_title,'String','%',... + 'FontSize',FonsizeDefault,'BackgroundColor',ColorBviewer_def); %1A + + set(gui_property_waveviewer.viewer_wz_title, 'Sizes',[40 55 20 45 55 20]); + set(gui_property_waveviewer.DataSelBox ,'Sizes',[30 25 25 25]) end @@ -110,46 +112,58 @@ function drawui_plot_property(FonsizeDefault) %%-------------------------Setting for load-------------------------------- function parameters_load(~,~) - MessageViewer= char(strcat('Viewer Properties > Load')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =1; + try + ALLERP = evalin('base','ALLERP'); + catch + MessageViewer= char(strcat('Viewer Properties > Load: ALLERP is not available on workspace, you therfore cannot further handle')); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); + viewer_ERPDAT.Process_messg =4; + return; + end + if isempty(ALLERP) + MessageViewer= char(strcat('Viewer Properties > Load: ALLERP is empty on workspace, you therfore cannot further handle')); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); + viewer_ERPDAT.Process_messg =4; + return; + end [filename, filepath,indxs] = uigetfile({'*.mat'}, ... 'Load parametrs for "My viewer"', ... 'MultiSelect', 'off'); if isequal(filename,0) - disp('User selected Cancel'); return; end [pathstr, erpfilename, ext] = fileparts(filename) ; - if indxs==1 - ext = '.mat'; - elseif indxs==2 - ext = '.mat'; - else - ext = '.mat'; - end + ext = '.mat'; + erpFilename = char(strcat(erpfilename,ext)); try - ERPwaviewer = importdata([filepath,erpFilename]); - ERPwaviewerdef = evalin('base','ALLERPwaviewer'); - ERPwaviewer.ALLERP= ERPwaviewerdef.ALLERP; - ERPwaviewer.ERP = ERPwaviewerdef.ERP; - ERPwaviewer.CURRENTERP = ERPwaviewerdef.CURRENTERP; - ERPwaviewer.SelectERPIdx = ERPwaviewerdef.SelectERPIdx; - ERPwaviewer.PageIndex = ERPwaviewerdef.PageIndex; - assignin('base','ALLERPwaviewer',ERPwaviewer); + gui_erp_waviewer.ERPwaviewer = importdata([filepath,erpFilename]); + gui_erp_waviewer.ERPwaviewer.ALLERP= ALLERP; catch - beep; - MessageViewer=['\n\n My viewer > Viewer Propoerties > Load: Cannot load the saved parameters of My viewer ']; - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); - viewer_ERPDAT.Process_messg =3; + MessageViewer=['My viewer > Viewer Propoerties > Load: Cannot load the saved parameters of My viewer ']; + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); + viewer_ERPDAT.Process_messg =4; return; end + try + CURRENTERP = evalin('base','CURRENTERP'); + catch + CURRENTERP = []; + end + if isempty(CURRENTERP) || numel(CURRENTERP)~=1 || any(CURRENTERP>length(ALLERP)) + CURRENTERP = length(ALLERP); + end + gui_erp_waviewer.ERPwaviewer.ERP = ALLERP(CURRENTERP); + gui_erp_waviewer.ERPwaviewer.CURRENTERP = CURRENTERP; + gui_erp_waviewer.ERPwaviewer.SelectERPIdx = CURRENTERP; + gui_erp_waviewer.ERPwaviewer.PageIndex = 1; %%check current version ERPtooltype = erpgettoolversion('tooltype'); if strcmpi(ERPtooltype,'EStudio') @@ -179,7 +193,7 @@ function parameters_load(~,~) elseif strcmpi(ERPtooltype,'ERPLAB') MessageViewer= char(strcat('Viewer Properties > Load - This settings file was created using an older version of ERPLAB')); end - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =4; end @@ -187,25 +201,19 @@ function parameters_load(~,~) f_redrawERP_viewer_test(); MessageViewer= char(strcat('Viewer Properties > Load')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =2; end %%-------------------------Setting for Save-------------------------------- function parameters_save(~,~) MessageViewer= char(strcat('Viewer Properties > Save')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =1; - try - ERPwaviewer = evalin('base','ALLERPwaviewer'); - catch - beep; - viewer_ERPDAT.Process_messg =3; - fprintf(2,'\n\n My viewer > Viewer Propoerties > Save: \n There is no "ALLERPwaviewer" on Workspace, Please run My Viewer again.\n\n'); - return; - end + ERPwaviewer = gui_erp_waviewer.ERPwaviewer; + pathstr = pwd; - namedef ='Viewer'; + namedef ='Advanced_ERPWave_Viewer'; erpFilename = char(strcat(namedef,'.mat')); ERPtooltype = erpgettoolversion('tooltype'); @@ -226,7 +234,6 @@ function parameters_save(~,~) end ERPwaviewer.version = erplabstudiover; - ERPwaviewer.ALLERP = []; ERPwaviewer.ERP = []; ERPwaviewer.CURRENTERP = []; @@ -235,24 +242,23 @@ function parameters_save(~,~) try save([pathstr,filesep,erpFilename],'ERPwaviewer','-v7.3'); catch - beep; - MessageViewer= char(strcat('Viewer Propoerties > Save: \n Cannot save the parameters of My viewer')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); - viewer_ERPDAT.Process_messg =3; + MessageViewer= char(strcat('Viewer Propoerties > Save: Cannot save the parameters of My viewer')); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); + viewer_ERPDAT.Process_messg =4; return; end MessageViewer= char(strcat('Viewer Properties > Save')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =2; end %%-------------------------Setting for Save as-------------------------------- function parameters_saveas(~,~) MessageViewer= char(strcat('Viewer Properties > Save as')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =1; pathstr = pwd; - namedef ='Viewer'; + namedef ='Advanced_ERPWave_Viewer'; [erpfilename, erppathname, indxs] = uiputfile({'*.mat'}, ... ['Save "','Information of My Viewer', '" as'],... fullfile(pathstr,namedef)); @@ -264,24 +270,11 @@ function parameters_saveas(~,~) return end - try - ERPwaviewer = evalin('base','ALLERPwaviewer'); - catch - beep; - viewer_ERPDAT.Process_messg =3; - fprintf(2,'\n\n My viewer > Viewer Propoerties > Save as: \n There is no "ALLERPwaviewer" on Workspace, Please run My Viewer again.\n\n'); - return; - end + ERPwaviewer = gui_erp_waviewer.ERPwaviewer; - % [pathx, filename, ext] = fileparts(erpfilename); [pathstr, erpfilename, ext] = fileparts(erpfilename) ; - if indxs==1 - ext = '.mat'; - elseif indxs==2 - ext = '.mat'; - else - ext = '.mat'; - end + ext = '.mat'; + erpFilename = char(strcat(erpfilename,ext)); ERPtooltype = erpgettoolversion('tooltype'); @@ -309,13 +302,13 @@ function parameters_saveas(~,~) try save([erppathname,erpFilename],'ERPwaviewer','-v7.3'); catch - beep; - viewer_ERPDAT.Process_messg =3; - fprintf(2,'\n\n My viewer > Viewer Propoerties > Save as: \n Cannot save the parameters of My viewer.\n\n'); + MessageViewer= char(strcat('Viewer Propoerties > Save: Cannot save the parameters of My viewer')); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); + viewer_ERPDAT.Process_messg =4; return; end MessageViewer= char(strcat('Viewer Properties > Save as')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =2; end @@ -323,159 +316,199 @@ function parameters_saveas(~,~) %%------------------Title name for Wave Viewer----------------------------- function viewer_TN(source_locationname,~) MessageViewer= char(strcat('Viewer Properties > Title')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =1; ViewerName = source_locationname.String; if isempty(ViewerName) ViewerName = 'My Viewer'; + source_locationname.String = ViewerName; end - try - [version1 reldate] = geterplabstudioversion; - erplabstudiover = version1; - catch + + erplabstudiover = geterplabeversion; + if isempty(erplabstudiover) erplabstudiover = '??'; end + currvers = ['ERPLAB Studio ' erplabstudiover,'-',32,ViewerName]; estudioworkingmemory('viewername',ViewerName); - try - ERPwaviewer = evalin('base','ALLERPwaviewer'); - catch - beep; - viewer_ERPDAT.Process_messg =3; - fprintf(2,'\n\n My Viewer > Viewer Propoerties > Title: \n There is no "ALLERPwaviewer" on Workspace, Please run My Viewer again.\n\n'); - return; - end - ERPwaviewer.figname = ViewerName; - assignin('base','ALLERPwaviewer',ERPwaviewer); + + gui_erp_waviewer.ERPwaviewer.figname = ViewerName; gui_erp_waviewer.Window.Name = currvers; viewer_ERPDAT.Process_messg =2; end - - function Viewerpos(Str,~) - New_pos = str2num(Str.String); - MessageViewer= char(strcat('Viewer Properties > Position')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); - viewer_ERPDAT.Process_messg =1; +%%-----------------------width for window size----------------------------- + function Viewerpos_width(Str,~) + New_pos1_width = str2num(Str.String); try - ScreenPos = get( groot, 'Screensize' ); + New_posin = estudioworkingmemory('ERPWaviewerScreenPos'); catch - ScreenPos = get( 0, 'Screensize' ); + New_posin = [75,75]; end - if isempty(New_pos) || numel(New_pos)~=4 - MessageViewer= char(strcat('Viewer Properties > Position- 4 numbers are needed for Viewer position (e.g., [1 1 1200 700])')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); - % fprintf(2,['\n Warning: ',MessageViewer,'.\n']); - viewer_ERPDAT.Process_messg =4; - new_pos = gui_erp_waviewer.Window.Position; - new_pos =[ScreenPos(3)*new_pos(1)/100,ScreenPos(4)*new_pos(2)/100,ScreenPos(3)*new_pos(3)/100,ScreenPos(4)*new_pos(4)/100]; - gui_property_waveviewer.parameters_pos.String = num2str(new_pos); - return; + if isempty(New_posin) ||numel(New_posin)~=2 + New_posin = [75,75]; end - xyValue = New_pos(1:2); - WHpos = New_pos(3:4); - if min(xyValue(:))<-100 || max(xyValue(:)) >100 - MessageViewer= char(strcat('Viewer Properties > X and Y values should be between [-100 100]')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + if isempty(New_pos1_width) || numel(New_pos1_width)~=1 || any(New_pos1_width<=0) + Str.String = num2str(New_posin(1)); + MessageViewer= char(strcat('Viewer Properties > Window size > width: The width value is invalid and it must be a positive value')); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =4; - new_pos = gui_erp_waviewer.Window.Position; - new_pos =[ScreenPos(3)*new_pos(1)/100,ScreenPos(4)*new_pos(2)/100,ScreenPos(3)*new_pos(3)/100,ScreenPos(4)*new_pos(4)/100]; - gui_property_waveviewer.parameters_pos.String = num2str(new_pos); - return; - end - if min(WHpos(:))<0 || max(WHpos(:))>100 - MessageViewer= char(strcat('Viewer Properties > width and height values should be between [0 100]')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); - viewer_ERPDAT.Process_messg =4; - new_pos = gui_erp_waviewer.Window.Position; - new_pos =[ScreenPos(3)*new_pos(1)/100,ScreenPos(4)*new_pos(2)/100,ScreenPos(3)*new_pos(3)/100,ScreenPos(4)*new_pos(4)/100]; - gui_property_waveviewer.parameters_pos.String = num2str(new_pos); return; end + New_pos1(1) = New_pos1_width; + New_pos1_h = str2num(gui_property_waveviewer.parameters_pos_height.String); - if New_pos(1)>90 || New_pos(1)< -90 - MessageViewer= char(strcat('Viewer Properties > Position: Left is better within [-90 90], otherwise, the main GUI will disappear.')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + if isempty(New_pos1_h) || numel(New_pos1_h)~=1 || any(New_pos1_h<=0) + gui_property_waveviewer.parameters_pos_height.String = num2str(New_posin(2)); + MessageViewer= char(strcat('Viewer Properties > Window size > width: The height value is invalid and it must be a positive value')); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =4; - new_pos = gui_erp_waviewer.Window.Position; - new_pos =[ScreenPos(3)*new_pos(1)/100,ScreenPos(4)*new_pos(2)/100,ScreenPos(3)*new_pos(3)/100,ScreenPos(4)*new_pos(4)/100]; - gui_property_waveviewer.parameters_pos.String = num2str(new_pos); return; end + New_pos1(2) = New_pos1_h; - if New_pos(2)< -90 - MessageViewer= char(strcat('Viewer Properties > Position: Bottom should be larger than -90, otherwise, the main GUI will disappear.')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); - viewer_ERPDAT.Process_messg =4; - new_pos = gui_erp_waviewer.Window.Position; - new_pos =[ScreenPos(3)*new_pos(1)/100,ScreenPos(4)*new_pos(2)/100,ScreenPos(3)*new_pos(3)/100,ScreenPos(4)*new_pos(4)/100]; - gui_property_waveviewer.parameters_pos.String = num2str(new_pos); - return; + MessageViewer= char(strcat('Viewer Properties > Window size > width')); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); + viewer_ERPDAT.Process_messg =1; + try + ScreenPos = get( groot, 'Screensize' ); + catch + ScreenPos = get( 0, 'Screensize' ); end - erpworkingmemory('ERPWaveScreenPos',New_pos); - gui_erp_waviewer.screen_pos = New_pos; - New_pos1 = roundn(New_pos,-3); - New_poStr = char([num2str(New_pos1(1)),32,num2str(New_pos1(2)),32,num2str(New_pos1(3)),32,num2str(New_pos1(4))]); - gui_property_waveviewer.parameters_pos.String = New_poStr; + New_posin(2) = abs(New_posin(2)); + + New_pos = gui_erp_waviewer.Window.Position; + estudioworkingmemory('ERPWaviewerScreenPos',New_pos1); + + try + POS4 = (New_pos1(2)-New_posin(2))/100; + new_pos =[New_pos(1),New_pos(2)-ScreenPos(4)*POS4,ScreenPos(3)*New_pos1(1)/100,ScreenPos(4)*New_pos1(2)/100]; + if new_pos(2)+new_pos(4) Window size > height: The height value is invalid and it must be a positive value')); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); + viewer_ERPDAT.Process_messg =4; + return; + end + New_pos1(2) = New_pos1_h; + New_pos1_width = str2num(gui_property_waveviewer.parameters_pos_width.String); + if isempty(New_pos1_width) || numel(New_pos1_width)~=1 || any(New_pos1_width<=0) + gui_property_waveviewer.parameters_pos_width.String = num2str(New_posin(1)); + MessageViewer= char(strcat('Viewer Properties > Window size > height: The width value is invalid and it must be a positive value')); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); + viewer_ERPDAT.Process_messg =4; + return; + end + New_pos1(1) = New_pos1_width; + + MessageViewer= char(strcat('Viewer Properties > Window size > height')); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); + viewer_ERPDAT.Process_messg =1; try - ScreenPos = get( groot, 'Screensize' ); + ScreenPos = gui_erp_waviewer.monitor_size; catch ScreenPos = get( 0, 'Screensize' ); end + + New_posin(2) = abs(New_posin(2)); + + New_pos = gui_erp_waviewer.Window.Position; + + estudioworkingmemory('ERPWaviewerScreenPos',New_pos1); + try - New_pos = gui_erp_waviewer.Window.Position; + POS4 = (New_pos1(2)-New_posin(2))/100; + new_pos =[New_pos(1),New_pos(2)-ScreenPos(4)*POS4,ScreenPos(3)*New_pos1(1)/100,ScreenPos(4)*New_pos1(2)/100]; + if new_pos(2)+new_pos(4)90 || New_pos1(1)< -90 || New_pos(2)< -90 || min(New_pos1(3:4))<-100 || max(New_pos1(3:4)) >100 %% from different size of monitor - New_pos = [0.01,0.01,75,75]; - new_pos =[ScreenPos(3)*New_pos(1)/100,ScreenPos(4)*New_pos(2)/100,ScreenPos(3)*New_pos(3)/100,ScreenPos(4)*New_pos(4)/100]; - set(gui_erp_waviewer.Window, 'Position', new_pos); - - zoomSpace = 100*((gui_erp_waviewer.ViewAxes.Widths+240)-gui_erp_waviewer.Window.Position(3))/gui_erp_waviewer.Window.Position(3); - if isempty(zoomSpace) || zoomSpace<0 - zoomSpace = 0; - end - if zoomSpace ==0 - gui_erp_waviewer.ScrollVerticalOffsets=0; - gui_erp_waviewer.ScrollHorizontalOffsets=0; - end - estudioworkingmemory('zoomSpace',zoomSpace); - gui_erp_waviewer.zoom_edit.String = num2str(roundn(zoomSpace,-1)); - + ScreenPos = get( 0, 'Screensize' ); end - New_pos = roundn(New_pos,-3); - New_poStr = char([num2str(New_pos(1)),32,num2str(New_pos(2)),32,num2str(New_pos(3)),32,num2str(New_pos(4))]); + set(gui_erp_waviewer.Window, 'Position', [0 0 0.75*ScreenPos(3) 0.75*ScreenPos(4)]); + estudioworkingmemory('ERPWaviewerScreenPos',[75 75]); + gui_property_waveviewer.parameters_pos.String = num2str([75 75]); - gui_property_waveviewer.parameters_pos.String = New_poStr; - % erpworkingmemory('ERPWaveScreenPos',New_pos); - gui_erp_waviewer.screen_pos = New_pos; + %%name + ViewerName = 'My Viewer'; + try + erplab_default_values; + erplabstudiover = erplabver; + catch + erplabstudiover = '??'; + end + currvers = ['ERPLAB Studio ' erplabstudiover,'-',32,ViewerName]; + estudioworkingmemory('viewername',ViewerName); + gui_erp_waviewer.ERPwaviewer.figname = ViewerName; + gui_erp_waviewer.Window.Name = currvers; end -end \ No newline at end of file + +end + +%%---------------------ERPLAB VERSION-------------------------------------- +function erplabver1 = geterplabeversion +erplab_default_values; +erplabver1 = erplabver; +end diff --git a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ERP_timeampscal_waveviewer_GUI.m b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ERP_timeampscal_waveviewer_GUI.m index 96299bff..bd09bc23 100755 --- a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ERP_timeampscal_waveviewer_GUI.m +++ b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ERP_timeampscal_waveviewer_GUI.m @@ -10,9 +10,8 @@ function varargout = f_ERP_timeampscal_waveviewer_GUI(varargin) global viewer_ERPDAT - +global gui_erp_waviewer; addlistener(viewer_ERPDAT,'v_currentERP_change',@v_currentERP_change); -addlistener(viewer_ERPDAT,'page_xyaxis_change',@page_xyaxis_change); addlistener(viewer_ERPDAT,'loadproper_change',@loadproper_change); addlistener(viewer_ERPDAT,'count_twopanels_change',@count_twopanels_change); addlistener(viewer_ERPDAT,'Reset_Waviewer_panel_change',@Reset_Waviewer_panel_change); @@ -52,13 +51,7 @@ function drawui_plot_xyaxis_viewer(FonsizeDefault) [version reldate,ColorB_def,ColorF_def,errorColorF_def,ColorBviewer_def] = geterplabstudiodef; MERPWaveViewer_xaxis= estudioworkingmemory('MERPWaveViewer_xaxis');%%call the memery for this panel MERPWaveViewer_yaxis= estudioworkingmemory('MERPWaveViewer_yaxis'); - try - ERPwaviewer = evalin('base','ALLERPwaviewer'); - catch - beep; - disp('f_ERP_timeampscal_waveviewer_GUI() error: Please run the ERP wave viewer again.'); - return; - end + %%Set for x units: 1 is in Second; 0 is in millisecond try @@ -71,10 +64,9 @@ function drawui_plot_xyaxis_viewer(FonsizeDefault) xdispysecondValue = 1; MERPWaveViewer_xaxis{1} = xdispysecondValue; end - %%x scale try - timerangeAutodef = ERPwaviewer.xaxis.trangeauto; + timerangeAutodef = gui_erp_waviewer.ERPwaviewer.xaxis.trangeauto; catch timerangeAutodef =1; end @@ -95,9 +87,9 @@ function drawui_plot_xyaxis_viewer(FonsizeDefault) %%%%%%%%%%%%%%%%%Setting for X axis%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% try - ERPIN = ERPwaviewer.ERP; - timeArraydef(1) = ERPwaviewer.ERP.times(1); - timeArraydef(2) = ERPwaviewer.ERP.times(end); + ERPIN = gui_erp_waviewer.ERPwaviewer.ERP; + timeArraydef(1) = gui_erp_waviewer.ERPwaviewer.ERP.times(1); + timeArraydef(2) = gui_erp_waviewer.ERPwaviewer.ERP.times(end); [timeticksdef stepX]= default_time_ticks_studio(ERPIN, [timeArraydef(1),timeArraydef(2)]); if ~isempty(stepX) && numel(stepX) ==1 stepX = floor(stepX/2); @@ -112,7 +104,7 @@ function drawui_plot_xyaxis_viewer(FonsizeDefault) timeArray = timeArraydef; MERPWaveViewer_xaxis{3} = timeArray; end - if numel(timeArray)~=2 || isempty(timeArray) + if isempty(timeArray)|| numel(timeArray)~=2 || timeArray(1)>=timeArraydef(2) || timeArray(2)<=timeArraydef(1) timeArray = timeArraydef; MERPWaveViewer_xaxis{3} = timeArray; end @@ -120,6 +112,13 @@ function drawui_plot_xyaxis_viewer(FonsizeDefault) timeArray = timeArraydef; MERPWaveViewer_xaxis{3} = timeArray; end + try + [timeticks, ~]= default_time_ticks_studio(ERPIN, [timeArray(1),timeArray(2)]); + timeticksdef = timeticks; + catch + + end + if xdispysecondValue==0 timeArray = timeArray/1000; end @@ -135,19 +134,17 @@ function drawui_plot_xyaxis_viewer(FonsizeDefault) gui_erpxyaxeset_waveviewer.xmillisecond = uicontrol('Style','radiobutton','Parent', gui_erpxyaxeset_waveviewer.display_title,... 'callback',@xmilsecond,'FontSize',FonsizeDefault,'BackgroundColor',ColorBviewer_def,'String','Millisecond','Value',xdispysecondValue); % gui_erpxyaxeset_waveviewer.xmillisecond.KeyPressFcn = @xyaxis_presskey; - ERPwaviewer.xaxis.tdis = gui_erpxyaxeset_waveviewer.xmillisecond.Value; + gui_erp_waviewer.ERPwaviewer.xaxis.tdis = gui_erpxyaxeset_waveviewer.xmillisecond.Value; gui_erpxyaxeset_waveviewer.xsecond = uicontrol('Style','radiobutton','Parent', gui_erpxyaxeset_waveviewer.display_title,... 'callback',@xsecond,'FontSize',FonsizeDefault,'BackgroundColor',ColorBviewer_def,'String','Second','Value',~xdispysecondValue); % gui_erpxyaxeset_waveviewer.xsecond.KeyPressFcn = @xyaxis_presskey; set(gui_erpxyaxeset_waveviewer.display_title,'Sizes',[75 90 75]); if timerangeAutodef==1 - % ERPwaviewer.xaxis.tdis = 1; - erpworkingmemory('MyViewer_xaxis_second',0); - erpworkingmemory('MyViewer_xaxis_msecond',1); + estudioworkingmemory('MyViewer_xaxis_second',0); + estudioworkingmemory('MyViewer_xaxis_msecond',1); else - % ERPwaviewer.xaxis.tdis = 0; - erpworkingmemory('MyViewer_xaxis_second',1); - erpworkingmemory('MyViewer_xaxis_msecond',0); + estudioworkingmemory('MyViewer_xaxis_second',1); + estudioworkingmemory('MyViewer_xaxis_msecond',0); end %%------time range------ gui_erpxyaxeset_waveviewer.xtimerange_title = uiextras.HBox('Parent', gui_erpxyaxeset_waveviewer.DataSelBox,'BackgroundColor',ColorBviewer_def); @@ -169,13 +166,14 @@ function drawui_plot_xyaxis_viewer(FonsizeDefault) gui_erpxyaxeset_waveviewer.timerange_edit.Enable = enableName; set(gui_erpxyaxeset_waveviewer.xtimerange_title,'Sizes',[80 100 60]); if xdispysecondValue==1 - ERPwaviewer.xaxis.timerange = str2num(char(gui_erpxyaxeset_waveviewer.timerange_edit.String)); + gui_erp_waviewer.ERPwaviewer.xaxis.timerange = str2num(char(gui_erpxyaxeset_waveviewer.timerange_edit.String)); else - ERPwaviewer.xaxis.timerange = str2num(char(gui_erpxyaxeset_waveviewer.timerange_edit.String))*1000; + gui_erp_waviewer.ERPwaviewer.xaxis.timerange = str2num(char(gui_erpxyaxeset_waveviewer.timerange_edit.String))*1000; end - ERPwaviewer.xaxis.trangeauto = gui_erpxyaxeset_waveviewer.xtimerangeauto.Value; + gui_erp_waviewer.ERPwaviewer.xaxis.trangeauto = gui_erpxyaxeset_waveviewer.xtimerangeauto.Value; %%----------------------time ticks--------------------------------- + stepX = []; try timeticksAuto= MERPWaveViewer_xaxis{4}; @@ -216,13 +214,13 @@ function drawui_plot_xyaxis_viewer(FonsizeDefault) if xdispysecondValue==1 xprecisoonName = {'0','1','2','3','4','5','6'}; - if xtick_precision<0 || xtick_precision>6 + if isempty(xtick_precision) || xtick_precision<0 || xtick_precision>6 MERPWaveViewer_xaxis{6} = 0; xtick_precision =0; end else xprecisoonName = {'1','2','3','4','5','6'}; - if xtick_precision<1 || xtick_precision>6 + if isempty(xtick_precision) || xtick_precision<1 || xtick_precision>6 MERPWaveViewer_xaxis{6} = 1; xtick_precision =1; MERPWaveViewer_xaxis{6} = xtick_precision; @@ -246,11 +244,11 @@ function drawui_plot_xyaxis_viewer(FonsizeDefault) gui_erpxyaxeset_waveviewer.timeticks_edit.Enable = enableName_tick; set(gui_erpxyaxeset_waveviewer.xtimetick_title,'Sizes',[80 100 60]); if xdispysecondValue==1 - ERPwaviewer.xaxis.timeticks = str2num(char(gui_erpxyaxeset_waveviewer.timeticks_edit.String)); + gui_erp_waviewer.ERPwaviewer.xaxis.timeticks = str2num(char(gui_erpxyaxeset_waveviewer.timeticks_edit.String)); else - ERPwaviewer.xaxis.timeticks = str2num(char(gui_erpxyaxeset_waveviewer.timeticks_edit.String))*1000; + gui_erp_waviewer.ERPwaviewer.xaxis.timeticks = str2num(char(gui_erpxyaxeset_waveviewer.timeticks_edit.String))*1000; end - ERPwaviewer.xaxis.ticksauto = gui_erpxyaxeset_waveviewer.xtimetickauto.Value; + gui_erp_waviewer.ERPwaviewer.xaxis.ticksauto = gui_erpxyaxeset_waveviewer.xtimetickauto.Value; %%--------x tick precision with decimals--------------------------- gui_erpxyaxeset_waveviewer.xtickprecision_title = uiextras.HBox('Parent', gui_erpxyaxeset_waveviewer.DataSelBox,'BackgroundColor',ColorBviewer_def); @@ -267,9 +265,9 @@ function drawui_plot_xyaxis_viewer(FonsizeDefault) 'FontSize',FonsizeDefault,'BackgroundColor',ColorBviewer_def); % set(gui_erpxyaxeset_waveviewer.xtickprecision_title,'Sizes',[30 65 60 80]); if xdispysecondValue==1 - ERPwaviewer.xaxis.tickdecimals = gui_erpxyaxeset_waveviewer.xticks_precision.Value-1; + gui_erp_waviewer.ERPwaviewer.xaxis.tickdecimals = gui_erpxyaxeset_waveviewer.xticks_precision.Value-1; else - ERPwaviewer.xaxis.tickdecimals = gui_erpxyaxeset_waveviewer.xticks_precision.Value; + gui_erp_waviewer.ERPwaviewer.xaxis.tickdecimals = gui_erpxyaxeset_waveviewer.xticks_precision.Value; end %%-----time minor ticks-------------------------------------------- @@ -362,14 +360,14 @@ function drawui_plot_xyaxis_viewer(FonsizeDefault) 'callback',@timeminortickscustom_auto,'FontSize',FonsizeDefault,'BackgroundColor',ColorBviewer_def,'String','Auto','Value',timeminorstep, 'Enable',xminorEnable_auto); % gui_erpxyaxeset_waveviewer.timeminorticks_auto.KeyPressFcn = @xyaxis_presskey; set(gui_erpxyaxeset_waveviewer.xtimeminnortick_title,'Sizes',[90 90 50]); - ERPwaviewer.xaxis.tminor.disp = gui_erpxyaxeset_waveviewer.xtimeminorauto.Value; + gui_erp_waviewer.ERPwaviewer.xaxis.tminor.disp = gui_erpxyaxeset_waveviewer.xtimeminorauto.Value; if xdispysecondValue==1 - ERPwaviewer.xaxis.tminor.step = str2num(char(gui_erpxyaxeset_waveviewer.timeminorticks_custom.String)); + gui_erp_waviewer.ERPwaviewer.xaxis.tminor.step = str2num(char(gui_erpxyaxeset_waveviewer.timeminorticks_custom.String)); else - ERPwaviewer.xaxis.tminor.step = str2num(char(gui_erpxyaxeset_waveviewer.timeminorticks_custom.String))*1000; + gui_erp_waviewer.ERPwaviewer.xaxis.tminor.step = str2num(char(gui_erpxyaxeset_waveviewer.timeminorticks_custom.String))*1000; end - ERPwaviewer.xaxis.tminor.auto = gui_erpxyaxeset_waveviewer.timeminorticks_auto.Value; + gui_erp_waviewer.ERPwaviewer.xaxis.tminor.auto = gui_erpxyaxeset_waveviewer.timeminorticks_auto.Value; %%-----time ticks label-------------------------------------------- try @@ -398,8 +396,7 @@ function drawui_plot_xyaxis_viewer(FonsizeDefault) else fontenable = 'off'; end - ERPwaviewer.xaxis.label = gui_erpxyaxeset_waveviewer.xtimelabel_on.Value; - + gui_erp_waviewer.ERPwaviewer.xaxis.label = gui_erpxyaxeset_waveviewer.xtimelabel_on.Value; %%-----font, font size, and text color for time ticks-------------- try @@ -448,8 +445,8 @@ function drawui_plot_xyaxis_viewer(FonsizeDefault) 'callback',@xtimefontsize,'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1],'Enable',fontenable,'Value',ttickLabelfontsizeV); % gui_erpxyaxeset_waveviewer.font_custom_size.KeyPressFcn = @xyaxis_presskey; set(gui_erpxyaxeset_waveviewer.xtimefont_title,'Sizes',[30 100 30 80]); - ERPwaviewer.xaxis.font = gui_erpxyaxeset_waveviewer.xtimefont_custom.Value; - ERPwaviewer.xaxis.fontsize = xfontsizeinum(gui_erpxyaxeset_waveviewer.font_custom_size.Value); + gui_erp_waviewer.ERPwaviewer.xaxis.font = gui_erpxyaxeset_waveviewer.xtimefont_custom.Value; + gui_erp_waviewer.ERPwaviewer.xaxis.fontsize = xfontsizeinum(gui_erpxyaxeset_waveviewer.font_custom_size.Value); %%%---------------------color for x label text-------------- gui_erpxyaxeset_waveviewer.xtimelabelcolor_title = uiextras.HBox('Parent', gui_erpxyaxeset_waveviewer.DataSelBox,'BackgroundColor',ColorBviewer_def); @@ -462,7 +459,7 @@ function drawui_plot_xyaxis_viewer(FonsizeDefault) uiextras.Empty('Parent', gui_erpxyaxeset_waveviewer.xtimelabelcolor_title); uiextras.Empty('Parent', gui_erpxyaxeset_waveviewer.xtimelabelcolor_title); set(gui_erpxyaxeset_waveviewer.xtimelabelcolor_title,'Sizes',[40 100 30 70]); - ERPwaviewer.xaxis.fontcolor = gui_erpxyaxeset_waveviewer.xtimetextcolor.Value; + gui_erp_waviewer.ERPwaviewer.xaxis.fontcolor = gui_erpxyaxeset_waveviewer.xtimetextcolor.Value; %%%----Setting for the xunits display-------------------------- try @@ -486,35 +483,32 @@ function drawui_plot_xyaxis_viewer(FonsizeDefault) gui_erpxyaxeset_waveviewer.xtimeunits_off.KeyPressFcn = @xyaxis_presskey; uiextras.Empty('Parent', gui_erpxyaxeset_waveviewer.xtimeunits_title); set(gui_erpxyaxeset_waveviewer.xtimeunits_title,'Sizes',[50 50 50 80]); - ERPwaviewer.xaxis.units = gui_erpxyaxeset_waveviewer.xtimeunits_on.Value; + gui_erp_waviewer.ERPwaviewer.xaxis.units = gui_erpxyaxeset_waveviewer.xtimeunits_on.Value; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%Setting for Y axis%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%-----------Y scale--------- - ALLERPIN = ERPwaviewer.ALLERP; - ERPArrayin = ERPwaviewer.SelectERPIdx; - BinArrayIN = []; - ChanArrayIn = []; - plotOrg = [1 2 3]; + ALLERPIN = gui_erp_waviewer.ERPwaviewer.ALLERP; + ERPArrayin = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; try - plotOrg(1) = ERPwaviewer.plot_org.Grid; - plotOrg(2) = ERPwaviewer.plot_org.Overlay; - plotOrg(3) = ERPwaviewer.plot_org.Pages; + plotOrg(1) = gui_erp_waviewer.ERPwaviewer.plot_org.Grid; + plotOrg(2) = gui_erp_waviewer.ERPwaviewer.plot_org.Overlay; + plotOrg(3) = gui_erp_waviewer.ERPwaviewer.plot_org.Pages; catch plotOrg = [1 2 3]; end try - ChanArrayIn = ERPwaviewer.chan; + ChanArrayIn = gui_erp_waviewer.ERPwaviewer.chan; catch ChanArrayIn = []; end try - BinArrayIN = ERPwaviewer.bin; + BinArrayIN = gui_erp_waviewer.ERPwaviewer.bin; catch BinArrayIN = []; end - CURRENTERPIN = ERPwaviewer.CURRENTERP; + CURRENTERPIN = gui_erp_waviewer.ERPwaviewer.CURRENTERP; yylim_out = f_erpAutoYLim(ALLERPIN, ERPArrayin,plotOrg,BinArrayIN, ChanArrayIn); [x,yscales_v] = find(ERPArrayin ==CURRENTERPIN); yRangeLabel = ''; @@ -568,8 +562,8 @@ function drawui_plot_xyaxis_viewer(FonsizeDefault) end gui_erpxyaxeset_waveviewer.yrange_edit.Enable = yenableName; set(gui_erpxyaxeset_waveviewer.yrange_title ,'Sizes',[60 120 60]); - ERPwaviewer.yaxis.scales = str2num(char(gui_erpxyaxeset_waveviewer.yrange_edit.String)); - ERPwaviewer.yaxis.scalesauto = gui_erpxyaxeset_waveviewer.yrangeauto.Value; + gui_erp_waviewer.ERPwaviewer.yaxis.scales = str2num(char(gui_erpxyaxeset_waveviewer.yrange_edit.String)); + gui_erp_waviewer.ERPwaviewer.yaxis.scalesauto = gui_erpxyaxeset_waveviewer.yrangeauto.Value; %%--------Y ticks-------------------------------------------------- try %%Auto for y ticks @@ -642,8 +636,8 @@ function drawui_plot_xyaxis_viewer(FonsizeDefault) end gui_erpxyaxeset_waveviewer.yticks_edit.Enable = yenableName_tick; set(gui_erpxyaxeset_waveviewer.ytick_title,'Sizes',[60 120 60]); - ERPwaviewer.yaxis.ticks = str2num(char(gui_erpxyaxeset_waveviewer.yticks_edit.String)); - ERPwaviewer.yaxis.tickauto = gui_erpxyaxeset_waveviewer.ytickauto.Value; + gui_erp_waviewer.ERPwaviewer.yaxis.ticks = str2num(char(gui_erpxyaxeset_waveviewer.yticks_edit.String)); + gui_erp_waviewer.ERPwaviewer.yaxis.tickauto = gui_erpxyaxeset_waveviewer.ytickauto.Value; %%--------Y tick precision with decimals--------------------------- gui_erpxyaxeset_waveviewer.ytickprecision_title = uiextras.HBox('Parent', gui_erpxyaxeset_waveviewer.DataSelBox,'BackgroundColor',ColorBviewer_def); @@ -657,7 +651,7 @@ function drawui_plot_xyaxis_viewer(FonsizeDefault) uicontrol('Style','text','Parent', gui_erpxyaxeset_waveviewer.ytickprecision_title,'String','# decimals',... 'FontSize',FonsizeDefault,'BackgroundColor',ColorBviewer_def); % set(gui_erpxyaxeset_waveviewer.ytickprecision_title,'Sizes',[30 65 60 80]); - ERPwaviewer.yaxis.tickdecimals = gui_erpxyaxeset_waveviewer.yticks_precision.Value-1; + gui_erp_waviewer.ERPwaviewer.yaxis.tickdecimals = gui_erpxyaxeset_waveviewer.yticks_precision.Value-1; %%-----y minor ticks----------------------------------------------- try @@ -741,9 +735,9 @@ function drawui_plot_xyaxis_viewer(FonsizeDefault) gui_erpxyaxeset_waveviewer.yminorstep_auto = uicontrol('Style','checkbox','Parent', gui_erpxyaxeset_waveviewer.yminnortick_title,... 'callback',@yminorstepauto,'FontSize',FonsizeDefault,'BackgroundColor',ColorBviewer_def,'String','Auto','Value',yminorautoValue,'Enable',yminorautoLabel); % gui_erpxyaxeset_waveviewer.yminorstep_auto.KeyPressFcn = @xyaxis_presskey; - ERPwaviewer.yaxis.yminor.disp = gui_erpxyaxeset_waveviewer.yminortick.Value; - ERPwaviewer.yaxis.yminor.step = str2num(char(gui_erpxyaxeset_waveviewer.yminorstepedit.String)); - ERPwaviewer.yaxis.yminor.auto = gui_erpxyaxeset_waveviewer.yminorstep_auto.Value; + gui_erp_waviewer.ERPwaviewer.yaxis.yminor.disp = gui_erpxyaxeset_waveviewer.yminortick.Value; + gui_erp_waviewer.ERPwaviewer.yaxis.yminor.step = str2num(char(gui_erpxyaxeset_waveviewer.yminorstepedit.String)); + gui_erp_waviewer.ERPwaviewer.yaxis.yminor.auto = gui_erpxyaxeset_waveviewer.yminorstep_auto.Value; set(gui_erpxyaxeset_waveviewer.yminnortick_title,'Sizes',[90 90 50]); %%-----y ticks label----------------------------------------------- @@ -773,7 +767,7 @@ function drawui_plot_xyaxis_viewer(FonsizeDefault) end uiextras.Empty('Parent', gui_erpxyaxeset_waveviewer.ylabel_title); set(gui_erpxyaxeset_waveviewer.ylabel_title,'Sizes',[50 50 50 80]); - ERPwaviewer.yaxis.label = gui_erpxyaxeset_waveviewer.ylabel_on.Value; + gui_erp_waviewer.ERPwaviewer.yaxis.label = gui_erpxyaxeset_waveviewer.ylabel_on.Value; %%-----y ticklabel:font, font size, and text color for time ticks try @@ -822,8 +816,8 @@ function drawui_plot_xyaxis_viewer(FonsizeDefault) 'callback',@yaxisfontsize,'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1],'Enable',yfontenable,'Value',ytickLabelfontsize); % gui_erpxyaxeset_waveviewer.yfont_custom_size.KeyPressFcn = @xyaxis_presskey; set(gui_erpxyaxeset_waveviewer.yfont_title,'Sizes',[30 100 30 80]); - ERPwaviewer.yaxis.font = gui_erpxyaxeset_waveviewer.yfont_custom.Value; - ERPwaviewer.yaxis.fontsize = xfontsizeinum(gui_erpxyaxeset_waveviewer.yfont_custom_size.Value); + gui_erp_waviewer.ERPwaviewer.yaxis.font = gui_erpxyaxeset_waveviewer.yfont_custom.Value; + gui_erp_waviewer.ERPwaviewer.yaxis.fontsize = xfontsizeinum(gui_erpxyaxeset_waveviewer.yfont_custom_size.Value); %%% color for y ticklabel text gui_erpxyaxeset_waveviewer.ylabelcolor_title = uiextras.HBox('Parent', gui_erpxyaxeset_waveviewer.DataSelBox,'BackgroundColor',ColorBviewer_def); @@ -836,7 +830,7 @@ function drawui_plot_xyaxis_viewer(FonsizeDefault) uiextras.Empty('Parent', gui_erpxyaxeset_waveviewer.ylabelcolor_title); uiextras.Empty('Parent', gui_erpxyaxeset_waveviewer.ylabelcolor_title); set(gui_erpxyaxeset_waveviewer.ylabelcolor_title,'Sizes',[40 100 30 70]); - ERPwaviewer.yaxis.fontcolor = gui_erpxyaxeset_waveviewer.ytextcolor.Value; + gui_erp_waviewer.ERPwaviewer.yaxis.fontcolor = gui_erpxyaxeset_waveviewer.ytextcolor.Value; %%%-----------Setting for the units display of y axis--------------- try @@ -860,12 +854,12 @@ function drawui_plot_xyaxis_viewer(FonsizeDefault) gui_erpxyaxeset_waveviewer.yunits_off.KeyPressFcn = @xyaxis_presskey; uiextras.Empty('Parent', gui_erpxyaxeset_waveviewer.yunits_title); set(gui_erpxyaxeset_waveviewer.yunits_title,'Sizes',[50 50 50 80]); - ERPwaviewer.yaxis.units = gui_erpxyaxeset_waveviewer.yunits_on.Value; + gui_erp_waviewer.ERPwaviewer.yaxis.units = gui_erpxyaxeset_waveviewer.yunits_on.Value; %%Apply and save the changed parameters gui_erpxyaxeset_waveviewer.help_run_title = uiextras.HBox('Parent', gui_erpxyaxeset_waveviewer.DataSelBox,'BackgroundColor',ColorBviewer_def); uiextras.Empty('Parent',gui_erpxyaxeset_waveviewer.help_run_title); - uicontrol('Style','pushbutton','Parent', gui_erpxyaxeset_waveviewer.help_run_title ,'String','Cancel',... + gui_erpxyaxeset_waveviewer.cancel = uicontrol('Style','pushbutton','Parent', gui_erpxyaxeset_waveviewer.help_run_title ,'String','Cancel',... 'callback',@xyaxis_help,'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1]); %,'FontWeight','bold','HorizontalAlignment','left' uiextras.Empty('Parent',gui_erpxyaxeset_waveviewer.help_run_title ); gui_erpxyaxeset_waveviewer.apply = uicontrol('Style','pushbutton','Parent',gui_erpxyaxeset_waveviewer.help_run_title ,'String','Apply',... @@ -874,9 +868,10 @@ function drawui_plot_xyaxis_viewer(FonsizeDefault) set(gui_erpxyaxeset_waveviewer.help_run_title,'Sizes',[40 70 20 70 30]); %%save the parameters - assignin('base','ALLERPwaviewer',ERPwaviewer); estudioworkingmemory('MERPWaveViewer_xaxis',MERPWaveViewer_xaxis);%% save parameters for x axis to memory file estudioworkingmemory('MERPWaveViewer_yaxis',MERPWaveViewer_yaxis);%% save parameters for y axis to memory file + + estudioworkingmemory('MyViewer_xyaxis',0); end %%*********************************************************************************************************************************%% @@ -894,8 +889,8 @@ function xmilsecond(Source,~) if ~isempty(messgStr) && viewerpanelIndex~=3 viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end - xSecondflag = erpworkingmemory('MyViewer_xaxis_second'); - xmSecondflag = erpworkingmemory('MyViewer_xaxis_msecond'); + xSecondflag = estudioworkingmemory('MyViewer_xaxis_second'); + xmSecondflag = estudioworkingmemory('MyViewer_xaxis_msecond'); xtick_precision = gui_erpxyaxeset_waveviewer.xticks_precision.Value; if xSecondflag==0 && xmSecondflag==1 @@ -911,26 +906,25 @@ function xmilsecond(Source,~) gui_erpxyaxeset_waveviewer.xticks_precision.Value =xtick_precision+1; estudioworkingmemory('MyViewer_xyaxis',1); - gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + + track_changes_title_color(); gui_erpxyaxeset_waveviewer.xmillisecond.Value =1; %display with millisecond gui_erpxyaxeset_waveviewer.xsecond.Value =0;%display with second - ERPwaviewerIN = evalin('base','ALLERPwaviewer'); + if xSecondflag==1 && xmSecondflag==0 %%transform the data with millisecond into second. timeArray = str2num(char(gui_erpxyaxeset_waveviewer.timerange_edit.String)); gui_erpxyaxeset_waveviewer.timerange_edit.String = num2str(timeArray*1000); else try - if ERPwaviewerIN.plot_org.Pages==3 - ERPArray = ERPwaviewerIN.SelectERPIdx; - ERPselectedIndex = ERPwaviewerIN.PageIndex; + if gui_erp_waviewer.ERPwaviewer.plot_org.Pages==3 + ERPArray = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + ERPselectedIndex = gui_erp_waviewer.ERPwaviewer.PageIndex; if ERPselectedIndex> length(ERPArray) ERPselectedIndex= length(ERPArray); end - ALLERPin = ERPwaviewerIN.ALLERP; + ALLERPin = gui_erp_waviewer.ERPwaviewer.ALLERP; try TimesCurrent = ALLERPin(ERPArray(ERPselectedIndex)).times; catch @@ -960,7 +954,7 @@ function xmilsecond(Source,~) gui_erpxyaxeset_waveviewer.timeticks_edit.String = timeticks; else if ~isempty(timeArray) && numel(timeArray)==2 %%&& gui_erpxyaxeset_waveviewer.xtimetickauto.Value ==1 - [timeticks stepX]= default_time_ticks_studio(ERPwaviewerIN.ERP, timeArray); + [timeticks stepX]= default_time_ticks_studio(gui_erp_waviewer.ERPwaviewer.ERP, timeArray); if xtick_precision<0 xtick_precision=0; gui_erpxyaxeset_waveviewer.xticks_precision.Value=1; @@ -1013,8 +1007,8 @@ function xmilsecond(Source,~) end end - erpworkingmemory('MyViewer_xaxis_second',0); - erpworkingmemory('MyViewer_xaxis_msecond',1); + estudioworkingmemory('MyViewer_xaxis_second',0); + estudioworkingmemory('MyViewer_xaxis_msecond',1); end end @@ -1025,8 +1019,8 @@ function xsecond(Source,~) if ~isempty(messgStr) && viewerpanelIndex~=3 viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end - xSecondflag = erpworkingmemory('MyViewer_xaxis_second'); - xmSecondflag = erpworkingmemory('MyViewer_xaxis_msecond'); + xSecondflag = estudioworkingmemory('MyViewer_xaxis_second'); + xmSecondflag = estudioworkingmemory('MyViewer_xaxis_msecond'); xtick_precision = gui_erpxyaxeset_waveviewer.xticks_precision.Value-1; if xSecondflag==1 && xmSecondflag==0 gui_erpxyaxeset_waveviewer.xmillisecond.Value =0; %display with millisecond @@ -1040,27 +1034,23 @@ function xsecond(Source,~) end gui_erpxyaxeset_waveviewer.xticks_precision.Value=xtick_precision; estudioworkingmemory('MyViewer_xyaxis',1); - gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; - + track_changes_title_color();%%change title color and background color for "cancel" and "apply" gui_erpxyaxeset_waveviewer.xmillisecond.Value =0; %display with millisecond gui_erpxyaxeset_waveviewer.xsecond.Value =1;%display with second - ERPwaviewerIN = evalin('base','ALLERPwaviewer'); + if xSecondflag==0 && xmSecondflag==1 %%transform the data with millisecond into second. timeArray = str2num(char(gui_erpxyaxeset_waveviewer.timerange_edit.String)); gui_erpxyaxeset_waveviewer.timerange_edit.String = num2str(timeArray/1000); else try - - if ERPwaviewerIN.plot_org.Pages==3 - ERPArray = ERPwaviewerIN.SelectERPIdx; - ERPselectedIndex = ERPwaviewerIN.PageIndex; + if gui_erp_waviewer.ERPwaviewer.plot_org.Pages==3 + ERPArray = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + ERPselectedIndex = gui_erp_waviewer.ERPwaviewer.PageIndex; if ERPselectedIndex> length(ERPArray) ERPselectedIndex= length(ERPArray); end - ALLERPin = ERPwaviewerIN.ALLERP; + ALLERPin = gui_erp_waviewer.ERPwaviewer.ALLERP; try TimesCurrent = ALLERPin(ERPArray(ERPselectedIndex)).times; catch @@ -1087,7 +1077,7 @@ function xsecond(Source,~) gui_erpxyaxeset_waveviewer.timeticks_edit.String = timeticks;%in second else if ~isempty(timeArray) && numel(timeArray)==2 %&& gui_erpxyaxeset_waveviewer.xtimetickauto.Value ==1 - [timeticks stepX]= default_time_ticks_studio(ERPwaviewerIN.ERP, timeArray*1000);%% in millisecond + [timeticks stepX]= default_time_ticks_studio(gui_erp_waviewer.ERPwaviewer.ERP, timeArray*1000);%% in millisecond timeticks = num2str(str2num(char(timeticks))/1000);%% in second timeticks= f_decimal(timeticks,xtick_precision); @@ -1140,8 +1130,8 @@ function xsecond(Source,~) end end - erpworkingmemory('MyViewer_xaxis_second',1); - erpworkingmemory('MyViewer_xaxis_msecond',0); + estudioworkingmemory('MyViewer_xaxis_second',1); + estudioworkingmemory('MyViewer_xaxis_msecond',0); end end @@ -1153,31 +1143,21 @@ function xtimerangeauto(strx_auto,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_xyaxis',1); - gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; - + track_changes_title_color();%%change title color and background color for "cancel" and "apply" Value = strx_auto.Value; xdisSecondValue = gui_erpxyaxeset_waveviewer.xmillisecond.Value; if Value==1 - try - ALLERPwaviewer = evalin('base','ALLERPwaviewer'); - ERPwaviewer = ALLERPwaviewer; - catch - beep; - disp('f_ERP_timeampscal_waveviewer_GUI() error: Please run the ERP wave viewer again.'); - return; - end + gui_erpxyaxeset_waveviewer.timerange_edit.Enable = 'off'; try - if ALLERPwaviewer.plot_org.Pages==3 - ERPArray = ALLERPwaviewer.SelectERPIdx; - ERPselectedIndex = ALLERPwaviewer.PageIndex; + if gui_erp_waviewer.ERPwaviewer.plot_org.Pages==3 + ERPArray = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + ERPselectedIndex = gui_erp_waviewer.ERPwaviewer.PageIndex; if ERPselectedIndex> length(ERPArray) ERPselectedIndex= length(ERPArray); end - ALLERPin = ALLERPwaviewer.ALLERP; + ALLERPin = gui_erp_waviewer.ERPwaviewer.ALLERP; try TimesCurrent = ALLERPin(ERPArray(ERPselectedIndex)).times; catch @@ -1186,8 +1166,8 @@ function xtimerangeauto(strx_auto,~) timeArray(1) = TimesCurrent(1); timeArray(2) = TimesCurrent(end); else - timeArray(1) = ERPwaviewer.ERP.times(1); - timeArray(2) = ERPwaviewer.ERP.times(end); + timeArray(1) = gui_erp_waviewer.ERPwaviewer.ERP.times(1); + timeArray(2) = gui_erp_waviewer.ERPwaviewer.ERP.times(end); end catch timeArray = []; @@ -1198,10 +1178,10 @@ function xtimerangeauto(strx_auto,~) gui_erpxyaxeset_waveviewer.timerange_edit.String = num2str(timeArray); if numel(timeArray)==2 && gui_erpxyaxeset_waveviewer.xtimetickauto.Value ==1 if xdisSecondValue ==0%% in second - [timeticks stepX]= default_time_ticks_studio(ERPwaviewer.ERP, timeArray*1000);%% in millisecond + [timeticks stepX]= default_time_ticks_studio(gui_erp_waviewer.ERPwaviewer.ERP, timeArray*1000);%% in millisecond timeticks = num2str(str2num(char(timeticks))/1000); else - [timeticks stepX]= default_time_ticks_studio(ERPwaviewer.ERP, timeArray);%% in millisecond + [timeticks stepX]= default_time_ticks_studio(gui_erp_waviewer.ERPwaviewer.ERP, timeArray);%% in millisecond end xtick_precision = gui_erpxyaxeset_waveviewer.xticks_precision.Value-1; timeticks= f_decimal(char(timeticks),xtick_precision); @@ -1219,21 +1199,13 @@ function timerangecustom(Strtimcustom,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_xyaxis',1); - gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; - + track_changes_title_color();%%change title color and background color for "cancel" and "apply" xdisSecondValue = gui_erpxyaxeset_waveviewer.xmillisecond.Value; - try - ERPwaviewer = evalin('base','ALLERPwaviewer'); - ERPIN = ERPwaviewer.ERP; - timeArray(1) = ERPwaviewer.ERP.times(1); - timeArray(2) = ERPwaviewer.ERP.times(end); - catch - beep; - disp('f_ERP_timeampscal_waveviewer_GUI() error: Please run the ERP wave viewer again.'); - return; - end + + ERPIN = gui_erp_waviewer.ERPwaviewer.ERP; + timeArray(1) = gui_erp_waviewer.ERPwaviewer.ERP.times(1); + timeArray(2) = gui_erp_waviewer.ERPwaviewer.ERP.times(end); + timcustom = str2num(Strtimcustom.String); %%checking the inputs if xdisSecondValue==0 @@ -1241,26 +1213,24 @@ function timerangecustom(Strtimcustom,~) end if isempty(timcustom) || numel(timcustom)~=2 messgStr = strcat('Time range in "Time and Amplitude Scales" - Inputs must be two numbers!'); - erpworkingmemory('ERPViewer_proces_messg',messgStr); - % fprintf(2,['\n Warning: ',messgStr,'.\n']); + estudioworkingmemory('ERPViewer_proces_messg',messgStr); Strtimcustom.String = num2str(timeArray); viewer_ERPDAT.Process_messg =4; return; end if timcustom(1) >= timcustom(2) messgStr = strcat('Time range in "Time and Amplitude Scales" - The left edge should be smaller than the right one'); - erpworkingmemory('ERPViewer_proces_messg',messgStr); - fprintf(2,['\n Warning: ',messgStr,'.\n']); + estudioworkingmemory('ERPViewer_proces_messg',messgStr); Strtimcustom.String = num2str(timeArray); viewer_ERPDAT.Process_messg =4; return; end if numel(timcustom)==2 && gui_erpxyaxeset_waveviewer.xtimetickauto.Value ==1 if xdisSecondValue ==0%% in second - [timeticks stepX]= default_time_ticks_studio(ERPwaviewer.ERP, timcustom*1000);%% in millisecond + [timeticks stepX]= default_time_ticks_studio(gui_erp_waviewer.ERPwaviewer.ERP, timcustom*1000);%% in millisecond timeticks = num2str(str2num(char(timeticks))/1000); else - [timeticks stepX]= default_time_ticks_studio(ERPwaviewer.ERP, timcustom);%% in millisecond + [timeticks stepX]= default_time_ticks_studio(gui_erp_waviewer.ERPwaviewer.ERP, timcustom);%% in millisecond end if gui_erpxyaxeset_waveviewer.xmillisecond.Value==1 xtick_precision = gui_erpxyaxeset_waveviewer.xticks_precision.Value-1; @@ -1275,25 +1245,22 @@ function timerangecustom(Strtimcustom,~) %%----------------------x ticks custom------------------------------------- function timetickscustom(Str,~) - ERPwaviewerIN = evalin('base','ALLERPwaviewer'); + [messgStr,viewerpanelIndex] = f_check_erpviewerpanelchanges(); if ~isempty(messgStr) && viewerpanelIndex~=3 viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_xyaxis',1); - gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; - + track_changes_title_color();%%change title color and background color for "cancel" and "apply" xdisSecondValue = gui_erpxyaxeset_waveviewer.xmillisecond.Value; timeArray = str2num(gui_erpxyaxeset_waveviewer.timerange_edit.String); timeticksdef = ''; if ~isempty(timeArray) if xdisSecondValue ==0%% in second - [timeticks stepX]= default_time_ticks_studio(ERPwaviewerIN.ERP, timeArray*1000);%% in millisecond + [timeticks stepX]= default_time_ticks_studio(gui_erp_waviewer.ERPwaviewer.ERP, timeArray*1000);%% in millisecond timeticksdef = num2str(str2num(char(timeticks))/1000); else - [timeticksdef stepX]= default_time_ticks_studio(ERPwaviewerIN.ERP, timeArray);%% in millisecond + [timeticksdef stepX]= default_time_ticks_studio(gui_erp_waviewer.ERPwaviewer.ERP, timeArray);%% in millisecond end if gui_erpxyaxeset_waveviewer.xmillisecond.Value==1 xtick_precision = gui_erpxyaxeset_waveviewer.xticks_precision.Value-1; @@ -1307,14 +1274,12 @@ function timetickscustom(Str,~) %%checking the inputs if isempty(timtickcustom) messgStr = strcat('Time ticks in "Time and Amplitude Scales" - We used the default values because input are not numeric values'); - erpworkingmemory('ERPViewer_proces_messg',messgStr); - fprintf(2,['\n Warning: ',messgStr,'.\n']); + estudioworkingmemory('ERPViewer_proces_messg',messgStr); viewer_ERPDAT.Process_messg =4; Str.String = timeticksdef; return; end - end %%-------------------------Setting for xticks auto------------------------ @@ -1324,30 +1289,21 @@ function xtimetickauto(Str,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_xyaxis',1); - gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + track_changes_title_color();%%change title color and background color for "cancel" and "apply" Value = Str.Value; if Value ==1 gui_erpxyaxeset_waveviewer.timeticks_edit.Enable = 'off'; gui_erpxyaxeset_waveviewer.xtimetickauto.Value =1; - try - ERPwaviewer = evalin('base','ALLERPwaviewer'); - catch - beep; - disp('f_ERP_timeampscal_waveviewer_GUI() error: Please run the ERP wave viewer again.'); - return; - end xdisSecondValue = gui_erpxyaxeset_waveviewer.xmillisecond.Value; timeArray = str2num(gui_erpxyaxeset_waveviewer.timerange_edit.String); if ~isempty(timeArray) && gui_erpxyaxeset_waveviewer.xtimetickauto.Value ==1%% if xdisSecondValue ==0%% in second - [timeticks stepX]= default_time_ticks_studio(ERPwaviewer.ERP, timeArray*1000);%% in millisecond + [timeticks stepX]= default_time_ticks_studio(gui_erp_waviewer.ERPwaviewer.ERP, timeArray*1000);%% in millisecond timeticks = num2str(str2num(char(timeticks))/1000); else - [timeticks stepX]= default_time_ticks_studio(ERPwaviewer.ERP, timeArray);%% in millisecond + [timeticks stepX]= default_time_ticks_studio(gui_erp_waviewer.ERPwaviewer.ERP, timeArray);%% in millisecond end if xdisSecondValue==0 xtick_precision = gui_erpxyaxeset_waveviewer.xticks_precision.Value; @@ -1370,10 +1326,7 @@ function xticksprecison(Source,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_xyaxis',1); - gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; - + track_changes_title_color();%%change title color and background color for "cancel" and "apply" if gui_erpxyaxeset_waveviewer.xmillisecond.Value==1 xtick_precision = Source.Value-1; @@ -1394,7 +1347,6 @@ function xticksprecison(Source,~) timeticks= f_decimal(char(num2str(timeticks)),xtick_precision); gui_erpxyaxeset_waveviewer.timeticks_edit.String = timeticks; end - end %%---------------------display xtick minor or not-------------------------- @@ -1404,9 +1356,7 @@ function timeminortickslabel(Str,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_xyaxis',1); - gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + track_changes_title_color();%%change title color and background color for "cancel" and "apply" Value = Str.Value; if Value ==1 @@ -1457,7 +1407,6 @@ function timeminortickslabel(Str,~) if Value==1 && gui_erpxyaxeset_waveviewer.timeminorticks_auto.Value==1 gui_erpxyaxeset_waveviewer.timeminorticks_custom.String = num2str(stepX); end - end %%--------------------------custom step for minor xtick-------------------- @@ -1467,15 +1416,12 @@ function timeminorticks_custom(Str,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_xyaxis',1); - gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + track_changes_title_color();%%change title color and background color for "cancel" and "apply" Str_xtick_minor = str2num(Str.String); if isempty(Str_xtick_minor) - messgStr = strcat('Minor ticks for "X Axs" in "Time and Amplitude Scales" - Input must be numeric '); - erpworkingmemory('ERPViewer_proces_messg',messgStr); - fprintf(2,['\n Warning: ',messgStr,'.\n']); + messgStr = strcat('Minor ticks for "X Axs" in "Time and Amplitude Scales" - Input must be numeric'); + estudioworkingmemory('ERPViewer_proces_messg',messgStr); viewer_ERPDAT.Process_messg =4; return; end @@ -1489,9 +1435,7 @@ function timeminortickscustom_auto(Str,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_xyaxis',1); - gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + track_changes_title_color();%%change title color and background color for "cancel" and "apply" Value = Str.Value; xticks = str2num(char(gui_erpxyaxeset_waveviewer.timeticks_edit.String)); @@ -1542,9 +1486,7 @@ function xtimelabelon(~,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_xyaxis',1); - gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + track_changes_title_color();%%change title color and background color for "cancel" and "apply" gui_erpxyaxeset_waveviewer.xtimelabel_on.Value = 1; gui_erpxyaxeset_waveviewer.xtimelabel_off.Value = 0; @@ -1560,9 +1502,7 @@ function xtimelabeloff(~,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_xyaxis',1); - gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + track_changes_title_color();%%change title color and background color for "cancel" and "apply" gui_erpxyaxeset_waveviewer.xtimelabel_on.Value = 0; gui_erpxyaxeset_waveviewer.xtimelabel_off.Value = 1; @@ -1581,6 +1521,8 @@ function xtimefont(Source,~) gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + gui_erpxyaxeset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_erpxyaxeset_waveviewer.cancel.ForegroundColor = [1 1 1]; end %%---------------------fontsize of x labelticks---------------------------- @@ -1590,9 +1532,7 @@ function xtimefontsize(Source,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_xyaxis',1); - gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + track_changes_title_color();%%change title color and background color for "cancel" and "apply" end %%---------------------color of x labelticks------------------------------- function xtimecolor(Source,~) @@ -1601,9 +1541,7 @@ function xtimecolor(Source,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_xyaxis',1); - gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + track_changes_title_color();%%change title color and background color for "cancel" and "apply" end %%------------------Setting for units:on----------------------------------- @@ -1613,10 +1551,7 @@ function xtimeunitson(~,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_xyaxis',1); - gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; - + track_changes_title_color();%%change title color and background color for "cancel" and "apply" gui_erpxyaxeset_waveviewer.xtimeunits_on.Value = 1; gui_erpxyaxeset_waveviewer.xtimeunits_off.Value = 0; end @@ -1628,10 +1563,7 @@ function xtimeunitsoff(~,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_xyaxis',1); - gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; - + track_changes_title_color();%%change title color and background color for "cancel" and "apply" gui_erpxyaxeset_waveviewer.xtimeunits_on.Value = 0; gui_erpxyaxeset_waveviewer.xtimeunits_off.Value = 1; end @@ -1648,25 +1580,19 @@ function yrangecustom(yscalStr,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_xyaxis',1); - gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; - + track_changes_title_color();%%change title color and background color for "cancel" and "apply" yscalecustom = str2num(char(yscalStr.String)); %%checking the inputs if isempty(yscalecustom)|| numel(yscalecustom)~=2 messgStr = strcat('Y scale for "Y Axs" in "Time and Amplitude Scales" - Inputs must be two numbers '); - erpworkingmemory('ERPViewer_proces_messg',messgStr); - fprintf(2,['\n Warning: ',messgStr,'.\n']); - % yscalStr.String = ''; + estudioworkingmemory('ERPViewer_proces_messg',messgStr); viewer_ERPDAT.Process_messg =4; return; end if yscalecustom(1) >= yscalecustom(2) messgStr = strcat('Y scale for "Y Axs" in "Time and Amplitude Scales" - The left edge should be smaller than the right one '); - erpworkingmemory('ERPViewer_proces_messg',messgStr); - fprintf(2,['\n Warning: ',messgStr,'.\n']); + estudioworkingmemory('ERPViewer_proces_messg',messgStr); viewer_ERPDAT.Process_messg =4; return; end @@ -1699,43 +1625,30 @@ function yrangeauto(yscaleauto,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_xyaxis',1); - gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; - + track_changes_title_color();%%change title color and background color for "cancel" and "apply" Value = yscaleauto.Value; if Value ==1 - try - ALLERPwaviewer = evalin('base','ALLERPwaviewer'); - ERPwaviewer = ALLERPwaviewer; - catch - beep; - disp('f_ERP_timeampscal_waveviewer_GUI() error: Please run the ERP wave viewer again.'); - return; - end - ALLERPIN = ERPwaviewer.ALLERP; - ERPArrayin = ERPwaviewer.SelectERPIdx; - BinArrayIN = []; - ChanArrayIn = []; + ALLERPIN = gui_erp_waviewer.ERPwaviewer.ALLERP; + ERPArrayin = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; plotOrg = [1 2 3]; try - plotOrg(1) = ERPwaviewer.plot_org.Grid; - plotOrg(2) = ERPwaviewer.plot_org.Overlay; - plotOrg(3) = ERPwaviewer.plot_org.Pages; + plotOrg(1) = gui_erp_waviewer.ERPwaviewer.plot_org.Grid; + plotOrg(2) = gui_erp_waviewer.ERPwaviewer.plot_org.Overlay; + plotOrg(3) = gui_erp_waviewer.ERPwaviewer.plot_org.Pages; catch plotOrg = [1 2 3]; end try - ChanArrayIn = ERPwaviewer.chan; + ChanArrayIn = gui_erp_waviewer.ERPwaviewer.chan; catch ChanArrayIn = []; end try - BinArrayIN = ERPwaviewer.bin; + BinArrayIN = gui_erp_waviewer.ERPwaviewer.bin; catch BinArrayIN = []; end - PageCurrent = ERPwaviewer.PageIndex; + PageCurrent = gui_erp_waviewer.ERPwaviewer.PageIndex; yylim_out = f_erpAutoYLim(ALLERPIN, ERPArrayin,plotOrg,BinArrayIN, ChanArrayIn); try yRangeLabel = num2str(yylim_out(PageCurrent,:)); @@ -1768,29 +1681,24 @@ function yrangeauto(yscaleauto,~) end gui_erpxyaxeset_waveviewer.yticks_edit.String = yticksLabel; end - - end %%----------------------Y ticks-------------------------------------------- function ytickscustom(Str,~) - ERPwaviewerIN = evalin('base','ALLERPwaviewer'); - yticksLabel = ERPwaviewerIN.yaxis.ticks; + + yticksLabel = gui_erp_waviewer.ERPwaviewer.yaxis.ticks; [messgStr,viewerpanelIndex] = f_check_erpviewerpanelchanges(); if ~isempty(messgStr) && viewerpanelIndex~=3 viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_xyaxis',1); - gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + track_changes_title_color();%%change title color and background color for "cancel" and "apply" ytickcustom = str2num(char(Str.String)); %%checking the inputs if isempty(ytickcustom) messgStr = strcat('Y ticks on "Time and Amplitude Scales": Input must be a number!'); - erpworkingmemory('ERPViewer_proces_messg',messgStr); - fprintf(2,['\n Warning: ',messgStr,'.\n']); + estudioworkingmemory('ERPViewer_proces_messg',messgStr); Str.String = ''; viewer_ERPDAT.Process_messg =4; return; @@ -1800,16 +1708,14 @@ function ytickscustom(Str,~) if ~isempty(yRange) && numel(yRange) ==2 if min(ytickcustom(:))< yRange(1)%% compared with the left edge of time range messgStr = strcat('Y ticks in "Time and Amplitude Scales": Minimum of Y ticks should be larger than the left edge of y scale!'); - erpworkingmemory('ERPViewer_proces_messg',messgStr); - fprintf(2,['\n Warning: ',messgStr,'.\n']); + estudioworkingmemory('ERPViewer_proces_messg',messgStr); Str.String = ''; viewer_ERPDAT.Process_messg =4; return; end if max(ytickcustom(:))>yRange(2)%% compared with the right edge of time range messgStr = strcat('Y ticks in "Time and Amplitude Scales": Maximum of Y ticks should be smaller than the right edge of y scale!'); - erpworkingmemory('ERPViewer_proces_messg',messgStr); - fprintf(2,['\n Warning: ',messgStr,'.\n']); + estudioworkingmemory('ERPViewer_proces_messg',messgStr); Str.String = ''; viewer_ERPDAT.Process_messg =4; return; @@ -1844,9 +1750,7 @@ function ytickauto(Str,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_xyaxis',1); - gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + track_changes_title_color();%%change title color and background color for "cancel" and "apply" Value = Str.Value; if Value ==1 @@ -1888,9 +1792,7 @@ function yticksprecison(Source,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_xyaxis',1); - gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + track_changes_title_color();%%change title color and background color for "cancel" and "apply" yticksLabel = gui_erpxyaxeset_waveviewer.yticks_edit.String; ytick_precision = Source.Value-1; @@ -1913,7 +1815,6 @@ function yticksprecison(Source,~) end end gui_erpxyaxeset_waveviewer.yticks_edit.String = yticksLabel; - end %%--------------------display ytick minor?--------------------------------- @@ -1923,9 +1824,7 @@ function yminordisp(Str,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_xyaxis',1); - gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + track_changes_title_color();%%change title color and background color for "cancel" and "apply" Value = Str.Value; if Value ==1 @@ -1980,15 +1879,12 @@ function yminorstepedit(Str,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_xyaxis',1); - gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + track_changes_title_color();%%change title color and background color for "cancel" and "apply" ytickmin_step = str2num(Str.String); if isempty(ytickmin_step) messgStr = strcat('Minor ticks for "Y Axs" in "Time and Amplitude Scales": Input must be one number or more numbers'); - erpworkingmemory('ERPViewer_proces_messg',messgStr); - fprintf(2,['\n Warning: ',messgStr,'.\n']); + estudioworkingmemory('ERPViewer_proces_messg',messgStr); viewer_ERPDAT.Process_messg =4; return; end @@ -2001,9 +1897,7 @@ function yminorstepauto(Str,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_xyaxis',1); - gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + track_changes_title_color();%%change title color and background color for "cancel" and "apply" Value = Str.Value;%% if Value ==1 @@ -2049,9 +1943,7 @@ function ylabelon(~,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_xyaxis',1); - gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + track_changes_title_color();%%change title color and background color for "cancel" and "apply" gui_erpxyaxeset_waveviewer.ylabel_on.Value = 1; gui_erpxyaxeset_waveviewer.ylabel_off.Value = 0; @@ -2068,9 +1960,7 @@ function yaxisfont(Source,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_xyaxis',1); - gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + track_changes_title_color();%%change title color and background color for "cancel" and "apply" end %%------------------------fontsize of y label ticks------------------------ @@ -2080,9 +1970,7 @@ function yaxisfontsize(Source,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_xyaxis',1); - gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + track_changes_title_color();%%change title color and background color for "cancel" and "apply" end %%------------------------color of y label ticks--------------------------- @@ -2092,9 +1980,7 @@ function yaxisfontcolor(Source,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_xyaxis',1); - gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; + track_changes_title_color();%%change title color and background color for "cancel" and "apply" end @@ -2105,10 +1991,7 @@ function ylabeloff(~,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_xyaxis',1); - gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; - + track_changes_title_color();%%change title color and background color for "cancel" and "apply" gui_erpxyaxeset_waveviewer.ylabel_on.Value = 0; gui_erpxyaxeset_waveviewer.ylabel_off.Value = 1; gui_erpxyaxeset_waveviewer.yfont_custom.Enable = 'off'; @@ -2126,7 +2009,8 @@ function yunitson(~,~) gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; - + gui_erpxyaxeset_waveviewer.cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + gui_erpxyaxeset_waveviewer.cancel.ForegroundColor = [1 1 1]; gui_erpxyaxeset_waveviewer.yunits_on.Value = 1; gui_erpxyaxeset_waveviewer.yunits_off.Value = 0; end @@ -2138,10 +2022,7 @@ function yunitsoff(~,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end estudioworkingmemory('MyViewer_xyaxis',1); - gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [0.4940 0.1840 0.5560]; - gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [1 1 1]; - box_erpxtaxes_viewer_property.TitleColor= [0.4940 0.1840 0.5560]; - + track_changes_title_color();%%change title color and background color for "cancel" and "apply" gui_erpxyaxeset_waveviewer.yunits_on.Value = 0; gui_erpxyaxeset_waveviewer.yunits_off.Value = 1; end @@ -2154,23 +2035,16 @@ function xyaxis_help(~,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end - MessageViewer= char(strcat('Time and Amplitude Scales > Cancel')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =1; changeFlag = estudioworkingmemory('MyViewer_xyaxis'); if changeFlag~=1%% Donot reset this panel if there is no change return; end - try - ERPwaviewer_apply = evalin('base','ALLERPwaviewer'); - catch - viewer_ERPDAT.Process_messg =3; - fprintf(2,'\n Time and Amplitude Scales > Cancel-f_ERP_timeampscal_waveviewer_GUI() error: Cannot get parameters for whole panel.\n Please run My viewer again.\n\n'); - return; - end - xdispsecondValue = ERPwaviewer_apply.xaxis.tdis; + + xdispsecondValue = gui_erp_waviewer.ERPwaviewer.xaxis.tdis; if xdispsecondValue==1%% with millisecond gui_erpxyaxeset_waveviewer.xmillisecond.Value =1; gui_erpxyaxeset_waveviewer.xsecond.Value = 0; @@ -2187,11 +2061,11 @@ function xyaxis_help(~,~) %%-------------------------time range------------------------------ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if xdispsecondValue==1 - gui_erpxyaxeset_waveviewer.timerange_edit.String = num2str(ERPwaviewer_apply.xaxis.timerange); + gui_erpxyaxeset_waveviewer.timerange_edit.String = num2str(gui_erp_waviewer.ERPwaviewer.xaxis.timerange); else - gui_erpxyaxeset_waveviewer.timerange_edit.String = num2str(ERPwaviewer_apply.xaxis.timerange/1000); + gui_erpxyaxeset_waveviewer.timerange_edit.String = num2str(gui_erp_waviewer.ERPwaviewer.xaxis.timerange/1000); end - TRFlag = ERPwaviewer_apply.xaxis.trangeauto; + TRFlag = gui_erp_waviewer.ERPwaviewer.xaxis.trangeauto; if TRFlag==1 gui_erpxyaxeset_waveviewer.xtimerangeauto.Value = 1 ; gui_erpxyaxeset_waveviewer.timerange_edit.Enable = 'off'; @@ -2199,10 +2073,10 @@ function xyaxis_help(~,~) gui_erpxyaxeset_waveviewer.xtimerangeauto.Value = 0 ; gui_erpxyaxeset_waveviewer.timerange_edit.Enable = 'on'; end - xticks_precision = ERPwaviewer_apply.xaxis.tickdecimals; + xticks_precision = gui_erp_waviewer.ERPwaviewer.xaxis.tickdecimals; %%time ticks if xdispsecondValue==1 - timeticks= ERPwaviewer_apply.xaxis.timeticks; + timeticks= gui_erp_waviewer.ERPwaviewer.xaxis.timeticks; if ~isempty(timeticks) timeticks= f_decimal(char(num2str(timeticks)),xticks_precision); else @@ -2211,7 +2085,7 @@ function xyaxis_help(~,~) gui_erpxyaxeset_waveviewer.timeticks_edit.String = timeticks; gui_erpxyaxeset_waveviewer.xticks_precision.Value = xticks_precision+1; else - timeticks= ERPwaviewer_apply.xaxis.timeticks/1000;%%Convert character array or string scalar to numeric array + timeticks= gui_erp_waviewer.ERPwaviewer.xaxis.timeticks/1000;%%Convert character array or string scalar to numeric array if ~isempty(timeticks) timeticks= f_decimal(char(num2str(timeticks)),xticks_precision); else @@ -2220,7 +2094,7 @@ function xyaxis_help(~,~) gui_erpxyaxeset_waveviewer.timeticks_edit.String = timeticks; gui_erpxyaxeset_waveviewer.xticks_precision.Value = xticks_precision; end - xtickAuto = ERPwaviewer_apply.xaxis.ticksauto; + xtickAuto = gui_erp_waviewer.ERPwaviewer.xaxis.ticksauto; gui_erpxyaxeset_waveviewer.xtimetickauto.Value=xtickAuto; if xtickAuto==1 gui_erpxyaxeset_waveviewer.timeticks_edit.Enable = 'off'; @@ -2228,8 +2102,8 @@ function xyaxis_help(~,~) gui_erpxyaxeset_waveviewer.timeticks_edit.Enable = 'on'; end %%minor for xticks - XMinorDis = ERPwaviewer_apply.xaxis.tminor.disp; - xMinorAuto = ERPwaviewer_apply.xaxis.tminor.auto; + XMinorDis = gui_erp_waviewer.ERPwaviewer.xaxis.tminor.disp; + xMinorAuto = gui_erp_waviewer.ERPwaviewer.xaxis.tminor.auto; gui_erpxyaxeset_waveviewer.xtimeminorauto.Value = XMinorDis; if xMinorAuto==1 gui_erpxyaxeset_waveviewer.timeminorticks_auto.Value =1; @@ -2249,7 +2123,7 @@ function xyaxis_help(~,~) gui_erpxyaxeset_waveviewer.timeminorticks_custom.Enable = 'off'; gui_erpxyaxeset_waveviewer.timeminorticks_auto.Enable = 'off'; end - xtickMinorstep = ERPwaviewer_apply.xaxis.tminor.step; + xtickMinorstep = gui_erp_waviewer.ERPwaviewer.xaxis.tminor.step; if xdispsecondValue==0 xtickMinorstep= xtickMinorstep/1000;%%Convert character array or string scalar to numeric array end @@ -2260,20 +2134,20 @@ function xyaxis_help(~,~) end gui_erpxyaxeset_waveviewer.timeminorticks_custom.String = xtickMinorstep; %%x labels - xlabelFlag = ERPwaviewer_apply.xaxis.label; + xlabelFlag = gui_erp_waviewer.ERPwaviewer.xaxis.label; gui_erpxyaxeset_waveviewer.xtimelabel_on.Value = xlabelFlag; gui_erpxyaxeset_waveviewer.xtimelabel_off.Value = ~xlabelFlag; - gui_erpxyaxeset_waveviewer.xtimefont_custom.Value = ERPwaviewer_apply.xaxis.font; + gui_erpxyaxeset_waveviewer.xtimefont_custom.Value = gui_erp_waviewer.ERPwaviewer.xaxis.font; fontsize = {'4','6','8','10','12','14','16','18','20','24','28','32','36',... '40','50','60','70','80','90','100'}; xfontsizeinum = str2num(char(fontsize)); - xlabelfontsize = ERPwaviewer_apply.xaxis.fontsize; + xlabelfontsize = gui_erp_waviewer.ERPwaviewer.xaxis.fontsize; [x_label,~] = find(xfontsizeinum==xlabelfontsize); if isempty(x_label) x_label=5; end gui_erpxyaxeset_waveviewer.font_custom_size.Value = x_label; - gui_erpxyaxeset_waveviewer.xtimetextcolor.Value = ERPwaviewer_apply.xaxis.fontcolor; + gui_erpxyaxeset_waveviewer.xtimetextcolor.Value = gui_erp_waviewer.ERPwaviewer.xaxis.fontcolor; if xlabelFlag==1 xlabelFlagEnable = 'on'; else @@ -2283,23 +2157,23 @@ function xyaxis_help(~,~) gui_erpxyaxeset_waveviewer.font_custom_size.Enable = xlabelFlagEnable; gui_erpxyaxeset_waveviewer.xtimetextcolor.Enable = xlabelFlagEnable; %%x units - xaxisunits= ERPwaviewer_apply.xaxis.units; + xaxisunits= gui_erp_waviewer.ERPwaviewer.xaxis.units; gui_erpxyaxeset_waveviewer.xtimeunits_on.Value =xaxisunits; gui_erpxyaxeset_waveviewer.xtimeunits_off.Value = ~xaxisunits; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%------------------------setting for y axes----------------------- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - gui_erpxyaxeset_waveviewer.yrange_edit.String = num2str(ERPwaviewer_apply.yaxis.scales); - gui_erpxyaxeset_waveviewer.yrangeauto.Value = ERPwaviewer_apply.yaxis.scalesauto; + gui_erpxyaxeset_waveviewer.yrange_edit.String = num2str(gui_erp_waviewer.ERPwaviewer.yaxis.scales); + gui_erpxyaxeset_waveviewer.yrangeauto.Value = gui_erp_waviewer.ERPwaviewer.yaxis.scalesauto; if gui_erpxyaxeset_waveviewer.yrangeauto.Value==1 gui_erpxyaxeset_waveviewer.yrange_edit.Enable = 'off'; else gui_erpxyaxeset_waveviewer.yrange_edit.Enable = 'on'; end - ytickdecimals = ERPwaviewer_apply.yaxis.tickdecimals; + ytickdecimals = gui_erp_waviewer.ERPwaviewer.yaxis.tickdecimals; gui_erpxyaxeset_waveviewer.yticks_precision.Value = ytickdecimals+1; - YTicks=ERPwaviewer_apply.yaxis.ticks; + YTicks=gui_erp_waviewer.ERPwaviewer.yaxis.ticks; if ~isempty(YTicks) YTicks= f_decimal(char(num2str(YTicks)),ytickdecimals); else @@ -2307,15 +2181,15 @@ function xyaxis_help(~,~) end gui_erpxyaxeset_waveviewer.yticks_edit.String = YTicks; - gui_erpxyaxeset_waveviewer.ytickauto.Value=ERPwaviewer_apply.yaxis.tickauto ; + gui_erpxyaxeset_waveviewer.ytickauto.Value=gui_erp_waviewer.ERPwaviewer.yaxis.tickauto ; if gui_erpxyaxeset_waveviewer.ytickauto.Value==1 gui_erpxyaxeset_waveviewer.yticks_edit.Enable = 'off'; else gui_erpxyaxeset_waveviewer.yticks_edit.Enable = 'on'; end %%minor yticks - yMinorDisp= ERPwaviewer_apply.yaxis.yminor.disp; - yMinorAuto = ERPwaviewer_apply.yaxis.yminor.auto; + yMinorDisp= gui_erp_waviewer.ERPwaviewer.yaxis.yminor.disp; + yMinorAuto = gui_erp_waviewer.ERPwaviewer.yaxis.yminor.auto; if yMinorDisp==1 gui_erpxyaxeset_waveviewer.yminortick.Value=1; gui_erpxyaxeset_waveviewer.yminorstep_auto.Enable = 'on'; @@ -2330,18 +2204,18 @@ function xyaxis_help(~,~) gui_erpxyaxeset_waveviewer.yminorstepedit.Enable = 'off'; end gui_erpxyaxeset_waveviewer.yminorstep_auto.Value = yMinorAuto; - gui_erpxyaxeset_waveviewer.yminorstepedit.String = num2str(ERPwaviewer_apply.yaxis.yminor.step); + gui_erpxyaxeset_waveviewer.yminorstepedit.String = num2str(gui_erp_waviewer.ERPwaviewer.yaxis.yminor.step); - gui_erpxyaxeset_waveviewer.ylabel_on.Value = ERPwaviewer_apply.yaxis.label; - gui_erpxyaxeset_waveviewer.ylabel_off.Value = ~ERPwaviewer_apply.yaxis.label; - gui_erpxyaxeset_waveviewer.yfont_custom.Value =ERPwaviewer_apply.yaxis.font; - ylabelFontsize = ERPwaviewer_apply.yaxis.fontsize; + gui_erpxyaxeset_waveviewer.ylabel_on.Value = gui_erp_waviewer.ERPwaviewer.yaxis.label; + gui_erpxyaxeset_waveviewer.ylabel_off.Value = ~gui_erp_waviewer.ERPwaviewer.yaxis.label; + gui_erpxyaxeset_waveviewer.yfont_custom.Value =gui_erp_waviewer.ERPwaviewer.yaxis.font; + ylabelFontsize = gui_erp_waviewer.ERPwaviewer.yaxis.fontsize; [yx_label,~] = find(xfontsizeinum==ylabelFontsize); if isempty(yx_label) yx_label=5; end gui_erpxyaxeset_waveviewer.yfont_custom_size.Value = yx_label; - gui_erpxyaxeset_waveviewer.ytextcolor.Value= ERPwaviewer_apply.yaxis.fontcolor; + gui_erpxyaxeset_waveviewer.ytextcolor.Value= gui_erp_waviewer.ERPwaviewer.yaxis.fontcolor; if gui_erpxyaxeset_waveviewer.ylabel_on.Value==1 ylabelFlagEnable = 'on'; else @@ -2351,14 +2225,16 @@ function xyaxis_help(~,~) gui_erpxyaxeset_waveviewer.yfont_custom_size.Enable = ylabelFlagEnable; gui_erpxyaxeset_waveviewer.ytextcolor.Enable = ylabelFlagEnable; - gui_erpxyaxeset_waveviewer.yunits_on.Value = ERPwaviewer_apply.yaxis.units; - gui_erpxyaxeset_waveviewer.yunits_off.Value = ~ERPwaviewer_apply.yaxis.units; + gui_erpxyaxeset_waveviewer.yunits_on.Value = gui_erp_waviewer.ERPwaviewer.yaxis.units; + gui_erpxyaxeset_waveviewer.yunits_off.Value = ~gui_erp_waviewer.ERPwaviewer.yaxis.units; gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [1 1 1]; gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [0 0 0]; box_erpxtaxes_viewer_property.TitleColor= [0.5 0.5 0.9]; + gui_erpxyaxeset_waveviewer.cancel.BackgroundColor = [1 1 1]; + gui_erpxyaxeset_waveviewer.cancel.ForegroundColor = [0 0 0]; estudioworkingmemory('MyViewer_xyaxis',0); MessageViewer= char(strcat('Time and Amplitude Scales > Cancel')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =2; end @@ -2373,17 +2249,13 @@ function xyaxis_apply(~,~) gui_erpxyaxeset_waveviewer.apply.BackgroundColor = [1 1 1]; gui_erpxyaxeset_waveviewer.apply.ForegroundColor = [0 0 0]; box_erpxtaxes_viewer_property.TitleColor= [0.5 0.5 0.9]; + gui_erpxyaxeset_waveviewer.cancel.BackgroundColor = [1 1 1]; + gui_erpxyaxeset_waveviewer.cancel.ForegroundColor = [0 0 0]; MessageViewer= char(strcat('Time and Amplitude Scales > Apply')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =1; - try - ERPwaviewer_apply = evalin('base','ALLERPwaviewer'); - catch - viewer_ERPDAT.Process_messg =3; - fprintf(2,'\n Time and Amplitude Scales > Apply-f_ERP_timeampscal_waveviewer_GUI() error: Cannot get parameters for whole panel.\n Please run My viewer again.\n\n'); - return; - end + %%time range xdispsecondValue = gui_erpxyaxeset_waveviewer.xmillisecond.Value; %display with millisecond if xdispsecondValue==1 @@ -2395,22 +2267,24 @@ function xyaxis_apply(~,~) if isempty(timeRange) || numel(timeRange)~=2 - timeRange(1) = ERPwaviewer_apply.ERP.times(1); - timeRange(2) = ERPwaviewer_apply.ERP.times(end); + timeRange(1) = gui_erp_waviewer.ERPwaviewer.ERP.times(1); + timeRange(2) = gui_erp_waviewer.ERPwaviewer.ERP.times(end); messgStr = strcat('The default time range will be used because the inputs are not two numbers'); - erpworkingmemory('ERPViewer_proces_messg',messgStr); - fprintf(2,['\n Warning: ',messgStr,'.\n']); + estudioworkingmemory('ERPViewer_proces_messg',messgStr); viewer_ERPDAT.Process_messg =4; + return; end if timeRange(1) >= timeRange(2) - timeRange(1) = ERPwaviewer_apply.ERP.times(1); - timeRange(2) = ERPwaviewer_apply.ERP.times(end); - viewer_ERPDAT.Process_messg =3; - fprintf(2,'\n Time and Amplitude Scales > Apply-Time range() error.\n The left edge should not be smaller than the right one!\n Please change current values, otherwise, the default ones will be used!\n\n'); - end - ERPwaviewer_apply.xaxis.timerange = timeRange; - ERPwaviewer_apply.xaxis.trangeauto = gui_erpxyaxeset_waveviewer.xtimerangeauto.Value; - ERPwaviewer_apply.xaxis.tdis = xdispsecondValue; + timeRange(1) = gui_erp_waviewer.ERPwaviewer.ERP.times(1); + timeRange(2) = gui_erp_waviewer.ERPwaviewer.ERP.times(end); + messgStr = strcat('Time and Amplitude Scales > Apply-Time rang: The left edge should not be smaller than the right one!'); + estudioworkingmemory('ERPViewer_proces_messg',messgStr); + viewer_ERPDAT.Process_messg =4; + return; + end + gui_erp_waviewer.ERPwaviewer.xaxis.timerange = timeRange; + gui_erp_waviewer.ERPwaviewer.xaxis.trangeauto = gui_erpxyaxeset_waveviewer.xtimerangeauto.Value; + gui_erp_waviewer.ERPwaviewer.xaxis.tdis = xdispsecondValue; MERPWaveViewer_xaxis{3} = timeRange; MERPWaveViewer_xaxis{2} = gui_erpxyaxeset_waveviewer.xtimerangeauto.Value; %%getting xticks @@ -2430,37 +2304,37 @@ function xyaxis_apply(~,~) end xticksArray(xticks_exm) = []; end - ERPwaviewer_apply.xaxis.timeticks = xticksArray; - ERPwaviewer_apply.xaxis.ticksauto = gui_erpxyaxeset_waveviewer.xtimetickauto.Value; - MERPWaveViewer_xaxis{4} = ERPwaviewer_apply.xaxis.ticksauto; + gui_erp_waviewer.ERPwaviewer.xaxis.timeticks = xticksArray; + gui_erp_waviewer.ERPwaviewer.xaxis.ticksauto = gui_erpxyaxeset_waveviewer.xtimetickauto.Value; + MERPWaveViewer_xaxis{4} = gui_erp_waviewer.ERPwaviewer.xaxis.ticksauto; MERPWaveViewer_xaxis{5} = xticksArray; if gui_erpxyaxeset_waveviewer.xmillisecond.Value==1 - ERPwaviewer_apply.xaxis.tickdecimals = gui_erpxyaxeset_waveviewer.xticks_precision.Value-1; + gui_erp_waviewer.ERPwaviewer.xaxis.tickdecimals = gui_erpxyaxeset_waveviewer.xticks_precision.Value-1; else - ERPwaviewer_apply.xaxis.tickdecimals = gui_erpxyaxeset_waveviewer.xticks_precision.Value; + gui_erp_waviewer.ERPwaviewer.xaxis.tickdecimals = gui_erpxyaxeset_waveviewer.xticks_precision.Value; end - MERPWaveViewer_xaxis{6} = ERPwaviewer_apply.xaxis.tickdecimals; + MERPWaveViewer_xaxis{6} = gui_erp_waviewer.ERPwaviewer.xaxis.tickdecimals; %%minor for xticks - ERPwaviewer_apply.xaxis.tminor.disp = gui_erpxyaxeset_waveviewer.xtimeminorauto.Value; + gui_erp_waviewer.ERPwaviewer.xaxis.tminor.disp = gui_erpxyaxeset_waveviewer.xtimeminorauto.Value; xticckMinorstep = str2num(char(gui_erpxyaxeset_waveviewer.timeminorticks_custom.String)); if xdispsecondValue==1 - ERPwaviewer_apply.xaxis.tminor.step = xticckMinorstep; + gui_erp_waviewer.ERPwaviewer.xaxis.tminor.step = xticckMinorstep; else - ERPwaviewer_apply.xaxis.tminor.step = xticckMinorstep*1000; + gui_erp_waviewer.ERPwaviewer.xaxis.tminor.step = xticckMinorstep*1000; end - ERPwaviewer_apply.xaxis.tminor.auto = gui_erpxyaxeset_waveviewer.timeminorticks_auto.Value; + gui_erp_waviewer.ERPwaviewer.xaxis.tminor.auto = gui_erpxyaxeset_waveviewer.timeminorticks_auto.Value; MERPWaveViewer_xaxis{7} = gui_erpxyaxeset_waveviewer.xtimeminorauto.Value; - MERPWaveViewer_xaxis{8} = ERPwaviewer_apply.xaxis.tminor.step; + MERPWaveViewer_xaxis{8} = gui_erp_waviewer.ERPwaviewer.xaxis.tminor.step; MERPWaveViewer_xaxis{9} =gui_erpxyaxeset_waveviewer.timeminorticks_auto.Value; %%xtick label on/off - ERPwaviewer_apply.xaxis.label = gui_erpxyaxeset_waveviewer.xtimelabel_on.Value; + gui_erp_waviewer.ERPwaviewer.xaxis.label = gui_erpxyaxeset_waveviewer.xtimelabel_on.Value; fontsize = {'4','6','8','10','12','14','16','18','20','24','28','32','36',... '40','50','60','70','80','90','100'}; xfontsizeinum = str2num(char(fontsize)); - ERPwaviewer_apply.xaxis.font = gui_erpxyaxeset_waveviewer.xtimefont_custom.Value; - ERPwaviewer_apply.xaxis.fontsize = xfontsizeinum(gui_erpxyaxeset_waveviewer.font_custom_size.Value); - ERPwaviewer_apply.xaxis.fontcolor = gui_erpxyaxeset_waveviewer.xtimetextcolor.Value; - ERPwaviewer_apply.xaxis.units = gui_erpxyaxeset_waveviewer.xtimeunits_on.Value; + gui_erp_waviewer.ERPwaviewer.xaxis.font = gui_erpxyaxeset_waveviewer.xtimefont_custom.Value; + gui_erp_waviewer.ERPwaviewer.xaxis.fontsize = xfontsizeinum(gui_erpxyaxeset_waveviewer.font_custom_size.Value); + gui_erp_waviewer.ERPwaviewer.xaxis.fontcolor = gui_erpxyaxeset_waveviewer.xtimetextcolor.Value; + gui_erp_waviewer.ERPwaviewer.xaxis.units = gui_erpxyaxeset_waveviewer.xtimeunits_on.Value; MERPWaveViewer_xaxis{10}=gui_erpxyaxeset_waveviewer.xtimelabel_on.Value; MERPWaveViewer_xaxis{11} = gui_erpxyaxeset_waveviewer.xtimefont_custom.Value; MERPWaveViewer_xaxis{12} = gui_erpxyaxeset_waveviewer.font_custom_size.Value; @@ -2474,29 +2348,29 @@ function xyaxis_apply(~,~) %%y scales YScales = str2num(char(gui_erpxyaxeset_waveviewer.yrange_edit.String)); if isempty(YScales) || numel(YScales)~=2 - ALLERPIN = ERPwaviewer_apply.ALLERP; - ERPArrayin = ERPwaviewer_apply.SelectERPIdx; + ALLERPIN = gui_erp_waviewer.ERPwaviewer.ALLERP; + ERPArrayin = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; BinArrayIN = []; ChanArrayIn = []; plotOrg = [1 2 3]; try - plotOrg(1) = ERPwaviewer_apply.plot_org.Grid; - plotOrg(2) = ERPwaviewer_apply.plot_org.Overlay; - plotOrg(3) = ERPwaviewer_apply.plot_org.Pages; + plotOrg(1) = gui_erp_waviewer.ERPwaviewer.plot_org.Grid; + plotOrg(2) = gui_erp_waviewer.ERPwaviewer.plot_org.Overlay; + plotOrg(3) = gui_erp_waviewer.ERPwaviewer.plot_org.Pages; catch plotOrg = [1 2 3]; end try - ChanArrayIn = ERPwaviewer_apply.chan; + ChanArrayIn = gui_erp_waviewer.ERPwaviewer.chan; catch ChanArrayIn = []; end try - BinArrayIN = ERPwaviewer_apply.bin; + BinArrayIN = gui_erp_waviewer.ERPwaviewer.bin; catch BinArrayIN = []; end - PageCurrent = ERPwaviewer_apply.PageIndex; + PageCurrent = gui_erp_waviewer.ERPwaviewer.PageIndex; yylim_out = f_erpAutoYLim(ALLERPIN, ERPArrayin,plotOrg,BinArrayIN, ChanArrayIn); YScales = []; try @@ -2504,19 +2378,21 @@ function xyaxis_apply(~,~) catch YScales = yylim_out(1,:); end - + messgStr = ''; if isempty(YScales) messgStr = strcat('The default Y scales will be used because the inputs are empty'); elseif numel(YScales)~=2 messgStr = strcat('The default Y scales will be used because the number of inputs is not 2'); end - erpworkingmemory('ERPViewer_proces_messg',messgStr); - fprintf(2,['\n Warning: ',messgStr,'.\n']); - viewer_ERPDAT.Process_messg =4; + if ~ismepty(messgStr) + estudioworkingmemory('ERPViewer_proces_messg',messgStr); + fprintf(2,['\n Warning: ',messgStr,'.\n']); + viewer_ERPDAT.Process_messg =4; + end end - ERPwaviewer_apply.yaxis.scales =YScales ; - ERPwaviewer_apply.yaxis.scalesauto = gui_erpxyaxeset_waveviewer.yrangeauto.Value; - MERPWaveViewer_yaxis{1} = ERPwaviewer_apply.yaxis.scalesauto; + gui_erp_waviewer.ERPwaviewer.yaxis.scales =YScales ; + gui_erp_waviewer.ERPwaviewer.yaxis.scalesauto = gui_erpxyaxeset_waveviewer.yrangeauto.Value; + MERPWaveViewer_yaxis{1} = gui_erp_waviewer.ERPwaviewer.yaxis.scalesauto; MERPWaveViewer_yaxis{2} = YScales; %%yticks YTicks = str2num(char(gui_erpxyaxeset_waveviewer.yticks_edit.String)); @@ -2531,48 +2407,44 @@ function xyaxis_apply(~,~) end YTicks(yticks_exm) = []; end - ERPwaviewer_apply.yaxis.tickdecimals = gui_erpxyaxeset_waveviewer.yticks_precision.Value-1; - ERPwaviewer_apply.yaxis.ticks = YTicks; - ERPwaviewer_apply.yaxis.tickauto = gui_erpxyaxeset_waveviewer.ytickauto.Value; + gui_erp_waviewer.ERPwaviewer.yaxis.tickdecimals = gui_erpxyaxeset_waveviewer.yticks_precision.Value-1; + gui_erp_waviewer.ERPwaviewer.yaxis.ticks = YTicks; + gui_erp_waviewer.ERPwaviewer.yaxis.tickauto = gui_erpxyaxeset_waveviewer.ytickauto.Value; MERPWaveViewer_yaxis{3} = gui_erpxyaxeset_waveviewer.ytickauto.Value; MERPWaveViewer_yaxis{4} = YTicks; - MERPWaveViewer_yaxis{5} = ERPwaviewer_apply.yaxis.tickdecimals; + MERPWaveViewer_yaxis{5} = gui_erp_waviewer.ERPwaviewer.yaxis.tickdecimals; %%minor yticks - ERPwaviewer_apply.yaxis.yminor.disp = gui_erpxyaxeset_waveviewer.yminortick.Value; - ERPwaviewer_apply.yaxis.yminor.step = str2num(char(gui_erpxyaxeset_waveviewer.yminorstepedit.String)); - ERPwaviewer_apply.yaxis.yminor.auto = gui_erpxyaxeset_waveviewer.yminorstep_auto.Value; - MERPWaveViewer_yaxis{6} = ERPwaviewer_apply.yaxis.yminor.disp ; - MERPWaveViewer_yaxis{7} = ERPwaviewer_apply.yaxis.yminor.auto; - MERPWaveViewer_yaxis{8} = ERPwaviewer_apply.yaxis.yminor.step; + gui_erp_waviewer.ERPwaviewer.yaxis.yminor.disp = gui_erpxyaxeset_waveviewer.yminortick.Value; + gui_erp_waviewer.ERPwaviewer.yaxis.yminor.step = str2num(char(gui_erpxyaxeset_waveviewer.yminorstepedit.String)); + gui_erp_waviewer.ERPwaviewer.yaxis.yminor.auto = gui_erpxyaxeset_waveviewer.yminorstep_auto.Value; + MERPWaveViewer_yaxis{6} = gui_erp_waviewer.ERPwaviewer.yaxis.yminor.disp ; + MERPWaveViewer_yaxis{7} = gui_erp_waviewer.ERPwaviewer.yaxis.yminor.auto; + MERPWaveViewer_yaxis{8} = gui_erp_waviewer.ERPwaviewer.yaxis.yminor.step; %%y labels: on/off - ERPwaviewer_apply.yaxis.label = gui_erpxyaxeset_waveviewer.ylabel_on.Value; + gui_erp_waviewer.ERPwaviewer.yaxis.label = gui_erpxyaxeset_waveviewer.ylabel_on.Value; MERPWaveViewer_yaxis{9} = gui_erpxyaxeset_waveviewer.ylabel_on.Value; %%yticks: font and font size - ERPwaviewer_apply.yaxis.font = gui_erpxyaxeset_waveviewer.yfont_custom.Value; + gui_erp_waviewer.ERPwaviewer.yaxis.font = gui_erpxyaxeset_waveviewer.yfont_custom.Value; yfontsizeinum = str2num(char(fontsize)); - ERPwaviewer_apply.yaxis.fontsize = yfontsizeinum(gui_erpxyaxeset_waveviewer.yfont_custom_size.Value); - MERPWaveViewer_yaxis{10} =ERPwaviewer_apply.yaxis.font; + gui_erp_waviewer.ERPwaviewer.yaxis.fontsize = yfontsizeinum(gui_erpxyaxeset_waveviewer.yfont_custom_size.Value); + MERPWaveViewer_yaxis{10} =gui_erp_waviewer.ERPwaviewer.yaxis.font; MERPWaveViewer_yaxis{11}=gui_erpxyaxeset_waveviewer.yfont_custom_size.Value; %%yticks color - ERPwaviewer_apply.yaxis.fontcolor = gui_erpxyaxeset_waveviewer.ytextcolor.Value; + gui_erp_waviewer.ERPwaviewer.yaxis.fontcolor = gui_erpxyaxeset_waveviewer.ytextcolor.Value; MERPWaveViewer_yaxis{12}=gui_erpxyaxeset_waveviewer.ytextcolor.Value; %%y units - ERPwaviewer_apply.yaxis.units = gui_erpxyaxeset_waveviewer.yunits_on.Value; + gui_erp_waviewer.ERPwaviewer.yaxis.units = gui_erpxyaxeset_waveviewer.yunits_on.Value; MERPWaveViewer_yaxis{13}= gui_erpxyaxeset_waveviewer.yunits_on.Value; estudioworkingmemory('MERPWaveViewer_yaxis',MERPWaveViewer_yaxis);%%save the parameters for y axis to momery file - %%save the parameters - ALLERPwaviewer=ERPwaviewer_apply; - assignin('base','ALLERPwaviewer',ALLERPwaviewer); - f_redrawERP_viewer_test(); + viewer_ERPDAT.Count_currentERP=1; viewer_ERPDAT.Process_messg =2;%% complete end - %%------------change this panel based on the changed ERPsets--------------- function v_currentERP_change(~,~) - if viewer_ERPDAT.Count_currentERP == 0 + if viewer_ERPDAT.Count_currentERP ~=3 return; end [messgStr,viewerpanelIndex] = f_check_erpviewerpanelchanges(); @@ -2581,49 +2453,47 @@ function v_currentERP_change(~,~) estudioworkingmemory('MyViewer_xyaxis',0); end - - try - ERPwaviewer_apply = evalin('base','ALLERPwaviewer'); - catch - beep; - disp('f_ERP_timeampscal_waveviewer_GUI() error: Please run the ERP wave viewer again.'); - return; - end - try - ERPIN = ERPwaviewer_apply.ERP; - timeArray(1) = ERPwaviewer_apply.ERP.times(1); - timeArray(2) = ERPwaviewer_apply.ERP.times(end); - [timeticks stepX]= default_time_ticks_studio(ERPIN, [timeArray(1),timeArray(2)]); + ERPIN = gui_erp_waviewer.ERPwaviewer.ERP; + timeArraydef(1) = gui_erp_waviewer.ERPwaviewer.ERP.times(1); + timeArraydef(2) = gui_erp_waviewer.ERPwaviewer.ERP.times(end); + [timeticksdef stepX]= default_time_ticks_studio(ERPIN, [timeArraydef(1),timeArraydef(2)]); if ~isempty(stepX) && numel(stepX) ==1 stepX = floor(stepX/2); end catch - timeticks = []; - timeArray = []; + timeticksdef = []; + timeArraydef = []; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%----------------------------Setting for X axis------------------- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - xSecondflag = erpworkingmemory('MyViewer_xaxis_second'); - xmSecondflag = erpworkingmemory('MyViewer_xaxis_msecond'); - % if isempty(xSecondflag) && isempty(xmSecondflag) + xSecondflag = estudioworkingmemory('MyViewer_xaxis_second'); + xmSecondflag = estudioworkingmemory('MyViewer_xaxis_msecond'); xdispysecondValue = gui_erpxyaxeset_waveviewer.xmillisecond.Value;%%millisecond - % end - % if xSecondflag ==0 && xmSecondflag==1 - % xdispysecondValue =1; + timerange = str2num(gui_erpxyaxeset_waveviewer.timerange_edit.String); + if isempty(timerange) || numel(timerange)~=2 || timerange(1) >= timeArraydef(2) || timerange(2) <= timeArraydef(1) + timerange =timeArraydef; + if xdispysecondValue==1 + gui_erpxyaxeset_waveviewer.timerange_edit.String = num2str(timerange); + else + gui_erpxyaxeset_waveviewer.timerange_edit.String = num2str(timerange/1000); + end + end if gui_erpxyaxeset_waveviewer.xtimerangeauto.Value==1 if xdispysecondValue==1 - gui_erpxyaxeset_waveviewer.timerange_edit.String = num2str(timeArray); - gui_erpxyaxeset_waveviewer.xticks_precision.String = {'0','1','2','3','4','5','6'}; + gui_erpxyaxeset_waveviewer.timerange_edit.String = num2str(timeArraydef); else - gui_erpxyaxeset_waveviewer.timerange_edit.String = num2str(timeArray/1000); - gui_erpxyaxeset_waveviewer.xticks_precision.String = {'1','2','3','4','5','6'}; + gui_erpxyaxeset_waveviewer.timerange_edit.String = num2str(timeArraydef/1000); end end - % else - % xdispysecondValue =0; - % end + if xdispysecondValue==1 + gui_erpxyaxeset_waveviewer.xticks_precision.String = {'0','1','2','3','4','5','6'}; + else + gui_erpxyaxeset_waveviewer.xticks_precision.String = {'1','2','3','4','5','6'}; + end + + if xdispysecondValue==1 xtick_precision =gui_erpxyaxeset_waveviewer.xticks_precision.Value-1; if xtick_precision<0 @@ -2637,16 +2507,16 @@ function v_currentERP_change(~,~) gui_erpxyaxeset_waveviewer.xticks_precision.Value=1; end end - if gui_erpxyaxeset_waveviewer.xtimetickauto.Value ==1 + if gui_erpxyaxeset_waveviewer.xtimetickauto.Value ==1 && gui_erpxyaxeset_waveviewer.xtimerangeauto.Value==1 if xdispysecondValue==0 - timetickstrs = num2str(str2num(char(timeticks))/1000); + timetickstrs = num2str(str2num(char(timeticksdef))/1000); else - timetickstrs = timeticks; + timetickstrs = timeticksdef; end timetickstrs= f_decimal(char(timetickstrs),xtick_precision); gui_erpxyaxeset_waveviewer.timeticks_edit.String = char(timetickstrs); end - ERPwaviewer_apply.xaxis.tickdecimals = xtick_precision; + gui_erp_waviewer.ERPwaviewer.xaxis.tickdecimals = xtick_precision; %%X minor ticks stepX = []; @@ -2692,6 +2562,38 @@ function v_currentERP_change(~,~) gui_erpxyaxeset_waveviewer.timeminorticks_custom.String = num2str(stepX); end + if xdispysecondValue==1 + gui_erp_waviewer.ERPwaviewer.xaxis.timerange = str2num(gui_erpxyaxeset_waveviewer.timerange_edit.String); + else + gui_erp_waviewer.ERPwaviewer.xaxis.timerange = str2num(gui_erpxyaxeset_waveviewer.timerange_edit.String)*1000; + end + timeRange = gui_erp_waviewer.ERPwaviewer.xaxis.timerange ; + %%getting xticks + if xdispysecondValue==1 + xticksArray = str2num(char(gui_erpxyaxeset_waveviewer.timeticks_edit.String)); + else + xticksArray = str2num(char(gui_erpxyaxeset_waveviewer.timeticks_edit.String))*1000; + end + count_xtks = 0; + xticks_exm = []; + if ~isempty(xticksArray) && numel(timeRange) ==2 %%check if xticks exceed the defined time range + for Numofxticks = 1:numel(xticksArray) + if xticksArray(Numofxticks)< timeRange(1) || xticksArray(Numofxticks)> timeRange(2) + count_xtks =count_xtks+1; + xticks_exm(count_xtks) = Numofxticks; + end + end + xticksArray(xticks_exm) = []; + end + + xticckMinorstep = str2num(char(gui_erpxyaxeset_waveviewer.timeminorticks_custom.String)); + if xdispysecondValue==1 + gui_erp_waviewer.ERPwaviewer.xaxis.tminor.step = xticckMinorstep; + else + gui_erp_waviewer.ERPwaviewer.xaxis.tminor.step = xticckMinorstep*1000; + end + gui_erp_waviewer.ERPwaviewer.xaxis.timeticks = xticksArray; + MERPWaveViewer_xaxis = estudioworkingmemory('MERPWaveViewer_xaxis'); if xdispysecondValue==1 MERPWaveViewer_xaxis{1}=1; @@ -2706,41 +2608,42 @@ function v_currentERP_change(~,~) end estudioworkingmemory('MERPWaveViewer_xaxis',MERPWaveViewer_xaxis);%%save the changed parameters for x axis to memory file. - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%----------------------------Setting for Y axis------------------- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%y scale - ALLERPIN = ERPwaviewer_apply.ALLERP; - ERPArrayin = ERPwaviewer_apply.SelectERPIdx; - BinArrayIN = []; - ChanArrayIn = []; + ALLERPIN = gui_erp_waviewer.ERPwaviewer.ALLERP; + ERPArrayin = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; plotOrg = [1 2 3]; try - plotOrg(1) = ERPwaviewer_apply.plot_org.Grid; - plotOrg(2) = ERPwaviewer_apply.plot_org.Overlay; - plotOrg(3) = ERPwaviewer_apply.plot_org.Pages; + plotOrg(1) = gui_erp_waviewer.ERPwaviewer.plot_org.Grid; + plotOrg(2) = gui_erp_waviewer.ERPwaviewer.plot_org.Overlay; + plotOrg(3) = gui_erp_waviewer.ERPwaviewer.plot_org.Pages; catch plotOrg = [1 2 3]; end try - ChanArrayIn = ERPwaviewer_apply.chan; + ChanArrayIn = gui_erp_waviewer.ERPwaviewer.chan; catch ChanArrayIn = []; end try - BinArrayIN = ERPwaviewer_apply.bin; + BinArrayIN = gui_erp_waviewer.ERPwaviewer.bin; catch BinArrayIN = []; end - PageCurrent = ERPwaviewer_apply.PageIndex; + PageCurrent = gui_erp_waviewer.ERPwaviewer.PageIndex; yylim_out = f_erpAutoYLim(ALLERPIN, ERPArrayin,plotOrg,BinArrayIN, ChanArrayIn); try yRangeLabel = num2str(yylim_out(PageCurrent,:)); catch yRangeLabel = num2str(yylim_out(1,:)); end + yrange = str2num(gui_erpxyaxeset_waveviewer.yrange_edit.String); + if isempty(yrange) || numel(yrange)~=2 + yrange = str2num(yRangeLabel); + end if gui_erpxyaxeset_waveviewer.yrangeauto.Value ==1 gui_erpxyaxeset_waveviewer.yrange_edit.String = yRangeLabel; @@ -2752,7 +2655,7 @@ function v_currentERP_change(~,~) end ytick_precision= gui_erpxyaxeset_waveviewer.yticks_precision.Value-1; yticksLabel= f_decimal(char(yticksLabel),ytick_precision); - if gui_erpxyaxeset_waveviewer.ytickauto.Value ==1 + if gui_erpxyaxeset_waveviewer.ytickauto.Value ==1 && gui_erpxyaxeset_waveviewer.yrangeauto.Value ==1 gui_erpxyaxeset_waveviewer.yticks_edit.String = yticksLabel; end @@ -2760,7 +2663,7 @@ function v_currentERP_change(~,~) if gui_erpxyaxeset_waveviewer.yminorstep_auto.Value==1 yticksStr = str2num(char(gui_erpxyaxeset_waveviewer.yticks_edit.String)); stepY = []; - yscaleRange = (str2num(yRangeLabel)); + if ~isempty(yticksStr) && numel(yticksStr)>1 if numel(yticksStr)>=2 for Numofxticks = 1:numel(yticksStr)-1 @@ -2769,7 +2672,7 @@ function v_currentERP_change(~,~) %%adjust the left edge steyleft = (yticksStr(2)-yticksStr(1))/2; for ii = 1:1000 - if (yticksStr(1)- steyleft*ii)>=yscaleRange(1) + if (yticksStr(1)- steyleft*ii)>=yrange(1) stepY = [(yticksStr(1)- steyleft*ii),stepY]; else break; @@ -2778,7 +2681,7 @@ function v_currentERP_change(~,~) %%adjust the right edge steyright = (yticksStr(end)-yticksStr(end-1))/2; for ii = 1:1000 - if (yticksStr(end)+ steyright*ii)<=yscaleRange(end) + if (yticksStr(end)+ steyright*ii)<=yrange(end) stepY = [stepY,(yticksStr(end)+ steyright*ii)]; else break; @@ -2789,42 +2692,12 @@ function v_currentERP_change(~,~) gui_erpxyaxeset_waveviewer.yminorstepedit.String=char(num2str(stepY)); end - if xdispysecondValue==1 - ERPwaviewer_apply.xaxis.timerange = str2num(gui_erpxyaxeset_waveviewer.timerange_edit.String); - else - ERPwaviewer_apply.xaxis.timerange = str2num(gui_erpxyaxeset_waveviewer.timerange_edit.String)*1000; - end - timeRange = ERPwaviewer_apply.xaxis.timerange ; - %%getting xticks - if xdispysecondValue==1 - xticksArray = str2num(char(gui_erpxyaxeset_waveviewer.timeticks_edit.String)); - else - xticksArray = str2num(char(gui_erpxyaxeset_waveviewer.timeticks_edit.String))*1000; - end - count_xtks = 0; - xticks_exm = []; - if ~isempty(xticksArray) && numel(timeRange) ==2 %%check if xticks exceed the defined time range - for Numofxticks = 1:numel(xticksArray) - if xticksArray(Numofxticks)< timeRange(1) || xticksArray(Numofxticks)> timeRange(2) - count_xtks =count_xtks+1; - xticks_exm(count_xtks) = Numofxticks; - end - end - xticksArray(xticks_exm) = []; - end - xticckMinorstep = str2num(char(gui_erpxyaxeset_waveviewer.timeminorticks_custom.String)); - if xdispysecondValue==1 - ERPwaviewer_apply.xaxis.tminor.step = xticckMinorstep; - else - ERPwaviewer_apply.xaxis.tminor.step = xticckMinorstep*1000; - end - ERPwaviewer_apply.xaxis.timeticks = xticksArray; %%y axis YScales = str2num(char(gui_erpxyaxeset_waveviewer.yrange_edit.String)); if isempty(YScales) - PageCurrent = ERPwaviewer_apply.PageIndex; + PageCurrent = gui_erp_waviewer.ERPwaviewer.PageIndex; yylim_out = f_erpAutoYLim(ALLERPIN, ERPArrayin,plotOrg,BinArrayIN, ChanArrayIn); YScales = []; try @@ -2833,7 +2706,7 @@ function v_currentERP_change(~,~) YScales = yylim_out(1,:); end end - ERPwaviewer_apply.yaxis.scales =YScales ; + gui_erp_waviewer.ERPwaviewer.yaxis.scales =YScales ; YTicks = str2num(char(gui_erpxyaxeset_waveviewer.yticks_edit.String)); count_xtks = 0; yticks_exm = []; @@ -2846,336 +2719,35 @@ function v_currentERP_change(~,~) end YTicks(yticks_exm) = []; end - ERPwaviewer_apply.yaxis.ticks = YTicks; - ERPwaviewer_apply.yaxis.yminor.step = str2num(char(gui_erpxyaxeset_waveviewer.yminorstepedit.String)); + gui_erp_waviewer.ERPwaviewer.yaxis.ticks = YTicks; + gui_erp_waviewer.ERPwaviewer.yaxis.yminor.step = str2num(char(gui_erpxyaxeset_waveviewer.yminorstepedit.String)); %%save the parameters - assignin('base','ALLERPwaviewer',ERPwaviewer_apply); MERPWaveViewer_yaxis = estudioworkingmemory('MERPWaveViewer_yaxis'); MERPWaveViewer_yaxis{1} = gui_erpxyaxeset_waveviewer.yrangeauto.Value; MERPWaveViewer_yaxis{2}=str2num(char(gui_erpxyaxeset_waveviewer.yrange_edit.String)); MERPWaveViewer_yaxis{4} = str2num(char(gui_erpxyaxeset_waveviewer.yticks_edit.String)); MERPWaveViewer_yaxis{8} = str2num(char(gui_erpxyaxeset_waveviewer.yminorstepedit.String)); estudioworkingmemory('MERPWaveViewer_yaxis',MERPWaveViewer_yaxis);%%save the changed parameters for y axis to memory file. - + viewer_ERPDAT.Count_currentERP =4; end - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%---------------change X/Y axis based on the current Page---------------- -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - function page_xyaxis_change(~,~) - if viewer_ERPDAT.page_xyaxis==0 +%%-------------modify this panel based on the updated parameters----------- + function loadproper_change(~,~) + if viewer_ERPDAT.loadproper_count ~=3 return; end - %%execute any changes in this panel - [messgStr,viewerpanelIndex] = f_check_erpviewerpanelchanges(); - if ~isempty(messgStr) && viewerpanelIndex==3 - xyaxis_apply(); - estudioworkingmemory('MyViewer_xyaxis',0); - end - - try - ERPwaviewer_apply = evalin('base','ALLERPwaviewer'); - catch - beep; - disp('f_ERP_timeampscal_waveviewer_GUI() error: Please run the ERP wave viewer again.'); - return; - end - - try - ERPIN = ERPwaviewer_apply.ERP; - timeArray(1) = ERPwaviewer_apply.ERP.times(1); - timeArray(2) = ERPwaviewer_apply.ERP.times(end); - [timeticks stepX]= default_time_ticks_studio(ERPIN, [timeArray(1),timeArray(2)]); - if ~isempty(stepX) && numel(stepX) ==1 - stepX = floor(stepX/2); - end - catch - timeticks = ''; - timeArray = []; - end - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - %%----------------------------Setting for X axis------------------- - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - xSecondflag = erpworkingmemory('MyViewer_xaxis_second'); - xmSecondflag = erpworkingmemory('MyViewer_xaxis_msecond'); - if isempty(xSecondflag) && isempty(xmSecondflag) - xdispysecondValue = gui_erpxyaxeset_waveviewer.xmillisecond.Value;%%millisecond - end - if xSecondflag ==0 && xmSecondflag==1 - xdispysecondValue =1; - if gui_erpxyaxeset_waveviewer.xtimerangeauto.Value==1 - if xdispysecondValue==1 - gui_erpxyaxeset_waveviewer.timerange_edit.String = num2str(timeArray); - gui_erpxyaxeset_waveviewer.xticks_precision.String = {'0','1','2','3','4','5','6'}; - else - gui_erpxyaxeset_waveviewer.timerange_edit.String = num2str(timeArray/1000); - gui_erpxyaxeset_waveviewer.xticks_precision.String = {'1','2','3','4','5','6'}; - end - end - else - xdispysecondValue =0; - end - - if xdispysecondValue==1 - xtick_precision =gui_erpxyaxeset_waveviewer.xticks_precision.Value-1; - if xtick_precision<0 - xtick_precision =0; - gui_erpxyaxeset_waveviewer.xticks_precision.Value=1; - end - else - xtick_precision =gui_erpxyaxeset_waveviewer.xticks_precision.Value; - if xtick_precision<=0 - xtick_precision =1; - gui_erpxyaxeset_waveviewer.xticks_precision.Value=1; - end - end - ERPwaviewer_apply.xaxis.tickdecimals = xtick_precision; - - if gui_erpxyaxeset_waveviewer.xtimetickauto.Value ==1 - if xdispysecondValue==0 - timeticks = num2str(str2num(char(timeticks))/1000); - end - timeticks= f_decimal(char(timeticks),xtick_precision); - gui_erpxyaxeset_waveviewer.timeticks_edit.String = char(timeticks); - end - %%X minor ticks - stepX = []; - timeArray = str2num(char(gui_erpxyaxeset_waveviewer.timerange_edit.String)); - xticksStr = str2num(char(gui_erpxyaxeset_waveviewer.timeticks_edit.String)); - if xdispysecondValue~=1 - xticksStr = xticksStr*1000; - timeArray = timeArray*1000; - end - if gui_erpxyaxeset_waveviewer.timeminorticks_auto.Value ==1 - if ~isempty(xticksStr) && numel(xticksStr)>1 - - if ~isempty(xticksStr) && numel(xticksStr)>1 && numel(timeArray) ==2 && (timeArray(1)< timeArray(2)) - if numel(xticksStr)>=2 - for Numofxticks = 1:numel(xticksStr)-1 - stepX(1,Numofxticks) = xticksStr(Numofxticks)+(xticksStr(Numofxticks+1)-xticksStr(Numofxticks))/2; - end - %%adjust the left edge - stexleft = (xticksStr(2)-xticksStr(1))/2; - for ii = 1:1000 - if (xticksStr(1)- stexleft*ii)>=timeArray(1) - stepX = [(xticksStr(1)- stexleft*ii),stepX]; - else - break; - end - end - %%adjust the right edge - stexright = (xticksStr(end)-xticksStr(end-1))/2; - for ii = 1:1000 - if (xticksStr(end)+ stexright*ii)<=timeArray(end) - stepX = [stepX,(xticksStr(end)+ stexright*ii)]; - else - break; - end - end - end - end - end - if xdispysecondValue==0 - stepX =stepX/1000; - end - gui_erpxyaxeset_waveviewer.timeminorticks_custom.String = num2str(stepX); - end - - MERPWaveViewer_xaxis = estudioworkingmemory('MERPWaveViewer_xaxis'); - if xdispysecondValue==1 - MERPWaveViewer_xaxis{1}=1; - MERPWaveViewer_xaxis{3} = str2num(char(gui_erpxyaxeset_waveviewer.timerange_edit.String)); - MERPWaveViewer_xaxis{5} = str2num(char(gui_erpxyaxeset_waveviewer.timeticks_edit.String)); - MERPWaveViewer_xaxis{8} = str2num(char(gui_erpxyaxeset_waveviewer.timeminorticks_custom.String)); - else - MERPWaveViewer_xaxis{1}=0; - MERPWaveViewer_xaxis{3} = str2num(char(gui_erpxyaxeset_waveviewer.timerange_edit.String)); - MERPWaveViewer_xaxis{5} = str2num(char(gui_erpxyaxeset_waveviewer.timeticks_edit.String)); - MERPWaveViewer_xaxis{8} = str2num(char(gui_erpxyaxeset_waveviewer.timeminorticks_custom.String)); - end - estudioworkingmemory('MERPWaveViewer_xaxis',MERPWaveViewer_xaxis);%%save the changed parameters for x axis to memory file. - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - %%----------------------------Setting for Y axis------------------- - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - %%y scale - ALLERPIN = ERPwaviewer_apply.ALLERP; - ERPArrayin = ERPwaviewer_apply.SelectERPIdx; - BinArrayIN = []; - ChanArrayIn = []; - plotOrg = [1 2 3]; - try - plotOrg(1) = ERPwaviewer_apply.plot_org.Grid; - plotOrg(2) = ERPwaviewer_apply.plot_org.Overlay; - plotOrg(3) = ERPwaviewer_apply.plot_org.Pages; - catch - plotOrg = [1 2 3]; - end - try - ChanArrayIn = ERPwaviewer_apply.chan; - catch - ChanArrayIn = []; - end - try - BinArrayIN = ERPwaviewer_apply.bin; - catch - BinArrayIN = []; - end - - PageCurrent = ERPwaviewer_apply.PageIndex; - yylim_out = f_erpAutoYLim(ALLERPIN, ERPArrayin,plotOrg,BinArrayIN, ChanArrayIn); - try - yRangeLabel = num2str(yylim_out(PageCurrent,:)); - catch - yRangeLabel = num2str(yylim_out(1,:)); - end - - if gui_erpxyaxeset_waveviewer.yrangeauto.Value ==1 - gui_erpxyaxeset_waveviewer.yrange_edit.String = yRangeLabel; - end - %%y ticks - yticksLabel = ''; - if ~isempty(str2num(yRangeLabel)) - yticksLabel = default_amp_ticks_viewer(str2num(yRangeLabel)); - end - - ytick_precision= gui_erpxyaxeset_waveviewer.yticks_precision.Value-1; - yticksLabel= f_decimal(char(yticksLabel),ytick_precision); - - if gui_erpxyaxeset_waveviewer.ytickauto.Value ==1 - gui_erpxyaxeset_waveviewer.yticks_edit.String = yticksLabel; - end - - %%y minor ticks - if gui_erpxyaxeset_waveviewer.yminorstep_auto.Value==1 - yticksStr = str2num(char(gui_erpxyaxeset_waveviewer.yticks_edit.String)); - stepY = []; - yscaleRange = (str2num(yRangeLabel)); - if ~isempty(yticksStr) && numel(yticksStr)>1 - if numel(yticksStr)>=2 - for Numofxticks = 1:numel(yticksStr)-1 - stepY(1,Numofxticks) = yticksStr(Numofxticks)+(yticksStr(Numofxticks+1)-yticksStr(Numofxticks))/2; - end - %%adjust the left edge - steyleft = (yticksStr(2)-yticksStr(1))/2; - for ii = 1:1000 - if (yticksStr(1)- steyleft*ii)>=yscaleRange(1) - stepY = [(yticksStr(1)- steyleft*ii),stepY]; - else - break; - end - end - %%adjust the right edge - steyright = (yticksStr(end)-yticksStr(end-1))/2; - for ii = 1:1000 - if (yticksStr(end)+ steyright*ii)<=yscaleRange(end) - stepY = [stepY,(yticksStr(end)+ steyright*ii)]; - else - break; - end - end - end - end - gui_erpxyaxeset_waveviewer.yminorstepedit.String=char(num2str(stepY)); - end - - if xdispysecondValue==1 - ERPwaviewer_apply.xaxis.timerange = str2num(gui_erpxyaxeset_waveviewer.timerange_edit.String); - else - ERPwaviewer_apply.xaxis.timerange = str2num(gui_erpxyaxeset_waveviewer.timerange_edit.String)*1000; - end - timeRange = ERPwaviewer_apply.xaxis.timerange; - - %%getting xticks - if xdispysecondValue==1 - xticksArray = str2num(char(gui_erpxyaxeset_waveviewer.timeticks_edit.String)); - else - xticksArray = str2num(char(gui_erpxyaxeset_waveviewer.timeticks_edit.String))*1000; - end - count_xtks = 0; - xticks_exm = []; - if ~isempty(xticksArray) && numel(timeRange) ==2 %%check if xticks exceed the defined time range - for Numofxticks = 1:numel(xticksArray) - if xticksArray(Numofxticks)< timeRange(1) || xticksArray(Numofxticks)> timeRange(2) - count_xtks =count_xtks+1; - xticks_exm(count_xtks) = Numofxticks; - end - end - xticksArray(xticks_exm) = []; - end - - xticckMinorstep = str2num(char(gui_erpxyaxeset_waveviewer.timeminorticks_custom.String)); - if xdispysecondValue==1 - ERPwaviewer_apply.xaxis.tminor.step = xticckMinorstep; - else - ERPwaviewer_apply.xaxis.tminor.step = xticckMinorstep*1000; - end - ERPwaviewer_apply.xaxis.timeticks = xticksArray; - - %%y axis - YScales = str2num(char(gui_erpxyaxeset_waveviewer.yrange_edit.String)); - if isempty(YScales) - PageCurrent = ERPwaviewer_apply.PageIndex; - yylim_out = f_erpAutoYLim(ALLERPIN, ERPArrayin,plotOrg,BinArrayIN, ChanArrayIn); - YScales = []; - try - YScales = yylim_out(PageCurrent,:); - catch - YScales = yylim_out(1,:); - end - end - ERPwaviewer_apply.yaxis.scales =YScales ; - YTicks = str2num(char(gui_erpxyaxeset_waveviewer.yticks_edit.String)); - count_xtks = 0; - yticks_exm = []; - if ~isempty(YTicks) && numel(YScales) ==2 %%check if xticks exceed the defined time range - for Numofxticks = 1:numel(YTicks) - if YTicks(Numofxticks)< YScales(1) || YTicks(Numofxticks)> YScales(2) - count_xtks =count_xtks+1; - yticks_exm(count_xtks) = Numofxticks; - end - end - YTicks(yticks_exm) = []; - end - ERPwaviewer_apply.yaxis.ticks = YTicks; - ERPwaviewer_apply.yaxis.yminor.step = str2num(char(gui_erpxyaxeset_waveviewer.yminorstepedit.String)); - - MERPWaveViewer_yaxis = estudioworkingmemory('MERPWaveViewer_yaxis'); - MERPWaveViewer_yaxis{1} = gui_erpxyaxeset_waveviewer.yrangeauto.Value; - MERPWaveViewer_yaxis{2}=str2num(char(gui_erpxyaxeset_waveviewer.yrange_edit.String)); - MERPWaveViewer_yaxis{4} = str2num(char(gui_erpxyaxeset_waveviewer.yticks_edit.String)); - MERPWaveViewer_yaxis{8} = str2num(char(gui_erpxyaxeset_waveviewer.yminorstepedit.String)); - estudioworkingmemory('MERPWaveViewer_yaxis',MERPWaveViewer_yaxis);%%save the changed parameters for y axis to memory file. - - %%save the parameters - assignin('base','ALLERPwaviewer',ERPwaviewer_apply); - end - -%%-------------modify this panel based on the updated parameters----------- - function loadproper_change(~,~) - if viewer_ERPDAT.loadproper_count ~=3 - return; - end - try - ERPwaviewer_apply = evalin('base','ALLERPwaviewer'); - catch - beep; - disp('f_ERP_timeampscal_waveviewer_GUI()> loadproper_change() error: Please run the ERP wave viewer again.'); - return; - end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%------------------------------X axis---------------------------%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%display xtick with milliseocnd or second - xdispysecondValue = ERPwaviewer_apply.xaxis.tdis; + xdispysecondValue = gui_erp_waviewer.ERPwaviewer.xaxis.tdis; gui_erpxyaxeset_waveviewer.xmillisecond.Value = xdispysecondValue; gui_erpxyaxeset_waveviewer.xsecond.Value = ~xdispysecondValue; try - ERPIN = ERPwaviewer_apply.ERP; + ERPIN = gui_erp_waviewer.ERPwaviewer.ERP; timeArraydef(1) = ERPIN.times(1); timeArraydef(2) = ERPIN.times(end); [timeticksdef stepX]= default_time_ticks_studio(ERPIN, [timeArraydef(1),timeArraydef(2)]); @@ -3189,16 +2761,15 @@ function loadproper_change(~,~) end MERPWaveViewer_xaxis{1} =1; - %%x range - timeRange = ERPwaviewer_apply.xaxis.timerange; - timeRangeAuto = ERPwaviewer_apply.xaxis.trangeauto; + timeRange = gui_erp_waviewer.ERPwaviewer.xaxis.timerange; + timeRangeAuto = gui_erp_waviewer.ERPwaviewer.xaxis.trangeauto; if timeRangeAuto~=0 && timeRangeAuto~=1 timeRangeAuto =1; end if timeRangeAuto==1 timeRange = timeArraydef; - ERPwaviewer_apply.xaxis.timerange= timeArraydef; + gui_erp_waviewer.ERPwaviewer.xaxis.timerange= timeArraydef; end if xdispysecondValue ==1 gui_erpxyaxeset_waveviewer.timerange_edit.String = num2str(timeRange); @@ -3214,12 +2785,12 @@ function loadproper_change(~,~) else gui_erpxyaxeset_waveviewer.timerange_edit.Enable = 'on'; end - timeTick = ERPwaviewer_apply.xaxis.timeticks; - timetickAuto = ERPwaviewer_apply.xaxis.ticksauto; + timeTick = gui_erp_waviewer.ERPwaviewer.xaxis.timeticks; + timetickAuto = gui_erp_waviewer.ERPwaviewer.xaxis.ticksauto; if timetickAuto==1 gui_erpxyaxeset_waveviewer.timeticks_edit.Enable = 'off'; timeTick = timeticksdef; - ERPwaviewer_apply.xaxis.timeticks = timeTick; + gui_erp_waviewer.ERPwaviewer.xaxis.timeticks = timeTick; else gui_erpxyaxeset_waveviewer.timeticks_edit.Enable = 'on'; end @@ -3228,7 +2799,7 @@ function loadproper_change(~,~) if xdispysecondValue ==0%% in second timeTick = timeTick/1000; end - xtick_precision = ERPwaviewer_apply.xaxis.tickdecimals; + xtick_precision = gui_erp_waviewer.ERPwaviewer.xaxis.tickdecimals; if xdispysecondValue==1 if xtick_precision<0 xtick_precision=1; @@ -3247,9 +2818,9 @@ function loadproper_change(~,~) timeTick= f_decimal(char(num2str(timeTick)),xtick_precision); gui_erpxyaxeset_waveviewer.timeticks_edit.String = timeTick; gui_erpxyaxeset_waveviewer.xtimetickauto.Value = timetickAuto; - timetixkMinordip = ERPwaviewer_apply.xaxis.tminor.disp; - timetixkMinorstep = ERPwaviewer_apply.xaxis.tminor.step; - timetixkMinorauto = ERPwaviewer_apply.xaxis.tminor.auto; + timetixkMinordip = gui_erp_waviewer.ERPwaviewer.xaxis.tminor.disp; + timetixkMinorstep = gui_erp_waviewer.ERPwaviewer.xaxis.tminor.step; + timetixkMinorauto = gui_erp_waviewer.ERPwaviewer.xaxis.tminor.auto; gui_erpxyaxeset_waveviewer.xtimeminorauto.Value = timetixkMinordip; xticks = str2num(char(gui_erpxyaxeset_waveviewer.timeticks_edit.String)); stepX = []; @@ -3291,7 +2862,7 @@ function loadproper_change(~,~) end if timetixkMinorauto==1 timetixkMinorstep = stepX; - ERPwaviewer_apply.xaxis.tminor.step= timetixkMinorstep; + gui_erp_waviewer.ERPwaviewer.xaxis.tminor.step= timetixkMinorstep; end timetixkMinorstep= f_decimal(char(num2str(timetixkMinorstep)),xtick_precision); gui_erpxyaxeset_waveviewer.timeminorticks_custom.String = char(timetixkMinorstep); @@ -3308,20 +2879,20 @@ function loadproper_change(~,~) end end %%xticklabels - xticklabelValue = ERPwaviewer_apply.xaxis.label; + xticklabelValue = gui_erp_waviewer.ERPwaviewer.xaxis.label; gui_erpxyaxeset_waveviewer.xtimelabel_on.Value = xticklabelValue; gui_erpxyaxeset_waveviewer.xtimelabel_off.Value = ~xticklabelValue; - xticklabelfont = ERPwaviewer_apply.xaxis.font; + xticklabelfont = gui_erp_waviewer.ERPwaviewer.xaxis.font; gui_erpxyaxeset_waveviewer.xtimefont_custom.Value = xticklabelfont; - xticklabelfontsize = ERPwaviewer_apply.xaxis.fontsize; + xticklabelfontsize = gui_erp_waviewer.ERPwaviewer.xaxis.fontsize; fontsize = {'4','6','8','10','12','14','16','18','20','24','28','32','36',... '40','50','60','70','80','90','100'}; fontsize = str2num(char(fontsize)); [xsize,y] = find(fontsize ==xticklabelfontsize); gui_erpxyaxeset_waveviewer.font_custom_size.Value = xsize; - xticklabelcolor = ERPwaviewer_apply.xaxis.fontcolor; + xticklabelcolor = gui_erp_waviewer.ERPwaviewer.xaxis.fontcolor; gui_erpxyaxeset_waveviewer.xtimetextcolor.Value =xticklabelcolor; - xaxisunits = ERPwaviewer_apply.xaxis.units; + xaxisunits = gui_erp_waviewer.ERPwaviewer.xaxis.units; gui_erpxyaxeset_waveviewer.xtimeunits_on.Value =xaxisunits; gui_erpxyaxeset_waveviewer.xtimeunits_off.Value = ~xaxisunits; if xticklabelValue ==1 @@ -3343,29 +2914,27 @@ function loadproper_change(~,~) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%------------------------------Y axis---------------------------%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ALLERPIN = ERPwaviewer_apply.ALLERP; - ERPArrayin = ERPwaviewer_apply.SelectERPIdx; - BinArrayIN = []; - ChanArrayIn = []; + ALLERPIN = gui_erp_waviewer.ERPwaviewer.ALLERP; + ERPArrayin = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; plotOrg = [1 2 3]; try - plotOrg(1) = ERPwaviewer_apply.plot_org.Grid; - plotOrg(2) = ERPwaviewer_apply.plot_org.Overlay; - plotOrg(3) = ERPwaviewer_apply.plot_org.Pages; + plotOrg(1) = gui_erp_waviewer.ERPwaviewer.plot_org.Grid; + plotOrg(2) = gui_erp_waviewer.ERPwaviewer.plot_org.Overlay; + plotOrg(3) = gui_erp_waviewer.ERPwaviewer.plot_org.Pages; catch plotOrg = [1 2 3]; end try - ChanArrayIn = ERPwaviewer_apply.chan; + ChanArrayIn = gui_erp_waviewer.ERPwaviewer.chan; catch ChanArrayIn = []; end try - BinArrayIN = ERPwaviewer_apply.bin; + BinArrayIN = gui_erp_waviewer.ERPwaviewer.bin; catch BinArrayIN = []; end - PageCurrent = ERPwaviewer_apply.PageIndex; + PageCurrent = gui_erp_waviewer.ERPwaviewer.PageIndex; yylim_out = f_erpAutoYLim(ALLERPIN, ERPArrayin,plotOrg,BinArrayIN, ChanArrayIn); try yRangeLabel = yylim_out(PageCurrent,:); @@ -3373,12 +2942,12 @@ function loadproper_change(~,~) yRangeLabel = yylim_out(1,:); end - YScales = ERPwaviewer_apply.yaxis.scales; - YScalesAuto = ERPwaviewer_apply.yaxis.scalesauto; + YScales = gui_erp_waviewer.ERPwaviewer.yaxis.scales; + YScalesAuto = gui_erp_waviewer.ERPwaviewer.yaxis.scalesauto; if YScalesAuto==1 gui_erpxyaxeset_waveviewer.yrange_edit.Enable = 'off'; YScales =yRangeLabel; - ERPwaviewer_apply.yaxis.scales= YScales; + gui_erp_waviewer.ERPwaviewer.yaxis.scales= YScales; else gui_erpxyaxeset_waveviewer.yrange_edit.Enable = 'on'; end @@ -3386,13 +2955,13 @@ function loadproper_change(~,~) gui_erpxyaxeset_waveviewer.yrangeauto.Value = YScalesAuto; %%y ticks try - gui_erpxyaxeset_waveviewer.yticks_precision.Value =ERPwaviewer_apply.yaxis.tickdecimals; + gui_erpxyaxeset_waveviewer.yticks_precision.Value =gui_erp_waviewer.ERPwaviewer.yaxis.tickdecimals; catch gui_erpxyaxeset_waveviewer.yticks_precision.Value =1; end - yticks = ERPwaviewer_apply.yaxis.ticks; - yticksauto = ERPwaviewer_apply.yaxis.tickauto; - ytick_precision = ERPwaviewer_apply.yaxis.tickdecimals; + yticks = gui_erp_waviewer.ERPwaviewer.yaxis.ticks; + yticksauto = gui_erp_waviewer.ERPwaviewer.yaxis.tickauto; + ytick_precision = gui_erp_waviewer.ERPwaviewer.yaxis.tickdecimals; gui_erpxyaxeset_waveviewer.yticks_precision.Value = ytick_precision+1; yRangeLabel = str2num(char(gui_erpxyaxeset_waveviewer.yrange_edit.String)); if ~isempty(yRangeLabel) && numel(yRangeLabel) ==2 && (yRangeLabel(1) length(ALLERP) - SelectedIndex =length(ALLERP); - end + SelectedIndex = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; catch - beep; - disp('f_ERPsets_waviewer_GUI error: Restart ERPwave Viewer'); - return; + SelectedIndex =length(ALLERP); + end + if any(SelectedIndex(:)> length(ALLERP)) + SelectedIndex =length(ALLERP); end - [r, ~] = size(ERPdatasets); % Get size of array of ERPdatasets. r is # of ERPdatasets - % Sort the ERPdatasets!!! - ERPdatasets = sortdata(ERPdatasets); ERPwaveview_erpsetops.vBox = uiextras.VBox('Parent', ERPsets_waveviewer_box, 'Spacing', 5,'BackgroundColor',ColorBviewer_def); % VBox for everything - %%-----------------------Display tthe selected ERPsets--------------------------------------- panelshbox = uiextras.HBox('Parent', ERPwaveview_erpsetops.vBox, 'Spacing', 5,'BackgroundColor',ColorBviewer_def); dsnames = {}; - if size(ERPdatasets,1)==1 - if strcmp(ERPdatasets{1},'No ERPset loaded') - dsnames = {''}; - else - dsnames{1} = strcat(num2str(cell2mat(ERPdatasets(1,2))),'.',32,ERPdatasets{1,1}); - end - else - for Numofsub = 1:size(ERPdatasets,1) - dsnames{Numofsub} = char(strcat(num2str(cell2mat(ERPdatasets(Numofsub,2))),'.',32,ERPdatasets{Numofsub,1})); - end + for Numofsub = 1:size(ERPdatasets,1) + dsnames{Numofsub} = char(strcat(num2str(cell2mat(ERPdatasets(Numofsub,2))),'.',32,ERPdatasets{Numofsub,1})); end ds_length = length(ERPdatasets); ERPwaveview_erpsetops.butttons_datasets = uicontrol('Parent', panelshbox, 'Style', 'listbox', 'min', 1,'max',... - ds_length,'String', dsnames,'Value', SelectedIndex,'Callback',@selectdata,'FontSize',FonsizeDefault,'Enable','on'); + ds_length,'String', dsnames,'Value', SelectedIndex,'Callback',@selectdata,'FontSize',FonsizeDefault,'Enable','on','BackgroundColor',[1 1 1]); ERPwaveview_erpsetops.butttons_datasets.KeyPressFcn = @ERPset_keypress; %%Help and apply ERPwaveview_erpsetops.help_apply_title = uiextras.HBox('Parent', ERPwaveview_erpsetops.vBox,'BackgroundColor',ColorBviewer_def); - ERPwaveview_erpsetops.auto = uicontrol('Style', 'pushbutton','Parent', ERPwaveview_erpsetops.help_apply_title,... - 'String',' Refresh','callback',@erpselect_refresh,'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1]); uiextras.Empty('Parent',ERPwaveview_erpsetops.help_apply_title ); - uicontrol('Style','pushbutton','Parent', ERPwaveview_erpsetops.help_apply_title ,'String','Cancel',... - 'callback',@erpset_help,'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1]); %,'HorizontalAlignment','left' + ERPwaveview_erpsetops.erpset_cancel = uicontrol('Style','pushbutton','Parent', ERPwaveview_erpsetops.help_apply_title ,'String','Cancel',... + 'callback',@erpset_cancel,'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1]); %,'HorizontalAlignment','left' uiextras.Empty('Parent',ERPwaveview_erpsetops.help_apply_title ); ERPwaveview_erpsetops.erpset_apply = uicontrol('Style','pushbutton','Parent',ERPwaveview_erpsetops.help_apply_title ,'String','Apply',... 'callback',@ERPset_apply,'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1]); %,'HorizontalAlignment','left' - % uiextras.Empty('Parent',ERPwaveview_erpsetops.help_apply_title ); - set(ERPwaveview_erpsetops.help_apply_title ,'Sizes',[70 14 70 14 70]); - set(ERPwaveview_erpsetops.vBox, 'Sizes', [190 25]); + uiextras.Empty('Parent',ERPwaveview_erpsetops.help_apply_title ); + set(ERPwaveview_erpsetops.help_apply_title ,'Sizes',[40 70 20 70 20]); + set(ERPwaveview_erpsetops.vBox, 'Sizes', [290 25]); ERPwaveview_erpsetops.ERPLABFlag = 0; + gui_erp_waviewer.ERPwaviewer.SelectERPIdx = ERPwaveview_erpsetops.butttons_datasets.Value; + + estudioworkingmemory('MyViewer_ERPsetpanel',0); end + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%---------------------------------------------- Subfunctions --------------------------------------------%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %-----------------select the ERPset of interest-------------------------- - function selectdata(~,EventData) + function selectdata(Source,EventData) [messgStr,viewerpanelIndex] = f_check_erpviewerpanelchanges(); if ~isempty(messgStr) && viewerpanelIndex~=1 viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end - estudioworkingmemory('MyViewer_ERPsetpanel',1); - ERPwaveview_erpsetops.erpset_apply.BackgroundColor = [0.4940 0.1840 0.5560]; - ERPwaveview_erpsetops.erpset_apply.ForegroundColor = [1 1 1]; - ERPsets_waveviewer_box.TitleColor= [0.4940 0.1840 0.5560]; - end - - -%%---------------Setting for auto option----------------------------------- - function erpselect_refresh(~,~) - % Value = Source.Value; - [messgStr,viewerpanelIndex] = f_check_erpviewerpanelchanges(); - if ~isempty(messgStr) && viewerpanelIndex~=1 - viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; - end - ERPtooltype = erpgettoolversion('tooltype'); - - %%load the parameters from workspace - try - ERPwaviewer_apply = evalin('base','ALLERPwaviewer'); - catch - viewer_ERPDAT.Process_messg =3; - fprintf(2,'\n ERPsets > Refresh-f_ERPsets_waviewer_GUI() error: Cannot get parameters for whole panel.\n Please run My viewer again.\n\n'); - return; - end - - MessageViewer= char(strcat('ERPsets>" Refresh')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); - viewer_ERPDAT.Process_messg =1; - - - if strcmpi(ERPtooltype,'EStudio') || strcmpi(ERPtooltype,'ERPLAB') - if strcmpi(ERPtooltype,'ERPLAB') - try - Selected_erpset = ERPwaveview_erpsetops.butttons_datasets.Value; - try - CURRENTERPStudio = Selected_erpset(ERPwaviewer_apply.PageIndex); - catch - CURRENTERPStudio = Selected_erpset(1); - ERPwaviewer_apply.PageIndex=1; - end - catch - messgStr = strcat('Cannot get CURRENTERP from Workspace'); - erpworkingmemory('ERPViewer_proces_messg',messgStr); - viewer_ERPDAT.Process_messg =3; - return; - end - % estudioworkingmemory('PlotOrg_ERPLAB',1); + %%check if the sampling rate or time range is the same across + %%selected ERPsets-------2023 Dec. + ERPSetArray = Source.Value; + if numel(ERPSetArray)>1 + ERPSetArraydef= gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + for ii = 1:numel(ERPSetArray) + sratearray(ii) = viewer_ERPDAT.ALLERP(ERPSetArray(ii)).srate; + samplearray(ii) = viewer_ERPDAT.ALLERP(ERPSetArray(ii)).pnts; + erpstartarray(ii) = viewer_ERPDAT.ALLERP(ERPSetArray(ii)).xmin; + erpendarray(ii) = viewer_ERPDAT.ALLERP(ERPSetArray(ii)).xmax; end - try - ALLERPin = evalin('base','ALLERP'); - catch - messgStr = strcat('Cannot get ALLERP from Workspace'); - erpworkingmemory('ERPViewer_proces_messg',messgStr); - viewer_ERPDAT.Process_messg =3; + + sratearray = unique(sratearray); + if numel(sratearray)>1 + Source.Value=ERPSetArraydef; + msgboxText = ['You cannot select these ERPsets at the same time because they differ in timing parameters (sampling rate, prestimulus period, and/or epoch length).\n'... + 'You can equate the temporal parameters using the Resample ERPsets panel in ERPLAB Studio.']; + title = 'ERPLAB Studio: Advanced Wave Viewer>ERPsets'; + errorfound(sprintf(msgboxText), title); + viewer_ERPDAT.Count_currentERP = 2; return; end - if isempty(ALLERPin) - viewer_ERPDAT.Process_messg =3; - try - cprintf('red',['\n ERP Wave viewer will be closed because ALLERP is empty.\n\n']); - close(gui_erp_waviewer.Window); - catch - end - assignin('base','ALLERPwaviewer',[]); + samplearray = unique(samplearray); + if numel(samplearray)>1 + Source.Value=ERPSetArraydef; + msgboxText = ['You cannot select these ERPsets at the same time because they differ in timing parameters (sampling rate, prestimulus period, and/or epoch length).\n'... + 'You can equate the temporal parameters using the Resample ERPsets panel in ERPLAB Studio.']; + title = 'ERPLAB Studio: Advanced Wave Viewer>ERPsets'; + errorfound(sprintf(msgboxText), title); return; end - - if strcmpi(ERPtooltype,'EStudio') - Selected_erpset= estudioworkingmemory('selectederpstudio'); - CURRENTERPStudio = observe_ERPDAT.CURRENTERP; - if length(ALLERPin)==1 && strcmpi(ALLERPin(1).erpname,'No ERPset loaded') - try - cprintf('red',['\n ERP Wave viewer will be closed because ALLERP is empty.\n\n']); - close(gui_erp_waviewer.Window); - catch - end - assignin('base','ALLERPwaviewer',[]); - return; - end - end - - if isempty(Selected_erpset) || Selected_erpset> length(ALLERPin) - Selected_erpset = length(ALLERPin); - end - if isempty(CURRENTERPStudio) || CURRENTERPStudio> length(ALLERPin) - CURRENTERPStudio = Selected_erpset(1); - ERPwaviewer_apply.PageIndex=1; - end - - - ERPwaveview_erpsetops.ALLERP = ALLERPin; - ERPwaveview_erpsetops.ERP = ALLERPin(CURRENTERPStudio); - ERPwaveview_erpsetops.CURRENTERP = CURRENTERPStudio; - ERPwaveview_erpsetops.SelectERPIdx = Selected_erpset; - ERPwaveview_erpsetops.PageIndex = ERPwaviewer_apply.PageIndex; - ERPwaveview_erpsetops.ERPLABFlag = 1; - ERPdatasets = getERPDatasets(ALLERPin); % Get datasets from ALLERP - ERPdatasets = sortdata(ERPdatasets); - dsnames = {}; - if size(ERPdatasets,1)==1 - if strcmp(ERPdatasets{1},'No ERPset loaded') - dsnames = {''}; - else - dsnames{1} = strcat(num2str(cell2mat(ERPdatasets(1,2))),'.',32,ERPdatasets{1,1}); - end - else - for Numofsub = 1:size(ERPdatasets,1) - dsnames{Numofsub} = char(strcat(num2str(cell2mat(ERPdatasets(Numofsub,2))),'.',32,ERPdatasets{Numofsub,1})); - end - end - - ds_length = size(ERPdatasets,1); - if ds_length<=2 - ERPwaveview_erpsetops.butttons_datasets.Max = ds_length+1; - else - ERPwaveview_erpsetops.butttons_datasets.Max = ds_length; + erpstartarray = unique(erpstartarray); + if numel(erpstartarray)>1 + Source.Value=ERPSetArraydef; + msgboxText = ['You cannot select these ERPsets at the same time because they differ in timing parameters (sampling rate, prestimulus period, and/or epoch length).\n'... + 'You can equate the temporal parameters using the Resample ERPsets panel in ERPLAB Studio.']; + title = 'ERPLAB Studio: Advanced Wave Viewer>ERPsets'; + errorfound(sprintf(msgboxText), title); + return; end - ERPwaveview_erpsetops.butttons_datasets.String = dsnames; - ERPwaveview_erpsetops.butttons_datasets.Value = Selected_erpset; - else - return; - end - - ERPwaviewer_apply.ALLERP = ALLERPin; - ERPwaviewer_apply.ERP = ALLERPin(CURRENTERPStudio); - ERPwaviewer_apply.SelectERPIdx =Selected_erpset; - ERPwaviewer_apply.CURRENTERP = CURRENTERPStudio; - % ERPwaviewer_apply.PageIndex = 1; - estudioworkingmemory('MyViewer_ERPsetpanel',0); - ERPwaveview_erpsetops.erpset_apply.BackgroundColor = [1 1 1]; - ERPwaveview_erpsetops.erpset_apply.ForegroundColor = [0 0 0]; - ERPsets_waveviewer_box.TitleColor= [0.5 0.5 0.9]; - assignin('base','ALLERPwaviewer',ERPwaviewer_apply); - erpworkingmemory('ERPLAB_ERPWaviewer',0); - ERPset_apply(); - end - -% called datasets = sortdata(datasets), sorts datasets in order based on -% parents - function varargout = sortdata(data) - cinds = []; - ndata = {}; % Sorted data - it = 1; % Iterator for row - for i = data' % Iterate thru all datasets - if cell2mat(i(3)) == 0 % Find base datasets (child of 0 means it's not reliant on another dataset) - [~, ic] = size(cinds); - cinds(1, ic+1) = cell2mat(i(2)); % Append dataset number to list of current indexes - ndata(it,:) = i'; % Put it in - it = it + 1; + erpendarray = unique(erpendarray); + if numel(erpendarray)>1 + Source.Value=ERPSetArraydef; + msgboxText = ['You cannot select these ERPsets at the same time because they differ in timing parameters (sampling rate, prestimulus period, and/or epoch length).\n'... + 'You can equate the temporal parameters using the Resample ERPsets panel in ERPLAB Studio.']; + title = 'ERPLAB Studio: Advanced Wave Viewer>ERPsets'; + errorfound(sprintf(msgboxText), title); + return; end end - cond = true; - while cond - ninds = []; % Reset new indexes - for i = data' % Iterate thru all data - for j = cinds % Iterate thru all parents - if cell2mat(i(3)) == j % Check to see if every datapoint is a child of the current layer - [~, nic] = size(ninds); - ninds(1, nic+1) = cell2mat(i(2)); % Append dataset number to the next round of parents - [ndr, ~] = size(ndata); - for v = 1:ndr - if cell2mat(ndata(v, 2)) == j - ndata(v+2:end+1,:) = ndata(v+1:end,:); - ndata(v+1,:) = i'; - end - end - end - end - end - [~, nic] = size(ninds); - if nic == 0 % If we've gone thru all of them, there should be no new indexes - cond = false; - end - clear cinds - cinds = ninds; % Start again with ninds - end - varargout{1} = ndata; - end - - -%----------------------Get the information of the updated ERPsets---------- - function ERPdatasets = getERPDatasets(ALLERP) - ERPdatasets = {}; - if isempty(ALLERP) - beep; - disp('f_ERPsets_waveviewer_GUI>getERPDatasets error: ALLERP is empty.'); - return; - end - for Numoferpset = 1:length(ALLERP) - ERPdatasets{Numoferpset,1} = ALLERP(Numoferpset).erpname; - ERPdatasets{Numoferpset,2} = Numoferpset; - ERPdatasets{Numoferpset,3} = 0; - ERPdatasets{Numoferpset,4} = ALLERP(Numoferpset).filename; - ERPdatasets{Numoferpset,5} = ALLERP(Numoferpset).filepath; - end + estudioworkingmemory('MyViewer_ERPsetpanel',1); + ERPwaveview_erpsetops.erpset_apply.BackgroundColor = [0.4940 0.1840 0.5560]; + ERPwaveview_erpsetops.erpset_apply.ForegroundColor = [1 1 1]; + ERPsets_waveviewer_box.TitleColor= [0.4940 0.1840 0.5560]; + ERPwaveview_erpsetops.erpset_cancel.BackgroundColor = [0.4940 0.1840 0.5560]; + ERPwaveview_erpsetops.erpset_cancel.ForegroundColor = [1 1 1]; end %%-------------------------------Help-------------------------------------- - function erpset_help(~,~) + function erpset_cancel(~,~) [messgStr,viewerpanelIndex] = f_check_erpviewerpanelchanges(); if ~isempty(messgStr) && viewerpanelIndex~=1 viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end - changeFlag = estudioworkingmemory('MyViewer_ERPsetpanel'); if changeFlag~=1 return; end MessageViewer= char(strcat('ERPsets > Cancel')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =1; - try - ERPwaviewer_apply = evalin('base','ALLERPwaviewer'); - catch - viewer_ERPDAT.Process_messg =3; - fprintf(2,'\n ERPsets > Cancel-f_ERPsets_waviewer_GUI() error: Cannot get parameters for whole panel.\n Please run My viewer again.\n\n'); - return; - end - ERPwaveview_erpsetops.butttons_datasets.Enable = 'on'; - ALLERPin = ERPwaviewer_apply.ALLERP; + ALLERPin = gui_erp_waviewer.ERPwaviewer.ALLERP; ERPdatasets = getERPDatasets(ALLERPin); % Get datasets from ALLERP - ERPdatasets = sortdata(ERPdatasets); dsnames = {}; - if size(ERPdatasets,1)==1 - if strcmp(ERPdatasets{1},'No ERPset loaded') - dsnames = {''}; - else - dsnames{1} = strcat(num2str(cell2mat(ERPdatasets(1,2))),'.',32,ERPdatasets{1,1}); - end - else - for Numofsub = 1:size(ERPdatasets,1) - dsnames{Numofsub} = char(strcat(num2str(cell2mat(ERPdatasets(Numofsub,2))),'.',32,ERPdatasets{Numofsub,1})); - end + for Numofsub = 1:size(ERPdatasets,1) + dsnames{Numofsub} = char(strcat(num2str(cell2mat(ERPdatasets(Numofsub,2))),'.',32,ERPdatasets{Numofsub,1})); end ds_length = size(ERPdatasets,1); - if ds_length<=2 - ERPwaveview_erpsetops.butttons_datasets.Max = ds_length+1; - else - ERPwaveview_erpsetops.butttons_datasets.Max = ds_length; - end + ERPwaveview_erpsetops.butttons_datasets.Max = ds_length+1; ERPwaveview_erpsetops.butttons_datasets.String = dsnames; - Selected_erpset = ERPwaviewer_apply.SelectERPIdx; - if min(Selected_erpset(:))<=0 || max(Selected_erpset(:)) > length(ALLERPin) - Selected_erpset = length(ALLERPin); - ERPwaviewer_apply.SelectERPIdx = Selected_erpset; - assignin('base','ALLERPwaviewer',ERPwaviewer_apply); - f_redrawERP_viewer_test();%%Plot the waves - end - ERPwaveview_erpsetops.butttons_datasets.Value = Selected_erpset; - + ERPArray = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + if isempty(ERPArray)|| min(ERPArray(:))<=0 || any(ERPArray(:) > length(ALLERPin)) + ERPArray = length(ALLERPin); + gui_erp_waviewer.ERPwaviewer.SelectERPIdx = ERPArray; + gui_erp_waviewer.ERPwaviewer.CURRENTERP = ERPArray; + gui_erp_waviewer.ERPwaviewer.ERP = gui_erp_waviewer.ERPwaviewer.ALLERP(ERPArray); + gui_erp_waviewer.ERPwaviewer.PageIndex=1; + ERPwaveview_erpsetops.butttons_datasets.Value = ERPArray; + viewer_ERPDAT.Count_currentERP = 2; + end + ERPwaveview_erpsetops.butttons_datasets.Value = ERPArray; estudioworkingmemory('MyViewer_ERPsetpanel',0); ERPwaveview_erpsetops.erpset_apply.BackgroundColor = [1 1 1]; ERPwaveview_erpsetops.erpset_apply.ForegroundColor = [0 0 0]; ERPsets_waveviewer_box.TitleColor= [0.5 0.5 0.9]; + ERPwaveview_erpsetops.erpset_cancel.BackgroundColor = [1 1 1]; + ERPwaveview_erpsetops.erpset_cancel.ForegroundColor = [0 0 0]; MessageViewer= char(strcat('ERPsets > Cancel')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =2; end @@ -418,61 +240,31 @@ function ERPset_apply(~,~) end MessageViewer= char(strcat('ERPsets > Apply')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =1; - try - ERPwaviewer_apply = evalin('base','ALLERPwaviewer'); - catch - viewer_ERPDAT.Process_messg =3; - fprintf(2,'\n ERPsets > Apply-f_ERPsets_waviewer_GUI() error: Cannot get parameters for whole panel.\n Please run My viewer again.\n\n'); - return; - end - if ERPwaveview_erpsetops.ERPLABFlag==1 - ERPwaviewer_apply.ALLERP = ERPwaveview_erpsetops.ALLERP; - ERPwaviewer_apply.ERP = ERPwaveview_erpsetops.ERP; - ERPwaviewer_apply.CURRENTERP= ERPwaveview_erpsetops.CURRENTERP; - ERPwaviewer_apply.SelectERPIdx= ERPwaveview_erpsetops.SelectERPIdx; - ERPwaviewer_apply.PageIndex= ERPwaveview_erpsetops.PageIndex; - ERPwaveview_erpsetops.ERPLABFlag=0; - end + ERPsetArray = ERPwaveview_erpsetops.butttons_datasets.Value; CurrentERP = ERPsetArray(1); - ALLERPIN = ERPwaviewer_apply.ALLERP; + ALLERPIN = gui_erp_waviewer.ERPwaviewer.ALLERP; for Numofselectederp = 1:numel(ERPsetArray) SrateNum_mp(Numofselectederp,1) = ALLERPIN(ERPsetArray(Numofselectederp)).srate; end - ERPwaviewer_apply.CURRENTERP = CurrentERP; - ERPwaviewer_apply.ERP = ERPwaviewer_apply.ALLERP(CurrentERP); - ERPwaviewer_apply.SelectERPIdx = ERPsetArray; - ERPtooltype = erpgettoolversion('tooltype'); - if strcmpi(ERPtooltype,'EStudio') - Geterpbinchan = estudioworkingmemory('geterpbinchan'); - if ~isempty(Geterpbinchan) - CurrentERPIndex = Geterpbinchan.Select_index; - chan_bin = Geterpbinchan.bins_chans(CurrentERPIndex); - if chan_bin ==1 - ERPwaviewer_apply.plot_org.Grid =2; - ERPwaviewer_apply.plot_org.Overlay=1; - ERPwaviewer_apply.plot_org.Pages=3; - elseif chan_bin==0 - ERPwaviewer_apply.plot_org.Grid =1; - ERPwaviewer_apply.plot_org.Overlay=2; - ERPwaviewer_apply.plot_org.Pages=3; - end - end - %%% we may need to get the grid layout automatically - end + gui_erp_waviewer.ERPwaviewer.CURRENTERP = CurrentERP; + gui_erp_waviewer.ERPwaviewer.ERP = gui_erp_waviewer.ERPwaviewer.ALLERP(CurrentERP); + gui_erp_waviewer.ERPwaviewer.SelectERPIdx = ERPwaveview_erpsetops.butttons_datasets.Value; estudioworkingmemory('MyViewer_ERPsetpanel',0); ERPwaveview_erpsetops.erpset_apply.BackgroundColor = [1 1 1]; ERPwaveview_erpsetops.erpset_apply.ForegroundColor = [0 0 0]; + ERPwaveview_erpsetops.erpset_cancel.BackgroundColor = [1 1 1]; + ERPwaveview_erpsetops.erpset_cancel.ForegroundColor = [0 0 0]; ERPsets_waveviewer_box.TitleColor= [0.5 0.5 0.9]; - assignin('base','ALLERPwaviewer',ERPwaviewer_apply); - viewer_ERPDAT.Count_currentERP = viewer_ERPDAT.Count_currentERP+1; + + viewer_ERPDAT.Count_currentERP = 2; f_redrawERP_viewer_test();%%Plot the waves MessageViewer= char(strcat('ERPsets > Apply')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =2; end @@ -483,46 +275,33 @@ function loadproper_change(~,~) return; end try - ERPwaviewer_up = evalin('base','ALLERPwaviewer'); - SelectedIndex = ERPwaviewer_up.SelectERPIdx; - ALLERPup = ERPwaviewer_up.ALLERP; + SelectedIndex = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + ALLERPup = gui_erp_waviewer.ERPwaviewer.ALLERP; if isempty(ALLERPup) - beep; disp('f_ERPsets_waviewer_GUI()>loadproper_change() error: ALLERP is empty.'); return; end if max(SelectedIndex(:))> length(ALLERPup) SelectedIndex =length(ALLERPup); - ERPwaviewer_up.SelectERPIdx = SelectedIndex; + gui_erp_waviewer.ERPwaviewer.SelectERPIdx = SelectedIndex; end catch - beep; disp('f_ERPsets_waviewer_GUI()>loadproper_change() error: Restart ERPwave Viewer'); return; end Enable_label = 'on'; ERPdatasets = getERPDatasets(ALLERPup); % Get datasets from ALLERP - ERPdatasets = sortdata(ERPdatasets); dsnames = {}; - if size(ERPdatasets,1)==1 - if strcmp(ERPdatasets{1},'No ERPset loaded') - dsnames = {''}; - else - dsnames{1} = strcat(num2str(cell2mat(ERPdatasets(1,2))),'.',32,ERPdatasets{1,1}); - end - else - for Numofsub = 1:size(ERPdatasets,1) - dsnames{Numofsub} = char(strcat(num2str(cell2mat(ERPdatasets(Numofsub,2))),'.',32,ERPdatasets{Numofsub,1})); - end + for Numofsub = 1:size(ERPdatasets,1) + dsnames{Numofsub} = char(strcat(num2str(cell2mat(ERPdatasets(Numofsub,2))),'.',32,ERPdatasets{Numofsub,1})); end ERPwaveview_erpsetops.butttons_datasets.Enable = Enable_label; ds_length = length(ERPdatasets); - ERPwaveview_erpsetops.butttons_datasets.Max = ds_length; + ERPwaveview_erpsetops.butttons_datasets.Max = ds_length+1; ERPwaveview_erpsetops.butttons_datasets.String = dsnames; ERPwaveview_erpsetops.butttons_datasets.Value = SelectedIndex; - assignin('base','ALLERPwaviewer',ERPwaviewer_up); viewer_ERPDAT.loadproper_count=2; end @@ -544,6 +323,22 @@ function count_twopanels_change(~,~) ERPset_apply(); end +%----------------------Get the information of the updated ERPsets---------- + function ERPdatasets = getERPDatasets(ALLERP) + ERPdatasets = {}; + if isempty(ALLERP) + disp('f_ERPsets_waveviewer_GUI>getERPDatasets error: ALLERP is empty.'); + return; + end + for Numoferpset = 1:length(ALLERP) + ERPdatasets{Numoferpset,1} = ALLERP(Numoferpset).erpname; + ERPdatasets{Numoferpset,2} = Numoferpset; + ERPdatasets{Numoferpset,3} = 0; + ERPdatasets{Numoferpset,4} = ALLERP(Numoferpset).filename; + ERPdatasets{Numoferpset,5} = ALLERP(Numoferpset).filepath; + end + end + %%Reset this panel with the default parameters function Reset_Waviewer_panel_change(~,~) @@ -552,14 +347,17 @@ function Reset_Waviewer_panel_change(~,~) if strcmpi(ERPtooltype,'EStudio') || strcmpi(ERPtooltype,'ERPLAB') if strcmpi(ERPtooltype,'ERPLAB') try - Selected_erpset = evalin('base','CURRENTERP'); - CURRENTERPStudio = Selected_erpset; + ERPArray = evalin('base','CURRENTERP'); + CURRENTERPStudio = ERPArray; catch viewer_ERPDAT.Process_messg =3; fprintf(2,'\n ERPsets error: Cannot get CURRENTERP from Workspace.\n'); return; end estudioworkingmemory('PlotOrg_ERPLAB',1); + else + ERPArray= gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + CURRENTERPStudio = gui_erp_waviewer.ERPwaviewer.CURRENTERP; end try ALLERPin = evalin('base','ALLERP'); @@ -575,113 +373,75 @@ function Reset_Waviewer_panel_change(~,~) close(gui_erp_waviewer.Window); catch end - assignin('base','ALLERPwaviewer',[]); return; end - if strcmpi(ERPtooltype,'EStudio') - Selected_erpset= estudioworkingmemory('selectederpstudio'); - CURRENTERPStudio = observe_ERPDAT.CURRENTERP; - if length(ALLERPin)==1 && strcmpi(ALLERPin(1).erpname,'No ERPset loaded') - try - cprintf('red',['\n ERP Wave viewer will be closed because ALLERP is empty.\n\n']); - close(gui_erp_waviewer.Window); - catch - end - assignin('base','ALLERPwaviewer',[]); - return; - end - end - - if isempty(Selected_erpset) || Selected_erpset> length(ALLERPin) - Selected_erpset = length(ALLERPin); + if isempty(ERPArray) || any(ERPArray(:)> length(ALLERPin)) + ERPArray = length(ALLERPin); end - if isempty(CURRENTERPStudio) || CURRENTERPStudio> length(ALLERPin) + if isempty(CURRENTERPStudio) || any(CURRENTERPStudio> length(ALLERPin)) CURRENTERPStudio = length(ALLERPin); end - [x_index,y_index] = find(Selected_erpset==CURRENTERPStudio); + [x_index,y_index] = find(ERPArray==CURRENTERPStudio); if isempty(y_index) - y_index = numel(Selected_erpset); + y_index = numel(ERPArray); end - ERPwaveview_erpsetops.ALLERP = ALLERPin; ERPwaveview_erpsetops.ERP = ALLERPin(CURRENTERPStudio); ERPwaveview_erpsetops.CURRENTERP = CURRENTERPStudio; - ERPwaveview_erpsetops.SelectERPIdx = Selected_erpset; + ERPwaveview_erpsetops.SelectERPIdx = ERPArray; ERPwaveview_erpsetops.PageIndex = y_index; ERPwaveview_erpsetops.ERPLABFlag = 1; ERPdatasets = getERPDatasets(ALLERPin); % Get datasets from ALLERP - ERPdatasets = sortdata(ERPdatasets); dsnames = {}; - if size(ERPdatasets,1)==1 - if strcmp(ERPdatasets{1},'No ERPset loaded') - dsnames = {''}; - else - dsnames{1} = strcat(num2str(cell2mat(ERPdatasets(1,2))),'.',32,ERPdatasets{1,1}); - end - else - for Numofsub = 1:size(ERPdatasets,1) - dsnames{Numofsub} = char(strcat(num2str(cell2mat(ERPdatasets(Numofsub,2))),'.',32,ERPdatasets{Numofsub,1})); - end + for Numofsub = 1:size(ERPdatasets,1) + dsnames{Numofsub} = char(strcat(num2str(cell2mat(ERPdatasets(Numofsub,2))),'.',32,ERPdatasets{Numofsub,1})); end - ds_length = size(ERPdatasets,1); - if ds_length<=2 - ERPwaveview_erpsetops.butttons_datasets.Max = ds_length+1; - else - ERPwaveview_erpsetops.butttons_datasets.Max = ds_length; - end + + ERPwaveview_erpsetops.butttons_datasets.Max = ds_length+1; ERPwaveview_erpsetops.butttons_datasets.String = dsnames; - ERPwaveview_erpsetops.butttons_datasets.Value = Selected_erpset; + ERPwaveview_erpsetops.butttons_datasets.Value = ERPArray; else ERPwaveview_erpsetops.auto.Value = 0; ERPwaveview_erpsetops.custom.Value =1; ERPwaveview_erpsetops.butttons_datasets.Enable = 'on'; ERPwaveview_erpsetops.auto.Enable = 'off'; end - try - ERPwaviewer_apply = evalin('base','ALLERPwaviewer'); - catch - ERPwaviewer_apply = []; - end - ERPwaviewer_apply.ALLERP = ERPwaveview_erpsetops.ALLERP; - ERPwaviewer_apply.ERP = ERPwaveview_erpsetops.ERP; - ERPwaviewer_apply.CURRENTERP= ERPwaveview_erpsetops.CURRENTERP; - ERPwaviewer_apply.SelectERPIdx= ERPwaveview_erpsetops.SelectERPIdx; - ERPwaviewer_apply.PageIndex= ERPwaveview_erpsetops.PageIndex; - ERPwaviewer_apply.erp_binchan_op = ERPwaveview_erpsetops.auto.Value; + + gui_erp_waviewer.ERPwaviewer.ALLERP = ERPwaveview_erpsetops.ALLERP; + gui_erp_waviewer.ERPwaviewer.ERP = ERPwaveview_erpsetops.ERP; + gui_erp_waviewer.ERPwaviewer.CURRENTERP= ERPwaveview_erpsetops.CURRENTERP; + gui_erp_waviewer.ERPwaviewer.SelectERPIdx= ERPwaveview_erpsetops.SelectERPIdx; + gui_erp_waviewer.ERPwaviewer.PageIndex= ERPwaveview_erpsetops.PageIndex; ERPwaveview_erpsetops.erpset_apply.BackgroundColor = [1 1 1]; ERPwaveview_erpsetops.erpset_apply.ForegroundColor = [0 0 0]; ERPsets_waveviewer_box.TitleColor= [0.5 0.5 0.9]; - - assignin('base','ALLERPwaviewer',ERPwaviewer_apply); viewer_ERPDAT.Reset_Waviewer_panel=2; end end -%%change the ERPset indeces when they are changed in Plot organization panel - function ERPset_Chan_bin_label_change(~,~) - if viewer_ERPDAT.ERPset_Chan_bin_label~=1 %% 1 means ERPset indeces were changed - if viewer_ERPDAT.ERPset_Chan_bin_label==2%%Update Viewer based on the change in ERPLAB - erpselect_refresh(); - end - return; - end - try - ERPwaviewer_apply = evalin('base','ALLERPwaviewer'); - catch - viewer_ERPDAT.Process_messg =3; - fprintf(2,'\n ERPsets > f_ERPsets_waviewer_GUI() error: Cannot get parameters for whole panel.\n Please run My viewer again.\n\n'); +%%---------------------current ERPset change------------------------------- + function v_currentERP_change(~,~) + if viewer_ERPDAT.Count_currentERP~=1 return; end - ERPsetArray = ERPwaviewer_apply.SelectERPIdx; - if max(ERPsetArray(:)) <= length(ERPwaveview_erpsetops.butttons_datasets.String) + ERPsetArray = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + if isempty(ERPsetArray) || any(ERPsetArray(:) > length(ERPwaveview_erpsetops.butttons_datasets.String)) + ERPsetArray = length(ERPwaveview_erpsetops.butttons_datasets.String); + ERPwaveview_erpsetops.butttons_datasets.Value = ERPsetArray; + gui_erp_waviewer.ERPwaviewer.CURRENTERP = ERPsetArray; + gui_erp_waviewer.ERPwaviewer.ERP = gui_erp_waviewer.ERPwaviewer.ALLERP(ERPsetArray); + gui_erp_waviewer.ERPwaviewer.PageIndex=1; ERPwaveview_erpsetops.butttons_datasets.Value = ERPsetArray; end + gui_erp_waviewer.ERPwaviewer.SelectERPIdx =ERPsetArray; + viewer_ERPDAT.Count_currentERP=2; + f_redrawERP_viewer_test(); end %%execute this panel when press "return" or "Enter" diff --git a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_MarkLabels_gridlocations_ERP_Waveiwer.m b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_MarkLabels_gridlocations_ERP_Waveiwer.m old mode 100644 new mode 100755 index 6b636054..aacfdfe3 --- a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_MarkLabels_gridlocations_ERP_Waveiwer.m +++ b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_MarkLabels_gridlocations_ERP_Waveiwer.m @@ -1,23 +1,9 @@ function [LabelStrout] = f_MarkLabels_gridlocations_ERP_Waveiwer(Gridata,usedIndex,AllabelArray) -% usedIndex = zeros(length(AllabelArray),1); -% for jj = 1:length(AllabelArray) -% for ii = 1:length(LabelStr) -% if strcmp(AllabelArray{jj},LabelStr{ii}) -% usedIndex(jj) = 1; -% end -% end -% end LabelsFlag = [0 0 0]; for ii = 1:length(AllabelArray) code1 = 0; - % for jj = 1:size(Gridata,1) - % for kk = 1:size(Gridata,2) - % if strcmp(AllabelArray{ii},Gridata{jj,kk}) - % code1 = code1+1; - % end - % end - % end + [C,IA]=ismember(Gridata,AllabelArray{ii}); C = reshape(C,size(C,1)*size(C,2),1); Xpos =find(C==1); diff --git a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_check_erpviewerpanelchanges.m b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_check_erpviewerpanelchanges.m old mode 100644 new mode 100755 index d0b826a3..b9d3ae84 --- a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_check_erpviewerpanelchanges.m +++ b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_check_erpviewerpanelchanges.m @@ -12,40 +12,40 @@ MyViewer_chanbin = estudioworkingmemory('MyViewer_chanbin'); -if ~isempty(MyViewer_ERPset) && MyViewer_chanbin==1 +if ~isempty(MyViewer_chanbin) && MyViewer_chanbin==1 messgStr = char( 'Changes on "Channels and Bins" have not been applied'); viewerpanelIndex =2; end MyViewer_xyaxis = estudioworkingmemory('MyViewer_xyaxis'); -if ~isempty(MyViewer_ERPset) && MyViewer_xyaxis==1 +if ~isempty(MyViewer_xyaxis) && MyViewer_xyaxis==1 messgStr = char( 'Changes on "Time and Amplitude Scales" have not been applied'); viewerpanelIndex =3; end MyViewer_plotorg = estudioworkingmemory('MyViewer_plotorg'); -if ~isempty(MyViewer_ERPset) && MyViewer_plotorg==1 +if ~isempty(MyViewer_plotorg) && MyViewer_plotorg==1 messgStr = char( 'Changes on "Plot Organization" have not been applied'); viewerpanelIndex =4; end MyViewer_labels = estudioworkingmemory('MyViewer_labels'); -if ~isempty(MyViewer_ERPset) && MyViewer_labels==1 +if ~isempty(MyViewer_labels) && MyViewer_labels==1 messgStr = char( 'Changes on "Chan/Bin/ERPset Labels" have not been applied'); viewerpanelIndex =5; end MyViewer_linelegend = estudioworkingmemory('MyViewer_linelegend'); -if ~isempty(MyViewer_ERPset) && MyViewer_linelegend==1 +if ~isempty(MyViewer_linelegend) && MyViewer_linelegend==1 messgStr = char( 'Changes on "Lines & legends" have not been applied'); viewerpanelIndex =6; end MyViewer_other = estudioworkingmemory('MyViewer_other'); -if ~isempty(MyViewer_ERPset) && MyViewer_other==1 +if ~isempty(MyViewer_other) && MyViewer_other==1 messgStr = char( 'Changes on "Other" have not been applied'); viewerpanelIndex =7; end diff --git a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_checktable_gridlocations_waviewer.m b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_checktable_gridlocations_waviewer.m old mode 100644 new mode 100755 diff --git a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_decimal.m b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_decimal.m old mode 100644 new mode 100755 diff --git a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_display_binstr_chanstr.m b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_display_binstr_chanstr.m new file mode 100755 index 00000000..175b847f --- /dev/null +++ b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_display_binstr_chanstr.m @@ -0,0 +1,121 @@ +% PURPOSE: f_display_binstr_chanstr.m +% display the names of channels and bins for the selected ERPsets + +% Inputs: +% +%ALLERP -ALLERPset +%ERPArray -index of the selected ERPset/bin/channel(e.g., [1 4]) +%diff_mark -has two elements, 0/1; 0 represents channels/bins are +% the same across the selected ERPsets. 1 is differ from +% the selected ERPsets. + + +% *** This function is part of EStudio Toolbox *** +% Author: Guanghui Zhang & Steven Luck +% Center for Mind and Brain +% University of California, Davis, +% Davis, CA +% 2023 July + + + + +function f_display_binstr_chanstr(ALLERP, ERPArray,diff_mark) +if nargin < 2 + help f_display_binstr_chanstr + return; +end +if numel(ERPArray)==1 + help f_display_binstr_chanstr + return; +end +if min(ERPArray(:))<=0 + beep; + disp('f_display_binstr_chanstr() error: Selected ERPsets should be positive values.') + return; +end +if min(ERPArray(:))> length(ALLERP) || max(ERPArray(:))> length(ALLERP) + beep; + disp('f_display_binstr_chanstr() error: Selected ERPsets exceed the length of ALLERP.') + return; +end +if isempty(diff_mark) + diff_mark = [0 0]; +end + +%%------------------------display names for channel------------------------ +if diff_mark(1)==1 + chanNameLength = 0; + + for Numoferpset = 1:length(ERPArray) + chanNum(Numoferpset) = ALLERP(ERPArray(Numoferpset)).nchan; + for ii = 1:ALLERP(ERPArray(Numoferpset)).nchan + if length(char(ALLERP(ERPArray(Numoferpset)).chanlocs(ii).labels))>chanNameLength + chanNameLength = length(char(ALLERP(ERPArray(Numoferpset)).chanlocs(ii).labels)); + end + end + end + + fprintf( ['\n',repmat('~',1,80) '\n']); + fprintf([repmat('~',1,17),'Channel names vary across the selected ERPsets',repmat('~',1,17) '\n']) + fprintf( [repmat('~',1,80) '\n']); + hdrdists = '\n'; + for jj = 1:length(ERPArray) + hdr{jj} = ['ERPset:',num2str(ERPArray(jj))]; + hdrdists =strcat(hdrdists,'%',num2str(chanNameLength),'s'); + end + fprintf( [hdrdists,'\n'], hdr{:}); + + for Numoflist = 1:max(chanNum(:)) + hdrdists = '\n'; + for jj = 1:length(ERPArray) + try + hdr{jj} = char(ALLERP(ERPArray(jj)).chanlocs(Numoflist).labels); + catch + hdr{jj} = ''; + end + hdrdists =strcat(hdrdists,'%',num2str(chanNameLength),'s'); + end + fprintf( [hdrdists,'\n'], hdr{:}); + end + fprintf( ['\n',repmat('~',1,80) '\n\n']); +end + + +%%-------------------display names for bin--------------------------------- +if diff_mark(2)==1 + binNameLength = 0; + for Numoferpset = 1:length(ERPArray) + binNum(Numoferpset) = ALLERP(ERPArray(Numoferpset)).nbin; + for ii = 1:ALLERP(ERPArray(Numoferpset)).nbin + if length(char(ALLERP(ERPArray(Numoferpset)).bindescr{ii}))>binNameLength + binNameLength = length(char(ALLERP(ERPArray(Numoferpset)).bindescr{ii})); + end + end + end + + fprintf( ['\n',repmat('~',1,80) '\n']); + fprintf([repmat('~',1,17),'Bin names vary across the selected ERPsets',repmat('~',1,17) '\n']) + fprintf( [repmat('~',1,80) '\n']); + hdrdists = '\n'; + for jj = 1:length(ERPArray) + hdr{jj} = ['ERPset:',num2str(ERPArray(jj))]; + hdrdists =strcat(hdrdists,'%',num2str(binNameLength),'s'); + end + fprintf( [hdrdists,'\n'], hdr{:}); + + for Numoflist = 1:max(binNum(:)) + hdrdists = '\n'; + for jj = 1:length(ERPArray) + try + hdr{jj} = char(ALLERP(ERPArray(jj)).bindescr{Numoflist}); + catch + hdr{jj} = ''; + end + hdrdists =strcat(hdrdists,'%',num2str(binNameLength),'s'); + end + fprintf( [hdrdists,'\n'], hdr{:}); + end + fprintf( ['\n',repmat('~',1,80) '\n\n']); +end +end \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_erpwave_viewer_update_parameter.m b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_erpwave_viewer_update_parameter.m old mode 100644 new mode 100755 diff --git a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_geterpdata.m b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_geterpdata.m index 3629e6d6..d5a1fa8e 100755 --- a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_geterpdata.m +++ b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_geterpdata.m @@ -70,7 +70,7 @@ end if nargin<4|| (ERPselectIndex>length(ERPsetArray)) - ERPselectIndex =length(ERPsetArray); + ERPselectIndex =length(ERPsetArray); end % @@ -132,9 +132,9 @@ end if numel(unique(SrateNum_mp))>1 %%Check if the sampling rate is the same across the selected ERPsets, otherwise, the "ERPsets" will be fixed as "Pages". -% msgboxText = ['EStudio says: Sampling rate varies across the selected ERPsets, we therefore set "ERPsets" to be "Pages".']; -% title = 'EStudio: f_geterpdata().'; -% errorfound(msgboxText, title); + % msgboxText = ['EStudio says: Sampling rate varies across the selected ERPsets, we therefore set "ERPsets" to be "Pages".']; + % title = 'EStudio: f_geterpdata().'; + % errorfound(msgboxText, title); if orgpar(1)==1 && (orgpar(2) ==2 || orgpar(2) ==3) orgpar = [1 2 3]; elseif orgpar(1)==2 && (orgpar(2) ==1 || orgpar(2) ==3) @@ -151,7 +151,11 @@ %%Get the data acorss ERPsets for Numofselectederp = 1:numel(ERPsetArray) ERPdata(:,:,:,Numofselectederp) = ALLERP(ERPsetArray(Numofselectederp)).bindata; - errordata = ALLERP(ERPsetArray(Numofselectederp)).binerror; + if isequal(ALLERP(ERPsetArray(Numofselectederp)).bindata,ALLERP(ERPsetArray(Numofselectederp)).binerror) + errordata = ALLERP(ERPsetArray(Numofselectederp)).binerror; + else + errordata=[]; + end if ~isempty(errordata) ERPerrordata(:,:,:,Numofselectederp) =errordata; end @@ -180,7 +184,13 @@ EpochEnd = ERP_sg.times(end); [xxx, latsamp, latdiffms] = closest(Times, [EpochStart,EpochEnd]); ERPdata(1:ERP_sg.nchan,latsamp(1):latsamp(2),1:ERP_sg.nbin,Numofselectederp) = ERP_sg.bindata; - errordata = ERP_sg.binerror; + + if isequal(ERP_sg.bindataa,ERP_sg.binerror) + errordata = ERP_sg.binerror; + else + errordata=[]; + end + if ~isempty(errordata) ERPerrordata(1:ERP_sg.nchan,latsamp(1):latsamp(2),1:ERP_sg.nbin,Numofselectederp) =errordata; end @@ -192,12 +202,16 @@ ERPdata = nan(max(chanNum_mp),SampNum_mp(ERPselectIndex),max(BinNum_mp),numel(ERPsetArray)); ERPerrordata = nan(max(chanNum_mp),SampNum_mp(ERPselectIndex),max(BinNum_mp),numel(ERPsetArray)); - ERP_sg = ALLERP(ERPsetArray(ERPselectIndex));%%The information for individual subject - ERPdata(1:chanNum_mp(ERPselectIndex),:,1:BinNum_mp(ERPselectIndex),ERPselectIndex) = ERP_sg.bindata; + ERP_sg = ALLERP(ERPsetArray(ERPselectIndex));%%The information for individual subject + ERPdata(1:chanNum_mp(ERPselectIndex),:,1:BinNum_mp(ERPselectIndex),ERPselectIndex) = ERP_sg.bindata; + if isequal(ERP_sg.bindataa,ERP_sg.binerror) errordata = ERP_sg.binerror; - if ~isempty(errordata)%%Get the error data - ERPerrordata(1:chanNum_mp(ERPselectIndex),:,1:BinNum_mp(ERPselectIndex),ERPselectIndex) =errordata; - end + else + errordata=[]; + end + if ~isempty(errordata)%%Get the error data + ERPerrordata(1:chanNum_mp(ERPselectIndex),:,1:BinNum_mp(ERPselectIndex),ERPselectIndex) =errordata; + end end end diff --git a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_geterpschanbin.m b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_geterpschanbin.m index cf07318d..d6126b18 100755 --- a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_geterpschanbin.m +++ b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_geterpschanbin.m @@ -25,10 +25,12 @@ -function [chanStr,binStr,diff_mark] = f_geterpschanbin(ALLERP,SelectedERPIndex) +function [chanStr,binStr,diff_mark,chanStremp,binStremp] = f_geterpschanbin(ALLERP,SelectedERPIndex) diff_mark = [0 0]; chanStr = []; binStr = []; +chanStremp = []; +binStremp = []; if nargin==0 beep; help f_geterpschanbin; @@ -92,6 +94,8 @@ chanStr(Numofchan) = {['Chan',num2str(Numofchan)]}; end end + chanStremp = chanStr; + binStremp = binStr; return; end @@ -122,7 +126,7 @@ for Numofchan = 1:length(Chanlist) chanStr(Numofchan) = {char(Chanlist(Numofchan).labels)}; end - + chanStremp = chanStr; elseif numel(unique(chanNum_mp))>1%%varies across the selected ERPsets [x_chan,y_chan] = find(chanNum_mp==max(chanNum_mp(:)));%% find the position of max. value @@ -162,10 +166,16 @@ clear ERP; end diff_mark(1) = 1; - chanStr = cell(length(chanStr_max),1); + chanStremp = cell(length(chanStr_max),1); for Numofchan = 1:length(chanStr_max) chanStr(Numofchan) = {char(chanStr_max(Numofchan))}; + chansig = char(chanStr_max(Numofchan)); + if strcmp(chansig(1:2),'**') + chanStremp(Numofchan) = {''}; + else + chanStremp(Numofchan) = {char(chanStr_max(Numofchan))}; + end end end @@ -184,7 +194,7 @@ binStr(Numofbin) = {['Bin',num2str(Numofbin)]}; end end - + binStremp = binStr; elseif numel(unique(BinNum_mp))>1%%varies across the selected ERPsets [x_bin,y_bin] = find(BinNum_mp==max(BinNum_mp));%% find the position of max. value @@ -227,8 +237,15 @@ end diff_mark(2) = 1; binStr = cell(length(binStr_max),1); + binStremp = cell(length(binStr_max),1); for Numofbin = 1:length(binStr_max) binStr(Numofbin) = {char(binStr_max(Numofbin))}; + binsg = char(binStr_max(Numofbin)); + if strcmp(binsg(1:2),'**') + binStremp(Numofbin) = {''}; + else + binStremp(Numofbin) = {char(binStr_max(Numofbin))}; + end end end diff --git a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ploterpserpviewer.m b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ploterpserpviewer.m index 54fe8ebd..e817912f 100755 --- a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ploterpserpviewer.m +++ b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_ploterpserpviewer.m @@ -112,7 +112,7 @@ function f_ploterpserpviewer(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray, qERPArray=length(ALLERP); end -[chanStrdef,binStrdef] = f_geterpschanbin(ALLERP,[1:length(ALLERP)]); +[chanStrdef,binStrdef,diff_mark] = f_geterpschanbin(ALLERP,qERPArray); if nargin<5 qchanArray = 1:length(chanStrdef); @@ -187,17 +187,23 @@ function f_ploterpserpviewer(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray, if isempty(qPLOTORG) || numel(qPLOTORG)~=3 || numel(unique(qPLOTORG)) ~=3 || min(qPLOTORG)<0 || max(qPLOTORG)>3 qPLOTORG = [1 2 3]; end - +LegenddispFlag = 1; if qPLOTORG(2) ==1 %% if the selected Channel is "Grid" OverlayArraydef = qchanArray; for Numofchan = 1:numel(qchanArray) LegendNamedef{Numofchan,1} =char(chanStrdef(qchanArray(Numofchan))); end + if diff_mark(1)==1 + LegenddispFlag =0; + end elseif qPLOTORG(2) == 2 %% if the selected Bin is "Grid" OverlayArraydef = qbinArray; for Numofbin = 1:numel(qbinArray) LegendNamedef{Numofbin,1} = char(binStrdef(qbinArray(Numofbin))); end + if diff_mark(2)==1 + LegenddispFlag =0; + end elseif qPLOTORG(2) == 3%% if the selected ERPset is "Grid" OverlayArraydef = qERPArray; for Numoferpset = 1:numel(qERPArray) @@ -212,6 +218,9 @@ function f_ploterpserpviewer(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray, for Numofbin = 1:numel(qbinArray) LegendNamedef{Numofbin,1} = char(binStr(qbinArray(Numofbin))); end + if diff_mark(2)==1 + LegenddispFlag =0; + end end LineColordef = [0 0 0;1 0 0;0 0 1;0 1 0;1,0.65 0;0 1 1;1 0 1;0.5 0.5 0.5;0.94 0.50 0.50;0 0.75 1;0.57 0.93 0.57;1 0.55 0;1 0.75 0.80;1 0.84 0];%% get from:https://htmlcolorcodes.com/color-names/ @@ -343,7 +352,7 @@ function f_ploterpserpviewer(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray, %%ylable font if nargin <34 - qYlabelfont = 'Geneva'; + qYlabelfont = 'Helvetica'; end %%display ylabels? @@ -401,7 +410,7 @@ function f_ploterpserpviewer(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray, %%xlabel font if nargin <26 - qXlabelfont= 'Geneva'; + qXlabelfont= 'Helvetica'; end %%disply xtick labels ? @@ -492,7 +501,7 @@ function f_ploterpserpviewer(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray, %%font of channel/bin/erpset label if nargin <17 - qLabelfont= 'Geneva'; + qLabelfont= 'Helvetica'; end %%location of channel/bin/erpset label @@ -507,7 +516,7 @@ function f_ploterpserpviewer(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray, %%font of legend name if nargin <14 - qLegendFont = 'Geneva'; + qLegendFont = 'Helvetica'; end %%legend name @@ -621,7 +630,7 @@ function f_ploterpserpviewer(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray, qGridposArray(Numofrows,Numofcolumns) =0; else [xpos,ypos]= find(plotArray==SingleGridpos); - qGridposArray(Numofrows,Numofcolumns) =ypos; + qGridposArray(Numofrows,Numofcolumns) =plotArray(ypos); end end end @@ -650,11 +659,17 @@ function f_ploterpserpviewer(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray, if ~strcmpi(qBlc,'no') && ~strcmpi(qBlc,'none')%% when the baseline correction is "pre","post","whole" if strcmpi(qBlc,'pre') - indxtimelock = find(ERP.times==0) ; % zero-time locked + [xxx, indxtimelock, latdiffms] = closest(ERP.times,0); % zero-time locked + if isempty(indxtimelock) + indxtimelock=1; + end aa = 1; elseif strcmpi(qBlc,'post') indxtimelock = length(ERP.times); - aa = find(ERP.times==0); + [xxx, aa, latdiffms] = closest(ERP.times,0);% zero-time locked + if isempty(aa) + aa=length(ERP.times);%%ned to further confirm + end elseif strcmpi(qBlc,'all') || strcmpi(qBlc,'whole') indxtimelock = length(ERP.times); aa = 1; @@ -700,8 +715,8 @@ function f_ploterpserpviewer(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray, if qCURRENTPLOT> numel(qERPArray) qCURRENTPLOT= length(qERPArray); end - bindata = ERPdatadef(qchanArray,:,qbinArray,qCURRENTPLOT); - bindataerror = ERPerrordatadef(qchanArray,:,qbinArray,qCURRENTPLOT); + bindata = ERPdatadef(sort(qchanArray),:,qbinArray,qCURRENTPLOT); + bindataerror = ERPerrordatadef(sort(qchanArray),:,qbinArray,qCURRENTPLOT); % if isempty(timeRangedef) timeRangedef = ALLERPBls(qERPArray(qCURRENTPLOT)).times; % end @@ -716,9 +731,9 @@ function f_ploterpserpviewer(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray, if qCURRENTPLOT> length(qERPArray) qCURRENTPLOT= length(qERPArray); end - bindata = ERPdatadef(qchanArray,:,qbinArray,qCURRENTPLOT); + bindata = ERPdatadef(sort(qchanArray),:,qbinArray,qCURRENTPLOT); bindata = permute(bindata,[3 2 1 4]); - bindataerror = ERPerrordatadef(qchanArray,:,qbinArray,qCURRENTPLOT); + bindataerror = ERPerrordatadef(sort(qchanArray),:,qbinArray,qCURRENTPLOT); bindataerror = permute(bindataerror,[3 2 1 4]); if isempty(timeRangedef) timeRangedef = ALLERPBls(qERPArray(qCURRENTPLOT)).times; @@ -749,9 +764,9 @@ function f_ploterpserpviewer(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray, if qCURRENTPLOT> numel(qbinArray) qCURRENTPLOT = numel(qbinArray); end - bindata = ERPdatadef(qchanArray,:,qbinArray(qCURRENTPLOT),:); + bindata = ERPdatadef(sort(qchanArray),:,qbinArray(qCURRENTPLOT),:); bindata = permute(bindata,[4 2 1 3]); - bindataerror = ERPerrordatadef(qchanArray,:,qbinArray(qCURRENTPLOT),:); + bindataerror = ERPerrordatadef(sort(qchanArray),:,qbinArray(qCURRENTPLOT),:); bindataerror = permute(bindataerror,[4 2 1 3]); try fs= ALLERPBls(qERPArray(end)).srate; @@ -828,7 +843,13 @@ function f_ploterpserpviewer(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray, %%get y axis -y_scale_def = [1.1*min(bindata(:)),1.1*max(bindata(:))]; +ERP1 = ERP; +ERP1.bindata = ERP.bindata(qERPArray,:,:); +[def, minydef, maxydef] = default_amp_ticks(ERP1, qbinArray); +minydef = floor(minydef); +maxydef = ceil(maxydef); +y_scale_def = [minydef,maxydef]; + yMaxdef = ceil(max(bindata(:)))-floor(min(bindata(:))); try isyaxislabel = qGridspace(1,1); @@ -838,8 +859,8 @@ function f_ploterpserpviewer(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray, Ypert = 10; end -if isempty( qYScales) - qYScales = [floor(min(bindata(:))),ceil(max(bindata(:)))]; +if isempty( qYScales) || numel(qYScales)~=2 + qYScales = y_scale_def; end if isyaxislabel==1 %% y axis GAP @@ -853,9 +874,9 @@ function f_ploterpserpviewer(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray, yscaleall = 2*max(abs(qYScales)); qYScales = [-max(abs(qYScales)),max(abs(qYScales))]; end - if yscaleall < y_scale_def(2)-y_scale_def(2) - yscaleall = y_scale_def(2)-y_scale_def(2); - end + % if yscaleall < y_scale_def(2)-y_scale_def(1) + % yscaleall = y_scale_def(2)-y_scale_def(1); + % end for Numofrows = 1:Numrows OffSetY(Numofrows) = yscaleall*(Numrows-Numofrows)*(Ypert/100+1); @@ -877,9 +898,9 @@ function f_ploterpserpviewer(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray, qYScales = [-max(abs(qYScales)),max(abs(qYScales))]; end - if yscaleall < y_scale_def(2)-y_scale_def(2) - yscaleall = y_scale_def(2)-y_scale_def(2); - end + % if yscaleall < y_scale_def(2)-y_scale_def(1) + % yscaleall = y_scale_def(2)-y_scale_def(1); + % end if Numrows ==1 OffSetY = 0; @@ -890,7 +911,7 @@ function f_ploterpserpviewer(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray, OffSetY(Numrows)=0; end else - qYScales = [ceil(max(bindata(:))), floor(min(bindata(:)))]; + qYScales = y_scale_def; if Numrows ==1 OffSetY = 0; else @@ -953,7 +974,7 @@ function f_ploterpserpviewer(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray, %%Get the figure name which is to be plotted -if (qPLOTORG(1)==1 && qPLOTORG(2)==2) || (qPLOTORG(1)==1 && qPLOTORG(2)==2) %% Page is ERPset +if (qPLOTORG(1)==1 && qPLOTORG(2)==2) || (qPLOTORG(1)==2 && qPLOTORG(2)==1) %% Page is ERPset ERP = ALLERPBls(qCURRENTPLOT); if isempty(ERP.filename) || strcmp(ERP.filename,'') ERP.filename = 'still_not_saved!'; @@ -981,8 +1002,6 @@ function f_ploterpserpviewer(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray, end extfig =''; [pathstrfig, qFigureName, extfig] = fileparts(qFigureName) ; - - if isempty(qFigureName) fig_gui= figure('Name',['<< ' fname ' >> '],... 'NumberTitle','on','color',qFigbgColor); @@ -1000,7 +1019,7 @@ function f_ploterpserpviewer(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray, end try outerpos = fig_gui.OuterPosition; - set(fig_gui,'outerposition',[outerpos(1),(2),qFigOutpos(1) 1.05*qFigOutpos(2)]) + set(fig_gui,'outerposition',[1,1,qFigOutpos(1) 1.05*qFigOutpos(2)]) catch set(fig_gui,'outerposition',get(0,'screensize'));%%Maximum figure end @@ -1025,7 +1044,6 @@ function f_ploterpserpviewer(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray, ax.Position = [left bottom ax_width ax_height]; - %%--------------Plot ERPwave----------------- stdalpha = qTransparency; countPlot = 0; @@ -1036,11 +1054,14 @@ function f_ploterpserpviewer(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray, catch plotdatalabel = 0; end - - try - labelcbe = qplotArrayStr{plotdatalabel}; - catch - labelcbe = 'no'; + if (qPLOTORG(1)==1 && qPLOTORG(2)==2) ||(qPLOTORG(1)==2 && qPLOTORG(2)==1) + plotArray1 = sort(plotArray); + else + plotArray1 = plotArray; + end + [~,plotdatalabel] = find(plotArray1 == plotdatalabel); + if isempty(plotdatalabel) + plotdatalabel = 0; end try plotbindata = bindata(plotdatalabel,:,:,:); @@ -1050,6 +1071,14 @@ function f_ploterpserpviewer(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray, if plotdatalabel ~=0 && plotdatalabel<= numel(plotArray) && ~isempty(plotbindata) countPlot =countPlot +1; + try + labelcbe = qplotArrayStr{countPlot}; + if isempty(labelcbe) + labelcbe = 'Label varies across ERPsets'; + end + catch + labelcbe = 'no'; + end if qPolarityWave data4plot = squeeze(bindata(plotdatalabel,:,:,1)); else @@ -1088,8 +1117,7 @@ function f_ploterpserpviewer(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray, end hplot(Numofoverlay) = plot(hbig,Xtimerangetrasf, bindatatrs,'LineWidth',qLineWidthspec(Numofoverlay),... 'Color', qLineColorspec(Numofoverlay,:), 'LineStyle',qLineStylespec{Numofoverlay},'Marker',qLineMarkerspec{Numofoverlay}); - % qLegendName{Numofoverlay} = strrep(qLegendName{Numofoverlay},'_','\_'); % trick for dealing with '_'. JLC - % set(hplot(Numofoverlay),'DisplayName', qLegendName{Numofoverlay}); + end if numel(OffSetY)==1 && OffSetY==0 @@ -1107,7 +1135,7 @@ function f_ploterpserpviewer(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray, ylimleftedge = -abs(ceil(y_scale_def(end))); ylimrightedge = ceil(abs(y_scale_def(1)))+OffSetY(1); end - set(hbig,'ylim',[ylimleftedge,ylimrightedge]); + set(hbig,'ylim',[ylimleftedge,1.05*ylimrightedge]); end @@ -1122,7 +1150,6 @@ function f_ploterpserpviewer(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray, end props.YTickLabel = cell(numel(props.YTick),1); - for Numofytick = 1:numel(props.YTick) props.YTickLabel(Numofytick) = {num2str(props.YTick(Numofytick))}; end @@ -1248,7 +1275,6 @@ function f_ploterpserpviewer(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray, end end - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%----------------------Adjust x axis------------------------%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1345,7 +1371,6 @@ function f_ploterpserpviewer(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray, end end - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%------------------channel/bin/erpset label-----------------%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1410,45 +1435,57 @@ function f_ploterpserpviewer(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray, %%------------------------------legend name------------------------------%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% try - for Numofoverlay = 1:numel(hplot) - qLegendName{Numofoverlay} = strrep(qLegendName{Numofoverlay},'_','\_'); - LegendName{Numofoverlay} = char(strcat('\color[rgb]{',num2str(qLineColorspec(Numofoverlay,:)),'}',32,qLegendName{Numofoverlay})); - end - sh = subplot(ceil(Numrows*5)+1, 1, 1,'align'); - p = get(sh,'position'); - if qlegcolor ~=1 - try - h_legend = legend(sh,hplot,LegendName);%%,'Interpreter','none' - catch + if LegenddispFlag==1 + for Numofoverlay = 1:numel(hplot) + qLegendName{Numofoverlay} = strrep(qLegendName{Numofoverlay},'_','\_'); + LegendName{Numofoverlay} = char(strcat('\color[rgb]{',num2str(qLineColorspec(Numofoverlay,:)),'}',32,qLegendName{Numofoverlay})); + end + sh = subplot(ceil(Numrows*5)+1, 1, 1,'align'); + p = get(sh,'position'); + if qlegcolor ~=1 + try + h_legend = legend(sh,hplot,LegendName);%%,'Interpreter','none' + catch + h_legend = legend(sh,hplot,qLegendName); + end + else h_legend = legend(sh,hplot,qLegendName); end + set(h_legend,'FontSize',qLegendFontsize);%% legend name fontsize + set(h_legend,'FontName',qLegendFont);%%legend name font + set(h_legend, 'position', p); + set(h_legend,'NumColumns',qlegcolumns); + + %%increase height of the legend + HeightScaleFactor = 1; + NewHeight = h_legend.Position(4) * HeightScaleFactor; + h_legend.Position(2) = h_legend.Position(2) - (NewHeight - h_legend.Position(4)); + h_legend.Position(4) = NewHeight; + legend(sh,'boxoff'); + axis(sh,'off'); else - h_legend = legend(sh,hplot,qLegendName); + h_legend = subplot(ceil(Numrows*5)+1, 1, 1,'align'); + set(h_legend, 'XTick', [], 'YTick', [],'Box','off', 'Color','none','xcolor','none','ycolor','none'); + if qPLOTORG(2) ==1 + legendstr = char('The channel labels are not the same across the selected ERPsets, so no channel labels are shown.; If you want to see the channel labels, please select only one ERPset (or multiple ERPsets with matching channel labels).'); + else + legendstr = char('The bin labels are not the same across the selected ERPsets, so no bin labels are shown.; If you want to see the bin labels, please select only one ERPset (or multiple ERPsets with matching bin labels).'); + end + legendstr = regexp(legendstr, '\;', 'split'); + text(h_legend,0.5,0.8,legendstr ,... + 'FontSize',qLabelfontsize+2,'HorizontalAlignment', 'center', 'Color', [1 0 0]);%'FontWeight', 'bold', end - set(h_legend,'FontSize',qLegendFontsize);%% legend name fontsize - set(h_legend,'FontName',qLegendFont);%%legend name font - set(h_legend, 'position', p); - set(h_legend,'NumColumns',qlegcolumns); - - %%increase height of the legend - HeightScaleFactor = 1; - NewHeight = h_legend.Position(4) * HeightScaleFactor; - h_legend.Position(2) = h_legend.Position(2) - (NewHeight - h_legend.Position(4)); - h_legend.Position(4) = NewHeight; - - legend(sh,'boxoff'); - axis(sh,'off'); catch beep; disp('Cannot display the legend names, please check "qGridposArray" or other parameters!'); end set(gcf,'color',qFigbgColor); -prePaperType = get(fig_gui,'PaperType'); -prePaperUnits = get(fig_gui,'PaperUnits'); -preUnits = get(fig_gui,'Units'); -prePaperPosition = get(fig_gui,'PaperPosition'); -prePaperSize = get(fig_gui,'PaperSize'); +% prePaperType = get(fig_gui,'PaperType'); +% prePaperUnits = get(fig_gui,'PaperUnits'); +% preUnits = get(fig_gui,'Units'); +% prePaperPosition = get(fig_gui,'PaperPosition'); +% prePaperSize = get(fig_gui,'PaperSize'); % Make changing paper type possible set(fig_gui,'PaperType',''); diff --git a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_preparms_erpwaviewer.m b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_preparms_erpwaviewer.m index 852fb9f0..1115a572 100755 --- a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_preparms_erpwaviewer.m +++ b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_preparms_erpwaviewer.m @@ -19,59 +19,48 @@ if nargin<2 History = 'gui'; end -try - ALLERPwaviewerin = evalin('base','ALLERPwaviewer'); - ERPwaviewerIN = ALLERPwaviewerin; -catch - beep; - disp('f_preparms_erpwaviewer() error: There is no "ALLERPwaviewer" on Workspace, please run the ERP wave viewer again.'); - return; -end +global gui_erp_waviewer; -ALLERPIN = ERPwaviewerIN.ALLERP; -ERPIN= ERPwaviewerIN.ERP; -CURRENTERPIN = ERPwaviewerIN.CURRENTERP; + +ALLERPIN = gui_erp_waviewer.ERPwaviewer.ALLERP; +ERPIN= gui_erp_waviewer.ERPwaviewer.ERP; +CURRENTERPIN = gui_erp_waviewer.ERPwaviewer.CURRENTERP; if isempty(CURRENTERPIN) || CURRENTERPIN > length(ALLERPIN) %%checking index of current erpset CURRENTERPIN =length(ALLERPIN); end %%checking the indices of the selected ERPsets -ERPsetArray = ERPwaviewerIN.SelectERPIdx; +ERPsetArray = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; if max(ERPsetArray) >length(ALLERPIN) ERPsetArray =length(ALLERPIN); end % %%bin array and channel array -binArray = ERPwaviewerIN.bin; -chanArray = ERPwaviewerIN.chan; +binArray = gui_erp_waviewer.ERPwaviewer.bin; +chanArray = gui_erp_waviewer.ERPwaviewer.chan; PLOTORG =[1 2 3];%%The default parameters for plotting organization %%The first element is for Grid; the second one is for Overlay; The last one is for Pages. try - PLOTORG(1) = ERPwaviewerIN.plot_org.Grid ; - PLOTORG(2) = ERPwaviewerIN.plot_org.Overlay; - PLOTORG(3) = ERPwaviewerIN.plot_org.Pages; + PLOTORG(1) = gui_erp_waviewer.ERPwaviewer.plot_org.Grid ; + PLOTORG(2) = gui_erp_waviewer.ERPwaviewer.plot_org.Overlay; + PLOTORG(3) = gui_erp_waviewer.ERPwaviewer.plot_org.Pages; catch PLOTORG = [1 2 3]; %%"Channels" is Grid; "Bins" is Overlay; "ERPsets" is Pages. end -GridLayoutop =1;%% need to further edit after discussed with Steve -try - GridLayoutop = ERPwaviewerIN.plot_org.gridlayout.op ; -catch - GridLayoutop =1; -end +[chanStr,binStr,diff_mark,chanStremp,binStremp] = f_geterpschanbin(ALLERPIN,ERPsetArray); + -[chanStr,binStr,diff_mark] = f_geterpschanbin(ALLERPIN,ERPsetArray); plotArrayStrdef =''; plotArray = []; if PLOTORG(1) ==1 %% if the selected Channel is "Grid" plotArray = chanArray; for Numofchan = 1:numel(chanArray) try - plotArrayStrdef{Numofchan} = chanStr{plotArray(Numofchan)}; + plotArrayStrdef{Numofchan} = chanStremp{plotArray(Numofchan)}; catch plotArrayStrdef{Numofchan} = ''; end @@ -80,7 +69,7 @@ plotArray = binArray; for Numofchan = 1:numel(plotArray) try - plotArrayStrdef{Numofchan} = binStr{plotArray(Numofchan)}; + plotArrayStrdef{Numofchan} = binStremp{plotArray(Numofchan)}; catch plotArrayStrdef{Numofchan} = ' '; end @@ -96,19 +85,13 @@ end end GridLayoutop=0; -try - plotArrayStr = ERPwaviewerIN.plot_org.gridlayout.columFormat; -catch - plotArrayStr = ''; -end -if isempty(plotArrayStr) - plotArrayStr = plotArrayStrdef; -end +LabelsName = plotArrayStrdef; % %%Getting the specific setting of each position for Grid plotBox = f_getrow_columnautowaveplot(plotArray);%% the first element is number of rows and the second element is the number of columns GridposArray = []; +LabelsdiffFlag = 0; if GridLayoutop==1 count = 0; for Numofrow = 1:plotBox(1) %%organization of Grid @@ -123,10 +106,10 @@ end elseif GridLayoutop==0 try %%try to use the user defined parameters for "Grid" - plotBox(1) = ERPwaviewerIN.plot_org.gridlayout.rows; - plotBox(2) = ERPwaviewerIN.plot_org.gridlayout.columns; - columFormat = ERPwaviewerIN.plot_org.gridlayout.columFormat; - DataDf = ERPwaviewerIN.plot_org.gridlayout.data; + plotBox(1) = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rows; + plotBox(2) = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columns; + columFormat = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columFormat; + DataDf = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.data; for Numofrows = 1:plotBox(1) for Numofcolumns = 1:plotBox(2) SingleStr = char(DataDf{Numofrows,Numofcolumns}); @@ -135,11 +118,16 @@ if IA <= length(columFormat) try GridposArray(Numofrows,Numofcolumns) = plotArray(IA); + try + if isempty(plotArrayStrdef{IA}) + LabelsdiffFlag =1; + end + catch + end + catch GridposArray(Numofrows,Numofcolumns) =0; end - % elseif IA == length(columFormat) %%%If the element is 'None' - % GridposArray(Numofrows,Numofcolumns) = 0; end else GridposArray(Numofrows,Numofcolumns) = 0; @@ -163,7 +151,7 @@ % %%---------------line color, line style, line marker,linewidth------------- -LegendName = {''}; +LegendName = {''};%%legend name will be automatically changed if PLOTORG(2) ==1 %% if the selected Channel is "Grid" OverlayArray = chanArray; for Numofchan = 1:numel(chanArray) @@ -210,8 +198,8 @@ LineMarkerspec = cell(1,numel(OverlayArray)); LineWidthspec = ones(1,numel(OverlayArray)); try - LineData = ERPwaviewerIN.Lines.data; - if ERPwaviewerIN.Lines.auto + LineData = gui_erp_waviewer.ERPwaviewer.Lines.data; + if gui_erp_waviewer.ERPwaviewer.Lines.auto LineDataColor = linecolorsrgb; else for ii = 1:size(LineData,1) @@ -292,36 +280,34 @@ TextcolorLeg = 1; Legcolumns = 1; try - for NumofOverlay =1:numel(OverlayArray) - LegendName{NumofOverlay} = char(ERPwaviewerIN.Legend.data{NumofOverlay,2}); - end - FontLegValue = ERPwaviewerIN.Legend.font; +% for NumofOverlay =1:numel(OverlayArray) +% LegendName{NumofOverlay} = char(gui_erp_waviewer.ERPwaviewer.Legend.data{NumofOverlay,2}); +% end + FontLegValue = gui_erp_waviewer.ERPwaviewer.Legend.font; FontLeg = fonttype{FontLegValue}; - FontSizeLeg = ERPwaviewerIN.Legend.fontsize; - TextcolorLeg = ERPwaviewerIN.Legend.textcolor; - Legcolumns = ERPwaviewerIN.Legend.columns; + FontSizeLeg = gui_erp_waviewer.ERPwaviewer.Legend.fontsize; + TextcolorLeg = gui_erp_waviewer.ERPwaviewer.Legend.textcolor; + Legcolumns = gui_erp_waviewer.ERPwaviewer.Legend.columns; catch end - - % %%--------------Chan/Bin/ERPset Labels, font, and fontsize----------------- CBELabels = [50 100 1]; CBEFont = 'Helvetica'; CBEFontsize=10; try - if ERPwaviewerIN.chanbinsetlabel.location.no ==1 + if gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.no ==1 CBELabels = []; CBEFont = ''; CBEFontsize=[]; - elseif ERPwaviewerIN.chanbinsetlabel.location.custom==1 - CBELabels(1) = ERPwaviewerIN.chanbinsetlabel.location.xperc; - CBELabels(2) = ERPwaviewerIN.chanbinsetlabel.location.yperc; - CBELabels(3) = ERPwaviewerIN.chanbinsetlabel.location.center; - FontlabelValue = ERPwaviewerIN.chanbinsetlabel.font; + elseif gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.custom==1 + CBELabels(1) = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.xperc; + CBELabels(2) = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.yperc; + CBELabels(3) = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.location.center; + FontlabelValue = gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.font; CBEFont = fonttype{FontlabelValue}; - CBEFontsize=ERPwaviewerIN.chanbinsetlabel.fontsize; + CBEFontsize=gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.fontsize; end catch @@ -330,7 +316,7 @@ %%label textcolor CBETcolor = [0 0 0]; try - xlabelFontcolorValue =ERPwaviewerIN.chanbinsetlabel.textcolor; + xlabelFontcolorValue =gui_erp_waviewer.ERPwaviewer.chanbinsetlabel.textcolor; switch xlabelFontcolorValue case 1 CBETcolor = [0 0 0];%% black @@ -352,14 +338,11 @@ catch end - - - % %%-----------------------------Polarity------------------------------------ PolarityWave = 1; try - PolarityWave = ERPwaviewerIN.polarity; + PolarityWave = gui_erp_waviewer.ERPwaviewer.polarity; catch end @@ -367,7 +350,7 @@ %%-----------------------------standard error------------------------------ Standerr = 0; try - StanderrValue = ERPwaviewerIN.SEM.error; + StanderrValue = gui_erp_waviewer.ERPwaviewer.SEM.error; if ~isnumeric(StanderrValue) || isempty(StanderrValue) Standerr = 0; else @@ -375,7 +358,7 @@ end catch end -if ERPwaviewerIN.SEM.active==0 +if gui_erp_waviewer.ERPwaviewer.SEM.active==0 Standerr = 0; else if Standerr<=0 @@ -386,7 +369,7 @@ %%-------------------------------Transparency------------------------------ Transparency = 0; try - TransparencyValue = ERPwaviewerIN.SEM.trans; + TransparencyValue = gui_erp_waviewer.ERPwaviewer.SEM.trans; if ~isnumeric(TransparencyValue) || isempty(TransparencyValue) Transparency = 0; else @@ -395,7 +378,7 @@ catch end -if ERPwaviewerIN.SEM.active==0 +if gui_erp_waviewer.ERPwaviewer.SEM.active==0 Transparency = 0; else @@ -408,37 +391,37 @@ %%------------------------------Grid space--------------------------------- Gridspace = [1 10;1 10]; try - Layoutop = ERPwaviewerIN.plot_org.gridlayout.op; + Layoutop = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.op; if Layoutop~=1 %%for rows - rowgapop = ERPwaviewerIN.plot_org.gridlayout.rowgap.GTPOP; + rowgapop = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.GTPOP; if rowgapop%%gap Gridspace(1,1) = 1; - rowgapValue = ERPwaviewerIN.plot_org.gridlayout.rowgap.GTPValue; + rowgapValue = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.GTPValue; if isempty(rowgapValue) || numel(rowgapValue)~=1 || rowgapValue<=0 rowgapValue = 10; end Gridspace(1,2) = rowgapValue; else%%overlay Gridspace(1,1) = 2; - rowoverlayValue = ERPwaviewerIN.plot_org.gridlayout.rowgap.OverlayValue; + rowoverlayValue = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.rowgap.OverlayValue; if isempty(rowoverlayValue) || numel(rowoverlayValue)~=1 || rowoverlayValue<=0 || rowoverlayValue>100 rowoverlayValue = 40; end Gridspace(1,2) = rowoverlayValue; end %%for columns - columngapop = ERPwaviewerIN.plot_org.gridlayout.columngap.GTPOP; + columngapop = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.GTPOP; if columngapop%%gap Gridspace(2,1) = 1; - columngapValue = ERPwaviewerIN.plot_org.gridlayout.columngap.GTPValue; + columngapValue = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.GTPValue; if isempty(columngapValue) || numel(columngapValue)~=1 || columngapValue<=0 columngapValue = 10; end Gridspace(2,2) = columngapValue; else%% overlay Gridspace(2,1) = 2; - columnoverlayValue = ERPwaviewerIN.plot_org.gridlayout.columngap.OverlayValue; + columnoverlayValue = gui_erp_waviewer.ERPwaviewer.plot_org.gridlayout.columngap.OverlayValue; if isempty(columnoverlayValue) || numel(columnoverlayValue)~=1 || columnoverlayValue<=0 || columnoverlayValue>100 columnoverlayValue = 20; end @@ -453,7 +436,7 @@ %%-----------------------------Baseline correction------------------------- Blc = 'none'; try - Blc = ERPwaviewerIN.baselinecorr; + Blc = gui_erp_waviewer.ERPwaviewer.baselinecorr; catch end @@ -461,12 +444,12 @@ %%---------------------------------x axis---------------------------------- timeRange = [];%%time range is used to plot the wave(s) try - timeRange = ERPwaviewerIN.xaxis.timerange; + timeRange = gui_erp_waviewer.ERPwaviewer.xaxis.timerange; catch end timeticks = []; try - timeticks = ERPwaviewerIN.xaxis.timeticks; + timeticks = gui_erp_waviewer.ERPwaviewer.xaxis.timeticks; catch end if ~isempty(timeRange) && ~isempty(timeticks) %%check xticks @@ -485,7 +468,7 @@ end xticklabel = 'on'; try - xticklabelValue = ERPwaviewerIN.xaxis.label; + xticklabelValue = gui_erp_waviewer.ERPwaviewer.xaxis.label; if xticklabelValue==0 xticklabel = 'off'; else @@ -496,7 +479,7 @@ xlabelFont = 'Helvetica'; try - xFontlabelValue = ERPwaviewerIN.xaxis.font; + xFontlabelValue = gui_erp_waviewer.ERPwaviewer.xaxis.font; xlabelFont = fonttype{xFontlabelValue}; catch end @@ -504,13 +487,13 @@ xlabelFontsize = 10; try - xlabelFontsize =ERPwaviewerIN.xaxis.fontsize; + xlabelFontsize =gui_erp_waviewer.ERPwaviewer.xaxis.fontsize; catch end xlabelFontcolor = [0 0 0]; try - xlabelFontcolorValue =ERPwaviewerIN.xaxis.fontcolor; + xlabelFontcolorValue =gui_erp_waviewer.ERPwaviewer.xaxis.fontcolor; switch xlabelFontcolorValue case 1 xlabelFontcolor = [0 0 0];%% black @@ -533,7 +516,7 @@ end Xunits = 'on'; try - XunitsValue = ERPwaviewerIN.xaxis.units; + XunitsValue = gui_erp_waviewer.ERPwaviewer.xaxis.units; if XunitsValue==1 Xunits = 'on'; else @@ -545,8 +528,8 @@ %%Minorticks for x axis try - MinorticksX(1) = ERPwaviewerIN.xaxis.tminor.disp; - MinorticksX(2:numel(ERPwaviewerIN.xaxis.tminor.step)+1) = ERPwaviewerIN.xaxis.tminor.step; + MinorticksX(1) = gui_erp_waviewer.ERPwaviewer.xaxis.tminor.disp; + MinorticksX(2:numel(gui_erp_waviewer.ERPwaviewer.xaxis.tminor.step)+1) = gui_erp_waviewer.ERPwaviewer.xaxis.tminor.step; catch MinorticksX = [0];%% off end @@ -554,7 +537,7 @@ %%Decimals for x ticklabels Xtickprecision = 0; try - Xtickprecision= ERPwaviewerIN.xaxis.tickdecimals; + Xtickprecision= gui_erp_waviewer.ERPwaviewer.xaxis.tickdecimals; catch Xtickprecision = 0; end @@ -566,19 +549,19 @@ %%display x ticks with millisecond or second? XdispFlag = 1;%% in millisecond try - XdispFlag = ERPwaviewerIN.xaxis.tdis; + XdispFlag = gui_erp_waviewer.ERPwaviewer.xaxis.tdis; catch end %%%--------------------------------y axis---------------------------------- Yscales = []; try - Yscales = ERPwaviewerIN.yaxis.scales ; + Yscales = gui_erp_waviewer.ERPwaviewer.yaxis.scales ; catch end Yticks = []; try - Yticks = ERPwaviewerIN.yaxis.ticks; + Yticks = gui_erp_waviewer.ERPwaviewer.yaxis.ticks; catch end if ~isempty(Yscales) && ~isempty(Yticks) %%check Yticks @@ -598,7 +581,7 @@ yticklabel = 'on'; try - yticklabelValue = ERPwaviewerIN.yaxis.label; + yticklabelValue = gui_erp_waviewer.ERPwaviewer.yaxis.label; if yticklabelValue==0 yticklabel = 'off'; else @@ -609,20 +592,20 @@ YlabelFont = 'Helvetica'; try - YFontlabelValue = ERPwaviewerIN.yaxis.font; + YFontlabelValue = gui_erp_waviewer.ERPwaviewer.yaxis.font; YlabelFont = fonttype{YFontlabelValue}; catch end YlabelFontsize = 12; try - YlabelFontsize =ERPwaviewerIN.yaxis.fontsize; + YlabelFontsize =gui_erp_waviewer.ERPwaviewer.yaxis.fontsize; catch end ylabelFontcolor = [0 0 0]; try - ylabelFontcolorValue =ERPwaviewerIN.yaxis.fontcolor; + ylabelFontcolorValue =gui_erp_waviewer.ERPwaviewer.yaxis.fontcolor; switch ylabelFontcolorValue case 1 ylabelFontcolor = [0 0 0];%% black @@ -646,7 +629,7 @@ yunits = 'on'; try - yunitsValue = ERPwaviewerIN.yaxis.units; + yunitsValue = gui_erp_waviewer.ERPwaviewer.yaxis.units; if yunitsValue==1 yunits = 'on'; else @@ -658,7 +641,7 @@ Ytickprecision = 1; try - Ytickprecision = ERPwaviewerIN.yaxis.tickdecimals; + Ytickprecision = gui_erp_waviewer.ERPwaviewer.yaxis.tickdecimals; catch Ytickprecision = 1; end @@ -666,8 +649,8 @@ %%Minorticks for y axis try - MinorticksY(1) = ERPwaviewerIN.yaxis.yminor.disp; - MinorticksY(2:numel(ERPwaviewerIN.yaxis.yminor.step)+1) = ERPwaviewerIN.yaxis.yminor.step; + MinorticksY(1) = gui_erp_waviewer.ERPwaviewer.yaxis.yminor.disp; + MinorticksY(2:numel(gui_erp_waviewer.ERPwaviewer.yaxis.yminor.step)+1) = gui_erp_waviewer.ERPwaviewer.yaxis.yminor.step; catch MinorticksY = [0];%% off end @@ -677,7 +660,7 @@ %%Background color of figure figbgdColor = [1 1 1]; try - figbgdColor = ERPwaviewerIN.figbackgdcolor; + figbgdColor = gui_erp_waviewer.ERPwaviewer.figbackgdcolor; catch figbgdColor = [1 1 1]; end @@ -687,16 +670,10 @@ end -PagesIndex = ERPwaviewerIN.PageIndex; +PagesIndex = gui_erp_waviewer.ERPwaviewer.PageIndex; if isempty(PagesIndex) PagesIndex=1; end -plotArrayStr_tr =''; -for ii = 1:length(plotArrayStr) - plotArrayStr_tr{ii} = plotArrayStr{ii}; -end -plotArrayStr = ''; -plotArrayStr = plotArrayStr_tr; try ScreenPos = get( groot, 'Screensize' ); @@ -705,7 +682,7 @@ end FigOutpos = []; try - FigOutpos=ERPwaviewerIN.FigOutpos; + FigOutpos=gui_erp_waviewer.ERPwaviewer.FigOutpos; FigOutpos = [ScreenPos(3)*FigOutpos(1)/100,ScreenPos(4)*FigOutpos(2)/100]; catch FigOutpos = ScreenPos(3:4)*3/4; @@ -715,7 +692,7 @@ %%Main function if ~isempty(FigureName) [ALLERP, erpcom] = pop_plotERPwaviewer(ALLERPIN,PagesIndex,ERPsetArray, binArray, chanArray,... - 'PLOTORG',PLOTORG,'GridposArray',GridposArray,'LabelsName',plotArrayStr, 'Blc', Blc,'Box',plotBox,'LineColor',LineColorspec,'LineStyle',LineStylespec,... + 'PLOTORG',PLOTORG,'GridposArray',GridposArray,'LabelsName',LabelsName, 'Blc', Blc,'Box',plotBox,'LineColor',LineColorspec,'LineStyle',LineStylespec,... 'LineMarker',LineMarkerspec,'LineWidth',LineWidthspec,'LegendName',LegendName,'LegendFont',FontLeg,'LegendFontsize',FontSizeLeg,... 'Labeloc',CBELabels,'Labelfont',CBEFont,'Labelfontsize',CBEFontsize,'YDir',PolarityWave,'SEM',Standerr,'Transparency', Transparency,... 'GridSpace',Gridspace,'TimeRange',timeRange,'Xticks',timeticks,'Xticklabel',xticklabel,'Xlabelfont',xlabelFont,'Xlabelfontsize',xlabelFontsize,... @@ -731,7 +708,7 @@ OutputViewerpar{4} = binArray; OutputViewerpar{5} = chanArray; OutputViewerpar{6} = GridposArray; - OutputViewerpar{7} = plotArrayStr; + OutputViewerpar{7} = LabelsName; OutputViewerpar{8} = Blc; OutputViewerpar{9} = plotBox; OutputViewerpar{10} = LineColorspec; @@ -772,6 +749,7 @@ OutputViewerpar{45} = Ytickprecision; OutputViewerpar{46} = Xtickprecision; OutputViewerpar{47} = XdispFlag; + OutputViewerpar{48} =LabelsdiffFlag; end end \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_redrawERP_viewer_test.m b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_redrawERP_viewer_test.m index 721dd323..d48888a6 100755 --- a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_redrawERP_viewer_test.m +++ b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_redrawERP_viewer_test.m @@ -1,15 +1,11 @@ %PURPOSE : Plot EPR waves within one axes - - % Author: Guanghui Zhang & Steve J. Luck % Center for Mind and Brain % University of California, Davis % Davis, CA % 2022 & 2023 - - function f_redrawERP_viewer_test() global viewer_ERPDAT; @@ -22,14 +18,6 @@ function f_redrawERP_viewer_test() return; end -try - ALLERPwaviewer = evalin('base','ALLERPwaviewer'); - ERPwaviewer = ALLERPwaviewer; -catch - beep; - disp('Please re-run ERP wave viewer.'); - return; -end %%save figure size:width and height try @@ -40,8 +28,8 @@ function f_redrawERP_viewer_test() FigOutposition = gui_erp_waviewer.ViewBox.OuterPosition(3:4); FigOutposition(1) = 100*FigOutposition(1)/ScreenPos(3); FigOutposition(2) = 100*FigOutposition(2)/ScreenPos(4); -ERPwaviewer.FigOutpos=FigOutposition; -assignin('base','ALLERPwaviewer',ERPwaviewer); +gui_erp_waviewer.ERPwaviewer.FigOutpos=FigOutposition; + try gui_erp_waviewer.ScrollVerticalOffsets = gui_erp_waviewer.ViewAxes.VerticalOffsets/gui_erp_waviewer.ViewAxes.Heights; gui_erp_waviewer.ScrollHorizontalOffsets = gui_erp_waviewer.ViewAxes.HorizontalOffsets/gui_erp_waviewer.ViewAxes.Widths; @@ -67,19 +55,19 @@ function f_redrawERP_viewer_test() Res = Pix_SS./Inch_SS; %%background color of figure -figbgdColor = ERPwaviewer.figbackgdcolor; +figbgdColor = gui_erp_waviewer.ERPwaviewer.figbackgdcolor; if ~isnumeric(figbgdColor) || isempty(figbgdColor) || numel(figbgdColor)~=3 || max(figbgdColor)>1 || min(figbgdColor)<0 figbgdColor =[1 1 1]; end zoomSpace = estudioworkingmemory('zoomSpace'); if isempty(zoomSpace) - zoomSpace = 0; + zoomSpace = 100; else - if zoomSpace<0 - zoomSpace =0; + if zoomSpace<100 + zoomSpace =100; end end -if zoomSpace ==0 +if zoomSpace ==100 gui_erp_waviewer.ScrollVerticalOffsets=0; gui_erp_waviewer.ScrollHorizontalOffsets=0; end @@ -95,12 +83,12 @@ function f_redrawERP_viewer_test() %%determine the page number -pagecurrentNum = ERPwaviewer.PageIndex; -pagesValue = ERPwaviewer.plot_org.Pages; -ERPArray = ERPwaviewer.SelectERPIdx; -chanArray =ERPwaviewer.chan; -binArray = ERPwaviewer.bin; -ALLERPIN = ERPwaviewer.ALLERP; +pagecurrentNum = gui_erp_waviewer.ERPwaviewer.PageIndex; +pagesValue = gui_erp_waviewer.ERPwaviewer.plot_org.Pages; +ERPArray = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; +chanArray =gui_erp_waviewer.ERPwaviewer.chan; +binArray = gui_erp_waviewer.ERPwaviewer.bin; +ALLERPIN = gui_erp_waviewer.ERPwaviewer.ALLERP; [chanStr,binStr,diff_mark] = f_geterpschanbin(ALLERPIN,ERPArray); if pagesValue==1 pageNum = numel(chanArray); @@ -118,8 +106,7 @@ function f_redrawERP_viewer_test() if pagecurrentNum>pageNum pagecurrentNum =1; - ERPwaviewer.PageIndex =1; - assignin('base','ALLERPwaviewer',ERPwaviewer); + gui_erp_waviewer.ERPwaviewer.PageIndex =1; end gui_erp_waviewer.plotgrid = uix.VBox('Parent',gui_erp_waviewer.ViewContainer,'Padding',0,'Spacing',0,'BackgroundColor',ColorBviewer_def); @@ -130,25 +117,18 @@ function f_redrawERP_viewer_test() uicontrol('Parent',gui_erp_waviewer.erpwaviewer_legend_title,'Style','text','String','','FontSize',FonsizeDefault,'FontWeight','bold','BackgroundColor',ColorBviewer_def); gui_erp_waviewer.erpwaviewer_legend = uix.ScrollingPanel( 'Parent', gui_erp_waviewer.erpwaviewer_legend_title,'BackgroundColor',figbgdColor); - - gui_erp_waviewer.plot_wav_legend = uiextras.HBox( 'Parent', gui_erp_waviewer.plotgrid,'BackgroundColor',ColorBviewer_def); -% gui_erp_waviewer.ViewAxes_legend = uix.ScrollingPanel( 'Parent', gui_erp_waviewer.plot_wav_legend,'BackgroundColor',ColorBviewer_def); - uicontrol('Parent',gui_erp_waviewer.plot_wav_legend,'Style','text','String','','FontSize',FonsizeDefault,'FontWeight','bold','BackgroundColor',ColorBviewer_def); -% gui_erp_waviewer.Resize = 0; - - -% gui_erp_waviewer.ViewAxes = uix.ScrollingPanel( 'Parent', gui_erp_waviewer.plot_wav_legend,'BackgroundColor',figbgdColor,'SizeChangedFcn',@WAviewerResize);% gui_erp_waviewer.ViewAxes = uix.ScrollingPanel( 'Parent', gui_erp_waviewer.plot_wav_legend,'BackgroundColor',figbgdColor); +gui_erp_waviewer.blank_title = uiextras.HBox( 'Parent', gui_erp_waviewer.plotgrid,'BackgroundColor',ColorBviewer_def);%%%Message +uicontrol('Parent',gui_erp_waviewer.blank_title,'Style','text','String','','FontSize',FonsizeDefault,'BackgroundColor',ColorBviewer_def); + -%%Changed by Guanghui Zhang Dec. 2022-------panel for display the processing procedure for some functions, e.g., filtering gui_erp_waviewer.zoomin_out_title = uiextras.HBox( 'Parent', gui_erp_waviewer.plotgrid,'BackgroundColor',ColorBviewer_def);%%%Message uicontrol('Parent',gui_erp_waviewer.zoomin_out_title,'Style','text','String','','FontSize',FonsizeDefault,'BackgroundColor',ColorBviewer_def); gui_erp_waviewer.zoom_in = uicontrol('Parent',gui_erp_waviewer.zoomin_out_title,'Style','pushbutton','String','Zoom In',... 'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1],'Callback',@zoomin); - gui_erp_waviewer.zoom_edit = uicontrol('Parent',gui_erp_waviewer.zoomin_out_title,'Style','edit','String',num2str(zoomSpace),... 'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1],'Callback',@zoomedit); @@ -156,46 +136,26 @@ function f_redrawERP_viewer_test() 'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1],'Callback',@zoomout); uicontrol('Parent',gui_erp_waviewer.zoomin_out_title,'Style','text','String','','FontSize',FonsizeDefault,'BackgroundColor',ColorBviewer_def); -gui_erp_waviewer.figuresaveas = uicontrol('Parent',gui_erp_waviewer.zoomin_out_title,'Style','pushbutton','String','Show Command',... - 'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1],'Callback',@Show_command); - - -gui_erp_waviewer.figuresaveas = uicontrol('Parent',gui_erp_waviewer.zoomin_out_title,'Style','pushbutton','String','Save Figure as',... - 'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1],'Callback',@figure_saveas); - -gui_erp_waviewer.figureout = uicontrol('Parent',gui_erp_waviewer.zoomin_out_title,'Style','pushbutton','String','Create Static /Exportable Plot',... - 'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1],'Callback',@figure_out); +gui_erp_waviewer.show_popup = uicontrol('Parent',gui_erp_waviewer.zoomin_out_title,'Style','popupmenu','String',{'Plot options','Show Command','Save Figure as','Create Static /Exportable Plot'},... + 'FontSize',FonsizeDefault,'BackgroundColor',ColorBviewer_def,'Callback',@show_popup); gui_erp_waviewer.Reset = uicontrol('Parent',gui_erp_waviewer.zoomin_out_title,'Style','pushbutton','String','Reset',... 'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1],'Callback',@Panel_Reset); - uicontrol('Parent',gui_erp_waviewer.zoomin_out_title,'Style','text','String','','FontSize',FonsizeDefault,'BackgroundColor',ColorBviewer_def); -set(gui_erp_waviewer.zoomin_out_title, 'Sizes', [10 70 50 70 -1 100 100 170 70 5]); +set(gui_erp_waviewer.zoomin_out_title, 'Sizes', [10 70 50 70 -1 150 70 5]); - -%%Changed by Guanghui Zhang Dec. 2022-------panel for display the processing procedure for some functions, e.g., filtering gui_erp_waviewer.xaxis_panel = uiextras.HBox( 'Parent', gui_erp_waviewer.plotgrid,'BackgroundColor',ColorBviewer_def);%%%Message gui_erp_waviewer.Process_messg = uicontrol('Parent',gui_erp_waviewer.xaxis_panel,'Style','text','String','','FontSize',FonsizeDefault+2,'FontWeight','bold','BackgroundColor',ColorBviewer_def); %%Setting title gui_erp_waviewer.pageinfo_str = ['Page',32,num2str(pagecurrentNum),'/',num2str(pageNum),':',PageStr{pagecurrentNum}]; - -gui_erp_waviewer.pageinfo_text = uicontrol('Parent',gui_erp_waviewer.pageinfo_box,'Style','text','String',gui_erp_waviewer.pageinfo_str,'FontSize',FonsizeDefault,'FontWeight','bold','BackgroundColor',ColorBviewer_def); - - -gui_erp_waviewer.pageinfo_minus = uicontrol('Parent',gui_erp_waviewer.pageinfo_box,'Style', 'pushbutton', 'String', '<','Callback',@page_minus,'FontSize',FonsizeDefault+5,'BackgroundColor',[1 1 1],'FontWeight','bold'); -% if S_ws_getbinchan.Select_index ==1 +gui_erp_waviewer.pageinfo_text = uicontrol('Parent',gui_erp_waviewer.pageinfo_box,'Style','text','String',gui_erp_waviewer.pageinfo_str,'FontSize',FonsizeDefault,'BackgroundColor',ColorBviewer_def); +gui_erp_waviewer.pageinfo_minus = uicontrol('Parent',gui_erp_waviewer.pageinfo_box,'Style', 'pushbutton', 'String', 'Prev.','Callback',@page_minus,'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1]); gui_erp_waviewer.pageinfo_minus.Enable = 'off'; -% end gui_erp_waviewer.pageinfo_edit = uicontrol('Parent',gui_erp_waviewer.pageinfo_box,'Style', 'edit', 'String', num2str(pagecurrentNum),'Callback',@page_edit,'FontSize',FonsizeDefault+2,'BackgroundColor',[1 1 1]); - - -gui_erp_waviewer.pageinfo_plus = uicontrol('Parent',gui_erp_waviewer.pageinfo_box,'Style', 'pushbutton', 'String', '>','Callback',@page_plus,'FontSize',FonsizeDefault+5,'BackgroundColor',[1 1 1],'FontWeight','bold'); -% if S_ws_getbinchan.Select_index == numel(S_ws_geterpset) +gui_erp_waviewer.pageinfo_plus = uicontrol('Parent',gui_erp_waviewer.pageinfo_box,'Style', 'pushbutton', 'String', 'Next','Callback',@page_plus,'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1]); gui_erp_waviewer.pageinfo_plus.Enable = 'off'; -% end - if pageNum ==1 Enable_minus = 'off'; @@ -226,7 +186,7 @@ function f_redrawERP_viewer_test() gui_erp_waviewer.pageinfo_minus.ForegroundColor = Enable_minus_BackgroundColor; set(gui_erp_waviewer.plot_wav_legend, 'Sizes', [10 -1]); set(gui_erp_waviewer.erpwaviewer_legend_title, 'Sizes', [10 -1]); -set(gui_erp_waviewer.pageinfo_box, 'Sizes', [-1 50 50 50] ); +set(gui_erp_waviewer.pageinfo_box, 'Sizes', [-1 70 50 70] ); gui_erp_waviewer.myerpviewer = axes('Parent', gui_erp_waviewer.ViewAxes,'Color','none','Box','on','FontWeight','bold'); hold(gui_erp_waviewer.myerpviewer,'on'); @@ -240,8 +200,9 @@ function f_redrawERP_viewer_test() gui_erp_waviewer.plotgrid.Heights(1) = 30; % set the first element (pageinfo) to 30px high gui_erp_waviewer.plotgrid.Heights(2) = 50; % set the first element (pageinfo) to 30px high -gui_erp_waviewer.plotgrid.Heights(4) = 30; % set the second element (x axis) to 30px high +gui_erp_waviewer.plotgrid.Heights(4) = 5; gui_erp_waviewer.plotgrid.Heights(5) = 30; % set the second element (x axis) to 30px high +gui_erp_waviewer.plotgrid.Heights(6) = 30; % set the second element (x axis) to 30px high gui_erp_waviewer.plotgrid.Units = 'pixels'; if isempty(OutputViewerpar) disp('Please restart EStudio Wave Viewer'); @@ -267,23 +228,21 @@ function f_redrawERP_viewer_test() else pb_height = 0.9*pb_height; end -if zoomSpace <0 - gui_erp_waviewer.ViewAxes.Heights = splot_n*pb_height; +zoomSpace = zoomSpace-100; +if zoomSpace <=0 + gui_erp_waviewer.ViewAxes.Heights = 0.95*gui_erp_waviewer.ViewAxes.Position(4); else gui_erp_waviewer.ViewAxes.Heights = splot_n*pb_height*(1+zoomSpace/100); end widthViewer = gui_erp_waviewer.ViewAxes.Position(3)-gui_erp_waviewer.ViewAxes.Position(2); -if zoomSpace <0 +if zoomSpace <=0 gui_erp_waviewer.ViewAxes.Widths = widthViewer; else gui_erp_waviewer.ViewAxes.Widths = widthViewer*(1+zoomSpace/100); - end gui_erp_waviewer.plotgrid.Units = 'normalized'; - - %%Keep the same positions for Vertical and Horizontal scrolling bars asbefore if zoomSpace~=0 && zoomSpace>0 if gui_erp_waviewer.ScrollVerticalOffsets<=1 @@ -299,37 +258,57 @@ function f_redrawERP_viewer_test() end end end -% gui_erp_waviewer.ViewAxes.BackgroundColor = 'b'; -end % redrawDemo - +%%display the names of channels and bins if they diff across the selected +%%ERPsets +LabelsdiffFlag = OutputViewerpar{48}; +ALLERPIN = OutputViewerpar{1}; +PLOTORG = OutputViewerpar{3}; +ERPsetArray= OutputViewerpar{43}; +[chanStr,binStr,diff_mark,chanStremp,binStremp] = f_geterpschanbin(ALLERPIN,ERPsetArray); +if (diff_mark(1) ==1 || diff_mark(2)==1) && LabelsdiffFlag==1 && PLOTORG(1)~=3 + if diff_mark(1) ==1 && diff_mark(2) ==0 + MessageViewer= char(strcat('Some grid Location Labels will be empty because CHANNELS differ across the selected ERPsets')); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); + viewer_ERPDAT.Process_messg =4; + elseif diff_mark(1) ==0 && diff_mark(2) ==1 + MessageViewer= char(strcat('Some grid Location Labels will be empty because BINS differ across the selected ERPsets')); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); + viewer_ERPDAT.Process_messg =4; + + elseif diff_mark(1) ==1 && diff_mark(2) ==1 + MessageViewer= char(strcat('Some grid Location Labels will be empty because CHANNELS and BINS differ across the selected ERPsets')); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); + viewer_ERPDAT.Process_messg =4; + end + f_display_binstr_chanstr(ALLERPIN, ERPsetArray,diff_mark) +end +end % redrawDemo -%%Resize the GUI automatically as the user changes the size of the window at run-time. -% function WAviewerResize(~,~) -% global gui_erp_waviewer; -% if gui_erp_waviewer.Resize ~= 0 -% set( gui_erp_waviewer.tabERP, 'Widths', [-4, 270]); -% f_redrawERP_viewer_test(); -% end -% end +function show_popup(Source,~) +global viewer_ERPDAT; +value = Source.Value; +if value==2 + Show_command(); +elseif value==3 + figure_saveas(); +elseif value==4 + figure_out(); +end +Source.Value=1; +end %%-------------------------------Page Editor------------------------------- function page_edit(Source,~) global viewer_ERPDAT +global gui_erp_waviewer; % addlistener(viewer_ERPDAT,'page_xyaxis',@count_page_xyaxis_change); -try - ERPwaviewer = evalin('base','ALLERPwaviewer'); -catch - beep; - disp('Error > f_redrawERP_viewer_test() > page_edit().'); - return; -end -pagesValue = ERPwaviewer.plot_org.Pages; +pagesValue = gui_erp_waviewer.ERPwaviewer.plot_org.Pages; [messgStr,viewerpanelIndex] = f_check_erpviewerpanelchanges(); if ~isempty(messgStr) @@ -339,10 +318,9 @@ function page_edit(Source,~) Pagecurrent = str2num(Source.String); if ~isempty(Pagecurrent) && Pagecurrent>0 - - ERPArray = ERPwaviewer.SelectERPIdx; - chanArray =ERPwaviewer.chan; - binArray = ERPwaviewer.bin; + ERPArray = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; + chanArray =gui_erp_waviewer.ERPwaviewer.chan; + binArray = gui_erp_waviewer.ERPwaviewer.bin; if pagesValue==1 pageNum = numel(chanArray); elseif pagesValue==2 @@ -352,14 +330,12 @@ function page_edit(Source,~) end if Pagecurrent<=pageNum - ERPwaviewer.PageIndex = Pagecurrent; + gui_erp_waviewer.ERPwaviewer.PageIndex = Pagecurrent; if pagesValue==3 - ERPwaviewer.ERP = ERPwaviewer.ALLERP(ERPArray(Pagecurrent)); - ERPwaviewer.CURRENTERP =ERPArray(Pagecurrent); + gui_erp_waviewer.ERPwaviewer.ERP = gui_erp_waviewer.ERPwaviewer.ALLERP(ERPArray(Pagecurrent)); + gui_erp_waviewer.ERPwaviewer.CURRENTERP =ERPArray(Pagecurrent); end - assignin('base','ALLERPwaviewer',ERPwaviewer); - viewer_ERPDAT.page_xyaxis = viewer_ERPDAT.page_xyaxis+1; - f_redrawERP_viewer_test();%%replot the waves + viewer_ERPDAT.Count_currentERP=1; end end @@ -368,24 +344,17 @@ function page_edit(Source,~) %------------------Display the waveform for proir ERPset-------------------- function page_minus(~,~) global viewer_ERPDAT - +global gui_erp_waviewer; [messgStr,viewerpanelIndex] = f_check_erpviewerpanelchanges(); if ~isempty(messgStr) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end -try - ERPwaviewer_CHANGE = evalin('base','ALLERPwaviewer'); -catch - beep; - disp('Please re-run ERP wave viewer.'); - return; -end -ERPwaviewer_CHANGE.PageIndex = ERPwaviewer_CHANGE.PageIndex-1; -pagesValue = ERPwaviewer_CHANGE.plot_org.Pages; -ERPArray = ERPwaviewer_CHANGE.SelectERPIdx; -chanArray =ERPwaviewer_CHANGE.chan; -binArray = ERPwaviewer_CHANGE.bin; +gui_erp_waviewer.ERPwaviewer.PageIndex = gui_erp_waviewer.ERPwaviewer.PageIndex-1; +pagesValue = gui_erp_waviewer.ERPwaviewer.plot_org.Pages; +ERPArray = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; +chanArray =gui_erp_waviewer.ERPwaviewer.chan; +binArray = gui_erp_waviewer.ERPwaviewer.bin; if pagesValue==1 pageNum = numel(chanArray); elseif pagesValue==2 @@ -393,19 +362,18 @@ function page_minus(~,~) else pageNum = numel(ERPArray); end -Pagecurrent = ERPwaviewer_CHANGE.PageIndex; -if ERPwaviewer_CHANGE.PageIndex<= pageNum && ERPwaviewer_CHANGE.PageIndex>0 +Pagecurrent = gui_erp_waviewer.ERPwaviewer.PageIndex; +if gui_erp_waviewer.ERPwaviewer.PageIndex<= pageNum && gui_erp_waviewer.ERPwaviewer.PageIndex>0 if pagesValue==3 - ERPwaviewer_CHANGE.ERP = ERPwaviewer_CHANGE.ALLERP(ERPArray(Pagecurrent)); - ERPwaviewer_CHANGE.CURRENTERP =ERPArray(Pagecurrent); + gui_erp_waviewer.ERPwaviewer.ERP = gui_erp_waviewer.ERPwaviewer.ALLERP(ERPArray(Pagecurrent)); + gui_erp_waviewer.ERPwaviewer.CURRENTERP =ERPArray(Pagecurrent); end - assignin('base','ALLERPwaviewer',ERPwaviewer_CHANGE); - MessageViewer= char(strcat('Plot prior page (<)')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); - viewer_ERPDAT.page_xyaxis = viewer_ERPDAT.page_xyaxis+1;%%change X/Y axis based on the changed pages + MessageViewer= char(strcat('Plot previous page')); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); + viewer_ERPDAT.Process_messg =1; - f_redrawERP_viewer_test(); + viewer_ERPDAT.Count_currentERP=1; viewer_ERPDAT.Process_messg =2; else return; @@ -416,23 +384,17 @@ function page_minus(~,~) %------------------Display the waveform for next ERPset-------------------- function page_plus(~,~) global viewer_ERPDAT +global gui_erp_waviewer; [messgStr,viewerpanelIndex] = f_check_erpviewerpanelchanges(); if ~isempty(messgStr) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end -try - ERPwaviewer_CHANGE = evalin('base','ALLERPwaviewer'); -catch - beep; - disp('Please re-run ERP wave viewer.'); - return; -end -ERPwaviewer_CHANGE.PageIndex = ERPwaviewer_CHANGE.PageIndex+1; -pagesValue = ERPwaviewer_CHANGE.plot_org.Pages; -ERPArray = ERPwaviewer_CHANGE.SelectERPIdx; -chanArray =ERPwaviewer_CHANGE.chan; -binArray = ERPwaviewer_CHANGE.bin; +gui_erp_waviewer.ERPwaviewer.PageIndex = gui_erp_waviewer.ERPwaviewer.PageIndex+1; +pagesValue = gui_erp_waviewer.ERPwaviewer.plot_org.Pages; +ERPArray = gui_erp_waviewer.ERPwaviewer.SelectERPIdx; +chanArray =gui_erp_waviewer.ERPwaviewer.chan; +binArray = gui_erp_waviewer.ERPwaviewer.bin; if pagesValue==1 pageNum = numel(chanArray); elseif pagesValue==2 @@ -440,18 +402,16 @@ function page_plus(~,~) else pageNum = numel(ERPArray); end -Pagecurrent = ERPwaviewer_CHANGE.PageIndex; -if ERPwaviewer_CHANGE.PageIndex<= pageNum && ERPwaviewer_CHANGE.PageIndex>0%% within the page range +Pagecurrent = gui_erp_waviewer.ERPwaviewer.PageIndex; +if gui_erp_waviewer.ERPwaviewer.PageIndex<= pageNum && gui_erp_waviewer.ERPwaviewer.PageIndex>0%% within the page range if pagesValue==3 - ERPwaviewer_CHANGE.ERP = ERPwaviewer_CHANGE.ALLERP(ERPArray(Pagecurrent)); - ERPwaviewer_CHANGE.CURRENTERP =ERPArray(Pagecurrent); + gui_erp_waviewer.ERPwaviewer.ERP = gui_erp_waviewer.ERPwaviewer.ALLERP(ERPArray(Pagecurrent)); + gui_erp_waviewer.ERPwaviewer.CURRENTERP =ERPArray(Pagecurrent); end - assignin('base','ALLERPwaviewer',ERPwaviewer_CHANGE); - viewer_ERPDAT.page_xyaxis = viewer_ERPDAT.page_xyaxis+1;%%change X/Y axis based on the changed pages - MessageViewer= char(strcat('Plot next page (>)')); - erpworkingmemory('ERPViewer_proces_messg',MessageViewer); + MessageViewer= char(strcat('Plot next page')); + estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); viewer_ERPDAT.Process_messg =1; - f_redrawERP_viewer_test(); + viewer_ERPDAT.Count_currentERP=1; viewer_ERPDAT.Process_messg =2; else return; @@ -471,7 +431,7 @@ function Show_command(~,~) ViewerName = char('My Viewer'); end MessageViewer= char(strcat('Show Command')); -erpworkingmemory('ERPViewer_proces_messg',MessageViewer); +estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); try viewer_ERPDAT.Process_messg =1; OutputViewerpar = f_preparms_erpwaviewer(ViewerName,'command'); @@ -493,16 +453,14 @@ function figure_saveas(~,~) viewer_ERPDAT.count_twopanels = viewer_ERPDAT.count_twopanels +1; end - MessageViewer= char(strcat('Save Figure As')); -erpworkingmemory('ERPViewer_proces_messg',MessageViewer); +estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); pathstr = pwd; namedef ='Myviewer.pdf'; [erpfilename, erppathname, indxs] = uiputfile({'*.pdf';'*.svg';'*.jpg';'*.png';'*.tif';'*.bmp';'*.eps'},... 'Save as',[fullfile(pathstr,namedef)]); - if isequal(erpfilename,0) beep; viewer_ERPDAT.Process_messg =3; @@ -543,7 +501,7 @@ function figure_out(~,~) ViewerName = char('My Viewer'); end MessageViewer= char(strcat('Create Static/Exportable Plot')); -erpworkingmemory('ERPViewer_proces_messg',MessageViewer); +estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); try viewer_ERPDAT.Process_messg =1; OutputViewerpar = f_preparms_erpwaviewer(ViewerName,'script'); @@ -565,19 +523,19 @@ function zoomin(~,~) end zoomSpace = estudioworkingmemory('zoomSpace'); if isempty(zoomSpace) - estudioworkingmemory('zoomSpace',0) + estudioworkingmemory('zoomSpace',100) else - if zoomSpace<0 - zoomSpace = 0; + if zoomSpace<100 + zoomSpace = 100; end - zoomSpace =zoomSpace+10; + zoomSpace =zoomSpace+50; estudioworkingmemory('zoomSpace',zoomSpace) ; end MessageViewer= char(strcat('Zoom In')); -erpworkingmemory('ERPViewer_proces_messg',MessageViewer); +estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); try viewer_ERPDAT.Process_messg =1; - f_redrawERP_viewer_test(); + viewer_ERPDAT.Count_currentERP=1; viewer_ERPDAT.Process_messg =2; catch viewer_ERPDAT.Process_messg =3; @@ -594,7 +552,7 @@ function Panel_Reset(~,~) estudioworkingmemory('MERPWaveViewer_others',[]); MessageViewer= char(strcat('Reset')); -erpworkingmemory('ERPViewer_proces_messg',MessageViewer); +estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); try viewer_ERPDAT.Process_messg =1; @@ -608,7 +566,7 @@ function Panel_Reset(~,~) %%Reset the window size and position new_pos = [0.01,0.01,75,75]; -erpworkingmemory('ERPWaveScreenPos',new_pos); +estudioworkingmemory('ERPWaveScreenPos',new_pos); try ScreenPos = get( groot, 'Screensize' ); catch @@ -621,8 +579,6 @@ function Panel_Reset(~,~) end - - function zoomedit(Source,~) global viewer_ERPDAT; @@ -633,8 +589,8 @@ function zoomedit(Source,~) zoomspaceEdit = str2num(Source.String); MessageViewer= char(strcat('Zoom Editor')); -erpworkingmemory('ERPViewer_proces_messg',MessageViewer); -if ~isempty(zoomspaceEdit) && numel(zoomspaceEdit)==1 && zoomspaceEdit>=0 +estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); +if ~isempty(zoomspaceEdit) && numel(zoomspaceEdit)==1 && zoomspaceEdit>=100 estudioworkingmemory('zoomSpace',zoomspaceEdit); try viewer_ERPDAT.Process_messg =1; @@ -656,13 +612,12 @@ function zoomedit(Source,~) viewer_ERPDAT.Process_messg =3; return; end - if zoomspaceEdit<0 - fprintf(2,['\n Zoom Editor:The input must be a positive number','.\n']); + if zoomspaceEdit<100 + fprintf(2,['\n Zoom Editor:The input must not be smaller than 100','.\n']); viewer_ERPDAT.Process_messg =3; return; end end - end %%----------------Zoom out------------------------------------------------- @@ -676,16 +631,16 @@ function zoomout(~,~) zoomSpace = estudioworkingmemory('zoomSpace'); if isempty(zoomSpace) - estudioworkingmemory('zoomSpace',0) + estudioworkingmemory('zoomSpace',100) else - zoomSpace =zoomSpace-10; - if zoomSpace <0 - zoomSpace =0; + zoomSpace =zoomSpace-50; + if zoomSpace <100 + zoomSpace =100; end estudioworkingmemory('zoomSpace',zoomSpace) ; end MessageViewer= char(strcat('Zoom Out')); -erpworkingmemory('ERPViewer_proces_messg',MessageViewer); +estudioworkingmemory('ERPViewer_proces_messg',MessageViewer); try viewer_ERPDAT.Process_messg =1; f_redrawERP_viewer_test(); @@ -710,7 +665,7 @@ function V_messg_change(~,~) end gui_erp_waviewer.Process_messg.BackgroundColor = [0.95 0.95 0.95]; gui_erp_waviewer.Process_messg.FontSize = FonsizeDefault; -Processed_Method=erpworkingmemory('ERPViewer_proces_messg'); +Processed_Method=estudioworkingmemory('ERPViewer_proces_messg'); if viewer_ERPDAT.Process_messg ==1 gui_erp_waviewer.Process_messg.String = strcat('1- ',Processed_Method,': Running....'); gui_erp_waviewer.Process_messg.ForegroundColor = [0 0 0]; @@ -720,7 +675,7 @@ function V_messg_change(~,~) elseif viewer_ERPDAT.Process_messg ==3 if ~strcmp(gui_erp_waviewer.Process_messg.String,strcat('3- ',Processed_Method,': Error (see Command Window)')) - fprintf([Processed_Method,32,32,32,datestr(datetime('now')),'\n.']); + fprintf([Processed_Method,32,32,32,datestr(datetime('now')),'\n.']); end gui_erp_waviewer.Process_messg.String = strcat('3- ',Processed_Method,': Error (see Command Window)'); gui_erp_waviewer.Process_messg.ForegroundColor = [1 0 0]; @@ -733,7 +688,7 @@ function V_messg_change(~,~) pause(0.5); gui_erp_waviewer.Process_messg.ForegroundColor = [1 0.65 0]; end -if viewer_ERPDAT.Process_messg ==1 || viewer_ERPDAT.Process_messg==2 || viewer_ERPDAT.Process_messg==3 +if viewer_ERPDAT.Process_messg ==1 || viewer_ERPDAT.Process_messg==2 %|| viewer_ERPDAT.Process_messg==3 pause(0.01); gui_erp_waviewer.Process_messg.String = ''; gui_erp_waviewer.Process_messg.BackgroundColor = ColorBviewer_def;%[0.95 0.95 0.95]; @@ -746,7 +701,7 @@ function V_messg_change(~,~) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function f_plotviewerwave(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray,qGridposArray,plotBox,qBlc,qLineColorspec,qLineStylespec,qLineMarkerspec,qLineWidthspec,... qLegendName,qLegendFont,qLegendFontsize,qCBELabels,qLabelfont,qLabelfontsize,qPolarityWave,qSEM,qTransparency,qGridspace,qtimeRange,qXticks,qXticklabel,... - qXlabelfont,qXlabelfontsize,qXlabelcolor,qMinorTicksX,qXunits,qYScales,qYticks,qYticklabel,qYlabelfont,qYlabelfontsize,qYlabelcolor,qYunits,qMinorTicksY,qplotArrayStr,... + qXlabelfont,qXlabelfontsize,qXlabelcolor,qMinorTicksX,qXunits,qYScales,qYticks,qYticklabel,qYlabelfont,qYlabelfontsize,qYlabelcolor,qYunits,qMinorTicksY,qlabelsName,... ERPsetArray,qlegcolor,qlegcolumns,qlabelcolor,qytickprecision,qxtickprecision,qxdisFlag,myerpviewer,myerpviewerlegend) hbig = myerpviewer; @@ -765,10 +720,9 @@ function f_plotviewerwave(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray,qGr if max(ERPsetArray)>length(ALLERP) ERPsetArray=length(ALLERP); end - -[chanStrdef,binStrdef] = f_geterpschanbin(ALLERP,[1:length(ALLERP)]); qERPArray = ERPsetArray; +[chanStrdef,binStrdef,diff_mark,chanStremp,binStremp] = f_geterpschanbin(ALLERP,ERPsetArray); if nargin<5 qchanArray = 1:length(chanStrdef); @@ -845,17 +799,23 @@ function f_plotviewerwave(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray,qGr if isempty(qPLOTORG) || numel(qPLOTORG)~=3 || numel(unique(qPLOTORG)) ~=3 || min(qPLOTORG)<0 || max(qPLOTORG)>3 qPLOTORG = [1 2 3]; end - +LegenddispFlag = 1; if qPLOTORG(2) ==1 %% if the selected Channel is "Grid" OverlayArraydef = qchanArray; for Numofchan = 1:numel(qchanArray) LegendNamedef{Numofchan,1} =char(chanStrdef(qchanArray(Numofchan))); end + if diff_mark(1)==1 + LegenddispFlag =0; + end elseif qPLOTORG(2) == 2 %% if the selected Bin is "Grid" OverlayArraydef = qbinArray; for Numofbin = 1:numel(qbinArray) LegendNamedef{Numofbin,1} = char(binStrdef(qbinArray(Numofbin))); end + if diff_mark(2)==1 + LegenddispFlag =0; + end elseif qPLOTORG(2) == 3%% if the selected ERPset is "Grid" OverlayArraydef = qERPArray; for Numoferpset = 1:numel(qERPArray) @@ -870,6 +830,9 @@ function f_plotviewerwave(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray,qGr for Numofbin = 1:numel(qbinArray) LegendNamedef{Numofbin,1} = char(binStr(qbinArray(Numofbin))); end + if diff_mark(2)==1 + LegenddispFlag =0; + end end LineColordef = [0 0 0;1 0 0;0 0 1;0 1 0;1,0.65 0;0 1 1;1 0 1;0.5 0.5 0.5;0.94 0.50 0.50;0 0.75 1;0.57 0.93 0.57;1 0.55 0;1 0.75 0.80;1 0.84 0];%% get from:https://htmlcolorcodes.com/color-names/ @@ -883,18 +846,18 @@ function f_plotviewerwave(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray,qGr plotArray = qchanArray; for Numofchan = 1:numel(plotArray) try - plotArrayStrdef{Numofchan} = chanStrdef{plotArray(Numofchan)}; + plotArrayStrdef{Numofchan} = chanStremp{plotArray(Numofchan)}; catch - plotArrayStrdef{Numofchan} = 'no'; + plotArrayStrdef{Numofchan} = ''; end end elseif qPLOTORG(1) == 2 %% if the selected Bin is "Grid" plotArray = qbinArray; for Numofbin = 1:numel(plotArray) try - plotArrayStrdef{Numofbin} = binStrdef{plotArray(Numofbin)}; + plotArrayStrdef{Numofbin} = binStremp{plotArray(Numofbin)}; catch - plotArrayStrdef{Numofbin} = 'no'; + plotArrayStrdef{Numofbin} = ''; end end elseif qPLOTORG(1) == 3%% if the selected ERPset is "Grid" @@ -903,16 +866,16 @@ function f_plotviewerwave(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray,qGr try plotArrayStrdef{Numoferp} = ALLERP(plotArray(Numoferp)).erpname; catch - plotArrayStrdef{Numoferp} = 'no'; + plotArrayStrdef{Numoferp} = ''; end end else plotArray = qchanArray; for Numofchan = 1:numel(chanArray) try - plotArrayStrdef{Numofchan} = chanStrdef{plotArray(Numofchan)}; + plotArrayStrdef{Numofchan} = chanStremp{plotArray(Numofchan)}; catch - plotArrayStrdef{Numofchan} = 'no'; + plotArrayStrdef{Numofchan} = ''; end end end @@ -957,8 +920,8 @@ function f_plotviewerwave(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray,qGr qlegcolor=1; end -if nargin <39 || isempty(qplotArrayStr) - qplotArrayStr = plotArrayStrdef; +if nargin <39 || isempty(qlabelsName) + qlabelsName = plotArrayStrdef; end @@ -1304,11 +1267,17 @@ function f_plotviewerwave(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray,qGr if ~strcmpi(qBlc,'no') && ~strcmpi(qBlc,'none')%% when the baseline correction is "pre","post","whole" if strcmpi(qBlc,'pre') - indxtimelock = find(ERP.times==0) ; % zero-time locked + [xxx, indxtimelock, latdiffms] = closest(ERP.times,0);% zero-time locked + if isempty(indxtimelock) + indxtimelock=1; + end aa = 1; elseif strcmpi(qBlc,'post') indxtimelock = length(ERP.times); - aa = find(ERP.times==0); + [xxx, aa, latdiffms] = closest(ERP.times,0);% zero-time locked + if isempty(aa) + aa=length(ERP.times);%%ned to further confirm + end elseif strcmpi(qBlc,'all') || strcmpi(qBlc,'whole') indxtimelock = length(ERP.times); aa = 1; @@ -1602,7 +1571,7 @@ function f_plotviewerwave(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray,qGr end %%Get the figure name which is to be plotted -if (qPLOTORG(1)==1 && qPLOTORG(2)==2) || (qPLOTORG(1)==1 && qPLOTORG(2)==2) %% Page is ERPset +if (qPLOTORG(1)==1 && qPLOTORG(2)==2) || (qPLOTORG(1)==2 && qPLOTORG(2)==1) %% Page is ERPset ERP = ALLERPBls(qCURRENTPLOT); if isempty(ERP.filename) || strcmp(ERP.filename,'') ERP.filename = 'still_not_saved!'; @@ -1657,9 +1626,12 @@ function f_plotviewerwave(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray,qGr plotdatalabel = qGridposArray(Numofrows,Numofcolumns); try - labelcbe = qplotArrayStr{plotdatalabel}; + labelcbe = qlabelsName{plotdatalabel}; + if isempty(labelcbe) + labelcbe = 'Label varies across ERPsets'; + end catch - labelcbe = 'no'; + labelcbe = ''; end try plotbindata = bindata(plotdatalabel,:,:,:); @@ -2018,28 +1990,39 @@ function f_plotviewerwave(ALLERP,qCURRENTPLOT, qPLOTORG,qbinArray,qchanArray,qGr %%------------------------------legend name------------------------------%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% try - for Numofoverlay = 1:numel(hplot) - qLegendName1 = strrep(qLegendName{Numofoverlay},'_','\_'); - % qLegendName1 = qLegendName{Numofoverlay}; - LegendName{Numofoverlay} = char(strcat('\color[rgb]{',num2str(qLineColorspec(Numofoverlay,:)),'}',qLegendName1)); - end - p = get(myerpviewerlegend,'position'); - if qlegcolor ~=1 - try - h_legend = legend(myerpviewerlegend, hplot,LegendName);%,'interpreter','none' - catch + if LegenddispFlag==1 + for Numofoverlay = 1:numel(hplot) + qLegendName1 = strrep(qLegendName{Numofoverlay},'_','\_'); + % qLegendName1 = qLegendName{Numofoverlay}; + LegendName{Numofoverlay} = char(strcat('\color[rgb]{',num2str(qLineColorspec(Numofoverlay,:)),'}',qLegendName1)); + end + p = get(myerpviewerlegend,'position'); + if qlegcolor ~=1 + try + h_legend = legend(myerpviewerlegend, hplot,LegendName);%,'interpreter','none' + catch + h_legend = legend(myerpviewerlegend, hplot,qLegendName,'interpreter','none'); + end + else h_legend = legend(myerpviewerlegend, hplot,qLegendName,'interpreter','none'); end + set(h_legend,'FontSize',qLegendFontsize);%% legend name fontsize + set(h_legend, 'position', p); + set(h_legend,'FontName',qLegendFont);%%legend name font + set(h_legend,'NumColumns',qlegcolumns); + + legend(myerpviewerlegend,'boxoff'); + set(myerpviewerlegend, 'XTick', [], 'YTick', [],'Box','off', 'Color','none','xcolor','none','ycolor','none'); else - h_legend = legend(myerpviewerlegend, hplot,qLegendName,'interpreter','none'); + if qPLOTORG(2) ==1 + legendstr = char('The channel labels are not the same across the selected ERPsets, so no channel labels are shown.; If you want to see the channel labels, please select only one ERPset (or multiple ERPsets with matching channel labels).'); + else + legendstr = char('The bin labels are not the same across the selected ERPsets, so no bin labels are shown.; If you want to see the bin labels, please select only one ERPset (or multiple ERPsets with matching bin labels).'); + end + legendstr = regexp(legendstr, '\;', 'split'); + text(myerpviewerlegend,0.5,0.8,legendstr ,... + 'FontSize',qLabelfontsize+2,'HorizontalAlignment', 'center', 'Color', [1 0 0]);%'FontWeight', 'bold', end - set(h_legend,'FontSize',qLegendFontsize);%% legend name fontsize - set(h_legend, 'position', p); - set(h_legend,'FontName',qLegendFont);%%legend name font - set(h_legend,'NumColumns',qlegcolumns); - - legend(myerpviewerlegend,'boxoff'); - set(myerpviewerlegend, 'XTick', [], 'YTick', [],'Box','off', 'Color','none','xcolor','none','ycolor','none'); catch end diff --git a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_setdiffstr.m b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/f_setdiffstr.m old mode 100644 new mode 100755 diff --git a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/pop_plotERPwaviewer.m b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/pop_plotERPwaviewer.m index c0b26f0d..f6795da4 100755 --- a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/pop_plotERPwaviewer.m +++ b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/pop_plotERPwaviewer.m @@ -65,7 +65,7 @@ %Yticks - y ticks e.g., [-6 -3 0 5 10] %Yticklabel -display yticklabels? 1 is on and 0 is off. %Ylabelfont -font for yticklabels e.g., 'Courier' -%Ylabelfontsize -fontsize for yticklabels +%Ylabelfontsize -fontsize for yticklabels e.g., 12 %Ylabelcolor -color (RGB) for yticks and yticklabels e.g., [0 0 0] %Yunits -display units for x axes. "on" or "off" %MinorTicksY - @@ -541,7 +541,7 @@ end % qERPArray = [1:length(ALLERP)]; -[chanStrdef,binStrdef] = f_geterpschanbin(ALLERP,qERPsetArray);%%get the bin strings and channel strings across the selected ERPsets +[chanStrdef,binStrdef,diff_mark,chanStremp,binStremp] = f_geterpschanbin(ALLERP,qERPsetArray);%%get the bin strings and channel strings across the selected ERPsets [ERPdatadef,legendNamedef,ERPerrordatadef,timeRangedef] = f_geterpdata(ALLERP,qERPsetArray,qPLOTORG,CURRENTPLOT); if min(qbinArray)<0 || min(qbinArray)==0 @@ -588,7 +588,7 @@ plotArray = qchanArray; for Numofchan = 1:numel(chanArray) try - LabelsNamedef{Numofchan} = chanStrdef{plotArray(Numofchan)}; + LabelsNamedef{Numofchan} = chanStremp{plotArray(Numofchan)}; catch LabelsNamedef{Numofchan} = 'none'; end @@ -597,9 +597,9 @@ plotArray = qbinArray; for Numofbin = 1:numel(plotArray) try - LabelsNamedef{Numofbin} = binStrdef{plotArray(Numofbin)}; + LabelsNamedef{Numofbin} = binStremp{plotArray(Numofbin)}; catch - LabelsNamedef{Numofbin} = 'none'; + LabelsNamedef{Numofbin} = ''; end end elseif qPLOTORG(1) == 3%% if the selected ERPset is "Grid" @@ -608,16 +608,16 @@ try LabelsNamedef{Numoferp} = ALLERP(plotArray(Numoferp)).erpname; catch - LabelsNamedef{Numoferp} = 'none'; + LabelsNamedef{Numoferp} = ''; end end else plotArray = qchanArray; for Numofchan = 1:numel(chanArray) try - LabelsNamedef{Numofchan} = chanStrdef{plotArray(Numofchan)}; + LabelsNamedef{Numofchan} = chanStremp{plotArray(Numofchan)}; catch - LabelsNamedef{Numofchan} = 'none'; + LabelsNamedef{Numofchan} = ''; end end end @@ -1119,6 +1119,9 @@ fn2res = p.Results.(fn2com); % input value if ~isempty(fn2res) if ischar(fn2res) + if strcmpi(fn2com,'History') && strcmpi(fn2res,'command') + fn2res = 'gui'; + end if ~strcmpi(fn2res,'off') erpcom = sprintf( '%s, ''%s'', ''%s''', erpcom, fn2com, fn2res); end @@ -1168,10 +1171,10 @@ ALLERP(i) = erphistory(ALLERP(i), [], erpcom, 1); end case 3 - % implicit + % implicit case 4 displayEquiComERP(erpcom); - + otherwise %off or none erpcom = ''; return diff --git a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/v_ERPDAT.m b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/v_ERPDAT.m index 8a74fbef..7e9ccae6 100755 --- a/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/v_ERPDAT.m +++ b/studio_functions/Functions/EStudio/ERP Tab/ERP wave viewer/v_ERPDAT.m @@ -7,8 +7,6 @@ ERP_chan ERP_bin Count_currentERP - count_legend - page_xyaxis Process_messg loadproper_count count_twopanels @@ -24,8 +22,6 @@ ERP_chan_change ERP_bin_change v_currentERP_change - legend_change - page_xyaxis_change v_messg_change loadproper_change count_twopanels_change @@ -82,20 +78,6 @@ notify(obj,'v_currentERP_change'); end - %%m8 - %capture the changes of legend - function set.count_legend(obj,value) - obj.count_legend = value; - notify(obj,'legend_change'); - end - - %%m9 - %Modify x/y axis based on the changed pages - function set.page_xyaxis(obj,value) - obj.page_xyaxis = value; - notify(obj,'page_xyaxis_change'); - end - %%%m10 %Modified bins of the selected ERP function set.Process_messg(obj,value) diff --git a/studio_functions/Functions/EStudio/ERP Tab/ERPLAB_ERP_Tab.m b/studio_functions/Functions/EStudio/ERP Tab/EStudio_ERP_Tab.m old mode 100644 new mode 100755 similarity index 64% rename from studio_functions/Functions/EStudio/ERP Tab/ERPLAB_ERP_Tab.m rename to studio_functions/Functions/EStudio/ERP Tab/EStudio_ERP_Tab.m index 0e98624d..6c1a118c --- a/studio_functions/Functions/EStudio/ERP Tab/ERPLAB_ERP_Tab.m +++ b/studio_functions/Functions/EStudio/ERP Tab/EStudio_ERP_Tab.m @@ -9,10 +9,7 @@ -function EStudio_gui_erp_totl = ERPLAB_ERP_Tab(EStudio_gui_erp_totl,ColorB_def) -% global observe_ERPDAT; -% global viewer_ERPDAT; -% global EStudio_gui_erp_totl; +function EStudio_gui_erp_totl = EStudio_ERP_Tab(EStudio_gui_erp_totl,ColorB_def) if isempty(ColorB_def) ColorB_def = [0.7020 0.77 0.85]; @@ -25,59 +22,62 @@ EStudio_gui_erp_totl.panelscroll = uix.ScrollingPanel('Parent', EStudio_gui_erp_totl.tabERP); set(EStudio_gui_erp_totl.panelscroll,'BackgroundColor',ColorB_def); -% + Adjust the main layout set( EStudio_gui_erp_totl.tabERP, 'Widths', [-4, 300]); % Viewpanel and settings panel EStudio_gui_erp_totl.panel_fonts = f_get_default_fontsize(); - EStudio_gui_erp_totl.settingLayout = uiextras.VBox('Parent', EStudio_gui_erp_totl.panelscroll,'BackgroundColor',ColorB_def); % + Create the settings window panels for ERP panel EStudio_gui_erp_totl.panel{1} = f_ERP_erpsetsGUI(EStudio_gui_erp_totl.settingLayout,EStudio_gui_erp_totl.panel_fonts); -EStudio_gui_erp_totl.panelSizes(1) = 280; +EStudio_gui_erp_totl.panelSizes(1) = 290; EStudio_gui_erp_totl.panel{2} = f_ERP_bin_channel_GUI(EStudio_gui_erp_totl.settingLayout,EStudio_gui_erp_totl.panel_fonts); -EStudio_gui_erp_totl.panelSizes(2) = 250; +EStudio_gui_erp_totl.panelSizes(2) = 320; EStudio_gui_erp_totl.panel{3} = f_ERP_plot_setting_GUI(EStudio_gui_erp_totl.settingLayout,EStudio_gui_erp_totl.panel_fonts); -EStudio_gui_erp_totl.panelSizes(3) = 230; - +EStudio_gui_erp_totl.panelSizes(3) = 390; EStudio_gui_erp_totl.panel{4} = f_ERP_plot_scalp_GUI(EStudio_gui_erp_totl.settingLayout,EStudio_gui_erp_totl.panel_fonts); -EStudio_gui_erp_totl.panelSizes(4) = 365; - -EStudio_gui_erp_totl.panel{5} = f_ERP_baselinecorr_detrend_GUI(EStudio_gui_erp_totl.settingLayout,EStudio_gui_erp_totl.panel_fonts); -EStudio_gui_erp_totl.panelSizes(5) = 220; -EStudio_gui_erp_totl.panel{6} = f_ERP_filtering_GUI(EStudio_gui_erp_totl.settingLayout,EStudio_gui_erp_totl.panel_fonts); -EStudio_gui_erp_totl.panelSizes(6) = 245; - -EStudio_gui_erp_totl.panel{7} = f_ERP_chanoperation_GUI(EStudio_gui_erp_totl.settingLayout,EStudio_gui_erp_totl.panel_fonts); -EStudio_gui_erp_totl.panelSizes(7) = 350; - -EStudio_gui_erp_totl.panel{8} = f_ERP_binoperation_GUI(EStudio_gui_erp_totl.settingLayout,EStudio_gui_erp_totl.panel_fonts); -EStudio_gui_erp_totl.panelSizes(8) = 310; - -EStudio_gui_erp_totl.panel{9} = f_ERP_CSD_GUI(EStudio_gui_erp_totl.settingLayout,EStudio_gui_erp_totl.panel_fonts); -EStudio_gui_erp_totl.panelSizes(9) = 450; - -EStudio_gui_erp_totl.panel{10} = f_ERP_spectral_GUI(EStudio_gui_erp_totl.settingLayout,EStudio_gui_erp_totl.panel_fonts); -EStudio_gui_erp_totl.panelSizes(10) = 125; -EStudio_gui_erp_totl.panel{11} = f_ERP_measurement_GUI(EStudio_gui_erp_totl.settingLayout,EStudio_gui_erp_totl.panel_fonts); -EStudio_gui_erp_totl.panelSizes(11) = 240; +EStudio_gui_erp_totl.panelSizes(4) = 390; +disp('ERP Tab: Launching ERPsets, Bin & Channel Selection, Plot Settings, Plot Scalp Maps,...'); +EStudio_gui_erp_totl.panel{5} = f_ERP_edit_channel_GUI(EStudio_gui_erp_totl.settingLayout,EStudio_gui_erp_totl.panel_fonts); +EStudio_gui_erp_totl.panelSizes(5) = 170; +EStudio_gui_erp_totl.panel{6} = f_ERP_chanoperation_GUI(EStudio_gui_erp_totl.settingLayout,EStudio_gui_erp_totl.panel_fonts); +EStudio_gui_erp_totl.panelSizes(6) = 330; +EStudio_gui_erp_totl.panel{7} = f_erp_informtion_GUI(EStudio_gui_erp_totl.settingLayout,EStudio_gui_erp_totl.panel_fonts); +EStudio_gui_erp_totl.panelSizes(7) = 410; +EStudio_gui_erp_totl.panel{8} = f_ERP_resample_GUI(EStudio_gui_erp_totl.settingLayout,EStudio_gui_erp_totl.panel_fonts); +EStudio_gui_erp_totl.panelSizes(8) = 190; +disp([32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,... + 'Edit/Delete Channels & Locations, Channel Operation, ERP & Bin Information, Sampling Rate & Epoch,...']); +EStudio_gui_erp_totl.panel{9} = f_ERP_binoperation_GUI(EStudio_gui_erp_totl.settingLayout,EStudio_gui_erp_totl.panel_fonts); +EStudio_gui_erp_totl.panelSizes(9) = 310; +EStudio_gui_erp_totl.panel{10} = f_ERP_filtering_GUI(EStudio_gui_erp_totl.settingLayout,EStudio_gui_erp_totl.panel_fonts); +EStudio_gui_erp_totl.panelSizes(10) = 230; +EStudio_gui_erp_totl.panel{11} = f_ERP_baselinecorr_detrend_GUI(EStudio_gui_erp_totl.settingLayout,EStudio_gui_erp_totl.panel_fonts); +EStudio_gui_erp_totl.panelSizes(11) = 220; EStudio_gui_erp_totl.panel{12} = f_ERP_grandaverageGUI(EStudio_gui_erp_totl.settingLayout,EStudio_gui_erp_totl.panel_fonts); EStudio_gui_erp_totl.panelSizes(12) = 260; - +disp([32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,... + 'Bin Operations, Filtering, Baseline Correction & Linear Detrend, Average Across ERPsets (Grand Average),...']); EStudio_gui_erp_totl.panel{13} = f_ERP_append_GUI(EStudio_gui_erp_totl.settingLayout,EStudio_gui_erp_totl.panel_fonts); EStudio_gui_erp_totl.panelSizes(13) = 120; - -EStudio_gui_erp_totl.panel{14} = f_ERP_history_GUI(EStudio_gui_erp_totl.settingLayout,EStudio_gui_erp_totl.panel_fonts); -EStudio_gui_erp_totl.panelSizes(14) = 250; -EStudio_gui_erp_totl.panel{15} = f_erp_informtion_GUI(EStudio_gui_erp_totl.settingLayout,EStudio_gui_erp_totl.panel_fonts); -EStudio_gui_erp_totl.panelSizes(15) = 170; +EStudio_gui_erp_totl.panel{14} = f_ERP_measurement_GUI(EStudio_gui_erp_totl.settingLayout,EStudio_gui_erp_totl.panel_fonts); +EStudio_gui_erp_totl.panelSizes(14) = 230; +EStudio_gui_erp_totl.panel{15} = f_ERP_events_GUI(EStudio_gui_erp_totl.settingLayout,EStudio_gui_erp_totl.panel_fonts); +EStudio_gui_erp_totl.panelSizes(15) = 100; EStudio_gui_erp_totl.panel{16} = f_erp_dataquality_SME_GUI(EStudio_gui_erp_totl.settingLayout,EStudio_gui_erp_totl.panel_fonts); -EStudio_gui_erp_totl.panelSizes(16) = 160; - -EStudio_gui_erp_totl.panel{17} = f_ERP_simulation_panel(EStudio_gui_erp_totl.settingLayout,EStudio_gui_erp_totl.panel_fonts); -EStudio_gui_erp_totl.panelSizes(17) = 820; - +EStudio_gui_erp_totl.panelSizes(16) = 220; +disp([32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,... + 'Append ERPsets, Measurement Tool, EventList, View Data Quality Metrics,...']); +EStudio_gui_erp_totl.panel{17} = f_ERP_CSD_GUI(EStudio_gui_erp_totl.settingLayout,EStudio_gui_erp_totl.panel_fonts); +EStudio_gui_erp_totl.panelSizes(17) = 190; +EStudio_gui_erp_totl.panel{18} = f_ERP_spectral_GUI(EStudio_gui_erp_totl.settingLayout,EStudio_gui_erp_totl.panel_fonts); +EStudio_gui_erp_totl.panelSizes(18) = 160; +EStudio_gui_erp_totl.panel{19} = f_ERP_simulation_panel(EStudio_gui_erp_totl.settingLayout,EStudio_gui_erp_totl.panel_fonts); +EStudio_gui_erp_totl.panelSizes(19) = 820; +EStudio_gui_erp_totl.panel{20} = f_ERP_history_GUI(EStudio_gui_erp_totl.settingLayout,EStudio_gui_erp_totl.panel_fonts); +EStudio_gui_erp_totl.panelSizes(20) = 280; +disp([32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,... + 'Convert Voltage to CSD, Spectral Analysis, Create Artificial ERP Waveform, and History panels']); set(EStudio_gui_erp_totl.settingLayout, 'Heights', EStudio_gui_erp_totl.panelSizes); EStudio_gui_erp_totl.panelscroll.Heights = sum(EStudio_gui_erp_totl.panelSizes); @@ -99,8 +99,11 @@ set( EStudio_gui_erp_totl.panel{15}, 'MinimizeFcn', {@nMinimize, 15} ); set( EStudio_gui_erp_totl.panel{16}, 'MinimizeFcn', {@nMinimize, 16} ); set( EStudio_gui_erp_totl.panel{17}, 'MinimizeFcn', {@nMinimize, 17} ); +set( EStudio_gui_erp_totl.panel{18}, 'MinimizeFcn', {@nMinimize, 18} ); +set( EStudio_gui_erp_totl.panel{19}, 'MinimizeFcn', {@nMinimize, 19} ); +set( EStudio_gui_erp_totl.panel{20}, 'MinimizeFcn', {@nMinimize, 20} ); %%shrinking Panels 4-17 to just their title-bar -whichpanel = [4:17]; +whichpanel = [3:20]; for Numofpanel = 1:length(whichpanel) minned = EStudio_gui_erp_totl.panel{whichpanel(Numofpanel)}.IsMinimized; szs = get( EStudio_gui_erp_totl.settingLayout, 'Sizes' ); @@ -118,7 +121,6 @@ %% + Create the view p = EStudio_gui_erp_totl.ViewContainer; EStudio_gui_erp_totl.ViewAxes = uiextras.HBox( 'Parent', p,'BackgroundColor',ColorB_def); - end diff --git a/studio_functions/Functions/EStudio/ERP Tab/README.md b/studio_functions/Functions/EStudio/ERP Tab/README.md deleted file mode 100755 index 48f4b88c..00000000 --- a/studio_functions/Functions/EStudio/ERP Tab/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# ERPLAB Studio - -![EStudio_v0 016](https://user-images.githubusercontent.com/5137405/85075567-4f6b2a00-b173-11ea-9316-6a7965cb5b81.png) - - - -http://cda.psych.uiuc.edu/matlab_programming_class_2012/guide/GUILayout_v1p10/GUILayout-v1p10/layoutHelp/User%20guide5_2.html - - - - - - -Setting:Color cvl = uisetcolor( cvl,'Value line color') ; \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/ERP Tab/dummy.erp b/studio_functions/Functions/EStudio/ERP Tab/dummy.erp deleted file mode 100755 index c21bb3bc1704d3fc51fd7fadb6a28947dfab08d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76622 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 SEb||3j54gSs~L0A@&5o7_;ynO diff --git a/studio_functions/Functions/EStudio/ERP Tab/erplabstudioamnesia.m b/studio_functions/Functions/EStudio/ERP Tab/erplabstudioamnesia.m deleted file mode 100755 index d560feda..00000000 --- a/studio_functions/Functions/EStudio/ERP Tab/erplabstudioamnesia.m +++ /dev/null @@ -1,114 +0,0 @@ -% PURPOSE: erases EStudio's memory (values are those last used. Default ones are reloaded) -% -% FORMAT -% -% erplabstudioamnesia(warningop) -% -% INPUT: -% -% warningop - display warning message. 1 yes; 0 no -% -% -% *** This function is part of ERPLAB Toolbox *** -% Author: Javier Lopez-Calderon,Guanghui Zhang & Johanna Kreither -% Center for Mind and Brain -% University of California, Davis, -% Davis, CA -% 2011 & 2022 - -%b8d3721ed219e65100184c6b95db209bb8d3721ed219e65100184c6b95db209b -% -% EStudio Toolbox -% Copyright © 2007 The Regents of the University of California -% Created by Javier Lopez-Calderon,Guanghui Zhang, and Steven Luck -% Center for Mind and Brain, University of California, Davis, -% javlopez@ucdavis.edu, ghzhang@ucdavis.edu, sjluck@ucdavis.edu -% -% This program is free software: you can redistribute it and/or modify -% it under the terms of the GNU General Public License as published by -% the Free Software Foundation, either version 3 of the License, or -% (at your option) any later version. -% -% This program is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this program. If not, see . - -function erplabstudioamnesia(warningop) -if nargin<1 - warningop = 0; -end -if warningop>0 - %Warning Message - question = ['Resetting EStudio''s working memory will\n'... - 'Clear all memory and cannot be recovered\n'... - 'Do you want to continue anyway?']; - title = 'EStudio: Reset EStudio''s working memory Confirmation'; - button = askquest(sprintf(question), title); - - if ~strcmpi(button,'yes') - disp('User selected Cancel') - return - end -end -erplab_studio_default_values % script -% check variable at workspace -try - vmemoryerp = evalin('base', 'vmemoryerp'); -catch - vmemoryerp = []; -end -if isempty(vmemoryerp) - fprintf('\n* FYI: EStudio''s working memory variable does not exist at workspace.\n') -else - if isfield(vmemoryerp, 'mshock') - mshock = vmemoryerp.mshock; - else - mshock = 0; - end - clear vmemoryerp - mshock = mshock + 1; - - % - % IMPORTANT: If this strucure (vmemoryerp) is modified then also must be modified the same line at eegplugin_erplab.m - % - vmemoryerp = struct('erplabstudiorel',erplabstudiorel,'erplabstudiover',erplabstudiover,'ColorB',ColorB,'ColorF',ColorF,'fontsizeGUI',fontsizeGUI,... - 'fontunitsGUI',fontunitsGUI,'mshock',mshock, 'errorColorF', errorColorF, 'errorColorB', errorColorB); - assignin('base','vmemoryerp',vmemoryerp); - fprintf('\n* EStudio''s working memory was reset (variable "vmemoryerp", at workspace, was rebuild with default values).\n'); -end - -% check file for memory -p = which('EStudio'); -p = p(1:findstr(p,'EStudio.m')-1); -mfile = fullfile(p,'memoryerpstudio.erpm'); - -if exist(mfile, 'file')==2 - v = load(fullfile(p,'memoryerpstudio.erpm'), '-mat'); - if isfield(v, 'mshock') - mshock = v.mshock; - else - mshock = 0; - end - - recycle on; - delete(mfile) - pause(0.1) - recycle off - mshock = mshock + 1; - fprintf('\n*** EStudio WARNING: EStudio''s working memory was wiped out. Default values will be used.\n\n') - - % - % IMPORTANT: If this file (saved variables inside memoryerp.erpm) is modified then also must be modified the same line at eegplugin_erplab.m - % - save(fullfile(p,'memoryerpstudio.erpm'),'erplabstudiorel','erplabstudiover','ColorB','ColorF','errorColorB', 'errorColorF','fontsizeGUI','fontunitsGUI','mshock'); -else - fprintf('\n* FYI: EStudio''s working memory file does not exist.\n') - return -end -if mshock>=30 && rand>0.8 - fprintf('\n\nIs it not enough???\n\n') -end \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/ERP Tab/export2csv_spectranl_analysis.m b/studio_functions/Functions/EStudio/ERP Tab/export2csv_spectranl_analysis.m index 70210e1c..710a6f83 100755 --- a/studio_functions/Functions/EStudio/ERP Tab/export2csv_spectranl_analysis.m +++ b/studio_functions/Functions/EStudio/ERP Tab/export2csv_spectranl_analysis.m @@ -65,8 +65,10 @@ end binfilename = [ prefname1 ext ]; % ...and add ext +binfilename_save = fullfile(pathstr,binfilename); fid = fopen(fullfile(pathstr,binfilename), 'w'); - +disp(['To save spectral results, user selected',32,binfilename_save]); +disp('Your specified ERPset has been into the following file:') try % disp('Your specified bins have been separated into the following files:')fprintf(fid_text, '\n'); nbin = ERP.nbin; @@ -212,7 +214,7 @@ end fclose(fid); - + disp([ '' binfilename_save '']); catch serror = 1; %something went wrong diff --git a/studio_functions/Functions/EStudio/ERP Tab/f_ERP_duplicate.fig b/studio_functions/Functions/EStudio/ERP Tab/f_ERP_duplicate.fig index d69e94591529168135d6e175a23c5bd10d6340f4..6c185fba9d9312ba4f1f5a0ecbc6ed77422ee953 100755 GIT binary patch delta 13520 zcmV;>G%w4Mg#o^5kTV!mXmub#aB?6ZG$1fIIx#ppFg74EFfufeQ6rIH27iDZ00000 z00001Nlgy`003Yd004NLq*)1g6V(=uEEP}@a6@qcR0I@SPys>w**68s`Vhey(zFev zX-QI~sNjwwu80fbE`o{(qU=lQmX^{sDTPwX(k-2tCYe#h1#x-zo}4xcJoUXd-F#O4fi!OUBJKh z6(4tcs+EUGGCSh!;geKnN~+cAwpm>!OOnkV@3cC^RadIjVl&(6j@IJS&lItv**WZp z;%|Ah;qwGrVw%%>_VZDHF%NmPWi@o4NI`F#5>|I7~!^KQ@Q>wm?cDGr<4Wjgza zO>x=WwiL&i*QeTCwpn)TS@#c3v8OoCG0q5^-8#;keAWY_9d2u))j2BS>pzT>Y)(D% z{;^g^+7R>EZ#dW3bUiJ3meo1g=03yL@C#`cHoMK8-f(?zYO394G0Q0rGrP@=_fIw_ zo@;p1M61iT;2dv`HGhkQIfwH`JLZW*8fA9ITT)Wf|I_ucDe*k!B#YB(b;R1{TkWn` zt8=u&l0-kscn>oDb-uMS{W;&{xh2W$G+W$OCkI=O6KneGylZCqbKZ3npU(35AYsr# zU0JAm?j1xwwx2L4^=i-Dt3915A7lQ;zNUY&uc;{|A%W}}^?x_^{P8(ykIdss*Nv=N zaH)X6heZb86+NQyzu}YUx9H&$V>?b3wc5!w|Ji@?fiwLl9XNOGa}`OZVs!8SO2ML0#V9cyYtnK_ zF&22bi7Ukzd)d-4_07CEGNS4H3vTdYP43-&pB?Old&H|hM8$c5+#_E<`LGukjJPqa z$qFypT`I45ab@+iD>nPQ=(OIM^m53H_=wLW9<;jv~pFZO!Shi_KP7x{2NnSJvQulun5ri(B5`ePrC%C~Lw;kThb zhXNTs%;-4yTgyHlw*IpCWJQ?|6K{I&+4WUESoG;b?oxele|_2M0^NtF#8dZv?}P8< z8RAhNrhk9G_3)BkeIPSUCHT0NoIvEe;d;Y;4bP44`Fp2dfAFDS;xJpvH<9;5(ZqcS zPsfMFtN*pPcXq_yPal{pO!MKZd*y&W+-~$6KGNyKiITCi+Dwc1W6Xt3ZeD!351(A( z9d_s&FLpGS1ADP6=FRTymwOSYmJamd{Gux-9DnZM#oLc|$$WZsF&=lxfE44lwtep0 zIk5<1pS(!8v=D{+=-@c+1BGE=0kVgDZaX%2FZSvASwlY0#}8d+yqNiY9*>`gqECwt zObvQ)*){ooeB{B4wI{ACN%4Tp9PYuuTS`~dUE{$6esAZBQ@J3s%X2Ytw6rJ}YvlAd zyNeO_j7Ti>@i_sF4|1H@V%JAc|d7d?xHIPraA8F%yp49^E|X@l3?M zagUgBCZZi5p0}fUCdXk9M9`kfpS%as`hV4G2Ip@Eq<2eOW}@%8SGd zzJ>^n@WfZhO_qjziQZFUx_@%Xdh}|s_Uh^JpP@KGX86Zw+2Ni0yA`~L#Bjoc+<&y| zMPy#lWm5AGABUW+tIP>m9X&e5v0Y>NduHSBQ}(R+XxyMD@OZW7jqR_!#QFIqW*?io zJP1c^HxUl-YWGR|#4ZpzO!xv&Vk-!lY8hodY0v&<-Gm0OcUuH-EhT`%4SU z@Ca_df7|FoXibGyj^KnX*FF^}hm1-a&taG;a21%_;iAeOFCAgOAH~LpPOOiea|~}B zUAFkC>Bku-E72`5M%8akZlkXIYN~=b~ zGnSc0M%2Jcz*&PQCdfjn1%H{lyq4qR$0RBcKUA3|NB!9Pe3U4KI^_KJrLd%q>q5aD z2XjQmDcD(asimpK5WxF&)J+^%4b9N1HIAld?{N8#H{4c6UcLJh%pn z?p4tNJQX0v;E{EkW-TfYV8d=%2tjnZ?xcO{BSFTSAlngQTn}*^Lw}G_82oJr6t>%S zY!;&oOxMwzfJ=u+_E-9!XFz&u`A~!7V}NLVoq_R#E-`2AH*l&~-MSlV4bE=^!zs}s z=kMMr0V;A|IIj%GX#?Mnx%cUQ2MydM)4b4NJ~425MzV0FffNEL0|HEi#|@0w^xdze z^9?-rs{}LydLZMD>wm|H`-rd%$ZCD}Dg(Rr$bvPHOaal6wf|-jQl0Ta2c@q^=RDOp z&vnj69ph$6gw&ZwBfmG?AI?V|1S4J@lGU~z*3m|$ha&Wkq>Yn0=ZgV?gG&rNJ6IyM z0V=oNVx9#O_zlL3EKHaq-;{+Pqa<=>bA4rVJ>)=o@rieG7=N!K`2MJwhxgOE_-(QE_VF>>cj?AQ~&$k8Y9!X!N!N z5Jlc~;nD-BSRxbR00y=y`!IFjL9W+>Xxehgbr$^~>#8#LZyDyxaQ;#Ti%k1zhdADc za0exDIi&S7lFPXs%OONhx~JP=(6kpHM$ebt`>9vmVSnb~3g+hu=Jz8Y8nqtbJUfEs zL>Nbr(@_esqs+HQLFP?A#&vg$@%K1_GOZsv4mq1vWyi5-wq(LeP`VAPM76g3%M0gL zVneK)P$j>olJmWibwL%+yNY#A6*~X=Lt5p^D%>s0E~g4pTT3Rb;_<6lS60KUUAiBJ@4r@O@B(BskZ`45)tA9YEI?mrZuA4d>lXSAb4l@au>bRa2 z&R2zTN5Lo(Knf`BXDIA%1ti0sR`9TV%?gF_Q(>G_7)K-g5Y7t)2j)wHP+=zEQb9D< zUFEt~aXmRo1;P4E6$6fs7p0^!U#N^5D(e=NaZP31QduXepmYnUIG>0@#fB=GSQ_V# z27g7$h@KkjRSgu*yESZ*GVWfDb(Y3_sB!!?<|hr)q-sx%VFNquypGjp%gXl zCp2`CF!ZSgDywxGWOVP_pfL|&W4)|_%6E;%bsZUhj-=&f8tZ(Gd0&GN zha&JAh7f>i@Jl%zry(m|b_N*O>|` z`{OF}t%^s82vp8v744<_Us2JNfJ%iS&9Sxi!J4FyQS04YPpM}N-A zjZ+l%kHWaDFn%el;}zCF3gfzpZ)F+vQ$ci;s4@<#_=(yG6}=ynNTGtlb-l)RXpm}S z?2{VaPn3?(#DCxrt{`C_V!a$#mLbkOT} z>+nn1GIXvh0}_p9k2Sbn4DKiV96vwnC_nRR1eX?4;nd-GDKldg&VPmbWED42L!)vZ z7OCfkI(=2b*$xfVrnIYPo~mbjsAt_5U|ki!wItjFyu1)VGi9kj{D}X;xPKi4xo=Yt z1jkws)ZSbfVq6SCT2n9lM`iqWhm7sjhk*yk;Ra|KMEE;AFN5`zfqF@&YYpy` z43JFPV{pAi^zIO9v<>bn4S$fE>kW`QPZ*#u{baDdFz}j85<1S5+=tbe~ltbammM+j-M zU2h%Yb&Mbekl+t;UmfK51sNZMyq*$7ED6CNOfL(1OAYe+N09YSu(7}SRJN~eg519a zxDEr%3jx-H0nYaT=Rp9JUY7=Vy+Pm!0a`ul+-sZ>ZbjkRBl*;yInxDtcM1A1*` zHP5FS6De@jpk;%W)gW29yNc_&3MXaRcd6pMtHh1e&{pC;3V&Q>qmB*hx8orCdj1%% z6CPzff0Xg$2={{(xP=<=3dYsLtPjdruN(rw)!0KIH@;g2g4OR1^19YRUbj5JaWBQi zD{mE{DP?`KAGC~8Qi49zV3stl2Zr^um)E_#tow>V?kX+>t-`F?2a*-b3n06c887bT zy3J?2&cp83@_&UM5RDY)^7=>)uQTRw{%5oP&IT=$=4XN6WmOihcVsnQ563^7>o=R% z5wdX|O(=(TQV!(m@pYD5(DK#*4}O#3>6M4RRN#^Ip78oi0V<^|{$L;btB~uVi2Yf_ z`k){K;C$9y`Mh48 z$Gnt>@G5y8>qQUqv4?p&m;2FNwj;N3{$U-H!|S)%jef3`@QZA`BEt~MYFs}H^IaD6 zNhZfLlhS7 z!yos7+JA^MM~cJxPxhfMK4X7Ho}aPv@qg`i{N2853)7$9FV8JzyM30~GDki??fn04 z-}E9rze;>YP8mIH`1n-X-Z9zDF85Tk-4-9&Eu{UYsQ+&K)_lH6e9RWNZJsqQDg3M3 zoM>|-r0~5d^Q=y%tzoCoX|-F;u7<5h=b!c^&3_h))z!GwnVewz!)|DUC&C+oE}J9K zZgumXr7PWKksGn$eW_XY6w4g(d-ypy*-7Sk)_A$KOK0*Q2k*n48PBu!q4;Q+cY|MO zAG^sv_t(Dx00960>{&l=8#ffEWI49mq)@iB2wD#*VgrWHNm|sK&+(r+Kn%N3BKv;wV$c3`J37>PP6GF-yIvcZ??*LQj{T z9vY}u8L(a@r&pCy$U*{oiv@a6oe0|Qr(ojp!s z?zEn_aoBQJnV-l_FSzqH6&p$2A*2=H`rU=Q_vROzC`ei~6@c`kk}3vpu~lhc-R=*(T zup8u7LOs8YIj8*0=PBBUV}0|CA=YfBdfVvaILq%}$W7Bomp4mUTXC~?TD3RaVeBdQ z*;7VvuGr)goCr2dKDlDx2yzF934ac9^PJ6+C(2C+^hjK67 zrDZwF&QPhciUmFrEwFx#K7S{syvZ6w$17jEu1_Bv;7#ZO@5_(Gb9~ z)nCD(PXhb*$lty6d)S=Yw;sH__28Eo7u|gQJ!b zK98_}*n2=ln}!|?^dcf@D&5$S`+nA7)HAnx zf$e2`#M7zd_S_NmIe$req16-5&f4Zq&moB|py~e6Abg;8%yum8}}c zAEP7j>zPh4dBZis4xL-{{2<@R9)B;R{x}(Qj~wN_Y<~~P<1tJe>vI^|0CVvO2ehFM z2wNU?B&>4wo%MX9-qWuR&>Q8Rqu14~TQJXC=OeE&KJx1&AAdO)J~HY(du#vvc}Pk- zep_>&EPnr|{9N*oOCEA+9?~-K1=)g!eBrTu+#QXESm)vQormb>^WY&rpwZ&Eh=;f* z*k4jM=k14ThSgcl^S|dEXeT`<{<6&bZ-sXh@Qjt1$aJ&r>jCdG?=XLtyH7)__=Eqc zPxn7X$z5B8@_&h&$)CF40qa=&XX!NgW3JJo+0vdGyFl zkNg2o{sE7k9FuLb&6e(0cR?JQ*-rYjdEX>&o;=OFeSZLeK@gObsK-P-%C1Fr^^0~{ z@w`vql(<*zIHve5eJbqd6#M=N`;=mzW_QC8c2WIi>-x8Mmxq3qM1l@pJ4E z-7=|T84cplY92!%i0dHSg51864eZk`?EBbA#{@oS*N#c33xcxFMyEc@Q-_!b!TUTd z8(3+dvwvJdiDgQ>QX)pt!8N>O+Xm4QZ?cLg0?Qty?AAIl*LB`##leVT|DKmsY+w~{ zBc*dOzC3w{!+66gVi`{enym}qMonl8!yd8e_hx~ACTg2qSYsY>dWIs@i zA2LmB#NsL68{94jn)6Au<9vEpi*5$KKjmc@`hWO7{P1&;{r)^}wclh3_FE9gQ_vYd zM+D}zfn2(a3{n(C=tegdK&h1YlYX}1Apo84w168vE`P8FRyNh>G8X zP~175Rfy}(ZY*uTT3Xh&=I7?0pvTCz+gg`Yo!=Cg1?{b8*bWN2O1iT+jtjh_#6`vl z(6X)WYu17o^$$)g=g_s0UVC~%Xo;8_Z-1!Sh?amD*T)v~*$c&&V|V}29Gog`7G7hW z&fqs}8H-FGruVhAt(;c${NUrMNlxYkt-$(~QZqSo!EENhBfORlr>EoUH8L%;d}Mi2 z54-u^eNybkL+w(`)5gkXp5wdV0&lf&@VUPiiocQ2IHdMS{~X`(Z-1nfcNtOl>VNy+ z$+=18NiWV#u*vuvt#6G^4d&BH96+`+9XwBTuqQfrdQEju-S1KJL816^97hM`k*O^q z6#XT77_Eo$4D>JZA=t$3D)j5d=Tm2XKJ_)pr;>aMH0E#D`PA7Y{Cqs|?RergtYVf= z?JD_Ha*jyO5m$PSc&4%K*kM8?`hQE#5z*%e`QPPD$g86CJ)l+ee3HB>m}jDg)zULP zEQI3AaV$NIkys^q7_Eo0-F3{X;^^0300030|Ls=YPTMdPc1vMp8VD{n!PSta36RkE zx#H3Vh9(U}MPav*lN#cY+EL=H>KbZS&g#Dz5bWY(*(N8JiG05A#h|YZ0 z;t`?e`FxA_0&J{rvY2qfsDH-0CMi_Ct@9706 z$k(Jv2KjZ zpCe3S-%U8z8IXROV0b;5^)2gZsn7NSyxRUEev2@Lm#^Tj6i=jeR)4SMe&-7Onsp}E z|ClIOmvZwC;sJ6a#&|X#<4`1wvj}KRIiXm;M&K-=o-8WIN3<;})aIdx&zBaT60aKt z8m}KVP7WG7&hgg9)+Ty`!th4-M`gfo1+0Uc-8;4&RCZshx8reM;ZuVb%@g3g(0qTz z3K9%H=(6Y{4w2V?+J7b7C)AM(oe*&!sJOn5I8R{lD{*}GdIPTbNA5@L@iqKOq_HjT zfz>nT?Qzp-CmH#8WjQZw#}%8q>3ibn>t%WEnv1pbgve1lUtQI4!Vz&6-P4FN+Uu}H z--Dy_r(4l?>YHIVZ>_5cPlvllEr}PwwK{g}WJrJS41Y6L9Dn+b(f%b~$o~GU8goz7 zc$aex`~KQ?Rm0BY<0kbyqp%zU6!Q-#AZ_)bu=yy;?{h1Di3`i?j(q&fI3A_GftkKp zm@fAn`3)Xk-|VEh-D6#vX&hVc?BM_p(?9QVuNmPu)+@$(=pOaZ(g8e8+YC&x&_h>a zJv7!sCG}9p;w@L=GI~h7tEC0eSPvEJA$|78pod;q@k?A>UVo2|`>^{T&;1a(O}0Pl zHH)H?U?GlwClK=hF#sVNABhhD006cZ004NLtXNrd6Gspp8{1s5%@J-0<~B!!xk4b2 zfaMqzu&r3;2uUz&X)G1Qb zt(uzY-k!duzaD8vgb+Wx5n_nuO*A%(^chriAC1R})OuL?Z6gu^~3>O#G{t33fWiO@wHT;15 z*hJ^J|2y9<->-NZXnv0MMj?J9!MC(=Y*dKxT>4%=j=w6F8-6)<1AnpR_!Unsz6!z@ zQQawjOEDdUD^7fA%84CO3?dg&GeJd)6~}Klo_OH9ag;DhaS%FHsfE%viv>}xIiXXI zWf+NhxjY>@D>9MS1c{W&p_Kl-i~_IGG+;7GF0WNRaw~Byk!ojgnY+@h*5Y=dlt)sD zb9tv+Yxz+img{)#_p&0$ee6keaz2=;4$hr_Di%1YGmxr>CE`%NV$WI1HQb!*lP5mq zPGxMaL3A^158cRJ^3oKkHTfGXFN=KO1z{SG7esPie%FvuJYA;Dl#(i&)v474Z7h(n zDg~aLYx1&Z#E z#hG`5xKs~fuv^(E2Y&3hz6^8u=BgyaB$*BcpRc)IC6qp8D|G#;Dm5%oIPt1-MduF{ z;CSAWQ+|=AN)a&HRFzh_;Y1jCxxD8}Kh6g$bqe2)bLxcj85Wu+#~i#}uX}FUf$;<- z`JlcEzL;#pG4X;|KAn-mOk%J~-Js@wmZN4R zNazhkk3d=ryowA>?U}7D1oiv!rS!B_S(#gUF3Yi)l$7l$>B$%n2&EHC9Z|~F)Phsh zGo8adxmpZm6zR9q6pO*_RbJZXFiN zAH}n#DC(iRLb_kd9QAy!LbVYz>UIE5$*3H<^=5-+G}%l0Nz$=g&y80T5tB)Bw|zf| z6SNc^e=Q^;G>TS>)TJuQ3dhuct|K}Hb%S7u&O>`b<96zh?jm)LILU0=CY@Q=r-O@x z_1(MbTv)A3y=M(0z152DYw1Nr85YQ%YT4CB$ZRwtPchg9&C70enfkr3J^gIGpT<7p z{YPy5DUF+k{0yUuH0BunHH|06{%?%^WrOBk)@W22jo&Knnh4hZF6--mGWrdAgFz1% z^q@fx8T3Yj-e=G`gU%cDj6pv!=!!xAWYE7@^1<_BuKNsrKbtv!1DiR2fX$pg$Y#zT zVl(G&WHaY)V)J{V{ej%aG`1Ri_iQs)Ii%Le_hH5#Q}U?mBaDAk@ln6W82>oabAs_t zviQas|FqJBdOyQ|_-C1(b4muauWJYOuJ5tmX*_0ozf$XOMcSM7SzS}|Z)sc?t^4JM zn*X5jnUaM+x0nxkrhiJw|4HL1<1aG#XN>PC`M*T#?);m^GLu0q@-x$S4(ekI<8M{_ z`CSCQ?(IK{R=?qQ$7a#0cks6>K6LM3wsx}kcd_+uw%)^k)_av6-J`R{F`O}ukq&W; z_9zam8~sjyZi1Z&^&WdJFh0ke?k~`FiSaKhK6GADYvAyzT8{~PodR#XPCsEfbX3TP*{_pELe6Ti;PK!0@bE1D~DF8Bf+aKrhNt2Zw~c4iI-Q>Ol8E z{+o=)akoQ%9LKxFQDA$&U^efu^?jvB_s*<&Jk`a%Esx{Eo=5cMUgS~tbiA|S3B7$i zJfY{?@C1DtPtd3F1fC5~xIb-uAN$?~LpI#Njtwios>TZRbvnbW=ZjorIp2%Ie!j?O zFV6R};$_9jwJvdF!O3;S%bLdi z{oaNd)UC!0`n|>s@@&Hla=zXjbYHw1eo9JyR;+&?&58Bzqj}N7*dx)~`v~^3)W;oR zuMgC4FX}^MA}h{{UE;`sGhJ_4^H}O)-%Ghg%;XZVknr9Petdwt-) zS1;=0nc`)|S+zqP{{sL3|Nrb(S8o$R5FVoh(Fr{d5kg43av^{SMdE+}p$O4Jd5RKa z8-t0R*ai|Hgx(=kQ9=tHMDM+m2N3^&CmwizL;M70<1sfr&DmMFCv>ZP+PUv`XJ%*i zbFLWxW_N;fBtNT&Q_lvAQ%vuph!KpRNA^NQ9^*@BeGD;w zn(SJ{7_wI*O6ja>j3s^zVjS`6c|7wufw;AZiNp^^n9QEU)=y^k6lRx^pL)bJ#!n}H zJz@^oo4~oBYUuX64)ppR2f5z~aHro%;<`DUquk*f4Oz~iqnmZa>DF;WmiST~8$qt) zMsTN&O~k2nl5RGGo^G~)rJJo_>1G#y$hz4LnYu}9We;>rE0R9;f~=1NVCmxsxT}wC zpx4*!Aoq0#xYO62#Odl|UzT&|=wm-|x^-;M5?`w0L6GZs2;8aTVd9+haTGH3A!*_m zVkF~75q}&kt(*W$D`!B~%2|-Lat@reBI)Bi$ojYlmOie5yZSf@dVM_wa$j42z@5IH zCQer$ty#{YqmK*3>DKX5miST~FN0jiE8tEYuM+2^kL!?IA2&eO$4#*GaSJSc+y_}7 z4?xz(L(tR5Barp+6fAwb0(bRs8}#~m2jsrq1$X*-k2qa@JkD|s9eq3@PPdNFvc#9_ z_#EUqz5sXX_>wr4YXxzy5sO%V%*DjNK`deXQnJ-OmG1jn$h_~;U4AFTfA0|ggJ%4X z9f<#lI90=R@2WxW-Di+{r{2wAdvo2LFOa%3JYGlqO1{2=H~y#5i_PjcCVfwQ#HW8_ z()Yv1)|a#OJ#Fhd+t#b+!j$>V?#oC1N}0b-Hh(_bo_zezY0t;Y-^<^B%iqi2%m454 zpUd{!zcJOiJhonazYGDV(PFkwO$SYTUXov)2mda@2>-ah#QfWH4OOExXg2=*(fG4% zY3e+M^UPRLTWwL>P}8mcsc${??A2d5*TtY&+g@+0{-yiBaV_o)Ai@)%(MCP zL8h(?=-D5M#shVMTDAXwPLBQcw*BhasKD)UBh;|GswQNVMg7TDftp0zm>y1)C##J> zAQY*pE-5YlIXH1q6CZOdCd+dQ`WDemIj=K=zM@3VDLeogddZ}w(y zc6{vlh6G0SyOQDfNp++$^A+gaIAR!jH$jvDRqe+bo0@rogZt2RhyL6{E zBp&dliScMWXktA23q1DbU*N(;FCO^`?(ELs>~yhgX=!ctrPJ59JM;CuH}CCyEdZ6{ z`w;6`$9m}Wl>3f<+>vz0C8nuNFk5lQ7}HcH-H`?^L7Wu)m&r{ackvx;+im#>!&L&f3gklac$RgDtwUqc@_3oqn?hcAo`CGz8i-QWjo^i*Ro`)J zTt2zl)JaW$H&r@OwK1sy^Xp58cy^`yQroHCUPAM=r==HKnJj8A-EFL3f)}dl+Imr~ zH2mai^K*8?sg)XpxLaCw_f#!;jjcYwhEc-how>y}jK%GSPBlkgSm62V;OC^|C$+I@ znftp|!(rDu?H?Brhp+2J|4#|JAAU@P_;FS6gG)kx!0YDudXvi659rh3+s}uO-?hA( znb*kESq;h0w=i5q!u=a}_MGdNQ9sX(Uev)f_|E`}_YtB!7gEfo+Q1Ik!iHYiz}o=r z^%2%5*C1F|)DCac-qjoTqaXftz0ar0!}Hb8sWRWQ`bo1jasLM6^1r_S{Y%eg-oFFm zw@_ezaa})&^JmO&V}2X++erM@kn&6IZuo6U@0#9@48OesF~1%9^RdIZ(Th5udon0~ zI|ISGqIPJThTvTUzm4i&_xt<`dFr6(>((=0{|Eeb24a3Y$o{3jxp@C};sXG|dImUW z-L~e?x4qdPd$ZGie9za=mdEFnk>ItzFNoKF9>l!1C%krLNO`Szu7<^frTkL+%)C~s z=;WUNUrS^%3!}qlGZ6FHew>GY00030|Lj;#PZL2Df2FjF5yivW ziqS+PA;5K+Znt!0*9WvvcjfPY zzGN7Fv&?Vbd;4bId-MUoRj?$BZWupjj1gz+arPv}aKsqBY^Ks@jD)p)H;I0%4*yym zzKI%maT+bmQ;9TqUvRwr4&FH9w0J2VG=JUi;hxnpf!FdPUm%9kwr|oYU$VcxmWprDPcC7 z$v(!9u&y8ShZ}FCg*O6e7e98g53zl@p6>j3i{W|BFP5KxZ0Hj3QkIq0g*C0ZT+^}G zTwRk%MOFp+hk}kt1(;r6+SpTc_?O~Zc`Socl{dw=l1L_`cgANdVS>lY!u0HnP^z2G zmr_alAPa@6WGp=w)#SvXjT1|Mb(zi<<@mVyzE19sK8Jo3V^vc(Rf$!5V{emhc9f#tWmY>!txN2z@OjK1!D{I>UUd$;j$ z@I7kG2?;sxb2r|IgV+Av37`AVetj_vc74(A{seH3fA8^?LYoJ&vrW}&11>d!#+Fgv(I~eJ+FN>cKDZKFZtC&n|)#W>;(AF zvtIn*c8^}hKKnj|efDX8))%8-*B88J$8Zoj>z=U<|@M zaGK}yA$0!#)+q4t8-*#Oit%S(1WiAqGSswh`;y)N{{R30|NrcNSwU|bMHGH^nzThE zxTsR2DnJB9v1w@1P*4s?ozMgt36!X$Tvy}Wu|4&Ace^{AVoq=asj5&9hy%U!M^rub z);p(i=mF)zuRzT6&c@@loAo*yC88ebdHrVm-n{qby?NitGXStEX-d)=^~5o$_<}|_ z&Z_xntdJS`xt$_^e<~qAzb{`P8|yeOl8Aqo+}~S$u($f}b<}%P(>tBeJC(2t`Pt~} z%c8bcmV`X&`&rXhO!0G4T0O0JeA+Y+-%*=eJG2f;pB}eU1N2R5`bvry?0fO4l0V45 zSXTG%yyjm#;(hb5XY_M?)mS@Ze!OawNnZI;Q8J_2`96++$G?$3Ui|Xt#peBIoyFOo zNas1vNb+2=)z|zXq^z`c$|+#JnT8!)(PuEp$x5UB_rp$Ff=9`47sQ_dw5^ zh+kUsJe!*obp=b`tnGZg_Jwh4WqIW)y+S>2sC+E+=qlpY&oq`iN~*3V2odnvtF_1$Mu@_{xt=? zd5ruG>X?XbM)ecD+WfOjpySuyV;l=(96QFbqv6;_BEHCvfMboQrn3Rr{|k=23S%65 zlKbK?{UVP%Sb=U|)axz}9IM+ms7}s7Z(bpP-&dY${V4Ek-uAtYxb_nm!216c_J+ zxV$wWE}v_0c|+UlZAlj-y(8%ZNehxLLxd~vKdaB6TT{62v(uyXnTwLXy1lu+vE_At zV02&8QTk^y>Yq{k6G>E}+FfQeqE$ib+^MCACv%W-a$l(`< zwpi@9j^mQ|R6O*1Dwf;M_#W`4;&%XlQGPx2m2>zXWxS71E$&8*5}3vJ=RMa8y%uvq z(0i%$T%IC}U&5fj&a&OxaL9Xq?vV1O-22vl00030|6^l-09GL80AfZY3<8``aR}gW z-~*BtK+FaeXCq0!5{3F1DAmsZ(r$~J9m*%GC zl@#l{XO?)BCh4c9rspIk85tNE>lx@5%XE(;;&H z2c<&=1{|QF(*Z(HaG=cG3-(aoLd;`OfYK5Ugu;=H0W%yWAWU#L!sN_%p>|T${|t&y zcdAj%ouD#;i-B8r&fX7Bon3mk?Zo1b2709Rk5+37#NJaCdiicelj}vbZgLdGG!1 z)bz|#Q}vu5XX^A!pYC?spCO2G+@zmfZD{2^9BH|DXg~4^a&iiC^V4#DF(?8cPwr!ORY4Vt!W`PCKpl1=ptKEuJKkP1>)a({Wl;3D%c3E0t<>5PVp8 z=`VK;x7WDHZor0{6L-Q;?Uq5p2SD1Nj~G&-^gZVd#OOLjMFSQQLqKw!K$9aSBxAS`}Jw?~->x+G+Xf!H|vEijsBw5mmT|I%{~oVm%!NeMz6PC z{EYkkn?vX2c>CBpg$k8w0f(8B`H@qazm-Dx6(7exrmYDsQ+h2Sy@w{0a?ba@kuZ9( zNauI!&byV>fhM5-;sAPHhxI)3Exf0kBI$ULub;f$X*`_oMX%3Q*dzWJXX#M062CWR zK$9A0+@L!;Eh9B5x3}px#tCSXuk(x_)sA&^r@bG0*Hymx7nUqt@=0`>cfr={^EU$7 zemzqgcCPiU{Emr+{QRg(rA$53u?S0r_)kBBm3+(|9$W3KoB7WK!&Ml4`~}}XDb6_c zZtOTeRP`*LU$l=DKd`reFF60w{Izrb8Gx-AOU6Bz`R2uV!U&RZGbjwSo6MX?-t!$a zUg^cAT;O`Lw)Co82)k!%+%fT3wu^sHoqUU<;F|tPbcjq)ST}uuVMS2!4-Es(>BnB- zfjz8~H}g4u+OP`QgS*@v>$LYg-G2!UPmSMnVR%gEmAklqV3t7Xw5+L3$cK%u-+j|9Ey6Q+Xv=7EmVO(l zSWxa*or`x_b4sL*@x}!@tyYI^z|UFQwQ6_fZX&h!KERObKytd$3xpBjiujAMzU?X+ za{;G?<^Jd^du_9Xq03hC@DSgbbIYWQo9SOY5J~oBzDRsP48_+rU?pF8y({JrLV03y z-S@mu=>8DtOxI#yL@89voGI5_h9*XeYtgbyRJ3v}o)Y~0O zC;+VIxicjfGuyE58+sS3i`OgLZWi>8(JhZqZ9eTrlc@qMUmcJ4HY+hCt{!~E5e3wb zQ`on98htsAiuW$S0*t<+MZ)rT}`qfCmWlZn`lmz~cWsc(4)er@_m zT5mhP&WHAIU%v>>z8A4ROHonA%Ws0MnYoJd`H}^M;i$Mn?bUj(h!cXJNj=u)ZrR$0 zVmQ9Fgi;DYyVpOv8k5|FwQb~$VUV;YO@C+C*Ki(Lgr4XFcjryxMI03zy_m{magtZ| zOOJm7pcr_t>Fe&i`@xBvU}!2TMo*xAF7Cs!r|r$#okIbe;P&w@m0QJt_tyjV)M6CK zM#R*=c1F5m8g{+Ub&1ytMOWGfeNHAj(|}l11b!OUmFaOQYjykzuCeU|;qDnr27njj_&E8voN7*~f zqVR9`g{dyglF$Xix&}4ofh}6;N#b2ael#1n@23#pk`H;hrB6wnwoGLC65)n{&1uGY z8Z=nUfBsjr*Ry&eqr;J-8T9z4O4JQk-JeFp9e_Ey7od8XbfOY0_+MWut2XO+ZSGCK z;tY1c>w1%Uhx5y2y3%RN%v2|Zz*TQs6U}>uxN};* z695S);`5^3us*?ztMN#tlhl%3h*h)KehsLUyaa4_VMAhYfHxePmSwA#r)lYsGqb&- zC57a#KqQV#Y@r=Sdne3uBGpfEbriG~c{x@`wZXIaU2k`{a*c`Vqe|kQXzl27+vRm! zqHhOV>m5I<}qqA8e#XN<8LxpPc^JBT1Zy>Jc~+#6meLMZtZ>@;smfW zb=4eP_n!V7n2g3KBW$k{ax&Us3yGGGDusU3*c|@YvUa^|up!(95{oEPfviyq9206~ z>bHAOCC)@A>^3d{ZKOq%Baa63>MgHMBvsbQF8q<1u&h|l54{3Faxvw-3N*V>@+G~| z+N?9mSS3M8fi)N$u}LAC*j!#RpMZgZV3;N?bs?96vTx<_HJ%#Ar@=d@o{1dxLP!uQ z*fKm?qq5=%MXd{CLZwf*tmcbI(#bU5#ZzQg#nPwJ=oF$Nn4g`*c}FF&0b022Pj0K1 z-}QeCSuf(v&j040%#bAeR_z9|zNQhZ7qfy~m4adY1D^u`5O9VXQkD`+ zWtxb1>CW?RbNX#O`~;*;7PtP5b8+*Il=k+wQUhmAPI?0Jz-;++(nmcp{=IB?*PGt?n-w?x@j*IbcoY41%ou9Q{MJYZG4e+lI zoYT@ff5^SofXX*fE4-DSXf5>v2j{ol@i({K!#LLLV!3fsIK_Yz&JGB|RN?jO{Uvms zcisFE(Kzbi8RqRG=v+?2AIe)aqB{z<5^UgCHiJt%YyvSM-1G#=!P5?31eoiHHVpY% zDD~d${usU&*-by&EyZN^UMDJbW1c*`g~X3&Yj3{M^&}%oomJ$rK?WNQHCN-GDs$l{ z-F*!;^Pz`==yL&&^?;Mno~lV z@AZkPtw77ozl1XqKbPE#z(m{asaV3Y;i{7TJge_%-ALq#0~h)owPZad3^fs_ML0T& zT9q9BSHfmCowH#>6DfNH)wU9LY_=_refb$%x(b7?c1LqYv_dD#JPPEr01A&ks=Q867K|(J=A>BQwzSNBVEy@~g^c&wo(vAz>?cjp56y zK|zvIR_IbjwprE7xe}jmVQl1=fuVZj!-{jHvOM!6g zRhJ-Izns1bD@bR#QkPi2Uwf&KM0u^rjAc`=WU*FIP5t#($5;PF^>$U{Br~a`M~aYp zbrWHA@xvyKt#+yJc-lePM3c27ERC|w9+}J>M~fwy#}@5s8~Wp(VW%;l_q`}i@r zVD14`i-uKOxfERl+7F!gqy=&`Kh1JV(o!$1c^Z^Vx-g0?3%sqf&Q`2>4HR4Y3`d?u z6)thE!>q1r;@Otq!YSUy3LbIC@=xNxsjyvO_f=HaLw9EjR}2RloN=Xv2CLr(scZs= z5Y60p&04@&^$g`g;Xqm-V;AKX7bSe&l5Dib!*{B)xWC%u6TcDm-(-_#UDTnoe`)&* zYS+1+prHUGf&2j1Qn~a|D(gsLS}X$h(RF}Cr>NLv5yT^y=Jk6_cxeZ`6nFyc!)S)8 z4V?D&J+NpV5;kvLj833;_oOrdt(n_Wbm$T^icaXh3g@tgFz|J3MSI7+dVK|(|7wR% z6HePGrr~_B;kXya{&$i@Lq2bxHi=Di#BXfJtKSsgnHI{3z54xamEGn{CFapR=FuJ- zlTKtY=xH+QM>)T+9MhH2KtA7q!iYu>ML5bA$wU;xFVj(fm_&O}7wcI0dfeq}u8a3sA zjr5MEuT%vmI9V++ax#s4H2dMYGceN=)|?XMVf1#;Aml#lYbv%6t!~vjl4^xt5B+b; zS19|B?J2Dpj8c)ae|7_khBQN)9{pJ3FYfajhglZW={$I?r3%pN*xHBV?{@`m@cc_b zNx|irA6z<&7UJd94Grc&$qf%yTexJIr%MM?$kh60=%o`o+4{rVDwm5!_xiZVeF0AL;hwB=IjXX|B zuB)(y4;4caY?pTbP{MFuZp$N|aPJJMb-fCFeQVg?C(?S_8g<>RY)G>{eq6G#wXx)M zcigUu=|X%K-T*xFP5eqopnMr|+j=?Izf`#K+PSAsV||%<9u_-!|G7a`a?S;#zT->ROW(c&>_jv467kZ#VGY z(VC;Q)3o1QpmU361BC{kd5l&uFf1SOY7vxqmMrNu)B(S|r$h^uOsfQs8pT7Dp`oWtOh2*W!HK+e^u6V5W-E;R2IC3$2JG zmQvs?ND^?|O%)4#z5R-0mO}f)NbuFkgt5C>Xwed7GIbvR$f?LQCR? zXe7M){!8*mHLrOa({ZEiAAMD>#K>aR;$q}g`#NxmZDV9;OQ5Z_`jAj{y$vJQm!~vZ zl^?!X$cukUi7>i^r73-<&$z{|{CY9B{03W&-t+Y%H9&@$T} z#CjcSFz}~7wrA>FSnjenmF2jg;lezkD`Rf*T3@;b$aLY7oYAQx7CV|dRHub%tA26> z&e=Bcz2}JO!vKqm9yheUd|B6xl)AC73=`O)zLEUP+*V04(DT7vkeb2wL0qfqti(Dz z*Noqh^$zh;j+SX_@Kk*PJsis?{INIxTs?1~Mc}eMdyK-|5w%t(c^gIStv~@kJ9ax&*)X3b^&-vI$gAVbSpY_M|O1QM#c}r@wcI%A<%Z;>QvzD1? zsgJMP2&?uvk`4zm#bQZn_M_wNF3c8k-oeUpOGn6#;4AO4GA$P!s?OrO*lYXvPlROk z9Y>yu2|hN-q>WlgXl;aIfeVXVt9XF=rGk-!>Z5_TYVDTTn3UHRK2)V((}Wj9#Nhe>s12k0F`^8s$>!+=*4 zG+?3??HPF#`m0K37Zzj141WPwUJhC^rAyQ3yCPY9a`BVNnyx==NuLgG2EXm=Sx@4M z^Qxx>Q&5x$LCV+bPluwbzo%55;r8VueRp9Q6z|#f5ggZStiV|3po3ZR<)uig9KKet ziM6G>N=3$P0-q$T4`{j$r-Rn;0-o@-qLUmSM$2l>j3a%Y8bCZ|rAQ z$OEct0qPIW=IjkVc^{2+VRk$3xCQ+Fa)syT%5*V^03g_G*$%_P&lljPzB0Qkcrywa zzOWRGO-FS~7EoC+0cgE~5c+G(O+QcjyR1WrcBc-pRzG^$a4wK3QOBHZ#WIY*4*tFz z=r3c1)1`O_!8disi*tG#e4ZnD{4dtCK{zjB!YlXg>rW?pf1X+_KX1br_r}>1BL(E2 z9*+F~oxiDa^`5Cg6icq3;Qg@m_9l~NAw@(Te z2!ZVL+@%y-Nez-re!Gk^4yDc2*TiJ*uiB)3{Eq8}Rf~4i7pJwGnINh2@J1>sdh7_k zKBaAY%?8+ElCR_tknk`vi|%QE7Z9Zut^j+)T#rv?#!kkznj1Bk(xkktl5-fiX>(48 z5^{9CQR;u=OGDoVvM>yN%a)=w-y}TfyTpjn$2(OLmr6W+YwxwpI(hY$AQHX$ z2Tf8VT4u+x@ftYM!_CKazNmn>=Yk={iqCLt{LoILujrjW233KHaN#j?WsBS-f9&>E zttxOvn>GrD|7rbjFLQ@J`8zmpb$Brnr|<*v&Brp+?8}H|Bpaf@C?ARjY7H1iie9N5 zyJ;{cicNE6o(Efd`EKXj@o&!v!+2j;-2hFf;K-@(?@A$p*bK1_Byq@cKs_Y3J}_wZl8w#jsMnV$%_Kwbv@lRUA6oC}vwO9wt=B z-ZXtN$he8$xF3CRrEe2PJ||JJpvaVa#d5D96lip9RhyZ0Q>_<+(D8#ImSyEVur}Z* zS*2)E;QA>lN!i|{`t@1Z6kKRG1+kf#fp8~>XfoXaPQ@tpDPQnO!~(hsx#ec zvF)1%8tIe$i;&9rzjl1<2K#yi#{2+(M|-aSamTh^%r-a0)I?Cy$??7}V%dXe#fdU- zH}tHYiL9PUf5qe6;-e+=-y7J}opAS~n8ydrDEnv$PYeeiLv>#s{5%o=VH;qVcy8ym z9=SLh2Aq7UpWsW@{xtOG8I+W~w?=Q66m_uQNy)(0_eti=rbM`So$K2K084uua6+kT zeo__MDYbpL9aY*^E1RD{np}TaVq(9bB`49}^Sh$dKY6m=cXRT~fFu2{md8|P#R(yB zguXz@ZbWP~T;@2ux0G=dA;>&x-Ju4J$xEl5TJn0!MUCnFu3VHNzC6@V6s?CpfzIHq z)1?F#L$6`wu<8~AfY-lQS-siG6Xdkt=5uztHx+}|JeKLGNnxO`jE);kEs6^z6;V5_ z_R1>>4Ze3L@FyA0mS6|hh}q>U8xT?}B+KpIzw&T*V`(iHFG2ZP=`%7{ zfpUaHaE~@#; zv=V=+)_DV+@L&@LuafEA-4Mf_JsLzNv9%y@1hcWwo5%&P0<6-OqJ{&XDw*908=e{( z4NLgdQImBGd?jcjlRLxnL+NOLsuR2O(*iY^(cBc$Lw5pRzwbo8M`@HIuuZH!jI$~`u<*mkGcVRIcXCI|=g-u5363^5YUXO^;8&<28 zx++h>mV%i`$Kp!WI?giM_KF;a8~ZQM$V+Sff<@6#NN3FEGWv8jZ4WjWgerE3pAltxNVbqqVU5$g6?1?0r0J z`&t;Z8?sj0T1gok`v9aC9EgMjr^THUeOAQWKt2}q*obgbA%x}<+)C$lJx>U2%s2}U zWb%Uo`&_)w`M0`a&o{R|?MiTNOz;m+p`)|M-pA$J+dN#bm&OWq{J`7yjEs8PR=I^Y#7v1KQFz1A% zV$;2}?W_|9IAPeo&^!zl3Toh%So_6`Ry$gChdm#V(j?Qp1g#R&)K7i!{Ehp9_@8D^ zbR<*=BnUH!t(h>szs9Cxh$lr#1yIP@UEOTnDE*jJJ#YSXs(d)eRdYJNoJeCL?0ZFW zN73qYeb5)|ddtUOlTlaG6YAK2uPJ!w`7qXgyEm4`=hR+{fRMT~!GBPX9+8ur05AP( zb$6L5hWvrAU}(27uk8qAuqpG*gJjC77_k)8>lwF{zaDWWiTU9sljSD=6Cj2$?P+eb z8FD(||_aVl>A>H(JrpF#)V8a~dhf zUhh$$el&Lf{EP48A&U02p%by5$%NX2P$&(lG^en47t`Au4W4JJBDNt51o;Vaz+Sxw zzDvEQUH5DZd+^TiNu?av1&&IgS$BAaYBW);+5^m!f&w?z;(wVv3R8IMWgT7@Pr8u% z>(7WT52>bpT?#A0CS0};4BATfZ-akGIO(M(gI;FGgYX7T>#9pG^K4DF13Kh5dh zY6@+u0JR^C2PX5SQmhurUn25weumbZSzU@j4&Wd6{ajlM_|mcpGT*;_@vyIS<725p z>;7PlWAB|L`Z=GuO2`@4^ zC2oa#%qR|{-%?X0 zC*9xLAs#M-i5|Pu-eLUZqe+fQng>CNs&&xYwpOe!$?KMRAk?#pLI)@`WvsV2sY{y) zeBGC}pXr^O+`FU?`8%`0(G}&NLF55Xip^oPe{$XAgA4m{0XN*2m{z7@8|^+0_qNvT zg8uhPqACikzNim>>D?>YI5PugJNmwGRizcAWCgpVQKZ`!{f2-al)h zyP2oe%Yl37U78(svUr5gkdJ1CcOHw)znwBJhrhrjo*QcITH9}b0r@d_ZqHt#+ray0 z)Mtlhui`#!_D$9&l_!e$B!t*IBd(VgWJjErmXdo8XIEc?iI*SReS8&WYYSZ(GLOhE zUdXBm2b8e@E?)5HD}=X#G_n5;O#J+xfr(O`HBSl|d`AK0!3roH-4-M3+Yuv>Y9PXQ z?C-r?%F?EKb^_*0nEw6h3btICZ@Ay%U%vKhQmI_<8xruV0e5~<=|t)r6YZMkn<@KH zC-3SW`SKfdXy@X;-Sgk4+oh0B^0y|?(e~-{i!vz#k1NH9FsMJ zHxuZOYZ~YKmtI6HHQ)4{1VuWY437jXc3FCSL{pFhf-;E+jt1l=&yLOQMowQ)SB#cf z4zyWv_5+`s8Wg(DO_DX0!vPNtsuYrF!j7%-oY~B{Z__MO)X3^W z{>sSb5DaR$-LMkmGDDwO!74?(-w=1bDHu@2xG;2YOf1On)ugtcE0v{+tI+$lwff^? zIga9-w0nGbWleY)Za8)KO^n=_r;fP!g8O>oj9MLkbV4`eqw;m=vq{#BeV)u9&n2s# z+oWI+@BENX3gra!cL(KGTyJqKih{(S#qtP>zMooBAzDkz##VZaX$&>Rq)JW{E~kKQ z4at=UHhQp|%O0HH?gonW7e7Xe(&BrByLuV6wo=B9G0KjAnN_!E_IpVdPPK)6^5ie+ z_6yW~TVYse-OfVRA|JAu-qB`(M?g9$Pj`@+6YqaDd3wqV0jP9h8Q)?0~w#JvU!x@&p(1w8t#4bR3i)TVe8awm#s2P+DJ zG0JmzgUi!C;NV_4zMrx=S}&ixAMxZg#GRwM9F_hW?r;z;9JC@})06e^g`o&YEasK` zs#cRF`VI5aiAFAJ%b`^)1u2r+JLCvKz^$7 zH)A2arm`Yd&$m``Is<|{f!t%Y#^dyn9ToJ0tUyfd} zxSFSa0FT@l#Mc68@d2!Lj}c42pMmmH;2l#kNck`ExYjIh&1^e!9Kmw%na zXnR+ek8kpfihI2#O5EHUD%LVNKfCbpjdD}vV`t0`Wwv=Y2me?i^)++{;y;KKnKe^2 z*Ch(?Ej|$W8s4k}-SbA1J)%yo_g_E1BxQy+bPUad5AQ>#sC@65vO10r!NScG2Z@J;xvmD4`abR9_UPNZm=opgheBb>fAy(`xw6z8Ivpmhf4ud-^e9lxUC>}?Aeg}x63a5a}o*2J-BxPAjE=_Q0dJEt<~_jr0O zkJ#{mYvtaDR|!62Kj-jj8zB{LtPZw7P{T=q#SsVH$ zPbG>IpICy|FEb5tHZ)HjUc+sw+8kO=byxLE^)uKshbd9vO+5wbvp=fuR!yu5IpHIK z7U<_QY5z;+keJESfr zJ-K{c$K8auE*4c!bR{2)oWHQ@LClUX?cworQ2X(tf$eBe`tQww!+?vPlb$w@j3u9q zcGMT7{{2t4f086(){OnVDzf@l8-xJYoqU5FP_D2H8%(&Z&%HTaCZ;JpWL(HTAZ3W7 zsxEP)aH4_~2q`<$C7WG;-x6ApupP~5N1e4l8jnhnl#Y6!_V^Puh4t*E~lbs396dm3i^PvkVJ_(I|AzMngf=7=og^a zbzUN%+#TOus=r6DeCFdfb@X%Z+pTi_kT$p{G=kOFOdy(eh1%M7n@W*erLYjAn%-M( z`T-LDzq0-YDrt4&r;0GMWI;FBFQS2E!bkkr5&8Z%B3@$7?gBrY1dEgdkt-59maZG* z%gKzH=CD4xe?r1C7~Av`D*`Mhqi&je&L1}~XD2qwgpW)s9Rl#;w7Iaj6Y`ZK5<)It#1 z($Zq*?DcO&8Pw8(>Sa0I^6PM9&B2N5JVNR8IADKld`-X$um@?-rAI;F-`;A@6aX7fQfN#Mt`?y+=drT=-h{LKs_o z*jqmK&-cwHvR6H0UmE|l8_eOS*zFquoB107atW^7Oy*ShjwlHX*Dlsy0>%eSHUlVe z_(WrAmB7$OGGsEo9Fs;eq@EZZ@cb`gLje|}z^CjVd|9!6LK2-5sbUcWH#wvlhcR-(RH`vUS`fg)sucxva zAv7s(Q&$%yGieviG6ZUd>@BL*b6$n$c&~$|Yee$>?AWyN@ECtO*S{1?H|z)aYpz^? zK7l&q(uK{NW}zzvd@P5#ZT3EX-;BUpl=t6GWFQorv3b9UoC#iwgH@pl(>$8o@xN;D zw+|_;Sn0g=5L&(RK($d9y$LOq>K+iC&K0FbE1J0X#%l$KZT1iJFdFL!U}h${ZR!f(E^)sgpJN%ko|q&e4Rw6i*f8A=`B8dS(0L2zS-pZ|*{Flq zfslW=6Bhq)4YB{j#cl;JZ1oRN+H_4fEyPGC1m=)DauaQT zeFkM|guy=9JaEURHN?4G;yeZH10q-|G{)W!7?}l5n?4UXWGZ5v8%Cg>%J^kBFW??c z7ZCe?c4pOhct$dvoBs44s|iN`Se@m-rx5|)at^ye&6qjVW)_xHYpt)RdyAJ6uShvy z089INx@((kQ(I=gLi0jXKzec!ggpyXS_yg}oSoPt!-cQY2c8+s1A*&@$K|#eX{+l) z`G)E;vo#a91G`yvkHC}I^Yzc6hayPPwO9Ij#dGpi$FYCCu$_PFCsDKByVP*lLqKNl zmDY|v^%#lO7zq(4gv3R;w%JeCaAKqJ|5}PV|7)$SS@4yj2hng+e_3Th2^ZJSM&}E| zeb0c02(O^$lDv?Mv|Eq{1TK+ra1K>*v9AlRnKqHardzT8oRBAa!Kbx!4QpUgV6 z^sR;Tz0OEc-e^C3G6XKy6>sY}H{~O1FHa{j_yziOkQ5j{s66(2h4dFlLIr?v$mRYM@bCUocsFr>UWDc!=H&mo7Hd((P(oJ3 z2dAes`{}_aSGR+uEvy&Z89aXcE{RX3(QBJZAbIuPd~XX}b#$t8jbX3-TnORcgn`o+ zwBDRfdv_QF&7=i1@ICHrJ?p|% z<|a#{UwkEqSqtnMx7{N`Bj`%Ma8Vq37!iEXZ)GR!OT%lb=t{pUyv0|L1w1J&K;Ct08jf=Sy5 zDrAeMa70)1*X{m$w>^6Iqfwmsl$Bf}RE-48)KL|Nv^|hflyzI=O+#!_K%T3*s|?Mh&)sKY<*-(jdPYiG*<1wfU;nVVM8%`j7Gsuk~Oi%1_7y;|-(Yi<0LfBqPdHyMZ?8Nm?w3555G?ln2iuuG@0urb~1 zM)sMLWOmjTK*5XI^esly02SX+tv-STpceOp0BWvYpb>QAoz2=Eox0Iq>@8r2R z=I6AYcAGYaATH)Wc3ud+{IKkMpD=~sz$Y>J?m^%&=(+q|iU_5In7(MtxWmK}kBS@{mpj+v>eiHxicpe_3N zE5GSwWIl#w^Dgl(gWG}K&B@8}5%H>4aehEtICcmZ37zPO z_KM6A;4$<~+?dtmDiXJ*5w4Sgv+A#}G3= zbg_`%bt5?m$Db)(oUvQE1Bd*ur^Z7h#%l_`Q&opzw^au5Asj*9GpVpkIp_nNq92uz zc0N%!NrF8O7M?^GX2_#9=I)81`$jy}dQax}>2!eI$weXj-jAyIo+1<#!4^uE)z>IO zDRt&qP2*KfBK$Z{5=YWdRNh(Fp^Uz8%Gk(DtS_|kr%|iCMB>I60+4NdET6*=Y$_>q z7s?6NJ)jn5G3Dv1q0+~dIs#-UT{`FSug~eFg>bviS%VTTcPMB3iJ&Eiht~~A0}LL# zMKy96*cCNC{{d-cu-Vlfx7&VZs$EmJa*{aq;2p({$;_$Rh>-W~3WerITn6i`XANg< z0Y(|2h?}iI`>WOL+3_2e*%jt-h7hX3eD$LOxIh-n z9JPw_ll{WJ*S`vlVBo+BFwEU95@Bw@w^f{A?|&b_X8aE7uJ%=K7bG|9{DzpaID8TGjopQRpp7rVn^I#us`V_ycD-e; zCx*s$PVF|}08O%R=-HD{M&#H@jRC4PVdN(m5D?W~(e_exb3YdAayengBeinQS2T3L z`FDbZ2Qqda)KH^E2|==>)Bs7Iq1Gz#SXrT!k<#=^}L3T+L8d5 zv34&)F*QP}F*RRtCZYuD4Oc_E$Qu$Fw^_JeF>-hCmVi^PADYxSP8_$6Po zd;_XX^H7;LlS0VleT4?+xE4bM!2z+cr&i4IV*u~&4!hgE3+}h_*Qasm(hZ+Y-EIC> zwjer&l-cu)-SbSVegAI%`?F6LK&|s4?7Y5bG%O^FJ3E}`->ev3jD>EC$bm_qlRU$( z;q1xmtu>BxCh_S^MG_Y<%-dTDj*8uX;{VqJqyNK5C3B}i)LCDUM&(1T!-j?<8;N$(+ zsb9e59(+aaRp$pT6kzB}B_bB22B5xnnPC4Z0Yf7bxS`&qG4_`WB}iA4&%xp_{hCOa z1|&gguC{14@4^O28O>ZR0M}hJa)~2nA&)x;6CX&qd7N4gy7X@Q)((TP>wO!-$^h5x zbLBp~(i4%_?__$vh9i?v&hv0?Uly=?uu3~Pg9E`ga#U(SyDYryP+<7uyPO~;WD+bT z?vwqmasw#5pO7d^e^<+^Ea%7PMdp_lNs^Vw$k_4&VlM)?jxT?_c`J@1SxuQs1pOF0 zKth0lPTI)01q^Hc8pZE!NU3p$!FYZk*5nQkI&xiSIlvjp$KS&5`N~Z@C9ojAw2{P< z$E>8-3^oBA#o8xZe9hv(5ab>Crzz@6NcBKFp|%1^HIqTRUL!}uUhP#NrP-S_ehqxb z(lQL05#IL1%;_@QCgWcW0_sBfL%B@Itd2@be3dFr-?%cUx_)8J;UXXK?M#79OKp!F zWonA;MGjUew|Dvd)p`SPj$AgdMdC$$(|50&3n4(lg0dmpSNZ_XedTl3m(tb%#hsw>Yk>C->&CxoF9(1o@NXygWqDtIFc z5Jl)bnLx;Ra3Bwu5P1s_6rzZ&N*-UW@@|88PpzOJVp@GM7T>=LE(ahj=HYx=vgSw@ zb-OZF{)ayZ@aHhl4RbHto?}5O?e{_y)6*vT?D3X{H5<+A>l(D*14A~>k3@a`-h!^# zr)E$=iiM@dag>Fn?0*b5=vrY%u&x7ybCV%AxwA{i2d(2MOK^LBBI5GiaHyGms7W_~int$@BeRqvpun_pr;rf&wwKxhRlR_Q4M1qqbLMERVg zFb_NdG!-T-tv655YYk_@3ZDTPbpwCmAJ8CJKT0)E<1Ym`6T>JCNs4s6GZLE{n_;xk z_9lv zHhlXc6?Z378iKYiSZe);^}VDslHKC^>l0OU)=Tx75(M;lJ@RTFL?zw`d+X4--qFlZ z%faKTwlK5)@^0+hQEr=PGhAV8k6EXwOAP71)EIXq^A>Qi(fd!G#gEBmE>Qcc&YLp8 z{nEUr>X*frt}tl6iJ&FLA&#GC_^=q_kMegH97b8(>&-$PU6|uEA<=iHpP!6BKkY`} zl|HL9KoG+>Cgg56jn~;#V-1HUZ6>_Le%CDdeZ01Xwt1`|Gd{lP;oXQqLj)y=-+a?! zp4ICveJgb3ToqBdscPuq3{$w33CQOMF!?^dVcs3CE4fmU(W#^Il}1;%qLtB7<0YiS z^E$9yp^8_GqDLZwalp60^e8Fim_H$e@+Y;P!jX%xgWc*LB~hEBn1y$qAKQ10<+R=^ zfp(k?UXK0rzO}iw7>TSBw>`V``}NFxa4cg4?;%!nB(AhML_EIVc--~VpTKnkW-i(D zOyV}q^xvna3Ukvs@xMEhl%}TW@F`t8OiN2)r+#Vic34)Yw*36W>N`n9^l+TESL4Xq~4gnwRLHZq#^s`{m&xNF40LstHFUn2K z$*f9Efrx|5Nnk>l!$iOxtU#N@q5Li&cFilzO)W|+$;{95%quQQ%u7xUNla&O&PgmT z_Djr7Wk3O8i8-aIAmL(6VN@ZwuxEc>N@g;Oq*G~TPDy4Sb}K;sF+d6zUIPAMgM{2& za`ds0X`dWaUj>prMgsak>OJt-!-ioG1A_#Fd6x-EP6R4PW;l_hkDXyOosG0~Cdx3H z&d|YVI-`C%6Jr=nXXs!wol!rXi8BmbItxJ3hpnB+f}{`BPE=sP1wPorXpm&N4Gg5E zUtTC5MCatEXC^1+=(!}8Bx3U)Clji9FaR?TW*>Td65|e5C?7;q!+zv;I5zu{^?~e1 uPhX?@2UdRvl73Ds`Xd-n<2?dwprERP.nbin) || any(binArray(:)<=0) + binArray = [1:ERP.nbin]; +end handles.indxlistb = binArray; @@ -117,6 +110,11 @@ function f_ERP_duplicate_OpeningFcn(hObject, eventdata, handles, varargin) listch = ''; end handles.listch = listch; + +if isempty(chanArray) || any(chanArray(:)>ERP.nchan) || any(chanArray(:)<=0) + chanArray = [1:ERP.nchan]; +end + handles.indxlistch = chanArray; set(handles.edit6_bin,'String', vect2colon(binArray, 'Delimiter', 'off')); @@ -165,21 +163,9 @@ function radio_erpname_Callback(hObject, eventdata, handles) -function edit_erpname_Callback(hObject, eventdata, handles) -erpname = strtrim(get(handles.edit_erpname, 'String')); -if isempty(erpname) - msgboxText = 'You must enter an erpname at least!'; - title = 'EStudio: Duplicate ERPset GUI - empty erpname'; - errorfound(msgboxText, title); - return -end % --- Executes during object creation, after setting all properties. -function edit_erpname_CreateFcn(hObject, eventdata, handles) -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end function edit6_bin_Callback(hObject, eventdata, handles) BinString = str2num(handles.edit6_bin.String); @@ -268,7 +254,6 @@ function pushbutton_chan_browse_Callback(hObject, eventdata, handles) % Update handles structure guidata(hObject, handles); else - disp('User selected Cancel') return end else @@ -282,8 +267,6 @@ function pushbutton_chan_browse_Callback(hObject, eventdata, handles) % --- Executes on button press in pushbutton_Cancel. function pushbutton_Cancel_Callback(hObject, eventdata, handles) handles.output = []; -beep; -disp('User selected Cancel') % Update handles structure guidata(hObject, handles); uiresume(handles.gui_chassis); @@ -291,14 +274,7 @@ function pushbutton_Cancel_Callback(hObject, eventdata, handles) % --- Executes on button press in pushbutton4_okay. function pushbutton4_okay_Callback(hObject, eventdata, handles) -erpname = strtrim(get(handles.edit_erpname, 'String')); -if isempty(erpname) - msgboxText = 'You must enter an erpname at least!'; - title = 'EStudio: Duplicate ERPset GUI - empty erpname'; - errorfound(msgboxText, title); - return -end BinArray = str2num(handles.edit6_bin.String); @@ -324,20 +300,7 @@ function pushbutton4_okay_Callback(hObject, eventdata, handles) end -ERP.erpname = erpname; - -ERP.bindata = ERP.bindata(ChanArray,:,BinArray); -ERP.nbin = numel(BinArray); -ERP.nchan = numel(ChanArray); -ERP.chanlocs = ERP.chanlocs(ChanArray); -for Numofbin = 1:numel(BinArray) - Bindescr{Numofbin} = ERP.bindescr{BinArray(Numofbin)}; -end -ERP.bindescr = Bindescr; - -ERP.saved = 'no'; -ERP.filepath = ''; -handles.output = ERP; +handles.output = {BinArray,ChanArray}; % Update handles structure guidata(hObject, handles); diff --git a/studio_functions/Functions/EStudio/ERP Tab/f_ERP_plot_wav.m b/studio_functions/Functions/EStudio/ERP Tab/f_ERP_plot_wav.m index fd17cf5f..d9dab0f6 100755 --- a/studio_functions/Functions/EStudio/ERP Tab/f_ERP_plot_wav.m +++ b/studio_functions/Functions/EStudio/ERP Tab/f_ERP_plot_wav.m @@ -1,67 +1,31 @@ -function [new_erp_data,Amp_out,Lat_out_trals,Amp,Lat]= f_ERP_plot_wav(ERPIN) -global observe_ERPDAT; - -S_ws_geterpset= estudioworkingmemory('selectederpstudio'); -if isempty(S_ws_geterpset) - S_ws_geterpset = observe_ERPDAT.CURRENTERP; - - if isempty(S_ws_geterpset) - msgboxText = 'No ERPset was selected!!!'; - title = 'EStudio: ERPsets'; - errorfound(msgboxText, title); - return; - end - S_erpplot = f_ERPplot_Parameter(observe_ERPDAT.ALLERP,S_ws_geterpset); - estudioworkingmemory('geterpbinchan',S_erpplot.geterpbinchan); - estudioworkingmemory('geterpplot',S_erpplot.geterpplot); -end - -S_ws_getbinchan = estudioworkingmemory('geterpbinchan'); -S_ws_geterpplot = estudioworkingmemory('geterpplot'); - +function [new_erp_data,Amp_out,Lat_out_trals,Amp,Lat]= f_ERP_plot_wav(ERPIN,offset,ChanArray,BinArray) %%Parameter from bin and channel panel -Elecs_shown = S_ws_getbinchan.elecs_shown{S_ws_getbinchan.Select_index}; -Bins = S_ws_getbinchan.bins{S_ws_getbinchan.Select_index}; -Bin_chans = S_ws_getbinchan.bins_chans(S_ws_getbinchan.Select_index); -Elec_list = S_ws_getbinchan.elec_list{S_ws_getbinchan.Select_index}; -Matlab_ver = S_ws_getbinchan.matlab_ver; - - - -%%Parameter from plotting panel -Min_vspacing = S_ws_geterpplot.min_vspacing(S_ws_getbinchan.Select_index); -Min_time = S_ws_geterpplot.min(S_ws_getbinchan.Select_index); -Max_time = S_ws_geterpplot.max(S_ws_getbinchan.Select_index); -Yscale = S_ws_geterpplot.yscale(S_ws_getbinchan.Select_index); -Timet_low =S_ws_geterpplot.timet_low(S_ws_getbinchan.Select_index); -Timet_high =S_ws_geterpplot.timet_high(S_ws_getbinchan.Select_index); -Timet_step=S_ws_geterpplot.timet_step(S_ws_getbinchan.Select_index); -Fill = S_ws_geterpplot.fill(S_ws_getbinchan.Select_index); -Plority_plot = S_ws_geterpplot.Positive_up(S_ws_getbinchan.Select_index); - - -if Bin_chans == 0 - elec_n = S_ws_getbinchan.elec_n(S_ws_getbinchan.Select_index); - max_elec_n = ERPIN.nchan; -else - elec_n = S_ws_getbinchan.bin_n(S_ws_getbinchan.Select_index); - max_elec_n = ERPIN.nbin; -end - - -ndata = 0; -nplot = 0; -if Bin_chans == 0 - ndata = Bins; - nplot = Elecs_shown; -else - ndata = Elecs_shown; - nplot = Bins; -end - +ERP = ERPIN; +OutputViewerparerp = f_preparms_mtviewer_erptab(ERP,0); +[~, chanLabels, ~, ~, ~] = readlocs(ERP.chanlocs); +Yscale = OutputViewerparerp{6}; +positive_up = OutputViewerparerp{10}; +BinchanOverlay= OutputViewerparerp{11}; +moption= OutputViewerparerp{12}; +latency= OutputViewerparerp{13}; +Min_time = ERP.times(1); +Max_time = ERP.times(end); +Baseline = OutputViewerparerp{14}; +InterpFactor = OutputViewerparerp{15}; +Afraction=OutputViewerparerp{17}; +polpeak = OutputViewerparerp{18}; +locpeakrep= OutputViewerparerp{19}; +fracmearep= OutputViewerparerp{20}; +PeakOnset= OutputViewerparerp{21}; +Neighborhood= OutputViewerparerp{23}; + +splot_n = numel(ChanArray); + + +ndata = BinArray; [xxx, latsamp, latdiffms] = closest(ERPIN.times, [Min_time Max_time]); @@ -76,42 +40,29 @@ tmax = numel(ERPIN.times); end - -splot_n = elec_n; - plot_erp_data = nan(tmax-tmin+1,numel(ndata)); for i = 1:splot_n - if Bin_chans == 0 + if BinchanOverlay == 0 for i_bin = 1:numel(ndata) - plot_erp_data(:,i_bin,i) = ERPIN.bindata(Elecs_shown(i),tmin:tmax,Bins(i_bin))'*Plority_plot; % + plot_erp_data(:,i_bin,i) = ERPIN.bindata(ChanArray(i),tmin:tmax,BinArray(i_bin))'*positive_up; % end else for i_bin = 1:numel(ndata) - plot_erp_data(:,i_bin,i) = ERPIN.bindata(Elecs_shown(i_bin),tmin:tmax,Bins(i))'*Plority_plot; % + plot_erp_data(:,i_bin,i) = ERPIN.bindata(ChanArray(i_bin),tmin:tmax,BinArray(i))'*positive_up; % end end end - %%Transfer the original data to what can be used to plot in ERPlab Studio -%%based on the seleted channels and bins, time-window +%%based on the seleted channels and BinArray, time-window perc_lim = Yscale; percentile = perc_lim*3/2; ind_plot_height = percentile*2; -offset = []; -if Bin_chans == 0 - offset = (numel(Elecs_shown)-1:-1:0)*ind_plot_height; -else - offset = (numel(Bins)-1:-1:0)*ind_plot_height; -end [~,~,b] = size(plot_erp_data); - for i = 1:b plot_erp_data(:,:,i) = plot_erp_data(:,:,i) + ones(size(plot_erp_data(:,:,i)))*offset(i); end - - [a,c,b] = size(plot_erp_data); new_erp_data = zeros(a,b*c); for i = 1:b @@ -121,33 +72,20 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%Find the amplitude and latency based on geterpvalues%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -erp_m_t_p = estudioworkingmemory('geterpvalues'); - -if isempty(erp_m_t_p) - msgboxText = ['EStudio says: Please select the meaurement type of interest and set the related parameters from "ERP measurement tool".']; - title = 'EStudio: ERP measurement tool'; - errorfound(msgboxText, title); - return; -end - - MeasureName = {'meanbl','peakampbl', 'peaklatbl','fareatlat','fpeaklat','fninteglat','fareaplat','fareanlat',... 'areat','ninteg','areap','arean','areazt','nintegz','areazp','areazn','instabl'}; -[C,IA] = ismember_bc2({erp_m_t_p.Measure}, MeasureName); +[C,IA] = ismember_bc2({moption}, MeasureName); if ~any(IA) || isempty(IA) IA =1; end - -if isempty(erp_m_t_p.latency) +if isempty(latency) msgboxText = 'Please set a Measurement window'; title = 'ERPLAB: ERP Measurement Tool'; errorfound(msgboxText, title); return; end -moption = erp_m_t_p.Measure; -latency = erp_m_t_p.latency; + if isempty(moption) msgboxText = ['EStudio says: User must specify a type of measurement.']; title = 'EStudio: ERP measurement tool- "Measurement type".'; @@ -182,26 +120,20 @@ Amp = zeros(length(binArray), length(chanArray)); Lat = []; -erp_m_t_p.Erpsets = S_ws_geterpset; - - - - MeasureName = {'meanbl','peakampbl', 'peaklatbl','fareatlat','fpeaklat','fninteglat','fareaplat','fareanlat',... 'areat','ninteg','areap','arean','areazt','nintegz','areazp','areazn','instabl'}; -[C,IA] = ismember_bc2({erp_m_t_p.Measure}, MeasureName); +[C,IA] = ismember_bc2({moption}, MeasureName); if ~any(IA) || isempty(IA) IA =1; end -if isempty(erp_m_t_p.latency) +if isempty(latency) msgboxText = 'Please set a Measurement window'; title = 'ERPLAB: ERP Measurement Tool'; errorfound(msgboxText, title); return; end -moption = erp_m_t_p.Measure; -latency = erp_m_t_p.latency; + if isempty(moption) msgboxText = ['ERPLAB says: User must specify a type of measurement.']; title = 'EStudio: ERP measurement tool- "Measurement type".'; @@ -232,61 +164,51 @@ end end -% ALLERP = evalin('base','ALLERP'); -if isempty(erp_m_t_p.Afraction) - erp_m_t_p.Afraction =0.5; +if isempty(Afraction) || any(Afraction<=0) || any(Afraction>=0) + Afraction =0.5; end -if strcmp(erp_m_t_p.Peakpolarity,'positive')%check the polirity - polpeak =1; -else - polpeak =0; +if isempty(polpeak) || numel(polpeak)~=1 || (polpeak~=0 && polpeak~=1) + polpeak=0; end -if strcmp( erp_m_t_p.Peakreplace,'NaN') - locpeakrep=0; -else - locpeakrep =1; +if isempty(locpeakrep) || numel(locpeakrep)~=1 || (locpeakrep~=0 && locpeakrep~=1) + locpeakrep=1; end +if isempty(fracmearep) || numel(fracmearep)~=1 || (fracmearep~=0 && fracmearep~=1 && fracmearep~=2) + fracmearep=0; +end +Component = 0; -if strcmp(erp_m_t_p.Fracreplace,'NaN') - fracmearep =0; -elseif strcmp(erp_m_t_p.Fracreplace,'absolute') - fracmearep=1; -else - fracmearep =2; +if isempty(PeakOnset) || numel(PeakOnset)~=1 || (PeakOnset~=0 && PeakOnset~=1) + PeakOnset=1; +end +if isempty(Neighborhood) ||numel(Neighborhood)~=1 || any(Neighborhood<1) + Neighborhood=1; end -[Amp, Lat] = geterpvalues(ERPIN, erp_m_t_p.latency, binArray, chanArray, ... - MeasureName{IA}, erp_m_t_p.Baseline, erp_m_t_p.Component,... - polpeak, erp_m_t_p.Neighborhood, locpeakrep,... - erp_m_t_p.Afraction, fracmearep, erp_m_t_p.InterpFactor,erp_m_t_p.PeakOnset); -% [ALLERP, Amp, Lat] = pop_geterpvalues(ALLERP, erp_m_t_p.latency, binArray,chanArray,... -% 'Erpsets', Current_ERP, 'Measure',MeasureName{IA}, 'Component', erp_m_t_p.Component,... -% 'Resolution', erp_m_t_p.Resolution, 'Baseline', erp_m_t_p.Baseline, 'Binlabel', erp_m_t_p.Binlabel,... -% 'Peakpolarity',erp_m_t_p.Peakpolarity, 'Neighborhood', erp_m_t_p.Neighborhood, 'Peakreplace', erp_m_t_p.Peakreplace,... -% 'Warning',erp_m_t_p.Warning,'SendtoWorkspace', erp_m_t_p.SendtoWorkspace, 'Append', erp_m_t_p.Append,... -% 'FileFormat', erp_m_t_p.FileFormat,'Afraction', erp_m_t_p.Afraction, 'Mlabel', erp_m_t_p.Mlabel,... -% 'Fracreplace', erp_m_t_p.Fracreplace,'IncludeLat', erp_m_t_p.IncludeLat, 'InterpFactor', erp_m_t_p.InterpFactor,... -% 'PeakOnset',erp_m_t_p.PeakOnset); +[Amp, Lat] = geterpvalues(ERPIN, latency, binArray, chanArray, ... + MeasureName{IA}, Baseline, Component,... + polpeak, Neighborhood, locpeakrep,... + Afraction, fracmearep, InterpFactor,PeakOnset); Lat_out_trals = {}; for i = 1:splot_n - if Bin_chans == 0 + if BinchanOverlay == 0 for i_bin = 1:numel(ndata) - Amp_out_trans(i_bin,i) = Amp(Bins(i_bin),Elecs_shown(i))*Plority_plot; % + Amp_out_trans(i_bin,i) = Amp(BinArray(i_bin),ChanArray(i))*positive_up; % if ~isempty(Lat) - Lat_out_trals{i_bin,i} = Lat{Bins(i_bin),Elecs_shown(i)}; + Lat_out_trals{i_bin,i} = Lat{BinArray(i_bin),ChanArray(i)}; end end else for i_bin = 1:numel(ndata) - Amp_out_trans(i_bin,i) = Amp(Bins(i),Elecs_shown(i_bin))*Plority_plot; % + Amp_out_trans(i_bin,i) = Amp(BinArray(i),ChanArray(i_bin))*positive_up; % if ~isempty(Lat) - Lat_out_trals{i_bin,i} = Lat{Bins(i),Elecs_shown(i_bin)}; + Lat_out_trals{i_bin,i} = Lat{BinArray(i),ChanArray(i_bin)}; end end end @@ -300,11 +222,8 @@ elseif ismember_bc2(moption, {'peaklatbl','fpeaklat','fareatlat', 'fareaplat','fninteglat','fareanlat'}) for i = 1:b - Amp_out(:,i) = Amp_out_trans(:,i)*Plority_plot; + Amp_out(:,i) = Amp_out_trans(:,i)*positive_up; end - end - - return; \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/ERP Tab/f_ERPplot_Parameter.m b/studio_functions/Functions/EStudio/ERP Tab/f_ERPplot_Parameter.m deleted file mode 100755 index 4345b774..00000000 --- a/studio_functions/Functions/EStudio/ERP Tab/f_ERPplot_Parameter.m +++ /dev/null @@ -1,218 +0,0 @@ -%Purpose: This function is used to generate the parameters which are applied to get the waveforms of electrodes and bins of interest. - - -%FORMAT: -% -% f_ERPplot_Parameter(ALLERP,Index_selectedERPset) - -% INPUTS : -% -% ALLERP - structure array of ERP structures (ERPsets) -% To read the ERPset from a list in a text file, -% replace ALLERP by the whole filename. -% -% Index_selectedERPset - index of selected ERPset(s),e.g., 1 or [3,4] - -% *** This function is part of ERPLAB Studio Toolbox *** -% Author: Guanghui Zhang & Steven Luck -% Center for Mind and Brain -% University of California, Davis, -% Davis, CA -% 2022 - - - - -function S_erpplot = f_ERPplot_Parameter(ALLERP,Index_selectedERPset) - - -if nargin<1 - help f_ERPplot_Parameter - return -end - -if nargin==1 - try - Index_selectedERPset = evalin('base','CURRENTERP'); - catch - beep; - disp('No CURRENTERP can be found from Matlab workspace') - return; - end -end - - -if Index_selectedERPset > length(ALLERP) - beep; - disp('The index of the input ERPset is larger than the length of ALLERPSET !!!'); - return; -end - -if isempty(Index_selectedERPset) - beep; - disp('The ERPsets of interest can not be selected!!!'); - return; -end - -S_ws = struct(); - -% checked_ERPset_Index_bin_chan = f_checkerpsets(ALLERP,Index_selectedERPset); - -for NumofselectERP =1:length(Index_selectedERPset) - - if Index_selectedERPset(NumofselectERP)> length(ALLERP)% check if the index exceeds the length of ALLERPsets - msgboxText = 'The selected ERPset does not exsit!!!'; - title = 'EStudio: Bin and Channel Selection'; - errorfound(msgboxText, title); - return; - end - - ERP = ALLERP(Index_selectedERPset(NumofselectERP)); - - % elec_list = cell(numel(ERP.chanlocs),1); - for i=1:length(ERP.chanlocs) - elec_list_get{i} = ERP.chanlocs(i).labels; - end - - if length(elec_list_get)~= size(ERP.bindata,1) - beep; - title = 'EStudio: Bin and Channel Selection'; - msgboxText = strcat('Number of channel''s labels is not equal to number of first demension of ERP.bindata for imported datasets!!!'); - disp(); - errorfound(msgboxText, title); - return; - - end - - elec_list{NumofselectERP} = elec_list_get; - clear elec_list_get; - Check_bin_chan = [0 0]; - first_elec(NumofselectERP) = 1; - if length(ERP.chanlocs) <41 - elec_n(NumofselectERP) = numel(ERP.chanlocs); - elecs_shown{NumofselectERP} = first_elec:first_elec+elec_n(NumofselectERP)-1; - elseif length(ERP.chanlocs) >40 - elec_n(NumofselectERP) =40; - elecs_shown{NumofselectERP} = 1:40; - Check_bin_chan(1) =1; - end - - timemin(NumofselectERP) = ERP.times(1); - timemax(NumofselectERP) = ERP.times(end); - timefirst(NumofselectERP) = timemin(NumofselectERP); - - - % bins = zeros(1,ERP.nbin); - %%Dispay the first 20 bins if the number of bins is exceed 20. - if ERP.nbin<21 - bins{NumofselectERP} =1:ERP.nbin; - bin_n(NumofselectERP) = ERP.nbin; - elseif ERP.nbin>=21 - bins{NumofselectERP} =1:20; - bin_n(NumofselectERP) = 20; - Check_bin_chan(2) =1; - end - - - min(NumofselectERP) = floor(ERP.times(1)/5)*5; - max(NumofselectERP) = ceil(ERP.times(end)/5)*5; - - tmin(NumofselectERP) = (floor((min(NumofselectERP)-ERP.times(1))/2)+1); - tmax(NumofselectERP) = (numel(ERP.times)+ceil((max(NumofselectERP)-ERP.times(end))/2)); - - if tmin(NumofselectERP) < 1 - tmin(NumofselectERP) = 1; - end - - if tmax(NumofselectERP) > numel(ERP.times) - tmax(NumofselectERP) = numel(ERP.times); - - end - - if strcmpi(ERP.erpname,'No ERPset loaded') - tmax(NumofselectERP) = 1; - max(NumofselectERP) =1; - end - min_vspacing(NumofselectERP) = 1.5; - YScale = prctile((ERP.bindata(:)),95)*2/3; - if YScale>= 0&&YScale <=0.1 - prct(NumofselectERP) = 0.1; - elseif YScale< 0&& YScale > -0.1 - prct(NumofselectERP) = -0.1; - else - prct(NumofselectERP) = round(YScale); - end - timet_low(NumofselectERP) = floor(ERP.times(1)/5)*5; - if strcmpi(ERP.erpname,'No ERPset loaded') - timet_high = 1; - stepx =1; - else - timet_high(NumofselectERP) = ceil(ERP.times(end)/5)*5; - [def stepx]= default_time_ticks_studio(ERP); - end - - % timet_step(NumofselectERP) = (ceil(ERP.times(end)/5)*5-floor(ERP.times(1)/5)*5)/5; - timet_step(NumofselectERP) = stepx; - fill_index(NumofselectERP) = 1; - Positive_up_index(NumofselectERP) = 1; - bins_chans(NumofselectERP) = 0; - plot_column(NumofselectERP) = 1; -end - - - - -matlab_ver = version('-release'); -matlab_ver = str2double(matlab_ver(1:4)); - - -data_p_bin_chan = { elec_list, ... - first_elec, ... - elec_n, ... - elecs_shown, ... - timemin, ... - timemax, ... - timefirst, ... - bins, ... - bin_n, ... - matlab_ver, ... - bins_chans, ... - min, ... - max, ... - timet_low, ... - timet_high, ... - timet_step, ... - prct, ... - min_vspacing, ... - fill_index,... - Positive_up_index,... - plot_column}; - -erpvalues_variables = {'geterpplot','timemin',data_p_bin_chan{5},'timemax',data_p_bin_chan{6},'timefirst',data_p_bin_chan{7},... - 'min',data_p_bin_chan{12},'max',data_p_bin_chan{13},... - 'timet_low',data_p_bin_chan{14},'timet_high',data_p_bin_chan{15},... - 'timet_step',data_p_bin_chan{16},'yscale',data_p_bin_chan{17},... - 'min_vspacing',data_p_bin_chan{18},'fill',data_p_bin_chan{19},... - 'Positive_up',data_p_bin_chan{20},'Plot_column',data_p_bin_chan{end}}; -S_erpplot = createrplabstudioparameters(S_ws,erpvalues_variables); - -%%------------------------Chan and bin------------------------------------- - -if strcmp(ALLERP(1).erpname,'No ERPset loaded') - checked_curr_index = 1; -else - checked_curr_index = 0; -end -checked_ERPset_Index = f_checkerpsets(ALLERP,Index_selectedERPset); - - -erpvalues_variables = {'geterpbinchan','elec_list',data_p_bin_chan{1},'first_elec',data_p_bin_chan{2},... - 'elec_n',data_p_bin_chan{3},'elecs_shown',data_p_bin_chan{4},... - 'bins',data_p_bin_chan{8},'bin_n',data_p_bin_chan{9},... - 'matlab_ver',data_p_bin_chan{10},'bins_chans',data_p_bin_chan{11},'Select_index',1,... - 'checked_ERPset_Index',checked_ERPset_Index,'checked_curr_index',checked_curr_index}; -S_erpplot = createrplabstudioparameters(S_erpplot,erpvalues_variables); - - - -return; \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/ERP Tab/f_checkerpsets.m b/studio_functions/Functions/EStudio/ERP Tab/f_checkerpsets.m index 7d489941..cd5a9983 100755 --- a/studio_functions/Functions/EStudio/ERP Tab/f_checkerpsets.m +++ b/studio_functions/Functions/EStudio/ERP Tab/f_checkerpsets.m @@ -112,7 +112,7 @@ catch msgboxText = ['ERPset',32,num2str(k),32,'has a invalid number of bins/channels/samples or different data type.']; % chkerp = 4; % invalid number of bins/channel - disp(msgboxText); + % disp(msgboxText); break; end end @@ -132,7 +132,7 @@ end msgboxText = ['Number of bins across ERPsets is different!'... 'See detail at command window']; - disp(msgboxText); + % disp(msgboxText); chkerp(1) = 1; % Number of bins across ERPsets is different! % return % else @@ -151,7 +151,7 @@ end msgboxText = ['Number of channels across ERPsets is different!'... 'See detail at command window.']; - disp(msgboxText); + % disp(msgboxText); chkerp(2) = 2; % Number of channels across ERPsets is different % return else @@ -172,7 +172,7 @@ beep; msgboxText = ['Type of data across ERPsets is different!'... 'See detail at command window.']; - disp(msgboxText); + % disp(msgboxText); chkerp(3) = 3; % data type across ERPsets is different % return end @@ -189,7 +189,7 @@ end msgboxText = ['Number of samples across ERPsets is different!'... 'See detail at command window.']; - disp(msgboxText); + % disp(msgboxText); chkerp(4) = 4; % data type across ERPsets is different % return end @@ -206,7 +206,7 @@ end msgboxText = ['Start time of epoch across ERPsets is different!'... 'See detail at command window.']; - disp(msgboxText); + % disp(msgboxText); chkerp(5) = 5; % data type across ERPsets is different % return end @@ -223,7 +223,7 @@ end msgboxText = ['End time of epoch across ERPsets is different!'... 'See detail at command window.']; - disp(msgboxText); + % disp(msgboxText); chkerp(6) = 6; % data type across ERPsets is different % return end @@ -241,7 +241,7 @@ end msgboxText = ['Sampling rate across ERPsets is different!'... 'See detail at command window.']; - disp(msgboxText); + % disp(msgboxText); chkerp(7) = 7; % data type across ERPsets is different % return end diff --git a/studio_functions/Functions/EStudio/ERP Tab/f_dq_summary.m b/studio_functions/Functions/EStudio/ERP Tab/f_dq_summary.m index df39b91c..cdddcd45 100755 --- a/studio_functions/Functions/EStudio/ERP Tab/f_dq_summary.m +++ b/studio_functions/Functions/EStudio/ERP Tab/f_dq_summary.m @@ -14,18 +14,16 @@ end if isfield(ERP,'dataquality') == 0 -% beep; -% warning('No Dataquality measures here'); + % beep; + % warning('No Dataquality measures here'); return; end dq_measure_n = numel(ERP.dataquality); if dq_measure_n == 1 if isequal(ERP.dataquality(1).type,'empty') -% beep; -% disp('No Data Quality measures here') else - dq_subfield = 1; + dq_subfield = 1; end else for i=1:dq_measure_n @@ -34,52 +32,54 @@ if any(strcmpi(dq_names,dq_subfield_name)) dq_subfield = find(strcmpi(dq_names,dq_subfield_name) == 1); else -% beep; - disp('Could not find aSME here'); return end end ERP_summary = {0 0 0; 0 0 0; [0 0] [0 0] [0 0]; 0 0 0}; try -dq_data = ERP.dataquality(dq_subfield).data; - -if any(isnan(dq_data(:))) - beep; -% disp('Warning - NaNs in Data Quality measures') - return; -end - -if isempty(dq_data) -% beep; -% disp('Warning - No value was found in Data Quality measures') - return; -end -median_here = median(dq_data(:),'omitnan'); -[dist, median_loc_i] = min(abs(dq_data(:)-median_here)); -[med_elec,med_tw,med_bin] = ind2sub(size(dq_data),find(dq_data == dq_data(median_loc_i))); - -min_here = min(dq_data(:)); -[min_elec,min_tw,min_bin] = ind2sub(size(dq_data),find(dq_data == min_here)); - -max_here = max(dq_data(:)); -[max_elec,max_tw,max_bin] = ind2sub(size(dq_data),find(dq_data == max_here)); - -ERP_summary{1,1} = dq_data(median_loc_i); -ERP_summary{1,2} = min_here; -ERP_summary{1,3} = max_here; - -ERP_summary{2,1} = med_elec; -ERP_summary{2,2} = min_elec; -ERP_summary{2,3} = max_elec; - -ERP_summary{3,1} = [ERP.dataquality(dq_subfield).times(med_tw,1),ERP.dataquality(dq_subfield).times(med_tw,2)]; -ERP_summary{3,2} = [ERP.dataquality(dq_subfield).times(min_tw,1),ERP.dataquality(dq_subfield).times(med_tw,2)]; -ERP_summary{3,3} = [ERP.dataquality(dq_subfield).times(max_tw,1),ERP.dataquality(dq_subfield).times(max_tw,2)]; - -ERP_summary{4,1} = med_bin; -ERP_summary{4,2} = min_bin; -ERP_summary{4,3} = max_bin; - + dq_data = ERP.dataquality(dq_subfield).data; + binan = []; + count = 0; + for Numofbin = 1:size(dq_data,3) + if any(isnan(dq_data(:,:,Numofbin))) + count = count+1; + binan(count) = Numofbin; + end + end + dq_data(:,:,binan) = []; + + binleft = setdiff([1:size(dq_data,3)],binan); + + + if isempty(dq_data) + return; + end + median_here = median(dq_data(:),'omitnan'); + [dist, median_loc_i] = min(abs(dq_data(:)-median_here)); + [med_elec,med_tw,med_bin] = ind2sub(size(dq_data),find(dq_data == dq_data(median_loc_i))); + + min_here = min(dq_data(:)); + [min_elec,min_tw,min_bin] = ind2sub(size(dq_data),find(dq_data == min_here)); + + max_here = max(dq_data(:)); + [max_elec,max_tw,max_bin] = ind2sub(size(dq_data),find(dq_data == max_here)); + + ERP_summary{1,1} = dq_data(median_loc_i); + ERP_summary{1,2} = min_here(1); + ERP_summary{1,3} = max_here(1); + + ERP_summary{2,1} = med_elec(1); + ERP_summary{2,2} = min_elec(1); + ERP_summary{2,3} = max_elec(1); + + ERP_summary{3,1} = [ERP.dataquality(dq_subfield).times(med_tw(1),1),ERP.dataquality(dq_subfield).times(med_tw(1),2)]; + ERP_summary{3,2} = [ERP.dataquality(dq_subfield).times(min_tw(1),1),ERP.dataquality(dq_subfield).times(med_tw(1),2)]; + ERP_summary{3,3} = [ERP.dataquality(dq_subfield).times(max_tw(1),1),ERP.dataquality(dq_subfield).times(max_tw(1),2)]; + + ERP_summary{4,1} = binleft(med_bin(1)); + ERP_summary{4,2} = binleft(min_bin(1)); + ERP_summary{4,3} = binleft(max_bin(1)); + catch end \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/ERP Tab/f_erpset_geterpvalues.m b/studio_functions/Functions/EStudio/ERP Tab/f_erpset_geterpvalues.m deleted file mode 100755 index af5abba4..00000000 --- a/studio_functions/Functions/EStudio/ERP Tab/f_erpset_geterpvalues.m +++ /dev/null @@ -1,289 +0,0 @@ -% PURPOSE: Finding the users defined path to save the file - - -% [S S_out]= f_erpset_geterpvalues(varargin) - - - - - -%Author: Guanghui ZHANG--zhang.guanghui@foxmail.com -%Center for Mind and Brain -%University of California, Davis -%Davis, CA, USA -%Feb. 2022 - -% ERPLAB Studio - - -function S_out= f_erpset_geterpvalues(varargin); - -if nargin<1 - help f_erpset_geterpvalues - return -end -S_out = {}; - -if isempty(varargin) - CurrentERPSet = evalin('base','CURRENTERP'); - Current_ERP= evalin('base','ERP'); - %Adding chanArray - erpset = num2str(CurrentERPSet); - if ~exist('S','var') - S_in = {}; - erpvalues_variables = {'geterpvalues','latency','',... - 'binArray',[1:Current_ERP.nbin],... - 'chanArray', [1:Current_ERP.nchan],... - 'Erpsets', erpset,... - 'Measure','meanb1',... - 'Component',0,... - 'Resolution', [3],... - 'Baseline', 'pre',... - 'Binlabel', 'on',... - 'Peakpolarity','positive',... - 'Neighborhood', 5,... - 'Peakreplace', 'absolute',... - 'Filename', '',... - 'Warning','on',... - 'SendtoWorkspace', 'on',... - 'Append', '',... - 'FileFormat', 'wide',... - 'Afraction',0.5,... - 'Mlabel', '',... - 'Fracreplace', 'errormsg',... - 'IncludeLat', '',... - 'InterpFactor', 1,... - 'Viewer', 'off',... - 'PeakOnset',1,... - 'History', ''}; - S_OUT = createrplabstudioparameters(S_in,erpvalues_variables); - assignin('base','S',S_OUT); - S_out = S_OUT.geterpvalues; - else %%If the S exists in the MATLAB workspace - - S_IN = evalin('base','S'); - count_geterpvalues = f_findstring(S_IN,'geterpvalues'); - - if count_geterpvalues ==1 - S_out = S_IN.geterpvalues; - else - - erpvalues_variables = {'geterpvalues','latency','',... - 'binArray',[1:Current_ERP.nbin],... - 'chanArray', [1:Current_ERP.nchan],... - 'Erpsets', erpset,... - 'Measure','meanb1',... - 'Component',0,... - 'Resolution', [3],... - 'Baseline', 'pre',... - 'Binlabel', 'on',... - 'Peakpolarity','positive',... - 'Neighborhood', 5,... - 'Peakreplace', 'absolute',... - 'Filename', '',... - 'Warning','on',... - 'SendtoWorkspace', 'on',... - 'Append', '',... - 'FileFormat', 'wide',... - 'Afraction',0.5,... - 'Mlabel', '',... - 'Fracreplace', 'errormsg',... - 'IncludeLat', '',... - 'InterpFactor', 1,... - 'Viewer', 'off',... - 'PeakOnset',1,... - 'History', '',... - 'ERPselect',1}; - S_OUT = createrplabstudioparameters(S_IN,erpvalues_variables); - assignin('base','S',S_OUT); - S_out = S_OUT.geterpvalues; - end - - end -end - -if ~isempty(varargin) - S_out = varargin{1}; -end - -f_erpset_selection = figure( 'Name', 'ERP Measurement Tool', ... - 'NumberTitle', 'off', ... - 'MenuBar', 'none', ... - 'Toolbar', 'none', ... - 'HandleVisibility', 'off'); -f_erpset_selection.Position(3:4) = [300 150]; - -Current_ERPset = evalin('base','CURRENTERP'); -ALLERP = evalin('base','ALLERP'); -ERP_selection_label = [1 0 0]; - -erpset_selection_gui() - - - function erpset_selection_gui() - b1 = uiextras.VBox( 'Parent', f_erpset_selection); - - b11 = uiextras.HBox( 'Parent', b1 ); - - b111 = uicontrol('Style','text','Parent', b11,'String','ERPset setting','fontsize',12);%,'FontWeight', 'bold'); - - %%------------------------------------------------------------------- - b12 = uiextras.HBox( 'Parent', b1 ); - - - %%--------------------------Current ERPset------------------------------ - b112= uicontrol('Style','radiobutton','Parent',b12,'String',['Current ERPSet:',32,'[',num2str(Current_ERPset),']',32,ALLERP(Current_ERPset).erpname],'callback',@currenterpset_toggle); % 1B - uiextras.Empty('Parent',b12); - - set(b12,'Sizes',[250 50]); - b_nonzero = find(ERP_selection_label); - - if ~isempty(b_nonzero) - if ~ERP_selection_label(1) - % set(b112,'enable','off', 'ForegroundColor', [.5 0.5 0.5]); - else - set(b112,'value',ERP_selection_label(1) ,'enable','on'); - end - end - %%------------------From Checked ERPsets----------------------------------- - b14 = uiextras.HBox( 'Parent', b1); - - b141 = uicontrol('Style','radiobutton','Parent', b14,'String','Checked ERPsets','callback',@erpset_checked);%,'HandleVisibility','off' - - b142 = uicontrol('Style','pushbutton','Parent', b14,'String','Options'); - if ~isempty(b_nonzero) - if ~ERP_selection_label(2) - % set(b141,'enable','off', 'ForegroundColor', [.5 0.5 0.5]); - set(b142,'enable','off', 'ForegroundColor', [.5 0.5 0.5]); - else - set(b141,'enable','on','value',ERP_selection_label(2) ); - end - end - %%----------------------------ERPsets menu--------------------------------- - b15 = uiextras.HBox( 'Parent', b1); - - b151 = uicontrol('Style','radiobutton','Parent', b15,'String','From ERPset menu','callback',@erpset_menu); - - b152 = uicontrol('Style','pushbutton','Parent', b15,'String','Options','callback',@erpset_menu_select); - - if ~isempty(b_nonzero) - if ~ERP_selection_label(3) - % set(b151,'enable','off', 'ForegroundColor', [.5 0.5 0.5]); - set(b152,'enable','off', 'ForegroundColor', [.5 0.5 0.5]); - else - set(b151,'value',ERP_selection_label(3) ,'enable','on'); - end - end - %%------------------------Cancel and Run---------------------------------- - b16 = uiextras.HBox( 'Parent', b1); - uicontrol( 'Parent', b16, 'String', 'Cancel','callback',@Local_cancel); - uicontrol( 'Parent', b16, 'String', 'Run','callback',@Local_run); - end - - -%%*********************************************************************** -%%****************** subfunctions *********************************** -%%*********************************************************************** - -%%------------------------Current ERPset----------------------------------- - function currenterpset_toggle(source_current_erp,~) - value_currenterp = source_current_erp.Value; - if value_currenterp ==1 - ERP_selection_label(1) = value_currenterp; - ERP_selection_label(2:end) =0; - elseif value_currenterp == 0 - ERP_selection_label(1:end) =0; - end - erpset_selection_gui(); - S_out.Erpsets = Current_ERPset; - end - - -%%------------------------Checked ERPset----------------------------------- - function erpset_checked(Source_checked_ERP,~) - - value_checkederp = Source_checked_ERP.Value; - - if value_checkederp ==1 - ERP_selection_label(2) = value_checkederp; - ERP_selection_label([1 3]) =0; - elseif value_checkederp == 0 - ERP_selection_label(1:end) =0; - end - erpset_selection_gui(); - - end - -%%-----------------------ERPsets from menu--------------------------------- - function erpset_menu(Source_erp_menu,~) - value_currenterp = Source_erp_menu.Value; - if value_currenterp ==1 - ERP_selection_label(3) = value_currenterp; - ERP_selection_label([1 2]) =0; - S_out.Erpsets = [1:length(ALLERP)]; - elseif value_currenterp == 0 - ERP_selection_label(1:end) =0; - end - erpset_selection_gui(); - end - -%%------------Select the ERPsets of interest from menu--------------------- - function erpset_menu_select(~,~) - - if ~isempty(ALLERP) - for Numoferpset = 1:length(ALLERP) - listb{Numoferpset}= ['Erpset',32,num2str(Numoferpset),':',32,ALLERP(Numoferpset).erpname]; - end - indxlistb = 1:length(ALLERP); - titlename = 'Select ERPset(s):'; - - chan_label_select = browsechanbinGUI(listb, indxlistb, titlename); - - if ~isempty(chan_label_select) - S_out.Erpsets = chan_label_select; - - if length(chan_label_select) ==1 - disp(['ERPset(s):',num2str(chan_label_select),32,'will be used for next analysis']) - else - disp(['ERPset(s):',num2str(chan_label_select(1:end-1)),32,'and',32,num2str(chan_label_select(end)),32,'will be used for next analysis']) - end - else - beep; - disp('User selected Cancel') - return - end - - else - msgboxText = 'No ERPset information was found'; - title = 'EStudio: ERP measurement tool input'; - errorfound(msgboxText, title); - return; - end - end - -%%-------------------Cancel---------------------------------------------- - function Local_cancel(Source_localp_cancel,~) - Values_localp_cancel = Source_localp_cancel.Value; - if ~isempty(Values_localp_cancel) - beep; - disp('User selected Cancel'); - close(f_erpset_selection); - S.geterpvalues = S_out; - % varargout{1} = S_out; - return; - end - end -%%-----------------------Run----------------------------------------------- - function Local_run(Source_localp_run,~) - Values_localp_run = Source_localp_run.Value; - if ~isempty(Values_localp_run) - - S= evalin('base','S'); - S.geterpvalues = S_out; - assignin('base','S',S); - close(f_erpset_selection); - % return; - end - end -%%%Program end -end diff --git a/studio_functions/Functions/EStudio/ERP Tab/f_getFFTfromERP.m b/studio_functions/Functions/EStudio/ERP Tab/f_getFFTfromERP.m index 0bdb14ba..18c806f2 100755 --- a/studio_functions/Functions/EStudio/ERP Tab/f_getFFTfromERP.m +++ b/studio_functions/Functions/EStudio/ERP Tab/f_getFFTfromERP.m @@ -42,7 +42,7 @@ NFFT = 2.^nextpow2(4*fnyqx); NFFT = NFFT*2; fs = ERP.srate; -fnyq = fs/2; +fnyq = round(fs/2); nbin = ERP.nbin; nchan = ERP.nchan; freq = fnyq*linspace(0,1,NFFT/2); diff --git a/studio_functions/Functions/EStudio/ERP Tab/f_preparms_erptab.m b/studio_functions/Functions/EStudio/ERP Tab/f_preparms_erptab.m new file mode 100644 index 00000000..67e133dd --- /dev/null +++ b/studio_functions/Functions/EStudio/ERP Tab/f_preparms_erptab.m @@ -0,0 +1,449 @@ +%%this function is used to call back the parameters for plotting ERP wave + +% *** This function is part of EStudio Toolbox *** +% Author: Guanghui Zhang & Steven Luck +% Center for Mind and Brain +% University of California, Davis, +% Davis, CA +% Oct 2023 + + +function OutputViewerparerp = f_preparms_erptab(ERP,matlabfig,History,FigureName) + +OutputViewerparerp = ''; +if nargin<1 + help f_preparms_erptab(); + return +end +if isempty(ERP) + disp('f_preparms_erptab(): ERP is empty'); + return; +end + +if nargin<3 + History = 'gui'; +end + +if nargin <2 + matlabfig=1; +end +if nargin <4 + FigureName = ''; +end + +%%channel array and bin array +% +%%channels +ChanArray=estudioworkingmemory('ERP_ChanArray'); +nbchan = ERP.nchan; +if isempty(ChanArray) || any(ChanArray(:)>nbchan) || any(ChanArray(:)<=0) + ChanArray = 1:nbchan; + estudioworkingmemory('ERP_ChanArray',ChanArray); +end + +% +%%bins +BinArray=estudioworkingmemory('ERP_BinArray'); +if isempty(BinArray) || any(BinArray(:)>ERP.nbin) || any(BinArray(:)<=0) + BinArray = [1:ERP.nbin]; + estudioworkingmemory('ERP_BinArray',BinArray); +end + + +% +%%Plot setting +ERPTab_plotset_pars = estudioworkingmemory('ERPTab_plotset_pars'); + +% +%%time range +timeStartdef = ERP.times(1); +timEnddef = ERP.times(end); +[def xstepdef]= default_time_ticks_studio(ERP, [ERP.times(1),ERP.times(end)]); + +try timerange = ERPTab_plotset_pars{1}; catch timerange =[timeStartdef,timEnddef]; end +try + timeStart = timerange(1); +catch + timeStart = timeStartdef; +end +if isempty(timeStart) || numel(timeStart)~=1 || any(timeStart>timEnddef) + timeStart = timeStartdef; +end + +try + timEnd = timerange(2); +catch + timEnd = timEnddef; +end +if isempty(timEnd) || numel(timEnd)~=1 || any(timEnd timEnd + timEnd = timEnddef; + timeStart = timeStartdef; +end + +try xtickstep = ERPTab_plotset_pars{2}; catch xtickstep = xstepdef; end +if isempty(xtickstep) || numel(xtickstep)~=1 || any(xtickstep<=0) || xtickstep > (timEnd-timeStart) + xtickstep = xstepdef; +end + +%%y scale +try PolarityValue=ERPTab_plotset_pars{6};catch PolarityValue=1; end +if isempty(PolarityValue) || numel(PolarityValue)~=1 || (PolarityValue~=1&&PolarityValue~=0) + PolarityValue=1; +end +if PolarityValue==1 + positive_up = 1; + PolarityWave=1; +else + positive_up = -1; + PolarityWave=0; +end +ERP1 = ERP; +ERP1.bindata = ERP.bindata(ChanArray,:,:); +[def, minydef, maxydef] = default_amp_ticks(ERP1, BinArray); +minydef = floor(minydef); +maxydef = ceil(maxydef); +if ~isempty(minydef) && ~isempty(maxydef) + if minydef==maxydef + minydef=-1; + maxydef=1; + end +elseif isempty(minydef) || isempty(maxydef) + minydef=-1; + maxydef=1; +end + +try yscale = ERPTab_plotset_pars{3};catch yscale= [minydef,maxydef]; end +if isempty(yscale) || numel(yscale)~=2 + yscale= [minydef,maxydef]; +end + +YtickSpace=1.5; +Fillscreen=1; + +defyticks = default_amp_ticks_viewer(yscale); +if ~isempty(defyticks) +defyticks = str2num(defyticks); +else + defyticks = []; +end +if ~isempty(defyticks) && numel(defyticks)>=2 + ytickstepdef = min(diff(defyticks)); +else + ytickstepdef = floor((yscale(2)-yscale(1))/2); +end +try yscale_step = ERPTab_plotset_pars{4};catch yscale_step=ytickstepdef; end +if isempty(yscale_step) || numel(yscale_step)~=1 || any(yscale_step<=0) + yscale_step = ytickstepdef; +end + +Yticks = []; +if yscale(2)<=0 || yscale(1)>=0 + Yticks = yscale(1); + for ii=1:1000 + ytickcheck = Yticks(end)+yscale_step; + if ytickcheck>yscale(2) + break; + else + Yticks(numel(Yticks)+1) =ytickcheck; + end + end +elseif yscale(1)<0 && yscale(2)>0 + Yticks = 0; + for ii=1:1000 + ytickcheck = Yticks(1)-yscale_step; + if ytickcheckyscale(2) + break; + else + Yticks = [Yticks,ytickcheck]; + end + end +else + Yticks = yscale; +end +if isempty(Yticks) || numel(Yticks)==1 + Yticks = yscale; +end + +%%-----------------------standard error----------------------------------- +try SEMValue = ERPTab_plotset_pars{11};catch SEMValue = [0 0 0];end + +try SEMFlag =SEMValue(1); catch SEMFlag=0; end +if isempty(SEMFlag) || (SEMFlag~=0 && SEMFlag~=1) + SEMFlag=0; +end +if SEMFlag==1 + try Standerr = SEMValue(2); catch Standerr=1; end + if isempty(Standerr) || numel(Standerr)~=1 || any(Standerr<0) || any(Standerr>10) + Standerr=1; + end + + try Transparency = SEMValue(3); catch Transparency=0.2; end + if isempty(Transparency) || numel(Transparency)~=1 || any(Transparency<0) || any(Transparency>1) + Transparency=0.2; + end +else + Standerr=0; + Transparency=0; +end + + +try columNum =ERPTab_plotset_pars{5}; catch columNum=1; end + +if isempty(columNum) || numel(columNum)~=1 || any(columNum<=0) + columNum=1; +end + + +try Binchan_Overlay = ERPTab_plotset_pars{7}; catch Binchan_Overlay=0; end +if isempty(Binchan_Overlay) || numel(Binchan_Overlay)~=1 || (Binchan_Overlay~=0 && Binchan_Overlay~=1) + Binchan_Overlay=0; +end + +try layoutDef = ERPTab_plotset_pars{9};catch layoutDef=1;end +if layoutDef==1 + ChanArray = sort(ChanArray); +end + +if Binchan_Overlay==0 + rowNumdef = numel(ChanArray); + plotArray = ChanArray; + [~, labelsdef, ~, ~, ~] = readlocs(ERP.chanlocs(ChanArray)); + PLOTORG = [1 2 3]; + nplot = numel(BinArray); + LegendName = ERP.bindescr(BinArray); +else + rowNumdef = numel(BinArray); + plotArray = BinArray; + labelsdef =ERP.bindescr(BinArray); + PLOTORG = [2 1 3]; + nplot = numel(ChanArray); + [~, chanlabels, ~, ~, ~] = readlocs(ERP.chanlocs); + if layoutDef==2 + try + chanindexnew = f_estudio_chan_frontback_left_right(ERP.chanlocs(sort(ChanArray))); + if ~isempty(chanindexnew) + ChanArray1=sort(ChanArray); + ChanArray = ChanArray1(chanindexnew); + end + catch + + end + end + LegendName = chanlabels(ChanArray); +end +try rowNum = ERPTab_plotset_pars{8};catch rowNum=rowNumdef; end + + +plotBox = [rowNum,columNum]; + +GridposArraydef = zeros(rowNum,columNum); +count = 0; +for Numofrow = 1:rowNum + for Numofcolumn = 1:columNum + count = count +1; + if count<= numel(plotArray) + GridposArraydef(Numofrow,Numofcolumn)= plotArray(count); + else + break; + end + end +end +if layoutDef==2 && Binchan_Overlay==0 + try + if isfield(ERP,'chanlocs') && ~isempty(ERP.chanlocs) + chanindexnew = f_estudio_chan_frontback_left_right(ERP.chanlocs(sort(ChanArray))); + if ~isempty(chanindexnew) + ChanArray1 = sort(ChanArray); + ChanArray = ChanArray1(chanindexnew); + end + [~, chanlabels, ~, ~, ~] = readlocs(ERP.chanlocs); + labelsdef=chanlabels(ChanArray); + end + GridposArraydef = zeros(rowNum,columNum); + count = 0; + for Numofrow = 1:rowNum + for Numofcolumn = 1:columNum + count = count +1; + if count<= numel(plotArray) + GridposArraydef(Numofrow,Numofcolumn)= ChanArray(count); + else + break; + end + end + end + catch + end +end + + +GridposArray =zeros(rowNum,columNum); +try DataDf = ERPTab_plotset_pars{10};catch DataDf = [];end +if layoutDef==1 || layoutDef==2 + GridposArray = GridposArraydef; +else + if isempty(DataDf) || size(DataDf,1)~=rowNum || size(DataDf,2)~=columNum + GridposArray = GridposArraydef; + else + for Numofrow = 1:rowNum + for Numofcolumn = 1:columNum + SingleStr = char(DataDf{Numofrow,Numofcolumn});%%find the index for each cell + if ~isempty(SingleStr) + [C,IA] = ismember_bc2(SingleStr,labelsdef); + if C==1 + try GridposArray(Numofrow,Numofcolumn)= plotArray(IA);catch GridposArray(Numofrow,Numofcolumn)= 0; end + end + end + end + end + end +end + +figSize = estudioworkingmemory('egfigsize'); +if isempty(figSize) + figSize = []; +end + +LineColorspec = get_colors(nplot); +LineWidthspec= ones(nplot,1); +for ii = 1:nplot + LineMarkerspec{ii} = 'none'; + LineStylespec{ii} = '-'; +end + +FonsizeDefault = f_get_default_fontsize(); +FontSizeLeg = FonsizeDefault; +CBEFontsize = FonsizeDefault; +LabelsName = labelsdef; + +Gridspace = [1 20;1 20]; +timeRange = [timeStart,timEnd]; +[timeticksdef stepX]= default_time_ticks_studio(ERP, timeRange); +timeticksdef = str2num(char(timeticksdef)); +qtimeRangdef = round(timeRange/100)*100; +qXticks = xtickstep+qtimeRangdef(1); +for ii=1:1000 + xtickcheck = qXticks(end)+xtickstep; + if xtickcheck>timeRange(2) + break; + else + qXticks(numel(qXticks)+1) =xtickcheck; + end +end +if isempty(qXticks)%%|| stepX==xtickstep + qXticks = timeticksdef; +end +timeticks = qXticks; +xticklabel = 'on'; +xlabelFontsize = FonsizeDefault; +xlabelFontcolor = [0 0 0]; +Xunits = 'off'; +MinorticksX = [0]; +Yscales = yscale; + +yticklabel = 'on'; +yunits = 'off'; +MinorticksY = 0; +YlabelFontsize = FonsizeDefault; +ylabelFontcolor = [0 0 0]; +TextcolorLeg = 1; + +[xxx, latsamp1, latdiffms] = closest(ERP.times, timeRange); +qtimes = ERP.times(latsamp1(1):latsamp1(2)); + +[xxx, latsamp, latdiffms] = closest(qtimes, 0); +if isempty(latsamp) || any(latsamp<=0) + labelxrange = 0; +else + labelxrange = qtimes(latsamp)-qtimes(1); +end +CBELabels = [1 100 1]; +if labelxrange<=0 + CBELabels = [1 100 1]; +else + CBELabels(1) = 100*labelxrange/(timeRange(2)-timeRange(1))+1; +end + +% CBELabels = [0 100 1]; +Legcolumns = ceil(sqrt(length(LegendName))); +CBETcolor = [0 0 0]; +XdispFlag = 1; + +new_pos = estudioworkingmemory('EStudioScreenPos'); +if isempty(new_pos) || numel(new_pos)~=2 + new_pos = [75,75]; + estudioworkingmemory('EStudioScreenPos',new_pos); +end +try + ScreenPos = get( groot, 'Screensize' ); +catch + ScreenPos = get( 0, 'Screensize' ); +end + +FigOutpos = [ScreenPos(3)*new_pos(1)/100,ScreenPos(4)*new_pos(2)/100]*8/9; +if isempty(FigureName) + FigureName = ERP.erpname; +end + +if matlabfig==1 + [ERP, erpcom] = pop_plotERPwaviewer(ERP,1,1, BinArray, ChanArray,... + 'PLOTORG',PLOTORG,'GridposArray',GridposArray,'LabelsName',LabelsName, 'Blc', 'none','Box',plotBox,'LineColor',LineColorspec,'LineStyle',LineStylespec,... + 'LineMarker',LineMarkerspec,'LineWidth',LineWidthspec,'LegendName',LegendName,'LegendFontsize',FontSizeLeg,... + 'Labeloc',CBELabels,'Labelfontsize',CBEFontsize,'YDir',PolarityWave,'SEM',Standerr,'Transparency', Transparency,... + 'GridSpace',Gridspace,'TimeRange',timeRange,'Xticks',timeticks,'Xticklabel',xticklabel,'Xlabelfontsize',xlabelFontsize,... + 'Xlabelcolor',xlabelFontcolor,'Xunits',Xunits,'MinorTicksX',MinorticksX,... + 'YScales',Yscales,'Yticks',Yticks,'Yticklabel',yticklabel,'Ylabelfontsize',YlabelFontsize,... + 'Ylabelcolor',ylabelFontcolor,'Yunits',yunits,'MinorTicksY',MinorticksY,'LegtextColor',TextcolorLeg,'Legcolumns',Legcolumns,... + 'FigureName',FigureName,'FigbgColor',[1 1 1],'Labelcolor',CBETcolor,'Ytickdecimal',1,'Xtickdecimal',0,'XtickdisFlag',XdispFlag,... + 'FigOutpos',FigOutpos,'History', History);% +else + OutputViewerparerp{1} = ChanArray; + OutputViewerparerp{2} = BinArray; + OutputViewerparerp{3} =timeStart; + OutputViewerparerp{4} =timEnd; + OutputViewerparerp{5} =xtickstep; + OutputViewerparerp{6} =yscale; + OutputViewerparerp{7} =Yticks; + OutputViewerparerp{8} =Fillscreen; + OutputViewerparerp{9} = columNum; + OutputViewerparerp{10} =positive_up; + OutputViewerparerp{11} =Binchan_Overlay; + OutputViewerparerp{12} = rowNum; + OutputViewerparerp{13} = GridposArray; + OutputViewerparerp{14} = Standerr; + OutputViewerparerp{15} = Transparency; +end + + function colors = get_colors(ncolors) + % Each color gets 1 point divided into up to 2 of 3 groups (RGB). + degree_step = 6/ncolors; + angles = (0:ncolors-1)*degree_step; + colors = nan(numel(angles),3); + for i = 1:numel(angles) + if angles(i) < 1 + colors(i,:) = [1 (angles(i)-floor(angles(i))) 0]*0.75; + elseif angles(i) < 2 + colors(i,:) = [(1-(angles(i)-floor(angles(i)))) 1 0]*0.75; + elseif angles(i) < 3 + colors(i,:) = [0 1 (angles(i)-floor(angles(i)))]*0.75; + elseif angles(i) < 4 + colors(i,:) = [0 (1-(angles(i)-floor(angles(i)))) 1]*0.75; + elseif angles(i) < 5 + colors(i,:) = [(angles(i)-floor(angles(i))) 0 1]*0.75; + else + colors(i,:) = [1 0 (1-(angles(i)-floor(angles(i))))]*0.75; + end + end + end +end diff --git a/studio_functions/Functions/EStudio/ERP Tab/f_preparms_mtviewer_erptab.m b/studio_functions/Functions/EStudio/ERP Tab/f_preparms_mtviewer_erptab.m new file mode 100644 index 00000000..76937c1f --- /dev/null +++ b/studio_functions/Functions/EStudio/ERP Tab/f_preparms_mtviewer_erptab.m @@ -0,0 +1,299 @@ +%%this function is used to call back the parameters for plotting ERP wave + +% *** This function is part of EStudio Toolbox *** +% Author: Guanghui Zhang & Steven Luck +% Center for Mind and Brain +% University of California, Davis, +% Davis, CA +% Nov. 2023 + + +function OutputViewerparerp = f_preparms_mtviewer_erptab(ERP,matlabfig,History,figureName) + +OutputViewerparerp = ''; +if nargin<1 + help f_preparms_erptab(); + return +end +if isempty(ERP) + disp('f_preparms_erptab(): ERP is empty'); + return; +end + +if nargin<3 + History = 'gui'; +end + +if nargin <2 + matlabfig=1; +end +if nargin <4 + figureName = ''; +end + +%%channel array and bin array +% +%%channels +ChanArray=estudioworkingmemory('ERP_ChanArray'); +nbchan = ERP.nchan; +if isempty(ChanArray) || any(ChanArray(:)>nbchan) || any(ChanArray(:)<=0) + ChanArray = 1:nbchan; + estudioworkingmemory('ERP_ChanArray',ChanArray); +end + +ERP_chanorders = estudioworkingmemory('ERP_chanorders'); +ChanArray = reshape(ChanArray,1,[]); +try chanOrder = ERP_chanorders{1};catch chanOrder = 1; end +if isempty(chanOrder) || any(chanOrder<=0) || numel(chanOrder)~=1 || (chanOrder~=1 && chanOrder~=2 && chanOrder~=3) + chanOrder=1; +end +try + if chanOrder==2 + if isfield(ERP,'chanlocs') && ~isempty(ERP.chanlocs) + chanindexnew = f_estudio_chan_frontback_left_right(ERP.chanlocs(ChanArray)); + if ~isempty(chanindexnew) + ChanArray = ChanArray(chanindexnew); + end + end + elseif chanOrder==3 + [eloc, labels, theta, radius, indices] = readlocs(ERP.chanlocs); + chanorders = ERP_chanorders{2}; + chanorderindex = chanorders{1}; + chanorderindex1 = unique(chanorderindex); + chanorderlabels = chanorders{2}; + [C,IA]= ismember_bc2(chanorderlabels,labels); + Chanlanelsinst = labels(ChanArray); + if ~any(IA==0) && numel(chanorderindex1) == length(labels) + [C,IA1]= ismember_bc2(Chanlanelsinst,chanorderlabels); + [C,IA2]= ismember_bc2(Chanlanelsinst,labels); + ChanArray = IA2(chanorderindex(IA1)); + end + end +catch +end + +% +%%bins +BinArray=estudioworkingmemory('ERP_BinArray'); +if isempty(BinArray) || any(BinArray(:)>ERP.nbin) || any(BinArray(:)<=0) + BinArray = [1:ERP.nbin]; + estudioworkingmemory('ERP_BinArray',BinArray); +end + + +% +%%Plot setting +ERPTab_plotset_pars = estudioworkingmemory('ERPTab_plotset_pars'); + +% +%%time range +timeStartdef = ERP.times(1); +timEnddef = ERP.times(end); +[def xstepdef]= default_time_ticks_studio(ERP, [ERP.times(1),ERP.times(end)]); + +try timerange = ERPTab_plotset_pars{1}; catch timerange =[timeStartdef,timEnddef]; end +try + timeStart = timerange(1); +catch + timeStart = timeStartdef; +end +if isempty(timeStart) || numel(timeStart)~=1 || any(timeStart>timEnddef) + timeStart = timeStartdef; +end + +try + timEnd = timerange(2); +catch + timEnd = timEnddef; +end +if isempty(timEnd) || numel(timEnd)~=1 || any(timEnd timEnd + timEnd = timEnddef; + timeStart = timeStartdef; +end + +try xtickstep = ERPTab_plotset_pars{2}; catch xtickstep = xstepdef; end +if isempty(xtickstep) || numel(xtickstep)~=1 || any(xtickstep<=0) || xtickstep > (timEnd-timeStart) + xtickstep = xstepdef; +end + +%%y scale +try PolarityValue=ERPTab_plotset_pars{7};catch PolarityValue=1; end +if isempty(PolarityValue) || numel(PolarityValue)~=1 || (PolarityValue~=1&&PolarityValue~=-1) + PolarityValue=1; +end +if PolarityValue==1 + positive_up = 1; +else + positive_up = -1; +end + +YScaledef =prctile(ERP.bindata(:)*positive_up,95)*2/3; +if YScaledef>= 0&&YScaledef <=0.1 + YScaledef = 0.1; +elseif YScaledef< 0&& YScaledef > -0.1 + YScaledef = 0.1; +else + YScaledef = round(YScaledef); +end +try YtickInterval = ERPTab_plotset_pars{3};catch YtickInterval= YScaledef; end +if isempty(YtickInterval) || numel(YtickInterval)~=1 || any(YtickInterval<0.1) + YtickInterval= YScaledef; +end + +try YtickSpace =ERPTab_plotset_pars{4};catch YtickSpace=1.5; end +if isempty(YtickSpace) || numel(YtickSpace)~=1 || any(YtickSpace<=0) + YtickSpace=1.5; +end + +try Fillscreen = ERPTab_plotset_pars{5};catch Fillscreen=1; end +if isempty(Fillscreen) || numel(Fillscreen)~=1 || (Fillscreen~=0 && Fillscreen~=1) + Fillscreen=1; +end + +try columNum =ERPTab_plotset_pars{6}; catch columNum=1; end +if isempty(columNum) || numel(columNum)~=1 || any(columNum<=0) + columNum=1; +end +columNum=1; + +try Binchan_Overlay = ERPTab_plotset_pars{8}; catch Binchan_Overlay=0; end +if isempty(Binchan_Overlay) || numel(Binchan_Overlay)~=1 || (Binchan_Overlay~=0 && Binchan_Overlay~=1) + Binchan_Overlay=0; +end +Binchan_Overlay=0; + +if Binchan_Overlay==0 + rowNumdef = numel(ChanArray); + plotArray = ChanArray; + [~, labelsdef, ~, ~, ~] = readlocs(ERP.chanlocs(ChanArray)); + PLOTORG = [1 2 3]; + nplot = numel(BinArray); + LegendName = ERP.bindescr(BinArray); +else + rowNumdef = numel(BinArray); + plotArray = BinArray; + labelsdef =ERP.bindescr(BinArray); + PLOTORG = [2 1 3]; + nplot = numel(ChanArray); + [~, chanlabels, ~, ~, ~] = readlocs(ERP.chanlocs(ChanArray)); + LegendName = chanlabels(ChanArray); +end + + +try rowNum = ERPTab_plotset_pars{9};catch rowNum=rowNumdef; end +rowNum=rowNumdef; + +figSize = estudioworkingmemory('egfigsize'); +if isempty(figSize) + figSize = []; +end + + +GridposArraydef = zeros(rowNum,columNum); +count = 0; +for Numofrow = 1:rowNum + for Numofcolumn = 1:columNum + count = count +1; + if count<= numel(plotArray) + GridposArraydef(Numofrow,Numofcolumn)= plotArray(count); + else + break; + end + end +end + + + +%%----------------------------Measurement tool----------------------------- +geterpvaluesparas = estudioworkingmemory('pop_geterpvalues'); +try moption = geterpvaluesparas{7}; catch moption = 'meanbl'; end + +try latency = geterpvaluesparas{4};catch latency = []; end + +try blc = geterpvaluesparas{10}; catch blc = 'none'; end +if numel(blc)~=2 + if ~ismember_bc2(blc, {'none','pre','post','all','whole'}) + blc = 'none'; + end +end +try intfactor = geterpvaluesparas{21}; catch intfactor=1; end + +if isempty(intfactor) || numel(intfactor)~=1 || any(intfactor<=0 ) || any(intfactor>10) + intfactor=1; +end + +try Resolution = geterpvaluesparas{9};catch Resolution=3; end +if isempty(Resolution) || numel(Resolution)~=1 || any(Resolution<1) || any(Resolution>6) + Resolution =3; +end + +try Afraction = geterpvaluesparas{15};catch Afraction = 0.5;end +if isempty(Afraction) || numel(Afraction)~=1 || any(Afraction<=0) || any(Afraction>=1) + Afraction = 0.5; +end + +try polpeak = geterpvaluesparas{12};catch polpeak=0; end +if isempty(polpeak) || numel(polpeak)~=1 || (polpeak~=0 && polpeak~=1) + polpeak=0; +end + +try locpeakrep= geterpvaluesparas{14};catch locpeakrep=1; end +if isempty(locpeakrep) || numel(locpeakrep)~=1 || (locpeakrep~=0 && locpeakrep~=1) + locpeakrep=0;%%NaN +end + +% try fracmearep= geterpvaluesparas{16};catch fracmearep=1; end +% if isempty(fracmearep) || numel(fracmearep)~=1 || (fracmearep~=0 && fracmearep~=1 && fracmearep~=2) +% fracmearep=0; +% end +fracmearep=0;%%always NAN for preview: Apr 2024 GH + +try PeakOnset = geterpvaluesparas{22};catch PeakOnset=1; end +if isempty(PeakOnset) || numel(PeakOnset)~=1 || (PeakOnset~=0 && PeakOnset~=1) + PeakOnset=1; +end +matlab_ver = version('-release'); +Matlab_ver = str2double(matlab_ver(1:4)); + + +try sampeak = geterpvaluesparas{14};catch sampeak=1; end +if isempty(sampeak) ||numel(sampeak)~=1 || any(sampeak<1) + sampeak=1; +end + +if matlabfig==1 +% [EEG, eegcom] = pop_ploterptab(EEG,'ChanArray',ChanArray,'ICArray',ICArray,'Winlength',Winlength,... +% 'AmpScale',AmpScale,'ChanLabel',ChanLabel,'Submean',Submean,'EventOnset',EventOnset,... +% 'StackFlag',StackFlag,'NormFlag',NormFlag,'Startimes',Startimes,'figureName',figureName,'figSize',figSize,'History',History); +else + OutputViewerparerp{1} = ChanArray; + OutputViewerparerp{2} = BinArray; + OutputViewerparerp{3} =timeStart; + OutputViewerparerp{4} =timEnd; + OutputViewerparerp{5} =xtickstep; + OutputViewerparerp{6} =YtickInterval; + OutputViewerparerp{7} =YtickSpace; + OutputViewerparerp{8} =Fillscreen; + OutputViewerparerp{9} = columNum; + OutputViewerparerp{10} =positive_up; + OutputViewerparerp{11} =Binchan_Overlay; + OutputViewerparerp{12} =moption; + OutputViewerparerp{13} =latency; + OutputViewerparerp{14} =blc; + OutputViewerparerp{15} =intfactor; + OutputViewerparerp{16} =Resolution; + OutputViewerparerp{17} =Afraction; + OutputViewerparerp{18} =polpeak; + OutputViewerparerp{19} = locpeakrep; + OutputViewerparerp{20} =fracmearep; + OutputViewerparerp{21} =PeakOnset; + OutputViewerparerp{22} =Matlab_ver; + OutputViewerparerp{23} =sampeak; + OutputViewerparerp{24} =GridposArraydef; +end + +end \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/ERP Tab/f_redrawERP.m b/studio_functions/Functions/EStudio/ERP Tab/f_redrawERP.m index b6b2ec98..75ef37fc 100755 --- a/studio_functions/Functions/EStudio/ERP Tab/f_redrawERP.m +++ b/studio_functions/Functions/EStudio/ERP Tab/f_redrawERP.m @@ -1,186 +1,527 @@ %This function is to plot ERP waves with single or multiple columns on one page. - - -% Author: Guanghui Zhang & Steve J. Luck & Andrew Stewart +% Author: Guanghui Zhang & Steve J. Luck % Center for Mind and Brain % University of California, Davis, % Davis, CA -% 2022 +% 2022 -2024 function f_redrawERP() -% Draw a demo ERP into the axes provided global observe_ERPDAT; global EStudio_gui_erp_totl; -% addlistener(observe_ERPDAT,'Messg_change',@Count_Process_messg_change); - -S_ws_geterpset= estudioworkingmemory('selectederpstudio'); -if isempty(S_ws_geterpset) - S_ws_geterpset = observe_ERPDAT.CURRENTERP; - if isempty(S_ws_geterpset) - msgboxText = 'No ERPset was selected!!!'; - title = 'EStudio: ERPsets'; - errorfound(msgboxText, title); - return; - end - S_erpplot = f_ERPplot_Parameter(observe_ERPDAT.ALLERP,S_ws_geterpset); - estudioworkingmemory('geterpbinchan',S_erpplot.geterpbinchan); - estudioworkingmemory('geterpplot',S_erpplot.geterpplot); +FonsizeDefault = f_get_default_fontsize(); +try + [version reldate,ColorB_def,ColorF_def,errorColorF_def] = geterplabstudiodef;%%Get background color +catch + ColorB_def = [0.702,0.77,0.85]; +end +if isempty(ColorB_def) + ColorB_def = [0.702,0.77,0.85]; end -S_ws_getbinchan = estudioworkingmemory('geterpbinchan'); -S_ws_geterpplot = estudioworkingmemory('geterpplot'); +set(0,'units','pixels') +Pix_SS = get(0,'screensize'); +set(0,'units','inches') +Inch_SS = get(0,'screensize'); +Resolation = Pix_SS./Inch_SS; -%%Parameter from bin and channel panel -% Elecs_shown = estudioworkingmemory('ChanShow'); -Elecs_shown = S_ws_getbinchan.elecs_shown{S_ws_getbinchan.Select_index}; -% if isempty(Elecs_shown) || max(Elecs_shown)> numel(Elecs_shown_all) -% Elecs_shown = Elecs_shown_all; -% end -Bins = S_ws_getbinchan.bins{S_ws_getbinchan.Select_index}; try - Bin_chans = S_ws_getbinchan.bins_chans(S_ws_getbinchan.Select_index); + EStudio_gui_erp_totl.ScrollVerticalOffsets = EStudio_gui_erp_totl.ViewAxes.VerticalOffsets/EStudio_gui_erp_totl.ViewAxes.Heights; + EStudio_gui_erp_totl.ScrollHorizontalOffsets = EStudio_gui_erp_totl.ViewAxes.HorizontalOffsets/EStudio_gui_erp_totl.ViewAxes.Widths; catch - Bin_chans = 0; + EStudio_gui_erp_totl.ScrollVerticalOffsets=0; + EStudio_gui_erp_totl.ScrollHorizontalOffsets=0; +end +if ishandle( EStudio_gui_erp_totl.ViewAxes ) + delete( EStudio_gui_erp_totl.ViewAxes ); +end +zoomSpace = estudioworkingmemory('ERPTab_zoomSpace'); +if isempty(zoomSpace) + zoomSpace = 100; +else + if zoomSpace<100 + zoomSpace =100; + end +end +if zoomSpace ==100 + EStudio_gui_erp_totl.ScrollVerticalOffsets=0; + EStudio_gui_erp_totl.ScrollHorizontalOffsets=0; end -Elec_list = S_ws_getbinchan.elec_list{S_ws_getbinchan.Select_index}; -Matlab_ver = S_ws_getbinchan.matlab_ver; -%%Parameter from plotting panel -try - Min_vspacing = S_ws_geterpplot.min_vspacing(S_ws_getbinchan.Select_index); - Min_time = S_ws_geterpplot.min(S_ws_getbinchan.Select_index); - Max_time = S_ws_geterpplot.max(S_ws_getbinchan.Select_index); - Yscale = S_ws_geterpplot.yscale(S_ws_getbinchan.Select_index); - Timet_low =S_ws_geterpplot.timet_low(S_ws_getbinchan.Select_index); - Timet_high =S_ws_geterpplot.timet_high(S_ws_getbinchan.Select_index); - Timet_step=S_ws_geterpplot.timet_step(S_ws_getbinchan.Select_index); - Fill = S_ws_geterpplot.fill(S_ws_getbinchan.Select_index); - Plority_plot = S_ws_geterpplot.Positive_up(S_ws_getbinchan.Select_index); - % ColumnNum = S_ws_geterpplot.Plot_column; - ColumnNum = estudioworkingmemory('EStudioColumnNum'); - if isempty(ColumnNum) || numel(ColumnNum)~=1 - ColumnNum =1; +ERPArray= estudioworkingmemory('selectederpstudio'); +if ~isempty(observe_ERPDAT.ALLERP) && ~isempty(observe_ERPDAT.ERP) + if isempty(ERPArray) ||any(ERPArray(:) > length(observe_ERPDAT.ALLERP)) || any(ERPArray(:)<=0) + ERPArray = length(observe_ERPDAT.ALLERP) ; + estudioworkingmemory('selectederpstudio',ERPArray); + observe_ERPDAT.CURRENTERP = ERPArray; + observe_ERPDAT.ERP = observe_ERPDAT.ALLERP(ERPArray); + assignin('base','ERP',observe_ERPDAT.ERP); + assignin('base','ALLERP', observe_ERPDAT.ALLERP); + assignin('base','CURRENTERP', observe_ERPDAT.CURRENTERP); end - -catch - return; + [xpos,ypos] = find(ERPArray==observe_ERPDAT.CURRENTERP); + if ~isempty(ypos) + pagecurrentNum = ypos; + pageNum = numel(ERPArray); + PageStr = observe_ERPDAT.ALLERP(observe_ERPDAT.CURRENTERP).erpname; + else + pageNum=1; + pagecurrentNum=1; + PageStr = observe_ERPDAT.ERP.erpname; + end + Enableflag = 'on'; +else + pageNum=1; + pagecurrentNum=1; + PageStr = 'No ERPset was loaded'; + ERPArray= 1; + estudioworkingmemory('selectederpstudio',1); + Enableflag = 'off'; +end +ERP_autoplot = EStudio_gui_erp_totl.ERP_autoplot; +if ERP_autoplot==1 + Enableflag = 'on'; +else + Enableflag = 'off'; end +EStudio_gui_erp_totl.plotgrid = uix.VBox('Parent',EStudio_gui_erp_totl.ViewContainer,'Padding',0,'Spacing',0,'BackgroundColor',ColorB_def); + +%%Setting title +pageinfo_box = uiextras.HBox( 'Parent', EStudio_gui_erp_totl.plotgrid,'BackgroundColor',ColorB_def); +pageinfo_str = ['Page',32,num2str(pagecurrentNum),'/',num2str(pageNum),':',32,PageStr]; +EStudio_gui_erp_totl.pageinfo_text = uicontrol('Parent',pageinfo_box,'Style','text','String',pageinfo_str,'FontSize',FonsizeDefault); +EStudio_gui_erp_totl.pageinfo_minus = uicontrol('Parent',pageinfo_box,'Style', 'pushbutton', 'String', 'Prev.','Callback',{@page_minus,EStudio_gui_erp_totl},'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1]); +EStudio_gui_erp_totl.pageinfo_edit = uicontrol('Parent',pageinfo_box,'Style', 'edit', 'String', num2str(pagecurrentNum),'Callback',@page_edit,'FontSize',FonsizeDefault+2,'BackgroundColor',[1 1 1]); +EStudio_gui_erp_totl.pageinfo_plus = uicontrol('Parent',pageinfo_box,'Style', 'pushbutton', 'String', 'Next','Callback',{@page_plus,EStudio_gui_erp_totl},'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1]); +set(pageinfo_box, 'Sizes', [-1 70 50 70] ); +set(pageinfo_box,'BackgroundColor',ColorB_def); + + +%%legends +ViewAxes_legend_title = uiextras.HBox( 'Parent', EStudio_gui_erp_totl.plotgrid,'BackgroundColor',[1 1 1]); +EStudio_gui_erp_totl.ViewAxes_legend = uix.ScrollingPanel( 'Parent', ViewAxes_legend_title,'BackgroundColor',[1 1 1]); +%%waves +EStudio_gui_erp_totl.plot_wav_legend = uiextras.HBox( 'Parent', EStudio_gui_erp_totl.plotgrid,'BackgroundColor',[1 1 1]); +EStudio_gui_erp_totl.ViewAxes = uix.ScrollingPanel( 'Parent', EStudio_gui_erp_totl.plot_wav_legend,'BackgroundColor',[1 1 1]); +%%note that needs to go to lines 487,491, 495, 670,671 of "uix.ScrollingPanel" if change the background color of scrollingbar or this toolbox is updated -Column_label = ColumnNum; -if Bin_chans == 0 - elec_n = numel(Elecs_shown); - max_elec_n = observe_ERPDAT.ALLERP(S_ws_geterpset(S_ws_getbinchan.Select_index)).nchan; +EStudio_gui_erp_totl.blank = uiextras.HBox( 'Parent', EStudio_gui_erp_totl.plotgrid,'BackgroundColor',ColorB_def);%%%Message +uiextras.Empty('Parent', EStudio_gui_erp_totl.blank,'BackgroundColor',ColorB_def); % 1A + +%%save figure, command.... +commandfig_panel = uiextras.HBox( 'Parent', EStudio_gui_erp_totl.plotgrid,'BackgroundColor',ColorB_def);%%%Message + +EStudio_gui_erp_totl.zoom_in = uicontrol('Parent',commandfig_panel,'Style','pushbutton','String','Zoom In',... + 'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1],'Callback',@zoomin,'Enable',Enableflag); +EStudio_gui_erp_totl.zoom_edit = uicontrol('Parent',commandfig_panel,'Style','edit','String',num2str(zoomSpace),... + 'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1],'Callback',@zoomedit,'Enable',Enableflag); + +EStudio_gui_erp_totl.zoom_out = uicontrol('Parent',commandfig_panel,'Style','pushbutton','String','Zoom Out',... + 'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1],'Callback',@zoomout,'Enable',Enableflag); +uiextras.Empty('Parent', commandfig_panel); % 1A + +if ~isempty(observe_ERPDAT.ALLERP) && ~isempty(observe_ERPDAT.ERP) + EStudio_gui_erp_totl.erp_popmenu = uicontrol('Parent',commandfig_panel,'Style','popupmenu','Callback',@popmemu_erp,'Enable','on','BackgroundColor',ColorB_def,... + 'Enable','on','String',{'Plotting Options','Automatic Plotting','Window Size','Advanced Waveform Viewer','Show Command','Save Figure as','Create Static/Exportable Plot'}); else - elec_n = S_ws_getbinchan.bin_n(S_ws_getbinchan.Select_index); - max_elec_n = observe_ERPDAT.ALLERP(S_ws_geterpset(S_ws_getbinchan.Select_index)).nbin; + EStudio_gui_erp_totl.erp_popmenu = uicontrol('Parent',commandfig_panel,'Style','popupmenu','Callback',@popmemu_erp,... + 'Enable','on','String',{'Plotting Options','Automatic Plotting','Window Size'},'Enable','on','BackgroundColor',ColorB_def); end - -% We first clear the existing axes ready to build a new one -if ishandle( EStudio_gui_erp_totl.ViewAxes ) - delete( EStudio_gui_erp_totl.ViewAxes ); +popmemu_erp = EStudio_gui_erp_totl.erp_popmenu.String; +if ERP_autoplot==1 + popmemu_erp{2} = 'Automatic Plotting: On'; +else + popmemu_erp{2} = 'Automatic Plotting: Off'; end +EStudio_gui_erp_totl.erp_popmenu.String=popmemu_erp; +EStudio_gui_erp_totl.erp_reset = uicontrol('Parent',commandfig_panel,'Style','pushbutton','String','Reset',... + 'Callback', @erptab_reset,'FontSize',FonsizeDefault,'BackgroundColor',[1 1 1],'Enable','on'); +uiextras.Empty('Parent', commandfig_panel); % 1A +set(commandfig_panel, 'Sizes', [70 50 70 -1 150 50 5]); + +%%message +xaxis_panel = uiextras.HBox( 'Parent', EStudio_gui_erp_totl.plotgrid,'BackgroundColor',ColorB_def);%%%Message +EStudio_gui_erp_totl.Process_messg = uicontrol('Parent',xaxis_panel,'Style','text','String','','FontSize',FonsizeDefault,'FontWeight','bold','BackgroundColor',ColorB_def); + +if length(ERPArray) ==1 + Enable_minus = 'off'; + Enable_plus = 'off'; + Enable_plus_BackgroundColor = [1 1 1]; + Enable_minus_BackgroundColor = [0 0 0]; +else + if pagecurrentNum ==1 + Enable_minus = 'off'; + Enable_plus = 'on'; + Enable_plus_BackgroundColor = [0 1 0]; + Enable_minus_BackgroundColor = [0 0 0]; + elseif pagecurrentNum == length(ERPArray) + Enable_minus = 'on'; + Enable_plus = 'off'; + Enable_plus_BackgroundColor = [0 0 0]; + Enable_minus_BackgroundColor = [0 1 0]; + else + Enable_minus = 'on'; + Enable_plus = 'on'; + Enable_plus_BackgroundColor = [0 1 0]; + Enable_minus_BackgroundColor = [0 1 0]; + end +end +if ERP_autoplot==0 + Enable_minus = 'off'; + Enable_plus = 'off'; + EStudio_gui_erp_totl.pageinfo_edit.Enable = 'off'; + EStudio_gui_erp_totl.pageinfo_text.String='Plotting is disabled, to enable it, please go to "Plotting Options" at the bottom of the plotting area to active it.'; +end +EStudio_gui_erp_totl.pageinfo_minus.Enable = Enable_minus; +EStudio_gui_erp_totl.pageinfo_plus.Enable = Enable_plus; +EStudio_gui_erp_totl.pageinfo_plus.ForegroundColor = Enable_plus_BackgroundColor; +EStudio_gui_erp_totl.pageinfo_minus.ForegroundColor = Enable_minus_BackgroundColor; +set(EStudio_gui_erp_totl.pageinfo_text,'BackgroundColor',ColorB_def); +EStudio_gui_erp_totl.plotgrid.Heights(1) = 30; +EStudio_gui_erp_totl.plotgrid.Heights(2) = 70;% set the first element (pageinfo) to 30px high +EStudio_gui_erp_totl.plotgrid.Heights(4) = 5; +EStudio_gui_erp_totl.plotgrid.Heights(5) = 30; +EStudio_gui_erp_totl.plotgrid.Heights(6) = 30;% set the second element (x axis) to 30px high +EStudio_gui_erp_totl.plotgrid.Units = 'pixels'; + +if isempty(observe_ERPDAT.ALLERP) || isempty(observe_ERPDAT.ERP) || ERP_autoplot==0 + EStudio_gui_erp_totl.erptabwaveiwer = axes('Parent', EStudio_gui_erp_totl.ViewAxes,'Color','none','Box','on','FontWeight','normal'); + set(EStudio_gui_erp_totl.erptabwaveiwer, 'XTick', [], 'YTick', [],'Box','off', 'Color','none','xcolor','none','ycolor','none'); +end -% Get chan labels -S_chan.chan_label = cell(1,max_elec_n); -S_chan.chan_label_place = zeros(1,max_elec_n); +if ~isempty(observe_ERPDAT.ALLERP) && ~isempty(observe_ERPDAT.ERP) && ERP_autoplot==1 + EStudio_gui_erp_totl.erptabwaveiwer = axes('Parent', EStudio_gui_erp_totl.ViewAxes,'Color','none','Box','on','FontWeight','normal'); + hold(EStudio_gui_erp_totl.erptabwaveiwer,'on'); + EStudio_gui_erp_totl.erptabwaveiwer_legend = axes('Parent', EStudio_gui_erp_totl.ViewAxes_legend,'Color','none','Box','off'); + hold(EStudio_gui_erp_totl.erptabwaveiwer_legend,'on'); + set(EStudio_gui_erp_totl.erptabwaveiwer_legend, 'XTick', [], 'YTick', []); + ERP = observe_ERPDAT.ERP; + OutputViewerparerp = f_preparms_erptab(ERP,0); + + % %%Plot the eeg waves + if ~isempty(OutputViewerparerp) + f_plotaberpwave(ERP,OutputViewerparerp{1},OutputViewerparerp{2},... + OutputViewerparerp{3},OutputViewerparerp{4},OutputViewerparerp{5},... + OutputViewerparerp{6},OutputViewerparerp{9},OutputViewerparerp{10},OutputViewerparerp{11},... + OutputViewerparerp{12},OutputViewerparerp{13},OutputViewerparerp{14},OutputViewerparerp{15},... + EStudio_gui_erp_totl.erptabwaveiwer,EStudio_gui_erp_totl.erptabwaveiwer_legend,OutputViewerparerp{7}); + else + return; + end + pb_height = 1*Resolation(4); %px + + Fill=1; + splot_n = OutputViewerparerp{12}; + if isempty(splot_n) || any(splot_n<=0) + splot_n = size(OutputViewerparerp{13},1); + end + if splot_n*pb_height<(EStudio_gui_erp_totl.plotgrid.Position(4)-EStudio_gui_erp_totl.plotgrid.Heights(1))&&Fill + pb_height = 0.9*(EStudio_gui_erp_totl.plotgrid.Position(4)-EStudio_gui_erp_totl.plotgrid.Heights(1)-EStudio_gui_erp_totl.plotgrid.Heights(2))/splot_n; + else + pb_height = 0.9*pb_height; + end + zoomSpace = zoomSpace-100; + if zoomSpace <=0 + EStudio_gui_erp_totl.ViewAxes.Heights = 0.95*EStudio_gui_erp_totl.ViewAxes.Position(4); + else + EStudio_gui_erp_totl.ViewAxes.Heights = splot_n*pb_height*(1+zoomSpace/100); + end + + widthViewer = EStudio_gui_erp_totl.ViewAxes.Position(3)-EStudio_gui_erp_totl.ViewAxes.Position(2); + if zoomSpace <=0 + EStudio_gui_erp_totl.ViewAxes.Widths = widthViewer; + else + EStudio_gui_erp_totl.ViewAxes.Widths = widthViewer*(1+zoomSpace/100); + end + + %%Keep the same positions for Vertical and Horizontal scrolling bars asbefore + if zoomSpace~=0 && zoomSpace>0 + if EStudio_gui_erp_totl.ScrollVerticalOffsets<=1 + try + EStudio_gui_erp_totl.ViewAxes.VerticalOffsets= EStudio_gui_erp_totl.ScrollVerticalOffsets*EStudio_gui_erp_totl.ViewAxes.Heights; + catch + end + end + if EStudio_gui_erp_totl.ScrollHorizontalOffsets<=1 + try + EStudio_gui_erp_totl.ViewAxes.HorizontalOffsets =EStudio_gui_erp_totl.ScrollHorizontalOffsets*EStudio_gui_erp_totl.ViewAxes.Widths; + catch + end + end + end +end +EStudio_gui_erp_totl.ViewAxes.Children.Title.Color = [1 0 0]; +end +%%------------------------------------------------------------------------- +%%-----------------------------Subfunctions-------------------------------- +%%------------------------------------------------------------------------- -if Bin_chans == 0 - for i = 1:elec_n - S_chan.chan_label{i} = observe_ERPDAT.ERP.chanlocs(Elecs_shown(i)).labels; +function popmemu_erp(Source,~) +global EStudio_gui_erp_totl; +Value = Source.Value; +if Value==2 + + app = feval('EStudio_plot_set_waves',EStudio_gui_erp_totl.ERP_autoplot,2); + waitfor(app,'Finishbutton',1); + try + plotSet = app.output; %NO you don't want to output EEG with edited channel locations, you want to output the parameters to run decoding + app.delete; %delete app from view + pause(0.01); %wait for app to leave + catch + return; + end + if isempty(plotSet)||numel(plotSet)~=1 || (plotSet~=0&&plotSet~=1) + plotSet=1; + end + popmemu_eegString = EStudio_gui_erp_totl.erp_popmenu.String; + if plotSet==1 + popmemu_eegString{2} = 'Automatic Plotting: On'; + else + popmemu_eegString{2} = 'Automatic Plotting: Off'; end + EStudio_gui_erp_totl.erp_popmenu.String=popmemu_eegString; + EStudio_gui_erp_totl.ERP_autoplot = plotSet; + f_redrawERP(); + +elseif Value==3 + EStudiowinsize(); +elseif Value==4 + Advanced_viewer(); +elseif Value==5 + Show_command(); +elseif Value==6 + figure_saveas(); +elseif Value==7 + figure_out(); +end +Source.Value=1; +end + + + +%%----------------Zoom in------------------------------------------------- +function zoomin(~,~) +global observe_ERPDAT; + +[messgStr,eegpanelIndex] = f_check_erptab_panelchanges(); +if ~isempty(messgStr) + observe_ERPDAT.Count_currentERP=eegpanelIndex+1; +end +zoomSpace = estudioworkingmemory('ERPTab_zoomSpace'); +if isempty(zoomSpace) + estudioworkingmemory('ERPTab_zoomSpace',0); else - for i = 1:elec_n - S_chan.chan_label{i} = observe_ERPDAT.ERP.bindescr(Bins(i)); + if zoomSpace<100 + zoomSpace = 100; end + zoomSpace =zoomSpace+50; + estudioworkingmemory('ERPTab_zoomSpace',zoomSpace) ; +end +MessageViewer= char(strcat('Zoom In')); +estudioworkingmemory('f_ERP_proces_messg',MessageViewer); +try + observe_ERPDAT.Process_messg =1; + f_redrawERP(); + observe_ERPDAT.Process_messg =2; +catch + observe_ERPDAT.Process_messg =3; +end end -%Sets the units of your root object (screen) to pixels -set(0,'units','pixels') -%Obtains this pixel information -Pix_SS = get(0,'screensize'); -%Sets the units of your root object (screen) to inches -set(0,'units','inches') -%Obtains this inch information -Inch_SS = get(0,'screensize'); -%Calculates the resolution (pixels per inch) -Res = Pix_SS./Inch_SS; +function zoomedit(Source,~) +global observe_ERPDAT; +[messgStr,eegpanelIndex] = f_check_erptab_panelchanges(); +if ~isempty(messgStr) + observe_ERPDAT.Count_currentERP=eegpanelIndex+1; +end -pb_height = Min_vspacing*Res(4); %px +zoomspaceEdit = str2num(Source.String); +MessageViewer= char(strcat('Zoom Editor')); +estudioworkingmemory('f_ERP_proces_messg',MessageViewer); +if ~isempty(zoomspaceEdit) && numel(zoomspaceEdit)==1 && zoomspaceEdit>=100 + estudioworkingmemory('ERPTab_zoomSpace',zoomspaceEdit); + try + observe_ERPDAT.Process_messg =1; + f_redrawERP(); + observe_ERPDAT.Process_messg =2; + return; + catch + observe_ERPDAT.Process_messg =3; + return; + end +else + if isempty(zoomspaceEdit) + estudioworkingmemory('f_ERP_proces_messg',['\n Zoom Editor:The input must be a number']); + observe_ERPDAT.Process_messg =4; + return; + end + if numel(zoomspaceEdit)>1 + estudioworkingmemory('f_ERP_proces_messg',['Zoom Editor:The input must be a single number']); + observe_ERPDAT.Process_messg =4; + return; + end + if zoomspaceEdit<100 + estudioworkingmemory('f_ERP_proces_messg',[' Zoom Editor:The input must not be smaller than 100.']); + observe_ERPDAT.Process_messg =4; + return; + end +end +end -% Plot data in the main viewer fig -splot_n = elec_n; -tsize = 13; +%%----------------Zoom out------------------------------------------------- +function zoomout(~,~) +global observe_ERPDAT; -clear pb r_ax plotgrid; -try - [version reldate,ColorB_def,ColorF_def,errorColorF_def] = geterplabstudiodef;%%Get background color -catch - ColorB_def = [0.95 0.95 0.95]; +[messgStr,eegpanelIndex] = f_check_erptab_panelchanges(); +if ~isempty(messgStr) + observe_ERPDAT.Count_currentERP=eegpanelIndex+1; end -if isempty(ColorB_def) - ColorB_def = [0.95 0.95 0.95]; + +zoomSpace = estudioworkingmemory('ERPTab_zoomSpace'); +if isempty(zoomSpace) + estudioworkingmemory('ERPTab_zoomSpace',0) +else + zoomSpace =zoomSpace-50; + if zoomSpace <100 + zoomSpace =100; + end + estudioworkingmemory('ERPTab_zoomSpace',zoomSpace) ; +end +MessageViewer= char(strcat('Zoom Out')); +estudioworkingmemory('f_ERP_proces_messg',MessageViewer); +observe_ERPDAT.Process_messg =1; +f_redrawERP(); +observe_ERPDAT.Process_messg =2; end -EStudio_gui_erp_totl.plotgrid = uix.VBox('Parent',EStudio_gui_erp_totl.ViewContainer,'Padding',0,'Spacing',0,'BackgroundColor',ColorB_def); -pageinfo_box = uiextras.HBox( 'Parent', EStudio_gui_erp_totl.plotgrid,'BackgroundColor',ColorB_def); -EStudio_gui_erp_totl.plot_wav_legend = uiextras.HBox( 'Parent', EStudio_gui_erp_totl.plotgrid,'BackgroundColor',[1 1 1]); -EStudio_gui_erp_totl.ViewAxes_legend = uix.ScrollingPanel( 'Parent', EStudio_gui_erp_totl.plot_wav_legend,'BackgroundColor',ColorB_def); -EStudio_gui_erp_totl.ViewAxes = uix.ScrollingPanel( 'Parent', EStudio_gui_erp_totl.plot_wav_legend,'BackgroundColor',[1 1 1]); +%%--------------------Setting for EStudio window size---------------------- +function EStudiowinsize(~,~) +global EStudio_gui_erp_totl; +global observe_ERPDAT; +try + ScreenPos= EStudio_gui_erp_totl.ScreenPos; +catch + ScreenPos = get( 0, 'Screensize' ); +end +try + New_pos = EStudio_gui_erp_totl.Window.Position; +catch + return; +end +try + New_posin = estudioworkingmemory('EStudioScreenPos'); +catch + New_posin = [75,75]; +end +if isempty(New_posin) ||numel(New_posin)~=2 + New_posin = [75,75]; +end +New_posin(2) = abs(New_posin(2)); -%%Changed by Guanghui Zhang 2 August 2022-------panel for display the processing procedure for some functions, e.g., filtering -xaxis_panel = uiextras.HBox( 'Parent', EStudio_gui_erp_totl.plotgrid,'BackgroundColor',ColorB_def);%%%Message -EStudio_gui_erp_totl.Process_messg = uicontrol('Parent',xaxis_panel,'Style','text','String','','FontSize',20,'FontWeight','bold','BackgroundColor',ColorB_def); +app = feval('EStudio_pos_gui',New_posin); +waitfor(app,'Finishbutton',1); +try + New_pos1 = app.output; %NO you don't want to output EEG with edited channel locations, you want to output the parameters to run decoding + app.delete; %delete app from view + pause(0.5); %wait for app to leave +catch + disp('User selected Cancel'); + return; +end +try New_pos1(2) = abs(New_pos1(2));catch; end; -% erpworkingmemory('EStudio_proces_messg',EStudio_gui_erp_totl); +if isempty(New_pos1) || numel(New_pos1)~=2 + estudioworkingmemory('f_ERP_proces_messg',['The defined Window Size for EStudio is invalid and it must be two numbers']); + observe_ERPDAT.Process_messg =4; + return; +end +estudioworkingmemory('EStudioScreenPos',New_pos1); +try + POS4 = (New_pos1(2)-New_posin(2))/100; + new_pos =[New_pos(1),New_pos(2)-ScreenPos(4)*POS4,ScreenPos(3)*New_pos1(1)/100,ScreenPos(4)*New_pos1(2)/100]; + if new_pos(2) < -abs(new_pos(4))%%if + + end + set(EStudio_gui_erp_totl.Window, 'Position', new_pos); +catch + estudioworkingmemory('f_ERP_proces_messg',['The defined Window Size for EStudio is invalid and it must be two numbers']); + observe_ERPDAT.Process_messg =4; + set(EStudio_gui_erp_totl.Window, 'Position', [0 0 0.75*ScreenPos(3) 0.75*ScreenPos(4)]); + estudioworkingmemory('EStudioScreenPos',[75 75]); +end +f_redrawEEG_Wave_Viewer(); +f_redrawERP(); +EStudio_gui_erp_totl.context_tabs.TabSize = (new_pos(3)-20)/2; +% EStudio_gui_erp_totl.context_tabs.TabSize = (new_pos(3)-20)/3; +end -%%Setting title -EStudio_gui_erp_totl.pageinfo_minus = uicontrol('Parent',pageinfo_box,'Style', 'pushbutton', 'String', '<','Callback',{@page_minus,EStudio_gui_erp_totl},'FontSize',30,'BackgroundColor',[1 1 1]); -if S_ws_getbinchan.Select_index ==1 - EStudio_gui_erp_totl.pageinfo_minus.Enable = 'off'; +%------------------Display the waveform for proir ERPset------------------- +function page_minus(~,~,EStudio_gui_erp_totl) +global observe_ERPDAT; +if isempty(observe_ERPDAT.ALLERP) || isempty(observe_ERPDAT.ERP) + return; end -EStudio_gui_erp_totl.pageinfo_edit = uicontrol('Parent',pageinfo_box,'Style', 'edit', 'String', num2str(S_ws_getbinchan.Select_index),'Callback',{@page_edit,EStudio_gui_erp_totl},'FontSize',20,'BackgroundColor',[1 1 1]); +ERPArray= estudioworkingmemory('selectederpstudio'); +if isempty(ERPArray) + ERPArray = length(observe_ERPDAT.ALLERP); + observe_ERPDAT.ERP = observe_ERPDAT.ALLERP(end); + observe_ERPDAT.CURRENTERP = ERPArray; + estudioworkingmemory('selectederpstudio',ERPArray); +end -if S_ws_getbinchan.Select_index ==1 - EStudio_gui_erp_totl.pageinfo_edit.Enable = 'on'; +Pagecurrent = str2num(EStudio_gui_erp_totl.pageinfo_edit.String); +pageNum = numel(ERPArray); +if ~isempty(Pagecurrent) && numel(Pagecurrent)~=1 %%if two or more numbers are entered + Pagecurrent =1; +elseif isempty(Pagecurrent) + [xpos, ypos] = find(ERPArray==observe_ERPDAT.CURRENTERP); + if isempty(ypos) + Pagecurrent=1; + else + Pagecurrent = ypos; + end end -EStudio_gui_erp_totl.pageinfo_plus = uicontrol('Parent',pageinfo_box,'Style', 'pushbutton', 'String', '>','Callback',{@page_plus,EStudio_gui_erp_totl},'FontSize',30,'BackgroundColor',[1 1 1]); -if S_ws_getbinchan.Select_index == numel(S_ws_geterpset) - EStudio_gui_erp_totl.pageinfo_plus.Enable = 'off'; +Pagecurrent = Pagecurrent-1; +if Pagecurrent>0 && Pagecurrent<=pageNum +else + Pagecurrent=1; end -pageinfo_str = ['Page',32,num2str(S_ws_getbinchan.Select_index),'/',num2str(numel(S_ws_geterpset)),':',32,observe_ERPDAT.ERP.erpname]; +Current_erp_Index = ERPArray(Pagecurrent); +EStudio_gui_erp_totl.pageinfo_edit.String = num2str(Pagecurrent); -pageinfo_text = uicontrol('Parent',pageinfo_box,'Style','text','String',pageinfo_str,'FontSize',14,'FontWeight','bold'); +observe_ERPDAT.CURRENTERP = Current_erp_Index; +observe_ERPDAT.ERP = observe_ERPDAT.ALLERP(Current_erp_Index); -if length(S_ws_geterpset) ==1 +% f_redrawERP(); +if length(ERPArray) ==1 Enable_minus = 'off'; Enable_plus = 'off'; - Enable_plus_BackgroundColor = [1 1 1]; + Enable_plus_BackgroundColor = [0 0 0]; Enable_minus_BackgroundColor = [0 0 0]; else - if S_ws_getbinchan.Select_index ==1 + if Pagecurrent ==1 Enable_minus = 'off'; Enable_plus = 'on'; Enable_plus_BackgroundColor = [0 1 0]; Enable_minus_BackgroundColor = [0 0 0]; - elseif S_ws_getbinchan.Select_index == length(S_ws_geterpset) + elseif Pagecurrent == length(ERPArray) Enable_minus = 'on'; Enable_plus = 'off'; Enable_plus_BackgroundColor = [0 0 0]; @@ -196,596 +537,806 @@ function f_redrawERP() EStudio_gui_erp_totl.pageinfo_plus.Enable = Enable_plus; EStudio_gui_erp_totl.pageinfo_plus.ForegroundColor = Enable_plus_BackgroundColor; EStudio_gui_erp_totl.pageinfo_minus.ForegroundColor = Enable_minus_BackgroundColor; -% EStudio_gui_erp_totl.pageinfo_edit.ForegroundColor = [1 1 1]; -set(pageinfo_box, 'Sizes', [50 50 50 -1] ); -set(pageinfo_box,'BackgroundColor',ColorB_def); -set(pageinfo_text,'BackgroundColor',ColorB_def); -%Setting title. END,'BackgroundColor',ColorB_def +MessageViewer= char(strcat('Plot previous page (<)')); +estudioworkingmemory('f_ERP_proces_messg',MessageViewer); +observe_ERPDAT.Process_messg =1; +observe_ERPDAT.Count_currentERP = 1; +end -%for i=1:splot_n -% -%%------------Setting the number of data and plotting--------------------- -ndata = 0; -nplot = 0; -if Bin_chans == 0 %if channels with bin overlay - ndata = Bins; - nplot = Elecs_shown; -else %if bins with channel overlay - ndata = Elecs_shown; - nplot = Bins; +%%--------------------Edit the index of ERPsets---------------------------- +function page_edit(Str,~) +global observe_ERPDAT; +global EStudio_gui_erp_totl; +if isempty(observe_ERPDAT.ALLERP) || isempty(observe_ERPDAT.ERP) + return; +end +ERPArray= estudioworkingmemory('selectederpstudio'); +if isempty(ERPArray) + ERPArray = length(observe_ERPDAT.ALLERP); + observe_ERPDAT.ERP = observe_ERPDAT.ALLERP(end); + observe_ERPDAT.CURRENTERP = ERPArray; + estudioworkingmemory('selectederpstudio',ERPArray); end -% -timeor = observe_ERPDAT.ERP.times; % original time vector -timex = timeor; -[xxx, latsamp, latdiffms] = closest(timex, [Min_time Max_time]); -tmin = latsamp(1); -tmax = latsamp(2); - -if tmin < 1 - tmin = 1; +Pagecurrent = str2num(Str.String); +if isempty(Pagecurrent) || numel(Pagecurrent)~=1 || any(Pagecurrent>numel(ERPArray)) || any(Pagecurrent<1) + [xpos, ypos] = find(ERPArray==observe_ERPDAT.CURRENTERP); + if isempty(ypos) + Pagecurrent=1; + else + Pagecurrent = ypos; + end + observe_ERPDAT.CURRENTERP = ERPArray(Pagecurrent); + observe_ERPDAT.ERP = observe_ERPDAT.ALLERP(ERPArray(Pagecurrent)); +end +EStudio_gui_erp_totl.pageinfo_edit.String = num2str(Pagecurrent); +Current_erp_Index = ERPArray(Pagecurrent); +observe_ERPDAT.CURRENTERP = Current_erp_Index; +observe_ERPDAT.ERP = observe_ERPDAT.ALLERP(Current_erp_Index); +if length(ERPArray) ==1 + Enable_minus = 'off'; + Enable_plus = 'off'; + Enable_plus_BackgroundColor = [0 0 0]; + Enable_minus_BackgroundColor = [0 0 0]; +else + if Pagecurrent ==1 + Enable_minus = 'off'; + Enable_plus = 'on'; + Enable_plus_BackgroundColor = [0 1 0]; + Enable_minus_BackgroundColor = [1 1 1]; + elseif Pagecurrent == length(ERPArray) + Enable_minus = 'on'; + Enable_plus = 'off'; + Enable_plus_BackgroundColor = [0 0 0]; + Enable_minus_BackgroundColor = [0 1 0]; + else + Enable_minus = 'on'; + Enable_plus = 'on'; + Enable_plus_BackgroundColor = [0 1 0]; + Enable_minus_BackgroundColor = [0 1 0]; + end end +EStudio_gui_erp_totl.pageinfo_minus.Enable = Enable_minus; +EStudio_gui_erp_totl.pageinfo_plus.Enable = Enable_plus; +EStudio_gui_erp_totl.pageinfo_plus.ForegroundColor = Enable_plus_BackgroundColor; +EStudio_gui_erp_totl.pageinfo_minus.ForegroundColor = Enable_minus_BackgroundColor; -if tmax > numel(observe_ERPDAT.ERP.times) - tmax = numel(observe_ERPDAT.ERP.times); +observe_ERPDAT.Count_currentERP = 1; +observe_ERPDAT.Process_messg =2; end -[xtick_time, Bindata] = f_get_erp_xticklabel_time(observe_ERPDAT.ERP, [Min_time Max_time],[Timet_low,Timet_high]); +%------------------Display the waveform for next ERPset-------------------- +function page_plus(~,~,EStudio_gui_erp_totl) +global observe_ERPDAT; -% plot_erp_data = nan(tmax-tmin+1,numel(ndata)); -plot_erp_data = []; -for i = 1:splot_n - if Bin_chans == 0 - for i_bin = 1:numel(ndata) - plot_erp_data(:,i_bin,i) = Bindata(Elecs_shown(i),:,Bins(i_bin))'*Plority_plot; % - end - else - for i_bin = 1:numel(ndata) - plot_erp_data(:,i_bin,i) = Bindata(Elecs_shown(i_bin),:,Bins(i))'*Plority_plot; % - end - end +if isempty(observe_ERPDAT.ALLERP) || isempty(observe_ERPDAT.ERP) + return; end -if Yscale==0 - Yscale = max(abs(Bindata(:))); -end -perc_lim = Yscale; -percentile = perc_lim*3/2; -[~,~,b] = size(plot_erp_data); - - -% -%%%------------Setting xticklabels for each row of each wave-------------- -xstep_label = estudioworkingmemory('erp_xtickstep'); -if isempty(xstep_label) - xstep_label =0; -end -if ~xstep_label - [def Timet_step]= default_time_ticks_studio(observe_ERPDAT.ERP, [Timet_low,Timet_high]); - if ~isempty(def) - xticks_clomn = str2num(def{1,1}); - while xticks_clomn(end)<=Timet_high - xticks_clomn(numel(xticks_clomn)+1) = xticks_clomn(end)+Timet_step; - if xticks_clomn(end)>Timet_high - xticks_clomn = xticks_clomn(1:end-1); - break; - end - end +ERPArray= estudioworkingmemory('selectederpstudio'); +if isempty(ERPArray) + ERPArray = length(observe_ERPDAT.ALLERP); + observe_ERPDAT.ERP = observe_ERPDAT.ALLERP(end); + observe_ERPDAT.CURRENTERP = ERPArray; + estudioworkingmemory('selectederpstudio',ERPArray); +end +Pagecurrent = str2num(EStudio_gui_erp_totl.pageinfo_edit.String); +pageNum = numel(ERPArray); +if ~isempty(Pagecurrent) && numel(Pagecurrent)~=1 %%if two or more numbers are entered + Pagecurrent =1; +elseif isempty(Pagecurrent) + [xpos, ypos] = find(ERPArray==observe_ERPDAT.CURRENTERP); + if isempty(ypos) + Pagecurrent=1; else - xticks_clomn = (Timet_low:Timet_step:Timet_high); + Pagecurrent = ypos; end -else - xticks_clomn = (Timet_low:Timet_step:Timet_high); end - -if strcmpi(observe_ERPDAT.ERP.erpname,'No ERPset loaded') - xticks_clomn = [0:1]; +Pagecurrent = Pagecurrent+1; +if Pagecurrent>0 && Pagecurrent<=pageNum +else + Pagecurrent = pageNum; end +Current_erp_Index = ERPArray(Pagecurrent); +EStudio_gui_erp_totl.pageinfo_edit.String = num2str(Pagecurrent); -Timet_step_p = ceil(Timet_step/(1000/observe_ERPDAT.ERP.srate));%% Time points of the gap between columns -if ~strcmpi(observe_ERPDAT.ERP.erpname,'No ERPset loaded') - % - %%----------------------Modify the data into multiple-columns--------------------------------------- - rowNum = ceil(b/Column_label); - plot_erp_data_new = NaN(size(plot_erp_data,1),size(plot_erp_data,2),rowNum*Column_label); - - plot_erp_data_new(:,:,1:size(plot_erp_data,3)) = plot_erp_data; - plot_erp_data_new_trans = []; - - - if Column_label==1 - for Numofrow = 1:rowNum - plot_erp_data_new_trans(:,:,:,Numofrow) = plot_erp_data_new(:,:,(Numofrow-1)*Column_label+1:Numofrow*Column_label); - end - - clear plot_erp_data; - plot_erp_data_new_trans = permute(plot_erp_data_new_trans,[1,3,2,4]) ; - plot_erp_data = reshape(plot_erp_data_new_trans,size(plot_erp_data_new_trans,1)*size(plot_erp_data_new_trans,2),size(plot_erp_data_new_trans,3),size(plot_erp_data_new_trans,4)); - - elseif Column_label>1 - - plot_erp_data_trans_clumns = NaN(size(plot_erp_data_new,1)*Column_label+(Column_label-1)*Timet_step_p,size(plot_erp_data_new,2),rowNum); - for Numofrow = 1:rowNum - Data_column = plot_erp_data_new(:,:,(Numofrow-1)*Column_label+1:Numofrow*Column_label); - for Numofcolumn = 1:Column_label - low_interval = size(plot_erp_data_new,1)*(Numofcolumn-1)+1+(Numofcolumn-1)*Timet_step_p; - high_interval = size(plot_erp_data_new,1)*(Numofcolumn-1)+(Numofcolumn-1)*Timet_step_p+size(plot_erp_data_new,1); - plot_erp_data_trans_clumns(low_interval:high_interval,:,Numofrow) = squeeze(Data_column(:,:,Numofcolumn)); - end - end - plot_erp_data = plot_erp_data_trans_clumns; +observe_ERPDAT.CURRENTERP = Current_erp_Index; +observe_ERPDAT.ERP = observe_ERPDAT.ALLERP(Current_erp_Index); +estudioworkingmemory('selectederpstudio',ERPArray); +if length(ERPArray) ==1 + Enable_minus = 'off'; + Enable_plus = 'off'; + Enable_plus_BackgroundColor = [0 0 0]; + Enable_minus_BackgroundColor = [0 0 0]; +else + if Pagecurrent ==1 + Enable_minus = 'off'; + Enable_plus = 'on'; + Enable_plus_BackgroundColor = [0 1 0]; + Enable_minus_BackgroundColor = [1 1 1]; + elseif Pagecurrent == length(ERPArray) + Enable_minus = 'on'; + Enable_plus = 'off'; + Enable_plus_BackgroundColor = [0 0 0]; + Enable_minus_BackgroundColor = [0 1 0]; + else + Enable_minus = 'on'; + Enable_plus = 'on'; + Enable_plus_BackgroundColor = [0 1 0]; + Enable_minus_BackgroundColor = [0 1 0]; end - - ind_plot_height = percentile*2; % Height of each individual subplot - - offset = []; - if Bin_chans == 0 - offset = (size(plot_erp_data,3)-1:-1:0)*ind_plot_height; +end +EStudio_gui_erp_totl.pageinfo_minus.Enable = Enable_minus; +EStudio_gui_erp_totl.pageinfo_plus.Enable = Enable_plus; +EStudio_gui_erp_totl.pageinfo_plus.ForegroundColor = Enable_plus_BackgroundColor; +EStudio_gui_erp_totl.pageinfo_minus.ForegroundColor = Enable_minus_BackgroundColor; +observe_ERPDAT.Count_currentERP = 1; +end + + + +%%--------------------------show the command------------------------------- +function Show_command(~,~) +global observe_ERPDAT; +if isempty(observe_ERPDAT.ALLERP) || isempty(observe_ERPDAT.ERP) + return; +end +[messgStr,eegpanelIndex] = f_check_erptab_panelchanges(); +if ~isempty(messgStr) + observe_ERPDAT.Count_currentERP=eegpanelIndex+1;%%call the functions from the other panel +end +estudioworkingmemory('f_ERP_proces_messg','Show Command'); +observe_ERPDAT.Process_messg =1; +f_preparms_erptab(observe_ERPDAT.ERP,1,'command'); +observe_ERPDAT.Process_messg =2; +end + +%%----------------------------save figure as------------------------------- +function figure_saveas(~,~) +global observe_ERPDAT; +if isempty(observe_ERPDAT.ALLERP) || isempty(observe_ERPDAT.ERP) + return; +end +[messgStr,eegpanelIndex] = f_check_erptab_panelchanges(); +if ~isempty(messgStr) + observe_ERPDAT.Count_currentERP=eegpanelIndex+1;%%call the functions from the other panel +end + +estudioworkingmemory('f_ERP_proces_messg','Save figure as'); +observe_ERPDAT.Process_messg =1; +pathstr = pwd; +namedef =[observe_ERPDAT.ERP.erpname,'.pdf']; +[erpfilename, erppathname, indxs] = uiputfile({'*.pdf';'*.svg';'*.jpg';'*.png';'*.tif';'*.bmp';'*.eps'},... + 'Save as',[fullfile(pathstr,namedef)]); + + +if isequal(erpfilename,0) + beep; + observe_ERPDAT.Process_messg =3; + disp('User selected Cancel') + return +end + +History = 'off'; +[pathstr, erpfilename1, ext] = fileparts(erpfilename) ; + +if isempty(ext) + figurename = fullfile(erppathname,char(strcat(erpfilename,'.pdf'))); +else + figurename = fullfile(erppathname,erpfilename); +end + +f_preparms_erptab(observe_ERPDAT.ERP,1,History,figurename); +observe_ERPDAT.Process_messg =2; +end + +%%--------------------Create static/eportable plot------------------------- +function figure_out(~,~) +global observe_ERPDAT; +if isempty(observe_ERPDAT.ALLERP) || isempty(observe_ERPDAT.ERP) + return; +end +[messgStr,eegpanelIndex] = f_check_erptab_panelchanges(); +if ~isempty(messgStr) + observe_ERPDAT.Count_currentERP=eegpanelIndex+1;%%call the functions from the other panel +end + +MessageViewer= char(strcat('Create Static/Exportable Plot')); +estudioworkingmemory('f_ERP_proces_messg',MessageViewer); +observe_ERPDAT.Process_messg =1; +try + figurename = observe_ERPDAT.ERP.erpname; +catch + figurename = ''; +end +History = 'off'; +f_preparms_erptab(observe_ERPDAT.ERP,1,History,figurename); +observe_ERPDAT.Process_messg =2; +end + + +%%------------------------Reset parameters--------------------------------- +function erptab_reset(~,~) +global observe_ERPDAT; +global EStudio_gui_erp_totl; +global observe_EEGDAT; + +estudioworkingmemory('ViewerFlag', 0); + +MessageViewer= char(strcat('Reset parameters for ERP panels ')); +estudioworkingmemory('f_ERP_proces_messg',MessageViewer); +app = feval('estudio_reset_paras',[0 0 1 0]); +waitfor(app,'Finishbutton',1); +reset_paras = [0 0 0 0]; +try + reset_paras = app.output; %NO you don't want to output EEG with edited channel locations, you want to output the parameters to run decoding + app.delete; %delete app from view + pause(0.1); %wait for app to leave +catch + return; +end +if isempty(reset_paras) + return; +end +EStudio_gui_erp_totl.ERP_autoplot=1; +EStudio_gui_erp_totl.EEG_autoplot = 1; +%%---------------------------EEG Tab--------------------------------------- +if reset_paras(2)==1 + EStudio_gui_erp_totl.clear_alleeg = 1; +else + EStudio_gui_erp_totl.clear_alleeg = 0; +end + +if reset_paras(1)==1 + if ~isempty(observe_EEGDAT.EEG) && ~isempty(observe_EEGDAT.ALLEEG) + observe_EEGDAT.Reset_eeg_paras_panel=1; + end + if EStudio_gui_erp_totl.clear_alleeg == 0 + f_redrawEEG_Wave_Viewer(); else - offset = (size(plot_erp_data,3)-1:-1:0)*ind_plot_height; + observe_EEGDAT.ALLEEG = []; + observe_EEGDAT.EEG = []; + observe_EEGDAT.CURRENTSET = 0; + estudioworkingmemory('EEGArray',1); + observe_EEGDAT.count_current_eeg =1; end - [~,~,b] = size(plot_erp_data); - for i = 1:b - plot_erp_data(:,:,i) = plot_erp_data(:,:,i) + ones(size(plot_erp_data(:,:,i)))*offset(i); +else + if EStudio_gui_erp_totl.clear_alleeg == 1 + observe_EEGDAT.ALLEEG = []; + observe_EEGDAT.EEG = []; + observe_EEGDAT.CURRENTSET = 0; + estudioworkingmemory('EEGArray',1); + observe_EEGDAT.count_current_eeg =1; end - - - - r_ax = axes('Parent', EStudio_gui_erp_totl.ViewAxes,'Color','none','Box','on','FontWeight','bold'); - hold(r_ax,'on'); - set(EStudio_gui_erp_totl.plot_wav_legend,'Sizes',[80 -10]); - r_ax_legend = axes('Parent', EStudio_gui_erp_totl.ViewAxes_legend,'Color','none','Box','off'); - hold(r_ax_legend,'on'); - - - try - f_bin = 1000/observe_ERPDAT.ERP.srate; - catch - f_bin = 1; +end + + +%%---------------- -------------erp tab------------------------------------ +if reset_paras(4)==1 + EStudio_gui_erp_totl.clear_allerp = 1; +else + EStudio_gui_erp_totl.clear_allerp = 0; +end +observe_ERPDAT.Process_messg =1; +if reset_paras(3)==1 + if ~isempty(observe_ERPDAT.ERP) && ~isempty(observe_ERPDAT.ALLERP) + observe_ERPDAT.Reset_erp_paras_panel = 1; + end + if EStudio_gui_erp_totl.clear_allerp == 0 + f_redrawERP(); + else + observe_ERPDAT.ALLERP = []; + observe_ERPDAT.ERP = []; + observe_ERPDAT.CURRENTERP = 1; + estudioworkingmemory('selectederpstudio',1); end - ts = xtick_time; - ts_colmn = ts; - - % - %%------------------Adjust the data into multiple/single columns------------ - if Column_label>1 % Plotting waveforms with munltiple-columns - xticks_org = xticks_clomn; - for Numofcolumn = 1:Column_label-1 - xticks_clomn_add = [1:numel(ts)+Timet_step_p].*f_bin+(ts_colmn(end).*ones(1,numel(ts)+Timet_step_p)); - ts_colmn = [ts_colmn,xticks_clomn_add]; - end - - X_zero_line(1) =ts(1); - for Numofcolumn = 1:Column_label-1 - if Numofcolumn ==1 - X_zero_line(Numofcolumn+1) = X_zero_line(Numofcolumn)+ ts(end)-ts(1)+f_bin + (Timet_step_p/2)*f_bin; - else - X_zero_line(Numofcolumn+1) = X_zero_line(Numofcolumn)+ ts(end)-ts(1)+f_bin + (Timet_step_p)*f_bin; - end - end +else + if EStudio_gui_erp_totl.clear_allerp == 1 - [xticks,xticks_labels] = f_geterpxticklabel(observe_ERPDAT.ERP,xticks_clomn,Column_label,[Timet_low,Timet_high],Timet_step); - ts = ts_colmn; - Timet_low= ts(1); - Timet_high= ts(end); - for ii =1:100 - if Timet_high observe_ERPDAT.ERP.nchan) + ChanArray = [1:observe_ERPDAT.ERP.nchan]; +end +BinArray= estudioworkingmemory('ERP_BinArray'); +if isempty(BinArray) || any(BinArray<1) || any(BinArray>observe_ERPDAT.ERP.nbin) + BinArray = [1:observe_ERPDAT.ERP.nbin]; +end +ERPArray= estudioworkingmemory('selectederpstudio'); +if isempty(ERPArray) + ERPArray = length(observe_ERPDAT.ALLERP); + observe_ERPDAT.ERP = observe_ERPDAT.ALLERP(end); + observe_ERPDAT.CURRENTERP = ERPArray; + estudioworkingmemory('selectederpstudio',ERPArray); +end +ERPLAB_ERP_Viewer(observe_ERPDAT.ALLERP,ERPArray,BinArray,ChanArray); +observe_ERPDAT.Process_messg =2; +end + + + + +function f_plotaberpwave(ERP,ChanArray,BinArray,timeStart,timEnd,xtickstep,yscale,columNum,... + positive_up,BinchanOverlay,rowNums,GridposArray,Standerr,Transparency,waveview,legendview,Yticks) + +FonsizeDefault = f_get_default_fontsize(); +%%matlab version +matlab_ver = version('-release'); +Matlab_ver = str2double(matlab_ver(1:4)); + + +qtimeRange = [timeStart timEnd]; +if BinchanOverlay==0 + qPLOTORG = [1 2 3]; + [~, qplotArrayStr, ~, ~, ~] = readlocs(ERP.chanlocs(ChanArray)); + qLegendName= ERP.bindescr(BinArray); +else + qPLOTORG = [2 1 3]; + [~, qLegendName, ~, ~, ~] = readlocs(ERP.chanlocs(ChanArray)); + qplotArrayStr = ERP.bindescr(BinArray); +end +[ERPdatadef,legendNamedef,ERPerrordatadef,timeRangedef] = f_geterpdata(ERP,1,qPLOTORG,1); +if qPLOTORG(1)==1 && qPLOTORG(2)==2 %% Array is plotnum by samples by datanum + bindata = ERPdatadef(sort(ChanArray),:,sort(BinArray),1); + bindataerror= ERPerrordatadef(sort(ChanArray),:,sort(BinArray),1); + plotArray = ChanArray; +elseif qPLOTORG(1)==2 && qPLOTORG(2)==1 + bindata = ERPdatadef(sort(ChanArray),:,sort(BinArray),1); + bindata = permute(bindata,[3 2 1 4]); + bindataerror= ERPerrordatadef(sort(ChanArray),:,sort(BinArray),1); + bindataerror = permute(bindataerror,[3 2 1 4]); + plotArray = BinArray; +end +if isempty(Standerr) || numel(Standerr)~=1 || any(Standerr<0) || any(Standerr>10) + Standerr=1; +end + +if isempty(Transparency) || numel(Transparency)~=1 || any(Transparency<0)|| any(Transparency>1) + Transparency=0.2; +end + + +if isempty(timeRangedef) + timeRangedef = ERP.times; +end +fs= ERP.srate; +qYScales = yscale; +Ypert =15; +%%get y axis +ERP1 = ERP; +ERP1.bindata = ERP.bindata(ChanArray,:,:); +[def, minydef, maxydef] = default_amp_ticks(ERP1, BinArray); +minydef = floor(minydef); +maxydef = ceil(maxydef); +if ~isempty(minydef) && ~isempty(maxydef) + if minydef==maxydef + minydef=-1; + maxydef=1; + end +elseif isempty(minydef) || isempty(maxydef) + minydef=-1; + maxydef=1; +end + +y_scale_def = [minydef,maxydef]; +if isempty(qYScales) || numel(qYScales)~=2 + qYScales = y_scale_def; +end +if numel(qYScales)==2 + yscaleall = qYScales(end)-qYScales(1); +else + yscaleall = 2*max(abs(qYScales)); + qYScales = [-max(abs(qYScales)),max(abs(qYScales))]; +end +% if yscaleall < y_scale_def(2)-y_scale_def(1) +% yscaleall = y_scale_def(2)-y_scale_def(1); +% end +for Numofrows = 1:rowNums + OffSetY(Numofrows) = yscaleall*(rowNums-Numofrows)*(Ypert/100+1); +end + +qYticksdef = str2num(char(default_amp_ticks_viewer(qYScales))); +qYticks = Yticks; +if isempty(qYticks) || numel(qYticks)<2 + qYticks = qYticksdef; +end + + +%%gap between columns +Xpert = 10; +try + StepX = (ERP.times(end)-ERP.times(1))*(Xpert/100); +catch + beep; + disp('ERP.times only has one element.'); + return; +end +StepXP = ceil(StepX/(1000/fs)); + +qPolarityWave = positive_up; + +NumOverlay = size(bindata,3); +isxaxislabel=1; + +%%line color +qLineColorspec = get_colors(NumOverlay); +%%xticks +[timeticksdef stepX]= default_time_ticks_studio(ERP, qtimeRange); +timeticksdef = str2num(char(timeticksdef)); +qtimeRangedef = round(qtimeRange/100)*100; +qXticks = xtickstep+qtimeRangedef(1); +for ii=1:1000 + xtickcheck = qXticks(end)+xtickstep; + if xtickcheck>qtimeRange(2) + break; + else + qXticks(numel(qXticks)+1) =xtickcheck; + end +end +if isempty(qXticks) + qXticks = timeticksdef; +end + +[xxx, latsamp1, latdiffms] = closest(ERP.times, qtimeRange); +qtimes = ERP.times(latsamp1(1):latsamp1(2)); + + +[xxx, latsamp, latdiffms] = closest(qtimes, 0); +if isempty(latsamp) || any(latsamp<=0) + labelxrange = 0; +else + labelxrange = qtimes(latsamp)-qtimes(1); +end +if labelxrange<=0 + CBELabels = [1 100 1]; +else + CBELabels(1) = 100*labelxrange/(qtimeRange(2)-qtimeRange(1))+1; +end + +%%remove the margins of a plot +ax = waveview; +outerpos = ax.OuterPosition; +ti = ax.TightInset; +left = outerpos(1) + ti(1); +bottom = outerpos(2) + ti(2); +ax_width = outerpos(3) - ti(1) - ti(3); +ax_height = outerpos(4) - ti(2) - ti(4); +ax.Position = [left bottom ax_width ax_height]; + +%%check elements in qGridposArray +plotArray = reshape(plotArray,1,[]); +for Numofrows = 1:size(GridposArray,1) + for Numofcolumns = 1:size(GridposArray,2) + SingleGridpos = GridposArray(Numofrows,Numofcolumns); + if SingleGridpos~=0 + ExistGridops = f_existvector(plotArray,SingleGridpos); + if ExistGridops==1 + GridposArray(Numofrows,Numofcolumns) =0; else - break; + [xpos,ypos]= find(plotArray==SingleGridpos); + GridposArray(Numofrows,Numofcolumns) =plotArray(ypos); end end - - else%% Plotting waveforms with single-column - %%%------------getting xticklabels for each row of each wave-------------- - xticks =xticks_clomn; - X_zero_line(1) =ts(1); - for Numofxlabel = 1:numel(xticks) - xticks_labels{Numofxlabel} = num2str(xticks(Numofxlabel)); - end - end - - - splot_n = size(plot_erp_data,3);%%Adjust the columns - - set(r_ax,'XLim',[Timet_low,Timet_high]); - - [a,c,b] = size(plot_erp_data); - new_erp_data = zeros(a,b*c); - for i = 1:b - new_erp_data(:,((c*(i-1))+1):(c*i)) = plot_erp_data(:,:,i); end - - - line_colors = erpworkingmemory('PWColor'); - if size(line_colors,1)~= numel(ndata) - if numel(ndata)> size(line_colors,1) - line_colors = get_colors(numel(ndata)); +end +fontnames = 'Helvetica'; + +hplot = []; +countPlot = 0; +for Numofrows = 1:rowNums + for Numofcolumns = 1:columNum + try + plotdatalabel = GridposArray(Numofrows,Numofcolumns); + catch + plotdatalabel = 0; + end + if (qPLOTORG(1)==1 && qPLOTORG(2)==2) ||(qPLOTORG(1)==2 && qPLOTORG(2)==1) + plotArray1 = sort(plotArray); else - line_colors = line_colors(1:numel(ndata),:,:); + plotArray1 = plotArray; + end + [xpos,plotdatalabel] = find(plotArray1 == plotdatalabel); + if isempty(plotdatalabel) + plotdatalabel = 0; + end + try + plotbindata = bindata(plotdatalabel,:,:,:); + catch + plotbindata = []; end - end - - if isempty(line_colors) - line_colors = get_colors(numel(ndata)); - end - - line_colors = repmat(line_colors,[splot_n 1]); %repeat the colors once for every plot - - % - %%------------Setting xticklabels for each row -------------- - x_axs = ones(size(new_erp_data,1),1); - for jj = 1:numel(offset)-1 - plot(r_ax,ts,x_axs.*offset(end),'color',[1 1 1],'LineWidth',1); - set(r_ax,'XTick',xticks, ... - 'box','off', 'Color','none','xticklabels',xticks_labels,'FontWeight','bold'); - myX_Crossing = offset(jj); - props = get(r_ax); - tick_bottom = -props.TickLength(1)*diff(props.YLim); - if abs(tick_bottom) > abs(Yscale)/5 + if plotdatalabel ~=0 && plotdatalabel<= numel(plotArray) && ~isempty(plotbindata) + countPlot =countPlot +1; try - tick_bottom = - abs(Yscale)/5; + labelcbe = qplotArrayStr{countPlot}; + if isempty(labelcbe) + labelcbe = 'No label'; + end catch - tick_bottom = tick_bottom; + labelcbe = 'no'; end - elseif abs(tick_bottom)1 - if numel(offset)==jj - kkkk = 1; + + if qPolarityWave==1 + data4plot = squeeze(bindata(plotdatalabel,:,:,1)); else - if abs(Timet_low - xticks(1)) > 1000/observe_ERPDAT.ERP.srate - kkkk = 1; + data4plot = squeeze(bindata(plotdatalabel,:,:,1))*(-1); + end + + data4plot = reshape(data4plot,numel(timeRangedef),NumOverlay); + for Numofoverlay = 1:NumOverlay + [Xtimerange, bindatatrs] = f_adjustbindtabasedtimedefd(squeeze(data4plot(:,Numofoverlay)), timeRangedef,qtimeRange,fs); + PosIndexsALL = [Numofrows,columNum]; + if isxaxislabel==2 + [~,XtimerangetrasfALL,~,~,~] = f_adjustdata_xyrange_xyticks_overlay(bindatatrs,Xtimerange,qXticks,OffSetY,columNum,PosIndexsALL,StepXP); + else + [~,XtimerangetrasfALL,~] = f_adjustdata_xyrange_xyticks(bindatatrs,Xtimerange,qXticks,OffSetY,columNum,PosIndexsALL,StepX,fs); + end + aerror = isnan(squeeze(bindataerror(plotdatalabel,:,Numofoverlay,1))); + [Xerror,yerro] = find(aerror==0); + PosIndexs = [Numofrows,Numofcolumns]; + if ~isempty(yerro) && Standerr>=1 &&Transparency>0 %SEM + [Xtimerange, bindataerrtrs] = f_adjustbindtabasedtimedefd(squeeze(bindataerror(plotdatalabel,:,Numofoverlay,1)), timeRangedef,qtimeRange,fs); + if isxaxislabel==2 + [bindatatrs1,Xtimerangetrasf,qXtickstransf,TimeAdjustOut,XtimerangeadjustALL] = f_adjustdata_xyrange_xyticks_overlay(bindatatrs,Xtimerange,qXticks,OffSetY,columNum,PosIndexs,StepXP); + else + [bindatatrs1,Xtimerangetrasf,qXtickstransf] = f_adjustdata_xyrange_xyticks(bindatatrs,Xtimerange,qXticks,OffSetY,columNum,PosIndexs,StepX,fs); + end + yt1 = bindatatrs1 - bindataerrtrs.*Standerr; + yt2 = bindatatrs1 + bindataerrtrs.*Standerr; + fill(waveview,[Xtimerangetrasf fliplr(Xtimerangetrasf)],[yt2 fliplr(yt1)], qLineColorspec(Numofoverlay,:), 'FaceAlpha', Transparency, 'EdgeColor', 'none'); + end + if isxaxislabel==2 + [bindatatrs,Xtimerangetrasf,qXtickstransf,TimeAdjustOut,XtimerangeadjustALL] = f_adjustdata_xyrange_xyticks_overlay(bindatatrs,Xtimerange,qXticks,OffSetY,columNum,PosIndexs,StepXP); else - kkkk = 2; + [bindatatrs,Xtimerangetrasf,qXtickstransf] = f_adjustdata_xyrange_xyticks(bindatatrs,Xtimerange,qXticks,OffSetY,columNum,PosIndexs,StepX,fs); end + hplot(Numofoverlay) = plot(waveview,Xtimerangetrasf, bindatatrs,'LineWidth',1,... + 'Color', qLineColorspec(Numofoverlay,:)); + end - for iCount = kkkk:nTicks - xtick_label = (props.XTickLabel(iCount, :)); - text(r_ax,props.XTick(iCount), tick_bottom + myX_Crossing, ... - xtick_label, ... - 'HorizontalAlignment', 'Center', ... - 'VerticalAlignment', 'Top', ... - 'FontSize', 12, ... - 'FontName', props.FontName, ... - 'FontAngle', props.FontAngle, ... - 'FontUnits', props.FontUnits, ... - 'FontWeight', 'bold'); + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%----------------------Adjust y axis------------------------%% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + props = get(waveview); + if qPolarityWave==1 + props.YTick = qYticks+OffSetY(Numofrows); + else + props.YTick = fliplr (-1*qYticks)+OffSetY(Numofrows); end - end - end - - - % - %%----------------Start:Remove xticks for the columns without waves in the last row------------------------- - Element_left = numel(nplot) - (ceil(numel(nplot)/Column_label)-1)*Column_label; - plot(r_ax,ts,x_axs.*offset(end),'color', [1 1 1],'LineWidth',1); - set(r_ax,'XTick',xticks, ... - 'box','off', 'Color','none','xticklabels',xticks_labels,'FontWeight','bold'); - myX_Crossing = offset(end); - props = get(r_ax); - - tick_bottom = -props.TickLength(1)*diff(props.YLim); - if abs(tick_bottom) > abs(Yscale)/5 - try - tick_bottom = - abs(Yscale)/5; - catch - tick_bottom = tick_bottom; - end - elseif abs(tick_bottom)1 - for iCount = 1:ceil(nTicks/Column_label*Element_left) - xtick_label = (props.XTickLabel(iCount, :)); - text(r_ax,props.XTick(iCount), tick_bottom + myX_Crossing, ... - xtick_label, ... - 'HorizontalAlignment', 'Center', ... - 'VerticalAlignment', 'Top', ... - 'FontSize', 12, ... - 'FontName', props.FontName, ... - 'FontAngle', props.FontAngle, ... - 'FontUnits', props.FontUnits, ... - 'FontWeight', 'bold'); - end - end - %%--------------------------End:Remove xticks for the columns without waves in the last row------------------------- - - % - %%-----------------Get zeroline for each row----------------------------- - row_baseline = NaN(numel(ts),splot_n); - count = 0; - for Numofsplot = 0:splot_n-1 - for Numofcolumn = 1:Column_label - count = count +1; - if count> numel(nplot) - break; + props.YTickLabel = cell(numel(props.YTick),1); + + + for Numofytick = 1:numel(props.YTick) + props.YTickLabel(Numofytick) = {num2str(props.YTick(Numofytick))}; end - low_interval = size(plot_erp_data_new,1)*(Numofcolumn-1)+1+(Numofcolumn-1)*Timet_step_p; - high_interval = size(plot_erp_data_new,1)*(Numofcolumn-1)+(Numofcolumn-1)*Timet_step_p+size(plot_erp_data_new,1); - row_baseline(low_interval:high_interval,Numofsplot+1) = ones(numel(low_interval:high_interval),1).*offset(Numofsplot+1); - end - end - - - % - %%-------------------------Plotting ERP waves----------------------------- - pb_here = plot(r_ax,ts, [new_erp_data],'LineWidth',1.5); - - set(r_ax, 'XTick', [], 'XTickLabel', []); - - % - %%----------------Marking 0 point (event-locked)-------------------------- - [xxx, latsamp_0, latdiffms_0] = closest(xticks, [0]); - if numel(offset)>1 - if latdiffms_0 ==0 - for Numofcolumn = 1:Column_label - xline(r_ax,xticks((Numofcolumn-1)*numel(xticks_clomn)+latsamp_0),'k-.','LineWidth',1);%%'Color',Marking start time point for each column + + [x,y_0] = find(Xtimerange==0); + if isempty(y_0) + y_0 = 1; end - end - elseif numel(offset)==1 - - for Numofcolumn = 1:numel(nplot) - xline(r_ax,xticks((Numofcolumn-1)*numel(xticks_clomn)+latsamp_0),'k-.','LineWidth',1);%%'Color',Marking start time point for each column - end - end - % - yticks = -perc_lim:perc_lim:((2*percentile*b)-(2*perc_lim)); - ylabs = repmat([-perc_lim 0 perc_lim],[1,b]); - oldlim = [-percentile yticks(end)-perc_lim+percentile]; - top_vspace = max( max( new_erp_data))-oldlim(2); - bot_vspace = min( min( new_erp_data))-oldlim(1); - if top_vspace < 0 - top_vspace = 0; - end - - if bot_vspace > 0 - bot_vspace = 0; - end - newlim = oldlim + [bot_vspace top_vspace]; - set(r_ax,'XLim',[Timet_low,Timet_high],'Ylim',newlim); - - - % - %%--------------Setting color for each wave-------------------------- - % if Column_label>1 - % for i = 0:splot_n-1 - % r_ax.Children(end-i).Color = [1 1 1]; - % end - % end - - % for i = splot_n+1:numel(pb_here) - % pb_here(i).Color = line_colors((i-splot_n),:); - % end - for i = 1:numel(pb_here) - pb_here(i).Color = line_colors(i,:); - end - % - % for i = 1:splot_n-1 - % pb_here(i).Color = [0 0 0]; - % pb_here(i).LineWidth=.01; - % end - - - - - %%------------Marking start time point for each column--------------------- - if Column_label>1 - for ii = 2:numel(X_zero_line) - xline(r_ax,X_zero_line(ii), 'y--','LineWidth',2); - end - end - - for Numofplot = 1:size(row_baseline,2) - plot(r_ax,ts,row_baseline(:,Numofplot),'color',[0 0 0],'LineWidth',1.5); - end - ylabs = [fliplr(-perc_lim:-perc_lim:newlim(1)) ylabs(2:end-1) (yticks(end):perc_lim:newlim(2))-yticks(end)+perc_lim]; - yticks = [fliplr(-perc_lim:-perc_lim:newlim(1)) yticks(2:end-1) yticks(end):perc_lim:newlim(2)]; - - % - %%-------------Name of bin/channel for each subplot-------------------------- - if Column_label==1 - if numel(offset)>1 - count = 0; - for i = 0:numel(offset)-1 - leg_str = ''; - - count = count+1; + myY_Crossing = Xtimerangetrasf(y_0); + tick_top = 0; + + if countPlot ==1 + ytick_bottom = -props.TickLength(1)*diff(props.XLim); + ytick_bottomratio = abs(ytick_bottom)/diff(props.XLim); + else try - if Bin_chans == 0 - leg_str = sprintf('%s',strrep(Elec_list{Elecs_shown(count)},'_','\_')); - else - leg_str = sprintf('%s',strrep(observe_ERPDAT.ERP.bindescr{Bins(count)},'_','\_')); + ytick_bottom = ytick_bottom; + ytick_bottomratio = ytick_bottomratio; + catch + ytick_bottom = -props.TickLength(1)*diff(props.XLim); + ytick_bottomratio = abs(ytick_bottom)/diff(props.XLim); + end + end + %%add yunits + if ~isempty(props.YTick) + ytick_y = repmat(props.YTick, 2, 1); + ytick_x = repmat([tick_top;ytick_bottom] +myY_Crossing, 1, length(props.YTick)); + line(waveview,ytick_x(:,:), ytick_y(:,:), 'color', 'k','LineWidth',1); + try + [~,y_below0] =find(qYticks<0); + if isempty(y_below0) && qYScales(1)<0 + line(waveview,ytick_x(:,:), ones(2,1)*(qYScales(1)+OffSetY(Numofrows)), 'color', 'k','LineWidth',1); + end + [~,y_over0] =find(qYticks>0); + if isempty(y_over0) && qYScales(2)>0 + line(waveview,ytick_x(:,:), ones(2,1)*(qYScales(2)+OffSetY(Numofrows)), 'color', 'k','LineWidth',1); end catch - leg_str = ''; end - text(r_ax,ts(1),offset(i+1)+offset(end-1)/6,leg_str,'FontWeight','bold','FontSize', 14); end - end - - try - if Bin_chans == 0 - leg_str = sprintf('%s',strrep(Elec_list{Elecs_shown(end)},'_','\_')); + + if ~isempty(qYScales) && numel(qYScales)==2 %qYScales(end))+OffSetY(1) + if qPolarityWave~=1 + qYScalestras = fliplr (-1*qYScales); + else + qYScalestras = qYScales; + end + plot(waveview,ones(numel(qYScalestras),1)*myY_Crossing, qYScalestras+OffSetY(Numofrows),'k','LineWidth',1); else - leg_str = sprintf('%s',strrep(observe_ERPDAT.ERP.bindescr{Bins(end)},'_','\_')); - end - catch%% - leg_str = ''; - end - - try - text(r_ax,ts(1),offset(end-1)/6,leg_str,'FontWeight','bold','FontSize', 14); - catch - text(r_ax,ts(1),Yscale/2,leg_str,'FontWeight','bold','FontSize', 14); - end - else%% Getting y ticks and legends for multiple-columns - if numel(offset)>1 - count = 0; - for i = 0:numel(offset)-1 - leg_str = ''; - for Numofcolumn = 1: Column_label - count = count+1; - try - if Bin_chans == 0 - leg_str = sprintf('%s',strrep(Elec_list{Elecs_shown(count)},'_','\_')); - else - leg_str = sprintf('%s',strrep(observe_ERPDAT.ERP.bindescr{Bins(count)},'_','\_')); - end - catch - leg_str = ''; - end - if Numofcolumn ==1 - text(r_ax,X_zero_line(Numofcolumn),offset(i+1)+offset(end-1)/6,leg_str,'FontWeight','bold','FontSize', 14); + if ~isempty(y_scale_def) && numel(unique(y_scale_def))==2 + if qPolarityWave==0 + qYScalestras = fliplr (-1*y_scale_def); else - text(r_ax,X_zero_line(Numofcolumn)+Timet_step/2,offset(i+1)+offset(end-1)/6,leg_str,'FontWeight','bold','FontSize', 14); + qYScalestras = y_scale_def; end + plot(waveview,ones(numel(qYScales),1)*myY_Crossing, qYScalestras+OffSetY(Numofrows),'k','LineWidth',1); + else end end - end - - - count = (numel(offset)-1)*Column_label; - leg_str = ''; - for Numofcolumn = 1:Column_label - count = count+1; - try - if Bin_chans == 0 - leg_str = sprintf('%s',strrep(Elec_list{Elecs_shown(count)},'_','\_')); + + qYtickdecimal=1; + nYTicks = length(props.YTick); + for iCount = 1:nYTicks + if qPolarityWave==1 + ytick_label= sprintf(['%.',num2str(qYtickdecimal),'f'],str2num(char(props.YTickLabel(iCount, :)))-OffSetY(Numofrows)); else - leg_str = sprintf('%s',strrep(observe_ERPDAT.ERP.bindescr{Bins(count)},'_','\_')); + qyticktras = fliplr(-1*qYticks); + ytick_label= sprintf(['%.',num2str(qYtickdecimal),'f'],-qyticktras(iCount)); + end + % end + if str2num(char(ytick_label)) ==0 || (str2num(char(ytick_label))<0.0001 && str2num(char(ytick_label))>0) || (str2num(char(ytick_label))>-0.0001 && str2num(char(ytick_label))<0) + ytick_label = ''; end - catch%% - leg_str = ''; + text(waveview,myY_Crossing-2*abs(ytick_bottom),props.YTick(iCount), ... + ytick_label, ... + 'HorizontalAlignment', 'right', ... + 'VerticalAlignment', 'middle', ... + 'FontSize', FonsizeDefault, ... + 'FontAngle', props.FontAngle, ... + 'FontUnits', props.FontUnits,... + 'FontName', fontnames, ... + 'Color',[0 0 0]);% end - try - - if Numofcolumn ==1 - text(r_ax,X_zero_line(Numofcolumn),offset(i+1)+offset(end-1)/6,leg_str,'FontWeight','bold','FontSize', 14); - else - text(r_ax,X_zero_line(Numofcolumn)+Timet_step/2,offset(i+1)+offset(end-1)/6,leg_str,'FontWeight','bold','FontSize', 14); + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%----------------------Adjust x axis------------------------%% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + props.XTick = qXtickstransf; + props.XTickLabel = cell(numel(qXticks),1); + for Numofytick = 1:numel(props.XTick) + props.XTickLabel(Numofytick) = {num2str(qXticks(Numofytick))}; + end + myX_Crossing = OffSetY(Numofrows); + if countPlot ==1 + xtick_bottom = -props.TickLength(2)*max(props.YLim); + if abs(xtick_bottom)/max(props.YLim) > ytick_bottomratio + xtick_bottom = -ytick_bottomratio*max(props.YLim); end - catch - - if Numofcolumn ==1 - text(r_ax,X_zero_line(Numofcolumn),Yscale/2,leg_str,'FontWeight','bold','FontSize', 14); + else + try + xtick_bottom = xtick_bottom; + catch + xtick_bottom = -props.TickLength(2)*max(props.YLim); + if abs(xtick_bottom)/max(props.YLim) > ytick_bottomratio + xtick_bottom = -ytick_bottomratio*max(props.YLim); + end + end + end + if ~isempty(props.XTick) + xtick_x = repmat(props.XTick, 2, 1); + xtick_y = repmat([xtick_bottom; tick_top]*0.5 + myX_Crossing, 1, length(props.XTick)); + line(waveview,xtick_x, xtick_y, 'color', 'k','LineWidth',1); + end + [x_xtick,y_xtick] = find(props.XTick==0); + if ~isempty(y_xtick) + props.XTick(y_xtick) = 2*xtick_bottom; + end + plot(waveview,Xtimerangetrasf, myX_Crossing.*ones(numel(Xtimerangetrasf),1),'k','LineWidth',1); + nxTicks = length(props.XTick); + qXticklabel = 'on'; + for iCount = 1:nxTicks + xtick_label = (props.XTickLabel(iCount, :)); + if strcmpi(qXticklabel,'on') + if strcmpi(xtick_label,'0') + xtick_label = ''; + end else - text(r_ax,X_zero_line(Numofcolumn)+Timet_step/2,Yscale/2,leg_str,'FontWeight','bold','FontSize', 14); + xtick_label = ''; end - % text(r_ax,X_zero_line(Numofcolumn),Yscale/2,leg_str,'FontWeight','bold','FontSize', 14); + text(waveview,props.XTick(iCount), xtick_bottom*0.5 + myX_Crossing, ... + xtick_label, ... + 'HorizontalAlignment', 'Center', ... + 'VerticalAlignment', 'Top', ... + 'FontSize', FonsizeDefault, ... + 'FontAngle', props.FontAngle, ... + 'FontUnits', props.FontUnits,... + 'FontName', fontnames, ... + 'Color',[0 0 0]);%'FontName', qXlabelfont, ... end - end - - end - % - - - % - %%-------------Setting x/yticks and ticklabels-------------------------------- - Ylabels_new = ylabs.*Plority_plot; - [~,Y_label] = find(Ylabels_new == -0); - Ylabels_new(Y_label) = 0; - % xticks = (Min_time:Timet_step:Max_time); - % some options currently only work post Matlab R2016a ,'XLim',[Min_time Max_time],'XLim',[Min_time Max_time] - if Matlab_ver >= 2016 - set(r_ax,'FontSize',tsize,'FontWeight','bold','XAxisLocation','origin',... - 'XGrid','on','YGrid','on','YTick',yticks,'YTickLabel',Ylabels_new, ... - 'YLim',newlim,'XTick',xticks, ... - 'box','off', 'Color','none','xticklabels',xticks_labels); - else - set(r_ax,'FontSize',tsize,'FontWeight','bold','XAxisLocation','bottom',... - 'XGrid','on','YGrid','on','YTick',yticks,'YTickLabel',Ylabels_new, ... - 'YLim',newlim, 'XTick',xticks, ... - 'box','off', 'Color','none','xticklabels',xticks_labels); - hline(0,'k'); % backup xaxis - end - % if Column_label>1 - % set(r_ax,'XGrid','on','YGrid','on');%,'XDir','reverse' - % end - set(r_ax, 'XTick', [], 'XTickLabel', [],'FontWeight', 'bold'); - r_ax.YAxis.LineWidth = 1.5; - hold(r_ax,'off'); - - - % - %%--------------------------Setting legend--------------------------------- - line_colors_ldg = erpworkingmemory('PWColor'); - if isempty(line_colors_ldg) - line_colors_ldg = get_colors(numel(ndata)); - end - - if size(line_colors_ldg,1)~= numel(ndata) - if numel(ndata)> size(line_colors_ldg,1) - line_colors_ldg = get_colors(numel(ndata)); + %%-----------------minor X--------------- + set(waveview,'xlim',[Xtimerange(1),Xtimerangetrasf(end)]); + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%------------------channel/bin/erpset label-----------------%% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ypercentage =100; + ypos_LABEL = (qYScalestras(end)-qYScalestras(1))*(ypercentage)/100+qYScalestras(1); + xpercentage = CBELabels(1); + xpos_LABEL = (Xtimerangetrasf(end)-Xtimerangetrasf(1))*xpercentage/100 + Xtimerangetrasf(1); + labelcbe = strrep(char(labelcbe),'_','\_'); + try + labelcbe = regexp(labelcbe, '\;', 'split'); + catch + end + text(waveview,xpos_LABEL,ypos_LABEL+OffSetY(Numofrows), char(labelcbe),'FontName', fontnames,'HorizontalAlignment', 'left');%'FontWeight', 'bold', else - line_colors_ldg = line_colors_ldg(1:numel(ndata),:,:); end - end - - for Numofplot = 1:size(plot_erp_data,2) - plot(r_ax_legend,[0 0],'Color',line_colors_ldg(Numofplot,:,:),'LineWidth',3) - end + try + if 2 length(observe_ERPDAT.ALLERP) - beep; - disp('Waiting for modifing'); - return; -end -observe_ERPDAT.CURRENTERP = Current_erp_Index; -observe_ERPDAT.ERP = observe_ERPDAT.ALLERP(Current_erp_Index); -estudioworkingmemory('geterpbinchan',S_ws_getbinchan); -% f_redrawERP(); -if length(S_ws_geterpset) ==1 - Enable_minus = 'off'; - Enable_plus = 'off'; - Enable_plus_BackgroundColor = [0 0 0]; - Enable_minus_BackgroundColor = [0 0 0]; -else - if S_ws_getbinchan.Select_index ==1 - Enable_minus = 'off'; - Enable_plus = 'on'; - Enable_plus_BackgroundColor = [0 1 0]; - Enable_minus_BackgroundColor = [0 0 0]; - elseif S_ws_getbinchan.Select_index == length(S_ws_geterpset) - Enable_minus = 'on'; - Enable_plus = 'off'; - Enable_plus_BackgroundColor = [0 0 0]; - Enable_minus_BackgroundColor = [0 1 0]; - else - Enable_minus = 'on'; - Enable_plus = 'on'; - Enable_plus_BackgroundColor = [0 1 0]; - Enable_minus_BackgroundColor = [0 1 0]; - end -end -EStudio_gui_erp_totl.pageinfo_minus.Enable = Enable_minus; -EStudio_gui_erp_totl.pageinfo_plus.Enable = Enable_plus; -EStudio_gui_erp_totl.pageinfo_plus.ForegroundColor = Enable_plus_BackgroundColor; -EStudio_gui_erp_totl.pageinfo_minus.ForegroundColor = Enable_minus_BackgroundColor; -EStudio_gui_erp_totl.pageinfo_edit.String = num2str(S_ws_getbinchan.Select_index); - -MessageViewer= char(strcat('Plot prior page (<)')); -erpworkingmemory('f_ERP_proces_messg',MessageViewer); -observe_ERPDAT.Process_messg =1; -try - observe_ERPDAT.Count_currentERP = observe_ERPDAT.Count_currentERP+1; - observe_ERPDAT.Process_messg =2; -catch - observe_ERPDAT.Process_messg =3; -end -observe_ERPDAT.Two_GUI = observe_ERPDAT.Two_GUI+1; -end - -%%Edit the index of ERPsets -function page_edit(Str,~,EStudio_gui_erp_totl) -CurrentERPindex = str2num(Str.String); -global observe_ERPDAT; -S_ws_geterpset= estudioworkingmemory('selectederpstudio'); -if isempty(S_ws_geterpset) - S_ws_geterpset = observe_ERPDAT.CURRENTERP; - if isempty(S_ws_geterpset) - msgboxText = 'No ERPset was selected!!!'; - title = 'EStudio: ERPsets'; - errorfound(msgboxText, title); - return; - end - S_erpplot = f_ERPplot_Parameter(observe_ERPDAT.ALLERP,S_ws_geterpset); - estudioworkingmemory('geterpbinchan',S_erpplot.geterpbinchan); - estudioworkingmemory('geterpplot',S_erpplot.geterpplot); -end -S_ws_getbinchan = estudioworkingmemory('geterpbinchan'); -if ~isempty(CurrentERPindex) && numel(CurrentERPindex)==1 && (CurrentERPindex<= numel(S_ws_geterpset)) - S_ws_getbinchan.Select_index = CurrentERPindex; - Current_erp_Index = S_ws_geterpset(S_ws_getbinchan.Select_index); - % EStudio_gui_erp_totl.pageinfo_edit.String = num2str(S_ws_getbinchan.Select_index); - if Current_erp_Index > length(observe_ERPDAT.ALLERP) - beep; - disp('Waiting for modifing'); - return; - end - observe_ERPDAT.CURRENTERP = Current_erp_Index; - observe_ERPDAT.ERP = observe_ERPDAT.ALLERP(Current_erp_Index); - estudioworkingmemory('geterpbinchan',S_ws_getbinchan); - if length(S_ws_geterpset) ==1 - Enable_minus = 'off'; - Enable_plus = 'off'; - Enable_plus_BackgroundColor = [0 0 0]; - Enable_minus_BackgroundColor = [0 0 0]; - else - if CurrentERPindex ==1 - Enable_minus = 'off'; - Enable_plus = 'on'; - Enable_plus_BackgroundColor = [0 1 0]; - Enable_minus_BackgroundColor = [1 1 1]; - elseif CurrentERPindex == length(S_ws_geterpset) - Enable_minus = 'on'; - Enable_plus = 'off'; - Enable_plus_BackgroundColor = [0 0 0]; - Enable_minus_BackgroundColor = [0 1 0]; - else - Enable_minus = 'on'; - Enable_plus = 'on'; - Enable_plus_BackgroundColor = [0 1 0]; - Enable_minus_BackgroundColor = [0 1 0]; - end - end - EStudio_gui_erp_totl.pageinfo_minus.Enable = Enable_minus; - EStudio_gui_erp_totl.pageinfo_plus.Enable = Enable_plus; - EStudio_gui_erp_totl.pageinfo_plus.ForegroundColor = Enable_plus_BackgroundColor; - EStudio_gui_erp_totl.pageinfo_minus.ForegroundColor = Enable_minus_BackgroundColor; - - MessageViewer= char(strcat('Page Editor')); - erpworkingmemory('f_ERP_proces_messg',MessageViewer); - observe_ERPDAT.Process_messg =1; - try - observe_ERPDAT.Count_currentERP = observe_ERPDAT.Count_currentERP+1; - observe_ERPDAT.Process_messg =2; - catch - observe_ERPDAT.Process_messg =3; - end -end -observe_ERPDAT.Two_GUI = observe_ERPDAT.Two_GUI+1; -end - - -%------------------Display the waveform for next ERPset-------------------- -function page_plus(~,~,EStudio_gui_erp_totl) -global observe_ERPDAT; -S_ws_geterpset= estudioworkingmemory('selectederpstudio'); -if isempty(S_ws_geterpset) - S_ws_geterpset = observe_ERPDAT.CURRENTERP; - if isempty(S_ws_geterpset) - msgboxText = 'No ERPset was selected!!!'; - title = 'EStudio: ERPsets'; - errorfound(msgboxText, title); - return; - end - S_erpplot = f_ERPplot_Parameter(observe_ERPDAT.ALLERP,S_ws_geterpset); - estudioworkingmemory('geterpbinchan',S_erpplot.geterpbinchan); - estudioworkingmemory('geterpplot',S_erpplot.geterpplot); -end -S_ws_getbinchan = estudioworkingmemory('geterpbinchan'); -S_ws_getbinchan.Select_index = S_ws_getbinchan.Select_index+1; -try - Current_erp_Index = S_ws_geterpset(S_ws_getbinchan.Select_index); -catch - return; -end -if Current_erp_Index > length(observe_ERPDAT.ALLERP) - beep; - disp('Waiting for modifing'); - return; -end -EStudio_gui_erp_totl.pageinfo_edit.String = num2str(S_ws_getbinchan.Select_index); -observe_ERPDAT.CURRENTERP = Current_erp_Index; -observe_ERPDAT.ERP = observe_ERPDAT.ALLERP(Current_erp_Index); -estudioworkingmemory('geterpbinchan',S_ws_getbinchan); -if length(S_ws_geterpset) ==1 - Enable_minus = 'off'; - Enable_plus = 'off'; - Enable_plus_BackgroundColor = [0 0 0]; - Enable_minus_BackgroundColor = [0 0 0]; -else - if S_ws_getbinchan.Select_index ==1 - Enable_minus = 'off'; - Enable_plus = 'on'; - Enable_plus_BackgroundColor = [0 1 0]; - Enable_minus_BackgroundColor = [1 1 1]; - elseif S_ws_getbinchan.Select_index == length(S_ws_geterpset) - Enable_minus = 'on'; - Enable_plus = 'off'; - Enable_plus_BackgroundColor = [0 0 0]; - Enable_minus_BackgroundColor = [0 1 0]; - else - Enable_minus = 'on'; - Enable_plus = 'on'; - Enable_plus_BackgroundColor = [0 1 0]; - Enable_minus_BackgroundColor = [0 1 0]; - end -end -EStudio_gui_erp_totl.pageinfo_minus.Enable = Enable_minus; -EStudio_gui_erp_totl.pageinfo_plus.Enable = Enable_plus; -EStudio_gui_erp_totl.pageinfo_plus.ForegroundColor = Enable_plus_BackgroundColor; -EStudio_gui_erp_totl.pageinfo_minus.ForegroundColor = Enable_minus_BackgroundColor; - -MessageViewer= char(strcat('Plot next page (>)')); -erpworkingmemory('f_ERP_proces_messg',MessageViewer); -observe_ERPDAT.Process_messg =1; -try - observe_ERPDAT.Count_currentERP = observe_ERPDAT.Count_currentERP+1; - observe_ERPDAT.Process_messg =2; -catch - observe_ERPDAT.Process_messg =3; -end -observe_ERPDAT.Two_GUI = observe_ERPDAT.Two_GUI+1; end \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/ERP Tab/f_redrawERP_mt_viewer.m b/studio_functions/Functions/EStudio/ERP Tab/f_redrawERP_mt_viewer.m deleted file mode 100755 index 39440c5e..00000000 --- a/studio_functions/Functions/EStudio/ERP Tab/f_redrawERP_mt_viewer.m +++ /dev/null @@ -1,1533 +0,0 @@ -%Author: Guanghui ZHANG--zhang.guanghui@foxmail.com -%Center for Mind and Brain -%University of California, Davis -%Davis, CA, USA -%Feb. 2022 - -% ERPLAB Studio - - - - - -function f_redrawERP_mt_viewer() -% Draw a demo ERP into the axes provided -% global EStudio_gui_erp_totl; -global observe_ERPDAT; -global EStudio_gui_erp_totl; -S_ws_geterpset= estudioworkingmemory('selectederpstudio'); -if isempty(S_ws_geterpset) - S_ws_geterpset = observe_ERPDAT.CURRENTERP; - - if isempty(S_ws_geterpset) - msgboxText = 'No ERPset was selected!!!'; - title = 'EStudio: ERPsets'; - errorfound(msgboxText, title); - return; - end - S_erpplot = f_ERPplot_Parameter(observe_ERPDAT.ALLERP,S_ws_geterpset); - estudioworkingmemory('geterpbinchan',S_erpplot.geterpbinchan); - estudioworkingmemory('geterpplot',S_erpplot.geterpplot); -end - -S_ws_getbinchan = estudioworkingmemory('geterpbinchan'); -Select_index = S_ws_getbinchan.Select_index; -S_ws_geterpplot = estudioworkingmemory('geterpplot'); - - -S_ws_geterpvalues = estudioworkingmemory('geterpvalues'); -try - - Viewer_Label = S_ws_geterpvalues.Viewer; -catch - mnamex = '"Viewer" was not selected for the measured ERPset.'; - question = [ '%s\n\n Please select "On" for "Viewer" on the "ERP Measurement Tool" panel .\n']; - title = 'ERPLAB Studio: ERP Measurement Tool'; - button = questdlg(sprintf(question, mnamex), title,'OK','OK'); - return; -end - -if isempty(Viewer_Label) || ~strcmp(Viewer_Label,'on') - mnamex = '"Off" was selected for "Viewer" on the "ERP Measurement Tool" panel.'; - question = [ '%s\n\n Please check "S" on Workspace of Matlab.\n']; - title = 'ERPLAB Studio: ERP Measurement Tool'; - button = questdlg(sprintf(question, mnamex), title,'OK','OK'); - return; -end - - -try - moption = S_ws_geterpvalues.Measure; -catch - mnamex = 'Measurement type was not selected on the "ERP Measurement Tool" panel.'; - question = [ '%s\n\n Please select anyone of measurement types from pop menu of "Measurement Type".\n']; - title = 'ERPLAB Studio: ERP Measurement Tool'; - button = questdlg(sprintf(question, mnamex), title,'OK','OK'); - return; -end - - -try - latency = S_ws_geterpvalues.latency; -catch - mnamex = 'Measurement window was not defined on the "ERP Measurement Tool" panel.'; - question = [ '%s\n\n Please set measurement window on "Measurement window".\n']; - title = 'ERPLAB Studio: ERP Measurement Tool'; - button = questdlg(sprintf(question, mnamex), title,'OK','OK'); - return; -end - -Times_erp_curr = observe_ERPDAT.ERP.times; - -if numel(latency) ==1 - if latency(1)< Times_erp_curr(1) - msgboxText = ['For latency range, lower time limit must be larger than',32,num2str(Times_erp_curr(1)),'.\n']; - title = 'EStudio: ERP measurement tool- Viewer "on". '; - errorfound(sprintf(msgboxText), title); - return - - elseif latency(1)> Times_erp_curr(end) - msgboxText = ['For latency range, upper time limit must be smaller than',32,num2str(Times_erp_curr(end)),'.\n']; - title = 'EStudio: ERP measurement tool- Viewer "on". '; - errorfound(sprintf(msgboxText), title); - return - end - - -else - - if latency(1) < Times_erp_curr(1) - msgboxText = ['For latency range, lower time limit must be larger than',32,num2str(Times_erp_curr(1)),'.\n']; - title = 'EStudio: ERP measurement tool- Viewer "on". '; - errorfound(sprintf(msgboxText), title); - return - - elseif latency(end) > Times_erp_curr(end) - msgboxText = ['For latency range, upper time limit must be smaller than',32,num2str(Times_erp_curr(end)),'.\n']; - title = 'EStudio: ERP measurement tool- Viewer "on". '; - errorfound(sprintf(msgboxText), title); - return - end -end - -%%Parameter from bin and channel panel -Elecs_shown = S_ws_getbinchan.elecs_shown{Select_index}; -Bins = S_ws_getbinchan.bins{Select_index}; -Bin_chans = S_ws_getbinchan.bins_chans(Select_index); -Elec_list = S_ws_getbinchan.elec_list{Select_index}; -Matlab_ver = S_ws_getbinchan.matlab_ver; - - - -%%Parameter from plotting panel -Min_vspacing = S_ws_geterpplot.min_vspacing(Select_index); -Min_time = S_ws_geterpplot.min(Select_index); -Max_time = S_ws_geterpplot.max(Select_index); -Yscale = S_ws_geterpplot.yscale(Select_index); -Timet_low =S_ws_geterpplot.timet_low(Select_index); -Timet_high =S_ws_geterpplot.timet_high(Select_index); -Timet_step=S_ws_geterpplot.timet_step(Select_index); -Fill = S_ws_geterpplot.fill(Select_index); -Plority_plot = S_ws_geterpplot.Positive_up(Select_index); - - -if Bin_chans == 0 - elec_n = S_ws_getbinchan.elec_n(Select_index); - max_elec_n = observe_ERPDAT.ALLERP(S_ws_geterpset(Select_index)).nchan; -else - elec_n = S_ws_getbinchan.bin_n(Select_index); - max_elec_n = observe_ERPDAT.ALLERP(S_ws_geterpset(Select_index)).nbin; -end - -% We first clear the existing axes ready to build a new one -if ishandle( EStudio_gui_erp_totl.ViewAxes ) - delete( EStudio_gui_erp_totl.ViewAxes ); -end - - -% Get chan labels -S_chan.chan_label = cell(1,max_elec_n); -S_chan.chan_label_place = zeros(1,max_elec_n); - - -if Bin_chans == 0 - for i = 1:elec_n - S_chan.chan_label{i} = observe_ERPDAT.ERP.chanlocs(Elecs_shown(i)).labels; - end -else - for i = 1:elec_n - S_chan.chan_label{i} = observe_ERPDAT.ERP.bindescr(Bins(i)); - end -end - - -%Sets the units of your root object (screen) to pixels -set(0,'units','pixels') -%Obtains this pixel information -Pix_SS = get(0,'screensize'); -%Sets the units of your root object (screen) to inches -set(0,'units','inches') -%Obtains this inch information -Inch_SS = get(0,'screensize'); -%Calculates the resolution (pixels per inch) -Res = Pix_SS./Inch_SS; - - -pb_height = Min_vspacing*Res(4); %px - - -% Plot data in the main viewer fig -splot_n = elec_n; -tsize = 13; - -%%Get the background color -try - [version reldate,ColorB_def,ColorF_def,errorColorF_def] = geterplabstudiodef;%%Get background color -catch - ColorB_def = [0. 95 0.95 0.95]; -end -if isempty(ColorB_def) - ColorB_def = [0. 95 0.95 0.95]; -end - -clear pb r_ax plotgrid -EStudio_gui_erp_totl.plotgrid = uiextras.VBox('Parent',EStudio_gui_erp_totl.ViewContainer,'Padding',0,'Spacing',0,'BackgroundColor',ColorB_def); - -pageinfo_box = uiextras.HBox( 'Parent', EStudio_gui_erp_totl.plotgrid,'BackgroundColor',ColorB_def); - -EStudio_gui_erp_totl.plot_wav_legend = uiextras.HBox( 'Parent', EStudio_gui_erp_totl.plotgrid,'BackgroundColor',[1 1 1]); -EStudio_gui_erp_totl.ViewAxes_legend = uix.ScrollingPanel( 'Parent', EStudio_gui_erp_totl.plot_wav_legend,'BackgroundColor',ColorB_def); -EStudio_gui_erp_totl.ViewAxes = uix.ScrollingPanel( 'Parent', EStudio_gui_erp_totl.plot_wav_legend,'BackgroundColor',[1 1 1]); -EStudio_gui_erp_totl.ERP_M_T_Viewer = uiextras.HBox( 'Parent', EStudio_gui_erp_totl.plotgrid,'BackgroundColor',ColorB_def); -%%-------------------Display the processing procedure----------------------- -%%Changed by Guanghui Zhang 2 August 2022-------panel for display the processing procedure for some functions, e.g., filtering -xaxis_panel = uiextras.HBox( 'Parent', EStudio_gui_erp_totl.plotgrid );%%%Message -EStudio_gui_erp_totl.Process_messg = uicontrol('Parent',xaxis_panel,'Style','text','String','','FontSize',20,'FontWeight','bold','BackgroundColor',ColorB_def); - - -%%Setting title -EStudio_gui_erp_totl.pageinfo_minus = uicontrol('Parent',pageinfo_box,'Style', 'pushbutton', 'String', '<','Callback',{@page_minus,EStudio_gui_erp_totl},'FontSize',30,'BackgroundColor',[1 1 1]); -if Select_index ==1 - EStudio_gui_erp_totl.pageinfo_minus.Enable = 'off'; -end - -EStudio_gui_erp_totl.pageinfo_edit = uicontrol('Parent',pageinfo_box,'Style', 'edit', 'String', num2str(S_ws_getbinchan.Select_index),'Callback',{@page_edit,EStudio_gui_erp_totl},'FontSize',20,'BackgroundColor',[1 1 1]); -if S_ws_getbinchan.Select_index ==1 - EStudio_gui_erp_totl.pageinfo_edit.Enable = 'on'; -end - - -EStudio_gui_erp_totl.pageinfo_plus = uicontrol('Parent',pageinfo_box,'Style', 'pushbutton', 'String', '>','Callback',{@page_plus,EStudio_gui_erp_totl},'FontSize',30,'BackgroundColor',[1 1 1]); -if S_ws_getbinchan.Select_index == numel(S_ws_geterpset) - EStudio_gui_erp_totl.pageinfo_plus.Enable = 'off'; -end - -pageinfo_str = ['Page',32,num2str(Select_index),'/',num2str(numel(S_ws_geterpset)),':',32,observe_ERPDAT.ERP.erpname]; -pageinfo_text = uicontrol('Parent',pageinfo_box,'Style','text','String',pageinfo_str,'FontSize',14,'FontWeight','bold'); - -if length(S_ws_geterpset) ==1 - Enable_minus = 'off'; - Enable_plus = 'off'; - Enable_plus_BackgroundColor = [1 1 1]; - Enable_minus_BackgroundColor = [0 0 0]; -else - - if Select_index ==1 - Enable_minus = 'off'; - Enable_plus = 'on'; - - Enable_plus_BackgroundColor = [0 1 0]; - Enable_minus_BackgroundColor = [0 0 0]; - elseif Select_index == length(S_ws_geterpset) - Enable_minus = 'on'; - Enable_plus = 'off'; - Enable_plus_BackgroundColor = [0 0 0]; - Enable_minus_BackgroundColor = [0 1 0]; - else - Enable_minus = 'on'; - Enable_plus = 'on'; - Enable_plus_BackgroundColor = [0 1 0]; - Enable_minus_BackgroundColor = [0 1 0]; - end -end -EStudio_gui_erp_totl.pageinfo_minus.Enable = Enable_minus; -EStudio_gui_erp_totl.pageinfo_plus.Enable = Enable_plus; -EStudio_gui_erp_totl.pageinfo_plus.ForegroundColor = Enable_plus_BackgroundColor; -EStudio_gui_erp_totl.pageinfo_minus.ForegroundColor = Enable_minus_BackgroundColor; - -set(pageinfo_box, 'Sizes', [50 50 50 -1] ); -set(pageinfo_box,'BackgroundColor',ColorB_def); -set(pageinfo_text,'BackgroundColor',ColorB_def); -%Setting title. END - -%for i=1:splot_n - -ndata = 0; -nplot = 0; -if Bin_chans == 0 - ndata = Bins; - nplot = Elecs_shown; -else - ndata = Elecs_shown; - nplot = Bins; -end - -%Both equation is incorrect. - -pnts = observe_ERPDAT.ERP.pnts; -timeor = observe_ERPDAT.ERP.times; % original time vector -p1 = timeor(1); -p2 = timeor(end); - -try - intfactor = S_ws_geterpvalues.InterpFactor; -catch - intfactor =1; -end - -if intfactor~=1 - timex = linspace(p1,p2,round(pnts*intfactor)); -else - timex = timeor; -end - - -[xxx, latsamp, latdiffms] = closest(timex, [Min_time Max_time]); -tmin = latsamp(1); -tmax = latsamp(2); - -if tmin < 1 - tmin = 1; -end - -if tmax > numel(timex) - tmax = numel(timex); -end - -try - blc = S_ws_geterpvalues.Baseline; -catch - blc = 'none'; -end - -if intfactor~=1 - Plot_erp_data_TRAN = []; - for Numoftwo = 1:size(observe_ERPDAT.ERP.bindata,3) - for Numofone = 1:size(observe_ERPDAT.ERP.bindata,1) - data = squeeze(observe_ERPDAT.ERP.bindata(Numofone,:,Numoftwo)); - data = spline(timeor, data, timex); % re-sampled data - blv = blvalue2(data, timex, blc); - data = data - blv; - Plot_erp_data_TRAN(Numofone,:,Numoftwo) = data; - end - end - Bindata = Plot_erp_data_TRAN; -else - Bindata = observe_ERPDAT.ERP.bindata; -end - -plot_erp_data = nan(tmax-tmin+1,numel(ndata)); -for i = 1:splot_n - if Bin_chans == 0 - for i_bin = 1:numel(ndata) - plot_erp_data(:,i_bin,i) = Bindata(Elecs_shown(i),tmin:tmax,Bins(i_bin))'*Plority_plot; % - end - else - for i_bin = 1:numel(ndata) - plot_erp_data(:,i_bin,i) = Bindata(Elecs_shown(i_bin),tmin:tmax,Bins(i))'*Plority_plot; % - end - end -end - -perc_lim = Yscale; -percentile = perc_lim*3/2; -%How to get x unique colors? -line_colors = erpworkingmemory('PWColor'); -if size(line_colors,1)~= numel(ndata) - if numel(ndata)> size(line_colors,1) - line_colors = get_colors(numel(ndata)); - else - line_colors = line_colors(1:numel(ndata),:,:); - end -end - -if isempty(line_colors) - line_colors = get_colors(numel(ndata)); -end - -line_colors = repmat(line_colors,[splot_n 1]); %repeat the colors once for every plot - -ind_plot_height = percentile*2; % Height of each individual subplot - -offset = []; -if Bin_chans == 0 - offset = (numel(Elecs_shown)-1:-1:0)*ind_plot_height; -else - offset = (numel(Bins)-1:-1:0)*ind_plot_height; -end -[~,~,Num_plot] = size(plot_erp_data); - -for i = 1:Num_plot - plot_erp_data(:,:,i) = plot_erp_data(:,:,i) + ones(size(plot_erp_data(:,:,i)))*offset(i); -end - -if ~strcmpi(observe_ERPDAT.ERP.erpname,'No ERPset loaded') - %pb_ax = uipanel('Parent',EStudio_gui_erp_totl.plotgrid); - r_ax = axes('Parent', EStudio_gui_erp_totl.ViewAxes,'Color',[1 1 1],'Box','on'); - hold(r_ax,'on'); - set(EStudio_gui_erp_totl.plot_wav_legend,'Sizes',[80 -10]); - r_ax_legend = axes('Parent', EStudio_gui_erp_totl.ViewAxes_legend,'Color','none','Box','off'); - hold(r_ax_legend,'on'); - - - set(r_ax,'XLim',[Min_time Max_time]); - ts = timex(tmin:tmax); - [a,Num_data,Num_plot] = size(plot_erp_data); - new_erp_data = zeros(a,Num_plot*Num_data); - for i = 1:Num_plot - new_erp_data(:,((Num_data*(i-1))+1):(Num_data*i)) = plot_erp_data(:,:,i); - end - - % plot_erp_data_fin = [repmat((1:numel(nplot)-1)*ind_plot_height,[numel(ts) 1]) new_erp_data]; - - % pb_here = plot(r_ax,ts,plot_erp_data_fin,'LineWidth',1); - pb_here = plot(r_ax,ts,new_erp_data,'LineWidth',1.5); - hold(r_ax,'on');%Same function as hold on; - r_ax.LineWidth=1.5; - yticks = -perc_lim:perc_lim:((2*percentile*Num_plot)-(2*perc_lim)); - - oldlim = [-percentile yticks(end)-perc_lim+percentile]; - top_vspace = max( max( new_erp_data ) )-oldlim(2); - bot_vspace = min( min( new_erp_data ) )-oldlim(1); - - newlim = oldlim + [bot_vspace top_vspace]; - ylabs = repmat([-perc_lim 0 perc_lim],[1,Num_plot]); - ylabs = [fliplr(-perc_lim:-perc_lim:newlim(1)) ylabs(2:end-1) (yticks(end):perc_lim:newlim(2))-yticks(end)+perc_lim]; - yticks = [fliplr(-perc_lim:-perc_lim:newlim(1)) yticks(2:end-1) yticks(end):perc_lim:newlim(2)]; - - %%%------------Setting xticklabels for each row of each wave-------------- - xstep_label = estudioworkingmemory('erp_xtickstep'); - if isempty(xstep_label) - xstep_label =0; - end - if ~xstep_label - [def xstep]= default_time_ticks_studio(observe_ERPDAT.ERP, [Timet_low,Timet_high]); - xticks = str2num(def{1,1}); - else - xticks = (Timet_low:Timet_step:Timet_high); - end - % estudioworkingmemory('erp_xtickstep',0); - x_axs = ones(size(new_erp_data,1),1); - xticks_label = []; - count = 0; - for jjj = 1:numel(xticks) - if xticks(jjj)< Min_time || xticks(jjj)> Max_time - count = count +1; - xticks_label(count) = jjj; - end - end - % if ~isempty(xticks_label) - % xticks(xticks_label) = []; - % end - for Numofxlabel = 1:numel(xticks) - xticks_labels{Numofxlabel} = num2str(xticks(Numofxlabel)); - end - - try - moption = S_ws_geterpvalues.Measure; - catch - moption = 'meanbl'; - end - - - for jj = 1:numel(offset) - plot(r_ax,ts,x_axs.*offset(end),'color',[1 1 1],'LineWidth',3); - set(r_ax,'XLim',[Timet_low,Timet_high]); - set(r_ax,'XTick',xticks, ... - 'box','off', 'Color','none','xticklabels',xticks_labels,'FontWeight','bold'); - myX_Crossing = offset(jj); - props = get(r_ax); - - tick_bottom = -props.TickLength(1)*diff(props.YLim); - if abs(tick_bottom) > abs(Yscale)/5 - try - tick_bottom = - abs(Yscale)/5; - catch - tick_bottom = tick_bottom; - end - end - tick_top = 0; - - line(r_ax,props.XLim, [0 0] + myX_Crossing, 'color', 'k','LineWidth',1.5); - - if ~isempty(props.XTick) - xtick_x = repmat(props.XTick, 2, 1); - xtick_y = repmat([tick_bottom; tick_top] + myX_Crossing, 1, length(props.XTick)); - h_ticks = line(r_ax,xtick_x, xtick_y, 'color', 'k','LineWidth',1.5); - end - set(r_ax, 'XTick', [], 'XTickLabel', []); - % tick_bottom = -props.TickLength(1)*diff(props.YLim); - nTicks = length(props.XTick); - h_ticklabels = zeros(size(props.XTick)); - if nTicks>1 - if numel(offset)==jj - kkkk = 1; - else - if abs(Timet_low - xticks(1)) > 1000/observe_ERPDAT.ERP.srate - kkkk = 1; - else - kkkk = 2; - end - end - for iCount = kkkk:nTicks - xtick_label = (props.XTickLabel(iCount, :)); - text(r_ax,props.XTick(iCount), tick_bottom + myX_Crossing, ... - xtick_label, ... - 'HorizontalAlignment', 'Center', ... - 'VerticalAlignment', 'Top', ... - 'FontSize', 12, ... - 'FontName', props.FontName, ... - 'FontAngle', props.FontAngle, ... - 'FontUnits', props.FontUnits, ... - 'FontWeight', 'bold'); - end - end - end - % end - - %%%Mark the area/latency/amplitude of interest within the defined window. - ERP_mark_area_latency(r_ax,timex(tmin:tmax),moption,plot_erp_data,latency,line_colors,offset,Plority_plot);%cwm = [0 0 0];% white: Background color for measurement window - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - % set(r_ax,'XLim',[Timet_low,Timet_high]); - - %%%%%%%%----------------------------- - - [xxx, latsamp,cdiff] = closest(timex, 0); - if cdiff<1000/observe_ERPDAT.ERP.srate - xline(r_ax,timex(latsamp),'k-.','LineWidth',1);%%Marking start time point for each column - end - - if top_vspace < 0 - top_vspace = 0; - end - - if bot_vspace > 0 - bot_vspace = 0; - end - set(r_ax,'XLim',[Timet_low,Timet_high],'Ylim',newlim); - - for i = 1:numel(pb_here) - pb_here(i).Color = line_colors(i,:); - end - - - Ylabels_new = ylabs.*Plority_plot; - [~,Y_label] = find(Ylabels_new == -0); - Ylabels_new(Y_label) = 0; - - - if numel(offset)>1 - count = 0; - for i = 0:numel(offset)-1 - leg_str = ''; - - count = count+1; - try - if Bin_chans == 0 - leg_str = sprintf('%s',strrep(Elec_list{Elecs_shown(count)},'_','\_')); - else - leg_str = sprintf('%s',strrep(observe_ERPDAT.ERP.bindescr{Bins(count)},'_','\_')); - end - catch - leg_str = ''; - end - text(r_ax,Timet_low,offset(i+1)+offset(end-1)/6,leg_str,'FontWeight','bold','FontSize', 14); - - end - end - - try - if Bin_chans == 0 - leg_str = sprintf('%s',strrep(Elec_list{Elecs_shown(end)},'_','\_')); - else - leg_str = sprintf('%s',strrep(observe_ERPDAT.ERP.bindescr{Bins(end)},'_','\_')); - end - catch%% - leg_str = ''; - end - - try - text(r_ax,Timet_low,offset(end-1)/6,leg_str,'FontWeight','bold','FontSize', 14); - catch - text(r_ax,Timet_low,Yscale/2,leg_str,'FontWeight','bold','FontSize', 14); - end - - - % xticks = (Min_time:Timet_step:Max_time); - % some options currently only work post Matlab R2016a - if Matlab_ver >= 2016 - set(r_ax,'FontSize',tsize,'FontWeight','bold','XAxisLocation','origin',... - 'XGrid','on','YGrid','on','YTick',yticks,'YTickLabel',Ylabels_new, ... - 'YLim',newlim,'XTick',xticks, ... - 'box','off', 'Color','none','XLim',[Timet_low Timet_high]); - else - set(r_ax,'FontSize',tsize,'FontWeight','bold','XAxisLocation','bottom',... - 'XGrid','on','YGrid','on','YTick',yticks,'YTickLabel',Ylabels_new, ... - 'YLim',newlim, 'XTick',xticks,... - 'box','off', 'Color','none','XLim',[Timet_low Timet_high]); - hline(0,'k'); % backup xaxis - end - hold(r_ax,'off'); - % if numel(offset)>1 - set(r_ax, 'XTick', [], 'XTickLabel', []); - % end - %%%%%%%%%%%% - % r_ax.Position(1) =r_ax.Position(1)+0.5; - line_colors_ldg = erpworkingmemory('PWColor'); - if isempty(line_colors_ldg) - line_colors_ldg = get_colors(numel(ndata)); - end - if size(line_colors_ldg,1)~= numel(ndata) - if numel(ndata)> size(line_colors_ldg,1) - line_colors_ldg = get_colors(numel(ndata)); - else - line_colors_ldg = line_colors_ldg(1:numel(ndata),:,:); - end - end - - - for Numofplot = 1:size(plot_erp_data,2) - plot(r_ax_legend,[0 0],'Color',line_colors_ldg(Numofplot,:,:),'LineWidth',3) - end - - if Bin_chans == 0 - Leg_Name = ''; - for Numofbin = 1:numel(Bins) - Leg_Name{Numofbin} = strcat('Bin',num2str(Bins(Numofbin))); - end - - else - for Numofchan = 1:numel(Elecs_shown) - Leg_Name{Numofchan} = strrep(Elec_list{Elecs_shown(Numofchan)},'_','\_'); - end - end - here_lgd = legend(r_ax_legend,Leg_Name,'FontSize',14,'TextColor','blue'); - legend(r_ax_legend,'boxoff'); - - - - %end - EStudio_gui_erp_totl.plotgrid.Heights(1) = 30; % set the first element (pageinfo) to 30px high - EStudio_gui_erp_totl.plotgrid.Heights(3) = 30; % set the second element (x axis) to 30px high - EStudio_gui_erp_totl.plotgrid.Heights(4) = 30; % set the second element (x axis) to 30px high - EStudio_gui_erp_totl.plotgrid.Units = 'pixels'; - if splot_n*pb_height<(EStudio_gui_erp_totl.plotgrid.Position(4)-EStudio_gui_erp_totl.plotgrid.Heights(1))&&Fill - pb_height = (EStudio_gui_erp_totl.plotgrid.Position(4)-EStudio_gui_erp_totl.plotgrid.Heights(1)-EStudio_gui_erp_totl.plotgrid.Heights(2))/splot_n; - end - - EStudio_gui_erp_totl.ViewAxes.Heights = splot_n*pb_height; - % EStudio_gui_erp_totl.ViewAxes.Widths = -10; - EStudio_gui_erp_totl.plotgrid.Units = 'normalized'; - EStudio_gui_erp_totl.plotgrid.Heights =[30 -1 80 30]; - %%%-------------------Display results obtained from "Measurement Tool" Panel--------------------------------- - [~,~,~,Amp,Lat]= f_ERP_plot_wav(observe_ERPDAT.ERP); - try - Resolution =S_ws_geterpvalues.Resolution; - catch - Resolution =3; - end - try - moption =S_ws_geterpvalues.Measure; - catch - beep; - disp('Please select one of Measurement type'); - return; - end - - %%Get name for the selected rows (i.e.,bins) and columns (i.e., channels) - RowName = {}; - for Numofbin = 1:numel(Bins) - RowName{Numofbin} = strcat('Bin',num2str(Bins(Numofbin)));%'',':',32,observe_ERPDAT.ERP.bindescr{Bins(Numofbin)} - end - ColumnName = {}; - for Numofsel_chan = 1:numel(Elecs_shown) - ColumnName{Numofsel_chan} = ['',num2str(Elecs_shown(Numofsel_chan)),'.',32,Elec_list{Elecs_shown(Numofsel_chan)}]; - end - - % txt_title = uicontrol('Parent',EStudio_gui_erp_totl.ERP_M_T_Viewer,'Style', 'text', 'String', 'My Example Title'); - try - if ismember_bc2(moption, {'instabl','peaklatbl','fpeaklat','fareatlat','fninteglat','fareaplat','fareanlat','meanbl','peakampbl','areat','ninteg','areap','arean','ninteg','areazt','nintegz','areazp','areazn'}) - Data_display = Amp(Bins,Elecs_shown); - else - Data_display = Lat(Bins,Elecs_shown); - end - - if ismember_bc2(moption,{'arean','areazn'}) - Data_display= -1.*Data_display; - end - - Data_display_tra = {}; - for Numofone = 1:size(Data_display,1) - for Numoftwo = 1:size(Data_display,2) - if ~isnan(Data_display(Numofone,Numoftwo)) - if Bin_chans == 0 - Data_display_tra{Numofone,Numoftwo} = sprintf(['%.',num2str(Resolution),'f'], Data_display(Numofone,Numoftwo)); - else - Data_display_tra{Numoftwo,Numofone} = sprintf(['%.',num2str(Resolution),'f'], Data_display(Numofone,Numoftwo)); - end - - else - if Bin_chans == 0 - Data_display_tra{Numofone,Numoftwo} = ['NaN']; - else - Data_display_tra{Numoftwo,Numofone} = ['NaN']; - end - end - end - end - - EStudio_gui_erp_totl.ERP_M_T_Viewer_table = uitable(EStudio_gui_erp_totl.ERP_M_T_Viewer,'Data',Data_display_tra,'Units','Normalize'); - if Bin_chans == 0 - EStudio_gui_erp_totl.ERP_M_T_Viewer_table.RowName = RowName; - EStudio_gui_erp_totl.ERP_M_T_Viewer_table.ColumnName = ColumnName; - else - EStudio_gui_erp_totl.ERP_M_T_Viewer_table.RowName = ColumnName; - EStudio_gui_erp_totl.ERP_M_T_Viewer_table.ColumnName = RowName; - end - EStudio_gui_erp_totl.ERP_M_T_Viewer_table.BackgroundColor = line_colors_ldg; - - - if size(Data_display_tra,2)<12 - ColumnWidth = {}; - for Numofchan =1:size(Data_display_tra,2) - ColumnWidth{Numofchan} = EStudio_gui_erp_totl.ERP_M_T_Viewer.Position(3)/size(Data_display_tra,2); - end - EStudio_gui_erp_totl.ERP_M_T_Viewer_table.ColumnWidth = ColumnWidth; - elseif size(Data_display_tra,2) ==1 - EStudio_gui_erp_totl.ERP_M_T_Viewer_table.ColumnWidth = {EStudio_gui_erp_totl.ERP_M_T_Viewer.Position(3)}; - end - - catch - for Numofbin = 1:observe_ERPDAT.ERP.nbin - Data_display{Numofbin,1} = ''; - end - - RowName = {}; - for Numofbin = 1:observe_ERPDAT.ERP.nbin - RowName{Numofbin} = strcat('Bin',num2str((Numofbin))); - end - EStudio_gui_erp_totl.ERP_M_T_Viewer_table = uitable(EStudio_gui_erp_totl.ERP_M_T_Viewer,'Data',Data_display); - EStudio_gui_erp_totl.ERP_M_T_Viewer_table.RowName = RowName; - EStudio_gui_erp_totl.ERP_M_T_Viewer_table.ColumnName = {'No data are avalible'}; - EStudio_gui_erp_totl.ERP_M_T_Viewer_table.ColumnWidth = {EStudio_gui_erp_totl.ERP_M_T_Viewer.Position(3)}; - EStudio_gui_erp_totl.ERP_M_T_Viewer_table.BackgroundColor = line_colors_ldg; - EStudio_gui_erp_totl.ERP_M_T_Viewer_table.ForegroundColor = [1 1 1]; - end - - EStudio_gui_erp_totl.ERP_M_T_Viewer_table.FontSize = 12; -else - set(EStudio_gui_erp_totl.plot_wav_legend,'Sizes',[80 -10]); - EStudio_gui_erp_totl.plotgrid.Heights(1) = 30; % set the first element (pageinfo) to 30px high - EStudio_gui_erp_totl.plotgrid.Heights(3) = 30; % set the second element (x axis) to 30px high - EStudio_gui_erp_totl.plotgrid.Heights(4) = 30; - -end -end % redrawDemo - - -function colors = get_colors(ncolors) -% Each color gets 1 point divided into up to 2 of 3 groups (RGB). -degree_step = 6/ncolors; -angles = (0:ncolors-1)*degree_step; -colors = nan(numel(angles),3); -for i = 1:numel(angles) - if angles(i) < 1 - colors(i,:) = [1 (angles(i)-floor(angles(i))) 0]*0.75; - elseif angles(i) < 2 - colors(i,:) = [(1-(angles(i)-floor(angles(i)))) 1 0]*0.75; - elseif angles(i) < 3 - colors(i,:) = [0 1 (angles(i)-floor(angles(i)))]*0.75; - elseif angles(i) < 4 - colors(i,:) = [0 (1-(angles(i)-floor(angles(i)))) 1]*0.75; - elseif angles(i) < 5 - colors(i,:) = [(angles(i)-floor(angles(i))) 0 1]*0.75; - else - colors(i,:) = [1 0 (1-(angles(i)-floor(angles(i))))]*0.75; - end -end -end - - -%------------------Display the waveform for proir ERPset-------------------- -function page_minus(~,~,EStudio_gui_erp_totl) -global observe_ERPDAT; -S_ws_geterpset= estudioworkingmemory('selectederpstudio'); -if isempty(S_ws_geterpset) - S_ws_geterpset = observe_ERPDAT.CURRENTERP; - - if isempty(S_ws_geterpset) - msgboxText = 'No ERPset was selected!!!'; - title = 'EStudio: ERPsets'; - errorfound(msgboxText, title); - return; - end - S_erpplot = f_ERPplot_Parameter(observe_ERPDAT.ALLERP,S_ws_geterpset); - estudioworkingmemory('geterpbinchan',S_erpplot.geterpbinchan); - estudioworkingmemory('geterpplot',S_erpplot.geterpplot); -end -S_ws_getbinchan = estudioworkingmemory('geterpbinchan'); -S_ws_getbinchan.Select_index = S_ws_getbinchan.Select_index-1; -Current_erp_Index = S_ws_geterpset(S_ws_getbinchan.Select_index); -if Current_erp_Index > length(observe_ERPDAT.ALLERP) - beep; - disp('Waiting for modifing'); - return; -end -observe_ERPDAT.CURRENTERP = Current_erp_Index; -observe_ERPDAT.ERP = observe_ERPDAT.ALLERP(Current_erp_Index); -estudioworkingmemory('geterpbinchan',S_ws_getbinchan); -if length(S_ws_geterpset) ==1 - Enable_minus = 'off'; - Enable_plus = 'off'; - Enable_plus_BackgroundColor = [0 0 0]; - Enable_minus_BackgroundColor = [0 0 0]; -else - - if S_ws_getbinchan.Select_index ==1 - Enable_minus = 'off'; - Enable_plus = 'on'; - - Enable_plus_BackgroundColor = [0 1 0]; - Enable_minus_BackgroundColor = [0 0 0]; - elseif S_ws_getbinchan.Select_index == length(S_ws_geterpset) - Enable_minus = 'on'; - Enable_plus = 'off'; - Enable_plus_BackgroundColor = [0 0 0]; - Enable_minus_BackgroundColor = [0 1 0]; - else - Enable_minus = 'on'; - Enable_plus = 'on'; - Enable_plus_BackgroundColor = [0 1 0]; - Enable_minus_BackgroundColor = [0 1 0]; - end -end -EStudio_gui_erp_totl.pageinfo_minus.Enable = Enable_minus; -EStudio_gui_erp_totl.pageinfo_plus.Enable = Enable_plus; -f_redrawERP_mt_viewer(); -EStudio_gui_erp_totl.pageinfo_plus.ForegroundColor = Enable_plus_BackgroundColor; -EStudio_gui_erp_totl.pageinfo_minus.ForegroundColor = Enable_minus_BackgroundColor; - -MessageViewer= char(strcat('Plot prior page (<)')); -erpworkingmemory('f_ERP_proces_messg',MessageViewer); -observe_ERPDAT.Process_messg =1; -try - observe_ERPDAT.Count_currentERP = observe_ERPDAT.Count_currentERP+1; - observe_ERPDAT.Process_messg =2; -catch - observe_ERPDAT.Process_messg =3; -end -observe_ERPDAT.Two_GUI = observe_ERPDAT.Two_GUI+1; -end - - - -%%Edit the index of ERPsets -function page_edit(Str,~,EStudio_gui_erp_totl) -CurrentERPindex = str2num(Str.String); -global observe_ERPDAT; -S_ws_geterpset= estudioworkingmemory('selectederpstudio'); -if isempty(S_ws_geterpset) - S_ws_geterpset = observe_ERPDAT.CURRENTERP; - if isempty(S_ws_geterpset) - msgboxText = 'No ERPset was selected!!!'; - title = 'EStudio: ERPsets'; - errorfound(msgboxText, title); - return; - end - S_erpplot = f_ERPplot_Parameter(observe_ERPDAT.ALLERP,S_ws_geterpset); - estudioworkingmemory('geterpbinchan',S_erpplot.geterpbinchan); - estudioworkingmemory('geterpplot',S_erpplot.geterpplot); -end -S_ws_getbinchan = estudioworkingmemory('geterpbinchan'); -if ~isempty(CurrentERPindex) && numel(CurrentERPindex)==1 && (CurrentERPindex<= numel(S_ws_geterpset)) - S_ws_getbinchan.Select_index = CurrentERPindex; - Current_erp_Index = S_ws_geterpset(S_ws_getbinchan.Select_index); - % EStudio_gui_erp_totl.pageinfo_edit.String = num2str(S_ws_getbinchan.Select_index); - if Current_erp_Index > length(observe_ERPDAT.ALLERP) - beep; - disp('Waiting for modifing'); - return; - end - observe_ERPDAT.CURRENTERP = Current_erp_Index; - observe_ERPDAT.ERP = observe_ERPDAT.ALLERP(Current_erp_Index); - estudioworkingmemory('geterpbinchan',S_ws_getbinchan); - if length(S_ws_geterpset) ==1 - Enable_minus = 'off'; - Enable_plus = 'off'; - Enable_plus_BackgroundColor = [0 0 0]; - Enable_minus_BackgroundColor = [0 0 0]; - else - if CurrentERPindex ==1 - Enable_minus = 'off'; - Enable_plus = 'on'; - Enable_plus_BackgroundColor = [0 1 0]; - Enable_minus_BackgroundColor = [1 1 1]; - elseif CurrentERPindex == length(S_ws_geterpset) - Enable_minus = 'on'; - Enable_plus = 'off'; - Enable_plus_BackgroundColor = [0 0 0]; - Enable_minus_BackgroundColor = [0 1 0]; - else - Enable_minus = 'on'; - Enable_plus = 'on'; - Enable_plus_BackgroundColor = [0 1 0]; - Enable_minus_BackgroundColor = [0 1 0]; - end - end - EStudio_gui_erp_totl.pageinfo_minus.Enable = Enable_minus; - EStudio_gui_erp_totl.pageinfo_plus.Enable = Enable_plus; - EStudio_gui_erp_totl.pageinfo_plus.ForegroundColor = Enable_plus_BackgroundColor; - EStudio_gui_erp_totl.pageinfo_minus.ForegroundColor = Enable_minus_BackgroundColor; - - MessageViewer= char(strcat('Page Editor')); - erpworkingmemory('f_ERP_proces_messg',MessageViewer); - observe_ERPDAT.Process_messg =1; - try - observe_ERPDAT.Count_currentERP = observe_ERPDAT.Count_currentERP+1; - observe_ERPDAT.Process_messg =2; - catch - observe_ERPDAT.Process_messg =3; - end -end -observe_ERPDAT.Two_GUI = observe_ERPDAT.Two_GUI+1; -end - - -%------------------Display the waveform for next ERPset-------------------- -function page_plus(~,~,EStudio_gui_erp_totl) -global observe_ERPDAT; -S_ws_geterpset= estudioworkingmemory('selectederpstudio'); -if isempty(S_ws_geterpset) - S_ws_geterpset = observe_ERPDAT.CURRENTERP; - if isempty(S_ws_geterpset) - msgboxText = 'No ERPset was selected!!!'; - title = 'EStudio: ERPsets'; - errorfound(msgboxText, title); - return; - end - S_erpplot = f_ERPplot_Parameter(observe_ERPDAT.ALLERP,S_ws_geterpset); - estudioworkingmemory('geterpbinchan',S_erpplot.geterpbinchan); - estudioworkingmemory('geterpplot',S_erpplot.geterpplot); -end -S_ws_getbinchan = estudioworkingmemory('geterpbinchan'); -S_ws_getbinchan.Select_index = S_ws_getbinchan.Select_index+1; -Current_erp_Index = S_ws_geterpset(S_ws_getbinchan.Select_index); -if Current_erp_Index > length(observe_ERPDAT.ALLERP) - beep; - disp('Waiting for modifing'); - return; -end -observe_ERPDAT.CURRENTERP = Current_erp_Index; -observe_ERPDAT.ERP = observe_ERPDAT.ALLERP(Current_erp_Index); -estudioworkingmemory('geterpbinchan',S_ws_getbinchan); -if length(S_ws_geterpset) ==1 - Enable_minus = 'off'; - Enable_plus = 'off'; - Enable_plus_BackgroundColor = [0 0 0]; - Enable_minus_BackgroundColor = [0 0 0]; -else - - if S_ws_getbinchan.Select_index ==1 - Enable_minus = 'off'; - Enable_plus = 'on'; - Enable_plus_BackgroundColor = [0 1 0]; - Enable_minus_BackgroundColor = [1 1 1]; - elseif S_ws_getbinchan.Select_index == length(S_ws_geterpset) - Enable_minus = 'on'; - Enable_plus = 'off'; - Enable_plus_BackgroundColor = [0 0 0]; - Enable_minus_BackgroundColor = [0 1 0]; - - - else - Enable_minus = 'on'; - Enable_plus = 'on'; - Enable_plus_BackgroundColor = [0 1 0]; - Enable_minus_BackgroundColor = [0 1 0]; - end -end -EStudio_gui_erp_totl.pageinfo_minus.Enable = Enable_minus; -EStudio_gui_erp_totl.pageinfo_plus.Enable = Enable_plus; -EStudio_gui_erp_totl.pageinfo_plus.ForegroundColor = Enable_plus_BackgroundColor; -EStudio_gui_erp_totl.pageinfo_minus.ForegroundColor = Enable_minus_BackgroundColor; - -MessageViewer= char(strcat('Plot next page (>)')); -erpworkingmemory('f_ERP_proces_messg',MessageViewer); -observe_ERPDAT.Process_messg =1; -try - observe_ERPDAT.Count_currentERP = observe_ERPDAT.Count_currentERP+1; - observe_ERPDAT.Process_messg =2; -catch - observe_ERPDAT.Process_messg =3; -end -observe_ERPDAT.Two_GUI = observe_ERPDAT.Two_GUI+1; -end - - -%%Mark the area or latency/amplitude of interest within defined latecies%%% -function ERP_mark_area_latency(r_ax,timex,moption,plot_erp_data,latency,line_colors,offset,Plority_plot) -try - cwm_backgb = erpworkingmemory('MWColor'); -catch - cwm_backgb=[0.7 0.7 0.7]; -end -if isempty(cwm_backgb) - cwm_backgb=[0.7 0.7 0.7]; -end - -try - cwm = erpworkingmemory('MTLineColor'); -catch - cwm =[0 0 0]; -end -if isempty(cwm) - cwm=[0 0 0]; -end - -global observe_ERPDAT; - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Plot area within the defined time-window%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%Set area within the defined time-window for 1.Fractional area latency, 2. Numerical integration/Area between two fixed latencies -mearea = { 'areat', 'areap', 'arean','areazt','areazp','areazn', 'ninteg','nintegz'}; - -[~,Num_data,Num_plot] = size(plot_erp_data); - -if ismember_bc2(moption, mearea) || ismember_bc2(moption, {'fareatlat', 'fareaplat','fninteglat','fareanlat'}) - if numel(latency) ==2 - latx = latency; - [xxx, latsamp] = closest(timex, latx); - datax = plot_erp_data(latsamp(1):latsamp(2),:,:); - end - Time_res = timex(2)-timex(1); - - if ismember_bc2(moption, {'areap', 'fareaplat'}) % positive area - - for Numofstione = 1:size(datax,3) - for Numofstitwo = 1:size(datax,2) - timexx = timex(latsamp(1):latsamp(2)); - dataxx = squeeze(datax(:,Numofstitwo,Numofstione)); - data_check = dataxx-offset(Numofstione); - if Plority_plot==1 - dataxx(data_check<0) = []; - timexx(data_check<0) = []; - elseif Plority_plot ==-1 - dataxx(data_check>0) = []; - timexx(data_check>0) = []; - else - dataxx(data_check<0) = []; - timexx(data_check<0) = []; - end - - if ~isempty(dataxx) && numel(dataxx)>=2 - %%Check isolated point - Check_outlier =[]; - count = 0; - - if (timexx(2)-timexx(1)>Time_res) - count= count +1; - Check_outlier(count) = 1; - end - if numel(dataxx)>=3 - for Numofsample = 2:length(timexx)-1 - if (timexx(Numofsample+1)-timexx(Numofsample)>Time_res) && (timexx(Numofsample)-timexx(Numofsample-1)< Time_res) - count = count+1; - Check_outlier(count) = Numofsample; - end - end - end - dataxx(Check_outlier) = []; - timexx(Check_outlier) = []; - - Check_isolated =[]; - count = 0; - for Numofsample = 1:length(timexx)-1 - if timexx(Numofsample+1)-timexx(Numofsample)>Time_res - count = count+1; - Check_isolated(count) = Numofsample; - end - end - if numel(Check_isolated) ==1 - inBetweenRegionX1 = [timexx(1:Check_isolated(1)),fliplr(timexx(1:Check_isolated(1)))]; - inBetweenRegionY1 = [squeeze(dataxx(1:Check_isolated(1)))',fliplr(offset(Numofstione)*ones(1,numel(timexx(1:Check_isolated(1)))))]; - fill(r_ax,inBetweenRegionX1, inBetweenRegionY1,line_colors(Numofstitwo,:,:),'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - - inBetweenRegionX2 = [timexx(Check_isolated(1)+1:end),fliplr(timexx(Check_isolated(1)+1:end))]; - inBetweenRegionY2 = [squeeze(dataxx(Check_isolated(1)+1:end))',fliplr(offset(Numofstione)*ones(1,numel(timexx(Check_isolated(1)+1:end))))]; - fill(r_ax,inBetweenRegionX2, inBetweenRegionY2,line_colors(Numofstitwo,:,:),'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - elseif numel(Check_isolated) >1 - for Numofrange = 1:numel(Check_isolated)-1 - - inBetweenRegionX = [timexx(Check_isolated(Numofrange)+1:Check_isolated(Numofrange+1)),fliplr(timexx(Check_isolated(Numofrange)+1:Check_isolated(Numofrange+1)))]; - inBetweenRegionY = [squeeze(dataxx(Check_isolated(Numofrange)+1:Check_isolated(Numofrange+1)))',fliplr(offset(Numofstione)*ones(1,numel(timexx(Check_isolated(Numofrange)+1:Check_isolated(Numofrange+1)))))]; - fill(r_ax,inBetweenRegionX, inBetweenRegionY,line_colors(Numofstitwo,:,:),'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - - end - inBetweenRegionX1 = [timexx(1:Check_isolated(1)),fliplr(timexx(1:Check_isolated(1)))]; - inBetweenRegionY1 = [squeeze(dataxx(1:Check_isolated(1)))',fliplr(offset(Numofstione)*ones(1,numel(timexx(1:Check_isolated(1)))))]; - fill(r_ax,inBetweenRegionX1, inBetweenRegionY1,line_colors(Numofstitwo,:,:),'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - - inBetweenRegionX2 = [timexx(Check_isolated(Numofrange+1)+1:end),fliplr(timexx(Check_isolated(Numofrange+1)+1:end))]; - inBetweenRegionY2 = [squeeze(dataxx(Check_isolated(Numofrange+1)+1:end))',fliplr(offset(Numofstione)*ones(1,numel(timexx(Check_isolated(Numofrange+1)+1:end))))]; - fill(r_ax,inBetweenRegionX2, inBetweenRegionY2,line_colors(Numofstitwo,:,:),'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - - else - inBetweenRegionX = [timexx,fliplr(timexx)]; - inBetweenRegionY = [squeeze(dataxx)',fliplr(offset(Numofstione)*ones(1,numel(timexx)))]; - fill(r_ax,inBetweenRegionX, inBetweenRegionY,line_colors(Numofstitwo,:,:),'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - end - end - - end - - end - elseif ismember_bc2(moption, {'arean', 'fareanlat'}) % negative area - for Numofstione = 1:size(datax,3) - for Numofstitwo = 1:size(datax,2) - timexx = timex(latsamp(1):latsamp(2)); - dataxx = squeeze(datax(:,Numofstitwo,Numofstione)); - data_check = dataxx-offset(Numofstione); - if Plority_plot==1 - dataxx(data_check>0) = []; - timexx(data_check>0) = []; - elseif Plority_plot ==-1 - dataxx(data_check<0) = []; - timexx(data_check<0) = []; - else - dataxx(data_check>0) = []; - timexx(data_check>0) = []; - end - - %%Check isolated point - if ~isempty(dataxx) && numel(dataxx)>=2 - Check_outlier =[]; - count = 0; - - if (timexx(2)-timexx(1)>Time_res) - count= count +1; - Check_outlier(count) = 1; - end - if numel(dataxx)>=3 - for Numofsample = 2:length(timexx)-1 - if (timexx(Numofsample+1)-timexx(Numofsample)>Time_res) && (timexx(Numofsample)-timexx(Numofsample-1)< Time_res) - count = count+1; - Check_outlier(count) = Numofsample; - end - end - end - dataxx(Check_outlier) = []; - timexx(Check_outlier) = []; - - Check_isolated =[]; - count = 0; - for Numofsample = 1:length(timexx)-1 - if timexx(Numofsample+1)-timexx(Numofsample)>Time_res - count = count+1; - Check_isolated(count) = Numofsample; - end - end - if numel(Check_isolated) ==1 - inBetweenRegionX1 = [timexx(1:Check_isolated(1)),fliplr(timexx(1:Check_isolated(1)))]; - inBetweenRegionY1 = [squeeze(dataxx(1:Check_isolated(1)))',fliplr(offset(Numofstione)*ones(1,numel(timexx(1:Check_isolated(1)))))]; - fill(r_ax,inBetweenRegionX1, inBetweenRegionY1,line_colors(Numofstitwo,:,:),'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - - inBetweenRegionX2 = [timexx(Check_isolated(1)+1:end),fliplr(timexx(Check_isolated(1)+1:end))]; - inBetweenRegionY2 = [squeeze(dataxx(Check_isolated(1)+1:end))',fliplr(offset(Numofstione)*ones(1,numel(timexx(Check_isolated(1)+1:end))))]; - fill(r_ax,inBetweenRegionX2, inBetweenRegionY2,line_colors(Numofstitwo,:,:),'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - elseif numel(Check_isolated) >1 - for Numofrange = 1:numel(Check_isolated)-1 - - inBetweenRegionX = [timexx(Check_isolated(Numofrange)+1:Check_isolated(Numofrange+1)),fliplr(timexx(Check_isolated(Numofrange)+1:Check_isolated(Numofrange+1)))]; - inBetweenRegionY = [squeeze(dataxx(Check_isolated(Numofrange)+1:Check_isolated(Numofrange+1)))',fliplr(offset(Numofstione)*ones(1,numel(timexx(Check_isolated(Numofrange)+1:Check_isolated(Numofrange+1)))))]; - fill(r_ax,inBetweenRegionX, inBetweenRegionY,line_colors(Numofstitwo,:,:),'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - - end - inBetweenRegionX1 = [timexx(1:Check_isolated(1)),fliplr(timexx(1:Check_isolated(1)))]; - inBetweenRegionY1 = [squeeze(dataxx(1:Check_isolated(1)))',fliplr(offset(Numofstione)*ones(1,numel(timexx(1:Check_isolated(1)))))]; - fill(r_ax,inBetweenRegionX1, inBetweenRegionY1,line_colors(Numofstitwo,:,:),'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - - inBetweenRegionX2 = [timexx(Check_isolated(Numofrange+1)+1:end),fliplr(timexx(Check_isolated(Numofrange+1)+1:end))]; - inBetweenRegionY2 = [squeeze(dataxx(Check_isolated(Numofrange+1)+1:end))',fliplr(offset(Numofstione)*ones(1,numel(timexx(Check_isolated(Numofrange+1)+1:end))))]; - fill(r_ax,inBetweenRegionX2, inBetweenRegionY2,line_colors(Numofstitwo,:,:),'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - - else - inBetweenRegionX = [timexx,fliplr(timexx)]; - inBetweenRegionY = [squeeze(dataxx)',fliplr(offset(Numofstione)*ones(1,numel(timexx)))]; - fill(r_ax,inBetweenRegionX, inBetweenRegionY,line_colors(Numofstitwo,:,:),'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - end - end - end - end - - - elseif ismember_bc2(moption, {'ninteg', 'fninteglat'}) % integration(area for negative substracted from area for positive) - for Numofstione = 1:size(datax,3) - for Numofstitwo = 1:size(datax,2) - timexxp = timex(latsamp(1):latsamp(2)); - dataxxp = squeeze(datax(:,Numofstitwo,Numofstione)); - timexxn = timex(latsamp(1):latsamp(2)); - dataxxn = squeeze(datax(:,Numofstitwo,Numofstione)); - data_check = dataxxn-offset(Numofstione); - if Plority_plot==1 - dataxxp(data_check<0) = []; - timexxp(data_check<0) = []; - dataxxn(data_check>0) = []; - timexxn(data_check>0) = []; - - elseif Plority_plot ==-1 - dataxxp(data_check>0) = []; - timexxp(data_check>0) = []; - dataxxn(data_check<0) = []; - timexxn(data_check<0) = []; - else - dataxxp(data_check<0) = []; - timexxp(data_check<0) = []; - dataxxn(data_check>0) = []; - timexxn(data_check>0) = []; - end - - - if ~isempty(dataxxp) && numel(dataxxp)>=2 - %%Check isolated point - Check_outlierp =[]; - count = 0; - - if (timexxp(2)-timexxp(1)>Time_res) - count= count +1; - Check_outlierp(count) = 1; - end - if numel(dataxxp)>=3 - for Numofsample = 2:length(timexxp)-1 - if (timexxp(Numofsample+1)-timexxp(Numofsample)>Time_res) && (timexxp(Numofsample)-timexxp(Numofsample-1)< Time_res) - count = count+1; - Check_outlierp(count) = Numofsample; - end - end - end - dataxxp(Check_outlierp) = []; - timexxp(Check_outlierp) = []; - - Check_isolated =[]; - count = 0; - for Numofsample = 1:length(timexxp)-1 - if timexxp(Numofsample+1)-timexxp(Numofsample)>Time_res - count = count+1; - Check_isolated(count) = Numofsample; - end - end - if numel(Check_isolated) ==1 - inBetweenRegionXp1 = [timexxp(1:Check_isolated(1)),fliplr(timexxp(1:Check_isolated(1)))]; - inBetweenRegionYp1 = [squeeze(dataxxp(1:Check_isolated(1)))',fliplr(offset(Numofstione)*ones(1,numel(timexxp(1:Check_isolated(1)))))]; - fill(r_ax,inBetweenRegionXp1, inBetweenRegionYp1,line_colors(Numofstitwo,:,:),'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - - inBetweenRegionXp2 = [timexxp(Check_isolated(1)+1:end),fliplr(timexxp(Check_isolated(1)+1:end))]; - inBetweenRegionYp2 = [squeeze(dataxxp(Check_isolated(1)+1:end))',fliplr(offset(Numofstione)*ones(1,numel(timexxp(Check_isolated(1)+1:end))))]; - fill(r_ax,inBetweenRegionXp2, inBetweenRegionYp2,line_colors(Numofstitwo,:,:),'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - elseif numel(Check_isolated) >1 - for Numofrange = 1:numel(Check_isolated)-1 - - inBetweenRegionX = [timexxp(Check_isolated(Numofrange)+1:Check_isolated(Numofrange+1)),fliplr(timexxp(Check_isolated(Numofrange)+1:Check_isolated(Numofrange+1)))]; - inBetweenRegionY = [squeeze(dataxxp(Check_isolated(Numofrange)+1:Check_isolated(Numofrange+1)))',fliplr(offset(Numofstione)*ones(1,numel(timexxp(Check_isolated(Numofrange)+1:Check_isolated(Numofrange+1)))))]; - fill(r_ax,inBetweenRegionX, inBetweenRegionY,line_colors(Numofstitwo,:,:),'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - - end - inBetweenRegionX1 = [timexxp(1:Check_isolated(1)),fliplr(timexxp(1:Check_isolated(1)))]; - inBetweenRegionY1 = [squeeze(dataxxp(1:Check_isolated(1)))',fliplr(offset(Numofstione)*ones(1,numel(timexxp(1:Check_isolated(1)))))]; - fill(r_ax,inBetweenRegionX1, inBetweenRegionY1,line_colors(Numofstitwo,:,:),'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - - inBetweenRegionX2 = [timexxp(Check_isolated(Numofrange+1)+1:end),fliplr(timexxp(Check_isolated(Numofrange+1)+1:end))]; - inBetweenRegionY2 = [squeeze(dataxxp(Check_isolated(Numofrange+1)+1:end))',fliplr(offset(Numofstione)*ones(1,numel(timexxp(Check_isolated(Numofrange+1)+1:end))))]; - fill(r_ax,inBetweenRegionX2, inBetweenRegionY2,line_colors(Numofstitwo,:,:),'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - - else - inBetweenRegionX = [timexxp,fliplr(timexxp)]; - inBetweenRegionY = [squeeze(dataxxp)',fliplr(offset(Numofstione)*ones(1,numel(timexxp)))]; - fill(r_ax,inBetweenRegionX, inBetweenRegionY,line_colors(Numofstitwo,:,:),'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - end - end%Positive part end - - if ~isempty(dataxxn) && numel(dataxxn)>=2 - %%Check isolated point - Check_outliern =[]; - count = 0; - - if (timexxn(2)-timexxn(1)>Time_res) - count= count +1; - Check_outliern(count) = 1; - end - if numel(dataxxn)>=3 - for Numofsample = 2:length(timexxn)-1 - if (timexxn(Numofsample+1)-timexxn(Numofsample)>Time_res) && (timexxn(Numofsample)-timexxn(Numofsample-1)< Time_res) - count = count+1; - Check_outliern(count) = Numofsample; - end - end - end - dataxxn(Check_outliern) = []; - timexxn(Check_outliern) = []; - - Check_isolated =[]; - count = 0; - for Numofsample = 1:length(timexxn)-1 - if timexxn(Numofsample+1)-timexxn(Numofsample)>Time_res - count = count+1; - Check_isolated(count) = Numofsample; - end - end - if numel(Check_isolated) ==1 - inBetweenRegionXp1 = [timexxn(1:Check_isolated(1)),fliplr(timexxn(1:Check_isolated(1)))]; - inBetweenRegionYp1 = [squeeze(dataxxn(1:Check_isolated(1)))',fliplr(offset(Numofstione)*ones(1,numel(timexxn(1:Check_isolated(1)))))]; - fill(r_ax,inBetweenRegionXp1, inBetweenRegionYp1,line_colors(Numofstitwo,:,:).*0.3,'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - - inBetweenRegionXp2 = [timexxn(Check_isolated(1)+1:end),fliplr(timexxn(Check_isolated(1)+1:end))]; - inBetweenRegionYp2 = [squeeze(dataxxn(Check_isolated(1)+1:end))',fliplr(offset(Numofstione)*ones(1,numel(timexxn(Check_isolated(1)+1:end))))]; - fill(r_ax,inBetweenRegionXp2, inBetweenRegionYp2,line_colors(Numofstitwo,:,:).*0.3,'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - elseif numel(Check_isolated) >1 - for Numofrange = 1:numel(Check_isolated)-1 - - inBetweenRegionX = [timexxn(Check_isolated(Numofrange)+1:Check_isolated(Numofrange+1)),fliplr(timexxn(Check_isolated(Numofrange)+1:Check_isolated(Numofrange+1)))]; - inBetweenRegionY = [squeeze(dataxxn(Check_isolated(Numofrange)+1:Check_isolated(Numofrange+1)))',fliplr(offset(Numofstione)*ones(1,numel(timexxn(Check_isolated(Numofrange)+1:Check_isolated(Numofrange+1)))))]; - fill(r_ax,inBetweenRegionX, inBetweenRegionY,line_colors(Numofstitwo,:,:).*0.3,'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - - end - inBetweenRegionX1 = [timexxn(1:Check_isolated(1)),fliplr(timexxn(1:Check_isolated(1)))]; - inBetweenRegionY1 = [squeeze(dataxxn(1:Check_isolated(1)))',fliplr(offset(Numofstione)*ones(1,numel(timexxn(1:Check_isolated(1)))))]; - fill(r_ax,inBetweenRegionX1, inBetweenRegionY1,line_colors(Numofstitwo,:,:).*0.3,'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - - inBetweenRegionX2 = [timexxn(Check_isolated(Numofrange+1)+1:end),fliplr(timexxn(Check_isolated(Numofrange+1)+1:end))]; - inBetweenRegionY2 = [squeeze(dataxxn(Check_isolated(Numofrange+1)+1:end))',fliplr(offset(Numofstione)*ones(1,numel(timexxn(Check_isolated(Numofrange+1)+1:end))))]; - fill(r_ax,inBetweenRegionX2, inBetweenRegionY2,line_colors(Numofstitwo,:,:).*0.3,'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - - else - inBetweenRegionX = [timexxn,fliplr(timexxn)]; - inBetweenRegionY = [squeeze(dataxxn)',fliplr(offset(Numofstione)*ones(1,numel(timexxn)))]; - fill(r_ax,inBetweenRegionX, inBetweenRegionY,line_colors(Numofstitwo,:,:).*0.3,'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - end - end%%Negative part end - end - end - - elseif ismember_bc2(moption, {'areat', 'fareatlat'})% negative values become positive - - for Numofstione = 1:size(datax,3) - for Numofstitwo = 1:size(datax,2) - timexx = timex(latsamp(1):latsamp(2)); - dataxx = squeeze(datax(:,Numofstitwo,Numofstione)); - inBetweenRegionX = [timexx,fliplr(timexx)]; - inBetweenRegionY = [squeeze(dataxx)',fliplr(offset(Numofstione)*ones(1,numel(timexx)))]; - fill(r_ax,inBetweenRegionX, inBetweenRegionY,line_colors(Numofstitwo,:,:),'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - end - end - - elseif ismember_bc2(moption, {'areazt','areazp','areazn', 'nintegz'}) - [new_erp_data, Amp_out,Lat]= f_ERP_plot_wav(observe_ERPDAT.ERP); - if strcmp(moption,'areazt')%% all area were included - - for Numofstione = 1:size(plot_erp_data,3) - for Numofstitwo = 1:size(plot_erp_data,2) - latx = Lat{Numofstitwo,Numofstione}; - [xxx, latsamp] = closest(timex, latx); - datax = plot_erp_data(latsamp(1):latsamp(2),:,:); - timexx = timex(latsamp(1):latsamp(2)); - dataxx = squeeze(datax(:,Numofstitwo,Numofstione)); - inBetweenRegionX = [timexx,fliplr(timexx)]; - inBetweenRegionY = [squeeze(dataxx)',fliplr(offset(Numofstione)*ones(1,numel(timexx)))]; - fill(r_ax,inBetweenRegionX, inBetweenRegionY,line_colors(Numofstitwo,:,:),'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - end - end - - elseif strcmp(moption,'areazp')%% Only positive area was included - - for Numofstione = 1:size(plot_erp_data,3) - for Numofstitwo = 1:size(plot_erp_data,2) - latx = Lat{Numofstitwo,Numofstione}; - [xxx, latsamp] = closest(timex, latx); - datax = plot_erp_data(latsamp(1):latsamp(2),:,:); - timexx = timex(latsamp(1):latsamp(2)); - timexx_unsl = timex(latsamp(1):latsamp(2)); - dataxx = squeeze(datax(:,Numofstitwo,Numofstione)); - data_check_unsl = squeeze(datax(:,Numofstitwo,Numofstione)); - data_check = dataxx -offset(Numofstione); - if Plority_plot==1 - dataxx(data_check<0) = []; - timexx(data_check<0) = []; - data_check_unsl(data_check>0) =[]; - timexx_unsl(data_check>0) = []; - elseif Plority_plot ==-1 - dataxx(data_check>0) = []; - timexx(data_check>0) = []; - data_check_unsl(data_check<0) =[]; - timexx_unsl(data_check<0) = []; - else - dataxx(data_check<0) = []; - timexx(data_check<0) = []; - data_check_unsl(data_check>0) =[]; - timexx_unsl(data_check>0) = []; - end - inBetweenRegionX = [timexx,fliplr(timexx)]; - inBetweenRegionY = [squeeze(dataxx)',fliplr(offset(Numofstione)*ones(1,numel(timexx)))]; - fill(r_ax,inBetweenRegionX, inBetweenRegionY,line_colors(Numofstitwo,:,:),'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - inBetweenRegionX_unsl = [timexx_unsl,fliplr(timexx_unsl)]; - inBetweenRegionY_unsl = [squeeze(data_check_unsl)',fliplr(offset(Numofstione)*ones(1,numel(timexx_unsl)))]; - fill(r_ax,inBetweenRegionX_unsl, inBetweenRegionY_unsl,[1 1 1],'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - - end - end - - - elseif strcmp(moption,'areazn')%% Only positive area was included - - for Numofstione = 1:size(plot_erp_data,3) - for Numofstitwo = 1:size(plot_erp_data,2) - latx = Lat{Numofstitwo,Numofstione}; - [xxx, latsamp] = closest(timex, latx); - datax = plot_erp_data(latsamp(1):latsamp(2),:,:); - timexx = timex(latsamp(1):latsamp(2)); - timexx_unsl = timex(latsamp(1):latsamp(2)); - dataxx = squeeze(datax(:,Numofstitwo,Numofstione)); - data_check_unsl = squeeze(datax(:,Numofstitwo,Numofstione)); - data_check = dataxx -offset(Numofstione); - if Plority_plot==1 - dataxx(data_check>0) = []; - timexx(data_check>0) = []; - data_check_unsl(data_check<0) =[]; - timexx_unsl(data_check<0) = []; - elseif Plority_plot ==-1 - dataxx(data_check<0) = []; - timexx(data_check<0) = []; - data_check_unsl(data_check>0) =[]; - timexx_unsl(data_check>0) = []; - else - dataxx(data_check>0) = []; - timexx(data_check>0) = []; - data_check_unsl(data_check<0) =[]; - timexx_unsl(data_check<0) = []; - end - inBetweenRegionX = [timexx,fliplr(timexx)]; - inBetweenRegionY = [squeeze(dataxx)',fliplr(offset(Numofstione)*ones(1,numel(timexx)))]; - fill(r_ax,inBetweenRegionX, inBetweenRegionY,line_colors(Numofstitwo,:,:),'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - inBetweenRegionX_unsl = [timexx_unsl,fliplr(timexx_unsl)]; - inBetweenRegionY_unsl = [squeeze(data_check_unsl)',fliplr(offset(Numofstione)*ones(1,numel(timexx_unsl)))]; - fill(r_ax,inBetweenRegionX_unsl, inBetweenRegionY_unsl,[1 1 1],'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - end - end - - elseif strcmp(moption,'nintegz')%% Only positive area was included - - for Numofstione = 1:size(plot_erp_data,3) - for Numofstitwo = 1:size(plot_erp_data,2) - latx = Lat{Numofstitwo,Numofstione}; - [xxx, latsamp] = closest(timex, latx); - datax = plot_erp_data(latsamp(1):latsamp(2),:,:); - timexx = timex(latsamp(1):latsamp(2)); - timexx_unsl = timex(latsamp(1):latsamp(2)); - dataxx = squeeze(datax(:,Numofstitwo,Numofstione)); - data_check_unsl = squeeze(datax(:,Numofstitwo,Numofstione)); - data_check = dataxx -offset(Numofstione); - if Plority_plot==1 - dataxx(data_check<0) = []; - timexx(data_check<0) = []; - data_check_unsl(data_check>0) =[]; - timexx_unsl(data_check>0) = []; - elseif Plority_plot ==-1 - dataxx(data_check>0) = []; - timexx(data_check>0) = []; - data_check_unsl(data_check<0) =[]; - timexx_unsl(data_check<0) = []; - else - dataxx(data_check<0) = []; - timexx(data_check<0) = []; - data_check_unsl(data_check>0) =[]; - timexx_unsl(data_check>0) = []; - end - inBetweenRegionX = [timexx,fliplr(timexx)]; - inBetweenRegionY = [squeeze(dataxx)',fliplr(offset(Numofstione)*ones(1,numel(timexx)))]; - fill(r_ax,inBetweenRegionX, inBetweenRegionY,line_colors(Numofstitwo,:,:),'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - inBetweenRegionX_unsl = [timexx_unsl,fliplr(timexx_unsl)];% - inBetweenRegionY_unsl = [squeeze(data_check_unsl)',fliplr(offset(Numofstione)*ones(1,numel(timexx_unsl)))]; - fill(r_ax,inBetweenRegionX_unsl, inBetweenRegionY_unsl,line_colors(Numofstitwo,:,:)*0.5,'FaceAlpha',0.3,'EdgeColor',line_colors(Numofstitwo,:,:)); - - end - end - - - end - end -end - - -if length(latency)==1 - if ismember_bc2(moption, {'areazt','areazp','areazn', 'nintegz'})%% Four options for Numerical integration/Area between two (automatically detected)zero-crossing latencies - xline(r_ax,latency, 'Color', cwm,'LineWidth' ,1); - - else - xline(r_ax,latency, 'Color', cwm,'LineWidth' ,1); - end - if ismember_bc2(moption, 'instabl') - [new_erp_data, Amp_out,Lat]= f_ERP_plot_wav(observe_ERPDAT.ERP); - - for Numofstione = 1:Num_plot - for Numofstitwo = 1:Num_data - plot(r_ax,latency,squeeze(Amp_out(Numofstitwo,Numofstione)),'Color',line_colors(Numofstitwo,:,:),'Marker','x'); - end - end - - end -elseif length(latency)==2 - Max_values = max(abs(plot_erp_data(:))); - plot_area_up = area(r_ax,[latency latency(2) latency(1)],[-2*Max_values-500,Max_values*2 -2*Max_values-500,Max_values*2]); - plot_area_low = area(r_ax,[latency latency(2) latency(1)],[0,-Max_values*2 0,-Max_values*2]); - - set(plot_area_up,'FaceAlpha',0.2, 'EdgeAlpha', 0.1, 'EdgeColor', cwm,'FaceColor',cwm_backgb); - set(plot_area_low,'FaceAlpha',0.2, 'EdgeAlpha', 0.1, 'EdgeColor', cwm,'FaceColor',cwm_backgb); - - if ismember_bc2(moption, {'peakampbl'})%Local Peak amplitude - - [new_erp_data, Amp_out,Lat]= f_ERP_plot_wav(observe_ERPDAT.ERP); - for Numofstione = 1:Num_plot - for Numofstitwo = 1:Num_data - line(r_ax, [Lat{Numofstitwo,Numofstione} Lat{Numofstitwo,Numofstione}],[offset(Numofstione),squeeze(Amp_out(Numofstitwo,Numofstione))],'Color',line_colors(Numofstitwo,:,:),'LineWidth',3,'LineStyle','--','Marker','x'); - end - end - - elseif ismember_bc2(moption, { 'fareatlat', 'fareaplat','fninteglat','fareanlat'})%fractional area latency - - - [new_erp_data, Amp_out,Lat]= f_ERP_plot_wav(observe_ERPDAT.ERP); - for Numofstione = 1:Num_plot - for Numofstitwo = 1:Num_data - Amp_all = squeeze(plot_erp_data(:,Numofstitwo,Numofstione)); - if ~isnan(Amp_out(Numofstitwo,Numofstione)) - [xxx, latsamp, latdiffms] = closest(timex, Amp_out(Numofstitwo,Numofstione)); - line(r_ax, [Amp_out(Numofstitwo,Numofstione) Amp_out(Numofstitwo,Numofstione)],[offset(Numofstione),Amp_all(latsamp)],'Color',line_colors(Numofstitwo,:,:),'LineWidth',3,'LineStyle','--','Marker','x'); - end - end - end - - elseif ismember_bc2(moption, {'peaklatbl','fpeaklat'}) % fractional peak latency && Local peak latency - - [new_erp_data, Amp_out,Lat]= f_ERP_plot_wav(observe_ERPDAT.ERP); - for Numofstione = 1:Num_plot - for Numofstitwo = 1:Num_data - Amp_all = squeeze(plot_erp_data(:,Numofstitwo,Numofstione)); - if ~isnan(Amp_out(Numofstitwo,Numofstione)) - [xxx, latsamp, latdiffms] = closest(timex, Amp_out(Numofstitwo,Numofstione)); - line(r_ax, [Amp_out(Numofstitwo,Numofstione) Amp_out(Numofstitwo,Numofstione)],[offset(Numofstione),Amp_all(latsamp)],'Color',line_colors(Numofstitwo,:,:),'LineWidth',3,'LineStyle','--','Marker','x'); - end - end - end - - end -end - -end diff --git a/studio_functions/Functions/EStudio/ERP Tab/f_redrawERP_try.m b/studio_functions/Functions/EStudio/ERP Tab/f_redrawERP_try.m deleted file mode 100755 index 87e813f0..00000000 --- a/studio_functions/Functions/EStudio/ERP Tab/f_redrawERP_try.m +++ /dev/null @@ -1,942 +0,0 @@ -%This function is to plot ERP wave with single or multiple columns on one page. - - - -% Author: Guanghui Zhang & Steve J. Luck & Andrew Stewart -% Center for Mind and Brain -% University of California, Davis, -% Davis, CA -% 2022 - - - -function f_redrawERP_try() -% Draw a demo ERP into the axes provided -global gui_erp; -global observe_ERPDAT; - - -S_ws_geterpset= estudioworkingmemory('selectederpstudio'); -if isempty(S_ws_geterpset) - S_ws_geterpset = observe_ERPDAT.CURRENTERP; - - if isempty(S_ws_geterpset) - msgboxText = 'No ERPset was selected!!!'; - title = 'EStudio: ERPsets'; - errorfound(msgboxText, title); - return; - end - S_erpplot = f_ERPplot_Parameter(observe_ERPDAT.ALLERP,S_ws_geterpset); - estudioworkingmemory('geterpbinchan',S_erpplot.geterpbinchan); - estudioworkingmemory('geterpplot',S_erpplot.geterpplot); -end - -S_ws_getbinchan = estudioworkingmemory('geterpbinchan'); - -S_ws_geterpplot = estudioworkingmemory('geterpplot'); - - -%%Parameter from bin and channel panel -Elecs_shown = S_ws_getbinchan.elecs_shown{S_ws_getbinchan.Select_index}; -Bins = S_ws_getbinchan.bins{S_ws_getbinchan.Select_index}; -Bin_chans = S_ws_getbinchan.bins_chans(S_ws_getbinchan.Select_index); -Elec_list = S_ws_getbinchan.elec_list{S_ws_getbinchan.Select_index}; -Matlab_ver = S_ws_getbinchan.matlab_ver; - - - -%%Parameter from plotting panel -try - Min_vspacing = S_ws_geterpplot.min_vspacing(S_ws_getbinchan.Select_index); - Min_time = S_ws_geterpplot.min(S_ws_getbinchan.Select_index); - Max_time = S_ws_geterpplot.max(S_ws_getbinchan.Select_index); - Yscale = S_ws_geterpplot.yscale(S_ws_getbinchan.Select_index); - Timet_low =S_ws_geterpplot.timet_low(S_ws_getbinchan.Select_index); - Timet_high =S_ws_geterpplot.timet_high(S_ws_getbinchan.Select_index); - Timet_step=S_ws_geterpplot.timet_step(S_ws_getbinchan.Select_index); - Fill = S_ws_geterpplot.fill(S_ws_getbinchan.Select_index); - Plority_plot = S_ws_geterpplot.Positive_up(S_ws_getbinchan.Select_index); - ColumnNum = S_ws_geterpplot.Plot_column; -catch - return; -end - -Column_label = ColumnNum(S_ws_getbinchan.Select_index); - -if Bin_chans == 0 - elec_n = S_ws_getbinchan.elec_n(S_ws_getbinchan.Select_index); - max_elec_n = observe_ERPDAT.ALLERP(S_ws_geterpset(S_ws_getbinchan.Select_index)).nchan; -else - elec_n = S_ws_getbinchan.bin_n(S_ws_getbinchan.Select_index); - max_elec_n = observe_ERPDAT.ALLERP(S_ws_geterpset(S_ws_getbinchan.Select_index)).nbin; -end - -% We first clear the existing axes ready to build a new one -if ishandle( gui_erp.ViewAxes ) - delete( gui_erp.ViewAxes ); -end - - -% Get chan labels -S_chan.chan_label = cell(1,max_elec_n); -S_chan.chan_label_place = zeros(1,max_elec_n); - - -if Bin_chans == 0 - for i = 1:elec_n - S_chan.chan_label{i} = observe_ERPDAT.ERP.chanlocs(Elecs_shown(i)).labels; - end -else - for i = 1:elec_n - S_chan.chan_label{i} = observe_ERPDAT.ERP.bindescr(Bins(i)); - end -end - - -%Sets the units of your root object (screen) to pixels -set(0,'units','pixels') -%Obtains this pixel information -Pix_SS = get(0,'screensize'); -%Sets the units of your root object (screen) to inches -set(0,'units','inches') -%Obtains this inch information -Inch_SS = get(0,'screensize'); -%Calculates the resolution (pixels per inch) -Res = Pix_SS./Inch_SS; - - -pb_height = Min_vspacing*Res(4); %px - - -% Plot data in the main viewer fig -splot_n = elec_n; -tsize = 13; - - -clear pb r_ax plotgrid; -try - [version reldate,ColorB_def,ColorF_def,errorColorF_def] = geterplabstudiodef;%%Get background color -catch - ColorB_def = [0.95 0.95 0.95]; -end -if isempty(ColorB_def) - ColorB_def = [0.95 0.95 0.95]; -end -gui_erp.plotgrid = uix.VBox('Parent',gui_erp.ViewContainer,'Padding',0,'Spacing',0,'BackgroundColor',ColorB_def); - -pageinfo_box = uiextras.HBox( 'Parent', gui_erp.plotgrid,'BackgroundColor',ColorB_def); - -gui_erp.plot_wav_legend = uiextras.HBox( 'Parent', gui_erp.plotgrid,'BackgroundColor',[1 1 1]); -gui_erp.ViewAxes_legend = uix.ScrollingPanel( 'Parent', gui_erp.plot_wav_legend,'BackgroundColor',ColorB_def); - -gui_erp.ViewAxes = uix.ScrollingPanel( 'Parent', gui_erp.plot_wav_legend,'BackgroundColor',[1 1 1]); - - -%%Changed by Guanghui Zhang 2 August 2022-------panel for display the processing procedure for some functions, e.g., filtering -xaxis_panel = uiextras.HBox( 'Parent', gui_erp.plotgrid,'BackgroundColor',ColorB_def);%%%Message -gui_erp.Process_messg = uicontrol('Parent',xaxis_panel,'Style','text','String','','FontSize',20,'FontWeight','bold','BackgroundColor',ColorB_def); - - -%%Setting title -gui_erp.pageinfo_minus = uicontrol('Parent',pageinfo_box,'Style', 'pushbutton', 'String', '<','Callback',@page_minus,'FontSize',30,'BackgroundColor',[1 1 1]); -if S_ws_getbinchan.Select_index ==1 - gui_erp.pageinfo_minus.Enable = 'off'; -end - -gui_erp.pageinfo_plus = uicontrol('Parent',pageinfo_box,'Style', 'pushbutton', 'String', '>','Callback',@page_plus,'FontSize',30,'BackgroundColor',[1 1 1]); -if S_ws_getbinchan.Select_index == numel(S_ws_geterpset) - gui_erp.pageinfo_plus.Enable = 'off'; -end - -pageinfo_str = ['Page',32,num2str(S_ws_getbinchan.Select_index),'/',num2str(numel(S_ws_geterpset)),':',32,observe_ERPDAT.ERP.erpname]; - -pageinfo_text = uicontrol('Parent',pageinfo_box,'Style','text','String',pageinfo_str,'FontSize',14,'FontWeight','bold'); - -if length(S_ws_geterpset) ==1 - Enable_minus = 'off'; - Enable_plus = 'off'; - Enable_plus_BackgroundColor = [1 1 1]; - Enable_minus_BackgroundColor = [0 0 0]; -else - - if S_ws_getbinchan.Select_index ==1 - Enable_minus = 'off'; - Enable_plus = 'on'; - - Enable_plus_BackgroundColor = [0 1 0]; - Enable_minus_BackgroundColor = [0 0 0]; - elseif S_ws_getbinchan.Select_index == length(S_ws_geterpset) - Enable_minus = 'on'; - Enable_plus = 'off'; - Enable_plus_BackgroundColor = [0 0 0]; - Enable_minus_BackgroundColor = [0 1 0]; - else - Enable_minus = 'on'; - Enable_plus = 'on'; - Enable_plus_BackgroundColor = [0 1 0]; - Enable_minus_BackgroundColor = [0 1 0]; - end -end -gui_erp.pageinfo_minus.Enable = Enable_minus; -gui_erp.pageinfo_plus.Enable = Enable_plus; -gui_erp.pageinfo_plus.ForegroundColor = Enable_plus_BackgroundColor; -gui_erp.pageinfo_minus.ForegroundColor = Enable_minus_BackgroundColor; - -set(pageinfo_box, 'Sizes', [50 50 -1] ); -set(pageinfo_box,'BackgroundColor',ColorB_def); -set(pageinfo_text,'BackgroundColor',ColorB_def); -%Setting title. END,'BackgroundColor',ColorB_def - -%for i=1:splot_n - -% -%%------------Setting the number of data and plotting--------------------- -ndata = 0; -nplot = 0; -if Bin_chans == 0 %if channels with bin overlay - ndata = Bins; - nplot = Elecs_shown; -else %if bins with channel overlay - ndata = Elecs_shown; - nplot = Bins; -end - -% -timeor = observe_ERPDAT.ERP.times; % original time vector -timex = timeor; -[xxx, latsamp, latdiffms] = closest(timex, [Min_time Max_time]); -tmin = latsamp(1); -tmax = latsamp(2); - -if tmin < 1 - tmin = 1; -end - -if tmax > numel(observe_ERPDAT.ERP.times) - tmax = numel(observe_ERPDAT.ERP.times); -end - -plot_erp_data = nan(tmax-tmin+1,numel(ndata)); -for i = 1:splot_n - if Bin_chans == 0 - for i_bin = 1:numel(ndata) - plot_erp_data(:,i_bin,i) = observe_ERPDAT.ERP.bindata(Elecs_shown(i),tmin:tmax,Bins(i_bin))'*Plority_plot; % - end - else - for i_bin = 1:numel(ndata) - plot_erp_data(:,i_bin,i) = observe_ERPDAT.ERP.bindata(Elecs_shown(i_bin),tmin:tmax,Bins(i))'*Plority_plot; % - end - end -end - -perc_lim = Yscale; -percentile = perc_lim*3/2; - -[~,~,b] = size(plot_erp_data); - - -% -%%%------------Setting xticklabels for each row of each wave-------------- -xstep_label = estudioworkingmemory('erp_xtickstep'); -if isempty(xstep_label) - xstep_label =0; -end -if ~xstep_label - [def Timet_step]= default_time_ticks_studio(observe_ERPDAT.ERP, [Min_time,Max_time]); - if ~isempty(def{1,1}) - xticks_clomn = str2num(def{1,1}); - while xticks_clomn(end)<=Max_time - xticks_clomn(numel(xticks_clomn)+1) = xticks_clomn(end)+Timet_step; - if xticks_clomn(end)>Max_time - xticks_clomn = xticks_clomn(1:end-1); - break; - end - end - else - xticks_clomn = (Min_time:Timet_step:Max_time); - end -else - - - xticks_clomn = (Min_time:Timet_step:Max_time); -end -Timet_step_p = ceil(Timet_step/(1000/observe_ERPDAT.ERP.srate));%% Time points of the gap between columns - -% -%%----------------------Modify the data into multiple-columns--------------------------------------- -rowNum = ceil(b/Column_label); -plot_erp_data_new = NaN(size(plot_erp_data,1),size(plot_erp_data,2),rowNum*Column_label); - -plot_erp_data_new(:,:,1:size(plot_erp_data,3)) = plot_erp_data; -plot_erp_data_new_trans = []; - - -if Column_label==1 - for Numofrow = 1:rowNum - plot_erp_data_new_trans(:,:,:,Numofrow) = plot_erp_data_new(:,:,(Numofrow-1)*Column_label+1:Numofrow*Column_label); - end - - clear plot_erp_data; - plot_erp_data_new_trans = permute(plot_erp_data_new_trans,[1,3,2,4]) ; - plot_erp_data = reshape(plot_erp_data_new_trans,size(plot_erp_data_new_trans,1)*size(plot_erp_data_new_trans,2),size(plot_erp_data_new_trans,3),size(plot_erp_data_new_trans,4)); - -elseif Column_label>1 - - plot_erp_data_trans_clumns = NaN(size(plot_erp_data_new,1)*Column_label+(Column_label-1)*Timet_step_p,size(plot_erp_data_new,2),rowNum); - for Numofrow = 1:rowNum - Data_column = plot_erp_data_new(:,:,(Numofrow-1)*Column_label+1:Numofrow*Column_label); - for Numofcolumn = 1:Column_label - low_interval = size(plot_erp_data_new,1)*(Numofcolumn-1)+1+(Numofcolumn-1)*Timet_step_p; - high_interval = size(plot_erp_data_new,1)*(Numofcolumn-1)+(Numofcolumn-1)*Timet_step_p+size(plot_erp_data_new,1); - plot_erp_data_trans_clumns(low_interval:high_interval,:,Numofrow) = squeeze(Data_column(:,:,Numofcolumn)); - end - end - plot_erp_data = plot_erp_data_trans_clumns; -end - -ind_plot_height = percentile*2; % Height of each individual subplot - -offset = []; -if Bin_chans == 0 - offset = (size(plot_erp_data,3)-1:-1:0)*ind_plot_height; -else - offset = (size(plot_erp_data,3)-1:-1:0)*ind_plot_height; -end -[~,~,b] = size(plot_erp_data); -for i = 1:b - plot_erp_data(:,:,i) = plot_erp_data(:,:,i) + ones(size(plot_erp_data(:,:,i)))*offset(i); -end - - - -r_ax = axes('Parent', gui_erp.ViewAxes,'Color','none','Box','on','FontWeight','bold'); -hold(r_ax,'on'); -set(gui_erp.plot_wav_legend,'Sizes',[80 -10]); -r_ax_legend = axes('Parent', gui_erp.ViewAxes_legend,'Color','none','Box','off'); -hold(r_ax_legend,'on'); - - -try - f_bin = 1000/observe_ERPDAT.ERP.srate; -catch - f_bin = 1; -end - -ts = observe_ERPDAT.ERP.times(tmin:tmax); -ts_colmn = ts; - -% -%%------------------Adjust the data into multiple/single columns------------ -if Column_label>1 % Plotting waveforms with munltiple-columns - xticks_org = xticks_clomn; - - for Numofcolumn = 1:Column_label-1 - xticks_clomn_add = [1:numel(ts)+Timet_step_p].*f_bin+(ts_colmn(end).*ones(1,numel(ts)+Timet_step_p)); - ts_colmn = [ts_colmn,xticks_clomn_add]; - end - - X_zero_line(1) =ts(1); - for Numofcolumn = 1:Column_label-1 - if Numofcolumn ==1 - X_zero_line(Numofcolumn+1) = X_zero_line(Numofcolumn)+ ts(end)-ts(1)+f_bin + (Timet_step_p/2)*f_bin; - else - X_zero_line(Numofcolumn+1) = X_zero_line(Numofcolumn)+ ts(end)-ts(1)+f_bin + (Timet_step_p)*f_bin; - end - end - - [xticks,xticks_labels] = f_geterpxticklabel(observe_ERPDAT.ERP,xticks_clomn,Column_label,[Min_time Max_time],Timet_step); - ts = ts_colmn; - Min_time = ts(1); - Max_time = ts(end); - -else%% Plotting waveforms with single-column - %%%------------getting xticklabels for each row of each wave-------------- - xticks =xticks_clomn; - X_zero_line(1) =ts(1); - for Numofxlabel = 1:numel(xticks) - xticks_labels{Numofxlabel} = num2str(xticks(Numofxlabel)); - end -end - - -splot_n = size(plot_erp_data,3);%%Adjust the columns - -set(r_ax,'XLim',[Min_time Max_time]); - -[a,c,b] = size(plot_erp_data); -new_erp_data = zeros(a,b*c); -for i = 1:b - new_erp_data(:,((c*(i-1))+1):(c*i)) = plot_erp_data(:,:,i); -end - - -line_colors = erpworkingmemory('PWColor'); -if size(line_colors,1)~= numel(ndata) - if numel(ndata)> size(line_colors,1) - line_colors = get_colors(numel(ndata)); - else - line_colors = line_colors(1:numel(ndata),:,:); - end -end - -if isempty(line_colors) - line_colors = get_colors(numel(ndata)); -end - -line_colors = repmat(line_colors,[splot_n 1]); %repeat the colors once for every plot - - -% -%%------------Setting xticklabels for each row -------------- -x_axs = ones(size(new_erp_data,1),1); -for jj = 1:numel(offset)-1 - plot(r_ax,ts,x_axs.*offset(end),'color',[1 1 1],'LineWidth',1); - set(r_ax,'XTick',xticks, ... - 'box','off', 'Color','none','xticklabels',xticks_labels,'FontWeight','bold'); - myX_Crossing = offset(jj); - props = get(r_ax); - - tick_bottom = -props.TickLength(1)*diff(props.YLim); - if abs(tick_bottom) > abs(Yscale)/5 - try - tick_bottom = - abs(Yscale)/5; - catch - tick_bottom = tick_bottom; - end - elseif abs(tick_bottom)1 - if numel(offset)==jj - kkkk = 1; - else - kkkk = 2; - end - for iCount = kkkk:nTicks - xtick_label = (props.XTickLabel(iCount, :)); - text(r_ax,props.XTick(iCount), tick_bottom + myX_Crossing, ... - xtick_label, ... - 'HorizontalAlignment', 'Center', ... - 'VerticalAlignment', 'Top', ... - 'FontSize', 12, ... - 'FontName', props.FontName, ... - 'FontAngle', props.FontAngle, ... - 'FontUnits', props.FontUnits, ... - 'FontWeight', 'bold'); - end - end - -end - -% -%%----------------Start:Remove xticks for the columns without waves in the last row------------------------- -Element_left = numel(nplot) - (ceil(numel(nplot)/Column_label)-1)*Column_label; -x_axset = plot(r_ax,ts,x_axs.*offset(end),'color', [1 1 1],'LineWidth',1); -set(r_ax,'XTick',xticks, ... - 'box','off', 'Color','none','xticklabels',xticks_labels,'FontWeight','bold'); -myX_Crossing = offset(end); -props = get(r_ax); - -tick_bottom = -props.TickLength(1)*diff(props.YLim); -if abs(tick_bottom) > abs(Yscale)/5 - try - tick_bottom = - abs(Yscale)/5; - catch - tick_bottom = tick_bottom; - end -elseif abs(tick_bottom)1 - for iCount = 1:ceil(nTicks/Column_label*Element_left) - xtick_label = (props.XTickLabel(iCount, :)); - text(r_ax,props.XTick(iCount), tick_bottom + myX_Crossing, ... - xtick_label, ... - 'HorizontalAlignment', 'Center', ... - 'VerticalAlignment', 'Top', ... - 'FontSize', 12, ... - 'FontName', props.FontName, ... - 'FontAngle', props.FontAngle, ... - 'FontUnits', props.FontUnits, ... - 'FontWeight', 'bold'); - end -end -%%--------------------------End:Remove xticks for the columns without waves in the last row------------------------- - -% -%%-----------------Get zeroline for each row----------------------------- -row_baseline = NaN(numel(ts),splot_n); -count = 0; -for Numofsplot = 0:splot_n-1 - for Numofcolumn = 1:Column_label - count = count +1; - if count> numel(nplot) - - break; - - end - low_interval = size(plot_erp_data_new,1)*(Numofcolumn-1)+1+(Numofcolumn-1)*Timet_step_p; - high_interval = size(plot_erp_data_new,1)*(Numofcolumn-1)+(Numofcolumn-1)*Timet_step_p+size(plot_erp_data_new,1); - row_baseline(low_interval:high_interval,Numofsplot+1) = ones(numel(low_interval:high_interval),1).*offset(Numofsplot+1); - end -end - - -% -%%-------------------------Plotting ERP waves----------------------------- -pb_here = plot(r_ax,ts, [new_erp_data],'LineWidth',1.5); - -set(r_ax, 'XTick', [], 'XTickLabel', []); - -% -%%----------------Marking 0 point (event-locked)-------------------------- -[xxx, latsamp_0, latdiffms_0] = closest(xticks, [0]); -if numel(offset)>1 - if latdiffms_0 ==0 - for Numofcolumn = 1:Column_label - xline(r_ax,xticks((Numofcolumn-1)*numel(xticks_clomn)+latsamp_0),'k-.','LineWidth',1);%%'Color',Marking start time point for each column - end - end -elseif numel(offset)==1 - - for Numofcolumn = 1:numel(nplot) - xline(r_ax,xticks((Numofcolumn-1)*numel(xticks_clomn)+latsamp_0),'k-.','LineWidth',1);%%'Color',Marking start time point for each column - end -end -% -yticks = -perc_lim:perc_lim:((2*percentile*b)-(2*perc_lim)); -ylabs = repmat([-perc_lim 0 perc_lim],[1,b]); -oldlim = [-percentile yticks(end)-perc_lim+percentile]; -top_vspace = max( max( new_erp_data))-oldlim(2); -bot_vspace = min( min( new_erp_data))-oldlim(1); -if top_vspace < 0 - top_vspace = 0; -end - -if bot_vspace > 0 - bot_vspace = 0; -end -newlim = oldlim + [bot_vspace top_vspace]; -set(r_ax,'XLim',[Min_time Max_time],'Ylim',newlim); - - -% -%%--------------Setting color for each wave-------------------------- -% if Column_label>1 -% for i = 0:splot_n-1 -% r_ax.Children(end-i).Color = [1 1 1]; -% end -% end - -% for i = splot_n+1:numel(pb_here) -% pb_here(i).Color = line_colors((i-splot_n),:); -% end -for i = 1:numel(pb_here) - pb_here(i).Color = line_colors(i,:); -end -% -% for i = 1:splot_n-1 -% pb_here(i).Color = [0 0 0]; -% pb_here(i).LineWidth=.01; -% end - - - - -%%------------Marking start time point for each column--------------------- -if Column_label>1 - for ii = 2:numel(X_zero_line) - xline(r_ax,X_zero_line(ii), 'y--','LineWidth',2); - end -end - -for Numofplot = 1:size(row_baseline,2) - plot(r_ax,ts,row_baseline(:,Numofplot),'color',[0 0 0],'LineWidth',1.5); -end -ylabs = [fliplr(-perc_lim:-perc_lim:newlim(1)) ylabs(2:end-1) (yticks(end):perc_lim:newlim(2))-yticks(end)+perc_lim]; -yticks = [fliplr(-perc_lim:-perc_lim:newlim(1)) yticks(2:end-1) yticks(end):perc_lim:newlim(2)]; - - - -% -%%-------------Name of bin/channel for each subplot-------------------------- -if Column_label==1 - if numel(offset)>1 - count = 0; - for i = 0:numel(offset)-1 - leg_str = ''; - - count = count+1; - try - if Bin_chans == 0 - leg_str = sprintf('%s',Elec_list{Elecs_shown(count)}); - else - leg_str = sprintf('%s',observe_ERPDAT.ERP.bindescr{Bins(count)}); - end - catch - leg_str = ''; - end - text(r_ax,ts(1),offset(i+1)+offset(end-1)/6,leg_str,'FontWeight','bold','FontSize', 14); - end - end - - try - if Bin_chans == 0 - leg_str = sprintf('%s',Elec_list{Elecs_shown(end)}); - else - leg_str = sprintf('%s',observe_ERPDAT.ERP.bindescr{Bins(end)}); - end - catch%% - leg_str = ''; - end - - try - text(r_ax,ts(1),offset(end-1)/6,leg_str,'FontWeight','bold','FontSize', 14); - catch - text(r_ax,ts(1),Yscale/2,leg_str,'FontWeight','bold','FontSize', 14); - end -else%% Getting y ticks and legends for multiple-columns - if numel(offset)>1 - count = 0; - for i = 0:numel(offset)-1 - leg_str = ''; - for Numofcolumn = 1: Column_label - count = count+1; - try - if Bin_chans == 0 - leg_str = sprintf('%s',Elec_list{Elecs_shown(count)}); - else - leg_str = sprintf('%s',observe_ERPDAT.ERP.bindescr{Bins(count)}); - end - catch - leg_str = ''; - end - if Numofcolumn ==1 - text(r_ax,X_zero_line(Numofcolumn),offset(i+1)+offset(end-1)/6,leg_str,'FontWeight','bold','FontSize', 14); - else - text(r_ax,X_zero_line(Numofcolumn)+Timet_step/2,offset(i+1)+offset(end-1)/6,leg_str,'FontWeight','bold','FontSize', 14); - end - end - end - end - - - count = (numel(offset)-1)*Column_label; - leg_str = ''; - for Numofcolumn = 1:Column_label - count = count+1; - try - if Bin_chans == 0 - leg_str = sprintf('%s',Elec_list{Elecs_shown(count)}); - else - leg_str = sprintf('%s',observe_ERPDAT.ERP.bindescr{Bins(count)}); - end - catch%% - leg_str = ''; - end - try - - if Numofcolumn ==1 - text(r_ax,X_zero_line(Numofcolumn),offset(i+1)+offset(end-1)/6,leg_str,'FontWeight','bold','FontSize', 14); - else - text(r_ax,X_zero_line(Numofcolumn)+Timet_step/2,offset(i+1)+offset(end-1)/6,leg_str,'FontWeight','bold','FontSize', 14); - end - catch - - if Numofcolumn ==1 - text(r_ax,X_zero_line(Numofcolumn),Yscale/2,leg_str,'FontWeight','bold','FontSize', 14); - else - text(r_ax,X_zero_line(Numofcolumn)+Timet_step/2,Yscale/2,leg_str,'FontWeight','bold','FontSize', 14); - end - % text(r_ax,X_zero_line(Numofcolumn),Yscale/2,leg_str,'FontWeight','bold','FontSize', 14); - end - end - -end -% - - -% -%%-------------Setting x/yticks and ticklabels-------------------------------- -Ylabels_new = ylabs.*Plority_plot; -[~,Y_label] = find(Ylabels_new == -0); -Ylabels_new(Y_label) = 0; -% xticks = (Min_time:Timet_step:Max_time); -% some options currently only work post Matlab R2016a ,'XLim',[Min_time Max_time],'XLim',[Min_time Max_time] -if Matlab_ver >= 2016 - set(r_ax,'FontSize',tsize,'FontWeight','bold','XAxisLocation','origin',... - 'XGrid','on','YGrid','on','YTick',yticks,'YTickLabel',Ylabels_new, ... - 'YLim',newlim,'XTick',xticks, ... - 'box','off', 'Color','none','xticklabels',xticks_labels); -else - set(r_ax,'FontSize',tsize,'FontWeight','bold','XAxisLocation','bottom',... - 'XGrid','on','YGrid','on','YTick',yticks,'YTickLabel',Ylabels_new, ... - 'YLim',newlim, 'XTick',xticks, ... - 'box','off', 'Color','none','xticklabels',xticks_labels); - hline(0,'k'); % backup xaxis -end -if Column_label>1 - set(r_ax,'XGrid','on','YGrid','on');%,'XDir','reverse' -end -set(r_ax, 'XTick', [], 'XTickLabel', [],'FontWeight', 'bold'); -r_ax.YAxis.LineWidth = 1.5; - -hold(r_ax,'off'); -% - - - -% -%%--------------------------Setting legend--------------------------------- -line_colors_ldg = erpworkingmemory('PWColor'); -if isempty(line_colors_ldg) - line_colors_ldg = get_colors(numel(ndata)); -end - -if size(line_colors_ldg,1)~= numel(ndata) - if numel(ndata)> size(line_colors_ldg,1) - line_colors_ldg = get_colors(numel(ndata)); - else - line_colors_ldg = line_colors_ldg(1:numel(ndata),:,:); - end -end - -for Numofplot = 1:size(plot_erp_data,2) - plot(r_ax_legend,[0 0],'Color',line_colors_ldg(Numofplot,:,:),'LineWidth',3) -end - -if Bin_chans == 0 - - Leg_Name = {}; - - for Numofbin = 1:numel(Bins) - Leg_Name{Numofbin} = strcat('Bin',num2str(Bins(Numofbin))); - end -else - for Numofchan = 1:numel(Elecs_shown) - Leg_Name{Numofchan} = Elec_list{Numofchan}; - end -end -legend(r_ax_legend,Leg_Name,'FontSize',14,'TextColor','blue'); -legend(r_ax_legend,'boxoff'); -% - -%-------fix scaling shrinkage-------------- -pos_fix = r_ax.Position; -pos_fix(2) = 1; % Start at the bottom -pos_fix(4) = pb_height - 1; % fill the height; - -gui_erp.plotgrid.Heights(1) = 30; % set the first element (pageinfo) to 30px high -gui_erp.plotgrid.Heights(3) = 30; % set the second element (x axis) to 30px high -gui_erp.plotgrid.Units = 'pixels'; -if splot_n*pb_height<(gui_erp.plotgrid.Position(4)-gui_erp.plotgrid.Heights(1))&&Fill - pb_height = (gui_erp.plotgrid.Position(4)-gui_erp.plotgrid.Heights(1)-gui_erp.plotgrid.Heights(2))/splot_n; -end - -gui_erp.ViewAxes.Heights = splot_n*pb_height; -gui_erp.plotgrid.Units = 'normalized'; - -end % redrawDemo - - -function colors = get_colors(ncolors) -% Each color gets 1 point divided into up to 2 of 3 groups (RGB). -degree_step = 6/ncolors; -angles = (0:ncolors-1)*degree_step; -colors = nan(numel(angles),3); -for i = 1:numel(angles) - if angles(i) < 1 - colors(i,:) = [1 (angles(i)-floor(angles(i))) 0]*0.75; - elseif angles(i) < 2 - colors(i,:) = [(1-(angles(i)-floor(angles(i)))) 1 0]*0.75; - elseif angles(i) < 3 - colors(i,:) = [0 1 (angles(i)-floor(angles(i)))]*0.75; - elseif angles(i) < 4 - colors(i,:) = [0 (1-(angles(i)-floor(angles(i)))) 1]*0.75; - elseif angles(i) < 5 - colors(i,:) = [(angles(i)-floor(angles(i))) 0 1]*0.75; - else - colors(i,:) = [1 0 (1-(angles(i)-floor(angles(i))))]*0.75; - end -end -end - - - -%------------------Display the waveform for proir ERPset-------------------- -function page_minus(~,~) -global observe_ERPDAT; -global gui_erp; - - -S_ws_geterpset= estudioworkingmemory('selectederpstudio'); -if isempty(S_ws_geterpset) - S_ws_geterpset = observe_ERPDAT.CURRENTERP; - - if isempty(S_ws_geterpset) - msgboxText = 'No ERPset was selected!!!'; - title = 'EStudio: ERPsets'; - errorfound(msgboxText, title); - return; - end - S_erpplot = f_ERPplot_Parameter(observe_ERPDAT.ALLERP,S_ws_geterpset); - estudioworkingmemory('geterpbinchan',S_erpplot.geterpbinchan); - estudioworkingmemory('geterpplot',S_erpplot.geterpplot); -end - -S_ws_getbinchan = estudioworkingmemory('geterpbinchan'); - - -S_ws_getbinchan.Select_index = S_ws_getbinchan.Select_index-1; -Current_erp_Index = S_ws_geterpset(S_ws_getbinchan.Select_index); -if Current_erp_Index > length(observe_ERPDAT.ALLERP) - beep; - disp('Waiting for modifing'); - return; -end - -observe_ERPDAT.CURRENTERP = Current_erp_Index; -observe_ERPDAT.ERP = observe_ERPDAT.ALLERP(Current_erp_Index); - - -estudioworkingmemory('geterpbinchan',S_ws_getbinchan); - - -observe_ERPDAT.Count_currentERP = observe_ERPDAT.Count_currentERP+1; - - -if length(S_ws_geterpset) ==1 - Enable_minus = 'off'; - Enable_plus = 'off'; - Enable_plus_BackgroundColor = [0 0 0]; - Enable_minus_BackgroundColor = [0 0 0]; -else - - if S_ws_getbinchan.Select_index ==1 - Enable_minus = 'off'; - Enable_plus = 'on'; - - Enable_plus_BackgroundColor = [0 1 0]; - Enable_minus_BackgroundColor = [0 0 0]; - elseif S_ws_getbinchan.Select_index == length(S_ws_geterpset) - Enable_minus = 'on'; - Enable_plus = 'off'; - Enable_plus_BackgroundColor = [0 0 0]; - Enable_minus_BackgroundColor = [0 1 0]; - else - Enable_minus = 'on'; - Enable_plus = 'on'; - Enable_plus_BackgroundColor = [0 1 0]; - Enable_minus_BackgroundColor = [0 1 0]; - end -end -gui_erp.pageinfo_minus.Enable = Enable_minus; -gui_erp.pageinfo_plus.Enable = Enable_plus; -% f_redrawERP_mt_viewer(); -gui_erp.pageinfo_plus.ForegroundColor = Enable_plus_BackgroundColor; -gui_erp.pageinfo_minus.ForegroundColor = Enable_minus_BackgroundColor; -end - - - - - -%------------------Display the waveform for next ERPset-------------------- -function page_plus(~,~) -global observe_ERPDAT; -global gui_erp; - - -S_ws_geterpset= estudioworkingmemory('selectederpstudio'); -if isempty(S_ws_geterpset) - S_ws_geterpset = observe_ERPDAT.CURRENTERP; - - if isempty(S_ws_geterpset) - msgboxText = 'No ERPset was selected!!!'; - title = 'EStudio: ERPsets'; - errorfound(msgboxText, title); - return; - end - S_erpplot = f_ERPplot_Parameter(observe_ERPDAT.ALLERP,S_ws_geterpset); - estudioworkingmemory('geterpbinchan',S_erpplot.geterpbinchan); - estudioworkingmemory('geterpplot',S_erpplot.geterpplot); -end - -S_ws_getbinchan = estudioworkingmemory('geterpbinchan'); - - - - -S_ws_getbinchan.Select_index = S_ws_getbinchan.Select_index+1; -Current_erp_Index = S_ws_geterpset(S_ws_getbinchan.Select_index); -if Current_erp_Index > length(observe_ERPDAT.ALLERP) - beep; - disp('Waiting for modifing'); - return; -end - -observe_ERPDAT.CURRENTERP = Current_erp_Index; -observe_ERPDAT.ERP = observe_ERPDAT.ALLERP(Current_erp_Index); - -estudioworkingmemory('geterpbinchan',S_ws_getbinchan); - -observe_ERPDAT.Count_currentERP = observe_ERPDAT.Count_currentERP+1; - - -if length(S_ws_geterpset) ==1 - Enable_minus = 'off'; - Enable_plus = 'off'; - Enable_plus_BackgroundColor = [0 0 0]; - Enable_minus_BackgroundColor = [0 0 0]; -else - - if S_ws_getbinchan.Select_index ==1 - Enable_minus = 'off'; - Enable_plus = 'on'; - Enable_plus_BackgroundColor = [0 1 0]; - Enable_minus_BackgroundColor = [1 1 1]; - elseif S_ws_getbinchan.Select_index == length(S_ws_geterpset) - Enable_minus = 'on'; - Enable_plus = 'off'; - Enable_plus_BackgroundColor = [0 0 0]; - Enable_minus_BackgroundColor = [0 1 0]; - - - else - Enable_minus = 'on'; - Enable_plus = 'on'; - Enable_plus_BackgroundColor = [0 1 0]; - Enable_minus_BackgroundColor = [0 1 0]; - end -end -gui_erp.pageinfo_minus.Enable = Enable_minus; -gui_erp.pageinfo_plus.Enable = Enable_plus; -gui_erp.pageinfo_plus.ForegroundColor = Enable_plus_BackgroundColor; -gui_erp.pageinfo_minus.ForegroundColor = Enable_minus_BackgroundColor; -end - - diff --git a/studio_functions/Functions/EStudio/ERP Tab/f_spectral_analysis_advance.fig b/studio_functions/Functions/EStudio/ERP Tab/f_spectral_analysis_advance.fig deleted file mode 100755 index b1502ebb203f611be0b2214b90cc9679add94515..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24999 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. - -function varargout = f_spectral_analysis_advance(varargin) - -% Begin initialization code - DO NOT EDIT -gui_Singleton = 1; -gui_State = struct('gui_Name', mfilename, ... - 'gui_Singleton', gui_Singleton, ... - 'gui_OpeningFcn', @f_spectral_analysis_advance_OpeningFcn, ... - 'gui_OutputFcn', @f_spectral_analysis_advance_OutputFcn, ... - 'gui_LayoutFcn', [] , ... - 'gui_Callback', []); -if nargin && ischar(varargin{1}) - gui_State.gui_Callback = str2func(varargin{1}); -end - -if nargout - [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); -else - gui_mainfcn(gui_State, varargin{:}); -end -% End initialization code - DO NOT EDIT - -%-------------------------------------------------------------------------- -function f_spectral_analysis_advance_OpeningFcn(hObject, eventdata, handles, varargin) - -% Choose default command line output for f_spectral_analysis_advance -handles.output = []; -try - ERP = varargin{1}; -catch - ERP = []; - ERP = buildERPstruct([]); - ERP.xmin = 0; - ERP.xmax = 0; - ERP.nbin = 1; - ERP.nchan = 1; - -end -handles.ERP = ERP; - -try - def = varargin{2}; -catch - def = {1,[], [], [1 16], 1, 1,1,0}; -end - -bin_chan_label = def{1}; -BinArray = def{2}; -ChanArray = def{3}; -freqRange = def{4}; -Auto_freq = def{5}; -RowNum = def{6}; -ColumnNum = def{7}; - -listb = {''}; -nbin = ERP.nbin; % Total number of bins -try - for b=1:nbin - listb{b}= ['BIN' num2str(b) ' = ' ERP.bindescr{b} ]; - end -catch - listb = {}; -end - - -%%%set(handles.popupmenu_bins,'String', listb) -handles.listb = listb; -handles.indxlistb = BinArray; - - -nchan = ERP.nchan; % Total number of channels -if ~isfield(ERP.chanlocs,'labels') - for e=1:nchan - ERP.chanlocs(e).labels = ['Ch' num2str(e)]; - end -end -listch = {''}; -for ch =1:nchan - listch{ch} = [num2str(ch) ' = ' ERP.chanlocs(ch).labels ]; -end -handles.listch = listch; -handles.indxlistch = ChanArray; - -for Numofrow = 1:256 - FramString{Numofrow}= num2str(Numofrow); -end - -set(handles.popupmenu_row_num,'String',FramString); -set(handles.popupmenu_column_num,'String',FramString); - -set(handles.popupmenu_row_num,'Value',nchan); - -if bin_chan_label ==1 - set(handles.radiobutton_all_bin_chan,'Value',1); - set(handles.radiobutton_selected_bin_chan,'Value',0); - set(handles.radiobutton_Custom_bin_chan,'Value',0); - set(handles.pushbutton_browse_bin,'Enable','off'); - set(handles.pushbutton_browse_chan,'Enable','off'); - set(handles.edit_bin_custom,'String',num2str(vect2colon([1:ERP.nbin],'Sort', 'on'))); - set(handles.edit_channel_custom,'String',num2str(vect2colon([1:ERP.nchan],'Sort', 'on'))); -elseif bin_chan_label ==2 - set(handles.radiobutton_all_bin_chan,'Value',0); - set(handles.radiobutton_selected_bin_chan,'Value',1); - set(handles.radiobutton_Custom_bin_chan,'Value',0); - set(handles.pushbutton_browse_bin,'Enable','off'); - set(handles.pushbutton_browse_chan,'Enable','off'); - [chk, msgboxText] = chckbinandchan(ERP, BinArray, ChanArray); - if chk(1) - BinString = [1:ERP.nbin]; - else - BinString = BinArray; - end - if chk(2) - ChanString = [1:ERP.nchan]; - else - ChanString = ChanArray; - end - - set(handles.edit_bin_custom,'String',num2str(vect2colon(BinString,'Sort', 'on'))); - set(handles.edit_channel_custom,'String',num2str(vect2colon(ChanString,'Sort', 'on'))); - -elseif bin_chan_label ==3 - set(handles.radiobutton_all_bin_chan,'Value',0); - set(handles.radiobutton_selected_bin_chan,'Value',0); - set(handles.radiobutton_Custom_bin_chan,'Value',1); - set(handles.pushbutton_browse_bin,'Enable','on'); - set(handles.pushbutton_browse_chan,'Enable','on'); -else - set(handles.radiobutton_all_bin_chan,'Value',1); - set(handles.radiobutton_selected_bin_chan,'Value',0); - set(handles.radiobutton_Custom_bin_chan,'Value',0); - set(handles.pushbutton_browse_bin,'Enable','off'); - set(handles.pushbutton_browse_chan,'Enable','off'); - set(handles.edit_bin_custom,'String',num2str(vect2colon([1:ERP.nbin],'Sort', 'on'))); - set(handles.edit_channel_custom,'String',num2str(vect2colon([1:ERP.nchan],'Sort', 'on'))); -end -set(handles.checkbox_freq_ticks_auto,'Value',1); -set(handles.edit_freq_tick_auto,'Enable','off'); - -set(handles.edit_freq_range,'String',num2str(freqRange)); - - - -erplab_studio_default_values; -version = erplabstudiover; -set(handles.gui_chassis,'Name', ['EStudio',version,' - Plot and save spectrum for the selected ERP GUI ']) -handles = painterplabstudio(handles); -handles = setfonterplabestudio(handles); - -% helpbutton - -% -% Color GUI -% -% handles = painterplab(handles); - -% -% Set font size -% -% handles = setfonterplab(handles); - -% Update handles structure -guidata(hObject, handles); - -% help -% helpbutton - -% UIWAIT makes f_spectral_analysis_advance wait for user response (see UIRESUME) -uiwait(handles.gui_chassis); - -%-------------------------------------------------------------------------- -function varargout = f_spectral_analysis_advance_OutputFcn(hObject, eventdata, handles) - -% Get default command line output from handles structure -varargout{1} = handles.output; - -% The figure can be deleted now -delete(handles.gui_chassis); - -% --- Executes on button press in radiobutton_all_bin_chan. -function radiobutton_all_bin_chan_Callback(hObject, eventdata, handles) -set(handles.radiobutton_Custom_bin_chan,'Value',0); -set(handles.radiobutton_selected_bin_chan,'Value',0); -set(handles.radiobutton_all_bin_chan,'Value',1); -set(handles.pushbutton_browse_bin,'Enable','off'); -set(handles.pushbutton_browse_chan,'Enable','off'); -BinString = handles.ERP.nbin; -ChanString = handles.ERP.nchan; - -set(handles.edit_bin_custom,'String',num2str(vect2colon(1:BinString,'Sort', 'on'))); -set(handles.edit_channel_custom,'String',num2str(vect2colon(1:ChanString,'Sort', 'on'))); - -% --- Executes on button press in radiobutton_selected_bin_chan. -function radiobutton_selected_bin_chan_Callback(hObject, eventdata, handles) -set(handles.radiobutton_Custom_bin_chan,'Value',0); -set(handles.radiobutton_selected_bin_chan,'Value',1); -set(handles.radiobutton_all_bin_chan,'Value',0); -set(handles.pushbutton_browse_bin,'Enable','off'); -set(handles.pushbutton_browse_chan,'Enable','off'); - -ERP = handles.ERP; - -BinString = handles.indxlistb; -ChanString = handles.indxlistch; -if isempty(BinString) - BinString =[1:ERP.nbin]; -end -if isempty(ChanString) - ChanString =[1:ERP.nchan]; -end -[chk, msgboxText] = chckbinandchan(ERP, BinString, ChanString); -if chk(1) - BinString = 1:ERP.nbin; -end -if chk(2) - ChanString = 1:ERP.nchan; -end -set(handles.edit_bin_custom,'String',num2str(vect2colon(BinString,'Sort', 'on'))); -set(handles.edit_channel_custom,'String',num2str(vect2colon(ChanString,'Sort', 'on'))); - - -% --- Executes on button press in radiobutton_Custom_bin_chan. -function radiobutton_Custom_bin_chan_Callback(hObject, eventdata, handles) -set(handles.radiobutton_Custom_bin_chan,'Value',1); -set(handles.radiobutton_selected_bin_chan,'Value',0); -set(handles.radiobutton_all_bin_chan,'Value',0); -set(handles.pushbutton_browse_bin,'Enable','on'); -set(handles.pushbutton_browse_chan,'Enable','on'); - - -function edit_bin_custom_Callback(hObject, eventdata, handles) -BinString = str2num(handles.edit_bin_custom.String); -ERP = handles.ERP; -% [chk, msgboxText] = chckbinandchan(ERP, BinString, []); -[chk, msgboxText] = f_ERP_chckbinandchan(ERP, BinString, [],1); - -if chk(1) - title = 'EStudio: Spectral analysis GUI input'; - errorfound(msgboxText, title); - return; -end - - - -% --- Executes during object creation, after setting all properties. -function edit_bin_custom_CreateFcn(hObject, eventdata, handles) -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - - - -function edit_channel_custom_Callback(hObject, eventdata, handles) -ChanString = str2num(handles.edit_channel_custom.String); -ERP = handles.ERP; -[chk, msgboxText] = chckbinandchan(ERP, [], ChanString); - - -if chk(2) - title = 'EStudio: Spectral analysis GUI input'; - errorfound(msgboxText, title); - return; -end - -chanArray = ChanString; -ColumnNum = get(handles.popupmenu_column_num, 'Value'); -RowNum = ceil((numel(chanArray))/ColumnNum); -ColumnNum = ceil((numel(chanArray))/RowNum); -if RowNum<=0 - RowNum=1; -end -set(handles.popupmenu_row_num, 'Value', RowNum); -set(handles.popupmenu_column_num, 'Value', ColumnNum); - -% --- Executes during object creation, after setting all properties. -function edit_channel_custom_CreateFcn(hObject, eventdata, handles) -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - -%-------------------------------------------------------------------------- -function pushbutton_browse_bin_Callback(hObject, eventdata, handles) -listb = handles.listb; -indxlistb = handles.indxlistb; -indxlistb = indxlistb(indxlistb<=length(listb)); -titlename = 'Select Bin(s)'; - -if get(hObject, 'Value') - %set(handles.pushbutton_browsechan, 'Enable', 'off') - if ~isempty(listb) - bin = browsechanbinGUI(listb, indxlistb, titlename); - if ~isempty(bin) - set(handles.edit_bin_custom, 'String', vect2colon(bin, 'Delimiter', 'off')); - handles.indxlistb = bin; - % Update handles structure - guidata(hObject, handles); - else - disp('User selected Cancel') - return - end - else - msgboxText = 'No bin information was found'; - title = 'EStudio: Spectral analysis GUI input'; - errorfound(msgboxText, title); - return - end - -end - - - -% --- Executes on button press in pushbutton_browse_chan. -function pushbutton_browse_chan_Callback(hObject, eventdata, handles) -listch = handles.listch; -indxlistch = handles.indxlistch; -indxlistch = indxlistch(indxlistch<=length(listch)); -titlename = 'Select Channel(s)'; - -if get(hObject, 'Value') - if ~isempty(listch) - ch = browsechanbinGUI(listch, indxlistch, titlename); - if ~isempty(ch) - set(handles.edit_channel_custom, 'String', vect2colon(ch, 'Delimiter', 'off')); - handles.indxlistch = ch; - - chanArray = ch; - ColumnNum = get(handles.popupmenu_column_num, 'Value'); - RowNum = ceil((numel(chanArray))/ColumnNum); - if RowNum<=0 - RowNum=1; - end - set(handles.popupmenu_row_num, 'Value', RowNum); - - % Update handles structure - guidata(hObject, handles); - else - disp('User selected Cancel') - return - end - else - msgboxText = 'No channel information was found'; - title = 'EStudio: Spectral analysis GUI input'; - errorfound(msgboxText, title); - return - end -end - -%Freq. range [min max] in Hz -function edit_freq_range_Callback(hObject, eventdata, handles) -freqx = str2num(get(handles.edit_freq_range, 'String')); -if isempty(freqx) - msgboxText = 'Invalid input for frequency range of interest'; - title = 'EStudio: f_spectral_analysis_advance().'; - errorfound(msgboxText, title); - return -end -if length(freqx)~=2 - msgboxText = 'Please, enter two values'; - title = 'EStudio: f_spectral_analysis_advance().'; - errorfound(msgboxText, title); - return -end - - -if freqx(1)>= freqx(2) - msgboxText = 'The first value must be smaller than the second one!'; - title = 'EStudio: f_spectral_analysis_advance().'; - errorfound(msgboxText, title); - return -end -ERP = handles.ERP; -try - freq_half = ERP.srate/2; -catch - freq_half =freqx(2); -end - -if freqx(2)> freq_half - msgboxText = ['Second value must be smaller than',32,num2str(ERP.srate/2)]; - title = 'ERPLAB Studio: f_ERP_spectral_advance_GUI() error'; - errorfound(msgboxText, title); - return -end - -Auto_tick = get(handles.checkbox_freq_ticks_auto,'Value'); - -if ~Auto_tick - def_ticks = default_time_ticks(handles.ERP, freqx); - set(handles.edit_freq_tick_auto,'String',num2str(def_ticks{1})); -end - - -% --- Executes during object creation, after setting all properties. -function edit_freq_range_CreateFcn(hObject, eventdata, handles) -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - - - -% --- Executes on button press in checkbox_freq_ticks_auto. -function checkbox_freq_ticks_auto_Callback(hObject, eventdata, handles) -if get(hObject, 'Value') - set(handles.edit_freq_tick_auto,'Enable','off'); - set(handles.edit_freq_tick_auto,'String',''); -else - set(handles.edit_freq_tick_auto,'Enable','on'); - - freqx = str2num(get(handles.edit_freq_range, 'String')); % XL - if isempty(freqx) - msgboxText = 'Invalid input for frequency range of interest on "Freq. range [min max] in Hz"'; - title = 'EStudio: f_spectral_analysis_advance().'; - errorfound(msgboxText, title); - return - end - if length(freqx)~=2 - msgboxText = 'Please, enter two values on "Freq. range [min max] in Hz"'; - title = 'EStudio: f_spectral_analysis_advance().'; - errorfound(msgboxText, title); - return - end - - - if freqx(1)>= freqx(2) - msgboxText = 'The first value must be smaller than the second one on "Freq. range [min max] in Hz"'; - title = 'EStudio: f_spectral_analysis_advance().'; - errorfound(msgboxText, title); - return - end - if freqx(1)<0 - msgboxText = 'The first value must be larger than 0Hz on "Freq. range [min max] in Hz"'; - title = 'EStudio: f_spectral_analysis_advance().'; - errorfound(msgboxText, title); - return - end - - ERP = handles.ERP; - if freqx(2)> ERP.srate/2 - msgboxText = ['Second value must be smaller than',32,num2str(observe_ERPDAT.ERP.srate/2),'Hz',32,'on "Freq. range [min max] in Hz"']; - title = 'ERPLAB Studio: f_ERP_spectral_advance_GUI() error'; - errorfound(msgboxText, title); - return - end - - - def_ticks = default_time_ticks(handles.ERP, freqx); - if ~isempty(def_ticks) - set(handles.edit_freq_tick_auto,'String',num2str(def_ticks{1})); - end -end - - - - - -function edit_freq_tick_auto_Callback(hObject, eventdata, handles) -answer = get(handles.edit_freq_tick_auto,'String'); -nanswer = str2num(strtrim(char(answer))); -if isempty(nanswer) - msgboxText = 'Invalid range of values on freq. ticks!\n'; - title = 'ERPLAB Studio: f_ERP_spectral_advance_GUI() error'; - errorfound(sprintf(msgboxText), title); - return -end - - - - - - -% --- Executes during object creation, after setting all properties. -function edit_freq_tick_auto_CreateFcn(hObject, eventdata, handles) -% hObject handle to edit_freq_tick_auto (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles empty - handles not created until after all CreateFcns called - -% Hint: edit controls usually have a white background on Windows. -% See ISPC and COMPUTER. -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - - -% --- Executes on selection change in popupmenu_row_num. -function popupmenu_row_num_Callback(hObject, eventdata, handles) -chanArraystr = get(handles.edit_channel_custom, 'String'); -chanArray = str2num(chanArraystr); -if isempty(chanArray) - chanArray = [1:handles.ERP.nchan]; -end -RowNum= get(handles.popupmenu_row_num, 'Value'); -ColumnNum = ceil((numel(chanArray))/RowNum); -if ColumnNum<=0 - ColumnNum=1; -end -set(handles.popupmenu_column_num, 'Value', ColumnNum); - - -% --- Executes during object creation, after setting all properties. -function popupmenu_row_num_CreateFcn(hObject, eventdata, handles) -% hObject handle to popupmenu_row_num (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles empty - handles not created until after all CreateFcns called - -% Hint: popupmenu controls usually have a white background on Windows. -% See ISPC and COMPUTER. -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - - -% --- Executes on selection change in popupmenu_column_num. -function popupmenu_column_num_Callback(hObject, eventdata, handles) - -chanArraystr = get(handles.edit_channel_custom, 'String'); -chanArray = str2num(chanArraystr); - -if isempty(chanArray) - chanArray = [1:handles.ERP.nchan]; -end -ColumnNum = get(handles.popupmenu_column_num, 'Value'); -RowNum = ceil((numel(chanArray))/ColumnNum); -if RowNum<=0 - RowNum=1; -end -set(handles.popupmenu_row_num, 'Value', RowNum); - - -% --- Executes during object creation, after setting all properties. -function popupmenu_column_num_CreateFcn(hObject, eventdata, handles) -% hObject handle to popupmenu_column_num (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles empty - handles not created until after all CreateFcns called - -% Hint: popupmenu controls usually have a white background on Windows. -% See ISPC and COMPUTER. -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - - - - - -%-------------------------------------------------------------------------- -function pushbutton_cancel_Callback(hObject, eventdata, handles) - -handles.output = []; -disp('User selected Cancel'); -guidata(hObject, handles); -uiresume(handles.gui_chassis); - -% %-------------------------------------------------------------------------- -% function pushbutton_help_Callback(hObject, eventdata, handles) -% % doc pop_export2text -% web 'https://github.com/lucklab/erplab/wiki/Exporting,-Editing,-and-Importing-EVENTLISTS' -browser -%-------------------------------------------------------------------------- -function pushbutton_apply_Callback(hObject, eventdata, handles) - -BinArray = str2num(handles.edit_bin_custom.String); -ChanArray = str2num(handles.edit_channel_custom.String); -ERP = handles.ERP; -[chk, msgboxText] = chckbinandchan(ERP, BinArray, ChanArray); -if chk(1) - title = 'ERPLAB Studio: f_ERP_spectral_advance_GUI() error'; - errorfound(sprintf(msgboxText), title); - return; -end -if chk(2) - title = 'ERPLAB Studio: f_ERP_spectral_advance_GUI() error'; - errorfound(sprintf(msgboxText), title); - return; -end - - - -freqRange = str2num(get(handles.edit_freq_range, 'String')); % XL -if isempty(freqRange) - msgboxText = 'Invalid input for frequency range of interest on "Freq. range [min max] in Hz"'; - title = 'EStudio: f_spectral_analysis_advance().'; - errorfound(msgboxText, title); - return -end -if length(freqRange)~=2 - msgboxText = 'Please, enter two values on "Freq. range [min max] in Hz"'; - title = 'EStudio: f_spectral_analysis_advance().'; - errorfound(msgboxText, title); - return -end - - -if freqRange(1)>= freqRange(2) - msgboxText = 'The first value must be smaller than the second one on "Freq. range [min max] in Hz"'; - title = 'EStudio: f_spectral_analysis_advance().'; - errorfound(msgboxText, title); - return -end -if freqRange(1)<0 - msgboxText = 'The first value must be larger than 0Hz on "Freq. range [min max] in Hz"'; - title = 'EStudio: f_spectral_analysis_advance().'; - errorfound(msgboxText, title); - return -end - - -if freqRange(2)> ERP.srate/2 - msgboxText = ['Second value must be smaller than',32,num2str(observe_ERPDAT.ERP.srate/2),'Hz',32,'on "Freq. range [min max] in Hz"']; - title = 'ERPLAB Studio: f_ERP_spectral_advance_GUI() error'; - errorfound(msgboxText, title); - return -end - - - - -if handles.checkbox_freq_ticks_auto.Value - Auto_freq = []; -else - Auto_freq_String = handles.edit_freq_tick_auto.String; - Auto_freq = str2num(Auto_freq_String); -end - -RowNum = handles.popupmenu_row_num.Value; -ColumnNum = handles.popupmenu_column_num.Value; - -if handles.radiobutton_all_bin_chan.Value - bin_chan_label = 1; -elseif handles.radiobutton_selected_bin_chan.Value - bin_chan_label = 2; -elseif handles.radiobutton_Custom_bin_chan.Value - bin_chan_label = 3; -end - - -Save_label = handles.pushbutton_save.Value; - -answer = {bin_chan_label,BinArray, ChanArray,freqRange,Auto_freq,RowNum,ColumnNum,Save_label}; -handles.output = answer; - -% Update handles structure -guidata(hObject, handles); -uiresume(handles.gui_chassis); - - -% --- Executes on button press in pushbutton_save. -function pushbutton_save_Callback(hObject, eventdata, handles) -BinArray = str2num(handles.edit_bin_custom.String); -ChanArray = str2num(handles.edit_channel_custom.String); -ERP = handles.ERP; -[chk, msgboxText] = chckbinandchan(ERP, BinArray, ChanArray); -if chk(1) - title = 'ERPLAB Studio: f_ERP_spectral_advance_GUI() error'; - errorfound(sprintf(msgboxText), title); - return; -end -if chk(2) - title = 'ERPLAB Studio: f_ERP_spectral_advance_GUI() error'; - errorfound(sprintf(msgboxText), title); - return; -end - -freqRange = str2num(get(handles.edit_freq_range, 'String')); % XL -if isempty(freqRange) - msgboxText = 'Invalid input for frequency range of interest on "Freq. range [min max] in Hz"'; - title = 'EStudio: f_spectral_analysis_advance().'; - errorfound(msgboxText, title); - return -end -if length(freqRange)~=2 - msgboxText = 'Please, enter two values on "Freq. range [min max] in Hz"'; - title = 'EStudio: f_spectral_analysis_advance().'; - errorfound(msgboxText, title); - return -end - - -if freqRange(1)>= freqRange(2) - msgboxText = 'The first value must be smaller than the second one on "Freq. range [min max] in Hz"'; - title = 'EStudio: f_spectral_analysis_advance().'; - errorfound(msgboxText, title); - return -end -if freqRange(1)<0 - msgboxText = 'The first value must be larger than 0Hz on "Freq. range [min max] in Hz"'; - title = 'EStudio: f_spectral_analysis_advance().'; - errorfound(msgboxText, title); - return -end - - -if freqRange(2)> ERP.srate/2 - msgboxText = ['Second value must be smaller than',32,num2str(observe_ERPDAT.ERP.srate/2),'Hz',32,'on "Freq. range [min max] in Hz"']; - title = 'ERPLAB Studio: f_ERP_spectral_advance_GUI() error'; - errorfound(msgboxText, title); - return -end - - - - -if handles.checkbox_freq_ticks_auto.Value - Auto_freq = []; -else - Auto_freq_String = handles.edit_freq_tick_auto.String; - Auto_freq = str2num(Auto_freq_String); -end - -RowNum = handles.popupmenu_row_num.Value; -ColumnNum = handles.popupmenu_column_num.Value; - -if handles.radiobutton_all_bin_chan.Value - bin_chan_label = 1; -elseif handles.radiobutton_selected_bin_chan.Value - bin_chan_label = 2; -elseif handles.radiobutton_Custom_bin_chan.Value - bin_chan_label = 3; -end - - -Save_label = handles.pushbutton_save.Value; - -answer = {bin_chan_label,BinArray, ChanArray,freqRange,Auto_freq,RowNum,ColumnNum,Save_label}; -handles.output = answer; - -% Update handles structure -guidata(hObject, handles); -uiresume(handles.gui_chassis); - - - -%-------------------------------------------------------------------------- -function gui_chassis_CloseRequestFcn(hObject, eventdata, handles) -if isequal(get(handles.gui_chassis, 'waitstatus'), 'waiting') - handles.output = []; - %Update handles structure - guidata(hObject, handles); - uiresume(handles.gui_chassis); -else - % The GUI is no longer waiting, just close it - delete(handles.gui_chassis); -end - - - - - -function [chk, msgboxText] = chckbinandchan(ERP, binArray, chanArray) -chk=[0 0]; -msgboxText = ''; -if isempty(binArray) - msgboxText = 'You have not specified any bin'; - chk(1) = 1; - % return -end -if any(binArray<=0) - msgboxText = sprintf('Invalid bin index.\nPlease specify only positive integer values.'); - chk(1) = 1; - return -end -if any(binArray>ERP.nbin) - msgboxText = sprintf('Bin index out of range!\nYou only have %g bins in this ERPset',ERP.nbin); - chk(1) = 1; - return -end -if length(binArray)~=length(unique_bc2(binArray)) - msgboxText = 'You have specified repeated bins for plotting.'; - chk(1) = 1; - return -end -if isempty(chanArray) - msgboxText = 'You have not specified any channel'; - chk(2) = 1; - return -end -if any(chanArray<=0) - msgboxText = sprintf('Invalid channel index.\nPlease specify only positive integer values.'); - chk(2) = 1; - return -end -if any(chanArray>ERP.nchan) - msgboxText = sprintf('Channel index out of range!\nYou only have %g channels in this ERPset', ERP.nchan); - chk(2) = 1; - return -end -if length(chanArray)~=length(unique_bc2(chanArray)) - msgboxText = 'You have specified repeated channels for plotting.'; - chk(2) = 1; - return -end diff --git a/studio_functions/Functions/EStudio/ERP Tab/geterplabstudiodef.m b/studio_functions/Functions/EStudio/ERP Tab/geterplabstudiodef.m index 670920f5..f12a1a53 100755 --- a/studio_functions/Functions/EStudio/ERP Tab/geterplabstudiodef.m +++ b/studio_functions/Functions/EStudio/ERP Tab/geterplabstudiodef.m @@ -12,10 +12,10 @@ function [version reldate,ColorB_def,ColorF_def,errorColorF_def,ColorBviewer_def] = geterplabstudiodef -erplab_studio_default_values; -version = erplabstudiover; -reldate = erplabstudiorel; +erplab_default_values; +version = erplabver; +reldate = erplabrel; ColorB_def =ColorB; ColorF_def=ColorF; errorColorF_def = errorColorF; -ColorBviewer_def = ColorBviewer; \ No newline at end of file +ColorBviewer_def = [0.8 0.8 0.9]; \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/ERP Tab/mini_viewer.m b/studio_functions/Functions/EStudio/ERP Tab/mini_viewer.m deleted file mode 100755 index f94ce9db..00000000 --- a/studio_functions/Functions/EStudio/ERP Tab/mini_viewer.m +++ /dev/null @@ -1,434 +0,0 @@ -% -% We need a very fancy data structure system. We've got an array of our -% 'pages'. Each page is a structure. Each page has a property 'data'. In order to graph effectively it's 2 -% dimensional. It's a series of X by Y matrices compounded horizontally. -% Each column represents one line of data. Each 'chunk' (Length Y) -% represents one of three things: A bin, a channel, or an ERPset. If we -% were to look at one bin as a chunk, each column could either represent a -% channel or an ERPset. -% -% We can change to this system fairly easily. Replace 'nchan' with -% 'nlines', 'nbin' with 'nplots', etc. Then create a func to turn ERP -% structure into local data structure based on the 3 way intersection of -% channels, bins, and ERPsets. -% - -% [ 1 2 3 1 2 3 -% 1 2 3 1 2 3 -% 1 2 3 1 2 3 ] - -function varargout = mini_viewer(varargin) - parent = uiextras.Empty(); - boxpan = uiextras.Empty(); - inpd = []; - data = []; - olddata = []; - child_vs = {}; - floating = 0<1; - havedat = 0<1; - - % Lines, Plots, Pages - % 1 = Chans, 2 = Bins, 3 = ERPsets - ord = [2 1 3]; - - if nargin == 0 - havedat = 0>1; - elseif nargin == 1 - fig = figure( 'Name', 'ERP Explorer', ... - 'NumberTitle', 'off', ... - 'MenuBar', 'none', ... - 'Toolbar', 'none', ... - 'HandleVisibility', 'off'); - parent = fig; - data = cell2mat(varargin(1)); - else - data = cell2mat(varargin(1)); - parent = [varargin{2}]; - floating = 1<0; - end - erp_tabs = uiextras.TabPanel('Parent', parent, 'Padding', 5); - - olddata = data; - - data = erp2loc(data); - - data = data{:}; - - drawUI() - ret_v = struct('tabs', erp_tabs, 'data', olddata); - varargout{1} = ret_v; - - function drawUI() - - havedat = numel(data)>0; - - delete(erp_tabs.Children); - if havedat - tabnames = cell(size(data)); - tabs = zeros(size(data)); - [~,a] = size(data); - for i = 1:a - tabs(i) = uix.HBoxFlex( 'Parent', erp_tabs, 'Spacing', 10 ); - dat = data(i); - tabnames(i) = {dat.name}; - end - - erp_tabs.TabNames = tabnames; - erp_tabs.SelectedChild = 1; - erp_tabs.TabSize = 120; - for tabn = 1:numel(tabs) - TAB = tabs(tabn); - cdat = data(tabn); - hbox = uiextras.HBox('Parent', TAB); - boxpan = uiextras.BoxPanel('Parent', hbox); - [d1,d2,d3] = size(cdat.data); - plot_erp_data = cdat.data; -% for i = 1:cdat.nlin -% ndata = 1:cdat.nplot; -% for i_bin = 1:numel(ndata) -% el_shown = 1:cdat.nlin; -% -% plot_erp_data(:,(i_bin+((i-1)*numel(ndata)))) = cdat.data(el_shown(i),1:d2,d3)'; % + (i+1)*S.display_offset; -% end -% end - offset = (repmat(kron(1:cdat.nplot,ones(1,cdat.nlin)),[500 1])-1)*30; - plot_erp_data = plot_erp_data + offset; - drawERP(plot_erp_data,boxpan,cdat) - vpanels = uiextras.VBox('Parent', hbox); - dat_sel = uiextras.BoxPanel('Parent', vpanels,'Title','Data Selector'); - pl_ops = uiextras.BoxPanel('Parent', vpanels,'Title','Plotting Options'); - - % Data Selector - ds_vb = uiextras.VBox('Parent',dat_sel); - ds_grid = uiextras.Grid('Parent',ds_vb); - - uicontrol('Style','text','String','Chans','Parent',ds_grid); - cs = {cdat.channames}; - chan_sel = uicontrol('Style','listbox','Parent',ds_grid,'String',[{'ALL'}, cs{:}],'callback',@temp,'Max',2,'Min',0); - - uicontrol('Style','text','String','Bins','Parent',ds_grid); - bs = cdat.binnames; - bin_sel = uicontrol('Style','listbox','Parent',ds_grid,'String',[{'ALL'}, bs{:}],'callback',@temp,'Max',2,'Min',0); - - set( ds_grid, 'ColumnSizes', [-1 -1], 'RowSizes', [25, -1] ); - - b_c = uicontrol('Style','popupmenu','Parent',ds_vb,'String',{'Channels by Bins','Bins by Channels'},'callback',@temp); - - set( ds_vb, 'Sizes', [-1, 20] ); - - % Plotting Options - pl_grid = uiextras.Grid('Parent',pl_ops); - - tr_pn = uipanel('Parent',pl_grid); - uicontrol('Parent', tr_pn, 'Style','text','String','Range','Position',[0 0 65 25]); - uicontrol('Parent',pl_grid,'Style','text','String','Min'); - uicontrol('Parent',pl_grid,'Style','edit','String','0'); - uicontrol('Parent',pl_grid,'Style','text','String','Max'); - uicontrol('Parent',pl_grid,'Style','edit','String','1000'); - uiextras.Empty('Parent', pl_grid); - uiextras.Empty('Parent', pl_grid); - - tt_pn = uipanel('Parent',pl_grid); - uicontrol('Parent', tt_pn, 'Style','text','String','X Scale','Position',[0 0 65 25]); - uicontrol('Parent',pl_grid,'Style','text','String','Min'); - uicontrol('Parent',pl_grid,'Style','edit','String','0'); - uicontrol('Parent',pl_grid,'Style','text','String','Max'); - uicontrol('Parent',pl_grid,'Style','edit','String','1000'); - uicontrol('Parent',pl_grid,'Style','text','String','Step'); - uicontrol('Parent',pl_grid,'Style','edit','String','200'); - - mc_pn = uipanel('Parent',pl_grid); - uicontrol('Parent', mc_pn, 'Style','text','String','Misc.','Position',[0 0 65 25]); - uicontrol('Parent',pl_grid,'Style','text','String','a'); - uicontrol('Parent',pl_grid,'Style','text','String','a'); - uicontrol('Parent',pl_grid,'Style','text','String','a'); - uicontrol('Parent',pl_grid,'Style','text','String','a'); - - if floating - uicontrol('Parent',pl_grid,'Style','text','String','a'); - uicontrol('Parent',pl_grid,'Style','text','String','a'); - else - tn = tabn; - uicontrol('Parent',pl_grid,'Style','pushbutton','String','Detach','callback',{@detach,tabn}); - uicontrol('Parent',pl_grid,'Style','pushbutton','String','Retach','callback',@retach); - end - - set( pl_grid, 'ColumnSizes', [-1 -1 -1], 'RowSizes', [35 20 25 20 25 20 25] ); - - set( vpanels, 'Sizes', [-1 190] ); - set( hbox, 'Sizes', [-1 200] ); - end - else - empty_tab = uix.HBoxFlex( 'Parent', erp_tabs, 'Spacing', 10 ); - erp_tabs.TabNames = {'Empty'}; - erp_tabs.TabSize = 120; - erp_tabs.SelectedChild = 1; - - hbox = uiextras.HBox('Parent', empty_tab); - boxpan = uiextras.BoxPanel('Parent', hbox); - - vpanels = uiextras.VBox('Parent', hbox); - dat_sel = uiextras.BoxPanel('Parent', vpanels,'Title','Data Selector'); - pl_ops = uiextras.BoxPanel('Parent', vpanels,'Title','Plotting Options'); - - % Data Selector - ds_vb = uiextras.VBox('Parent',dat_sel); - ds_grid = uiextras.Grid('Parent',ds_vb); - - uicontrol('Style','text','String','Chans','Parent',ds_grid); - chan_sel = uicontrol('Style','listbox','Parent',ds_grid,'String',{'ALL'},'callback',@temp,'Max',2,'Min',0); - - uicontrol('Style','text','String','Bins','Parent',ds_grid); - bin_sel = uicontrol('Style','listbox','Parent',ds_grid,'String',{'ALL'},'callback',@temp,'Max',2,'Min',0); - - set( ds_grid, 'ColumnSizes', [-1 -1], 'RowSizes', [25, -1] ); - - b_c = uicontrol('Style','popupmenu','Parent',ds_vb,'String',{'Channels by Bins','Bins by Channels'},'callback',@temp); - - set( ds_vb, 'Sizes', [-1, 20] ); - - % Plotting Options - pl_grid = uiextras.Grid('Parent',pl_ops); - - tr_pn = uipanel('Parent',pl_grid); - uicontrol('Parent', tr_pn, 'Style','text','String','Range','Position',[0 0 65 25]); - uicontrol('Parent',pl_grid,'Style','text','String','Min'); - uicontrol('Parent',pl_grid,'Style','edit','String','0'); - uicontrol('Parent',pl_grid,'Style','text','String','Max'); - uicontrol('Parent',pl_grid,'Style','edit','String','1000'); - uiextras.Empty('Parent', pl_grid); - uiextras.Empty('Parent', pl_grid); - - tt_pn = uipanel('Parent',pl_grid); - uicontrol('Parent', tt_pn, 'Style','text','String','X Scale','Position',[0 0 65 25]); - uicontrol('Parent',pl_grid,'Style','text','String','Min'); - uicontrol('Parent',pl_grid,'Style','edit','String','0'); - uicontrol('Parent',pl_grid,'Style','text','String','Max'); - uicontrol('Parent',pl_grid,'Style','edit','String','1000'); - uicontrol('Parent',pl_grid,'Style','text','String','Step'); - uicontrol('Parent',pl_grid,'Style','edit','String','200'); - - mc_pn = uipanel('Parent',pl_grid); - uicontrol('Parent', mc_pn, 'Style','text','String','Misc.','Position',[0 0 65 25]); - uicontrol('Parent',pl_grid,'Style','text','String','a'); - uicontrol('Parent',pl_grid,'Style','text','String','a'); - uicontrol('Parent',pl_grid,'Style','text','String','a'); - uicontrol('Parent',pl_grid,'Style','text','String','a'); - uicontrol('Parent',pl_grid,'Style','pushbutton','String','Detach','callback',@temp); - uicontrol('Parent',pl_grid,'Style','pushbutton','String','Retach','callback',@retach); - - set( pl_grid, 'ColumnSizes', [-1 -1 -1], 'RowSizes', [35 20 25 20 25 20 25] ); - - set( vpanels, 'Sizes', [-1 190] ); - set( hbox, 'Sizes', [-1 200] ); - end - end - - function drawERP(dat,p,terp) - ax = axes('Parent',p,'Color','none','Box','on'); - %set( ax, 'XLim', [min max] ) - ts = terp.times; - [a,c,b] = size(dat); - new_erp_data = zeros(a,b*c); - for j = 1:b - new_erp_data(:,((c*(j-1))+1):(c*j)) = dat(:,:,j); - end - this_plot = plot(ax,ts,new_erp_data); - %boxpan - end - - function detach(~,~,tabn) - %tabn = erp_tabs.SelectedChild; - ddat = data(tabn); - data(tabn) = []; - drawUI(); - child_vs(end+1) = {mini_viewer(ddat)}; - end - - function retach(~,~) - for j = child_vs - j = [j{1}]; - data(end+1) = j.data; - delete(j.tabs.Parent); - end - drawUI(); - child_vs = {}; - end - - function loc = erp2loc(erps) - news = nan(size(erps)); - nerps = numel(erps); - - cs = [erps(1).chanlocs.urchan]; - bs = 1:numel(erps(1).bindescr); - es = {}; - [d1,d2,d3] = size(erps(1).bindata); - for i = erps - [td1,td2,td3] = size(i.bindata); - if td1>d1 - d1=td1; - end - if td2>d2 - d2=td2; - end - if td3>d3 - d3=td3; - end - end - ltdata = nan(d1,d2,d3,0); - for i = erps - for j = [i.chanlocs.urchan] - if ~ismember(j,cs) - cs(end+1) = j; - end - end - for j = 1:numel(i.bindescr) - if ~ismember(j,bs) - bs(end+1) = j; - end - end - es(end+1) = {i.erpname}; - t = i.bindata; - try - if t(d1,d2,d3) == 0 - beep; - end - catch - t(d1,d2,d3) = 0; - end - ltdata(:,:,:,end+1) = t; - end - - nbs = {}; - for i = 1:numel(bs) - tes = {}; - ttes = {}; - for j = 1:numel(erps) - if erps(j).nbin >= i - ttes(end+1) = {erps(j)}; - tes(end+1) = es(j); - end - end - - tcs = []; - for j = ttes - j1 = cell2mat(j); - for k = 1:j1.nchan - if ~ismember(k,tcs) - tcs(end+1) = k; - end - end - end - ttes1 = cell2mat(ttes(1)); - nbs(end+1) = {struct('e',{tes},'b',bs(i),'c',tcs,'n',cell2mat(ttes1.bindescr(i)))}; - end - - ncs = {}; - for i = 1:numel(cs) - tes = {}; - ttes = {}; - for j = 1:numel(erps) - if erps(j).nchan >= i - ttes(end+1) = {erps(j)}; - tes(end+1) = es(j); - end - end - - tbs = []; - for j = ttes - j1 = cell2mat(j); - for k = 1:j1.nbin - if ~ismember(k,tbs) - tbs(end+1) = k; - end - end - end - ttes1 = cell2mat(ttes(1)); - tlb = {ttes1.chanlocs.labels}; - ncs(end+1) = {struct('e',{tes},'b',tbs,'c',cs(i),'n',cell2mat(tlb(i)))}; - end - - nes = {}; - for i = 1:numel(es) - nes(end+1) = {struct('e',es(i),'b',1:erps(i).nbin,'c',1:erps(i).nchan,'n',es(i))}; - end - - % Take [chans bins erpsets] and apply a filter of [2 1 3] or - % something to create desired permutation such as [bins chans - % erpsets]. Now we have [lines plots pages]! - nar = [numel(cs) numel(bs) numel(es)]; - nop = nar(ord); - - ar = {cs bs es}; - op = nar(ord); - - dar = {ncs nbs nes}; - dop = dar(ord); - - s = cell(1,nop(3)); - - for i = 1:nop(3) - % Iterate through all pages here - - % Our data will be - % - % [ a1 a2 a3 b1 b2 b3 - % a1 a2 a3 b1 b2 b3 - % a1 a2 a3 b1 b2 b3 ] - % - - temp1 = dop(3); - temp = temp1{:}{i}; - - % WARN IF BIN OR CHAN DOES NOT EXIST FOR ERPSET - todata = ltdata(temp.c,:,temp.b,find(strcmp(es,temp.e))); - t_s = [0 0 0]; - t_s(ord) = [nop(1) nop(2) 1]; - t_ds_o = ones(1,4); - t_ds = zeros(1,4); - t_ds_o(1:numel(size(todata))) = size(todata); - t_ds(1:numel(size(todata))) = size(todata); - if t_s(1) ~= t_ds(1) - ss = t_ds_o; - ss(1) = t_s(1); - todata(ss(1),ss(2),ss(3),ss(4)) = 0; - end - if t_s(2) ~= t_ds(3) - ss = t_ds_o; - ss(3) = t_s(2); - todata(ss(1),ss(2),ss(3),ss(4)) = 0; - end - if t_s(3) ~= t_ds(4) - ss = t_ds_o; - ss(4) = t_s(3); - todata(ss(1),ss(2),ss(3),ss(4)) = 0; - end - - %if size(todata) ~= [ta tb tc ] - ntdata = reshape(todata,numel(erps(1).times),nop(1)*nop(2)); - - - referp = dop(3); - referp = [referp{:}]; - referp = referp{i}; - - nerp = erps(1); - for j = erps - if j.nbin > nerp.nbin - nerp = j; - end - end - - cl = {nerp.chanlocs.labels}; - - s(i) = {struct('nlin',nop(1),'nplot',nop(2),'data',ntdata,'name',temp.n,'channames',{cl(referp.c)},'binnames',{nerp.bindescr(referp.b)},'erpnames',{referp.e},'times',nerp.times)}; - clear cl nerp j temp1 t_s referp - end - - loc = s; - end - - function temp( src, ~ ) - beep; - end -end \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/ERP Tab/ms_to_sample.m b/studio_functions/Functions/EStudio/ERP Tab/ms_to_sample.m deleted file mode 100755 index 3657779d..00000000 --- a/studio_functions/Functions/EStudio/ERP Tab/ms_to_sample.m +++ /dev/null @@ -1,67 +0,0 @@ -% FORMAT: -% -% sampval = ms_to_sample(timems,fs,EpochStart, rounding) -% -% INPUTS: -% -% timems - time value in milliseconds -% fs - sampling rate -% -% Optional inputs: -% -% rounding - 1 means round the result {default}, 0 means do not round -% EpochStart - the left interval of epoch in ERP data (in milliseconds). Default 0 -% -% OUTPUT: -% -% sampval - time in samples -% -% EXAMPLES: -% -% 1) For a time serie recorded from 0 to 5 secs, at fs=500 sps, get the sample index at the time 674 ms. -% -%>> sampval = ms_to_sample(674, 500) -% -%sampval = -% -% 338 -% -% 2) For a time serie recorded from -1 to 5 secs, at fs=500 sps, get the sample index at the time 674 ms. -%>> sampval674 = ms_to_sample(674, 500, -1000) -% -%sampval_all = -% -% 838 -% -% -% Author: Guanghui ZHANG -% Center for Mind and Brain -% University of California, Davis, -% Davis, CA -% 2022 - -function sampval = ms_to_sample(timems,fs,offset) -if nargin<1 - help ms_to_sample - return -end -% if nargin<4 -% rounding = 3; -% end -if nargin<3 - offset = 0; -end -if nargin<2 - error('Two inputs are requiered at least.') -% return; -end - -if timems < offset - beep; - error('Input time shoule be larger than offset!!!') -% return; -end - -% offset = round(offset/50)*50; - -sampval = round((timems-offset)*fs/1000)+1; \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/ERP Tab/pop_ERP_spectralanalysis.m b/studio_functions/Functions/EStudio/ERP Tab/pop_ERP_spectralanalysis.m new file mode 100644 index 00000000..33520a7d --- /dev/null +++ b/studio_functions/Functions/EStudio/ERP Tab/pop_ERP_spectralanalysis.m @@ -0,0 +1,420 @@ +% *** This function is part of ERPLAB Toolbox *** +% Author: Guanghui +% Center for Mind and Brain +% University of California, Davis, +% Davis, CA +% 2024 + +%b8d3721ed219e65100184c6b95db209bb8d3721ed219e65100184c6b95db209b +% +% ERPLAB Studio Toolbox +% Copyright © 2007 The Regents of the University of California +% Created by Javier Lopez-Calderon and Steven Luck +% Center for Mind and Brain, University of California, Davis, +% javlopez@ucdavis.edu, sjluck@ucdavis.edu +% +% This program is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program. If not, see . + +function [ERP, erpcom] = pop_ERP_spectralanalysis(ERP, varargin) +erpcom = ''; +if nargin < 1 + help pop_ERP_spectralanalysis + return +end +if isfield(ERP(1), 'datatype') + datatype = ERP.datatype; +else + datatype = 'ERP'; +end +if nargin==1 + title_msg = 'ERPLAB: pop_ERP_spectralanalysis() error:'; + if isempty(ERP) + ERP = preloadERP; + if isempty(ERP) + msgboxText = 'No ERPset was found!'; + + errorfound(msgboxText, title_msg); + return + end + end + if isempty(ERP.bindata) + msgboxText = 'cannot work with an empty ERP erpset'; + errorfound(msgboxText, title_msg); + return + end + if ~strcmpi(datatype, 'ERP') + msgboxText = 'This ERPset is already converted into frequency domain!'; + errorfound(msgboxText, title_msg); + return + end + + % + % FFT points will be as much as needed + % to get 1 point each 0.25 Hz, at least. + % Users can change this value using scripting. Jav + % + def = estudioworkingmemory('pop_ERP_spectralanalysis'); + if isempty(def) + def = {1,1,[0,floor(ERP.srate/2)],ERP.srate}; + + end + + app = feval('ERP_spectral_analysis_GUI.mlapp',def{1},def{2},def{3},def{4},ERP); + waitfor(app,'Finishbutton',1); + try + def = app.Output; %NO you don't want to output EEG with edited channel locations, you want to output the parameters to run decoding + app.delete; %delete app from view + pause(0.1); %wait for app to leave + catch + return; + end + if isempty(def) + return; + end + Amptypev = def{1}; + if Amptypev==2 + Amptype = 'phase'; + elseif Amptypev==3 + Amptype = 'power'; + elseif Amptypev==4 + Amptype = 'db'; + else + Amptype = 'amp'; + end + + if def{2}==1 + TaperWindow = 'on'; + else + TaperWindow = 'off'; + end + estudioworkingmemory('pop_ERP_spectralanalysis',def); + freqrange = def{3}; + if isempty(freqrange) || numel(freqrange)~=2 || any(freqrange(:)>floor(ERP.srate/2)) || any(freqrange(:)<0) + freqrange = [0 floor(ERP.srate/2)]; + end + + ChanArray = def{6}; + if isempty(ChanArray) || any(ChanArray(:)>ERP.nchan) || any(ChanArray(:)<1) + ChanArray = [1:ERP.nchan]; + end + BinArray = def{5}; + if isempty(BinArray) || any(BinArray(:)>ERP.nbin) || any(BinArray(:)<1) + BinArray = 1:ERP.nbin; + end + + erpcom = pop_ERP_spectralanalysis(ERP, 'Amptype',Amptype,'TaperWindow',TaperWindow,... + 'freqrange',freqrange,'BinArray',BinArray,'ChanArray',ChanArray,'Plotwave','on',... + 'Saveas', 'off','History','gui'); + return +end + + +% +% Parsing inputs +% +p = inputParser; +p.FunctionName = mfilename; +p.CaseSensitive = false; +p.addRequired('ERP'); +% option(s) +p.addParamValue('TaperWindow', 'on', @ischar); % 'ERP': compute the average of epochs per bin; +p.addParamValue('Amptype', 'amp', @ischar); +p.addParamValue('freqrange', [], @isnumeric); +p.addParamValue('BinArray', [], @isnumeric); +p.addParamValue('ChanArray', [], @isnumeric); +p.addParamValue('Plotwave', 'on', @ischar); +p.addParamValue('Saveas', 'off', @ischar); % 'on', 'off' +p.addParamValue('Warning', 'off', @ischar); +p.addParamValue('History', 'script', @ischar); % history from scripting + +p.parse(ERP, varargin{:}); + +if iseegstruct(ERP) + if length(ERP)>1 + msgboxText = 'ERPLAB says: Unfortunately, this function does not work with multiple ERPsets'; + error(msgboxText); + end +end + + +% NFFT, iswindowed +if strcmpi(p.Results.TaperWindow,'off') + iswindowed = 0; +elseif strcmpi(p.Results.TaperWindow,'on') + iswindowed = 1; +else + if ~isempty(p.Results.TaperWindow) && ischar(p.Results.TaperWindow) + iswindowed = p.Results.TaperWindow; + else + error('Unknow value for "TaperWindow"') + end +end + +if ismember_bc2({p.Results.Saveas}, {'on','yes'}) + issaveas = 1; +elseif ismember_bc2({p.Results.Saveas}, {'csv'}) + issaveas = 2; +else + issaveas = 0; +end + +ERP = f_getFFTfromERP(ERP,iswindowed); + +%%--------------------------------display type----------------------------- +Amptype = p.Results.Amptype; +if strcmpi(Amptype,'phase') + ERP.bindata = angle(ERP.bindata); + figure_name = ['Spectral analysis - Phase for ',32,ERP.erpname]; +elseif strcmpi(Amptype,'power') + ERP.bindata = abs(ERP.bindata).^2; + figure_name = ['Spectral analysis - Power for ',32,ERP.erpname]; +elseif strcmpi(Amptype,'db') + ERP.bindata = 20*log10(abs(ERP.bindata)); + figure_name = ['Spectral analysis - dB for ',32,ERP.erpname]; +else + ERP.bindata = abs(ERP.bindata); + figure_name = ['Spectral analysis - Amplitude for ',32,ERP.erpname]; +end + + +freqrange = p.Results.freqrange; + +if isempty(freqrange) || numel(freqrange)~=2 || any(freqrange(:)>floor(ERP.srate/2)) || any(freqrange(:)<0) + freqrange = [0 floor(ERP.srate/2)]; +end + +%% +ChanArray = p.Results.ChanArray; +if isempty(ChanArray) || any(ChanArray(:)>ERP.nchan) || any(ChanArray(:)<1) + ChanArray = [1:ERP.nchan]; +end + +%% +BinArray = p.Results.BinArray; +if isempty(BinArray) || any(BinArray(:)>ERP.nbin) || any(BinArray(:)<1) + BinArray = 1:ERP.nbin; +end + + +[xxx, latsamp, latdiffms] = closest(ERP.times, freqrange); +tmin = latsamp(1); +tmax = latsamp(2); +ERP.bindata = ERP.bindata(ChanArray,tmin:tmax,BinArray); +ERP.nbin = numel(BinArray); +ERP.bindescr = ERP.bindescr(BinArray); +ERP.times = ERP.times(tmin:tmax); +ERP.nchan =numel(ChanArray); +ERP.chanlocs = ERP.chanlocs(ChanArray); + +if strcmpi(p.Results.Plotwave,'on') + fig = figure('Name',figure_name); + % set(fig,'outerposition',get(0,'screensize')); + + FonsizeDefault = f_get_default_fontsize(); + FreqTick = default_time_ticks(ERP, freqrange); + FreqTick = str2num(FreqTick{1}); + pbox = f_getrow_columnautowaveplot(ChanArray); + try + RowNum = pbox(1)+1; + ColumnNum = pbox(2); + catch + RowNum = numel(ChanArray)+1; + ColumnNum = 1; + end + count = 0; + for Numofcolumn = 1:ColumnNum + for Numofrow = 1:RowNum + count = count+1; + if ColumnNum*RowNum<5 + pause(1); + end + if count>ERP.nchan + break; + end + p_ax = subplot(RowNum,ColumnNum,count); + set(gca,'fontsize',FonsizeDefault); + hold on; + temp = squeeze(ERP.bindata); + for Numofplot = 1:ERP.nbin + h_p(Numofplot) = plot(p_ax,ERP.times,squeeze(ERP.bindata(count,:,Numofplot)),'LineWidth',1); + end + axis(p_ax,[floor(ERP.times(1)),ceil(ERP.times(end)), 1.1*min(temp(:)) 1.1*max(temp(:))]); + xticks(p_ax,FreqTick); + if count == 1 + title(p_ax,char(strrep(ERP.chanlocs(count).labels,'_','\_')),'FontSize',FonsizeDefault,'FontWeight','normal','Color','k','Interpreter','none'); %#ok<*NODEF> + else + title(p_ax,ERP.chanlocs(count).labels,'FontSize',FonsizeDefault,'FontWeight','normal','Color','k','Interpreter','none'); + end + xlabel(p_ax,'Frequency/Hz','FontSize',FonsizeDefault,'FontWeight','normal','Color','k'); + + if strcmpi(Amptype,'phase') + ylabel(p_ax,'Angle/degree','FontSize',FonsizeDefault,'FontWeight','normal','Color','k'); + elseif strcmpi(Amptype,'power') + ylabel(p_ax,'Power/\muV^2','FontSize',FonsizeDefault,'FontWeight','normal','Color','k'); + elseif strcmpi(Amptype,'db') + ylabel(p_ax,'Decibels/dB','FontSize',FonsizeDefault,'FontWeight','normal','Color','k'); + else + ylabel(p_ax,'Amplitude/\muV','FontSize',FonsizeDefault,'FontWeight','normal','Color','k'); + end + + for NUmoflabel = 1:length(ERP.times) + X_label{NUmoflabel} = []; + end + set(gca,'TickDir','out'); + set(gca,'LineWidth',1); + set(gca,'Color','w',... + 'XColor','k',... + 'YColor','k',... + 'ZColor','k'); + end + end + sh = subplot(RowNum+1, ColumnNum,[RowNum*ColumnNum+1:(RowNum+1)*ColumnNum],'align'); + axis(sh,'off'); + pos = get(sh,'position'); + h_legend = legend(sh,h_p,ERP.bindescr); + legend(sh,'boxoff'); + set(h_legend, 'position', pos); + qlegcolumns = ceil(sqrt(length(ERP.bindescr))); + set(h_legend,'NumColumns',qlegcolumns); + set(h_legend,'FontSize',FonsizeDefault); + set(fig,'Color','w'); +end + + + +if strcmpi(p.Results.History,'implicit') + shist = 3; % implicit +elseif strcmpi(p.Results.History,'script') + shist = 2; % script +elseif strcmpi(p.Results.History,'gui') + shist = 1; % gui +else + shist = 0; % off +end + +% +% subroutine +% + +% +% History +% +skipfields = {'ERP', 'History'}; +fn = fieldnames(p.Results); +erpcom = sprintf('%s = pop_ERP_spectralanalysis( %s ', inputname(1), inputname(1)); + +for q=1:length(fn) + fn2com = fn{q}; + if ~ismember_bc2(fn2com, skipfields) + fn2res = p.Results.(fn2com); + if ~isempty(fn2res) + if ischar(fn2res) + if ~strcmpi(fn2res,'off') + erpcom = sprintf( '%s, ''%s'', ''%s''', erpcom, fn2com, fn2res); + end + else + if iscell(fn2res) + if ischar([fn2res{:}]) + fn2resstr = sprintf('''%s'' ', fn2res{:}); + else + fn2resstr = vect2colon(cell2mat(fn2res), 'Sort','on'); + end + fnformat = '{%s}'; + else + fn2resstr = vect2colon(fn2res, 'Sort','on'); + fnformat = '%s'; + end + + erpcom = sprintf( ['%s, ''%s'', ' fnformat], erpcom, fn2com, fn2resstr); + end + end + end +end +erpcom = sprintf( '%s );', erpcom); + +% +% Save ERPset +% +if issaveas==1 + [ERP, issave, erpcom_save] = pop_savemyerp(ERP,'gui','erplab', 'History', 'implicit'); + if issave>0 + if issave==2 + erpcom = sprintf('%s\n%s', erpcom, erpcom_save); + msgwrng = '*** Your ERPset was saved on your hard drive.***'; + else + msgwrng = '*** Warning: Your ERPset was only saved on the workspace.***'; + end + else + msgwrng = 'ERPLAB Warning: Your changes were not saved'; + end + try cprintf([1 0.52 0.2], '%s\n\n', msgwrng); catch,fprintf('%s\n\n', msgwrng);end ; + +elseif issaveas==2 + def = estudioworkingmemory('f_export2csvGUI'); + if isempty(def) + def = {1, 1, 1, 3, ''}; + end + ERPtooltype = erpgettoolversion('tooltype'); + if strcmpi(ERPtooltype,'estudio') + pathName = estudioworkingmemory('EEG_save_folder'); + if isempty(pathName) + pathName =[pwd,filesep]; + end + else + pathName = [pwd,filesep]; + end + def{5} = fullfile(pathName,ERP.filename); + answer_export = f_export2csvGUI(ERP,def); + estudioworkingmemory('f_export2csvGUI',answer_export); + if isempty(answer_export) + return; + end + BinArray = [1:ERP.nbin]; + decimal_num = answer_export{4}; + istime =answer_export{1} ; + electrodes=answer_export{2} ; + transpose=answer_export{3}; + filenamei = answer_export{5}; + [pathx, filename, ext] = fileparts(filenamei); + ext = '.csv'; + if isempty(pathx) + pathx =cd; + end + filename = [filename ext]; + mkdir([pathx,filesep]); + try + export2csv_spectranl_analysis(ERP,fullfile(pathx,filename), BinArray,istime, electrodes,transpose, decimal_num); + catch + disp('Fail to save selected ERPset as ".csv"!!!'); + end + +end +% get history from script. ERP +switch shist + case 1 % from GUI + displayEquiComERP(erpcom); + case 2 % from script + ERP = erphistory(ERP, [], erpcom, 1); + case 3 + % implicit + otherwise %off or none + erpcom = ''; + return +end + +% +% Completion statement +% +msg2end +return \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/ERP Tab/pop_duplicaterp.m b/studio_functions/Functions/EStudio/ERP Tab/pop_duplicaterp.m new file mode 100644 index 00000000..11c7f150 --- /dev/null +++ b/studio_functions/Functions/EStudio/ERP Tab/pop_duplicaterp.m @@ -0,0 +1,225 @@ +% PURPOSE: pop_duplicaterp.m +% duplicate ERPset +% + +% FORMAT: +% [ERP, erpcom] = pop_duplicaterp( ERP, 'ChanArray',ChanArray, 'BinArray',BinArray,... +% 'Saveas', 'off', 'History', 'gui'); + +% Inputs: +% +%ERP -ERP structure +%ChanArray -index(es) of channels +%BinArray -index(es) of bins + + + +% *** This function is part of ERPLAB Studio *** +% Author: Guanghui Zhang & Steven Luck +% ghzhang@ucdavis.edu, sjluck@ucdavis.edu +% Center for Mind and Brain +% University of California, Davis, +% Davis, CA +% Dec. 2024 + + + + +function [ERP, erpcom] = pop_duplicaterp(ERP, varargin) +erpcom = ''; + +if nargin < 1 + help pop_duplicaterp + return +end +if isempty(ERP) + msgboxText = 'Cannot duplicate an empty erpset'; + title = 'ERPLAB: pop_duplicaterp() error'; + errorfound(msgboxText, title); + return +end +if isempty(ERP(1).bindata) + msgboxText = 'Cannot duplicate an empty erpset'; + title = 'ERPLAB: pop_duplicaterp() error'; + errorfound(msgboxText, title); + return +end + +datatype = checkdatatype(ERP(1)); +if ~strcmpi(datatype, 'ERP') + msgboxText = 'Cannot duplicate Power Spectrum waveforms!'; + title = 'ERPLAB: pop_duplicaterp() error'; + errorfound(msgboxText, title); + return +end + +if length(ERP)>1 + msgboxText = 'Cannot duplicate multiple ERPsets!'; + title = 'ERPLAB: pop_duplicaterp() error'; + errorfound(msgboxText, title); + return +end +if nargin==1 + + def = erpworkingmemory('pop_duplicaterp'); + if isempty(def) + def = {[],[]}; + end + BinArray = def{1}; + ChanArray =def{2}; + + def = f_ERP_duplicate(ERP,BinArray,ChanArray); + if isempty(def) + return; + end + ChanArray = def{2}; + BinArray = def{1}; + erpworkingmemory('pop_duplicaterp',def); + % + % Somersault + % + [ERP, erpcom] = pop_duplicaterp( ERP, 'ChanArray',ChanArray, 'BinArray',BinArray,... + 'Saveas', 'off', 'History', 'gui'); + return +end + +% +% Parsing inputs +% +p = inputParser; +p.FunctionName = mfilename; +p.CaseSensitive = false; +p.addRequired('ERP'); +% option(s) +p.addParamValue('ChanArray', [],@isnumeric); +p.addParamValue('BinArray', [], @isnumeric); +p.addParamValue('Saveas', 'off', @ischar); +p.addParamValue('History', 'script', @ischar); % history from scripting + +p.parse(ERP, varargin{:}); + +ChanArray = p.Results.ChanArray; +if isempty(ChanArray) || any(ChanArray(:)>ERP.nchan) || any(ChanArray(:)<=0) + ChanArray = [1:ERP.nchan]; +end + +BinArray= p.Results.BinArray; +BinArray = unique(BinArray); +if isempty(BinArray) || any(BinArray(:)>ERP.nbin) || any(BinArray(:)<=0) + BinArray = [1:ERP.nbin]; +end + + +ERP.bindata = ERP.bindata(ChanArray,:,BinArray); +if ~isempty(ERP.binerror) + ERP.binerror = ERP.binerror(ChanArray,:,BinArray); +end +try + ERP.ntrials.accepted = ERP.ntrials.accepted(BinArray); + ERP.ntrials.rejected = ERP.ntrials.rejected(BinArray); + ERP.ntrials.invalid = ERP.ntrials.invalid(BinArray); + ERP.ntrials.arflags = ERP.ntrials.arflags(BinArray,:); +catch +end +ERP.nbin = numel(BinArray); +ERP.nchan = numel(ChanArray); +ERP.chanlocs = ERP.chanlocs(ChanArray); +for Numofbin = 1:numel(BinArray) + Bindescr{Numofbin} = ERP.bindescr{BinArray(Numofbin)}; +end +ERP.bindescr = Bindescr; + +%%---------------------empty eventlist------------------------------------- +ERP.EVENTLIST = []; + +%%---------------------dataquality----------------------------------------- +try + for ii = 1:3 + if ~isempty( ERP.dataquality(ii).data) + ERP.dataquality(ii).data = ERP.dataquality(ii).data(ChanArray,:,BinArray); + end + end +catch +end + +if strcmpi(p.Results.Saveas,'on') + issaveas = 1; +else + issaveas = 0; +end +if strcmpi(p.Results.History,'implicit') + shist = 3; % implicit +elseif strcmpi(p.Results.History,'script') + shist = 2; % script +elseif strcmpi(p.Results.History,'gui') + shist = 1; % gui +else + shist = 0; % off +end + + +ERP.saved = 'no'; + +% +% History +% + +skipfields = {'ERP', 'Saveas','History'}; +fn = fieldnames(p.Results); +erpcom = sprintf( '%s = pop_duplicaterp( %s ', inputname(1), inputname(1) ); +for q=1:length(fn) + fn2com = fn{q}; + if ~ismember_bc2(fn2com, skipfields) + fn2res = p.Results.(fn2com); + if ~isempty(fn2res) + if ischar(fn2res) + if ~strcmpi(fn2res,'off') + erpcom = sprintf( '%s, ''%s'', ''%s''', erpcom, fn2com, fn2res); + end + else + if iscell(fn2res) + if ischar([fn2res{:}]) + fn2resstr = sprintf('''%s'' ', fn2res{:}); + else + fn2resstr = vect2colon(cell2mat(fn2res), 'Sort','on'); + end + fnformat = '{%s}'; + else + fn2resstr = vect2colon(fn2res, 'Sort','on'); + fnformat = '%s'; + end + if strcmpi(fn2com,'Criterion') + if p.Results.Criterion<100 + erpcom = sprintf( ['%s, ''%s'', ' fnformat], erpcom, fn2com, fn2resstr); + end + else + erpcom = sprintf( ['%s, ''%s'', ' fnformat], erpcom, fn2com, fn2resstr); + end + end + end + end +end +erpcom = sprintf( '%s );', erpcom); + +% +% Save ERPset from GUI +% +if issaveas + [ERP, issave, erpcom_save] = pop_savemyerp(ERP,'gui','erplab', 'History', 'off'); +end + + + +% get history from script. ERP +switch shist + case 1 % from GUI + displayEquiComERP(erpcom); + case 2 % from script + ERP = erphistory(ERP, [], erpcom, 1); + case 3 + % implicit + otherwise %off or none + erpcom = ''; + return +end +return \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/ERP Tab/pop_erp_ar_summary.m b/studio_functions/Functions/EStudio/ERP Tab/pop_erp_ar_summary.m new file mode 100644 index 00000000..c37707aa --- /dev/null +++ b/studio_functions/Functions/EStudio/ERP Tab/pop_erp_ar_summary.m @@ -0,0 +1,66 @@ +%%This function is to display the summary of trial information +% +% FORMAT : +% +% pop_erp_ar_summary(ALLERP,ERPArray); +% +% ALLERP - structure array of EEG structures +% ERPArray -index of erpsets +%EEGNames -EEGset names + + + +% *** This function is part of ERPLAB Studio Toolbox *** +% Author: Guanghui Zhang & Steven Luck +% Center for Mind and Brain +% University of California, Davis, +% Davis, CA +% Apr. 2024 + + + +function erpcom = pop_erp_ar_summary(ALLERP,ERPArray,EEGNames) + +erpcom = ''; +if nargin < 1 || nargin >3 + help pop_erp_ar_summary + return +end +if nargin < 2 + ERPArray = [1:length(ALLERP)]; +end +if isempty(ALLERP) + msgboxText = ['ALLERP is empty.']; + title = 'ERPLAB Studio: pop_erp_ar_summary() inputs'; + errorfound(sprintf(msgboxText), title); + return +end + +if isempty(ERPArray) || any(ERPArray(:)>length(ALLERP)) || any(ERPArray(:)<1) + ERPArray = [1:length(ALLERP)]; +end + +if nargin < 3 + EEGNames = ''; +end + + +if ~isempty(ERPArray) + app = feval('dq_trial_rejection',ALLERP,ERPArray,EEGNames); +% waitfor(app,'Finishbutton',1); +end +ERPArraystr= vect2colon(ERPArray); +if ~isempty(EEGNames) + erpcom = sprintf('erpcom = pop_erp_ar_summary(ALLERP,%s',ERPArraystr); + + nn = length(EEGNames); + erpcom = sprintf( '%s, {''%s'' ', erpcom, EEGNames{1}); + for ff=2:nn + erpcom = sprintf( '%s, ''%s'' ', erpcom, EEGNames{ff}); + end + erpcom = sprintf( '%s});', erpcom); + +else + erpcom = sprintf('erpcom = pop_erp_ar_summary(ALLERP,%s);',ERPArraystr); +end +end \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/ERP Tab/pop_erp_eventlist_view.m b/studio_functions/Functions/EStudio/ERP Tab/pop_erp_eventlist_view.m new file mode 100644 index 00000000..2fe11775 --- /dev/null +++ b/studio_functions/Functions/EStudio/ERP Tab/pop_erp_eventlist_view.m @@ -0,0 +1,166 @@ +% PURPOSE: pop_erp_eventlist_view.m +% display eventlist + +% FORMAT: +% [ALLERP, erpcom] = pop_erp_eventlist_view( ALLERP, 'ERPArray',ERPArray,... +% 'Saveas', 'off', 'History', 'gui'); + +% Inputs: +% +%ALLERP -ALLERP structure +%ERPArray -index(es) of eegsets + + + +% *** This function is part of ALLERPLAB Studio *** +% Author: Guanghui Zhang & Steven Luck +% ghzhang@ucdavis.edu, sjluck@ucdavis.edu +% Center for Mind and Brain +% University of California, Davis, +% Davis, CA +% May 2024 + + + + +function [ALLERP, erpcom] = pop_erp_eventlist_view(ALLERP, varargin) +erpcom = ''; + +if nargin < 1 + help pop_erp_eventlist_view + return +end +if isempty(ALLERP) + msgboxText = 'Cannot handle an empty EEGset'; + title = 'ERPLAB: pop_erp_eventlist_view() error'; + errorfound(msgboxText, title); + return +end +if isempty(ALLERP(1)) + msgboxText = 'Cannot handle an empty EEGset'; + title = 'ERPLAB: pop_erp_eventlist_view() error'; + errorfound(msgboxText, title); + return +end + + + +if nargin==1 + ERPArray = [1:length(ALLERP)]; + [ALLERP, erpcom] = pop_erp_eventlist_view( ALLERP, 'ERPArray',ERPArray,... + 'Saveas', 'off', 'History', 'gui'); + return +end + +% +% Parsing inputs +% +p = inputParser; +p.FunctionName = mfilename; +p.CaseSensitive = false; +p.addRequired('ALLERP'); +% option(s) +p.addParamValue('ERPArray', [],@isnumeric); +p.addParamValue('Saveas', 'off', @ischar); +p.addParamValue('History', 'script', @ischar); % history from scripting + +p.parse(ALLERP, varargin{:}); + + +ERPArray = p.Results.ERPArray; + +if isempty(ERPArray) || any(ERPArray(:)>length(ALLERP)) || any(ERPArray(:)<1) + ERPArray = [1:length(ALLERP)]; +end + + +feval("ERP_evenlist_gui",ALLERP(ERPArray)); + + +if strcmpi(p.Results.Saveas,'on') + issaveas = 1; +else + issaveas = 0; +end +if strcmpi(p.Results.History,'implicit') + shist = 3; % implicit +elseif strcmpi(p.Results.History,'script') + shist = 2; % script +elseif strcmpi(p.Results.History,'gui') + shist = 1; % gui +else + shist = 0; % off +end + + + + +% +% History +% + +skipfields = {'ALLERP', 'Saveas','History'}; +fn = fieldnames(p.Results); +erpcom = sprintf( '%s = pop_erp_eventlist_view( %s ', inputname(1), inputname(1) ); +for q=1:length(fn) + fn2com = fn{q}; + if ~ismember_bc2(fn2com, skipfields) + fn2res = p.Results.(fn2com); + if ~isempty(fn2res) + if ischar(fn2res) + if ~strcmpi(fn2res,'off') && ~strcmpi(fn2res,'no') + erpcom = sprintf( '%s, ''%s'', ''%s''', erpcom, fn2com, fn2res); + end + else + erpcom = sprintf( '%s, ''%s'', %s', erpcom, fn2com, vect2colon(fn2res,'Repeat','on')); + end + end + end +end +erpcom = sprintf( '%s );', erpcom); + +% +% Save ALLERPset from GUI +% +if issaveas + for ii = 1:length(ALLERP) + ERP = ALLERP(ii); + [ERP, issave, erpcom_save] = pop_savemyerp(ERP,'gui','erplab', 'History', 'off'); + if issave>0 + % erpcom = sprintf( '%s = pop_filterp( %s, %s, %s, %s, %s, ''%s'', %s);', inputname(1), inputname(1),... + % chanArraystr, num2str(locutoff), num2str(hicutoff),... + % num2str(filterorder), lower(fdesign), num2str(remove_dc)); + % erpcom = sprintf('%s\n%s', erpcom, erpcom_save); + if issave==2 + erpcom = sprintf('%s\n%s', erpcom, erpcom_save); + msgwrng = '*** Your ERPset was saved on your hard drive.***'; + %mcolor = [0 0 1]; + else + msgwrng = '*** Warning: Your ERPset was only saved on the workspace.***'; + %mcolor = [1 0.52 0.2]; + end + else + % ERP = ERPaux; + msgwrng = 'ERPLAB Warning: Your changes were not saved'; + %mcolor = [1 0.22 0.2]; + end + try cprintf([1 0.52 0.2], '%s\n\n', msgwrng); catch,fprintf('%s\n\n', msgwrng);end ; + end +end + + +% get history from script. ALLERP +switch shist + case 1 % from GUI + displayEquiComERP(erpcom); + case 2 % from script + for i=1:length(ERPArray) + ALLERP(ERPArray(i)) = erphistory(ALLERP((ERPArray)), [], erpcom, 1); + end + case 3 + % implicit + otherwise %off or none + erpcom = ''; + return +end +return \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/ERP Tab/pop_renamerp.m b/studio_functions/Functions/EStudio/ERP Tab/pop_renamerp.m new file mode 100644 index 00000000..13cbeca6 --- /dev/null +++ b/studio_functions/Functions/EStudio/ERP Tab/pop_renamerp.m @@ -0,0 +1,187 @@ +% PURPOSE: pop_renamerp.m +% rename ALLERPset +% + +% FORMAT: +% [ALLERP, erpcom] = pop_renamerp( ALLERP, 'erpnames',erpnames,... +% 'Saveas', 'off', 'History', 'gui'); + +% Inputs: +% +%ALLERP -ALLERP structure +%erpnames -strings for erpsets + + + +% *** This function is part of ALLERPLAB Studio *** +% Author: Guanghui Zhang & Steven Luck +% ghzhang@ucdavis.edu, sjluck@ucdavis.edu +% Center for Mind and Brain +% University of California, Davis, +% Davis, CA +% Dec. 2024 + + + + +function [ALLERP, erpcom] = pop_renamerp(ALLERP, varargin) +erpcom = ''; + +if nargin < 1 + help pop_renamerp + return +end +if isempty(ALLERP) + msgboxText = 'Cannot rename an empty ALLERPset'; + title = 'ALLERPLAB: pop_renamerp() error'; + errorfound(msgboxText, title); + return +end +if isempty(ALLERP(1).bindata) + msgboxText = 'Cannot rename an empty ALLERPset'; + title = 'ALLERPLAB: pop_renamerp() error'; + errorfound(msgboxText, title); + return +end + +datatype = checkdatatype(ALLERP(1)); +if ~strcmpi(datatype, 'ERP') + msgboxText = 'Cannot rename Power Spectrum waveforms!'; + title = 'ALLERPLAB: pop_renamerp() error'; + errorfound(msgboxText, title); + return +end + +if nargin==1 + + app = feval('ERP_Tab_rename_gui',ALLERP,1:length(ALLERP)); + waitfor(app,'Finishbutton',1); + try + erpnames = app.Output; %NO you don't want to output EEG with edited channel locations, you want to output the parameters to run decoding + app.delete; %delete app from view + pause(0.1); %wait for app to leave + catch + return; + end + if isempty(erpnames) + return; + end + % + % Somersault + % + [ALLERP, erpcom] = pop_renamerp( ALLERP, 'erpnames',erpnames,... + 'Saveas', 'off', 'History', 'gui'); + return +end + +% +% Parsing inputs +% +p = inputParser; +p.FunctionName = mfilename; +p.CaseSensitive = false; +p.addRequired('ALLERP'); +% option(s) +p.addParamValue('erpnames', '',@iscell); +p.addParamValue('Saveas', 'off', @ischar); +p.addParamValue('History', 'script', @ischar); % history from scripting + +p.parse(ALLERP, varargin{:}); + + + +erpnames = p.Results.erpnames; +if ischar(erpnames) && numel(ALLERP)==1 + ALLERP.erpname = erpnames; + ALLERP.saved = 'no'; +elseif iscell(erpnames) + for Numoferp = 1:numel(ALLERP) + newName = erpnames{Numoferp}; + [~, newName, ~] = fileparts(newName) ; + if ~isempty(newName) + ALLERP(Numoferp).erpname = newName; + ALLERP(Numoferp).saved = 'no'; + else + ALLERP(Numoferp).saved = 'no'; + end + end +end + + + +if strcmpi(p.Results.Saveas,'on') + issaveas = 1; +else + issaveas = 0; +end +if strcmpi(p.Results.History,'implicit') + shist = 3; % implicit +elseif strcmpi(p.Results.History,'script') + shist = 2; % script +elseif strcmpi(p.Results.History,'gui') + shist = 1; % gui +else + shist = 0; % off +end + + + + +% +% History +% + +skipfields = {'ALLERP', 'Saveas','History'}; +fn = fieldnames(p.Results); +erpcom = sprintf( '%s = pop_renamerp( %s ', inputname(1), inputname(1) ); +for q=1:length(fn) + fn2com = fn{q}; + if ~ismember_bc2(fn2com, skipfields) + fn2res = p.Results.(fn2com); + if ~isempty(fn2res) + if ischar(fn2res) + if ~strcmpi(fn2res,'off') + erpcom = sprintf( '%s, ''%s'', {''%s'' ', erpcom, fn2com, fn2res{1}); + end + else + if iscell(fn2res) + nn = length(fn2res); + erpcom = sprintf( '%s, ''%s'', {''%s'' ', erpcom, fn2com, fn2res{1}); + for ff=2:nn + erpcom = sprintf( '%s, ''%s'' ', erpcom, fn2res{ff}); + end + erpcom = sprintf( '%s}', erpcom); + end + + end + end + end +end +erpcom = sprintf( '%s );', erpcom); + +% +% Save ALLERPset from GUI +% +if issaveas + for ii = 1:length(ALLERP) + [ALLERP(ii), issave, erpcom_save] = pop_savemyerp(ALLERP(ii),'gui','erplab', 'History', 'off'); + end +end + + + +% get history from script. ALLERP +switch shist + case 1 % from GUI + displayEquiComERP(erpcom); + case 2 % from script + for ii = 1:length(ALLERP) + ALLERP(ii) = erphistory(ALLERP(ii), [], erpcom, 1); + end + case 3 + % implicit + otherwise %off or none + erpcom = ''; + return +end +return \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/ERP Tab/pop_resamplerp.m b/studio_functions/Functions/EStudio/ERP Tab/pop_resamplerp.m new file mode 100644 index 00000000..b0e3159c --- /dev/null +++ b/studio_functions/Functions/EStudio/ERP Tab/pop_resamplerp.m @@ -0,0 +1,305 @@ +% PURPOSE: pop_resamplerp.m +% resample ERPsets +% + +% FORMAT: +% [ERP, erpcom] = pop_resamplerp( ERP, 'Freq2resamp',Freq2resamp, 'TimeRange',TimeRange,... +% 'Saveas', 'off', 'History', 'gui'); + +% Inputs: +% +%ERP -ERP structure +%Freq2resamp -new sampling rate e.g., 200 Hz +%TimeRange -new time range e.g., [-300 900]ms + + + +% *** This function is part of ERPLAB Studio *** +% Author: Guanghui Zhang & Steven Luck +% ghzhang@ucdavis.edu, sjluck@ucdavis.edu +% Center for Mind and Brain +% University of California, Davis, +% Davis, CA +% Dec. 2023 + +function [ERP, erpcom] = pop_resamplerp(ERP, varargin) +erpcom = ''; + +if nargin < 1 + help pop_resamplerp + return +end +if isempty(ERP) + msgboxText = 'Cannot resample an empty erpset'; + title = 'ERPLAB: pop_resamplerp() error'; + errorfound(msgboxText, title); + return +end +if isempty(ERP(1).bindata) + msgboxText = 'Cannot resample an empty erpset'; + title = 'ERPLAB: pop_resamplerp() error'; + errorfound(msgboxText, title); + return +end + +datatype = checkdatatype(ERP(1)); +if ~strcmpi(datatype, 'ERP') + msgboxText = 'Cannot resample Power Spectrum waveforms!'; + title = 'ERPLAB: pop_resamplerp() error'; + errorfound(msgboxText, title); + return +end + +if nargin==1 + + Freq2resamp = ERP.srate; + TimeRange = [ERP.times(1),ERP.times(end)]; + % + % Somersault + % + [ERP, erpcom] = pop_resamplerp( ERP, 'Freq2resamp',Freq2resamp, 'TimeRange',TimeRange,... + 'Saveas', 'off', 'History', 'gui'); + return +end + +% +% Parsing inputs +% +p = inputParser; +p.FunctionName = mfilename; +p.CaseSensitive = false; +p.addRequired('ERP'); +% option(s) +p.addParamValue('Freq2resamp', [],@isnumeric); +p.addParamValue('TimeRange', [], @isnumeric); +p.addParamValue('Saveas', 'off', @ischar); +p.addParamValue('History', 'script', @ischar); % history from scripting + +p.parse(ERP, varargin{:}); + +Freq2resamp = p.Results.Freq2resamp; +if isempty(Freq2resamp) || numel(Freq2resamp)~=1 || any(Freq2resamp<=0) + Freq2resamp = ERP.srate; +end + +TimeRange= p.Results.TimeRange; +TimeRange = unique(TimeRange); +if isempty(TimeRange) || numel(TimeRange)~=2 || TimeRange(1)>=ERP.times(end) || TimeRange(2)<=ERP.times(1) + TimeRange = [ERP.times(1),ERP.times(end)]; +end +if TimeRange(1)>=0 + msgboxText = ['The left number of the new time range should be smaller than 0']; + title = 'ERPLAB: pop_resamplerp() inputs'; + errorfound(sprintf(msgboxText), title); + return +end + +if TimeRange(2)<=0 + msgboxText = ['The right number of the new time range should be larger than 0']; + title = 'ERPLAB: pop_resamplerp() inputs'; + errorfound(sprintf(msgboxText), title); + return +end + +%%-------------------------adjust the left edge---------------------------- +if roundn(TimeRange(1),-2)>= roundn(ERP.times(1),-2) + [xxx, latsamp, latdiffms] = closest(ERP.times, TimeRange(1)); + ERP.times = ERP.times(latsamp:end); + ERP.xmin = ERP.times(1)/1000; + ERP.bindata = ERP.bindata(:,latsamp:end,:); +else + TimesNew = ERP.times; + timeint = 1000/ERP.srate; + count=0; + for ii=1:10000 + timeStart = TimesNew(1)-timeint; + if timeStart>=TimeRange(1) + count = count+1; + TimesNew = [timeStart,TimesNew]; + else + break; + end + end + if count~=0 + ERP.times = TimesNew; + ERP.xmin = ERP.times(1)/1000; + datadd= zeros(size(ERP.bindata,1),count); + for ii = 1:size(ERP.bindata,3) + newdata(:,:,ii) = [datadd,squeeze(ERP.bindata(:,:,ii))]; + end + ERP.bindata = newdata; + end +end +%%-------------------------adjust the right edge--------------------------- +if roundn(TimeRange(2),-2)<= roundn(ERP.times(end),-2) + [xxx, latsamp, latdiffms] = closest(ERP.times, TimeRange(2)); + ERP.times = ERP.times(1:latsamp); + ERP.xmax = ERP.times(end)/1000; + ERP.bindata = ERP.bindata(:,1:latsamp,:); +else + TimesNew = ERP.times; + timeint = 1000/ERP.srate; + count=0; + for ii=1:10000 + timend = TimesNew(end)+timeint; + if timend<=TimeRange(2) + count = count+1; + TimesNew = [TimesNew,timend]; + else + break; + end + end + if count~=0 + newdata = []; + ERP.times = TimesNew; + ERP.xmax = ERP.times(end)/1000; + datadd= zeros(size(ERP.bindata,1),count); + for ii = 1:size(ERP.bindata,3) + newdata(:,:,ii) = [squeeze(ERP.bindata(:,:,ii)),datadd]; + end + ERP.bindata = newdata; + end +end + +count = 0; +check_left = []; +for ii = 1:numel(ERP.times) + if roundn(ERP.times(ii),-2)< roundn(TimeRange(1),-2) || roundn(ERP.times(ii),-2)> roundn(TimeRange(2),-2) + count = count+1; + check_left(count) = ii; + end +end +ERP.bindata(:,check_left,:) =[]; +ERP.times(check_left) = []; +ERP.pnts = size(ERP.bindata,2); +ERP.xmax = ERP.times(end)/1000; +ERP.xmin = ERP.times(1)/1000; + +if ERP.srate~=Freq2resamp + EEG = eeg_emptyset(); + EEG.nbchan = ERP.nchan; + EEG.pnts = ERP.pnts; + EEG.trials = size(ERP.bindata,3); + EEG.srate = ERP.srate; + EEG.xmin = ERP.xmin; + EEG.xmax = ERP.xmax; + EEG.data = ERP.bindata; + EEG.times = ERP.times; + %%resampling data based on eeglab routine + EEG = pop_resample( EEG, Freq2resamp); + ERP.srate= EEG.srate; + ERP.xmin= EEG.xmin; + ERP.xmax = EEG.xmax; + ERP.bindata = EEG.data; + ERP.times = EEG.times; + ERP.pnts= EEG.pnts; +end + +ERP.EVENTLIST.eventinfo = []; +ERP.binerror = []; + +if strcmpi(p.Results.Saveas,'on') + issaveas = 1; +else + issaveas = 0; +end +if strcmpi(p.Results.History,'implicit') + shist = 3; % implicit +elseif strcmpi(p.Results.History,'script') + shist = 2; % script +elseif strcmpi(p.Results.History,'gui') + shist = 1; % gui +else + shist = 0; % off +end + + + +ERP.saved = 'no'; +% +% History +% +% +% Completion statement +% +% msg2end + +% +% History +% + +skipfields = {'ERP', 'Saveas','History'}; +fn = fieldnames(p.Results); +erpcom = sprintf( '%s = pop_resamplerp( %s ', inputname(1), inputname(1) ); +for q=1:length(fn) + fn2com = fn{q}; + if ~ismember_bc2(fn2com, skipfields) + fn2res = p.Results.(fn2com); + if ~isempty(fn2res) + if ischar(fn2res) + if ~strcmpi(fn2res,'off') + erpcom = sprintf( '%s, ''%s'', ''%s''', erpcom, fn2com, fn2res); + end + else + if iscell(fn2res) + if ischar([fn2res{:}]) + fn2resstr = sprintf('''%s'' ', fn2res{:}); + else + fn2resstr = vect2colon(cell2mat(fn2res), 'Sort','on'); + end + fnformat = '{%s}'; + else + fn2resstr = vect2colon(fn2res, 'Sort','on'); + fnformat = '%s'; + end + if strcmpi(fn2com,'Criterion') + if p.Results.Criterion<100 + erpcom = sprintf( ['%s, ''%s'', ' fnformat], erpcom, fn2com, fn2resstr); + end + else + erpcom = sprintf( ['%s, ''%s'', ' fnformat], erpcom, fn2com, fn2resstr); + end + end + end + end +end +erpcom = sprintf( '%s );', erpcom); + +% +% Save ERPset from GUI +% +% if issaveas +% [ERP, issave, erpcom_save] = pop_savemyerp(ERP,'gui','erplab', 'History', 'off'); +% if issave>0 +% % erpcom = sprintf( '%s = pop_filterp( %s, %s, %s, %s, %s, ''%s'', %s);', inputname(1), inputname(1),... +% % chanArraystr, num2str(locutoff), num2str(hicutoff),... +% % num2str(filterorder), lower(fdesign), num2str(remove_dc)); +% % erpcom = sprintf('%s\n%s', erpcom, erpcom_save); +% if issave==2 +% erpcom = sprintf('%s\n%s', erpcom, erpcom_save); +% msgwrng = '*** Your ERPset was saved on your hard drive.***'; +% %mcolor = [0 0 1]; +% else +% msgwrng = '*** Warning: Your ERPset was only saved on the workspace.***'; +% %mcolor = [1 0.52 0.2]; +% end +% else +% ERP = ERPaux; +% msgwrng = 'ERPLAB Warning: Your changes were not saved'; +% %mcolor = [1 0.22 0.2]; +% end +% try cprintf([1 0.52 0.2], '%s\n\n', msgwrng); catch,fprintf('%s\n\n', msgwrng);end ; +% end +% get history from script. ERP +switch shist + case 1 % from GUI + displayEquiComERP(erpcom); + case 2 % from script + ERP = erphistory(ERP, [], erpcom, 1); + case 3 + % implicit + otherwise %off or none + erpcom = ''; + return +end +return \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/ERP Tab/pop_suffixerp.m b/studio_functions/Functions/EStudio/ERP Tab/pop_suffixerp.m new file mode 100644 index 00000000..993a927c --- /dev/null +++ b/studio_functions/Functions/EStudio/ERP Tab/pop_suffixerp.m @@ -0,0 +1,172 @@ +% PURPOSE: pop_suffixerp.m +% add suffix to ALLERP names +% + +% FORMAT: +% [ALLERP, erpcom] = pop_suffixerp( ALLERP, 'suffixstr',suffixstr,... +% 'Saveas', 'off', 'History', 'gui'); + +% Inputs: +% +%ALLERP -ALLERP structure +%suffixstr -strings for erpsets + + + +% *** This function is part of ALLERPLAB Studio *** +% Author: Guanghui Zhang & Steven Luck +% ghzhang@ucdavis.edu, sjluck@ucdavis.edu +% Center for Mind and Brain +% University of California, Davis, +% Davis, CA +% Dec. 2024 + + + + +function [ALLERP, erpcom] = pop_suffixerp(ALLERP, varargin) +erpcom = ''; + +if nargin < 1 + help pop_suffixerp + return +end +if isempty(ALLERP) + msgboxText = 'Cannot rename an empty ALLERPset'; + title = 'ERPLAB: pop_suffixerp() error'; + errorfound(msgboxText, title); + return +end +if isempty(ALLERP(1).bindata) + msgboxText = 'Cannot rename an empty ALLERPset'; + title = 'ERPLAB: pop_suffixerp() error'; + errorfound(msgboxText, title); + return +end + +datatype = checkdatatype(ALLERP(1)); +if ~strcmpi(datatype, 'ERP') + msgboxText = 'Cannot rename Power Spectrum waveforms!'; + title = 'ERPLAB: pop_suffixerp() error'; + errorfound(msgboxText, title); + return +end + +if nargin==1 + + suffixstr = f_ERP_suffix_gui('Suffix'); + + if isempty(suffixstr) + return; + end + % + % Somersault + % + [ALLERP, erpcom] = pop_suffixerp( ALLERP, 'suffixstr',suffixstr,... + 'Saveas', 'off', 'History', 'gui'); + return +end + +% +% Parsing inputs +% +p = inputParser; +p.FunctionName = mfilename; +p.CaseSensitive = false; +p.addRequired('ALLERP'); +% option(s) +p.addParamValue('suffixstr', '',@ischar); +p.addParamValue('Saveas', 'off', @ischar); +p.addParamValue('History', 'script', @ischar); % history from scripting + +p.parse(ALLERP, varargin{:}); + + + +suffixstr = p.Results.suffixstr; + +for Numoferp = 1:numel(ALLERP) + ALLERP(Numoferp).erpname = [ALLERP(Numoferp).erpname,'_',suffixstr]; + ALLERP(Numoferp).saved = 'no'; + +end + + + + +if strcmpi(p.Results.Saveas,'on') + issaveas = 1; +else + issaveas = 0; +end +if strcmpi(p.Results.History,'implicit') + shist = 3; % implicit +elseif strcmpi(p.Results.History,'script') + shist = 2; % script +elseif strcmpi(p.Results.History,'gui') + shist = 1; % gui +else + shist = 0; % off +end + + + + +% +% History +% + +skipfields = {'ALLERP', 'Saveas','History'}; +fn = fieldnames(p.Results); +erpcom = sprintf( '%s = pop_suffixerp( %s ', inputname(1), inputname(1) ); +for q=1:length(fn) + fn2com = fn{q}; + if ~ismember_bc2(fn2com, skipfields) + fn2res = p.Results.(fn2com); + if ~isempty(fn2res) + if ischar(fn2res) + if ~strcmpi(fn2res,'off') + erpcom = sprintf( '%s, ''%s'', ''%s'' ', erpcom, fn2com, fn2res); + end + else + if iscell(fn2res) + nn = length(fn2res); + erpcom = sprintf( '%s, ''%s'', {''%s'' ', erpcom, fn2com, fn2res{1}); + for ff=2:nn + erpcom = sprintf( '%s, ''%s'' ', erpcom, fn2res{ff}); + end + erpcom = sprintf( '%s}', erpcom); + end + + end + end + end +end +erpcom = sprintf( '%s );', erpcom); + +% +% Save ALLERPset from GUI +% +if issaveas + for ii = 1:length(ALLERP) + [ALLERP(ii), issave, erpcom_save] = pop_savemyerp(ALLERP(ii),'gui','erplab', 'History', 'off'); + end +end + + + +% get history from script. ALLERP +switch shist + case 1 % from GUI + displayEquiComERP(erpcom); + case 2 % from script + for ii = 1:length(ALLERP) + ALLERP(ii) = erphistory(ALLERP(ii), [], erpcom, 1); + end + case 3 + % implicit + otherwise %off or none + erpcom = ''; + return +end +return \ No newline at end of file diff --git a/studio_functions/Functions/EStudio/ERP Tab/redrawERP.m b/studio_functions/Functions/EStudio/ERP Tab/redrawERP.m deleted file mode 100755 index 53c05ffd..00000000 --- a/studio_functions/Functions/EStudio/ERP Tab/redrawERP.m +++ /dev/null @@ -1,769 +0,0 @@ -function redrawERP() -% Draw a demo ERP into the axes provided -global gui_erp; -global observe_ERPDAT; - - -S_ws_geterpset= estudioworkingmemory('selectederpstudio'); -if isempty(S_ws_geterpset) - S_ws_geterpset = observe_ERPDAT.CURRENTERP; - - if isempty(S_ws_geterpset) - msgboxText = 'No ERPset was selected!!!'; - title = 'EStudio: ERPsets'; - errorfound(msgboxText, title); - return; - end - S_erpplot = f_ERPplot_Parameter(observe_ERPDAT.ALLERP,S_ws_geterpset); - estudioworkingmemory('geterpbinchan',S_erpplot.geterpbinchan); - estudioworkingmemory('geterpplot',S_erpplot.geterpplot); -end - -S_ws_getbinchan = estudioworkingmemory('geterpbinchan'); - -S_ws_geterpplot = estudioworkingmemory('geterpplot'); - - -%%Parameter from bin and channel panel -Elecs_shown = S_ws_getbinchan.elecs_shown{S_ws_getbinchan.Select_index}; -Bins = S_ws_getbinchan.bins{S_ws_getbinchan.Select_index}; -Bin_chans = S_ws_getbinchan.bins_chans(S_ws_getbinchan.Select_index); -Elec_list = S_ws_getbinchan.elec_list{S_ws_getbinchan.Select_index}; -Matlab_ver = S_ws_getbinchan.matlab_ver; - - - -%%Parameter from plotting panel -try - Min_vspacing = S_ws_geterpplot.min_vspacing(S_ws_getbinchan.Select_index); - Min_time = S_ws_geterpplot.min(S_ws_getbinchan.Select_index); - Max_time = S_ws_geterpplot.max(S_ws_getbinchan.Select_index); - Yscale = S_ws_geterpplot.yscale(S_ws_getbinchan.Select_index); - Timet_low =S_ws_geterpplot.timet_low(S_ws_getbinchan.Select_index); - Timet_high =S_ws_geterpplot.timet_high(S_ws_getbinchan.Select_index); - Timet_step=S_ws_geterpplot.timet_step(S_ws_getbinchan.Select_index); - Fill = S_ws_geterpplot.fill(S_ws_getbinchan.Select_index); - Plority_plot = S_ws_geterpplot.Positive_up(S_ws_getbinchan.Select_index); - ColumnNum = S_ws_geterpplot.Plot_column; -catch - return; -end - -if Bin_chans == 0 - elec_n = S_ws_getbinchan.elec_n(S_ws_getbinchan.Select_index); - max_elec_n = observe_ERPDAT.ALLERP(S_ws_geterpset(S_ws_getbinchan.Select_index)).nchan; -else - elec_n = S_ws_getbinchan.bin_n(S_ws_getbinchan.Select_index); - max_elec_n = observe_ERPDAT.ALLERP(S_ws_geterpset(S_ws_getbinchan.Select_index)).nbin; -end - -% We first clear the existing axes ready to build a new one -if ishandle( gui_erp.ViewAxes ) - delete( gui_erp.ViewAxes ); -end - - -% Get chan labels -S_chan.chan_label = cell(1,max_elec_n); -S_chan.chan_label_place = zeros(1,max_elec_n); - - -if Bin_chans == 0 - for i = 1:elec_n - S_chan.chan_label{i} = observe_ERPDAT.ERP.chanlocs(Elecs_shown(i)).labels; - end -else - for i = 1:elec_n - S_chan.chan_label{i} = observe_ERPDAT.ERP.bindescr(Bins(i)); - end -end - - -%Sets the units of your root object (screen) to pixels -set(0,'units','pixels') -%Obtains this pixel information -Pix_SS = get(0,'screensize'); -%Sets the units of your root object (screen) to inches -set(0,'units','inches') -%Obtains this inch information -Inch_SS = get(0,'screensize'); -%Calculates the resolution (pixels per inch) -Res = Pix_SS./Inch_SS; - - -pb_height = Min_vspacing*Res(4); %px - - -% Plot data in the main viewer fig -splot_n = elec_n; -tsize = 13; - - -clear pb r_ax plotgrid; -try - [version reldate,ColorB_def,ColorF_def,errorColorF_def] = geterplabstudiodef;%%Get background color -catch - ColorB_def = [0.95 0.95 0.95]; -end -if isempty(ColorB_def) - ColorB_def = [0.95 0.95 0.95]; -end -gui_erp.plotgrid = uix.VBox('Parent',gui_erp.ViewContainer,'Padding',0,'Spacing',0,'BackgroundColor',ColorB_def); - -pageinfo_box = uiextras.HBox( 'Parent', gui_erp.plotgrid,'BackgroundColor',ColorB_def); - -gui_erp.plot_wav_legend = uiextras.HBox( 'Parent', gui_erp.plotgrid,'BackgroundColor',[1 1 1]); -gui_erp.ViewAxes_legend = uix.ScrollingPanel( 'Parent', gui_erp.plot_wav_legend,'BackgroundColor',ColorB_def); - -gui_erp.ViewAxes = uix.ScrollingPanel( 'Parent', gui_erp.plot_wav_legend,'BackgroundColor',[1 1 1]); - - -%%Changed by Guanghui Zhang 2 August 2022-------panel for display the processing procedure for some functions, e.g., filtering -xaxis_panel = uiextras.HBox( 'Parent', gui_erp.plotgrid,'BackgroundColor',ColorB_def);%%%Message -gui_erp.Process_messg = uicontrol('Parent',xaxis_panel,'Style','text','String','','FontSize',20,'FontWeight','bold','BackgroundColor',ColorB_def); - - -%%Setting title -gui_erp.pageinfo_minus = uicontrol('Parent',pageinfo_box,'Style', 'pushbutton', 'String', '<','Callback',@page_minus,'FontSize',30,'BackgroundColor',[1 1 1]); -if S_ws_getbinchan.Select_index ==1 - gui_erp.pageinfo_minus.Enable = 'off'; -end - -gui_erp.pageinfo_plus = uicontrol('Parent',pageinfo_box,'Style', 'pushbutton', 'String', '>','Callback',@page_plus,'FontSize',30,'BackgroundColor',[1 1 1]); -if S_ws_getbinchan.Select_index == numel(S_ws_geterpset) - gui_erp.pageinfo_plus.Enable = 'off'; -end - -pageinfo_str = ['Page',32,num2str(S_ws_getbinchan.Select_index),'/',num2str(numel(S_ws_geterpset)),':',32,observe_ERPDAT.ERP.erpname]; - -pageinfo_text = uicontrol('Parent',pageinfo_box,'Style','text','String',pageinfo_str,'FontSize',20,'FontWeight','bold'); - -if length(S_ws_geterpset) ==1 - Enable_minus = 'off'; - Enable_plus = 'off'; - Enable_plus_BackgroundColor = [1 1 1]; - Enable_minus_BackgroundColor = [0 0 0]; -else - - if S_ws_getbinchan.Select_index ==1 - Enable_minus = 'off'; - Enable_plus = 'on'; - - Enable_plus_BackgroundColor = [0 1 0]; - Enable_minus_BackgroundColor = [0 0 0]; - elseif S_ws_getbinchan.Select_index == length(S_ws_geterpset) - Enable_minus = 'on'; - Enable_plus = 'off'; - Enable_plus_BackgroundColor = [0 0 0]; - Enable_minus_BackgroundColor = [0 1 0]; - else - Enable_minus = 'on'; - Enable_plus = 'on'; - Enable_plus_BackgroundColor = [0 1 0]; - Enable_minus_BackgroundColor = [0 1 0]; - end -end -gui_erp.pageinfo_minus.Enable = Enable_minus; -gui_erp.pageinfo_plus.Enable = Enable_plus; -gui_erp.pageinfo_plus.ForegroundColor = Enable_plus_BackgroundColor; -gui_erp.pageinfo_minus.ForegroundColor = Enable_minus_BackgroundColor; - -set(pageinfo_box, 'Sizes', [50 50 -1] ); -set(pageinfo_box,'BackgroundColor',ColorB_def); -set(pageinfo_text,'BackgroundColor',ColorB_def); -%Setting title. END,'BackgroundColor',ColorB_def - -%for i=1:splot_n - -ndata = 0; -nplot = 0; -if Bin_chans == 0 - ndata = Bins; - nplot = Elecs_shown; -else - ndata = Elecs_shown; - nplot = Bins; -end - -% -timeor = observe_ERPDAT.ERP.times; % original time vector -timex = timeor; -[xxx, latsamp, latdiffms] = closest(timex, [Min_time Max_time]); -tmin = latsamp(1); -tmax = latsamp(2); - -if tmin < 1 - tmin = 1; -end - -if tmax > numel(observe_ERPDAT.ERP.times) - tmax = numel(observe_ERPDAT.ERP.times); -end - -plot_erp_data = nan(tmax-tmin+1,numel(ndata)); -for i = 1:splot_n - if Bin_chans == 0 - for i_bin = 1:numel(ndata) - plot_erp_data(:,i_bin,i) = observe_ERPDAT.ERP.bindata(Elecs_shown(i),tmin:tmax,Bins(i_bin))'*Plority_plot; % - end - else - for i_bin = 1:numel(ndata) - plot_erp_data(:,i_bin,i) = observe_ERPDAT.ERP.bindata(Elecs_shown(i_bin),tmin:tmax,Bins(i))'*Plority_plot; % - end - end -end - -perc_lim = Yscale; -percentile = perc_lim*3/2; - -[~,~,b] = size(plot_erp_data); - -%How to get x unique colors? - - -%%----------------------Modify the data into multiple-columns--------------------------------------- -rowNum = ceil(b/ColumnNum(S_ws_getbinchan.Select_index)); -plot_erp_data_new = zeros(size(plot_erp_data,1),size(plot_erp_data,2),rowNum*ColumnNum(S_ws_getbinchan.Select_index)); - -plot_erp_data_new(:,:,1:size(plot_erp_data,3)) = plot_erp_data; -plot_erp_data_new_trans = []; -for Numofrow = 1:rowNum - plot_erp_data_new_trans(:,:,:,Numofrow) = plot_erp_data_new(:,:,(Numofrow-1)*ColumnNum(S_ws_getbinchan.Select_index)+1:Numofrow*ColumnNum(S_ws_getbinchan.Select_index)); -end - -clear plot_erp_data; - -plot_erp_data_new_trans = permute(plot_erp_data_new_trans,[1,3,2,4]) ; -plot_erp_data = reshape(plot_erp_data_new_trans,size(plot_erp_data_new_trans,1)*size(plot_erp_data_new_trans,2),size(plot_erp_data_new_trans,3),size(plot_erp_data_new_trans,4)); - -% Min_time = Min_time*ColumnNum(S_ws_getbinchan.Select_index); -% Max_time = Max_time*ColumnNum(S_ws_getbinchan.Select_index); -ind_plot_height = percentile*2; % Height of each individual subplot - -offset = []; -if Bin_chans == 0 - offset = (size(plot_erp_data,3)-1:-1:0)*ind_plot_height; -else - offset = (size(plot_erp_data,3)-1:-1:0)*ind_plot_height; -end -[~,~,b] = size(plot_erp_data); - -for i = 1:b - plot_erp_data(:,:,i) = plot_erp_data(:,:,i) + ones(size(plot_erp_data(:,:,i)))*offset(i); -end - - - -r_ax = axes('Parent', gui_erp.ViewAxes,'Color','none','Box','on'); -hold(r_ax,'on'); -set(gui_erp.plot_wav_legend,'Sizes',[80 -10]); -r_ax_legend = axes('Parent', gui_erp.ViewAxes_legend,'Color','none','Box','off'); -hold(r_ax_legend,'on'); - - -Min_time_onecolm = S_ws_geterpplot.min(S_ws_getbinchan.Select_index); -Max_time_onecolm = S_ws_geterpplot.max(S_ws_getbinchan.Select_index); - -try - f_bin = 1000/observe_ERPDAT.ERP.srate; -catch - f_bin = 1; -end - -ts = observe_ERPDAT.ERP.times(tmin:tmax); -ts_colmn = ts; -xticks_clomn = (Min_time:Timet_step:Max_time); -xticks = (Min_time:Timet_step:Max_time); -if ColumnNum(S_ws_getbinchan.Select_index)>1 % Plotting waveforms with munltiple-columns - - for Numofcolumn = 1:ColumnNum(S_ws_getbinchan.Select_index)-1 - ts_colmn = [ts_colmn,ts+ones(1,numel(ts))*(ts_colmn(end)+f_bin-ts(1))]; - xticks_clomn = [xticks_clomn,xticks(2:end)]; - end - X_zero_line(1) =ts(1); - for Numofcolumn = 1:ColumnNum(S_ws_getbinchan.Select_index)-1 - X_zero_line(Numofcolumn+1) = X_zero_line(Numofcolumn)+ ts(end)-ts(1)+f_bin; - end - - ts = ts_colmn; - - Min_time = ts(1); - Max_time = ts(end); - xticks = xticks_clomn; - -else%% Plotting waveforms with single-column - xticks = (Min_time:Timet_step:Max_time); - X_zero_line(1) =ts(1); -end - -for Numofxlabel = 1:numel(xticks) - xticks_labels{Numofxlabel} = num2str(xticks(Numofxlabel)); -end - -splot_n = size(plot_erp_data,3);%%Adjust the columns - -set(r_ax,'XLim',[Min_time Max_time]); - -[a,c,b] = size(plot_erp_data); -new_erp_data = zeros(a,b*c); -for i = 1:b - new_erp_data(:,((c*(i-1))+1):(c*i)) = plot_erp_data(:,:,i); -end - - -line_colors = erpworkingmemory('PWColor'); -if size(line_colors,1)~= numel(ndata) - if numel(ndata)> size(line_colors,1) - line_colors = get_colors(numel(ndata)); - else - line_colors = line_colors(1:numel(ndata),:,:); - end -end - -if isempty(line_colors) - line_colors = get_colors(numel(ndata)); -end - -line_colors = repmat(line_colors,[splot_n 1]); %repeat the colors once for every plot - -if ColumnNum(S_ws_getbinchan.Select_index)>1 - for ii = 1:numel(X_zero_line) - xline_p = xline(r_ax,X_zero_line(ii),'--','Color', [0 0 0],'LineWidth',1.5);%%Marking start time point for each column - xline_p.FontSize = 18; - end - - -end - - -%%%------------Setting xticklabels for each row of each wave-------------- -x_axs = ones(size(new_erp_data,1),1); -if numel(offset)>1 - - for jj = 1:numel(offset) - x_axset = plot(r_ax,ts,x_axs.*offset(jj),'k','LineWidth',1); - set(r_ax,'XTick',[Min_time:Timet_step:Max_time], ... - 'box','off', 'Color','none','xticklabels',xticks_labels,'FontWeight','bold'); - end - -end -if numel(offset)>1 - - for jj = 1:numel(offset) - x_axset = plot(r_ax,ts,x_axs.*offset(end-1),'k','LineWidth',1); - set(r_ax,'XTick',[Min_time:Timet_step:Max_time], ... - 'box','off', 'Color','none','xticklabels',xticks_labels,'FontWeight','bold'); - myX_Crossing = offset(jj); - props = get(r_ax); - - tick_bottom = -props.TickLength(1)*diff(props.YLim); - if abs(tick_bottom) > abs(Yscale)/5 - try - tick_bottom = - abs(Yscale)/5; - catch - tick_bottom = tick_bottom; - end - end - tick_top = 0; - - h_xaxis = line(r_ax,props.XLim, [0 0] + myX_Crossing, 'color', 'k'); - - if ~isempty(props.XTick) - xtick_x = repmat(props.XTick, 2, 1); - xtick_y = repmat([tick_bottom; tick_top] + myX_Crossing, 1, length(props.XTick)); - h_ticks = line(r_ax,xtick_x, xtick_y, 'color', 'k'); - end - set(r_ax, 'XTick', [], 'XTickLabel', []); - % tick_bottom = -props.TickLength(1)*diff(props.YLim); - nTicks = length(props.XTick); - h_ticklabels = zeros(size(props.XTick)); - if nTicks>1 - if numel(offset)==jj - kkkk = 1; - else - kkkk = 2; - end - for iCount = kkkk:nTicks - xtick_label = (props.XTickLabel(iCount, :)); - text(r_ax,props.XTick(iCount), tick_bottom + myX_Crossing, ... - xtick_label, ... - 'HorizontalAlignment', 'Center', ... - 'VerticalAlignment', 'Top', ... - 'FontSize', 12, ... - 'FontName', props.FontName, ... - 'FontAngle', props.FontAngle, ... - 'FontUnits', props.FontUnits, ... - 'FontWeight', 'bold'); - end - end - - end -end -%%%%%%%%----------------------------- - -% set(r_ax,'XDir','reverse') - -pb_here = plot(r_ax,ts, [repmat((1:numel(nplot)-1)*ind_plot_height,[numel(ts) 1]) new_erp_data],'LineWidth',1); -r_ax.LineWidth=1.5; -set(r_ax, 'XTick', [], 'XTickLabel', []) - -% -yticks = -perc_lim:perc_lim:((2*percentile*b)-(2*perc_lim)); -ylabs = repmat([-perc_lim 0 perc_lim],[1,b]); -oldlim = [-percentile yticks(end)-perc_lim+percentile]; -top_vspace = max( max( new_erp_data))-oldlim(2); -bot_vspace = min( min( new_erp_data))-oldlim(1); -if top_vspace < 0 - top_vspace = 0; -end - -if bot_vspace > 0 - bot_vspace = 0; -end -newlim = oldlim + [bot_vspace top_vspace]; -set(r_ax,'XLim',[Min_time Max_time],'Ylim',newlim); - - -for i = 0:numel(nplot)-2 - r_ax.Children(end-i).Color = [0 0 0]; -end - - -for i = numel(nplot):numel(pb_here) - pb_here(i).Color = line_colors((i-numel(nplot)+1),:); - -end - -for i = 1:numel(nplot)-1 - pb_here(i).Color = [0 0 0]; -end - - - -ylabs = [fliplr(-perc_lim:-perc_lim:newlim(1)) ylabs(2:end-1) (yticks(end):perc_lim:newlim(2))-yticks(end)+perc_lim]; -yticks = [fliplr(-perc_lim:-perc_lim:newlim(1)) yticks(2:end-1) yticks(end):perc_lim:newlim(2)]; - - - -Ylabels_new = ylabs.*Plority_plot; -[~,Y_label] = find(Ylabels_new == -0); -Ylabels_new(Y_label) = 0; -if ColumnNum(S_ws_getbinchan.Select_index)==1 - % Ylabels_fin = {}; - % count = 0; - % for Numofylabel = numel(Ylabels_new):-1:1 - % - % if Ylabels_new(Numofylabel)==0 - % count =count+1; - % - % if Bin_chans == 0 - % Ylabels_fin{Numofylabel} = strcat(Elec_list{Elecs_shown(count)},'(',num2str(Elecs_shown(count)),')'); - % else - % Ylabels_fin{Numofylabel} = ['Bin',num2str(Bins(count))]; - % end - % else - % Ylabels_fin{Numofylabel} = num2str(roundn(Ylabels_new(Numofylabel),-1)); - % end - % - % end - % else%% Getting y ticks and legends for multiple-columns - % for Numofylabel = numel(Ylabels_new):-1:1 - % Ylabels_fin{Numofylabel} = num2str(roundn(Ylabels_new(Numofylabel),-1)); - % end - if numel(offset)>1 - count = 0; - for i = 0:numel(offset)-1 - leg_str = ''; - for Numofcolumn = 1: ColumnNum(S_ws_getbinchan.Select_index) - count = count+1; - try - if Bin_chans == 0 - leg_str = sprintf('%s',Elec_list{Elecs_shown(count)}); - else - leg_str = sprintf('%s',observe_ERPDAT.ERP.bindescr{Bins(count)}); - end - catch - leg_str = ''; - end - text(r_ax,X_zero_line(Numofcolumn),offset(i+1)+offset(end-1)/6,leg_str,'FontWeight','bold','FontSize', 18); - end - end - end - - - count = (numel(offset)-1)*ColumnNum(S_ws_getbinchan.Select_index); - leg_str = ''; - for Numofcolumn = 1: ColumnNum(S_ws_getbinchan.Select_index) - count = count+1; - try - if Bin_chans == 0 - leg_str = sprintf('%s',Elec_list{Elecs_shown(count)}); - else - leg_str = sprintf('%s',observe_ERPDAT.ERP.bindescr{Bins(count)}); - end - catch%% - leg_str = ''; - end - try - text(r_ax,X_zero_line(Numofcolumn),offset(end-1)/6,leg_str,'FontWeight','bold','FontSize', 18); - catch - text(r_ax,X_zero_line(Numofcolumn),Yscale/2,leg_str,'FontWeight','bold','FontSize', 18); - end - end - -end - - - - -% xticks = (Min_time:Timet_step:Max_time); -% some options currently only work post Matlab R2016a ,'XLim',[Min_time Max_time],'XLim',[Min_time Max_time] -if Matlab_ver >= 2016 - set(r_ax,'FontSize',tsize,'FontWeight','bold','XAxisLocation','origin',... - 'XGrid','on','YGrid','on','YTick',yticks,'YTickLabel',Ylabels_new, ... - 'YLim',newlim,'XTick',[Min_time:Timet_step:Max_time], ... - 'box','off', 'Color','none','xticklabels',xticks_labels); -else - set(r_ax,'FontSize',tsize,'FontWeight','bold','XAxisLocation','bottom',... - 'XGrid','on','YGrid','on','YTick',yticks,'YTickLabel',Ylabels_new, ... - 'YLim',newlim, 'XTick',[Min_time:Timet_step:Max_time], ... - 'box','off', 'Color','none','xticklabels',xticks_labels); - hline(0,'k'); % backup xaxis -end -if numel(offset)>1 - set(r_ax, 'XTick', [], 'XTickLabel', []) -end - -%%%%%%%%%%%% -hold(r_ax,'off'); -% r_ax.Position(2) =r_ax.Position(2)-5; -line_colors_ldg = erpworkingmemory('PWColor'); -if isempty(line_colors_ldg) - line_colors_ldg = get_colors(numel(ndata)); -end - -if size(line_colors_ldg,1)~= numel(ndata) - if numel(ndata)> size(line_colors_ldg,1) - line_colors_ldg = get_colors(numel(ndata)); - else - line_colors_ldg = line_colors_ldg(1:numel(ndata),:,:); - end -end - -for Numofplot = 1:size(plot_erp_data,2) - plot(r_ax_legend,[0 0],'Color',line_colors_ldg(Numofplot,:,:),'LineWidth',3) -end - -if Bin_chans == 0 - - Leg_Name = {}; - - for Numofbin = 1:numel(Bins) - Leg_Name{Numofbin} = strcat('Bin',num2str(Bins(Numofbin))); - - end - -else - for Numofchan = 1:numel(Elecs_shown) - Leg_Name{Numofchan} = Elec_list{Numofchan}; - end -end -legend(r_ax_legend,Leg_Name,'FontSize',14,'TextColor','blue'); -legend(r_ax_legend,'boxoff'); -% title(here_lgd,'Legend'); - -% fix scaling shrinkage -pos_fix = r_ax.Position; -pos_fix(2) = 1; % Start at the bottom -pos_fix(4) = pb_height - 1; % fill the height; - -gui_erp.plotgrid.Heights(1) = 30; % set the first element (pageinfo) to 30px high -gui_erp.plotgrid.Heights(3) = 30; % set the second element (x axis) to 30px high -gui_erp.plotgrid.Units = 'pixels'; -if splot_n*pb_height<(gui_erp.plotgrid.Position(4)-gui_erp.plotgrid.Heights(1))&&Fill - pb_height = (gui_erp.plotgrid.Position(4)-gui_erp.plotgrid.Heights(1)-gui_erp.plotgrid.Heights(2))/splot_n; -end - -gui_erp.ViewAxes.Heights = splot_n*pb_height; -gui_erp.plotgrid.Units = 'normalized'; - -end % redrawDemo - - -function colors = get_colors(ncolors) -% Each color gets 1 point divided into up to 2 of 3 groups (RGB). -degree_step = 6/ncolors; -angles = (0:ncolors-1)*degree_step; -colors = nan(numel(angles),3); -for i = 1:numel(angles) - if angles(i) < 1 - colors(i,:) = [1 (angles(i)-floor(angles(i))) 0]*0.75; - elseif angles(i) < 2 - colors(i,:) = [(1-(angles(i)-floor(angles(i)))) 1 0]*0.75; - elseif angles(i) < 3 - colors(i,:) = [0 1 (angles(i)-floor(angles(i)))]*0.75; - elseif angles(i) < 4 - colors(i,:) = [0 (1-(angles(i)-floor(angles(i)))) 1]*0.75; - elseif angles(i) < 5 - colors(i,:) = [(angles(i)-floor(angles(i))) 0 1]*0.75; - else - colors(i,:) = [1 0 (1-(angles(i)-floor(angles(i))))]*0.75; - end -end -end - - - -%------------------Display the waveform for proir ERPset-------------------- -function page_minus(~,~) -global observe_ERPDAT; -global gui_erp; - - -S_ws_geterpset= estudioworkingmemory('selectederpstudio'); -if isempty(S_ws_geterpset) - S_ws_geterpset = observe_ERPDAT.CURRENTERP; - - if isempty(S_ws_geterpset) - msgboxText = 'No ERPset was selected!!!'; - title = 'EStudio: ERPsets'; - errorfound(msgboxText, title); - return; - end - S_erpplot = f_ERPplot_Parameter(observe_ERPDAT.ALLERP,S_ws_geterpset); - estudioworkingmemory('geterpbinchan',S_erpplot.geterpbinchan); - estudioworkingmemory('geterpplot',S_erpplot.geterpplot); -end - -S_ws_getbinchan = estudioworkingmemory('geterpbinchan'); - - -S_ws_getbinchan.Select_index = S_ws_getbinchan.Select_index-1; -Current_erp_Index = S_ws_geterpset(S_ws_getbinchan.Select_index); -if Current_erp_Index > length(observe_ERPDAT.ALLERP) - beep; - disp('Waiting for modifing'); - return; -end - -observe_ERPDAT.CURRENTERP = Current_erp_Index; -observe_ERPDAT.ERP = observe_ERPDAT.ALLERP(Current_erp_Index); - - -estudioworkingmemory('geterpbinchan',S_ws_getbinchan); - - -observe_ERPDAT.Count_currentERP = observe_ERPDAT.Count_currentERP+1; - - -if length(S_ws_geterpset) ==1 - Enable_minus = 'off'; - Enable_plus = 'off'; - Enable_plus_BackgroundColor = [0 0 0]; - Enable_minus_BackgroundColor = [0 0 0]; -else - - if S_ws_getbinchan.Select_index ==1 - Enable_minus = 'off'; - Enable_plus = 'on'; - - Enable_plus_BackgroundColor = [0 1 0]; - Enable_minus_BackgroundColor = [0 0 0]; - elseif S_ws_getbinchan.Select_index == length(S_ws_geterpset) - Enable_minus = 'on'; - Enable_plus = 'off'; - Enable_plus_BackgroundColor = [0 0 0]; - Enable_minus_BackgroundColor = [0 1 0]; - else - Enable_minus = 'on'; - Enable_plus = 'on'; - Enable_plus_BackgroundColor = [0 1 0]; - Enable_minus_BackgroundColor = [0 1 0]; - end -end -gui_erp.pageinfo_minus.Enable = Enable_minus; -gui_erp.pageinfo_plus.Enable = Enable_plus; -% f_redrawERP_mt_viewer(); -gui_erp.pageinfo_plus.ForegroundColor = Enable_plus_BackgroundColor; -gui_erp.pageinfo_minus.ForegroundColor = Enable_minus_BackgroundColor; -end - - - - - -%------------------Display the waveform for next ERPset-------------------- -function page_plus(~,~) -global observe_ERPDAT; -global gui_erp; - - -S_ws_geterpset= estudioworkingmemory('selectederpstudio'); -if isempty(S_ws_geterpset) - S_ws_geterpset = observe_ERPDAT.CURRENTERP; - - if isempty(S_ws_geterpset) - msgboxText = 'No ERPset was selected!!!'; - title = 'EStudio: ERPsets'; - errorfound(msgboxText, title); - return; - end - S_erpplot = f_ERPplot_Parameter(observe_ERPDAT.ALLERP,S_ws_geterpset); - estudioworkingmemory('geterpbinchan',S_erpplot.geterpbinchan); - estudioworkingmemory('geterpplot',S_erpplot.geterpplot); -end - -S_ws_getbinchan = estudioworkingmemory('geterpbinchan'); - - - - -S_ws_getbinchan.Select_index = S_ws_getbinchan.Select_index+1; -Current_erp_Index = S_ws_geterpset(S_ws_getbinchan.Select_index); -if Current_erp_Index > length(observe_ERPDAT.ALLERP) - beep; - disp('Waiting for modifing'); - return; -end - -observe_ERPDAT.CURRENTERP = Current_erp_Index; -observe_ERPDAT.ERP = observe_ERPDAT.ALLERP(Current_erp_Index); - -estudioworkingmemory('geterpbinchan',S_ws_getbinchan); - -observe_ERPDAT.Count_currentERP = observe_ERPDAT.Count_currentERP+1; - - -if length(S_ws_geterpset) ==1 - Enable_minus = 'off'; - Enable_plus = 'off'; - Enable_plus_BackgroundColor = [0 0 0]; - Enable_minus_BackgroundColor = [0 0 0]; -else - - if S_ws_getbinchan.Select_index ==1 - Enable_minus = 'off'; - Enable_plus = 'on'; - Enable_plus_BackgroundColor = [0 1 0]; - Enable_minus_BackgroundColor = [1 1 1]; - elseif S_ws_getbinchan.Select_index == length(S_ws_geterpset) - Enable_minus = 'on'; - Enable_plus = 'off'; - Enable_plus_BackgroundColor = [0 0 0]; - Enable_minus_BackgroundColor = [0 1 0]; - - - else - Enable_minus = 'on'; - Enable_plus = 'on'; - Enable_plus_BackgroundColor = [0 1 0]; - Enable_minus_BackgroundColor = [0 1 0]; - end -end -gui_erp.pageinfo_minus.Enable = Enable_minus; -gui_erp.pageinfo_plus.Enable = Enable_plus; -gui_erp.pageinfo_plus.ForegroundColor = Enable_plus_BackgroundColor; -gui_erp.pageinfo_minus.ForegroundColor = Enable_minus_BackgroundColor; -end - - diff --git a/studio_functions/Functions/EStudio/ERP Tab/working_mem_save_load.m b/studio_functions/Functions/EStudio/ERP Tab/working_mem_save_load.m index f58a2338..e8cbec66 100755 --- a/studio_functions/Functions/EStudio/ERP Tab/working_mem_save_load.m +++ b/studio_functions/Functions/EStudio/ERP Tab/working_mem_save_load.m @@ -59,15 +59,11 @@ % save save(fullfile(wm_pathname, wm_fname), 'vmemoryerp'); - catch errordlg('Memory save problem. Perhaps memory was empty?'); end - - - elseif save_or_load == 2 diff --git a/studio_functions/Functions/estudioworking_mem_save_load.m b/studio_functions/Functions/estudioworking_mem_save_load.m new file mode 100644 index 00000000..33a50240 --- /dev/null +++ b/studio_functions/Functions/estudioworking_mem_save_load.m @@ -0,0 +1,68 @@ +% PURPOSE: saves or loads the ERPLAB Studio working memory to another location +% +% FORMAT +% +% estudioworking_mem_save_load(save_or_load) +% +% INPUT +% +% save_or_load - 1 for save; 2 for load +% +% OUTPUT +% +% Mat-file .erpm written to disk, or memory structure loaded. +% +% *** This function is part of ERPLAB StudioToolbox *** +% Author: Guanghui Zhang +% Center for Mind and Brain +% University of California, Davis, +% Davis, CA +% 2024 + + + + + +function [wm_loaded] = estudioworking_mem_save_load(save_or_load) + +if save_or_load == 1 + + wm_loaded = []; + + % prompt for path with file browser ui + [wm_fname, wm_pathname] = uiputfile({'*.erpm', 'ERP Studio working memory file (*.erpm)'; + '*.*' , 'All Files (*.*)'},'Save working memory file as',... + 'custom_memoryerp.erpm'); + + try + vmemoryestudio = evalin('base', 'vmemoryestudio'); + + % save + save(fullfile(wm_pathname, wm_fname), 'vmemoryestudio'); + + catch + errordlg('Memory save problem. Perhaps memory was empty?'); + end + + +elseif save_or_load == 2 + + + % prompt for path with file browser ui + [wm_load_fname, wm_load_pathname] = uigetfile({'*.erpm', 'ERP Studio working memory file (*.erpm)'; + '*.*' , 'All Files (*.*)'},'Pick an existing working memory file to load',... + 'custom_memoryerp.erpm'); + if isempty(wm_load_pathname) || length(wm_load_pathname)==1 + beep; + disp('User selected cancel'); + wm_loaded =[]; + return; + end + wm_loaded = load(fullfile(wm_load_pathname,wm_load_fname), '-mat'); + +else + errordlg('WM save function error?'); +end + +end + diff --git a/studio_functions/estudioworkingmemory.m b/studio_functions/Functions/estudioworkingmemory.m similarity index 86% rename from studio_functions/estudioworkingmemory.m rename to studio_functions/Functions/estudioworkingmemory.m index 85e8d42e..febe12f1 100755 --- a/studio_functions/estudioworkingmemory.m +++ b/studio_functions/Functions/estudioworkingmemory.m @@ -2,7 +2,7 @@ % % FORMAT : % -% output = erpworkingmemory(field, input2store) +% output = estudioworkingmemory(field, input2store) % % INPUTS : % @@ -17,12 +17,12 @@ % % EXAMPLE 1: encode pop_appenderp's memory (values currently being used) % -% erpworkingmemory('pop_appenderp', { optioni, erpset, prefixlist }); +% estudioworkingmemory('pop_appenderp', { optioni, erpset, prefixlist }); % % % EXAMPLE 2: retrieve pop_appenderp's memory (values last used) % -% def = erpworkingmemory('pop_appenderp'); +% def = estudioworkingmemory('pop_appenderp'); % % % *** This function is part of ERPLAB Toolbox *** @@ -30,7 +30,7 @@ % Center for Mind and Brain % University of California, Davis, % Davis, CA -% 2009 & 2022 +% 2009 & 2024 %b8d3721ed219e65100184c6b95db209bb8d3721ed219e65100184c6b95db209b % @@ -66,7 +66,6 @@ end - if nargin==1 % read if ~isempty(vmemoryestudio) % variable at the workspace for storing/reading memory if isfield(vmemoryestudio, field) @@ -78,13 +77,10 @@ try p = which('o_ERPDAT'); p = p(1:findstr(p,'o_ERPDAT.m')-1); - v = load(fullfile(p,'memoryerpstudiopanels.erpm'), '-mat'); - + v = load(fullfile(p,'memoryerpstudio.erpm'), '-mat'); catch - - msgboxText = ['EStudio (memoryerpstudiopanels.m) could not find "memoryerpstudiopanels.erpm" or does not have permission for reading it.\n'... + msgboxText = ['EStudio (memoryerpstudio.m) could not find "memoryerpstudio.erpm" or does not have permission for reading it.\n'... 'Please, run EStudio again or go to EStudio''s Setting menu and specify/create a new memory file.\n']; - try cprintf([0.45 0.45 0.45], msgboxText'); catch @@ -102,7 +98,7 @@ return elseif nargin==2 % write if ~isempty(vmemoryestudio) % variable at the workspace for storing/reading memory - try + try vmemoryestudio.(field) = input2store; assignin('base','vmemoryestudio', vmemoryestudio); catch @@ -119,9 +115,9 @@ eval([field '=input2store;']) p = which('o_ERPDAT'); p = p(1:findstr(p,'o_ERPDAT.m')-1); - save(fullfile(p,'memoryerpstudiopanels.erpm'), field,'-append'); + save(fullfile(p,'memoryerpstudio.erpm'), field,'-append'); catch - msgboxText = ['EStudio could not find "memoryerpstudiopanels.erpm" or does not have permission for writting on it.\n'... + msgboxText = ['EStudio could not find "memoryerpstudio.erpm" or does not have permission for writting on it.\n'... 'Please, run EStudio again or go to EStudio''s Setting menu and specify/create a new memory file.\n']; try diff --git a/studio_functions/Functions/etudioamnesia.m b/studio_functions/Functions/etudioamnesia.m new file mode 100644 index 00000000..a0c99428 --- /dev/null +++ b/studio_functions/Functions/etudioamnesia.m @@ -0,0 +1,97 @@ +% PURPOSE: erases ERPLAB Studio's memory (values are those last used. Default ones are reloaded) +% +% FORMAT +% +% erplabamnesia(warningop) +% +% INPUT: +% +% warningop - display warning message. 1 yes; 0 no +% +% +% *** This function is part of ERPLAB Studio Toolbox *** +% Author: Guanghui Zhang +% Center for Mind and Brain +% University of California, Davis, +% Davis, CA +% 2024 + + + +function runindex = etudioamnesia(warningop) +runindex =0; +if nargin<1 + warningop = 0; +end +if warningop>0 + %Warning Message + question = ['Resetting ERPLAB Studio''s working memory will\n'... + 'Clear all memory and cannot be recovered\n'... + 'Do you want to continue anyway?']; + title = 'ERPLAB Studio: Reset ERPLAB Studio''s working memory Confirmation'; + button = askquest(sprintf(question), title); + + if ~strcmpi(button,'yes') + return + end +end + +erplab_default_values % script +% check variable at workspace +try + vmemoryestudio = evalin('base', 'vmemoryestudio'); +catch + vmemoryestudio = []; +end +if isempty(vmemoryestudio) + fprintf('\n* FYI: ERPLAB Studio''s working memory variable does not exist at workspace.\n') +else + if isfield(vmemoryestudio, 'mshock') + mshock = vmemoryestudio.mshock; + else + mshock = 0; + end + clear vmemoryestudio + mshock = mshock + 1; + + % + % IMPORTANT: If this strucure (vmemoryestudio) is modified then also must be modified the same line at o_ERPDAT.m + % + vmemoryestudio = struct('erplabrel',erplabrel,'erplabver',erplabver,'ColorB',ColorB,'ColorF',ColorF,'fontsizeGUI',fontsizeGUI,... + 'fontunitsGUI',fontunitsGUI,'mshock',mshock, 'errorColorF', errorColorF, 'errorColorB', errorColorB); + assignin('base','vmemoryestudio',vmemoryestudio); + fprintf('\n* ERPLAB Studio''s working memory was reset (variable "vmemoryestudio", at workspace, was rebuild with default values).\n'); +end + +% check file for memory +p = which('o_ERPDAT'); +p = p(1:findstr(p,'o_ERPDAT.m')-1); +mfile = fullfile(p,'memoryerpstudio.erpm'); + +if exist(mfile, 'file')==2 + v = load(fullfile(p,'memoryerpstudio.erpm'), '-mat'); + if isfield(v, 'mshock') + mshock = v.mshock; + else + mshock = 0; + end + + recycle on; + delete(mfile) + pause(0.1) + recycle off + mshock = mshock + 1; + fprintf('\n*** ERPLAB Studio WARNING: ERPLAB Studio''s working memory was wiped out. Default values will be used.\n\n') + + % + % IMPORTANT: If this file (saved variables inside memoryerpstudio.erpm) is modified then also must be modified the same line at o_ERPDAT.m + % + save(fullfile(p,'memoryerpstudio.erpm'),'erplabrel','erplabver','ColorB','ColorF','errorColorB', 'errorColorF','fontsizeGUI','fontunitsGUI','mshock'); +else + fprintf('\n* FYI: ERPLAB Studio''s working memory file does not exist.\n') + return +end +if mshock>=30 && rand>0.8 + fprintf('\n\nIs it not enough???\n\n') +end +runindex=1; \ No newline at end of file diff --git a/studio_functions/Functions/get_studio_indexes.m b/studio_functions/Functions/get_studio_indexes.m new file mode 100644 index 00000000..6c3aba99 --- /dev/null +++ b/studio_functions/Functions/get_studio_indexes.m @@ -0,0 +1,28 @@ + + +%Author: Guanghui ZHANG +%Center for Mind and Brain +%University of California, Davis +%Davis, CA, USA +%Apr. 2024 + +% ERPLAB Studio + + + + + +function [EEGsetIndex,EEGchanindex, ERPsetindex, ERPchanindex, ERPbinindex,erpcom]= get_studio_indexes(); + +erpcom = ''; + +EEGsetIndex= estudioworkingmemory('EEGArray'); +EEGchanindex= estudioworkingmemory('EEG_ChanArray'); + +ERPsetindex = estudioworkingmemory('selectederpstudio'); +ERPchanindex = estudioworkingmemory('ERP_BinArray'); +ERPbinindex = estudioworkingmemory('ERP_ChanArray'); + +command = sprintf('[EEGsetIndex,EEGchanindex, ERPsetindex, ERPchanindex, ERPbinindex,erpcom]= get_studio_indexes();'); + +end \ No newline at end of file diff --git a/studio_functions/painterplabstudio.m b/studio_functions/Functions/painterplabstudio.m similarity index 97% rename from studio_functions/painterplabstudio.m rename to studio_functions/Functions/painterplabstudio.m index bdfbac85..63aa2e91 100755 --- a/studio_functions/painterplabstudio.m +++ b/studio_functions/Functions/painterplabstudio.m @@ -50,8 +50,8 @@ ColorF = [0 0 0]; end if isempty(ColorB) - ColorB = [0.95 0.95 0.95]; - %ColorB = [0.83 0.82 0.79]; +% ColorB = [0.7020 0.7647 0.8392]; + ColorB = [0.7020 0.7647 0.8392]; end if isempty(ColorF) ColorF = [0 0 0]; diff --git a/studio_functions/setfonterplabestudio.m b/studio_functions/Functions/setfonterplabestudio.m similarity index 100% rename from studio_functions/setfonterplabestudio.m rename to studio_functions/Functions/setfonterplabestudio.m diff --git a/studio_functions/GUI Layout Toolbox/layout/+uix/BoxPanel.m b/studio_functions/GUI Layout Toolbox/layout/+uix/BoxPanel.m index 322265a4..105bfbaf 100644 --- a/studio_functions/GUI Layout Toolbox/layout/+uix/BoxPanel.m +++ b/studio_functions/GUI Layout Toolbox/layout/+uix/BoxPanel.m @@ -9,9 +9,9 @@ % panel shows one of its contents and hides the others. % % See also: uix.Panel, uipanel, uix.CardPanel - - % Copyright 2009-2020 The MathWorks, Inc. - + + % Copyright 2009-2024 The MathWorks, Inc. + properties( Dependent ) TitleColor % title background color [RGB] Minimized % minimized [true|false] @@ -21,15 +21,15 @@ HelpFcn % help callback CloseRequestFcn % close request callback end - + properties( Dependent, SetAccess = private ) TitleHeight % title panel height [pixels] end - + properties( Access = private ) TitleBox % title bar box TitleText % title text label - EmptyTitle = '' % title when empty, [] otherwise + Title_ = '' % cache of title TitleAccess = 'public' % 'private' when getting or setting Title, 'public' otherwise TitleHeight_ = -1 % cache of title text height (-1 denotes stale cache) MinimizeButton % title button @@ -39,12 +39,12 @@ Docked_ = true % backing for Docked Minimized_ = false % backing for Minimized end - + properties( Constant, Access = private ) NullTitle = char.empty( [2 0] ) % an obscure empty string, the actual panel Title BlankTitle = ' ' % a non-empty blank string, the empty uicontrol String end - + properties MaximizeTooltipString = 'Expand this panel' % tooltip string MinimizeTooltipString = 'Collapse this panel' % tooltip string @@ -53,9 +53,9 @@ HelpTooltipString = 'Get help on this panel' % tooltip string CloseTooltipString = 'Close this panel' % tooltip string end - + methods - + function obj = BoxPanel( varargin ) %uix.BoxPanel Box panel constructor % @@ -63,14 +63,14 @@ % % p = uix.BoxPanel(p1,v1,p2,v2,...) sets parameter p1 to value % v1, etc. - + % Define default colors foregroundColor = [1 1 1]; backgroundColor = [0.05 0.25 0.5]; - + % Set default colors obj.ForegroundColor = foregroundColor; - + % Create panels and decorations titleBox = uix.HBox( 'Internal', true, 'Parent', obj, ... 'Units', 'pixels', 'BackgroundColor', backgroundColor ); @@ -78,7 +78,7 @@ 'ForegroundColor', foregroundColor, ... 'BackgroundColor', backgroundColor, ... 'String', obj.BlankTitle, 'HorizontalAlignment', 'left' ); - + % Create buttons minimizeButton = uix.Text( ... 'ForegroundColor', foregroundColor, ... @@ -98,7 +98,7 @@ 'BackgroundColor', backgroundColor, ... 'FontWeight', 'bold', 'String', char( 215 ), ... 'TooltipString', obj.CloseTooltipString, 'Enable', 'on' ); - + % Store properties obj.Title = obj.NullTitle; obj.TitleBox = titleBox; @@ -107,7 +107,7 @@ obj.DockButton = dockButton; obj.HelpButton = helpButton; obj.CloseButton = closeButton; - + % Create listeners addlistener( obj, 'BorderWidth', 'PostSet', ... @obj.onBorderWidthChanged ); @@ -131,10 +131,10 @@ @obj.onTitleReturned ); addlistener( obj, 'Title', 'PostSet', ... @obj.onTitleChanged ); - + % Draw buttons - obj.redrawButtons() - + obj.redrawButtons() + % Set properties try uix.set( obj, varargin{:} ) @@ -142,21 +142,21 @@ delete( obj ) e.throwAsCaller() end - + end % constructor - + end % structors - + methods - + function value = get.TitleColor( obj ) - + value = obj.TitleBox.BackgroundColor; - + end % get.TitleColor - + function set.TitleColor( obj, value ) - + % Set obj.TitleBox.BackgroundColor = value; obj.TitleText.BackgroundColor = value; @@ -164,65 +164,65 @@ obj.DockButton.BackgroundColor = value; obj.HelpButton.BackgroundColor = value; obj.CloseButton.BackgroundColor = value; - + end % set.TitleColor - + function value = get.CloseRequestFcn( obj ) - + value = obj.CloseButton.Callback; - + end % get.CloseRequestFcn - + function set.CloseRequestFcn( obj, value ) - + % Set obj.CloseButton.Callback = value; - + % Mark as dirty obj.redrawButtons() - + end % set.CloseRequestFcn - + function value = get.DockFcn( obj ) - + value = obj.DockButton.Callback; - + end % get.DockFcn - + function set.DockFcn( obj, value ) - + % Set obj.DockButton.Callback = value; - + % Mark as dirty obj.redrawButtons() - + end % set.DockFcn - + function value = get.HelpFcn( obj ) - + value = obj.HelpButton.Callback; - + end % get.HelpFcn - + function set.HelpFcn( obj, value ) - + % Set obj.HelpButton.Callback = value; - + % Mark as dirty obj.redrawButtons() - + end % set.HelpFcn - + function value = get.MinimizeFcn( obj ) - + value = obj.MinimizeButton.Callback; - + end % get.MinimizeFcn - + function set.MinimizeFcn( obj, value ) - + % Set obj.MinimizeButton.Callback = value; obj.TitleText.Callback = value; @@ -231,184 +231,184 @@ else obj.TitleText.Enable = 'on'; end - + % Mark as dirty obj.redrawButtons() - + end % set.MinimizeFcn - + function value = get.Docked( obj ) - + value = obj.Docked_; - + end % get.Docked - + function set.Docked( obj, value ) - + % Check assert( islogical( value ) && isequal( size( value ), [1 1] ), ... 'uix:InvalidPropertyValue', ... 'Property ''Docked'' must be true or false.' ) - + % Set obj.Docked_ = value; - + % Mark as dirty obj.redrawButtons() - + end % set.Docked - + function value = get.Minimized( obj ) - + value = obj.Minimized_; - + end % get.Minimized - + function set.Minimized( obj, value ) - + % Check assert( islogical( value ) && isequal( size( value ), [1 1] ), ... 'uix:InvalidPropertyValue', ... 'Property ''Minimized'' must be true or false.' ) - + % Set obj.Minimized_ = value; - + % Show selected child obj.showSelection() - + % Mark as dirty obj.Dirty = true; - + end % set.Minimized - + function value = get.TitleHeight( obj ) - + value = obj.TitleBox.Position(4); - + end % get.TitleHeight - + function set.MaximizeTooltipString( obj, value ) - + % Check value = uix.validateScalarStringOrCharacterArray( value, ... 'MaximizeTooltipString' ); - + % Set obj.MaximizeTooltipString = value; - + % Mark as dirty obj.redrawButtons() - + end % set.MaximizeTooltipString - + function set.MinimizeTooltipString( obj, value ) - + % Check value = uix.validateScalarStringOrCharacterArray( value, ... 'MinimizeTooltipString' ); - + % Set obj.MinimizeTooltipString = value; - + % Mark as dirty obj.redrawButtons() - + end % set.MinimizeTooltipString - + function set.UndockTooltipString( obj, value ) - + % Check value = uix.validateScalarStringOrCharacterArray( value, ... 'UndockTooltipString' ); - + % Set obj.UndockTooltipString = value; - + % Mark as dirty obj.redrawButtons() - + end % set.UndockTooltipString - + function set.DockTooltipString( obj, value ) - + % Check value = uix.validateScalarStringOrCharacterArray( value, ... 'DockTooltipString' ); - + % Set obj.DockTooltipString = value; - + % Mark as dirty obj.redrawButtons() - + end % set.DockTooltipString - + function set.HelpTooltipString( obj, value ) - + % Check value = uix.validateScalarStringOrCharacterArray( value, ... 'HelpTooltipString' ); - + % Set obj.HelpTooltipString = value; - + % Mark as dirty obj.redrawButtons() - + end % set.HelpTooltipString - + function set.CloseTooltipString( obj, value ) - + % Check value = uix.validateScalarStringOrCharacterArray( value, ... 'CloseTooltipString' ); - + % Set obj.CloseTooltipString = value; - + % Mark as dirty obj.redrawButtons() - + end % set.CloseTooltipString - + end % accessors - + methods( Access = private ) - + function onBorderWidthChanged( obj, ~, ~ ) - + % Mark as dirty obj.Dirty = true; - + end % onBorderWidthChanged - + function onBorderTypeChanged( obj, ~, ~ ) - + % Mark as dirty obj.Dirty = true; - + end % onBorderTypeChanged - + function onFontAngleChanged( obj, ~, ~ ) - + obj.TitleText.FontAngle = obj.FontAngle; - + end % onFontAngleChanged - + function onFontNameChanged( obj, ~, ~ ) - + % Set obj.TitleText.FontName = obj.FontName; - + % Mark as dirty obj.TitleHeight_ = -1; obj.Dirty = true; - + end % onFontNameChanged - + function onFontSizeChanged( obj, ~, ~ ) - + % Set fontSize = obj.FontSize; obj.TitleText.FontSize = fontSize; @@ -416,99 +416,94 @@ function onFontSizeChanged( obj, ~, ~ ) obj.CloseButton.FontSize = fontSize; obj.DockButton.FontSize = fontSize; obj.MinimizeButton.FontSize = fontSize; - + % Mark as dirty obj.TitleHeight_ = -1; obj.Dirty = true; - + end % onFontSizeChanged - + function onFontUnitsChanged( obj, ~, ~ ) - + fontUnits = obj.FontUnits; obj.TitleText.FontUnits = fontUnits; obj.HelpButton.FontUnits = fontUnits; obj.CloseButton.FontUnits = fontUnits; obj.DockButton.FontUnits = fontUnits; obj.MinimizeButton.FontUnits = fontUnits; - + end % onFontUnitsChanged - + function onFontWeightChanged( obj, ~, ~ ) - + obj.TitleText.FontWeight = obj.FontWeight; - + end % onFontWeightChanged - + function onForegroundColorChanged( obj, ~, ~ ) - + foregroundColor = obj.ForegroundColor; obj.TitleText.ForegroundColor = foregroundColor; obj.MinimizeButton.ForegroundColor = foregroundColor; obj.DockButton.ForegroundColor = foregroundColor; obj.HelpButton.ForegroundColor = foregroundColor; obj.CloseButton.ForegroundColor = foregroundColor; - + end % onForegroundColorChanged - + function onTitleReturning( obj, ~, ~ ) - - if strcmp( obj.TitleAccess, 'public' ) - + + if strcmp( obj.TitleAccess, 'public' ) && isjsdrawing() == false obj.TitleAccess = 'private'; % start - if ischar( obj.EmptyTitle ) - obj.Title = obj.EmptyTitle; - else - obj.Title = obj.TitleText.String; - end - + obj.Title = obj.Title_; end - + end % onTitleReturning - + function onTitleReturned( obj, ~, ~ ) - - obj.Title = obj.NullTitle; % unset Title + + if isjsdrawing() == false + obj.Title = obj.NullTitle; % unset Title + end obj.TitleAccess = 'public'; % finish - + end % onTitleReturned - + function onTitleChanged( obj, ~, ~ ) - - if strcmp( obj.TitleAccess, 'public' ) - + + if strcmp( obj.TitleAccess, 'public' ) && isjsdrawing() == false + % Set obj.TitleAccess = 'private'; % start title = obj.Title; + obj.Title_ = title; if isempty( title ) - obj.EmptyTitle = title; % store - obj.TitleText.String = obj.BlankTitle; % set String to blank + obj.TitleText.String = obj.BlankTitle; else - obj.EmptyTitle = []; % not empty obj.TitleText.String = title; % set String to title end obj.Title = obj.NullTitle; % unset Title obj.TitleAccess = 'public'; % finish - + % Mark as dirty obj.TitleHeight_ = -1; obj.Dirty = true; - + end - + end % onTitleChanged - + end % property event handlers - + methods( Access = protected ) - + function redraw( obj ) %redraw Redraw % % p.redraw() redraws the panel. % % See also: redrawButtons - + % Compute positions bounds = hgconvertunits( ancestor( obj, 'figure' ), ... [0 0 1 1], 'normalized', 'pixels', obj ); @@ -526,7 +521,7 @@ function redraw( obj ) cH = max( bounds(4) - tH - 2 * p, 1 ); cY = tY - p - cH; contentsPosition = [cX cY cW cH]; - + % Redraw contents selection = obj.Selection_; if selection ~= 0 @@ -534,18 +529,18 @@ function redraw( obj ) end obj.TitleBox.Position = [tX tY tW tH]; obj.redrawButtons() - + end % redraw - + function showSelection( obj ) %showSelection Show selected child, hide the others % % c.showSelection() shows the selected child of the container % c, and hides the others. - + % Call superclass method showSelection@uix.mixin.Panel( obj ) - + % If minimized, hide selected contents too selection = obj.Selection_; if selection ~= 0 && obj.Minimized_ @@ -563,13 +558,13 @@ function showSelection( obj ) child.Position(1) = -child.Position(3)-margin; end end - + end % showSelection - + end % template methods - + methods( Access = private ) - + function redrawButtons( obj ) %redrawButtons Redraw buttons % @@ -577,7 +572,7 @@ function redrawButtons( obj ) % % Buttons use unicode arrow symbols: % https://en.wikipedia.org/wiki/Arrow_%28symbol%29#Arrows_in_Unicode - + % Retrieve button box and buttons box = obj.TitleBox; titleText = obj.TitleText; @@ -585,14 +580,14 @@ function redrawButtons( obj ) dockButton = obj.DockButton; helpButton = obj.HelpButton; closeButton = obj.CloseButton; - + % Detach all buttons titleText.Parent = []; minimizeButton.Parent = []; dockButton.Parent = []; helpButton.Parent = []; closeButton.Parent = []; - + % Attach active buttons titleText.Parent = box; minimize = ~isempty( obj.MinimizeFcn ); @@ -617,7 +612,7 @@ function redrawButtons( obj ) closeButton.TooltipString = obj.CloseTooltipString; box.Widths(end) = closeButton.Extent(3); end - + % Update icons if obj.Minimized_ minimizeButton.String = char( 9662 ); @@ -633,9 +628,21 @@ function redrawButtons( obj ) dockButton.String = char( 8600 ); dockButton.TooltipString = obj.DockTooltipString; end - + end % redrawButtons - + end % helper methods - -end % classdef \ No newline at end of file + +end % classdef + +function tf = isjsdrawing() +%isjsdrawing Detect JavaScript drawing, which accesses properties + +s = dbstack(); +tf = false; +for ii = 1:numel( s ) + n = strsplit( s(ii).name, "." ); + if n(1) == "WebComponentController", tf = true; break; end +end + +end % isjsdrawing \ No newline at end of file diff --git a/studio_functions/GUI Layout Toolbox/layout/+uix/Panel.m b/studio_functions/GUI Layout Toolbox/layout/+uix/Panel.m index 9047da3c..82d8cecd 100644 --- a/studio_functions/GUI Layout Toolbox/layout/+uix/Panel.m +++ b/studio_functions/GUI Layout Toolbox/layout/+uix/Panel.m @@ -8,19 +8,19 @@ % contents and hides the others. % % See also: uix.CardPanel, uix.BoxPanel, uipanel - - % Copyright 2009-2020 The MathWorks, Inc. - + + % Copyright 2009-2024 The MathWorks, Inc. + methods - + function obj = Panel( varargin ) %uix.Panel Standard panel constructor % % p = uix.Panel() constructs a standard panel. % % p = uix.Panel(p1,v1,p2,v2,...) sets parameter p1 to value - % v1, etc. - + % v1, etc. + % Set properties try uix.set( obj, varargin{:} ) @@ -28,15 +28,20 @@ delete( obj ) e.throwAsCaller() end - + + % Disable auto resize + if isprop( obj, 'AutoResizeChildren' ) + obj.AutoResizeChildren = 'off'; + end + end % constructor - + end % structors - + methods( Access = protected ) - + function redraw( obj ) - + % Compute positions bounds = hgconvertunits( ancestor( obj, 'figure' ), ... [0 0 1 1], 'normalized', 'pixels', obj ); @@ -44,15 +49,15 @@ function redraw( obj ) xSizes = uix.calcPixelSizes( bounds(3), -1, 1, padding, 0 ); ySizes = uix.calcPixelSizes( bounds(4), -1, 1, padding, 0 ); position = [padding+1 padding+1 xSizes ySizes]; - + % Redraw contents selection = obj.Selection_; if selection ~= 0 uix.setPosition( obj.Contents_(selection), position, 'pixels' ) end - + end % redraw - + end % template methods - + end % classdef \ No newline at end of file diff --git a/studio_functions/GUI Layout Toolbox/layout/+uix/ScrollingPanel.m b/studio_functions/GUI Layout Toolbox/layout/+uix/ScrollingPanel.m index bf0fd5fd..84e5e5ef 100644 --- a/studio_functions/GUI Layout Toolbox/layout/+uix/ScrollingPanel.m +++ b/studio_functions/GUI Layout Toolbox/layout/+uix/ScrollingPanel.m @@ -484,15 +484,15 @@ function addChild( obj, child ) verticalSlider = matlab.ui.control.UIControl( ... 'Internal', true, 'Parent', obj, ... 'Units', 'pixels', 'Style', 'slider', ... - 'BackgroundColor', obj.BackgroundColor ); + 'BackgroundColor', [0.9 0.9 0.9] ); horizontalSlider = matlab.ui.control.UIControl( ... 'Internal', true, 'Parent', obj, ... 'Units', 'pixels', 'Style', 'slider', ... - 'BackgroundColor', obj.BackgroundColor ); + 'BackgroundColor', [0.9 0.9 0.9] ); blankingPlate = matlab.ui.control.UIControl( ... 'Internal', true, 'Parent', obj, ... 'Units', 'pixels', 'Style', 'text', 'Enable', 'inactive', ... - 'BackgroundColor', obj.BackgroundColor ); + 'BackgroundColor', [0.9 0.9 0.9] ); % Add to sizes obj.Widths_(end+1,:) = -1; @@ -668,8 +668,8 @@ function onMouseScrolled( obj, ~, eventData ) function onBackgroundColorChanged( obj, ~, ~ ) %onBackgroundColorChanged Handler for BackgroundColor changes - set( obj.HorizontalSliders, 'BackgroundColor', obj.BackgroundColor ) - set( obj.VerticalSliders, 'BackgroundColor', obj.BackgroundColor ) + set( obj.HorizontalSliders, 'BackgroundColor', [0.9 0.9 0.9] ) + set( obj.VerticalSliders, 'BackgroundColor', [0.9 0.9 0.9] ) set( obj.BlankingPlates, 'BackgroundColor', obj.BackgroundColor ) end % onBackgroundColorChanged diff --git a/studio_functions/GUI Layout Toolbox/layout/+uix/Text.m b/studio_functions/GUI Layout Toolbox/layout/+uix/Text.m index 30f7a23a..2957a686 100644 --- a/studio_functions/GUI Layout Toolbox/layout/+uix/Text.m +++ b/studio_functions/GUI Layout Toolbox/layout/+uix/Text.m @@ -9,27 +9,27 @@ % * Fire a Callback when the user clicks on the text % % See also: uicontrol - - % Copyright 2009-2020 The MathWorks, Inc. - + + % Copyright 2009-2024 The MathWorks, Inc. + properties( Dependent ) BackgroundColor end - + properties( Dependent, SetAccess = private ) BeingDeleted end - + properties( Dependent ) Callback DeleteFcn Enable end - + properties( Dependent, SetAccess = private ) Extent end - + properties( Dependent ) FontAngle FontName @@ -45,11 +45,11 @@ Tag TooltipString end - + properties( Dependent, SetAccess = private ) Type end - + properties( Dependent ) UIContextMenu Units @@ -57,7 +57,7 @@ VerticalAlignment Visible end - + properties( Access = private ) Container % container Checkbox % checkbox, used for label @@ -67,19 +67,19 @@ FigureObserver % observer FigureListener % listener end - + properties( Constant, Access = private ) Margin = checkBoxLabelOffset() % checkbox size end - + methods - + function obj = Text( varargin ) %uix.Text Text control % % t = uix.Text(p1,v1,p2,v2,...) constructs a text control and % sets parameter p1 to value v1, etc. - + % Create graphics container = uicontainer( 'Parent', [], ... 'Units', get( 0, 'DefaultUicontrolUnits' ), ... @@ -93,19 +93,19 @@ screen = uicontrol( 'Parent', container, ... 'HandleVisibility', 'off', ... 'Style', 'text', 'Units', 'pixels' ); - + % Create observers and listeners figureObserver = uix.FigureObserver( container ); figureListener = event.listener( figureObserver, ... 'FigureChanged', @obj.onFigureChanged ); - + % Store properties obj.Container = container; obj.Checkbox = checkbox; obj.Screen = screen; obj.FigureObserver = figureObserver; obj.FigureListener = figureListener; - + % Set properties try uix.set( obj, varargin{:} ) @@ -113,380 +113,385 @@ delete( obj ) e.throwAsCaller() end - + end % constructor - + function delete( obj ) %delete Destructor - + delete( obj.Container ) - + end % destructor - + end % structors - + methods - + function value = get.BackgroundColor( obj ) - + value = obj.Checkbox.BackgroundColor; - + end % get.BackgroundColor - + function set.BackgroundColor( obj, value ) - + obj.Container.BackgroundColor = value; obj.Checkbox.BackgroundColor = value; obj.Screen.BackgroundColor = value; - + end % set.BackgroundColor - + function value = get.BeingDeleted( obj ) - + value = obj.Checkbox.BeingDeleted; - + end % get.BeingDeleted - + function value = get.Callback( obj ) - + value = obj.Checkbox.Callback; - + end % get.Callback - + function set.Callback( obj, value ) - + obj.Checkbox.Callback = value; - + end % set.Callback - + function value = get.DeleteFcn( obj ) - + value = obj.Checkbox.DeleteFcn; - + end % get.DeleteFcn - + function set.DeleteFcn( obj, value ) - + obj.Checkbox.DeleteFcn = value; - + end % set.DeleteFcn - + function value = get.Enable( obj ) - + value = obj.Checkbox.Enable; - + end % get.Enable - + function set.Enable( obj, value ) - + obj.Checkbox.Enable = value; - + end % set.Enable - + function value = get.Extent( obj ) - + + % Get checkbox text extent value = obj.Checkbox.Extent; - + + % Correct for large fonts, g3328399 + if obj.FontSize > 28 && ~isempty( ancestor( obj.Container, 'figure' ) ) + value = extent( obj.FontSize, obj.Checkbox.String ); + end + end % get.Extent - + function value = get.FontAngle( obj ) - + value = obj.Checkbox.FontAngle; - + end % get.FontAngle - + function set.FontAngle( obj, value ) - + % Set obj.Checkbox.FontAngle = value; - + % Mark as dirty obj.setDirty() - + end % set.FontAngle - + function value = get.FontName( obj ) - + value = obj.Checkbox.FontName; - + end % get.FontName - + function set.FontName( obj, value ) - + % Set obj.Checkbox.FontName = value; - + % Mark as dirty obj.setDirty() - + end % set.FontName - + function value = get.FontSize( obj ) - + value = obj.Checkbox.FontSize; - + end % get.FontSize - + function set.FontSize( obj, value ) - + % Set obj.Checkbox.FontSize = value; - + % Mark as dirty obj.setDirty() - + end % set.FontSize - + function value = get.FontUnits( obj ) - + value = obj.Checkbox.FontUnits; - + end % get.FontUnits - + function set.FontUnits( obj, value ) - + obj.Checkbox.FontUnits = value; - + end % set.FontUnits - + function value = get.FontWeight( obj ) - + value = obj.Checkbox.FontWeight; - + end % get.FontWeight - + function set.FontWeight( obj, value ) - + % Set obj.Checkbox.FontWeight = value; - + % Mark as dirty obj.setDirty() - + end % set.FontWeight - + function value = get.ForegroundColor( obj ) - + value = obj.Checkbox.ForegroundColor; - + end % get.ForegroundColor - + function set.ForegroundColor( obj, value ) - + obj.Checkbox.ForegroundColor = value; - + end % set.ForegroundColor - + function value = get.HandleVisibility( obj ) - + value = obj.Container.HandleVisibility; - + end % get.HandleVisibility - + function set.HandleVisibility( obj, value ) - + obj.Container.HandleVisibility = value; - + end % set.HandleVisibility - + function value = get.HorizontalAlignment( obj ) - + value = obj.Checkbox.HorizontalAlignment; - + end % get.HorizontalAlignment - + function set.HorizontalAlignment( obj, value ) - + % Set obj.Checkbox.HorizontalAlignment = value; - + % Mark as dirty obj.setDirty() - + end % set.HorizontalAlignment - + function value = get.Parent( obj ) - + value = obj.Container.Parent; - + end % get.Parent - + function set.Parent( obj, value ) - + obj.Container.Parent = value; - + end % set.Parent - + function value = get.Position( obj ) - + value = obj.Container.Position; - + end % get.Position - + function set.Position( obj, value ) - + obj.Container.Position = value; - + end % set.Position - + function value = get.String( obj ) - + value = obj.Checkbox.String; - + end % get.String - + function set.String( obj, value ) - + % Set obj.Checkbox.String = value; - + % Mark as dirty obj.setDirty() - + end % set.String - + function value = get.Tag( obj ) - + value = obj.Checkbox.Tag; - + end % get.Tag - + function set.Tag( obj, value ) - + obj.Checkbox.Tag = value; - + end % set.Tag - + function value = get.TooltipString( obj ) - + value = obj.Checkbox.TooltipString; - + end % get.TooltipString - + function set.TooltipString( obj, value ) - + obj.Checkbox.TooltipString = value; - + end % set.TooltipString - + function value = get.Type( obj ) - + value = obj.Checkbox.Type; - + end % get.Type - + function value = get.UIContextMenu( obj ) - + value = obj.Checkbox.UIContextMenu; - + end % get.UIContextMenu - + function set.UIContextMenu( obj, value ) - + obj.Checkbox.UIContextMenu = value; - + end % set.UIContextMenu - + function value = get.Units( obj ) - + value = obj.Container.Units; - + end % get.Units - + function set.Units( obj, value ) - + obj.Container.Units = value; - + end % set.Units - + function value = get.UserData( obj ) - + value = obj.Checkbox.UserData; - + end % get.UserData - + function set.UserData( obj, value ) - + obj.Checkbox.UserData = value; - + end % set.UserData - + function value = get.VerticalAlignment( obj ) - + value = obj.VerticalAlignment_; - + end % get.VerticalAlignment - + function set.VerticalAlignment( obj, value ) - + % Check - assert( ischar( value ) && ... - any( strcmp( value, {'top','middle','bottom'} ) ), ... + assert( any( strcmp( value, {'top','middle','bottom'} ) ), ... 'uix:InvalidPropertyValue', ... 'Property ''VerticalAlignment'' must be ''top'', ''middle'' or ''bottom''.' ) - + % Set - obj.VerticalAlignment_ = value; - + obj.VerticalAlignment_ = char( value ); + % Mark as dirty obj.setDirty() - + end % set.VerticalAlignment - + function value = get.Visible( obj ) - + value = obj.Container.Visible; - + end % get.Visible - + function set.Visible( obj, value ) - + obj.Container.Visible = value; - + end % set.Visible - + end % accessors - + methods( Access = private ) - + function onResized( obj, ~, ~ ) %onResized Event handler - + % Rooted, so redraw obj.redraw() - + end % onResized - + function onFigureChanged( obj, ~, eventData ) - + % If rooted, redraw if isempty( eventData.OldFigure ) && ... ~isempty( eventData.NewFigure ) && obj.Dirty obj.redraw() end - + end % onFigureChanged - + end % event handlers - + methods( Access = private ) - + function setDirty( obj ) %setDirty Mark as dirty % % t.setDirty() marks the text control t as dirty. If the text % control is rooted then it is redrawn immediately. If not % then the redraw is queued for when it is next rooted. - + if isempty( obj.FigureObserver.Figure ) obj.Dirty = true; % set flag else obj.Dirty = false; % unset flag obj.redraw() % redraw end - + end % setDirty - + function redraw( obj ) %redraw Redraw % @@ -494,14 +499,14 @@ function redraw( obj ) % requires the text control to be rooted. Methods should % request redraws using setDirty, rather than calling redraw % directly. - + c = obj.Container; b = obj.Checkbox; s = obj.Screen; bo = hgconvertunits( ancestor( obj, 'figure' ), ... [0 0 1 1], 'normalized', 'pixels', c ); % bounds m = obj.Margin; - e = b.Extent; + e = obj.Extent; switch b.HorizontalAlignment case 'left' x = 1 - m; @@ -522,11 +527,11 @@ function redraw( obj ) h = e(4); b.Position = [x y w h]; s.Position = [x y m h]; - + end % redraw - + end % helpers - + end % classdef function o = checkBoxLabelOffset() @@ -542,4 +547,15 @@ function redraw( obj ) end end -end % margin \ No newline at end of file +end % checkBoxLabelOffset + +function e = extent( fs, s ) +%extent Extent fallback for web graphics with large fonts + +f = figure( 'Visible', 'off' ); % create invisible *Java* figure +c = uicontrol( 'Parent', f, 'Style', 'checkbox', 'Units', 'pixels', ... + 'Position', [20 20 1000 200], 'FontSize', fs, 'String', s ); % text +e = c.Extent; % Java extents are correct and similar to JavaScript +delete( f ) % clean up + +end % extent \ No newline at end of file diff --git a/studio_functions/GUI Layout Toolbox/layout/Contents.m b/studio_functions/GUI Layout Toolbox/layout/Contents.m index caf540c3..742eb4bf 100644 --- a/studio_functions/GUI Layout Toolbox/layout/Contents.m +++ b/studio_functions/GUI Layout Toolbox/layout/Contents.m @@ -1,5 +1,5 @@ % GUI Layout Toolbox -% Version 2.3.6 (R2023a) 21-May-2023 +% Version 2.3.7 (R2023a) 31-May-2024 % % Panels % uix.Panel - arrange a single element inside a standard panel @@ -24,4 +24,4 @@ % uix.Empty - create an empty space % uix.tracking - track anonymized usage data -% Copyright 2009-2023 The MathWorks, Inc. +% Copyright 2009-2024 The MathWorks, Inc. diff --git a/studio_functions/GUI Layout Toolbox/layoutdoc/AxesExample.html b/studio_functions/GUI Layout Toolbox/layoutdoc/AxesExample.html index 19f38b92..7d607fa7 100644 --- a/studio_functions/GUI Layout Toolbox/layoutdoc/AxesExample.html +++ b/studio_functions/GUI Layout Toolbox/layoutdoc/AxesExample.html @@ -1 +1 @@ - > + > diff --git a/studio_functions/GUI Layout Toolbox/layoutdoc/AxesLegendsColorbars.html b/studio_functions/GUI Layout Toolbox/layoutdoc/AxesLegendsColorbars.html index 6d14634d..38ac215a 100644 --- a/studio_functions/GUI Layout Toolbox/layoutdoc/AxesLegendsColorbars.html +++ b/studio_functions/GUI Layout Toolbox/layoutdoc/AxesLegendsColorbars.html @@ -1 +1 @@ - > + > diff --git a/studio_functions/GUI Layout Toolbox/layoutdoc/BoxPanelFancyStuff.html b/studio_functions/GUI Layout Toolbox/layoutdoc/BoxPanelFancyStuff.html index 88371c09..2a34dee9 100644 --- a/studio_functions/GUI Layout Toolbox/layoutdoc/BoxPanelFancyStuff.html +++ b/studio_functions/GUI Layout Toolbox/layoutdoc/BoxPanelFancyStuff.html @@ -1 +1 @@ - > + > diff --git a/studio_functions/GUI Layout Toolbox/layoutdoc/Compiling.html b/studio_functions/GUI Layout Toolbox/layoutdoc/Compiling.html index ea0a2024..5640e631 100644 --- a/studio_functions/GUI Layout Toolbox/layoutdoc/Compiling.html +++ b/studio_functions/GUI Layout Toolbox/layoutdoc/Compiling.html @@ -1 +1 @@ - > + > diff --git a/studio_functions/GUI Layout Toolbox/layoutdoc/ExampleApp.html b/studio_functions/GUI Layout Toolbox/layoutdoc/ExampleApp.html index 3818e426..b71e6715 100644 --- a/studio_functions/GUI Layout Toolbox/layoutdoc/ExampleApp.html +++ b/studio_functions/GUI Layout Toolbox/layoutdoc/ExampleApp.html @@ -1 +1 @@ - > + > diff --git a/studio_functions/GUI Layout Toolbox/layoutdoc/Examples.html b/studio_functions/GUI Layout Toolbox/layoutdoc/Examples.html index e10b8df4..11de3380 100644 --- a/studio_functions/GUI Layout Toolbox/layoutdoc/Examples.html +++ b/studio_functions/GUI Layout Toolbox/layoutdoc/Examples.html @@ -4,7 +4,7 @@ - + Examples @@ -14,7 +14,7 @@ - +
GUI Layout Toolbox 2.3.6GUI Layout Toolbox 2.3.7 previous pagenext page
@@ -79,7 +79,7 @@

Applications

next page - © 2023 The MathWorks Ltd + © 2024 The MathWorks Ltd Terms of Use Patents Trademarks diff --git a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference.html b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference.html index 98d6397a..b25fb093 100644 --- a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference.html +++ b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference.html @@ -4,7 +4,7 @@ - + Function reference @@ -14,7 +14,7 @@ - +
GUI Layout Toolbox 2.3.6GUI Layout Toolbox 2.3.7 previous pagenext page
@@ -180,7 +180,7 @@

Function reference next page - © 2023 The MathWorks Ltd + © 2024 The MathWorks Ltd Terms of Use Patents Trademarks diff --git a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference1_1.html b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference1_1.html index 66f8c11c..1733ff9a 100644 --- a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference1_1.html +++ b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference1_1.html @@ -3,7 +3,7 @@ - + uix.Panel @@ -73,7 +73,7 @@

For example:

next page - © 2023 The MathWorks Ltd + © 2024 The MathWorks Ltd Terms of Use Patents Trademarks diff --git a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference1_2.html b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference1_2.html index ec6c9a1a..0014ae83 100644 --- a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference1_2.html +++ b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference1_2.html @@ -3,7 +3,7 @@ - + uix.CardPanel @@ -67,7 +67,7 @@

For example:

next page - © 2023 The MathWorks Ltd + © 2024 The MathWorks Ltd Terms of Use Patents Trademarks diff --git a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference1_3.html b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference1_3.html index 96f863d3..78be95a0 100644 --- a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference1_3.html +++ b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference1_3.html @@ -3,7 +3,7 @@ - + uix.BoxPanel @@ -77,7 +77,7 @@

For example:

next page - © 2023 The MathWorks Ltd + © 2024 The MathWorks Ltd Terms of Use Patents Trademarks diff --git a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference1_4.html b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference1_4.html index 181bb502..7f22bae8 100644 --- a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference1_4.html +++ b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference1_4.html @@ -3,7 +3,7 @@ - + uix.TabPanel @@ -65,7 +65,7 @@

For example:

next page - © 2023 The MathWorks Ltd + © 2024 The MathWorks Ltd Terms of Use Patents Trademarks diff --git a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference1_5.html b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference1_5.html index 347404f5..f7f6c2f1 100644 --- a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference1_5.html +++ b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference1_5.html @@ -3,7 +3,7 @@ - + uix.ScrollingPanel @@ -65,7 +65,7 @@

For example:

next page - © 2023 The MathWorks Ltd + © 2024 The MathWorks Ltd Terms of Use Patents Trademarks diff --git a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference2_1.html b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference2_1.html index 4d6f3f65..842ad9b3 100644 --- a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference2_1.html +++ b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference2_1.html @@ -3,7 +3,7 @@ - + uix.HBox @@ -78,7 +78,7 @@

For example:

next page - © 2023 The MathWorks Ltd + © 2024 The MathWorks Ltd Terms of Use Patents Trademarks diff --git a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference2_2.html b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference2_2.html index 84d36736..78f52dc7 100644 --- a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference2_2.html +++ b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference2_2.html @@ -3,7 +3,7 @@ - + uix.VBox @@ -77,7 +77,7 @@

For example:

next page - © 2023 The MathWorks Ltd + © 2024 The MathWorks Ltd Terms of Use Patents Trademarks diff --git a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference2_3.html b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference2_3.html index 391fb83c..29a7204c 100644 --- a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference2_3.html +++ b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference2_3.html @@ -3,7 +3,7 @@ - + uix.HBoxFlex @@ -69,7 +69,7 @@

For example:

next page - © 2023 The MathWorks Ltd + © 2024 The MathWorks Ltd Terms of Use Patents Trademarks diff --git a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference2_4.html b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference2_4.html index 1bf7a727..be37c209 100644 --- a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference2_4.html +++ b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference2_4.html @@ -3,7 +3,7 @@ - + uix.VBoxFlex @@ -68,7 +68,7 @@

For example:

next page - © 2023 The MathWorks Ltd + © 2024 The MathWorks Ltd Terms of Use Patents Trademarks diff --git a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference2_5.html b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference2_5.html index 122a230d..e3ba9086 100644 --- a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference2_5.html +++ b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference2_5.html @@ -3,7 +3,7 @@ - + uix.HButtonBox @@ -70,7 +70,7 @@

For example:

next page - © 2023 The MathWorks Ltd + © 2024 The MathWorks Ltd Terms of Use Patents Trademarks diff --git a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference2_6.html b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference2_6.html index bf38e9b4..8e795958 100644 --- a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference2_6.html +++ b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference2_6.html @@ -3,7 +3,7 @@ - + uix.VButtonBox @@ -70,7 +70,7 @@

For example:

next page - © 2023 The MathWorks Ltd + © 2024 The MathWorks Ltd Terms of Use Patents Trademarks diff --git a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference3_1.html b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference3_1.html index 6f72ca96..4561e885 100644 --- a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference3_1.html +++ b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference3_1.html @@ -3,7 +3,7 @@ - + uix.Grid @@ -72,7 +72,7 @@

For example:

next page - © 2023 The MathWorks Ltd + © 2024 The MathWorks Ltd Terms of Use Patents Trademarks diff --git a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference3_2.html b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference3_2.html index 02e07d5f..2c945012 100644 --- a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference3_2.html +++ b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference3_2.html @@ -3,7 +3,7 @@ - + uix.GridFlex @@ -73,7 +73,7 @@

For example:

next page - © 2023 The MathWorks Ltd + © 2024 The MathWorks Ltd Terms of Use Patents Trademarks diff --git a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference4_1.html b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference4_1.html index 5610a177..a2cc6396 100644 --- a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference4_1.html +++ b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference4_1.html @@ -3,7 +3,7 @@ - + uix.Empty @@ -59,7 +59,7 @@

For example:

next page - © 2023 The MathWorks Ltd + © 2024 The MathWorks Ltd Terms of Use Patents Trademarks diff --git a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference4_2.html b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference4_2.html index efe3537e..31b6005b 100644 --- a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference4_2.html +++ b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference4_2.html @@ -3,7 +3,7 @@ - + uix.tracking @@ -53,7 +53,7 @@

For example:

next page - © 2023 The MathWorks Ltd + © 2024 The MathWorks Ltd Terms of Use Patents Trademarks diff --git a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference4_3.html b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference4_3.html index 441d71f5..f06f73e3 100644 --- a/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference4_3.html +++ b/studio_functions/GUI Layout Toolbox/layoutdoc/Function_reference4_3.html @@ -3,7 +3,7 @@ - + layoutRoot @@ -47,7 +47,7 @@

For example:

next page - © 2023 The MathWorks Ltd + © 2024 The MathWorks Ltd Terms of Use Patents Trademarks diff --git a/studio_functions/GUI Layout Toolbox/layoutdoc/GUI Layout.html b/studio_functions/GUI Layout Toolbox/layoutdoc/GUI Layout.html index 3b0037a0..dce60941 100644 --- a/studio_functions/GUI Layout Toolbox/layoutdoc/GUI Layout.html +++ b/studio_functions/GUI Layout Toolbox/layoutdoc/GUI Layout.html @@ -1,5 +1,5 @@ - + diff --git a/studio_functions/GUI Layout Toolbox/layoutdoc/Getting_Started.html b/studio_functions/GUI Layout Toolbox/layoutdoc/Getting_Started.html index fbd55ee3..2dd4a5f9 100644 --- a/studio_functions/GUI Layout Toolbox/layoutdoc/Getting_Started.html +++ b/studio_functions/GUI Layout Toolbox/layoutdoc/Getting_Started.html @@ -4,7 +4,7 @@ - + Getting Started @@ -14,7 +14,7 @@ - +
GUI Layout Toolbox 2.3.6GUI Layout Toolbox 2.3.7 previous pagenext page
@@ -75,7 +75,7 @@

Getting Started next page - © 2023 The MathWorks Ltd + © 2024 The MathWorks Ltd Terms of Use Patents Trademarks diff --git a/studio_functions/GUI Layout Toolbox/layoutdoc/Getting_Started1.html b/studio_functions/GUI Layout Toolbox/layoutdoc/Getting_Started1.html index 199607c9..4e6e383b 100644 --- a/studio_functions/GUI Layout Toolbox/layoutdoc/Getting_Started1.html +++ b/studio_functions/GUI Layout Toolbox/layoutdoc/Getting_Started1.html @@ -3,7 +3,7 @@ - + What is GUI Layout Toolbox? @@ -43,7 +43,7 @@

1: What is GUI Layout Toolbox? next page - © 2023 The MathWorks Ltd + © 2024 The MathWorks Ltd Terms of Use Patents Trademarks diff --git a/studio_functions/GUI Layout Toolbox/layoutdoc/Getting_Started2.html b/studio_functions/GUI Layout Toolbox/layoutdoc/Getting_Started2.html index b348a41f..6908d0a6 100644 --- a/studio_functions/GUI Layout Toolbox/layoutdoc/Getting_Started2.html +++ b/studio_functions/GUI Layout Toolbox/layoutdoc/Getting_Started2.html @@ -3,7 +3,7 @@ - + Compatibility considerations @@ -144,14 +144,14 @@

 2.3: Web graphics support uix.Panel + uix.Panel
uix.BoxPanel R2022b In R2022b, due to a bug, Units and Position specified during construction are ignored, and the @@ -193,12 +193,6 @@

Support

Units and Position after construction. This bug is fixed in R2023a. - - uix.BoxPanel - Unsupported - The implementation has not yet been updated to support - web graphics. -

Usage

@@ -235,7 +229,7 @@

Usage

next page - © 2023 The MathWorks Ltd + © 2024 The MathWorks Ltd Terms of Use Patents Trademarks diff --git a/studio_functions/GUI Layout Toolbox/layoutdoc/Getting_Started3.html b/studio_functions/GUI Layout Toolbox/layoutdoc/Getting_Started3.html index 8a85cff4..644f3a8e 100644 --- a/studio_functions/GUI Layout Toolbox/layoutdoc/Getting_Started3.html +++ b/studio_functions/GUI Layout Toolbox/layoutdoc/Getting_Started3.html @@ -3,7 +3,7 @@ - + Release notes @@ -48,25 +48,28 @@

3: Release notes  -
  • 3.1. Version 2.3.6
  • -
  • 3.2. Version 2.3.5
  • -
  • 3.3. Version 2.3.4
  • -
  • 3.4. Version 2.3.3
  • -
  • 3.5. Version 2.3.2
  • -
  • 3.6. Version 2.3.1
  • -
  • 3.7. Version 2.3
  • -
  • 3.8. Version 2.2.2
  • -
  • 3.9. Version 2.2.1
  • -
  • 3.10. Version 2.2
  • -
  • 3.11. Version 2.1.2
  • -
  • 3.12. Version 2.1.1
  • -
  • 3.13. Version 2.1
  • +
  • 3.1. Version 2.3.7
  • +
  • 3.2. Version 2.3.6
  • +
  • 3.3. Version 2.3.5
  • +
  • 3.4. Version 2.3.4
  • +
  • 3.5. Version 2.3.3
  • +
  • 3.6. Version 2.3.2
  • +
  • 3.7. Version 2.3.1
  • +
  • 3.8. Version 2.3
  • +
  • 3.9. Version 2.2.2
  • +
  • 3.10. Version 2.2.1
  • +
  • 3.11. Version 2.2
  • +
  • 3.12. Version 2.1.2
  • +
  • 3.13. Version 2.1.1
  • +
  • 3.14. Version 2.1
    • @@ -77,7 +80,15 @@

      Section contents:



    -

     3.1: Version 2.3.6 Go back up one level

    +

     3.1: Version 2.3.7 Go back up one level

    + +
      +
    • Released 31 May 2024
    • +
    • Added web graphics support for uix.BoxPanel
    • +
    +

    + +

     3.2: Version 2.3.6 Go back up one level

    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%0ArzULx3~Hj&)Ly_n&1dIP2-|e%p@+q3 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